diff --git a/.github/DISCUSSION_TEMPLATE/feature-request.yml b/.github/DISCUSSION_TEMPLATE/feature-request.yml new file mode 100644 index 0000000000..482600c2f4 --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/feature-request.yml @@ -0,0 +1,46 @@ +body: + - type: input + attributes: + label: Package Name + description: "If your feature request is to add instrumentation support for a package please provide the name here" + placeholder: doctrine/orm + validations: + required: false + + - type: input + attributes: + label: Package Version(s) + description: "If your feature request is to add instrumentation support for a package please provide the version you use" + placeholder: 3.3.0 + validations: + required: false + + - type: textarea + attributes: + label: Describe the feature you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true + + - type: textarea + attributes: + label: Is your feature request related to a problem? + description: | + Please add a clear and concise description of your problem. + E.g. I'm unable to instrument my database queries... + validations: + required: false + + - type: textarea + attributes: + label: Describe alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered + validations: + required: false + + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.yml b/.github/ISSUE_TEMPLATE/1-bug-report.yml new file mode 100644 index 0000000000..ad48d2a42c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1-bug-report.yml @@ -0,0 +1,49 @@ +name: "Bug Report (Low Priority)" +description: "Create a public Bug Report. Note that these may not be addressed as quickly as the helpdesk and that looking up account information will be difficult." +title: "[BUG]: " +labels: [bug] +body: + - type: input + attributes: + label: Tracer Version(s) + description: "Version(s) of the tracer affected by this bug. If you aren't using the [latest version](https://github.com/DataDog/dd-trace-go/releases) of dd-trace-go, try upgrading first to see if your issue has already been resolved." + placeholder: 1.70.0 + validations: + required: true + + - type: input + attributes: + label: Go Version(s) + description: "Version(s) of Go (`go version`) that you've encountered this bug with." + placeholder: "go version go1.23.2 darwin/arm64" + validations: + required: true + + - type: textarea + attributes: + label: Bug Report + description: Please add a clear and concise description of the bug here + validations: + required: true + + - type: textarea + attributes: + label: Reproduction Code + description: Please add code here to help us reproduce the problem + validations: + required: false + + - type: textarea + attributes: + label: Error Logs + description: "Please provide any error logs from the tracer (`DD_TRACE_DEBUG=true` can help)" + validations: + required: false + + - type: input + attributes: + label: Go Env Output + description: "Provide the output from `go env`" + placeholder: "GOARCH='arm64' ... GOVERSION='go1.23.2' ..." + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index 825f73ebcc..0000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: Bug Report -about: Identify a bug in the dd-trace-go codebase -title: "[BUG] " -labels: bug -assignees: '' ---- - - - -**Version of dd-trace-go** - - -**Describe what happened:** - - -**Describe what you expected:** - - -**Steps to reproduce the issue:** - - -**Additional environment details (Version of Go, Operating System, etc.):** diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..0ea21c3b1c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,14 @@ +blank_issues_enabled: false +contact_links: + - name: Bug Report (High Priority) + url: https://help.datadoghq.com/hc/en-us/requests/new?tf_1260824651490=pt_product_type:apm&tf_1900004146284=pt_apm_language:go + about: Create an expedited Bug Report via the helpdesk (no login required). This will allow us to look up your account and allows you to provide additional information in private. + - name: Feature Request (High Priority) + url: https://help.datadoghq.com/hc/en-us/requests/new?tf_1260824651490=pt_product_type:apm&tf_1900004146284=pt_apm_language:go&tf_1260825272270=pt_apm_category_feature_request + about: Create an expedited Feature Request via the helpdesk (no login required). This helps with prioritization and allows you to provide additional information in private. + - name: Feature Request (Low Priority) + url: https://github.com/DataDog/dd-trace-go/discussions/new?category=feature-request + about: Start a discussion about a Feature Request in GitHub discussions. This helps prioritization and allows you to provide additional information in public. + - name: Other Discussion (Low Priority) + url: https://github.com/DataDog/dd-trace-go/discussions/new + about: Start a new GitHub discussions about any other topic. diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md deleted file mode 100644 index a783542a60..0000000000 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -name: Feature Request -about: Suggest a new feature -title: '' -labels: enhancement -assignees: '' ---- - - diff --git a/.github/actions/add-codeowners/codeowners.sh b/.github/actions/add-codeowners/codeowners.sh new file mode 100755 index 0000000000..7bc04766b3 --- /dev/null +++ b/.github/actions/add-codeowners/codeowners.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +RESULT_PATH="${1:-.}" +if [ ! -d "$RESULT_PATH" ]; then + echo "Error: Result path does not exist" + exit 1 +fi + +cd "$RESULT_PATH" || exit 1 + +for file in gotestsum-report*.xml; do + # Skip if the glob didn't match any files + [ -f "$file" ] || break + + temp_file="${file}_tmp.xml" + + # force write a new line at the end of the gotestsum-report.xml, or else + # the loop will skip the last line. + # fixes issue with a missing + echo -e "\n" >> "$file" + + while IFS= read -r p || [ -n "$p" ]; do + # we might try to report gotestsum-report.xml multiple times, so don't + # calculate codeowners more times than we need + if [[ "$p" =~ \]*\)>||") + echo "$new_line" >> "$temp_file" + else + echo "$p" >> "$temp_file" + fi + done < "$file" + + mv "$temp_file" "$file" +done \ No newline at end of file diff --git a/.github/actions/dd-ci-upload/action.yml b/.github/actions/dd-ci-upload/action.yml index 3318728c50..958236675b 100644 --- a/.github/actions/dd-ci-upload/action.yml +++ b/.github/actions/dd-ci-upload/action.yml @@ -9,9 +9,9 @@ inputs: required: false default: dd-trace-go description: Service name to use with the uploaded test results. - files: + path: required: true - description: JUnit files to upload + description: Path containing the JUnit files to upload tags: required: false description: Datadog tags to associate with the uploaded test results. @@ -30,7 +30,7 @@ runs: - name: Datadog CI CLI cache id: dd-ci-cli-cache - uses: actions/cache@v3 + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: path: ./datadog-ci key: datadog-ci-cli-${{ env.DD_CI_CLI_BUILD }} @@ -42,10 +42,14 @@ runs: curl -L --fail "https://github.com/DataDog/datadog-ci/releases/latest/download/datadog-ci_$%7B%7B%20env.DD_CI_CLI_BUILD%20%7D%7D" --output datadog-ci chmod +x datadog-ci + - name: Add CodeOwners to JUnit files + shell: bash + run: ./.github/actions/add-codeowners/codeowners.sh "${{ inputs.path }}" + - name: Upload the JUnit files shell: bash run: | env DD_API_KEY=${{ inputs.dd-api-key }} ./datadog-ci junit upload \ --service ${{ inputs.service }} \ --tags "${{ inputs.tags }}" \ - ${{ inputs.files }} + ${{ inputs.path }} diff --git a/.github/actions/setup-go/action.yml b/.github/actions/setup-go/action.yml index b4dad472a2..aefad30267 100644 --- a/.github/actions/setup-go/action.yml +++ b/.github/actions/setup-go/action.yml @@ -1,35 +1,33 @@ name: 'Setup Go' -description: 'Setup Go and gotestsum for running tests.' +description: 'Setup Go and Development tools for running tests' inputs: go-version: required: true description: Go version to setup. + tools-bin: + required: true + description: Directory to installs tools to. + tools-dir: + required: true + description: Directory that has the tool definitions. runs: using: "composite" steps: - - uses: actions/setup-go@v4 + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ inputs.go-version }} - cache: false + cache: true check-latest: true - # We're not using the cache feature provided by setup-go so that we can - # also cache the gotestsum install below. This can save up to 60s of CI - # time. It's not entirely clear why the gotestsum install step is slow - # sometimes, but from my debugging it seems hanging on some Off-CPU, - # perhaps network activity occasionally. - - name: Cache go - id: cache-go - uses: actions/cache@v3 + - name: Cache tools + id: cache-tools + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - path: | - /home/runner/.cache/go-build - /home/runner/go/pkg/mod - /home/runner/go/bin - key: ${{ runner.os }}-go-${{ inputs.go-version }}-${{ hashFiles('**/go.mod', '**/go.sum') }} + path: ${{ inputs.tools-bin }} + key: ${{ runner.os }}-go-${{ inputs.go-version }}-tools-${{ inputs.tools-dir }}-${{ inputs.tools-bin}}-${{ hashFiles('**/go.mod', '**/go.sum') }} - - name: Install gotestsum - if: steps.cache-go.outputs.cache-hit != 'true' + - name: Install development tools + if: steps.cache-tools.outputs.cache-hit != 'true' shell: bash - run: | - go install gotest.tools/gotestsum@latest + run: |- + ./scripts/install_tools.sh --tools-dir ${{ inputs.tools-dir }} --bin-dir ${{ inputs.tools-bin }} diff --git a/.github/actions/supported_configurations_validation/action.yml b/.github/actions/supported_configurations_validation/action.yml new file mode 100644 index 0000000000..f9f4b299bb --- /dev/null +++ b/.github/actions/supported_configurations_validation/action.yml @@ -0,0 +1,11 @@ +name: 'Supported Configurations Diff Check' +description: 'Check for changes in supported_configurations.json file in order to detect unknown configurations' +runs: + using: "composite" + steps: + - name: Supported Configurations Diff Check + if: always() + shell: bash + run: |- + git diff internal/env/supported_configurations.json + go run ./scripts/configinverter/main.go check \ No newline at end of file diff --git a/.github/chainguard/gitlab.github-access.actions-read.sts.yaml b/.github/chainguard/gitlab.github-access.actions-read.sts.yaml new file mode 100644 index 0000000000..3ddbb0ed6d --- /dev/null +++ b/.github/chainguard/gitlab.github-access.actions-read.sts.yaml @@ -0,0 +1,8 @@ +issuer: https://gitlab.ddbuild.io + +# https://regex101.com/r/NdI6sn/1 +subject_pattern: "project_path:DataDog/apm-reliability/dd-trace-go:ref_type:tag:ref:contrib/(envoyproxy/go-control-plane|k8s.io/gateway-api)/v[0-9]+\\.[0-9]+\\.[0-9]+(-docker\\.[0-9]+)?" + +permissions: + actions: read + contents: read \ No newline at end of file diff --git a/.github/chainguard/gitlab.github-access.slo-change-tracking.contents-read.sts.yaml b/.github/chainguard/gitlab.github-access.slo-change-tracking.contents-read.sts.yaml new file mode 100644 index 0000000000..fa47eb2a6d --- /dev/null +++ b/.github/chainguard/gitlab.github-access.slo-change-tracking.contents-read.sts.yaml @@ -0,0 +1,6 @@ +issuer: https://gitlab.ddbuild.io + +subject_pattern: "project_path:DataDog/apm-reliability/dd-trace-go:ref_type:(branch|tag):ref:.*" + +permissions: + contents: read diff --git a/.github/chainguard/self.ecosystems-label-issue.sts.yaml b/.github/chainguard/self.ecosystems-label-issue.sts.yaml new file mode 100644 index 0000000000..79fb823418 --- /dev/null +++ b/.github/chainguard/self.ecosystems-label-issue.sts.yaml @@ -0,0 +1,9 @@ +issuer: https://token.actions.githubusercontent.com +subject: repo:DataDog/dd-trace-go:issues +claim_pattern: + event_name: issues + repository: DataDog/dd-trace-go + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/ecosystems-label-issue.yml@.* +permissions: + contents: read + issues: write diff --git a/.github/chainguard/self.ecosystems-label-pr.sts.yaml b/.github/chainguard/self.ecosystems-label-pr.sts.yaml new file mode 100644 index 0000000000..f7d02bc032 --- /dev/null +++ b/.github/chainguard/self.ecosystems-label-pr.sts.yaml @@ -0,0 +1,9 @@ +issuer: https://token.actions.githubusercontent.com +subject: repo:DataDog/dd-trace-go:pull_request +claim_pattern: + event_name: pull_request + repository: DataDog/dd-trace-go + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/ecosystems-label-pr.yml@.* +permissions: + contents: read + pull_requests: write \ No newline at end of file diff --git a/.github/chainguard/self.outdated-integrations.sts.yaml b/.github/chainguard/self.outdated-integrations.sts.yaml new file mode 100644 index 0000000000..6549a5353e --- /dev/null +++ b/.github/chainguard/self.outdated-integrations.sts.yaml @@ -0,0 +1,13 @@ +issuer: https://token.actions.githubusercontent.com +subject: repo:DataDog/dd-trace-go:ref:refs/heads/main + +claim_pattern: + ref: refs/heads/main + ref_protected: "true" + repository: DataDog/dd-trace-go + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/outdated-integrations.yml@.* + +permissions: + actions: read + contents: write + pull_requests: write diff --git a/.github/chainguard/self.pr-static-checks.sts.yaml b/.github/chainguard/self.pr-static-checks.sts.yaml new file mode 100644 index 0000000000..dd4f3e75d3 --- /dev/null +++ b/.github/chainguard/self.pr-static-checks.sts.yaml @@ -0,0 +1,9 @@ +issuer: https://token.actions.githubusercontent.com +subject: repo:DataDog/dd-trace-go:pull_request +claim_pattern: + event_name: pull_request + repository: DataDog/dd-trace-go + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/static-checks.yml@.* +permissions: + contents: read + pull_requests: write diff --git a/.github/chainguard/self.push-static-checks.sts.yaml b/.github/chainguard/self.push-static-checks.sts.yaml new file mode 100644 index 0000000000..9d5229ca45 --- /dev/null +++ b/.github/chainguard/self.push-static-checks.sts.yaml @@ -0,0 +1,9 @@ +issuer: https://token.actions.githubusercontent.com +subject: repo:DataDog/dd-trace-go:ref:refs/heads/main +claim_pattern: + event_name: push + ref: refs/heads/main + ref_protected: "true" + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/static-checks.yml@refs/heads/main +permissions: + contents: read diff --git a/.github/chainguard/self.reviewdog.sts.yaml b/.github/chainguard/self.reviewdog.sts.yaml new file mode 100644 index 0000000000..e8a9ce021f --- /dev/null +++ b/.github/chainguard/self.reviewdog.sts.yaml @@ -0,0 +1,9 @@ +issuer: https://token.actions.githubusercontent.com +subject: repo:DataDog/dd-trace-go:pull_request +claim_pattern: + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/static-checks.yml@.* + event_name: pull_request + repository: DataDog/dd-trace-go +permissions: + contents: read + pull_requests: write diff --git a/.github/chainguard/self.update-supported-versions-doc.create-pr.sts.yaml b/.github/chainguard/self.update-supported-versions-doc.create-pr.sts.yaml new file mode 100644 index 0000000000..905d435b87 --- /dev/null +++ b/.github/chainguard/self.update-supported-versions-doc.create-pr.sts.yaml @@ -0,0 +1,13 @@ +issuer: https://token.actions.githubusercontent.com + +subject: repo:DataDog/dd-trace-go:ref:refs/heads/main + +claim_pattern: + event_name: workflow_run + ref: refs/heads/main + ref_protected: "true" + job_workflow_ref: DataDog/dd-trace-go/.github/workflows/update-supported-versions-doc.yml@refs/heads/main + +permissions: + contents: write + pull_requests: write \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..d5a558a777 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,17 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file + +version: 2 +updates: + - package-ecosystem: "github-actions" + directories: + - "/" + - "/.github/actions/*" + schedule: + interval: "monthly" + groups: + gh-actions-packages: + patterns: + - "*" diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e3e331a1ee..bee7b7d521 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -30,8 +30,8 @@ - [ ] [System-Tests](https://github.com/DataDog/system-tests/) covering this feature have been added and enabled with the va.b.c-dev version tag. - [ ] There is a benchmark for any new code, or changes to existing code. - [ ] If this interacts with the agent in a new way, a system test has been added. +- [ ] New code is free of linting errors. You can check this by running `./scripts/lint.sh` locally. - [ ] Add an appropriate team label so this PR gets put in the right place for the release notes. - [ ] Non-trivial go.mod changes, e.g. adding new modules, are reviewed by @DataDog/dd-trace-go-guild. - Unsure? Have a question? Request a review! diff --git a/.github/workflows/all-green.yml b/.github/workflows/all-green.yml new file mode 100644 index 0000000000..ca5671ec81 --- /dev/null +++ b/.github/workflows/all-green.yml @@ -0,0 +1,29 @@ +name: Check Pull Request CI Status + +on: + workflow_dispatch: # allow to trigger the workflow on main, to add it in suggestion on branch protection rules + pull_request: + +permissions: + checks: read + statuses: read + +jobs: + all-jobs-are-green: + runs-on: ubuntu-latest + steps: + - name: Run Ensure CI Success + uses: DataDog/ensure-ci-success@b0d931ac77c810490e61964c321103040eef888e + with: + initial-delay-seconds: "600" + max-retries: "60" + # polling-interval-seconds: "60" # Default + ignored-name-patterns: | + devflow/merge + label_issues + check-title + +# Reason for ignored-name-patterns: +# +# * devflow/merge: technical job used by the merge queue, do not remove it. +# * check-title: CI job used to validate the PR title, enforced by branch protection rules, do not remove it. diff --git a/.github/workflows/api-check.yml b/.github/workflows/api-check.yml new file mode 100644 index 0000000000..09e1ad889b --- /dev/null +++ b/.github/workflows/api-check.yml @@ -0,0 +1,34 @@ +name: API Stability Check + +on: + pull_request: + paths: + - 'ddtrace/tracer/**' + - 'scripts/apiextractor/**' + - '.github/workflows/api-check.yml' + +jobs: + check-api-stability: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + + - name: Generate current API for ddtrace/tracer + run: | + go run ./scripts/apiextractor/api_extractor.go ./ddtrace/tracer > current_api.txt + + - name: Compare with committed API + run: | + if ! diff -u ./ddtrace/tracer/api.txt current_api.txt; then + echo "❌ API changes detected but api.txt not updated!" + echo "Please run 'go run ./scripts/apiextractor/api_extractor.go ./ddtrace/tracer > ./ddtrace/tracer/api.txt'" + echo "and commit the changes." + exit 1 + fi + echo "✅ API is stable" diff --git a/.github/workflows/apps/go.mod b/.github/workflows/apps/go.mod new file mode 100644 index 0000000000..ce63458c20 --- /dev/null +++ b/.github/workflows/apps/go.mod @@ -0,0 +1,89 @@ +module github.com/DataDog/dd-trace-go/.github/workflows/apps + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + golang.org/x/mod v0.29.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.7.1 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.1 // indirect + github.com/shirou/gopsutil/v4 v4.25.9 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.4.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/collector/component v1.42.0 // indirect + go.opentelemetry.io/collector/featuregate v1.42.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.136.0 // indirect + go.opentelemetry.io/collector/pdata v1.42.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/log v0.14.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250911091902-df9299821621 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.13.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250929231259-57b25ae835d4 // indirect + google.golang.org/grpc v1.75.1 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/.github/workflows/apps/go.sum b/.github/workflows/apps/go.sum new file mode 100644 index 0000000000..0ff33522aa --- /dev/null +++ b/.github/workflows/apps/go.sum @@ -0,0 +1,308 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.7.1 h1:dNhEwKaO3LJhGYKajl2DjobArfa5R9YF72z3Dy+PH3k= +github.com/DataDog/datadog-go/v5 v5.7.1/go.mod h1:CA9Ih6tb3jtxk+ps1xvTnxmhjr7ldE8TiwrZyrm31ss= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6 h1:rIMZ3Bqn2w8nWrAIXekOdm+sZVxUYHGX8cS7P9W06Kk= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54 h1:mFWunSatvkQQDhpdyuFAYwyAan3hzCuma+Pz8sqvOfg= +github.com/lufia/plan9stats v0.0.0-20250827001030-24949be3fa54/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= +github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= +github.com/shirou/gopsutil/v4 v4.25.9 h1:JImNpf6gCVhKgZhtaAHJ0serfFGtlfIlSC08eaKdTrU= +github.com/shirou/gopsutil/v4 v4.25.9/go.mod h1:gxIxoC+7nQRwUl/xNhutXlD8lq+jxTgpIkEf3rADHL8= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.4.0 h1:SYOeDRiydzOw9kSiwdYp9UcBgPFtLU2WDHaJXyHruf8= +github.com/tinylib/msgp v1.4.0/go.mod h1:cvjFkb4RiC8qSBOPMGPSzSAx47nAsfhLVTCZZNuHv5o= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/collector/component v1.42.0 h1:on4XJ/NT1oPnuCVKDEtlpcr3GGPAS9taWBe8woHSTmY= +go.opentelemetry.io/collector/component v1.42.0/go.mod h1:mehIbkABLhEEs3kmAqer2GRmLwcQLoeF7C48CR6lxP0= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.42.0 h1:uCVwumVBVex46DsG/fvgiTGuf9f53bALra7vGyKaqFI= +go.opentelemetry.io/collector/featuregate v1.42.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= +go.opentelemetry.io/collector/internal/telemetry v0.136.0 h1:3TcnxyUFs6jJZeLo5ju3fMWS4lRmIApl9To2XWk922M= +go.opentelemetry.io/collector/internal/telemetry v0.136.0/go.mod h1:dTykH9zv/zOnlyUvqfGIqpaQZhmayW7NssD7TPU4paE= +go.opentelemetry.io/collector/pdata v1.42.0 h1:XEzisp/SNfKDcY4aRU6qrHeLzGypRUdYHjbBqkDFOO4= +go.opentelemetry.io/collector/pdata v1.42.0/go.mod h1:nnOmgf+RI/D5xYWgFPZ5nKuhf2E0Qy9Nx/mxoTvIq3k= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.42.0 h1:jqn1lPwUdCn+lsyNubCtwzXZLEm+R3kRWxLpDkhlvvs= +go.opentelemetry.io/collector/pipeline v1.42.0/go.mod h1:xUrAqiebzYbrgxyoXSkk6/Y3oi5Sy3im2iCA51LwUAI= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 h1:aBKdhLVieqvwWe9A79UHI/0vgp2t/s2euY8X59pGRlw= +go.opentelemetry.io/contrib/bridges/otelzap v0.13.0/go.mod h1:SYqtxLQE7iINgh6WFuVi2AI70148B8EI35DSk0Wr8m4= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= +go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= +go.opentelemetry.io/otel/log/logtest v0.14.0 h1:BGTqNeluJDK2uIHAY8lRqxjVAYfqgcaTbVk1n3MWe5A= +go.opentelemetry.io/otel/log/logtest v0.14.0/go.mod h1:IuguGt8XVP4XA4d2oEEDMVDBBCesMg8/tSGWDjuKfoA= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= +go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0/go.mod h1:VyU6dTWBWv6h9w/+DYgSZAPMabWbPTFTuxp25sM8+s0= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0 h1:i8YpvWGm/Uq1koL//bnbJ/26eV3OrKWm09+rDYo7keU= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0/go.mod h1:pQ70xHY/ZVxNUBPn+qUWPl8nwai87eWdqL3M37lNi9A= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250911091902-df9299821621 h1:2id6c1/gto0kaHYyrixvknJ8tUK/Qs5IsmBtrc+FtgU= +golang.org/x/exp v0.0.0-20250911091902-df9299821621/go.mod h1:TwQYMMnGpvZyc+JpB/UAuTNIsVJifOlSkrZkhcvpVUk= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= +golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250929231259-57b25ae835d4 h1:i8QOKZfYg6AbGVZzUAY3LrNWCKF8O6zFisU9Wl9RER4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250929231259-57b25ae835d4/go.mod h1:HSkG/KdJWusxU1F6CNrwNDjBMgisKxGnc5dAZfT0mjQ= +google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= +google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/.github/workflows/apps/govulncheck-contribs-v2.sh b/.github/workflows/apps/govulncheck-contribs-v2.sh new file mode 100755 index 0000000000..fa5c2e03f2 --- /dev/null +++ b/.github/workflows/apps/govulncheck-contribs-v2.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +find ./contrib -mindepth 2 -type f -name go.mod -exec dirname {} \; | while read dir ; do + echo "Checking $dir" + # govulncheck doesn't support modules with only a go.mod in the root + go_files=$(find $dir -maxdepth 1 -type f -name '*.go' | wc -l) + [[ $go_files -eq 0 ]] && dir=$(realpath "$(ls -d $dir/*/ | head)") + + govulncheck -C $dir . +done \ No newline at end of file diff --git a/.github/workflows/apps/latest_major_versions.go b/.github/workflows/apps/latest_major_versions.go new file mode 100644 index 0000000000..bdcb9d1318 --- /dev/null +++ b/.github/workflows/apps/latest_major_versions.go @@ -0,0 +1,310 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "log" + "net/http" + "os" + "os/exec" + "regexp" + "sort" + "strings" + "time" + + "golang.org/x/mod/modfile" + "golang.org/x/mod/semver" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +type ModuleInfo struct { + Origin struct { + URL string `json:"url"` + } `json:"Origin"` +} + +type GithubLatests struct { + Version string + Module string // the base name of the module +} + +func main() { + + // Find latest major + githubLatests := map[string]GithubLatests{} // map module (base name) => latest on github + contribLatests := map[string]string{} // map module (base name) => latest on go.mod + + for pkg, packageInfo := range instrumentation.GetPackages() { + + // 1. Get package and version from the module go.mod + fmt.Printf("package: %v\n", pkg) + repository := packageInfo.TracedPackage + + if packageInfo.IsStdLib { + continue + } + + base := getBaseVersion(string(pkg)) + repo, version, err := getGoModVersion(repository, string(pkg)) + if err != nil { + fmt.Printf("%v go.mod not found.", pkg) + continue + } + + versionMajorContrib := getMajorVersion(version) + + if currentLatest, ok := contribLatests[base]; ok { + if semver.Compare(versionMajorContrib, currentLatest) > 0 { + contribLatests[base] = versionMajorContrib + } + } else { + contribLatests[base] = versionMajorContrib + } + + // 2. Create the string repository@{version} and run command go list -m -json @. + // This should return a JSON: extract Origin[URL] if the JSON contains it, otherwise continue + + origin, err := getModuleOrigin(repo, version) + if err != nil { + log.Printf("failed to get module origin: %s\n", err.Error()) + continue + } + + // 3. From the VCS url, do `git ls-remote --tags ` to get the tags + // Parse the tags, and extract all the majors from them (ex v2, v3, v4) + tags, err := getTags(origin) + if err != nil { + log.Printf("error fetching tags from origin: %s", err.Error()) + continue + } + + majors := groupByMajor(tags) + + // 4. Get the latest version of each major. For each latest version of each major: + // curl https://raw.githubusercontent.com//refs/tags/v4.18.3/go.mod + // 5a. If request returns 404, module is not a go module. This means version belongs to the module without /v at the end. + // 5b. If request returns a `go.mod`, parse the modfile. + // Get the latest version for each major + + for major, versions := range majors { + latest := getLatestVersion(versions) + + log.Printf("fetching go.mod for %s@%s\n", origin, latest) + _, err := fetchGoMod(origin, latest) + if err != nil { + log.Printf("failed to fetch go.mod for %s@%s: %+v\n", origin, latest, err) + continue + } + if latestGithub, ok := githubLatests[base]; ok { + if semver.Compare(major, latestGithub.Version) > 0 { + githubLatests[base] = GithubLatests{major, base} + } + } else { + githubLatests[base] = GithubLatests{major, base} + } + } + } + + // 6. Check if there are any outdated majors + // Output if there is a new major package we do not support + for base, contribMajor := range contribLatests { + if latestGithub, ok := githubLatests[base]; ok { + if semver.Compare(latestGithub.Version, contribMajor) > 0 { + if (base == "go-redis/redis" && latestGithub.Version == "v9") || (base == "k8s.io/client-go") { + // go-redis/redis => redis/go-redis in v9 + // for k8s.io we provide a generic http client middleware that can be plugged with any of the versions + continue + } + fmt.Printf("New latest major %s of repository %s on Github at module: %s\n", latestGithub.Version, base, latestGithub.Module) + fmt.Printf("latest contrib major: %v\n", contribMajor) + fmt.Printf("latest github major: %v\n", latestGithub.Version) + } + } + } + +} + +func fetchGoMod(origin, tag string) (*modfile.File, error) { + // Parse and process the URL + repoPath := strings.TrimPrefix(origin, "https://github.com/") + repoPath = strings.TrimPrefix(repoPath, "https://gopkg.in/") + repoPath = strings.TrimSuffix(repoPath, ".git") + repoPath = regexp.MustCompile(`\.v\d+$`).ReplaceAllString(repoPath, "") + + url := fmt.Sprintf("https://raw.githubusercontent.com/%s/refs/tags/%s/go.mod", repoPath, tag) + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, err + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + b, err := io.ReadAll(resp.Body) + if err != nil { + return nil, err + } + + return modfile.Parse("go.mod", b, nil) +} + +func truncateVersionSuffix(repository string) string { + parts := strings.Split(repository, "/") + lastPart := parts[len(parts)-1] + + if len(lastPart) > 1 && strings.HasPrefix(lastPart, "v") && semver.IsValid(lastPart) { + return strings.Join(parts[:len(parts)-1], "/") + } + + return repository +} + +func getModuleOrigin(repository, version string) (string, error) { + cmd := exec.Command("go", "list", "-m", "-json", fmt.Sprintf("%s@%s", repository, version)) + cmd.Env = append(os.Environ(), "GOPROXY=direct") + output, err := cmd.Output() + + if err != nil { + return "", fmt.Errorf("failed to execute command: %w", err) + } + + var moduleInfo ModuleInfo + if err := json.Unmarshal(output, &moduleInfo); err != nil { + return "", fmt.Errorf("failed to parse JSON output: %w", err) + } + + if moduleInfo.Origin.URL == "" { + // If Origin.URL is not found, return an error + return "", fmt.Errorf("Origin.URL not found in JSON for %s@%s", repository, version) + } + + return moduleInfo.Origin.URL, nil +} + +// Run `git ls-remote` and fetch tags +func getTags(vcsURL string) ([]string, error) { + cmd := exec.Command("git", "ls-remote", "--tags", vcsURL) + output, err := cmd.Output() + if err != nil { + return nil, err + } + scanner := bufio.NewScanner(bytes.NewReader(output)) + tags := []string{} + tagRegex := regexp.MustCompile(`refs/tags/(v[\d.]+)$`) + for scanner.Scan() { + line := scanner.Text() + if matches := tagRegex.FindStringSubmatch(line); matches != nil { + tags = append(tags, matches[1]) + } + } + return tags, nil +} + +// Group tags by major version +func groupByMajor(tags []string) map[string][]string { + majors := make(map[string][]string) + for _, tag := range tags { + if semver.IsValid(tag) { + major := semver.Major(tag) + majors[major] = append(majors[major], tag) + } + } + return majors +} + +// Get the latest version for a list of versions +func getLatestVersion(versions []string) string { + + // Filter out pre-release versions and non-valid versions + validVersions := make([]string, 0) + for _, v := range versions { + if semver.IsValid(v) && semver.Prerelease(v) == "" { + validVersions = append(validVersions, v) + } + } + sort.Slice(validVersions, func(i, j int) bool { + return semver.Compare(validVersions[i], validVersions[j]) < 0 + }) + return validVersions[len(validVersions)-1] +} + +func getBaseVersion(pkg string) string { + // Match on the pattern ".v{X}" or "/v{X}" where {X} is a number + // Replace the matched pattern with an empty string + re := regexp.MustCompile(`(\.v\d+|/v\d+)$`) + return re.ReplaceAllString(pkg, "") +} + +func getMajorVersion(version string) string { + parts := strings.Split(version, ".") + return parts[0] +} + +func getGoModVersion(pkg string, instrumentationName string) (string, string, error) { + // Look for go.mod in contrib/{package} + // If go.mod exists, look for repository name in the go.mod + // Parse the version associated with repository + // Define the path to the go.mod file within the contrib/{pkg} directory + pkg = truncateVersionSuffix(pkg) + + goModPath := fmt.Sprintf("contrib/%s/go.mod", instrumentationName) + + // Read the go.mod file + content, err := os.ReadFile(goModPath) + if err != nil { + return "", "", fmt.Errorf("failed to read go.mod file at %s: %w", goModPath, err) + } + + // Parse the go.mod file + modFile, err := modfile.Parse(goModPath, content, nil) + if err != nil { + return "", "", fmt.Errorf("failed to parse go.mod file at %s: %w", goModPath, err) + } + + // Keep track of largest version from go.mod + var largestVersion string + var largestVersionRepo string + + // Search for the module matching the repository + for _, req := range modFile.Require { + if strings.HasPrefix(req.Mod.Path, pkg) { + version := req.Mod.Version + + if !semver.IsValid(version) { + return "", "", fmt.Errorf("invalid semantic version %s in go.mod", version) + } + + if largestVersion == "" || semver.Compare(version, largestVersion) > 0 { + largestVersion = version + largestVersionRepo = req.Mod.Path + } + } + } + + if largestVersion == "" { + // If the repository is not found in the dependencies, return + return "", "", fmt.Errorf("package %s not found in go.mod file", pkg) + } + return largestVersionRepo, largestVersion, nil +} diff --git a/.github/workflows/appsec.yml b/.github/workflows/appsec.yml index 33bed353f0..def0af8ef6 100644 --- a/.github/workflows/appsec.yml +++ b/.github/workflows/appsec.yml @@ -16,25 +16,34 @@ on: - 'appsec/**' - 'contrib/**/appsec.go' - '**/go.mod' - merge_group: push: - branches: release-v* - + branches: + - release-v* + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' env: DD_APPSEC_WAF_TIMEOUT: 1m - TESTS: >- + GOEXPERIMENT: synctest # TODO: remove once go1.25 is the minimum supported version + PACKAGES: >- ./appsec/... + ./instrumentation/appsec/... ./internal/appsec/... - ./contrib/gin-gonic/gin/... - ./contrib/google.golang.org/grpc/... - ./contrib/net/http/... - ./contrib/gorilla/mux/... - ./contrib/go-chi/chi/... - ./contrib/go-chi/chi.v5/... - ./contrib/labstack/echo.v4/... - ./contrib/99designs/gqlgen/... - ./contrib/graphql-go/graphql/... - ./contrib/graph-gophers/graphql-go/... + SUBMODULES: >- + ./contrib/database/sql + ./contrib/gin-gonic/gin + ./contrib/google.golang.org/grpc + ./contrib/net/http + ./contrib/gorilla/mux + ./contrib/go-chi/chi + ./contrib/go-chi/chi.v5 + ./contrib/labstack/echo.v4 + ./contrib/99designs/gqlgen + ./contrib/graphql-go/graphql + ./contrib/graph-gophers/graphql-go concurrency: # Automatically cancel previous runs if a new one is triggered to conserve resources. @@ -64,7 +73,9 @@ jobs: key: ${{ steps.cfg.outputs.key }} path: ${{ steps.cfg.outputs.path }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} - name: Compute cache configuration id: cfg @@ -72,13 +83,13 @@ jobs: echo "key=go-pkg-mod-${{ hashFiles('**/go.sum') }}" >> $GITHUB_OUTPUT echo "path=go_pkg_mod_cache" >> $GITHUB_OUTPUT - - uses: actions/setup-go@v5 + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: cache: false - name: Cache Go modules id: cache - uses: actions/cache@v4 + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: path: ${{ steps.cfg.outputs.path }} key: ${{ steps.cfg.outputs.key }} @@ -97,14 +108,16 @@ jobs: needs: go-mod-caching strategy: matrix: - runs-on: [ macos-12, macos-14 ] # oldest and newest macos runners available - macos-14 mainly is here to cover the fact it is an ARM machine - go-version: [ "1.23", "1.22" ] - fail-fast: true # saving some CI time - macos runners too long to get + runs-on: [ macos-14, macos-latest ] # oldest and newest macos runners available + go-version: [ "1.25", "1.24" ] + fail-fast: true # saving some CI time - macos runners are too long to get steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} - name: Restore Go modules cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: path: ${{ needs.go-mod-caching.outputs.path }} key: ${{ needs.go-mod-caching.outputs.key }} @@ -112,7 +125,7 @@ jobs: enableCrossOsArchive: true fail-on-cache-miss: true - - uses: actions/setup-go@v5 + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: ${{ matrix.go-version }} cache: false # we manage the caching ourselves @@ -126,17 +139,32 @@ jobs: GOMODCACHE: ${{ github.workspace }}/${{ needs.go-mod-caching.outputs.path }} run: | set -euxo pipefail - cgocheck="GOEXPERIMENT=cgocheck2" + cgocheck="$GOEXPERIMENT,cgocheck2" + report_error=0 for cgo in "0" "1"; do for appsec_enabled_env in "" "DD_APPSEC_ENABLED=true" "DD_APPSEC_ENABLED=false"; do for cgocheck_env in "" "$cgocheck"; do - if ! env CGO_ENABLED=$cgo $appsec_enabled_env $cgocheck_env go test -v $TESTS; then - echo "Failed: env CGO_ENABLED=$cgo $appsec_enabled_env $cgocheck_env go test -v $TESTS" - exit 1 + if ! env CGO_ENABLED=$cgo $appsec_enabled_env GOEXPERIMENT=$cgocheck_env go test -v $PACKAGES; then + echo "Failed: env CGO_ENABLED=$cgo $appsec_enabled_env GOEXPERIMENT=$cgocheck_env go test -v $PACKAGES" fi + + for submodule in $SUBMODULES; do + if [[ $cgocheck_env =~ "cgocheck2" && $submodule == "./contrib/gin-gonic/gin" ]]; then + echo "Skipped: env CGO_ENABLED=$cgo $appsec_enabled_env GOEXPERIMENT=$cgocheck_env go test -v . (submodule: $submodule, reason: gin-gonic/gin depends on leodido/go-urn that causes an internal compiler when GOEXPERIMENT=cgocheck2)" + continue + fi + + cd $submodule + if ! env CGO_ENABLED=$cgo $appsec_enabled_env GOEXPERIMENT=$cgocheck_env go test -v .; then + echo "Failed: env CGO_ENABLED=$cgo $appsec_enabled_env GOEXPERIMENT=$cgocheck_env go test -v . (submodule: $submodule)" + report_error=1 + fi + cd - + done done done done + exit $report_error # Tests cases were appsec end up being disabled at compilation time disabled: @@ -148,10 +176,12 @@ jobs: matrix: runs-on: [ macos-latest, windows-latest, ubuntu-latest-16-cores ] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} - name: Restore Go modules cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: path: ${{ needs.go-mod-caching.outputs.path }} key: ${{ needs.go-mod-caching.outputs.key }} @@ -159,7 +189,7 @@ jobs: enableCrossOsArchive: true fail-on-cache-miss: true - - uses: actions/setup-go@v5 + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable cache: false # we manage the caching ourselves @@ -175,31 +205,45 @@ jobs: set -euxo pipefail for appsec_enabled_env in "" "DD_APPSEC_ENABLED=true" "DD_APPSEC_ENABLED=false"; do for go_tags in "" "-tags datadog.no_waf"; do - if ! env $appsec_enabled_env go test -v $go_tags $TESTS; then - echo "Failed: env $appsec_enabled_env go test -v $go_tags $TESTS" - exit 1 + if ! env $appsec_enabled_env go test -v $go_tags $PACKAGES; then + echo "Failed: env $appsec_enabled_env go test -v $go_tags $PACKAGES" fi + + for submodule in $SUBMODULES; do + cd $submodule + if ! env $appsec_enabled_env go test -v $go_tags .; then + echo "Failed: env $appsec_enabled_env go test -v $go_tags . (submodule: $submodule)" + fi + cd - + done done done + # Check for changes in the supported configurations + - name: Supported Configurations Diff Check + if: always() + uses: ./.github/actions/supported_configurations_validation + # Same tests but on the official golang container for linux golang-linux-container: name: ${{ matrix.platform }} golang:${{ matrix.go-version }}-${{ matrix.distribution }} # We use ARM runners when needed to avoid the performance hit of QEMU - runs-on: ${{ matrix.platform == 'linux/amd64' && 'ubuntu-latest-16-cores' || 'arm-4core-linux' }} + runs-on: ${{ matrix.platform == 'linux/amd64' && 'ubuntu-latest-16-cores' || 'ubuntu-24.04-arm' }} needs: go-mod-caching strategy: matrix: - go-version: [ "1.23", "1.22" ] - distribution: [ bookworm, bullseye, alpine ] + go-version: [ "1.25", "1.24" ] + distribution: [ trixie, bookworm, alpine ] platform: [ linux/amd64, linux/arm64 ] fail-fast: false steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} - name: Restore Go modules cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: path: ${{ needs.go-mod-caching.outputs.path }} key: ${{ needs.go-mod-caching.outputs.key }} @@ -235,25 +279,68 @@ jobs: -v "$PWD:$PWD" \ -w "$PWD" \ -e "DD_APPSEC_WAF_TIMEOUT=${{ env.DD_APPSEC_WAF_TIMEOUT }}" \ + -e "GOEXPERIMENT=${{ env.GOEXPERIMENT }}" \ golang:${{ matrix.go-version }}-${{ matrix.distribution }} - name: Install pre-requisites on Alpine if: matrix.distribution == 'alpine' - run: sudo docker exec -i test.runner apk add gcc musl-dev libc6-compat + run: sudo docker exec -i test.runner apk add gcc musl-dev libc6-compat bash - name: Output go env run: sudo docker exec -i test.runner go env - name: NOCGO, undefined appsec state - run: sudo docker exec -i test.runner env CGO_ENABLED=0 go test -v $TESTS + run: | + sudo docker exec -i -e CGO_ENABLED=0 test.runner go test -v $PACKAGES + for submodule in $SUBMODULES; do + if ! sudo docker exec -i -e CGO_ENABLED=0 test.runner bash -c "cd $submodule && go test -v ."; then + echo "Failed: env CGO_ENABLED=0 bash -c \"cd $submodule && go test -v .\" (submodule: $submodule)" + fi + done - name: NOCGO, appsec disabled - run: sudo docker exec -i test.runner env CGO_ENABLED=0 DD_APPSEC_ENABLED=false go test -v $TESTS + run: | + sudo docker exec -i -e CGO_ENABLED=0 -e DD_APPSEC_ENABLED=false test.runner go test -v $PACKAGES + for submodule in $SUBMODULES; do + if ! sudo docker exec -i -e CGO_ENABLED=0 -e DD_APPSEC_ENABLED=false test.runner bash -c "cd $submodule && go test -v ."; then + echo "Failed: env CGO_ENABLED=0 DD_APPSEC_ENABLED=false bash -c \"cd $submodule && go test -v .\" (submodule: $submodule)" + fi + done - name: NOCGO, appsec enabled - run: sudo docker exec -i test.runner env CGO_ENABLED=0 DD_APPSEC_ENABLED=true go test -v $TESTS + run: | + sudo docker exec -i -e CGO_ENABLED=0 -e DD_APPSEC_ENABLED=true test.runner go test -v $PACKAGES + for submodule in $SUBMODULES; do + if ! sudo docker exec -i -e CGO_ENABLED=0 -e DD_APPSEC_ENABLED=true test.runner bash -c "cd $submodule && go test -v ."; then + echo "Failed: env CGO_ENABLED=0 DD_APPSEC_ENABLED=true bash -c \"cd $submodule && go test -v .\" (submodule: $submodule)" + fi + done - name: CGO, undefined appsec state - run: sudo docker exec -i test.runner env CGO_ENABLED=1 go test -v $TESTS + run: | + sudo docker exec -i -e CGO_ENABLED=1 test.runner go test -v $PACKAGES + for submodule in $SUBMODULES; do + if ! sudo docker exec -i -e CGO_ENABLED=1 test.runner bash -c "cd $submodule && go test -v ."; then + echo "Failed: env CGO_ENABLED=1 bash -c \"cd $submodule && go test -v .\" (submodule: $submodule)" + fi + done - name: CGO, appsec disabled - run: sudo docker exec -i test.runner env CGO_ENABLED=1 DD_APPSEC_ENABLED=false go test -v $TESTS + run: | + sudo docker exec -i -e CGO_ENABLED=1 -e DD_APPSEC_ENABLED=false test.runner go test -v $PACKAGES + for submodule in $SUBMODULES; do + if ! sudo docker exec -i -e CGO_ENABLED=1 -e DD_APPSEC_ENABLED=false test.runner bash -c "cd $submodule && go test -v ."; then + echo "Failed: env CGO_ENABLED=1 DD_APPSEC_ENABLED=false bash -c \"cd $submodule && go test -v .\" (submodule: $submodule)" + fi + done - name: CGO, appsec enabled - run: sudo docker exec -i test.runner env CGO_ENABLED=1 DD_APPSEC_ENABLED=true go test -v $TESTS + run: | + sudo docker exec -i -e CGO_ENABLED=1 -e DD_APPSEC_ENABLED=true test.runner go test -v $PACKAGES + for submodule in $SUBMODULES; do + if ! sudo docker exec -i -e CGO_ENABLED=1 -e DD_APPSEC_ENABLED=true test.runner bash -c "cd $submodule && go test -v ."; then + echo "Failed: env CGO_ENABLED=1 DD_APPSEC_ENABLED=true bash -c \"cd $submodule && go test -v .\" (submodule: $submodule)" + fi + done + + # Check for changes in the supported_configurations.json file + - name: Supported Configurations Diff Check + if: always() + run: | + sudo docker exec -i test.runner bash -c "go run ./scripts/configinverter/main.go check" - name: Clean up if: always() @@ -264,4 +351,4 @@ jobs: if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner == 'DataDog' uses: DataDog/appsec-go-test-app/.github/workflows/smoke-tests.yml@main with: - dd-trace-go-version: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }} + dd-trace-go-version: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || '' }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 8d85bac9df..a5a97a3c85 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -8,12 +8,9 @@ on: required: true type: string push: - branches: [ main, master ] + branches: + - mq-working-branch-** pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - merge_group: - jobs: analyze: name: Analyze @@ -32,13 +29,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@3c3833e0f8c1c83d449a7478aa59c036a9165498 # v3.29.11 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -49,7 +46,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@3c3833e0f8c1c83d449a7478aa59c036a9165498 # v3.29.11 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@3c3833e0f8c1c83d449a7478aa59c036a9165498 # v3.29.11 diff --git a/.github/workflows/datadog-static-analysis.yml b/.github/workflows/datadog-static-analysis.yml index 9a00adaad1..6df9e1caee 100644 --- a/.github/workflows/datadog-static-analysis.yml +++ b/.github/workflows/datadog-static-analysis.yml @@ -12,10 +12,10 @@ jobs: name: Datadog Static Analyzer steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: Check code meets quality and security standards id: datadog-static-analysis - uses: DataDog/datadog-static-analyzer-github-action@v1 + uses: DataDog/datadog-static-analyzer-github-action@2707598b1182dce1d1792186477b5b4132338e1c # v1.2.3 with: dd_api_key: ${{ secrets.STATIC_ANALYZER_API_KEY }} dd_app_key: ${{ secrets.STATIC_ANALYZER_APP_KEY }} diff --git a/.github/workflows/docker-build-and-push.yml b/.github/workflows/docker-build-and-push.yml new file mode 100644 index 0000000000..3669f403d3 --- /dev/null +++ b/.github/workflows/docker-build-and-push.yml @@ -0,0 +1,172 @@ +name: Docker image Build and Push + +on: + workflow_call: + inputs: + image: + description: 'Docker image name' + required: true + type: string + dockerfile: + description: 'Path to the Dockerfile' + required: true + type: string + artifact_prefix: + description: 'Prefix for the artifact name' + required: true + type: string + commit_sha: + description: 'Commit SHA to checkout' + required: true + type: string + tags: + description: 'Space-separated list of tags to apply to the image (e.g., "latest v2.0.0")' + required: true + type: string + push: + description: 'Push image to ghcr.io' + required: false + type: boolean + default: true + platforms: + description: 'A JSON array of platforms to build for.' + required: false + type: string + default: '["linux/amd64", "linux/arm64"]' + version: + description: 'DD_VERSION to pass as build argument to Dockerfile' + required: false + type: string + default: '' + +jobs: + build-images: + runs-on: ${{ matrix.platform == 'linux/amd64' && 'ubuntu-latest' || 'ubuntu-24.04-arm' }} + strategy: + matrix: + platform: ${{ fromJSON(inputs.platforms) }} + steps: + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.commit_sha }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + + - name: Login to Docker + shell: bash + # It's not possible to use a `dd-octo-sts` token here because GitHub Packages + # only supports PATs for authentication. + # https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry#authenticating-to-the-container-registry + run: docker login -u publisher -p ${{ secrets.GITHUB_TOKEN }} ghcr.io + + - name: Docker meta + id: meta + uses: docker/metadata-action@c1e51972afc2121e065aed6d45c65596fe445f3f # v5.8.0 + with: + images: ${{ inputs.image }} + + - name: Build and push by digest + id: build + if: inputs.push == true + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + file: ${{ inputs.dockerfile }} + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + DD_VERSION=${{ inputs.version }} + COMMIT_SHA=${{ inputs.commit_sha }} + # This builds a Docker image and uploads it using a unique fingerprint, without a name + outputs: type=image,name=${{ inputs.image }},push-by-digest=true,name-canonical=true,push=true + + - name: Generate tags + if: inputs.push == false + id: tags + run: | + TAGS="" + for tag in ${{ inputs.tags }}; do + if [ -n "$tag" ]; then + TAGS="$TAGS,${{ inputs.image }}:$tag" + fi + done + echo "list=${TAGS:1}" >> $GITHUB_OUTPUT + + - name: Build and export + id: build-export + if: inputs.push == false + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 + with: + context: . + file: ${{ inputs.dockerfile }} + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + tags: ${{ steps.tags.outputs.list }} + build-args: | + DD_VERSION=${{ inputs.version }} + COMMIT_SHA=${{ inputs.commit_sha }} + outputs: type=docker,dest=/tmp/${{ inputs.artifact_prefix }}-${{ env.PLATFORM_PAIR }}.tar + push: false + + - name: Export digest + if: inputs.push == true + run: | + mkdir -p /tmp/digests + digest="${{ steps.build.outputs.digest }}" + touch "/tmp/digests/${digest#sha256:}" + + - name: Upload digest + if: inputs.push == true + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: digests-${{ inputs.artifact_prefix }}-${{ env.PLATFORM_PAIR }} + path: /tmp/digests/* + if-no-files-found: error + retention-days: 1 + + - name: Upload image artifact + if: inputs.push == false + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ inputs.artifact_prefix }}-${{ env.PLATFORM_PAIR }} + path: /tmp/${{ inputs.artifact_prefix }}-${{ env.PLATFORM_PAIR }}.tar + if-no-files-found: error + retention-days: 1 + + publish-images: + if: inputs.push == true + runs-on: ubuntu-latest + needs: [build-images] + steps: + - name: Download digests + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + with: + path: /tmp/digests + pattern: digests-${{ inputs.artifact_prefix }}-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 + + - name: Login to Docker + shell: bash + run: docker login -u publisher -p ${{ secrets.GITHUB_TOKEN }} ghcr.io + + - name: Create manifest list and push + working-directory: /tmp/digests + run: | + TAG_FLAGS="" + for tag in ${{ inputs.tags }}; do + if [ -n "$tag" ]; then + TAG_FLAGS="$TAG_FLAGS -t ${{ inputs.image }}:$tag" + fi + done + docker buildx imagetools create $TAG_FLAGS \ + $(printf '${{ inputs.image }}@sha256:%s ' *) \ No newline at end of file diff --git a/.github/workflows/docker-images-release.yml b/.github/workflows/docker-images-release.yml new file mode 100644 index 0000000000..f2bc71e2a2 --- /dev/null +++ b/.github/workflows/docker-images-release.yml @@ -0,0 +1,111 @@ +name: Release Docker images + +on: + push: + tags: + - 'contrib/envoyproxy/go-control-plane/v[0-9]+.[0-9]+.[0-9]+' + - 'contrib/envoyproxy/go-control-plane/v[0-9]+.[0-9]+.[0-9]+-docker.[0-9]+' + - 'contrib/k8s.io/gateway-api/v[0-9]+.[0-9]+.[0-9]+' + - 'contrib/k8s.io/gateway-api/v[0-9]+.[0-9]+.[0-9]+-docker.[0-9]+' + - 'contrib/haproxy/stream-processing-offload/v[0-9]+.[0-9]+.[0-9]+' + - 'contrib/haproxy/stream-processing-offload/v[0-9]+.[0-9]+.[0-9]+-docker.[0-9]+' + workflow_dispatch: + inputs: + tag_name: + description: 'Docker image tag to use for the package (default to selected branch name)' + required: false + commit_sha: + description: 'Commit SHA to checkout (default to latest commit on selected branch)' + required: false + set_as_latest: + description: 'Set the tag as latest' + required: false + default: false + type: boolean + build_service_extensions: + description: 'Build service-extensions-callout image' + required: false + default: false + type: boolean + build_request_mirror: + description: 'Build request-mirror image' + required: false + default: false + type: boolean + build_haproxy: + description: 'Build haproxy SPOA image' + required: false + default: false + type: boolean + +permissions: + contents: read + packages: write + +jobs: + prepare-tag: + runs-on: ubuntu-latest + outputs: + service_extension_image_tag: ${{ steps.extract.outputs.service_extension_image_tag }} + request_mirroring_image_tag: ${{ steps.extract.outputs.request_mirroring_image_tag }} + haproxy_image_tag: ${{ steps.extract.outputs.haproxy_image_tag }} + steps: + - name: Extract raw/tag inputs + id: extract + env: + RAW_TAG: ${{ github.event.inputs.tag_name || github.ref_name }} + PREFIX_SERVICE_EXTENSION: contrib/envoyproxy/go-control-plane/ + PREFIX_REQUEST_MIRRORING: contrib/k8s.io/gateway-api/ + PREFIX_HAPROXY: contrib/haproxy/stream-processing-offload/ + run: | + echo "service_extension_image_tag=${RAW_TAG#PREFIX_SERVICE_EXTENSION}" >> $GITHUB_OUTPUT + echo "request_mirroring_image_tag=${RAW_TAG#PREFIX_REQUEST_MIRRORING}" >> $GITHUB_OUTPUT + echo "haproxy_image_tag=${RAW_TAG#PREFIX_HAPROXY}" >> $GITHUB_OUTPUT + + build-service-extensions-callout: + needs: prepare-tag + if: > + github.event_name == 'push' && startsWith(github.ref, 'refs/tags/contrib/envoyproxy/go-control-plane') + || github.event.inputs.build_service_extensions == 'true' + uses: ./.github/workflows/docker-build-and-push.yml + with: + image: ghcr.io/datadog/dd-trace-go/service-extensions-callout + dockerfile: ./contrib/envoyproxy/go-control-plane/cmd/serviceextensions/Dockerfile + artifact_prefix: service-extensions + commit_sha: ${{ github.event.inputs.commit_sha || github.sha }} + version: ${{ needs.prepare-tag.outputs.service_extension_image_tag }} + tags: >- + ${{ needs.prepare-tag.outputs.service_extension_image_tag }} + ${{ (github.event.inputs.set_as_latest == 'true' || github.event_name == 'push') && 'latest' || '' }} + + build-request-mirror: + needs: prepare-tag + if: > + github.event_name == 'push' && startsWith(github.ref, 'refs/tags/contrib/k8s.io/gateway-api') + || github.event.inputs.build_request_mirror == 'true' + uses: ./.github/workflows/docker-build-and-push.yml + with: + image: ghcr.io/datadog/dd-trace-go/request-mirror + dockerfile: ./contrib/k8s.io/gateway-api/cmd/request-mirror/Dockerfile + artifact_prefix: request-mirror + commit_sha: ${{ github.event.inputs.commit_sha || github.sha }} + version: ${{ needs.prepare-tag.outputs.request_mirroring_image_tag }} + tags: >- + ${{ needs.prepare-tag.outputs.request_mirroring_image_tag }} + ${{ (github.event.inputs.set_as_latest == 'true' || github.event_name == 'push') && 'latest' || '' }} + + build-haproxy: + needs: prepare-tag + if: > + github.event_name == 'push' && startsWith(github.ref, 'refs/tags/contrib/haproxy/stream-processing-offload') + || github.event.inputs.build_haproxy == 'true' + uses: ./.github/workflows/docker-build-and-push.yml + with: + image: ghcr.io/datadog/dd-trace-go/haproxy-spoa + dockerfile: ./contrib/haproxy/stream-processing-offload/cmd/spoa/Dockerfile + artifact_prefix: haproxy-spoa + commit_sha: ${{ github.event.inputs.commit_sha || github.sha }} + version: ${{ needs.prepare-tag.outputs.haproxy_image_tag }} + tags: >- + ${{ needs.prepare-tag.outputs.haproxy_image_tag }} + ${{ (github.event.inputs.set_as_latest == 'true' || github.event_name == 'push') && 'latest' || '' }} \ No newline at end of file diff --git a/.github/workflows/ecosystems-label-issue.yml b/.github/workflows/ecosystems-label-issue.yml index 29853e45bc..4fd36a68d6 100644 --- a/.github/workflows/ecosystems-label-issue.yml +++ b/.github/workflows/ecosystems-label-issue.yml @@ -13,8 +13,17 @@ jobs: if: contains(github.event.issue.title, 'contrib') runs-on: ubuntu-latest steps: + # Retrieve temporary github token + - name: Get Github token + uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3 + id: octo-sts + with: + policy: self.ecosystems-label-issue + scope: DataDog/dd-trace-go # https://github.com/marketplace/actions/actions-ecosystem-add-labels - name: add label - uses: actions-ecosystem/action-add-labels@v1 + uses: actions-ecosystem/action-add-labels@18f1af5e3544586314bbe15c0273249c770b2daf # v1.1.3 with: labels: apm:ecosystem + env: + GITHUB_TOKEN: ${{ steps.octo-sts.outputs.token }} diff --git a/.github/workflows/ecosystems-label-pr.yml b/.github/workflows/ecosystems-label-pr.yml index 4cadafd3e7..5978af88d3 100644 --- a/.github/workflows/ecosystems-label-pr.yml +++ b/.github/workflows/ecosystems-label-pr.yml @@ -1,21 +1,31 @@ name: Label APM Ecosystems Pull Requests on: pull_request: - paths: - - "contrib/**" types: - opened - reopened - edited + paths: + - "contrib/**" permissions: contents: read pull-requests: write + id-token: write jobs: label_issues: runs-on: ubuntu-latest steps: + # Retrieve temporary github token + - name: Get Github token + uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3 + id: octo-sts + with: + policy: self.ecosystems-label-pr + scope: DataDog/dd-trace-go # https://github.com/marketplace/actions/actions-ecosystem-add-labels - name: add label - uses: actions-ecosystem/action-add-labels@v1 + uses: actions-ecosystem/action-add-labels@18f1af5e3544586314bbe15c0273249c770b2daf # v1.1.3 with: labels: apm:ecosystem + env: + GITHUB_TOKEN: ${{ steps.octo-sts.outputs.token }} diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml new file mode 100644 index 0000000000..75f6004902 --- /dev/null +++ b/.github/workflows/generate.yml @@ -0,0 +1,49 @@ +name: Generate + +on: + push: + branches: + - release-* + - mq-working-branch-** + pull_request: + workflow_call: + inputs: + go-version: + required: true + type: string + ref: + description: 'The branch to run the workflow on' + required: true + type: string + +env: + # Users may build our library with GOTOOLCHAIN=local. If they do, and our + # go.mod file specifies a newer Go version than their local toolchain, their + # build will break. Run our tests with GOTOOLCHAIN=local to ensure that + # our library builds with all of the Go versions we claim to support, + # without having to download a newer one. + GOTOOLCHAIN: local + +permissions: + contents: read + +jobs: + generate: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: ${{ inputs.go-version }} + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Run generator + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/generate.sh + - name: Check for changes + run: git diff --exit-code diff --git a/.github/workflows/govulncheck.yml b/.github/workflows/govulncheck.yml index eaf5ed78d9..a125b56010 100644 --- a/.github/workflows/govulncheck.yml +++ b/.github/workflows/govulncheck.yml @@ -8,8 +8,14 @@ on: type: string push: branches: - - main - release-v* + - mq-working-branch-** + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' schedule: - cron: '00 00 * * *' workflow_dispatch: @@ -21,20 +27,20 @@ jobs: govulncheck-tests: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - - name: Checkout Go - uses: actions/setup-go@v3 + - name: Setup Go and development tools + uses: ./.github/actions/setup-go with: - go-version: 'stable' - - name: Install govulncheck - run: | - go install golang.org/x/vuln/cmd/govulncheck@latest + go-version: stable + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin - name: Run govulncheck - run: govulncheck ./ddtrace/... ./appsec/... ./profiler/... ./internal/... + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + govulncheck ./ddtrace/... ./appsec/... ./profiler/... ./internal/... ./instrumentation/... - name: Run govulncheck-contribs - run: | - go list -f '{{.Dir}}' ./contrib/... | while read dir ; do - govulncheck -C $dir . - done \ No newline at end of file + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + ./.github/workflows/apps/govulncheck-contribs-v2.sh diff --git a/.github/workflows/lambda-integration-tests.yml b/.github/workflows/lambda-integration-tests.yml new file mode 100644 index 0000000000..4cda27108e --- /dev/null +++ b/.github/workflows/lambda-integration-tests.yml @@ -0,0 +1,50 @@ +name: Lambda Integration Tests + +on: + schedule: + - cron: '0 15 * * *' # Daily at 15:00 UTC + workflow_dispatch: # Allow manual triggering + +permissions: + contents: read + +jobs: + lambda-integration-test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - name: Set up Go + uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32 # v5.0.2 + with: + go-version: '1.25' + + - name: Set up Node 22 + uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3 + with: + node-version: 22 + + - name: Cache Node modules + id: cache-node-modules + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 + with: + path: "**/node_modules" + key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} + + - name: Install Serverless Framework + run: sudo yarn global add serverless@^3.38.0 --prefix /usr/local + + - name: Install dependencies + if: steps.cache-node-modules.outputs.cache-hit != 'true' + working-directory: contrib/aws/datadog-lambda-go/test/integration_tests/ + run: yarn install + + - name: Run Lambda integration tests + env: + BUILD_LAYERS: true + DD_API_KEY: ${{ secrets.DD_API_KEY }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + working-directory: contrib/aws/datadog-lambda-go/test/integration_tests/ + run: ./run_integration_tests.sh diff --git a/.github/workflows/main-branch-tests.yml b/.github/workflows/main-branch-tests.yml index 7d738ccd9a..d2af52c746 100644 --- a/.github/workflows/main-branch-tests.yml +++ b/.github/workflows/main-branch-tests.yml @@ -1,18 +1,16 @@ name: Main Branch and Release Tests on: - workflow_call: # allows to reuse this workflow - inputs: - ref: - description: 'The branch to run the workflow on' - required: true - type: string push: branches: - - main - release-v* - tags: - - "**" + - mq-working-branch-** + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' concurrency: group: ${{ github.ref }} @@ -20,24 +18,10 @@ concurrency: jobs: unit-integration-tests: - strategy: - matrix: - go-version: [ "1.22", "1.23" ] - fail-fast: false uses: ./.github/workflows/unit-integration-tests.yml + permissions: + contents: read + id-token: write + pull-requests: write with: - go-version: ${{ matrix.go-version }} - ref: ${{ inputs.ref || github.ref }} - secrets: inherit - multios-unit-tests: - strategy: - matrix: - runs-on: [ macos-latest, windows-latest, ubuntu-latest ] - go-version: [ "1.22", "1.23" ] - fail-fast: false - uses: ./.github/workflows/multios-unit-tests.yml - with: - go-version: ${{ matrix.go-version }} - runs-on: ${{ matrix.runs-on }} - ref: ${{ inputs.ref || github.ref }} - secrets: inherit + go-version: "1.25" # Should be the highest supported version of Go diff --git a/.github/workflows/multios-unit-tests.yml b/.github/workflows/multios-unit-tests.yml index 1cdd9191b6..426ec47cab 100644 --- a/.github/workflows/multios-unit-tests.yml +++ b/.github/workflows/multios-unit-tests.yml @@ -4,13 +4,11 @@ on: workflow_dispatch: # manually inputs: go-version: + description: The Go version to use required: true type: string runs-on: - required: true - type: string - ref: - description: 'The branch to run the workflow on' + description: The OS to run the tests on required: true type: string workflow_call: @@ -21,13 +19,10 @@ on: runs-on: required: true type: string - ref: - description: 'The branch to run the workflow on' - required: true - type: string env: DD_APPSEC_WAF_TIMEOUT: 1m # Increase time WAF time budget to reduce CI flakiness + GOEXPERIMENT: synctest # TODO: remove once go1.25 is the minimum supported version permissions: contents: read @@ -39,34 +34,53 @@ jobs: REPORT: gotestsum-report.xml # path to where test results will be saved DD_APPSEC_WAF_TIMEOUT: 1h steps: + - name: Normalize github.workspace for Windows + if: ${{ runner.os == 'Windows' }} + shell: pwsh + run: | + $normalizedPath = "${{ github.workspace }}" -replace '\\', '/' + "normalized_workspace=$normalizedPath" >> $env:GITHUB_ENV + - name: Normalize github.workspace for non-Windows OSes + if: ${{ runner.os != 'Windows' }} + shell: pwsh + run: | + "normalized_workspace=${{ github.workspace }}" >> $env:GITHUB_ENV + - name: Restore repo cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: .git + key: gitdb-${{ github.repository_id }}-${{ github.sha }} - name: Checkout - uses: actions/checkout@v2 + if: always() + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: - ref: ${{ inputs.ref || github.ref }} - - uses: actions/setup-go@v3 + ref: ${{ github.sha }} + clean: false + - name: Setup Go and development tools + uses: ./.github/actions/setup-go with: go-version: ${{ inputs.go-version }} - check-latest: true - cache: true - - name: Install gotestsum - run: go install gotest.tools/gotestsum@latest + tools-dir: ${{ env.normalized_workspace }}/_tools + tools-bin: ${{ env.normalized_workspace }}/bin - name: Mac OS Coreutils if: inputs.runs-on == 'macos-latest' run: brew install coreutils - - name: "Runner ${{ matrix.runner-index }}: Test Core and Contrib (No Integration Tests)" + - name: "Runner: Test Core and Contrib (No Integration Tests)" shell: bash run: | + export PATH="${{ github.workspace }}/bin:${PATH}" go list ./... | grep -v -e google.golang.org/api -e sarama -e confluent-kafka-go -e cmemprof | sort >packages.txt gotestsum --junitfile ${REPORT} -- $(cat packages.txt) -v -coverprofile=coverage.txt -covermode=atomic -timeout 15m - name: Upload the results to Datadog CI App if: always() + continue-on-error: true uses: ./.github/actions/dd-ci-upload with: dd-api-key: ${{ secrets.DD_CI_API_KEY }} - files: ${{ env.REPORT }} + path: ./ tags: go:${{ inputs.go-version }},arch:${{ runner.arch }},os:${{ runner.os }},distribution:${{ runner.distribution }} - name: Upload Coverage if: always() shell: bash - run: bash <(curl -s https://codecov.io/bash) + run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/needs-triage.yml b/.github/workflows/needs-triage.yml index 6b0f1c0c44..629df74a36 100644 --- a/.github/workflows/needs-triage.yml +++ b/.github/workflows/needs-triage.yml @@ -18,9 +18,13 @@ jobs: runs-on: ubuntu-latest permissions: issues: write - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: + - name: Generate a GitHub token + id: generate-token + uses: actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b # v2.1.1 + with: + app-id: ${{ vars.DD_K9_LIBRARY_GO_APP_ID }} + private-key: ${{ secrets.DD_K9_LIBRARY_GO_APP_PRIVATE_KEY }} - name: Create needs-triage label if needed run: |- gh label create \ @@ -29,6 +33,8 @@ jobs: --color='#0E8A16' \ --description='New issues that have not yet been triaged' \ --force + env: + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} - name: Is author a guild member? id: is-author-guild-member run: |- @@ -42,13 +48,15 @@ jobs: done echo "result=${result}" >> "${GITHUB_OUTPUT}" env: - GITHUB_TOKEN: ${{ secrets.NEEDS_TRIAGE_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} - name: Add needs-triage label if: steps.is-author-guild-member.outputs.result == 'false' run: |- gh issue edit ${{ github.event.issue.number }} \ --repo='${{ github.repository }}' \ --add-label='needs-triage' + env: + GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }} find-old-issues: name: Find issues in need of attention @@ -78,7 +86,7 @@ jobs: cat issues.json >> "${GITHUB_OUTPUT}" echo "EOJSON" >> "${GITHUB_OUTPUT}" env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ github.token }} notify-slack: needs: find-old-issues @@ -94,8 +102,10 @@ jobs: steps: - name: Notify about ${{ matrix.number }} - uses: slackapi/slack-github-action@v1.24.0 + uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a # v2.1.1 with: + webhook: ${{ secrets.NEEDS_TRIAGE_SLACK_WEBHOOK_URL }} + webhook-type: incoming-webhook payload: |- { "issue_number": ${{ toJson(matrix.number) }}, @@ -103,5 +113,3 @@ jobs: "issue_url": ${{ toJson(format('github.com/{0}/issues/{1}', github.repository, matrix.number)) }}, "created_at": ${{ toJson(matrix.createdAt) }} } - env: - SLACK_WEBHOOK_URL: ${{ secrets.NEEDS_TRIAGE_SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/orchestrion.yml b/.github/workflows/orchestrion.yml index 0603c8b139..a5c21d183c 100644 --- a/.github/workflows/orchestrion.yml +++ b/.github/workflows/orchestrion.yml @@ -1,23 +1,322 @@ name: Orchestrion on: - workflow_dispatch: # manually + workflow_call: # From github.com/DataDog/orchestrion + inputs: + orchestrion-version: + description: Orchestrion version to use for integration testing + type: string + required: true + collect-coverage: + description: Whether to collect orchestrion coverage data or not + type: boolean + default: false + required: false + secrets: + DD_API_KEY: + required: false pull_request: - merge_group: push: branches: - release-v* + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' permissions: read-all concurrency: # Automatically cancel previous runs if a new one is triggered to conserve resources. - group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }}${{ inputs.orchestrion-version && format('-{0}', inputs.orchestrion-version) }} cancel-in-progress: true jobs: - test: - name: 'Run Tests' - uses: DataDog/orchestrion/.github/workflows/workflow_call.yml@main # we don't want to pin our own action - with: - dd-trace-go-ref: ${{ github.sha }} - runs-on: ubuntu-latest-16-cores + generate: + name: Verify generated files are up-to-date + # Don't run in workflow_call or workflow_dispatch + if: github.event_name == 'workflow_dispatch' || inputs.orchestrion-version == '' + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: stable + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Run generator + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/generate.sh + - name: Check for changes + run: git diff --exit-code + + go-versions-matrix: + name: Go Versions Matrix + runs-on: ubuntu-latest + outputs: + json: ${{ steps.matrix.outputs.json }} + steps: + - name: Checkout Code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: ${{ inputs.orchestrion-version != '' && 'DataDog/dd-trace-go' || github.repository }} + ref: ${{ inputs.orchestrion-version != '' && 'main' || github.sha }} + - name: Setup Go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: stable + cache: true + cache-dependency-path: '**/go.mod' + - name: Compute Matrix + id: matrix + run: |- + echo -n "json=" >> "${GITHUB_OUTPUT}" + go run ./internal/orchestrion/matrix >> "${GITHUB_OUTPUT}" + + service-containers: + name: Service containers + runs-on: ubuntu-latest + outputs: + services_json: ${{ steps.set-services.outputs.services_json }} + steps: + - name: Checkout Code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: ${{ inputs.orchestrion-version != '' && 'DataDog/dd-trace-go' || github.repository }} + ref: ${{ inputs.orchestrion-version != '' && 'main' || github.sha }} + - name: Define Services JSON + id: set-services + run: | + echo "SERVICES_JSON=$(jq -c . ./internal/orchestrion/_integration/ci-services.json)" >> "${GITHUB_OUTPUT}" + + integration-test: + services: ${{ fromJSON(matrix.runs-on == 'ubuntu' && needs.service-containers.outputs.services_json || '{}') }} + env: + # Path to where test results will be saved + REPORT: orchestrion-gotestsum-report.xml + # Disable go workspace as they complicate everything when orchestrion + # updates its `go` directive in `go.mod` before `dd-trace-go` does; + # ESPECIALLY on Windows. + GOWORK: 'off' + needs: + - go-versions-matrix + - service-containers + strategy: + fail-fast: false + matrix: + runs-on: + - ubuntu + - macos + - windows + go-version: ${{ fromJSON(needs.go-versions-matrix.outputs.json) }} + mode: [DRIVER] + include: + # Alternate build modes (only on ubuntu with oldstable, so we save up CI time) + - runs-on: ubuntu + go-version: oldstable + mode: TOOLEXEC + - runs-on: ubuntu + go-version: oldstable + mode: GOFLAGS + name: Integration Test (${{ matrix.runs-on }} | ${{ matrix.go-version }} | ${{ matrix.mode }}) + runs-on: ${{ matrix.runs-on == 'ubuntu' && fromJson('{"labels":"ubuntu-8-core-latest","group":"Large Runner Shared Public"}') || (matrix.runs-on == 'windows' && fromJson('{"labels":"windows-shared-8core","group":"LARGE WINDOWS SHARED"}')) || format('{0}-latest', matrix.runs-on) }} + steps: + - name: Checkout Code + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + path: ${{ github.workspace }}/dd-trace-go + repository: ${{ inputs.orchestrion-version != '' && 'DataDog/dd-trace-go' || github.repository }} + ref: ${{ inputs.orchestrion-version != '' && 'main' || github.sha }} + # If we're in workflow_dispatch/call, maybe we need to up/downgrade orchestrion + - name: Check out orchestrion + if: inputs.orchestrion-version != '' + id: checkout-orchestrion + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + path: ${{ github.workspace }}/orchestrion + repository: DataDog/orchestrion + ref: ${{ inputs.orchestrion-version }} + + - name: Setup Go + id: setup-go + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 + with: + go-version: ${{ matrix.go-version }} + cache: true + cache-dependency-path: |- + ${{ github.workspace }}/dd-trace-go/internal/orchestrion/_integration/go.mod + ${{ github.workspace }}/orchestrion/all/go.mod + + - name: Install development tools + run: make -C ${{ github.workspace }}/dd-trace-go tools-install + + - name: Set up orchestrion + if: inputs.orchestrion-version != '' + # This does not pass `-go` so that it transparently uses the correct go + # version, which is the highest one between that of dd-trace-go and + # orchestrion. This way each can change their own minimum supported go + # release without requiring coordination with the other. It also adds + # the local checkout of orchestrion to the `go.work` so that its own + # `go` directive is correctly managed. + run: |- + go mod edit -replace="github.com/DataDog/orchestrion=${{ github.workspace }}/orchestrion" + go mod tidy + working-directory: ${{ github.workspace }}/dd-trace-go/internal/orchestrion/_integration + env: + VERSION: ${{ inputs.orchestrion-version }} + # We install the binary to the GOBIN, so it's easy to use + - name: Install orchestrion binary + if: '!inputs.collect-coverage' + run: go install "github.com/DataDog/orchestrion" + working-directory: ${{ github.workspace }}/dd-trace-go/internal/orchestrion/_integration + - name: Build orchestrion binary + if: inputs.collect-coverage + shell: bash + run: |- + bin=$(go env GOPATH)/bin/orchestrion + if [[ '${{ matrix.runs-on }}' == 'windows' ]]; then + bin="${bin}.exe" + fi + mkdir -p "$(dirname "${bin}")" + go build -cover -covermode=atomic -coverpkg="github.com/DataDog/orchestrion/..." "-o=${bin}" "github.com/DataDog/orchestrion" + echo "GOCOVERDIR=$(mktemp -d)" >> "${GITHUB_ENV}" + working-directory: ${{ github.workspace }}/dd-trace-go/internal/orchestrion/_integration + + # Run a `go mod tidy` because GitHub will run this on a candidate merge commit, and if there + # have been dependecy updates on the `main` branch, the `go.mod` and `go.sum` files for the + # integration test suite may no longer be up-to-date. + - name: Run 'go mod tidy' + run: go mod tidy + working-directory: ${{ github.workspace }}/dd-trace-go/internal/orchestrion/_integration + + # Pull docker images ahead of time so the pulls of large images don't have to fit within the + # test timeout. + - name: Pull container images + # Docker is only supported on Linux runners at the moment + if: runner.os == 'Linux' + run: |- + # AWS DynamoDB Local is used to have a pretend AWS API endpoint + docker pull amazon/dynamodb-local:latest + + # PostgreSQL service + docker pull docker.io/postgres:16-alpine + + # Vault service + docker pull vault:1.7.3 + + # Enable VM overcommit memory, which is essential to ensure smooth operations of the Redis + # servers. This VM setting is not namespaced, so changing it on the host also affects all + # containerized workloads (which our Redis service is). + - name: Enable memory overcommit + if: runner.os == 'Linux' + run: sudo sysctl vm.overcommit_memory=1 + + # Finally, we run the test suite! + # To avoid false negatives with failing tests, we do not run our CI Visibility `gotestsum`. Doing so would mark our + # failure tests as real failures in the backend. + - name: Run Tests + shell: bash + run: |- + export PATH="${{ github.workspace }}/dd-trace-go/bin:${PATH}" + echo "PATH: ${PATH}" + echo "Working directory: ${PWD}" + orchestrion version + PACKAGE_NAMES=$(go list ./... | grep -v /civisibility) + + case "${MODE}" in + "DRIVER") + echo "Starting test suite in DRIVER mode" + gotestsum --junitfile ${XML_PATH} --raw-command -- orchestrion go test -json -shuffle=on $PACKAGE_NAMES + orchestrion go test -json -shuffle=on ./civisibility + ;; + "TOOLEXEC") + echo "Starting test suite in TOOLEXEC mode" + gotestsum --junitfile ${XML_PATH} -- -shuffle=on -toolexec='orchestrion toolexec' $PACKAGE_NAMES + go test -shuffle=on -toolexec='orchestrion toolexec' ./civisibility + ;; + "GOFLAGS") + echo "Starting test suite in GOFLAGS mode" + export GOFLAGS="${GOFLAGS} '-toolexec=orchestrion toolexec'" + gotestsum --junitfile ${XML_PATH} -- -shuffle=on $PACKAGE_NAMES + go test -shuffle=on ./civisibility + ;; + *) + echo "Unknown mode: ${MODE}" + ;; + esac + working-directory: ${{ github.workspace }}/dd-trace-go/internal/orchestrion/_integration + env: + MODE: ${{ matrix.mode }} + # The "buildtag" tag is used in //dd:span integration tests + GOFLAGS: -timeout=30m ${{ matrix.runs-on == 'ubuntu' && '-p=4' || '' }} -tags=githubci${{ matrix.mode == 'DRIVER' && ',buildtag' || ''}} + # Prevent auto-respawn, which is problematic with installs from commit SHA + DD_ORCHESTRION_IS_GOMOD_VERSION: true + # Ryuk is problematic with concurrent executions, and unnecessary in ephemeral environments like GHA. + TESTCONTAINERS_RYUK_DISABLED: true + # To enable sharing the reported JUnit XML, we need to save it into the temporary, shared directory by GHA. + XML_PATH: ${{ runner.temp }}${{ matrix.runs-on == 'windows' && '\' || '/' }}${{ env.REPORT }} + + # Check for changes in the supported_configurations.json file + - name: Run Config Inverter Check + if: always() + run: | + git diff internal/env/supported_configurations.json + cd scripts/configinverter && go run main.go -input ../../internal/env/supported_configurations.json check + working-directory: ${{ github.workspace }}/dd-trace-go + + # If in workflow_call, we collected coverage data we need to upload + - name: Consolidate coverage report + if: inputs.collect-coverage + shell: bash + run: |- + mkdir -p "${{ github.workspace }}/orchestrion/coverage" + go tool covdata textfmt -i "${GOCOVERDIR}" -o "${WORKSPACE}/orchestrion/coverage/integration.out" + env: + WORKSPACE: ${{ github.workspace }} + - name: Determine go minor version + if: inputs.collect-coverage + id: go + shell: bash + run: |- + set -euo pipefail + echo "version=$(echo '${{ steps.setup-go.outputs.go-version }}' | cut -d'.' -f1,2)" >> "${GITHUB_OUTPUT}" + - name: Upload coverage report + if: inputs.collect-coverage + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: coverage-integration+${{ matrix.mode }}+go${{ steps.go.outputs.version }}+${{ runner.os }}+${{ runner.arch }} + path: ${{ github.workspace }}/orchestrion/coverage/integration.out + + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + if: always() + with: + ref: ${{ inputs.orchestrion-version != '' && 'main' || github.sha }} + clean: false + - name: Upload the results to Datadog CI App + if: always() + continue-on-error: true + uses: ./.github/actions/dd-ci-upload + with: + dd-api-key: ${{ secrets.DD_CI_API_KEY }} + path: ${{ runner.temp }}${{ matrix.runs-on == 'windows' && '\' || '/' }} + tags: go:${{ steps.setup-go.outputs.go-version }},arch:${{ runner.arch }},os:${{ runner.os }},distribution:${{ runner.distribution }} + # This is a simple join point to make it easy to set up branch protection rules in GitHub. + integration-test-done: + name: Orchestrion Integration Tests + needs: + - generate + - integration-test + runs-on: ubuntu-latest + if: success() || failure() + steps: + - name: Success + if: needs.integration-test.result == 'success' && needs.generate.result == 'success' + run: echo "Success!" + - name: Failure + if: needs.integration-test.result != 'success' || needs.generate.result != 'success' + run: echo "Failure!" && exit 1 diff --git a/.github/workflows/outdated-integrations.yml b/.github/workflows/outdated-integrations.yml new file mode 100644 index 0000000000..e92e2efa3e --- /dev/null +++ b/.github/workflows/outdated-integrations.yml @@ -0,0 +1,42 @@ +name: Outdated Integrations +on: + schedule: + - cron: "0 0 * * 0" # Runs every Sunday at midnight UTC + workflow_dispatch: + +concurrency: + # Automatically cancel previous runs if a new one is triggered to conserve resources. + group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + test: + name: Find new major versions for the contrib package dependencies + runs-on: ubuntu-latest + permissions: + actions: read + contents: write + pull-requests: write + id-token: write + steps: + # Retrieve temporary github token + - name: Get Github token + uses: DataDog/dd-octo-sts-action@acaa02eee7e3bb0839e4272dacb37b8f3b58ba80 # v1.0.3 + id: octo-sts + with: + policy: self.outdated-integrations + scope: DataDog/dd-trace-go + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + + - run: go clean -modcache + + - name: Add dependencies + run: | + go get github.com/go-git/go-billy/v5/memfs + go get github.com/go-git/go-git/v5 + go get github.com/go-git/go-git/v5/plumbing + go get github.com/go-git/go-git/v5/storage/memory + + - run: go run .github/workflows/apps/latest_major_versions.go + env: + GITHUB_TOKEN: ${{ steps.octo-sts.outputs.token }} diff --git a/.github/workflows/parametric-tests.yml b/.github/workflows/parametric-tests.yml index a25c01a2c3..815ccf0c79 100644 --- a/.github/workflows/parametric-tests.yml +++ b/.github/workflows/parametric-tests.yml @@ -3,21 +3,28 @@ name: APM Parametric Tests on: workflow_call: # allows to reuse this workflow inputs: - ref: + branch_ref: description: 'The branch to run the workflow on' required: true type: string push: branches: - - main - release-v* - tags: - - "**" + - mq-working-branch-** + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' pull_request: - branches: - - "**" - merge_group: - workflow_dispatch: {} + workflow_dispatch: + inputs: + ref: + description: 'System Tests ref/tag/branch' + required: true + default: main + type: string schedule: - cron: '00 04 * * 2-6' @@ -33,18 +40,18 @@ jobs: TEST_LIBRARY: golang steps: - name: Checkout system tests - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: repository: 'DataDog/system-tests' ref: ${{ inputs.ref }} - name: Checkout dd-trace-go - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.branch_ref || github.ref }} path: 'binaries/dd-trace-go' - - uses: actions/setup-go@v3 + - uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: "oldstable" diff --git a/.github/workflows/pull-request-title-validation.yml b/.github/workflows/pull-request-title-validation.yml new file mode 100644 index 0000000000..f78166d16b --- /dev/null +++ b/.github/workflows/pull-request-title-validation.yml @@ -0,0 +1,35 @@ +name: Validate PR Title + +on: + workflow_dispatch: # allow to trigger the workflow on main, to add it in suggestion on branch protection rules + pull_request: + types: + - opened + - edited + - reopened + - synchronize + +jobs: + check-title: + runs-on: ubuntu-latest + steps: + - name: Fail if PR title is not a Conventional Commit + if: github.event.pull_request.base.ref == 'main' + run: | + echo "PR Title: ${TITLE}" + + # Regex: type(scope?): subject + # Allowed types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert + REGEX='^(feat|fix|docs|style|refactor|perf|test|build|ci|chore|revert)(\([a-z0-9/_\.-]+\))?: .+' + + if [[ ! "$TITLE" =~ $REGEX ]]; then + echo "::error ::❌ Pull request title does not follow Conventional Commits format." + echo "Expected format: (): " + echo "Allowed types: feat, fix, docs, style, refactor, perf, test, build, ci, chore, revert" + echo "See https://github.com/DataDog/dd-trace-go/blob/main/CONTRIBUTING.md#pull-request-naming for more details." + exit 1 + else + echo "✅ PR title is valid." + fi + env: + TITLE: ${{ github.event.pull_request.title }} diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 9513b2e328..de293e374e 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -2,22 +2,64 @@ name: Pull Request Tests on: pull_request: - branches: - - "**" - merge_group: - push: - branches: - - 'mq-working-branch-**' concurrency: group: ${{ github.ref }} cancel-in-progress: true jobs: + warm-repo-cache: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: .git + key: gitdb-${{ github.repository_id }}-${{ github.sha }} unit-integration-tests: name: PR Unit and Integration Tests + needs: + - warm-repo-cache + strategy: + matrix: + go-version: [ "1.24", "1.25" ] + fail-fast: false uses: ./.github/workflows/unit-integration-tests.yml with: - go-version: "1.22" - ref: ${{ github.ref }} + go-version: ${{ matrix.go-version }} secrets: inherit + multios-unit-tests: + needs: + - warm-repo-cache + strategy: + matrix: + runs-on: [ macos-latest, windows-latest, ubuntu-latest ] + go-version: [ "1.24", "1.25" ] + fail-fast: false + uses: ./.github/workflows/multios-unit-tests.yml + with: + go-version: ${{ matrix.go-version }} + runs-on: ${{ matrix.runs-on }} + secrets: inherit + # This is a simple join point to make it easy to set up branch protection rules in GitHub. + pull-request-tests-done: + name: PR Unit and Integration Tests / ${{ matrix.name }} + strategy: + matrix: + name: [ "test-contrib", "test-core" ] + needs: + - unit-integration-tests + - multios-unit-tests + runs-on: ubuntu-latest + if: success() || failure() + steps: + - name: Success + if: needs.unit-integration-tests.result == 'success' && needs.multios-unit-tests.result == 'success' + run: echo "Success!" + - name: Failure + if: needs.unit-integration-tests.result != 'success' || needs.multios-unit-tests.result != 'success' + run: echo "Failure!" && exit 1 \ No newline at end of file diff --git a/.github/workflows/smoke-tests.yml b/.github/workflows/smoke-tests.yml index cee00b0d34..019484a9b7 100644 --- a/.github/workflows/smoke-tests.yml +++ b/.github/workflows/smoke-tests.yml @@ -8,71 +8,137 @@ on: required: true type: string go-libddwaf-ref: - description: A git ref to update github.com/DataDog/go-libddwaf/v3 to. No-op if empty. + description: A git ref to update github.com/DataDog/go-libddwaf/v4 to. No-op if empty. required: false type: string push: branches: - - main - release-v* - tags: - - '**' + - mq-working-branch-** + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' schedule: # nightly - cron: "0 0 * * *" - workflow_dispatch: {} # manually + workflow_dispatch: { } # manually pull_request: - branches: - - '**' env: TEST_RESULTS: /tmp/test-results # path to where test results will be saved + GOEXPERIMENT: synctest # TODO: remove once go1.25 is the minimum supported version permissions: contents: read jobs: - go-get-u: - # Run go get -u to upgrade dd-trace-go dependencies to their - # latest minor version and see if dd-trace-go still compiles. - # Related to issue https://github.com/DataDog/dd-trace-go/issues/1607 - name: 'go get -u smoke test' + setup-env: runs-on: ubuntu-latest - if: github.repository_owner == 'DataDog' # only run on DataDog's repository, not in forks + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} env: - PACKAGES: ./internal/... ./ddtrace/... ./profiler/... ./appsec/... + PACKAGES: ./internal/... ./ddtrace/... ./profiler/... ./appsec/... ./instrumentation/... steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - # Manually specify the repository, which is necessary in the workflow_call situation, as the default is - # otherwise the repository where the caller workflow started from. In this case, we need to check out the - # repository where the called workflow is (i.e, this repository); but I don't know of a more elegant way to - # obtain its name than hard-coding it. repository: DataDog/dd-trace-go - - uses: actions/setup-go@v3 + + - name: Setup Go and development tools + uses: ./.github/actions/setup-go with: - go-version: "stable" - cache: true + go-version: stable + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: go get -u run: |- + mkdir -p $TEST_RESULTS go get -u -t $PACKAGES + go get github.com/DataDog/datadog-agent/pkg/trace@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/remoteconfig/state@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/proto@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/obfuscate@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/comp/core/tagger/origindetection@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/util/log@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/util/scrubber@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/version@v0.71.0-rc.2 + go get go.opentelemetry.io/collector/pdata@v1.39.0 go mod tidy + for d in `find . -iname go.mod | xargs -n1 dirname`; do pushd $d; go mod tidy; popd; done; + - name: Install requested go-libddwaf version if: github.event_name == 'workflow_call' && inputs.go-libddwaf-ref != '' run: |- - go get -u -t github.com/DataDog/go-libddwaf/v3@${{ inputs.go-libddwaf-ref }} + go get -u -t github.com/DataDog/go-libddwaf/v4@${{ inputs.go-libddwaf-ref }} go mod tidy + - name: Compile dd-trace-go run: go build $PACKAGES - - name: Test dd-trace-go - env: - DD_APPSEC_WAF_TIMEOUT: 1h - run: go test $PACKAGES - - go-mod-tidy: - # Run go mod tidy to ensure that all go.mod and go.sum files are up-to-date. - name: 'go mod tidy smoke test' + + - name: Compute Matrix + id: matrix + run: |- + echo -n "matrix=" >> "${GITHUB_OUTPUT}" + go run ./scripts/ci_contrib_matrix.go >> "${GITHUB_OUTPUT}" + + go-get-u: + # Run go get -u to upgrade dd-trace-go dependencies to their + # latest minor version and see if dd-trace-go still compiles. + # Related to issue https://github.com/DataDog/dd-trace-go/issues/1607 + name: 'go get -u smoke test' + needs: setup-env + strategy: + fail-fast: false + matrix: + chunk: ${{ fromJson(needs.setup-env.outputs.matrix) }} runs-on: ubuntu-latest + if: github.repository_owner == 'DataDog' # only run on DataDog's repository, not in forks + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + # Manually specify the repository, which is necessary in the workflow_call situation, as the default is + # otherwise the repository where the caller workflow started from. In this case, we need to check out the + # repository where the called workflow is (i.e, this repository); but I don't know of a more elegant way to + # obtain its name than hard-coding it. + repository: DataDog/dd-trace-go + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: stable + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Test contribs + # It needs to run before "Test dd-trace-go" to avoid TestTelemetryEnabled tests to fail. + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/ci_test_contrib.sh smoke ${{ toJson(matrix.chunk) }} + + smoke-test-tracer: + name: Test dd-trace-go + runs-on: ubuntu-latest + env: + PACKAGES: ./internal/... ./ddtrace/... ./profiler/... ./appsec/... ./instrumentation/... + steps: + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + repository: DataDog/dd-trace-go + - run: go test $PACKAGES + # Check for changes in the supported_configurations.json file + - name: Supported Configurations Diff Check + if: always() + uses: ./.github/actions/supported_configurations_validation + + check-gen-files: + name: Check generated files and go mod files are up-to-date. + runs-on: ubuntu-latest + if: inputs.go-libddwaf-ref == '' env: # Users may build our library with GOTOOLCHAIN=local. If they do, and our # go.mod file specifies a newer Go version than their local toolchain, their @@ -81,16 +147,20 @@ jobs: # without having to download a newer one. GOTOOLCHAIN: local steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - - uses: actions/setup-go@v3 + - name: Setup Go and development tools + uses: ./.github/actions/setup-go with: - go-version: "1.22" - cache: true - - name: go mod tidy + go-version: "1.24" + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Run generate scripts and check diff run: |- - find -name go.mod -execdir go mod tidy \; + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/generate.sh + ./scripts/fix_modules.sh git diff --exit-code # TODO: macos setup requirements (xcode tools installation, etc.) @@ -109,10 +179,10 @@ jobs: matrix: # TODO: cross-compilation from/to different hardware architectures once # github provides native ARM runners. - go: [ "1.22", "1.23" ] - build-env: [ alpine, bookworm, bullseye ] + go: [ "1.25", "1.24" ] + build-env: [ alpine, trixie, bookworm ] build-with-cgo: [ 0, 1 ] - deployment-env: [ alpine, debian11, debian12, al2, al2023, busybox, scratch ] + deployment-env: [ alpine, debian12, debian13, al2, al2023, busybox, scratchy ] include: # GitHub limits the number of matrix jobs to 256, so we need to reduce # it a bit, and we can reduce redundant tests. @@ -140,10 +210,10 @@ jobs: # environment: the C library isn't located at the same place. - build-env: alpine build-with-cgo: 1 - deployment-env: debian11 + deployment-env: debian12 - build-env: alpine build-with-cgo: 1 - deployment-env: debian12 + deployment-env: debian13 - build-env: alpine build-with-cgo: 1 deployment-env: al2 @@ -155,20 +225,20 @@ jobs: deployment-env: busybox - build-env: alpine build-with-cgo: 1 - deployment-env: scratch + deployment-env: scratchy # 2. Too old glibc on the deployment environment than on the build env - build-env: bookworm deployment-env: al2 - - build-env: bookworm - deployment-env: debian11 + - build-env: trixie + deployment-env: al2 # 3. Build with CGO enabled and deploying to a scratch/busybox docker # image requires copying the dynamic lib dependencies (full example # provided at https://github.com/DataDog/appsec-go-test-app/blob/main/examples/docker/scratch/Dockerfile) - build-with-cgo: 1 - deployment-env: scratch + deployment-env: scratchy steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} # Manually specify the repository, which is necessary in the workflow_call situation, as the default is @@ -176,9 +246,9 @@ jobs: # repository where the called workflow is (i.e, this repository); but I don't know of a more elegant way to # obtain its name than hard-coding it. repository: DataDog/dd-trace-go - - uses: docker/setup-buildx-action@v3 + - uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 - name: Build - uses: docker/build-push-action@v5 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: context: . file: ./internal/setup-smoke-test/Dockerfile @@ -195,3 +265,16 @@ jobs: go_libddwaf_ref=${{ inputs.go-libddwaf-ref }} - name: Test run: docker run -p7777:7777 --rm smoke-test + + smoke-tests-done: + name: Smoke Tests + needs: setup-requirements-linux + runs-on: ubuntu-latest + if: success() || failure() + steps: + - name: Success + if: needs.setup-requirements-linux.result == 'success' + run: echo "Success!" + - name: Failure + if: needs.setup-requirements-linux.result != 'success' + run: echo "Failure!" && exit 1 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 24ffaae4da..36a739b27a 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,7 +12,7 @@ jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v8 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 with: stale-pr-message: 'This PR is stale because it has been open 20 days with no activity. Remove stale label or comment or this will be closed in 10 days.' close-pr-message: 'This PR was closed because it has been open for 30 days with no activity.' diff --git a/.github/workflows/static-checks.yml b/.github/workflows/static-checks.yml new file mode 100644 index 0000000000..9695775b29 --- /dev/null +++ b/.github/workflows/static-checks.yml @@ -0,0 +1,178 @@ +name: Static Checks + +on: + pull_request: + push: + branches: + - release-* + - mq-working-branch-** + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' + workflow_call: + inputs: + go-version: + required: true + type: string + ref: + description: 'The branch to run the workflow on' + required: true + type: string + +env: + # Users may build our library with GOTOOLCHAIN=local. If they do, and our + # go.mod file specifies a newer Go version than their local toolchain, their + # build will break. Run our tests with GOTOOLCHAIN=local to ensure that + # our library builds with all of the Go versions we claim to support, + # without having to download a newer one. + GOTOOLCHAIN: local + GODEBUG: "x509negativeserial=1" + GOEXPERIMENT: synctest # TODO: remove once go1.25 is the minimum supported version + GOLANGCI_LINT_VERSION: v2.3.0 # NOTICE: Make sure this is synced with the version in the _tools/go.mod file. + +permissions: + contents: read + pull-requests: write + checks: write + +jobs: + copyright: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: ${{ inputs.go-version }} + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Copyright + run: | + go run ./scripts/check_copyright.go + + check-modules: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: ${{ inputs.go-version }} + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Run fixmodules + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/fix_modules.sh + - name: Check for changes + run: git diff --exit-code + + check-docs: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: ${{ inputs.go-version }} + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Update documentation + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + make docs + - name: Check for changes + run: git diff --exit-code + + check-format: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: ${{ inputs.go-version }} + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Format + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + make format + - name: Check for changes + run: git diff --exit-code + + lint: + runs-on: + group: "APM Larger Runners" + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + + - name: golangci-lint + uses: reviewdog/action-golangci-lint@f9bba13753278f6a73b27a56a3ffb1bfda90ed71 # v2.8.0 + with: + golangci_lint_flags: "--timeout 10m" # We are hitting timeout when there is no cache + go_version: ${{ inputs.go-version }} + golangci_lint_version: ${{ env.GOLANGCI_LINT_VERSION }} + fail_level: error + reporter: github-pr-review + + - name: golangci-lint (internal/orchestrion/_integration) + uses: reviewdog/action-golangci-lint@f9bba13753278f6a73b27a56a3ffb1bfda90ed71 # v2.8.0 + with: + golangci_lint_flags: "--timeout 10m --disable=gocritic" # We are hitting timeout when there is no cache + go_version: ${{ inputs.go-version }} + golangci_lint_version: ${{ env.GOLANGCI_LINT_VERSION }} + fail_level: error + reporter: github-pr-review + workdir: internal/orchestrion/_integration + + - name: shellcheck + uses: reviewdog/action-shellcheck@4c07458293ac342d477251099501a718ae5ef86e # v1.32.0 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + reporter: github-pr-review + fail_level: error + path: ./scripts + pattern: "**/*.sh" + filter_mode: nofilter + + checklocks: + # We have the infrastructure in place for this check, + # but we still need to add the required annotations for + # checklocks to actually identify issues. Skipping the + # check until we do so. + if: false + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Setup Go and development tools + uses: ./.github/actions/setup-go + with: + go-version: ${{ inputs.go-version }} + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin + - name: Run checklocks + run: |- + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/check_locks.sh diff --git a/.github/workflows/system-tests.yml b/.github/workflows/system-tests.yml index 57dab750f4..cea8286c2e 100644 --- a/.github/workflows/system-tests.yml +++ b/.github/workflows/system-tests.yml @@ -9,33 +9,56 @@ on: type: string push: branches: - - main - release-v* - tags: - - "**" + - mq-working-branch-** + tags-ignore: + - 'contrib/**' + - 'instrumentation/**' + - 'internal/**' + - 'orchestrion/**' + - 'scripts/**' pull_request: - branches: - - "**" - merge_group: workflow_dispatch: - inputs: - ref: - description: 'System Tests ref/tag/branch' - required: true - default: main - type: string + inputs: + ref: + description: 'System Tests ref/tag/branch' + required: true + default: main + type: string schedule: - cron: '00 04 * * 2-6' permissions: contents: read + packages: write jobs: + warm-repo-cache: + runs-on: ubuntu-latest + outputs: + sha: ${{ steps.pin.outputs.sha }} + steps: + - name: Checkout system-tests + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + repository: 'DataDog/system-tests' + ref: ${{ inputs.ref }} + - name: Pin exact commit SHA for system-tests + id: pin + run: | + echo "sha=$(git rev-parse FETCH_HEAD)" >> "$GITHUB_OUTPUT" + - name: Cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: .git + key: gitdb-system-tests-${{ steps.pin.outputs.sha }} system-tests: if: github.event_name != 'pull_request' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'DataDog/dd-trace-go') # Note: Not using large runners because the jobs spawned by this pipeline # don't seem to get a noticable speedup from using larger runners. runs-on: ubuntu-latest + needs: + - warm-repo-cache strategy: matrix: weblog-variant: @@ -51,12 +74,12 @@ jobs: - APPSEC_DISABLED - APPSEC_BLOCKING - APPSEC_BLOCKING_FULL_DENYLIST - - APPSEC_REQUEST_BLOCKING - APPSEC_API_SECURITY - APPSEC_RASP - - APM_TRACING_E2E + - APPSEC_RUNTIME_ACTIVATION - APM_TRACING_E2E_SINGLE_SPAN - APM_TRACING_E2E_OTEL + - TRACING_CONFIG_SCENARIOS include: - weblog-variant: net-http scenario: REMOTE_CONFIG_MOCKED_BACKEND_ASM_FEATURES @@ -75,14 +98,17 @@ jobs: scenario: APPSEC_CORRUPTED_RULES - weblog-variant: net-http scenario: APPSEC_LOW_WAF_TIMEOUT + - weblog-variant: net-http + scenario: APPSEC_STANDALONE + - weblog-variant: net-http + scenario: APPSEC_STANDALONE_V2 + - weblog-variant: net-http + scenario: APPSEC_META_STRUCT_DISABLED - weblog-variant: net-http scenario: APPSEC_CUSTOM_OBFUSCATION + - weblog-variant: net-http + scenario: APPSEC_WAF_TELEMETRY # APM scenarios requiring specific environment settings - - scenario: APM_TRACING_E2E - env: - DD_API_KEY=$SYSTEM_TESTS_E2E_DD_API_KEY - DD_APPLICATION_KEY=$SYSTEM_TESTS_E2E_DD_APP_KEY - DD_SITE="datadoghq.com" - scenario: APM_TRACING_E2E_SINGLE_SPAN env: DD_API_KEY=$SYSTEM_TESTS_E2E_DD_API_KEY @@ -100,7 +126,20 @@ jobs: weblog-variant: graphql-go - scenario: GRAPHQL_APPSEC weblog-variant: gqlgen - + # Telemetry + - weblog-variant: net-http + scenario: TELEMETRY_APP_STARTED_PRODUCTS_DISABLED + - weblog-variant: net-http + scenario: TELEMETRY_LOG_GENERATION_DISABLED + - weblog-variant: net-http + # TELEMETRY_METRIC_GENERATION_ENABLED scenario merged into AGENT_SUPPORTING_SPAN_EVENTS + scenario: AGENT_SUPPORTING_SPAN_EVENTS + - weblog-variant: net-http + scenario: TELEMETRY_METRIC_GENERATION_DISABLED + - weblog-variant: net-http + scenario: APM_TRACING_EFFICIENT_PAYLOAD + - weblog-variant: net-http + scenario: FEATURE_FLAG_EXPOSURE fail-fast: false env: TEST_LIBRARY: golang @@ -108,18 +147,22 @@ jobs: DD_API_KEY: ${{ secrets.DD_API_KEY }} SYSTEM_TESTS_E2E_DD_API_KEY: ${{ secrets.SYSTEM_TESTS_E2E_DD_API_KEY }} SYSTEM_TESTS_E2E_DD_APP_KEY: ${{ secrets.SYSTEM_TESTS_E2E_DD_APP_KEY }} - SYSTEM_TESTS_AWS_ACCESS_KEY_ID: ${{ secrets.SYSTEM_TESTS_IDM_AWS_ACCESS_KEY_ID }} - SYSTEM_TESTS_AWS_SECRET_ACCESS_KEY: ${{ secrets.SYSTEM_TESTS_IDM_AWS_SECRET_ACCESS_KEY }} name: Test (${{ matrix.weblog-variant }}, ${{ matrix.scenario }}) steps: - - name: Checkout system tests - uses: actions/checkout@v3 + - name: Restore repo cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - repository: 'DataDog/system-tests' - ref: ${{ inputs.ref }} + path: .git + key: gitdb-system-tests-${{ needs.warm-repo-cache.outputs.sha }} + + - name: Checkout system tests + shell: bash + run: | + git config safe.directory "$GITHUB_WORKSPACE" + git checkout -f ${{ needs.warm-repo-cache.outputs.sha }} - name: Checkout dd-trace-go - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.branch_ref || github.ref }} path: 'binaries/dd-trace-go' @@ -138,11 +181,143 @@ jobs: - name: Compress artifact if: ${{ always() }} - run: tar -czvf artifact.tar.gz $(ls | grep logs) + run: | + if compgen -G "logs*/" > /dev/null; then + tar -czvf artifact.tar.gz logs*/ + else + echo "No logs*/ found; skipping tar." + fi - name: Upload artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 if: ${{ always() }} with: name: logs_${{ matrix.weblog-variant }}_${{ matrix.scenario }} path: artifact.tar.gz + + # Pushing an image tagged with "dev" only on commit to main, + # otherwise build and use the image from the artifact. + build-service-extensions-callout: + if: github.event_name != 'pull_request' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'DataDog/dd-trace-go') + uses: ./.github/workflows/docker-build-and-push.yml + with: + image: ghcr.io/datadog/dd-trace-go/service-extensions-callout + dockerfile: ./contrib/envoyproxy/go-control-plane/cmd/serviceextensions/Dockerfile + artifact_prefix: service-extensions-image + commit_sha: ${{ github.sha }} + tags: >- + dev + push: ${{ github.ref == 'refs/heads/main' }} + platforms: '["linux/amd64"]' + + # Pushing an image tagged with "dev" only on commit to main, + # otherwise build and use the image from the artifact. + build-haproxy: + if: github.event_name != 'pull_request' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'DataDog/dd-trace-go') + uses: ./.github/workflows/docker-build-and-push.yml + with: + image: ghcr.io/datadog/dd-trace-go/haproxy-spoa + dockerfile: ./contrib/haproxy/stream-processing-offload/cmd/spoa/Dockerfile + artifact_prefix: haproxy-spoa-image + commit_sha: ${{ github.sha }} + tags: >- + dev + push: ${{ github.ref == 'refs/heads/main' }} + platforms: '["linux/amd64"]' + + system-tests-docker-images: + if: github.event_name != 'pull_request' || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == 'DataDog/dd-trace-go') + runs-on: ubuntu-latest + needs: + - build-service-extensions-callout + - build-haproxy + strategy: + fail-fast: false + matrix: + include: + - target: external_processing + scenario: EXTERNAL_PROCESSING + image_name: service-extensions-callout + image_artifact: service-extensions-image-linux-amd64 + system_tests_name: external_processing + - target: external_processing + scenario: EXTERNAL_PROCESSING_BLOCKING + image_name: service-extensions-callout + image_artifact: service-extensions-image-linux-amd64 + system_tests_name: external_processing + - target: haproxy + scenario: STREAM_PROCESSING_OFFLOAD + image_name: haproxy-spoa + image_artifact: haproxy-spoa-image-linux-amd64 + system_tests_name: stream_processing_offload + - target: haproxy + scenario: STREAM_PROCESSING_OFFLOAD_BLOCKING + image_name: haproxy-spoa + image_artifact: haproxy-spoa-image-linux-amd64 + system_tests_name: stream_processing_offload + + name: Test (${{ matrix.system_tests_name }}, ${{ matrix.scenario }}) + steps: + - name: Download ${{ matrix.target }}) artifacts + if: github.ref != 'refs/heads/main' + uses: actions/download-artifact@634f93cb2916e3fdff6788551b99b062d0335ce0 # v5.0.0 + with: + name: ${{ matrix.image_artifact }} + + - name: Load ${{ matrix.target }} image + if: github.ref != 'refs/heads/main' + run: docker load -i ${{ matrix.image_artifact }}.tar + - name: Checkout system tests + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + repository: 'DataDog/system-tests' + ref: ${{ inputs.ref }} + + - name: Set ${{ matrix.image_name }} image name + run: echo "ghcr.io/datadog/dd-trace-go/${{ matrix.image_name }}:dev" > binaries/golang-${{ matrix.image_name }}-image + + - name: Checkout dd-trace-go + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + ref: ${{ inputs.branch_ref || github.ref }} + path: 'binaries/dd-trace-go' + + - name: Build runner + uses: ./.github/actions/install_runner + + - name: Build agent + run: ./build.sh -i agent + + - name: Run + run: ./run.sh ${{ matrix.scenario }} + + - name: Compress artifact + if: ${{ always() }} + run: | + if compgen -G "logs*/" > /dev/null; then + tar -czvf artifact.tar.gz logs*/ + else + echo "No logs*/ found; skipping tar." + fi + + - name: Upload artifact + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + if: ${{ always() }} + with: + name: logs_${{ matrix.system_tests_name }}_${{ matrix.scenario }} + path: artifact.tar.gz + + system-tests-done: + name: System Tests + needs: + - system-tests + - system-tests-docker-images + runs-on: ubuntu-latest + if: success() || failure() + steps: + - name: Success + if: needs.system-tests.result == 'success' && needs.system-tests-docker-images.result == 'success' + run: echo "Success!" + - name: Failure + if: needs.system-tests.result != 'success' || needs.system-tests-docker-images.result != 'success' + run: echo "Failure!" && exit 1 diff --git a/.github/workflows/test-apps.yml b/.github/workflows/test-apps.yml index bff3c60c53..95e484a12e 100644 --- a/.github/workflows/test-apps.yml +++ b/.github/workflows/test-apps.yml @@ -73,16 +73,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''unit-of-work/v1'') && inputs[''env: prod'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_APP_API_KEY'] }} datadog_site: datadoghq.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -99,16 +99,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''unit-of-work/v1'') && inputs[''env: staging'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_AND_DEMO_API_KEY'] }} datadog_site: datad0g.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -125,16 +125,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''unit-of-work/v2'') && inputs[''env: prod'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_APP_API_KEY'] }} datadog_site: datadoghq.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -151,16 +151,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''unit-of-work/v2'') && inputs[''env: staging'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_AND_DEMO_API_KEY'] }} datadog_site: datad0g.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -177,16 +177,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''memory-leak/goroutine'') && inputs[''env: prod'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_APP_API_KEY'] }} datadog_site: datadoghq.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -203,16 +203,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''memory-leak/goroutine'') && inputs[''env: staging'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_AND_DEMO_API_KEY'] }} datadog_site: datad0g.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -229,16 +229,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''memory-leak/heap'') && inputs[''env: prod'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_APP_API_KEY'] }} datadog_site: datadoghq.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -255,16 +255,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''memory-leak/heap'') && inputs[''env: staging'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_AND_DEMO_API_KEY'] }} datadog_site: datad0g.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -281,16 +281,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''memory-leak/goroutine-heap'') && inputs[''env: prod'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_APP_API_KEY'] }} datadog_site: datadoghq.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true @@ -307,16 +307,16 @@ jobs: if: 'contains(fromJSON(inputs[''scenarios'']), ''memory-leak/goroutine-heap'') && inputs[''env: staging'']' steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: ref: ${{ inputs.ref || github.ref }} - name: Start Agent - uses: datadog/agent-github-action@v1.3 + uses: datadog/agent-github-action@8240b406d73cb84cd5085a3919a78f59c258da3a # v1.3.1 with: api_key: ${{ secrets['DD_TEST_AND_DEMO_API_KEY'] }} datadog_site: datad0g.com - name: Setup Go - uses: actions/setup-go@v3 + uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # v5.5.0 with: go-version: stable check-latest: true diff --git a/.github/workflows/unit-integration-tests.yml b/.github/workflows/unit-integration-tests.yml index bc1faec295..3a7e762080 100644 --- a/.github/workflows/unit-integration-tests.yml +++ b/.github/workflows/unit-integration-tests.yml @@ -6,10 +6,6 @@ on: go-version: required: true type: string - ref: - description: 'The branch to run the workflow on' - required: true - type: string env: DD_APPSEC_WAF_TIMEOUT: 1m # Increase time WAF time budget to reduce CI flakiness @@ -19,50 +15,45 @@ env: # our library builds with all of the Go versions we claim to support, # without having to download a newer one. GOTOOLCHAIN: local + GODEBUG: "x509negativeserial=1" + GOEXPERIMENT: synctest # TODO: remove once go1.25 is the minimum supported version + TEST_RESULT_PATH: /tmp/test-results permissions: contents: read jobs: - copyright: + set-up: runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.matrix.outputs.matrix }} steps: - - name: Checkout - uses: actions/checkout@v3 - with: - ref: ${{ inputs.ref || github.ref }} - - name: Setup go - uses: actions/setup-go@v5 + - name: Restore repo cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 with: - go-version: stable - - name: Copyright - run: | - go run checkcopyright.go - - lint: - runs-on: - group: "APM Larger Runners" - steps: + path: .git + key: gitdb-${{ github.repository_id }}-${{ github.sha }} - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: - ref: ${{ inputs.ref || github.ref }} + ref: ${{ github.sha }} + clean: false - - name: golangci-lint - uses: reviewdog/action-golangci-lint@v2 - with: - golangci_lint_flags: "--timeout 10m" # We are hitting timeout when there is no cache - go_version: ${{ inputs.go-version }} - golangci_lint_version: v1.59.1 - fail_on_error: true - reporter: github-pr-review + - name: Compute Matrix + id: matrix + run: |- + echo -n "matrix=" >> "${GITHUB_OUTPUT}" + go run ./scripts/ci_contrib_matrix.go >> "${GITHUB_OUTPUT}" - test-contrib: + test-contrib-matrix: + needs: set-up runs-on: group: "APM Larger Runners" env: - TEST_RESULTS: /tmp/test-results # path to where test results will be saved - INTEGRATION: true + INTEGRATION: true + strategy: + matrix: + chunk: ${{ fromJson(needs.set-up.outputs.matrix) }} services: datadog-agent: image: datadog/agent:latest @@ -103,7 +94,7 @@ jobs: ports: - 9042:9042 mysql: - image: circleci/mysql:5.7 + image: cimg/mysql:8.0 env: MYSQL_ROOT_PASSWORD: admin MYSQL_PASSWORD: test @@ -112,7 +103,7 @@ jobs: ports: - 3306:3306 postgres: - image: circleci/postgres:9.5 + image: cimg/postgres:16.4 env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres @@ -122,8 +113,8 @@ jobs: mssql: image: mcr.microsoft.com/mssql/server:2019-latest env: - SA_PASSWORD: myPassw0rd - ACCEPT_EULA: Y + SA_PASSWORD: myPassw0rd + ACCEPT_EULA: Y ports: - 1433:1433 consul: @@ -134,6 +125,12 @@ jobs: image: redis:3.2 ports: - 6379:6379 + valkey: + image: valkey/valkey:8 + env: + VALKEY_EXTRA_FLAGS: "--port 6380 --requirepass password-for-default" + ports: + - 6380:6380 elasticsearch2: image: elasticsearch:2 env: @@ -167,8 +164,12 @@ jobs: xpack.security.enabled: false ports: - 9204:9200 + mongo3: + image: mongo:3 + ports: + - 27018:27017 mongo: - image: circleci/mongo:latest-ram + image: mongo:8 ports: - 27017:27017 memcached: @@ -195,26 +196,38 @@ jobs: KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER" ports: - 9092:9092 + - 9093:9093 + options: >- + --name "kafka" localstack: image: localstack/localstack:latest ports: - 4566:4566 steps: + - name: Restore repo cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: .git + key: gitdb-${{ github.repository_id }}-${{ github.sha }} - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: - ref: ${{ inputs.ref || github.ref }} + ref: ${{ github.sha }} + clean: false - - name: Setup Go + - name: Setup Go and development tools uses: ./.github/actions/setup-go with: go-version: ${{ inputs.go-version }} - + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin - name: Test Contrib + if: always() + env: + TEST_RESULTS: ${{ env.TEST_RESULT_PATH }} run: | - mkdir -p $TEST_RESULTS - PACKAGE_NAMES=$(go list ./contrib/... | grep -v -e google.golang.org/api) - gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- $PACKAGE_NAMES -v -race -coverprofile=coverage.txt -covermode=atomic + export PATH="${{ github.workspace }}/bin:${PATH}" + ./scripts/ci_test_contrib.sh default ${{ toJson(matrix.chunk) }} - name: Upload the results to Datadog CI App if: always() @@ -222,54 +235,39 @@ jobs: uses: ./.github/actions/dd-ci-upload with: dd-api-key: ${{ secrets.DD_CI_API_KEY }} - files: ${{ env.TEST_RESULTS }}/gotestsum-report*.xml + path: ${{ env.TEST_RESULT_PATH }} tags: go:${{ inputs.go-version }},arch:${{ runner.arch }},os:${{ runner.os }},distribution:${{ runner.distribution }} - name: Upload Coverage if: always() continue-on-error: true shell: bash - run: bash <(curl -s https://codecov.io/bash) + run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }} - - name: Get Datadog APM Test Agent Logs + # Check for changes in the supported_configurations.json file + - name: Supported Configurations Diff Check if: always() - shell: bash - run: docker logs ${{ job.services.testagent.id }} - - - name: Get Datadog APM Test Agent Trace Check Summary Results - if: always() - shell: bash - run: | - RESPONSE=$(curl -s -w "\n%{http_code}" -o response.txt "http://127.0.0.1:9126/test/trace_check/failures?return_all=true") - RESPONSE_CODE=$(echo "$RESPONSE" | awk 'END {print $NF}') - SUMMARY_RESPONSE=$(curl -s -w "\n%{http_code}" -o summary_response.txt "http://127.0.0.1:9126/test/trace_check/summary?return_all=true") - SUMMARY_RESPONSE_CODE=$(echo "$SUMMARY_RESPONSE" | awk 'END {print $NF}') - if [[ $RESPONSE_CODE -eq 200 ]]; then - echo " " - cat response.txt - echo " - All APM Test Agent Check Traces returned successful!" - echo "APM Test Agent Check Traces Summary Results:" - cat summary_response.txt | jq "." - else - echo "APM Test Agent Check Traces failed with response code: $RESPONSE_CODE" - echo "Failures:" - cat response.txt - echo "APM Test Agent Check Traces Summary Results:" - cat summary_response.txt | jq "." - exit 1 - fi + uses: ./.github/actions/supported_configurations_validation - - name: Testing outlier google.golang.org/api - run: | - go get google.golang.org/api@v0.121.0 # version used to generate code - go mod tidy # Go1.16 doesn't update the sum file correctly after the go get, this tidy fixes it - go test -v ./contrib/google.golang.org/api/... + test-contrib: + needs: + - test-contrib-matrix + runs-on: + group: "APM Larger Runners" + if: success() || failure() + continue-on-error: true + steps: + - name: Success + if: needs.test-contrib-matrix.result == 'success' + run: echo "Success!" + - name: Failure + if: needs.test-contrib-matrix.result != 'success' + run: echo "Failure!" && exit 1 test-core: runs-on: group: "APM Larger Runners" env: - TEST_RESULTS: /tmp/test-results # path to where test results will be saved INTEGRATION: true services: datadog-agent: @@ -288,35 +286,110 @@ jobs: - 8125:8125/udp - 8126:8126 steps: + - name: Restore repo cache + uses: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4 + with: + path: .git + key: gitdb-${{ github.repository_id }}-${{ github.sha }} - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + if: always() with: - ref: ${{ inputs.ref || github.ref }} - - - name: Setup Go + ref: ${{ github.sha }} + clean: false + - name: Setup Go and development tools uses: ./.github/actions/setup-go with: go-version: ${{ inputs.go-version }} - + tools-dir: ${{ github.workspace }}/_tools + tools-bin: ${{ github.workspace }}/bin - name: Test Core env: DD_APPSEC_WAF_TIMEOUT: 1h + TEST_RESULTS: ${{ env.TEST_RESULT_PATH }} run: | - mkdir -p $TEST_RESULTS - PACKAGE_NAMES=$(go list ./... | grep -v /contrib/) - gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- $PACKAGE_NAMES -v -race -coverprofile=coverage.txt -covermode=atomic - cd ./internal/exectracetest - gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report-exectrace.xml -- -v -race -coverprofile=coverage.txt -covermode=atomic - + export PATH="${{ github.workspace }}/bin:${PATH}" + ls -al "${{ github.workspace }}/bin" + ./scripts/ci_test_core.sh - name: Upload the results to Datadog CI App if: always() continue-on-error: true uses: ./.github/actions/dd-ci-upload with: dd-api-key: ${{ secrets.DD_CI_API_KEY }} - files: ${{ env.TEST_RESULTS }}/gotestsum-report.xml ${{ env.TEST_RESULTS }}/gotestsum-report-exectrace.xml - tags: go:${{ inputs.go-version }}},arch:${{ runner.arch }},os:${{ runner.os }},distribution:${{ runner.distribution }} + path: ${{ env.TEST_RESULT_PATH }} + tags: go:${{ inputs.go-version }},arch:${{ runner.arch }},os:${{ runner.os }},distribution:${{ runner.distribution }} + - name: Upload Coverage if: always() + continue-on-error: true shell: bash - run: bash <(curl -s https://codecov.io/bash) + run: bash <(curl -s https://codecov.io/bash) -t ${{ secrets.CODECOV_TOKEN }} + + # Check for changes in the supported_configurations.json file + - name: Supported Configurations Diff Check + if: always() + uses: ./.github/actions/supported_configurations_validation + + upload-test-results: + needs: + - test-contrib + - test-core + if: always() # Make sure this always runs, even if test-contrib or test-core fails + runs-on: + group: "APM Larger Runners" + services: + datadog-agent: + image: datadog/agent:latest + env: + DD_HOSTNAME: "github-actions-worker" + DD_APM_ENABLED: true + DD_BIND_HOST: "0.0.0.0" + DD_API_KEY: "invalid_key_but_this_is_fine" + DD_TEST_AGENT_HOST: "localhost" + DD_TEST_AGENT_PORT: 9126 + options: >- + --health-cmd "bash -c ' 30 op/s + - name: normal_operation_cgo-cpu-bound/go-oldstable-only-trace + thresholds: + - agg_http_req_duration_p99 < 125.0 ms + - name: high_load_cgo-cpu-bound/go-oldstable-only-trace + thresholds: + - throughput > 30 op/s + # Go stable + - name: normal_operation_cgo-cpu-bound/go-stable-profile-trace-asm + thresholds: + - agg_http_req_duration_p99 < 125.0 ms + - name: high_load_cgo-cpu-bound/go-stable-profile-trace-asm + thresholds: + - throughput > 30 op/s + - name: normal_operation_cgo-cpu-bound/go-stable-only-trace + thresholds: + - agg_http_req_duration_p99 < 125.0 ms + - name: high_load_cgo-cpu-bound/go-stable-only-trace + thresholds: + - throughput > 30 op/s diff --git a/.gitlab/bp-runner.yml b/.gitlab/bp-runner.yml new file mode 100644 index 0000000000..122e204ca9 --- /dev/null +++ b/.gitlab/bp-runner.yml @@ -0,0 +1,11 @@ +# Setup benchmarks to be run using bp-runner. There are 48 available cores, the first +# 24 of which are reserved for setup. We use the remaining 24 to allocate resources +# to run our benchmarks. + +experiments: + - name: run-benchmarks + steps: + - name: benchmarks + cpus: 23-47 + run: shell + script: export TEST_NAME=$TEST_NAME && /platform/steps/run-benchmarks.sh diff --git a/.gitlab/child_pipeline.yml.tpl b/.gitlab/child_pipeline.yml.tpl new file mode 100644 index 0000000000..da2f597871 --- /dev/null +++ b/.gitlab/child_pipeline.yml.tpl @@ -0,0 +1,18 @@ +--- +include: + - project: '{{ .ProjectPath }}' + ref: '{{ .CommitSHA }}' + file: '.gitlab/benchmarks.yml' + +stages: + - benchmark_matrix + +benchmark_matrix: + extends: .benchmark + stage: benchmark_matrix + parallel: + matrix: + - BENCHMARK_NAME: +{{- range .BenchmarkNames }} + - "{{ . }}" +{{- end }} diff --git a/.gitlab/configuration-central-validation.yml b/.gitlab/configuration-central-validation.yml new file mode 100644 index 0000000000..027abedc09 --- /dev/null +++ b/.gitlab/configuration-central-validation.yml @@ -0,0 +1,43 @@ +# This CI jobs are copied from libdatadog-build one-pipeline.yml gitlab template. +# This URL is available in the dd-gitlab/publish-content-addresable-templates job whenever +# a change is made on the one-pipeline template. +variables: + SCRIPTS_BASE_URL: https://gitlab-templates.ddbuild.io/libdatadog/one-pipeline/ca/b8fc1b7f45e49ddd65623f217f03c38def169aff6f2518380e5b415514e4cb81/scripts/ + +.download-scripts-from-template: &download-scripts-from-template + - mkdir -p scripts + - | + for script_file in "config-inversion-local-validation.sh" "config-inversion-update-supported-range.sh" + do + curl --location --fail --show-error --output "scripts/${script_file}" "${SCRIPTS_BASE_URL}/${script_file}" + if [[ $script_file == *sh ]] + then + chmod +x scripts/$script_file + fi + done + +.validate_supported_configurations_local_file: + allow_failure: false + rules: + - when: on_success + variables: + LOCAL_JSON_PATH: "" + before_script: + - *download-scripts-from-template + script: + - scripts/config-inversion-local-validation.sh "$LOCAL_JSON_PATH" + +.update_central_configurations_version_range: + allow_failure: false + rules: + - if: '$CI_COMMIT_TAG =~ /^v?[0-9]+\.[0-9]+\.[0-9]+$/' + when: on_success + variables: + LOCAL_JSON_PATH: "" + LANGUAGE_NAME: "" + MULTIPLE_RELEASE_LINES: "false" # expect "true" or "false" as a value to determine if a new "branch" identifier is needed to differentiate between multiple release lines + before_script: + - *download-scripts-from-template + - export FP_API_KEY=$(aws ssm get-parameter --region us-east-1 --name ci.$CI_PROJECT_NAME.FP_API_KEY --with-decryption --query "Parameter.Value" --out text) + script: + - scripts/config-inversion-update-supported-range.sh "$LOCAL_JSON_PATH" "$LANGUAGE_NAME" "$MULTIPLE_RELEASE_LINES" diff --git a/.gitlab/docker-images-reliability-env.yml b/.gitlab/docker-images-reliability-env.yml new file mode 100644 index 0000000000..1bc5dd5e22 --- /dev/null +++ b/.gitlab/docker-images-reliability-env.yml @@ -0,0 +1,111 @@ +wait_for_github_workflow: + stage: docker-images-reliability-env + image: registry.ddbuild.io/images/dd-octo-sts-ci-base:2025.06-1 + tags: ["arch:amd64"] + + variables: + GITHUB_WORKFLOW_FILE: "docker-images-release.yml" + POLL_TIMEOUT: "900" # 15 min + POLL_INTERVAL: "60" # 1 min + BYPASS: "false" # to trigger the workflow outside of a release + + id_tokens: + DDOCTOSTS_ID_TOKEN: + aud: dd-octo-sts + + before_script: + - dd-octo-sts version + - dd-octo-sts debug --scope DataDog/dd-trace-go --policy gitlab.github-access.actions-read + - dd-octo-sts token --scope DataDog/dd-trace-go --policy gitlab.github-access.actions-read > token.txt + + rules: + - if: '$CI_COMMIT_TAG =~ /^contrib\/envoyproxy\/go-control-plane\/v[0-9]+\.[0-9]+\.[0-9]+/' + when: on_success + - if: '$CI_COMMIT_TAG =~ /^contrib\/envoyproxy\/go-control-plane\/v[0-9]+\.[0-9]+\.[0-9]+-docker\.[0-9]+/' + when: on_success + - when: manual + allow_failure: true + + script: + - export GITHUB_TOKEN=$(cat token.txt) + - | + set -e + echo "Waiting for GitHub workflow file: $GITHUB_WORKFLOW_FILE to complete on tag $CI_COMMIT_TAG" + + if [ "$BYPASS" = "true" ]; then + echo "Bypassing GitHub workflow check" + exit 0 + fi + + timeout=$POLL_TIMEOUT + interval=$POLL_INTERVAL + elapsed=0 + + while [ $elapsed -lt $timeout ]; do + runs_url="https://api.github.com/repos/DataDog/dd-trace-go/actions/workflows/$GITHUB_WORKFLOW_FILE/runs?head_sha=$CI_COMMIT_SHA&event=pull_request" + payload=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" "$runs_url") + + if [ "$payload" = "null" ]; then + echo "Failed to fetch data, retrying..." + sleep $interval + elapsed=$((elapsed + interval)) + continue + fi + + # newest run -> conclusion + status=$(echo "$payload" | jq -r '.workflow_runs | sort_by(.created_at) | reverse | .[0].conclusion') + echo "GitHub workflow status: $status" + + if [ "$status" = "success" ]; then + echo "Workflow completed successfully!" + break + elif [[ "$status" = "failure" || "$status" = "cancelled" ]]; then + echo "Workflow failed or cancelled. Aborting." + exit 1 + fi + + sleep $interval + elapsed=$((elapsed + interval)) + done + + if [ $elapsed -ge $timeout ]; then + echo "Timeout waiting for workflow. Exiting." + exit 1 + fi + + after_script: + # Revoke the token after usage + - dd-octo-sts revoke -t $(cat token.txt) + +prepare_release_tag: + stage: docker-images-reliability-env + image: $BASE_CI_IMAGE + tags: ["arch:amd64"] + + needs: + - wait_for_github_workflow + + script: + - | + echo "ENVOY_RELEASE_TAG=${CI_COMMIT_TAG#contrib/envoyproxy/go-control-plane/}" > release_tag.env + + artifacts: + reports: + dotenv: release_tag.env + +deploy_new_release_service_extensions: + stage: docker-images-reliability-env + + needs: + - prepare_release_tag + + trigger: + project: DataDog/apm-reliability/datadog-reliability-env + branch: master + variables: + UPSTREAM_SUB_PROJECT_NAME: "envoy" + UPSTREAM_PIPELINE_ID: $CI_PIPELINE_ID + UPSTREAM_BRANCH: $CI_COMMIT_REF_NAME + UPSTREAM_COMMIT_SHA: $CI_COMMIT_SHA + ENVOY_EXT_PROC_RELEASED: "true" + ENVOY_RELEASE_TAG: $ENVOY_RELEASE_TAG diff --git a/.gitlab/generate_config.go b/.gitlab/generate_config.go new file mode 100644 index 0000000000..c2b9072767 --- /dev/null +++ b/.gitlab/generate_config.go @@ -0,0 +1,61 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Use the `child_pipeline.yml.tpl` file to create the parallel matrix with which our +// benchmarks on new PRs will be run. + +package main + +import ( + "log" + "os" + "strings" + "text/template" +) + +// Config holds the data to be injected into the template. +type Config struct { + ProjectPath string + CommitSHA string + BenchmarkNames []string +} + +func main() { + // Set up environment variables provided by our GitLab CI runners. + // BENCHMARK_TARGETS is defined in .gitlab-ci.yml + projectPath := os.Getenv("CI_PROJECT_PATH") + commitSHA := os.Getenv("CI_COMMIT_SHA") + benchmarkTargets := os.Getenv("BENCHMARK_TARGETS") + + if projectPath == "" || commitSHA == "" || benchmarkTargets == "" { + log.Fatal("Required environment variables CI_PROJECT_PATH, CI_COMMIT_SHA, or BENCHMARK_TARGETS are not set.") + } + + // BENCHMARK_TARGETS is defined as a string of benchmark names separated by a "|" + // In order to run our benchmarks in parallel, we want to have our benchmarks as a string list + config := Config{ + ProjectPath: projectPath, + CommitSHA: commitSHA, + BenchmarkNames: strings.Split(benchmarkTargets, "|"), + } + + tmpl, err := template.ParseFiles("child_pipeline.yml.tpl") + if err != nil { + log.Fatalf("Error parsing template: %s", err.Error()) + } + + outputFile, err := os.Create("generated_benchmark_matrix.yml") + if err != nil { + log.Fatalf("Error creating output file: %s", err.Error()) + } + defer outputFile.Close() + + err = tmpl.Execute(outputFile, config) + if err != nil { + log.Fatalf("Error executing template: %s", err.Error()) + } + + log.Println("Successfully generated benchmarking matrix template.") +} diff --git a/.gitlab/macrobenchmarks.yml b/.gitlab/macrobenchmarks.yml index 542bfb0c93..bbe283c0cd 100644 --- a/.gitlab/macrobenchmarks.yml +++ b/.gitlab/macrobenchmarks.yml @@ -1,7 +1,7 @@ variables: - BENCHMARKS_CI_IMAGE: 486234852809.dkr.ecr.us-east-1.amazonaws.com/ci/benchmarking-platform:go-go-prof-app + BENCHMARKS_CI_IMAGE: 486234852809.dkr.ecr.us-east-1.amazonaws.com/ci/benchmarking-platform:go-go-prof-app-and-serviceextensions-0001 -.benchmarks: +.benchmarks-default: stage: macrobenchmarks needs: [] tags: ["runner:apm-k8s-same-cpu"] @@ -9,6 +9,8 @@ variables: rules: - if: $CI_COMMIT_REF_NAME == "main" when: always + - if: $CI_COMMIT_BRANCH =~ /^release-v[0-9]+.*$/ + when: always - when: manual # If you have a problem with Gitlab cache, see Troubleshooting section in Benchmarking Platform docs image: $BENCHMARKS_CI_IMAGE @@ -22,10 +24,9 @@ variables: - platform/artifacts/ expire_in: 3 months variables: - FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY: "true" # Important tweak for stability of benchmarks - KUBERNETES_SERVICE_ACCOUNT_OVERWRITE: dd-trace-go DD_INSTRUMENTATION_TELEMETRY_ENABLED: "true" DD_INSTRUMENTATION_TELEMETRY_DEBUG: "true" + GOEXPERIMENT: "synctest" # TODO: remove once go1.25 is the minimum supported version # Used to build the SUT GO_PROF_APP_BUILD_VARIANT: "candidate" DD_TRACE_GO_VERSION: "latest" @@ -56,21 +57,21 @@ variables: # 2. Rebuild image in Gitlab CI (build-images CI job in https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines?page=1&scope=all&ref=go%2Fgo-prof-app) # -.go121-benchmarks: - extends: .benchmarks +.go-stable-benchmarks: + extends: .benchmarks-default variables: - GO_VERSION: "1.21.12" + GO_VERSION: "1.25.0" -.go122-benchmarks: - extends: .benchmarks +.go-oldstable-benchmarks: + extends: .benchmarks-default variables: - GO_VERSION: "1.22.5" + GO_VERSION: "1.24.6" # # Specific macrobenchmark configurations are below -go122-baseline: - extends: .go122-benchmarks +go-oldstable-baseline: + extends: .go-oldstable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "false" @@ -78,17 +79,27 @@ go122-baseline: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go122-only-trace: - extends: .go122-benchmarks +go-oldstable-only-trace: + extends: .go-oldstable-benchmarks + variables: + ENABLE_DDPROF: "false" + ENABLE_TRACING: "true" + ENABLE_PROFILING: "false" + ENABLE_APPSEC: "false" + DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" + +go-oldstable-only-trace-with-runtime-metrics: + extends: .go-oldstable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" ENABLE_PROFILING: "false" ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" + DD_RUNTIME_METRICS_ENABLED: "true" -go122-only-profile: - extends: .go122-benchmarks +go-oldstable-only-profile: + extends: .go-oldstable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "false" @@ -96,8 +107,8 @@ go122-only-profile: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go122-profile-trace: - extends: .go122-benchmarks +go-oldstable-profile-trace: + extends: .go-oldstable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" @@ -105,8 +116,8 @@ go122-profile-trace: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go122-trace-asm: - extends: .go122-benchmarks +go-oldstable-trace-asm: + extends: .go-oldstable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" @@ -114,8 +125,8 @@ go122-trace-asm: ENABLE_APPSEC: "true" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go122-profile-trace-asm: - extends: .go122-benchmarks +go-oldstable-profile-trace-asm: + extends: .go-oldstable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" @@ -123,8 +134,8 @@ go122-profile-trace-asm: ENABLE_APPSEC: "true" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go121-baseline: - extends: .go121-benchmarks +go-stable-baseline: + extends: .go-stable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "false" @@ -132,8 +143,8 @@ go121-baseline: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go121-only-trace: - extends: .go121-benchmarks +go-stable-only-trace: + extends: .go-stable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" @@ -141,8 +152,18 @@ go121-only-trace: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go121-only-profile: - extends: .go121-benchmarks +go-stable-only-trace-with-runtime-metrics: + extends: .go-stable-benchmarks + variables: + ENABLE_DDPROF: "false" + ENABLE_TRACING: "true" + ENABLE_PROFILING: "false" + ENABLE_APPSEC: "false" + DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" + DD_RUNTIME_METRICS_ENABLED: "true" + +go-stable-only-profile: + extends: .go-stable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "false" @@ -150,8 +171,8 @@ go121-only-profile: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go121-profile-trace: - extends: .go121-benchmarks +go-stable-profile-trace: + extends: .go-stable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" @@ -159,8 +180,8 @@ go121-profile-trace: ENABLE_APPSEC: "false" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go121-trace-asm: - extends: .go121-benchmarks +go-stable-trace-asm: + extends: .go-stable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" @@ -168,11 +189,156 @@ go121-trace-asm: ENABLE_APPSEC: "true" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" -go121-profile-trace-asm: - extends: .go121-benchmarks +go-stable-profile-trace-asm: + extends: .go-stable-benchmarks variables: ENABLE_DDPROF: "false" ENABLE_TRACING: "true" ENABLE_PROFILING: "true" ENABLE_APPSEC: "true" DD_PROFILING_EXECUTION_TRACE_ENABLED: "false" + +# This repository is using PR-level performance quality gates. +# Verify that the check-slo-breaches CI job has passed. If any regression happened, merging this PR will be blocked. +# If bypassing is necessary, see https://datadoghq.atlassian.net/wiki/spaces/APMINT/pages/5158175217/Performance+quality+gates+-+User+Guide for more details. +check-slo-breaches: + extends: .check-slo-breaches + stage: gates + needs: [ + "go-oldstable-baseline", + "go-oldstable-only-trace", + "go-oldstable-only-trace-with-runtime-metrics", + "go-oldstable-only-profile", + "go-oldstable-profile-trace", + "go-oldstable-trace-asm", + "go-oldstable-profile-trace-asm", + "go-stable-baseline", + "go-stable-only-trace", + "go-stable-only-trace-with-runtime-metrics", + "go-stable-only-profile", + "go-stable-profile-trace", + "go-stable-trace-asm", + "go-stable-profile-trace-asm", + ] + when: on_success + variables: + DDOCTOSTS_POLICY: "gitlab.github-access.slo-change-tracking.contents-read" + ARTIFACTS_DIR: "platform/artifacts" + SLO_FILE: ".gitlab/bp-runner.fail-on-breach.yml" + artifacts: + name: "artifacts" + when: always + paths: + - platform/artifacts/ + expire_in: 3 months + +include: + - project: 'DataDog/benchmarking-platform-tools' + file: 'images/templates/gitlab/check-slo-breaches.template.yml' + - project: 'DataDog/benchmarking-platform-tools' + file: 'images/templates/gitlab/notify-slo-breaches.template.yml' + +notify-slo-breaches: + extends: .notify-slo-breaches + stage: gates + needs: ["check-slo-breaches"] + when: on_failure + variables: + CHANNEL: "guild-dd-trace-go-notifications" + +# +# Macro benchmarks for Service Extensions +# (using Envoy External Processing) +# + +.benchmarks-serviceextensions: + stage: macrobenchmarks + needs: [] + tags: ["runner:apm-k8s-same-cpu"] + timeout: 1h + rules: + - if: $CI_COMMIT_REF_NAME == "main" + when: always + - when: manual + # If you have a problem with Gitlab cache, see Troubleshooting section in Benchmarking Platform docs + image: $BENCHMARKS_CI_IMAGE + script: + - git clone --branch go/go-prof-app https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ddbuild.io/DataDog/benchmarking-platform platform && cd platform + - bp-runner bp-runner.envoy_serviceextension.yml --debug + artifacts: + name: "artifacts" + when: always + paths: + - platform/artifacts-se/ + expire_in: 3 months + variables: + GO_VERSION: "1.25.0" # It needs to be at the latest stable release + ARTIFACTS_DIR: "./artifacts-se" + SERVICE_EXTENSION: "true" + + # Workaround: Currently we're not running the benchmarks on every PR, but GitHub still shows them as pending. + # By marking the benchmarks as allow_failure, this should go away. (This workaround should be removed once the + # benchmarks get changed to run on every PR) + allow_failure: true + + retry: + max: 2 + when: + - unknown_failure + - data_integrity_failure + - runner_system_failure + - scheduler_failure + - api_failure + +# Scenario with external processor, webserver without tracer +se-ext_proc-appsec: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: true + ENABLE_APPSEC: true + TRACER: false + +se-ext_proc-body-appsec: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: true + EXT_PROC_BODY: true + ENABLE_APPSEC: true + TRACER: false + +se-ext_proc-only-tracing: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: true + ENABLE_APPSEC: false + TRACER: false + +se-ext_proc-body-only-tracing: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: true + EXT_PROC_BODY: true + ENABLE_APPSEC: false + TRACER: false + +# Scenarios without external processor, webserver with tracer +se-tracer-no-ext_proc-appsec: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: false + ENABLE_APPSEC: true + TRACER: true + +se-tracer-no-ext_proc-only-tracing: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: false + ENABLE_APPSEC: false + TRACER: true + +# Scenario without tracer, only direct connection through envoy to the webserver +se-no-tracer-no-ext_proc: + extends: .benchmarks-serviceextensions + variables: + EXT_PROC: false + TRACER: false diff --git a/.golangci.yml b/.golangci.yml index 6fcd0cd10e..33b54b2f4a 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,9 +1,117 @@ +version: "2" run: - deadline: 10m - + build-tags: + - goexperiment.synctest +issues: + max-same-issues: 0 + max-issues-per-linter: 0 linters: - disable-all: true + default: none + enable: + - bodyclose + - depguard + - gocritic + - forbidigo + - govet + - revive + # - errorlint # TODO: Enable this once we've fixed all the errorlint issues. + # - loggercheck # TODO: Enable this once we've migrated to structured logging. + # - perfsprint # TODO: Enable this once we've fixed all the perfsprint issues. + # - unused # TODO: Enable this once we've fixed all the unused issues. + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + - std-error-handling + paths: + - third_party$ + - builtin$ + - examples$ + rules: + - path: "internal/(env|log)/" + linters: + - forbidigo + - path: "_test\\.go$" + linters: + - forbidigo + settings: + forbidigo: + forbid: + - pattern: "^os\\.Getenv$" + msg: "use internal/env.Get instead of os.Getenv" + - pattern: "^os\\.LookupEnv$" + msg: "use internal/env.Lookup instead of os.LookupEnv" + exclude_godoc_examples: true + analyze_types: true + govet: + enable-all: true + disable: + - fieldalignment + - shadow # TODO: Enable this once we've fixed all the shadowing issues. + depguard: + rules: + main: + list-mode: lax + files: + - $all + - "!**/scripts/**" + - "!**/tools/**" + - "!**/*_test.go" + - "!**/example_test.go" + - "!**/internal/log/log.go" + - "!**/internal/orchestrion/**" + - "!**/instrumentation/testutils/sql/sql.go" + deny: + - pkg: "log" + desc: "Use github.com/DataDog/dd-trace-go/v2/internal/log instead of standard log package" + allow: + - "log/slog" + gocritic: + disable-all: true + enabled-checks: + - dynamicFmtString + - ruleguard + settings: + ruleguard: + failOn: dsl,import + rules: "rules/*_rules.go" + # TODO: Enable this when we migrated to structed logging. + loggercheck: + require-string-key: true + # no-printf-like: true + rules: + - github.com/DataDog/dd-trace-go/v2/internal/telemetry/log.Debug + - github.com/DataDog/dd-trace-go/v2/internal/telemetry/log.Warn + - github.com/DataDog/dd-trace-go/v2/internal/telemetry/log.Error + - github.com/DataDog/dd-trace-go/v2/internal/telemetry/log.Info + - github.com/DataDog/dd-trace-go/v2/internal/log.Debug + - github.com/DataDog/dd-trace-go/v2/internal/log.Warn + - github.com/DataDog/dd-trace-go/v2/internal/log.Error + - github.com/DataDog/dd-trace-go/v2/internal/log.Info + - (github.com/DataDog/dd-trace-go/v2/instrumentation.Logger).Debug + - (github.com/DataDog/dd-trace-go/v2/instrumentation.Logger).Info + - (github.com/DataDog/dd-trace-go/v2/instrumentation.Logger).Warn + - (github.com/DataDog/dd-trace-go/v2/instrumentation.Logger).Error + revive: + rules: + - name: var-naming + severity: warning + disabled: false + exclude: [""] + arguments: + - [""] # AllowList + - [""] # DenyList + # NOTICE: Allowlisting "utils" package name, doesn't work. Needs investigation. + - - skip-package-name-checks: true # Extra parameter + +formatters: enable: - - gofmt - - revive - - bodyclose + - gofmt + exclusions: + generated: lax + paths: + - third_party$ + - builtin$ + - examples$ diff --git a/.orchestrion-version b/.orchestrion-version new file mode 100644 index 0000000000..b7c0a9b1d9 --- /dev/null +++ b/.orchestrion-version @@ -0,0 +1 @@ +v1.6.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..421865ecab --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,21 @@ +# See https://pre-commit.com for more information +# See https://pre-commit.com/hooks.html for more hooks +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: check-added-large-files + - id: end-of-file-fixer + - id: check-json + - repo: https://github.com/golangci/golangci-lint/ + rev: v2.3.0 # NOTICE: Make sure this is synced with the version in the _tools/go.mod file. + hooks: + - id: golangci-lint + args: + - --timeout=1h + - id: golangci-lint-config-verify + - repo: https://github.com/python-jsonschema/check-jsonschema/ + rev: 0.27.0 + hooks: + - id: check-github-workflows diff --git a/CODEOWNERS b/CODEOWNERS index 6bba60c12b..17a09c247a 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -2,14 +2,6 @@ # default owner * @DataDog/dd-trace-go-guild - -# no owner: changes to these files will not automatically ping any particular -# team and can be reviewed by anybody with the appropriate permissions. This is -# meant to avoid pinging all of @DataDog/dd-trace-go-guild for every PR that -# changes one of these files. -go.mod -go.sum - # tracing /contrib @DataDog/apm-go @Datadog/apm-idm-go /ddtrace @DataDog/apm-go @@ -21,16 +13,70 @@ go.sum # appsec /appsec @DataDog/asm-go /internal/appsec @DataDog/asm-go +/instrumentation/appsec @DataDog/asm-go /contrib/**/*appsec*.go @DataDog/asm-go /.github/workflows/appsec.yml @DataDog/asm-go +/contrib/envoyproxy @DataDog/asm-go +/contrib/haproxy @DataDog/asm-go +/contrib/k8s.io/gateway-api @DataDog/asm-go + +# capabilities - config, dynamic config, remote config +/internal/env @DataDog/apm-sdk-capabilities-go +/internal/stableconfig @DataDog/apm-sdk-capabilities-go +/internal/globalconfig @DataDog/apm-sdk-capabilities-go +/internal/remoteconfig @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/dynamic_config.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/remote_config.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/otel_dd_mappings.go @DataDog/apm-sdk-capabilities-go +# capabilities - telemetry +/internal/telemetry @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/telemetry.go @DataDog/apm-sdk-capabilities-go +# capabilities - sampling +/ddtrace/tracer/tracer.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/sampler.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/rules_sampler.go @DataDog/apm-sdk-capabilities-go +/internal/samplernames @DataDog/apm-sdk-capabilities-go +# capabilities - context, propagation, injection/extraction +/ddtrace/baggage @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/textmap.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/spancontext.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/context.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/propagator.go @DataDog/apm-sdk-capabilities-go +/ddtrace/tracer/propagating_tags.go @DataDog/apm-sdk-capabilities-go +# capabilities- OTel integration +/ddtrace/opentelemetry @DataDog/apm-sdk-capabilities-go # datastreams /datastreams @Datadog/data-streams-monitoring /internal/datastreams @Datadog/data-streams-monitoring # civisibility +/civisibility @DataDog/ci-app-libraries /internal/civisibility @DataDog/ci-app-libraries +# llm observability +/llmobs @DataDog/ml-observability +/internal/llmobs @DataDog/ml-observability + # Gitlab configuration -.gitlab-ci.yml @DataDog/dd-trace-go-guild @DataDog/apm-core-reliability-and-performance -/.gitlab-ci @DataDog/dd-trace-go-guild @DataDog/apm-core-reliability-and-performance +.gitlab-ci.yml @DataDog/dd-trace-go-guild @DataDog/apm-ecosystems-reliability +/.gitlab-ci @DataDog/dd-trace-go-guild @DataDog/apm-ecosystems-reliability + +# Orchestrion +/internal/orchestrion @DataDog/apm-orchestrion +/**/orchestrion.yml @DataDog/apm-orchestrion + +# Serverless +/contrib/aws/datadog-lambda-go @DataDog/apm-serverless @DataDog/serverless-aws + +# Feature Flagging Experiments +/openfeature @DataDog/feature-flagging-and-experimentation-sdk @DataDog/asm-go + +# no owner: changes to these files will not automatically ping any particular +# team and can be reviewed by anybody with the appropriate permissions. This is +# meant to avoid pinging all of @DataDog/dd-trace-go-guild for every PR that +# changes one of these files. +**/go.mod +**/go.sum +go.work +go.work.sum diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7ffe81be80..ff25c72f1b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -### Contributing +# Contributing Thanks for your interest in contributing! This is an open source project, so we appreciate community contributions. @@ -6,7 +6,8 @@ Pull requests for bug fixes are welcome, but before submitting new features or c and discuss your ideas or propose the changes you wish to make. After a resolution is reached a PR can be submitted for review. PRs created before a decision has been reached may be closed. For commit messages, try to use the same conventions as most Go projects, for example: -``` + +```text contrib/database/sql: use method context on QueryContext and ExecContext QueryContext and ExecContext were using the wrong context to create @@ -15,56 +16,399 @@ Prepare context, which was wrong. Fixes #113 ``` -Please apply the same logic for Pull Requests and Issues: start with the package name, followed by a colon and a description of the change, just like -the official [Go language](https://github.com/golang/go/pulls). -All new code is expected to be covered by tests. +## Pull Request Naming + +Pull requests should follow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/) naming format with the following structure: + +```text +(scope): +``` + +Where: + +- **type**: The type of change (feat, fix, docs, style, refactor, test, chore) +- **scope**: The package or area affected (e.g., contrib/database/sql, ddtrace/tracer) +- **description**: A brief description of the change -#### PR Checks +Examples: -We expect all PR checks to pass before we merge a PR, which can be investigated by following the `Details` links to CircleCI and CodeCov for unit/integration tests and code coverage checks. +- `feat(contrib/http): add support for custom headers` +- `fix(ddtrace/tracer): resolve memory leak in span processor` -![Screen Shot 2021-08-31 at 10 35 37 AM](https://user-images.githubusercontent.com/1819836/131533266-7c87305d-37df-4bd5-a9ea-6fb8e51e4b50.png) -The code coverage report has a target of 90%. This is the goal, but is not a hard requirement. Reviewers ultimately make the decision about code coverage and quality and will merge PR's at their discretion. Any divergence from the expected 90% should be communicated by the reviewers to the PR author. +All new code is expected to be covered by tests. + +## Continuous Integration on Pull Requests + +We expect all PR checks to pass before we merge a PR. + +The code coverage report has a target of 90%. This is the goal, but is not a hard requirement. Reviewers ultimately make the decision about code coverage and quality and will merge PRs at their discretion. Any divergence from the expected 90% should be communicated by the reviewers to the PR author. Please feel free to comment on a PR if there is any difficulty or confusion about any of the checks. -#### What to expect +### CI Workflows + +Our CI pipeline includes several automated checks: + +#### Static Checks Workflow + +- **Copyright Check**: Verifies all files have proper copyright headers +- **Generate Check**: Ensures generated code is up-to-date +- **Module Check**: Validates Go module consistency using `./scripts/fix_modules.sh` +- **Lint Check**: Runs comprehensive linting using `golangci-lint` +- **Lock Analysis**: Runs `checklocks` to detect potential deadlocks and race conditions + +#### Unit and Integration Tests + +- **Core Tests**: Tests the main library functionality +- **Integration Tests**: Tests against real services using Docker +- **Contrib Tests**: Tests all third-party integrations +- **Race Detection**: Tests with Go race detector enabled + +#### Generate Workflow + +- **Code Generation**: Ensures all generated code is current and consistent + +### CI Troubleshooting + +Sometimes a pull request's checks will show failures that aren't related to its changes. When this happens, you can try the following steps: + +1. Look through the GitHub Action logs for an obvious cause +2. Retry the test a few times to see if it flakes +3. For internal contributors, ask the #dd-trace-go channel for help +4. If you are not an internal contributor, [open an issue](https://github.com/DataDog/dd-trace-go/issues/new/choose) or ping @Datadog/apm-go + +### Running CI Checks Locally + +Before submitting a PR, you can run the same checks locally using make targets: + +```shell +# Show all available targets +make help + +# Run all linters (same as CI) +make lint + +# Format code (recommended before committing) +make format + +# Check module consistency +make fix-modules + +# Run all tests +make test + +# Run integration tests +make test-integration +``` + +You can also run scripts directly for more control: + +```shell +# Run specific linting options +./scripts/lint.sh --all + +# Format specific file types +./scripts/format.sh --go +./scripts/format.sh --shell + +# Run specific test configurations +./scripts/test.sh --contrib +./scripts/test.sh --appsec +``` + +## Getting a PR Reviewed We try to review new PRs within a week of them being opened. If more than two weeks have passed with no reply, please feel free to comment on the PR to bubble it up. If a PR sits open for more than a month awaiting work or replies by the author, the PR may be closed due to staleness. If you would like to work on it again in the future, feel free to open a new PR and someone will review. -### Style guidelines +## Development Scripts + +We provide several utility scripts in the `scripts/` directory to help with common development tasks: + +### Code Quality Scripts + +#### `./scripts/lint.sh` + +Runs all linters on the codebase to ensure code quality and consistency. + +```shell +# Run all linters (default behavior) +./scripts/lint.sh + +# Install linting tools only +./scripts/lint.sh --tools + +# Run all linters and install tools +./scripts/lint.sh --all +``` + +The script runs: + +- `goimports` for import formatting +- `golangci-lint` for comprehensive Go linting +- `checklocks` for lock analysis (with error tolerance) + +#### `./scripts/format.sh` + +Formats Go and shell files in the repository. + +```shell +# Format Go files only (default behavior) +./scripts/format.sh + +# Format Go files and install tools +./scripts/format.sh --go + +# Format shell files and install tools +./scripts/format.sh --shell + +# Format both Go and shell files and install tools +./scripts/format.sh --all + +# Install formatting tools only +./scripts/format.sh --tools +``` + +#### `./scripts/check_locks.sh` + +Analyzes lock usage patterns to detect potential deadlocks and race conditions. + +```shell +# Run checklocks on the default target (./ddtrace/tracer) +./scripts/check_locks.sh + +# Run checklocks on a specific directory +./scripts/check_locks.sh ./path/to/target + +# Run checklocks and ignore errors +./scripts/check_locks.sh --ignore-errors +``` + +### Module Management Scripts + +#### `./scripts/fix_modules.sh` + +Maintains Go module consistency across the repository by running `go mod tidy` on all modules and adding missing replace directives for local imports. + +```shell +./scripts/fix_modules.sh +``` + +This script: + +- Runs the `fixmodules` tool to add missing replace directives +- Executes `go mod tidy` on all Go modules in the repository +- Updates the `go.work.sum` file + +### Testing Scripts + +#### `./scripts/test.sh` + +Enhanced testing script with improved output formatting and additional options. + +```shell +# Run core tests only +./scripts/test.sh + +# Run integration tests +./scripts/test.sh --integration + +# Run contrib tests +./scripts/test.sh --contrib + +# Run all tests +./scripts/test.sh --all + +# Run with AppSec enabled +./scripts/test.sh --appsec + +# Install test tools +./scripts/test.sh --tools + +# Run specific test with race detection +./scripts/test.sh --race + +# Run with custom sleep time for service startup +./scripts/test.sh --sleep 30 +``` + +The script provides: + +- Timestamped output for better debugging +- Early failure detection with clear error messages +- Automatic Docker service management for integration tests +- Support for Apple Silicon (M1/M2) Macs + +## Style Guidelines A set of [Style guidelines](https://github.com/DataDog/dd-trace-go/wiki/Style-guidelines) was added to our Wiki. Please spend some time browsing it. It will help tremendously in avoiding comments and speeding up the PR process. -To run golangci-lint locally: +### Local Development +For local development, use make targets as the primary interface: + +```shell +# Instead of running golangci-lint directly +make lint + +# Instead of running formatters manually +make format + +# Instead of running go mod tidy manually +make fix-modules + +# Install all development tools +make tools-install ``` -docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.52.2 golangci-lint run -v + +For more specific control, you can use scripts directly: + +```shell +# Run specific linting configurations +./scripts/lint.sh --tools + +# Format only specific file types +./scripts/format.sh --go + +# Run specific test types +./scripts/test.sh --contrib ``` +### Docker Alternative + +If you prefer using Docker for linting: + +```shell +docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:v1.63.3 golangci-lint run -v --timeout 5m +``` + +## Code quality + +### Favor string concatenation and string builders over fmt.Sprintf and its variants + +[fmt.Sprintf](https://pkg.go.dev/fmt#Sprintf) can introduce unnecessary overhead when building a string. Favor [string builders](https://pkg.go.dev/strings#Builder), or simple string concatenation, `a + "b" + c` over `fmt.Sprintf` when possible, especially in hot paths. +Sample PR: + ### Integrations -Please view our contrib [README.md](contrib/README.md) for information on new integrations. If you need support for a new integration, please file an issue to discuss before opening a PR. +Please view our contrib [README.md](contrib/README.md) for information on integrations. If you need support for a new integration, please file an issue to discuss before opening a PR. + +### Working with environment variables + +When working with environment variables, direct use of `os.Getenv` and `os.LookupEnv` is not permitted. Instead, all environment variables must be validated against an [allowed list](./internal/env/supported_configurations.gen.go) using `env.Get` and `env.Lookup` from the [`internal/env`](./internal/env.go) package (or [`instrumentation/env`](./instrumentation/env/env.go) when working on contrib packages). This validation system helps us automatically detect newly introduced variables and ensures they are properly documented and tracked. + +Once a new environment variable is added to the codebase, Datadog maintainers will also add it to Datadog's internal configuration registry for tracking and documentation purposes. + +Upon each tracer release, new configuration keys are automatically tagged by our [CI pipeline](./.gitlab/config-validation.yml) to track when they were introduced. + +#### Adding new environment variables using configinverter + +The `configinverter` tool provides a command to add new environment variable keys to the `supported_configurations.json` file and regenerate the corresponding Go code. + +```sh +go run ./scripts/configinverter/main.go add DD_MY_NEW_KEY +``` + +After adding it to the codebase the key also needs to be added to the [registry](https://feature-parity.us1.prod.dog/#/configurations?viewType=configurations) by an **internal contributor**. +If the key already exists in the registry because another language already registred it this step can be skipped. +Not adding the key to the registry will fail the CI step in charge of checking the local file against the registry. + +#### Auto-detection via tests + +All environment variables should be read at least once by a test. When this happens, a helper automatically detects the usage and adds the variable to the [JSON configuration file](./internal/env/supported_configurations.json). Since the variable isn't yet present in the generated code, it won't read any actual environment values initially, but it will be recorded for code generation. + +Note that CI jobs will fail if new keys are detected but not properly generated into the code. -### Go Modules +You can check for keys that have been added to the JSON file but not yet generated into code: + +```sh +go run ./scripts/configinverter/main.go check +``` + +After the first test run that detects your new environment variable, regenerate the code: + +```sh +go run ./scripts/configinverter/main.go generate +``` + +After adding it to the codebase the key also needs to be added to the [registry](https://feature-parity.us1.prod.dog/#/configurations?viewType=configurations) by an **internal contributor**. +If the key already exists in the registry because another language already registred it this step can be skipped. +Not adding the key to the registry will fail the CI step in charge of checking the local file against the registry. + +#### Handling related CI failures + +The GitLab `validate_supported_configurations_local_file` job validates the JSON file content against Datadog's [configuration registry](https://feature-parity.us1.prod.dog/#/configurations?viewType=configurations) to ensure every configuration key is properly registered and documented. If keys are missing from the registry, the job will fail and display the list of missing keys in the output. These keys must be added to the internal registry by Datadog maintainers for the check to pass, the key will need to be documented before merging the PR onto main. + +Additionally, multiple CI jobs include a [step](./.github/actions/supported_configurations_validation/action.yml) that checks for newly discovered environment variables during test execution and will fail if keys are missing from the generated list. To resolve this failure, use one of the two methods described above to add the key to the generated list. + +### Adding Go Modules When adding a new dependency, especially for `contrib/` packages, prefer the minimum secure versions of any modules rather than the latest versions. This is to avoid forcing upgrades on downstream users for modules such as `google.golang.org/grpc` which often introduce breaking changes within minor versions. This repository used to omit many dependencies from the `go.mod` file due to concerns around version compatibility [(ref)](https://github.com/DataDog/dd-trace-go/issues/810). As such, you may have configured git to ignore changes to `go.mod` and `go.sum`. To undo this, run -``` +```shell git update-index --no-assume-unchanged go.* ``` +### Upgrading Go Modules + +Please also see the section about "Adding Go modules" when it comes to selecting the minimum secure versions of a module rather than the latest versions. + +Then start by updating the main `go.mod` file, e.g. by running a `go get` command in the root of the repository like this: + +``` +go get @ +``` + +Then run the following command to update all `go.mod` and `go.sum` files in the repository: + +``` +make fix-modules +``` + +This is neccessary because dd-trace-go is a multi-module repository. + ### Benchmarks Some benchmarks will run on any new PR commits, the results will be commented into the PR on completion. #### Adding a new benchmark + To add additional benchmarks that should run for every PR, go to `.gitlab-ci.yml`. -Add the name of your benchmark to the `BENCHMARK_TARGETS` variable using pipe character separators. +Add the name of your benchmark to the `BENCHMARK_TARGETS` variable using pipe character separators. + +### Goroutine Leaks + +Some core packages are using [uber-go/goleak](https://github.com/uber-go/goleak) to detect goroutine leaks. + +To isolate the leak to a single test, you can use the bash script from the goleak README. + +If you are experiencing a leak failure in CI that doesn't seem to reproduce locally, try running a local datadog agent. Some test failures only appear when http connections to the agent are created and become idle after the test completes. + +Last but not least, you might find a goroutine leak with an unhelpful stack trace: + +``` +Goroutine 92554 in state IO wait, with internal/poll.runtime_pollWait on top of the stack: +internal/poll.runtime_pollWait(0x7f46dcd5b368, 0x72) + /opt/hostedtoolcache/go/1.23.11/x64/src/runtime/netpoll.go:351 +0x85 +... +net/http.(*persistConn).readLoop(0xc0041c8b40) + /opt/hostedtoolcache/go/1.23.11/x64/src/net/http/transport.go:2205 +0x354 +created by net/http.(*Transport).dialConn in goroutine 92609 + /opt/hostedtoolcache/go/1.23.11/x64/src/net/http/transport.go:1874 +0x29b4 +``` + +In this case, consider editing the stdlib code (e.g. `http/transport.go:1874`) to print a stack trace at the location where the goroutine is being created: + +```go +fmt.Printf("Leak start at stack=%s\n", string(debug.Stack())) +``` + +In practice, leaks often go through `http.(*Client).Do`, so that can be a good place to instrument as well. + +Following the advice above, most goroutine leaks should be easy to debug and fix. diff --git a/FAQ.md b/FAQ.md index 6c1cfbc90a..2fb6020f6e 100644 --- a/FAQ.md +++ b/FAQ.md @@ -4,7 +4,7 @@ This document contains answers to questions frequently asked by users. Just beca #### Why do client integration spans not use the global service name? Integrations that are considered *clients* (http clients, grpc clients, sql clients) do **not** use the globally-configured service name. This is by design and is a product-level decision that spans across all the languages' tracers. This is likely to segregate the time spent actually doing the work of the service from the time waiting for another service (i.e. waiting on a web server to return a response). -While there are good arguments to be made that client integrations should take the same service name as everything else in the service, that's not how the library is intended to function today. As a work-around, most integrations have a `WithServiceName` `Option` that will allow you to override the default. If the integration you are using cannot be configured the way you want, please open an issue to discuss adding as option. +While there are good arguments to be made that client integrations should take the same service name as everything else in the service, that's not how the library is intended to function today. As a work-around, most integrations have a `WithService` `Option` that will allow you to override the default. If the integration you are using cannot be configured the way you want, please open an issue to discuss adding as option. See also: https://github.com/DataDog/dd-trace-go/pull/603 diff --git a/MIGRATING.md b/MIGRATING.md index 84f5bf4926..faf2082aa0 100644 --- a/MIGRATING.md +++ b/MIGRATING.md @@ -1,104 +1,280 @@ -# Migration Guide +# Migration guide -This document outlines migrating from an older version of the Datadog tracer (0.6.x) to v1. +This document outlines migrating from an older version of the Datadog tracer (v1.x.x) to v2. -Datadog's v1 version of the Go tracer provides not only an overhauled core that comes with huge performance improvements, but also the promise of a new and stable API to be relied on. It is the result of continuous feedback from customers, the community, as well as our extensive internal usage. +Datadog's v2 version of the Go tracer provides a significant refactor of our API, moving away from interfaces to provide flexibility in future works, isolating our integrations to prevent false-positives from security scanners, and enforcing proper library patterns to prevent misuse. This update is the result of continuous feedback from customers, the community, as well as our extensive internal usage, introducing better maintainability, simplified APIs, and unlocking performance benefits. -As is common and recommended in the Go community, the best way to approach migrating to this new API is by using the [gradual code repair](https://talks.golang.org/2016/refactor.article) method. We have done the same internally and it has worked just great! For this exact reason we have provided a new, [semver](https://semver.org/) friendly import path to help with using both tracers in parallel, without conflict, for the duration of the migration. This new path is `gopkg.in/DataDog/dd-trace-go.v1`. +As is common and recommended in the Go community, the best way to approach migrating to this new API is by using the [gradual code repair](https://talks.golang.org/2016/refactor.article) method. We have done the same internally and it has worked just great! For this exact reason we have provided a new, [semver](https://semver.org/) friendly import path to help with using both tracers in parallel, without conflict, for the duration of the migration. This new path is `github.com/DataDog/dd-trace-go/v2`. -Our [godoc page](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace) should deem helpful during this process. We also have the [official documentation](https://docs.datadoghq.com/tracing/setup/go/), which contains a couple of examples. +We have also provided a new migration tool `v2fix` to help with the most essential changes made in v2, which you can read about [here](./tools/v2fix/README.md). -This document will further outline some _before_ and _after_ examples. +Our [godoc page](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/ddtrace) should be helpful during this process. We also have the [official documentation](https://docs.datadoghq.com/tracing/setup/go/), which contains a couple of examples. -## Starting the tracer +Please follow this guide for migrating from v1 to v2 and creating new services using v2 directly. This document will further outline some _before_ and _after_ examples. -The new tracer needs to be started before it can be used. A default started tracer is no longer available. The default tracer is now a no-op. +## Importing -Here is an example of starting a custom tracer with a non-default agent endpoint using the old API: +In v2, we have moved away from using gopkg.in in our import URLs in favor of github.com. To import the tracer library, you would have before: ```go -t := tracer.NewTracerTransport(tracer.NewTransport("localhost", "8199")) -t.SetDebugLogging(true) -defer t.ForceFlush() +import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" ``` -This would now become: +Becomes: ```go -tracer.Start( - tracer.WithAgentAddr("localhost:8199"), - tracer.WithDebugMode(true), -) -defer tracer.Stop() +import "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ``` -Notice that the tracer object is no longer returned. Consult the documentation to see [all possible parameters](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#StartOption) to the `Start` call. +It is important to run `go mod tidy` after changing any import. + +It is also important to note that when using our contrib libraries, import URLs may be impacted differently. This will be covered in the section below [Independent contrib packages](#independent-contrib-packages). + +### Gradual code repair + +For customers that have large codebases and that are unable to immediately upgrade services to the v2 tracer, we are offering a special transitional version of the v1 tracer, the [v1 transitional version](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1@v1.74.0) which is essentially a wrapper that preserves the API from v1 but uses v2 under the hood. + +It’s safe for different services within your organization to use different tracer versions during the transition, some can use v1 while others adopt v2. Staggering the upgrade per service can minimize downtime and help ensure stability throughout your transition. + +The transitional version is the only v1 version that allows both v1 and v2 to be imported in the same service, which enables you to migrate a service gradually. Using this v1 transitional version doesn’t require any code changes, but it also won’t support any new features introduced in v2. + +When using the v1 transitional version, it is possible to gradually migrate a codebase to v2 by replacing imports and adapting the instrumentation to the new API file by file. + +### Independent contrib packages + +This version upgrade comes with a large overhaul of what was previously one single package that held all of our integrations. In v2, we introduce independent packages for each of our contribs, which will prevent false-positives in security scanners that were caused by indirect dependencies. As a result, importing contribs will also change. Before: + +```go +import "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" +``` +Becomes: -## Service Information +```go +import "github.com/DataDog/dd-trace-go/contrib/net/http/v2" +``` -The [`tracer.SetServiceInfo`](https://godoc.org/github.com/DataDog/dd-trace-go/tracer#Tracer.SetServiceInfo) method has been deprecated. The service information is now set automatically based on the value of the [`ext.SpanType`](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext#SpanType) tag that was set on the root span of a trace. +If you are unsure of which import URL to use, please refer to our [godoc](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/contrib), which will include example code for each contrib. ## Spans -Starting spans is now possible with [functional options](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#StartSpanOption). Which means that all span properties (or none) can be set when starting a span dynamically. Before: +`Span` and `SpanContext` are now represented as a struct rather than an interface, which means that references to these types must use a pointer. They have also been moved to live within the `tracer` package, so they must be accessed using `tracer.Span` rather than `ddtrace.Span`. Before: + +```go +var sp ddtrace.Span = tracer.StartSpan("opname") +var ctx ddtrace.SpanContext = sp.Context() +``` + +Becomes: + +```go +var sp *tracer.Span = tracer.StartSpan("opname") +var ctx *tracer.SpanContext = sp.Context() +``` + +### Deprecated `ddtrace` interfaces + +All the interfaces in `ddtrace` have been removed in favor of struct types, except for `SpanContext`. The new types have moved into `ddtrace/tracer`. + +### Deprecated constants and options + +The following constants and functions have been removed: + +* `ddtrace/ext.AppTypeWeb` +* `ddtrace/ext.CassandraQuery` +* `ddtrace/ext.CassandraBatch` +* `ddtrace/tracer.WithPrioritySampling`; priority sampling is enabled by default. +* `ddtrace/tracer.WithHTTPRoundTripper`; use `WithHTTPClient` instead. + +### StartChild + +Child spans can be started with StartChild rather than ChildOf. Before: + +```go +import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + +func main() { + tracer.Start() + defer tracer.Stop() + + parent := tracer.StartSpan("op").Context() + child := tracer.StartSpan("op", tracer.ChildOf(parent)) +} +``` + +Becomes: + +```go +import "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + +func main() { + tracer.Start() + defer tracer.Stop() + + parent := tracer.StartSpan("op") + child := parent.StartChild("op") +} +``` + +## Trace IDs + +Rather than a `uint64`, trace IDs are now represented as a `string`. This change will allow support for 128-bit trace IDs. Old behavior may still be accessed by using the new `TraceIDLower()` method, though switching to 128-bit IDs is recommended. Before: ```go -span := tracer.NewRootSpan("web.request", "my_service", "resource_name") +sp := tracer.StartSpan("opname") +fmt.Printf("traceID: %d\n", sp.Context().TraceID()) ``` Becomes: ```go -span := tracer.StartSpan("web.request", tracer.ServiceName("my_service"), tracer.ResourceName("resource_name")) +sp := tracer.StartSpan("opname") +fmt.Printf("traceID: %s\n", sp.Context().TraceID()) //recommended for using 128-bit IDs +fmt.Printf("traceID: %d\n", sp.Context().TraceIDLower()) // for maintaining old behavior with 64-bit IDs ``` -We've done this because in many cases the extra parameters could become tedious, given that service names can be inherited and resource names can default to the operation name. This also allows us to have one single, more dynamic API for starting both root and child spans. Check out all possible [StartSpanOption](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#StartSpanOption) values to get an idea. +## Span Links API + +`Span.AddSpanLink` has been renamed to `Span.AddLink`. -### Children +## WithService + +The previously deprecated `tracer.WithServiceName` has been fully removed and replaced with the method `tracer.WithService`. If you would like to specify a service name upon starting the tracer, you would have before: -Here is an example for spawning a child of the previously declared span: ```go -child := tracer.StartSpan("process.user", tracer.ChildOf(span.Context())) +tracer.Start(tracer.WithServiceName("service")) ``` -You will notice that the new tracer also introduces the concept of [SpanContext](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace#SpanContext), which is different from Go's context and is used to carry information needed to spawn children of a specific span and can be propagated cross-process. To learn more about distributed tracing check the package-level [documentation](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#ChildOf) of the `tracer` package. -### Using Go's context +After: -It is also possible to create children of spans that live inside Go's [context](https://golang.org/pkg/context/): ```go -child, ctx := tracer.StartSpanFromContext(ctx, "process.user", tracer.Tag("key", "value")) +tracer.Start(tracer.WithService("service")) ``` -This will create a child of the span which exists inside the passed context and return it, along with a new context which contains the new span. To add or retrieve a span from a context use the [`ContextWithSpan`](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#ContextWithSpan) or [`SpanFromContext`](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#SpanFromContext) functions. -### Setting errors +## WithDogstatsdAddr -The [`SetError`](https://godoc.org/github.com/DataDog/dd-trace-go/tracer#Span.SetError) has been deprecated in favour of the [`ext.Error`](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext#Error) tag value which matches other tracing libraries in the wild. Whereas before we had: +`tracer.WithDogstatsdAddress` has been renamed as `tracer.WithDogstatsdAddr`. If you would like to specify a different DogStatsD address upon starting the tracer, you would have before: ```go -span.SetError(err) +tracer.Start(tracer.WithDogstatsdAddress("10.1.0.12:4002")) ``` -Now we have: +After: ```go -span.SetTag(ext.Error, err) +tracer.Start(tracer.WithDogstatsdAddr("10.1.0.12:4002")) ``` -Note that this tag can accept value of the types `error`, `string` and `bool` as well for setting errors. +## WithAgentURL + +`tracer.WithAgentURL` sets the address by URL where the agent is located, in addition to the existing `WithAgentAddr` option. It is useful for setups where the agent is listening to a Unix Domain Socket: + +```go +tracer.Start(tracer.WithAgentURL("unix:///var/run/datadog/apm.socket")) +``` + +## NewStartSpanConfig, WithStartSpanConfig, NewFinishConfig & WithFinishConfig + +These functional options for `ddtrace/tracer.Tracer.StartSpan` and `ddtrace/tracer.Span.Finish` reduces the number of calls (in functional option form) in hot loops by giving the freedom to prepare a common span configuration in hot paths. + +Before: -### Finishing +```go +var err error +span := tracer.StartSpan( + "operation", + ChildOf(parent.Context()), + Measured(), + ResourceName("resource"), + ServiceName(service), + SpanType(ext.SpanTypeWeb), + Tag("key", "value"), +) +defer span.Finish(tracer.NoDebugStack()) +``` -The [`FinishWithErr`](https://godoc.org/github.com/DataDog/dd-trace-go/tracer#Span.FinishWithErr) and [`FinishWithTime`](https://godoc.org/github.com/DataDog/dd-trace-go/tracer#Span.FinishWithTime) methods have been removed in favour of a set of [`FinishOption`](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer#FinishOption). For example, this would now become: +After: ```go -span.Finish(tracer.WithError(err), tracer.FinishTime(t)) +cfg := tracer.NewStartSpanConfig( + tracer.Measured(), + tracer.ResourceName("resource"), + tracer.ServiceName(service), + tracer.SpanType(ext.SpanTypeWeb), + tracer.Tag("key", "value"), +) +finishCfg := tracer.NewFinishConfig( + NoDebugStack(), +) +// [...] +// Reuse the configuration in your hot path: +span := parent.StartChild("operation", tracer.WithStartSpanConfig(cfg)) +defer span.Finish(tracer.WithFinishConfig(finishCfg)) ``` -Providing a `nil` value as an error is perfectly fine and will not mark the span as erroneous. +## Sampling API simplified + +The following functions have been removed in favour of `SpanSamplingRules` and `TraceSamplingRules`: + +* `NameRule` +* `NameServiceRule` +* `RateRule` +* `ServiceRule` +* `SpanNameServiceMPSRule` +* `SpanNameServiceRule` +* `SpanTagsResourceRule` +* `TagsResourceRule` + +Also, `ext.SamplingPriority` tag is deprecated. Use `ext.ManualKeep` and `ext.ManualDrop` instead. + +## Contrib API + +A support package to create contribs without depending on internal packages is available in `instrumentation`. Please refer to [`instrumentation` godoc page](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/instrumentation) and existing contribs for more detail. + +## Updated User Monitoring SDK for `appsec` -## Further reading +`appsec` package offers a new API for user monitoring; essentially deprecating login success & failure event functions, replacing them with versions that accept a `login` field, which is to be used by user monitoring rules (ATO monitoring & protection). Before: + +```go +appsec.TrackUserLoginSuccessEvent(...) +appsec.TrackUserLoginFailureEvent(...) +``` + +Becomes: + +```go +appsec.TrackUserLoginSuccess(...) +appsec.TrackUserLoginFailure(...) +``` + +## API Security sampling + +The API Security sampler now takes decisions specific to a given endpoint (method + route + response status code) instead of using a simplistic sampling rate. This allows for improved coverage and accuracy of schema extraction as part of API Security. + +## Opentracing deprecation + +`opentracer` is in "Maintenance" mode and limited support was offered in `v1`. We recommend to use OpenTelemetry or ddtrace/tracer directly. For additional details, please see our [Support Policy](https://github.com/DataDog/dd-trace-go?tab=readme-ov-file#go-support-policy). + +## SQLCommentInjectionMode deprecation for DBM + +`SQLCommentInjectionMode` values have been replaced by `DBMPropagationMode` values. Before: + +```go +SQLInjectionUndefined // SQLInjectionUndefined represents the comment injection mode is not set. This is the same as SQLInjectionDisabled. +SQLInjectionDisabled // SQLInjectionDisabled represents the comment injection mode where all injection is disabled. +SQLInjectionModeService // SQLInjectionModeService represents the comment injection mode where only service tags (name, env, version) are injected. +SQLInjectionModeFull // SQLInjectionModeFull represents the comment injection mode where both service tags and tracing tags. Tracing tags include span id, trace id and sampling priority. +``` + +After: + +```go +DBMPropagationModeUndefined // DBMPropagationModeUndefined represents the dbm propagation mode not being set. This is the same as DBMPropagationModeDisabled. +DBMPropagationModeDisabled // DBMPropagationModeDisabled represents the dbm propagation mode where all propagation is disabled. +DBMPropagationModeService // DBMPropagationModeService represents the dbm propagation mode where only service tags (name, env, version) are propagated to dbm. +DBMPropagationModeFull // DBMPropagationModeFull represents the dbm propagation mode where both service tags and tracing tags are propagated. Tracing tags include span id, trace id and the sampled flag. +``` -The new version of the tracer also comes with a lot of new features, such as support for distributed tracing and distributed sampling priority. +## Further reading -* package level documentation of the [`tracer` package](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer) for a better overview. +* package level documentation of the [`tracer` package](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/ddtrace/tracer) for a better overview. * [official documentation](https://docs.datadoghq.com/tracing/setup/go/) diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..c217f263ea --- /dev/null +++ b/Makefile @@ -0,0 +1,94 @@ +BIN := $(shell pwd)/bin +TOOLS := $(shell pwd)/_tools +BIN_PATH := PATH="$(abspath $(BIN)):$$PATH" + +.PHONY: help +help: ## Show this help message + @echo 'Usage: make [target]' + @echo '' + @echo 'Targets:' + @awk 'BEGIN {FS = ":.*?## "} /^[A-Za-z0-9_./-]+:.*?## / {printf " %-20s %s\n", $$1, $$2}' $(MAKEFILE_LIST) + +.PHONY: all +all: tools-install generate lint test ## Run complete build pipeline (tools, generate, lint, test) + +.PHONY: tools-install +tools-install: ## Install development tools + @./scripts/install_tools.sh --tools-dir $(TOOLS) --bin-dir $(BIN) + +.PHONY: clean +clean: ## Clean build artifacts + rm -rvf coverprofile.txt *.out *.test vendor core_coverage.txt gotestsum-* + +.PHONY: clean-all +clean-all: clean ## Clean everything including tools and temporary files + rm -rvf $(BIN) tmp + +.PHONY: generate +generate: tools-install ## Run code generation + $(BIN_PATH) ./scripts/generate.sh + +.PHONY: lint +lint: tools-install ## Run linting checks + $(BIN_PATH) ./scripts/lint.sh --all + +.PHONY: lint/go +lint/go: tools-install ## Run Go linting checks + $(BIN_PATH) ./scripts/lint.sh --go + +.PHONY: lint/go/fix +lint/go/fix: tools-install ## Fix linting issues automatically + $(BIN_PATH) golangci-lint run --fix ./... + +.PHONY: lint/shell +lint/shell: tools-install ## Run shell script linting checks + $(BIN_PATH) ./scripts/lint.sh --shell + +.PHONY: format +format: tools-install ## Format code + $(BIN_PATH) ./scripts/format.sh --all + +.PHONY: format/shell +format/shell: tools-install ## install shfmt + $(BIN_PATH) ./scripts/format.sh --shell + +.PHONY: test +test: tools-install ## Run all tests (core, integration, contrib) + $(BIN_PATH) ./scripts/test.sh --all + +.PHONY: test-appsec +test/appsec: tools-install ## Run tests with AppSec enabled + $(BIN_PATH) ./scripts/test.sh --appsec + +.PHONY: test-contrib +test/contrib: tools-install ## Run contrib package tests + $(BIN_PATH) ./scripts/test.sh --contrib + +.PHONY: test-integration +test/integration: tools-install ## Run integration tests + $(BIN_PATH) ./scripts/test.sh --integration + +.PHONY: fix-modules +fix-modules: tools-install ## Fix module dependencies and consistency + $(BIN_PATH) ./scripts/fix_modules.sh + +.PHONY: tmp/make-help.txt +tmp/make-help.txt: + @mkdir -p tmp + @make help --no-print-directory > tmp/make-help.txt 2>&1 || true + +.PHONY: tmp/test-help.txt +tmp/test-help.txt: + @mkdir -p tmp + @./scripts/test.sh --help > tmp/test-help.txt 2>&1 || true + +.PHONY: docs +docs: tools-install tmp/make-help.txt tmp/test-help.txt ## Generate and Update embedded documentation in README files + $(BIN_PATH) embedmd -w README.md scripts/README.md + +ORCHESTRION_VERSION := latest +ORCHESTRION_DIRS := internal/orchestrion/_integration orchestrion/all + +.PHONY: upgrade/orchestrion +upgrade/orchestrion: ## Upgrade Orchestrion and fix modules + $(BIN_PATH) ORCHESTRION_VERSION=$(ORCHESTRION_VERSION) ORCHESTRION_DIRS="$(ORCHESTRION_DIRS)" ./scripts/upgrade_orchestrion.sh diff --git a/README.md b/README.md index 7cf2885d08..01069a2224 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,18 @@ [![APM Parametric Tests](https://github.com/DataDog/dd-trace-go/actions/workflows/parametric-tests.yml/badge.svg)](https://github.com/DataDog/dd-trace-go/actions/workflows/parametric-tests.yml) [![codecov](https://codecov.io/gh/DataDog/dd-trace-go/branch/v1/graph/badge.svg?token=jGG20Xhv8i)](https://codecov.io/gh/DataDog/dd-trace-go) -[![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1) +[![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2) ### Datadog Client Libraries for Go This repository contains Go packages for the client-side components of the Datadog product suite for Application Performance Monitoring, Continuous Profiling and Application Security Monitoring of Go applications. -- [Datadog Application Performance Monitoring (APM)](https://docs.datadoghq.com/tracing/): Trace requests as they flow across web servers, databases and microservices so that developers have great visibility into bottlenecks and troublesome requests. -The package [`gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer`](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer) allows you to trace any piece of your Go code, and commonly used Go libraries can be automatically traced thanks to our out-of-the-box integrations which can be found in the package [`gopkg.in/DataDog/dd-trace-go.v1/ddtrace/contrib`](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib). +- [Datadog Application Performance Monitoring (APM)](https://docs.datadoghq.com/tracing/): Trace requests as they flow across web servers, databases, and microservices so that developers have great visibility into bottlenecks and troublesome requests. +The package [`github.com/DataDog/dd-trace-go/v2/ddtrace/tracer`](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/ddtrace/tracer) allows you to trace any piece of your Go code, and commonly used Go libraries can be automatically traced thanks to our out-of-the-box integrations which can be found in the package [`github.com/DataDog/dd-trace-go/v2/contrib`](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/contrib). + - [Datadog Go Continuous Profiler](https://docs.datadoghq.com/profiler/): Continuously profile your Go apps to find CPU, memory, and synchronization bottlenecks, broken down by function name, and line number, to significantly reduce end-user latency and infrastructure costs. -The package [`gopkg.in/DataDog/dd-trace-go.v1/profiler`](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/profiler) allows you to periodically collect and send Go profiles to the Datadog API. +The package [`github.com/DataDog/dd-trace-go/v2/profiler`](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/profiler) allows you to periodically collect and send Go profiles to the Datadog API. - [Datadog Application Security Management (ASM)](https://docs.datadoghq.com/security_platform/application_security/) provides in-app monitoring and protection against application-level attacks that aim to exploit code-level vulnerabilities, such as a Server-Side-Request-Forgery (SSRF), a SQL injection (SQLi), or Reflected Cross-Site-Scripting (XSS). ASM identifies services exposed to application attacks and leverages in-app security rules to detect and protect against threats in your application environment. ASM is not a standalone Go package and is transparently integrated into the APM tracer. You can simply enable it with [`DD_APPSEC_ENABLED=true`](https://docs.datadoghq.com/security/application_security/enabling/go). @@ -23,25 +24,25 @@ The package [`gopkg.in/DataDog/dd-trace-go.v1/profiler`](https://pkg.go.dev/gopk This module contains many packages, but most users should probably install the two packages below: ```bash -go get gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer -go get gopkg.in/DataDog/dd-trace-go.v1/profiler +go get github.com/DataDog/dd-trace-go/v2/ddtrace/tracer +go get github.com/DataDog/dd-trace-go/v2/profiler ``` -Additionally there are many [contrib](./contrib) packages that can be installed to automatically instrument and trace commonly used Go libraries such as [net/http](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http), [gorilla/mux](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib/gorilla/mux) or [database/sql](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql): +Additionally there are many [contrib](./contrib) packages, published as nested modules, that can be installed to automatically instrument and trace commonly used Go libraries such as [net/http](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/net/http/v2), [gorilla/mux](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2) or [database/sql/v2](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/database/sql/v2) ``` -go get gopkg.in/DataDog/dd-trace-go.v1/contrib/gorilla/mux +go get github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 ``` If you installed more packages than you intended, you can use `go mod tidy` to remove any unused packages. ### Documentation - - [APM Tracing API](https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/ddtrace) - - [APM Tracing Go Applications](https://docs.datadoghq.com/tracing/setup/go/) - - [Continuous Go Profiler](https://docs.datadoghq.com/tracing/profiler/enabling/go) - - [Application Security Monitoring](https://docs.datadoghq.com/security_platform/application_security/setup_and_configure/?code-lang=go) - - If you are migrating from an older version of the tracer (e.g. 0.6.x) you may also find the [migration document](MIGRATING.md) we've put together helpful. +- [APM Tracing API](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/ddtrace) +- [APM Tracing Go Applications](https://docs.datadoghq.com/tracing/setup/go/) +- [Continuous Go Profiler](https://docs.datadoghq.com/tracing/profiler/enabling/go) +- [Application Security Monitoring](https://docs.datadoghq.com/security_platform/application_security/setup_and_configure/?code-lang=go) +- If you are migrating from an older version of the tracer (e.g., 1.60.x) you may also find the [migration document](MIGRATING.md) we've put together helpful. ### Go Support Policy @@ -53,15 +54,44 @@ Before considering contributions to the project, please take a moment to read ou ### Testing -Tests can be run locally using the Go toolset. +Tests can be run locally using make targets or Go toolset directly. + +**Using Make (Recommended)**: + +[embedmd]:# (tmp/make-help.txt) +```txt +Usage: make [target] + +Targets: + help Show this help message + all Run complete build pipeline (tools, generate, lint, test) + tools-install Install development tools + clean Clean build artifacts + clean-all Clean everything including tools and temporary files + generate Run code generation + lint Run linting checks + lint/go Run Go linting checks + lint/go/fix Fix linting issues automatically + lint/shell Run shell script linting checks + format Format code + format/shell install shfmt + test Run all tests (core, integration, contrib) + test/appsec Run tests with AppSec enabled + test/contrib Run contrib package tests + test/integration Run integration tests + fix-modules Fix module dependencies and consistency + docs Generate and Update embedded documentation in README files + upgrade/orchestrion Upgrade Orchestrion and fix modules +``` -To run integration tests locally, you should set the `INTEGRATION` environment variable. The dependencies of the integration tests are best run via Docker. To get an -idea about the versions and the set-up take a look at our [docker-compose config](./docker-compose.yaml). +**Direct Script Usage**: +For more control, you can use the [scripts/test.sh](./scripts/test.sh) script directly. You'll need Docker and docker-compose installed for integration tests. Run `./scripts/test.sh --help` for all available options. -The best way to run the entire test suite is using the [test.sh](./test.sh) script. You'll need Docker and docker-compose installed. If this is your first time running the tests, you should run `./test.sh -t` to install any missing test tools/dependencies. Run `./test.sh --all` to run all of the integration tests through the docker-compose environment. Run `./test.sh --help` for more options. +To run integration tests locally, you should set the `INTEGRATION` environment variable. The dependencies of the integration tests are best run via Docker. To get an idea about the versions and the set-up take a look at our [docker-compose config](./docker-compose.yaml). If you're only interested in the tests for a specific integration it can be useful to spin up just the required containers via docker-compose. For example if you're running tests that need the `mysql` database container to be up: + ```shell docker compose -f docker-compose.yaml -p dd-trace-go up -d mysql ``` diff --git a/SECURITY.md b/SECURITY.md index 6a5437fcdc..ca687990a4 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -2,7 +2,7 @@ ## Supported Versions -Please see our [Support Policy](README.md#support-policy) +Please see our [Support Policy](README.md#go-support-policy) ## Reporting a Vulnerability @@ -22,7 +22,7 @@ If you have found a security issue in our code directly, please contact the secu If you are using a vulnerability checker other than `golang.org/x/vuln/vulncheck` you may detect vulnerabilities in our contrib dependencies. In general we like to specify non-vulnerable minimum versions of dependencies when we can do so in a non-breaking way. To avoid breaking users of this library there may be contrib libraries that are deprecated/vulnerable but still appear in our go.mod file. If you are not using these contrib packages you are not vulnerable (i.e. if they do not appear in your go.sum file). -At the next major version we will drop support for these packages. (e.g. as of dd-trace-go@v1 labstack/echo v3 is considered deprecated and users should migrate to labstack/echo.v4) +At the next major version we will drop support for these packages. Note that since library go.mod files only specify minimum version requirements you are welcome to specify a newer version of any dependencies to satisfy your tooling. For example, if you would like to require a library like `github.com/labstack/echo/v4` use version v4.10.0 you can do so by running `go get github.com/labstack/echo/v4@v4.10.0`. diff --git a/_tools/README.md b/_tools/README.md new file mode 100644 index 0000000000..c0af4b0b99 --- /dev/null +++ b/_tools/README.md @@ -0,0 +1,83 @@ +# Development Tools + +This directory contains development tools used for building, testing, and maintaining the dd-trace-go project. The tools are defined as blank imports in `tools.go` and their dependencies are managed in `go.mod`. + +## Installation + +To install all development tools into the `bin/` directory, run from the project root: + +```bash +make tools-install +``` + +This will: + +1. Create the `bin/` directory if it doesn't exist +2. Download all tool dependencies +3. Install all tools to `bin/` directory + +## Usage + +Once installed, tools can be used in two ways: + +### Via Makefile Targets + +The Makefile provides convenient targets that automatically use the correct tool versions: + +```bash +# e.g. +make lint # Run linter +make test # Run all tests +make generate # Generate code +``` + +### Direct Tool Usage + +Tools can be run directly from the `bin/` directory or by using the `BIN_PATH` variable: + +```bash +# Run tools directly +./bin/tool-name [args] + +# Or use with correct PATH +PATH="$(pwd)/bin:$PATH" tool-name [args] +``` + +## Adding New Tools + +To add a new development tool: + +1. Add a blank import to `tools.go`: + + ```go + _ "example.com/new-tool/cmd/tool" + ``` + +2. Run `go mod tidy` to update dependencies: + + ```bash + cd _tools && go mod tidy + ``` + +3. Install tools: + + ```bash + make tools-install + ``` + +## Module Independence + +The `_tools` directory is a separate Go module that is intentionally **not** included in the workspace (`go.work`). This ensures: + +- Tool dependencies don't interfere with the main project +- Tool versions are managed independently +- Clean separation between runtime and development dependencies + +## Troubleshooting + +If tools fail to install: + +1. Ensure you're running from the project root +2. Check that `_tools/go.mod` is properly maintained +3. Verify tools are correctly imported in `tools.go` +4. Run `cd _tools && go mod tidy` to sync dependencies diff --git a/_tools/go.mod b/_tools/go.mod new file mode 100644 index 0000000000..7668b3970d --- /dev/null +++ b/_tools/go.mod @@ -0,0 +1,226 @@ +module github.com/DataDog/dd-trace-go/_tools + +go 1.24.0 + +require ( + github.com/campoy/embedmd v1.0.0 + github.com/golangci/golangci-lint/v2 v2.3.0 + github.com/kakkoyun/checklocks v0.0.0-20250704150719-2f79b8295329 + golang.org/x/perf v0.0.0-20250710210952-7b7c2de18447 + golang.org/x/tools v0.35.0 + golang.org/x/vuln v1.1.4 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 + google.golang.org/protobuf v1.36.6 + gotest.tools/gotestsum v1.12.3 + mvdan.cc/sh/v3 v3.12.0 +) + +require ( + 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect + 4d63.com/gochecknoglobals v0.2.2 // indirect + codeberg.org/chavacava/garif v0.2.0 // indirect + github.com/4meepo/tagalign v1.4.2 // indirect + github.com/Abirdcfly/dupword v0.1.6 // indirect + github.com/AlwxSin/noinlineerr v1.0.5 // indirect + github.com/Antonboom/errname v1.1.0 // indirect + github.com/Antonboom/nilnil v1.1.0 // indirect + github.com/Antonboom/testifylint v1.6.1 // indirect + github.com/BurntSushi/toml v1.5.0 // indirect + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect + github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 // indirect + github.com/alecthomas/chroma/v2 v2.19.0 // indirect + github.com/alecthomas/go-check-sumtype v0.3.1 // indirect + github.com/alexkohler/nakedret/v2 v2.0.6 // indirect + github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/alingse/asasalint v0.0.11 // indirect + github.com/alingse/nilnesserr v0.2.0 // indirect + github.com/ashanbrown/forbidigo/v2 v2.1.0 // indirect + github.com/ashanbrown/makezero/v2 v2.0.1 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bitfield/gotestdox v0.2.2 // indirect + github.com/bkielbasa/cyclop v1.2.3 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v4 v4.7.0 // indirect + github.com/bombsimon/wsl/v5 v5.1.0 // indirect + github.com/breml/bidichk v0.3.3 // indirect + github.com/breml/errchkjson v0.4.1 // indirect + github.com/butuzov/ireturn v0.4.0 // indirect + github.com/butuzov/mirror v1.3.0 // indirect + github.com/catenacyber/perfsprint v0.9.1 // indirect + github.com/ccojocar/zxcvbn-go v1.0.4 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charithe/durationcheck v0.0.10 // indirect + github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect + github.com/charmbracelet/lipgloss v1.1.0 // indirect + github.com/charmbracelet/x/ansi v0.8.0 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/ckaznocha/intrange v0.3.1 // indirect + github.com/curioswitch/go-reassign v0.3.0 // indirect + github.com/daixiang0/gci v0.13.6 // indirect + github.com/dave/dst v0.27.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denis-tingaikin/go-header v0.5.0 // indirect + github.com/dlclark/regexp2 v1.11.5 // indirect + github.com/dnephin/pflag v1.0.7 // indirect + github.com/ettle/strcase v0.2.0 // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/firefart/nonamedreturns v1.0.6 // indirect + github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect + github.com/ghostiam/protogetter v0.3.15 // indirect + github.com/go-critic/go-critic v0.13.0 // indirect + github.com/go-toolsmith/astcast v1.1.0 // indirect + github.com/go-toolsmith/astcopy v1.1.0 // indirect + github.com/go-toolsmith/astequal v1.2.0 // indirect + github.com/go-toolsmith/astfmt v1.1.0 // indirect + github.com/go-toolsmith/astp v1.1.0 // indirect + github.com/go-toolsmith/strparse v1.1.0 // indirect + github.com/go-toolsmith/typep v1.1.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gofrs/flock v0.12.1 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect + github.com/golangci/go-printf-func-name v0.1.0 // indirect + github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect + github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 // indirect + github.com/golangci/misspell v0.7.0 // indirect + github.com/golangci/plugin-module-register v0.1.2 // indirect + github.com/golangci/revgrep v0.8.0 // indirect + github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect + github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/renameio/v2 v2.0.0 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/gordonklaus/ineffassign v0.1.0 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.5.0 // indirect + github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect + github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jgautheron/goconst v1.8.2 // indirect + github.com/jingyugao/rowserrcheck v1.1.1 // indirect + github.com/jjti/go-spancheck v0.6.5 // indirect + github.com/julz/importas v0.2.0 // indirect + github.com/karamaru-alpha/copyloopvar v1.2.1 // indirect + github.com/kisielk/errcheck v1.9.0 // indirect + github.com/kkHAIKE/contextcheck v1.1.6 // indirect + github.com/kulti/thelper v0.6.3 // indirect + github.com/kunwardeep/paralleltest v1.0.14 // indirect + github.com/lasiar/canonicalheader v1.1.2 // indirect + github.com/ldez/exptostd v0.4.4 // indirect + github.com/ldez/gomoddirectives v0.7.0 // indirect + github.com/ldez/grignotin v0.9.0 // indirect + github.com/ldez/tagliatelle v0.7.1 // indirect + github.com/ldez/usetesting v0.5.0 // indirect + github.com/leonklingele/grouper v1.1.2 // indirect + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/macabu/inamedparam v0.2.0 // indirect + github.com/magiconair/properties v1.8.6 // indirect + github.com/manuelarte/embeddedstructfieldcheck v0.3.0 // indirect + github.com/manuelarte/funcorder v0.5.0 // indirect + github.com/maratori/testableexamples v1.0.0 // indirect + github.com/maratori/testpackage v1.1.1 // indirect + github.com/matoous/godox v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mgechev/revive v1.11.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moricho/tparallel v0.3.2 // indirect + github.com/muesli/termenv v0.16.0 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nishanths/exhaustive v0.12.0 // indirect + github.com/nishanths/predeclared v0.2.2 // indirect + github.com/nunnatsa/ginkgolinter v0.20.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/polyfloyd/go-errorlint v1.8.0 // indirect + github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.32.1 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/quasilyte/go-ruleguard v0.4.4 // indirect + github.com/quasilyte/go-ruleguard/dsl v0.3.22 // indirect + github.com/quasilyte/gogrep v0.5.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect + github.com/raeperd/recvcheck v0.2.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/ryancurrah/gomodguard v1.4.1 // indirect + github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect + github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect + github.com/securego/gosec/v2 v2.22.6 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sivchari/containedctx v1.0.3 // indirect + github.com/sonatard/noctx v0.3.5 // indirect + github.com/sourcegraph/go-diff v0.7.0 // indirect + github.com/spf13/afero v1.14.0 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.9.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.7 // indirect + github.com/spf13/viper v1.12.0 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.2.0 // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/testify v1.10.0 // indirect + github.com/subosito/gotenv v1.4.1 // indirect + github.com/tdakkota/asciicheck v0.4.1 // indirect + github.com/tetafro/godot v1.5.1 // indirect + github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect + github.com/timonwong/loggercheck v0.11.0 // indirect + github.com/tomarrell/wrapcheck/v2 v2.11.0 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect + github.com/ultraware/funlen v0.2.0 // indirect + github.com/ultraware/whitespace v0.2.0 // indirect + github.com/uudashr/gocognit v1.2.0 // indirect + github.com/uudashr/iface v1.4.1 // indirect + github.com/xen0n/gosmopolitan v1.3.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.3.0 // indirect + github.com/ykadowak/zerologlint v0.1.5 // indirect + gitlab.com/bosi/decorder v0.4.2 // indirect + go-simpler.org/musttag v0.13.1 // indirect + go-simpler.org/sloglint v0.11.1 // indirect + go.augendre.info/arangolint v0.2.0 // indirect + go.augendre.info/fatcontext v0.8.0 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/automaxprocs v1.6.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.24.0 // indirect + golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.34.0 // indirect + golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b // indirect + golang.org/x/term v0.33.0 // indirect + golang.org/x/text v0.27.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + honnef.co/go/tools v0.6.1 // indirect + mvdan.cc/editorconfig v0.3.0 // indirect + mvdan.cc/gofumpt v0.8.0 // indirect + mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 // indirect +) diff --git a/_tools/go.sum b/_tools/go.sum new file mode 100644 index 0000000000..3f82c83c0a --- /dev/null +++ b/_tools/go.sum @@ -0,0 +1,1036 @@ +4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A= +4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY= +4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU= +4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY= +codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/4meepo/tagalign v1.4.2 h1:0hcLHPGMjDyM1gHG58cS73aQF8J4TdVR96TZViorO9E= +github.com/4meepo/tagalign v1.4.2/go.mod h1:+p4aMyFM+ra7nb41CnFG6aSDXqRxU/w1VQqScKqDARI= +github.com/Abirdcfly/dupword v0.1.6 h1:qeL6u0442RPRe3mcaLcbaCi2/Y/hOcdtw6DE9odjz9c= +github.com/Abirdcfly/dupword v0.1.6/go.mod h1:s+BFMuL/I4YSiFv29snqyjwzDp4b65W2Kvy+PKzZ6cw= +github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY= +github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= +github.com/Antonboom/errname v1.1.0 h1:A+ucvdpMwlo/myWrkHEUEBWc/xuXdud23S8tmTb/oAE= +github.com/Antonboom/errname v1.1.0/go.mod h1:O1NMrzgUcVBGIfi3xlVuvX8Q/VP/73sseCaAppfjqZw= +github.com/Antonboom/nilnil v1.1.0 h1:jGxJxjgYS3VUUtOTNk8Z1icwT5ESpLH/426fjmQG+ng= +github.com/Antonboom/nilnil v1.1.0/go.mod h1:b7sAlogQjFa1wV8jUW3o4PMzDVFLbTux+xnQdvzdcIE= +github.com/Antonboom/testifylint v1.6.1 h1:6ZSytkFWatT8mwZlmRCHkWz1gPi+q6UBSbieji2Gj/o= +github.com/Antonboom/testifylint v1.6.1/go.mod h1:k+nEkathI2NFjKO6HvwmSrbzUcQ6FAnbZV+ZRrnXPLI= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1 h1:Sz1JIXEcSfhz7fUi7xHnhpIE0thVASYjvosApmHuD2k= +github.com/GaijinEntertainment/go-exhaustruct/v3 v3.3.1/go.mod h1:n/LSCXNuIYqVfBlVXyHfMQkZDdp1/mmxfSjADd3z1Zg= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794 h1:xlwdaKcTNVW4PtpQb8aKA4Pjy0CdJHEqvFbAnvR5m2g= +github.com/aclements/go-moremath v0.0.0-20210112150236-f10218a38794/go.mod h1:7e+I0LQFUI9AXWxOfsQROs9xPhoJtbsyWcjJqDd4KPY= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.19.0 h1:Im+SLRgT8maArxv81mULDWN8oKxkzboH07CHesxElq4= +github.com/alecthomas/chroma/v2 v2.19.0/go.mod h1:RVX6AvYm4VfYe/zsk7mjHueLDZor3aWCNE14TFlepBk= +github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= +github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= +github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= +github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= +github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= +github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w= +github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= +github.com/ashanbrown/forbidigo/v2 v2.1.0 h1:NAxZrWqNUQiDz19FKScQ/xvwzmij6BiOw3S0+QUQ+Hs= +github.com/ashanbrown/forbidigo/v2 v2.1.0/go.mod h1:0zZfdNAuZIL7rSComLGthgc/9/n2FqspBOH90xlCHdA= +github.com/ashanbrown/makezero/v2 v2.0.1 h1:r8GtKetWOgoJ4sLyUx97UTwyt2dO7WkGFHizn/Lo8TY= +github.com/ashanbrown/makezero/v2 v2.0.1/go.mod h1:kKU4IMxmYW1M4fiEHMb2vc5SFoPzXvgbMR9gIp5pjSw= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitfield/gotestdox v0.2.2 h1:x6RcPAbBbErKLnapz1QeAlf3ospg8efBsedU93CDsnE= +github.com/bitfield/gotestdox v0.2.2/go.mod h1:D+gwtS0urjBrzguAkTM2wodsTQYFHdpx8eqRJ3N+9pY= +github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= +github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= +github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= +github.com/bombsimon/wsl/v5 v5.1.0 h1:pLmVRBMxSL1D3/rCe65s/iCSFqU37Cz5/8dVEB4UNBw= +github.com/bombsimon/wsl/v5 v5.1.0/go.mod h1:Gp8lD04z27wm3FANIUPZycXp+8huVsn0oxc+n4qfV9I= +github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= +github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= +github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= +github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s= +github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E= +github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70= +github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= +github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= +github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= +github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= +github.com/catenacyber/perfsprint v0.9.1 h1:5LlTp4RwTooQjJCvGEFV6XksZvWE7wCOUvjD2z0vls0= +github.com/catenacyber/perfsprint v0.9.1/go.mod h1:q//VWC2fWbcdSLEY1R3l8n0zQCDPdE4IjZwyY1HMunM= +github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc= +github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.10 h1:wgw73BiocdBDQPik+zcEoBG/ob8uyBHf2iyoHGPf5w4= +github.com/charithe/durationcheck v0.0.10/go.mod h1:bCWXb7gYRysD1CU3C+u4ceO49LoGOY1C1L6uouGNreQ= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE= +github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8= +github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= +github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= +github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= +github.com/daixiang0/gci v0.13.6 h1:RKuEOSkGpSadkGbvZ6hJ4ddItT3cVZ9Vn9Rybk6xjl8= +github.com/daixiang0/gci v0.13.6/go.mod h1:12etP2OniiIdP4q+kjUGrC/rUagga7ODbqsom5Eo5Yk= +github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= +github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= +github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= +github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dnephin/pflag v1.0.7 h1:oxONGlWxhmUct0YzKTgrpQv9AUA1wtPBn7zuSjJqptk= +github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= +github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= +github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E= +github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= +github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= +github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/ghostiam/protogetter v0.3.15 h1:1KF5sXel0HE48zh1/vn0Loiw25A9ApyseLzQuif1mLY= +github.com/ghostiam/protogetter v0.3.15/go.mod h1:WZ0nw9pfzsgxuRsPOFQomgDVSWtDLJRfQJEhsGbmQMA= +github.com/go-critic/go-critic v0.13.0 h1:kJzM7wzltQasSUXtYyTl6UaPVySO6GkaR1thFnJ6afY= +github.com/go-critic/go-critic v0.13.0/go.mod h1:M/YeuJ3vOCQDnP2SU+ZhjgRzwzcBW87JqLpMJLrZDLI= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= +github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 h1:WUvBfQL6EW/40l6OmeSBYQJNSif4O11+bmWEz+C7FYw= +github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= +github.com/golangci/go-printf-func-name v0.1.0 h1:dVokQP+NMTO7jwO4bwsRwLWeudOVUPPyAKJuzv8pEJU= +github.com/golangci/go-printf-func-name v0.1.0/go.mod h1:wqhWFH5mUdJQhweRnldEywnR5021wTdZSNgwYceV14s= +github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= +github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= +github.com/golangci/golangci-lint/v2 v2.3.0 h1:SgxoaAXH8vMuuSnvRDjfF0sxWeIplxJTcs4o6gGEu9Q= +github.com/golangci/golangci-lint/v2 v2.3.0/go.mod h1:9eHPNOsTOqLGSnDsfPRcOaC2m52stgt37uxsjtQwjg0= +github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95 h1:AkK+w9FZBXlU/xUmBtSJN1+tAI4FIvy5WtnUnY8e4p8= +github.com/golangci/golines v0.0.0-20250217134842-442fd0091d95/go.mod h1:k9mmcyWKSTMcPPvQUCfRWWQ9VHJ1U9Dc0R7kaXAgtnQ= +github.com/golangci/misspell v0.7.0 h1:4GOHr/T1lTW0hhR4tgaaV1WS/lJ+ncvYCoFKmqJsj0c= +github.com/golangci/misspell v0.7.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg= +github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg= +github.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw= +github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s= +github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= +github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM= +github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s= +github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM= +github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786 h1:rcv+Ippz6RAtvaGgKxc+8FQIpxHgsF+HBzPyYL2cyVU= +github.com/google/go-cmdtest v0.4.1-0.20220921163831-55ab3332a786/go.mod h1:apVn/GCasLZUVpAJ6oWAuyP7Ne7CEsQbTnc0plM3m+o= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= +github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= +github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gordonklaus/ineffassign v0.1.0 h1:y2Gd/9I7MdY1oEIt+n+rowjBNDcLQq3RsH5hwJd0f9s= +github.com/gordonklaus/ineffassign v0.1.0/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8= +github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc= +github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk= +github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8= +github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jgautheron/goconst v1.8.2 h1:y0XF7X8CikZ93fSNT6WBTb/NElBu9IjaY7CCYQrCMX4= +github.com/jgautheron/goconst v1.8.2/go.mod h1:A0oxgBCHy55NQn6sYpO7UdnA9p+h7cPtoOZUmvNIako= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= +github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= +github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= +github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= +github.com/kakkoyun/checklocks v0.0.0-20250704150719-2f79b8295329 h1:cAMwYa6sAK7UAEoWL0ipaaoMfGdA3pxS3eEMGw08AOA= +github.com/kakkoyun/checklocks v0.0.0-20250704150719-2f79b8295329/go.mod h1:z6hvaGvBINR1I+t8pgIAivejAgXxTSdNuYp4PqnaNTg= +github.com/karamaru-alpha/copyloopvar v1.2.1 h1:wmZaZYIjnJ0b5UoKDjUHrikcV0zuPyyxI4SVplLd2CI= +github.com/karamaru-alpha/copyloopvar v1.2.1/go.mod h1:nFmMlFNlClC2BPvNaHMdkirmTJxVCY0lhxBtlfOypMM= +github.com/kisielk/errcheck v1.9.0 h1:9xt1zI9EBfcYBvdU1nVrzMzzUPUtPKs9bVSIM3TAb3M= +github.com/kisielk/errcheck v1.9.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= +github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= +github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.14 h1:wAkMoMeGX/kGfhQBPODT/BL8XhK23ol/nuQ3SwFaUw8= +github.com/kunwardeep/paralleltest v1.0.14/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= +github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= +github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= +github.com/ldez/exptostd v0.4.4 h1:58AtQjnLcT/tI5W/1KU7xE/O7zW9RAWB6c/ScQAnfus= +github.com/ldez/exptostd v0.4.4/go.mod h1:QfdzPw6oHjFVdNV7ILoPu5sw3OZ3OG1JS0I5JN3J4Js= +github.com/ldez/gomoddirectives v0.7.0 h1:EOx8Dd56BZYSez11LVgdj025lKwlP0/E5OLSl9HDwsY= +github.com/ldez/gomoddirectives v0.7.0/go.mod h1:wR4v8MN9J8kcwvrkzrx6sC9xe9Cp68gWYCsda5xvyGc= +github.com/ldez/grignotin v0.9.0 h1:MgOEmjZIVNn6p5wPaGp/0OKWyvq42KnzAt/DAb8O4Ow= +github.com/ldez/grignotin v0.9.0/go.mod h1:uaVTr0SoZ1KBii33c47O1M8Jp3OP3YDwhZCmzT9GHEk= +github.com/ldez/tagliatelle v0.7.1 h1:bTgKjjc2sQcsgPiT902+aadvMjCeMHrY7ly2XKFORIk= +github.com/ldez/tagliatelle v0.7.1/go.mod h1:3zjxUpsNB2aEZScWiZTHrAXOl1x25t3cRmzfK1mlo2I= +github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc= +github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= +github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= +github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/manuelarte/embeddedstructfieldcheck v0.3.0 h1:VhGqK8gANDvFYDxQkjPbv7/gDJtsGU9k6qj/hC2hgso= +github.com/manuelarte/embeddedstructfieldcheck v0.3.0/go.mod h1:LSo/IQpPfx1dXMcX4ibZCYA7Yy6ayZHIaOGM70+1Wy8= +github.com/manuelarte/funcorder v0.5.0 h1:llMuHXXbg7tD0i/LNw8vGnkDTHFpTnWqKPI85Rknc+8= +github.com/manuelarte/funcorder v0.5.0/go.mod h1:Yt3CiUQthSBMBxjShjdXMexmzpP8YGvGLjrxJNkO2hA= +github.com/maratori/testableexamples v1.0.0 h1:dU5alXRrD8WKSjOUnmJZuzdxWOEQ57+7s93SLMxb2vI= +github.com/maratori/testableexamples v1.0.0/go.mod h1:4rhjL1n20TUTT4vdh3RDqSizKLyXp7K2u6HgraZCGzE= +github.com/maratori/testpackage v1.1.1 h1:S58XVV5AD7HADMmD0fNnziNHqKvSdDuEKdPD1rNTU04= +github.com/maratori/testpackage v1.1.1/go.mod h1:s4gRK/ym6AMrqpOa/kEbQTV4Q4jb7WeLZzVhVVVOQMc= +github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= +github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgechev/revive v1.11.0 h1:b/gLLpBE427o+Xmd8G58gSA+KtBwxWinH/A565Awh0w= +github.com/mgechev/revive v1.11.0/go.mod h1:tI0oLF/2uj+InHCBLrrqfTKfjtFTBCFFfG05auyzgdw= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= +github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.20.0 h1:OmWLkAFO2HUTYcU6mprnKud1Ey5pVdiVNYGO5HVicx8= +github.com/nunnatsa/ginkgolinter v0.20.0/go.mod h1:dCIuFlTPfQerXgGUju3VygfAFPdC5aE1mdacCDKDJcQ= +github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= +github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= +github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y= +github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.0 h1:DL4RestQqRLr8U4LygLw8g2DX6RN1eBJOpa2mzsrl1Q= +github.com/polyfloyd/go-errorlint v1.8.0/go.mod h1:G2W0Q5roxbLCt0ZQbdoxQxXktTjwNyDbEaj3n7jvl4s= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/quasilyte/go-ruleguard v0.4.4 h1:53DncefIeLX3qEpjzlS1lyUmQoUEeOWPFWqaTJq9eAQ= +github.com/quasilyte/go-ruleguard v0.4.4/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= +github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= +github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I= +github.com/ryanrolds/sqlclosecheck v0.5.1 h1:dibWW826u0P8jNLsLN+En7+RqWWTYrjCB9fJfSfdyCU= +github.com/ryanrolds/sqlclosecheck v0.5.1/go.mod h1:2g3dUjoS6AL4huFdv6wn55WpLIDjY7ZgUR4J8HOO/XQ= +github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= +github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= +github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= +github.com/securego/gosec/v2 v2.22.6 h1:mixR+X+Z5fT6QddWY8jyU9gs43CyW0SnADHB6kJm8NY= +github.com/securego/gosec/v2 v2.22.6/go.mod h1:510TFNDMrIPytokyHQAVLvPeDr41Yihn2ak8P+XQfNE= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= +github.com/sonatard/noctx v0.3.5 h1:KJmJt2jEXFu2JLlGfjpGNOjyjc4qvfzl4918XJ4Odpc= +github.com/sonatard/noctx v0.3.5/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= +github.com/sourcegraph/go-diff v0.7.0 h1:9uLlrd5T46OXs5qpp8L/MTltk0zikUGi0sNNyCpA8G0= +github.com/sourcegraph/go-diff v0.7.0/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= +github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= +github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.2.0 h1:i8pxvGrt1+4G0czLr/WnmyH7zbZ8Bg8etvARQ1rpyl4= +github.com/stbenjam/no-sprintf-host-port v0.2.0/go.mod h1:eL0bQ9PasS0hsyTyfTjjG+E80QIyPnBVQbYZyv20Jfk= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= +github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/tdakkota/asciicheck v0.4.1 h1:bm0tbcmi0jezRA2b5kg4ozmMuGAFotKI3RZfrhfovg8= +github.com/tdakkota/asciicheck v0.4.1/go.mod h1:0k7M3rCfRXb0Z6bwgvkEIMleKH3kXNz9UqJ9Xuqopr8= +github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/tetafro/godot v1.5.1 h1:PZnjCol4+FqaEzvZg5+O8IY2P3hfY9JzRBNPv1pEDS4= +github.com/tetafro/godot v1.5.1/go.mod h1:cCdPtEndkmqqrhiCfkmxDodMQJ/f3L1BCNskCUZdTwk= +github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 h1:9LPGD+jzxMlnk5r6+hJnar67cgpDIz/iyD+rfl5r2Vk= +github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67/go.mod h1:mkjARE7Yr8qU23YcGMSALbIxTQ9r9QBVahQOBRfU460= +github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= +github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= +github.com/tomarrell/wrapcheck/v2 v2.11.0 h1:BJSt36snX9+4WTIXeJ7nvHBQBcm1h2SjQMSlmQ6aFSU= +github.com/tomarrell/wrapcheck/v2 v2.11.0/go.mod h1:wFL9pDWDAbXhhPZZt+nG8Fu+h29TtnZ2MW6Lx4BRXIU= +github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= +github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA= +github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g= +github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= +github.com/uudashr/gocognit v1.2.0 h1:3BU9aMr1xbhPlvJLSydKwdLN3tEUUrzPSSM8S4hDYRA= +github.com/uudashr/gocognit v1.2.0/go.mod h1:k/DdKPI6XBZO1q7HgoV2juESI2/Ofj9AcHPZhBBdrTU= +github.com/uudashr/iface v1.4.1 h1:J16Xl1wyNX9ofhpHmQ9h9gk5rnv2A6lX/2+APLTo0zU= +github.com/uudashr/iface v1.4.1/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= +github.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM= +github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= +go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= +go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= +go-simpler.org/musttag v0.13.1 h1:lw2sJyu7S1X8lc8zWUAdH42y+afdcCnHhWpnkWvd6vU= +go-simpler.org/musttag v0.13.1/go.mod h1:8r450ehpMLQgvpb6sg+hV5Ur47eH6olp/3yEanfG97k= +go-simpler.org/sloglint v0.11.1 h1:xRbPepLT/MHPTCA6TS/wNfZrDzkGvCCqUv4Bdwc3H7s= +go-simpler.org/sloglint v0.11.1/go.mod h1:2PowwiCOK8mjiF+0KGifVOT8ZsCNiFzvfyJeJOIt8MQ= +go.augendre.info/arangolint v0.2.0 h1:2NP/XudpPmfBhQKX4rMk+zDYIj//qbt4hfZmSSTcpj8= +go.augendre.info/arangolint v0.2.0/go.mod h1:Vx4KSJwu48tkE+8uxuf0cbBnAPgnt8O1KWiT7bljq7w= +go.augendre.info/fatcontext v0.8.0 h1:2dfk6CQbDGeu1YocF59Za5Pia7ULeAM6friJ3LP7lmk= +go.augendre.info/fatcontext v0.8.0/go.mod h1:oVJfMgwngMsHO+KB2MdgzcO+RvtNdiCEOlWvSFtax/s= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b h1:KdrhdYPDUvJTvrDK9gdjfFd6JTk8vA1WJoldYSi0kHo= +golang.org/x/exp/typeparams v0.0.0-20250620022241-b7579e27df2b/go.mod h1:LKZHyeOpPuZcMgxeHjJp4p5yvxrCX1xDvH10zYHhjjQ= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/perf v0.0.0-20250710210952-7b7c2de18447 h1:rW8zamu+F63omx9uT7NEv45cj82FinwZqCQxB6YpXaY= +golang.org/x/perf v0.0.0-20250710210952-7b7c2de18447/go.mod h1:/3Q08NGeGk1jEFl72e1LrFtPIrpY6mfw8iqURBiwZ2E= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b h1:DU+gwOBXU+6bO0sEyO7o/NeMlxZxCZEvI7v+J4a1zRQ= +golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= +golang.org/x/vuln v1.1.4 h1:Ju8QsuyhX3Hk8ma3CesTbO8vfJD9EvUBgHvkxHBzj0I= +golang.org/x/vuln v1.1.4/go.mod h1:F+45wmU18ym/ca5PLTPLsSzr2KppzswxPP603ldA67s= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok= +google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/gotestsum v1.12.3 h1:jFwenGJ0RnPkuKh2VzAYl1mDOJgbhobBDeL2W1iEycs= +gotest.tools/gotestsum v1.12.3/go.mod h1:Y1+e0Iig4xIRtdmYbEV7K7H6spnjc1fX4BOuUhWw2Wk= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.6.1 h1:R094WgE8K4JirYjBaOpz/AvTyUu/3wbmAoskKN/pxTI= +honnef.co/go/tools v0.6.1/go.mod h1:3puzxxljPCe8RGJX7BIy1plGbxEOZni5mR2aXe3/uk4= +mvdan.cc/editorconfig v0.3.0 h1:D1D2wLYEYGpawWT5SpM5pRivgEgXjtEXwC9MWhEY0gQ= +mvdan.cc/editorconfig v0.3.0/go.mod h1:NcJHuDtNOTEJ6251indKiWuzK6+VcrMuLzGMLKBFupQ= +mvdan.cc/gofumpt v0.8.0 h1:nZUCeC2ViFaerTcYKstMmfysj6uhQrA2vJe+2vwGU6k= +mvdan.cc/gofumpt v0.8.0/go.mod h1:vEYnSzyGPmjvFkqJWtXkh79UwPWP9/HMxQdGEXZHjpg= +mvdan.cc/sh/v3 v3.12.0 h1:ejKUR7ONP5bb+UGHGEG/k9V5+pRVIyD+LsZz7o8KHrI= +mvdan.cc/sh/v3 v3.12.0/go.mod h1:Se6Cj17eYSn+sNooLZiEUnNNmNxg0imoYlTu4CyaGyg= +mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4 h1:WjUu4yQoT5BHT1w8Zu56SP8367OuBV5jvo+4Ulppyf8= +mvdan.cc/unparam v0.0.0-20250301125049-0df0534333a4/go.mod h1:rthT7OuvRbaGcd5ginj6dA2oLE7YNlta9qhBNNdCaLE= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/_tools/tools.go b/_tools/tools.go new file mode 100644 index 0000000000..f1bcf858bb --- /dev/null +++ b/_tools/tools.go @@ -0,0 +1,25 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +//go:build tools + +package tools + +import ( + _ "github.com/campoy/embedmd" + _ "github.com/golangci/golangci-lint/v2/cmd/golangci-lint" + _ "golang.org/x/perf/cmd/benchstat" + _ "golang.org/x/tools/cmd/goimports" + _ "golang.org/x/vuln/cmd/govulncheck" + _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" + _ "google.golang.org/protobuf/cmd/protoc-gen-go" + _ "gotest.tools/gotestsum" + + // This is a fork of the original "checklocks" analyzer that lives in the gvisor repository. + // This is a temporary fork to allow for the development of the analyzer and testing. + // _ "gvisor.dev/gvisor/tools/checklocks/cmd/checklocks" + _ "github.com/kakkoyun/checklocks/cmd/checklocks" + _ "mvdan.cc/sh/v3/cmd/shfmt" +) diff --git a/appsec/appsec.go b/appsec/appsec.go index 33286cdc17..f953dde194 100644 --- a/appsec/appsec.go +++ b/appsec/appsec.go @@ -13,18 +13,27 @@ package appsec import ( "context" + "maps" + "strconv" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/usersec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/usersec" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) var appsecDisabledLog sync.Once +type CollectionMode string + +const ( + CollectionModeSDK CollectionMode = "sdk" +) + // MonitorParsedHTTPBody runs the security monitoring rules on the given *parsed* // HTTP request body and returns if the HTTP request is suspicious and configured to be blocked. // The given context must be the HTTP request context as returned @@ -41,7 +50,21 @@ func MonitorParsedHTTPBody(ctx context.Context, body any) error { return httpsec.MonitorParsedBody(ctx, body) } -// SetUser wraps tracer.SetUser() and extends it with user blocking. +// MonitorHTTPResponseBody runs the security monitoring rules on the given +// response body (in object form, not encoded as the literal HTTP response body +// payload bytes), and returns an error if the HTTP response is configured to be +// blocked. The given context must be the HTTP request context as returned by +// the [net/http.Request.Context] method, or equivalent. Calls to this function +// are ignored if AppSec is disabled or the provided context is incorrect. +func MonitorHTTPResponseBody(ctx context.Context, body any) error { + if !appsec.Enabled() { + appsecDisabledLog.Do(func() { log.Warn("appsec: not enabled. Body blocking checks won't be performed.") }) + return nil + } + return httpsec.MonitorResponseBody(ctx, body) +} + +// SetUser wraps [tracer.SetUser] and extends it with user blocking. // On top of associating the authenticated user information to the service entry span, // it checks whether the given user ID is blocked or not by returning an error when it is. // A user ID is blocked when it is present in your denylist of users to block at https://app.datadoghq.com/security/appsec/denylist @@ -50,69 +73,101 @@ func MonitorParsedHTTPBody(ctx context.Context, body any) error { // APM tracer middleware on use according to your blocking configuration. // This function always returns nil when appsec is disabled and doesn't block users. func SetUser(ctx context.Context, id string, opts ...tracer.UserMonitoringOption) error { + return setUser(ctx, id, usersec.UserSet, CollectionModeSDK, opts) +} + +func setUser(ctx context.Context, id string, userEventType usersec.UserEventType, collectionMode CollectionMode, opts []tracer.UserMonitoringOption) error { s, ok := tracer.SpanFromContext(ctx) if !ok { - log.Debug("appsec: could not retrieve span from context. User ID tag won't be set") + log.Debug("appsec: user event monitoring SDK: could not retrieve span from context. User ID tag won't be set") return nil } + tracer.SetUser(s, id, opts...) + + // Record that the user collection mode is SDK + s.Root().SetTag("_dd.appsec.user.collection_mode", collectionMode) + if !appsec.Enabled() { appsecDisabledLog.Do(func() { log.Warn("appsec: not enabled. User blocking checks won't be performed.") }) - return nil + // Not returning here, as we still want to record the relevant span tags (just no WAF call). } - op, errPtr := usersec.StartUserLoginOperation(ctx, usersec.UserLoginOperationArgs{}) + op, errPtr := usersec.StartUserLoginOperation(ctx, userEventType, usersec.UserLoginOperationArgs{}) + login, userOrg, sessionID := getMetadata(opts) op.Finish(usersec.UserLoginOperationRes{ UserID: id, - SessionID: getSessionID(opts...), - Success: true, + UserLogin: login, + UserOrg: userOrg, + SessionID: sessionID, }) return *errPtr } -// TrackUserLoginSuccessEvent sets a successful user login event, with the given -// user id and optional metadata, as service entry span tags. It also calls -// SetUser() to set the currently authenticated user, along with the given -// tracer.UserMonitoringOption options. As documented in SetUser(), an -// error is returned when the given user ID is blocked by your denylist. Cf. -// SetUser()'s documentation for more details. -// The service entry span is obtained through the given Go context which should -// contain the currently running span. This function does nothing when no span -// is found in the given Go context and logs an error message instead. -// Such events trigger the backend-side events monitoring, such as the Account -// Take-Over (ATO) monitoring, ultimately blocking the IP address and/or user id -// associated to them. -func TrackUserLoginSuccessEvent(ctx context.Context, uid string, md map[string]string, opts ...tracer.UserMonitoringOption) error { +// TrackUserLoginSuccess denotes a successful user login event, which is used +// by back-end side event monitoring, such as Account Take-Over (ATO) +// monitoring, ultimately allowing IP address and/or user ID deny-lists to be +// configured in order to block associated malicious activity. +// +// The login is the username that was provided by the user as part of +// the authentication attempt, and a single user may have multiple different +// logins (i.e; user name, email address, etc...). The user however has exactly +// one user ID which canonically identifies them. +// +// The provided metadata is attached to the successful user login event. +// +// This function calso calls [SetUser] with the provided user ID and login, as +// well as any provided [tracer.UserMonitoringOption]s, and returns an error if +// the provided user ID is found to be on a configured deny list. See the +// documentation for [SetUser] for more information. +func TrackUserLoginSuccess(ctx context.Context, login string, uid string, md map[string]string, opts ...tracer.UserMonitoringOption) error { + telemetry.Count(telemetry.NamespaceAppSec, "sdk.event", []string{"event_type:login_success", "sdk_version:v2"}).Submit(1) + + // We need to make sure the metadata contains the correct `usr.id` and + // `usr.login` values, so we clone the metadata map and set these two. + md = maps.Clone(md) + if md == nil { + md = make(map[string]string, 2) + } + md["usr.login"] = login + if uid != "" { + md["usr.id"] = uid + } + TrackCustomEvent(ctx, "users.login.success", md) - return SetUser(ctx, uid, opts...) + return setUser(ctx, uid, usersec.UserLoginSuccess, CollectionModeSDK, append(opts, tracer.WithUserLogin(login))) } -// TrackUserLoginFailureEvent sets a failed user login event, with the given -// user id and the optional metadata, as service entry span tags. The exists -// argument allows to distinguish whether the given user id actually exists or -// not. -// The service entry span is obtained through the given Go context which should -// contain the currently running span. This function does nothing when no span -// is found in the given Go context and logs an error message instead. -// Such events trigger the backend-side events monitoring, such as the Account -// Take-Over (ATO) monitoring, ultimately blocking the IP address and/or user id -// associated to them. -func TrackUserLoginFailureEvent(ctx context.Context, uid string, exists bool, md map[string]string) { - span := getRootSpan(ctx) - if span == nil { - return +// TrackUserLoginFailure denotes a failed user login event, which is used by +// back-end side event monitoring, such as Account Take-Over (ATO) monitoring, +// ultimately allowing IP address and/or user ID deny-lists to be configured in +// order to block associated malicious activity. +// +// The login is the username that was provided by the user as part of +// the authentication attempt, and a single user may have multiple different +// logins (i.e; user name, email address, etc...). +// +// The exists argument allows to distinguish whether the user for which a login +// attempt failed exists in the system or not, which is usedul when sifting +// through login activity in search for malicious behavior & compromise. +// +// The provided metata is attached to the failed user login event. +func TrackUserLoginFailure(ctx context.Context, login string, exists bool, md map[string]string) { + telemetry.Count(telemetry.NamespaceAppSec, "sdk.event", []string{"event_type:login_failure", "sdk_version:v2"}).Submit(1) + + // We need to make sure the metadata contains the correct information + md = maps.Clone(md) + if md == nil { + md = make(map[string]string, 2) } - - // We need to do the first call to SetTag ourselves because the map taken by TrackCustomEvent is map[string]string - // and not map [string]any, so the `exists` boolean variable does not fit int - span.SetTag("appsec.events.users.login.failure.usr.exists", exists) - span.SetTag("appsec.events.users.login.failure.usr.id", uid) + md["usr.exists"] = strconv.FormatBool(exists) + md["usr.login"] = login TrackCustomEvent(ctx, "users.login.failure", md) - op, _ := usersec.StartUserLoginOperation(ctx, usersec.UserLoginOperationArgs{}) - op.Finish(usersec.UserLoginOperationRes{UserID: uid, Success: false}) + op, _ := usersec.StartUserLoginOperation(ctx, usersec.UserLoginFailure, usersec.UserLoginOperationArgs{}) + op.Finish(usersec.UserLoginOperationRes{UserLogin: login}) } // TrackCustomEvent sets a custom event as service entry span tags. This span is @@ -122,43 +177,38 @@ func TrackUserLoginFailureEvent(ctx context.Context, uid string, exists bool, md // Such events trigger the backend-side events monitoring ultimately blocking // the IP address and/or user id associated to them. func TrackCustomEvent(ctx context.Context, name string, md map[string]string) { + telemetry.Count(telemetry.NamespaceAppSec, "sdk.event", []string{"event_type:custom", "sdk_version:v1"}).Submit(1) + span := getRootSpan(ctx) if span == nil { return } tagPrefix := "appsec.events." + name + "." - span.SetTag(tagPrefix+"track", true) - span.SetTag(ext.SamplingPriority, ext.PriorityUserKeep) + span.SetTag("_dd."+tagPrefix+"sdk", "true") + span.SetTag(tagPrefix+"track", "true") + span.SetTag(ext.ManualKeep, true) for k, v := range md { span.SetTag(tagPrefix+k, v) } } -// Return the root span from the span stored in the given Go context if it -// implements the Root method. It returns nil otherwise. -func getRootSpan(ctx context.Context) tracer.Span { +// Return the root span from the span stored in the given Go context. +func getRootSpan(ctx context.Context) *tracer.Span { span, _ := tracer.SpanFromContext(ctx) if span == nil { - log.Error("appsec: could not find a span in the given Go context") + log.Warn("appsec: user event monitoring SDK: could not find a span in the provided context.Context") return nil } - type rooter interface { - Root() tracer.Span - } - if lrs, ok := span.(rooter); ok { - return lrs.Root() - } - log.Error("appsec: could not access the root span") - return nil + return span.Root() } -func getSessionID(opts ...tracer.UserMonitoringOption) string { - cfg := &tracer.UserMonitoringConfig{ +func getMetadata(opts []tracer.UserMonitoringOption) (login string, org string, sessionID string) { + cfg := tracer.UserMonitoringConfig{ Metadata: make(map[string]string), } for _, opt := range opts { - opt(cfg) + opt(&cfg) } - return cfg.SessionID + return cfg.Login, cfg.Org, cfg.SessionID } diff --git a/appsec/appsec_test.go b/appsec/appsec_test.go index eb0e4f579a..7ab0a91bb9 100644 --- a/appsec/appsec_test.go +++ b/appsec/appsec_test.go @@ -7,83 +7,144 @@ package appsec_test import ( "context" + "strconv" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - privateAppsec "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + privateAppsec "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func TestTrackUserLoginSuccessEvent(t *testing.T) { +func TestTrackUserLoginSuccess(t *testing.T) { + t.Run("nominal-with-metadata", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") - appsec.TrackUserLoginSuccessEvent(ctx, "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + appsec.TrackUserLoginSuccess(ctx, "user login", "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) span.Finish() // Check the span contains the expected tags. require.Len(t, mt.FinishedSpans(), 1) finished := mt.FinishedSpans()[0] + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + expectedEventPrefix := "appsec.events.users.login.success." - require.Equal(t, true, finished.Tag(expectedEventPrefix+"track")) - require.Equal(t, "user id", finished.Tag("usr.id")) - require.Equal(t, "us-east-1", finished.Tag(expectedEventPrefix+"region")) - require.Equal(t, "username", finished.Tag("usr.name")) + assertTag(t, finished, "_dd."+expectedEventPrefix+"sdk", "true") + assertTag(t, finished, expectedEventPrefix+"track", "true") + assertTag(t, finished, "usr.id", "user id") + assertTag(t, finished, "usr.login", "user login") + assertTag(t, finished, expectedEventPrefix+"region", "us-east-1") + assertTag(t, finished, "usr.name", "username") + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) t.Run("nominal-nil-metadata", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") - appsec.TrackUserLoginSuccessEvent(ctx, "user id", nil) + appsec.TrackUserLoginSuccess(ctx, "user login", "user id", nil) span.Finish() // Check the span contains the expected tags. require.Len(t, mt.FinishedSpans(), 1) finished := mt.FinishedSpans()[0] + + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + expectedEventPrefix := "appsec.events.users.login.success." - require.Equal(t, true, finished.Tag(expectedEventPrefix+"track")) - require.Equal(t, "user id", finished.Tag("usr.id")) + assertTag(t, finished, expectedEventPrefix+"track", "true") + assertTag(t, finished, "usr.id", "user id") + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) t.Run("nil-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + require.NotPanics(t, func() { - appsec.TrackUserLoginSuccessEvent(nil, "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + //lint:ignore SA1012 we are intentionally passing a nil context to verify incorrect use does not lead to panic + appsec.TrackUserLoginSuccess(nil, "user login", "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) }) t.Run("empty-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + require.NotPanics(t, func() { - appsec.TrackUserLoginSuccessEvent(context.Background(), "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + appsec.TrackUserLoginSuccess(context.Background(), "user login", "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) }) } -func TestTrackUserLoginFailureEvent(t *testing.T) { +func TestTrackUserLoginFailure(t *testing.T) { t.Run("nominal", func(t *testing.T) { test := func(userExists bool) func(t *testing.T) { return func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") - appsec.TrackUserLoginFailureEvent(ctx, "user id", userExists, map[string]string{"region": "us-east-1"}) + appsec.TrackUserLoginFailure(ctx, "user login", userExists, map[string]string{"region": "us-east-1"}) span.Finish() // Check the span contains the expected tags. require.Len(t, mt.FinishedSpans(), 1) finished := mt.FinishedSpans()[0] + + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + expectedEventPrefix := "appsec.events.users.login.failure." - require.Equal(t, true, finished.Tag(expectedEventPrefix+"track")) - require.Equal(t, "user id", finished.Tag(expectedEventPrefix+"usr.id")) - require.Equal(t, userExists, finished.Tag(expectedEventPrefix+"usr.exists")) - require.Equal(t, "us-east-1", finished.Tag(expectedEventPrefix+"region")) + assertTag(t, finished, "_dd."+expectedEventPrefix+"sdk", "true") + assertTag(t, finished, expectedEventPrefix+"track", "true") + assertTag(t, finished, expectedEventPrefix+"usr.login", "user login") + assertTag(t, finished, expectedEventPrefix+"usr.exists", strconv.FormatBool(userExists)) + assertTag(t, finished, expectedEventPrefix+"region", "us-east-1") + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_failure,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) } } t.Run("user-exists", test(true)) @@ -91,14 +152,31 @@ func TestTrackUserLoginFailureEvent(t *testing.T) { }) t.Run("nil-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + require.NotPanics(t, func() { - appsec.TrackUserLoginFailureEvent(nil, "user id", false, nil) + //lint:ignore SA1012 we are intentionally passing a nil context to verify incorrect use does not lead to panic + appsec.TrackUserLoginFailure(nil, "user login", false, nil) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_failure,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) }) t.Run("empty-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + require.NotPanics(t, func() { - appsec.TrackUserLoginFailureEvent(context.Background(), "user id", false, nil) + appsec.TrackUserLoginFailure(context.Background(), "user login", false, nil) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_failure,sdk_version:v2"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) }) } @@ -108,6 +186,10 @@ func TestCustomEvent(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") md := map[string]string{"key-1": "value 1", "key-2": "value 2", "key-3": "value 3"} appsec.TrackCustomEvent(ctx, "my-custom-event", md) @@ -116,23 +198,48 @@ func TestCustomEvent(t *testing.T) { // Check the span contains the expected tags. require.Len(t, mt.FinishedSpans(), 1) finished := mt.FinishedSpans()[0] + + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + expectedEventPrefix := "appsec.events.my-custom-event." - require.Equal(t, true, finished.Tag(expectedEventPrefix+"track")) + assertTag(t, finished, expectedEventPrefix+"track", "true") for k, v := range md { - require.Equal(t, v, finished.Tag(expectedEventPrefix+k)) + assertTag(t, finished, expectedEventPrefix+k, v) } + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:custom,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) t.Run("nil-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + require.NotPanics(t, func() { + //lint:ignore SA1012 we are intentionally passing a nil context to verify incorrect use does not lead to panic appsec.TrackCustomEvent(nil, "my-custom-event", nil) }) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:custom,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) t.Run("empty-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + require.NotPanics(t, func() { appsec.TrackCustomEvent(context.Background(), "my-custom-event", nil) }) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:custom,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) }) } @@ -140,10 +247,16 @@ func TestSetUser(t *testing.T) { t.Run("early-return/appsec-disabled", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - span, ctx := tracer.StartSpanFromContext(context.Background(), "example") - defer span.Finish() - err := appsec.SetUser(ctx, "usr.id") - require.NoError(t, err) + + func() { + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + defer span.Finish() + err := appsec.SetUser(ctx, "usr.id") + require.NoError(t, err) + }() + + finished := mt.FinishedSpans()[0] + assertTag(t, finished, "_dd.appsec.user.collection_mode", "sdk") }) privateAppsec.Start() @@ -153,6 +266,7 @@ func TestSetUser(t *testing.T) { } t.Run("early-return/nil-ctx", func(t *testing.T) { + //lint:ignore SA1012 we are intentionally passing a nil context to verify incorrect use does not lead to panic err := appsec.SetUser(nil, "usr.id") require.NoError(t, err) }) @@ -167,23 +281,23 @@ func TestSetUser(t *testing.T) { }) } -func ExampleTrackUserLoginSuccessEvent() { +func ExampleTrackUserLoginSuccess() { // Create an example span and set a user login success appsec event example to it. - span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + span, ctx := tracer.StartSpanFromContext(context.TODO(), "example") defer span.Finish() - appsec.TrackUserLoginSuccessEvent(ctx, "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + appsec.TrackUserLoginSuccess(ctx, "login", "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) } -func ExampleTrackUserLoginFailureEvent() { +func ExampleTrackUserLoginFailure() { // Create an example span and set a user login failure appsec event example to it. - span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + span, ctx := tracer.StartSpanFromContext(context.TODO(), "example") defer span.Finish() - appsec.TrackUserLoginFailureEvent(ctx, "user id", false, nil) + appsec.TrackUserLoginFailure(ctx, "login", false, nil) } func ExampleTrackCustomEvent() { // Create an example span and set a custom appsec event example to it. - span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + span, ctx := tracer.StartSpanFromContext(context.TODO(), "example") defer span.Finish() appsec.TrackCustomEvent(ctx, "my-custom-event", map[string]string{"region": "us-east-1"}) diff --git a/appsec/appsecv1.go b/appsec/appsecv1.go new file mode 100644 index 0000000000..627c30fd17 --- /dev/null +++ b/appsec/appsecv1.go @@ -0,0 +1,70 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +package appsec + +import ( + "context" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/usersec" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +// TrackUserLoginSuccessEvent sets a successful user login event, with the given +// user id and optional metadata, as service entry span tags. It also calls +// SetUser() to set the currently authenticated user, along with the given +// tracer.UserMonitoringOption options. As documented in SetUser(), an +// error is returned when the given user ID is blocked by your denylist. Cf. +// SetUser()'s documentation for more details. +// The service entry span is obtained through the given Go context which should +// contain the currently running span. This function does nothing when no span +// is found in the given Go context and logs an error message instead. +// Such events trigger the backend-side events monitoring, such as the Account +// Take-Over (ATO) monitoring, ultimately blocking the IP address and/or user id +// associated to them. +// +// Deprecated: use [TrackUserLoginSuccess] instead. It requires collection of +// the user login, which is useful for detecting account takeover attacks. +func TrackUserLoginSuccessEvent(ctx context.Context, uid string, md map[string]string, opts ...tracer.UserMonitoringOption) error { + telemetry.Count(telemetry.NamespaceAppSec, "sdk.event", []string{"event_type:login_success", "sdk_version:v1"}).Submit(1) + + login, _, _ := getMetadata(opts) + return TrackUserLoginSuccess(ctx, login, uid, md, opts...) +} + +// TrackUserLoginFailureEvent sets a failed user login event, with the given +// user id and the optional metadata, as service entry span tags. The exists +// argument allows to distinguish whether the given user id actually exists or +// not. +// The service entry span is obtained through the given Go context which should +// contain the currently running span. This function does nothing when no span +// is found in the given Go context and logs an error message instead. +// Such events trigger the backend-side events monitoring, such as the Account +// Take-Over (ATO) monitoring, ultimately blocking the IP address and/or user id +// associated to them. +// +// Deprecated: use [TrackUserLoginFailure] instead. It collects the user login, +// which is what is available during a failed login attempt, instead of the user +// ID, which is oftern not (especially when the user does not exist). +func TrackUserLoginFailureEvent(ctx context.Context, uid string, exists bool, md map[string]string) { + telemetry.Count(telemetry.NamespaceAppSec, "sdk.event", []string{"event_type:login_failure", "sdk_version:v1"}).Submit(1) + + span := getRootSpan(ctx) + if span == nil { + return + } + + // We need to do the first call to SetTag ourselves because the map taken by TrackCustomEvent is map[string]string + // and not map [string]any, so the `exists` boolean variable does not fit int + span.SetTag("appsec.events.users.login.failure.usr.exists", strconv.FormatBool(exists)) + span.SetTag("appsec.events.users.login.failure.usr.id", uid) + + TrackCustomEvent(ctx, "users.login.failure", md) + + op, _ := usersec.StartUserLoginOperation(ctx, usersec.UserLoginFailure, usersec.UserLoginOperationArgs{}) + op.Finish(usersec.UserLoginOperationRes{UserID: uid}) +} diff --git a/appsec/appsecv1_test.go b/appsec/appsecv1_test.go new file mode 100644 index 0000000000..b4f2b46af8 --- /dev/null +++ b/appsec/appsecv1_test.go @@ -0,0 +1,183 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +package appsec_test + +import ( + "context" + "strconv" + "testing" + + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestTrackUserLoginSuccessEvent(t *testing.T) { + t.Run("nominal-with-metadata", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + appsec.TrackUserLoginSuccessEvent(ctx, "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + span.Finish() + + // Check the span contains the expected tags. + require.Len(t, mt.FinishedSpans(), 1) + finished := mt.FinishedSpans()[0] + + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + + expectedEventPrefix := "appsec.events.users.login.success." + assertTag(t, finished, "_dd."+expectedEventPrefix+"sdk", "true") + assertTag(t, finished, expectedEventPrefix+"track", "true") + assertTag(t, finished, "usr.id", "user id") + assertTag(t, finished, expectedEventPrefix+"region", "us-east-1") + assertTag(t, finished, "usr.name", "username") + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + }) + + t.Run("nominal-nil-metadata", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + appsec.TrackUserLoginSuccessEvent(ctx, "user id", nil) + span.Finish() + + // Check the span contains the expected tags. + require.Len(t, mt.FinishedSpans(), 1) + finished := mt.FinishedSpans()[0] + + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + + expectedEventPrefix := "appsec.events.users.login.success." + assertTag(t, finished, expectedEventPrefix+"track", "true") + assertTag(t, finished, "usr.id", "user id") + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + }) + + t.Run("nil-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + require.NotPanics(t, func() { + //lint:ignore SA1012 we are intentionally passing a nil context to verify incorrect use does not lead to panic + appsec.TrackUserLoginSuccessEvent(nil, "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + }) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + }) + + t.Run("empty-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + require.NotPanics(t, func() { + appsec.TrackUserLoginSuccessEvent(context.Background(), "user id", map[string]string{"region": "us-east-1"}, tracer.WithUserName("username")) + }) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_success,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + }) +} + +func TestTrackUserLoginFailureEvent(t *testing.T) { + t.Run("nominal", func(t *testing.T) { + test := func(userExists bool) func(t *testing.T) { + return func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + span, ctx := tracer.StartSpanFromContext(context.Background(), "example") + appsec.TrackUserLoginFailureEvent(ctx, "user id", userExists, map[string]string{"region": "us-east-1"}) + span.Finish() + + // Check the span contains the expected tags. + require.Len(t, mt.FinishedSpans(), 1) + finished := mt.FinishedSpans()[0] + + sp, _ := finished.Context().SamplingPriority() + assert.Equal(t, ext.PriorityUserKeep, sp, "span should have user keep (%d) priority (has: %d)", ext.PriorityUserKeep, sp) + + expectedEventPrefix := "appsec.events.users.login.failure." + assertTag(t, finished, "_dd."+expectedEventPrefix+"sdk", "true") + assertTag(t, finished, expectedEventPrefix+"track", "true") + assertTag(t, finished, expectedEventPrefix+"usr.id", "user id") + assertTag(t, finished, expectedEventPrefix+"usr.exists", strconv.FormatBool(userExists)) + assertTag(t, finished, expectedEventPrefix+"region", "us-east-1") + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_failure,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + } + } + t.Run("user-exists", test(true)) + t.Run("user-not-exists", test(false)) + }) + + t.Run("nil-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + require.NotPanics(t, func() { + //lint:ignore SA1012 we are intentionally passing a nil context to verify incorrect use does not lead to panic + appsec.TrackUserLoginFailureEvent(nil, "user id", false, nil) + }) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_failure,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + }) + + t.Run("empty-context", func(t *testing.T) { + var telemetryRecorder telemetrytest.RecordClient + restoreTelemetry := telemetry.MockClient(&telemetryRecorder) + defer restoreTelemetry() + + require.NotPanics(t, func() { + appsec.TrackUserLoginFailureEvent(context.Background(), "user id", false, nil) + }) + + metric := telemetryRecorder.Metrics[telemetrytest.MetricKey{Namespace: telemetry.NamespaceAppSec, Name: "sdk.event", Kind: "count", Tags: "event_type:login_failure,sdk_version:v1"}] + require.NotNil(t, metric) + assert.EqualValues(t, 1, metric.Get()) + }) +} + +func assertTag(t *testing.T, span *mocktracer.Span, tag string, value any) bool { + return assert.EqualValues(t, value, span.Tag(tag), "span tag %q should have value %#v", tag, value) +} diff --git a/appsec/example_test.go b/appsec/example_test.go deleted file mode 100644 index c0b238a789..0000000000 --- a/appsec/example_test.go +++ /dev/null @@ -1,81 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. - -package appsec_test - -import ( - "encoding/json" - "io" - "net/http" - - "gopkg.in/DataDog/dd-trace-go.v1/appsec" - echotrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/labstack/echo.v4" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - - "github.com/labstack/echo/v4" -) - -type parsedBodyType struct { - Value string `json:"value"` -} - -func customBodyParser(body io.ReadCloser) (*parsedBodyType, error) { - var parsedBody parsedBodyType - err := json.NewDecoder(body).Decode(&parsedBody) - return &parsedBody, err -} - -// Monitor HTTP request parsed body -func ExampleMonitorParsedHTTPBody() { - mux := httptrace.NewServeMux() - mux.HandleFunc("/body", func(w http.ResponseWriter, r *http.Request) { - // Use the SDK to monitor the request's parsed body - body, err := customBodyParser(r.Body) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - appsec.MonitorParsedHTTPBody(r.Context(), body) - w.Write([]byte("Body monitored using AppSec SDK\n")) - }) - http.ListenAndServe(":8080", mux) -} - -// Monitor HTTP request parsed body with a framework customized context type -func ExampleMonitorParsedHTTPBody_customContext() { - r := echo.New() - r.Use(echotrace.Middleware()) - r.POST("/body", func(c echo.Context) (e error) { - req := c.Request() - body, err := customBodyParser(req.Body) - if err != nil { - return c.String(http.StatusInternalServerError, err.Error()) - } - // Use the SDK to monitor the request's parsed body - appsec.MonitorParsedHTTPBody(c.Request().Context(), body) - return c.String(http.StatusOK, "Body monitored using AppSec SDK") - }) - - r.Start(":8080") -} - -func userIDFromRequest(r *http.Request) string { - return r.Header.Get("user-id") -} - -// Monitor and block requests depending on user ID -func ExampleSetUser() { - mux := httptrace.NewServeMux() - mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { - // We use SetUser() here to associate the user ID to the request's span. The return value - // can then be checked to decide whether to block the request or not. - // If it should be blocked, early exit from the handler. - if err := appsec.SetUser(r.Context(), userIDFromRequest(r)); err != nil { - return - } - - w.Write([]byte("User monitored using AppSec SetUser SDK\n")) - }) -} diff --git a/civisibility/linker.go b/civisibility/linker.go new file mode 100644 index 0000000000..fdfb8704f0 --- /dev/null +++ b/civisibility/linker.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +//nolint:revive +package civisibility + +// Let's import all the internal package so we can enable the go:linkname directive over the internal packages +// This will be useful for dogfooding in dd-go by using a shim package that will call the internal package +import ( + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting/coverage" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" +) diff --git a/contrib/99designs/gqlgen/appsec_test.go b/contrib/99designs/gqlgen/appsec_test.go index 5128530b10..5b69ed5cac 100644 --- a/contrib/99designs/gqlgen/appsec_test.go +++ b/contrib/99designs/gqlgen/appsec_test.go @@ -12,17 +12,18 @@ import ( "os" "path" "testing" + "time" "github.com/99designs/gqlgen/client" "github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/graphql/handler" "github.com/99designs/gqlgen/graphql/handler/transport" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/require" "github.com/vektah/gqlparser/v2" "github.com/vektah/gqlparser/v2/ast" "github.com/vektah/gqlparser/v2/gqlerror" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" ) func TestAppSec(t *testing.T) { @@ -106,7 +107,7 @@ func TestAppSec(t *testing.T) { // The last finished span (which is GraphQL entry) should have the "_dd.appsec.enabled" tag. span := spans[len(spans)-1] - require.Equal(t, 1, span.Tag("_dd.appsec.enabled")) + require.Equal(t, float64(1), span.Tag("_dd.appsec.enabled")) type ddAppsecJSON struct { Triggers []struct { @@ -132,6 +133,44 @@ func TestAppSec(t *testing.T) { }) } }) + + t.Run("subscription", func(t *testing.T) { + schema := gqlparser.MustLoadSchema(&ast.Source{Input: `type Time { + unixTime: Int! + } + type Subscription { + currentTime: Time! + }`}) + + server := handler.New(&graphql.ExecutableSchemaMock{ + ExecFunc: execSubscriptionFunc, + SchemaFunc: func() *ast.Schema { return schema }, + }) + server.Use(NewTracer()) + server.AddTransport(transport.Websocket{}) + + client := client.New(server) + + mt := mocktracer.Start() + defer mt.Stop() + + now := time.Now().Unix() + sub := client.Websocket(`subscription { currentTime { unixTime } }`) + var resp struct { + CurrentTime struct { + UnixTime int64 `json:"unixTime"` + } `json:"currentTime"` + } + require.NoError(t, sub.Next(&resp)) + require.LessOrEqual(t, now, resp.CurrentTime.UnixTime) + require.NoError(t, sub.Close()) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3) + require.Equal(t, "graphql.read", spans[0].OperationName()) + require.Equal(t, "graphql.parse", spans[1].OperationName()) + require.Equal(t, "graphql.validate", spans[2].OperationName()) + }) } type appSecQuery struct{} @@ -232,12 +271,11 @@ func enableAppSec(t *testing.T) func() { require.NoError(t, err) t.Setenv("DD_APPSEC_ENABLED", "1") t.Setenv("DD_APPSEC_RULES", rulesFile) - appsec.Start() + testutils.StartAppSec(t) cleanup := func() { - appsec.Stop() _ = os.RemoveAll(tmpDir) } - if !appsec.Enabled() { + if !instr.AppSecEnabled() { cleanup() t.Skip("could not enable appsec: this platform is likely not supported") } @@ -263,7 +301,7 @@ func execFunc(ctx context.Context) graphql.ResponseHandler { Field: field, Args: field.ArgumentMap(op.Variables), }) - fieldVal, err := op.ResolverMiddleware(ctx, func(ctx context.Context) (any, error) { + fieldVal, err := op.ResolverMiddleware(ctx, func(_ context.Context) (any, error) { switch field.Name { case "topLevel": arg := field.Arguments.ForName("id") @@ -298,7 +336,7 @@ func execFunc(ctx context.Context) graphql.ResponseHandler { Field: nested, Args: nested.ArgumentMap(op.Variables), }) - nestedVal, err := op.ResolverMiddleware(ctx, func(ctx context.Context) (any, error) { + nestedVal, err := op.ResolverMiddleware(ctx, func(_ context.Context) (any, error) { switch nested.Name { case "nested": arg := nested.Arguments.ForName("id") @@ -330,3 +368,32 @@ func execFunc(ctx context.Context) graphql.ResponseHandler { return graphql.OneShot(graphql.ErrorResponse(ctx, "not implemented")) } } + +func execSubscriptionFunc(ctx context.Context) graphql.ResponseHandler { + op := graphql.GetOperationContext(ctx) + + if op.Operation.Operation != ast.Subscription { + return graphql.OneShot(graphql.ErrorResponse(ctx, "not implemented")) + } + + return func(ctx context.Context) *graphql.Response { + fields := graphql.CollectFields(op, op.Operation.SelectionSet, []string{"Subscription"}) + resp := make(map[string]any) + for _, field := range fields { + switch field.Name { + case "currentTime": + resp["currentTime"] = map[string]int64{ + "unixTime": time.Now().Unix(), + } + default: + return graphql.ErrorResponse(ctx, "unknown field: %s", field.Name) + } + } + + data, err := json.Marshal(resp) + if err != nil { + return graphql.ErrorResponse(ctx, "failed to marshal response: %v", err) + } + return &graphql.Response{Data: data} + } +} diff --git a/contrib/99designs/gqlgen/example_test.go b/contrib/99designs/gqlgen/example_test.go index e6d11b3fc2..9af60f7485 100644 --- a/contrib/99designs/gqlgen/example_test.go +++ b/contrib/99designs/gqlgen/example_test.go @@ -3,9 +3,28 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2022 Datadog, Inc. -// Package gqlgen provides functions to trace the 99designs/gqlgen package (https://github.com/99designs/gqlgen). package gqlgen_test -// The example was moved into the package godoc to avoid adding its dependencies into dd-trace-go's go.mod file, -// where github.com/BurntSushi/toml would be upgraded to v1, which breaks existing users of the v0, like this is the -// case at Datadog's backend. Such code examples shouldn't introduce breaking changes to dd-trace-go's go.mod file. +import ( + "log" + "net/http" + + "github.com/99designs/gqlgen/graphql/handler/testserver" + + gqlgentrace "github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func Example() { + tracer.Start() + defer tracer.Stop() + + t := gqlgentrace.NewTracer( + gqlgentrace.WithAnalytics(true), + gqlgentrace.WithService("todo.server"), + ) + h := testserver.New() // replace with your own actual server + h.Use(t) + http.Handle("/query", h) + log.Fatal(http.ListenAndServe(":8080", nil)) +} diff --git a/contrib/99designs/gqlgen/go.mod b/contrib/99designs/gqlgen/go.mod new file mode 100644 index 0000000000..a3af4a1b94 --- /dev/null +++ b/contrib/99designs/gqlgen/go.mod @@ -0,0 +1,98 @@ +module github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 + +go 1.24.0 + +require ( + github.com/99designs/gqlgen v0.17.72 + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/vektah/gqlparser/v2 v2.5.25 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/agnivade/levenshtein v1.2.1 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/sosodev/duration v1.3.1 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/99designs/gqlgen/go.sum b/contrib/99designs/gqlgen/go.sum new file mode 100644 index 0000000000..0a1645397c --- /dev/null +++ b/contrib/99designs/gqlgen/go.sum @@ -0,0 +1,329 @@ +github.com/99designs/gqlgen v0.17.72 h1:2JDAuutIYtAN26BAtigfLZFnTN53fpYbIENL8bVgAKY= +github.com/99designs/gqlgen v0.17.72/go.mod h1:BoL4C3j9W2f95JeWMrSArdDNGWmZB9MOS2EMHJDZmUc= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vektah/gqlparser/v2 v2.5.25 h1:FmWtFEa+invTIzWlWK6Vk7BVEZU/97QBzeI8Z1JjGt8= +github.com/vektah/gqlparser/v2 v2.5.25/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/99designs/gqlgen/internal/testserver/gqlgen.yml b/contrib/99designs/gqlgen/internal/testserver/gqlgen.yml new file mode 100644 index 0000000000..30063dd027 --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/gqlgen.yml @@ -0,0 +1,87 @@ +# Where are all the schema files located? globs are supported eg src/**/*.graphqls +schema: + - graph/*.graphqls + +# Where should the generated server code go? +exec: + filename: graph/generated.go + package: graph + +# Uncomment to enable federation +# federation: +# filename: graph/federation.go +# package: graph + +# Where should any generated models go? +model: + filename: graph/model/models_gen.go + package: model + +# Where should the resolver implementations go? +resolver: + layout: follow-schema + dir: graph + package: graph + filename_template: "{name}.resolvers.go" + # Optional: turn on to not generate template comments above resolvers + # omit_template_comment: false + +# Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models +# struct_tag: json + +# Optional: turn on to use []Thing instead of []*Thing +# omit_slice_element_pointers: false + +# Optional: turn on to omit Is() methods to interface and unions +# omit_interface_checks : true + +# Optional: turn on to skip generation of ComplexityRoot struct content and Complexity function +# omit_complexity: false + +# Optional: turn on to not generate any file notice comments in generated files +# omit_gqlgen_file_notice: false + +# Optional: turn on to exclude the gqlgen version in the generated file notice. No effect if `omit_gqlgen_file_notice` is true. +# omit_gqlgen_version_in_file_notice: false + +# Optional: turn off to make struct-type struct fields not use pointers +# e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing } +# struct_fields_always_pointers: true + +# Optional: turn off to make resolvers return values instead of pointers for structs +# resolvers_always_return_pointers: true + +# Optional: turn on to return pointers instead of values in unmarshalInput +# return_pointers_in_unmarshalinput: false + +# Optional: wrap nullable input fields with Omittable +# nullable_input_omittable: true + +# Optional: set to speed up generation time by not performing a final validation pass. +# skip_validation: true + +# Optional: set to skip running `go mod tidy` when generating server code +# skip_mod_tidy: true + +# gqlgen will search for any type names in the schema in these go packages +# if they match it will use them, otherwise it will generate them. +autobind: +# - "github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2/internal/testserver/graph/model" + +# This section declares type mapping between the GraphQL and go type systems +# +# The first line in each type will be used as defaults for resolver arguments and +# modelgen, the others will be allowed when binding to fields. Configure them to +# your liking +models: + ID: + model: + - github.com/99designs/gqlgen/graphql.ID + - github.com/99designs/gqlgen/graphql.Int + - github.com/99designs/gqlgen/graphql.Int64 + - github.com/99designs/gqlgen/graphql.Int32 + Int: + model: + - github.com/99designs/gqlgen/graphql.Int + - github.com/99designs/gqlgen/graphql.Int64 + - github.com/99designs/gqlgen/graphql.Int32 diff --git a/contrib/99designs/gqlgen/internal/testserver/graph/generated.go b/contrib/99designs/gqlgen/internal/testserver/graph/generated.go new file mode 100644 index 0000000000..c63d35e79b --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/graph/generated.go @@ -0,0 +1,3420 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. + +package graph + +import ( + "bytes" + "context" + "embed" + "errors" + "fmt" + "strconv" + "sync" + "sync/atomic" + + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/introspection" + gqlparser "github.com/vektah/gqlparser/v2" + "github.com/vektah/gqlparser/v2/ast" +) + +// region ************************** generated!.gotpl ************************** + +// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + schema: cfg.Schema, + resolvers: cfg.Resolvers, + directives: cfg.Directives, + complexity: cfg.Complexity, + } +} + +type Config struct { + Schema *ast.Schema + Resolvers ResolverRoot + Directives DirectiveRoot + Complexity ComplexityRoot +} + +type ResolverRoot interface { + Query() QueryResolver +} + +type DirectiveRoot struct { +} + +type ComplexityRoot struct { + Query struct { + WithError func(childComplexity int) int + } +} + +type QueryResolver interface { + WithError(ctx context.Context) (*string, error) +} + +type executableSchema struct { + schema *ast.Schema + resolvers ResolverRoot + directives DirectiveRoot + complexity ComplexityRoot +} + +func (e *executableSchema) Schema() *ast.Schema { + if e.schema != nil { + return e.schema + } + return parsedSchema +} + +func (e *executableSchema) Complexity(ctx context.Context, typeName, field string, childComplexity int, rawArgs map[string]any) (int, bool) { + ec := executionContext{nil, e, 0, 0, nil} + _ = ec + switch typeName + "." + field { + + case "Query.withError": + if e.complexity.Query.WithError == nil { + break + } + + return e.complexity.Query.WithError(childComplexity), true + + } + return 0, false +} + +func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { + opCtx := graphql.GetOperationContext(ctx) + ec := executionContext{opCtx, e, 0, 0, make(chan graphql.DeferredResult)} + inputUnmarshalMap := graphql.BuildUnmarshalerMap() + first := true + + switch opCtx.Operation.Operation { + case ast.Query: + return func(ctx context.Context) *graphql.Response { + var response graphql.Response + var data graphql.Marshaler + if first { + first = false + ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) + data = ec._Query(ctx, opCtx.Operation.SelectionSet) + } else { + if atomic.LoadInt32(&ec.pendingDeferred) > 0 { + result := <-ec.deferredResults + atomic.AddInt32(&ec.pendingDeferred, -1) + data = result.Result + response.Path = result.Path + response.Label = result.Label + response.Errors = result.Errors + } else { + return nil + } + } + var buf bytes.Buffer + data.MarshalGQL(&buf) + response.Data = buf.Bytes() + if atomic.LoadInt32(&ec.deferred) > 0 { + hasNext := atomic.LoadInt32(&ec.pendingDeferred) > 0 + response.HasNext = &hasNext + } + + return &response + } + + default: + return graphql.OneShot(graphql.ErrorResponse(ctx, "unsupported GraphQL operation")) + } +} + +type executionContext struct { + *graphql.OperationContext + *executableSchema + deferred int32 + pendingDeferred int32 + deferredResults chan graphql.DeferredResult +} + +func (ec *executionContext) processDeferredGroup(dg graphql.DeferredGroup) { + atomic.AddInt32(&ec.pendingDeferred, 1) + go func() { + ctx := graphql.WithFreshResponseContext(dg.Context) + dg.FieldSet.Dispatch(ctx) + ds := graphql.DeferredResult{ + Path: dg.Path, + Label: dg.Label, + Result: dg.FieldSet, + Errors: graphql.GetErrors(ctx), + } + // null fields should bubble up + if dg.FieldSet.Invalids > 0 { + ds.Result = graphql.Null + } + ec.deferredResults <- ds + }() +} + +func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { + if ec.DisableIntrospection { + return nil, errors.New("introspection disabled") + } + return introspection.WrapSchema(ec.Schema()), nil +} + +func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { + if ec.DisableIntrospection { + return nil, errors.New("introspection disabled") + } + return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil +} + +//go:embed "schema.graphqls" +var sourcesFS embed.FS + +func sourceData(filename string) string { + data, err := sourcesFS.ReadFile(filename) + if err != nil { + panic(fmt.Sprintf("codegen problem: %s not available", filename)) + } + return string(data) +} + +var sources = []*ast.Source{ + {Name: "schema.graphqls", Input: sourceData("schema.graphqls"), BuiltIn: false}, +} +var parsedSchema = gqlparser.MustLoadSchema(sources...) + +// endregion ************************** generated!.gotpl ************************** + +// region ***************************** args.gotpl ***************************** + +func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_Query___type_argsName(ctx, rawArgs) + if err != nil { + return nil, err + } + args["name"] = arg0 + return args, nil +} +func (ec *executionContext) field_Query___type_argsName( + ctx context.Context, + rawArgs map[string]any, +) (string, error) { + if _, ok := rawArgs["name"]; !ok { + var zeroVal string + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + if tmp, ok := rawArgs["name"]; ok { + return ec.unmarshalNString2string(ctx, tmp) + } + + var zeroVal string + return zeroVal, nil +} + +func (ec *executionContext) field___Directive_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Directive_args_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Directive_args_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (*bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal *bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + } + + var zeroVal *bool + return zeroVal, nil +} + +func (ec *executionContext) field___Field_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Field_args_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Field_args_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (*bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal *bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + } + + var zeroVal *bool + return zeroVal, nil +} + +func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Type_enumValues_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Type_enumValues_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2bool(ctx, tmp) + } + + var zeroVal bool + return zeroVal, nil +} + +func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Type_fields_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Type_fields_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2bool(ctx, tmp) + } + + var zeroVal bool + return zeroVal, nil +} + +// endregion ***************************** args.gotpl ***************************** + +// region ************************** directives.gotpl ************************** + +// endregion ************************** directives.gotpl ************************** + +// region **************************** field.gotpl ***************************** + +func (ec *executionContext) _Query_withError(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_withError(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().WithError(rctx) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOID2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_withError(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type ID does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.introspectType(fc.Args["name"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___schema(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.introspectSchema() + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) + fc.Result = res + return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "description": + return ec.fieldContext___Schema_description(ctx, field) + case "types": + return ec.fieldContext___Schema_types(ctx, field) + case "queryType": + return ec.fieldContext___Schema_queryType(ctx, field) + case "mutationType": + return ec.fieldContext___Schema_mutationType(ctx, field) + case "subscriptionType": + return ec.fieldContext___Schema_subscriptionType(ctx, field) + case "directives": + return ec.fieldContext___Schema_directives(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_isRepeatable(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsRepeatable, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_locations(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]string) + fc.Result = res + return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type __DirectiveLocation does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_args(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Directive_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_args(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Field_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_defaultValue(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_types(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_queryType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_mutationType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_subscriptionType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_directives(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.Directive) + fc.Result = res + return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Directive_name(ctx, field) + case "description": + return ec.fieldContext___Directive_description(ctx, field) + case "isRepeatable": + return ec.fieldContext___Directive_isRepeatable(ctx, field) + case "locations": + return ec.fieldContext___Directive_locations(ctx, field) + case "args": + return ec.fieldContext___Directive_args(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_kind(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalN__TypeKind2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type __TypeKind does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_specifiedByURL(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.SpecifiedByURL(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_fields(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) + fc.Result = res + return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Field_name(ctx, field) + case "description": + return ec.fieldContext___Field_description(ctx, field) + case "args": + return ec.fieldContext___Field_args(ctx, field) + case "type": + return ec.fieldContext___Field_type(ctx, field) + case "isDeprecated": + return ec.fieldContext___Field_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___Field_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_interfaces(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_possibleTypes(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_enumValues(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) + fc.Result = res + return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___EnumValue_name(ctx, field) + case "description": + return ec.fieldContext___EnumValue_description(ctx, field) + case "isDeprecated": + return ec.fieldContext___EnumValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___EnumValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_inputFields(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_ofType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_isOneOf(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsOneOf(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalOBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +// endregion **************************** field.gotpl ***************************** + +// region **************************** input.gotpl ***************************** + +// endregion **************************** input.gotpl ***************************** + +// region ************************** interface.gotpl *************************** + +// endregion ************************** interface.gotpl *************************** + +// region **************************** object.gotpl **************************** + +var queryImplementors = []string{"Query"} + +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors) + ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ + Object: "Query", + }) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ + Object: field.Name, + Field: field, + }) + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Query") + case "withError": + field := field + + innerFunc := func(ctx context.Context, _ *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_withError(ctx, field) + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "__type": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Query___type(ctx, field) + }) + case "__schema": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Query___schema(ctx, field) + }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __DirectiveImplementors = []string{"__Directive"} + +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Directive") + case "name": + out.Values[i] = ec.___Directive_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___Directive_description(ctx, field, obj) + case "isRepeatable": + out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "locations": + out.Values[i] = ec.___Directive_locations(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "args": + out.Values[i] = ec.___Directive_args(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __EnumValueImplementors = []string{"__EnumValue"} + +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__EnumValue") + case "name": + out.Values[i] = ec.___EnumValue_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___EnumValue_description(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __FieldImplementors = []string{"__Field"} + +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Field") + case "name": + out.Values[i] = ec.___Field_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___Field_description(ctx, field, obj) + case "args": + out.Values[i] = ec.___Field_args(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "type": + out.Values[i] = ec.___Field_type(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "isDeprecated": + out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __InputValueImplementors = []string{"__InputValue"} + +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__InputValue") + case "name": + out.Values[i] = ec.___InputValue_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___InputValue_description(ctx, field, obj) + case "type": + out.Values[i] = ec.___InputValue_type(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "defaultValue": + out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___InputValue_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___InputValue_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __SchemaImplementors = []string{"__Schema"} + +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Schema") + case "description": + out.Values[i] = ec.___Schema_description(ctx, field, obj) + case "types": + out.Values[i] = ec.___Schema_types(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "queryType": + out.Values[i] = ec.___Schema_queryType(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "mutationType": + out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) + case "subscriptionType": + out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) + case "directives": + out.Values[i] = ec.___Schema_directives(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __TypeImplementors = []string{"__Type"} + +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Type") + case "kind": + out.Values[i] = ec.___Type_kind(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "name": + out.Values[i] = ec.___Type_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___Type_description(ctx, field, obj) + case "specifiedByURL": + out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj) + case "fields": + out.Values[i] = ec.___Type_fields(ctx, field, obj) + case "interfaces": + out.Values[i] = ec.___Type_interfaces(ctx, field, obj) + case "possibleTypes": + out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) + case "enumValues": + out.Values[i] = ec.___Type_enumValues(ctx, field, obj) + case "inputFields": + out.Values[i] = ec.___Type_inputFields(ctx, field, obj) + case "ofType": + out.Values[i] = ec.___Type_ofType(ctx, field, obj) + case "isOneOf": + out.Values[i] = ec.___Type_isOneOf(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +// endregion **************************** object.gotpl **************************** + +// region ***************************** type.gotpl ***************************** + +func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v any) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + res := graphql.MarshalBoolean(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalNString2string(ctx context.Context, v any) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx context.Context, sel ast.SelectionSet, v introspection.Directive) graphql.Marshaler { + return ec.___Directive(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Directive) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) unmarshalN__DirectiveLocation2string(ctx context.Context, v any) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalN__DirectiveLocation2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) { + var vSlice []any + vSlice = graphql.CoerceList(v) + var err error + res := make([]string, len(vSlice)) + for i := range vSlice { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) + res[i], err = ec.unmarshalN__DirectiveLocation2string(ctx, vSlice[i]) + if err != nil { + return nil, err + } + } + return res, nil +} + +func (ec *executionContext) marshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__DirectiveLocation2string(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx context.Context, sel ast.SelectionSet, v introspection.EnumValue) graphql.Marshaler { + return ec.___EnumValue(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx context.Context, sel ast.SelectionSet, v introspection.Field) graphql.Marshaler { + return ec.___Field(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx context.Context, sel ast.SelectionSet, v introspection.InputValue) graphql.Marshaler { + return ec.___InputValue(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v introspection.Type) graphql.Marshaler { + return ec.___Type(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec.___Type(ctx, sel, v) +} + +func (ec *executionContext) unmarshalN__TypeKind2string(ctx context.Context, v any) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalOBoolean2bool(ctx context.Context, v any) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + res := graphql.MarshalBoolean(v) + return res +} + +func (ec *executionContext) unmarshalOBoolean2ᚖbool(ctx context.Context, v any) (*bool, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalBoolean(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast.SelectionSet, v *bool) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalBoolean(*v) + return res +} + +func (ec *executionContext) unmarshalOID2ᚖstring(ctx context.Context, v any) (*string, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalID(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOID2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalID(*v) + return res +} + +func (ec *executionContext) unmarshalOString2ᚖstring(ctx context.Context, v any) (*string, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalString(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalString(*v) + return res +} + +func (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Field) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx context.Context, sel ast.SelectionSet, v *introspection.Schema) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec.___Schema(ctx, sel, v) +} + +func (ec *executionContext) marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec.___Type(ctx, sel, v) +} + +// endregion ***************************** type.gotpl ***************************** diff --git a/contrib/99designs/gqlgen/internal/testserver/graph/model/model.go b/contrib/99designs/gqlgen/internal/testserver/graph/model/model.go new file mode 100644 index 0000000000..c79315a155 --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/graph/model/model.go @@ -0,0 +1,6 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package model diff --git a/contrib/99designs/gqlgen/internal/testserver/graph/model/models_gen.go b/contrib/99designs/gqlgen/internal/testserver/graph/model/models_gen.go new file mode 100644 index 0000000000..a278682bbe --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/graph/model/models_gen.go @@ -0,0 +1,11 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. + +package model + +type Query struct { +} diff --git a/contrib/99designs/gqlgen/internal/testserver/graph/resolver.go b/contrib/99designs/gqlgen/internal/testserver/graph/resolver.go new file mode 100644 index 0000000000..bef27a4ac9 --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/graph/resolver.go @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package graph + +// This file will not be regenerated automatically. +// +// It serves as dependency injection for your app, add any dependencies you require here. + +type Resolver struct{} diff --git a/contrib/99designs/gqlgen/internal/testserver/graph/schema.graphqls b/contrib/99designs/gqlgen/internal/testserver/graph/schema.graphqls new file mode 100644 index 0000000000..fc8eae9223 --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/graph/schema.graphqls @@ -0,0 +1,7 @@ +# GraphQL schema example +# +# https://gqlgen.com/getting-started/ + +type Query { + withError: ID +} diff --git a/contrib/99designs/gqlgen/internal/testserver/graph/schema.resolvers.go b/contrib/99designs/gqlgen/internal/testserver/graph/schema.resolvers.go new file mode 100644 index 0000000000..11a079babd --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/graph/schema.resolvers.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package graph + +// This file will be automatically regenerated based on the schema, any resolver implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.72 + +import ( + "context" + + "github.com/vektah/gqlparser/v2/gqlerror" +) + +// WithError is the resolver for the withError field. +func (r *queryResolver) WithError(ctx context.Context) (*string, error) { + return nil, &gqlerror.Error{ + Message: "test error", + Extensions: map[string]any{ + "int": 1, + "float": 1.1, + "str": "1", + "bool": true, + "slice": []string{"1", "2"}, + "unsupported_type_stringified": []any{1, "foo"}, + "not_captured": "nope", + }, + } +} + +// Query returns QueryResolver implementation. +func (r *Resolver) Query() QueryResolver { return &queryResolver{r} } + +type queryResolver struct{ *Resolver } diff --git a/contrib/99designs/gqlgen/internal/testserver/server.go b/contrib/99designs/gqlgen/internal/testserver/server.go new file mode 100644 index 0000000000..e1b339d620 --- /dev/null +++ b/contrib/99designs/gqlgen/internal/testserver/server.go @@ -0,0 +1,35 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package testserver + +//go:generate go run github.com/99designs/gqlgen generate + +import ( + "testing" + + "github.com/99designs/gqlgen/client" + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/handler" + "github.com/99designs/gqlgen/graphql/handler/transport" + + "github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2/internal/testserver/graph" +) + +func New(t *testing.T, tracer graphql.HandlerExtension) (*handler.Server, *client.Client) { + t.Helper() + + h := handler.New(graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{}})) + + h.AddTransport(transport.Options{}) + h.AddTransport(transport.GET{}) + h.AddTransport(transport.POST{}) + + if tracer != nil { + h.Use(tracer) + } + + return h, client.New(h) +} diff --git a/contrib/99designs/gqlgen/option.go b/contrib/99designs/gqlgen/option.go index 194ba3f4a2..2aedd8af04 100644 --- a/contrib/99designs/gqlgen/option.go +++ b/contrib/99designs/gqlgen/option.go @@ -6,33 +6,45 @@ package gqlgen import ( + "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/99designs/gqlgen/graphql" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + instrgraphql "github.com/DataDog/dd-trace-go/v2/instrumentation/graphql" ) -const defaultServiceName = "graphql" - type config struct { serviceName string analyticsRate float64 withoutTraceIntrospectionQuery bool withoutTraceTrivialResolvedFields bool + shouldStartSpanFunc func(ctx context.Context, fieldCtx *graphql.FieldContext) bool tags map[string]interface{} + errExtensions []string +} + +// An Option describes options for the gqlgen integration. +type Option interface { + apply(*config) } -// An Option configures the gqlgen integration. -type Option func(cfg *config) +// OptionFn represents an option that can be passed to gqlgen tracer. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.analyticsRate = globalconfig.AnalyticsRate() + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) cfg.tags = make(map[string]interface{}) + cfg.errExtensions = instrgraphql.ErrorExtensionsFromEnv() } // WithAnalytics enables or disables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { if on { return WithAnalyticsRate(1.0) } @@ -40,21 +52,21 @@ func WithAnalytics(on bool) Option { } // WithAnalyticsRate sets the sampling rate for Trace Analytics events correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { cfg.analyticsRate = rate } } -// WithServiceName sets the given service name for the gqlgen server. -func WithServiceName(name string) Option { +// WithService sets the given service name for the gqlgen server. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithoutTraceIntrospectionQuery skips creating spans for fields when the operation name is IntrospectionQuery. -func WithoutTraceIntrospectionQuery() Option { +func WithoutTraceIntrospectionQuery() OptionFn { return func(cfg *config) { cfg.withoutTraceIntrospectionQuery = true } @@ -62,14 +74,27 @@ func WithoutTraceIntrospectionQuery() Option { // WithoutTraceTrivialResolvedFields skips creating spans for fields that have a trivial resolver. // For example, a field resolved from an object w/o requiring a custom method is considered trivial. -func WithoutTraceTrivialResolvedFields() Option { +func WithoutTraceTrivialResolvedFields() OptionFn { return func(cfg *config) { cfg.withoutTraceTrivialResolvedFields = true } } +// WithShouldStartSpanFunc allows to skip creating spans for fields that match the function. +func WithShouldStartSpanFunc(fn func(_ context.Context, _ *graphql.FieldContext) bool) OptionFn { + return func(cfg *config) { + if fn == nil { + fn = func(_ context.Context, _ *graphql.FieldContext) bool { + return true + } + } + + cfg.shouldStartSpanFunc = fn + } +} + // WithCustomTag will attach the value to the span tagged by the key. -func WithCustomTag(key string, value interface{}) Option { +func WithCustomTag(key string, value interface{}) OptionFn { return func(cfg *config) { if cfg.tags == nil { cfg.tags = make(map[string]interface{}) @@ -77,3 +102,10 @@ func WithCustomTag(key string, value interface{}) Option { cfg.tags[key] = value } } + +// WithErrorExtensions allows to configure the error extensions to include in the error span events. +func WithErrorExtensions(errExtensions ...string) OptionFn { + return func(cfg *config) { + cfg.errExtensions = instrgraphql.ParseErrorExtensions(errExtensions) + } +} diff --git a/contrib/99designs/gqlgen/orchestrion.yml b/contrib/99designs/gqlgen/orchestrion.yml new file mode 100644 index 0000000000..2640851bb1 --- /dev/null +++ b/contrib/99designs/gqlgen/orchestrion.yml @@ -0,0 +1,26 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 + description: gqlgen is a Go library for building GraphQL servers without any fuss. + +aspects: + - id: New + join-point: + one-of: + - function-call: github.com/99designs/gqlgen/graphql/handler.New + - function-call: github.com/99designs/gqlgen/graphql/handler.NewDefaultServer + advice: + - wrap-expression: + imports: + handler: github.com/99designs/gqlgen/graphql/handler + gqlgentrace: github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 + template: |- + func(s *handler.Server) *handler.Server { + s.Use(gqlgentrace.NewTracer()) + return s + }({{ . }}) diff --git a/contrib/99designs/gqlgen/tracer.go b/contrib/99designs/gqlgen/tracer.go index ffdcb0c550..4ef04e8b30 100644 --- a/contrib/99designs/gqlgen/tracer.go +++ b/contrib/99designs/gqlgen/tracer.go @@ -11,33 +11,6 @@ // any sensitive data in the query will be sent to Datadog as the resource name // of the span. To ensure no sensitive data is included in your spans, always // use parameterized graphql queries with sensitive data in variables. -// -// Usage example: -// -// import ( -// "log" -// "net/http" -// -// "github.com/99designs/gqlgen/_examples/todo" -// "github.com/99designs/gqlgen/graphql/handler" -// -// "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" -// gqlgentrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/99designs/gqlgen" -// ) -// -// func Example() { -// tracer.Start() -// defer tracer.Stop() -// -// t := gqlgentrace.NewTracer( -// gqlgentrace.WithAnalytics(true), -// gqlgentrace.WithServiceName("todo.server"), -// ) -// h := handler.NewDefaultServer(todo.NewExecutableSchema(todo.New())) -// h.Use(t) -// http.Handle("/query", h) -// log.Fatal(http.ListenAndServe(":8080", nil)) -// } package gqlgen import ( @@ -46,22 +19,23 @@ import ( "math" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/graphqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/graphqlsec" + instrgraphql "github.com/DataDog/dd-trace-go/v2/instrumentation/graphql" "github.com/99designs/gqlgen/graphql" "github.com/vektah/gqlparser/v2/ast" + "github.com/vektah/gqlparser/v2/gqlerror" ) -const componentName = "99designs/gqlgen" +const componentName = instrumentation.Package99DesignsGQLGen + +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/99designs/gqlgen") + instr = instrumentation.Load(instrumentation.Package99DesignsGQLGen) } const ( @@ -87,7 +61,7 @@ func NewTracer(opts ...Option) graphql.HandlerExtension { cfg := new(config) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } return &gqlTracer{cfg: cfg} } @@ -103,7 +77,7 @@ func (t *gqlTracer) Validate(_ graphql.ExecutableSchema) error { func (t *gqlTracer) InterceptOperation(ctx context.Context, next graphql.OperationHandler) graphql.ResponseHandler { opCtx := graphql.GetOperationContext(ctx) span, ctx := t.createRootSpan(ctx, opCtx) - ctx, req := graphqlsec.StartRequestOperation(ctx, graphqlsec.RequestOperationArgs{ + ctx, req := graphqlsec.StartRequestOperation(ctx, span, graphqlsec.RequestOperationArgs{ RawQuery: opCtx.RawQuery, OperationName: opCtx.OperationName, Variables: opCtx.Variables, @@ -117,11 +91,12 @@ func (t *gqlTracer) InterceptOperation(ctx context.Context, next graphql.Operati return func(ctx context.Context) *graphql.Response { response := responseHandler(ctx) if span != nil { - var err error - if len(response.Errors) > 0 { - err = response.Errors + var spanErr error + if response != nil && len(response.Errors) > 0 { + spanErr = response.Errors + instrgraphql.AddErrorsAsSpanEvents(span, toGraphqlErrors(response.Errors), t.cfg.errExtensions) } - defer span.Finish(tracer.WithError(err)) + defer span.Finish(tracer.WithError(spanErr)) } var ( @@ -137,14 +112,14 @@ func (t *gqlTracer) InterceptOperation(ctx context.Context, next graphql.Operati } query.Finish(executionOperationRes) - req.Finish(span, requestOperationRes) + req.Finish(requestOperationRes) return response } } func (t *gqlTracer) InterceptField(ctx context.Context, next graphql.Resolver) (res any, err error) { opCtx := graphql.GetOperationContext(ctx) - if t.cfg.withoutTraceIntrospectionQuery && opCtx.OperationName == "IntrospectionQuery" { + if t.cfg.withoutTraceIntrospectionQuery && isIntrospectionQuery(opCtx) { res, err = next(ctx) return } @@ -156,6 +131,13 @@ func (t *gqlTracer) InterceptField(ctx context.Context, next graphql.Resolver) ( return } + // GraphQL tracing sometimes has too many spans. + // So we can skip the span creation if the function is provided and returns false. + if t.cfg.shouldStartSpanFunc != nil && !t.cfg.shouldStartSpanFunc(ctx, fieldCtx) { + res, err = next(ctx) + return + } + opts := make([]tracer.StartSpanOption, 0, 6+len(t.cfg.tags)) for k, v := range t.cfg.tags { opts = append(opts, tracer.Tag(k, v)) @@ -194,7 +176,7 @@ func (*gqlTracer) InterceptResponse(ctx context.Context, next graphql.ResponseHa // returned as those may run indefinitely and would be problematic. This function // also creates child spans (orphans in the case of a subscription) for the // read, parsing and validation phases of the operation. -func (t *gqlTracer) createRootSpan(ctx context.Context, opCtx *graphql.OperationContext) (ddtrace.Span, context.Context) { +func (t *gqlTracer) createRootSpan(ctx context.Context, opCtx *graphql.OperationContext) (*tracer.Span, context.Context) { opts := make([]tracer.StartSpanOption, 0, 7+len(t.cfg.tags)) for k, v := range t.cfg.tags { opts = append(opts, tracer.Tag(k, v)) @@ -210,14 +192,14 @@ func (t *gqlTracer) createRootSpan(ctx context.Context, opCtx *graphql.Operation if !math.IsNaN(t.cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, t.cfg.analyticsRate)) } - var rootSpan ddtrace.Span + var rootSpan *tracer.Span if opCtx.Operation.Operation != ast.Subscription { // Subscriptions are long running queries which may remain open indefinitely // until the subscription ends. We do not create the root span for these. rootSpan, ctx = tracer.StartSpanFromContext(ctx, serverSpanName(opCtx), opts...) } createChildSpan := func(name string, start, finish time.Time) { - childOpts := []ddtrace.StartSpanOption{ + childOpts := []tracer.StartSpanOption{ tracer.StartTime(start), tracer.ResourceName(name), tracer.Tag(ext.Component, componentName), @@ -226,7 +208,7 @@ func (t *gqlTracer) createRootSpan(ctx context.Context, opCtx *graphql.Operation // If there is no root span, decorate the orphan spans with more information childOpts = append(childOpts, opts...) } - var childSpan ddtrace.Span + var childSpan *tracer.Span childSpan, _ = tracer.StartSpanFromContext(ctx, name, childOpts...) childSpan.Finish(tracer.FinishTime(finish)) } @@ -237,11 +219,23 @@ func (t *gqlTracer) createRootSpan(ctx context.Context, opCtx *graphql.Operation } func serverSpanName(octx *graphql.OperationContext) string { - nameV0 := "graphql.request" + graphqlOperation := "" if octx != nil && octx.Operation != nil { - nameV0 = fmt.Sprintf("%s.%s", ext.SpanTypeGraphQL, octx.Operation.Operation) + graphqlOperation = string(octx.Operation.Operation) + } + + return instr.OperationName( + instrumentation.ComponentDefault, + instrumentation.OperationContext{ + "graphql.operation": graphqlOperation, + }) +} + +func isIntrospectionQuery(octx *graphql.OperationContext) bool { + if octx.Operation != nil { + return octx.Operation.Name == "IntrospectionQuery" } - return namingschema.OpNameOverrideV0(namingschema.GraphqlServer, nameV0) + return octx.OperationName == "IntrospectionQuery" } // Ensure all of these interfaces are implemented. @@ -251,3 +245,28 @@ var _ interface { graphql.FieldInterceptor graphql.ResponseInterceptor } = &gqlTracer{} + +func toGraphqlErrors(errs gqlerror.List) []instrgraphql.Error { + res := make([]instrgraphql.Error, 0, len(errs)) + for _, err := range errs { + locs := make([]instrgraphql.ErrorLocation, 0, len(err.Locations)) + for _, loc := range err.Locations { + locs = append(locs, instrgraphql.ErrorLocation{ + Line: loc.Line, + Column: loc.Column, + }) + } + errPath := make([]any, 0, len(err.Path)) + for _, p := range err.Path { + errPath = append(errPath, p) + } + res = append(res, instrgraphql.Error{ + OriginalErr: err, + Message: err.Message, + Locations: locs, + Path: errPath, + Extensions: err.Extensions, + }) + } + return res +} diff --git a/contrib/99designs/gqlgen/tracer_test.go b/contrib/99designs/gqlgen/tracer_test.go index 09e6eab628..fe7b3ea20b 100644 --- a/contrib/99designs/gqlgen/tracer_test.go +++ b/contrib/99designs/gqlgen/tracer_test.go @@ -6,19 +6,18 @@ package gqlgen import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/lists" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - + "context" "github.com/99designs/gqlgen/client" "github.com/99designs/gqlgen/graphql" "github.com/99designs/gqlgen/graphql/handler/testserver" "github.com/99designs/gqlgen/graphql/handler/transport" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "testing" + + internaltestserver "github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2/internal/testserver" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" ) type testServerResponse struct { @@ -29,45 +28,46 @@ func TestOptions(t *testing.T) { query := `{ name }` for name, tt := range map[string]struct { tracerOpts []Option - test func(assert *assert.Assertions, root mocktracer.Span, spans []mocktracer.Span) + test func(*assert.Assertions, *mocktracer.Span, []*mocktracer.Span) }{ "default": { - test: func(assert *assert.Assertions, root mocktracer.Span, _ []mocktracer.Span) { + test: func(assert *assert.Assertions, root *mocktracer.Span, _ []*mocktracer.Span) { assert.Equal("graphql.query", root.OperationName()) assert.Equal(query, root.Tag(ext.ResourceName)) - assert.Equal(defaultServiceName, root.Tag(ext.ServiceName)) + assert.Equal("graphql", root.Tag(ext.ServiceName)) assert.Equal(ext.SpanTypeGraphQL, root.Tag(ext.SpanType)) assert.Equal("99designs/gqlgen", root.Tag(ext.Component)) assert.Nil(root.Tag(ext.EventSampleRate)) + assert.Equal(string(componentName), root.Integration()) }, }, - "WithServiceName": { - tracerOpts: []Option{WithServiceName("TestServer")}, - test: func(assert *assert.Assertions, root mocktracer.Span, _ []mocktracer.Span) { + "WithService": { + tracerOpts: []Option{WithService("TestServer")}, + test: func(assert *assert.Assertions, root *mocktracer.Span, _ []*mocktracer.Span) { assert.Equal("TestServer", root.Tag(ext.ServiceName)) }, }, "WithAnalytics/true": { tracerOpts: []Option{WithAnalytics(true)}, - test: func(assert *assert.Assertions, root mocktracer.Span, _ []mocktracer.Span) { + test: func(assert *assert.Assertions, root *mocktracer.Span, _ []*mocktracer.Span) { assert.Equal(1.0, root.Tag(ext.EventSampleRate)) }, }, "WithAnalytics/false": { tracerOpts: []Option{WithAnalytics(false)}, - test: func(assert *assert.Assertions, root mocktracer.Span, _ []mocktracer.Span) { + test: func(assert *assert.Assertions, root *mocktracer.Span, _ []*mocktracer.Span) { assert.Nil(root.Tag(ext.EventSampleRate)) }, }, "WithAnalyticsRate": { tracerOpts: []Option{WithAnalyticsRate(0.5)}, - test: func(assert *assert.Assertions, root mocktracer.Span, _ []mocktracer.Span) { + test: func(assert *assert.Assertions, root *mocktracer.Span, _ []*mocktracer.Span) { assert.Equal(0.5, root.Tag(ext.EventSampleRate)) }, }, "WithoutTraceTrivialResolvedFields": { tracerOpts: []Option{WithoutTraceTrivialResolvedFields()}, - test: func(assert *assert.Assertions, _ mocktracer.Span, spans []mocktracer.Span) { + test: func(assert *assert.Assertions, _ *mocktracer.Span, spans []*mocktracer.Span) { var hasFieldOperation bool for _, span := range spans { if span.OperationName() == fieldOp { @@ -78,12 +78,55 @@ func TestOptions(t *testing.T) { assert.Equal(false, hasFieldOperation) }, }, + "WithShouldStartSpanFuncTrue": { + tracerOpts: []Option{WithShouldStartSpanFunc(func(_ context.Context, _ *graphql.FieldContext) bool { + return true + })}, + test: func(assert *assert.Assertions, _ *mocktracer.Span, spans []*mocktracer.Span) { + var hasFieldOperation bool + for _, span := range spans { + if span.OperationName() == fieldOp { + hasFieldOperation = true + break + } + } + assert.Equal(true, hasFieldOperation) + }, + }, + "WithShouldStartSpanFuncFalse": { + tracerOpts: []Option{WithShouldStartSpanFunc(func(_ context.Context, _ *graphql.FieldContext) bool { + return false + })}, + test: func(assert *assert.Assertions, _ *mocktracer.Span, spans []*mocktracer.Span) { + var hasFieldOperation bool + for _, span := range spans { + if span.OperationName() == fieldOp { + hasFieldOperation = true + break + } + } + assert.Equal(false, hasFieldOperation) + }, + }, + "WithShouldStartSpanFuncNil": { + tracerOpts: []Option{WithShouldStartSpanFunc(nil)}, + test: func(assert *assert.Assertions, _ *mocktracer.Span, spans []*mocktracer.Span) { + var hasFieldOperation bool + for _, span := range spans { + if span.OperationName() == fieldOp { + hasFieldOperation = true + break + } + } + assert.Equal(true, hasFieldOperation) + }, + }, "WithCustomTag": { tracerOpts: []Option{ WithCustomTag("customTag1", "customValue1"), WithCustomTag("customTag2", "customValue2"), }, - test: func(assert *assert.Assertions, root mocktracer.Span, _ []mocktracer.Span) { + test: func(assert *assert.Assertions, root *mocktracer.Span, _ []*mocktracer.Span) { assert.Equal("customValue1", root.Tag("customTag1")) assert.Equal("customValue2", root.Tag("customTag2")) }, @@ -96,7 +139,7 @@ func TestOptions(t *testing.T) { c := newTestClient(t, testserver.New(), NewTracer(tt.tracerOpts...)) c.MustPost(query, &testServerResponse{}) spans := mt.FinishedSpans() - var root mocktracer.Span + var root *mocktracer.Span for _, span := range spans { if span.ParentID() == 0 { root = span @@ -104,28 +147,36 @@ func TestOptions(t *testing.T) { } assert.NotNil(root) tt.test(assert, root, spans) - assert.Nil(root.Tag(ext.Error)) + assert.Nil(root.Tag(ext.ErrorMsg)) }) } // WithoutTraceIntrospectionQuery tested here since we are specifically checking against an IntrosepctionQuery operation. query = `query IntrospectionQuery { __schema { queryType { name } } }` + testFunc := func(assert *assert.Assertions, spans []*mocktracer.Span) { + var hasFieldSpan bool + for _, span := range spans { + if span.OperationName() == fieldOp { + hasFieldSpan = true + break + } + } + assert.Equal(false, hasFieldSpan) + } for name, tt := range map[string]struct { tracerOpts []Option - test func(assert *assert.Assertions, spans []mocktracer.Span) + clientOpts []client.Option + test func(assert *assert.Assertions, spans []*mocktracer.Span) }{ - "WithoutTraceIntrospectionQuery": { + "WithoutTraceIntrospectionQuery with OperationName": { tracerOpts: []Option{WithoutTraceIntrospectionQuery()}, - test: func(assert *assert.Assertions, spans []mocktracer.Span) { - var hasFieldSpan bool - for _, span := range spans { - if span.OperationName() == fieldOp { - hasFieldSpan = true - break - } - } - assert.Equal(false, hasFieldSpan) - }, + test: testFunc, + clientOpts: []client.Option{client.Operation("IntrospectionQuery")}, + }, + "WithoutTraceIntrospectionQuery without OperationName": { + tracerOpts: []Option{WithoutTraceIntrospectionQuery()}, + clientOpts: []client.Option{}, + test: testFunc, }, } { t.Run(name, func(t *testing.T) { @@ -133,7 +184,7 @@ func TestOptions(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() c := newTestClient(t, testserver.New(), NewTracer(tt.tracerOpts...)) - c.MustPost(query, &testServerResponse{}, client.Operation("IntrospectionQuery")) + c.MustPost(query, &testServerResponse{}, tt.clientOpts...) tt.test(assert, mt.FinishedSpans()) }) } @@ -146,14 +197,27 @@ func TestError(t *testing.T) { c := newTestClient(t, testserver.NewError(), NewTracer()) err := c.Post(`{ name }`, &testServerResponse{}) assert.NotNil(err) - var root mocktracer.Span + var root *mocktracer.Span for _, span := range mt.FinishedSpans() { if span.ParentID() == 0 { root = span } } - assert.NotNil(root) - assert.NotNil(root.Tag(ext.Error)) + require.NotNil(t, root) + assert.NotNil(root.Tag(ext.ErrorMsg)) + + events := root.Events() + require.Len(t, events, 1) + + evt := events[0] + assert.Equal("dd.graphql.query.error", evt.Name) + assert.NotEmpty(evt.TimeUnixNano) + assert.NotEmpty(evt.Attributes["stacktrace"]) + assert.Equal(map[string]any{ + "message": "resolver error", + "stacktrace": evt.Attributes["stacktrace"], + "type": "*gqlerror.Error", + }, evt.Attributes) } func TestObfuscation(t *testing.T) { @@ -185,7 +249,7 @@ func TestChildSpans(t *testing.T) { c := newTestClient(t, testserver.New(), NewTracer()) err := c.Post(`{ name }`, &testServerResponse{}) assert.Nil(err) - var root mocktracer.Span + var root *mocktracer.Span allSpans := mt.FinishedSpans() var resNames []string var opNames []string @@ -200,59 +264,7 @@ func TestChildSpans(t *testing.T) { assert.ElementsMatch(resNames, []string{readOp, parsingOp, validationOp, "Query.name", `{ name }`}) assert.ElementsMatch(opNames, []string{readOp, parsingOp, validationOp, fieldOp, "graphql.query"}) assert.NotNil(root) - assert.Nil(root.Tag(ext.Error)) -} - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - c := newTestClient(t, testserver.New(), NewTracer(opts...)) - err := c.Post(`{ name }`, &testServerResponse{}) - require.NoError(t, err) - - err = c.Post(`mutation Name { name }`, &testServerResponse{}) - assert.ErrorContains(t, err, "mutations are not supported") - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 9) - assert.Equal(t, "graphql.read", spans[0].OperationName()) - assert.Equal(t, "graphql.parse", spans[1].OperationName()) - assert.Equal(t, "graphql.validate", spans[2].OperationName()) - assert.Equal(t, "graphql.field", spans[3].OperationName()) - assert.Equal(t, "graphql.query", spans[4].OperationName()) - assert.Equal(t, "graphql.read", spans[5].OperationName()) - assert.Equal(t, "graphql.parse", spans[6].OperationName()) - assert.Equal(t, "graphql.validate", spans[7].OperationName()) - assert.Equal(t, "graphql.mutation", spans[8].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 9) - assert.Equal(t, "graphql.read", spans[0].OperationName()) - assert.Equal(t, "graphql.parse", spans[1].OperationName()) - assert.Equal(t, "graphql.validate", spans[2].OperationName()) - assert.Equal(t, "graphql.field", spans[3].OperationName()) - assert.Equal(t, "graphql.server.request", spans[4].OperationName()) - assert.Equal(t, "graphql.read", spans[5].OperationName()) - assert.Equal(t, "graphql.parse", spans[6].OperationName()) - assert.Equal(t, "graphql.validate", spans[7].OperationName()) - assert.Equal(t, "graphql.server.request", spans[8].OperationName()) - } - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: lists.RepeatString("graphql", 9), - WithDDService: lists.RepeatString("graphql", 9), - WithDDServiceAndOverride: lists.RepeatString(serviceOverride, 9), - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) + assert.Zero(root.Tag(ext.ErrorMsg)) } func newTestClient(t *testing.T, h *testserver.TestServer, tracer graphql.HandlerExtension) *client.Client { @@ -263,11 +275,11 @@ func newTestClient(t *testing.T, h *testserver.TestServer, tracer graphql.Handle } func TestInterceptOperation(t *testing.T) { - assertions := assert.New(t) graphqlTestSrv := testserver.New() c := newTestClient(t, graphqlTestSrv, NewTracer()) t.Run("intercept operation with graphQL Query", func(t *testing.T) { + assertions := assert.New(t) mt := mocktracer.Start() defer mt.Stop() @@ -280,7 +292,7 @@ func TestInterceptOperation(t *testing.T) { var opNames []string for _, span := range allSpans { if span.ParentID() == 0 { - root = span + root = *span } resNames = append(resNames, span.Tag(ext.ResourceName).(string)) opNames = append(opNames, span.OperationName()) @@ -289,10 +301,11 @@ func TestInterceptOperation(t *testing.T) { assertions.ElementsMatch(resNames, []string{readOp, parsingOp, validationOp, "Query.name", `{ name }`}) assertions.ElementsMatch(opNames, []string{readOp, parsingOp, validationOp, fieldOp, "graphql.query"}) assertions.NotNil(root) - assertions.Nil(root.Tag(ext.Error)) + assertions.Nil(root.Tag(ext.ErrorMsg)) }) t.Run("intercept operation with graphQL Mutation", func(t *testing.T) { + assertions := assert.New(t) mt := mocktracer.Start() defer mt.Stop() @@ -306,7 +319,7 @@ func TestInterceptOperation(t *testing.T) { var opNames []string for _, span := range allSpans { if span.ParentID() == 0 { - root = span + root = *span } resNames = append(resNames, span.Tag(ext.ResourceName).(string)) opNames = append(opNames, span.OperationName()) @@ -315,10 +328,11 @@ func TestInterceptOperation(t *testing.T) { assertions.ElementsMatch(resNames, []string{readOp, parsingOp, validationOp, `mutation Name { name }`}) assertions.ElementsMatch(opNames, []string{readOp, parsingOp, validationOp, "graphql.mutation"}) assertions.NotNil(root) - assertions.NotNil(root.Tag(ext.Error)) + assertions.NotNil(root.Tag(ext.ErrorMsg)) }) t.Run("intercept operation with graphQL Subscription", func(t *testing.T) { + assertions := assert.New(t) mt := mocktracer.Start() defer mt.Stop() @@ -337,7 +351,7 @@ func TestInterceptOperation(t *testing.T) { var opNames []string for _, span := range allSpans { if span.ParentID() == 0 { - root = span + root = *span } resNames = append(resNames, span.Tag(ext.ResourceName).(string)) opNames = append(opNames, span.OperationName()) @@ -346,6 +360,121 @@ func TestInterceptOperation(t *testing.T) { assertions.ElementsMatch(resNames, []string{`subscription Name { name }`, `subscription Name { name }`, "subscription Name { name }"}) assertions.ElementsMatch(opNames, []string{readOp, parsingOp, validationOp}) assertions.NotNil(root) - assertions.Nil(root.Tag(ext.Error)) + assertions.Nil(root.Tag(ext.ErrorMsg)) }) } + +func TestErrorsAsSpanEvents(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + _, c := internaltestserver.New(t, NewTracer(WithErrorExtensions("str", "float", "int", "bool", "slice", "unsupported_type_stringified"))) + err := c.Post(`{ withError }`, &testServerResponse{}) + require.Error(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 5) + + s0 := spans[4] + assert.Equal(t, "graphql.query", s0.OperationName()) + assert.NotNil(t, s0.Tag(ext.ErrorMsg)) + + events := s0.Events() + require.Len(t, events, 1) + + evt := events[0] + assert.Equal(t, "dd.graphql.query.error", evt.Name) + assert.NotEmpty(t, evt.TimeUnixNano) + assert.NotEmpty(t, evt.Attributes["stacktrace"]) + + wantAttrs := map[string]any{ + "message": "test error", + "path": []any{"withError"}, + "stacktrace": evt.Attributes["stacktrace"], + "type": "*gqlerror.Error", + "extensions.str": "1", + "extensions.int": 1, + "extensions.float": 1.1, + "extensions.bool": true, + "extensions.slice": []any{"1", "2"}, + "extensions.unsupported_type_stringified": "[1,\"foo\"]", + } + evt.AssertAttributes(t, wantAttrs) + + // the rest of the spans should not have span events + for _, s := range spans { + if s.OperationName() == "graphql.query" { + continue + } + assert.Emptyf(t, s.Events(), "span %s should not have span events", s.OperationName()) + } +} + +func TestShouldStartSpanFunc(t *testing.T) { + query := `{ name }` + testCases := map[string]struct { + allow bool + }{ + "returns true": {allow: true}, + "returns false": {allow: false}, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + assertions := assert.New(t) + + opt := OptionFn(func(cfg *config) { + cfg.shouldStartSpanFunc = func(ctx context.Context, fc *graphql.FieldContext) bool { return tc.allow } + }) + + mt := mocktracer.Start() + defer mt.Stop() + + c := newTestClient(t, testserver.New(), NewTracer(opt)) + c.MustPost(query, &testServerResponse{}) + + spans := mt.FinishedSpans() + var hasFieldSpan bool + for _, s := range spans { + if s.OperationName() == fieldOp { + hasFieldSpan = true + break + } + } + + if tc.allow { + assertions.True(hasFieldSpan) + } else { + assertions.False(hasFieldSpan) + } + }) + } +} + +// Test the extension does not panic when something returns a nil response +func TestNilResponse(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + h, c := internaltestserver.New(t, nil) + h.Use(&nilResponseExtension{}) + h.Use(NewTracer()) + + resp, err := c.RawPost(`{ withError }`) + require.NoError(t, err) + require.Nil(t, resp) +} + +type nilResponseExtension struct{} + +func (n *nilResponseExtension) ExtensionName() string { + return "NilResponse" +} + +func (n *nilResponseExtension) Validate(_ graphql.ExecutableSchema) error { + return nil +} + +func (n *nilResponseExtension) InterceptResponse(_ context.Context, _ graphql.ResponseHandler) *graphql.Response { + return nil +} diff --git a/contrib/IBM/sarama.v1/option.go b/contrib/IBM/sarama.v1/option.go deleted file mode 100644 index e410e0c1f9..0000000000 --- a/contrib/IBM/sarama.v1/option.go +++ /dev/null @@ -1,90 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package sarama - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -const defaultServiceName = "kafka" - -type config struct { - consumerServiceName string - producerServiceName string - consumerSpanName string - producerSpanName string - analyticsRate float64 - dataStreamsEnabled bool - groupID string -} - -func defaults(cfg *config) { - cfg.consumerServiceName = namingschema.ServiceName(defaultServiceName) - cfg.producerServiceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - - cfg.consumerSpanName = namingschema.OpName(namingschema.KafkaInbound) - cfg.producerSpanName = namingschema.OpName(namingschema.KafkaOutbound) - - cfg.dataStreamsEnabled = internal.BoolEnv("DD_DATA_STREAMS_ENABLED", false) - - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_SARAMA_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } -} - -// An Option is used to customize the config for the sarama tracer. -type Option func(cfg *config) - -// WithServiceName sets the given service name for the intercepted client. -func WithServiceName(name string) Option { - return func(cfg *config) { - cfg.consumerServiceName = name - cfg.producerServiceName = name - } -} - -// WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ -func WithDataStreams() Option { - return func(cfg *config) { - cfg.dataStreamsEnabled = true - } -} - -// WithGroupID tags the produced data streams metrics with the given groupID (aka consumer group) -func WithGroupID(groupID string) Option { - return func(cfg *config) { - cfg.groupID = groupID - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(cfg *config) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(cfg *config) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} diff --git a/contrib/IBM/sarama.v1/sarama_test.go b/contrib/IBM/sarama.v1/sarama_test.go deleted file mode 100644 index 277da155af..0000000000 --- a/contrib/IBM/sarama.v1/sarama_test.go +++ /dev/null @@ -1,435 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package sarama - -import ( - "context" - "testing" - "time" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - "github.com/IBM/sarama" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func genTestSpans(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - broker := sarama.NewMockBroker(t, 1) - defer broker.Close() - - broker.SetHandlerByMap(map[string]sarama.MockResponse{ - "MetadataRequest": sarama.NewMockMetadataResponse(t). - SetBroker(broker.Addr(), broker.BrokerID()). - SetLeader("test-topic", 0, broker.BrokerID()), - "OffsetRequest": sarama.NewMockOffsetResponse(t). - SetOffset("test-topic", 0, sarama.OffsetOldest, 0). - SetOffset("test-topic", 0, sarama.OffsetNewest, 1), - "FetchRequest": sarama.NewMockFetchResponse(t, 1). - SetMessage("test-topic", 0, 0, sarama.StringEncoder("hello")), - "ProduceRequest": sarama.NewMockProduceResponse(t). - SetError("test-topic", 0, sarama.ErrNoError), - }) - cfg := sarama.NewConfig() - cfg.Version = sarama.MinVersion - cfg.Producer.Return.Successes = true - cfg.Producer.Flush.Messages = 1 - - producer, err := sarama.NewSyncProducer([]string{broker.Addr()}, cfg) - require.NoError(t, err) - producer = WrapSyncProducer(cfg, producer, opts...) - - c, err := sarama.NewConsumer([]string{broker.Addr()}, cfg) - require.NoError(t, err) - defer func(c sarama.Consumer) { - err := c.Close() - require.NoError(t, err) - }(c) - c = WrapConsumer(c, opts...) - - msg1 := &sarama.ProducerMessage{ - Topic: "test-topic", - Value: sarama.StringEncoder("test 1"), - Metadata: "test", - } - _, _, err = producer.SendMessage(msg1) - require.NoError(t, err) - - pc, err := c.ConsumePartition("test-topic", 0, 0) - require.NoError(t, err) - _ = <-pc.Messages() - err = pc.Close() - require.NoError(t, err) - // wait for the channel to be closed - <-pc.Messages() - - spans := mt.FinishedSpans() - require.Len(t, spans, 2) - return spans -} - -func TestConsumer(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - broker := sarama.NewMockBroker(t, 0) - defer broker.Close() - - broker.SetHandlerByMap(map[string]sarama.MockResponse{ - "MetadataRequest": sarama.NewMockMetadataResponse(t). - SetBroker(broker.Addr(), broker.BrokerID()). - SetLeader("test-topic", 0, broker.BrokerID()), - "OffsetRequest": sarama.NewMockOffsetResponse(t). - SetOffset("test-topic", 0, sarama.OffsetOldest, 0). - SetOffset("test-topic", 0, sarama.OffsetNewest, 1), - "FetchRequest": sarama.NewMockFetchResponse(t, 1). - SetMessage("test-topic", 0, 0, sarama.StringEncoder("hello")). - SetMessage("test-topic", 0, 1, sarama.StringEncoder("world")), - }) - cfg := sarama.NewConfig() - cfg.Version = sarama.MinVersion - - client, err := sarama.NewClient([]string{broker.Addr()}, cfg) - require.NoError(t, err) - defer client.Close() - - consumer, err := sarama.NewConsumerFromClient(client) - require.NoError(t, err) - defer consumer.Close() - - consumer = WrapConsumer(consumer, WithDataStreams()) - - partitionConsumer, err := consumer.ConsumePartition("test-topic", 0, 0) - require.NoError(t, err) - msg1 := <-partitionConsumer.Messages() - msg2 := <-partitionConsumer.Messages() - err = partitionConsumer.Close() - require.NoError(t, err) - // wait for the channel to be closed - <-partitionConsumer.Messages() - - spans := mt.FinishedSpans() - require.Len(t, spans, 2) - { - s := spans[0] - spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg1)) - assert.NoError(t, err) - assert.Equal(t, spanctx.TraceID(), s.TraceID(), - "span context should be injected into the consumer message headers") - - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(0), s.Tag("offset")) - assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) - assert.Equal(t, "Consume Topic test-topic", s.Tag(ext.ResourceName)) - assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, "kafka.consume", s.OperationName()) - assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) - assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) - assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) - - p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewConsumerMessageCarrier(msg1))) - require.True(t, ok, "pathway not found in context") - expectedCtx, _ := tracer.SetDataStreamsCheckpoint(context.Background(), "direction:in", "topic:test-topic", "type:kafka") - expected, _ := datastreams.PathwayFromContext(expectedCtx) - assert.NotEqual(t, expected.GetHash(), 0) - assert.Equal(t, expected.GetHash(), p.GetHash()) - } - { - s := spans[1] - spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg2)) - assert.NoError(t, err) - assert.Equal(t, spanctx.TraceID(), s.TraceID(), - "span context should be injected into the consumer message headers") - - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(1), s.Tag("offset")) - assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) - assert.Equal(t, "Consume Topic test-topic", s.Tag(ext.ResourceName)) - assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, "kafka.consume", s.OperationName()) - assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) - assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) - assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) - - p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewConsumerMessageCarrier(msg2))) - require.True(t, ok, "pathway not found in context") - expectedCtx, _ := tracer.SetDataStreamsCheckpoint(context.Background(), "direction:in", "topic:test-topic", "type:kafka") - expected, _ := datastreams.PathwayFromContext(expectedCtx) - assert.NotEqual(t, expected.GetHash(), 0) - assert.Equal(t, expected.GetHash(), p.GetHash()) - } -} - -func TestSyncProducer(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - seedBroker := sarama.NewMockBroker(t, 1) - defer seedBroker.Close() - - leader := sarama.NewMockBroker(t, 2) - defer leader.Close() - - metadataResponse := new(sarama.MetadataResponse) - metadataResponse.Version = 1 - metadataResponse.AddBroker(leader.Addr(), leader.BrokerID()) - metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, nil, sarama.ErrNoError) - seedBroker.Returns(metadataResponse) - - prodSuccess := new(sarama.ProduceResponse) - prodSuccess.Version = 2 - prodSuccess.AddTopicPartition("my_topic", 0, sarama.ErrNoError) - leader.Returns(prodSuccess) - - cfg := sarama.NewConfig() - cfg.Version = sarama.V0_11_0_0 // first version that supports headers - cfg.Producer.Return.Successes = true - - producer, err := sarama.NewSyncProducer([]string{seedBroker.Addr()}, cfg) - require.NoError(t, err) - producer = WrapSyncProducer(cfg, producer, WithDataStreams()) - - msg1 := &sarama.ProducerMessage{ - Topic: "my_topic", - Value: sarama.StringEncoder("test 1"), - Metadata: "test", - } - _, _, err = producer.SendMessage(msg1) - require.NoError(t, err) - - spans := mt.FinishedSpans() - assert.Len(t, spans, 1) - { - s := spans[0] - assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) - assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) - assert.Equal(t, "kafka.produce", s.OperationName()) - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(0), s.Tag("offset")) - assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) - assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) - assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) - - p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewProducerMessageCarrier(msg1))) - require.True(t, ok, "pathway not found in context") - expectedCtx, _ := tracer.SetDataStreamsCheckpoint(context.Background(), "direction:out", "topic:my_topic", "type:kafka") - expected, _ := datastreams.PathwayFromContext(expectedCtx) - assert.NotEqual(t, expected.GetHash(), 0) - assert.Equal(t, expected.GetHash(), p.GetHash()) - } -} - -func TestSyncProducerSendMessages(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - seedBroker := sarama.NewMockBroker(t, 1) - defer seedBroker.Close() - leader := sarama.NewMockBroker(t, 2) - defer leader.Close() - - metadataResponse := new(sarama.MetadataResponse) - metadataResponse.Version = 1 - metadataResponse.AddBroker(leader.Addr(), leader.BrokerID()) - metadataResponse.AddTopicPartition("my_topic", 0, leader.BrokerID(), nil, nil, nil, sarama.ErrNoError) - seedBroker.Returns(metadataResponse) - - prodSuccess := new(sarama.ProduceResponse) - prodSuccess.Version = 2 - prodSuccess.AddTopicPartition("my_topic", 0, sarama.ErrNoError) - leader.Returns(prodSuccess) - - cfg := sarama.NewConfig() - cfg.Version = sarama.V0_11_0_0 // first version that supports headers - cfg.Producer.Return.Successes = true - cfg.Producer.Flush.Messages = 2 - - producer, err := sarama.NewSyncProducer([]string{seedBroker.Addr()}, cfg) - require.NoError(t, err) - producer = WrapSyncProducer(cfg, producer, WithDataStreams()) - - msg1 := &sarama.ProducerMessage{ - Topic: "my_topic", - Value: sarama.StringEncoder("test 1"), - Metadata: "test", - } - msg2 := &sarama.ProducerMessage{ - Topic: "my_topic", - Value: sarama.StringEncoder("test 2"), - Metadata: "test", - } - err = producer.SendMessages([]*sarama.ProducerMessage{msg1, msg2}) - require.NoError(t, err) - - spans := mt.FinishedSpans() - require.Len(t, spans, 2) - for _, s := range spans { - assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) - assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) - assert.Equal(t, "kafka.produce", s.OperationName()) - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) - assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) - assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) - } - - for _, msg := range []*sarama.ProducerMessage{msg1, msg2} { - p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewProducerMessageCarrier(msg))) - if !assert.True(t, ok, "pathway not found in context") { - continue - } - expectedCtx, _ := tracer.SetDataStreamsCheckpoint(context.Background(), "direction:out", "topic:my_topic", "type:kafka") - expected, _ := datastreams.PathwayFromContext(expectedCtx) - assert.NotEqual(t, expected.GetHash(), 0) - assert.Equal(t, expected.GetHash(), p.GetHash()) - } -} - -func TestAsyncProducer(t *testing.T) { - // the default for producers is a fire-and-forget model that doesn't return - // successes - t.Run("Without Successes", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - broker := newMockBroker(t) - - cfg := sarama.NewConfig() - cfg.Version = sarama.V0_11_0_0 - producer, err := sarama.NewAsyncProducer([]string{broker.Addr()}, cfg) - require.NoError(t, err) - producer = WrapAsyncProducer(nil, producer, WithDataStreams()) - - msg1 := &sarama.ProducerMessage{ - Topic: "my_topic", - Value: sarama.StringEncoder("test 1"), - } - producer.Input() <- msg1 - - waitForSpans(mt, 1) - - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - { - s := spans[0] - assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) - assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) - assert.Equal(t, "kafka.produce", s.OperationName()) - - // these tags are set in the finishProducerSpan function, but in this case it's never used, and instead we - // automatically finish spans after being started because we don't have a way to know when they are finished. - assert.Nil(t, s.Tag(ext.MessagingKafkaPartition)) - assert.Nil(t, s.Tag("offset")) - - assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) - assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) - assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) - - p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewProducerMessageCarrier(msg1))) - require.True(t, ok, "pathway not found in context") - expectedCtx, _ := tracer.SetDataStreamsCheckpoint(context.Background(), "direction:out", "topic:my_topic", "type:kafka") - expected, _ := datastreams.PathwayFromContext(expectedCtx) - assert.NotEqual(t, expected.GetHash(), 0) - assert.Equal(t, expected.GetHash(), p.GetHash()) - } - }) - - t.Run("With Successes", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - broker := newMockBroker(t) - - cfg := sarama.NewConfig() - cfg.Version = sarama.V0_11_0_0 - cfg.Producer.Return.Successes = true - - producer, err := sarama.NewAsyncProducer([]string{broker.Addr()}, cfg) - require.NoError(t, err) - producer = WrapAsyncProducer(cfg, producer, WithDataStreams()) - - msg1 := &sarama.ProducerMessage{ - Topic: "my_topic", - Value: sarama.StringEncoder("test 1"), - } - producer.Input() <- msg1 - <-producer.Successes() - - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - { - s := spans[0] - assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) - assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) - assert.Equal(t, "kafka.produce", s.OperationName()) - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(0), s.Tag("offset")) - assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) - assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) - assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) - - p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewProducerMessageCarrier(msg1))) - require.True(t, ok, "pathway not found in context") - expectedCtx, _ := tracer.SetDataStreamsCheckpoint(context.Background(), "direction:out", "topic:my_topic", "type:kafka") - expected, _ := datastreams.PathwayFromContext(expectedCtx) - assert.NotEqual(t, expected.GetHash(), 0) - assert.Equal(t, expected.GetHash(), p.GetHash()) - } - }) -} - -func TestNamingSchema(t *testing.T) { - namingschematest.NewKafkaTest(genTestSpans)(t) -} - -func newMockBroker(t *testing.T) *sarama.MockBroker { - broker := sarama.NewMockBroker(t, 1) - - metadataResponse := new(sarama.MetadataResponse) - metadataResponse.Version = 1 - metadataResponse.AddBroker(broker.Addr(), broker.BrokerID()) - metadataResponse.AddTopicPartition("my_topic", 0, broker.BrokerID(), nil, nil, nil, sarama.ErrNoError) - broker.Returns(metadataResponse) - - prodSuccess := new(sarama.ProduceResponse) - prodSuccess.Version = 2 - prodSuccess.AddTopicPartition("my_topic", 0, sarama.ErrNoError) - for i := 0; i < 10; i++ { - broker.Returns(prodSuccess) - } - return broker -} - -// waitForSpans polls the mock tracer until the expected number of spans -// appear -func waitForSpans(mt mocktracer.Tracer, sz int) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) - defer cancel() - - for len(mt.FinishedSpans()) < sz { - select { - case <-ctx.Done(): - return - default: - } - time.Sleep(time.Millisecond * 100) - } -} diff --git a/contrib/IBM/sarama/consumer.go b/contrib/IBM/sarama/consumer.go new file mode 100644 index 0000000000..7ca8c669b8 --- /dev/null +++ b/contrib/IBM/sarama/consumer.go @@ -0,0 +1,100 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "context" + + "github.com/IBM/sarama" + + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +type partitionConsumer struct { + sarama.PartitionConsumer + dispatcher dispatcher +} + +// Messages returns the read channel for the messages that are returned by +// the broker. +func (pc *partitionConsumer) Messages() <-chan *sarama.ConsumerMessage { + return pc.dispatcher.Messages() +} + +// WrapPartitionConsumer wraps a sarama.PartitionConsumer causing each received +// message to be traced. +func WrapPartitionConsumer(pc sarama.PartitionConsumer, opts ...Option) sarama.PartitionConsumer { + cfg := new(config) + defaults(cfg) + for _, opt := range opts { + opt.apply(cfg) + } + instr.Logger().Debug("contrib/IBM/sarama: Wrapping Partition Consumer: %#v", cfg) + + d := wrapDispatcher(pc, cfg) + go d.Run() + + wrapped := &partitionConsumer{ + PartitionConsumer: pc, + dispatcher: d, + } + return wrapped +} + +type consumer struct { + sarama.Consumer + opts []Option +} + +// ConsumePartition invokes Consumer.ConsumePartition and wraps the resulting +// PartitionConsumer. +func (c *consumer) ConsumePartition(topic string, partition int32, offset int64) (sarama.PartitionConsumer, error) { + pc, err := c.Consumer.ConsumePartition(topic, partition, offset) + if err != nil { + return pc, err + } + return WrapPartitionConsumer(pc, c.opts...), nil +} + +// WrapConsumer wraps a sarama.Consumer wrapping any PartitionConsumer created +// via Consumer.ConsumePartition. +func WrapConsumer(c sarama.Consumer, opts ...Option) sarama.Consumer { + return &consumer{ + Consumer: c, + opts: opts, + } +} + +func setConsumeCheckpoint(enabled bool, groupID string, msg *sarama.ConsumerMessage) { + if !enabled || msg == nil { + return + } + edges := []string{"direction:in", "topic:" + msg.Topic, "type:kafka"} + if groupID != "" { + edges = append(edges, "group:"+groupID) + } + carrier := NewConsumerMessageCarrier(msg) + + ctx, ok := tracer.SetDataStreamsCheckpointWithParams(datastreams.ExtractFromBase64Carrier(context.Background(), carrier), options.CheckpointParams{PayloadSize: getConsumerMsgSize(msg)}, edges...) + if !ok { + return + } + datastreams.InjectToBase64Carrier(ctx, carrier) + if groupID != "" { + // only track Kafka lag if a consumer group is set. + // since there is no ack mechanism, we consider that messages read are committed right away. + tracer.TrackKafkaCommitOffset(groupID, msg.Topic, msg.Partition, msg.Offset) + } +} + +func getConsumerMsgSize(msg *sarama.ConsumerMessage) (size int64) { + for _, header := range msg.Headers { + size += int64(len(header.Key) + len(header.Value)) + } + return size + int64(len(msg.Value)+len(msg.Key)) +} diff --git a/contrib/IBM/sarama/consumer_group.go b/contrib/IBM/sarama/consumer_group.go new file mode 100644 index 0000000000..d9cfc0ce2c --- /dev/null +++ b/contrib/IBM/sarama/consumer_group.go @@ -0,0 +1,52 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "github.com/IBM/sarama" +) + +type consumerGroupHandler struct { + sarama.ConsumerGroupHandler + cfg *config +} + +func (h *consumerGroupHandler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { + // Wrap claim + wd := wrapDispatcher(claim, h.cfg) + go wd.Run() + claim = &consumerGroupClaim{ + ConsumerGroupClaim: claim, + dispatcher: wd, + } + + return h.ConsumerGroupHandler.ConsumeClaim(session, claim) +} + +// WrapConsumerGroupHandler wraps a sarama.ConsumerGroupHandler causing each received +// message to be traced. +func WrapConsumerGroupHandler(handler sarama.ConsumerGroupHandler, opts ...Option) sarama.ConsumerGroupHandler { + cfg := new(config) + defaults(cfg) + for _, opt := range opts { + opt.apply(cfg) + } + instr.Logger().Debug("contrib/IBM/sarama: Wrapping Consumer Group Handler: %#v", cfg) + + return &consumerGroupHandler{ + ConsumerGroupHandler: handler, + cfg: cfg, + } +} + +type consumerGroupClaim struct { + sarama.ConsumerGroupClaim + dispatcher dispatcher +} + +func (c *consumerGroupClaim) Messages() <-chan *sarama.ConsumerMessage { + return c.dispatcher.Messages() +} diff --git a/contrib/IBM/sarama/consumer_group_test.go b/contrib/IBM/sarama/consumer_group_test.go new file mode 100644 index 0000000000..76e7b43431 --- /dev/null +++ b/contrib/IBM/sarama/consumer_group_test.go @@ -0,0 +1,157 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "context" + "log" + "sync" + "testing" + + "github.com/IBM/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" +) + +func TestWrapConsumerGroupHandler(t *testing.T) { + cfg := newIntegrationTestConfig(t) + topic := topicName(t) + groupID := "IBM/sarama/TestWrapConsumerGroupHandler" + + mt := mocktracer.Start() + defer mt.Stop() + + cg, err := sarama.NewConsumerGroup(kafkaBrokers, groupID, cfg) + require.NoError(t, err) + defer func() { + assert.NoError(t, cg.Close()) + }() + + handler := &testConsumerGroupHandler{ + T: t, + ready: make(chan bool), + rcvMessages: make(chan *sarama.ConsumerMessage, 1), + } + tracedHandler := WrapConsumerGroupHandler(handler, WithDataStreams(), WithGroupID(groupID)) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + for { + // `Consume` should be called inside an infinite loop, when a + // server-side rebalance happens, the consumer session will need to be + // recreated to get the new claims + if err := cg.Consume(ctx, []string{topic}, tracedHandler); err != nil { + assert.ErrorIs(t, err, sarama.ErrClosedConsumerGroup) + return + } + // check if context was cancelled, signaling that the consumer should stop + if ctx.Err() != nil { + return + } + } + }() + + <-handler.ready // Await till the consumer has been set up + log.Println("Sarama consumer up and running!...") + + p, err := sarama.NewSyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + p = WrapSyncProducer(cfg, p, WithDataStreams()) + defer func() { + assert.NoError(t, p.Close()) + }() + + produceMsg := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder("test 1"), + Metadata: "test", + } + _, _, err = p.SendMessage(produceMsg) + require.NoError(t, err) + + waitForSpans(mt, 2) + cancel() + wg.Wait() + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + consumeMsg := <-handler.rcvMessages + + s0 := spans[0] + assert.Equal(t, "kafka", s0.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s0.Tag(ext.SpanType)) + assert.Equal(t, "Produce Topic "+topic, s0.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.produce", s0.OperationName()) + assert.Equal(t, float64(0), s0.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s0.Tag("offset")) + assert.Equal(t, "IBM/sarama", s0.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindProducer, s0.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s0.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s0.Tag("messaging.destination.name")) + + assertDSMProducerPathway(t, topic, produceMsg) + + s1 := spans[1] + assert.Equal(t, "kafka", s1.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s1.Tag(ext.SpanType)) + assert.Equal(t, "Consume Topic "+topic, s1.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.consume", s1.OperationName()) + assert.Equal(t, float64(0), s1.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s1.Tag("offset")) + assert.Equal(t, "IBM/sarama", s1.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindConsumer, s1.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s1.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s1.Tag("messaging.destination.name")) + + assertDSMConsumerPathway(t, topic, groupID, consumeMsg, true) + + assert.Equal(t, s0.SpanID(), s1.ParentID(), "spans are not parent-child") +} + +type testConsumerGroupHandler struct { + *testing.T + ready chan bool + rcvMessages chan *sarama.ConsumerMessage +} + +func (t *testConsumerGroupHandler) Setup(_ sarama.ConsumerGroupSession) error { + // Mark the consumer as ready + close(t.ready) + return nil +} + +func (t *testConsumerGroupHandler) Cleanup(_ sarama.ConsumerGroupSession) error { + return nil +} + +func (t *testConsumerGroupHandler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error { + for { + select { + case msg, ok := <-claim.Messages(): + if !ok { + t.T.Log("message channel was closed") + return nil + } + t.T.Logf("Message claimed: value = %s, timestamp = %v, topic = %s", string(msg.Value), msg.Timestamp, msg.Topic) + session.MarkMessage(msg, "") + t.rcvMessages <- msg + + // Should return when `session.Context()` is done. + // If not, will raise `ErrRebalanceInProgress` or `read tcp :: i/o timeout` when kafka rebalance. see: + // https://github.com/IBM/sarama/issues/1192 + case <-session.Context().Done(): + return nil + } + } +} diff --git a/contrib/IBM/sarama/consumer_test.go b/contrib/IBM/sarama/consumer_test.go new file mode 100644 index 0000000000..05c8f9c2cc --- /dev/null +++ b/contrib/IBM/sarama/consumer_test.go @@ -0,0 +1,184 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "fmt" + "testing" + + "github.com/IBM/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func TestWrapConsumer(t *testing.T) { + cfg := newIntegrationTestConfig(t) + cfg.Version = sarama.MinVersion + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + client, err := sarama.NewClient(kafkaBrokers, cfg) + require.NoError(t, err) + defer client.Close() + + consumer, err := sarama.NewConsumerFromClient(client) + require.NoError(t, err) + consumer = WrapConsumer(consumer, WithDataStreams()) + defer consumer.Close() + + partitionConsumer, err := consumer.ConsumePartition(topic, 0, 0) + require.NoError(t, err) + defer partitionConsumer.Close() + + p, err := sarama.NewSyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + defer func() { + assert.NoError(t, p.Close()) + }() + + for i := 1; i <= 2; i++ { + produceMsg := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder(fmt.Sprintf("test %d", i)), + Metadata: fmt.Sprintf("test %d", i), + } + _, _, err = p.SendMessage(produceMsg) + require.NoError(t, err) + } + + msg1 := <-partitionConsumer.Messages() + msg2 := <-partitionConsumer.Messages() + err = partitionConsumer.Close() + require.NoError(t, err) + // wait for the channel to be closed + <-partitionConsumer.Messages() + waitForSpans(mt, 2) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + { + s := spans[0] + spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg1)) + assert.NoError(t, err) + assert.Equal(t, spanctx.TraceIDLower(), s.TraceID(), + "span context should be injected into the consumer message headers") + + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s.Tag("offset")) + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "Consume Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "kafka.consume", s.OperationName()) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + + assertDSMConsumerPathway(t, topic, "", msg1, false) + } + { + s := spans[1] + spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg2)) + assert.NoError(t, err) + assert.Equal(t, spanctx.TraceIDLower(), s.TraceID(), + "span context should be injected into the consumer message headers") + + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s.Tag("offset")) + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "Consume Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "kafka.consume", s.OperationName()) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + + assertDSMConsumerPathway(t, topic, "", msg2, false) + } +} + +func TestWrapConsumerWithCustomConsumerSpanOptions(t *testing.T) { + cfg := newIntegrationTestConfig(t) + cfg.Version = sarama.MinVersion + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + client, err := sarama.NewClient(kafkaBrokers, cfg) + require.NoError(t, err) + defer client.Close() + + consumer, err := sarama.NewConsumerFromClient(client) + require.NoError(t, err) + consumer = WrapConsumer( + consumer, + WithDataStreams(), + WithConsumerCustomTag( + "messaging.kafka.key", + func(msg *sarama.ConsumerMessage) any { + return string(msg.Key) + }, + ), + ) + defer consumer.Close() + + partitionConsumer, err := consumer.ConsumePartition(topic, 0, 0) + require.NoError(t, err) + defer partitionConsumer.Close() + + p, err := sarama.NewSyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + defer func() { + assert.NoError(t, p.Close()) + }() + + produceMsg := &sarama.ProducerMessage{ + Topic: topic, + Key: sarama.StringEncoder("test key"), + Value: sarama.StringEncoder("test 1"), + Metadata: "test 1", + } + _, _, err = p.SendMessage(produceMsg) + require.NoError(t, err) + + msg1 := <-partitionConsumer.Messages() + err = partitionConsumer.Close() + require.NoError(t, err) + // wait for the channel to be closed + <-partitionConsumer.Messages() + waitForSpans(mt, 1) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + s := spans[0] + spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg1)) + assert.NoError(t, err) + assert.Equal(t, spanctx.TraceIDLower(), s.TraceID(), + "span context should be injected into the consumer message headers") + + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s.Tag("offset")) + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "Consume Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "kafka.consume", s.OperationName()) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + assert.Equal(t, "test key", s.Tag("messaging.kafka.key")) + + assertDSMConsumerPathway(t, topic, "", msg1, false) +} diff --git a/contrib/IBM/sarama/dispatcher.go b/contrib/IBM/sarama/dispatcher.go new file mode 100644 index 0000000000..566c189d8c --- /dev/null +++ b/contrib/IBM/sarama/dispatcher.go @@ -0,0 +1,93 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "math" + + "github.com/IBM/sarama" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +type dispatcher interface { + Messages() <-chan *sarama.ConsumerMessage +} + +type wrappedDispatcher struct { + d dispatcher + messages chan *sarama.ConsumerMessage + + cfg *config +} + +func wrapDispatcher(d dispatcher, cfg *config) *wrappedDispatcher { + return &wrappedDispatcher{ + d: d, + messages: make(chan *sarama.ConsumerMessage), + cfg: cfg, + } +} + +func (w *wrappedDispatcher) Messages() <-chan *sarama.ConsumerMessage { + return w.messages +} + +func (w *wrappedDispatcher) Run() { + msgs := w.d.Messages() + var prev *tracer.Span + + for msg := range msgs { + // create the next span from the message + opts := []tracer.StartSpanOption{ + tracer.ServiceName(w.cfg.consumerServiceName), + tracer.ResourceName("Consume Topic " + msg.Topic), + tracer.SpanType(ext.SpanTypeMessageConsumer), + tracer.Tag(ext.MessagingKafkaPartition, msg.Partition), + tracer.Tag("offset", msg.Offset), + tracer.Tag(ext.Component, instrumentation.PackageIBMSarama), + tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), + tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), + tracer.Tag(ext.MessagingDestinationName, msg.Topic), + tracer.Measured(), + } + if !math.IsNaN(w.cfg.analyticsRate) { + opts = append(opts, tracer.Tag(ext.EventSampleRate, w.cfg.analyticsRate)) + } + if len(w.cfg.consumerCustomTags) > 0 { + for tag, tagValueFn := range w.cfg.consumerCustomTags { + opts = append(opts, tracer.Tag(tag, tagValueFn(msg))) + } + } + // kafka supports headers, so try to extract a span context + carrier := NewConsumerMessageCarrier(msg) + if spanctx, err := tracer.Extract(carrier); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } + opts = append(opts, tracer.ChildOf(spanctx)) + } + next := tracer.StartSpan(w.cfg.consumerSpanName, opts...) + // reinject the span context so consumers can pick it up + tracer.Inject(next.Context(), carrier) + setConsumeCheckpoint(w.cfg.dataStreamsEnabled, w.cfg.groupID, msg) + w.messages <- msg + + // if the next message was received, finish the previous span + if prev != nil { + prev.Finish() + } + prev = next + } + // finish any remaining span + if prev != nil { + prev.Finish() + } + close(w.messages) +} diff --git a/contrib/IBM/sarama.v1/example_test.go b/contrib/IBM/sarama/example_test.go similarity index 58% rename from contrib/IBM/sarama.v1/example_test.go rename to contrib/IBM/sarama/example_test.go index 3990625b15..66d4282c36 100644 --- a/contrib/IBM/sarama.v1/example_test.go +++ b/contrib/IBM/sarama/example_test.go @@ -6,15 +6,17 @@ package sarama_test import ( + "context" + "errors" "log" - saramatrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/IBM/sarama.v1" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + saramatrace "github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/IBM/sarama" ) -func Example_asyncProducer() { +func ExampleWrapAsyncProducer() { cfg := sarama.NewConfig() cfg.Version = sarama.V0_11_0_0 // minimum version that supports headers which are required for tracing @@ -33,7 +35,7 @@ func Example_asyncProducer() { producer.Input() <- msg } -func Example_syncProducer() { +func ExampleWrapSyncProducer() { cfg := sarama.NewConfig() cfg.Producer.Return.Successes = true @@ -55,7 +57,7 @@ func Example_syncProducer() { } } -func Example_consumer() { +func ExampleWrapConsumer() { consumer, err := sarama.NewConsumer([]string{"localhost:9092"}, nil) if err != nil { panic(err) @@ -82,3 +84,38 @@ func Example_consumer() { consumed++ } } + +func ExampleWrapConsumerGroupHandler() { + cfg := sarama.NewConfig() + cfg.Version = sarama.V0_11_0_0 // first version that supports headers + cfg.Producer.Return.Successes = true + cfg.Producer.Flush.Messages = 1 + + const groupID = "group-id" + + consumerGroup, err := sarama.NewConsumerGroup([]string{"localhost:9092"}, groupID, cfg) + if err != nil { + panic(err) + } + + // trace your sarama.ConsumerGroupHandler implementation + var myHandler sarama.ConsumerGroupHandler + handler := saramatrace.WrapConsumerGroupHandler(myHandler, saramatrace.WithGroupID(groupID)) + + ctx := context.Background() + for { + // `Consume` should be called inside an infinite loop, when a + // server-side rebalance happens, the consumer session will need to be + // recreated to get the new claims + if err := consumerGroup.Consume(ctx, []string{"my-topic"}, handler); err != nil { + if errors.Is(err, sarama.ErrClosedConsumerGroup) { + return + } + log.Panicf("Error from consumer: %v", err) + } + // check if context was cancelled, signaling that the consumer should stop + if ctx.Err() != nil { + return + } + } +} diff --git a/contrib/IBM/sarama/go.mod b/contrib/IBM/sarama/go.mod new file mode 100644 index 0000000000..c8c6eff2b5 --- /dev/null +++ b/contrib/IBM/sarama/go.mod @@ -0,0 +1,108 @@ +module github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/IBM/sarama v1.40.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.4.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/IBM/sarama/go.sum b/contrib/IBM/sarama/go.sum new file mode 100644 index 0000000000..8dc3ce7409 --- /dev/null +++ b/contrib/IBM/sarama/go.sum @@ -0,0 +1,372 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/IBM/sarama v1.40.0 h1:QTVmX+gMKye52mT5x+Ve/Bod2D0Gy7ylE2Wslv+RHtc= +github.com/IBM/sarama v1.40.0/go.mod h1:6pBloAs1WanL/vsq5qFTyTGulJUntZHhMLOUYEIs9mg= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= +github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/IBM/sarama.v1/headers.go b/contrib/IBM/sarama/headers.go similarity index 97% rename from contrib/IBM/sarama.v1/headers.go rename to contrib/IBM/sarama/headers.go index 288a0bbb19..ec6b473d50 100644 --- a/contrib/IBM/sarama.v1/headers.go +++ b/contrib/IBM/sarama/headers.go @@ -6,7 +6,7 @@ package sarama import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/IBM/sarama" ) diff --git a/contrib/IBM/sarama/option.go b/contrib/IBM/sarama/option.go new file mode 100644 index 0000000000..3497beed0f --- /dev/null +++ b/contrib/IBM/sarama/option.go @@ -0,0 +1,111 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "math" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/IBM/sarama" +) + +type config struct { + consumerServiceName string + producerServiceName string + consumerSpanName string + producerSpanName string + analyticsRate float64 + dataStreamsEnabled bool + groupID string + consumerCustomTags map[string]func(msg *sarama.ConsumerMessage) any + producerCustomTags map[string]func(msg *sarama.ProducerMessage) any +} + +func defaults(cfg *config) { + cfg.consumerServiceName = instr.ServiceName(instrumentation.ComponentConsumer, nil) + cfg.producerServiceName = instr.ServiceName(instrumentation.ComponentProducer, nil) + + cfg.consumerSpanName = instr.OperationName(instrumentation.ComponentConsumer, nil) + cfg.producerSpanName = instr.OperationName(instrumentation.ComponentProducer, nil) + + cfg.dataStreamsEnabled = instr.DataStreamsEnabled() + + cfg.analyticsRate = instr.AnalyticsRate(false) + + cfg.consumerCustomTags = make(map[string]func(msg *sarama.ConsumerMessage) any) + cfg.producerCustomTags = make(map[string]func(msg *sarama.ProducerMessage) any) +} + +// Option describes options for the Sarama integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to WrapConsumer, WrapPartitionConsumer, WrapAsyncProducer and WrapSyncProducer. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +// WithService sets the given service name for the intercepted client. +func WithService(name string) OptionFn { + return func(cfg *config) { + cfg.consumerServiceName = name + cfg.producerServiceName = name + } +} + +// WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ +func WithDataStreams() OptionFn { + return func(cfg *config) { + cfg.dataStreamsEnabled = true + } +} + +// WithGroupID tags the produced data streams metrics with the given groupID (aka consumer group) +func WithGroupID(groupID string) OptionFn { + return func(cfg *config) { + cfg.groupID = groupID + } +} + +// WithAnalytics enables Trace Analytics for all started spans. +func WithAnalytics(on bool) OptionFn { + return func(cfg *config) { + if on { + cfg.analyticsRate = 1.0 + } else { + cfg.analyticsRate = math.NaN() + } + } +} + +// WithAnalyticsRate sets the sampling rate for Trace Analytics events +// correlated to started spans. +func WithAnalyticsRate(rate float64) OptionFn { + return func(cfg *config) { + if rate >= 0.0 && rate <= 1.0 { + cfg.analyticsRate = rate + } else { + cfg.analyticsRate = math.NaN() + } + } +} + +// WithConsumerCustomTag enables calling a callback func to generate the value for a custom tag on wrapped consumers. +func WithConsumerCustomTag(tag string, tagFn func(msg *sarama.ConsumerMessage) any) OptionFn { + return func(cfg *config) { + cfg.consumerCustomTags[tag] = tagFn + } +} + +// WithCustomProducerSpanOptions enables calling a callback func to generate the value for a custom tag on wrapped producers. +func WithProducerCustomTag(tag string, tagFn func(msg *sarama.ProducerMessage) any) OptionFn { + return func(cfg *config) { + cfg.producerCustomTags[tag] = tagFn + } +} diff --git a/contrib/IBM/sarama.v1/option_test.go b/contrib/IBM/sarama/option_test.go similarity index 100% rename from contrib/IBM/sarama.v1/option_test.go rename to contrib/IBM/sarama/option_test.go diff --git a/contrib/IBM/sarama/orchestrion.yml b/contrib/IBM/sarama/orchestrion.yml new file mode 100644 index 0000000000..7ccd917088 --- /dev/null +++ b/contrib/IBM/sarama/orchestrion.yml @@ -0,0 +1,80 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 + description: Sarama is a Go library for Apache Kafka + +aspects: + - id: NewConsumer + join-point: + one-of: + - function-call: github.com/IBM/sarama.NewConsumer + - function-call: github.com/IBM/sarama.NewConsumerClient + advice: + - wrap-expression: + imports: + saramatrace: github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 + sarama: github.com/IBM/sarama + template: |- + func(c sarama.Consumer, err error) (sarama.Consumer, error) { + if c != nil { + c = saramatrace.WrapConsumer(c) + } + return c, err + }({{ . }}) + + - id: NewSyncProducer + join-point: + one-of: + - function-call: github.com/IBM/sarama.NewSyncProducer + - function-call: github.com/IBM/sarama.NewSyncProducerFromClient + advice: + - wrap-expression: + imports: + saramatrace: github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 + sarama: github.com/IBM/sarama + template: |- + {{- $cfg := .Function.ArgumentOfType "sarama.Config" -}} + func(p sarama.SyncProducer, err error) (sarama.SyncProducer, error) { + if p != nil { + p = saramatrace.WrapSyncProducer( + {{- if $cfg -}} + {{ $cfg }}, + {{- else -}} + nil, + {{- end -}} + p, + ) + } + return p, err + }({{ . }}) + + - id: NewAsyncProducer + join-point: + one-of: + - function-call: github.com/IBM/sarama.NewAsyncProducer + - function-call: github.com/IBM/sarama.NewAsyncProducerFromClient + advice: + - wrap-expression: + imports: + saramatrace: github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 + sarama: github.com/IBM/sarama + template: |- + {{- $cfg := .Function.ArgumentOfType "sarama.Config" -}} + func(p sarama.AsyncProducer, err error) (sarama.AsyncProducer, error) { + if p != nil { + p = saramatrace.WrapAsyncProducer( + {{- if $cfg -}} + {{ $cfg }}, + {{- else -}} + nil, + {{- end -}} + p, + ) + } + return p, err + }({{ . }}) diff --git a/contrib/IBM/sarama.v1/sarama.go b/contrib/IBM/sarama/producer.go similarity index 58% rename from contrib/IBM/sarama.v1/sarama.go rename to contrib/IBM/sarama/producer.go index 7d9f86701e..2b74188aef 100644 --- a/contrib/IBM/sarama.v1/sarama.go +++ b/contrib/IBM/sarama/producer.go @@ -3,124 +3,21 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package sarama provides functions to trace the IBM/sarama package (https://github.com/IBM/sarama). -package sarama // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/IBM/sarama" +package sarama import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/IBM/sarama" -) - -const componentName = "IBM/sarama" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/IBM/sarama") -} - -type partitionConsumer struct { - sarama.PartitionConsumer - messages chan *sarama.ConsumerMessage -} - -// Messages returns the read channel for the messages that are returned by -// the broker. -func (pc *partitionConsumer) Messages() <-chan *sarama.ConsumerMessage { - return pc.messages -} - -// WrapPartitionConsumer wraps a sarama.PartitionConsumer causing each received -// message to be traced. -func WrapPartitionConsumer(pc sarama.PartitionConsumer, opts ...Option) sarama.PartitionConsumer { - cfg := new(config) - defaults(cfg) - for _, opt := range opts { - opt(cfg) - } - log.Debug("contrib/IBM/sarama: Wrapping Partition Consumer: %#v", cfg) - wrapped := &partitionConsumer{ - PartitionConsumer: pc, - messages: make(chan *sarama.ConsumerMessage), - } - go func() { - msgs := pc.Messages() - var prev ddtrace.Span - for msg := range msgs { - // create the next span from the message - opts := []tracer.StartSpanOption{ - tracer.ServiceName(cfg.consumerServiceName), - tracer.ResourceName("Consume Topic " + msg.Topic), - tracer.SpanType(ext.SpanTypeMessageConsumer), - tracer.Tag(ext.MessagingKafkaPartition, msg.Partition), - tracer.Tag("offset", msg.Offset), - tracer.Tag(ext.Component, componentName), - tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), - tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), - tracer.Measured(), - } - if !math.IsNaN(cfg.analyticsRate) { - opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - // kafka supports headers, so try to extract a span context - carrier := NewConsumerMessageCarrier(msg) - if spanctx, err := tracer.Extract(carrier); err == nil { - opts = append(opts, tracer.ChildOf(spanctx)) - } - next := tracer.StartSpan(cfg.consumerSpanName, opts...) - // reinject the span context so consumers can pick it up - tracer.Inject(next.Context(), carrier) - setConsumeCheckpoint(cfg.dataStreamsEnabled, cfg.groupID, msg) - - wrapped.messages <- msg - - // if the next message was received, finish the previous span - if prev != nil { - prev.Finish() - } - prev = next - } - // finish any remaining span - if prev != nil { - prev.Finish() - } - close(wrapped.messages) - }() - return wrapped -} -type consumer struct { - sarama.Consumer - opts []Option -} - -// ConsumePartition invokes Consumer.ConsumePartition and wraps the resulting -// PartitionConsumer. -func (c *consumer) ConsumePartition(topic string, partition int32, offset int64) (sarama.PartitionConsumer, error) { - pc, err := c.Consumer.ConsumePartition(topic, partition, offset) - if err != nil { - return pc, err - } - return WrapPartitionConsumer(pc, c.opts...), nil -} - -// WrapConsumer wraps a sarama.Consumer wrapping any PartitionConsumer created -// via Consumer.ConsumePartition. -func WrapConsumer(c sarama.Consumer, opts ...Option) sarama.Consumer { - return &consumer{ - Consumer: c, - opts: opts, - } -} + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) type syncProducer struct { sarama.SyncProducer @@ -144,7 +41,7 @@ func (p *syncProducer) SendMessage(msg *sarama.ProducerMessage) (partition int32 func (p *syncProducer) SendMessages(msgs []*sarama.ProducerMessage) error { // although there's only one call made to the SyncProducer, the messages are // treated individually, so we create a span for each one - spans := make([]ddtrace.Span, len(msgs)) + spans := make([]*tracer.Span, len(msgs)) for i, msg := range msgs { setProduceCheckpoint(p.cfg.dataStreamsEnabled, msg, p.version) spans[i] = startProducerSpan(p.cfg, p.version, msg) @@ -168,9 +65,9 @@ func WrapSyncProducer(saramaConfig *sarama.Config, producer sarama.SyncProducer, cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/IBM/sarama: Wrapping Sync Producer: %#v", cfg) + instr.Logger().Debug("contrib/IBM/sarama: Wrapping Sync Producer: %#v", cfg) if saramaConfig == nil { saramaConfig = sarama.NewConfig() } @@ -212,14 +109,14 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/IBM/sarama: Wrapping Async Producer: %#v", cfg) + instr.Logger().Debug("contrib/IBM/sarama: Wrapping Async Producer: %#v", cfg) if saramaConfig == nil { saramaConfig = sarama.NewConfig() saramaConfig.Version = sarama.V0_11_0_0 } else if !saramaConfig.Version.IsAtLeast(sarama.V0_11_0_0) { - log.Error("Tracing Sarama async producer requires at least sarama.V0_11_0_0 version") + instr.Logger().Error("Tracing Sarama async producer requires at least sarama.V0_11_0_0 version") } wrapped := &asyncProducer{ AsyncProducer: p, @@ -228,7 +125,7 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts errors: make(chan *sarama.ProducerError), } go func() { - spans := make(map[uint64]ddtrace.Span) + spans := make(map[uint64]*tracer.Span) defer close(wrapped.input) defer close(wrapped.successes) defer close(wrapped.errors) @@ -256,7 +153,7 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts // we only track Kafka lag if returning successes is enabled. Otherwise, we have no way to know to which partition data was sent to. tracer.TrackKafkaProduceOffset(msg.Topic, msg.Partition, msg.Offset) } - if spanctx, spanFound := getSpanContext(msg); spanFound { + if spanctx, spanFound := getProducerSpanContext(msg); spanFound { spanID := spanctx.SpanID() if span, ok := spans[spanID]; ok { delete(spans, spanID) @@ -269,7 +166,7 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts // producer was closed return } - if spanctx, spanFound := getSpanContext(err.Msg); spanFound { + if spanctx, spanFound := getProducerSpanContext(err.Msg); spanFound { spanID := spanctx.SpanID() if span, ok := spans[spanID]; ok { delete(spans, spanID) @@ -283,21 +180,31 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts return wrapped } -func startProducerSpan(cfg *config, version sarama.KafkaVersion, msg *sarama.ProducerMessage) ddtrace.Span { +func startProducerSpan(cfg *config, version sarama.KafkaVersion, msg *sarama.ProducerMessage) *tracer.Span { carrier := NewProducerMessageCarrier(msg) opts := []tracer.StartSpanOption{ tracer.ServiceName(cfg.producerServiceName), tracer.ResourceName("Produce Topic " + msg.Topic), tracer.SpanType(ext.SpanTypeMessageProducer), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageIBMSarama), tracer.Tag(ext.SpanKind, ext.SpanKindProducer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), + tracer.Tag(ext.MessagingDestinationName, msg.Topic), } if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } + if len(cfg.producerCustomTags) > 0 { + for tag, tagValueFn := range cfg.producerCustomTags { + opts = append(opts, tracer.Tag(tag, tagValueFn(msg))) + } + } // if there's a span context in the headers, use that as the parent if spanctx, err := tracer.Extract(carrier); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } span := tracer.StartSpan(cfg.producerSpanName, opts...) @@ -308,13 +215,13 @@ func startProducerSpan(cfg *config, version sarama.KafkaVersion, msg *sarama.Pro return span } -func finishProducerSpan(span ddtrace.Span, partition int32, offset int64, err error) { +func finishProducerSpan(span *tracer.Span, partition int32, offset int64, err error) { span.SetTag(ext.MessagingKafkaPartition, partition) span.SetTag("offset", offset) span.Finish(tracer.WithError(err)) } -func getSpanContext(msg *sarama.ProducerMessage) (ddtrace.SpanContext, bool) { +func getProducerSpanContext(msg *sarama.ProducerMessage) (ddtrace.SpanContext, bool) { carrier := NewProducerMessageCarrier(msg) spanctx, err := tracer.Extract(carrier) if err != nil { @@ -337,27 +244,6 @@ func setProduceCheckpoint(enabled bool, msg *sarama.ProducerMessage, version sar datastreams.InjectToBase64Carrier(ctx, carrier) } -func setConsumeCheckpoint(enabled bool, groupID string, msg *sarama.ConsumerMessage) { - if !enabled || msg == nil { - return - } - edges := []string{"direction:in", "topic:" + msg.Topic, "type:kafka"} - if groupID != "" { - edges = append(edges, "group:"+groupID) - } - carrier := NewConsumerMessageCarrier(msg) - ctx, ok := tracer.SetDataStreamsCheckpointWithParams(datastreams.ExtractFromBase64Carrier(context.Background(), carrier), options.CheckpointParams{PayloadSize: getConsumerMsgSize(msg)}, edges...) - if !ok { - return - } - datastreams.InjectToBase64Carrier(ctx, carrier) - if groupID != "" { - // only track Kafka lag if a consumer group is set. - // since there is no ack mechanism, we consider that messages read are committed right away. - tracer.TrackKafkaCommitOffset(groupID, msg.Topic, msg.Partition, msg.Offset) - } -} - func getProducerMsgSize(msg *sarama.ProducerMessage) (size int64) { for _, header := range msg.Headers { size += int64(len(header.Key) + len(header.Value)) @@ -370,10 +256,3 @@ func getProducerMsgSize(msg *sarama.ProducerMessage) (size int64) { } return size } - -func getConsumerMsgSize(msg *sarama.ConsumerMessage) (size int64) { - for _, header := range msg.Headers { - size += int64(len(header.Key) + len(header.Value)) - } - return size + int64(len(msg.Value)+len(msg.Key)) -} diff --git a/contrib/IBM/sarama/producer_test.go b/contrib/IBM/sarama/producer_test.go new file mode 100644 index 0000000000..f83021bfa1 --- /dev/null +++ b/contrib/IBM/sarama/producer_test.go @@ -0,0 +1,251 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "testing" + + "github.com/IBM/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" +) + +func TestSyncProducer(t *testing.T) { + cfg := newIntegrationTestConfig(t) + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + producer, err := sarama.NewSyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + producer = WrapSyncProducer(cfg, producer, WithDataStreams()) + defer func() { + assert.NoError(t, producer.Close()) + }() + + msg1 := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder("test 1"), + Metadata: "test", + } + _, _, err = producer.SendMessage(msg1) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + { + s := spans[0] + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "Produce Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.produce", s.OperationName()) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s.Tag("offset")) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + + assertDSMProducerPathway(t, topic, msg1) + } +} + +func TestSyncProducerSendMessages(t *testing.T) { + cfg := newIntegrationTestConfig(t) + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + producer, err := sarama.NewSyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + producer = WrapSyncProducer(cfg, producer, WithDataStreams()) + defer func() { + assert.NoError(t, producer.Close()) + }() + + msg1 := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder("test 1"), + Metadata: "test", + } + msg2 := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder("test 2"), + Metadata: "test", + } + err = producer.SendMessages([]*sarama.ProducerMessage{msg1, msg2}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + for _, s := range spans { + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "Produce Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.produce", s.OperationName()) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + } + + for _, msg := range []*sarama.ProducerMessage{msg1, msg2} { + assertDSMProducerPathway(t, topic, msg) + } +} + +func TestSyncProducerWithCustomSpanOptions(t *testing.T) { + cfg := newIntegrationTestConfig(t) + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + producer, err := sarama.NewSyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + producer = WrapSyncProducer( + cfg, + producer, + WithDataStreams(), + WithProducerCustomTag( + "messaging.kafka.key", + func(msg *sarama.ProducerMessage) any { + key, err := msg.Key.Encode() + assert.NoError(t, err) + + return string(key) + }, + ), + ) + defer func() { + assert.NoError(t, producer.Close()) + }() + + msg1 := &sarama.ProducerMessage{ + Topic: topic, + Key: sarama.StringEncoder("test key"), + Value: sarama.StringEncoder("test 1"), + Metadata: "test", + } + _, _, err = producer.SendMessage(msg1) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + { + s := spans[0] + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "Produce Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.produce", s.OperationName()) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s.Tag("offset")) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + assert.Equal(t, "test key", s.Tag("messaging.kafka.key")) + + assertDSMProducerPathway(t, topic, msg1) + } +} + +func TestWrapAsyncProducer(t *testing.T) { + // the default for producers is a fire-and-forget model that doesn't return + // successes + t.Run("Without Successes", func(t *testing.T) { + cfg := newIntegrationTestConfig(t) + cfg.Producer.Return.Successes = false + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + producer, err := sarama.NewAsyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + producer = WrapAsyncProducer(cfg, producer, WithDataStreams()) + defer func() { + assert.NoError(t, producer.Close()) + }() + + msg1 := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder("test 1"), + } + producer.Input() <- msg1 + + waitForSpans(mt, 1) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + { + s := spans[0] + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "Produce Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.produce", s.OperationName()) + + // these tags are set in the finishProducerSpan function, but in this case it's never used, and instead we + // automatically finish spans after being started because we don't have a way to know when they are finished. + assert.Nil(t, s.Tag(ext.MessagingKafkaPartition)) + assert.Nil(t, s.Tag("offset")) + + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + + assertDSMProducerPathway(t, topic, msg1) + } + }) + + t.Run("With Successes", func(t *testing.T) { + cfg := newIntegrationTestConfig(t) + cfg.Producer.Return.Successes = true + topic := topicName(t) + + mt := mocktracer.Start() + defer mt.Stop() + + producer, err := sarama.NewAsyncProducer(kafkaBrokers, cfg) + require.NoError(t, err) + producer = WrapAsyncProducer(cfg, producer, WithDataStreams()) + defer func() { + assert.NoError(t, producer.Close()) + }() + + msg1 := &sarama.ProducerMessage{ + Topic: topic, + Value: sarama.StringEncoder("test 1"), + } + producer.Input() <- msg1 + <-producer.Successes() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + { + s := spans[0] + assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) + assert.Equal(t, "queue", s.Tag(ext.SpanType)) + assert.Equal(t, "Produce Topic "+topic, s.Tag(ext.ResourceName)) + assert.Equal(t, "kafka.produce", s.OperationName()) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.NotNil(t, s.Tag("offset")) + assert.Equal(t, "IBM/sarama", s.Tag(ext.Component)) + assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) + assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, topic, s.Tag("messaging.destination.name")) + + assertDSMProducerPathway(t, topic, msg1) + } + }) +} diff --git a/contrib/IBM/sarama/sarama.go b/contrib/IBM/sarama/sarama.go new file mode 100644 index 0000000000..5719cfd10a --- /dev/null +++ b/contrib/IBM/sarama/sarama.go @@ -0,0 +1,17 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package sarama provides functions to trace the IBM/sarama package (https://github.com/IBM/sarama). +package sarama // import "github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2" + +import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageIBMSarama) +} diff --git a/contrib/IBM/sarama/sarama_test.go b/contrib/IBM/sarama/sarama_test.go new file mode 100644 index 0000000000..ed74a2b213 --- /dev/null +++ b/contrib/IBM/sarama/sarama_test.go @@ -0,0 +1,104 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sarama + +import ( + "context" + "os" + "strings" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + "github.com/IBM/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + kafkaBrokers = []string{"localhost:9092"} +) + +func newIntegrationTestConfig(t *testing.T) *sarama.Config { + if _, ok := os.LookupEnv("INTEGRATION"); !ok { + t.Skip("🚧 Skipping integration test (INTEGRATION environment variable is not set)") + } + + cfg := sarama.NewConfig() + cfg.Version = sarama.V0_11_0_0 // first version that supports headers + cfg.Producer.Return.Successes = true + cfg.Producer.Flush.Messages = 1 + return cfg +} + +// waitForSpans polls the mock tracer until the expected number of spans +// appear +func waitForSpans(mt mocktracer.Tracer, sz int) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + + for len(mt.FinishedSpans()) < sz { + select { + case <-ctx.Done(): + return + default: + } + time.Sleep(time.Millisecond * 100) + } +} + +func assertDSMProducerPathway(t *testing.T, topic string, msg *sarama.ProducerMessage) { + t.Helper() + + got, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier( + context.Background(), + NewProducerMessageCarrier(msg), + )) + require.True(t, ok, "pathway not found in kafka message") + + ctx, _ := tracer.SetDataStreamsCheckpoint( + context.Background(), + "direction:out", "topic:"+topic, "type:kafka", + ) + want, _ := datastreams.PathwayFromContext(ctx) + + assert.NotEqual(t, want.GetHash(), 0) + assert.Equal(t, want.GetHash(), got.GetHash()) +} + +func assertDSMConsumerPathway(t *testing.T, topic, groupID string, msg *sarama.ConsumerMessage, withProducer bool) { + t.Helper() + + carrier := NewConsumerMessageCarrier(msg) + got, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier( + context.Background(), + carrier, + )) + require.True(t, ok, "pathway not found in kafka message") + + edgeTags := []string{"direction:in", "topic:" + topic, "type:kafka"} + if groupID != "" { + edgeTags = append(edgeTags, "group:"+groupID) + } + + ctx := context.Background() + if withProducer { + ctx, _ = tracer.SetDataStreamsCheckpoint(context.Background(), "direction:out", "topic:"+topicName(t), "type:kafka") + } + ctx, _ = tracer.SetDataStreamsCheckpoint(ctx, edgeTags...) + want, _ := datastreams.PathwayFromContext(ctx) + + assert.NotEqual(t, want.GetHash(), 0) + assert.Equal(t, want.GetHash(), got.GetHash()) +} + +// topicName returns a unique topic name for the current test, which ensures results are not affected by each other. +func topicName(t *testing.T) string { + return strings.ReplaceAll("IBM/sarama/"+t.Name(), "/", "_") +} diff --git a/contrib/README.md b/contrib/README.md index 41401a3d4c..348f5a6607 100644 --- a/contrib/README.md +++ b/contrib/README.md @@ -1,36 +1,74 @@ -[![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/contrib) +[![Godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/contrib) -The purpose of these packages is to provide tracing on top of commonly used packages from the standard library as well as the +The purpose of these packages is to provide tracing on top of commonly used packages from the standard library as well as the community in a "plug-and-play" manner. This means that by simply importing the appropriate path, functions are exposed having - the same signature as the original package. These functions return structures which embed the original return value, allowing + the same signature as the original package. These functions return structures that embed the original return value, allowing them to be used as they normally would with tracing activated out of the box. All of these libraries are supported by our [APM product](https://www.datadoghq.com/apm/). -:warning: These libraries are not built to be used with Opentracing. Opentracing integrations can be found in [their own organisation](https://github.com/opentracing-contrib/). - ### Usage -First, find the library which you'd like to integrate with. The naming convention for the integration packages is: +First, find the library which you'd like to integrate with. The naming convention for the integration packages has two things to take into consideration: + +* Name of the package being instrumented: + * If the package is from the standard library (eg. `database/sql`), it will be located at the same path. + * If the package is hosted on Github (eg. `github.com/user/repo`), it will be located at the shorthand path `user/repo`. + * If the package is from anywhere else (eg. `google.golang.org/grpc`), it can be found under the full import path. +* Version of the package being instrumented: + * If the package is from the standard library (eg. `database/sql`), it won't have a version suffix. + * If the package has no major version released, it won't have a version suffix. + * If the package has a major version released, and: + * The integration works with all versions (including v0), it won't have a version suffix. + * The integration works with a specific major version, it will have a version suffix (in this example `.vN`) where N is the major version that is being covered. If the integration covers more than one major version, the minimum version supported should be chosen for the suffix. (ex. If the integration covers versions 2.x.x - 4.x.x, the suffix will be .v2). -* If the package is from the standard library (eg. `database/sql`), it will be located at the same path. -* If the package is hosted on Github (eg. `github.com/user/repo`) and has version `v2.1.0`, it will be located at the shorthand path `user/repo.v2`. -* If the package is from anywhere else (eg. `google.golang.org/grpc`) and has no stable version, it can be found under the full import path, followed by the version suffix (in this example `.v0`). -* All new integrations should be suffixed with `.vN` where `N` is the major version that is being covered. If the integration covers more than one major version, the minimum version supported should be chosen for the suffix. (ex. If the integration covers versions `2.x.x` - `4.x.x`, the suffix will be `.v2`) -* The package itself should retain its un-versioned name. For example, the integration under `user/repo.v2` stays as `package repo`, and does not become `package repo.v2` +Important: the package itself should retain its un-versioned name. For example, the integration under `user/repo.v2` stays as `package repo`, and does not become `package repo.v2`. + +All of these packages must be imported using an import URL following the schema `github.com/DataDog/dd-trace-go/contrib//v2`. Second, there are a few tags that should be found in all integration spans: + * The `span.kind` tag should be set in root spans with either a `client`, `server`, `producer`, or `consumer` value according to the [definitions](../ddtrace/ext/span_kind.go) found in the repository. If the value is determined to be `internal`, then omit the tag as that is the assumed default value. Otherwise, explicitly set it with a value from above. * The `component` tag should be set in all spans with the value equivalent to full naming convention of the integration package explained in the previous step. -Each integration comes with thorough documentation and usage examples. A good overview can be seen on our -[godoc](https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/contrib) page. +Third, some guidelines to follow on naming functions: + +* Use `WithService` instead of `WithServiceName` when setting the service name. + +Each integration comes with a thorough documentation and usage examples. A good overview can be seen on our [godoc](https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/contrib) page. + +### Tests + +Write tests for your new integration and include them in a file ``_test.go``. This will cause your new tests to be automatically run by the Continuous Integration system on new pull requests. ### Instrumentation telemetry Every integration is expected to import instrumentation telemetry to gather integration usage (more info [here](https://docs.datadoghq.com/tracing/configure_data_security/#telemetry-collection)). Instrumentation telemetry can be enabled by adding the following `init` function to the new contrib package: + ```golang func init() { - telemetry.LoadIntegration("package/import/path") -} \ No newline at end of file + instrumentation.Load(instrumentation.PkgContribName) +} +``` + +Then, ensure that: + +* [Packages](../instrumentation/packages.go) is updated with the following information: + * A new constant with a matching package name (eg. `PackageNetHTTP` for `net/http`). + * Relevant package information in the `packages` map. +* The `go.mod` file in your new submodule is in sync with the rest of the contrib folder. +* `contribIntegrations` in [option.go](../ddtrace/tracer/option.go) contains your new package. +* A corresponding PR is opened in [Datadog/documentation](https://github.com/DataDog/documentation) to update our list of [compatible integrations](https://github.com/DataDog/documentation/blob/master/content/en/tracing/trace_collection/compatibility/go.md). + +### Version pinning + +We aim to keep all integrated packages to their minimum working version without known vulnerabilities (based on reported CVEs). As integrated packages have different versioning policies regarding breaking changes, +there is no guarantee that previously pinned versions will work with next `dd-trace-go` versions. + +### Deprecation + +Integrations can be deprecated if all the following conditions are true: + +* The integrated package is deprecated or archived (no longer maintained). +* A vulnerability is reported in the latest available version as CVE. diff --git a/contrib/Shopify/sarama/example_test.go b/contrib/Shopify/sarama/example_test.go index 97455012ea..b0127d3fbf 100644 --- a/contrib/Shopify/sarama/example_test.go +++ b/contrib/Shopify/sarama/example_test.go @@ -8,8 +8,8 @@ package sarama_test import ( "log" - saramatrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/Shopify/sarama" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + saramatrace "github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/Shopify/sarama" ) diff --git a/contrib/Shopify/sarama/go.mod b/contrib/Shopify/sarama/go.mod new file mode 100644 index 0000000000..fcc227c488 --- /dev/null +++ b/contrib/Shopify/sarama/go.mod @@ -0,0 +1,112 @@ +module github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/Shopify/sarama v1.38.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.4.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +// Pin Shopify/sarama to the last version available to avoid breaking changes +// caused by the IBM/sarama fork. +replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.38.1 + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/Shopify/sarama/go.sum b/contrib/Shopify/sarama/go.sum new file mode 100644 index 0000000000..5bbb6687e6 --- /dev/null +++ b/contrib/Shopify/sarama/go.sum @@ -0,0 +1,372 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= +github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/Shopify/sarama/headers.go b/contrib/Shopify/sarama/headers.go index 8d5fc56af0..87044360f7 100644 --- a/contrib/Shopify/sarama/headers.go +++ b/contrib/Shopify/sarama/headers.go @@ -6,7 +6,7 @@ package sarama import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/Shopify/sarama" ) diff --git a/contrib/Shopify/sarama/option.go b/contrib/Shopify/sarama/option.go index e410e0c1f9..605c37751c 100644 --- a/contrib/Shopify/sarama/option.go +++ b/contrib/Shopify/sarama/option.go @@ -8,8 +8,7 @@ package sarama import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const defaultServiceName = "kafka" @@ -25,27 +24,31 @@ type config struct { } func defaults(cfg *config) { - cfg.consumerServiceName = namingschema.ServiceName(defaultServiceName) - cfg.producerServiceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) + cfg.consumerServiceName = instr.ServiceName(instrumentation.ComponentConsumer, nil) + cfg.producerServiceName = instr.ServiceName(instrumentation.ComponentProducer, nil) - cfg.consumerSpanName = namingschema.OpName(namingschema.KafkaInbound) - cfg.producerSpanName = namingschema.OpName(namingschema.KafkaOutbound) + cfg.consumerSpanName = instr.OperationName(instrumentation.ComponentConsumer, nil) + cfg.producerSpanName = instr.OperationName(instrumentation.ComponentProducer, nil) - cfg.dataStreamsEnabled = internal.BoolEnv("DD_DATA_STREAMS_ENABLED", false) + cfg.dataStreamsEnabled = instr.DataStreamsEnabled() - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_SARAMA_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.analyticsRate = instr.AnalyticsRate(false) +} + +// Option describes options for the Sarama integration. +type Option interface { + apply(*config) } -// An Option is used to customize the config for the sarama tracer. -type Option func(cfg *config) +// OptionFn represents options applicable to WrapConsumer, WrapPartitionConsumer, WrapAsyncProducer and WrapSyncProducer. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} -// WithServiceName sets the given service name for the intercepted client. -func WithServiceName(name string) Option { +// WithService sets the given service name for the intercepted client. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.consumerServiceName = name cfg.producerServiceName = name @@ -53,21 +56,21 @@ func WithServiceName(name string) Option { } // WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ -func WithDataStreams() Option { +func WithDataStreams() OptionFn { return func(cfg *config) { cfg.dataStreamsEnabled = true } } // WithGroupID tags the produced data streams metrics with the given groupID (aka consumer group) -func WithGroupID(groupID string) Option { +func WithGroupID(groupID string) OptionFn { return func(cfg *config) { cfg.groupID = groupID } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -79,7 +82,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/Shopify/sarama/option_test.go b/contrib/Shopify/sarama/option_test.go index d2bba4fed8..e97a7249ab 100644 --- a/contrib/Shopify/sarama/option_test.go +++ b/contrib/Shopify/sarama/option_test.go @@ -6,8 +6,9 @@ package sarama import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestDataStreamsActivation(t *testing.T) { diff --git a/contrib/Shopify/sarama/orchestrion.yml b/contrib/Shopify/sarama/orchestrion.yml new file mode 100644 index 0000000000..d2d3100747 --- /dev/null +++ b/contrib/Shopify/sarama/orchestrion.yml @@ -0,0 +1,80 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 + description: Sarama is a Go library for Apache Kafka + +aspects: + - id: NewConsumer + join-point: + one-of: + - function-call: github.com/Shopify/sarama.NewConsumer + - function-call: github.com/Shopify/sarama.NewConsumerClient + advice: + - wrap-expression: + imports: + saramatrace: github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 + sarama: github.com/Shopify/sarama + template: |- + func(c sarama.Consumer, err error) (sarama.Consumer, error) { + if c != nil { + c = saramatrace.WrapConsumer(c) + } + return c, err + }({{ . }}) + + - id: NewSyncProducer + join-point: + one-of: + - function-call: github.com/Shopify/sarama.NewSyncProducer + - function-call: github.com/Shopify/sarama.NewSyncProducerFromClient + advice: + - wrap-expression: + imports: + saramatrace: github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 + sarama: github.com/Shopify/sarama + template: |- + {{- $cfg := .Function.ArgumentOfType "sarama.Config" -}} + func(p sarama.SyncProducer, err error) (sarama.SyncProducer, error) { + if p != nil { + p = saramatrace.WrapSyncProducer( + {{- if $cfg -}} + {{ $cfg }}, + {{- else -}} + nil, + {{- end -}} + p, + ) + } + return p, err + }({{ . }}) + + - id: NewAsyncProducer + join-point: + one-of: + - function-call: github.com/Shopify/sarama.NewAsyncProducer + - function-call: github.com/Shopify/sarama.NewAsyncProducerFromClient + advice: + - wrap-expression: + imports: + saramatrace: github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 + sarama: github.com/Shopify/sarama + template: |- + {{- $cfg := .Function.ArgumentOfType "sarama.Config" -}} + func(p sarama.AsyncProducer, err error) (sarama.AsyncProducer, error) { + if p != nil { + p = saramatrace.WrapAsyncProducer( + {{- if $cfg -}} + {{ $cfg }}, + {{- else -}} + nil, + {{- end -}} + p, + ) + } + return p, err + }({{ . }}) diff --git a/contrib/Shopify/sarama/sarama.go b/contrib/Shopify/sarama/sarama.go index 5b96be10a7..79bd898c4f 100644 --- a/contrib/Shopify/sarama/sarama.go +++ b/contrib/Shopify/sarama/sarama.go @@ -6,29 +6,27 @@ // Package sarama provides functions to trace the Shopify/sarama package (https://github.com/Shopify/sarama). // // Deprecated: github.com/Shopify/sarama is no longer maintained. Please migrate to github.com/IBM/sarama -// and use the corresponding instrumentation. -package sarama // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/Shopify/sarama" +// and use the corresponding integration. This integration will be removed in a future release. +package sarama // import "github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2" import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/Shopify/sarama" ) -const componentName = "Shopify/sarama" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/Shopify/sarama") + instr = instrumentation.Load(instrumentation.PackageShopifySarama) } type partitionConsumer struct { @@ -44,20 +42,21 @@ func (pc *partitionConsumer) Messages() <-chan *sarama.ConsumerMessage { // WrapPartitionConsumer wraps a sarama.PartitionConsumer causing each received // message to be traced. +// Deprecated: use `IBM/sarama` instead. func WrapPartitionConsumer(pc sarama.PartitionConsumer, opts ...Option) sarama.PartitionConsumer { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/Shopify/sarama: Wrapping Partition Consumer: %#v", cfg) + instr.Logger().Debug("contrib/Shopify/sarama: Wrapping Partition Consumer: %#v", cfg) wrapped := &partitionConsumer{ PartitionConsumer: pc, messages: make(chan *sarama.ConsumerMessage), } go func() { msgs := pc.Messages() - var prev ddtrace.Span + var prev *tracer.Span for msg := range msgs { // create the next span from the message opts := []tracer.StartSpanOption{ @@ -66,7 +65,7 @@ func WrapPartitionConsumer(pc sarama.PartitionConsumer, opts ...Option) sarama.P tracer.SpanType(ext.SpanTypeMessageConsumer), tracer.Tag(ext.MessagingKafkaPartition, msg.Partition), tracer.Tag("offset", msg.Offset), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageShopifySarama), tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), tracer.Measured(), @@ -77,6 +76,10 @@ func WrapPartitionConsumer(pc sarama.PartitionConsumer, opts ...Option) sarama.P // kafka supports headers, so try to extract a span context carrier := NewConsumerMessageCarrier(msg) if spanctx, err := tracer.Extract(carrier); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } next := tracer.StartSpan(cfg.consumerSpanName, opts...) @@ -118,6 +121,7 @@ func (c *consumer) ConsumePartition(topic string, partition int32, offset int64) // WrapConsumer wraps a sarama.Consumer wrapping any PartitionConsumer created // via Consumer.ConsumePartition. +// Deprecated: use `IBM/sarama` instead. func WrapConsumer(c sarama.Consumer, opts ...Option) sarama.Consumer { return &consumer{ Consumer: c, @@ -147,7 +151,7 @@ func (p *syncProducer) SendMessage(msg *sarama.ProducerMessage) (partition int32 func (p *syncProducer) SendMessages(msgs []*sarama.ProducerMessage) error { // although there's only one call made to the SyncProducer, the messages are // treated individually, so we create a span for each one - spans := make([]ddtrace.Span, len(msgs)) + spans := make([]*tracer.Span, len(msgs)) for i, msg := range msgs { setProduceCheckpoint(p.cfg.dataStreamsEnabled, msg, p.version) spans[i] = startProducerSpan(p.cfg, p.version, msg) @@ -167,13 +171,14 @@ func (p *syncProducer) SendMessages(msgs []*sarama.ProducerMessage) error { // WrapSyncProducer wraps a sarama.SyncProducer so that all produced messages // are traced. +// Deprecated: use `IBM/sarama` instead. func WrapSyncProducer(saramaConfig *sarama.Config, producer sarama.SyncProducer, opts ...Option) sarama.SyncProducer { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/Shopify/sarama: Wrapping Sync Producer: %#v", cfg) + instr.Logger().Debug("contrib/Shopify/sarama: Wrapping Sync Producer: %#v", cfg) if saramaConfig == nil { saramaConfig = sarama.NewConfig() } @@ -211,18 +216,19 @@ func (p *asyncProducer) Errors() <-chan *sarama.ProducerError { // or not successes will be returned. Tracing requires at least sarama.V0_11_0_0 // version which is the first version that supports headers. Only spans of // successfully published messages have partition and offset tags set. +// Deprecated: use `IBM/sarama` instead. func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts ...Option) sarama.AsyncProducer { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/Shopify/sarama: Wrapping Async Producer: %#v", cfg) + instr.Logger().Debug("contrib/Shopify/sarama: Wrapping Async Producer: %#v", cfg) if saramaConfig == nil { saramaConfig = sarama.NewConfig() saramaConfig.Version = sarama.V0_11_0_0 } else if !saramaConfig.Version.IsAtLeast(sarama.V0_11_0_0) { - log.Error("Tracing Sarama async producer requires at least sarama.V0_11_0_0 version") + instr.Logger().Error("Tracing Sarama async producer requires at least sarama.V0_11_0_0 version") } wrapped := &asyncProducer{ AsyncProducer: p, @@ -231,7 +237,7 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts errors: make(chan *sarama.ProducerError), } go func() { - spans := make(map[uint64]ddtrace.Span) + spans := make(map[uint64]*tracer.Span) defer close(wrapped.input) defer close(wrapped.successes) defer close(wrapped.errors) @@ -286,21 +292,26 @@ func WrapAsyncProducer(saramaConfig *sarama.Config, p sarama.AsyncProducer, opts return wrapped } -func startProducerSpan(cfg *config, version sarama.KafkaVersion, msg *sarama.ProducerMessage) ddtrace.Span { +func startProducerSpan(cfg *config, version sarama.KafkaVersion, msg *sarama.ProducerMessage) *tracer.Span { carrier := NewProducerMessageCarrier(msg) opts := []tracer.StartSpanOption{ tracer.ServiceName(cfg.producerServiceName), tracer.ResourceName("Produce Topic " + msg.Topic), tracer.SpanType(ext.SpanTypeMessageProducer), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageShopifySarama), tracer.Tag(ext.SpanKind, ext.SpanKindProducer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), + tracer.Tag(ext.MessagingDestinationName, msg.Topic), } if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } // if there's a span context in the headers, use that as the parent if spanctx, err := tracer.Extract(carrier); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } span := tracer.StartSpan(cfg.producerSpanName, opts...) @@ -311,7 +322,7 @@ func startProducerSpan(cfg *config, version sarama.KafkaVersion, msg *sarama.Pro return span } -func finishProducerSpan(span ddtrace.Span, partition int32, offset int64, err error) { +func finishProducerSpan(span *tracer.Span, partition int32, offset int64, err error) { span.SetTag(ext.MessagingKafkaPartition, partition) span.SetTag("offset", offset) span.Finish(tracer.WithError(err)) diff --git a/contrib/Shopify/sarama/sarama_test.go b/contrib/Shopify/sarama/sarama_test.go index 0cd54c045d..99c41dc28c 100644 --- a/contrib/Shopify/sarama/sarama_test.go +++ b/contrib/Shopify/sarama/sarama_test.go @@ -10,78 +10,17 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/Shopify/sarama" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func genTestSpans(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - broker := sarama.NewMockBroker(t, 1) - defer broker.Close() - - broker.SetHandlerByMap(map[string]sarama.MockResponse{ - "MetadataRequest": sarama.NewMockMetadataResponse(t). - SetBroker(broker.Addr(), broker.BrokerID()). - SetLeader("test-topic", 0, broker.BrokerID()), - "OffsetRequest": sarama.NewMockOffsetResponse(t). - SetOffset("test-topic", 0, sarama.OffsetOldest, 0). - SetOffset("test-topic", 0, sarama.OffsetNewest, 1), - "FetchRequest": sarama.NewMockFetchResponse(t, 1). - SetMessage("test-topic", 0, 0, sarama.StringEncoder("hello")), - "ProduceRequest": sarama.NewMockProduceResponse(t). - SetError("test-topic", 0, sarama.ErrNoError), - }) - cfg := sarama.NewConfig() - cfg.Version = sarama.MinVersion - cfg.Producer.Return.Successes = true - cfg.Producer.Flush.Messages = 1 - - producer, err := sarama.NewSyncProducer([]string{broker.Addr()}, cfg) - require.NoError(t, err) - producer = WrapSyncProducer(cfg, producer, opts...) - - c, err := sarama.NewConsumer([]string{broker.Addr()}, cfg) - require.NoError(t, err) - defer func(c sarama.Consumer) { - err := c.Close() - require.NoError(t, err) - }(c) - c = WrapConsumer(c, opts...) - - msg1 := &sarama.ProducerMessage{ - Topic: "test-topic", - Value: sarama.StringEncoder("test 1"), - Metadata: "test", - } - _, _, err = producer.SendMessage(msg1) - require.NoError(t, err) - - pc, err := c.ConsumePartition("test-topic", 0, 0) - require.NoError(t, err) - _ = <-pc.Messages() - err = pc.Close() - require.NoError(t, err) - // wait for the channel to be closed - <-pc.Messages() - - spans := mt.FinishedSpans() - require.Len(t, spans, 2) - return spans -} - func TestConsumer(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() @@ -128,16 +67,17 @@ func TestConsumer(t *testing.T) { s := spans[0] spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg1)) assert.NoError(t, err) - assert.Equal(t, spanctx.TraceID(), s.TraceID(), + assert.Equal(t, spanctx.TraceID(), s.Context().TraceID(), "span context should be injected into the consumer message headers") - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(0), s.Tag("offset")) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s.Tag("offset")) assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) assert.Equal(t, "Consume Topic test-topic", s.Tag(ext.ResourceName)) assert.Equal(t, "queue", s.Tag(ext.SpanType)) assert.Equal(t, "kafka.consume", s.OperationName()) assert.Equal(t, "Shopify/sarama", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageShopifySarama), s.Integration()) assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) @@ -152,16 +92,17 @@ func TestConsumer(t *testing.T) { s := spans[1] spanctx, err := tracer.Extract(NewConsumerMessageCarrier(msg2)) assert.NoError(t, err) - assert.Equal(t, spanctx.TraceID(), s.TraceID(), + assert.Equal(t, spanctx.TraceID(), s.Context().TraceID(), "span context should be injected into the consumer message headers") - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(1), s.Tag("offset")) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(1), s.Tag("offset")) assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) assert.Equal(t, "Consume Topic test-topic", s.Tag(ext.ResourceName)) assert.Equal(t, "queue", s.Tag(ext.SpanType)) assert.Equal(t, "kafka.consume", s.OperationName()) assert.Equal(t, "Shopify/sarama", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageShopifySarama), s.Integration()) assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) @@ -219,9 +160,10 @@ func TestSyncProducer(t *testing.T) { assert.Equal(t, "queue", s.Tag(ext.SpanType)) assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) assert.Equal(t, "kafka.produce", s.OperationName()) - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(0), s.Tag("offset")) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s.Tag("offset")) assert.Equal(t, "Shopify/sarama", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageShopifySarama), s.Integration()) assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) @@ -283,8 +225,9 @@ func TestSyncProducerSendMessages(t *testing.T) { assert.Equal(t, "queue", s.Tag(ext.SpanType)) assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) assert.Equal(t, "kafka.produce", s.OperationName()) - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "Shopify/sarama", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageShopifySarama), s.Integration()) assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) } @@ -339,6 +282,7 @@ func TestAsyncProducer(t *testing.T) { assert.Nil(t, s.Tag("offset")) assert.Equal(t, "Shopify/sarama", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageShopifySarama), s.Integration()) assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) @@ -380,9 +324,10 @@ func TestAsyncProducer(t *testing.T) { assert.Equal(t, "queue", s.Tag(ext.SpanType)) assert.Equal(t, "Produce Topic my_topic", s.Tag(ext.ResourceName)) assert.Equal(t, "kafka.produce", s.OperationName()) - assert.Equal(t, int32(0), s.Tag(ext.MessagingKafkaPartition)) - assert.Equal(t, int64(0), s.Tag("offset")) + assert.Equal(t, float64(0), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s.Tag("offset")) assert.Equal(t, "Shopify/sarama", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageShopifySarama), s.Integration()) assert.Equal(t, ext.SpanKindProducer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) @@ -396,10 +341,6 @@ func TestAsyncProducer(t *testing.T) { }) } -func TestNamingSchema(t *testing.T) { - namingschematest.NewKafkaTest(genTestSpans)(t) -} - func newMockBroker(t *testing.T) *sarama.MockBroker { broker := sarama.NewMockBroker(t, 1) diff --git a/contrib/aws/aws-sdk-go-v2/aws/aws.go b/contrib/aws/aws-sdk-go-v2/aws/aws.go index f193914cbd..eb21588eee 100644 --- a/contrib/aws/aws-sdk-go-v2/aws/aws.go +++ b/contrib/aws/aws-sdk-go-v2/aws/aws.go @@ -10,16 +10,9 @@ import ( "fmt" "math" "strings" + "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/internal/tags" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/aws/aws-sdk-go-v2/aws" awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/aws-sdk-go-v2/service/dynamodb" @@ -31,13 +24,26 @@ import ( "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/aws/smithy-go/middleware" smithyhttp "github.com/aws/smithy-go/transport/http" + + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal" + eventBridgeTracer "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal/eventbridge" + sfnTracer "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal/sfn" + snsTracer "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal/sns" + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal/spanpointers" + sqsTracer "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal/sqs" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "aws/aws-sdk-go-v2/aws" -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/aws/aws-sdk-go-v2") +var instr = internal.Instr + +var tagMapPool = sync.Pool{ + New: func() interface{} { + return make(map[string]string, 2) + }, } type spanTimestampKey struct{} @@ -49,7 +55,7 @@ func AppendMiddleware(awsCfg *aws.Config, opts ...Option) { defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } tm := traceMiddleware{cfg: cfg} @@ -80,31 +86,60 @@ func (mw *traceMiddleware) startTraceMiddleware(stack *middleware.Stack) error { ) { operation := awsmiddleware.GetOperationName(ctx) serviceID := awsmiddleware.GetServiceID(ctx) + region := awsmiddleware.GetRegion(ctx) + partition := awsmiddleware.GetPartitionID(ctx) - opts := []ddtrace.StartSpanOption{ + // if partition ID isn't set, derive partition from region + if partition == "" { + partition = awsPartition(region) + } + + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeHTTP), tracer.ServiceName(serviceName(mw.cfg, serviceID)), tracer.ResourceName(fmt.Sprintf("%s.%s", serviceID, operation)), - tracer.Tag(tags.OldAWSRegion, awsmiddleware.GetRegion(ctx)), - tracer.Tag(tags.AWSRegion, awsmiddleware.GetRegion(ctx)), - tracer.Tag(tags.AWSOperation, operation), - tracer.Tag(tags.OldAWSService, serviceID), - tracer.Tag(tags.AWSService, serviceID), + tracer.Tag(ext.AWSRegionLegacy, region), + tracer.Tag(ext.AWSRegion, region), + tracer.Tag(ext.AWSPartition, partition), + tracer.Tag(ext.AWSOperation, operation), + tracer.Tag(ext.AWSServiceLegacy, serviceID), + tracer.Tag(ext.AWSService, serviceID), tracer.StartTime(ctx.Value(spanTimestampKey{}).(time.Time)), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindClient), } - k, v, err := resourceNameFromParams(in, serviceID) - if err != nil { - log.Debug("Error: %v", err) + resourceTags, ok := resourceTagsFromParams(in, serviceID, region, partition) + if !ok { + instr.Logger().Debug("attempted to extract resourceTagsFromParams of an unsupported AWS service: %s", serviceID) } else { - opts = append(opts, tracer.Tag(k, v)) + for k, v := range resourceTags { + if v != "" { + opts = append(opts, tracer.Tag(k, v)) + } + delete(resourceTags, k) + } + tagMapPool.Put(resourceTags) } + if !math.IsNaN(mw.cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, mw.cfg.analyticsRate)) } span, spanctx := tracer.StartSpanFromContext(ctx, spanName(serviceID, operation), opts...) + // Inject trace context + switch serviceID { + case "SQS": + sqsTracer.EnrichOperation(span, in, operation) + case "SNS": + snsTracer.EnrichOperation(span, in, operation) + case "EventBridge": + eventBridgeTracer.EnrichOperation(span, in, operation) + case "SFN": + sfnTracer.EnrichOperation(span, in, operation) + case "DynamoDB": + spanctx = spanpointers.SetDynamoDbParamsOnContext(spanctx, in.Parameters) + } + // Handle initialize and continue through the middleware chain. out, metadata, err = next.HandleInitialize(spanctx, in) if err != nil && (mw.cfg.errCheck == nil || mw.cfg.errCheck(err)) { @@ -116,47 +151,84 @@ func (mw *traceMiddleware) startTraceMiddleware(stack *middleware.Stack) error { }), middleware.After) } -func resourceNameFromParams(requestInput middleware.InitializeInput, awsService string) (string, string, error) { - var k, v string +func awsPartition(region string) string { + var partition string + switch { + case strings.HasPrefix(region, "cn-"): + partition = "aws-cn" + case strings.HasPrefix(region, "us-gov-"): + partition = "aws-us-gov" + default: + partition = "aws" + } + + return partition +} + +func resourceTagsFromParams(requestInput middleware.InitializeInput, awsService string, region string, partition string) (map[string]string, bool) { + tags := tagMapPool.Get().(map[string]string) switch awsService { case "SQS": - k, v = tags.SQSQueueName, queueName(requestInput) + if url := queueURL(requestInput); url != "" { + queueName, arn := extractSQSMetadata(url, region, partition) + tags[ext.SQSQueueName] = queueName + tags[ext.CloudResourceID] = arn + } case "S3": - k, v = tags.S3BucketName, bucketName(requestInput) + tags[ext.S3BucketName] = bucketName(requestInput) case "SNS": - k, v = destinationTagValue(requestInput) + k, v := destinationTagValue(requestInput) + tags[k] = v case "DynamoDB": - k, v = tags.DynamoDBTableName, tableName(requestInput) + tags[ext.DynamoDBTableName] = tableName(requestInput) case "Kinesis": - k, v = tags.KinesisStreamName, streamName(requestInput) + tags[ext.KinesisStreamName] = streamName(requestInput) case "EventBridge": - k, v = tags.EventBridgeRuleName, ruleName(requestInput) + tags[ext.EventBridgeRuleName] = ruleName(requestInput) case "SFN": - k, v = tags.SFNStateMachineName, stateMachineName(requestInput) + tags[ext.SFNStateMachineName] = stateMachineName(requestInput) default: - return "", "", fmt.Errorf("attemped to extract ResourceNameFromParams of an unsupported AWS service: %s", awsService) + tagMapPool.Put(tags) + return nil, false } - return k, v, nil + return tags, true } -func queueName(requestInput middleware.InitializeInput) string { - var queueURL string +func queueURL(requestInput middleware.InitializeInput) string { switch params := requestInput.Parameters.(type) { case *sqs.SendMessageInput: - queueURL = *params.QueueUrl + return *params.QueueUrl case *sqs.DeleteMessageInput: - queueURL = *params.QueueUrl + return *params.QueueUrl case *sqs.DeleteMessageBatchInput: - queueURL = *params.QueueUrl + return *params.QueueUrl case *sqs.ReceiveMessageInput: - queueURL = *params.QueueUrl + return *params.QueueUrl case *sqs.SendMessageBatchInput: - queueURL = *params.QueueUrl + return *params.QueueUrl + } + return "" +} + +func extractSQSMetadata(queueURL string, region string, partition string) (queueName string, arn string) { + // Remove trailing slash if present + if len(queueURL) > 0 && queueURL[len(queueURL)-1] == '/' { + queueURL = queueURL[:len(queueURL)-1] } + + // *.amazonaws.com/{accountID}/{queueName} parts := strings.Split(queueURL, "/") - return parts[len(parts)-1] + if len(parts) < 2 { + return "", "" + } + + queueName = parts[len(parts)-1] + accountID := parts[len(parts)-2] + + arn = strings.Join([]string{"arn", partition, "sqs", region, accountID, queueName}, ":") + return queueName, arn } func bucketName(requestInput middleware.InitializeInput) string { @@ -178,7 +250,7 @@ func bucketName(requestInput middleware.InitializeInput) string { } func destinationTagValue(requestInput middleware.InitializeInput) (tag string, value string) { - tag = tags.SNSTopicName + tag = ext.SNSTopicName var s string switch params := requestInput.Parameters.(type) { case *sns.PublishInput: @@ -186,7 +258,7 @@ func destinationTagValue(requestInput middleware.InitializeInput) (tag string, v case params.TopicArn != nil: s = *params.TopicArn case params.TargetArn != nil: - tag = tags.SNSTargetName + tag = ext.SNSTargetName s = *params.TargetArn default: return "destination", "empty" @@ -222,6 +294,8 @@ func tableName(requestInput middleware.InitializeInput) string { return *params.TableName case *dynamodb.UpdateItemInput: return *params.TableName + case *dynamodb.DeleteItemInput: + return *params.TableName } return "" } @@ -324,7 +398,7 @@ func (mw *traceMiddleware) deserializeTraceMiddleware(stack *middleware.Stack) e url.User = nil // Do not include userinfo in the HTTPURL tag. span.SetTag(ext.HTTPMethod, req.Method) span.SetTag(ext.HTTPURL, url.String()) - span.SetTag(tags.AWSAgent, req.Header.Get("User-Agent")) + span.SetTag(ext.AWSAgent, req.Header.Get("User-Agent")) } // Continue through the middleware chain which eventually sends the request. @@ -337,23 +411,30 @@ func (mw *traceMiddleware) deserializeTraceMiddleware(stack *middleware.Stack) e // Extract the request id. if requestID, ok := awsmiddleware.GetRequestIDMetadata(metadata); ok { - span.SetTag(tags.AWSRequestID, requestID) + span.SetTag(ext.AWSRequestID, requestID) } + // Create span pointers + spanpointers.AddSpanPointers(ctx, in, out, span) + return out, metadata, err }), middleware.Before) } func spanName(awsService, awsOperation string) string { - return namingschema.AWSOpName(awsService, awsOperation, awsService+".request") + return instr.OperationName(instrumentation.ComponentDefault, instrumentation.OperationContext{ + ext.AWSService: awsService, + ext.AWSOperation: awsOperation, + }) } func serviceName(cfg *config, awsService string) string { if cfg.serviceName != "" { return cfg.serviceName } - defaultName := fmt.Sprintf("aws.%s", awsService) - return namingschema.ServiceNameOverrideV0(defaultName, defaultName) + return instr.ServiceName(instrumentation.ComponentDefault, instrumentation.OperationContext{ + ext.AWSService: awsService, + }) } func coalesceNameOrArnResource(name *string, arnVal *string) string { diff --git a/contrib/aws/aws-sdk-go-v2/aws/aws_test.go b/contrib/aws/aws-sdk-go-v2/aws/aws_test.go index 88fba42c5d..69e281f8ee 100644 --- a/contrib/aws/aws-sdk-go-v2/aws/aws_test.go +++ b/contrib/aws/aws-sdk-go-v2/aws/aws_test.go @@ -8,58 +8,30 @@ package aws import ( "context" "encoding/base64" + "encoding/json" "net/http" "net/http/httptest" "net/url" - "os" "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/aws/aws-sdk-go-v2/aws" - awsconfig "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/dynamodb" - "github.com/aws/aws-sdk-go-v2/service/ec2" "github.com/aws/aws-sdk-go-v2/service/eventbridge" + eventBridgeTypes "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" "github.com/aws/aws-sdk-go-v2/service/kinesis" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/aws-sdk-go-v2/service/sfn" "github.com/aws/aws-sdk-go-v2/service/sns" "github.com/aws/aws-sdk-go-v2/service/sqs" - "github.com/aws/aws-sdk-go-v2/service/sqs/types" "github.com/aws/smithy-go/middleware" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func newIntegrationTestConfig(t *testing.T, opts ...Option) aws.Config { - if _, ok := os.LookupEnv("INTEGRATION"); !ok { - t.Skip("🚧 Skipping integration test (INTEGRATION environment variable is not set)") - } - awsEndpoint := "http://localhost:4566/" // use localstack - awsRegion := "us-east-1" - - customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, opts ...interface{}) (aws.Endpoint, error) { - return aws.Endpoint{ - PartitionID: "aws", - URL: awsEndpoint, - SigningRegion: awsRegion, - }, nil - }) - cfg, err := awsconfig.LoadDefaultConfig( - context.Background(), - awsconfig.WithRegion(awsRegion), - awsconfig.WithEndpointResolverWithOptions(customResolver), - awsconfig.WithCredentialsProvider(aws.AnonymousCredentials{}), - ) - require.NoError(t, err, "failed to load AWS config") - AppendMiddleware(&cfg, opts...) - return cfg -} - func TestAppendMiddleware(t *testing.T) { tests := []struct { name string @@ -86,7 +58,7 @@ func TestAppendMiddleware(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -103,12 +75,14 @@ func TestAppendMiddleware(t *testing.T) { AppendMiddleware(&awsCfg) sqsClient := sqs.NewFromConfig(awsCfg) + // TODO(darccio): assert.NoError sqsClient.SendMessage(context.Background(), &sqs.SendMessageInput{ MessageBody: aws.String("foobar"), QueueUrl: aws.String("https://sqs.us-west-2.amazonaws.com/123456789012/MyQueueName"), }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "SQS.request", s.OperationName()) @@ -117,12 +91,14 @@ func TestAppendMiddleware(t *testing.T) { assert.Equal(t, "SQS", s.Tag("aws.service")) assert.Equal(t, "SQS", s.Tag("aws_service")) assert.Equal(t, "MyQueueName", s.Tag("queuename")) + assert.Equal(t, "arn:aws:sqs:eu-west-1:123456789012:MyQueueName", s.Tag("cloud.resource_id")) assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "SQS.SendMessage", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.SQS", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) if tt.expectedStatusCode == 200 { assert.Equal(t, "test_req", s.Tag("aws.request_id")) } @@ -130,6 +106,7 @@ func TestAppendMiddleware(t *testing.T) { assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } @@ -160,7 +137,7 @@ func TestAppendMiddlewareSqsDeleteMessage(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -183,6 +160,7 @@ func TestAppendMiddlewareSqsDeleteMessage(t *testing.T) { }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "SQS.request", s.OperationName()) @@ -191,12 +169,14 @@ func TestAppendMiddlewareSqsDeleteMessage(t *testing.T) { assert.Equal(t, "SQS", s.Tag("aws.service")) assert.Equal(t, "SQS", s.Tag("aws_service")) assert.Equal(t, "MyQueueName", s.Tag("queuename")) + assert.Equal(t, "arn:aws:sqs:eu-west-1:123456789012:MyQueueName", s.Tag("cloud.resource_id")) assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "SQS.DeleteMessage", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.SQS", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) if tt.expectedStatusCode == 200 { assert.Equal(t, "test_req", s.Tag("aws.request_id")) } @@ -204,9 +184,11 @@ func TestAppendMiddlewareSqsDeleteMessage(t *testing.T) { assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } + func TestAppendMiddlewareSqsReceiveMessage(t *testing.T) { tests := []struct { name string @@ -233,7 +215,7 @@ func TestAppendMiddlewareSqsReceiveMessage(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -255,6 +237,7 @@ func TestAppendMiddlewareSqsReceiveMessage(t *testing.T) { }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "SQS.request", s.OperationName()) @@ -263,13 +246,15 @@ func TestAppendMiddlewareSqsReceiveMessage(t *testing.T) { assert.Equal(t, "SQS", s.Tag("aws.service")) assert.Equal(t, "SQS", s.Tag("aws_service")) assert.Equal(t, "MyQueueName", s.Tag("queuename")) + assert.Equal(t, "arn:aws:sqs:eu-west-1:123456789012:MyQueueName", s.Tag("cloud.resource_id")) assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "SQS", s.Tag("aws.service")) assert.Equal(t, "SQS.ReceiveMessage", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.SQS", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) if tt.expectedStatusCode == 200 { assert.Equal(t, "test_req", s.Tag("aws.request_id")) } @@ -277,10 +262,72 @@ func TestAppendMiddlewareSqsReceiveMessage(t *testing.T) { assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } +func TestAppendMiddlewareSqsSendMessage(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + expectedStatusCode := 200 + server := mockAWS(expectedStatusCode) + defer server.Close() + + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { + return aws.Endpoint{ + PartitionID: "aws", + URL: server.URL, + SigningRegion: "eu-west-1", + }, nil + }) + + awsCfg := aws.Config{ + Region: "eu-west-1", + Credentials: aws.AnonymousCredentials{}, + EndpointResolver: resolver, + } + + AppendMiddleware(&awsCfg) + + sqsClient := sqs.NewFromConfig(awsCfg) + sendMessageInput := &sqs.SendMessageInput{ + MessageBody: aws.String("test message"), + QueueUrl: aws.String("https://sqs.eu-west-1.amazonaws.com/123456789012/MyQueueName"), + } + _, err := sqsClient.SendMessage(context.Background(), sendMessageInput) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + s := spans[0] + assert.Equal(t, "SQS.request", s.OperationName()) + assert.Equal(t, "SendMessage", s.Tag("aws.operation")) + assert.Equal(t, "SQS", s.Tag("aws.service")) + assert.Equal(t, "MyQueueName", s.Tag("queuename")) + assert.Equal(t, "arn:aws:sqs:eu-west-1:123456789012:MyQueueName", s.Tag("cloud.resource_id")) + assert.Equal(t, "SQS.SendMessage", s.Tag(ext.ResourceName)) + assert.Equal(t, "aws.SQS", s.Tag(ext.ServiceName)) + + // Check for trace context injection + assert.NotNil(t, sendMessageInput.MessageAttributes) + assert.Contains(t, sendMessageInput.MessageAttributes, "_datadog") + ddAttr := sendMessageInput.MessageAttributes["_datadog"] + assert.Equal(t, "String", *ddAttr.DataType) + assert.NotEmpty(t, *ddAttr.StringValue) + + // Decode and verify the injected trace context + var traceContext map[string]string + err = json.Unmarshal([]byte(*ddAttr.StringValue), &traceContext) + assert.NoError(t, err) + assert.Contains(t, traceContext, "x-datadog-trace-id") + assert.Contains(t, traceContext, "x-datadog-parent-id") + assert.NotEmpty(t, traceContext["x-datadog-trace-id"]) + assert.NotEmpty(t, traceContext["x-datadog-parent-id"]) +} + func TestAppendMiddlewareS3ListObjects(t *testing.T) { tests := []struct { name string @@ -307,7 +354,7 @@ func TestAppendMiddlewareS3ListObjects(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -329,6 +376,7 @@ func TestAppendMiddlewareS3ListObjects(t *testing.T) { }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "S3.request", s.OperationName()) @@ -340,13 +388,15 @@ func TestAppendMiddlewareS3ListObjects(t *testing.T) { assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "S3.ListObjects", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.S3", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) assert.Equal(t, "GET", s.Tag(ext.HTTPMethod)) assert.Equal(t, server.URL+"/MyBucketName", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } @@ -403,7 +453,7 @@ func TestAppendMiddlewareSnsPublish(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -423,6 +473,7 @@ func TestAppendMiddlewareSnsPublish(t *testing.T) { snsClient.Publish(context.Background(), tt.publishInput) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "SNS.request", s.OperationName()) @@ -434,13 +485,31 @@ func TestAppendMiddlewareSnsPublish(t *testing.T) { assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "SNS.Publish", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.SNS", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) assert.Equal(t, "POST", s.Tag(ext.HTTPMethod)) assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) + + // Check for trace context injection + assert.NotNil(t, tt.publishInput.MessageAttributes) + assert.Contains(t, tt.publishInput.MessageAttributes, "_datadog") + ddAttr := tt.publishInput.MessageAttributes["_datadog"] + assert.Equal(t, "Binary", *ddAttr.DataType) + assert.NotEmpty(t, ddAttr.BinaryValue) + + // Decode and verify the injected trace context + var traceContext map[string]string + err := json.Unmarshal(ddAttr.BinaryValue, &traceContext) + assert.NoError(t, err) + assert.Contains(t, traceContext, "x-datadog-trace-id") + assert.Contains(t, traceContext, "x-datadog-parent-id") + assert.NotEmpty(t, traceContext["x-datadog-trace-id"]) + assert.NotEmpty(t, traceContext["x-datadog-parent-id"]) }) } } @@ -471,7 +540,7 @@ func TestAppendMiddlewareDynamodbGetItem(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -488,11 +557,17 @@ func TestAppendMiddlewareDynamodbGetItem(t *testing.T) { AppendMiddleware(&awsCfg) dynamoClient := dynamodb.NewFromConfig(awsCfg) - dynamoClient.Query(context.Background(), &dynamodb.QueryInput{ + _, err := dynamoClient.Query(context.Background(), &dynamodb.QueryInput{ TableName: aws.String("MyTableName"), }) + if tt.expectedStatusCode == 200 { + require.NoError(t, err) + } else { + require.Error(t, err) + } spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "DynamoDB.request", s.OperationName()) @@ -504,13 +579,15 @@ func TestAppendMiddlewareDynamodbGetItem(t *testing.T) { assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "DynamoDB.Query", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.DynamoDB", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) assert.Equal(t, "POST", s.Tag(ext.HTTPMethod)) assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } @@ -541,7 +618,7 @@ func TestAppendMiddlewareKinesisPutRecord(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -565,6 +642,7 @@ func TestAppendMiddlewareKinesisPutRecord(t *testing.T) { }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "Kinesis.request", s.OperationName()) @@ -576,13 +654,15 @@ func TestAppendMiddlewareKinesisPutRecord(t *testing.T) { assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "Kinesis.PutRecord", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.Kinesis", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) assert.Equal(t, "POST", s.Tag(ext.HTTPMethod)) assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } @@ -613,7 +693,7 @@ func TestAppendMiddlewareEventBridgePutRule(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -635,6 +715,7 @@ func TestAppendMiddlewareEventBridgePutRule(t *testing.T) { }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "EventBridge.request", s.OperationName()) @@ -646,17 +727,75 @@ func TestAppendMiddlewareEventBridgePutRule(t *testing.T) { assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "EventBridge.PutRule", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.EventBridge", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) assert.Equal(t, "POST", s.Tag(ext.HTTPMethod)) assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } +func TestAppendMiddlewareEventBridgePutEvents(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + expectedStatusCode := 200 + server := mockAWS(expectedStatusCode) + defer server.Close() + + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { + return aws.Endpoint{ + PartitionID: "aws", + URL: server.URL, + SigningRegion: "eu-west-1", + }, nil + }) + + awsCfg := aws.Config{ + Region: "eu-west-1", + Credentials: aws.AnonymousCredentials{}, + EndpointResolver: resolver, + } + + AppendMiddleware(&awsCfg) + + eventbridgeClient := eventbridge.NewFromConfig(awsCfg) + putEventsInput := &eventbridge.PutEventsInput{ + Entries: []eventBridgeTypes.PutEventsRequestEntry{ + { + EventBusName: aws.String("my-event-bus"), + Detail: aws.String(`{"key": "value"}`), + }, + }, + } + eventbridgeClient.PutEvents(context.Background(), putEventsInput) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + s := spans[0] + assert.Equal(t, "PutEvents", s.Tag("aws.operation")) + assert.Equal(t, "EventBridge.PutEvents", s.Tag(ext.ResourceName)) + + // Check for trace context injection + assert.Len(t, putEventsInput.Entries, 1) + entry := putEventsInput.Entries[0] + var detail map[string]interface{} + err := json.Unmarshal([]byte(*entry.Detail), &detail) + assert.NoError(t, err) + assert.Contains(t, detail, "_datadog") + ddData, ok := detail["_datadog"].(map[string]interface{}) + assert.True(t, ok) + assert.Contains(t, ddData, "x-datadog-start-time") + assert.Contains(t, ddData, "x-datadog-resource-name") + assert.Equal(t, "my-event-bus", ddData["x-datadog-resource-name"]) +} + func TestAppendMiddlewareSfnDescribeStateMachine(t *testing.T) { tests := []struct { name string @@ -683,7 +822,7 @@ func TestAppendMiddlewareSfnDescribeStateMachine(t *testing.T) { server := mockAWS(tt.expectedStatusCode) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -705,6 +844,7 @@ func TestAppendMiddlewareSfnDescribeStateMachine(t *testing.T) { }) spans := mt.FinishedSpans() + require.Len(t, spans, 1) s := spans[0] assert.Equal(t, "SFN.request", s.OperationName()) @@ -716,22 +856,97 @@ func TestAppendMiddlewareSfnDescribeStateMachine(t *testing.T) { assert.Equal(t, "eu-west-1", s.Tag("aws.region")) assert.Equal(t, "eu-west-1", s.Tag("region")) + assert.Equal(t, "aws", s.Tag(ext.AWSPartition)) assert.Equal(t, "SFN.DescribeStateMachine", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.SFN", s.Tag(ext.ServiceName)) - assert.Equal(t, tt.expectedStatusCode, s.Tag(ext.HTTPCode)) + assert.Equal(t, float64(tt.expectedStatusCode), s.Tag(ext.HTTPCode)) assert.Equal(t, "POST", s.Tag(ext.HTTPMethod)) assert.Equal(t, server.URL+"/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go-v2/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } } +func TestAppendMiddleware_ChainTerminated(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + awsCfg := aws.Config{} + + AppendMiddleware(&awsCfg) + + s3Client := s3.NewFromConfig(awsCfg) + stackFn := func(stack *middleware.Stack) error { + return stack.Initialize.Add(middleware.InitializeMiddlewareFunc("stop", func( + ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, + ) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, + ) { + // Terminate the middleware chain by not calling the next handler + out.Result = &s3.ListObjectsOutput{} + return + }), middleware.After) + } + s3Client.ListObjects(context.Background(), &s3.ListObjectsInput{ + Bucket: aws.String("MyBucketName"), + }, s3.WithAPIOptions(stackFn)) + + spans := mt.FinishedSpans() + assert.Len(t, spans, 1) +} + +func TestAppendMiddleware_InnerSpan(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + server := mockAWS(200) + defer server.Close() + + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { + return aws.Endpoint{ + PartitionID: "aws", + URL: server.URL, + SigningRegion: "eu-west-1", + }, nil + }) + + awsCfg := aws.Config{ + Region: "eu-west-1", + Credentials: aws.AnonymousCredentials{}, + EndpointResolver: resolver, + } + + AppendMiddleware(&awsCfg) + + s3Client := s3.NewFromConfig(awsCfg) + stackFn := func(stack *middleware.Stack) error { + return stack.Initialize.Add(middleware.InitializeMiddlewareFunc("stop", func( + ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, + ) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, + ) { + // Start a new child span + span, ctx := tracer.StartSpanFromContext(ctx, "inner span") + defer span.Finish() + out, metadata, err = next.HandleInitialize(ctx, in) + return + }), middleware.After) + } + s3Client.ListObjects(context.Background(), &s3.ListObjectsInput{ + Bucket: aws.String("MyBucketName"), + }, s3.WithAPIOptions(stackFn)) + + spans := mt.FinishedSpans() + assert.Len(t, spans, 2) +} + func TestAppendMiddleware_WithNoTracer(t *testing.T) { server := mockAWS(200) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -755,7 +970,7 @@ func TestAppendMiddleware_WithNoTracer(t *testing.T) { func mockAWS(statusCode int) *httptest.Server { return httptest.NewServer(http.HandlerFunc( - func(w http.ResponseWriter, r *http.Request) { + func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("X-Amz-RequestId", "test_req") w.WriteHeader(statusCode) w.Write([]byte(`{}`)) @@ -789,7 +1004,7 @@ func TestAppendMiddleware_WithOpts(t *testing.T) { }, { name: "with service name", - opts: []Option{WithServiceName("TestName")}, + opts: []Option{WithService("TestName")}, expectedServiceName: "TestName", expectedRate: nil, }, @@ -814,7 +1029,7 @@ func TestAppendMiddleware_WithOpts(t *testing.T) { server := mockAWS(200) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -867,7 +1082,7 @@ func TestHTTPCredentials(t *testing.T) { require.NoError(t, err) u.User = url.UserPassword("myuser", "mypassword") - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: u.String(), @@ -897,128 +1112,6 @@ func TestHTTPCredentials(t *testing.T) { assert.Equal(t, auth, "myuser:mypassword") } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - awsCfg := newIntegrationTestConfig(t, opts...) - ctx := context.Background() - ec2Client := ec2.NewFromConfig(awsCfg) - s3Client := s3.NewFromConfig(awsCfg) - sqsClient := sqs.NewFromConfig(awsCfg) - snsClient := sns.NewFromConfig(awsCfg) - - _, err := ec2Client.DescribeInstances(ctx, &ec2.DescribeInstancesInput{}) - require.NoError(t, err) - _, err = s3Client.ListBuckets(ctx, &s3.ListBucketsInput{}) - require.NoError(t, err) - _, err = sqsClient.ListQueues(ctx, &sqs.ListQueuesInput{}) - require.NoError(t, err) - _, err = snsClient.ListTopics(ctx, &sns.ListTopicsInput{}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - assert.Equal(t, "EC2.request", spans[0].OperationName()) - assert.Equal(t, "S3.request", spans[1].OperationName()) - assert.Equal(t, "SQS.request", spans[2].OperationName()) - assert.Equal(t, "SNS.request", spans[3].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - assert.Equal(t, "aws.ec2.request", spans[0].OperationName()) - assert.Equal(t, "aws.s3.request", spans[1].OperationName()) - assert.Equal(t, "aws.sqs.request", spans[2].OperationName()) - assert.Equal(t, "aws.sns.request", spans[3].OperationName()) - } - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"aws.EC2", "aws.S3", "aws.SQS", "aws.SNS"}, - WithDDService: []string{"aws.EC2", "aws.S3", "aws.SQS", "aws.SNS"}, - WithDDServiceAndOverride: []string{serviceOverride, serviceOverride, serviceOverride, serviceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} - -func TestMessagingNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - awsCfg := newIntegrationTestConfig(t, opts...) - resourceName := "test-naming-schema-aws-v2" - ctx := context.Background() - sqsClient := sqs.NewFromConfig(awsCfg) - snsClient := sns.NewFromConfig(awsCfg) - - // create a SQS queue - sqsResp, err := sqsClient.CreateQueue(ctx, &sqs.CreateQueueInput{QueueName: aws.String(resourceName)}) - require.NoError(t, err) - - msg := &sqs.SendMessageInput{QueueUrl: sqsResp.QueueUrl, MessageBody: aws.String("body")} - _, err = sqsClient.SendMessage(ctx, msg) - require.NoError(t, err) - - entry := types.SendMessageBatchRequestEntry{Id: aws.String("1"), MessageBody: aws.String("body")} - batchMsg := &sqs.SendMessageBatchInput{QueueUrl: sqsResp.QueueUrl, Entries: []types.SendMessageBatchRequestEntry{entry}} - _, err = sqsClient.SendMessageBatch(ctx, batchMsg) - require.NoError(t, err) - - // create an SNS topic - snsResp, err := snsClient.CreateTopic(ctx, &sns.CreateTopicInput{Name: aws.String(resourceName)}) - require.NoError(t, err) - - _, err = snsClient.Publish(ctx, &sns.PublishInput{TopicArn: snsResp.TopicArn, Message: aws.String("message")}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 5) - assert.Equal(t, "SQS.request", spans[0].OperationName()) - assert.Equal(t, "SQS.request", spans[1].OperationName()) - assert.Equal(t, "SQS.request", spans[2].OperationName()) - assert.Equal(t, "SNS.request", spans[3].OperationName()) - assert.Equal(t, "SNS.request", spans[4].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 5) - assert.Equal(t, "aws.sqs.request", spans[0].OperationName()) - assert.Equal(t, "aws.sqs.send", spans[1].OperationName()) - assert.Equal(t, "aws.sqs.send", spans[2].OperationName()) - assert.Equal(t, "aws.sns.request", spans[3].OperationName()) - assert.Equal(t, "aws.sns.send", spans[4].OperationName()) - } - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"aws.SQS", "aws.SQS", "aws.SQS", "aws.SNS", "aws.SNS"}, - WithDDService: []string{"aws.SQS", "aws.SQS", "aws.SQS", "aws.SNS", "aws.SNS"}, - WithDDServiceAndOverride: repeat(serviceOverride, 5), - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} - -func repeat(s string, n int) []string { - r := make([]string, n) - for i := 0; i < n; i++ { - r[i] = s - } - return r -} - func TestWithErrorCheck(t *testing.T) { tests := []struct { name string @@ -1032,13 +1125,13 @@ func TestWithErrorCheck(t *testing.T) { }, { name: "with errCheck true", - opts: []Option{WithErrorCheck(func(err error) bool { + opts: []Option{WithErrorCheck(func(_ error) bool { return true })}, errExist: true, }, { name: "with errCheck false", - opts: []Option{WithErrorCheck(func(err error) bool { + opts: []Option{WithErrorCheck(func(_ error) bool { return false })}, errExist: false, @@ -1052,7 +1145,7 @@ func TestWithErrorCheck(t *testing.T) { server := mockAWS(400) defer server.Close() - resolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) { + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: server.URL, @@ -1074,7 +1167,7 @@ func TestWithErrorCheck(t *testing.T) { spans := mt.FinishedSpans() assert.Len(t, spans, 1) s := spans[0] - assert.Equal(t, tt.errExist, s.Tag(ext.Error) != nil) + assert.Equal(t, tt.errExist, s.Tag(ext.ErrorMsg) != nil) }) } } @@ -1139,3 +1232,120 @@ func TestStreamName(t *testing.T) { }) } } + +func TestPartitionTag(t *testing.T) { + tests := []struct { + region string + partition string + }{ + {"us-east-1", "aws"}, + {"eu-west-1", "aws"}, + {"cn-north-1", "aws-cn"}, + {"us-gov-east-1", "aws-us-gov"}, + } + + for _, tt := range tests { + t.Run(tt.region, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + server := mockAWS(200) + defer server.Close() + + resolver := aws.EndpointResolverFunc(func(_, _ string) (aws.Endpoint, error) { + return aws.Endpoint{ + PartitionID: tt.partition, + URL: server.URL, + SigningRegion: tt.region, + }, nil + }) + + awsCfg := aws.Config{ + Region: tt.region, + Credentials: aws.AnonymousCredentials{}, + EndpointResolver: resolver, + } + + AppendMiddleware(&awsCfg) + + sqsClient := sqs.NewFromConfig(awsCfg) + sqsClient.ListQueues(context.Background(), &sqs.ListQueuesInput{}) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + s := spans[0] + assert.Equal(t, tt.partition, s.Tag(ext.AWSPartition)) + assert.Equal(t, tt.region, s.Tag(ext.AWSRegion)) + }) + } +} + +func TestExtractSQSMetadata(t *testing.T) { + tests := []struct { + name string + queueURL string + region string + expectedQueueName string + expectedARN string + }{ + { + name: "normal URL", + queueURL: "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue", + region: "us-east-1", + expectedQueueName: "MyQueue", + expectedARN: "arn:aws:sqs:us-east-1:123456789012:MyQueue", + }, + { + name: "URL with trailing slash", + queueURL: "https://sqs.eu-west-1.amazonaws.com/123456789012/MyQueue/", + region: "eu-west-1", + expectedQueueName: "MyQueue", + expectedARN: "arn:aws:sqs:eu-west-1:123456789012:MyQueue", + }, + { + name: "China region", + queueURL: "https://sqs.cn-north-1.amazonaws.com.cn/123456789012/ChinaQueue", + region: "cn-north-1", + expectedQueueName: "ChinaQueue", + expectedARN: "arn:aws-cn:sqs:cn-north-1:123456789012:ChinaQueue", + }, + { + name: "GovCloud region", + queueURL: "https://sqs.us-gov-west-1.amazonaws.com/123456789012/GovQueue", + region: "us-gov-west-1", + expectedQueueName: "GovQueue", + expectedARN: "arn:aws-us-gov:sqs:us-gov-west-1:123456789012:GovQueue", + }, + { + name: "malformed URL - just slash", + queueURL: "/", + region: "us-east-1", + expectedQueueName: "", + expectedARN: "", + }, + { + name: "malformed URL - empty", + queueURL: "", + region: "us-east-1", + expectedQueueName: "", + expectedARN: "", + }, + { + name: "malformed URL - single part", + queueURL: "invalidurl", + region: "us-east-1", + expectedQueueName: "", + expectedARN: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + partition := awsPartition(tt.region) + queueName, arn := extractSQSMetadata(tt.queueURL, tt.region, partition) + assert.Equal(t, tt.expectedQueueName, queueName) + assert.Equal(t, tt.expectedARN, arn) + }) + } +} diff --git a/contrib/aws/aws-sdk-go-v2/aws/doc.go b/contrib/aws/aws-sdk-go-v2/aws/doc.go index c8a4ea63bf..7568b598fd 100644 --- a/contrib/aws/aws-sdk-go-v2/aws/doc.go +++ b/contrib/aws/aws-sdk-go-v2/aws/doc.go @@ -18,9 +18,9 @@ // "github.com/aws/aws-sdk-go-v2/service/s3" // "github.com/aws/aws-sdk-go-v2/service/sqs" // -// awstrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/aws-sdk-go-v2/aws" -// "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" -// "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +// awstrace "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws" +// "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" +// "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" // ) // // func Example() { @@ -37,7 +37,7 @@ // func Example_context() { // cfg, err := awscfg.LoadDefaultConfig(context.TODO(), awscfg.WithRegion("us-west-2")) // if err != nil { -// log.Fatalf("error: %v", err) +// log.Fatalf("error: %s", err.Error()) // } // awstrace.AppendMiddleware(&cfg) // client := s3.NewFromConfig(cfg) @@ -55,7 +55,7 @@ // filename := "my_image.png" // file, err := os.Open(filename) // if err != nil { -// log.Fatalf("error: %v", err) +// log.Fatalf("error: %s", err.Error()) // } // defer file.Close() // @@ -68,7 +68,7 @@ // // Inherit parent span from context. // _, err = uploader.Upload(ctx, uploadParams) // if err != nil { -// log.Fatalf("error: %v", err) +// log.Fatalf("error: %s", err.Error()) // } // } package aws diff --git a/contrib/aws/aws-sdk-go-v2/aws/example_test.go b/contrib/aws/aws-sdk-go-v2/aws/example_test.go index 6ab7a4cb00..f74e76683b 100644 --- a/contrib/aws/aws-sdk-go-v2/aws/example_test.go +++ b/contrib/aws/aws-sdk-go-v2/aws/example_test.go @@ -5,4 +5,70 @@ package aws_test -// The example was moved into the package godoc to avoid adding its dependencies into dd-trace-go's go.mod file. +import ( + "context" + "log" + "os" + + "github.com/aws/aws-sdk-go-v2/aws" + awscfg "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/sqs" + + awstrace "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func Example() { + awsCfg, err := awscfg.LoadDefaultConfig(context.Background()) + if err != nil { + log.Fatal(err.Error()) + } + awstrace.AppendMiddleware(&awsCfg) + sqsClient := sqs.NewFromConfig(awsCfg) + sqsClient.ListQueues(context.Background(), &sqs.ListQueuesInput{}) +} + +// An example of the aws span inheriting a parent span from context. +func Example_context() { + tracer.Start() + defer tracer.Stop() + + cfg, err := awscfg.LoadDefaultConfig(context.TODO(), awscfg.WithRegion("us-west-2")) + if err != nil { + log.Fatalf("error: %v", err) + } + awstrace.AppendMiddleware(&cfg) + client := s3.NewFromConfig(cfg) + uploader := manager.NewUploader(client) + + // Create a root span. + span, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", + tracer.SpanType(ext.SpanTypeWeb), + tracer.ServiceName("web"), + tracer.ResourceName("/upload"), + ) + defer span.Finish() + + // Open image file. + filename := "my_image.png" + file, err := os.Open(filename) + if err != nil { + log.Fatalf("error: %v", err) + } + defer file.Close() + + uploadParams := &s3.PutObjectInput{ + Bucket: aws.String("my_bucket"), + Key: aws.String(filename), + Body: file, + ContentType: aws.String("image/png"), + } + // Inherit parent span from context. + _, err = uploader.Upload(ctx, uploadParams) + if err != nil { + log.Fatalf("error: %v", err) + } +} diff --git a/contrib/aws/aws-sdk-go-v2/aws/option.go b/contrib/aws/aws-sdk-go-v2/aws/option.go index 755c5a6679..25230684eb 100644 --- a/contrib/aws/aws-sdk-go-v2/aws/option.go +++ b/contrib/aws/aws-sdk-go-v2/aws/option.go @@ -7,8 +7,6 @@ package aws import ( "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -17,28 +15,33 @@ type config struct { errCheck func(err error) bool } -// Option represents an option that can be passed to Dial. -type Option func(*config) +// Option describes options for the AWS integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to AppendMiddleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - if internal.BoolEnv("DD_TRACE_AWS_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the dialled connection. +// WithService sets the given service name for the dialled connection. // When the service name is not explicitly set it will be inferred based on the // request to AWS. -func WithServiceName(name string) Option { +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -50,7 +53,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -63,7 +66,7 @@ func WithAnalyticsRate(rate float64) Option { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. The fn is called whenever an aws operation // finishes with an error. -func WithErrorCheck(fn func(err error) bool) Option { +func WithErrorCheck(fn func(err error) bool) OptionFn { return func(cfg *config) { cfg.errCheck = fn } diff --git a/contrib/aws/aws-sdk-go-v2/aws/orchestrion.yml b/contrib/aws/aws-sdk-go-v2/aws/orchestrion.yml new file mode 100644 index 0000000000..0dd57be98f --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/aws/orchestrion.yml @@ -0,0 +1,44 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws + description: The official AWS SDK for Go + +aspects: + - id: Config + join-point: + struct-literal: + type: github.com/aws/aws-sdk-go-v2/aws.Config + match: value-only + advice: + - wrap-expression: + imports: + awstrace: github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws + aws: github.com/aws/aws-sdk-go-v2/aws + template: |- + func(cfg aws.Config) (aws.Config) { + awstrace.AppendMiddleware(&cfg) + return cfg + }({{ . }}) + + - id: '*Config' + join-point: + one-of: + - struct-literal: + type: github.com/aws/aws-sdk-go-v2/aws.Config + match: pointer-only + - function-call: github.com/aws/aws-sdk-go-v2/aws.NewConfig + advice: + - wrap-expression: + imports: + awstrace: github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws + aws: github.com/aws/aws-sdk-go-v2/aws + template: |- + func(cfg *aws.Config) (*aws.Config) { + awstrace.AppendMiddleware(cfg) + return cfg + }({{ . }}) diff --git a/contrib/aws/aws-sdk-go-v2/go.mod b/contrib/aws/aws-sdk-go-v2/go.mod new file mode 100644 index 0000000000..c70b670b4d --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/go.mod @@ -0,0 +1,120 @@ +module github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/aws/aws-sdk-go-v2 v1.26.1 + github.com/aws/aws-sdk-go-v2/config v1.27.11 + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 + github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4 + github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4 + github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 + github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4 + github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 + github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 + github.com/aws/smithy-go v1.20.2 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.11 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/aws/aws-sdk-go-v2/go.sum b/contrib/aws/aws-sdk-go-v2/go.sum new file mode 100644 index 0000000000..bfc41a5fac --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/go.sum @@ -0,0 +1,368 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= +github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14 h1:Nhcq+ODoD9FRQYI3lATy6iADS5maER3ZXSfE8v3FMh8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14/go.mod h1:VlBbwTpgCj3rKWMVkEAYiAR3FKs7Mi3jALTMGfbfuns= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 h1:dZXY07Dm59TxAjJcUfNMJHLDI/gLMxTRZefn2jFAVsw= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1/go.mod h1:lVLqEtX+ezgtfalyJs7Peb0uv9dEpAQP5yuq2O26R44= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4 h1:Vz4ilZcVXCR9yatX5yfMrkBldYggtkih3h7woHvzu5Q= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4/go.mod h1:aIINXlt2xXhMeRsyCsLDUDohI8AdDm92gY9nIB6pv0M= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6 h1:6tayEze2Y+hiL3kdnEUxSPsP+pJsUfwLSFspFl1ru9Q= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6/go.mod h1:qVNb/9IOVsLCZh0x2lnagrBwQ9fxajUpXS7OZfIsKn0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4 h1:Oe8awBiS/iitcsRJB5+DHa3iCxoA0KwJJf0JNrYMINY= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4/go.mod h1:RCZCSFbieSgNG1RKegO26opXV4EXyef/vNBVJsUyHuw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= +github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4 h1:LM5AENhJDUd3fHP5NI8hk1jR+Io54/TmEQCWkRmfJE8= +github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4/go.mod h1:YYRs4t+xgLXx9lBMW8Rs6wF61RtEOFrKa8hNMgq6DvI= +github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 h1:VhW/J21SPH9bNmk1IYdZtzqA6//N2PB5Py5RexNmLVg= +github.com/aws/aws-sdk-go-v2/service/sns v1.29.4/go.mod h1:DojKGyWXa4p+e+C+GpG7qf02QaE68Nrg2v/UAXQhKhU= +github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 h1:mE2ysZMEeQ3ulHWs4mmc4fZEhOfeY1o6QXAfDqjbSgw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4/go.mod h1:lCN2yKnj+Sp9F6UzpoPPTir+tSaC9Jwf6LcmTqnXFZw= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/aws/aws-sdk-go-v2/internal/eventbridge/eventbridge.go b/contrib/aws/aws-sdk-go-v2/internal/eventbridge/eventbridge.go new file mode 100644 index 0000000000..3af9f0b659 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/eventbridge/eventbridge.go @@ -0,0 +1,115 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package eventbridge + +import ( + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" + "github.com/aws/smithy-go/middleware" +) + +const ( + datadogKey = "_datadog" + startTimeKey = "x-datadog-start-time" + resourceNameKey = "x-datadog-resource-name" + maxSizeBytes = 256 * 1024 // 256 KB +) + +var instr = internal.Instr + +func EnrichOperation(span *tracer.Span, in middleware.InitializeInput, operation string) { + switch operation { + case "PutEvents": + handlePutEvents(span, in) + } +} + +func handlePutEvents(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*eventbridge.PutEventsInput) + if !ok { + instr.Logger().Debug("Unable to read PutEvents params") + return + } + + // Create trace context + carrier := tracer.TextMapCarrier{} + err := tracer.Inject(span.Context(), carrier) + if err != nil { + instr.Logger().Debug("Unable to inject trace context: %s", err.Error()) + return + } + + // Add start time + startTimeMillis := time.Now().UnixMilli() + carrier[startTimeKey] = strconv.FormatInt(startTimeMillis, 10) + + carrierJSON, err := json.Marshal(carrier) + if err != nil { + instr.Logger().Debug("Unable to marshal trace context: %s", err.Error()) + return + } + + // Remove last '}' + reusedTraceContext := string(carrierJSON[:len(carrierJSON)-1]) + + for i := range params.Entries { + injectTraceContext(reusedTraceContext, ¶ms.Entries[i]) + } +} + +func injectTraceContext(baseTraceContext string, entryPtr *types.PutEventsRequestEntry) { + if entryPtr == nil { + return + } + + // Build the complete trace context + var traceContext string + if entryPtr.EventBusName != nil { + traceContext = fmt.Sprintf(`%s,"%s":"%s"}`, baseTraceContext, resourceNameKey, *entryPtr.EventBusName) + } else { + traceContext = baseTraceContext + "}" + } + + // Get current detail string + var detail string + if entryPtr.Detail == nil || *entryPtr.Detail == "" { + detail = "{}" + } else { + detail = *entryPtr.Detail + } + + // Basic JSON structure validation + if len(detail) < 2 || detail[len(detail)-1] != '}' { + instr.Logger().Debug("Unable to parse detail JSON. Not injecting trace context into EventBridge payload.") + return + } + + // Create new detail string + var newDetail string + if len(detail) > 2 { + // Case where detail is not empty + newDetail = fmt.Sprintf(`%s,"%s":%s}`, detail[:len(detail)-1], datadogKey, traceContext) + } else { + // Cae where detail is empty + newDetail = fmt.Sprintf(`{"%s":%s}`, datadogKey, traceContext) + } + + // Check sizes + if len(newDetail) > maxSizeBytes { + instr.Logger().Debug("Payload size too large to pass context") + return + } + + entryPtr.Detail = aws.String(newDetail) +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/eventbridge/eventbridge_test.go b/contrib/aws/aws-sdk-go-v2/internal/eventbridge/eventbridge_test.go new file mode 100644 index 0000000000..92600d9334 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/eventbridge/eventbridge_test.go @@ -0,0 +1,195 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package eventbridge + +import ( + "context" + "encoding/json" + "fmt" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/eventbridge" + "github.com/aws/aws-sdk-go-v2/service/eventbridge/types" + "github.com/aws/smithy-go/middleware" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEnrichOperation(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + span := tracer.StartSpan("test-span") + + input := middleware.InitializeInput{ + Parameters: &eventbridge.PutEventsInput{ + Entries: []types.PutEventsRequestEntry{ + { + Detail: aws.String(`{"@123": "value", "_foo": "bar"}`), + EventBusName: aws.String("test-bus"), + }, + { + Detail: aws.String(`{"@123": "data", "_foo": "bar"}`), + EventBusName: aws.String("test-bus-2"), + }, + }, + }, + } + + EnrichOperation(span, input, "PutEvents") + + params, ok := input.Parameters.(*eventbridge.PutEventsInput) + require.True(t, ok) + require.Len(t, params.Entries, 2) + + for _, entry := range params.Entries { + var detail map[string]interface{} + err := json.Unmarshal([]byte(*entry.Detail), &detail) + require.NoError(t, err) + + assert.Contains(t, detail, "@123") // make sure user data still exists + assert.Contains(t, detail, "_foo") + assert.Contains(t, detail, datadogKey) + ddData, ok := detail[datadogKey].(map[string]interface{}) + require.True(t, ok) + + assert.Contains(t, ddData, startTimeKey) + assert.Contains(t, ddData, resourceNameKey) + assert.Equal(t, *entry.EventBusName, ddData[resourceNameKey]) + } +} + +func TestInjectTraceContext(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + ctx := context.Background() + span, _ := tracer.StartSpanFromContext(ctx, "test-span") + baseTraceContext := fmt.Sprintf(`{"x-datadog-trace-id":"%d","x-datadog-parent-id":"%d","x-datadog-start-time":"123456789"`, span.Context().TraceIDLower(), span.Context().SpanID()) + + tests := []struct { + name string + entry types.PutEventsRequestEntry + expected func(*testing.T, *types.PutEventsRequestEntry) + }{ + { + name: "Inject into empty detail", + entry: types.PutEventsRequestEntry{ + EventBusName: aws.String("test-bus"), + }, + expected: func(t *testing.T, entry *types.PutEventsRequestEntry) { + assert.NotNil(t, entry.Detail) + var detail map[string]interface{} + err := json.Unmarshal([]byte(*entry.Detail), &detail) + require.NoError(t, err) + assert.Contains(t, detail, datadogKey) + }, + }, + { + name: "Inject into existing detail", + entry: types.PutEventsRequestEntry{ + Detail: aws.String(`{"existing": "data"}`), + EventBusName: aws.String("test-bus"), + }, + expected: func(t *testing.T, entry *types.PutEventsRequestEntry) { + var detail map[string]interface{} + err := json.Unmarshal([]byte(*entry.Detail), &detail) + require.NoError(t, err) + assert.Contains(t, detail, "existing") + assert.Equal(t, "data", detail["existing"]) + assert.Contains(t, detail, datadogKey) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + injectTraceContext(baseTraceContext, &tt.entry) + tt.expected(t, &tt.entry) + + fmt.Printf("entry = %+v\n", tt.entry) + + var detail map[string]interface{} + err := json.Unmarshal([]byte(*tt.entry.Detail), &detail) + require.NoError(t, err) + + ddData := detail[datadogKey].(map[string]interface{}) + assert.Contains(t, ddData, startTimeKey) + assert.Contains(t, ddData, resourceNameKey) + assert.Equal(t, *tt.entry.EventBusName, ddData[resourceNameKey]) + + // Check that start time exists and is not empty + startTime, ok := ddData[startTimeKey] + assert.True(t, ok) + assert.Equal(t, startTime, "123456789") + + carrier := tracer.TextMapCarrier{} + for k, v := range ddData { + if s, ok := v.(string); ok { + carrier[k] = s + } + } + + extractedSpanContext, err := tracer.Extract(&carrier) + assert.NoError(t, err) + assert.Equal(t, span.Context().TraceIDLower(), extractedSpanContext.TraceIDLower()) + assert.Equal(t, span.Context().SpanID(), extractedSpanContext.SpanID()) + }) + } +} + +func TestInjectTraceContextSizeLimit(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + baseTraceContext := `{"x-datadog-trace-id":"12345","x-datadog-parent-id":"67890","x-datadog-start-time":"123456789"` + + tests := []struct { + name string + entry types.PutEventsRequestEntry + expected func(*testing.T, *types.PutEventsRequestEntry) + }{ + { + name: "Do not inject when payload is too large", + entry: types.PutEventsRequestEntry{ + Detail: aws.String(`{"large": "` + strings.Repeat("a", maxSizeBytes-50) + `"}`), + EventBusName: aws.String("test-bus"), + }, + expected: func(t *testing.T, entry *types.PutEventsRequestEntry) { + assert.GreaterOrEqual(t, len(*entry.Detail), maxSizeBytes-50) + assert.NotContains(t, *entry.Detail, datadogKey) + assert.True(t, strings.HasPrefix(*entry.Detail, `{"large": "`)) + assert.True(t, strings.HasSuffix(*entry.Detail, `"}`)) + }, + }, + { + name: "Inject when payload is just under the limit", + entry: types.PutEventsRequestEntry{ + Detail: aws.String(`{"large": "` + strings.Repeat("a", maxSizeBytes-1000) + `"}`), + EventBusName: aws.String("test-bus"), + }, + expected: func(t *testing.T, entry *types.PutEventsRequestEntry) { + assert.Less(t, len(*entry.Detail), maxSizeBytes) + var detail map[string]interface{} + err := json.Unmarshal([]byte(*entry.Detail), &detail) + require.NoError(t, err) + assert.Contains(t, detail, datadogKey) + assert.Contains(t, detail, "large") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + injectTraceContext(baseTraceContext, &tt.entry) + tt.expected(t, &tt.entry) + }) + } +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/internal.go b/contrib/aws/aws-sdk-go-v2/internal/internal.go new file mode 100644 index 0000000000..8d56480157 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/internal.go @@ -0,0 +1,16 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var Instr *instrumentation.Instrumentation + +func init() { + Instr = instrumentation.Load(instrumentation.PackageAWSSDKGoV2) +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/sfn/sfn.go b/contrib/aws/aws-sdk-go-v2/internal/sfn/sfn.go new file mode 100644 index 0000000000..3982725207 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/sfn/sfn.go @@ -0,0 +1,70 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sfn + +import ( + "encoding/json" + "fmt" + + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/service/sfn" + "github.com/aws/smithy-go/middleware" +) + +var instr = internal.Instr + +func EnrichOperation(span *tracer.Span, in middleware.InitializeInput, operation string) { + switch operation { + case "StartExecution": + handleStartExecution(span, in) + case "StartSyncExecution": + handleStartSyncExecution(span, in) + } +} + +func handleStartExecution(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sfn.StartExecutionInput) + if !ok { + instr.Logger().Debug("Unable to read StartExecutionInput params") + return + } + + modifiedInput := injectTraceContext(span, params.Input) + params.Input = modifiedInput +} + +func handleStartSyncExecution(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sfn.StartSyncExecutionInput) + if !ok { + instr.Logger().Debug("Unable to read StartSyncExecutionInput params") + return + } + + modifiedInput := injectTraceContext(span, params.Input) + params.Input = modifiedInput +} + +func injectTraceContext(span *tracer.Span, input *string) *string { + if input == nil || len(*input) == 0 || (*input)[len(*input)-1] != '}' { + return input + } + traceCtxCarrier := tracer.TextMapCarrier{} + if err := tracer.Inject(span.Context(), traceCtxCarrier); err != nil { + instr.Logger().Debug("Unable to inject trace context: %s", err.Error()) + return input + } + + traceCtxJSON, err := json.Marshal(traceCtxCarrier) + if err != nil { + instr.Logger().Debug("Unable to marshal trace context: %s", err.Error()) + return input + } + + modifiedInput := (*input)[:len(*input)-1] // remove closing bracket + modifiedInput += fmt.Sprintf(",\"_datadog\": %s }", string(traceCtxJSON)) + return &modifiedInput +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/sfn/sfn_test.go b/contrib/aws/aws-sdk-go-v2/internal/sfn/sfn_test.go new file mode 100644 index 0000000000..2515269ad7 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/sfn/sfn_test.go @@ -0,0 +1,70 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sfn + +import ( + "encoding/json" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/sfn" + "github.com/aws/smithy-go/middleware" + "github.com/stretchr/testify/assert" +) + +func TestEnrichOperation_StartExecution(t *testing.T) { + mt := mocktracer.Start() + span := tracer.StartSpan("test") + + params := &sfn.StartExecutionInput{ + Input: aws.String(`{"key": "value"}`), + } + in := middleware.InitializeInput{ + Parameters: params, + } + + EnrichOperation(span, in, "StartExecution") + span.Finish() + mt.Stop() + + var inputParsed map[string]interface{} + err := json.Unmarshal([]byte(*params.Input), &inputParsed) + + assert.Len(t, mt.FinishedSpans(), 1) + assert.Nil(t, err) + assert.Equal(t, "value", inputParsed["key"]) + assert.Contains(t, inputParsed, "_datadog") + assert.Contains(t, inputParsed["_datadog"], "x-datadog-trace-id") + assert.Contains(t, inputParsed["_datadog"], "x-datadog-parent-id") +} + +func TestEnrichOperation_StartSyncExecution(t *testing.T) { + mt := mocktracer.Start() + span := tracer.StartSpan("test") + + params := &sfn.StartSyncExecutionInput{ + Input: aws.String(`{"key": "value"}`), + } + in := middleware.InitializeInput{ + Parameters: params, + } + + EnrichOperation(span, in, "StartSyncExecution") + span.Finish() + mt.Stop() + + var inputParsed map[string]interface{} + err := json.Unmarshal([]byte(*params.Input), &inputParsed) + + assert.Len(t, mt.FinishedSpans(), 1) + assert.Nil(t, err) + assert.Equal(t, "value", inputParsed["key"]) + assert.Contains(t, inputParsed, "_datadog") + assert.Contains(t, inputParsed["_datadog"], "x-datadog-trace-id") + assert.Contains(t, inputParsed["_datadog"], "x-datadog-parent-id") +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/sns/sns.go b/contrib/aws/aws-sdk-go-v2/internal/sns/sns.go new file mode 100644 index 0000000000..c0b9d15a61 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/sns/sns.go @@ -0,0 +1,108 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sns + +import ( + "encoding/json" + + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/sns" + "github.com/aws/aws-sdk-go-v2/service/sns/types" + "github.com/aws/smithy-go/middleware" +) + +const ( + datadogKey = "_datadog" + maxMessageAttributes = 10 +) + +var instr = internal.Instr + +func EnrichOperation(span *tracer.Span, in middleware.InitializeInput, operation string) { + switch operation { + case "Publish": + handlePublish(span, in) + case "PublishBatch": + handlePublishBatch(span, in) + } +} + +func handlePublish(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sns.PublishInput) + if !ok { + instr.Logger().Debug("Unable to read PublishInput params") + return + } + + traceContext, err := getTraceContext(span) + if err != nil { + instr.Logger().Debug("Unable to get trace context: %s", err.Error()) + return + } + + if params.MessageAttributes == nil { + params.MessageAttributes = make(map[string]types.MessageAttributeValue) + } + + injectTraceContext(traceContext, params.MessageAttributes) +} + +func handlePublishBatch(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sns.PublishBatchInput) + if !ok { + instr.Logger().Debug("Unable to read PublishBatch params") + return + } + + traceContext, err := getTraceContext(span) + if err != nil { + instr.Logger().Debug("Unable to get trace context: %s", err.Error()) + return + } + + for i := range params.PublishBatchRequestEntries { + if params.PublishBatchRequestEntries[i].MessageAttributes == nil { + params.PublishBatchRequestEntries[i].MessageAttributes = make(map[string]types.MessageAttributeValue) + } + injectTraceContext(traceContext, params.PublishBatchRequestEntries[i].MessageAttributes) + } +} + +func getTraceContext(span *tracer.Span) (types.MessageAttributeValue, error) { + carrier := tracer.TextMapCarrier{} + err := tracer.Inject(span.Context(), carrier) + if err != nil { + return types.MessageAttributeValue{}, err + } + + jsonBytes, err := json.Marshal(carrier) + if err != nil { + return types.MessageAttributeValue{}, err + } + + // Use Binary since SNS subscription filter policies fail silently with JSON + // strings. https://github.com/DataDog/datadog-lambda-js/pull/269 + attribute := types.MessageAttributeValue{ + DataType: aws.String("Binary"), + BinaryValue: jsonBytes, + } + + return attribute, nil +} + +func injectTraceContext(traceContext types.MessageAttributeValue, messageAttributes map[string]types.MessageAttributeValue) { + // SNS only allows a maximum of 10 message attributes. + // https://docs.aws.amazon.com/sns/latest/dg/sns-message-attributes.html + // Only inject if there's room. + if len(messageAttributes) >= maxMessageAttributes { + instr.Logger().Info("Cannot inject trace context: message already has maximum allowed attributes") + return + } + + messageAttributes[datadogKey] = traceContext +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/sns/sns_test.go b/contrib/aws/aws-sdk-go-v2/internal/sns/sns_test.go new file mode 100644 index 0000000000..4d3a020813 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/sns/sns_test.go @@ -0,0 +1,177 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sns + +import ( + "context" + "encoding/json" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/sns" + "github.com/aws/aws-sdk-go-v2/service/sns/types" + "github.com/aws/smithy-go/middleware" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEnrichOperation(t *testing.T) { + tests := []struct { + name string + operation string + input middleware.InitializeInput + setup func(context.Context) *tracer.Span + check func(*testing.T, middleware.InitializeInput) + }{ + { + name: "Publish", + operation: "Publish", + input: middleware.InitializeInput{ + Parameters: &sns.PublishInput{ + Message: aws.String("test message"), + TopicArn: aws.String("arn:aws:sns:us-east-1:123456789012:test-topic"), + }, + }, + setup: func(ctx context.Context) *tracer.Span { + span, _ := tracer.StartSpanFromContext(ctx, "test-span") + return span + }, + check: func(t *testing.T, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sns.PublishInput) + require.True(t, ok) + require.NotNil(t, params) + require.NotNil(t, params.MessageAttributes) + assert.Contains(t, params.MessageAttributes, datadogKey) + assert.NotNil(t, params.MessageAttributes[datadogKey].DataType) + assert.Equal(t, "Binary", *params.MessageAttributes[datadogKey].DataType) + assert.NotNil(t, params.MessageAttributes[datadogKey].BinaryValue) + assert.NotEmpty(t, params.MessageAttributes[datadogKey].BinaryValue) + }, + }, + { + name: "PublishBatch", + operation: "PublishBatch", + input: middleware.InitializeInput{ + Parameters: &sns.PublishBatchInput{ + TopicArn: aws.String("arn:aws:sns:us-east-1:123456789012:test-topic"), + PublishBatchRequestEntries: []types.PublishBatchRequestEntry{ + { + Id: aws.String("1"), + Message: aws.String("test message 1"), + }, + { + Id: aws.String("2"), + Message: aws.String("test message 2"), + }, + }, + }, + }, + setup: func(ctx context.Context) *tracer.Span { + span, _ := tracer.StartSpanFromContext(ctx, "test-span") + return span + }, + check: func(t *testing.T, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sns.PublishBatchInput) + require.True(t, ok) + require.NotNil(t, params) + require.NotNil(t, params.PublishBatchRequestEntries) + require.Len(t, params.PublishBatchRequestEntries, 2) + + for _, entry := range params.PublishBatchRequestEntries { + require.NotNil(t, entry.MessageAttributes) + assert.Contains(t, entry.MessageAttributes, datadogKey) + assert.NotNil(t, entry.MessageAttributes[datadogKey].DataType) + assert.Equal(t, "Binary", *entry.MessageAttributes[datadogKey].DataType) + assert.NotNil(t, entry.MessageAttributes[datadogKey].BinaryValue) + assert.NotEmpty(t, entry.MessageAttributes[datadogKey].BinaryValue) + } + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + ctx := context.Background() + span := tt.setup(ctx) + + EnrichOperation(span, tt.input, tt.operation) + + if tt.check != nil { + tt.check(t, tt.input) + } + }) + } +} + +func TestInjectTraceContext(t *testing.T) { + tests := []struct { + name string + existingAttributes int + expectInjection bool + }{ + { + name: "Inject with no existing attributes", + existingAttributes: 0, + expectInjection: true, + }, + { + name: "Inject with some existing attributes", + existingAttributes: 5, + expectInjection: true, + }, + { + name: "No injection when at max attributes", + existingAttributes: maxMessageAttributes, + expectInjection: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + span := tracer.StartSpan("test-span") + + messageAttributes := make(map[string]types.MessageAttributeValue) + for i := 0; i < tt.existingAttributes; i++ { + messageAttributes[fmt.Sprintf("attr%d", i)] = types.MessageAttributeValue{ + DataType: aws.String("String"), + StringValue: aws.String("value"), + } + } + + traceContext, err := getTraceContext(span) + assert.NoError(t, err) + injectTraceContext(traceContext, messageAttributes) + + if tt.expectInjection { + assert.Contains(t, messageAttributes, datadogKey) + assert.NotNil(t, messageAttributes[datadogKey].DataType) + assert.Equal(t, "Binary", *messageAttributes[datadogKey].DataType) + assert.NotNil(t, messageAttributes[datadogKey].BinaryValue) + assert.NotEmpty(t, messageAttributes[datadogKey].BinaryValue) + + carrier := tracer.TextMapCarrier{} + err := json.Unmarshal(messageAttributes[datadogKey].BinaryValue, &carrier) + assert.NoError(t, err) + + extractedSpanContext, err := tracer.Extract(carrier) + assert.NoError(t, err) + assert.Equal(t, span.Context().TraceID(), extractedSpanContext.TraceID()) + assert.Equal(t, span.Context().SpanID(), extractedSpanContext.SpanID()) + } else { + assert.NotContains(t, messageAttributes, datadogKey) + } + }) + } +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/spanpointers/span_pointers.go b/contrib/aws/aws-sdk-go-v2/internal/spanpointers/span_pointers.go new file mode 100644 index 0000000000..33ab166d46 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/spanpointers/span_pointers.go @@ -0,0 +1,198 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package spanpointers + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "sort" + "strings" + + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + "github.com/aws/aws-sdk-go-v2/service/dynamodb" + "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +const ( + // SpanPointerHashLengthBytes 16 bytes = 32 chars. + // See https://github.com/DataDog/dd-span-pointer-rules/blob/main/README.md#general-hashing-rules + SpanPointerHashLengthBytes = 16 + PointerDownDirection = "d" + LinkKind = "span-pointer" + DynamoDbPointerKind = "aws.dynamodb.item" + S3PointerKind = "aws.s3.object" +) + +var separatorBytes = []byte("|") + +// DynamoDbTableName is a context key for storing DynamoDB table name +type DynamoDbTableName struct{} + +// DynamoDbKeyMap is a context key for storing DynamoDB key map +type DynamoDbKeyMap struct{} + +func AddSpanPointers(context context.Context, in middleware.DeserializeInput, out middleware.DeserializeOutput, span *tracer.Span) { + // TODO(@nhulston) after refactoring S3, in/out can be removed + serviceID := awsmiddleware.GetServiceID(context) + switch serviceID { + case "S3": + handleS3Operation(in, out, span) + case "DynamoDB": + handleDynamoDbOperation(context, span) + } +} + +func SetDynamoDbParamsOnContext(spanctx context.Context, params interface{}) context.Context { + switch params := params.(type) { + case *dynamodb.UpdateItemInput: + spanctx = context.WithValue(spanctx, DynamoDbTableName{}, *params.TableName) + spanctx = context.WithValue(spanctx, DynamoDbKeyMap{}, params.Key) + case *dynamodb.DeleteItemInput: + spanctx = context.WithValue(spanctx, DynamoDbTableName{}, *params.TableName) + spanctx = context.WithValue(spanctx, DynamoDbKeyMap{}, params.Key) + } + + return spanctx +} + +func handleS3Operation(in middleware.DeserializeInput, out middleware.DeserializeOutput, span *tracer.Span) { + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return + } + res, ok := out.RawResponse.(*smithyhttp.Response) + if !ok { + return + } + + // URL format: https://BUCKETNAME.s3.REGION.amazonaws.com/KEYNAME?x-id=OPERATIONNAME + key := strings.TrimPrefix(req.URL.Path, "/") + bucket := strings.Split(req.URL.Host, ".")[0] + // the AWS SDK sometimes wraps the eTag in quotes + etag := strings.Trim(res.Header.Get("ETag"), "\"") + if key == "" || bucket == "" || etag == "" { + internal.Instr.Logger().Debug("Unable to create S3 span pointer because required fields could not be found.") + return + } + + // Hash calculation rules: https://github.com/DataDog/dd-span-pointer-rules/blob/main/AWS/S3/Object/README.md + components := []string{bucket, key, etag} + hash := generatePointerHash(components) + + link := tracer.SpanLink{ + // We leave trace_id and span_id as 0. + // The Datadog frontend will use `ptr.hash` to find the linked span. + TraceID: 0, + SpanID: 0, + Attributes: map[string]string{ + "ptr.kind": S3PointerKind, + "ptr.dir": PointerDownDirection, + "ptr.hash": hash, + "link.kind": LinkKind, + }, + } + + span.AddLink(link) +} + +func handleDynamoDbOperation(ctx context.Context, span *tracer.Span) { + // Retrieve table name from context + tableNameVal := ctx.Value(DynamoDbTableName{}) + if tableNameVal == nil { + // This could be a DynamoDB operation that's not supported by span pointers, + // so we return without logging anything. + return + } + tableName, ok := tableNameVal.(string) + if !ok { + return + } + + // Retrieve key map from context + keyMapVal := ctx.Value(DynamoDbKeyMap{}) + if keyMapVal == nil { + return + } + keyMap, ok := keyMapVal.(map[string]types.AttributeValue) + if !ok || len(keyMap) == 0 { + return + } + + // Hash calculation rules: https://github.com/DataDog/dd-span-pointer-rules/blob/main/AWS/DynamoDB/Item/README.md + var componentsToHash []string + + // Extract and sort the keys + keys := make([]string, 0, len(keyMap)) + for k := range keyMap { + keys = append(keys, k) + } + + if len(keys) == 1 { + keyName := keys[0] + keyValue := attributeValueToString(keyMap[keyName]) + + componentsToHash = []string{tableName, keyName, keyValue, "", ""} + } else { + sort.Strings(keys) + key1 := keys[0] + key2 := keys[1] + value1 := attributeValueToString(keyMap[key1]) + value2 := attributeValueToString(keyMap[key2]) + + componentsToHash = []string{tableName, key1, value1, key2, value2} + } + + hash := generatePointerHash(componentsToHash) + link := tracer.SpanLink{ + TraceID: 0, + SpanID: 0, + Attributes: map[string]string{ + "ptr.kind": DynamoDbPointerKind, + "ptr.dir": PointerDownDirection, + "ptr.hash": hash, + "link.kind": LinkKind, + }, + } + + span.AddLink(link) +} + +// DynamoDb values can only be string, number, or binary +func attributeValueToString(attr types.AttributeValue) string { + switch v := attr.(type) { + case *types.AttributeValueMemberS: + return v.Value + case *types.AttributeValueMemberN: + return v.Value + case *types.AttributeValueMemberB: + // Convert binary data to string using UTF-8 encoding (Go's default) + return string(v.Value) + default: + return "" + } +} + +// generatePointerHash generates a unique hash from an array of strings by joining them with | before hashing. +// Used to uniquely identify AWS requests for span pointers. +// Returns a 32-character hash uniquely identifying the components. +func generatePointerHash(components []string) string { + h := sha256.New() + for i, component := range components { + if i > 0 { + h.Write(separatorBytes) + } + h.Write([]byte(component)) + } + + fullHash := h.Sum(nil) + return hex.EncodeToString(fullHash[:SpanPointerHashLengthBytes]) +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/spanpointers/span_pointers_test.go b/contrib/aws/aws-sdk-go-v2/internal/spanpointers/span_pointers_test.go new file mode 100644 index 0000000000..e77dddb731 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/spanpointers/span_pointers_test.go @@ -0,0 +1,367 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package spanpointers + +import ( + "context" + "net/http" + "net/url" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + "github.com/aws/aws-sdk-go-v2/service/dynamodb/types" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGeneratePointerHash(t *testing.T) { + tests := []struct { + name string + components []string + expectedHash string + }{ + // S3 Tests + { + name: "s3 basic values", + components: []string{ + "some-bucket", + "some-key.data", + "ab12ef34", + }, + expectedHash: "e721375466d4116ab551213fdea08413", + }, + { + name: "s3 non-ascii key", + components: []string{ + "some-bucket", + "some-key.你好", + "ab12ef34", + }, + expectedHash: "d1333a04b9928ab462b5c6cadfa401f4", + }, + { + name: "s3 multipart-upload", + components: []string{ + "some-bucket", + "some-key.data", + "ab12ef34-5", + }, + expectedHash: "2b90dffc37ebc7bc610152c3dc72af9f", + }, + // DynamoDB tests + { + name: "dynamodb one string primary key", + components: []string{ + "some-table", + "some-key", + "some-value", + "", + "", + }, + expectedHash: "7f1aee721472bcb48701d45c7c7f7821", + }, + { + name: "dynamodb one number primary key", + components: []string{ + "some-table", + "some-key", + "123.456", + "", + "", + }, + expectedHash: "434a6dba3997ce4dbbadc98d87a0cc24", + }, + { + name: "dynamodb string and number primary key", + components: []string{ + "some-table", + "other-key", + "123", + "some-key", + "some-value", + }, + expectedHash: "7aa1b80b0e49bd2078a5453399f4dd67", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := generatePointerHash(tt.components) + if got != tt.expectedHash { + t.Errorf("GeneratePointerHash() = %v, want %v", got, tt.expectedHash) + } + }) + } +} + +func TestHandleS3Operation(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + tests := []struct { + name string + bucket string + key string + etag string + expectedHash string + expectSuccess bool + }{ + { + name: "basic operation", + bucket: "some-bucket", + key: "some-key.data", + etag: "ab12ef34", + expectedHash: "e721375466d4116ab551213fdea08413", + expectSuccess: true, + }, + { + name: "quoted etag", + bucket: "some-bucket", + key: "some-key.data", + etag: "\"ab12ef34\"", + expectedHash: "e721375466d4116ab551213fdea08413", + expectSuccess: true, + }, + { + name: "non-ascii key", + bucket: "some-bucket", + key: "some-key.你好", + etag: "ab12ef34", + expectedHash: "d1333a04b9928ab462b5c6cadfa401f4", + expectSuccess: true, + }, + { + name: "empty bucket", + bucket: "", + key: "some_key", + etag: "some_etag", + expectSuccess: false, + }, + { + name: "empty key", + bucket: "some_bucket", + key: "", + etag: "some_etag", + expectSuccess: false, + }, + { + name: "empty etag", + bucket: "some_bucket", + key: "some_key", + etag: "", + expectSuccess: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() + span, ctx := tracer.StartSpanFromContext(ctx, "test.s3.operation") + ctx = awsmiddleware.SetServiceID(ctx, "S3") + + // Create request + reqURL, _ := url.Parse("https://" + tt.bucket + ".s3.region.amazonaws.com/" + tt.key) + req := &smithyhttp.Request{ + Request: &http.Request{ + URL: reqURL, + }, + } + + // Create response + header := http.Header{} + header.Set("ETag", tt.etag) + res := &smithyhttp.Response{ + Response: &http.Response{ + Header: header, + }, + } + + // Create input/output + in := middleware.DeserializeInput{ + Request: req, + } + out := middleware.DeserializeOutput{ + RawResponse: res, + } + + AddSpanPointers(ctx, in, out, span) + span.Finish() + spans := mt.FinishedSpans() + if tt.expectSuccess { + require.Len(t, spans, 1) + links := spans[0].Links() + require.NotEmpty(t, links, "Expected span links to not be empty") + + attributes := links[0].Attributes + assert.Equal(t, S3PointerKind, attributes["ptr.kind"]) + assert.Equal(t, PointerDownDirection, attributes["ptr.dir"]) + assert.Equal(t, LinkKind, attributes["link.kind"]) + assert.Equal(t, tt.expectedHash, attributes["ptr.hash"]) + } else { + require.Len(t, spans, 1) + links := spans[0].Links() + assert.Empty(t, links, "Expected no span links to be set") + } + mt.Reset() + }) + } +} + +func TestHandleDynamoDbOperation(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + type primaryKey struct { + key string + value string + typ string + } + + tests := []struct { + name string + tableName string + primaryKeys []primaryKey + expectedHash string + expectSuccess bool + }{ + { + name: "one string key", + tableName: "some-table", + primaryKeys: []primaryKey{ + {key: "name", value: "nick", typ: "S"}, + }, + expectedHash: "815abd545f170b152530dee79d433982", + expectSuccess: true, + }, + { + name: "one number key", + tableName: "some-table", + primaryKeys: []primaryKey{ + {key: "id", value: "123", typ: "N"}, + }, + expectedHash: "a5be7c8423a97445cc65cbdc6f3c0b15", + expectSuccess: true, + }, + { + name: "one binary key", + tableName: "another-table", + primaryKeys: []primaryKey{ + {key: "id", value: "0010", typ: "B"}, + }, + expectedHash: "96f8604c02e887ed557cb514f21de4d1", + expectSuccess: true, + }, + { + name: "sorts two primary keys (already sorted)", + tableName: "some-table", + primaryKeys: []primaryKey{ + {key: "abc", value: "123", typ: "S"}, + {key: "xyz", value: "456", typ: "S"}, + }, + expectedHash: "aaf063774168d63ebc2eadd12c89fee2", + expectSuccess: true, + }, + { + name: "sorts two primary keys (not sorted)", + tableName: "some-table", + primaryKeys: []primaryKey{ + {key: "xyz", value: "456", typ: "S"}, + {key: "abc", value: "123", typ: "S"}, + }, + expectedHash: "aaf063774168d63ebc2eadd12c89fee2", + expectSuccess: true, + }, + { + name: "two primary keys (string and number)", + tableName: "some-table", + primaryKeys: []primaryKey{ + {key: "category", value: "books", typ: "S"}, + {key: "id", value: "42", typ: "N"}, + }, + expectedHash: "28967745aa984a765b9c8e07a95edb54", + expectSuccess: true, + }, + { + name: "two primary keys (binary and string)", + tableName: "some-table", + primaryKeys: []primaryKey{ + {key: "data", value: "000101", typ: "B"}, + {key: "name", value: "document", typ: "S"}, + }, + expectedHash: "d70b916339116e35edf0b75ce65f6a1f", + expectSuccess: true, + }, + { + name: "missing table name", + tableName: "", + primaryKeys: []primaryKey{{key: "id", value: "123", typ: "N"}}, + expectSuccess: false, + }, + { + name: "empty primary keys", + tableName: "some-table", + primaryKeys: []primaryKey{}, + expectSuccess: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() + span, ctx := tracer.StartSpanFromContext(ctx, "test.dynamodb.operation") + ctx = awsmiddleware.SetServiceID(ctx, "DynamoDB") + + // Create input/output. TODO(@nhulston) after refactoring S3, in/out can be removed + in := middleware.DeserializeInput{} + out := middleware.DeserializeOutput{} + + // Set table name and keys + if tt.tableName != "" { + ctx = context.WithValue(ctx, DynamoDbTableName{}, tt.tableName) + } + keyMap := make(map[string]types.AttributeValue) + for _, pk := range tt.primaryKeys { + if pk.key == "" { + continue + } + + switch pk.typ { + case "S": + keyMap[pk.key] = &types.AttributeValueMemberS{Value: pk.value} + case "N": + keyMap[pk.key] = &types.AttributeValueMemberN{Value: pk.value} + case "B": + keyMap[pk.key] = &types.AttributeValueMemberB{Value: []byte(pk.value)} + } + } + + ctx = context.WithValue(ctx, DynamoDbKeyMap{}, keyMap) + + AddSpanPointers(ctx, in, out, span) + span.Finish() + spans := mt.FinishedSpans() + if tt.expectSuccess { + require.Len(t, spans, 1) + links := spans[0].Links() + assert.NotEmpty(t, links, "Expected span links to not be empty") + + attributes := links[0].Attributes + assert.Equal(t, DynamoDbPointerKind, attributes["ptr.kind"]) + assert.Equal(t, LinkKind, attributes["link.kind"]) + assert.Equal(t, tt.expectedHash, attributes["ptr.hash"]) + } else { + require.Len(t, spans, 1) + links := spans[0].Links() + assert.Empty(t, links, "Expected no span links to be set") + } + mt.Reset() + }) + } +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/sqs/sqs.go b/contrib/aws/aws-sdk-go-v2/internal/sqs/sqs.go new file mode 100644 index 0000000000..573271504d --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/sqs/sqs.go @@ -0,0 +1,108 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sqs + +import ( + "encoding/json" + + "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/sqs" + "github.com/aws/aws-sdk-go-v2/service/sqs/types" + "github.com/aws/smithy-go/middleware" +) + +const ( + datadogKey = "_datadog" + maxMessageAttributes = 10 +) + +var instr = internal.Instr + +func EnrichOperation(span *tracer.Span, in middleware.InitializeInput, operation string) { + switch operation { + case "SendMessage": + handleSendMessage(span, in) + case "SendMessageBatch": + handleSendMessageBatch(span, in) + } + span.SetTag(ext.MessagingSystem, ext.MessagingSystemSQS) +} + +func handleSendMessage(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sqs.SendMessageInput) + if !ok { + instr.Logger().Debug("Unable to read SendMessage params") + return + } + + traceContext, err := getTraceContext(span) + if err != nil { + instr.Logger().Debug("Unable to get trace context: %s", err.Error()) + return + } + + if params.MessageAttributes == nil { + params.MessageAttributes = make(map[string]types.MessageAttributeValue) + } + + injectTraceContext(traceContext, params.MessageAttributes) +} + +func handleSendMessageBatch(span *tracer.Span, in middleware.InitializeInput) { + params, ok := in.Parameters.(*sqs.SendMessageBatchInput) + if !ok { + instr.Logger().Debug("Unable to read SendMessageBatch params") + return + } + + traceContext, err := getTraceContext(span) + if err != nil { + instr.Logger().Debug("Unable to get trace context: %s", err.Error()) + return + } + + for i := range params.Entries { + if params.Entries[i].MessageAttributes == nil { + params.Entries[i].MessageAttributes = make(map[string]types.MessageAttributeValue) + } + injectTraceContext(traceContext, params.Entries[i].MessageAttributes) + } +} + +func getTraceContext(span *tracer.Span) (types.MessageAttributeValue, error) { + carrier := tracer.TextMapCarrier{} + err := tracer.Inject(span.Context(), carrier) + if err != nil { + return types.MessageAttributeValue{}, err + } + + jsonBytes, err := json.Marshal(carrier) + if err != nil { + return types.MessageAttributeValue{}, err + } + + attribute := types.MessageAttributeValue{ + DataType: aws.String("String"), + StringValue: aws.String(string(jsonBytes)), + } + + return attribute, nil +} + +func injectTraceContext(traceContext types.MessageAttributeValue, messageAttributes map[string]types.MessageAttributeValue) { + // SQS only allows a maximum of 10 message attributes. + // https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-metadata.html#sqs-message-attributes + // Only inject if there's room. + if len(messageAttributes) >= maxMessageAttributes { + instr.Logger().Info("Cannot inject trace context: message already has maximum allowed attributes") + return + } + + messageAttributes[datadogKey] = traceContext +} diff --git a/contrib/aws/aws-sdk-go-v2/internal/sqs/sqs_test.go b/contrib/aws/aws-sdk-go-v2/internal/sqs/sqs_test.go new file mode 100644 index 0000000000..b204362b62 --- /dev/null +++ b/contrib/aws/aws-sdk-go-v2/internal/sqs/sqs_test.go @@ -0,0 +1,184 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package sqs + +import ( + "context" + "encoding/json" + "fmt" + "testing" + + "github.com/aws/aws-sdk-go-v2/service/sqs/types" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/sqs" + "github.com/aws/smithy-go/middleware" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEnrichOperation(t *testing.T) { + tests := []struct { + name string + operation string + input middleware.InitializeInput + setup func(context.Context) *tracer.Span + check func(*testing.T, middleware.InitializeInput, *tracer.Span) + }{ + { + name: "SendMessage", + operation: "SendMessage", + input: middleware.InitializeInput{ + Parameters: &sqs.SendMessageInput{ + MessageBody: aws.String("test message"), + QueueUrl: aws.String("https://sqs.us-east-1.amazonaws.com/1234567890/test-queue"), + }, + }, + setup: func(ctx context.Context) *tracer.Span { + span, _ := tracer.StartSpanFromContext(ctx, "test-span") + return span + }, + check: func(t *testing.T, in middleware.InitializeInput, span *tracer.Span) { + params, ok := in.Parameters.(*sqs.SendMessageInput) + require.True(t, ok) + require.NotNil(t, params) + require.NotNil(t, params.MessageAttributes) + assert.Contains(t, params.MessageAttributes, datadogKey) + assert.NotNil(t, params.MessageAttributes[datadogKey].DataType) + assert.Equal(t, "String", *params.MessageAttributes[datadogKey].DataType) + assert.NotNil(t, params.MessageAttributes[datadogKey].StringValue) + assert.NotEmpty(t, *params.MessageAttributes[datadogKey].StringValue) + require.Equal(t, span.AsMap()["messaging.system"], "amazonsqs") + }, + }, + { + name: "SendMessageBatch", + operation: "SendMessageBatch", + input: middleware.InitializeInput{ + Parameters: &sqs.SendMessageBatchInput{ + QueueUrl: aws.String("https://sqs.us-east-1.amazonaws.com/1234567890/test-queue"), + Entries: []types.SendMessageBatchRequestEntry{ + { + Id: aws.String("1"), + MessageBody: aws.String("test message 1"), + }, + { + Id: aws.String("2"), + MessageBody: aws.String("test message 2"), + }, + { + Id: aws.String("3"), + MessageBody: aws.String("test message 3"), + }, + }, + }, + }, + setup: func(ctx context.Context) *tracer.Span { + span, _ := tracer.StartSpanFromContext(ctx, "test-span") + return span + }, + check: func(t *testing.T, in middleware.InitializeInput, span *tracer.Span) { + params, ok := in.Parameters.(*sqs.SendMessageBatchInput) + require.True(t, ok) + require.NotNil(t, params) + require.NotNil(t, params.Entries) + require.Len(t, params.Entries, 3) + + for _, entry := range params.Entries { + require.NotNil(t, entry.MessageAttributes) + assert.Contains(t, entry.MessageAttributes, datadogKey) + assert.NotNil(t, entry.MessageAttributes[datadogKey].DataType) + assert.Equal(t, "String", *entry.MessageAttributes[datadogKey].DataType) + assert.NotNil(t, entry.MessageAttributes[datadogKey].StringValue) + assert.NotEmpty(t, *entry.MessageAttributes[datadogKey].StringValue) + } + require.Equal(t, span.AsMap()["messaging.system"], "amazonsqs") + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + ctx := context.Background() + span := tt.setup(ctx) + + EnrichOperation(span, tt.input, tt.operation) + + if tt.check != nil { + tt.check(t, tt.input, span) + } + }) + } +} + +func TestInjectTraceContext(t *testing.T) { + tests := []struct { + name string + existingAttributes int + expectInjection bool + }{ + { + name: "Inject with no existing attributes", + existingAttributes: 0, + expectInjection: true, + }, + { + name: "Inject with some existing attributes", + existingAttributes: 5, + expectInjection: true, + }, + { + name: "No injection when at max attributes", + existingAttributes: maxMessageAttributes, + expectInjection: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + span := tracer.StartSpan("test-span") + + messageAttributes := make(map[string]types.MessageAttributeValue) + for i := 0; i < tt.existingAttributes; i++ { + messageAttributes[fmt.Sprintf("attr%d", i)] = types.MessageAttributeValue{ + DataType: aws.String("String"), + StringValue: aws.String("value"), + } + } + + traceContext, err := getTraceContext(span) + assert.NoError(t, err) + injectTraceContext(traceContext, messageAttributes) + + if tt.expectInjection { + assert.Contains(t, messageAttributes, datadogKey) + assert.NotNil(t, messageAttributes[datadogKey].DataType) + assert.Equal(t, "String", *messageAttributes[datadogKey].DataType) + assert.NotNil(t, messageAttributes[datadogKey].StringValue) + assert.NotEmpty(t, *messageAttributes[datadogKey].StringValue) + + carrier := tracer.TextMapCarrier{} + err := json.Unmarshal([]byte(*messageAttributes[datadogKey].StringValue), &carrier) + assert.NoError(t, err) + + extractedSpanContext, err := tracer.Extract(carrier) + assert.NoError(t, err) + assert.Equal(t, span.Context().TraceID(), extractedSpanContext.TraceID()) + assert.Equal(t, span.Context().SpanID(), extractedSpanContext.SpanID()) + } else { + assert.NotContains(t, messageAttributes, datadogKey) + } + }) + } +} diff --git a/contrib/aws/aws-sdk-go/aws/aws.go b/contrib/aws/aws-sdk-go/aws/aws.go index 93d60a9824..86c72b3a2e 100644 --- a/contrib/aws/aws-sdk-go/aws/aws.go +++ b/contrib/aws/aws-sdk-go/aws/aws.go @@ -4,7 +4,10 @@ // Copyright 2016 Datadog, Inc. // Package aws provides functions to trace aws/aws-sdk-go (https://github.com/aws/aws-sdk-go). -package aws // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/aws-sdk-go/aws" +// +// Deprecated: The AWS SDK for Go v1 is deprecated. Please migrate to github.com/aws/aws-sdk-go-v2 and use the corresponding integration. +// This integration will be removed in a future release. +package aws // import "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws" import ( "errors" @@ -13,14 +16,8 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/internal/tags" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/aws/aws-sdk-go/aws/request" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/dynamodb" @@ -30,20 +27,23 @@ import ( "github.com/aws/aws-sdk-go/service/sfn" "github.com/aws/aws-sdk-go/service/sns" "github.com/aws/aws-sdk-go/service/sqs" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "aws/aws-sdk-go/aws" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/aws/aws-sdk-go") + instr = instrumentation.Load(instrumentation.PackageAWSSDKGo) } const ( // SendHandlerName is the name of the Datadog NamedHandler for the Send phase of an awsv1 request - SendHandlerName = "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/aws-sdk-go/aws/handlers.Send" + SendHandlerName = "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws/handlers.Send" // CompleteHandlerName is the name of the Datadog NamedHandler for the Complete phase of an awsv1 request - CompleteHandlerName = "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/aws-sdk-go/aws/handlers.Complete" + CompleteHandlerName = "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws/handlers.Complete" ) type handlers struct { @@ -55,9 +55,9 @@ func WrapSession(s *session.Session, opts ...Option) *session.Session { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/aws/aws-sdk-go/aws: Wrapping Session: %#v", cfg) + instr.Logger().Debug("contrib/aws/aws-sdk-go/aws: Wrapping Session: %#v", cfg) h := &handlers{cfg: cfg} s = s.Copy() s.Handlers.Send.PushFrontNamed(request.NamedHandler{ @@ -81,15 +81,16 @@ func (h *handlers) Send(req *request.Request) { region := awsRegion(req) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeHTTP), tracer.ServiceName(h.serviceName(req)), tracer.ResourceName(resourceName(req)), - tracer.Tag(tags.AWSAgent, awsAgent(req)), - tracer.Tag(tags.AWSOperation, awsOperation(req)), - tracer.Tag(tags.OldAWSRegion, region), - tracer.Tag(tags.AWSRegion, region), - tracer.Tag(tags.AWSService, awsService(req)), + tracer.Tag(ext.AWSAgent, awsAgent(req)), + tracer.Tag(ext.AWSOperation, awsOperation(req)), + tracer.Tag(ext.AWSRegionLegacy, region), + tracer.Tag(ext.AWSRegion, region), + tracer.Tag(ext.AWSPartition, awsPartition(req)), + tracer.Tag(ext.AWSService, awsService(req)), tracer.Tag(ext.HTTPMethod, req.Operation.HTTPMethod), tracer.Tag(ext.HTTPURL, url.String()), tracer.Tag(ext.Component, componentName), @@ -110,8 +111,8 @@ func (h *handlers) Complete(req *request.Request) { if !ok { return } - span.SetTag(tags.AWSRetryCount, req.RetryCount) - span.SetTag(tags.AWSRequestID, req.RequestID) + span.SetTag(ext.AWSRetryCount, req.RetryCount) + span.SetTag(ext.AWSRequestID, req.RequestID) if req.HTTPResponse != nil { span.SetTag(ext.HTTPCode, strconv.Itoa(req.HTTPResponse.StatusCode)) } @@ -125,14 +126,22 @@ func (h *handlers) serviceName(req *request.Request) string { if h.cfg.serviceName != "" { return h.cfg.serviceName } - defaultName := "aws." + awsService(req) - return namingschema.ServiceNameOverrideV0(defaultName, defaultName) + return instr.ServiceName( + instrumentation.ComponentDefault, + instrumentation.OperationContext{ + ext.AWSService: awsService(req), + }, + ) } func spanName(req *request.Request) string { - svc := awsService(req) - op := awsOperation(req) - return namingschema.AWSOpName(svc, op, svc+".command") + return instr.OperationName( + instrumentation.ComponentDefault, + instrumentation.OperationContext{ + ext.AWSService: awsService(req), + ext.AWSOperation: awsOperation(req), + }, + ) } func awsService(req *request.Request) string { @@ -158,6 +167,27 @@ func awsRegion(req *request.Request) string { return req.ClientInfo.SigningRegion } +func awsPartition(req *request.Request) string { + partition := req.ClientInfo.PartitionID + + if partition != "" { + return partition + } + + // if partition ID isn't set, derive partition from region + region := awsRegion(req) + switch { + case strings.HasPrefix(region, "cn-"): + partition = "aws-cn" + case strings.HasPrefix(region, "us-gov-"): + partition = "aws-us-gov" + default: + partition = "aws" + } + + return partition +} + func extraTagsForService(req *request.Request) map[string]interface{} { service := awsService(req) var ( @@ -166,7 +196,7 @@ func extraTagsForService(req *request.Request) map[string]interface{} { ) switch service { case sqs.ServiceName: - extraTags, err = sqsTags(req.Params) + extraTags, err = sqsTags(req.Params, awsRegion(req), awsPartition(req)) case s3.ServiceName: extraTags, err = s3Tags(req.Params) case sns.ServiceName: @@ -183,13 +213,13 @@ func extraTagsForService(req *request.Request) map[string]interface{} { return nil } if err != nil { - log.Debug("failed to extract tags for AWS service %q: %v", service, err) + instr.Logger().Debug("failed to extract tags for AWS service %q: %v", service, err) return nil } return extraTags } -func sqsTags(params interface{}) (map[string]interface{}, error) { +func sqsTags(params interface{}, region string, partition string) (map[string]interface{}, error) { var queueURL string switch input := params.(type) { case *sqs.SendMessageInput: @@ -205,15 +235,37 @@ func sqsTags(params interface{}) (map[string]interface{}, error) { default: return nil, nil } + + queueName, arn := extractSQSMetadata(queueURL, region, partition) + if queueName == "" { + return nil, fmt.Errorf("got unexpected queue URL format: %q", queueURL) + } + + tags := map[string]interface{}{ + ext.SQSQueueName: queueName, + ext.CloudResourceID: arn, + } + + return tags, nil +} + +func extractSQSMetadata(queueURL string, region string, partition string) (queueName string, arn string) { + // Remove trailing slash if present + if len(queueURL) > 0 && queueURL[len(queueURL)-1] == '/' { + queueURL = queueURL[:len(queueURL)-1] + } + + // *.amazonaws.com/{accountID}/{queueName} parts := strings.Split(queueURL, "/") if len(parts) < 2 { - return nil, fmt.Errorf("got unexpected queue URL format: %q", queueURL) + return "", "" } - queueName := parts[len(parts)-1] - return map[string]interface{}{ - tags.SQSQueueName: queueName, - }, nil + queueName = parts[len(parts)-1] + accountID := parts[len(parts)-2] + + arn = strings.Join([]string{"arn", partition, "sqs", region, accountID, queueName}, ":") + return queueName, arn } func s3Tags(params interface{}) (map[string]interface{}, error) { @@ -235,7 +287,7 @@ func s3Tags(params interface{}) (map[string]interface{}, error) { return nil, nil } return map[string]interface{}{ - tags.S3BucketName: bucket, + ext.S3BucketName: bucket, }, nil } @@ -244,22 +296,22 @@ func snsTags(params interface{}) (map[string]interface{}, error) { switch input := params.(type) { case *sns.PublishInput: if input.TopicArn != nil { - destTag, destARN = tags.SNSTopicName, *input.TopicArn + destTag, destARN = ext.SNSTopicName, *input.TopicArn } else { - destTag, destARN = tags.SNSTargetName, *input.TargetArn + destTag, destARN = ext.SNSTargetName, *input.TargetArn } case *sns.GetTopicAttributesInput: - destTag, destARN = tags.SNSTopicName, *input.TopicArn + destTag, destARN = ext.SNSTopicName, *input.TopicArn case *sns.ListSubscriptionsByTopicInput: - destTag, destARN = tags.SNSTopicName, *input.TopicArn + destTag, destARN = ext.SNSTopicName, *input.TopicArn case *sns.RemovePermissionInput: - destTag, destARN = tags.SNSTopicName, *input.TopicArn + destTag, destARN = ext.SNSTopicName, *input.TopicArn case *sns.SetTopicAttributesInput: - destTag, destARN = tags.SNSTopicName, *input.TopicArn + destTag, destARN = ext.SNSTopicName, *input.TopicArn case *sns.SubscribeInput: - destTag, destARN = tags.SNSTopicName, *input.TopicArn + destTag, destARN = ext.SNSTopicName, *input.TopicArn case *sns.CreateTopicInput: - destTag, destName = tags.SNSTopicName, *input.Name + destTag, destName = ext.SNSTopicName, *input.Name default: return nil, nil } @@ -292,7 +344,7 @@ func dynamoDBTags(params interface{}) (map[string]interface{}, error) { return nil, nil } return map[string]interface{}{ - tags.DynamoDBTableName: tableName, + ext.DynamoDBTableName: tableName, }, nil } @@ -321,7 +373,7 @@ func kinesisTags(params interface{}) (map[string]interface{}, error) { return nil, nil } return map[string]interface{}{ - tags.KinesisStreamName: streamName, + ext.KinesisStreamName: streamName, }, nil } @@ -346,7 +398,7 @@ func eventBridgeTags(params interface{}) (map[string]interface{}, error) { return nil, nil } return map[string]interface{}{ - tags.EventBridgeRuleName: ruleName, + ext.EventBridgeRuleName: ruleName, }, nil } @@ -383,7 +435,7 @@ func sfnTags(params interface{}) (map[string]interface{}, error) { stateMachineName = parts[len(parts)-1] } return map[string]interface{}{ - tags.SFNStateMachineName: stateMachineName, + ext.SFNStateMachineName: stateMachineName, }, nil } diff --git a/contrib/aws/aws-sdk-go/aws/aws_test.go b/contrib/aws/aws-sdk-go/aws/aws_test.go index 1972376803..b6abd3dab7 100644 --- a/contrib/aws/aws-sdk-go/aws/aws_test.go +++ b/contrib/aws/aws-sdk-go/aws/aws_test.go @@ -17,12 +17,6 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/endpoints" @@ -39,6 +33,11 @@ import ( "github.com/aws/aws-sdk-go/service/sqs" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func newIntegrationTestSession(t *testing.T, opts ...Option) *session.Session { @@ -83,6 +82,7 @@ func TestAWS(t *testing.T) { assert.Contains(t, s.Tag("aws.agent"), "aws-sdk-go") assert.Equal(t, "CreateBucket", s.Tag("aws.operation")) assert.Equal(t, "us-west-2", s.Tag("aws.region")) + assert.Equal(t, "aws", s.Tag("aws.partition")) assert.Equal(t, "s3.CreateBucket", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.s3", s.Tag(ext.ServiceName)) assert.Equal(t, "403", s.Tag(ext.HTTPCode)) @@ -91,6 +91,7 @@ func TestAWS(t *testing.T) { assert.Equal(t, "aws/aws-sdk-go/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) assert.NotNil(t, s.Tag("aws.request_id")) + assert.Equal(t, componentName, s.Integration()) }) t.Run("ec2", func(t *testing.T) { @@ -111,6 +112,7 @@ func TestAWS(t *testing.T) { assert.Contains(t, s.Tag("aws.agent"), "aws-sdk-go") assert.Equal(t, "DescribeInstances", s.Tag("aws.operation")) assert.Equal(t, "us-west-2", s.Tag("aws.region")) + assert.Equal(t, "aws", s.Tag("aws.partition")) assert.Equal(t, "ec2.DescribeInstances", s.Tag(ext.ResourceName)) assert.Equal(t, "aws.ec2", s.Tag(ext.ServiceName)) assert.Equal(t, "400", s.Tag(ext.HTTPCode)) @@ -118,6 +120,7 @@ func TestAWS(t *testing.T) { assert.Equal(t, "http://ec2.us-west-2.amazonaws.com/", s.Tag(ext.HTTPURL)) assert.Equal(t, "aws/aws-sdk-go/aws", s.Tag(ext.Component)) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, componentName, s.Integration()) }) } @@ -144,18 +147,6 @@ func TestAnalyticsSettings(t *testing.T) { assertRate(t, mt, nil) }) - t.Run("global", func(t *testing.T) { - t.Skip("global flag disabled") - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - t.Run("enabled", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() @@ -174,10 +165,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } @@ -211,7 +199,7 @@ func TestRetries(t *testing.T) { assert.Same(t, expectedError, err) assert.Len(t, mt.OpenSpans(), 0) assert.Len(t, mt.FinishedSpans(), 1) - assert.Equal(t, mt.FinishedSpans()[0].Tag("aws.retry_count"), 3) + assert.Equal(t, mt.FinishedSpans()[0].Tag("aws.retry_count"), float64(3)) } func TestHTTPCredentials(t *testing.T) { @@ -239,7 +227,7 @@ func TestHTTPCredentials(t *testing.T) { require.NoError(t, err) u.User = url.UserPassword("myuser", "mypassword") - resolver := endpoints.ResolverFunc(func(service, region string, opts ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) { + resolver := endpoints.ResolverFunc(func(_, _ string, _ ...func(*endpoints.Options)) (endpoints.ResolvedEndpoint, error) { return endpoints.ResolvedEndpoint{ PartitionID: "aws", URL: u.String(), @@ -293,16 +281,56 @@ func TestWithErrorCheck(t *testing.T) { spans := mt.FinishedSpans() assert.True(t, len(spans) > 0) - assert.Equal(t, errExist, spans[0].Tag(ext.Error) != nil) + assert.Equal(t, errExist, spans[0].Tag(ext.ErrorMsg) != nil) } } t.Run("defaults", testOpts(true)) - t.Run("errcheck", testOpts(false, WithErrorCheck(func(err error) bool { + t.Run("errcheck", testOpts(false, WithErrorCheck(func(_ error) bool { return false }))) } +func TestPartitionTag(t *testing.T) { + tests := []struct { + region string + partition string + }{ + {"us-east-1", "aws"}, + {"eu-west-1", "aws"}, + {"cn-north-1", "aws-cn"}, + {"us-gov-east-1", "aws-us-gov"}, + } + + for _, tt := range tests { + t.Run(tt.region, func(t *testing.T) { + cfg := aws.NewConfig(). + WithRegion(tt.region). + WithDisableSSL(true). + WithCredentials(credentials.AnonymousCredentials) + + session := WrapSession(session.Must(session.NewSession(cfg))) + + mt := mocktracer.Start() + defer mt.Stop() + + root, ctx := tracer.StartSpanFromContext(context.Background(), "test") + s3api := s3.New(session) + s3api.CreateBucketWithContext(ctx, &s3.CreateBucketInput{ + Bucket: aws.String("my-test-bucket"), + }) + root.Finish() + + spans := mt.FinishedSpans() + assert.Len(t, spans, 2) + + s := spans[0] + assert.Equal(t, tt.partition, s.Tag("aws.partition")) + assert.Equal(t, tt.region, s.Tag("aws.region")) + }) + } +} + func TestExtraTagsForService(t *testing.T) { const ( sqsQueueName = "test-queue-name" @@ -338,6 +366,11 @@ func TestExtraTagsForService(t *testing.T) { assert.Equal(t, "sqs", s0.Tag("aws_service")) assert.Equal(t, "SendMessage", s0.Tag("aws.operation")) assert.Equal(t, sqsQueueName, s0.Tag("queuename")) + // Extract account ID from the queue URL + urlParts := strings.Split(sqsQueueURL, "/") + accountID := urlParts[len(urlParts)-2] + expectedARN := "arn:aws:sqs:us-east-1:" + accountID + ":test-queue-name" + assert.Equal(t, expectedARN, s0.Tag("cloud.resource_id")) }) t.Run("S3", func(t *testing.T) { mt := mocktracer.Start() @@ -507,125 +540,117 @@ func TestExtraTagsForService(t *testing.T) { }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - s := newIntegrationTestSession(t, opts...) - ec2Client := ec2.New(s) - s3Client := s3.New(s) - sqsClient := sqs.New(s) - snsClient := sns.New(s) - - _, err := ec2Client.DescribeInstances(&ec2.DescribeInstancesInput{}) - require.NoError(t, err) - _, err = s3Client.ListBuckets(&s3.ListBucketsInput{}) - require.NoError(t, err) - _, err = sqsClient.ListQueues(&sqs.ListQueuesInput{}) - require.NoError(t, err) - _, err = snsClient.ListTopics(&sns.ListTopicsInput{}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - assert.Equal(t, "ec2.command", spans[0].OperationName()) - assert.Equal(t, "s3.command", spans[1].OperationName()) - assert.Equal(t, "sqs.command", spans[2].OperationName()) - assert.Equal(t, "sns.command", spans[3].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - assert.Equal(t, "aws.ec2.request", spans[0].OperationName()) - assert.Equal(t, "aws.s3.request", spans[1].OperationName()) - assert.Equal(t, "aws.sqs.request", spans[2].OperationName()) - assert.Equal(t, "aws.sns.request", spans[3].OperationName()) +func TestExtractSQSMetadata(t *testing.T) { + tests := []struct { + name string + queueURL string + region string + partition string + expectedQueueName string + expectedARN string + }{ + { + name: "normal URL", + queueURL: "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue", + region: "us-east-1", + partition: "aws", + expectedQueueName: "MyQueue", + expectedARN: "arn:aws:sqs:us-east-1:123456789012:MyQueue", + }, + { + name: "URL with trailing slash", + queueURL: "https://sqs.eu-west-1.amazonaws.com/123456789012/MyQueue/", + region: "eu-west-1", + partition: "aws", + expectedQueueName: "MyQueue", + expectedARN: "arn:aws:sqs:eu-west-1:123456789012:MyQueue", + }, + { + name: "URL with trailing slash - different region", + queueURL: "https://sqs.eu-west-2.amazonaws.com/987654321098/TestQueue/", + region: "eu-west-2", + partition: "aws", + expectedQueueName: "TestQueue", + expectedARN: "arn:aws:sqs:eu-west-2:987654321098:TestQueue", + }, + { + name: "China region with trailing slash", + queueURL: "https://sqs.cn-north-1.amazonaws.com.cn/123456789012/ChinaQueue/", + region: "cn-north-1", + partition: "aws-cn", + expectedQueueName: "ChinaQueue", + expectedARN: "arn:aws-cn:sqs:cn-north-1:123456789012:ChinaQueue", + }, + { + name: "GovCloud region with trailing slash", + queueURL: "https://sqs.us-gov-west-1.amazonaws.com/123456789012/GovQueue/", + region: "us-gov-west-1", + partition: "aws-us-gov", + expectedQueueName: "GovQueue", + expectedARN: "arn:aws-us-gov:sqs:us-gov-west-1:123456789012:GovQueue", + }, + { + name: "malformed URL - just slash", + queueURL: "/", + region: "us-east-1", + partition: "aws", + expectedQueueName: "", + expectedARN: "", + }, + { + name: "malformed URL - empty", + queueURL: "", + region: "us-east-1", + partition: "aws", + expectedQueueName: "", + expectedARN: "", + }, + { + name: "malformed URL - single part", + queueURL: "invalidurl", + region: "us-east-1", + partition: "aws", + expectedQueueName: "", + expectedARN: "", + }, } - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"aws.ec2", "aws.s3", "aws.sqs", "aws.sns"}, - WithDDService: []string{"aws.ec2", "aws.s3", "aws.sqs", "aws.sns"}, - WithDDServiceAndOverride: []string{serviceOverride, serviceOverride, serviceOverride, serviceOverride}, + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + queueName, arn := extractSQSMetadata(tt.queueURL, tt.region, tt.partition) + assert.Equal(t, tt.expectedQueueName, queueName) + assert.Equal(t, tt.expectedARN, arn) + }) } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) } -func TestMessagingNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - s := newIntegrationTestSession(t, opts...) - resourceName := "test-naming-schema-aws-v1" - sqsClient := sqs.New(s) - snsClient := sns.New(s) - - // create a SQS queue - sqsResp, err := sqsClient.CreateQueue(&sqs.CreateQueueInput{QueueName: aws.String(resourceName)}) - require.NoError(t, err) - - msg := &sqs.SendMessageInput{QueueUrl: sqsResp.QueueUrl, MessageBody: aws.String("body")} - _, err = sqsClient.SendMessage(msg) - require.NoError(t, err) - - batchMsg := &sqs.SendMessageBatchInput{QueueUrl: sqsResp.QueueUrl} - entry := &sqs.SendMessageBatchRequestEntry{Id: aws.String("1"), MessageBody: aws.String("body")} - batchMsg.SetEntries([]*sqs.SendMessageBatchRequestEntry{entry}) - _, err = sqsClient.SendMessageBatch(batchMsg) - require.NoError(t, err) - - // create an SNS topic - snsResp, err := snsClient.CreateTopic(&sns.CreateTopicInput{Name: aws.String(resourceName)}) - require.NoError(t, err) - - _, err = snsClient.Publish(&sns.PublishInput{TopicArn: snsResp.TopicArn, Message: aws.String("message")}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 5) - assert.Equal(t, "sqs.command", spans[0].OperationName()) - assert.Equal(t, "sqs.command", spans[1].OperationName()) - assert.Equal(t, "sqs.command", spans[2].OperationName()) - assert.Equal(t, "sns.command", spans[3].OperationName()) - assert.Equal(t, "sns.command", spans[4].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 5) - assert.Equal(t, "aws.sqs.request", spans[0].OperationName()) - assert.Equal(t, "aws.sqs.send", spans[1].OperationName()) - assert.Equal(t, "aws.sqs.send", spans[2].OperationName()) - assert.Equal(t, "aws.sns.request", spans[3].OperationName()) - assert.Equal(t, "aws.sns.send", spans[4].OperationName()) - } - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"aws.sqs", "aws.sqs", "aws.sqs", "aws.sns", "aws.sns"}, - WithDDService: []string{"aws.sqs", "aws.sqs", "aws.sqs", "aws.sns", "aws.sns"}, - WithDDServiceAndOverride: repeat(serviceOverride, 5), +func TestAwsPartition(t *testing.T) { + tests := []struct { + name string + partition string + }{ + { + name: "AWS standard partition", + partition: "aws", + }, + { + name: "AWS China partition", + partition: "aws-cn", + }, + { + name: "AWS GovCloud partition", + partition: "aws-us-gov", + }, } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} -func repeat(s string, n int) []string { - r := make([]string, n) - for i := 0; i < n; i++ { - r[i] = s + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req := &request.Request{} + req.ClientInfo.PartitionID = tt.partition + partition := awsPartition(req) + assert.Equal(t, tt.partition, partition) + }) } - return r } func prepareSQS(t *testing.T, sess *session.Session, queueName string) string { diff --git a/contrib/aws/aws-sdk-go/aws/example_test.go b/contrib/aws/aws-sdk-go/aws/example_test.go index 2b6605153e..ed27d07cce 100644 --- a/contrib/aws/aws-sdk-go/aws/example_test.go +++ b/contrib/aws/aws-sdk-go/aws/example_test.go @@ -10,14 +10,14 @@ import ( "log" "os" - awstrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/aws/aws-sdk-go/aws" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" + + awstrace "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) // To start tracing requests, wrap the AWS session.Session by invoking @@ -35,6 +35,9 @@ func Example() { // An example of the aws span inheriting a parent span from context. func Example_context() { + tracer.Start() + defer tracer.Stop() + cfg := aws.NewConfig().WithRegion("us-west-2") sess := session.Must(session.NewSession(cfg)) sess = awstrace.WrapSession(sess) diff --git a/contrib/aws/aws-sdk-go/aws/option.go b/contrib/aws/aws-sdk-go/aws/option.go index df3100e741..20d65d51a1 100644 --- a/contrib/aws/aws-sdk-go/aws/option.go +++ b/contrib/aws/aws-sdk-go/aws/option.go @@ -7,8 +7,6 @@ package aws import ( "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -17,29 +15,33 @@ type config struct { errCheck func(err error) bool } -// Option represents an option that can be passed to Dial. -type Option func(*config) +// Option describes options for the AWS integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to WrapSession. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_AWS_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the dialled connection. +// WithService sets the given service name for the dialled connection. // When the service name is not explicitly set it will be inferred based on the // request to AWS. -func WithServiceName(name string) Option { +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -51,7 +53,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -64,7 +66,7 @@ func WithAnalyticsRate(rate float64) Option { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. The fn is called whenever an aws operation // finishes with an error. -func WithErrorCheck(fn func(err error) bool) Option { +func WithErrorCheck(fn func(err error) bool) OptionFn { return func(cfg *config) { cfg.errCheck = fn } diff --git a/contrib/aws/aws-sdk-go/aws/orchestrion.yml b/contrib/aws/aws-sdk-go/aws/orchestrion.yml new file mode 100644 index 0000000000..7f7b95ec20 --- /dev/null +++ b/contrib/aws/aws-sdk-go/aws/orchestrion.yml @@ -0,0 +1,27 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws + description: The official AWS SDK for Go + +aspects: + - id: session.NewSession + join-point: + function-call: github.com/aws/aws-sdk-go/aws/session.NewSession + advice: + - wrap-expression: + imports: + awstrace: github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws + session: github.com/aws/aws-sdk-go/aws/session + template: |- + func(sess *session.Session, err error) (*session.Session, error) { + if sess != nil { + sess = awstrace.WrapSession(sess) + } + return sess, err + }({{ . }}) + diff --git a/contrib/aws/aws-sdk-go/go.mod b/contrib/aws/aws-sdk-go/go.mod new file mode 100644 index 0000000000..3254362823 --- /dev/null +++ b/contrib/aws/aws-sdk-go/go.mod @@ -0,0 +1,95 @@ +module github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/aws/aws-sdk-go v1.44.327 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/aws/aws-sdk-go/go.sum b/contrib/aws/aws-sdk-go/go.sum new file mode 100644 index 0000000000..a82106b4fb --- /dev/null +++ b/contrib/aws/aws-sdk-go/go.sum @@ -0,0 +1,333 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/aws/aws-sdk-go v1.44.327 h1:ZS8oO4+7MOBLhkdwIhgtVeDzCeWOlTfKJS7EgggbIEY= +github.com/aws/aws-sdk-go v1.44.327/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/aws/datadog-lambda-go/awslambdanorpc.go b/contrib/aws/datadog-lambda-go/awslambdanorpc.go new file mode 100644 index 0000000000..b08f0c8ffd --- /dev/null +++ b/contrib/aws/datadog-lambda-go/awslambdanorpc.go @@ -0,0 +1,11 @@ +//go:build lambda.norpc +// +build lambda.norpc + +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package ddlambda + +const awsLambdaRpcSupport = false diff --git a/contrib/aws/datadog-lambda-go/awslambdawithrpc.go b/contrib/aws/datadog-lambda-go/awslambdawithrpc.go new file mode 100644 index 0000000000..c2663ba972 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/awslambdawithrpc.go @@ -0,0 +1,11 @@ +//go:build !lambda.norpc +// +build !lambda.norpc + +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package ddlambda + +const awsLambdaRpcSupport = true diff --git a/contrib/aws/datadog-lambda-go/ddlambda.go b/contrib/aws/datadog-lambda-go/ddlambda.go new file mode 100644 index 0000000000..14d8cd26d9 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/ddlambda.go @@ -0,0 +1,402 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package ddlambda + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "os" + "strconv" + "strings" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-lambda-go/lambda" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/metrics" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/trace" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/wrapper" + _ "github.com/DataDog/dd-trace-go/v2/instrumentation" // for version compatibility +) + +type ( + // Config gives options for how ddlambda should behave + Config struct { + // APIKey is your Datadog API key. This is used for sending metrics. + APIKey string + // KMSAPIKey is your Datadog API key, encrypted using the AWS KMS service. This is used for sending metrics. + KMSAPIKey string + // ShouldRetryOnFailure is used to turn on retry logic when sending metrics via the API. This can negatively effect the performance of your lambda, + // and should only be turned on if you can't afford to lose metrics data under poor network conditions. + ShouldRetryOnFailure bool + // ShouldUseLogForwarder enabled the log forwarding method for sending metrics to Datadog. This approach requires the user to set up a custom lambda + // function that forwards metrics from cloudwatch to the Datadog api. This approach doesn't have any impact on the performance of your lambda function. + ShouldUseLogForwarder bool + // BatchInterval is the period of time which metrics are grouped together for processing to be sent to the API or written to logs. + // Any pending metrics are flushed at the end of the lambda. + BatchInterval time.Duration + // Site is the host to send metrics to. If empty, this value is read from the 'DD_SITE' environment variable, or if that is empty + // will default to 'datadoghq.com'. + Site string + // DebugLogging will turn on extended debug logging. + DebugLogging bool + // EnhancedMetrics enables the reporting of enhanced metrics under `aws.lambda.enhanced*` and adds enhanced metric tags + EnhancedMetrics bool + // DDTraceEnabled enables the Datadog tracer. + DDTraceEnabled bool + // MergeXrayTraces will cause Datadog traces to be merged with traces from AWS X-Ray. + MergeXrayTraces bool + // HTTPClientTimeout specifies a time limit for requests to the API. It defaults to 5s. + HTTPClientTimeout time.Duration + // CircuitBreakerInterval is the cyclic period of the closed state + // for the CircuitBreaker to clear the internal Counts. + // default: 30s + CircuitBreakerInterval time.Duration + // CircuitBreakerTimeout is the period of the open state, + // after which the state of the CircuitBreaker becomes half-open. + // default: 60s + CircuitBreakerTimeout time.Duration + // CircuitBreakerTotalFailures after this amount of times + // of a request failing in the closed state, the state will become open. + // the counter will get totally reset after CircuitBreakerInterval + // default: 4 + CircuitBreakerTotalFailures uint32 + // FIPSMode enables FIPS mode. Defaults to true in GovCloud regions and false elsewhere. + FIPSMode *bool + // TraceContextExtractor is the function that extracts a root/parent trace context from the Lambda event body. + // See trace.DefaultTraceExtractor for an example. + TraceContextExtractor trace.ContextExtractor + // TracerOptions are additional options passed to the tracer. + TracerOptions []tracer.StartOption + } +) + +const ( + // DatadogAPIKeyEnvVar is the environment variable that will be used to set the API key. + DatadogAPIKeyEnvVar = "DD_API_KEY" + // DatadogKMSAPIKeyEnvVar is the environment variable that will be sent to KMS for decryption, then used as an API key. + DatadogKMSAPIKeyEnvVar = "DD_KMS_API_KEY" + // DatadogSiteEnvVar is the environment variable that will be used as the API host. + DatadogSiteEnvVar = "DD_SITE" + // LogLevelEnvVar is the environment variable that will be used to set the log level. + LogLevelEnvVar = "DD_LOG_LEVEL" + // ShouldUseLogForwarderEnvVar is the environment variable that enables log forwarding of metrics. + ShouldUseLogForwarderEnvVar = "DD_FLUSH_TO_LOG" + // DatadogTraceEnabledEnvVar is the environment variable that enables Datadog tracing. + DatadogTraceEnabledEnvVar = "DD_TRACE_ENABLED" + // MergeXrayTracesEnvVar is the environment variable that enables the merging of X-Ray and Datadog traces. + MergeXrayTracesEnvVar = "DD_MERGE_XRAY_TRACES" + // UniversalInstrumentation is the environment variable that enables universal instrumentation with the DD Extension + UniversalInstrumentation = "DD_UNIVERSAL_INSTRUMENTATION" + // Initialize otel tracer provider if enabled + OtelTracerEnabled = "DD_TRACE_OTEL_ENABLED" + // FIPSModeEnvVar is the environment variable that determines whether to enable FIPS mode. + // Defaults to true in GovCloud regions and false otherwise. + FIPSModeEnvVar = "DD_LAMBDA_FIPS_MODE" + + // DefaultSite to send API messages to. + DefaultSite = "datadoghq.com" + // DefaultEnhancedMetrics enables enhanced metrics by default. + DefaultEnhancedMetrics = true + + // serverlessAppSecEnabledEnvVar is the environment variable used to activate Serverless ASM through the use of an + // AWS Lambda runtime API proxy. + serverlessAppSecEnabledEnvVar = "DD_SERVERLESS_APPSEC_ENABLED" + // awsLambdaRuntimeApiEnvVar is the environment variable used to redirect AWS Lambda runtime API calls to the proxy. + awsLambdaRuntimeApiEnvVar = "AWS_LAMBDA_RUNTIME_API" + // datadogAgentUrl is the URL of the agent and proxy started by the Datadog lambda extension. + datadogAgentUrl = "127.0.0.1:9000" + // ddExtensionFilePath is the path on disk of the datadog lambda extension. + ddExtensionFilePath = "/opt/extensions/datadog-agent" + + // awsLambdaServerPortEnvVar is the environment variable set by the go1.x Lambda Runtime to indicate which port the + // RCP server should listen on. This is used as a sign that a warning should be printed if customers want to enable + // ASM support, but did not enable the lambda.norpc build taf. + awsLambdaServerPortEnvVar = "_LAMBDA_SERVER_PORT" +) + +// WrapLambdaHandlerInterface is used to instrument your lambda functions. +// It returns a modified handler that can be passed directly to the lambda.StartHandler function from aws-lambda-go. +func WrapLambdaHandlerInterface(handler lambda.Handler, cfg *Config) lambda.Handler { + setupAppSec() + listeners := initializeListeners(cfg) + return wrapper.WrapHandlerInterfaceWithListeners(handler, listeners...) +} + +// WrapFunction is used to instrument your lambda functions. +// It returns a modified handler that can be passed directly to the lambda.Start function from aws-lambda-go. +func WrapFunction(handler interface{}, cfg *Config) interface{} { + setupAppSec() + listeners := initializeListeners(cfg) + return wrapper.WrapHandlerWithListeners(handler, listeners...) +} + +// WrapHandler is used to instrument your lambda functions. +// It returns a modified handler that can be passed directly to the lambda.Start function from aws-lambda-go. +// Deprecated: use WrapFunction instead +func WrapHandler(handler interface{}, cfg *Config) interface{} { + return WrapFunction(handler, cfg) +} + +// GetTraceHeaders returns a map containing Datadog trace headers that reflect the +// current X-Ray subsegment. +// Deprecated: use native Datadog tracing instead. +func GetTraceHeaders(ctx context.Context) map[string]string { + result := trace.ConvertCurrentXrayTraceContext(ctx) + return result +} + +// AddTraceHeaders adds Datadog trace headers to a HTTP Request reflecting the current X-Ray +// subsegment. +// Deprecated: use native Datadog tracing instead. +func AddTraceHeaders(ctx context.Context, req *http.Request) { + headers := trace.ConvertCurrentXrayTraceContext(ctx) + for key, value := range headers { + req.Header.Add(key, value) + } +} + +// GetContext retrieves the last created lambda context. +// Only use this if you aren't manually passing context through your call hierarchy. +func GetContext() context.Context { + return wrapper.CurrentContext +} + +// Distribution sends a distribution metric to Datadog +// Deprecated: Use Metric method instead +func Distribution(metric string, value float64, tags ...string) { + Metric(metric, value, tags...) +} + +// Metric sends a distribution metric to DataDog +func Metric(metric string, value float64, tags ...string) { + MetricWithTimestamp(metric, value, time.Now(), tags...) +} + +// MetricWithTimestamp sends a distribution metric to DataDog with a custom timestamp +func MetricWithTimestamp(metric string, value float64, timestamp time.Time, tags ...string) { + ctx := GetContext() + + if ctx == nil { + logger.Debug("no context available, did you wrap your handler?") + return + } + + listener := metrics.GetListener(ctx) + + if listener == nil { + logger.Error(fmt.Errorf("couldn't get metrics listener from current context")) + return + } + listener.AddDistributionMetric(metric, value, timestamp, false, tags...) +} + +// InvokeDryRun is a utility to easily run your lambda for testing +func InvokeDryRun(callback func(ctx context.Context), cfg *Config) (interface{}, error) { + wrapped := WrapHandler(callback, cfg) + // Convert the wrapped handler to it's underlying raw handler type + handler, ok := wrapped.(func(ctx context.Context, msg json.RawMessage) (interface{}, error)) + if !ok { + logger.Debug("Could not unwrap lambda during dry run") + } + return handler(context.Background(), json.RawMessage("{}")) +} + +func (cfg *Config) toTraceConfig() trace.Config { + traceConfig := trace.Config{ + DDTraceEnabled: true, + MergeXrayTraces: false, + UniversalInstrumentation: true, + OtelTracerEnabled: false, + } + + if cfg != nil { + traceConfig.DDTraceEnabled = cfg.DDTraceEnabled + traceConfig.MergeXrayTraces = cfg.MergeXrayTraces + traceConfig.TraceContextExtractor = cfg.TraceContextExtractor + traceConfig.TracerOptions = cfg.TracerOptions + } + + if traceConfig.TraceContextExtractor == nil { + traceConfig.TraceContextExtractor = trace.DefaultTraceExtractor + } + + if tracingEnabled, err := strconv.ParseBool(os.Getenv(DatadogTraceEnabledEnvVar)); err == nil { + traceConfig.DDTraceEnabled = tracingEnabled + // Only read the OTEL env var if DD tracing is enabled + if tracingEnabled { + if otelTracerEnabled, err := strconv.ParseBool(os.Getenv(OtelTracerEnabled)); err == nil { + traceConfig.OtelTracerEnabled = otelTracerEnabled + } + } + } + + if !traceConfig.MergeXrayTraces { + traceConfig.MergeXrayTraces, _ = strconv.ParseBool(os.Getenv(MergeXrayTracesEnvVar)) + } + + if universalInstrumentation, err := strconv.ParseBool(os.Getenv(UniversalInstrumentation)); err == nil { + traceConfig.UniversalInstrumentation = universalInstrumentation + } + + return traceConfig +} + +func initializeListeners(cfg *Config) []wrapper.HandlerListener { + logLevel := os.Getenv(LogLevelEnvVar) + if strings.EqualFold(logLevel, "debug") || (cfg != nil && cfg.DebugLogging) { + logger.SetLogLevel(logger.LevelDebug) + } + traceConfig := cfg.toTraceConfig() + extensionManager := extension.BuildExtensionManager(traceConfig.UniversalInstrumentation) + isExtensionRunning := extensionManager.IsExtensionRunning() + metricsConfig := cfg.toMetricsConfig(isExtensionRunning) + + // Wrap the handler with listeners that add instrumentation for traces and metrics. + tl := trace.MakeListener(traceConfig, extensionManager) + ml := metrics.MakeListener(metricsConfig, extensionManager) + return []wrapper.HandlerListener{ + &tl, &ml, + } +} + +func (cfg *Config) toMetricsConfig(isExtensionRunning bool) metrics.Config { + + mc := metrics.Config{ + ShouldRetryOnFailure: false, + FIPSMode: cfg.calculateFipsMode(), + } + + if cfg != nil { + mc.BatchInterval = cfg.BatchInterval + mc.ShouldRetryOnFailure = cfg.ShouldRetryOnFailure + mc.APIKey = cfg.APIKey + mc.KMSAPIKey = cfg.KMSAPIKey + mc.Site = cfg.Site + mc.ShouldUseLogForwarder = cfg.ShouldUseLogForwarder + mc.HTTPClientTimeout = cfg.HTTPClientTimeout + } + + if mc.Site == "" { + mc.Site = os.Getenv(DatadogSiteEnvVar) + } + if mc.Site == "" { + mc.Site = DefaultSite + } + if strings.HasPrefix(mc.Site, "https://") || strings.HasPrefix(mc.Site, "http://") { + mc.Site = fmt.Sprintf("%s/api/v1", mc.Site) + } else { + mc.Site = fmt.Sprintf("https://api.%s/api/v1", mc.Site) + } + + if !mc.ShouldUseLogForwarder { + shouldUseLogForwarder := os.Getenv(ShouldUseLogForwarderEnvVar) + mc.ShouldUseLogForwarder = strings.EqualFold(shouldUseLogForwarder, "true") + } + + if mc.APIKey == "" { + mc.APIKey = os.Getenv(DatadogAPIKeyEnvVar) + + } + if mc.KMSAPIKey == "" { + mc.KMSAPIKey = os.Getenv(DatadogKMSAPIKeyEnvVar) + } + if !isExtensionRunning && mc.APIKey == "" && mc.KMSAPIKey == "" && !mc.ShouldUseLogForwarder { + logger.Error(fmt.Errorf( + "couldn't read %s or %s from environment", DatadogAPIKeyEnvVar, DatadogKMSAPIKeyEnvVar, + )) + } + + enhancedMetrics := os.Getenv("DD_ENHANCED_METRICS") + if enhancedMetrics == "" { + mc.EnhancedMetrics = DefaultEnhancedMetrics + } + if !mc.EnhancedMetrics { + mc.EnhancedMetrics = strings.EqualFold(enhancedMetrics, "true") + } + + if localTest := os.Getenv("DD_LOCAL_TEST"); localTest == "1" || strings.ToLower(localTest) == "true" { + mc.LocalTest = true + } + + return mc +} + +func (cfg *Config) calculateFipsMode() bool { + if cfg != nil && cfg.FIPSMode != nil { + return *cfg.FIPSMode + } + + region := os.Getenv("AWS_REGION") + isGovCloud := strings.HasPrefix(region, "us-gov-") + + fipsMode := isGovCloud + + fipsModeEnv := os.Getenv(FIPSModeEnvVar) + if fipsModeEnv != "" { + if parsedFipsMode, err := strconv.ParseBool(fipsModeEnv); err == nil { + fipsMode = parsedFipsMode + } else { + logger.Debug(fmt.Sprintf("could not parse %s: %s", fipsModeEnv, err)) + } + } + + if fipsMode || isGovCloud { + if fipsMode { + logger.Debug("Go Lambda Layer FIPS mode enabled") + } else { + logger.Debug("Go Lambda Layer FIPS mode disabled") + } + } + + return fipsMode +} + +// setupAppSec checks if DD_SERVERLESS_APPSEC_ENABLED is set (to true) and when that +// is the case, redirects `AWS_LAMBDA_RUNTIME_API` to the agent extension, and turns +// on universal instrumentation unless it was already configured by the customer, so +// that the HTTP context (invocation details span tags) is available on AppSec traces. +func setupAppSec() { + enabled := false + if env := os.Getenv(serverlessAppSecEnabledEnvVar); env != "" { + if on, err := strconv.ParseBool(env); err == nil { + enabled = on + } + } + + if !enabled { + return + } + + if _, err := os.Stat(ddExtensionFilePath); os.IsNotExist(err) { + logger.Debug(fmt.Sprintf("%s is enabled, but the Datadog extension was not found at %s", serverlessAppSecEnabledEnvVar, ddExtensionFilePath)) + return + } + + if awsLambdaRpcSupport { + if port := os.Getenv(awsLambdaServerPortEnvVar); port != "" { + logger.Warn(fmt.Sprintf("%s activation with the go1.x AWS Lambda runtime requires setting the `lambda.norpc` go build tag", serverlessAppSecEnabledEnvVar)) + } + } + + if err := os.Setenv(awsLambdaRuntimeApiEnvVar, datadogAgentUrl); err != nil { + logger.Debug(fmt.Sprintf("failed to set %s=%s: %v", awsLambdaRuntimeApiEnvVar, datadogAgentUrl, err)) + } else { + logger.Debug(fmt.Sprintf("successfully set %s=%s", awsLambdaRuntimeApiEnvVar, datadogAgentUrl)) + } + + if val := os.Getenv(UniversalInstrumentation); val == "" { + if err := os.Setenv(UniversalInstrumentation, "1"); err != nil { + logger.Debug(fmt.Sprintf("failed to set %s=%d: %v", UniversalInstrumentation, 1, err)) + } else { + logger.Debug(fmt.Sprintf("successfully set %s=%d", UniversalInstrumentation, 1)) + } + } +} diff --git a/contrib/aws/datadog-lambda-go/ddlambda_example_test.go b/contrib/aws/datadog-lambda-go/ddlambda_example_test.go new file mode 100644 index 0000000000..c289a7e85c --- /dev/null +++ b/contrib/aws/datadog-lambda-go/ddlambda_example_test.go @@ -0,0 +1,60 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package ddlambda_test + +import ( + "context" + "encoding/json" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + "github.com/aws/aws-lambda-go/events" + + ddlambda "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2" +) + +var exampleSQSExtractor = func(ctx context.Context, ev json.RawMessage) map[string]string { + eh := events.SQSEvent{} + + headers := map[string]string{} + + if err := json.Unmarshal(ev, &eh); err != nil { + return headers + } + + // Using SQS as a trigger with a batchSize=1 so its important we check for this as a single SQS message + // will drive the execution of the handler. + if len(eh.Records) != 1 { + return headers + } + + record := eh.Records[0] + + lowercaseHeaders := map[string]string{} + for k, v := range record.MessageAttributes { + if v.StringValue != nil { + lowercaseHeaders[strings.ToLower(k)] = *v.StringValue + } + } + + return lowercaseHeaders +} + +func TestCustomExtractorExample(t *testing.T) { + handler := func(ctx context.Context, event events.SQSEvent) error { + // Use the parent span retrieved from the SQS Message Attributes. + span, _ := tracer.SpanFromContext(ctx) + span.SetTag("key", "value") + return nil + } + + cfg := &ddlambda.Config{ + TraceContextExtractor: exampleSQSExtractor, + } + ddlambda.WrapFunction(handler, cfg) +} diff --git a/contrib/aws/datadog-lambda-go/ddlambda_test.go b/contrib/aws/datadog-lambda-go/ddlambda_test.go new file mode 100644 index 0000000000..e553e25bed --- /dev/null +++ b/contrib/aws/datadog-lambda-go/ddlambda_test.go @@ -0,0 +1,203 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package ddlambda + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInvokeDryRun(t *testing.T) { + t.Setenv(UniversalInstrumentation, "false") + t.Setenv(DatadogTraceEnabledEnvVar, "false") + + called := false + _, err := InvokeDryRun(func(ctx context.Context) { + called = true + globalCtx := GetContext() + assert.Equal(t, globalCtx, ctx) + }, nil) + assert.NoError(t, err) + assert.True(t, called) +} + +func TestMetricsSilentFailWithoutWrapper(t *testing.T) { + Metric("my-metric", 100, "my:tag") +} + +func TestMetricsSubmitWithWrapper(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + _, err := InvokeDryRun(func(ctx context.Context) { + Metric("my-metric", 100, "my:tag") + }, &Config{ + APIKey: "abc-123", + Site: server.URL, + }) + assert.NoError(t, err) + assert.True(t, called) +} + +func TestToMetricConfigLocalTest(t *testing.T) { + testcases := []struct { + envs map[string]string + cval bool + }{ + { + envs: map[string]string{"DD_LOCAL_TEST": "True"}, + cval: true, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "true"}, + cval: true, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "1"}, + cval: true, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "False"}, + cval: false, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "false"}, + cval: false, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": "0"}, + cval: false, + }, + { + envs: map[string]string{"DD_LOCAL_TEST": ""}, + cval: false, + }, + { + envs: map[string]string{}, + cval: false, + }, + } + + cfg := Config{} + for _, tc := range testcases { + t.Run(fmt.Sprintf("%#v", tc.envs), func(t *testing.T) { + for k, v := range tc.envs { + os.Setenv(k, v) + } + mc := cfg.toMetricsConfig(true) + assert.Equal(t, tc.cval, mc.LocalTest) + }) + } +} + +func TestCalculateFipsMode(t *testing.T) { + // Save original environment to restore later + originalRegion := os.Getenv("AWS_REGION") + originalFipsMode := os.Getenv(FIPSModeEnvVar) + defer func() { + os.Setenv("AWS_REGION", originalRegion) + os.Setenv(FIPSModeEnvVar, originalFipsMode) + }() + + testCases := []struct { + name string + configFIPSMode *bool + region string + fipsModeEnv string + expected bool + }{ + { + name: "Config explicit true", + configFIPSMode: boolPtr(true), + region: "us-east-1", + fipsModeEnv: "", + expected: true, + }, + { + name: "Config explicit false", + configFIPSMode: boolPtr(false), + region: "us-gov-west-1", + fipsModeEnv: "", + expected: false, + }, + { + name: "GovCloud default true", + configFIPSMode: nil, + region: "us-gov-east-1", + fipsModeEnv: "", + expected: true, + }, + { + name: "Non-GovCloud default false", + configFIPSMode: nil, + region: "us-east-1", + fipsModeEnv: "", + expected: false, + }, + { + name: "Env var override to true", + configFIPSMode: nil, + region: "us-east-1", + fipsModeEnv: "true", + expected: true, + }, + { + name: "Env var override to false", + configFIPSMode: nil, + region: "us-gov-west-1", + fipsModeEnv: "false", + expected: false, + }, + { + name: "Invalid env var in GovCloud", + configFIPSMode: nil, + region: "us-gov-west-1", + fipsModeEnv: "invalid", + expected: true, + }, + { + name: "Invalid env var in non-GovCloud", + configFIPSMode: nil, + region: "us-east-1", + fipsModeEnv: "invalid", + expected: false, + }, + { + name: "Config takes precedence over env and region", + configFIPSMode: boolPtr(true), + region: "us-east-1", + fipsModeEnv: "false", + expected: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + os.Setenv("AWS_REGION", tc.region) + os.Setenv(FIPSModeEnvVar, tc.fipsModeEnv) + + cfg := &Config{FIPSMode: tc.configFIPSMode} + result := cfg.calculateFipsMode() + + assert.Equal(t, tc.expected, result, "calculateFipsMode returned incorrect value") + }) + } +} + +// Helper function to create bool pointers +func boolPtr(b bool) *bool { + return &b +} diff --git a/contrib/aws/datadog-lambda-go/go.mod b/contrib/aws/datadog-lambda-go/go.mod new file mode 100644 index 0000000000..50af529fb9 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/go.mod @@ -0,0 +1,114 @@ +module github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2 + +go 1.24.0 + +require ( + github.com/DataDog/datadog-go/v5 v5.6.0 + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/aws/aws-lambda-go v1.46.0 + github.com/aws/aws-sdk-go-v2 v1.24.1 + github.com/aws/aws-sdk-go-v2/config v1.26.6 + github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 + github.com/aws/aws-xray-sdk-go/v2 v2.0.0 + github.com/cenkalti/backoff/v4 v4.2.1 + github.com/sony/gobreaker v0.5.0 + github.com/stretchr/testify v1.11.1 + go.opentelemetry.io/otel v1.37.0 +) + +require go.uber.org/atomic v1.11.0 // indirect + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect + github.com/aws/smithy-go v1.19.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.52.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/aws/datadog-lambda-go/go.sum b/contrib/aws/datadog-lambda-go/go.sum new file mode 100644 index 0000000000..717459f00d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/go.sum @@ -0,0 +1,359 @@ +github.com/DATA-DOG/go-sqlmock v1.5.1 h1:FK6RCIUSfmbnI/imIICmboyQBkOckutaa6R5YYlLZyo= +github.com/DATA-DOG/go-sqlmock v1.5.1/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/aws/aws-lambda-go v1.46.0 h1:UWVnvh2h2gecOlFhHQfIPQcD8pL/f7pVCutmFl+oXU8= +github.com/aws/aws-lambda-go v1.46.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= +github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= +github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= +github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 h1:W9PbZAZAEcelhhjb7KuwUtf+Lbc+i7ByYJRuWLlnxyQ= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9/go.mod h1:2tFmR7fQnOdQlM2ZCEPpFnBIQD1U8wmXmduBgZbOag0= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= +github.com/aws/aws-xray-sdk-go/v2 v2.0.0 h1:/AkLb6rmRWjz8pQTm6BxCGcjebS+W1yFoH9rxy3ekM8= +github.com/aws/aws-xray-sdk-go/v2 v2.0.0/go.mod h1:yyjiofE/pQ9u682QgBw3tkyuyvcN+6piDiQnhwWMyng= +github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= +github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= +github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= +github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/aws/datadog-lambda-go/internal/extension/extension.go b/contrib/aws/datadog-lambda-go/internal/extension/extension.go new file mode 100644 index 0000000000..7f0a99f2bd --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/extension/extension.go @@ -0,0 +1,261 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package extension + +import ( + "bytes" + "context" + "encoding/base64" + "encoding/json" + "fmt" + "io" + "net/http" + "os" + "reflect" + "runtime" + "strconv" + "strings" + "time" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + + ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +type ddTraceContext string + +const ( + DdTraceId ddTraceContext = "x-datadog-trace-id" + DdParentId ddTraceContext = "x-datadog-parent-id" + DdSpanId ddTraceContext = "x-datadog-span-id" + DdSamplingPriority ddTraceContext = "x-datadog-sampling-priority" + DdOrigin ddTraceContext = "x-datadog-origin" + DdInvocationError ddTraceContext = "x-datadog-invocation-error" + DdInvocationErrorMsg ddTraceContext = "x-datadog-invocation-error-msg" + DdInvocationErrorType ddTraceContext = "x-datadog-invocation-error-type" + DdInvocationErrorStack ddTraceContext = "x-datadog-invocation-error-stack" + + DdSeverlessSpan ddTraceContext = "dd-tracer-serverless-span" + DdLambdaResponse ddTraceContext = "dd-response" +) + +const ( + // We don't want call to the Serverless Agent to block indefinitely for any reasons, + // so here's a configuration of the timeout when calling the Serverless Agent. We also + // want to let it having some time for its cold start so we should not set this too low. + timeout = 3000 * time.Millisecond + + helloUrl = "http://localhost:8124/lambda/hello" + flushUrl = "http://localhost:8124/lambda/flush" + startInvocationUrl = "http://localhost:8124/lambda/start-invocation" + endInvocationUrl = "http://localhost:8124/lambda/end-invocation" + + extensionPath = "/opt/extensions/datadog-agent" +) + +type ExtensionManager struct { + helloRoute string + flushRoute string + extensionPath string + startInvocationUrl string + endInvocationUrl string + httpClient HTTPClient + isExtensionRunning bool + isUniversalInstrumentation bool +} + +type HTTPClient interface { + Do(req *http.Request) (*http.Response, error) +} + +func BuildExtensionManager(isUniversalInstrumentation bool) *ExtensionManager { + em := &ExtensionManager{ + helloRoute: helloUrl, + flushRoute: flushUrl, + startInvocationUrl: startInvocationUrl, + endInvocationUrl: endInvocationUrl, + extensionPath: extensionPath, + httpClient: &http.Client{Timeout: timeout}, + isUniversalInstrumentation: isUniversalInstrumentation, + } + em.checkAgentRunning() + return em +} + +func (em *ExtensionManager) checkAgentRunning() { + if _, err := os.Stat(em.extensionPath); err != nil { + logger.Debug("Will use the API") + em.isExtensionRunning = false + } else { + logger.Debug("Will use the Serverless Agent") + em.isExtensionRunning = true + + // Tell the extension not to create an execution span if universal instrumentation is disabled + if !em.isUniversalInstrumentation { + req, _ := http.NewRequest(http.MethodGet, em.helloRoute, nil) + response, err := em.httpClient.Do(req) + if response != nil && response.Body != nil { + defer func() { + _, _ = io.Copy(io.Discard, response.Body) + response.Body.Close() + }() + } + if err == nil && response.StatusCode == 200 { + logger.Debug("Hit the extension /hello route") + } else { + logger.Debug("Will use the API since the Serverless Agent was detected but the hello route was unreachable") + em.isExtensionRunning = false + } + } + } +} + +func (em *ExtensionManager) SendStartInvocationRequest(ctx context.Context, eventPayload json.RawMessage) context.Context { + body := bytes.NewBuffer(eventPayload) + req, _ := http.NewRequest(http.MethodPost, em.startInvocationUrl, body) + response, err := em.httpClient.Do(req) + if response != nil && response.Body != nil { + defer func() { + _, _ = io.Copy(io.Discard, response.Body) + response.Body.Close() + }() + } + if err == nil && response.StatusCode == 200 { + // Propagate dd-trace context from the extension response if found in the response headers + traceId := response.Header.Get(string(DdTraceId)) + if traceId != "" { + ctx = context.WithValue(ctx, DdTraceId, traceId) + } + parentId := traceId + if pid := response.Header.Get(string(DdParentId)); pid != "" { + parentId = pid + } + if parentId != "" { + ctx = context.WithValue(ctx, DdParentId, parentId) + } + samplingPriority := response.Header.Get(string(DdSamplingPriority)) + if samplingPriority != "" { + ctx = context.WithValue(ctx, DdSamplingPriority, samplingPriority) + } + } + return ctx +} + +func (em *ExtensionManager) SendEndInvocationRequest(ctx context.Context, functionExecutionSpan *ddtracer.Span, cfg ddtracer.FinishConfig) { + // Handle Lambda response + lambdaResponse := ctx.Value(DdLambdaResponse) + content, responseErr := json.Marshal(lambdaResponse) + if responseErr != nil { + content = []byte("{}") + } + body := bytes.NewBuffer(content) + req, _ := http.NewRequest(http.MethodPost, em.endInvocationUrl, body) + + // Mark the invocation as an error if any + if cfg.Error != nil { + req.Header.Set(string(DdInvocationError), "true") + req.Header.Set(string(DdInvocationErrorMsg), cfg.Error.Error()) + req.Header.Set(string(DdInvocationErrorType), reflect.TypeOf(cfg.Error).String()) + req.Header.Set(string(DdInvocationErrorStack), takeStacktrace(cfg)) + } + + // Extract the DD trace context and pass them to the extension via request headers + traceId, ok := ctx.Value(DdTraceId).(string) + if ok { + req.Header.Set(string(DdTraceId), traceId) + if parentId, ok := ctx.Value(DdParentId).(string); ok { + req.Header.Set(string(DdParentId), parentId) + } + if spanId, ok := ctx.Value(DdSpanId).(string); ok { + req.Header.Set(string(DdSpanId), spanId) + } + if samplingPriority, ok := ctx.Value(DdSamplingPriority).(string); ok { + req.Header.Set(string(DdSamplingPriority), samplingPriority) + } + } else { + spanContext := functionExecutionSpan.Context() + req.Header.Set(string(DdTraceId), fmt.Sprint(spanContext.TraceIDLower())) + req.Header.Set(string(DdSpanId), fmt.Sprint(spanContext.SpanID())) + + // Try to get sampling priority + if priority, ok := spanContext.SamplingPriority(); ok { + req.Header.Set(string(DdSamplingPriority), fmt.Sprint(priority)) + } + } + + resp, err := em.httpClient.Do(req) + if resp != nil && resp.Body != nil { + defer func() { + _, _ = io.Copy(io.Discard, resp.Body) + resp.Body.Close() + }() + } + if err != nil || resp.StatusCode != 200 { + logger.Error(fmt.Errorf("could not send end invocation payload to the extension: %v", err)) + } +} + +// defaultStackLength specifies the default maximum size of a stack trace. +const defaultStackLength = 32 + +// takeStacktrace takes a stack trace of maximum n entries, skipping the first skip entries. +// If n is 0, up to 20 entries are retrieved. +func takeStacktrace(opts ddtracer.FinishConfig) string { + if opts.StackFrames == 0 { + opts.StackFrames = defaultStackLength + } + var builder strings.Builder + pcs := make([]uintptr, opts.StackFrames) + + // +3 to exclude runtime.Callers, takeStacktrace and SendEndInvocationRequest + numFrames := runtime.Callers(3+int(opts.SkipStackFrames), pcs) + if numFrames == 0 { + return "" + } + frames := runtime.CallersFrames(pcs[:numFrames]) + for i := 0; ; i++ { + frame, more := frames.Next() + if i != 0 { + builder.WriteByte('\n') + } + builder.WriteString(frame.Function) + builder.WriteByte('\n') + builder.WriteByte('\t') + builder.WriteString(frame.File) + builder.WriteByte(':') + builder.WriteString(strconv.Itoa(frame.Line)) + if !more { + break + } + } + + return base64.StdEncoding.EncodeToString([]byte(builder.String())) +} + +func (em *ExtensionManager) IsExtensionRunning() bool { + return em.isExtensionRunning +} + +func (em *ExtensionManager) Flush() error { + req, _ := http.NewRequest(http.MethodGet, em.flushRoute, nil) + response, err := em.httpClient.Do(req) + if response != nil && response.Body != nil { + defer func() { + _, _ = io.Copy(io.Discard, response.Body) + response.Body.Close() + }() + } + if err != nil { + err := fmt.Errorf("was not able to reach the Agent to flush: %s", err) + logger.Error(err) + return err + } else if response.StatusCode != 200 { + err := fmt.Errorf("the Agent didn't returned HTTP 200: %s", response.Status) + logger.Error(err) + return err + } + return nil +} diff --git a/contrib/aws/datadog-lambda-go/internal/extension/extension_test.go b/contrib/aws/datadog-lambda-go/internal/extension/extension_test.go new file mode 100644 index 0000000000..2509256ba6 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/extension/extension_test.go @@ -0,0 +1,293 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package extension + +import ( + "bytes" + "context" + "encoding/base64" + "fmt" + "net/http" + "os" + "testing" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/stretchr/testify/assert" +) + +type ClientErrorMock struct { +} + +type ClientSuccessMock struct { +} + +type ClientSuccess202Mock struct { +} + +type ClientSuccessStartInvoke struct { + headers http.Header +} + +type ClientSuccessEndInvoke struct { +} + +const ( + mockTraceId = "1" + mockParentId = "2" + mockSamplingPriority = "3" +) + +func (c *ClientErrorMock) Do(req *http.Request) (*http.Response, error) { + return nil, fmt.Errorf("KO") +} + +func (c *ClientSuccessMock) Do(req *http.Request) (*http.Response, error) { + return &http.Response{StatusCode: 200}, nil +} + +func (c *ClientSuccess202Mock) Do(req *http.Request) (*http.Response, error) { + return &http.Response{StatusCode: 202, Status: "KO"}, nil +} + +func (c *ClientSuccessStartInvoke) Do(req *http.Request) (*http.Response, error) { + return &http.Response{StatusCode: 200, Status: "KO", Header: c.headers}, nil +} + +func (c *ClientSuccessEndInvoke) Do(req *http.Request) (*http.Response, error) { + return &http.Response{StatusCode: 200, Status: "KO"}, nil +} + +func captureLog(f func()) string { + var buf bytes.Buffer + logger.SetOutput(&buf) + f() + logger.SetOutput(os.Stdout) + return buf.String() +} + +func TestBuildExtensionManager(t *testing.T) { + em := BuildExtensionManager(false) + assert.Equal(t, "http://localhost:8124/lambda/hello", em.helloRoute) + assert.Equal(t, "http://localhost:8124/lambda/flush", em.flushRoute) + assert.Equal(t, "http://localhost:8124/lambda/start-invocation", em.startInvocationUrl) + assert.Equal(t, "http://localhost:8124/lambda/end-invocation", em.endInvocationUrl) + assert.Equal(t, "/opt/extensions/datadog-agent", em.extensionPath) + assert.Equal(t, false, em.isUniversalInstrumentation) + assert.NotNil(t, em.httpClient) +} + +func TestIsAgentRunningFalse(t *testing.T) { + em := &ExtensionManager{ + httpClient: &ClientErrorMock{}, + } + assert.False(t, em.IsExtensionRunning()) +} + +func TestIsAgentRunningFalseSinceTheAgentIsNotHere(t *testing.T) { + em := &ExtensionManager{ + extensionPath: "/impossible/path/test", + } + em.checkAgentRunning() + assert.False(t, em.IsExtensionRunning()) +} + +func TestIsAgentRunningTrue(t *testing.T) { + existingPath, err := os.Getwd() + assert.Nil(t, err) + + em := &ExtensionManager{ + httpClient: &ClientSuccessMock{}, + extensionPath: existingPath, + } + em.checkAgentRunning() + assert.True(t, em.IsExtensionRunning()) +} + +func TestFlushErrorNot200(t *testing.T) { + em := &ExtensionManager{ + httpClient: &ClientSuccess202Mock{}, + } + err := em.Flush() + assert.Equal(t, "the Agent didn't returned HTTP 200: KO", err.Error()) +} + +func TestFlushError(t *testing.T) { + em := &ExtensionManager{ + httpClient: &ClientErrorMock{}, + } + err := em.Flush() + assert.Equal(t, "was not able to reach the Agent to flush: KO", err.Error()) +} + +func TestFlushSuccess(t *testing.T) { + em := &ExtensionManager{ + httpClient: &ClientSuccessMock{}, + } + err := em.Flush() + assert.Nil(t, err) +} + +func TestExtensionStartInvoke(t *testing.T) { + em := &ExtensionManager{ + startInvocationUrl: startInvocationUrl, + httpClient: &ClientSuccessStartInvoke{}, + } + ctx := em.SendStartInvocationRequest(context.TODO(), []byte{}) + traceId := ctx.Value(DdTraceId) + parentId := ctx.Value(DdParentId) + samplingPriority := ctx.Value(DdSamplingPriority) + err := em.Flush() + + assert.Nil(t, err) + assert.Nil(t, traceId) + assert.Nil(t, parentId) + assert.Nil(t, samplingPriority) +} + +func TestExtensionStartInvokeWithTraceContext(t *testing.T) { + headers := http.Header{} + headers.Set(string(DdTraceId), mockTraceId) + headers.Set(string(DdParentId), mockParentId) + headers.Set(string(DdSamplingPriority), mockSamplingPriority) + + em := &ExtensionManager{ + startInvocationUrl: startInvocationUrl, + httpClient: &ClientSuccessStartInvoke{ + headers: headers, + }, + } + ctx := em.SendStartInvocationRequest(context.TODO(), []byte{}) + traceId := ctx.Value(DdTraceId) + parentId := ctx.Value(DdParentId) + samplingPriority := ctx.Value(DdSamplingPriority) + err := em.Flush() + + assert.Nil(t, err) + assert.Equal(t, mockTraceId, traceId) + assert.Equal(t, mockParentId, parentId) + assert.Equal(t, mockSamplingPriority, samplingPriority) +} + +func TestExtensionStartInvokeWithTraceContextNoParentID(t *testing.T) { + headers := http.Header{} + headers.Set(string(DdTraceId), mockTraceId) + headers.Set(string(DdSamplingPriority), mockSamplingPriority) + + em := &ExtensionManager{ + startInvocationUrl: startInvocationUrl, + httpClient: &ClientSuccessStartInvoke{ + headers: headers, + }, + } + ctx := em.SendStartInvocationRequest(context.TODO(), []byte{}) + traceId := ctx.Value(DdTraceId) + parentId := ctx.Value(DdParentId) + samplingPriority := ctx.Value(DdSamplingPriority) + err := em.Flush() + + assert.Nil(t, err) + assert.Equal(t, mockTraceId, traceId) + assert.Equal(t, mockTraceId, parentId) + assert.Equal(t, mockSamplingPriority, samplingPriority) +} + +func TestExtensionEndInvocation(t *testing.T) { + em := &ExtensionManager{ + endInvocationUrl: endInvocationUrl, + httpClient: &ClientSuccessEndInvoke{}, + } + span := tracer.StartSpan("aws.lambda") + logOutput := captureLog(func() { em.SendEndInvocationRequest(context.TODO(), span, tracer.FinishConfig{}) }) + span.Finish() + + assert.Equal(t, "", logOutput) +} + +func TestExtensionEndInvocationError(t *testing.T) { + em := &ExtensionManager{ + endInvocationUrl: endInvocationUrl, + httpClient: &ClientErrorMock{}, + } + span := tracer.StartSpan("aws.lambda") + logOutput := captureLog(func() { em.SendEndInvocationRequest(context.TODO(), span, tracer.FinishConfig{}) }) + span.Finish() + + assert.Contains(t, logOutput, "could not send end invocation payload to the extension") +} + +func TestExtensionEndInvocationSamplingPriority(t *testing.T) { + // Start the tracer to ensure proper sampling priority handling + err := tracer.Start() + if err != nil { + t.Fatalf("Failed to start tracer: %v", err) + } + defer tracer.Stop() + + // Create a real span and set its sampling priority to -1 using ManualDrop + span := tracer.StartSpan("test") + defer span.Finish() + + // When priority in context, use that value + headers1 := http.Header{} + em1 := &ExtensionManager{httpClient: capturingClient{hdr: headers1}} + ctx := context.WithValue(context.Background(), DdTraceId, "123") + ctx = context.WithValue(ctx, DdSamplingPriority, "2") + em1.SendEndInvocationRequest(ctx, span, tracer.FinishConfig{}) + assert.Equal(t, "2", headers1.Get("X-Datadog-Sampling-Priority")) + + // When no context, get priority from span + // Set sampling priority to -1 using ManualDrop tag + span.SetTag(ext.ManualDrop, true) + headers2 := http.Header{} + em2 := &ExtensionManager{httpClient: capturingClient{hdr: headers2}} + em2.SendEndInvocationRequest(context.Background(), span, tracer.FinishConfig{}) + assert.Equal(t, "-1", headers2.Get("X-Datadog-Sampling-Priority")) +} + +type capturingClient struct { + hdr http.Header +} + +func (c capturingClient) Do(req *http.Request) (*http.Response, error) { + for k, v := range req.Header { + c.hdr[k] = v + } + return &http.Response{StatusCode: 200}, nil +} + +func TestExtensionEndInvocationErrorHeaders(t *testing.T) { + hdr := http.Header{} + em := &ExtensionManager{httpClient: capturingClient{hdr: hdr}} + span := tracer.StartSpan("aws.lambda") + cfg := tracer.FinishConfig{Error: fmt.Errorf("ooooops")} + + em.SendEndInvocationRequest(context.TODO(), span, cfg) + + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error"), "true") + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error-Msg"), "ooooops") + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error-Type"), "*errors.errorString") + + data, err := base64.StdEncoding.DecodeString(hdr.Get("X-Datadog-Invocation-Error-Stack")) + assert.Nil(t, err) + assert.Contains(t, string(data), "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2") + assert.Contains(t, string(data), "TestExtensionEndInvocationErrorHeaders") +} + +func TestExtensionEndInvocationErrorHeadersNilError(t *testing.T) { + hdr := http.Header{} + em := &ExtensionManager{httpClient: capturingClient{hdr: hdr}} + span := tracer.StartSpan("aws.lambda") + cfg := tracer.FinishConfig{Error: nil} + + em.SendEndInvocationRequest(context.TODO(), span, cfg) + + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error"), "") + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error-Msg"), "") + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error-Type"), "") + assert.Equal(t, hdr.Get("X-Datadog-Invocation-Error-Stack"), "") +} diff --git a/contrib/aws/datadog-lambda-go/internal/internal.go b/contrib/aws/datadog-lambda-go/internal/internal.go new file mode 100644 index 0000000000..07fbb91ff4 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/internal.go @@ -0,0 +1,16 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var Instr *instrumentation.Instrumentation + +func init() { + Instr = instrumentation.Load(instrumentation.PackageAWSDatadogLambdaGo) +} diff --git a/contrib/aws/datadog-lambda-go/internal/logger/log.go b/contrib/aws/datadog-lambda-go/internal/logger/log.go new file mode 100644 index 0000000000..e25aac741a --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/logger/log.go @@ -0,0 +1,91 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package logger + +import ( + "encoding/json" + "fmt" + "io" + "log" + "os" +) + +// LogLevel represents the level of logging that should be performed +type LogLevel int + +const ( + // LevelDebug logs all information + LevelDebug LogLevel = iota + // LevelWarn only logs warnings and errors + LevelWarn LogLevel = iota +) + +var ( + logLevel = LevelWarn + output io.Writer = os.Stdout +) + +// SetLogLevel set the level of logging for the ddlambda +func SetLogLevel(ll LogLevel) { + logLevel = ll +} + +// SetOutput changes the writer for the logger +func SetOutput(w io.Writer) { + log.SetOutput(w) + output = w +} + +// Error logs a structured error message to stdout +func Error(err error) { + finalMessage := logStructure{ + Status: "error", + Message: fmt.Sprintf("datadog: %s", err.Error()), + } + result, _ := json.Marshal(finalMessage) + + log.Println(string(result)) +} + +// Debug logs a structured log message to stdout +func Debug(message string) { + if logLevel > LevelDebug { + return + } + finalMessage := logStructure{ + Status: "debug", + Message: fmt.Sprintf("datadog: %s", message), + } + + result, _ := json.Marshal(finalMessage) + + log.Println(string(result)) +} + +// Warn logs a structured log message to stdout +func Warn(message string) { + if logLevel > LevelWarn { + return + } + finalMessage := logStructure{ + Status: "warning", + Message: fmt.Sprintf("datadog: %s", message), + } + + result, _ := json.Marshal(finalMessage) + + log.Println(string(result)) +} + +// Raw prints a raw message to the logs. +func Raw(message string) { + fmt.Fprintln(output, message) +} + +type logStructure struct { + Status string `json:"status"` + Message string `json:"message"` +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/api.go b/contrib/aws/datadog-lambda-go/internal/metrics/api.go new file mode 100644 index 0000000000..05de180d59 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/api.go @@ -0,0 +1,149 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" +) + +type ( + // Client sends metrics to Datadog + Client interface { + SendMetrics(metrics []APIMetric) error + } + + // APIClient send metrics to Datadog, via the Datadog API + APIClient struct { + apiKey string + apiKeyDecryptChan <-chan string + baseAPIURL string + httpClient *http.Client + context context.Context + } + + // APIClientOptions contains instantiation options from creating an APIClient. + APIClientOptions struct { + baseAPIURL string + apiKey string + kmsAPIKey string + decrypter Decrypter + httpClientTimeout time.Duration + } + + postMetricsModel struct { + Series []APIMetric `json:"series"` + } +) + +// MakeAPIClient creates a new API client with the given api and app keys +func MakeAPIClient(ctx context.Context, options APIClientOptions) *APIClient { + httpClient := &http.Client{ + Timeout: options.httpClientTimeout, + } + client := &APIClient{ + apiKey: options.apiKey, + baseAPIURL: options.baseAPIURL, + httpClient: httpClient, + context: ctx, + } + if len(options.apiKey) == 0 && len(options.kmsAPIKey) != 0 { + client.apiKeyDecryptChan = client.decryptAPIKey(options.decrypter, options.kmsAPIKey) + } + + return client +} + +// SendMetrics posts a batch metrics payload to the Datadog API +func (cl *APIClient) SendMetrics(metrics []APIMetric) error { + + // If the api key was provided as a kms key, wait for it to finish decrypting + if cl.apiKeyDecryptChan != nil { + cl.apiKey = <-cl.apiKeyDecryptChan + cl.apiKeyDecryptChan = nil + } + + content, err := marshalAPIMetricsModel(metrics) + if err != nil { + return fmt.Errorf("Couldn't marshal metrics model: %v", err) + } + body := bytes.NewBuffer(content) + + // For the moment we only support distribution metrics. + // Other metric types use the "series" endpoint, which takes an identical payload. + req, err := http.NewRequest("POST", cl.makeRoute("distribution_points"), body) + if err != nil { + return fmt.Errorf("Couldn't create send metrics request:%v", err) + } + req = req.WithContext(cl.context) + + defer req.Body.Close() + + logger.Debug(fmt.Sprintf("Sending payload with body %s", content)) + + cl.addAPICredentials(req) + + resp, err := cl.httpClient.Do(req) + + if err != nil { + return fmt.Errorf("Failed to send metrics to API") + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode > 299 { + if resp.StatusCode == 403 { + logger.Debug(fmt.Sprintf("authorization failed with api key of length %d characters", len(cl.apiKey))) + } + bodyBytes, err := io.ReadAll(resp.Body) + body := "" + if err == nil { + body = string(bodyBytes) + } + return fmt.Errorf("Failed to send metrics to API. Status Code %d, Body %s", resp.StatusCode, body) + } + + return err +} + +func (cl *APIClient) decryptAPIKey(decrypter Decrypter, kmsAPIKey string) <-chan string { + + ch := make(chan string) + + go func() { + result, err := decrypter.Decrypt(kmsAPIKey) + if err != nil { + logger.Error(fmt.Errorf("Couldn't decrypt api kms key %s", err)) + } + ch <- result + close(ch) + }() + return ch +} + +func (cl *APIClient) addAPICredentials(req *http.Request) { + query := req.URL.Query() + query.Add(apiKeyParam, cl.apiKey) + req.URL.RawQuery = query.Encode() +} + +func (cl *APIClient) makeRoute(route string) string { + url := fmt.Sprintf("%s/%s", cl.baseAPIURL, route) + logger.Debug(fmt.Sprintf("posting to url %s", url)) + return url +} + +func marshalAPIMetricsModel(metrics []APIMetric) ([]byte, error) { + pm := postMetricsModel{} + pm.Series = metrics + return json.Marshal(pm) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/api_test.go b/contrib/aws/datadog-lambda-go/internal/metrics/api_test.go new file mode 100644 index 0000000000..fbd24e266d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/api_test.go @@ -0,0 +1,169 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "context" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" +) + +const ( + mockAPIKey = "12345" + mockEncryptedAPIKey = "mockEncrypted" + mockDecryptedAPIKey = "mockDecrypted" +) + +type ( + mockDecrypter struct { + returnValue string + returnError error + } +) + +func (md *mockDecrypter) Decrypt(cipherText string) (string, error) { + return md.returnValue, md.returnError +} + +func TestAddAPICredentials(t *testing.T) { + cl := MakeAPIClient(context.Background(), APIClientOptions{baseAPIURL: "", apiKey: mockAPIKey}) + req, _ := http.NewRequest("GET", "http://some-api.com/endpoint", nil) + cl.addAPICredentials(req) + assert.Equal(t, "http://some-api.com/endpoint?api_key=12345", req.URL.String()) +} + +func TestSendMetricsSuccess(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + body, _ := io.ReadAll(r.Body) + s := string(body) + + assert.Equal(t, "/distribution_points?api_key=12345", r.URL.String()) + assert.Equal(t, "{\"series\":[{\"metric\":\"metric-1\",\"tags\":[\"a\",\"b\",\"c\"],\"type\":\"distribution\",\"points\":[[1,[2]],[3,[4]],[5,[6]]]}]}", s) + + })) + defer server.Close() + + am := []APIMetric{ + { + Name: "metric-1", + Host: nil, + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{float64(1), []interface{}{float64(2)}}, + []interface{}{float64(3), []interface{}{float64(4)}}, + []interface{}{float64(5), []interface{}{float64(6)}}, + }, + }, + } + + cl := MakeAPIClient(context.Background(), APIClientOptions{baseAPIURL: server.URL, apiKey: mockAPIKey}) + err := cl.SendMetrics(am) + + assert.NoError(t, err) + assert.True(t, called) +} + +func TestSendMetricsBadRequest(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusForbidden) + body, _ := io.ReadAll(r.Body) + s := string(body) + + assert.Equal(t, "/distribution_points?api_key=12345", r.URL.String()) + assert.Equal(t, "{\"series\":[{\"metric\":\"metric-1\",\"tags\":[\"a\",\"b\",\"c\"],\"type\":\"distribution\",\"points\":[[1,[2]],[3,[4]],[5,[6]]]}]}", s) + + })) + defer server.Close() + + am := []APIMetric{ + { + Name: "metric-1", + Host: nil, + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{float64(1), []interface{}{float64(2)}}, + []interface{}{float64(3), []interface{}{float64(4)}}, + []interface{}{float64(5), []interface{}{float64(6)}}, + }, + }, + } + + cl := MakeAPIClient(context.Background(), APIClientOptions{baseAPIURL: server.URL, apiKey: mockAPIKey}) + err := cl.SendMetrics(am) + + assert.Error(t, err) + assert.True(t, called) +} + +func TestSendMetricsCantReachServer(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + })) + defer server.Close() + + am := []APIMetric{ + { + Name: "metric-1", + Host: nil, + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{float64(1), []interface{}{float64(2)}}, + []interface{}{float64(3), []interface{}{float64(4)}}, + []interface{}{float64(5), []interface{}{float64(6)}}, + }, + }, + } + + cl := MakeAPIClient(context.Background(), APIClientOptions{baseAPIURL: "httpa:///badly-formatted-url", apiKey: mockAPIKey}) + err := cl.SendMetrics(am) + + assert.Error(t, err) + assert.False(t, called) +} + +func TestDecryptsUsingKMSKey(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + assert.Equal(t, "/distribution_points?api_key=mockDecrypted", r.URL.String()) + })) + defer server.Close() + + am := []APIMetric{ + { + Name: "metric-1", + Host: nil, + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{float64(1), []interface{}{float64(2)}}, + []interface{}{float64(3), []interface{}{float64(4)}}, + []interface{}{float64(5), []interface{}{float64(6)}}, + }, + }, + } + md := mockDecrypter{} + md.returnValue = mockDecryptedAPIKey + + cl := MakeAPIClient(context.Background(), APIClientOptions{baseAPIURL: server.URL, apiKey: "", kmsAPIKey: mockEncryptedAPIKey, decrypter: &md}) + err := cl.SendMetrics(am) + + assert.NoError(t, err) + assert.True(t, called) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/batcher.go b/contrib/aws/datadog-lambda-go/internal/metrics/batcher.go new file mode 100644 index 0000000000..dd4d939214 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/batcher.go @@ -0,0 +1,75 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "fmt" + "sort" + "strings" + "time" +) + +type ( + // Batcher aggregates metrics with common properties,(metric name, tags, type etc) + Batcher struct { + metrics map[string]Metric + batchInterval time.Duration + } + // BatchKey identifies a batch of metrics + BatchKey struct { + metricType MetricType + name string + tags []string + host *string + } +) + +// MakeBatcher creates a new batcher object +func MakeBatcher(batchInterval time.Duration) *Batcher { + return &Batcher{ + batchInterval: batchInterval, + metrics: map[string]Metric{}, + } +} + +// AddMetric adds a point to a given metric +func (b *Batcher) AddMetric(metric Metric) { + sk := b.getStringKey(metric.ToBatchKey()) + if existing, ok := b.metrics[sk]; ok { + existing.Join(metric) + } else { + b.metrics[sk] = metric + } +} + +// ToAPIMetrics converts the current batch of metrics into API metrics +func (b *Batcher) ToAPIMetrics() []APIMetric { + + ar := []APIMetric{} + interval := b.batchInterval / time.Second + + for _, metric := range b.metrics { + values := metric.ToAPIMetric(interval) + ar = append(ar, values...) + } + return ar +} + +func (b *Batcher) getStringKey(bk BatchKey) string { + tagKey := getTagKey(bk.tags) + + if bk.host != nil { + return fmt.Sprintf("(%s)-(%s)-(%s)-(%s)", bk.metricType, bk.name, tagKey, *bk.host) + } + return fmt.Sprintf("(%s)-(%s)-(%s)", bk.metricType, bk.name, tagKey) +} + +func getTagKey(tags []string) string { + sortedTags := make([]string, len(tags)) + copy(sortedTags, tags) + sort.Strings(sortedTags) + return strings.Join(sortedTags, ":") +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/batcher_test.go b/contrib/aws/datadog-lambda-go/internal/metrics/batcher_test.go new file mode 100644 index 0000000000..5e04fc1571 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/batcher_test.go @@ -0,0 +1,147 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestGetMetricDifferentTagOrder(t *testing.T) { + + tm := time.Now() + batcher := MakeBatcher(10) + dm1 := Distribution{ + Name: "metric-1", + Values: []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}}, + Tags: []string{"a", "b", "c"}, + } + dm2 := Distribution{ + Name: "metric-1", + Values: []MetricValue{{Timestamp: tm, Value: 3}, {Timestamp: tm, Value: 4}}, + Tags: []string{"c", "b", "a"}, + } + + batcher.AddMetric(&dm1) + batcher.AddMetric(&dm2) + + assert.Equal(t, []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}, {Timestamp: tm, Value: 3}, {Timestamp: tm, Value: 4}}, dm1.Values) +} + +func TestGetMetricFailDifferentName(t *testing.T) { + + tm := time.Now() + batcher := MakeBatcher(10) + + dm1 := Distribution{ + Name: "metric-1", + Values: []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}}, + Tags: []string{"a", "b", "c"}, + } + dm2 := Distribution{ + Name: "metric-2", + Values: []MetricValue{{Timestamp: tm, Value: 3}, {Timestamp: tm, Value: 4}}, + Tags: []string{"c", "b", "a"}, + } + + batcher.AddMetric(&dm1) + batcher.AddMetric(&dm2) + + assert.Equal(t, []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}}, dm1.Values) + +} + +func TestGetMetricFailDifferentHost(t *testing.T) { + tm := time.Now() + batcher := MakeBatcher(10) + + host1 := "my-host-1" + host2 := "my-host-2" + + dm1 := Distribution{ + Values: []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}}, + + Tags: []string{"a", "b", "c"}, + Host: &host1, + } + dm2 := Distribution{ + Name: "metric-1", + Values: []MetricValue{{Timestamp: tm, Value: 3}, {Timestamp: tm, Value: 4}}, + Tags: []string{"a", "b", "c"}, + Host: &host2, + } + + batcher.AddMetric(&dm1) + batcher.AddMetric(&dm2) + + assert.Equal(t, []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}}, dm1.Values) +} + +func TestGetMetricSameHost(t *testing.T) { + + tm := time.Now() + batcher := MakeBatcher(10) + + host := "my-host" + + dm1 := Distribution{ + Name: "metric-1", + Values: []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}}, + Tags: []string{"a", "b", "c"}, + Host: &host, + } + dm2 := Distribution{ + Name: "metric-1", + Values: []MetricValue{{Timestamp: tm, Value: 3}, {Timestamp: tm, Value: 4}}, + Tags: []string{"a", "b", "c"}, + Host: &host, + } + + batcher.AddMetric(&dm1) + batcher.AddMetric(&dm2) + + assert.Equal(t, []MetricValue{{Timestamp: tm, Value: 1}, {Timestamp: tm, Value: 2}, {Timestamp: tm, Value: 3}, {Timestamp: tm, Value: 4}}, dm1.Values) +} + +func TestToAPIMetricsSameInterval(t *testing.T) { + tm := time.Now() + hostname := "host-1" + + batcher := MakeBatcher(10) + dm := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Host: &hostname, + Values: []MetricValue{}, + } + + dm.AddPoint(tm, 1) + dm.AddPoint(tm, 2) + dm.AddPoint(tm, 3) + + batcher.AddMetric(&dm) + + floatTime := float64(tm.Unix()) + result := batcher.ToAPIMetrics() + expected := []APIMetric{ + { + Name: "metric-1", + Host: &hostname, + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Interval: nil, + Points: []interface{}{ + []interface{}{floatTime, []interface{}{float64(1)}}, + []interface{}{floatTime, []interface{}{float64(2)}}, + []interface{}{floatTime, []interface{}{float64(3)}}, + }, + }, + } + + assert.Equal(t, expected, result) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/constants.go b/contrib/aws/datadog-lambda-go/internal/metrics/constants.go new file mode 100644 index 0000000000..0b80157386 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/constants.go @@ -0,0 +1,27 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import "time" + +const ( + apiKeyParam = "api_key" + defaultRetryInterval = time.Millisecond * 250 + defaultBatchInterval = time.Second * 15 + defaultHttpClientTimeout = time.Second * 5 + defaultCircuitBreakerInterval = time.Second * 30 + defaultCircuitBreakerTimeout = time.Second * 60 + defaultCircuitBreakerTotalFailures = 4 +) + +// MetricType enumerates all the available metric types +type MetricType string + +const ( + + // DistributionType represents a distribution metric + DistributionType MetricType = "distribution" +) diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/context.go b/contrib/aws/datadog-lambda-go/internal/metrics/context.go new file mode 100644 index 0000000000..4f1d9394a5 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/context.go @@ -0,0 +1,26 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import "context" + +type contextKeytype int + +var metricsListenerKey = new(contextKeytype) + +// GetListener retrieves the metrics listener from a context object. +func GetListener(ctx context.Context) *Listener { + result := ctx.Value(metricsListenerKey) + if result == nil { + return nil + } + return result.(*Listener) +} + +// AddListener adds a metrics listener to a context object +func AddListener(ctx context.Context, listener *Listener) context.Context { + return context.WithValue(ctx, metricsListenerKey, listener) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/context_test.go b/contrib/aws/datadog-lambda-go/internal/metrics/context_test.go new file mode 100644 index 0000000000..84a1f0dec2 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/context_test.go @@ -0,0 +1,27 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/stretchr/testify/assert" +) + +func TestGetProcessorEmptyContext(t *testing.T) { + ctx := context.Background() + result := GetListener(ctx) + assert.Nil(t, result) +} + +func TestGetProcessorSuccess(t *testing.T) { + lst := MakeListener(Config{}, &extension.ExtensionManager{}) + ctx := AddListener(context.Background(), &lst) + result := GetListener(ctx) + assert.NotNil(t, result) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/kms_decrypter.go b/contrib/aws/datadog-lambda-go/internal/metrics/kms_decrypter.go new file mode 100644 index 0000000000..50572cdc6d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/kms_decrypter.go @@ -0,0 +1,101 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "context" + "encoding/base64" + "fmt" + "os" + + "github.com/aws/aws-sdk-go-v2/aws" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/kms" +) + +type ( + // Decrypter attempts to decrypt a key + Decrypter interface { + Decrypt(cipherText string) (string, error) + } + + kmsDecrypter struct { + kmsClient *kms.Client + } + + clientDecrypter interface { + Decrypt(context.Context, *kms.DecryptInput, ...func(*kms.Options)) (*kms.DecryptOutput, error) + } +) + +// functionNameEnvVar is the environment variable that stores the Lambda function name +const functionNameEnvVar string = "AWS_LAMBDA_FUNCTION_NAME" + +// encryptionContextKey is the key added to the encryption context by the Lambda console UI +const encryptionContextKey string = "LambdaFunctionName" + +// MakeKMSDecrypter creates a new decrypter which uses the AWS KMS service to decrypt variables +func MakeKMSDecrypter(fipsMode bool) Decrypter { + fipsEndpoint := aws.FIPSEndpointStateUnset + if fipsMode { + fipsEndpoint = aws.FIPSEndpointStateEnabled + logger.Debug("Using FIPS endpoint for KMS decryption.") + } + + cfg, err := config.LoadDefaultConfig(context.Background(), config.WithUseFIPSEndpoint(fipsEndpoint)) + if err != nil { + logger.Error(fmt.Errorf("could not create a new aws config: %v", err)) + panic(err) + } + return &kmsDecrypter{ + kmsClient: kms.NewFromConfig(cfg), + } +} + +func (kd *kmsDecrypter) Decrypt(ciphertext string) (string, error) { + return decryptKMS(kd.kmsClient, ciphertext) +} + +// decryptKMS decodes and deciphers the base64-encoded ciphertext given as a parameter using KMS. +// For this to work properly, the Lambda function must have the appropriate IAM permissions. +func decryptKMS(kmsClient clientDecrypter, ciphertext string) (string, error) { + decodedBytes, err := base64.StdEncoding.DecodeString(ciphertext) + if err != nil { + return "", fmt.Errorf("failed to encode cipher text to base64: %v", err) + } + + // When the API key is encrypted using the AWS console, the function name is added as an + // encryption context. When the API key is encrypted using the AWS CLI, no encryption context + // is added. We need to try decrypting the API key both with and without the encryption context. + + // Try without encryption context, in case API key was encrypted using the AWS CLI + functionName := os.Getenv(functionNameEnvVar) + params := &kms.DecryptInput{ + CiphertextBlob: decodedBytes, + } + ctx := context.Background() + response, err := kmsClient.Decrypt(ctx, params) + + if err != nil { + logger.Debug("Failed to decrypt ciphertext without encryption context, retrying with encryption context") + // Try with encryption context, in case API key was encrypted using the AWS Console + params = &kms.DecryptInput{ + CiphertextBlob: decodedBytes, + EncryptionContext: map[string]string{ + encryptionContextKey: functionName, + }, + } + response, err = kmsClient.Decrypt(ctx, params) + if err != nil { + return "", fmt.Errorf("failed to decrypt ciphertext with kms: %v", err) + } + } + + plaintext := string(response.Plaintext) + return plaintext, nil +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/kms_decrypter_test.go b/contrib/aws/datadog-lambda-go/internal/metrics/kms_decrypter_test.go new file mode 100644 index 0000000000..5621fbbce4 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/kms_decrypter_test.go @@ -0,0 +1,76 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package metrics + +import ( + "bytes" + "context" + "errors" + "os" + "testing" + + "github.com/aws/aws-sdk-go-v2/service/kms" + "github.com/stretchr/testify/assert" +) + +// mockEncryptedAPIKeyBase64 represents an API key encrypted with KMS and encoded as a base64 string +const mockEncryptedAPIKeyBase64 = "MjIyMjIyMjIyMjIyMjIyMg==" + +// mockDecodedEncryptedAPIKey represents the encrypted API key after it has been decoded from base64 +const mockDecodedEncryptedAPIKey = "2222222222222222" + +// expectedDecryptedAPIKey represents the true value of the API key after decryption by KMS +const expectedDecryptedAPIKey = "1111111111111111" + +// mockFunctionName represents the name of the current function +var mockFunctionName = "my-Function" + +type mockKMSClientWithEncryptionContext struct{} + +func (mockKMSClientWithEncryptionContext) Decrypt(_ context.Context, params *kms.DecryptInput, _ ...func(*kms.Options)) (*kms.DecryptOutput, error) { + encryptionContextPointer, exists := params.EncryptionContext[encryptionContextKey] + if !exists { + return nil, errors.New("InvalidCiphertextException") + } + if encryptionContextPointer != mockFunctionName { + return nil, errors.New("InvalidCiphertextException") + } + if bytes.Equal(params.CiphertextBlob, []byte(mockDecodedEncryptedAPIKey)) { + return &kms.DecryptOutput{ + Plaintext: []byte(expectedDecryptedAPIKey), + }, nil + } + return nil, errors.New("KMS error") +} + +type mockKMSClientNoEncryptionContext struct{} + +func (mockKMSClientNoEncryptionContext) Decrypt(_ context.Context, params *kms.DecryptInput, _ ...func(*kms.Options)) (*kms.DecryptOutput, error) { + if params.EncryptionContext[encryptionContextKey] != "" { + return nil, errors.New("InvalidCiphertextException") + } + if bytes.Equal(params.CiphertextBlob, []byte(mockDecodedEncryptedAPIKey)) { + return &kms.DecryptOutput{ + Plaintext: []byte(expectedDecryptedAPIKey), + }, nil + } + return nil, errors.New("KMS error") +} + +func TestDecryptKMSWithEncryptionContext(t *testing.T) { + os.Setenv(functionNameEnvVar, mockFunctionName) + defer os.Setenv(functionNameEnvVar, "") + + client := mockKMSClientWithEncryptionContext{} + result, _ := decryptKMS(client, mockEncryptedAPIKeyBase64) + assert.Equal(t, expectedDecryptedAPIKey, result) +} + +func TestDecryptKMSNoEncryptionContext(t *testing.T) { + client := mockKMSClientNoEncryptionContext{} + result, _ := decryptKMS(client, mockEncryptedAPIKeyBase64) + assert.Equal(t, expectedDecryptedAPIKey, result) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/listener.go b/contrib/aws/datadog-lambda-go/internal/metrics/listener.go new file mode 100644 index 0000000000..eaaefe3bd1 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/listener.go @@ -0,0 +1,295 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "context" + "encoding/json" + "fmt" + "runtime" + "strconv" + "strings" + "time" + + "github.com/aws/aws-lambda-go/lambdacontext" + + "github.com/DataDog/datadog-go/v5/statsd" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +type ( + // Listener implements wrapper.HandlerListener, injecting metrics into the context + Listener struct { + apiClient *APIClient + statsdClient *statsd.Client + config *Config + processor Processor + isAgentRunning bool + extensionManager *extension.ExtensionManager + } + + // Config gives options for how the listener should work + Config struct { + APIKey string + KMSAPIKey string + Site string + ShouldRetryOnFailure bool + ShouldUseLogForwarder bool + BatchInterval time.Duration + EnhancedMetrics bool + HTTPClientTimeout time.Duration + CircuitBreakerInterval time.Duration + CircuitBreakerTimeout time.Duration + CircuitBreakerTotalFailures uint32 + LocalTest bool + FIPSMode bool + } + + logMetric struct { + MetricName string `json:"m"` + Value float64 `json:"v"` + Timestamp int64 `json:"e"` + Tags []string `json:"t"` + } +) + +var ( + // runtimeTag is the metrics tag representing the go runtime version. Use + // this rather than calling getRuntimeTag directly. + runtimeTag = getRuntimeTag(runtime.Version()) +) + +// MakeListener initializes a new metrics lambda listener +func MakeListener(config Config, extensionManager *extension.ExtensionManager) Listener { + + var apiClient *APIClient + if !config.FIPSMode { + apiClient = MakeAPIClient(context.Background(), APIClientOptions{ + baseAPIURL: config.Site, + apiKey: config.APIKey, + decrypter: MakeKMSDecrypter(config.FIPSMode), + kmsAPIKey: config.KMSAPIKey, + httpClientTimeout: config.HTTPClientTimeout, + }) + } + + if config.HTTPClientTimeout <= 0 { + config.HTTPClientTimeout = defaultHttpClientTimeout + } + if config.CircuitBreakerInterval <= 0 { + config.CircuitBreakerInterval = defaultCircuitBreakerInterval + } + if config.CircuitBreakerTimeout <= 0 { + config.CircuitBreakerTimeout = defaultCircuitBreakerTimeout + } + if config.CircuitBreakerTotalFailures <= 0 { + config.CircuitBreakerTotalFailures = defaultCircuitBreakerTotalFailures + } + if config.BatchInterval <= 0 { + config.BatchInterval = defaultBatchInterval + } + + var statsdClient *statsd.Client + // immediate call to the Agent, if not a 200, fallback to API + // TODO(remy): we may want to use an environment var to force the use of the + // Agent instead of using this "discovery" implementation. + if extensionManager.IsExtensionRunning() { + var err error + if statsdClient, err = statsd.New("127.0.0.1:8125"); err != nil { + statsdClient = nil // force nil if an error occurred during statsd client init + } + } + + return Listener{ + apiClient: apiClient, + config: &config, + isAgentRunning: statsdClient != nil, + statsdClient: statsdClient, + processor: nil, + extensionManager: extensionManager, + } +} + +// canSendMetrics reports whether l can send metrics. +func (l *Listener) canSendMetrics() bool { + return l.isAgentRunning || l.config.ShouldUseLogForwarder || !l.config.FIPSMode || (l.apiClient != nil && (l.apiClient.apiKey != "" || l.config.KMSAPIKey != "")) +} + +// HandlerStarted adds metrics service to the context +func (l *Listener) HandlerStarted(ctx context.Context, msg json.RawMessage) context.Context { + if !l.canSendMetrics() { + logger.Error(fmt.Errorf("datadog api key isn't set, won't be able to send metrics")) + } + + ctx = AddListener(ctx, l) + + if !l.config.FIPSMode { + ts := MakeTimeService() + pr := MakeProcessor(ctx, l.apiClient, ts, l.config.BatchInterval, l.config.ShouldRetryOnFailure, l.config.CircuitBreakerInterval, l.config.CircuitBreakerTimeout, l.config.CircuitBreakerTotalFailures) + l.processor = pr + + // Setting the context on the client will mean that future requests will be cancelled correctly + // if the lambda times out. + l.apiClient.context = ctx + + pr.StartProcessing() + } + + l.submitEnhancedMetrics("invocations", ctx) + + return ctx +} + +// HandlerFinished implemented as part of the wrapper.HandlerListener interface +func (l *Listener) HandlerFinished(ctx context.Context, err error) { + if l.isAgentRunning { + // use the agent + // flush the metrics from the DogStatsD client to the Agent + if l.statsdClient != nil { + if err := l.statsdClient.Flush(); err != nil { + logger.Error(fmt.Errorf("can't flush the DogStatsD client: %s", err)) + } + } + // send a message to the Agent to flush the metrics + if l.config.LocalTest { + if err := l.extensionManager.Flush(); err != nil { + logger.Error(fmt.Errorf("error while flushing the metrics: %s", err)) + } + } + } else { + // use the api + if l.processor != nil { + if err != nil { + l.submitEnhancedMetrics("errors", ctx) + } + l.processor.FinishProcessing() + } + } +} + +// AddDistributionMetric sends a distribution metric +func (l *Listener) AddDistributionMetric(metric string, value float64, timestamp time.Time, forceLogForwarder bool, tags ...string) { + + // We add our own runtime tag to the metric for version tracking + tags = append(tags, runtimeTag) + + if l.isAgentRunning { + err := l.statsdClient.Distribution(metric, value, tags, 1) + if err != nil { + logger.Error(fmt.Errorf("could not send metric %s: %s", metric, err.Error())) + } + return + } + + if l.config.ShouldUseLogForwarder || forceLogForwarder { + logger.Debug("sending metric via log forwarder") + unixTime := timestamp.Unix() + lm := logMetric{ + MetricName: metric, + Value: value, + Timestamp: unixTime, + Tags: tags, + } + result, err := json.Marshal(lm) + if err != nil { + logger.Error(fmt.Errorf("failed to marshall metric for log forwarder with error %v", err)) + return + } + payload := string(result) + logger.Raw(payload) + return + } + + if l.config.FIPSMode { + logger.Debug(fmt.Sprintf("skipping metric %s due to FIPS mode - direct API calls are disabled", metric)) + return + } + + m := Distribution{ + Name: metric, + Tags: tags, + Values: []MetricValue{}, + } + m.AddPoint(timestamp, value) + logger.Debug(fmt.Sprintf("adding metric \"%s\", with value %f", metric, value)) + l.processor.AddMetric(&m) +} + +// getRuntimeTag returns the runtime tag to be used when creating distribution +// metrics. It should not be called directly, instead use the global +// runtimeTag var. +func getRuntimeTag(v string) string { + v = strings.ReplaceAll(v, " ", "-") + v = strings.ReplaceAll(v, ",", "-") + return fmt.Sprintf("dd_lambda_layer:datadog-%s", v) +} + +func (l *Listener) submitEnhancedMetrics(metricName string, ctx context.Context) { + if l.config.EnhancedMetrics { + tags := getEnhancedMetricsTags(ctx) + l.AddDistributionMetric(fmt.Sprintf("aws.lambda.enhanced.%s", metricName), 1, time.Now(), true, tags...) + } +} + +func getEnhancedMetricsTags(ctx context.Context) []string { + isColdStart := ctx.Value("cold_start") + + if lc, ok := lambdacontext.FromContext(ctx); ok { + // ex: arn:aws:lambda:us-east-1:123497558138:function:golang-layer:alias + splitArn := strings.Split(lc.InvokedFunctionArn, ":") + + // malformed arn string + if len(splitArn) < 5 { + logger.Debug("malformed arn string in the LambdaContext") + return []string{} + } + + var alias string + var executedVersion string + + functionName := fmt.Sprintf("functionname:%s", lambdacontext.FunctionName) + region := fmt.Sprintf("region:%s", splitArn[3]) + accountId := fmt.Sprintf("account_id:%s", splitArn[4]) + memorySize := fmt.Sprintf("memorysize:%d", lambdacontext.MemoryLimitInMB) + coldStart := fmt.Sprintf("cold_start:%t", isColdStart.(bool)) + resource := fmt.Sprintf("resource:%s", lambdacontext.FunctionName) + datadogLambda := fmt.Sprintf("datadog_lambda:%s", instrumentation.Version()) + + tags := []string{functionName, region, accountId, memorySize, coldStart, datadogLambda} + + // Check if our slice contains an alias or version + if len(splitArn) > 7 { + alias = splitArn[7] + + // If we have an alias... + switch alias != "" { + // If the alias is $Latest, drop the $ for ddog tag conventio + case strings.HasPrefix(alias, "$"): + alias = strings.TrimPrefix(alias, "$") + // If this is not a version number, we will have an alias and executed version + case isNotNumeric(alias): + executedVersion = fmt.Sprintf("executedversion:%s", lambdacontext.FunctionVersion) + tags = append(tags, executedVersion) + } + + resource = fmt.Sprintf("resource:%s:%s", lambdacontext.FunctionName, alias) + } + + tags = append(tags, resource) + + return tags + } + + logger.Debug("could not retrieve the LambdaContext from Context") + return []string{} +} + +func isNotNumeric(s string) bool { + _, err := strconv.ParseInt(s, 0, 64) + return err != nil +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/listener_test.go b/contrib/aws/datadog-lambda-go/internal/metrics/listener_test.go new file mode 100644 index 0000000000..924e89f4f3 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/listener_test.go @@ -0,0 +1,310 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "net" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/aws/aws-lambda-go/lambdacontext" + + "github.com/stretchr/testify/assert" +) + +func captureOutput(f func()) string { + var buf bytes.Buffer + logger.SetOutput(&buf) + f() + logger.SetOutput(os.Stderr) + return buf.String() +} + +func TestHandlerAddsItselfToContext(t *testing.T) { + listener := MakeListener(Config{}, &extension.ExtensionManager{}) + ctx := listener.HandlerStarted(context.Background(), json.RawMessage{}) + pr := GetListener(ctx) + assert.NotNil(t, pr) +} + +func TestHandlerFinishesProcessing(t *testing.T) { + listener := MakeListener(Config{}, &extension.ExtensionManager{}) + ctx := listener.HandlerStarted(context.Background(), json.RawMessage{}) + + listener.HandlerFinished(ctx, nil) + assert.False(t, listener.processor.IsProcessing()) +} + +func TestAddDistributionMetricWithAPI(t *testing.T) { + + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + assert.Equal(t, "/distribution_points?api_key=12345", r.URL.String()) + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + listener := MakeListener(Config{APIKey: "12345", Site: server.URL}, &extension.ExtensionManager{}) + ctx := listener.HandlerStarted(context.Background(), json.RawMessage{}) + listener.AddDistributionMetric("the-metric", 2, time.Now(), false, "tag:a", "tag:b") + listener.HandlerFinished(ctx, nil) + assert.True(t, called) +} + +func TestAddDistributionMetricWithLogForwarder(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + listener := MakeListener(Config{APIKey: "12345", Site: server.URL, ShouldUseLogForwarder: true}, &extension.ExtensionManager{}) + ctx := listener.HandlerStarted(context.Background(), json.RawMessage{}) + listener.AddDistributionMetric("the-metric", 2, time.Now(), false, "tag:a", "tag:b") + listener.HandlerFinished(ctx, nil) + assert.False(t, called) +} +func TestAddDistributionMetricWithForceLogForwarder(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + listener := MakeListener(Config{APIKey: "12345", Site: server.URL, ShouldUseLogForwarder: false}, &extension.ExtensionManager{}) + ctx := listener.HandlerStarted(context.Background(), json.RawMessage{}) + listener.AddDistributionMetric("the-metric", 2, time.Now(), true, "tag:a", "tag:b") + listener.HandlerFinished(ctx, nil) + assert.False(t, called) +} + +func TestAddDistributionMetricWithFIPSMode(t *testing.T) { + // Setup a test server to detect if any API calls are made + apiCallAttempted := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + apiCallAttempted = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + // Create a listener with FIPS mode enabled + listener := MakeListener(Config{ + APIKey: "12345", + Site: server.URL, + FIPSMode: true, + }, &extension.ExtensionManager{}) + + // Verify the API client wasn't created + assert.Nil(t, listener.apiClient, "API client should be nil when FIPS mode is enabled") + + // Initialize the listener + ctx := listener.HandlerStarted(context.Background(), json.RawMessage{}) + + // Verify processor wasn't initialized + assert.Nil(t, listener.processor, "Processor should be nil when FIPS mode is enabled") + + // Log calls to validate we're getting the expected log message + var logOutput string + logger.SetLogLevel(logger.LevelDebug) + logOutput = captureOutput(func() { + listener.AddDistributionMetric("fips-test-metric", 42, time.Now(), false, "tag:fips") + }) + + // Check that we logged the skipping message + assert.Contains(t, logOutput, "skipping metric fips-test-metric due to FIPS mode", "Expected log about skipping metric") + assert.Contains(t, logOutput, "direct API calls are disabled", "Expected log about disabled API calls") + + // Finish the handler + listener.HandlerFinished(ctx, nil) + + // Check that no API call was attempted + assert.False(t, apiCallAttempted, "No API call should be attempted when FIPS mode is enabled") +} + +func TestGetEnhancedMetricsTags(t *testing.T) { + //nolint + ctx := context.WithValue(context.Background(), "cold_start", false) + + lambdacontext.MemoryLimitInMB = 256 + lambdacontext.FunctionName = "go-lambda-test" + lc := &lambdacontext.LambdaContext{ + InvokedFunctionArn: "arn:aws:lambda:us-east-1:123497558138:function:go-lambda-test:$Latest", + } + tags := getEnhancedMetricsTags(lambdacontext.NewContext(ctx, lc)) + + assert.ElementsMatch(t, tags, []string{"functionname:go-lambda-test", "region:us-east-1", "memorysize:256", "cold_start:false", "account_id:123497558138", "resource:go-lambda-test:Latest", "datadog_lambda:" + instrumentation.Version()}) +} + +func TestGetEnhancedMetricsTagsWithAlias(t *testing.T) { + //nolint + ctx := context.WithValue(context.Background(), "cold_start", false) + + lambdacontext.MemoryLimitInMB = 256 + lambdacontext.FunctionName = "go-lambda-test" + lambdacontext.FunctionVersion = "1" + lc := &lambdacontext.LambdaContext{ + InvokedFunctionArn: "arn:aws:lambda:us-east-1:123497558138:function:go-lambda-test:my-alias", + } + + tags := getEnhancedMetricsTags((lambdacontext.NewContext(ctx, lc))) + assert.ElementsMatch(t, tags, []string{"functionname:go-lambda-test", "region:us-east-1", "memorysize:256", "cold_start:false", "account_id:123497558138", "resource:go-lambda-test:my-alias", "executedversion:1", "datadog_lambda:" + instrumentation.Version()}) +} + +func TestGetEnhancedMetricsTagsNoLambdaContext(t *testing.T) { + //nolint + ctx := context.WithValue(context.Background(), "cold_start", true) + tags := getEnhancedMetricsTags(ctx) + + assert.Empty(t, tags) +} + +func TestSubmitEnhancedMetrics(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + ml := MakeListener( + Config{ + APIKey: "abc-123", + Site: server.URL, + EnhancedMetrics: true, + }, + &extension.ExtensionManager{}, + ) + //nolint + ctx := context.WithValue(context.Background(), "cold_start", false) + + output := captureOutput(func() { + ctx = ml.HandlerStarted(ctx, json.RawMessage{}) + ml.HandlerFinished(ctx, nil) + }) + + assert.False(t, called) + expected := "{\"m\":\"aws.lambda.enhanced.invocations\",\"v\":1," + assert.True(t, strings.Contains(output, expected)) + assert.True(t, strings.Contains(output, "dd_lambda_layer:datadog-go1.")) +} + +func TestDoNotSubmitEnhancedMetrics(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + ml := MakeListener( + Config{ + APIKey: "abc-123", + Site: server.URL, + EnhancedMetrics: false, + }, + &extension.ExtensionManager{}, + ) + //nolint + ctx := context.WithValue(context.Background(), "cold_start", true) + + output := captureOutput(func() { + ctx = ml.HandlerStarted(ctx, json.RawMessage{}) + ml.HandlerFinished(ctx, nil) + }) + + assert.False(t, called) + expected := "{\"m\":\"aws.lambda.enhanced.invocations\",\"v\":1," + assert.False(t, strings.Contains(output, expected)) +} + +func TestSubmitEnhancedMetricsOnlyErrors(t *testing.T) { + called := false + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + w.WriteHeader(http.StatusCreated) + })) + defer server.Close() + + ml := MakeListener( + Config{ + APIKey: "abc-123", + Site: server.URL, + EnhancedMetrics: false, + }, + &extension.ExtensionManager{}, + ) + //nolint + ctx := context.WithValue(context.Background(), "cold_start", true) + + output := captureOutput(func() { + ctx = ml.HandlerStarted(ctx, json.RawMessage{}) + ml.config.EnhancedMetrics = true + err := errors.New("something went wrong") + ml.HandlerFinished(ctx, err) + }) + + assert.False(t, called) + expected := "{\"m\":\"aws.lambda.enhanced.errors\",\"v\":1," + assert.True(t, strings.Contains(output, expected)) +} + +func TestListenerHandlerFinishedFlushes(t *testing.T) { + var called bool + + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + called = true + })) + ts.Listener.Close() + ts.Listener, _ = net.Listen("tcp", "127.0.0.1:8124") + + ts.Start() + defer ts.Close() + + listener := MakeListener(Config{}, extension.BuildExtensionManager(false)) + listener.isAgentRunning = true + for _, localTest := range []bool{true, false} { + t.Run(fmt.Sprintf("%#v", localTest), func(t *testing.T) { + called = false + listener.config.LocalTest = localTest + listener.HandlerFinished(context.TODO(), nil) + assert.Equal(t, called, localTest) + }) + } +} + +func TestGetRuntimeTag(t *testing.T) { + testcases := []struct { + runtimeVersion string + expect string + }{ + {"", "dd_lambda_layer:datadog-"}, + {"go1.25.1", "dd_lambda_layer:datadog-go1.25.1"}, + // runtime.Version() will include any values from the GOEXPERIMENT env var + {"go1.25.1 X:jsonv2", "dd_lambda_layer:datadog-go1.25.1-X:jsonv2"}, + {"go1.25.1 X:fieldtrace,jsonv2", "dd_lambda_layer:datadog-go1.25.1-X:fieldtrace-jsonv2"}, + } + + for _, tc := range testcases { + t.Run(tc.runtimeVersion, func(t *testing.T) { + actual := getRuntimeTag(tc.runtimeVersion) + assert.Equal(t, actual, tc.expect) + }) + } +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/model.go b/contrib/aws/datadog-lambda-go/internal/metrics/model.go new file mode 100644 index 0000000000..394aeded6f --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/model.go @@ -0,0 +1,93 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "time" +) + +type ( + // Metric represents a metric that can have any kind of + Metric interface { + AddPoint(timestamp time.Time, value float64) + ToAPIMetric(interval time.Duration) []APIMetric + ToBatchKey() BatchKey + Join(metric Metric) + } + + // APIMetric is a metric that can be marshalled to send to the metrics API + APIMetric struct { + Name string `json:"metric"` + Host *string `json:"host,omitempty"` + Tags []string `json:"tags,omitempty"` + MetricType MetricType `json:"type"` + Interval *float64 `json:"interval,omitempty"` + Points []interface{} `json:"points"` + } + + // MetricValue represents a datapoint for a metric + MetricValue struct { + Value float64 + Timestamp time.Time + } + + // Distribution is a type of metric that is aggregated over multiple hosts + Distribution struct { + Name string + Tags []string + Host *string + Values []MetricValue + } +) + +// AddPoint adds a point to the distribution metric +func (d *Distribution) AddPoint(timestamp time.Time, value float64) { + d.Values = append(d.Values, MetricValue{Timestamp: timestamp, Value: value}) +} + +// ToBatchKey returns a key that can be used to batch the metric +func (d *Distribution) ToBatchKey() BatchKey { + return BatchKey{ + name: d.Name, + host: d.Host, + tags: d.Tags, + metricType: DistributionType, + } +} + +// Join creates a union between two metric sets +func (d *Distribution) Join(metric Metric) { + otherDist, ok := metric.(*Distribution) + if !ok { + return + } + for _, val := range otherDist.Values { + d.AddPoint(val.Timestamp, val.Value) + } + +} + +// ToAPIMetric converts a distribution into an API ready format. +func (d *Distribution) ToAPIMetric(interval time.Duration) []APIMetric { + points := make([]interface{}, len(d.Values)) + + for i, val := range d.Values { + currentTime := float64(val.Timestamp.Unix()) + + points[i] = []interface{}{currentTime, []interface{}{val.Value}} + } + + return []APIMetric{ + { + Name: d.Name, + Host: d.Host, + Tags: d.Tags, + MetricType: DistributionType, + Points: points, + Interval: nil, + }, + } +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/processor.go b/contrib/aws/datadog-lambda-go/internal/metrics/processor.go new file mode 100644 index 0000000000..bc24536396 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/processor.go @@ -0,0 +1,186 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/cenkalti/backoff/v4" + "github.com/sony/gobreaker" +) + +type ( + // Processor is used to batch metrics on a background thread, and send them on to a client periodically. + Processor interface { + // AddMetric sends a metric to the agent + AddMetric(metric Metric) + // StartProcessing begins processing metrics asynchronously + StartProcessing() + // FinishProcessing shuts down the agent, and tries to flush any remaining metrics + FinishProcessing() + // Whether the processor is still processing + IsProcessing() bool + } + + processor struct { + context context.Context + metricsChan chan Metric + timeService TimeService + waitGroup sync.WaitGroup + batchInterval time.Duration + client Client + batcher *Batcher + shouldRetryOnFail bool + isProcessing bool + breaker *gobreaker.CircuitBreaker + } +) + +// MakeProcessor creates a new metrics context +func MakeProcessor(ctx context.Context, client Client, timeService TimeService, batchInterval time.Duration, shouldRetryOnFail bool, circuitBreakerInterval time.Duration, circuitBreakerTimeout time.Duration, circuitBreakerTotalFailures uint32) Processor { + batcher := MakeBatcher(batchInterval) + + breaker := MakeCircuitBreaker(circuitBreakerInterval, circuitBreakerTimeout, circuitBreakerTotalFailures) + + return &processor{ + context: ctx, + metricsChan: make(chan Metric, 2000), + batchInterval: batchInterval, + waitGroup: sync.WaitGroup{}, + client: client, + batcher: batcher, + shouldRetryOnFail: shouldRetryOnFail, + timeService: timeService, + isProcessing: false, + breaker: breaker, + } +} + +func MakeCircuitBreaker(circuitBreakerInterval time.Duration, circuitBreakerTimeout time.Duration, circuitBreakerTotalFailures uint32) *gobreaker.CircuitBreaker { + readyToTrip := func(counts gobreaker.Counts) bool { + return counts.TotalFailures > circuitBreakerTotalFailures + } + + st := gobreaker.Settings{ + Name: "post distribution_points", + Interval: circuitBreakerInterval, + Timeout: circuitBreakerTimeout, + ReadyToTrip: readyToTrip, + } + return gobreaker.NewCircuitBreaker(st) +} + +func (p *processor) AddMetric(metric Metric) { + // We use a large buffer in the metrics channel, to make this operation non-blocking. + // However, if the channel does fill up, this will become a blocking operation. + p.metricsChan <- metric +} + +func (p *processor) StartProcessing() { + if !p.isProcessing { + p.isProcessing = true + p.waitGroup.Add(1) + go p.processMetrics() + } + +} + +func (p *processor) FinishProcessing() { + if !p.isProcessing { + p.StartProcessing() + } + // Closes the metrics channel, and waits for the last send to complete + close(p.metricsChan) + p.waitGroup.Wait() +} + +func (p *processor) IsProcessing() bool { + return p.isProcessing +} + +func (p *processor) processMetrics() { + + ticker := p.timeService.NewTicker(p.batchInterval) + + doneChan := p.context.Done() + shouldExit := false + for !shouldExit { + shouldSendBatch := false + // Batches metrics until timeout is reached + select { + case <-doneChan: + // This process is being cancelled by the context,(probably due to a lambda deadline), exit without flushing. + shouldExit = true + case m, ok := <-p.metricsChan: + if !ok { + // The channel has now been closed + shouldSendBatch = true + shouldExit = true + } else { + p.batcher.AddMetric(m) + } + case <-ticker.C: + // We are ready to send a batch to our backend + shouldSendBatch = true + } + // Since the go select statement picks randomly if multiple values are available, it's possible the done channel was + // closed, but another channel was selected instead. We double check the done channel, to make sure this isn't he case. + select { + case <-doneChan: + shouldExit = true + shouldSendBatch = false + default: + // Non-blocking + } + + if shouldSendBatch { + _, err := p.breaker.Execute(func() (interface{}, error) { + if shouldExit && p.shouldRetryOnFail { + // If we are shutting down, and we just failed to send our last batch, do a retry + bo := backoff.WithMaxRetries(backoff.NewConstantBackOff(defaultRetryInterval), 2) + err := backoff.Retry(p.sendMetricsBatch, bo) + if err != nil { + return nil, fmt.Errorf("after retry: %v", err) + } + } else { + err := p.sendMetricsBatch() + if err != nil { + return nil, fmt.Errorf("with no retry: %v", err) + } + } + return nil, nil + }) + if err != nil { + logger.Error(fmt.Errorf("failed to flush metrics to datadog API: %v", err)) + } + } + } + ticker.Stop() + p.isProcessing = false + p.waitGroup.Done() +} + +func (p *processor) sendMetricsBatch() error { + mts := p.batcher.ToAPIMetrics() + if len(mts) > 0 { + oldBatcher := p.batcher + p.batcher = MakeBatcher(p.batchInterval) + + err := p.client.SendMetrics(mts) + if err != nil { + if p.shouldRetryOnFail { + // If we want to retry on error, keep the metrics in the batcher until they are sent correctly. + p.batcher = oldBatcher + } + return err + } + } + return nil +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/processor_test.go b/contrib/aws/datadog-lambda-go/internal/metrics/processor_test.go new file mode 100644 index 0000000000..1a19c280a3 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/processor_test.go @@ -0,0 +1,256 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import ( + "context" + "errors" + "math" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +type ( + mockClient struct { + batches chan []APIMetric + sendMetricsCalledCount int + err error + } + + mockTimeService struct { + now time.Time + tickerChan chan time.Time + } +) + +func makeMockClient() mockClient { + return mockClient{ + batches: make(chan []APIMetric, 10), + err: nil, + } +} + +func makeMockTimeService() mockTimeService { + return mockTimeService{ + now: time.Now(), + tickerChan: make(chan time.Time), + } +} + +func (mc *mockClient) SendMetrics(mts []APIMetric) error { + mc.sendMetricsCalledCount++ + mc.batches <- mts + return mc.err +} + +func (ts *mockTimeService) NewTicker(duration time.Duration) *time.Ticker { + return &time.Ticker{ + C: ts.tickerChan, + } +} + +func (ts *mockTimeService) Now() time.Time { + return ts.now +} + +func TestProcessorBatches(t *testing.T) { + mc := makeMockClient() + mts := makeMockTimeService() + + mts.now, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") + nowUnix := float64(mts.now.Unix()) + + processor := MakeProcessor(context.Background(), &mc, &mts, 1000, false, time.Hour*1000, time.Hour*1000, math.MaxUint32) + + d1 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: mts.now, Value: 1}, {Timestamp: mts.now, Value: 2}, {Timestamp: mts.now, Value: 3}}, + } + d2 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: mts.now, Value: 4}, {Timestamp: mts.now, Value: 5}, {Timestamp: mts.now, Value: 6}}, + } + + processor.AddMetric(&d1) + processor.AddMetric(&d2) + + processor.StartProcessing() + processor.FinishProcessing() + + firstBatch := <-mc.batches + + assert.Equal(t, []APIMetric{{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{nowUnix, []interface{}{float64(1)}}, + []interface{}{nowUnix, []interface{}{float64(2)}}, + []interface{}{nowUnix, []interface{}{float64(3)}}, + []interface{}{nowUnix, []interface{}{float64(4)}}, + []interface{}{nowUnix, []interface{}{float64(5)}}, + []interface{}{nowUnix, []interface{}{float64(6)}}, + }, + }}, firstBatch) +} + +func TestProcessorBatchesPerTick(t *testing.T) { + mc := makeMockClient() + mts := makeMockTimeService() + + firstTime, _ := time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") + firstTimeUnix := float64(firstTime.Unix()) + secondTime, _ := time.Parse(time.RFC3339, "2007-01-02T15:04:05Z") + secondTimeUnix := float64(secondTime.Unix()) + mts.now = firstTime + + processor := MakeProcessor(context.Background(), &mc, &mts, 1000, false, time.Hour*1000, time.Hour*1000, math.MaxUint32) + + d1 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: firstTime, Value: 1}, {Timestamp: firstTime, Value: 2}}, + } + d2 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: firstTime, Value: 3}}, + } + d3 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: secondTime, Value: 4}, {Timestamp: secondTime, Value: 5}}, + } + d4 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: secondTime, Value: 6}}, + } + + processor.StartProcessing() + + processor.AddMetric(&d1) + processor.AddMetric(&d2) + + // This wait is necessary to make sure both metrics have been added to the batch + <-time.Tick(time.Millisecond * 10) + // Sending time to the ticker channel will flush the batch. + mts.tickerChan <- firstTime + firstBatch := <-mc.batches + mts.now = secondTime + + processor.AddMetric(&d3) + processor.AddMetric(&d4) + + processor.FinishProcessing() + secondBatch := <-mc.batches + batches := [][]APIMetric{firstBatch, secondBatch} + + assert.Equal(t, [][]APIMetric{ + { + { + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{firstTimeUnix, []interface{}{float64(1)}}, + []interface{}{firstTimeUnix, []interface{}{float64(2)}}, + []interface{}{firstTimeUnix, []interface{}{float64(3)}}, + }, + }}, + { + { + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + MetricType: DistributionType, + Points: []interface{}{ + []interface{}{secondTimeUnix, []interface{}{float64(4)}}, + []interface{}{secondTimeUnix, []interface{}{float64(5)}}, + []interface{}{secondTimeUnix, []interface{}{float64(6)}}, + }, + }}, + }, batches) +} + +func TestProcessorPerformsRetry(t *testing.T) { + mc := makeMockClient() + mts := makeMockTimeService() + + mts.now, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") + + shouldRetry := true + processor := MakeProcessor(context.Background(), &mc, &mts, 1000, shouldRetry, time.Hour*1000, time.Hour*1000, math.MaxUint32) + + d1 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: mts.now, Value: 1}, {Timestamp: mts.now, Value: 2}, {Timestamp: mts.now, Value: 3}}, + } + + mc.err = errors.New("Some error") + + processor.AddMetric(&d1) + + processor.FinishProcessing() + + assert.Equal(t, 3, mc.sendMetricsCalledCount) +} + +func TestProcessorCancelsWithContext(t *testing.T) { + mc := makeMockClient() + mts := makeMockTimeService() + + mts.now, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") + + shouldRetry := true + ctx, cancelFunc := context.WithCancel(context.Background()) + processor := MakeProcessor(ctx, &mc, &mts, 1000, shouldRetry, time.Hour*1000, time.Hour*1000, math.MaxUint32) + + d1 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: mts.now, Value: 1}, {Timestamp: mts.now, Value: 2}, {Timestamp: mts.now, Value: 3}}, + } + + processor.AddMetric(&d1) + // After calling cancelFunc, no metrics should be processed/sent + cancelFunc() + //<-time.Tick(time.Millisecond * 100) + + processor.FinishProcessing() + + assert.Equal(t, 0, mc.sendMetricsCalledCount) +} + +func TestProcessorBatchesWithOpeningCircuitBreaker(t *testing.T) { + mc := makeMockClient() + mts := makeMockTimeService() + + mts.now, _ = time.Parse(time.RFC3339, "2006-01-02T15:04:05Z") + + // Will open the circuit breaker at number of total failures > 1 + circuitBreakerTotalFailures := uint32(1) + processor := MakeProcessor(context.Background(), &mc, &mts, 1000, false, time.Hour*1000, time.Hour*1000, circuitBreakerTotalFailures) + + d1 := Distribution{ + Name: "metric-1", + Tags: []string{"a", "b", "c"}, + Values: []MetricValue{{Timestamp: mts.now, Value: 1}, {Timestamp: mts.now, Value: 2}, {Timestamp: mts.now, Value: 3}}, + } + + mc.err = errors.New("Some error") + + processor.AddMetric(&d1) + + processor.FinishProcessing() + + // It should have retried 3 times, but circuit breaker opened at the second time + assert.Equal(t, 1, mc.sendMetricsCalledCount) +} diff --git a/contrib/aws/datadog-lambda-go/internal/metrics/time.go b/contrib/aws/datadog-lambda-go/internal/metrics/time.go new file mode 100644 index 0000000000..5a0bd362ab --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/metrics/time.go @@ -0,0 +1,32 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package metrics + +import "time" + +type ( + //TimeService wraps common time related operations + TimeService interface { + NewTicker(duration time.Duration) *time.Ticker + Now() time.Time + } + + timeService struct { + } +) + +// MakeTimeService creates a new time service +func MakeTimeService() TimeService { + return &timeService{} +} + +func (ts *timeService) NewTicker(duration time.Duration) *time.Ticker { + return time.NewTicker(duration) +} + +func (ts *timeService) Now() time.Time { + return time.Now() +} diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/apig-event-no-headers.json b/contrib/aws/datadog-lambda-go/internal/testdata/apig-event-no-headers.json new file mode 100644 index 0000000000..82c5caa632 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/apig-event-no-headers.json @@ -0,0 +1,57 @@ +{ + "body": "{{.body}}", + "resource": "{{.resource}}", + "requestContext": { + "resourceId": "123456", + "apiId": "1234567890", + "resourcePath": "{{.resource}}", + "httpMethod": "{{.method}}", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "accountId": "123456789012", + "identity": { + "apiKey": null, + "userArn": null, + "cognitoAuthenticationType": null, + "caller": null, + "userAgent": "Custom User Agent String", + "user": null, + "cognitoIdentityPoolId": null, + "cognitoIdentityId": null, + "cognitoAuthenticationProvider": null, + "sourceIp": "127.0.0.1", + "accountId": null + }, + "stage": "prod" + }, + "queryStringParameters": { + "foo": "bar" + }, + "headers": { + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "Accept-Language": "en-US,en;q=0.8", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Mobile-Viewer": "false", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "CloudFront-Viewer-Country": "US", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Upgrade-Insecure-Requests": "1", + "X-Forwarded-Port": "443", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "X-Forwarded-Proto": "https", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "CloudFront-Is-Tablet-Viewer": "false", + "Cache-Control": "max-age=0", + "User-Agent": "Custom User Agent String", + "CloudFront-Forwarded-Proto": "https", + "Accept-Encoding": "gzip, deflate, sdch" + }, + "pathParameters": { + "proxy": "{{.path}}" + }, + "httpMethod": "{{.method}}", + "stageVariables": { + "baz": "qux" + }, + "path": "{{.path}}" + } \ No newline at end of file diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/apig-event-with-headers.json b/contrib/aws/datadog-lambda-go/internal/testdata/apig-event-with-headers.json new file mode 100644 index 0000000000..754a81a966 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/apig-event-with-headers.json @@ -0,0 +1,60 @@ +{ + "body": "{{.body}}", + "resource": "{{.resource}}", + "requestContext": { + "resourceId": "123456", + "apiId": "1234567890", + "resourcePath": "{{.resource}}", + "httpMethod": "{{.method}}", + "requestId": "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", + "accountId": "123456789012", + "identity": { + "apiKey": null, + "userArn": null, + "cognitoAuthenticationType": null, + "caller": null, + "userAgent": "Custom User Agent String", + "user": null, + "cognitoIdentityPoolId": null, + "cognitoIdentityId": null, + "cognitoAuthenticationProvider": null, + "sourceIp": "127.0.0.1", + "accountId": null + }, + "stage": "prod" + }, + "queryStringParameters": { + "foo": "bar" + }, + "headers": { + "Via": "1.1 08f323deadbeefa7af34d5feb414ce27.cloudfront.net (CloudFront)", + "Accept-Language": "en-US,en;q=0.8", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Mobile-Viewer": "false", + "X-Forwarded-For": "127.0.0.1, 127.0.0.2", + "CloudFront-Viewer-Country": "US", + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Upgrade-Insecure-Requests": "1", + "X-Forwarded-Port": "443", + "Host": "1234567890.execute-api.us-east-1.amazonaws.com", + "X-Forwarded-Proto": "https", + "X-Amz-Cf-Id": "cDehVQoZnx43VYQb9j2-nvCh-9z396Uhbp027Y2JvkCPNLmGJHqlaA==", + "CloudFront-Is-Tablet-Viewer": "false", + "Cache-Control": "max-age=0", + "User-Agent": "Custom User Agent String", + "CloudFront-Forwarded-Proto": "https", + "Accept-Encoding": "gzip, deflate, sdch", + "x-datadog-trace-id": "1231452342", + "x-datadog-parent-id": "45678910", + "x-datadog-sampling-priority": "2" + }, + "pathParameters": { + "proxy": "{{.path}}" + }, + "httpMethod": "{{.method}}", + "stageVariables": { + "baz": "qux" + }, + "path": "{{.path}}" + } \ No newline at end of file diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/invalid.json b/contrib/aws/datadog-lambda-go/internal/testdata/invalid.json new file mode 100644 index 0000000000..049b861b58 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/invalid.json @@ -0,0 +1,3 @@ +{ + "tag-left-open": [ + " \ No newline at end of file diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-no-headers.json b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-no-headers.json new file mode 100644 index 0000000000..8a97772560 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-no-headers.json @@ -0,0 +1,6 @@ +{ + "my-custom-event": { + "hello": 100 + }, + "fake-id": "12345678910" +} \ No newline at end of file diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-headers.json b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-headers.json new file mode 100644 index 0000000000..c167cc37d5 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-headers.json @@ -0,0 +1,11 @@ +{ + "my-custom-event": { + "hello": 100 + }, + "fake-id": "12345678910", + "headers": { + "x-datadog-trace-id": "1231452342", + "x-datadog-parent-id": "45678910", + "x-datadog-sampling-priority": "2" + } +} \ No newline at end of file diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-missing-sampling-priority.json b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-missing-sampling-priority.json new file mode 100644 index 0000000000..005e0ed4d0 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-missing-sampling-priority.json @@ -0,0 +1,10 @@ +{ + "my-custom-event": { + "hello": 100 + }, + "fake-id": "12345678910", + "headers": { + "X-Datadog-Trace-Id": "1231452342", + "X-Datadog-Parent-Id": "45678910" + } +} diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-mixed-case-headers.json b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-mixed-case-headers.json new file mode 100644 index 0000000000..42da8a7d92 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-mixed-case-headers.json @@ -0,0 +1,11 @@ +{ + "my-custom-event": { + "hello": 100 + }, + "fake-id": "12345678910", + "headers": { + "X-Datadog-Trace-Id": "1231452342", + "X-Datadog-Parent-Id": "45678910", + "X-Datadog-Sampling-Priority": "2" + } +} diff --git a/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-multivalue-headers.json b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-multivalue-headers.json new file mode 100644 index 0000000000..51fb7b8204 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/testdata/non-proxy-with-multivalue-headers.json @@ -0,0 +1,15 @@ +{ + "my-custom-event": { + "hello": 100 + }, + "fake-id": "12345678910", + "headers": { + "x-datadog-trace-id": "1231452342", + "x-datadog-parent-id": "45678910", + "x-datadog-sampling-priority": "2" + }, + "multivalueheaders": { + "x-datadog-origin": ["origin1", "origin2"], + "x-datadog-trace-id": ["duplicate"] + } +} diff --git a/contrib/aws/datadog-lambda-go/internal/trace/constants.go b/contrib/aws/datadog-lambda-go/internal/trace/constants.go new file mode 100644 index 0000000000..d220b0b30f --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/trace/constants.go @@ -0,0 +1,26 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package trace + +const ( + traceIDHeader = "x-datadog-trace-id" + parentIDHeader = "x-datadog-parent-id" + samplingPriorityHeader = "x-datadog-sampling-priority" + originHeader = "x-datadog-origin" +) + +const ( + userReject = "-1" + // autoReject = "0" + // autoKeep = "1" + userKeep = "2" +) + +const ( + xraySubsegmentName = "datadog-metadata" + xraySubsegmentKey = "trace" + xraySubsegmentNamespace = "datadog" +) diff --git a/contrib/aws/datadog-lambda-go/internal/trace/context.go b/contrib/aws/datadog-lambda-go/internal/trace/context.go new file mode 100644 index 0000000000..a95520f978 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/trace/context.go @@ -0,0 +1,312 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package trace + +import ( + "context" + "encoding/binary" + "encoding/hex" + "encoding/json" + "fmt" + "strconv" + "strings" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-xray-sdk-go/v2/header" + "github.com/aws/aws-xray-sdk-go/v2/xray" +) + +type ( + eventWithHeaders struct { + Headers map[string]string `json:"headers"` + MultiValueHeaders map[string][]string `json:"multiValueHeaders"` + } + + // TraceContext is map of headers containing a Datadog trace context. + TraceContext map[string]string + + // ContextExtractor is a func type for extracting a root TraceContext. + ContextExtractor func(ctx context.Context, ev json.RawMessage) map[string]string +) + +type contextKeytype int + +// traceContextKey is the key used to store a TraceContext in a TraceContext object +var traceContextKey = new(contextKeytype) + +// DefaultTraceExtractor is the default trace extractor. Extracts root trace from API Gateway headers. +var DefaultTraceExtractor = getHeadersFromEventHeaders + +// contextWithRootTraceContext uses the incoming event and context object payloads to determine +// the root TraceContext and then adds that TraceContext to the context object. +func contextWithRootTraceContext(ctx context.Context, ev json.RawMessage, mergeXrayTraces bool, extractor ContextExtractor) (context.Context, error) { + datadogTraceContext, gotDatadogTraceContext := getTraceContext(ctx, extractor(ctx, ev)) + + xrayTraceContext, errGettingXrayContext := convertXrayTraceContextFromLambdaContext(ctx) + if errGettingXrayContext != nil { + logger.Error(fmt.Errorf("Couldn't convert X-Ray trace context: %v", errGettingXrayContext)) + } + + if gotDatadogTraceContext && errGettingXrayContext == nil { + err := createDummySubsegmentForXrayConverter(ctx, datadogTraceContext) + if err != nil { + logger.Error(fmt.Errorf("Couldn't create segment: %v", err)) + } + } + + if !mergeXrayTraces { + logger.Debug("Merge X-Ray Traces is off, using trace context from Datadog only") + return context.WithValue(ctx, traceContextKey, datadogTraceContext), nil + } + + if !gotDatadogTraceContext { + logger.Debug("Merge X-Ray Traces is on, but did not get incoming Datadog trace context; using X-Ray trace context instead") + return context.WithValue(ctx, traceContextKey, xrayTraceContext), nil + } + + logger.Debug("Using merged Datadog/X-Ray trace context") + mergedTraceContext := TraceContext{} + mergedTraceContext[traceIDHeader] = datadogTraceContext[traceIDHeader] + mergedTraceContext[samplingPriorityHeader] = datadogTraceContext[samplingPriorityHeader] + mergedTraceContext[parentIDHeader] = xrayTraceContext[parentIDHeader] + return context.WithValue(ctx, traceContextKey, mergedTraceContext), nil +} + +// ConvertCurrentXrayTraceContext returns the current X-Ray trace context converted to Datadog headers, taking into account +// the current subsegment. It is designed for sending Datadog trace headers from functions instrumented with the X-Ray SDK. +func ConvertCurrentXrayTraceContext(ctx context.Context) TraceContext { + if xrayTraceContext, err := convertXrayTraceContextFromLambdaContext(ctx); err == nil { + // If there is an active X-Ray segment, use it as the parent + parentID := xrayTraceContext[parentIDHeader] + segment := xray.GetSegment(ctx) + if segment != nil { + newParentID, err := convertXRayEntityIDToDatadogParentID(segment.ID) + if err == nil { + parentID = newParentID + } + } + + newTraceContext := map[string]string{} + newTraceContext[traceIDHeader] = xrayTraceContext[traceIDHeader] + newTraceContext[samplingPriorityHeader] = xrayTraceContext[samplingPriorityHeader] + newTraceContext[parentIDHeader] = parentID + + return newTraceContext + } + return map[string]string{} +} + +// createDummySubsegmentForXrayConverter creates a dummy X-Ray subsegment containing Datadog trace context metadata. +// This metadata is used by the Datadog X-Ray converter to parent the X-Ray trace under the Datadog trace. +// This subsegment will be dropped by the X-Ray converter and will not appear in Datadog. +func createDummySubsegmentForXrayConverter(ctx context.Context, traceCtx TraceContext) error { + _, segment := xray.BeginSubsegment(ctx, xraySubsegmentName) + + traceID := traceCtx[traceIDHeader] + parentID := traceCtx[parentIDHeader] + sampled := traceCtx[samplingPriorityHeader] + metadata := map[string]string{ + "trace-id": traceID, + "parent-id": parentID, + "sampling-priority": sampled, + } + + err := segment.AddMetadataToNamespace(xraySubsegmentNamespace, xraySubsegmentKey, metadata) + if err != nil { + return fmt.Errorf("couldn't save trace context to XRay: %v", err) + } + segment.Close(nil) + return nil +} + +func getTraceContext(ctx context.Context, headers map[string]string) (TraceContext, bool) { + tc := TraceContext{} + + traceID := headers[traceIDHeader] + if traceID == "" { + if val, ok := ctx.Value(extension.DdTraceId).(string); ok { + traceID = val + } + } + if traceID == "" { + return tc, false + } + + parentID := headers[parentIDHeader] + if parentID == "" { + if val, ok := ctx.Value(extension.DdParentId).(string); ok { + parentID = val + } + } + if parentID == "" { + return tc, false + } + + samplingPriority := headers[samplingPriorityHeader] + if samplingPriority == "" { + if val, ok := ctx.Value(extension.DdSamplingPriority).(string); ok { + samplingPriority = val + } + } + if samplingPriority == "" { + samplingPriority = "1" //sampler-keep + } + + // try to pull datadog origin from either headers or context + if origin, ok := headers[originHeader]; ok { + tc[originHeader] = origin + } else if origin, ok := ctx.Value(extension.DdOrigin).(string); ok { + tc[originHeader] = origin + } + + tc[samplingPriorityHeader] = samplingPriority + tc[traceIDHeader] = traceID + tc[parentIDHeader] = parentID + + return tc, true +} + +// getHeadersFromEventHeaders extracts the Datadog trace context from an incoming +// Lambda event payload's headers and multivalueHeaders, with headers taking precedence +// then creates a dummy X-Ray subsegment containing this information. +// This is used as the DefaultTraceExtractor. +func getHeadersFromEventHeaders(ctx context.Context, ev json.RawMessage) map[string]string { + eh := eventWithHeaders{} + + headers := map[string]string{} + + err := json.Unmarshal(ev, &eh) + if err != nil { + return headers + } + + lowercaseHeaders := map[string]string{} + + // extract values from event headers into lowercaseheaders + for k, v := range eh.Headers { + lowercaseHeaders[strings.ToLower(k)] = v + } + + // now extract from multivalue headers + for k, v := range eh.MultiValueHeaders { + if len(v) > 0 { + // If this key was not already extracted from event headers, extract first value from multivalue headers + if _, ok := lowercaseHeaders[strings.ToLower(k)]; !ok { + lowercaseHeaders[strings.ToLower(k)] = v[0] + } + } + } + + return lowercaseHeaders +} + +func convertXrayTraceContextFromLambdaContext(ctx context.Context) (TraceContext, error) { + traceCtx := map[string]string{} + + header := getXrayTraceHeaderFromContext(ctx) + if header == nil { + return traceCtx, fmt.Errorf("Couldn't read X-Ray trace context from Lambda context object") + } + + traceID, err := convertXRayTraceIDToDatadogTraceID(header.TraceID) + if err != nil { + return traceCtx, fmt.Errorf("Couldn't read trace id from X-Ray: %v", err) + } + parentID, err := convertXRayEntityIDToDatadogParentID(header.ParentID) + if err != nil { + return traceCtx, fmt.Errorf("Couldn't read parent id from X-Ray: %v", err) + } + samplingPriority := convertXRaySamplingDecision(header.SamplingDecision) + + traceCtx[traceIDHeader] = traceID + traceCtx[parentIDHeader] = parentID + traceCtx[samplingPriorityHeader] = samplingPriority + return traceCtx, nil +} + +// getXrayTraceHeaderFromContext is used to extract xray segment metadata from the lambda context object. +// By default, the context object won't have any Segment, (xray.GetSegment(ctx) will return nil). However it +// will have the "LambdaTraceHeader" object, which contains the traceID/parentID/sampling info. +func getXrayTraceHeaderFromContext(ctx context.Context) *header.Header { + var traceHeader string + + if traceHeaderValue := ctx.Value(xray.LambdaTraceHeaderKey); traceHeaderValue != nil { + traceHeader = traceHeaderValue.(string) + return header.FromString(traceHeader) + } + return nil +} + +// Converts the last 63 bits of an X-Ray trace ID (hex) to a Datadog trace id (uint64). +func convertXRayTraceIDToDatadogTraceID(traceID string) (string, error) { + parts := strings.Split(traceID, "-") + + if len(parts) != 3 { + return "0", fmt.Errorf("invalid x-ray trace id; expected 3 components in id") + } + if len(parts[2]) != 24 { + return "0", fmt.Errorf("x-ray trace id should be 96 bits") + } + + traceIDLength := len(parts[2]) - 16 + traceID = parts[2][traceIDLength : traceIDLength+16] // Per XRay Team: use the last 64 bits of the trace id + apmTraceID, err := convertHexIDToUint64(traceID) + if err != nil { + return "0", fmt.Errorf("while converting xray trace id: %v", err) + } + apmTraceID = 0x7FFFFFFFFFFFFFFF & apmTraceID // The APM Trace ID is restricted to 63 bits, so make sure the 64th bit is always 0 + return strconv.FormatUint(apmTraceID, 10), nil +} + +func convertHexIDToUint64(hexNumber string) (uint64, error) { + ba, err := hex.DecodeString(hexNumber) + if err != nil { + return 0, fmt.Errorf("couldn't convert hex to uint64: %v", err) + } + return binary.BigEndian.Uint64(ba), nil // TODO: Verify that this is correct +} + +// Converts an X-Ray entity ID (hex) to a Datadog parent id (uint64). +func convertXRayEntityIDToDatadogParentID(entityID string) (string, error) { + if len(entityID) < 16 { + return "0", fmt.Errorf("couldn't convert to trace id, too short") + } + val, err := convertHexIDToUint64(entityID[len(entityID)-16:]) + if err != nil { + return "0", fmt.Errorf("couldn't convert entity id to trace id: %v", err) + } + return strconv.FormatUint(val, 10), nil +} + +// Converts an X-Ray sampling decision into its Datadog counterpart. +func convertXRaySamplingDecision(decision header.SamplingDecision) string { + if decision == header.Sampled { + return userKeep + } + return userReject +} + +// ConvertTraceContextToSpanContext converts a TraceContext object to a SpanContext that can be used by dd-trace. +func ConvertTraceContextToSpanContext(traceCtx TraceContext) (ddtrace.SpanContext, error) { + spanCtx, err := propagator.Extract(tracer.TextMapCarrier(traceCtx)) + + if err != nil { + logger.Debug("Could not convert TraceContext to a SpanContext (most likely TraceContext was empty)") + return nil, err + } + + return spanCtx, nil +} + +// propagator is able to extract a SpanContext object from a TraceContext object +var propagator = tracer.NewPropagator(&tracer.PropagatorConfig{ + TraceHeader: traceIDHeader, + ParentHeader: parentIDHeader, + PriorityHeader: samplingPriorityHeader, +}) diff --git a/contrib/aws/datadog-lambda-go/internal/trace/context_test.go b/contrib/aws/datadog-lambda-go/internal/trace/context_test.go new file mode 100644 index 0000000000..d326edab40 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/trace/context_test.go @@ -0,0 +1,338 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package trace + +import ( + "context" + "encoding/json" + "os" + "testing" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/aws/aws-xray-sdk-go/v2/header" + "github.com/aws/aws-xray-sdk-go/v2/xray" + "github.com/stretchr/testify/assert" +) + +const ( + mockXRayEntityID = "0b11cc4230d3e09e" + mockXRayTraceID = "1-5ce31dc2-2c779014b90ce44db5e03875" + convertedXRayEntityID = "797643193680388254" + convertedXRayTraceID = "4110911582297405557" +) + +func mockLambdaXRayTraceContext(ctx context.Context, traceID, parentID string, sampled bool) context.Context { + decision := header.NotSampled + if sampled { + decision = header.Sampled + } + + traceHeader := header.Header{ + TraceID: traceID, + ParentID: parentID, + SamplingDecision: decision, + AdditionalData: make(TraceContext), + } + headerString := traceHeader.String() + //nolint + return context.WithValue(ctx, xray.LambdaTraceHeaderKey, headerString) +} + +func mockTraceContext(traceID, parentID, samplingPriority, origin string) context.Context { + ctx := context.Background() + if traceID != "" { + ctx = context.WithValue(ctx, extension.DdTraceId, traceID) + } + if parentID != "" { + ctx = context.WithValue(ctx, extension.DdParentId, parentID) + } + if samplingPriority != "" { + ctx = context.WithValue(ctx, extension.DdSamplingPriority, samplingPriority) + } + if origin != "" { + ctx = context.WithValue(ctx, extension.DdOrigin, origin) + } + return ctx +} + +func loadRawJSON(t *testing.T, filename string) *json.RawMessage { + bytes, err := os.ReadFile(filename) + if err != nil { + assert.Fail(t, "Couldn't find JSON file") + return nil + } + msg := json.RawMessage{} + err = msg.UnmarshalJSON(bytes) + assert.NoError(t, err) + return &msg +} +func TestGetDatadogTraceContextForTraceMetadataNonProxyEvent(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/apig-event-with-headers.json") + + headers, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.True(t, ok) + + expected := TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: "45678910", + samplingPriorityHeader: "2", + } + assert.Equal(t, expected, headers) +} + +func TestGetDatadogTraceContextForTraceMetadataWithMixedCaseHeaders(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/non-proxy-with-mixed-case-headers.json") + + headers, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.True(t, ok) + + expected := TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: "45678910", + samplingPriorityHeader: "2", + } + assert.Equal(t, expected, headers) +} + +func TestGetDatadogTraceContextForTraceMetadataWithMissingSamplingPriority(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/non-proxy-with-missing-sampling-priority.json") + + headers, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.True(t, ok) + + expected := TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: "45678910", + samplingPriorityHeader: "1", + } + assert.Equal(t, expected, headers) +} + +func TestGetDatadogTraceContextForInvalidData(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/invalid.json") + + _, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.False(t, ok) +} + +func TestGetDatadogTraceContextForMissingData(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/non-proxy-no-headers.json") + + _, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.False(t, ok) +} + +func TestGetDatadogTraceContextWithMultivalueHeaders(t *testing.T) { + // test that multivalue headers are properly extracted from given context + // single value headers should take precedence in the case of duplicates + + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/non-proxy-with-multivalue-headers.json") + expected := TraceContext{ + "x-datadog-origin": "origin1", + "x-datadog-trace-id": "1231452342", + "x-datadog-parent-id": "45678910", + "x-datadog-sampling-priority": "2", + } + + actual, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.True(t, ok) + assert.Equal(t, expected, actual) +} + +func TestGetDatadogTraceContextFromContextObject(t *testing.T) { + testcases := []struct { + traceID string + parentID string + samplingPriority string + origin string + expectTC TraceContext + expectOk bool + }{ + { + "trace", + "parent", + "sampling", + "origin", + TraceContext{ + "x-datadog-trace-id": "trace", + "x-datadog-parent-id": "parent", + "x-datadog-sampling-priority": "sampling", + "x-datadog-origin": "origin", + }, + true, + }, + { + "trace", + "parent", + "sampling", + "", + TraceContext{ + "x-datadog-trace-id": "trace", + "x-datadog-parent-id": "parent", + "x-datadog-sampling-priority": "sampling", + }, + true, + }, + { + "", + "parent", + "sampling", + "origin", + TraceContext{}, + false, + }, + { + "trace", + "", + "sampling", + "", + TraceContext{}, + false, + }, + { + "trace", + "parent", + "", + "", + TraceContext{ + "x-datadog-trace-id": "trace", + "x-datadog-parent-id": "parent", + "x-datadog-sampling-priority": "1", + }, + true, + }, + } + + ev := loadRawJSON(t, "../testdata/non-proxy-no-headers.json") + for _, test := range testcases { + t.Run(test.traceID+test.parentID+test.samplingPriority+test.origin, func(t *testing.T) { + ctx := mockTraceContext(test.traceID, test.parentID, test.samplingPriority, test.origin) + tc, ok := getTraceContext(ctx, getHeadersFromEventHeaders(ctx, *ev)) + assert.Equal(t, test.expectTC, tc) + assert.Equal(t, test.expectOk, ok) + }) + } +} + +func TestConvertXRayTraceID(t *testing.T) { + output, err := convertXRayTraceIDToDatadogTraceID(mockXRayTraceID) + assert.NoError(t, err) + assert.Equal(t, convertedXRayTraceID, output) +} + +func TestConvertXRayTraceIDTooShort(t *testing.T) { + output, err := convertXRayTraceIDToDatadogTraceID("1-5ce31dc2-5e03875") + assert.Error(t, err) + assert.Equal(t, "0", output) +} + +func TestConvertXRayTraceIDInvalidFormat(t *testing.T) { + output, err := convertXRayTraceIDToDatadogTraceID("1-2c779014b90ce44db5e03875") + assert.Error(t, err) + assert.Equal(t, "0", output) +} +func TestConvertXRayTraceIDIncorrectCharacters(t *testing.T) { + output, err := convertXRayTraceIDToDatadogTraceID("1-5ce31dc2-c779014b90ce44db5e03875;") + assert.Error(t, err) + assert.Equal(t, "0", output) +} + +func TestConvertXRayEntityID(t *testing.T) { + output, err := convertXRayEntityIDToDatadogParentID(mockXRayEntityID) + assert.NoError(t, err) + assert.Equal(t, convertedXRayEntityID, output) +} + +func TestConvertXRayEntityIDInvalidFormat(t *testing.T) { + output, err := convertXRayEntityIDToDatadogParentID(";b11cc4230d3e09e") + assert.Error(t, err) + assert.Equal(t, "0", output) +} + +func TestConvertXRayEntityIDTooShort(t *testing.T) { + output, err := convertXRayEntityIDToDatadogParentID("c4230d3e09e") + assert.Error(t, err) + assert.Equal(t, "0", output) +} + +func TestXrayTraceContextNoSegment(t *testing.T) { + ctx := context.Background() + + _, err := convertXrayTraceContextFromLambdaContext(ctx) + assert.Error(t, err) +} +func TestXrayTraceContextWithSegment(t *testing.T) { + + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + + headers, err := convertXrayTraceContextFromLambdaContext(ctx) + assert.NoError(t, err) + assert.Equal(t, "2", headers[samplingPriorityHeader]) + assert.NotNil(t, headers[traceIDHeader]) + assert.NotNil(t, headers[parentIDHeader]) +} + +func TestContextWithRootTraceContextNoDatadogContext(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/apig-event-no-headers.json") + + newCTX, _ := contextWithRootTraceContext(ctx, *ev, false, DefaultTraceExtractor) + traceContext, _ := newCTX.Value(traceContextKey).(TraceContext) + + expected := TraceContext{} + assert.Equal(t, expected, traceContext) +} + +func TestContextWithRootTraceContextWithDatadogContext(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/apig-event-with-headers.json") + + newCTX, _ := contextWithRootTraceContext(ctx, *ev, false, DefaultTraceExtractor) + traceContext, _ := newCTX.Value(traceContextKey).(TraceContext) + + expected := TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: "45678910", + samplingPriorityHeader: "2", + } + assert.Equal(t, expected, traceContext) +} + +func TestContextWithRootTraceContextMergeXrayTracesNoDatadogContext(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/apig-event-no-headers.json") + + newCTX, _ := contextWithRootTraceContext(ctx, *ev, true, DefaultTraceExtractor) + traceContext, _ := newCTX.Value(traceContextKey).(TraceContext) + + expected := TraceContext{ + traceIDHeader: convertedXRayTraceID, + parentIDHeader: convertedXRayEntityID, + samplingPriorityHeader: "2", + } + assert.Equal(t, expected, traceContext) +} + +func TestContextWithRootTraceContextMergeXrayTracesWithDatadogContext(t *testing.T) { + ctx := mockLambdaXRayTraceContext(context.Background(), mockXRayTraceID, mockXRayEntityID, true) + ev := loadRawJSON(t, "../testdata/apig-event-with-headers.json") + + newCTX, _ := contextWithRootTraceContext(ctx, *ev, true, DefaultTraceExtractor) + traceContext, _ := newCTX.Value(traceContextKey).(TraceContext) + + expected := TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: convertedXRayEntityID, + samplingPriorityHeader: "2", + } + assert.Equal(t, expected, traceContext) +} diff --git a/contrib/aws/datadog-lambda-go/internal/trace/listener.go b/contrib/aws/datadog-lambda-go/internal/trace/listener.go new file mode 100644 index 0000000000..be224412dc --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/trace/listener.go @@ -0,0 +1,201 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package trace + +import ( + "context" + "encoding/json" + "fmt" + "os" + "strings" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + ddotel "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry" + ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/aws/aws-lambda-go/lambdacontext" + "go.opentelemetry.io/otel" +) + +type ( + // Listener creates a function execution span and injects it into the context + Listener struct { + ddTraceEnabled bool + mergeXrayTraces bool + universalInstrumentation bool + otelTracerEnabled bool + extensionManager *extension.ExtensionManager + traceContextExtractor ContextExtractor + tracerOptions []ddtracer.StartOption + } + + // Config gives options for how the Listener should work + Config struct { + DDTraceEnabled bool + MergeXrayTraces bool + UniversalInstrumentation bool + OtelTracerEnabled bool + TraceContextExtractor ContextExtractor + TracerOptions []ddtracer.StartOption + } +) + +// The function execution span is the top-level span representing the current Lambda function execution +var functionExecutionSpan *ddtracer.Span + +var tracerInitialized = false + +// MakeListener initializes a new trace lambda Listener +func MakeListener(config Config, extensionManager *extension.ExtensionManager) Listener { + + return Listener{ + ddTraceEnabled: config.DDTraceEnabled, + mergeXrayTraces: config.MergeXrayTraces, + universalInstrumentation: config.UniversalInstrumentation, + otelTracerEnabled: config.OtelTracerEnabled, + extensionManager: extensionManager, + traceContextExtractor: config.TraceContextExtractor, + tracerOptions: config.TracerOptions, + } +} + +// HandlerStarted sets up tracing and starts the function execution span if Datadog tracing is enabled +func (l *Listener) HandlerStarted(ctx context.Context, msg json.RawMessage) context.Context { + if !l.ddTraceEnabled { + return ctx + } + + if l.universalInstrumentation && l.extensionManager.IsExtensionRunning() { + ctx = l.extensionManager.SendStartInvocationRequest(ctx, msg) + } + + ctx, _ = contextWithRootTraceContext(ctx, msg, l.mergeXrayTraces, l.traceContextExtractor) + + if !tracerInitialized { + serviceName := os.Getenv("DD_SERVICE") + if serviceName == "" { + serviceName = internal.Instr.ServiceName(instrumentation.ComponentDefault, instrumentation.OperationContext{}) + } + extensionNotRunning := !l.extensionManager.IsExtensionRunning() + opts := append([]ddtracer.StartOption{ + ddtracer.WithService(serviceName), + ddtracer.WithLambdaMode(extensionNotRunning), + ddtracer.WithGlobalTag("_dd.origin", "lambda"), + ddtracer.WithSendRetries(2), + }, l.tracerOptions...) + if l.otelTracerEnabled { + provider := ddotel.NewTracerProvider( + opts..., + ) + otel.SetTracerProvider(provider) + } else { + ddtracer.Start( + opts..., + ) + } + tracerInitialized = true + } + + isDdServerlessSpan := l.universalInstrumentation && l.extensionManager.IsExtensionRunning() + functionExecutionSpan, ctx = startFunctionExecutionSpan(ctx, l.mergeXrayTraces, isDdServerlessSpan) + + // Add the span to the context so the user can create child spans + ctx = ddtracer.ContextWithSpan(ctx, functionExecutionSpan) + + return ctx +} + +// HandlerFinished ends the function execution span and stops the tracer +func (l *Listener) HandlerFinished(ctx context.Context, err error) { + if functionExecutionSpan != nil { + functionExecutionSpan.Finish(ddtracer.WithError(err)) + + finishConfig := ddtracer.FinishConfig{Error: err} + + if l.universalInstrumentation && l.extensionManager.IsExtensionRunning() { + l.extensionManager.SendEndInvocationRequest(ctx, functionExecutionSpan, finishConfig) + } + } + + ddtracer.Flush() +} + +// startFunctionExecutionSpan starts a span that represents the current Lambda function execution +// and returns the span so that it can be finished when the function execution is complete +func startFunctionExecutionSpan(ctx context.Context, mergeXrayTraces bool, isDdServerlessSpan bool) (*ddtracer.Span, context.Context) { + // Extract information from context + lambdaCtx, _ := lambdacontext.FromContext(ctx) + rootTraceContext, ok := ctx.Value(traceContextKey).(TraceContext) + if !ok { + logger.Error(fmt.Errorf("Error extracting trace context from context object")) + } + + functionArn := lambdaCtx.InvokedFunctionArn + functionArn = strings.ToLower(functionArn) + functionArn, functionVersion := separateVersionFromFunctionArn(functionArn) + + // Set the root trace context as the parent of the function execution span + var parentSpanContext ddtrace.SpanContext + convertedSpanContext, err := ConvertTraceContextToSpanContext(rootTraceContext) + if err == nil { + parentSpanContext = convertedSpanContext + } + + resourceName := lambdacontext.FunctionName + if isDdServerlessSpan { + // The extension will drop this span, prioritizing the execution span the extension creates + resourceName = string(extension.DdSeverlessSpan) + } + + spanOptions := []ddtracer.StartSpanOption{ + ddtracer.SpanType("serverless"), + ddtracer.ResourceName(resourceName), + ddtracer.Tag("cold_start", ctx.Value("cold_start")), + ddtracer.Tag("function_arn", functionArn), + ddtracer.Tag("function_version", functionVersion), + ddtracer.Tag("request_id", lambdaCtx.AwsRequestID), + ddtracer.Tag("resource_names", lambdacontext.FunctionName), + ddtracer.Tag("functionname", strings.ToLower(lambdacontext.FunctionName)), + ddtracer.Tag("datadog_lambda", instrumentation.Version()), + ddtracer.Tag("dd_trace", instrumentation.Version()), + } + + if parentSpanContext != nil { + if sc, ok := parentSpanContext.(*ddtracer.SpanContext); ok { + spanOptions = append(spanOptions, ddtracer.ChildOf(sc)) + } + } + + span := ddtracer.StartSpan( + internal.Instr.OperationName(instrumentation.ComponentDefault, instrumentation.OperationContext{}), // This operation name will be replaced with the value of the service tag by the Forwarder + spanOptions..., + ) + + if parentSpanContext != nil && mergeXrayTraces { + // This tag will cause the Forwarder to drop the span (to avoid redundancy with X-Ray) + span.SetTag("_dd.parent_source", "xray") + } + + ctx = context.WithValue(ctx, extension.DdSpanId, fmt.Sprint(span.Context().SpanID())) + + return span, ctx +} + +func separateVersionFromFunctionArn(functionArn string) (arnWithoutVersion string, functionVersion string) { + arnSegments := strings.Split(functionArn, ":") + if cap(arnSegments) < 7 { + return "", "" + } + functionVersion = "$LATEST" + arnWithoutVersion = strings.Join(arnSegments[0:7], ":") + if len(arnSegments) > 7 { + functionVersion = arnSegments[7] + } + return arnWithoutVersion, functionVersion +} diff --git a/contrib/aws/datadog-lambda-go/internal/trace/listener_test.go b/contrib/aws/datadog-lambda-go/internal/trace/listener_test.go new file mode 100644 index 0000000000..4d5de5fd44 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/trace/listener_test.go @@ -0,0 +1,173 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package trace + +import ( + "context" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/aws/aws-lambda-go/lambdacontext" + "github.com/stretchr/testify/assert" +) + +func TestSeparateVersionFromFunctionArnWithVersion(t *testing.T) { + inputArn := "arn:aws:lambda:us-east-1:123456789012:function:my-function:9" + + arnWithoutVersion, functionVersion := separateVersionFromFunctionArn(inputArn) + + expectedArnWithoutVersion := "arn:aws:lambda:us-east-1:123456789012:function:my-function" + expectedFunctionVersion := "9" + assert.Equal(t, expectedArnWithoutVersion, arnWithoutVersion) + assert.Equal(t, expectedFunctionVersion, functionVersion) +} + +func TestSeparateVersionFromFunctionArnWithoutVersion(t *testing.T) { + inputArn := "arn:aws:lambda:us-east-1:123456789012:function:my-function" + + arnWithoutVersion, functionVersion := separateVersionFromFunctionArn(inputArn) + + expectedArnWithoutVersion := "arn:aws:lambda:us-east-1:123456789012:function:my-function" + expectedFunctionVersion := "$LATEST" + assert.Equal(t, expectedArnWithoutVersion, arnWithoutVersion) + assert.Equal(t, expectedFunctionVersion, functionVersion) +} + +func TestSeparateVersionFromFunctionArnEmptyString(t *testing.T) { + inputArn := "" + + arnWithoutVersion, functionVersion := separateVersionFromFunctionArn(inputArn) + assert.Empty(t, arnWithoutVersion) + assert.Empty(t, functionVersion) +} + +var traceContextFromXray = TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: "45678910", +} + +var traceContextFromEvent = TraceContext{ + traceIDHeader: "1231452342", + parentIDHeader: "45678910", +} + +var mockLambdaContext = lambdacontext.LambdaContext{ + AwsRequestID: "abcdefgh-1234-5678-1234-abcdefghijkl", + InvokedFunctionArn: "arn:aws:lambda:us-east-1:123456789012:function:MyFunction:11", +} + +func TestStartFunctionExecutionSpanFromXrayWithMergeEnabled(t *testing.T) { + ctx := context.Background() + + lambdacontext.FunctionName = "MockFunctionName" + ctx = lambdacontext.NewContext(ctx, &mockLambdaContext) + ctx = context.WithValue(ctx, traceContextKey, traceContextFromXray) + //nolint + ctx = context.WithValue(ctx, "cold_start", true) + + mt := mocktracer.Start() + defer mt.Stop() + + span, ctx := startFunctionExecutionSpan(ctx, true, false) + span.Finish() + finishedSpan := mt.FinishedSpans()[0] + + assert.Equal(t, "aws.lambda", finishedSpan.OperationName()) + + assert.Equal(t, "true", finishedSpan.Tag("cold_start")) + // We expect the function ARN to be lowercased, and the version removed + assert.Equal(t, "arn:aws:lambda:us-east-1:123456789012:function:myfunction", finishedSpan.Tag("function_arn")) + assert.Equal(t, "11", finishedSpan.Tag("function_version")) + assert.Equal(t, "abcdefgh-1234-5678-1234-abcdefghijkl", finishedSpan.Tag("request_id")) + assert.Equal(t, "MockFunctionName", finishedSpan.Tag("resource.name")) + assert.Equal(t, "MockFunctionName", finishedSpan.Tag("resource_names")) + assert.Equal(t, "mockfunctionname", finishedSpan.Tag("functionname")) + assert.Equal(t, "serverless", finishedSpan.Tag("span.type")) + assert.Equal(t, "xray", finishedSpan.Tag("_dd.parent_source")) + assert.Equal(t, fmt.Sprint(span.Context().SpanID()), ctx.Value(extension.DdSpanId).(string)) +} + +func TestStartFunctionExecutionSpanFromXrayWithMergeDisabled(t *testing.T) { + ctx := context.Background() + + lambdacontext.FunctionName = "MockFunctionName" + ctx = lambdacontext.NewContext(ctx, &mockLambdaContext) + ctx = context.WithValue(ctx, traceContextKey, traceContextFromXray) + //nolint + ctx = context.WithValue(ctx, "cold_start", true) + + mt := mocktracer.Start() + defer mt.Stop() + + span, ctx := startFunctionExecutionSpan(ctx, false, false) + span.Finish() + finishedSpan := mt.FinishedSpans()[0] + + assert.Equal(t, nil, finishedSpan.Tag("_dd.parent_source")) + assert.Equal(t, fmt.Sprint(span.Context().SpanID()), ctx.Value(extension.DdSpanId).(string)) +} + +func TestStartFunctionExecutionSpanFromEventWithMergeEnabled(t *testing.T) { + ctx := context.Background() + + lambdacontext.FunctionName = "MockFunctionName" + ctx = lambdacontext.NewContext(ctx, &mockLambdaContext) + ctx = context.WithValue(ctx, traceContextKey, traceContextFromEvent) + //nolint + ctx = context.WithValue(ctx, "cold_start", true) + + mt := mocktracer.Start() + defer mt.Stop() + + span, ctx := startFunctionExecutionSpan(ctx, true, false) + span.Finish() + finishedSpan := mt.FinishedSpans()[0] + + assert.Equal(t, "xray", finishedSpan.Tag("_dd.parent_source")) + assert.Equal(t, fmt.Sprint(span.Context().SpanID()), ctx.Value(extension.DdSpanId).(string)) +} + +func TestStartFunctionExecutionSpanFromEventWithMergeDisabled(t *testing.T) { + ctx := context.Background() + + lambdacontext.FunctionName = "MockFunctionName" + ctx = lambdacontext.NewContext(ctx, &mockLambdaContext) + ctx = context.WithValue(ctx, traceContextKey, traceContextFromEvent) + //nolint + ctx = context.WithValue(ctx, "cold_start", true) + + mt := mocktracer.Start() + defer mt.Stop() + + span, ctx := startFunctionExecutionSpan(ctx, false, false) + span.Finish() + finishedSpan := mt.FinishedSpans()[0] + + assert.Equal(t, nil, finishedSpan.Tag("_dd.parent_source")) + assert.Equal(t, fmt.Sprint(span.Context().SpanID()), ctx.Value(extension.DdSpanId).(string)) +} + +func TestStartFunctionExecutionSpanWithExtension(t *testing.T) { + ctx := context.Background() + + lambdacontext.FunctionName = "MockFunctionName" + ctx = lambdacontext.NewContext(ctx, &mockLambdaContext) + ctx = context.WithValue(ctx, traceContextKey, traceContextFromEvent) + //nolint + ctx = context.WithValue(ctx, "cold_start", true) + + mt := mocktracer.Start() + defer mt.Stop() + + span, ctx := startFunctionExecutionSpan(ctx, false, true) + span.Finish() + finishedSpan := mt.FinishedSpans()[0] + + assert.Equal(t, string(extension.DdSeverlessSpan), finishedSpan.Tag("resource.name")) + assert.Equal(t, fmt.Sprint(span.Context().SpanID()), ctx.Value(extension.DdSpanId).(string)) +} diff --git a/contrib/aws/datadog-lambda-go/internal/wrapper/wrap_handler.go b/contrib/aws/datadog-lambda-go/internal/wrapper/wrap_handler.go new file mode 100644 index 0000000000..b521ba49ff --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/wrapper/wrap_handler.go @@ -0,0 +1,199 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package wrapper + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/extension" + "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2/internal/logger" + "github.com/aws/aws-lambda-go/lambda" + + "reflect" +) + +var ( + // CurrentContext is the last create lambda context object. + CurrentContext context.Context +) + +type ( + // HandlerListener is a point where listener logic can be injected into a handler + HandlerListener interface { + HandlerStarted(ctx context.Context, msg json.RawMessage) context.Context + HandlerFinished(ctx context.Context, err error) + } + + DatadogHandler struct { + coldStart bool + handler lambda.Handler + listeners []HandlerListener + } +) + +// WrapHandlerWithListeners wraps a lambda handler, and calls listeners before and after every invocation. +func WrapHandlerWithListeners(handler interface{}, listeners ...HandlerListener) interface{} { + err := validateHandler(handler) + if err != nil { + // This wasn't a valid handler function, pass back to AWS SDK to let it handle the error. + logger.Error(fmt.Errorf("handler function was in format ddlambda doesn't recognize: %v", err)) + return handler + } + coldStart := true + + // Return custom handler, to be called once per invocation + return func(ctx context.Context, msg json.RawMessage) (interface{}, error) { + //nolint + ctx = context.WithValue(ctx, "cold_start", coldStart) + for _, listener := range listeners { + ctx = listener.HandlerStarted(ctx, msg) + } + CurrentContext = ctx + result, err := callHandler(ctx, msg, handler) + for _, listener := range listeners { + ctx = context.WithValue(ctx, extension.DdLambdaResponse, result) + listener.HandlerFinished(ctx, err) + } + coldStart = false + CurrentContext = nil + return result, err + } +} + +func (h *DatadogHandler) Invoke(ctx context.Context, payload []byte) ([]byte, error) { + //nolint + ctx = context.WithValue(ctx, "cold_start", h.coldStart) + msg := json.RawMessage{} + err := msg.UnmarshalJSON(payload) + if err != nil { + logger.Error(fmt.Errorf("couldn't load handler payload: %v", err)) + } + + for _, listener := range h.listeners { + ctx = listener.HandlerStarted(ctx, msg) + } + + CurrentContext = ctx + result, err := h.handler.Invoke(ctx, payload) + for _, listener := range h.listeners { + listener.HandlerFinished(ctx, err) + } + h.coldStart = false + CurrentContext = nil + return result, err +} + +func WrapHandlerInterfaceWithListeners(handler lambda.Handler, listeners ...HandlerListener) lambda.Handler { + return &DatadogHandler{ + coldStart: true, + handler: handler, + listeners: listeners, + } +} + +func validateHandler(handler interface{}) error { + // Detect the handler follows the right format, based on the GO AWS SDK. + // https://docs.aws.amazon.com/lambda/latest/dg/go-programming-model-handler-types.html + handlerType := reflect.TypeOf(handler) + if handlerType.Kind() != reflect.Func { + return errors.New("handler is not a function") + } + + if handlerType.NumIn() == 2 { + contextType := reflect.TypeOf((*context.Context)(nil)).Elem() + firstArgType := handlerType.In(0) + if !firstArgType.Implements(contextType) { + return errors.New("handler should take context as first argument") + } + } + if handlerType.NumIn() > 2 { + return errors.New("handler takes too many arguments") + } + + errorType := reflect.TypeOf((*error)(nil)).Elem() + + if handlerType.NumOut() > 2 { + return errors.New("handler returns more than two values") + } + if handlerType.NumOut() > 0 { + rt := handlerType.Out(handlerType.NumOut() - 1) // Last returned value + if !rt.Implements(errorType) { + return errors.New("handler doesn't return error as it's last value") + } + } + return nil +} + +func callHandler(ctx context.Context, msg json.RawMessage, handler interface{}) (interface{}, error) { + ev, err := unmarshalEventForHandler(msg, handler) + if err != nil { + return nil, err + } + handlerType := reflect.TypeOf(handler) + + args := []reflect.Value{} + + if handlerType.NumIn() == 1 { + // When there is only one argument, argument is either the event payload, or the context. + contextType := reflect.TypeOf((*context.Context)(nil)).Elem() + firstArgType := handlerType.In(0) + if firstArgType.Implements(contextType) { + args = []reflect.Value{reflect.ValueOf(ctx)} + } else { + args = []reflect.Value{ev.Elem()} + + } + } else if handlerType.NumIn() == 2 { + // Or when there are two arguments, context is always first, followed by event payload. + args = []reflect.Value{reflect.ValueOf(ctx), ev.Elem()} + } + + handlerValue := reflect.ValueOf(handler) + output := handlerValue.Call(args) + + var response interface{} + var errResponse error + + if len(output) > 0 { + // If there are any output values, the last should always be an error + val := output[len(output)-1].Interface() + if errVal, ok := val.(error); ok { + errResponse = errVal + } + } + + if len(output) > 1 { + // If there is more than one output value, the first should be the response payload. + response = output[0].Interface() + } + + return response, errResponse +} + +func unmarshalEventForHandler(ev json.RawMessage, handler interface{}) (reflect.Value, error) { + handlerType := reflect.TypeOf(handler) + if handlerType.NumIn() == 0 { + return reflect.ValueOf(nil), nil + } + + messageType := handlerType.In(handlerType.NumIn() - 1) + contextType := reflect.TypeOf((*context.Context)(nil)).Elem() + firstArgType := handlerType.In(0) + + if handlerType.NumIn() == 1 && firstArgType.Implements(contextType) { + return reflect.ValueOf(nil), nil + } + + newMessage := reflect.New(messageType) + err := json.Unmarshal(ev, newMessage.Interface()) + if err != nil { + return reflect.ValueOf(nil), err + } + return newMessage, err +} diff --git a/contrib/aws/datadog-lambda-go/internal/wrapper/wrap_handler_test.go b/contrib/aws/datadog-lambda-go/internal/wrapper/wrap_handler_test.go new file mode 100644 index 0000000000..687fbf963d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/internal/wrapper/wrap_handler_test.go @@ -0,0 +1,297 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package wrapper + +import ( + "context" + "encoding/json" + "errors" + "os" + "reflect" + "testing" + + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" + "github.com/stretchr/testify/assert" +) + +type ( + mockHandlerListener struct { + inputCTX context.Context + inputMSG json.RawMessage + outputCTX context.Context + } + + mockNonProxyEvent struct { + MyCustomEvent map[string]int `json:"my-custom-event"` + FakeID string `json:"fake-id"` + } +) + +func (mhl *mockHandlerListener) HandlerStarted(ctx context.Context, msg json.RawMessage) context.Context { + mhl.inputCTX = ctx + mhl.inputMSG = msg + return ctx +} + +func (mhl *mockHandlerListener) HandlerFinished(ctx context.Context, err error) { + mhl.outputCTX = ctx +} + +func runHandlerWithJSON(t *testing.T, filename string, handler interface{}) (*mockHandlerListener, interface{}, error) { + ctx := context.Background() + payload := loadRawJSON(t, filename) + + mhl := mockHandlerListener{} + + wrappedHandler := WrapHandlerWithListeners(handler, &mhl).(func(context.Context, json.RawMessage) (interface{}, error)) + + response, err := wrappedHandler(ctx, *payload) + return &mhl, response, err +} + +func runHandlerInterfaceWithJSON(t *testing.T, filename string, handler lambda.Handler) (*mockHandlerListener, []byte, error) { + ctx := context.Background() + payload, err := os.ReadFile(filename) + if err != nil { + assert.Fail(t, "Couldn't find JSON file") + return nil, nil, nil + } + mhl := mockHandlerListener{} + + wrappedHandler := WrapHandlerInterfaceWithListeners(handler, &mhl) + + response, err := wrappedHandler.Invoke(ctx, payload) + return &mhl, response, err +} + +func loadRawJSON(t *testing.T, filename string) *json.RawMessage { + bytes, err := os.ReadFile(filename) + if err != nil { + assert.Fail(t, "Couldn't find JSON file") + return nil + } + msg := json.RawMessage{} + err = msg.UnmarshalJSON(bytes) + assert.NoError(t, err) + return &msg +} + +func TestValidateHandlerNotFunction(t *testing.T) { + nonFunction := 1 + + err := validateHandler(nonFunction) + assert.EqualError(t, err, "handler is not a function") +} +func TestValidateHandlerToManyArguments(t *testing.T) { + tooManyArgs := func(a, b, c int) { + } + + err := validateHandler(tooManyArgs) + assert.EqualError(t, err, "handler takes too many arguments") +} + +func TestValidateHandlerContextIsNotFirstArgument(t *testing.T) { + firstArgNotContext := func(arg1, arg2 int) { + } + + err := validateHandler(firstArgNotContext) + assert.EqualError(t, err, "handler should take context as first argument") +} + +func TestValidateHandlerTwoArguments(t *testing.T) { + twoArguments := func(arg1 context.Context, arg2 int) { + } + + err := validateHandler(twoArguments) + assert.NoError(t, err) +} + +func TestValidateHandlerOneArgument(t *testing.T) { + oneArgument := func(arg1 int) { + } + + err := validateHandler(oneArgument) + assert.NoError(t, err) +} + +func TestValidateHandlerTooManyReturnValues(t *testing.T) { + tooManyReturns := func() (int, int, error) { + return 0, 0, nil + } + + err := validateHandler(tooManyReturns) + assert.EqualError(t, err, "handler returns more than two values") +} +func TestValidateHandlerLastReturnValueNotError(t *testing.T) { + lastNotError := func() (int, int) { + return 0, 0 + } + + err := validateHandler(lastNotError) + assert.EqualError(t, err, "handler doesn't return error as it's last value") +} +func TestValidateHandlerCorrectFormat(t *testing.T) { + correct := func(context context.Context) (int, error) { + return 0, nil + } + + err := validateHandler(correct) + assert.NoError(t, err) +} + +func TestWrapHandlerAPIGEvent(t *testing.T) { + called := false + + handler := func(ctx context.Context, request events.APIGatewayProxyRequest) (int, error) { + called = true + assert.Equal(t, "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", request.RequestContext.RequestID) + return 5, nil + } + + _, response, err := runHandlerWithJSON(t, "../testdata/apig-event-no-headers.json", handler) + + assert.True(t, called) + assert.NoError(t, err) + assert.Equal(t, 5, response) +} + +func TestWrapHandlerNonProxyEvent(t *testing.T) { + called := false + + handler := func(ctx context.Context, request mockNonProxyEvent) (int, error) { + called = true + assert.Equal(t, "12345678910", request.FakeID) + return 5, nil + } + + _, response, err := runHandlerWithJSON(t, "../testdata/non-proxy-no-headers.json", handler) + + assert.True(t, called) + assert.NoError(t, err) + assert.Equal(t, 5, response) +} + +func TestWrapHandlerEventArgumentOnly(t *testing.T) { + called := false + + handler := func(request mockNonProxyEvent) (int, error) { + called = true + assert.Equal(t, "12345678910", request.FakeID) + return 5, nil + } + + _, response, err := runHandlerWithJSON(t, "../testdata/non-proxy-no-headers.json", handler) + + assert.True(t, called) + assert.NoError(t, err) + assert.Equal(t, 5, response) +} + +func TestWrapHandlerContextArgumentOnly(t *testing.T) { + called := true + var handler = func(ctx context.Context) (interface{}, error) { + return nil, nil + } + + mhl := mockHandlerListener{} + wrappedHandler := WrapHandlerWithListeners(handler, &mhl).(func(context.Context, json.RawMessage) (interface{}, error)) + + _, err := wrappedHandler(context.Background(), nil) + assert.NoError(t, err) + assert.True(t, called) +} + +func TestWrapHandlerNoArguments(t *testing.T) { + called := false + + handler := func() (int, error) { + called = true + return 5, nil + } + + _, response, err := runHandlerWithJSON(t, "../testdata/non-proxy-no-headers.json", handler) + + assert.True(t, called) + assert.NoError(t, err) + assert.Equal(t, 5, response) +} + +func TestWrapHandlerInvalidData(t *testing.T) { + called := false + + handler := func(request mockNonProxyEvent) (int, error) { + called = true + return 5, nil + } + + _, response, err := runHandlerWithJSON(t, "../testdata/invalid.json", handler) + + assert.False(t, called) + assert.Error(t, err) + assert.Equal(t, nil, response) +} + +func TestWrapHandlerReturnsError(t *testing.T) { + called := false + defaultErr := errors.New("Some error") + + handler := func(request mockNonProxyEvent) (int, error) { + called = true + return 5, defaultErr + } + + _, response, err := runHandlerWithJSON(t, "../testdata/non-proxy-no-headers.json", handler) + + assert.True(t, called) + assert.Equal(t, defaultErr, err) + assert.Equal(t, 5, response) +} + +func TestWrapHandlerReturnsErrorOnly(t *testing.T) { + called := false + defaultErr := errors.New("Some error") + + handler := func(request mockNonProxyEvent) error { + called = true + return defaultErr + } + + _, response, err := runHandlerWithJSON(t, "../testdata/non-proxy-no-headers.json", handler) + + assert.True(t, called) + assert.Equal(t, defaultErr, err) + assert.Equal(t, nil, response) +} + +func TestWrapHandlerReturnsOriginalHandlerIfInvalid(t *testing.T) { + + var handler interface{} = func(arg1, arg2, arg3 int) (int, error) { + return 0, nil + } + mhl := mockHandlerListener{} + + wrappedHandler := WrapHandlerWithListeners(handler, &mhl) + + assert.Equal(t, reflect.ValueOf(handler).Pointer(), reflect.ValueOf(wrappedHandler).Pointer()) + +} + +func TestWrapHandlerInterfaceWithListeners(t *testing.T) { + called := false + + handler := lambda.NewHandler(func(ctx context.Context, request events.APIGatewayProxyRequest) (int, error) { + called = true + assert.Equal(t, "c6af9ac6-7b61-11e6-9a41-93e8deadbeef", request.RequestContext.RequestID) + return 5, nil + }) + + _, response, err := runHandlerInterfaceWithJSON(t, "../testdata/apig-event-no-headers.json", handler) + + assert.True(t, called) + assert.NoError(t, err) + assert.Equal(t, uint8('5'), response[0]) +} diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/.gitignore b/contrib/aws/datadog-lambda-go/test/integration_tests/.gitignore new file mode 100644 index 0000000000..814d731a28 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/.gitignore @@ -0,0 +1,3 @@ +vendor + +build/* diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/README.md b/contrib/aws/datadog-lambda-go/test/integration_tests/README.md new file mode 100644 index 0000000000..af1b0c6cb3 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/README.md @@ -0,0 +1,16 @@ +# Integration tests + + +## Requirements + +- Node +- Go +- DD_API_KEY + +## Running + +```bash +DD_API_KEY= aws-vault exec sandbox-account-admin -- ./run_integration_tests.sh +``` + +Use `UPDATE_SNAPSHOTS=true` to update snapshots diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/error/go.mod b/contrib/aws/datadog-lambda-go/test/integration_tests/error/go.mod new file mode 100644 index 0000000000..b52a29776c --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/error/go.mod @@ -0,0 +1,113 @@ +module github.com/DataDog/dd-trace-go/v2/contrib/aws/datadog-lambda-go/test/integration_tests/error + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2 v2.0.0-00010101000000-000000000000 + github.com/aws/aws-lambda-go v1.46.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect + github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect + github.com/aws/aws-xray-sdk-go/v2 v2.0.0 // indirect + github.com/aws/smithy-go v1.19.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/sony/gobreaker v0.5.0 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.52.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2 => ../../.. + +replace github.com/DataDog/dd-trace-go/v2 => ../../../../../.. diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/error/go.sum b/contrib/aws/datadog-lambda-go/test/integration_tests/error/go.sum new file mode 100644 index 0000000000..717459f00d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/error/go.sum @@ -0,0 +1,359 @@ +github.com/DATA-DOG/go-sqlmock v1.5.1 h1:FK6RCIUSfmbnI/imIICmboyQBkOckutaa6R5YYlLZyo= +github.com/DATA-DOG/go-sqlmock v1.5.1/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/aws/aws-lambda-go v1.46.0 h1:UWVnvh2h2gecOlFhHQfIPQcD8pL/f7pVCutmFl+oXU8= +github.com/aws/aws-lambda-go v1.46.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= +github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= +github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= +github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 h1:W9PbZAZAEcelhhjb7KuwUtf+Lbc+i7ByYJRuWLlnxyQ= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9/go.mod h1:2tFmR7fQnOdQlM2ZCEPpFnBIQD1U8wmXmduBgZbOag0= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= +github.com/aws/aws-xray-sdk-go/v2 v2.0.0 h1:/AkLb6rmRWjz8pQTm6BxCGcjebS+W1yFoH9rxy3ekM8= +github.com/aws/aws-xray-sdk-go/v2 v2.0.0/go.mod h1:yyjiofE/pQ9u682QgBw3tkyuyvcN+6piDiQnhwWMyng= +github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= +github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= +github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= +github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/error/main.go b/contrib/aws/datadog-lambda-go/test/integration_tests/error/main.go new file mode 100644 index 0000000000..b5d30a690a --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/error/main.go @@ -0,0 +1,27 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package main + +import ( + "context" + "errors" + + "github.com/aws/aws-lambda-go/lambda" + + ddlambda "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2" + "github.com/aws/aws-lambda-go/events" +) + +func handleRequest(ctx context.Context, ev events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + return events.APIGatewayProxyResponse{ + StatusCode: 500, + Body: "error", + }, errors.New("something went wrong") +} + +func main() { + lambda.Start(ddlambda.WrapHandler(handleRequest, nil)) +} diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/hello/go.mod b/contrib/aws/datadog-lambda-go/test/integration_tests/hello/go.mod new file mode 100644 index 0000000000..d577757f04 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/hello/go.mod @@ -0,0 +1,121 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +module github.com/DataDog/dd-trace-go/v2/contrib/aws/datadog-lambda-go/test/integration_tests/hello + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2 v2.0.0-00010101000000-000000000000 + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.0.0-00010101000000-000000000000 + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/aws/aws-lambda-go v1.46.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.24.1 // indirect + github.com/aws/aws-sdk-go-v2/config v1.26.6 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.16.16 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 // indirect + github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 // indirect + github.com/aws/aws-xray-sdk-go/v2 v2.0.0 // indirect + github.com/aws/smithy-go v1.19.0 // indirect + github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/sony/gobreaker v0.5.0 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.52.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2 => ../../.. + +replace github.com/DataDog/dd-trace-go/v2 => ../../../../../.. + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../../../../net/http diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/hello/go.sum b/contrib/aws/datadog-lambda-go/test/integration_tests/hello/go.sum new file mode 100644 index 0000000000..717459f00d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/hello/go.sum @@ -0,0 +1,359 @@ +github.com/DATA-DOG/go-sqlmock v1.5.1 h1:FK6RCIUSfmbnI/imIICmboyQBkOckutaa6R5YYlLZyo= +github.com/DATA-DOG/go-sqlmock v1.5.1/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/aws/aws-lambda-go v1.46.0 h1:UWVnvh2h2gecOlFhHQfIPQcD8pL/f7pVCutmFl+oXU8= +github.com/aws/aws-lambda-go v1.46.0/go.mod h1:dpMpZgvWx5vuQJfBt0zqBha60q7Dd7RfgJv23DymV8A= +github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= +github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= +github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9 h1:W9PbZAZAEcelhhjb7KuwUtf+Lbc+i7ByYJRuWLlnxyQ= +github.com/aws/aws-sdk-go-v2/service/kms v1.27.9/go.mod h1:2tFmR7fQnOdQlM2ZCEPpFnBIQD1U8wmXmduBgZbOag0= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= +github.com/aws/aws-xray-sdk-go/v2 v2.0.0 h1:/AkLb6rmRWjz8pQTm6BxCGcjebS+W1yFoH9rxy3ekM8= +github.com/aws/aws-xray-sdk-go/v2 v2.0.0/go.mod h1:yyjiofE/pQ9u682QgBw3tkyuyvcN+6piDiQnhwWMyng= +github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= +github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= +github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sony/gobreaker v0.5.0 h1:dRCvqm0P490vZPmy7ppEk2qCnCieBooFJ+YoXGYB+yg= +github.com/sony/gobreaker v0.5.0/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.52.0 h1:wqBQpxH71XW0e2g+Og4dzQM8pk34aFYlA1Ga8db7gU0= +github.com/valyala/fasthttp v1.52.0/go.mod h1:hf5C4QnVMkNXMspnsUlfM3WitlgYflyhHYoKol/szxQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/hello/main.go b/contrib/aws/datadog-lambda-go/test/integration_tests/hello/main.go new file mode 100644 index 0000000000..6b3af02e74 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/hello/main.go @@ -0,0 +1,52 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package main + +import ( + "context" + "log/slog" + "net/http" + "time" + + "github.com/aws/aws-lambda-go/lambda" + + ddlambda "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go/v2" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/aws/aws-lambda-go/events" +) + +func handleRequest(ctx context.Context, ev events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { + currentSpan, _ := tracer.SpanFromContext(ctx) + currentSpanContext := currentSpan.Context() + slog.Info("Current span", "span_id", currentSpanContext.SpanID()) + slog.Info("Current trace", "trace_id", currentSpanContext.TraceID()) + + // HTTP request + req, _ := http.NewRequestWithContext(ctx, "GET", "https://www.datadoghq.com/", nil) + client := http.Client{} + client = *httptrace.WrapClient(&client) + client.Do(req) + + // Metric + ddlambda.Distribution("hello-go.dog", 1) + + // User-defined span + for i := 0; i < 10; i++ { + s, _ := tracer.StartSpanFromContext(ctx, "child.span") + time.Sleep(100 * time.Millisecond) + s.Finish() + } + + return events.APIGatewayProxyResponse{ + StatusCode: 200, + Body: "hello, dog!", + }, nil +} + +func main() { + lambda.Start(ddlambda.WrapHandler(handleRequest, nil)) +} diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/input_events/api-gateway-get.json b/contrib/aws/datadog-lambda-go/test/integration_tests/input_events/api-gateway-get.json new file mode 100644 index 0000000000..496553dee9 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/input_events/api-gateway-get.json @@ -0,0 +1,55 @@ +{ + "path": "/test/hello", + "headers": { + "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", + "Accept-Encoding": "gzip, deflate, lzma, sdch, br", + "Accept-Language": "en-US,en;q=0.8", + "CloudFront-Forwarded-Proto": "https", + "CloudFront-Is-Desktop-Viewer": "true", + "CloudFront-Is-Mobile-Viewer": "false", + "CloudFront-Is-SmartTV-Viewer": "false", + "CloudFront-Is-Tablet-Viewer": "false", + "CloudFront-Viewer-Country": "US", + "Host": "wt6mne2s9k.execute-api.us-west-2.amazonaws.com", + "Upgrade-Insecure-Requests": "1", + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", + "Via": "1.1 fb7cca60f0ecd82ce07790c9c5eef16c.cloudfront.net (CloudFront)", + "X-Amz-Cf-Id": "nBsWBOrSHMgnaROZJK1wGCZ9PcRcSpq_oSXZNQwQ10OTZL4cimZo3g==", + "X-Forwarded-For": "192.168.100.1, 192.168.1.1", + "X-Forwarded-Port": "443", + "X-Forwarded-Proto": "https" + }, + "pathParameters": { + "proxy": "hello" + }, + "requestContext": { + "accountId": "123456789012", + "resourceId": "us4z18", + "stage": "test", + "requestId": "41b45ea3-70b5-11e6-b7bd-69b5aaebc7d9", + "identity": { + "cognitoIdentityPoolId": "", + "accountId": "", + "cognitoIdentityId": "", + "caller": "", + "apiKey": "", + "sourceIp": "192.168.100.1", + "cognitoAuthenticationType": "", + "cognitoAuthenticationProvider": "", + "userArn": "", + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48", + "user": "" + }, + "resourcePath": "/{proxy+}", + "httpMethod": "GET", + "apiId": "wt6mne2s9k" + }, + "resource": "/{proxy+}", + "httpMethod": "GET", + "queryStringParameters": { + "name": "me" + }, + "stageVariables": { + "stageVarName": "stageVarValue" + } +} diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/package.json b/contrib/aws/datadog-lambda-go/test/integration_tests/package.json new file mode 100644 index 0000000000..8372064182 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/package.json @@ -0,0 +1,4 @@ +{ + "name": "lambda-sample-go", + "version": "1.0.0" +} diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/parse-json.js b/contrib/aws/datadog-lambda-go/test/integration_tests/parse-json.js new file mode 100644 index 0000000000..29fa0d7c95 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/parse-json.js @@ -0,0 +1,17 @@ +'use strict' + +var readline = require('readline'); +var rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + terminal: false +}); + +rl.on('line', function(line){ + try { + const obj = JSON.parse(line) + console.log(JSON.stringify(obj, Object.keys(obj).sort(), 2)) + } catch (e) { + console.log(line) + } +}) diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/run_integration_tests.sh b/contrib/aws/datadog-lambda-go/test/integration_tests/run_integration_tests.sh new file mode 100755 index 0000000000..91ea9e28a5 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/run_integration_tests.sh @@ -0,0 +1,216 @@ +#!/bin/bash + +# Usage - run commands from the /integration_tests directory: +# To check if new changes to the library cause changes to any snapshots: +# DD_API_KEY=XXXX aws-vault exec sandbox-account-admin -- ./run_integration_tests.sh +# To regenerate snapshots: +# UPDATE_SNAPSHOTS=true DD_API_KEY=XXXX aws-vault exec sandbox-account-admin -- ./run_integration_tests.sh + +set -e + +# Disable deprecation warnings. +export SLS_DEPRECATION_DISABLE=* + +# These values need to be in sync with serverless.yml, where there needs to be a function +# defined for every handler_runtime combination +LAMBDA_HANDLERS=("hello" "error") + +LOGS_WAIT_SECONDS=20 + +integration_tests_dir=$(cd `dirname $0` && pwd) +echo $integration_tests_dir + +script_utc_start_time=$(date -u +"%Y%m%dT%H%M%S") + +mismatch_found=false + +if [ -z "$AWS_SECRET_ACCESS_KEY" ]; then + echo "No AWS credentials were found in the environment." + echo "Note that only Datadog employees can run these integration tests." + exit 1 +fi + +if [ -z "$DD_API_KEY" ]; then + echo "No DD_API_KEY env var set, exiting" + exit 1 +fi + +if [ -n "$UPDATE_SNAPSHOTS" ]; then + echo "Overwriting snapshots in this execution" +fi + +echo "Building Go binaries" +# Create build directories +mkdir -p build/hello build/error + +# Build each function +cd hello && GOWORK=off CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o ../build/hello/bootstrap && cd .. +cd error && GOWORK=off CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o ../build/error/bootstrap && cd .. + +# Create zip files +zip -j build/hello.zip build/hello/bootstrap +zip -j build/error.zip build/error/bootstrap + +# Generate a random 8-character ID to avoid collisions with other runs +run_id=$(xxd -l 4 -c 4 -p < /dev/random) + +# Always remove the stack before exiting, no matter what +function remove_stack() { + echo "Removing functions" + serverless remove --stage $run_id +} +trap remove_stack EXIT + +sls --version + +echo "Deploying functions" +sls deploy --stage $run_id + +cd $integration_tests_dir + +input_event_files=$(ls ./input_events) +# Sort event files by name so that snapshots stay consistent +input_event_files=($(for file_name in ${input_event_files[@]}; do echo $file_name; done | sort)) + +echo "Invoking functions" +set +e # Don't exit this script if an invocation fails or there's a diff +for input_event_file in "${input_event_files[@]}"; do + for function_name in "${LAMBDA_HANDLERS[@]}"; do + # Get event name without trailing ".json" so we can build the snapshot file name + input_event_name=$(echo "$input_event_file" | sed "s/.json//") + # Return value snapshot file format is snapshots/return_values/{handler}_{runtime}_{input-event} + snapshot_path="$integration_tests_dir/snapshots/return_values/${function_name}_${input_event_name}.json" + + return_value=$(DD_API_KEY=$DD_API_KEY sls invoke --stage $run_id -f $function_name --path "$integration_tests_dir/input_events/$input_event_file") + sls_invoke_exit_code=$? + if [ $sls_invoke_exit_code -ne 0 ]; then + return_value="Invocation failed" + fi + + if [ ! -f $snapshot_path ]; then + # If the snapshot file doesn't exist yet, we create it + echo "Writing return value to $snapshot_path because no snapshot exists yet" + echo "$return_value" >$snapshot_path + elif [ -n "$UPDATE_SNAPSHOTS" ]; then + # If $UPDATE_SNAPSHOTS is set to true, write the new logs over the current snapshot + echo "Overwriting return value snapshot for $snapshot_path" + echo "$return_value" >$snapshot_path + else + # Compare new return value to snapshot + diff_output=$(echo "$return_value" | diff - $snapshot_path) + if [ $? -eq 1 ]; then + echo "Failed: Return value for $function_name does not match snapshot:" + echo "$diff_output" + mismatch_found=true + else + echo "Ok: Return value for $function_name with $input_event_name event matches snapshot" + fi + fi + done +done +set -e + +echo "Sleeping $LOGS_WAIT_SECONDS seconds to wait for logs to appear in CloudWatch..." +sleep $LOGS_WAIT_SECONDS + +set +e # Don't exit this script if there is a diff or the logs endpoint fails +echo "Fetching logs for invocations and comparing to snapshots" +for function_name in "${LAMBDA_HANDLERS[@]}"; do + function_snapshot_path="./snapshots/logs/$function_name.log" + + # Fetch logs with serverless cli, retrying to avoid AWS account-wide rate limit error + retry_counter=0 + while [ $retry_counter -lt 10 ]; do + raw_logs=$(serverless logs -f $function_name --stage $run_id --startTime $script_utc_start_time) + fetch_logs_exit_code=$? + if [ $fetch_logs_exit_code -eq 1 ]; then + echo "Retrying fetch logs for $function_name..." + retry_counter=$(($retry_counter + 1)) + sleep 10 + continue + fi + break + done + + if [ $retry_counter -eq 9 ]; then + echo "FAILURE: Could not retrieve logs for $function_name" + echo "Error from final attempt to retrieve logs:" + echo $raw_logs + + exit 1 + fi + + # Replace invocation-specific data like timestamps and IDs with XXXX to normalize logs across executions + logs=$( + echo "$raw_logs" | + node parse-json.js | + # Remove serverless cli errors + sed '/Serverless: Recoverable error occurred/d' | + # Remove dd-trace-go logs + sed '/Datadog Tracer/d' | + # Normalize Lambda runtime report logs + perl -p -e 's/(RequestId|TraceId|init|SegmentId|Duration|Memory Used|"e"):( )?[a-z0-9\.\-]+/\1:\2XXXX/g' | + # Normalize DD APM headers and AWS account ID + perl -p -e "s/(span_id=|trace_id=|account_id:) ?[0-9a-f]+/\1XXXX/g" | + # Strip API key from logged requests + perl -p -e "s/(api_key=|'api_key': ')[a-z0-9\.\-]+/\1XXXX/g" | + # Normalize ISO combined date-time + perl -p -e "s/[0-9]{4}\-[0-9]{2}\-[0-9]{2}(T?)[0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+ \(\-?[0-9:]+\))?Z/XXXX-XX-XXTXX:XX:XX.XXXZ/" | + # Normalize log timestamps + perl -p -e "s/[0-9]{4}(\-|\/)[0-9]{2}(\-|\/)[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+( \(\-?[0-9:]+\))?)?/XXXX-XX-XX XX:XX:XX.XXX/" | + # Normalize DD trace ID injection + perl -p -e "s/(dd\.trace_id=)[0-9]+ (dd\.span_id=)[0-9]+/\1XXXX \2XXXX/" | + # Normalize execution ID in logs prefix + perl -p -e $'s/[0-9a-z]+\-[0-9a-z]+\-[0-9a-z]+\-[0-9a-z]+\-[0-9a-z]+\t/XXXX-XXXX-XXXX-XXXX-XXXX\t/' | + # Normalize layer version tag + perl -p -e "s/(dd_lambda_layer:datadog-go)[0-9]+\.[0-9]+\.[0-9]+/\1X\.X\.X/g" | + # Normalize package version tag + perl -p -e "s/(datadog_lambda:v)[0-9]+\.[0-9]+\.[0-9]+(-dev)?/\1X\.X\.X/g" | + # Normalize golang version tag + perl -p -e "s/(go)[0-9]+\.[0-9]+\.[0-9]+/\1X\.X\.X/g" | + # Normalize data in logged traces + perl -p -e 's/"(span_id|apiid|runtime-id|record_ids|parent_id|trace_id|start|duration|tcp\.local\.address|tcp\.local\.port|dns\.address|request_id|function_arn|x-datadog-trace-id|x-datadog-parent-id|datadog_lambda|dd_trace)":\ ("?)[a-zA-Z0-9\.:\-]+("?)/"\1":\2XXXX\3/g' | + # Remove metrics and metas in logged traces (their order is inconsistent) + perl -p -e 's/"(meta|metrics)":{(.*?)}/"\1":{"XXXX": "XXXX"}/g' | + # Strip out run ID (from function name, resource, etc.) + perl -p -e "s/$run_id/XXXX/g" | + # Normalize data in logged metrics + perl -p -e 's/"(points\\\":\[\[)([0-9]+)/\1XXXX/g' | + # Remove INIT_START log + perl -p -e "s/INIT_START.*//g" + ) + + if [ ! -f $function_snapshot_path ]; then + # If no snapshot file exists yet, we create one + echo "Writing logs to $function_snapshot_path because no snapshot exists yet" + echo "$logs" >$function_snapshot_path + elif [ -n "$UPDATE_SNAPSHOTS" ]; then + # If $UPDATE_SNAPSHOTS is set to true write the new logs over the current snapshot + echo "Overwriting log snapshot for $function_snapshot_path" + echo "$logs" >$function_snapshot_path + else + # Compare new logs to snapshots + diff_output=$(echo "$logs" | diff - $function_snapshot_path) + if [ $? -eq 1 ]; then + echo "Failed: Mismatch found between new $function_name logs (first) and snapshot (second):" + echo "$diff_output" + mismatch_found=true + else + echo "Ok: New logs for $function_name match snapshot" + fi + fi +done +set -e + +if [ "$mismatch_found" = true ]; then + echo "FAILURE: A mismatch between new data and a snapshot was found and printed above." + echo "If the change is expected, generate new snapshots by running 'UPDATE_SNAPSHOTS=true DD_API_KEY=XXXX ./run_integration_tests.sh'" + exit 1 +fi + +if [ -n "$UPDATE_SNAPSHOTS" ]; then + echo "SUCCESS: Wrote new snapshots for all functions" + exit 0 +fi + +echo "SUCCESS: No difference found between snapshots and new return values or logs" diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/serverless.yml b/contrib/aws/datadog-lambda-go/test/integration_tests/serverless.yml new file mode 100644 index 0000000000..f5a9157d73 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/serverless.yml @@ -0,0 +1,37 @@ +# IAM permissions require service name to begin with 'integration-tests' +service: integration-tests-go + +package: + individually: true # <- package each function individually, to prevent file name conflicts + +provider: + name: aws + region: eu-west-1 + tracing: + lambda: true + apiGateway: true + memorySize: 128 + timeout: 30 + environment: + DD_API_KEY: ${env:DD_API_KEY} + DD_LOG_LEVEL: DEBUG + DD_INTEGRATION_TEST: true + DD_ENHANCED_METRICS: true + DD_TRACE_ENABLED: true + deploymentBucket: + name: integration-tests-serververless-deployment-bucket + iam: + # IAM permissions require that all functions are deployed with this role + role: "arn:aws:iam::425362996713:role/serverless-integration-test-lambda-role" + +functions: + hello: + runtime: provided.al2 + handler: bootstrap + package: + artifact: build/hello.zip + error: + runtime: provided.al2 + handler: bootstrap + package: + artifact: build/error.zip diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/logs/error.log b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/logs/error.log new file mode 100644 index 0000000000..df2ab2b609 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/logs/error.log @@ -0,0 +1,46 @@ + +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Will use the API"} +START +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Merge X-Ray Traces is off, using trace context from Datadog only"} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Could not convert TraceContext to a SpanContext (most likely TraceContext was empty)"} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: sending metric via log forwarder"} +{ + "e": XXXX, + "m": "aws.lambda.enhanced.invocations", + "t": [ + "functionname:integration-tests-go-XXXX-error", + "region:eu-west-1", + "account_id:XXXX", + "memorysize:128", + "cold_start:true", + "datadog_lambda:vX.X.X", + "resource:integration-tests-go-XXXX-error", + "dd_lambda_layer:datadog-goX.X.X" + ], + "v": 1 +} +{ + "traces": [ + [ + {} + ] + ] +} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: sending metric via log forwarder"} +{ + "e": XXXX, + "m": "aws.lambda.enhanced.errors", + "t": [ + "functionname:integration-tests-go-XXXX-error", + "region:eu-west-1", + "account_id:XXXX", + "memorysize:128", + "cold_start:true", + "datadog_lambda:vX.X.X", + "resource:integration-tests-go-XXXX-error", + "dd_lambda_layer:datadog-goX.X.X" + ], + "v": 1 +} +XXXX-XX-XX XX:XX:XX.XXX {"errorMessage":"something went wrong","errorType":"errorString"} +END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/logs/hello.log b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/logs/hello.log new file mode 100644 index 0000000000..e17f7ddd3d --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/logs/hello.log @@ -0,0 +1,45 @@ + +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Will use the API"} +START +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Merge X-Ray Traces is off, using trace context from Datadog only"} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Could not convert TraceContext to a SpanContext (most likely TraceContext was empty)"} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: sending metric via log forwarder"} +{ + "e": XXXX, + "m": "aws.lambda.enhanced.invocations", + "t": [ + "functionname:integration-tests-go-XXXX-hello", + "region:eu-west-1", + "account_id:XXXX", + "memorysize:128", + "cold_start:true", + "datadog_lambda:vX.X.X", + "resource:integration-tests-go-XXXX-hello", + "dd_lambda_layer:datadog-goX.X.X" + ], + "v": 1 +} +XXXX-XX-XX XX:XX:XX.XXX INFO Current span span_id=XXXX +XXXX-XX-XX XX:XX:XX.XXX INFO Current trace trace_id=XXXX +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: adding metric \"hello-go.dog\", with value 1.000000"} +{ + "traces": [ + [ + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {}, + {} + ] + ] +} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: posting to url https://api.datadoghq.com/api/v1/distribution_points"} +XXXX-XX-XX XX:XX:XX.XXX {"status":"debug","message":"datadog: Sending payload with body {\"series\":[{\"metric\":\"hello-go.dog\",\"tags\":[\"dd_lambda_layer:datadog-goX.X.X\"],\"type\":\"distribution\",\points\":[[XXXX,[1]]]}]}"} +END Duration: XXXX ms (init: XXXX ms) Memory Used: XXXX MB diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/return_values/error_api-gateway-get.json b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/return_values/error_api-gateway-get.json new file mode 100644 index 0000000000..7147cafa92 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/return_values/error_api-gateway-get.json @@ -0,0 +1 @@ +Invocation failed diff --git a/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/return_values/hello_api-gateway-get.json b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/return_values/hello_api-gateway-get.json new file mode 100644 index 0000000000..61a0287540 --- /dev/null +++ b/contrib/aws/datadog-lambda-go/test/integration_tests/snapshots/return_values/hello_api-gateway-get.json @@ -0,0 +1,6 @@ +{ + "statusCode": 200, + "headers": null, + "multiValueHeaders": null, + "body": "hello, dog!" +} diff --git a/contrib/bradfitz/gomemcache/go.mod b/contrib/bradfitz/gomemcache/go.mod new file mode 100644 index 0000000000..552dec9c48 --- /dev/null +++ b/contrib/bradfitz/gomemcache/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/bradfitz/gomemcache/go.sum b/contrib/bradfitz/gomemcache/go.sum new file mode 100644 index 0000000000..54baa443c8 --- /dev/null +++ b/contrib/bradfitz/gomemcache/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 h1:Dr+ezPI5ivhMn/3WOoB86XzMhie146DNaBbhaQWZHMY= +github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/bradfitz/gomemcache/memcache/example_test.go b/contrib/bradfitz/gomemcache/memcache/example_test.go index 76e7d7347d..39f3269739 100644 --- a/contrib/bradfitz/gomemcache/memcache/example_test.go +++ b/contrib/bradfitz/gomemcache/memcache/example_test.go @@ -8,13 +8,16 @@ package memcache_test import ( "context" - memcachetrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/bradfitz/gomemcache/memcache" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + memcachetrace "github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2/memcache" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/bradfitz/gomemcache/memcache" ) func Example() { + tracer.Start() + defer tracer.Stop() + span, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", tracer.ServiceName("web"), tracer.ResourceName("/home"), diff --git a/contrib/bradfitz/gomemcache/memcache/memcache.go b/contrib/bradfitz/gomemcache/memcache/memcache.go index 106a9255f3..db0a908ca6 100644 --- a/contrib/bradfitz/gomemcache/memcache/memcache.go +++ b/contrib/bradfitz/gomemcache/memcache/memcache.go @@ -9,26 +9,25 @@ // the same methods, so should be seamless for existing applications. It also // has an additional `WithContext` method which can be used to connect a span // to an existing trace. -package memcache // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/bradfitz/gomemcache/memcache" +package memcache // import "github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2/memcache" import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/bradfitz/gomemcache/memcache" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "bradfitz/gomemcache/memcache" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/bradfitz/gomemcache") + instr = instrumentation.Load(instrumentation.PackageBradfitzGoMemcache) } // WrapClient wraps a memcache.Client so that all requests are traced using the @@ -37,9 +36,9 @@ func WrapClient(client *memcache.Client, opts ...ClientOption) *Client { cfg := new(clientConfig) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/bradfitz/gomemcache/memcache: Wrapping Client: %#v", cfg) + instr.Logger().Debug("contrib/bradfitz/gomemcache/memcache: Wrapping Client: %#v", cfg) return &Client{ Client: client, cfg: cfg, @@ -72,8 +71,8 @@ func (c *Client) WithContext(ctx context.Context) *Client { } // startSpan starts a span from the context set with WithContext. -func (c *Client) startSpan(resourceName string) ddtrace.Span { - opts := []ddtrace.StartSpanOption{ +func (c *Client) startSpan(resourceName string) *tracer.Span { + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeMemcached), tracer.ServiceName(c.cfg.serviceName), tracer.ResourceName(resourceName), diff --git a/contrib/bradfitz/gomemcache/memcache/memcache_test.go b/contrib/bradfitz/gomemcache/memcache/memcache_test.go index ee6ed368c7..371e3b5ae3 100644 --- a/contrib/bradfitz/gomemcache/memcache/memcache_test.go +++ b/contrib/bradfitz/gomemcache/memcache/memcache_test.go @@ -15,15 +15,13 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "github.com/bradfitz/gomemcache/memcache" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestMemcache(t *testing.T) { @@ -42,10 +40,10 @@ func TestMemcacheIntegration(t *testing.T) { } func testMemcache(t *testing.T, addr string) { - client := getClient(addr, WithServiceName("test-memcache")) + client := getClient(addr, WithService("test-memcache")) defer client.DeleteAll() - validateMemcacheSpan := func(t *testing.T, span mocktracer.Span, resourceName string) { + validateMemcacheSpan := func(t *testing.T, span *mocktracer.Span, resourceName string) { assert.Equal(t, "test-memcache", span.Tag(ext.ServiceName), "service name should be set to test-memcache") assert.Equal(t, "memcached.query", span.OperationName(), @@ -54,6 +52,8 @@ func testMemcache(t *testing.T, addr string) { "resource name should be set to the memcache command") assert.Equal(t, "bradfitz/gomemcache/memcache", span.Tag(ext.Component), "component should be set to gomemcache") + assert.Equal(t, componentName, span.Integration(), + "source should be set to gomemcache") assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind), "span.kind should be set to client") assert.Equal(t, "memcached", span.Tag(ext.DBSystem), @@ -96,7 +96,7 @@ func testMemcache(t *testing.T, addr string) { spans := mt.FinishedSpans() assert.Len(t, spans, 2) validateMemcacheSpan(t, spans[0], "Add") - assert.Equal(t, span, spans[1]) + assert.Equal(t, span, spans[1].Unwrap()) assert.Equal(t, spans[1].TraceID(), spans[0].TraceID(), "memcache span should be part of the parent trace") }) @@ -145,10 +145,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -170,53 +167,11 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } -func TestNamingSchema(t *testing.T) { - li := makeFakeServer(t) - defer li.Close() - addr := li.Addr().String() - - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - client := getClient(addr, opts...) - defer client.DeleteAll() - err := client.Add(&memcache.Item{Key: "key1", Value: []byte("value1")}) - require.NoError(t, err) - - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - return spans - } - assertV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "memcached.query", spans[0].OperationName()) - } - assertV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "memcached.command", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"memcached"}, - WithDDService: []string{"memcached"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("service name", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("operation name", namingschematest.NewSpanNameTest(genSpans, assertV0, assertV1)) -} - func makeFakeServer(t *testing.T) net.Listener { li, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { diff --git a/contrib/bradfitz/gomemcache/memcache/option.go b/contrib/bradfitz/gomemcache/memcache/option.go index 77bc9f3dc7..061aaf73d1 100644 --- a/contrib/bradfitz/gomemcache/memcache/option.go +++ b/contrib/bradfitz/gomemcache/memcache/option.go @@ -8,12 +8,7 @@ package memcache import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -const ( - defaultServiceName = "memcached" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) type clientConfig struct { @@ -22,30 +17,33 @@ type clientConfig struct { analyticsRate float64 } -// ClientOption represents an option that can be passed to Dial. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Memcache integration. +type ClientOption interface { + apply(*clientConfig) +} -func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.operationName = namingschema.OpName(namingschema.MemcachedOutbound) +// ClientOptionFn represents options applicable to WrapClient. +type ClientOptionFn func(*clientConfig) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_MEMCACHE_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} + +func defaults(cfg *clientConfig) { + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.operationName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the dialled connection. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the dialled connection. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -57,7 +55,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/cloud.google.com/go/pubsub.v1/example_test.go b/contrib/cloud.google.com/go/pubsub.v1/example_test.go index 8f7798e9c2..7961df24c6 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/example_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/example_test.go @@ -9,9 +9,9 @@ import ( "context" "log" - pubsubtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/cloud.google.com/go/pubsub.v1" - "cloud.google.com/go/pubsub" + + pubsubtrace "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2" ) func ExamplePublish() { @@ -34,7 +34,7 @@ func ExampleSubscription_Receive() { } sub := client.Subscription("subscription") - err = sub.Receive(context.Background(), pubsubtrace.WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + err = sub.Receive(context.Background(), pubsubtrace.WrapReceiveHandler(sub, func(_ context.Context, _ *pubsub.Message) { // TODO: Handle message. })) if err != nil { diff --git a/contrib/cloud.google.com/go/pubsub.v1/go.mod b/contrib/cloud.google.com/go/pubsub.v1/go.mod new file mode 100644 index 0000000000..c645b861b9 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v1/go.mod @@ -0,0 +1,112 @@ +module github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 + +go 1.24.0 + +require ( + cloud.google.com/go/pubsub v1.37.0 + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + google.golang.org/api v0.169.0 + google.golang.org/grpc v1.75.0 +) + +require ( + cloud.google.com/go v0.112.1 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.1.7 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.einride.tech/aip v0.66.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../../.. diff --git a/contrib/cloud.google.com/go/pubsub.v1/go.sum b/contrib/cloud.google.com/go/pubsub.v1/go.sum new file mode 100644 index 0000000000..34c4b0b2e9 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v1/go.sum @@ -0,0 +1,416 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= +cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= +cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= +cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= +cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= +cloud.google.com/go/pubsub v1.37.0 h1:0uEEfaB1VIJzabPpwpZf44zWAKAme3zwKKxHk7vJQxQ= +cloud.google.com/go/pubsub v1.37.0/go.mod h1:YQOQr1uiUM092EXwKs56OPT650nwnawc+8/IjoUeGzQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= +go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa h1:ePqxpG3LVx+feAUOx8YmR5T7rc0rdzK8DyxM8cQ9zq0= +google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:CnZenrTdRJb7jc+jOm0Rkywq+9wh0QC4U8tyiRbEPPM= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/cloud.google.com/go/pubsub.v1/internal/tracing/config.go b/contrib/cloud.google.com/go/pubsub.v1/internal/tracing/config.go deleted file mode 100644 index b5b04b19a8..0000000000 --- a/contrib/cloud.google.com/go/pubsub.v1/internal/tracing/config.go +++ /dev/null @@ -1,43 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2024 Datadog, Inc. - -package tracing - -import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -type config struct { - serviceName string - publishSpanName string - receiveSpanName string - measured bool -} - -func defaultConfig() *config { - return &config{ - serviceName: namingschema.ServiceNameOverrideV0("", ""), - publishSpanName: namingschema.OpName(namingschema.GCPPubSubOutbound), - receiveSpanName: namingschema.OpName(namingschema.GCPPubSubInbound), - measured: false, - } -} - -// Option is used to customize spans started by WrapReceiveHandler or Publish. -type Option func(cfg *config) - -// WithServiceName sets the service name tag for traces started by WrapReceiveHandler or Publish. -func WithServiceName(serviceName string) Option { - return func(cfg *config) { - cfg.serviceName = serviceName - } -} - -// WithMeasured sets the measured tag for traces started by WrapReceiveHandler or Publish. -func WithMeasured() Option { - return func(cfg *config) { - cfg.measured = true - } -} diff --git a/contrib/cloud.google.com/go/pubsub.v1/option.go b/contrib/cloud.google.com/go/pubsub.v1/option.go index 3820859a12..262ca5173f 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/option.go +++ b/contrib/cloud.google.com/go/pubsub.v1/option.go @@ -5,18 +5,20 @@ package pubsub -import ( - "gopkg.in/DataDog/dd-trace-go.v1/contrib/cloud.google.com/go/pubsub.v1/internal/tracing" -) +import "github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace" -// Option is used to customize spans started by WrapReceiveHandler or Publish. -type Option = tracing.Option +// Option describes options for the Pub/Sub integration. +type Option = pubsubtrace.Option -// Deprecated: ReceiveOption has been deprecated in favor of Option. -type ReceiveOption = Option +// OptionFn represents options applicable to WrapReceiveHandler or Publish. +type OptionFn = pubsubtrace.OptionFn -// WithServiceName sets the service name tag for traces started by WrapReceiveHandler or Publish. -var WithServiceName = tracing.WithServiceName +// WithService sets the service name tag for traces started by WrapReceiveHandler or Publish. +func WithService(serviceName string) Option { + return pubsubtrace.WithService(serviceName) +} // WithMeasured sets the measured tag for traces started by WrapReceiveHandler or Publish. -var WithMeasured = tracing.WithMeasured +func WithMeasured() Option { + return pubsubtrace.WithMeasured() +} diff --git a/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml new file mode 100644 index 0000000000..55790ac394 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v1/orchestrion.yml @@ -0,0 +1,95 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 + description: Package pubsub provides an easy way to publish and receive Google Cloud Pub/Sub messages, hiding the details of the underlying server RPCs + +aspects: + - id: Initialize pubsubtrace + join-point: + struct-definition: cloud.google.com/go/pubsub.Subscription + advice: + - inject-declarations: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 + template: |- + var ( + __dd_instr *instrumentation.Instrumentation + __dd_pstrace *pubsubtrace.Tracer + ) + + func init() { + component := instrumentation.PackageGCPPubsub + __dd_instr = instrumentation.Load(component) + __dd_pstrace = pubsubtrace.NewTracer(__dd_instr, component) + } + + ## Trace Receive ## + - id: Subscription.Receive + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub.Subscription' + - name: Receive + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $subscription := .Function.Receiver -}} + {{- $handler := .Function.Argument 1 -}} + __dd_traceFn := __dd_pstrace.TraceReceiveFunc({{ $subscription }}) + __dd_wrapHandler := func(h func(ctx context.Context, msg *Message)) func(ctx context.Context, msg *Message) { + return func(ctx context.Context, msg *Message) { + __dd_traceMsg := &pubsubtrace.Message{ + ID: msg.ID, + Data: msg.Data, + OrderingKey: msg.OrderingKey, + Attributes: msg.Attributes, + DeliveryAttempt: msg.DeliveryAttempt, + PublishTime: msg.PublishTime, + } + ctx, closeSpan := __dd_traceFn(ctx, __dd_traceMsg) + defer closeSpan() + h(ctx, msg) + } + } + {{ $handler }} = __dd_wrapHandler({{ $handler }}) + + ## Trace Publish ## + - id: Topic.Publish + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub.Topic' + - name: Publish + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $topic := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msg := .Function.Argument 1 -}} + {{- $publishResult := .Function.Result 0 -}} + __dd_traceMsg := &pubsubtrace.Message{ + ID: {{ $msg }}.ID, + Data: {{ $msg }}.Data, + OrderingKey: {{ $msg }}.OrderingKey, + Attributes: {{ $msg }}.Attributes, + DeliveryAttempt: {{ $msg }}.DeliveryAttempt, + PublishTime: {{ $msg }}.PublishTime, + } + __dd_ctx, __dd_closeSpan := __dd_pstrace.TracePublish({{ $ctx }}, {{ $topic }}, __dd_traceMsg) + {{ $ctx }} = __dd_ctx + {{ $msg }}.Attributes = __dd_traceMsg.Attributes + + defer func() { + {{ $publishResult }}.DDCloseSpan = __dd_closeSpan + }() diff --git a/contrib/cloud.google.com/go/pubsub.v1/pubsub.go b/contrib/cloud.google.com/go/pubsub.v1/pubsub.go index 1f01965090..96ad71b7cc 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/pubsub.go +++ b/contrib/cloud.google.com/go/pubsub.v1/pubsub.go @@ -9,11 +9,24 @@ package pubsub import ( "context" + "github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "cloud.google.com/go/pubsub" +) + +const componentName = instrumentation.PackageGCPPubsub - "gopkg.in/DataDog/dd-trace-go.v1/contrib/cloud.google.com/go/pubsub.v1/internal/tracing" +var ( + instr *instrumentation.Instrumentation + pstrace *pubsubtrace.Tracer ) +func init() { + instr = instrumentation.Load(componentName) + pstrace = pubsubtrace.NewTracer(instr, componentName) +} + // Publish publishes a message on the specified topic and returns a PublishResult. // This function is functionally equivalent to t.Publish(ctx, msg), but it also starts a publish // span and it ensures that the tracing metadata is propagated as attributes attached to @@ -22,7 +35,7 @@ import ( // the span. func Publish(ctx context.Context, t *pubsub.Topic, msg *pubsub.Message, opts ...Option) *PublishResult { traceMsg := newTraceMessage(msg) - ctx, closeSpan := tracing.TracePublish(ctx, t, traceMsg, opts...) + ctx, closeSpan := pstrace.TracePublish(ctx, t, traceMsg, opts...) msg.Attributes = traceMsg.Attributes return &PublishResult{ @@ -49,7 +62,7 @@ func (r *PublishResult) Get(ctx context.Context) (string, error) { // extracts any tracing metadata attached to the received message, and starts a // receive span. func WrapReceiveHandler(s *pubsub.Subscription, f func(context.Context, *pubsub.Message), opts ...Option) func(context.Context, *pubsub.Message) { - traceFn := tracing.TraceReceiveFunc(s, opts...) + traceFn := pstrace.TraceReceiveFunc(s, opts...) return func(ctx context.Context, msg *pubsub.Message) { ctx, closeSpan := traceFn(ctx, newTraceMessage(msg)) defer closeSpan() @@ -57,11 +70,11 @@ func WrapReceiveHandler(s *pubsub.Subscription, f func(context.Context, *pubsub. } } -func newTraceMessage(msg *pubsub.Message) *tracing.Message { +func newTraceMessage(msg *pubsub.Message) *pubsubtrace.Message { if msg == nil { return nil } - return &tracing.Message{ + return &pubsubtrace.Message{ ID: msg.ID, Data: msg.Data, OrderingKey: msg.OrderingKey, diff --git a/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go index 2715bb4307..ef452aa1c5 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go +++ b/contrib/cloud.google.com/go/pubsub.v1/pubsub_test.go @@ -7,22 +7,25 @@ package pubsub import ( "context" + "encoding/binary" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "cloud.google.com/go/pubsub" "cloud.google.com/go/pubsub/pstest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/api/option" "google.golang.org/grpc" ) +func lowerEqual(t *testing.T, id uint64, tid [16]byte) { + assert.Equal(t, id, binary.BigEndian.Uint64(tid[8:])) +} + func TestPropagation(t *testing.T) { assert := assert.New(t) ctx, cancel, mt, topic, sub := setup(t) @@ -45,7 +48,7 @@ func TestPropagation(t *testing.T) { assert.Equal(msg.Data, []byte("hello"), "wrong payload") span, ok := tracer.SpanFromContext(ctx) assert.True(ok, "no span") - assert.Equal(uint64(42), span.Context().TraceID(), "wrong trace id") // gist of the test: the trace ID must be the same as the root trace ID set above + lowerEqual(t, 42, span.Context().TraceIDBytes()) msgID = msg.ID spanID = span.Context().SpanID() pubTime = msg.PublishTime.String() @@ -64,25 +67,27 @@ func TestPropagation(t *testing.T) { assert.Equal(spans[1].SpanID(), spans[0].ParentID()) assert.Equal(uint64(42), spans[0].TraceID()) - assert.Equal(map[string]interface{}{ - "message_size": 5, - "num_attributes": 2, // 2 tracing attributes + assert.Subset(filterTags(spans[0].Tags()), map[string]interface{}{ + "message_size": float64(5), + "num_attributes": float64(5), "ordering_key": "xxx", ext.ResourceName: "projects/project/topics/topic", ext.SpanType: ext.SpanTypeMessageProducer, "server_id": srvID, - ext.ServiceName: nil, + ext.ServiceName: "", ext.Component: "cloud.google.com/go/pubsub.v1", ext.SpanKind: ext.SpanKindProducer, ext.MessagingSystem: "googlepubsub", + ext.SpanName: "pubsub.publish", }, spans[0].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) assert.Equal(spans[0].SpanID(), spans[2].ParentID()) assert.Equal(uint64(42), spans[2].TraceID()) assert.Equal(spanID, spans[2].SpanID()) - assert.Equal(map[string]interface{}{ - "message_size": 5, - "num_attributes": 2, + assert.Subset(filterTags(spans[2].Tags()), map[string]interface{}{ + "message_size": float64(5), + "num_attributes": float64(5), "ordering_key": "xxx", ext.ResourceName: "projects/project/subscriptions/subscription", ext.SpanType: ext.SpanTypeMessageConsumer, @@ -91,7 +96,10 @@ func TestPropagation(t *testing.T) { ext.Component: "cloud.google.com/go/pubsub.v1", ext.SpanKind: ext.SpanKindConsumer, ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[2].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v1", spans[2].Integration()) } func TestPropagationWithServiceName(t *testing.T) { @@ -105,10 +113,10 @@ func TestPropagationWithServiceName(t *testing.T) { span.Finish() // Subscriber - err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(_ context.Context, msg *pubsub.Message) { msg.Ack() cancel() - }, WithServiceName("example.service"))) + }, WithService("example.service"))) assert.NoError(err) spans := mt.FinishedSpans() @@ -129,7 +137,7 @@ func TestPropagationNoParentSpan(t *testing.T) { var ( msgID string spanID uint64 - traceID uint64 + traceID string pubTime string called bool ) @@ -155,10 +163,10 @@ func TestPropagationNoParentSpan(t *testing.T) { assert.Equal("pubsub.receive", spans[1].OperationName()) assert.Equal(spans[0].TraceID(), spans[0].SpanID()) - assert.Equal(traceID, spans[0].TraceID()) - assert.Equal(map[string]interface{}{ - "message_size": 5, - "num_attributes": 2, + assert.Equal(traceID, spans[0].Context().TraceID()) + assert.Subset(filterTags(spans[0].Tags()), map[string]interface{}{ + "message_size": float64(5), + "num_attributes": float64(5), "ordering_key": "xxx", ext.ResourceName: "projects/project/topics/topic", ext.SpanType: ext.SpanTypeMessageProducer, @@ -166,14 +174,17 @@ func TestPropagationNoParentSpan(t *testing.T) { ext.Component: "cloud.google.com/go/pubsub.v1", ext.SpanKind: ext.SpanKindProducer, ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.publish", }, spans[0].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) assert.Equal(spans[0].SpanID(), spans[1].ParentID()) - assert.Equal(traceID, spans[1].TraceID()) + assert.Equal(traceID, spans[1].Context().TraceID()) assert.Equal(spanID, spans[1].SpanID()) - assert.Equal(map[string]interface{}{ - "message_size": 5, - "num_attributes": 2, + assert.Subset(filterTags(spans[1].Tags()), map[string]interface{}{ + "message_size": float64(5), + "num_attributes": float64(5), "ordering_key": "xxx", ext.ResourceName: "projects/project/subscriptions/subscription", ext.SpanType: ext.SpanTypeMessageConsumer, @@ -182,7 +193,10 @@ func TestPropagationNoParentSpan(t *testing.T) { ext.Component: "cloud.google.com/go/pubsub.v1", ext.SpanKind: ext.SpanKindConsumer, ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[1].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v1", spans[1].Integration()) } func TestPropagationNoPublisherSpan(t *testing.T) { @@ -198,7 +212,7 @@ func TestPropagationNoPublisherSpan(t *testing.T) { var ( msgID string spanID uint64 - traceID uint64 + traceID string pubTime string called bool ) @@ -222,11 +236,11 @@ func TestPropagationNoPublisherSpan(t *testing.T) { assert.Len(spans, 1, "wrong number of spans") assert.Equal("pubsub.receive", spans[0].OperationName()) - assert.Equal(traceID, spans[0].TraceID()) + assert.Equal(traceID, spans[0].Context().TraceID()) assert.Equal(spanID, spans[0].SpanID()) - assert.Equal(map[string]interface{}{ - "message_size": 5, - "num_attributes": 0, // no attributes, since no publish middleware sent them + assert.Subset(filterTags(spans[0].Tags()), map[string]interface{}{ + "message_size": float64(5), + "num_attributes": float64(0), // no attributes, since no publish middleware sent them "ordering_key": "xxx", ext.ResourceName: "projects/project/subscriptions/subscription", ext.SpanType: ext.SpanTypeMessageConsumer, @@ -235,46 +249,20 @@ func TestPropagationNoPublisherSpan(t *testing.T) { ext.Component: "cloud.google.com/go/pubsub.v1", ext.SpanKind: ext.SpanKindConsumer, ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", }, spans[0].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v1", spans[0].Integration()) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - ctx, cancel, mt, topic, sub := setup(t) - - _, err := Publish(ctx, topic, &pubsub.Message{Data: []byte("hello"), OrderingKey: "xxx"}, opts...).Get(ctx) - require.NoError(t, err) - - err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { - msg.Ack() - cancel() - }, opts...)) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "pubsub.publish", spans[0].OperationName()) - assert.Equal(t, "pubsub.receive", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "gcp.pubsub.send", spans[0].OperationName()) - assert.Equal(t, "gcp.pubsub.process", spans[1].OperationName()) - } - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"", ""}, - WithDDService: []string{"", ""}, - WithDDServiceAndOverride: []string{serviceOverride, serviceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) +func filterTags(m map[string]interface{}) map[string]interface{} { + delete(m, "_dd.p.tid") + delete(m, "_dd.profiling.enabled") + delete(m, "_dd.top_level") + delete(m, "_sampling_priority_v1") + delete(m, "language") + delete(m, "tracestate") + return m } func setup(t *testing.T) (context.Context, context.CancelFunc, mocktracer.Tracer, *pubsub.Topic, *pubsub.Subscription) { diff --git a/contrib/cloud.google.com/go/pubsub.v2/example_test.go b/contrib/cloud.google.com/go/pubsub.v2/example_test.go new file mode 100644 index 0000000000..d13a2fad9b --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/example_test.go @@ -0,0 +1,43 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub_test + +import ( + "context" + "log" + + "cloud.google.com/go/pubsub/v2" + + pubsubtrace "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2" +) + +func ExamplePublish() { + client, err := pubsub.NewClient(context.Background(), "project-id") + if err != nil { + log.Fatal(err) + } + + publisher := client.Publisher("topic") + _, err = pubsubtrace.Publish(context.Background(), publisher, &pubsub.Message{Data: []byte("hello world!")}).Get(context.Background()) + if err != nil { + log.Fatal(err) + } +} + +func ExampleSubscriber_Receive() { + client, err := pubsub.NewClient(context.Background(), "project-id") + if err != nil { + log.Fatal(err) + } + + sub := client.Subscriber("subscription") + err = sub.Receive(context.Background(), pubsubtrace.WrapReceiveHandler(sub, func(_ context.Context, _ *pubsub.Message) { + // TODO: Handle message. + })) + if err != nil { + log.Fatal(err) + } +} diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.mod b/contrib/cloud.google.com/go/pubsub.v2/go.mod new file mode 100644 index 0000000000..081f81d17a --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/go.mod @@ -0,0 +1,113 @@ +module github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 + +go 1.24.0 + +require ( + cloud.google.com/go/pubsub/v2 v2.0.0 + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + google.golang.org/api v0.239.0 + google.golang.org/grpc v1.75.0 +) + +require ( + cloud.google.com/go v0.121.4 // indirect + cloud.google.com/go/auth v0.16.3 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.einride.tech/aip v0.73.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../../.. diff --git a/contrib/cloud.google.com/go/pubsub.v2/go.sum b/contrib/cloud.google.com/go/pubsub.v2/go.sum new file mode 100644 index 0000000000..3ccfcdb9ce --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/go.sum @@ -0,0 +1,418 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs= +cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s= +cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc= +cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps= +go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo= +google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 h1:btBcgujH2+KIWEfz0s7Cdtt9R7hpwM4SAEXAdXf/ddw= +google.golang.org/genproto v0.0.0-20250728155136-f173205681a0/go.mod h1:Q4yZQ3kmmIyg6HsMjCGx2vQ8gzN+dntaPmFWz6Zj0fo= +google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 h1:0UOBWO4dC+e51ui0NFKSPbkHHiQ4TmrEfEZMLDyRmY8= +google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0/go.mod h1:8ytArBbtOy2xfht+y2fqKd5DRDJRUQhqbyEnQ4bDChs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0 h1:MAKi5q709QWfnkkpNQ0M12hYJ1+e8qYVDyowc4U1XZM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250728155136-f173205681a0/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/cloud.google.com/go/pubsub.v2/option.go b/contrib/cloud.google.com/go/pubsub.v2/option.go new file mode 100644 index 0000000000..5bb04983a5 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/option.go @@ -0,0 +1,24 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub + +import "github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace" + +// Option describes options for the Pub/Sub integration. +type Option = pubsubtrace.Option + +// OptionFn represents options applicable to WrapReceiveHandler or Publish. +type OptionFn = pubsubtrace.OptionFn + +// WithService sets the service name tag for traces started by WrapReceiveHandler or Publish. +func WithService(serviceName string) Option { + return pubsubtrace.WithService(serviceName) +} + +// WithMeasured sets the measured tag for traces started by WrapReceiveHandler or Publish. +func WithMeasured() Option { + return pubsubtrace.WithMeasured() +} diff --git a/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml new file mode 100644 index 0000000000..e87a0f7906 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/orchestrion.yml @@ -0,0 +1,128 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 + description: Package pubsub provides an easy way to publish and receive Google Cloud Pub/Sub messages, hiding the details of the underlying server RPCs + +# Note: this depends on some aspects applied on the pubsub v1 orchestrion +aspects: + - id: Initialize pubsubtrace + join-point: + struct-definition: cloud.google.com/go/pubsub/v2.Subscriber + advice: + - inject-declarations: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 + template: |- + var ( + __dd_instr *instrumentation.Instrumentation + __dd_pstrace *pubsubtrace.Tracer + ) + + func init() { + component := instrumentation.PackageGCPPubsubV2 + __dd_instr = instrumentation.Load(component) + __dd_pstrace = pubsubtrace.NewTracer(__dd_instr, component) + } + + ## Trace Receive ## + - id: Subscription.Receive + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2.Subscriber' + - name: Receive + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $subscription := .Function.Receiver -}} + {{- $handler := .Function.Argument 1 -}} + __dd_traceFn := __dd_pstrace.TraceReceiveFunc({{ $subscription }}) + __dd_wrapHandler := func(h func(ctx context.Context, msg *Message)) func(ctx context.Context, msg *Message) { + return func(ctx context.Context, msg *Message) { + __dd_traceMsg := &pubsubtrace.Message{ + ID: msg.ID, + Data: msg.Data, + OrderingKey: msg.OrderingKey, + Attributes: msg.Attributes, + DeliveryAttempt: msg.DeliveryAttempt, + PublishTime: msg.PublishTime, + } + ctx, closeSpan := __dd_traceFn(ctx, __dd_traceMsg) + defer closeSpan() + h(ctx, msg) + } + } + {{ $handler }} = __dd_wrapHandler({{ $handler }}) + + ## Trace Publish ## + - id: Topic.Publish + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/pubsub/v2.Publisher' + - name: Publish + advice: + - prepend-statements: + imports: + pubsubtrace: github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace + template: |- + {{- $topic := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msg := .Function.Argument 1 -}} + {{- $publishResult := .Function.Result 0 -}} + __dd_traceMsg := &pubsubtrace.Message{ + ID: {{ $msg }}.ID, + Data: {{ $msg }}.Data, + OrderingKey: {{ $msg }}.OrderingKey, + Attributes: {{ $msg }}.Attributes, + DeliveryAttempt: {{ $msg }}.DeliveryAttempt, + PublishTime: {{ $msg }}.PublishTime, + } + __dd_ctx, __dd_closeSpan := __dd_pstrace.TracePublish({{ $ctx }}, {{ $topic }}, __dd_traceMsg) + {{ $ctx }} = __dd_ctx + {{ $msg }}.Attributes = __dd_traceMsg.Attributes + + defer func() { + {{ $publishResult }}.DDCloseSpan = __dd_closeSpan + }() + + + # Note: These aspects are also necessary for v1, they should be present in only one of the orchestrion.yml files, + # otherwise they will be applied twice and will cause the build to fail. + - id: Add fields to PublishResult + join-point: + struct-definition: cloud.google.com/go/internal/pubsub.PublishResult + advice: + - inject-declarations: + template: |- + type DDCloseSpanFunc = func(serverID string, err error) + - add-struct-field: + name: DDCloseSpan + type: DDCloseSpanFunc + + - id: Update PublishResult.Get + join-point: + function-body: + function: + - receiver: '*cloud.google.com/go/internal/pubsub.PublishResult' + - name: Get + advice: + - prepend-statements: + template: |- + {{- $publishResult := .Function.Receiver -}} + {{- $serverID := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + defer func() { + if {{ $publishResult }}.DDCloseSpan != nil { + {{ $publishResult }}.DDCloseSpan({{ $serverID }}, {{ $err }}) + } + }() diff --git a/contrib/cloud.google.com/go/pubsub.v2/pubsub.go b/contrib/cloud.google.com/go/pubsub.v2/pubsub.go new file mode 100644 index 0000000000..e75934c313 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/pubsub.go @@ -0,0 +1,85 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package pubsub provides functions to trace the cloud.google.com/pubsub/go/v2 package. +package pubsub + +import ( + "context" + + "github.com/DataDog/dd-trace-go/v2/contrib/cloud.google.com/go/pubsubtrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + + "cloud.google.com/go/pubsub/v2" +) + +const componentName = instrumentation.PackageGCPPubsubV2 + +var ( + instr *instrumentation.Instrumentation + pstrace *pubsubtrace.Tracer +) + +func init() { + instr = instrumentation.Load(componentName) + pstrace = pubsubtrace.NewTracer(instr, componentName) +} + +// Publish publishes a message on the specified topic and returns a PublishResult. +// This function is functionally equivalent to t.Publish(ctx, msg), but it also starts a publish +// span and it ensures that the tracing metadata is propagated as attributes attached to +// the published message. +// It is required to call (*PublishResult).Get(ctx) on the value returned by Publish to complete +// the span. +func Publish(ctx context.Context, t *pubsub.Publisher, msg *pubsub.Message, opts ...Option) *PublishResult { + traceMsg := newTraceMessage(msg) + ctx, closeSpan := pstrace.TracePublish(ctx, t, traceMsg, opts...) + msg.Attributes = traceMsg.Attributes + + return &PublishResult{ + PublishResult: t.Publish(ctx, msg), + closeSpan: closeSpan, + } +} + +// PublishResult wraps *pubsub.PublishResult +type PublishResult struct { + *pubsub.PublishResult + closeSpan func(serverID string, err error) +} + +// Get wraps (pubsub.PublishResult).Get(ctx). When this function returns the publish +// span created in Publish is completed. +func (r *PublishResult) Get(ctx context.Context) (string, error) { + serverID, err := r.PublishResult.Get(ctx) + r.closeSpan(serverID, err) + return serverID, err +} + +// WrapReceiveHandler returns a receive handler that wraps the supplied handler, +// extracts any tracing metadata attached to the received message, and starts a +// receive span. +func WrapReceiveHandler(s *pubsub.Subscriber, f func(context.Context, *pubsub.Message), opts ...Option) func(context.Context, *pubsub.Message) { + traceFn := pstrace.TraceReceiveFunc(s, opts...) + return func(ctx context.Context, msg *pubsub.Message) { + ctx, closeSpan := traceFn(ctx, newTraceMessage(msg)) + defer closeSpan() + f(ctx, msg) + } +} + +func newTraceMessage(msg *pubsub.Message) *pubsubtrace.Message { + if msg == nil { + return nil + } + return &pubsubtrace.Message{ + ID: msg.ID, + Data: msg.Data, + OrderingKey: msg.OrderingKey, + Attributes: msg.Attributes, + DeliveryAttempt: msg.DeliveryAttempt, + PublishTime: msg.PublishTime, + } +} diff --git a/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go new file mode 100644 index 0000000000..a5e001bd5c --- /dev/null +++ b/contrib/cloud.google.com/go/pubsub.v2/pubsub_test.go @@ -0,0 +1,305 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsub + +import ( + "context" + "encoding/binary" + "fmt" + "testing" + "time" + + "cloud.google.com/go/pubsub/v2" + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" + "cloud.google.com/go/pubsub/v2/pstest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +func lowerEqual(t *testing.T, id uint64, tid [16]byte) { + assert.Equal(t, id, binary.BigEndian.Uint64(tid[8:])) +} + +func TestPropagation(t *testing.T) { + assert := assert.New(t) + ctx, cancel, mt, pub, sub := setup(t) + + // Publisher + span, pctx := tracer.StartSpanFromContext(ctx, "propagation-test", tracer.WithSpanID(42)) // set the root trace ID + srvID, err := Publish(pctx, pub, &pubsub.Message{Data: []byte("hello"), OrderingKey: "xxx"}).Get(pctx) + assert.NoError(err) + span.Finish() + + // Subscriber + var ( + msgID string + spanID uint64 + pubTime string + called bool + ) + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + assert.Equal(msg.Data, []byte("hello"), "wrong payload") + span, ok := tracer.SpanFromContext(ctx) + assert.True(ok, "no span") + lowerEqual(t, 42, span.Context().TraceIDBytes()) + msgID = msg.ID + spanID = span.Context().SpanID() + pubTime = msg.PublishTime.String() + msg.Ack() + called = true + cancel() + })) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + assert.Len(spans, 3, "wrong number of spans") + assert.Equal("pubsub.publish", spans[0].OperationName()) + assert.Equal("propagation-test", spans[1].OperationName()) + assert.Equal("pubsub.receive", spans[2].OperationName()) + + assert.Equal(spans[1].SpanID(), spans[0].ParentID()) + assert.Equal(uint64(42), spans[0].TraceID()) + assert.Subset(filterTags(spans[0].Tags()), map[string]any{ + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/topics/topic", + ext.SpanType: ext.SpanTypeMessageProducer, + "server_id": srvID, + ext.ServiceName: "", + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindProducer, + ext.MessagingSystem: "googlepubsub", + ext.SpanName: "pubsub.publish", + }, spans[0].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) + + assert.Equal(spans[0].SpanID(), spans[2].ParentID()) + assert.Equal(uint64(42), spans[2].TraceID()) + assert.Equal(spanID, spans[2].SpanID()) + assert.Subset(filterTags(spans[2].Tags()), map[string]any{ + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", + }, spans[2].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v2", spans[2].Integration()) +} + +func TestPropagationWithServiceName(t *testing.T) { + assert := assert.New(t) + ctx, cancel, mt, pub, sub := setup(t) + + // Publisher + span, pctx := tracer.StartSpanFromContext(ctx, "service-name-test") + _, err := Publish(pctx, pub, &pubsub.Message{Data: []byte("hello")}).Get(pctx) + assert.NoError(err) + span.Finish() + + // Subscriber + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(_ context.Context, msg *pubsub.Message) { + msg.Ack() + cancel() + }, WithService("example.service"))) + assert.NoError(err) + + spans := mt.FinishedSpans() + assert.Len(spans, 3, "wrong number of spans") + assert.Equal("example.service", spans[2].Tag(ext.ServiceName)) +} + +func TestPropagationNoParentSpan(t *testing.T) { + assert := assert.New(t) + ctx, cancel, mt, pub, sub := setup(t) + + // Publisher + // no parent span + srvID, err := Publish(ctx, pub, &pubsub.Message{Data: []byte("hello"), OrderingKey: "xxx"}).Get(ctx) + assert.NoError(err) + + // Subscriber + var ( + msgID string + spanID uint64 + traceID string + pubTime string + called bool + ) + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + assert.Equal(msg.Data, []byte("hello"), "wrong payload") + span, ok := tracer.SpanFromContext(ctx) + assert.True(ok, "no span") + msgID = msg.ID + spanID = span.Context().SpanID() + traceID = span.Context().TraceID() + pubTime = msg.PublishTime.String() + msg.Ack() + called = true + cancel() + })) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + assert.Len(spans, 2, "wrong number of spans") + assert.Equal("pubsub.publish", spans[0].OperationName()) + assert.Equal("pubsub.receive", spans[1].OperationName()) + + assert.Equal(spans[0].TraceID(), spans[0].SpanID()) + assert.Equal(traceID, spans[0].Context().TraceID()) + assert.Subset(filterTags(spans[0].Tags()), map[string]any{ + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/topics/topic", + ext.SpanType: ext.SpanTypeMessageProducer, + "server_id": srvID, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindProducer, + ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.publish", + }, spans[0].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) + + assert.Equal(spans[0].SpanID(), spans[1].ParentID()) + assert.Equal(traceID, spans[1].Context().TraceID()) + assert.Equal(spanID, spans[1].SpanID()) + assert.Subset(filterTags(spans[1].Tags()), map[string]any{ + "message_size": float64(5), + "num_attributes": float64(5), + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", + }, spans[1].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v2", spans[1].Integration()) +} + +func TestPropagationNoPublisherSpan(t *testing.T) { + assert := assert.New(t) + ctx, cancel, mt, pub, sub := setup(t) + + // Publisher + // no tracing on publisher side + _, err := pub.Publish(ctx, &pubsub.Message{Data: []byte("hello"), OrderingKey: "xxx"}).Get(ctx) + assert.NoError(err) + + // Subscriber + var ( + msgID string + spanID uint64 + traceID string + pubTime string + called bool + ) + err = sub.Receive(ctx, WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + assert.False(called, "callback called twice") + assert.Equal(msg.Data, []byte("hello"), "wrong payload") + span, ok := tracer.SpanFromContext(ctx) + assert.True(ok, "no span") + msgID = msg.ID + spanID = span.Context().SpanID() + traceID = span.Context().TraceID() + pubTime = msg.PublishTime.String() + msg.Ack() + called = true + cancel() + })) + assert.True(called, "callback not called") + assert.NoError(err) + + spans := mt.FinishedSpans() + assert.Len(spans, 1, "wrong number of spans") + assert.Equal("pubsub.receive", spans[0].OperationName()) + + assert.Equal(traceID, spans[0].Context().TraceID()) + assert.Equal(spanID, spans[0].SpanID()) + assert.Subset(filterTags(spans[0].Tags()), map[string]any{ + "message_size": float64(5), + "num_attributes": float64(0), // no attributes, since no publish middleware sent them + "ordering_key": "xxx", + ext.ResourceName: "projects/project/subscriptions/subscription", + ext.SpanType: ext.SpanTypeMessageConsumer, + "message_id": msgID, + "publish_time": pubTime, + ext.Component: "cloud.google.com/go/pubsub.v2", + ext.SpanKind: ext.SpanKindConsumer, + ext.MessagingSystem: "googlepubsub", + ext.ServiceName: "", + ext.SpanName: "pubsub.receive", + }, spans[0].Tags()) + assert.Equal("cloud.google.com/go/pubsub.v2", spans[0].Integration()) +} + +func filterTags(m map[string]any) map[string]any { + delete(m, "_dd.p.tid") + delete(m, "_dd.profiling.enabled") + delete(m, "_dd.top_level") + delete(m, "_sampling_priority_v1") + delete(m, "language") + delete(m, "tracestate") + return m +} + +func setup(t *testing.T) (context.Context, context.CancelFunc, mocktracer.Tracer, *pubsub.Publisher, *pubsub.Subscriber) { + mt := mocktracer.Start() + t.Cleanup(mt.Stop) + + srv := pstest.NewServer() + t.Cleanup(func() { assert.NoError(t, srv.Close()) }) + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + t.Cleanup(cancel) + + conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, conn.Close()) }) + + const projectID = "project" + client, err := pubsub.NewClient(ctx, projectID, option.WithGRPCConn(conn)) + require.NoError(t, err) + + topic, err := client.TopicAdminClient.CreateTopic(ctx, &pubsubpb.Topic{ + Name: fmt.Sprintf("projects/%s/topics/topic", projectID), + }) + require.NoError(t, err) + + publisher := client.Publisher(topic.Name) + publisher.EnableMessageOrdering = true + + subscription, err := client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: fmt.Sprintf("projects/%s/subscriptions/subscription", projectID), + Topic: topic.Name, + }) + require.NoError(t, err) + + sub := client.Subscriber(subscription.Name) + return ctx, cancel, mt, publisher, sub +} diff --git a/contrib/cloud.google.com/go/pubsubtrace/config.go b/contrib/cloud.google.com/go/pubsubtrace/config.go new file mode 100644 index 0000000000..5a39b58350 --- /dev/null +++ b/contrib/cloud.google.com/go/pubsubtrace/config.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pubsubtrace + +import "github.com/DataDog/dd-trace-go/v2/instrumentation" + +type config struct { + serviceName string + publishSpanName string + receiveSpanName string + measured bool +} + +// Option describes options for the Pub/Sub integration. +type Option interface { + apply(*config) +} + +func (tr *Tracer) defaultConfig() *config { + return &config{ + serviceName: tr.instr.ServiceName(instrumentation.ComponentConsumer, nil), + publishSpanName: tr.instr.OperationName(instrumentation.ComponentProducer, nil), + receiveSpanName: tr.instr.OperationName(instrumentation.ComponentConsumer, nil), + measured: false, + } +} + +// OptionFn represents options applicable to WrapReceiveHandler or Publish. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +// WithService sets the service name tag for traces started by WrapReceiveHandler or Publish. +func WithService(serviceName string) OptionFn { + return func(cfg *config) { + cfg.serviceName = serviceName + } +} + +// WithMeasured sets the measured tag for traces started by WrapReceiveHandler or Publish. +func WithMeasured() OptionFn { + return func(cfg *config) { + cfg.measured = true + } +} diff --git a/contrib/cloud.google.com/go/pubsub.v1/internal/tracing/tracing.go b/contrib/cloud.google.com/go/pubsubtrace/tracing.go similarity index 62% rename from contrib/cloud.google.com/go/pubsub.v1/internal/tracing/tracing.go rename to contrib/cloud.google.com/go/pubsubtrace/tracing.go index 43633fbf48..6fdc388840 100644 --- a/contrib/cloud.google.com/go/pubsub.v1/internal/tracing/tracing.go +++ b/contrib/cloud.google.com/go/pubsubtrace/tracing.go @@ -1,36 +1,27 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2024 Datadog, Inc. +// Copyright 2025 Datadog, Inc. -// Package tracing contains tracing logic for the cloud.google.com/go/pubsub.v1 instrumentation. +// Package pubsubtrace contains tracing logic for the cloud.google.com/go/pubsub instrumentation. // -// WARNING: this package SHOULD NOT import cloud.google.com/go/pubsub. +// WARNING: this package SHOULD NOT import cloud.google.com/go/pubsub or cloud.google.com/go/pubsub/v2. // // The motivation of this package is to support orchestrion, which cannot use the main package because it imports -// the cloud.google.com/go/pubsub package, and since orchestrion modifies the library code itself, +// the package, and since orchestrion modifies the library code itself, // this would cause an import cycle. -package tracing +package pubsubtrace import ( "context" "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const componentName = "cloud.google.com/go/pubsub.v1" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) -} - type Message struct { ID string Data []byte @@ -48,17 +39,29 @@ type Subscription interface { String() string } -func TracePublish(ctx context.Context, topic Topic, msg *Message, opts ...Option) (context.Context, func(serverID string, err error)) { - cfg := defaultConfig() +type Tracer struct { + instr *instrumentation.Instrumentation + component instrumentation.Package +} + +func NewTracer(instr *instrumentation.Instrumentation, componentName instrumentation.Package) *Tracer { + return &Tracer{ + instr: instr, + component: componentName, + } +} + +func (tr *Tracer) TracePublish(ctx context.Context, topic Topic, msg *Message, opts ...Option) (context.Context, func(serverID string, err error)) { + cfg := tr.defaultConfig() for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - spanOpts := []ddtrace.StartSpanOption{ + spanOpts := []tracer.StartSpanOption{ tracer.ResourceName(topic.String()), tracer.SpanType(ext.SpanTypeMessageProducer), tracer.Tag("message_size", len(msg.Data)), tracer.Tag("ordering_key", msg.OrderingKey), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, tr.component), tracer.Tag(ext.SpanKind, ext.SpanKindProducer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), } @@ -77,7 +80,7 @@ func TracePublish(ctx context.Context, topic Topic, msg *Message, opts ...Option msg.Attributes = make(map[string]string) } if err := tracer.Inject(span.Context(), tracer.TextMapCarrier(msg.Attributes)); err != nil { - log.Debug("contrib/cloud.google.com/go/pubsub.v1/trace: failed injecting tracing attributes: %v", err) + tr.instr.Logger().Debug("contrib/cloud.google.com/go/pubsubtrace: failed injecting tracing attributes: %s", err.Error()) } span.SetTag("num_attributes", len(msg.Attributes)) @@ -91,15 +94,15 @@ func TracePublish(ctx context.Context, topic Topic, msg *Message, opts ...Option return ctx, closeSpan } -func TraceReceiveFunc(s Subscription, opts ...Option) func(ctx context.Context, msg *Message) (context.Context, func()) { - cfg := defaultConfig() +func (tr *Tracer) TraceReceiveFunc(s Subscription, opts ...Option) func(ctx context.Context, msg *Message) (context.Context, func()) { + cfg := tr.defaultConfig() for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/cloud.google.com/go/pubsub.v1/trace: Wrapping Receive Handler: %#v", cfg) + tr.instr.Logger().Debug("contrib/cloud.google.com/go/pubsubtrace: Wrapping Receive Handler: %#v", cfg) return func(ctx context.Context, msg *Message) (context.Context, func()) { parentSpanCtx, _ := tracer.Extract(tracer.TextMapCarrier(msg.Attributes)) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ResourceName(s.String()), tracer.SpanType(ext.SpanTypeMessageConsumer), tracer.Tag("message_size", len(msg.Data)), @@ -107,7 +110,7 @@ func TraceReceiveFunc(s Subscription, opts ...Option) func(ctx context.Context, tracer.Tag("ordering_key", msg.OrderingKey), tracer.Tag("message_id", msg.ID), tracer.Tag("publish_time", msg.PublishTime.String()), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, tr.component), tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemGCPPubsub), tracer.ChildOf(parentSpanCtx), @@ -118,6 +121,10 @@ func TraceReceiveFunc(s Subscription, opts ...Option) func(ctx context.Context, if cfg.measured { opts = append(opts, tracer.Measured()) } + // If there are span links as a result of context extraction, add them as a StartSpanOption + if parentSpanCtx != nil && parentSpanCtx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(parentSpanCtx.SpanLinks())) + } span, ctx := tracer.StartSpanFromContext(ctx, cfg.receiveSpanName, opts...) if msg.DeliveryAttempt != nil { span.SetTag("delivery_attempt", *msg.DeliveryAttempt) diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/tracing.go b/contrib/confluentinc/confluent-kafka-go/internal/tracing/tracing.go deleted file mode 100644 index 4e5f78a7d6..0000000000 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/tracing.go +++ /dev/null @@ -1,35 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package tracing - -type CKGoVersion int32 - -const ( - CKGoVersion1 CKGoVersion = 1 - CKGoVersion2 CKGoVersion = 2 -) - -func ComponentName(v CKGoVersion) string { - switch v { - case CKGoVersion1: - return "confluentinc/confluent-kafka-go/kafka" - case CKGoVersion2: - return "confluentinc/confluent-kafka-go/kafka.v2" - default: - return "" - } -} - -func IntegrationName(v CKGoVersion) string { - switch v { - case CKGoVersion1: - return "github.com/confluentinc/confluent-kafka-go" - case CKGoVersion2: - return "github.com/confluentinc/confluent-kafka-go/v2" - default: - return "" - } -} diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/example_test.go b/contrib/confluentinc/confluent-kafka-go/kafka.v2/example_test.go index 9798b7158a..a3b3aad690 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka.v2/example_test.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/example_test.go @@ -8,8 +8,8 @@ package kafka_test import ( "fmt" - kafkatrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/kafka.v2" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + kafkatrace "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/confluentinc/confluent-kafka-go/v2/kafka" ) diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/go.mod b/contrib/confluentinc/confluent-kafka-go/kafka.v2/go.mod new file mode 100644 index 0000000000..e191755bfa --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/go.mod @@ -0,0 +1,114 @@ +module github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 + github.com/stretchr/testify v1.11.1 + go.uber.org/goleak v1.3.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/aws/aws-sdk-go-v2 v1.20.3 // indirect + github.com/aws/smithy-go v1.14.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/containerd/containerd v1.7.29 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v3 v3.24.4 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/shoenig/go-m1cpu v0.1.7 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect +) + +// Required to avoid a conflict with gin-gonic/gin. Re: https://github.com/gin-gonic/gin/issues/1673 +replace github.com/spf13/viper => github.com/DataDog/viper v1.7.0 + +replace github.com/DataDog/dd-trace-go/v2 => ../../../.. diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/go.sum b/contrib/confluentinc/confluent-kafka-go/kafka.v2/go.sum new file mode 100644 index 0000000000..130bfa372e --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/go.sum @@ -0,0 +1,628 @@ +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= +github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/aws/aws-sdk-go-v2 v1.20.3 h1:lgeKmAZhlj1JqN43bogrM75spIvYnRxqTAh1iupu1yE= +github.com/aws/aws-sdk-go-v2 v1.20.3/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= +github.com/aws/aws-sdk-go-v2/config v1.18.16 h1:4r7gsCu8Ekwl5iJGE/GmspA2UifqySCCkyyyPFeWs3w= +github.com/aws/aws-sdk-go-v2/config v1.18.16/go.mod h1:XjM6lVbq7UgELp9NjXBrb1DQY/ownlWsvDhEQksemJc= +github.com/aws/aws-sdk-go-v2/credentials v1.13.16 h1:GgToSxaENX/1zXIGNFfiVk4hxryYJ5Vt4Mh8XLAL7Lc= +github.com/aws/aws-sdk-go-v2/credentials v1.13.16/go.mod h1:KP7aFJhfwPFgx9aoVYL2nYHjya5WBD98CWaadpgmnpY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24 h1:5qyqXASrX2zy5cTnoHHa4N2c3Lc94GH7gjnBP3GwKdU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.24/go.mod h1:neYVaeKr5eT7BzwULuG2YbLhzWZ22lpjKdCybR7AXrQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30 h1:y+8n9AGDjikyXoMBTRaHHHSaFEB8267ykmvyPodJfys= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.30/go.mod h1:LUBAO3zNXQjoONBKn/kR1y0Q4cj/D02Ts0uHYjcCQLM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24 h1:r+Kv+SEJquhAZXaJ7G4u44cIwXV3f8K+N482NNAzJZA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.24/go.mod h1:gAuCezX/gob6BSMbItsSlMb6WZGV7K2+fWOvk8xBSto= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31 h1:hf+Vhp5WtTdcSdE+yEcUz8L73sAzN0R+0jQv+Z51/mI= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.31/go.mod h1:5zUjguZfG5qjhG9/wqmuyHRyUftl2B5Cp6NNxNC6kRA= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.24 h1:c5qGfdbCHav6viBwiyDns3OXqhqAbGjfIB4uVu2ayhk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.24/go.mod h1:HMA4FZG6fyib+NDo5bpIxX1EhYjrAOveZJY2YR0xrNE= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.5 h1:bdKIX6SVF3nc3xJFw6Nf0igzS6Ff/louGq8Z6VP/3Hs= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.5/go.mod h1:vuWiaDB30M/QTC+lI3Wj6S/zb7tpUK2MSYgy3Guh2L0= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5 h1:xLPZMyuZ4GuqRCIec/zWuIhRFPXh2UOJdLXBSi64ZWQ= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.5/go.mod h1:QjxpHmCwAg0ESGtPQnLIVp7SedTOBMYy+Slr3IfMKeI= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.6 h1:rIFn5J3yDoeuKCE9sESXqM5POTAhOP1du3bv/qTL+tE= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.6/go.mod h1:48WJ9l3dwP0GSHWGc5sFGGlCkuA82Mc2xnw+T6Q8aDw= +github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= +github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= +github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2 h1:eJ01FpliL/02KvsaPyH1bSLbM1S70yWQUojHVRbyvy4= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2/go.mod h1:IVsvFyGVhw4FASzUtlWNVaAOhYmakXAFY9IlZ7LAuD8= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 h1:NbOku86JJlsRJPJKE0snNsz6D1Qr4j5VR/lticrLZrY= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0/go.mod h1:E1dEQy50ZLfqs7T9luxz0rLxaeFZJZE92XvApJOr/Rk= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= +github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= +github.com/containerd/containerd/api v1.8.0 h1:hVTNJKR8fMc/2Tiw60ZRijntNMd1U+JVMyTRdsD2bS0= +github.com/containerd/containerd/api v1.8.0/go.mod h1:dFv4lt6S20wTu/hMcP4350RL87qPWLVa/OHOwmmdnYc= +github.com/containerd/continuity v0.4.4 h1:/fNVfTJ7wIl/YPMHjf+5H32uFhl63JucB34PlCpMKII= +github.com/containerd/continuity v0.4.4/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v0.3.0 h1:FSZgGOeK4yuT/+DnF07/Olde/q4KBoMsaamhXxIMDp4= +github.com/containerd/errdefs v0.3.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= +github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315 h1:UZxx9xBADdf/9UmSdEUi+pdJoPKpgcf9QUAY5gEIYmY= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315/go.mod h1:X8ZHhuW6ncwtoJ36TlU+gyaROTcBkTE01VHYmTStQCE= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.24.3 h1:BVc1oDV7aQgksH64pDKTvcI95G36uJ+Mz9DGGBBoZeQ= +github.com/docker/compose/v2 v2.24.3/go.mod h1:D8Nv9+juzD7xiMyyHJ7G2J/MOYiGBmb9SvdIW5+2zKo= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= +github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fsnotify/fsevents v0.1.1 h1:/125uxJvvoSDDBPen6yUZbil8J9ydKZnnl3TWWmvnkw= +github.com/fsnotify/fsevents v0.1.1/go.mod h1:+d+hS27T6k5J8CRaPLKFgwKYcpS7GwW3Ule9+SC2ZRc= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 h1:r80LLQ91uOLxU1ElAvrB1o8oBsph51lPzVnr7t2b200= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991/go.mod h1:6MddWPSL5jxy+W8eMMHWDOfZzzRRKWXPZqajw72YHBc= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo= +github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0 h1:8SG7/vwALn54lVB/0yZ/MMwhFrPYtpEHQb2IpWsCzug= +github.com/opencontainers/image-spec v1.1.0/go.mod h1:W4s4sFTMaBeK1BQLXbG4AdM2szdn85PY75RI83NrTrM= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= +github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/go-m1cpu v0.1.7 h1:C76Yd0ObKR82W4vhfjZiCp0HxcSZ8Nqd84v+HZ0qyI0= +github.com/shoenig/go-m1cpu v0.1.7/go.mod h1:KkDOw6m3ZJQAPHbrzkZki4hnx+pDRR1Lo+ldA56wD5w= +github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/testcontainers/testcontainers-go v0.29.1 h1:z8kxdFlovA2y97RWx98v/TQ+tR+SXZm6p35M+xB92zk= +github.com/testcontainers/testcontainers-go v0.29.1/go.mod h1:SnKnKQav8UcgtKqjp/AD8bE1MqZm+3TDb/B8crE3XnI= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1 h1:47ipPM+s+ltCDOP3Sa1j95AkNb+z+WGiHLDbLU8ixuc= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1/go.mod h1:Sqh+Ef2ESdbJQjTJl57UOkEHkOc7gXvQLg1b5xh6f1Y= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 h1:ZT8ibgassurSISJ1Pj26NsM3vY2jxFZn63Nd/TpHmRw= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302/go.mod h1:9kMVqMyQ/Sx2df5LtnGG+nbrmiZzCS7V6gjW3oGHsvI= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 h1:2ea0IkZBsWH+HA2GkD+7+hRw2u97jzdFyRtXuO14a1s= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0/go.mod h1:4m3RnBBb+7dB9d21y510oO1pdB1V4J6smNf14WXcBFQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0 h1:jwV9iQdvp38fxXi8ZC+lNpxjK16MRcZlpDYvbuO1FiA= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0/go.mod h1:f3bYiqNqhoPxkvI2LrXqQVC546K7BuRDL/kKuxkujhA= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa h1:ePqxpG3LVx+feAUOx8YmR5T7rc0rdzK8DyxM8cQ9zq0= +google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:CnZenrTdRJb7jc+jOm0Rkywq+9wh0QC4U8tyiRbEPPM= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.26.7 h1:Lf4iEBEJb5OFNmawtBfSZV/UNi9riSJ0t1qdhyZqI40= +k8s.io/api v0.26.7/go.mod h1:Vk9bMadzA49UHPmHB//lX7VRCQSXGoVwfLd3Sc1SSXI= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.26.7 h1:NX/zBZZn4R+Cq6shwyn8Pn8REd0yJJ16dbtv9WkEVEU= +k8s.io/apiserver v0.26.7/go.mod h1:r0wDRWHI7VL/KlQLTkJJBVGZ3KeNfv+VetlyRtr86xs= +k8s.io/client-go v0.26.7 h1:hyU9aKHlwVOykgyxzGYkrDSLCc4+mimZVyUJjPyUn1E= +k8s.io/client-go v0.26.7/go.mod h1:okYjy0jtq6sdeztALDvCh24tg4opOQS1XNvsJlERDAo= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= +k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +tags.cncf.io/container-device-interface v0.8.1 h1:c0jN4Mt6781jD67NdPajmZlD1qrqQyov/Xfoab37lj0= +tags.cncf.io/container-device-interface v0.8.1/go.mod h1:Apb7N4VdILW0EVdEMRYXIDVRZfNJZ+kmEUss2kRRQ6Y= diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/headers.go b/contrib/confluentinc/confluent-kafka-go/kafka.v2/headers.go index c4061543ed..c772eed70b 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka.v2/headers.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/headers.go @@ -8,13 +8,13 @@ package kafka import ( "github.com/confluentinc/confluent-kafka-go/v2/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" ) // A MessageCarrier injects and extracts traces from a kafka.Message. -type MessageCarrier = tracing.MessageCarrier +type MessageCarrier = kafkatrace.MessageCarrier // NewMessageCarrier creates a new MessageCarrier. func NewMessageCarrier(msg *kafka.Message) MessageCarrier { - return tracing.NewMessageCarrier(wrapMessage(msg)) + return kafkatrace.NewMessageCarrier(wrapMessage(msg)) } diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka.go b/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka.go index 24bbe5a3d8..de97fc6da4 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka.go @@ -4,32 +4,32 @@ // Copyright 2016 Datadog, Inc. // Package kafka provides functions to trace the confluentinc/confluent-kafka-go package (https://github.com/confluentinc/confluent-kafka-go). -package kafka // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/kafka.v2" +package kafka // import "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2" import ( "time" "github.com/confluentinc/confluent-kafka-go/v2/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const ( - ckgoVersion = tracing.CKGoVersion2 - logPrefix = "contrib/confluentinc/confluent-kafka-go/kafka.v2" + componentName = instrumentation.PackageConfluentKafkaGoV2 + pkgPath = "contrib/confluentinc/confluent-kafka-go/kafka.v2" ) +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(tracing.ComponentName(ckgoVersion)) - tracer.MarkIntegrationImported(tracing.IntegrationName(ckgoVersion)) + instr = instrumentation.Load(componentName) } -func newKafkaTracer(opts ...Option) *tracing.KafkaTracer { +func newKafkaTracer(opts ...Option) *kafkatrace.Tracer { v, _ := kafka.LibraryVersion() - return tracing.NewKafkaTracer(tracing.CKGoVersion2, v, opts...) + return kafkatrace.NewKafkaTracer(instr, kafkatrace.CKGoVersion2, v, opts...) } // NewConsumer calls kafka.NewConsumer and wraps the resulting Consumer. @@ -55,7 +55,7 @@ func NewProducer(conf *kafka.ConfigMap, opts ...Option) (*Producer, error) { // A Consumer wraps a kafka.Consumer. type Consumer struct { *kafka.Consumer - tracer *tracing.KafkaTracer + tracer *kafkatrace.Tracer events chan kafka.Event } @@ -65,8 +65,8 @@ func WrapConsumer(c *kafka.Consumer, opts ...Option) *Consumer { Consumer: c, tracer: newKafkaTracer(opts...), } - log.Debug("%s: Wrapping Consumer: %#v", logPrefix, wrapped.tracer) - wrapped.events = tracing.WrapConsumeEventsChannel(wrapped.tracer, c.Events(), c, wrapEvent) + instr.Logger().Debug("%s: Wrapping Consumer: %#v", pkgPath, wrapped.tracer) + wrapped.events = kafkatrace.WrapConsumeEventsChannel(wrapped.tracer, c.Events(), c, wrapEvent) return wrapped } @@ -156,7 +156,7 @@ func (c *Consumer) CommitOffsets(offsets []kafka.TopicPartition) ([]kafka.TopicP // A Producer wraps a kafka.Producer. type Producer struct { *kafka.Producer - tracer *tracing.KafkaTracer + tracer *kafkatrace.Tracer produceChannel chan *kafka.Message events chan kafka.Event } @@ -168,10 +168,10 @@ func WrapProducer(p *kafka.Producer, opts ...Option) *Producer { tracer: newKafkaTracer(opts...), events: p.Events(), } - log.Debug("%s: Wrapping Producer: %#v", logPrefix, wrapped.tracer) - wrapped.produceChannel = tracing.WrapProduceChannel(wrapped.tracer, p.ProduceChannel(), wrapMessage) + instr.Logger().Debug("%s: Wrapping Producer: %#v", pkgPath, wrapped.tracer) + wrapped.produceChannel = kafkatrace.WrapProduceChannel(wrapped.tracer, p.ProduceChannel(), wrapMessage) if wrapped.tracer.DSMEnabled() { - wrapped.events = tracing.WrapProduceEventsChannel(wrapped.tracer, p.Events(), wrapEvent) + wrapped.events = kafkatrace.WrapProduceEventsChannel(wrapped.tracer, p.Events(), wrapEvent) } return wrapped } @@ -195,7 +195,12 @@ func (p *Producer) Produce(msg *kafka.Message, deliveryChan chan kafka.Event) er span := p.tracer.StartProduceSpan(tMsg) var errChan chan error - deliveryChan, errChan = tracing.WrapDeliveryChannel(p.tracer, deliveryChan, span, wrapEvent) + + if deliveryChan == nil { + deliveryChan = p.events + } + + deliveryChan, errChan = kafkatrace.WrapDeliveryChannel(p.tracer, deliveryChan, span, wrapEvent) p.tracer.SetProduceCheckpoint(tMsg) diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka_test.go b/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka_test.go index e57288598b..66875d0837 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka_test.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/kafka_test.go @@ -13,17 +13,15 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - internaldsm "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" - "github.com/confluentinc/confluent-kafka-go/v2/kafka" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.uber.org/goleak" + + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) var ( @@ -87,12 +85,14 @@ func TestConsumerChannel(t *testing.T) { assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) assert.Equal(t, "Consume Topic gotest", s.Tag(ext.ResourceName)) assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, int32(1), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(1), s.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, 0.3, s.Tag(ext.EventSampleRate)) assert.EqualValues(t, kafka.Offset(i+1), s.Tag("offset")) assert.Equal(t, "confluentinc/confluent-kafka-go/kafka.v2", s.Tag(ext.Component)) + assert.Equal(t, "confluentinc/confluent-kafka-go/kafka.v2", s.Integration()) assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, "gotest", s.Tag("messaging.destination.name")) } for _, msg := range []*kafka.Message{msg1, msg2} { p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewMessageCarrier(msg))) @@ -106,8 +106,9 @@ func TestConsumerChannel(t *testing.T) { func TestConsumerFunctional(t *testing.T) { for _, tt := range []struct { - name string - action consumerActionFn + name string + action consumerActionFn + useProducerEventsChannel bool }{ { name: "Poll", @@ -126,9 +127,16 @@ func TestConsumerFunctional(t *testing.T) { return c.ReadMessage(3000 * time.Millisecond) }, }, + { + name: "UseProducerEventsChannel", + action: func(c *Consumer) (*kafka.Message, error) { + return c.ReadMessage(3000 * time.Millisecond) + }, + useProducerEventsChannel: true, + }, } { t.Run(tt.name, func(t *testing.T) { - spans, msg := produceThenConsume(t, tt.action, []Option{WithAnalyticsRate(0.1), WithDataStreams()}, []Option{WithDataStreams()}) + spans, msg := produceThenConsume(t, tt.action, []Option{WithAnalyticsRate(0.1), WithDataStreams()}, []Option{WithDataStreams()}, tt.useProducerEventsChannel) s0 := spans[0] // produce assert.Equal(t, "kafka.produce", s0.OperationName()) @@ -136,11 +144,15 @@ func TestConsumerFunctional(t *testing.T) { assert.Equal(t, "Produce Topic gotest", s0.Tag(ext.ResourceName)) assert.Equal(t, 0.1, s0.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s0.Tag(ext.SpanType)) - assert.Equal(t, int32(0), s0.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s0.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "confluentinc/confluent-kafka-go/kafka.v2", s0.Tag(ext.Component)) + assert.Equal(t, "confluentinc/confluent-kafka-go/kafka.v2", s0.Integration()) assert.Equal(t, ext.SpanKindProducer, s0.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s0.Tag(ext.MessagingSystem)) assert.Equal(t, "127.0.0.1", s0.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, "gotest", s0.Tag("messaging.destination.name")) + assert.Nil(t, s0.Tag(ext.ErrorMsg)) + assert.Nil(t, s0.Tag(ext.ErrorType)) s1 := spans[1] // consume assert.Equal(t, "kafka.consume", s1.OperationName()) @@ -148,11 +160,13 @@ func TestConsumerFunctional(t *testing.T) { assert.Equal(t, "Consume Topic gotest", s1.Tag(ext.ResourceName)) assert.Equal(t, nil, s1.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s1.Tag(ext.SpanType)) - assert.Equal(t, int32(0), s1.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s1.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "confluentinc/confluent-kafka-go/kafka.v2", s1.Tag(ext.Component)) + assert.Equal(t, "confluentinc/confluent-kafka-go/kafka.v2", s1.Integration()) assert.Equal(t, ext.SpanKindConsumer, s1.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s1.Tag(ext.MessagingSystem)) assert.Equal(t, "127.0.0.1", s1.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, "gotest", s1.Tag("messaging.destination.name")) p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewMessageCarrier(msg))) assert.True(t, ok) @@ -187,6 +201,7 @@ func TestDeprecatedContext(t *testing.T) { "session.timeout.ms": 10, "enable.auto.offset.store": false, }, WithContext(ctx)) // Adds the parent context containing a span + assert.NoError(t, err) err = c.Subscribe(testTopic, nil) assert.NoError(t, err) @@ -278,23 +293,10 @@ func TestCustomTags(t *testing.T) { s := spans[0] assert.Equal(t, "bar", s.Tag("foo")) - assert.Equal(t, []byte("key1"), s.Tag("key")) + assert.Equal(t, "key1", s.Tag("key")) } -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - consumerAction := consumerActionFn(func(c *Consumer) (*kafka.Message, error) { - return c.ReadMessage(3000 * time.Millisecond) - }) - spans, _ := produceThenConsume(t, consumerAction, opts, opts) - return spans - } - namingschematest.NewKafkaTest(genSpans)(t) -} +type consumerActionFn func(c *Consumer) (*kafka.Message, error) // Test we don't leak goroutines and properly close the span when Produce returns an error. func TestProduceError(t *testing.T) { @@ -340,11 +342,13 @@ func TestProduceError(t *testing.T) { spans := mt.FinishedSpans() assert.Len(t, spans, 1) + s0 := spans[0] + assert.Equal(t, "kafka.produce", s0.OperationName()) + assert.Equal(t, "Local: Invalid argument or configuration", s0.Tag(ext.ErrorMsg)) + assert.Equal(t, "kafka.Error", s0.Tag(ext.ErrorType)) } -type consumerActionFn func(c *Consumer) (*kafka.Message, error) - -func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerOpts []Option, consumerOpts []Option) ([]mocktracer.Span, *kafka.Message) { +func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerOpts []Option, consumerOpts []Option, useProducerEventsChannel bool) ([]*mocktracer.Span, *kafka.Message) { if _, ok := os.LookupEnv("INTEGRATION"); !ok { t.Skip("to enable integration test, set the INTEGRATION environment variable") } @@ -358,7 +362,11 @@ func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerO }, producerOpts...) require.NoError(t, err) - delivery := make(chan kafka.Event, 1) + var delivery chan kafka.Event = nil + if !useProducerEventsChannel { + delivery = make(chan kafka.Event, 1) + } + err = p.Produce(&kafka.Message{ TopicPartition: kafka.TopicPartition{ Topic: &testTopic, @@ -369,7 +377,16 @@ func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerO }, delivery) require.NoError(t, err) - msg1, _ := (<-delivery).(*kafka.Message) + var evt kafka.Event + select { + case evt = <-p.Events(): + case evt = <-delivery: + } + msg1, ok := evt.(*kafka.Message) + require.True(t, ok) + assert.Equal(t, "key2", string(msg1.Key)) + assert.Equal(t, "value2", string(msg1.Value)) + p.Close() // next attempt to consume the message @@ -403,7 +420,7 @@ func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerO if c.tracer.DSMEnabled() { backlogs := mt.SentDSMBacklogs() - toMap := func(_ []internaldsm.Backlog) map[string]struct{} { + toMap := func(_ []mocktracer.DSMBacklog) map[string]struct{} { m := make(map[string]struct{}) for _, b := range backlogs { m[strings.Join(b.Tags, "")] = struct{}{} @@ -417,3 +434,27 @@ func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerO } return spans, msg2 } + +/* +to run the integration test locally: + + docker network create confluent + + docker run --rm \ + --name zookeeper \ + --network confluent \ + -p 2181:2181 \ + -e ZOOKEEPER_CLIENT_PORT=2181 \ + confluentinc/cp-zookeeper:5.0.0 + + docker run --rm \ + --name kafka \ + --network confluent \ + -p 9092:9092 \ + -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ + -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ + -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ + -e KAFKA_CREATE_TOPICS=gotest:1:1 \ + -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ + confluentinc/cp-kafka:5.0.0 +*/ diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/option.go b/contrib/confluentinc/confluent-kafka-go/kafka.v2/option.go index 4061e2b6fa..82d61a6578 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka.v2/option.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/option.go @@ -8,43 +8,46 @@ package kafka import ( "github.com/confluentinc/confluent-kafka-go/v2/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" ) -// An Option customizes the config. -type Option = tracing.Option +// Option describes an option for the Kafka integration. +type Option = kafkatrace.Option + +// OptionFn represents options applicable to NewConsumer, NewProducer, WrapConsumer and WrapProducer. +type OptionFn = kafkatrace.OptionFn // WithContext sets the config context to ctx. // Deprecated: This is deprecated in favor of passing the context // via the message headers -var WithContext = tracing.WithContext +var WithContext = kafkatrace.WithContext -// WithServiceName sets the config service name to serviceName. -var WithServiceName = tracing.WithServiceName +// WithService sets the config service name to serviceName. +var WithService = kafkatrace.WithService // WithAnalytics enables Trace Analytics for all started spans. -var WithAnalytics = tracing.WithAnalytics +var WithAnalytics = kafkatrace.WithAnalytics // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -var WithAnalyticsRate = tracing.WithAnalyticsRate +var WithAnalyticsRate = kafkatrace.WithAnalyticsRate // WithCustomTag will cause the given tagFn to be evaluated after executing // a query and attach the result to the span tagged by the key. func WithCustomTag(tag string, tagFn func(msg *kafka.Message) interface{}) Option { - wrapped := func(msg tracing.Message) interface{} { + wrapped := func(msg kafkatrace.Message) interface{} { if m, ok := msg.Unwrap().(*kafka.Message); ok { return tagFn(m) } return nil } - return tracing.WithCustomTag(tag, wrapped) + return kafkatrace.WithCustomTag(tag, wrapped) } // WithConfig extracts the config information for the client to be tagged func WithConfig(cm *kafka.ConfigMap) Option { - return tracing.WithConfig(wrapConfigMap(cm)) + return kafkatrace.WithConfig(wrapConfigMap(cm)) } // WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ -var WithDataStreams = tracing.WithDataStreams +var WithDataStreams = kafkatrace.WithDataStreams diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/orchestrion.yml b/contrib/confluentinc/confluent-kafka-go/kafka.v2/orchestrion.yml new file mode 100644 index 0000000000..7e5b98a53e --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/orchestrion.yml @@ -0,0 +1,472 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 + description: confluent-kafka-go is a Go library for Apache Kafka + +aspects: + - id: Consumer + join-point: + struct-definition: github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer + advice: + - add-struct-field: + name: __dd_tracer + type: "*__dd_kafkaTracer" + - add-struct-field: + name: __dd_events + type: "__dd_eventChan" + - add-struct-field: + name: __dd_confmap + type: "*ConfigMap" + - inject-declarations: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 + template: |- + const __dd_ckgoVersion = kafkatrace.CKGoVersion2 + var __dd_instr *instrumentation.Instrumentation + + type __dd_wMessage struct { + *Message + } + + func __dd_wrapMessage(msg *Message) kafkatrace.Message { + if msg == nil { + return nil + } + return &__dd_wMessage{msg} + } + + func (w *__dd_wMessage) Unwrap() any { + return w.Message + } + + func (w *__dd_wMessage) GetValue() []byte { + return w.Message.Value + } + + func (w *__dd_wMessage) GetKey() []byte { + return w.Message.Key + } + + func (w *__dd_wMessage) GetHeaders() []kafkatrace.Header { + hs := make([]kafkatrace.Header, 0, len(w.Headers)) + for _, h := range w.Headers { + hs = append(hs, __dd_wrapHeader(h)) + } + return hs + } + + func (w *__dd_wMessage) SetHeaders(headers []kafkatrace.Header) { + hs := make([]Header, 0, len(headers)) + for _, h := range headers { + hs = append(hs, Header{ + Key: h.GetKey(), + Value: h.GetValue(), + }) + } + w.Message.Headers = hs + } + + func (w *__dd_wMessage) GetTopicPartition() kafkatrace.TopicPartition { + return __dd_wrapTopicPartition(w.Message.TopicPartition) + } + + type __dd_wHeader struct { + Header + } + + func __dd_wrapHeader(h Header) kafkatrace.Header { + return &__dd_wHeader{h} + } + + func (w __dd_wHeader) GetKey() string { + return w.Header.Key + } + + func (w __dd_wHeader) GetValue() []byte { + return w.Header.Value + } + + type __dd_wTopicPartition struct { + TopicPartition + } + + func __dd_wrapTopicPartition(tp TopicPartition) kafkatrace.TopicPartition { + return __dd_wTopicPartition{tp} + } + + func __dd_wrapTopicPartitions(tps []TopicPartition) []kafkatrace.TopicPartition { + wtps := make([]kafkatrace.TopicPartition, 0, len(tps)) + for _, tp := range tps { + wtps = append(wtps, __dd_wTopicPartition{tp}) + } + return wtps + } + + func (w __dd_wTopicPartition) GetTopic() string { + if w.Topic == nil { + return "" + } + return *w.Topic + } + + func (w __dd_wTopicPartition) GetPartition() int32 { + return w.Partition + } + + func (w __dd_wTopicPartition) GetOffset() int64 { + return int64(w.Offset) + } + + func (w __dd_wTopicPartition) GetError() error { + return w.Error + } + + type __dd_wEvent struct { + Event + } + + func __dd_wrapEvent(event Event) kafkatrace.Event { + return __dd_wEvent{event} + } + + func (w __dd_wEvent) KafkaMessage() (kafkatrace.Message, bool) { + if m, ok := w.Event.(*Message); ok { + return __dd_wrapMessage(m), true + } + return nil, false + } + + func (w __dd_wEvent) KafkaOffsetsCommitted() (kafkatrace.OffsetsCommitted, bool) { + if oc, ok := w.Event.(OffsetsCommitted); ok { + return __dd_wrapOffsetsCommitted(oc), true + } + return nil, false + } + + type __dd_wOffsetsCommitted struct { + OffsetsCommitted + } + + func __dd_wrapOffsetsCommitted(oc OffsetsCommitted) kafkatrace.OffsetsCommitted { + return __dd_wOffsetsCommitted{oc} + } + + func (w __dd_wOffsetsCommitted) GetError() error { + return w.Error + } + + func (w __dd_wOffsetsCommitted) GetOffsets() []kafkatrace.TopicPartition { + ttps := make([]kafkatrace.TopicPartition, 0, len(w.Offsets)) + for _, tp := range w.Offsets { + ttps = append(ttps, __dd_wrapTopicPartition(tp)) + } + return ttps + } + + type __dd_wConfigMap struct { + cfg *ConfigMap + } + + func __dd_wrapConfigMap(cm *ConfigMap) kafkatrace.ConfigMap { + return &__dd_wConfigMap{cm} + } + + func (w *__dd_wConfigMap) Get(key string, defVal any) (any, error) { + return w.cfg.Get(key, defVal) + } + + func init() { + __dd_instr = kafkatrace.Package(__dd_ckgoVersion) + } + + func __dd_newKafkaTracer(opts ...kafkatrace.Option) *kafkatrace.Tracer { + v, _ := LibraryVersion() + return kafkatrace.NewKafkaTracer(__dd_instr, __dd_ckgoVersion, v, opts...) + } + + func __dd_initConsumer(c *Consumer) { + if c.__dd_tracer != nil { + return + } + var opts []kafkatrace.Option + if c.__dd_confmap != nil { + opts = append(opts, kafkatrace.WithConfig(__dd_wrapConfigMap(c.__dd_confmap))) + } + c.__dd_tracer = __dd_newKafkaTracer(opts...) + // TODO: accessing c.events here might break if the library renames this variable... + c.__dd_events = kafkatrace.WrapConsumeEventsChannel(c.__dd_tracer, c.events, c, __dd_wrapEvent) + } + + func __dd_initProducer(p *Producer) { + if p.__dd_tracer != nil { + return + } + p.__dd_tracer = __dd_newKafkaTracer() + // TODO: accessing p.events and p.produceChannel here might break if the library renames this variable... + p.__dd_events = p.events + p.__dd_produceChannel = kafkatrace.WrapProduceChannel(p.__dd_tracer, p.produceChannel, __dd_wrapMessage) + if p.__dd_tracer.DSMEnabled() { + p.__dd_events = kafkatrace.WrapProduceEventsChannel(p.__dd_tracer, p.events, __dd_wrapEvent) + } + } + + type __dd_eventChan = chan Event + type __dd_messageChan = chan *Message + type __dd_kafkaTracer = kafkatrace.Tracer + + ## Trace Consumer ## + - id: NewConsumer + join-point: + all-of: + - import-path: github.com/confluentinc/confluent-kafka-go/v2/kafka + - function-body: + function: + - name: NewConsumer + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $conf := .Function.Argument 0 -}} + {{- $c := .Function.Result 0 -}} + defer func() { + if {{ $c }} == nil { + return + } + {{ $c }}.__dd_confmap = {{ $conf }} + __dd_initConsumer({{ $c }}) + }() + + - id: Consumer.Close + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer' + - name: Close + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + __dd_initConsumer({{ $c }}) + defer func() { + if {{ $c }}.__dd_events == nil && {{ $c }}.__dd_tracer.PrevSpan != nil { + {{ $c }}.__dd_tracer.PrevSpan.Finish() + {{ $c }}.__dd_tracer.PrevSpan = nil + } + }() + + - id: Consumer.Events + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer' + - name: Events + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $events := .Function.Result 0 -}} + __dd_initConsumer({{ $c }}) + defer func() { + {{ $events }} = {{ $c }}.__dd_events + }() + + # kafka.Consumer#ReadMessage calls kafka.Consumer#Poll internally, so there's no need to trace it. + - id: Consumer.Poll + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer' + - name: Poll + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $event := .Function.Result 0 -}} + __dd_initConsumer({{ $c }}) + if {{ $c }}.__dd_tracer.PrevSpan != nil { + {{ $c }}.__dd_tracer.PrevSpan.Finish() + {{ $c }}.__dd_tracer.PrevSpan = nil + } + defer func() { + if msg, ok := {{ $event }}.(*Message); ok { + tMsg := __dd_wrapMessage(msg) + {{ $c }}.__dd_tracer.SetConsumeCheckpoint(tMsg) + {{ $c }}.__dd_tracer.PrevSpan = {{ $c }}.__dd_tracer.StartConsumeSpan(tMsg) + } else if offset, ok := {{ $event }}.(OffsetsCommitted); ok { + tOffsets := __dd_wrapTopicPartitions(offset.Offsets) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, offset.Error) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + } + }() + + - id: Consumer.Commit + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer' + - name: Commit + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $tps := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initConsumer({{ $c }}) + defer func() { + tOffsets := __dd_wrapTopicPartitions({{ $tps }}) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, {{ $err }}) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + }() + + - id: Consumer.CommitMessage + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer' + - name: CommitMessage + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $tps := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initConsumer({{ $c }}) + defer func() { + tOffsets := __dd_wrapTopicPartitions({{ $tps }}) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, {{ $err }}) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + }() + + - id: Consumer.CommitOffsets + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Consumer' + - name: CommitOffsets + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $tps := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initConsumer({{ $c }}) + defer func() { + tOffsets := __dd_wrapTopicPartitions({{ $tps }}) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, {{ $err }}) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + }() + + ## Trace Producer ## + + - id: Producer + join-point: + struct-definition: github.com/confluentinc/confluent-kafka-go/v2/kafka.Producer + advice: + - add-struct-field: + name: __dd_tracer + type: "*__dd_kafkaTracer" + - add-struct-field: + name: __dd_events + type: "__dd_eventChan" + - add-struct-field: + name: __dd_produceChannel + type: "__dd_messageChan" + + - id: Producer.Events + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Producer' + - name: Events + advice: + - prepend-statements: + template: |- + {{- $p := .Function.Receiver -}} + {{- $events := .Function.Result 0 -}} + __dd_initProducer({{ $p }}) + defer func() { + {{ $events }} = {{ $p }}.__dd_events + }() + + - id: Producer.ProduceChannel + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Producer' + - name: ProduceChannel + advice: + - prepend-statements: + template: |- + {{- $p := .Function.Receiver -}} + {{- $produceChannel := .Function.Result 0 -}} + __dd_initProducer({{ $p }}) + defer func() { + {{ $produceChannel }} = {{ $p }}.__dd_produceChannel + }() + + - id: Producer.Close + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Producer' + - name: Close + advice: + - prepend-statements: + template: |- + {{- $p := .Function.Receiver -}} + __dd_initProducer({{ $p }}) + close({{ $p }}.__dd_produceChannel) + + - id: Producer.Produce + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/v2/kafka.Producer' + - name: Produce + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + template: |- + {{- $p := .Function.Receiver -}} + {{- $msg := .Function.Argument 0 -}} + {{- $deliveryChan := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_initProducer({{ $p }}) + tMsg := __dd_wrapMessage({{ $msg }}) + span := p.__dd_tracer.StartProduceSpan(tMsg) + + var errChan chan error + {{ $deliveryChan }}, errChan = kafkatrace.WrapDeliveryChannel({{ $p }}.__dd_tracer, {{ $deliveryChan }}, span, __dd_wrapEvent) + + {{ $p }}.__dd_tracer.SetProduceCheckpoint(tMsg) + defer func() { + if {{ $err }} != nil { + if errChan != nil { + errChan <- {{ $err }} + } else { + span.Finish(tracer.WithError({{ $err }})) + } + } + }() diff --git a/contrib/confluentinc/confluent-kafka-go/kafka.v2/tracing.go b/contrib/confluentinc/confluent-kafka-go/kafka.v2/types.go similarity index 67% rename from contrib/confluentinc/confluent-kafka-go/kafka.v2/tracing.go rename to contrib/confluentinc/confluent-kafka-go/kafka.v2/types.go index 02f96217ec..d345e8a928 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka.v2/tracing.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka.v2/types.go @@ -8,14 +8,14 @@ package kafka import ( "github.com/confluentinc/confluent-kafka-go/v2/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" ) type wMessage struct { *kafka.Message } -func wrapMessage(msg *kafka.Message) tracing.Message { +func wrapMessage(msg *kafka.Message) kafkatrace.Message { if msg == nil { return nil } @@ -34,15 +34,15 @@ func (w *wMessage) GetKey() []byte { return w.Message.Key } -func (w *wMessage) GetHeaders() []tracing.Header { - hs := make([]tracing.Header, 0, len(w.Headers)) +func (w *wMessage) GetHeaders() []kafkatrace.Header { + hs := make([]kafkatrace.Header, 0, len(w.Headers)) for _, h := range w.Headers { hs = append(hs, wrapHeader(h)) } return hs } -func (w *wMessage) SetHeaders(headers []tracing.Header) { +func (w *wMessage) SetHeaders(headers []kafkatrace.Header) { hs := make([]kafka.Header, 0, len(headers)) for _, h := range headers { hs = append(hs, kafka.Header{ @@ -53,7 +53,7 @@ func (w *wMessage) SetHeaders(headers []tracing.Header) { w.Message.Headers = hs } -func (w *wMessage) GetTopicPartition() tracing.TopicPartition { +func (w *wMessage) GetTopicPartition() kafkatrace.TopicPartition { return wrapTopicPartition(w.Message.TopicPartition) } @@ -61,7 +61,7 @@ type wHeader struct { kafka.Header } -func wrapHeader(h kafka.Header) tracing.Header { +func wrapHeader(h kafka.Header) kafkatrace.Header { return &wHeader{h} } @@ -77,12 +77,12 @@ type wTopicPartition struct { kafka.TopicPartition } -func wrapTopicPartition(tp kafka.TopicPartition) tracing.TopicPartition { +func wrapTopicPartition(tp kafka.TopicPartition) kafkatrace.TopicPartition { return wTopicPartition{tp} } -func wrapTopicPartitions(tps []kafka.TopicPartition) []tracing.TopicPartition { - wtps := make([]tracing.TopicPartition, 0, len(tps)) +func wrapTopicPartitions(tps []kafka.TopicPartition) []kafkatrace.TopicPartition { + wtps := make([]kafkatrace.TopicPartition, 0, len(tps)) for _, tp := range tps { wtps = append(wtps, wTopicPartition{tp}) } @@ -112,18 +112,18 @@ type wEvent struct { kafka.Event } -func wrapEvent(event kafka.Event) tracing.Event { +func wrapEvent(event kafka.Event) kafkatrace.Event { return wEvent{event} } -func (w wEvent) KafkaMessage() (tracing.Message, bool) { +func (w wEvent) KafkaMessage() (kafkatrace.Message, bool) { if m, ok := w.Event.(*kafka.Message); ok { return wrapMessage(m), true } return nil, false } -func (w wEvent) KafkaOffsetsCommitted() (tracing.OffsetsCommitted, bool) { +func (w wEvent) KafkaOffsetsCommitted() (kafkatrace.OffsetsCommitted, bool) { if oc, ok := w.Event.(kafka.OffsetsCommitted); ok { return wrapOffsetsCommitted(oc), true } @@ -134,7 +134,7 @@ type wOffsetsCommitted struct { kafka.OffsetsCommitted } -func wrapOffsetsCommitted(oc kafka.OffsetsCommitted) tracing.OffsetsCommitted { +func wrapOffsetsCommitted(oc kafka.OffsetsCommitted) kafkatrace.OffsetsCommitted { return wOffsetsCommitted{oc} } @@ -142,8 +142,8 @@ func (w wOffsetsCommitted) GetError() error { return w.Error } -func (w wOffsetsCommitted) GetOffsets() []tracing.TopicPartition { - ttps := make([]tracing.TopicPartition, 0, len(w.Offsets)) +func (w wOffsetsCommitted) GetOffsets() []kafkatrace.TopicPartition { + ttps := make([]kafkatrace.TopicPartition, 0, len(w.Offsets)) for _, tp := range w.Offsets { ttps = append(ttps, wrapTopicPartition(tp)) } @@ -154,7 +154,7 @@ type wConfigMap struct { cfg *kafka.ConfigMap } -func wrapConfigMap(cm *kafka.ConfigMap) tracing.ConfigMap { +func wrapConfigMap(cm *kafka.ConfigMap) kafkatrace.ConfigMap { return &wConfigMap{cm} } diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/example_test.go b/contrib/confluentinc/confluent-kafka-go/kafka/example_test.go index baefad6b45..de81c5bdf2 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/example_test.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/example_test.go @@ -8,8 +8,8 @@ package kafka_test import ( "fmt" - kafkatrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + kafkatrace "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/confluentinc/confluent-kafka-go/kafka" ) diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/go.mod b/contrib/confluentinc/confluent-kafka-go/kafka/go.mod new file mode 100644 index 0000000000..caa6969e72 --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafka/go.mod @@ -0,0 +1,94 @@ +module github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/confluentinc/confluent-kafka-go v1.9.2 + github.com/stretchr/testify v1.11.1 + go.uber.org/goleak v1.3.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../../.. diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/go.sum b/contrib/confluentinc/confluent-kafka-go/kafka/go.sum new file mode 100644 index 0000000000..ee2da86234 --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafka/go.sum @@ -0,0 +1,478 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= +github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= +github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/confluentinc/confluent-kafka-go v1.9.2 h1:gV/GxhMBUb03tFWkN+7kdhg+zf+QUM+wVkI9zwh770Q= +github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pnwWZElUoWxHoV8E43DCrliyo= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/headers.go b/contrib/confluentinc/confluent-kafka-go/kafka/headers.go index e29f88f30c..42100cba18 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/headers.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/headers.go @@ -8,13 +8,13 @@ package kafka import ( "github.com/confluentinc/confluent-kafka-go/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" ) // A MessageCarrier injects and extracts traces from a kafka.Message. -type MessageCarrier = tracing.MessageCarrier +type MessageCarrier = kafkatrace.MessageCarrier // NewMessageCarrier creates a new MessageCarrier. func NewMessageCarrier(msg *kafka.Message) MessageCarrier { - return tracing.NewMessageCarrier(wrapMessage(msg)) + return kafkatrace.NewMessageCarrier(wrapMessage(msg)) } diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/kafka.go b/contrib/confluentinc/confluent-kafka-go/kafka/kafka.go index b4f5485c37..435999563f 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/kafka.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/kafka.go @@ -4,32 +4,32 @@ // Copyright 2016 Datadog, Inc. // Package kafka provides functions to trace the confluentinc/confluent-kafka-go package (https://github.com/confluentinc/confluent-kafka-go). -package kafka // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/kafka" +package kafka // import "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2" import ( "time" "github.com/confluentinc/confluent-kafka-go/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const ( - ckgoVersion = tracing.CKGoVersion1 - logPrefix = "contrib/confluentinc/confluent-kafka-go/kafka" + componentName = instrumentation.PackageConfluentKafkaGo + pkgPath = "contrib/confluentinc/confluent-kafka-go/kafka" ) +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(tracing.ComponentName(ckgoVersion)) - tracer.MarkIntegrationImported(tracing.IntegrationName(ckgoVersion)) + instr = instrumentation.Load(componentName) } -func newKafkaTracer(opts ...Option) *tracing.KafkaTracer { +func newKafkaTracer(opts ...Option) *kafkatrace.Tracer { v, _ := kafka.LibraryVersion() - return tracing.NewKafkaTracer(tracing.CKGoVersion1, v, opts...) + return kafkatrace.NewKafkaTracer(instr, kafkatrace.CKGoVersion1, v, opts...) } // NewConsumer calls kafka.NewConsumer and wraps the resulting Consumer. @@ -55,7 +55,7 @@ func NewProducer(conf *kafka.ConfigMap, opts ...Option) (*Producer, error) { // A Consumer wraps a kafka.Consumer. type Consumer struct { *kafka.Consumer - tracer *tracing.KafkaTracer + tracer *kafkatrace.Tracer events chan kafka.Event } @@ -65,8 +65,8 @@ func WrapConsumer(c *kafka.Consumer, opts ...Option) *Consumer { Consumer: c, tracer: newKafkaTracer(opts...), } - log.Debug("%s: Wrapping Consumer: %#v", logPrefix, wrapped.tracer) - wrapped.events = tracing.WrapConsumeEventsChannel(wrapped.tracer, c.Events(), c, wrapEvent) + instr.Logger().Debug("%s: Wrapping Consumer: %#v", pkgPath, wrapped.tracer) + wrapped.events = kafkatrace.WrapConsumeEventsChannel(wrapped.tracer, c.Events(), c, wrapEvent) return wrapped } @@ -156,7 +156,7 @@ func (c *Consumer) CommitOffsets(offsets []kafka.TopicPartition) ([]kafka.TopicP // A Producer wraps a kafka.Producer. type Producer struct { *kafka.Producer - tracer *tracing.KafkaTracer + tracer *kafkatrace.Tracer produceChannel chan *kafka.Message events chan kafka.Event } @@ -168,10 +168,10 @@ func WrapProducer(p *kafka.Producer, opts ...Option) *Producer { tracer: newKafkaTracer(opts...), events: p.Events(), } - log.Debug("%s: Wrapping Producer: %#v", logPrefix, wrapped.tracer) - wrapped.produceChannel = tracing.WrapProduceChannel(wrapped.tracer, p.ProduceChannel(), wrapMessage) + instr.Logger().Debug("%s: Wrapping Producer: %#v", pkgPath, wrapped.tracer) + wrapped.produceChannel = kafkatrace.WrapProduceChannel(wrapped.tracer, p.ProduceChannel(), wrapMessage) if wrapped.tracer.DSMEnabled() { - wrapped.events = tracing.WrapProduceEventsChannel(wrapped.tracer, p.Events(), wrapEvent) + wrapped.events = kafkatrace.WrapProduceEventsChannel(wrapped.tracer, p.Events(), wrapEvent) } return wrapped } @@ -195,7 +195,7 @@ func (p *Producer) Produce(msg *kafka.Message, deliveryChan chan kafka.Event) er span := p.tracer.StartProduceSpan(tMsg) var errChan chan error - deliveryChan, errChan = tracing.WrapDeliveryChannel(p.tracer, deliveryChan, span, wrapEvent) + deliveryChan, errChan = kafkatrace.WrapDeliveryChannel(p.tracer, deliveryChan, span, wrapEvent) p.tracer.SetProduceCheckpoint(tMsg) diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/kafka_test.go b/contrib/confluentinc/confluent-kafka-go/kafka/kafka_test.go index 6f4b70dd78..0f82a42807 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/kafka_test.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/kafka_test.go @@ -13,13 +13,10 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - internaldsm "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" - + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/confluentinc/confluent-kafka-go/kafka" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -87,12 +84,14 @@ func TestConsumerChannel(t *testing.T) { assert.Equal(t, "kafka", s.Tag(ext.ServiceName)) assert.Equal(t, "Consume Topic gotest", s.Tag(ext.ResourceName)) assert.Equal(t, "queue", s.Tag(ext.SpanType)) - assert.Equal(t, int32(1), s.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(1), s.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, 0.3, s.Tag(ext.EventSampleRate)) assert.EqualValues(t, kafka.Offset(i+1), s.Tag("offset")) assert.Equal(t, "confluentinc/confluent-kafka-go/kafka", s.Tag(ext.Component)) + assert.Equal(t, "confluentinc/confluent-kafka-go/kafka", s.Integration()) assert.Equal(t, ext.SpanKindConsumer, s.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s.Tag(ext.MessagingSystem)) + assert.Equal(t, "gotest", s.Tag("messaging.destination.name")) } for _, msg := range []*kafka.Message{msg1, msg2} { p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewMessageCarrier(msg))) @@ -136,11 +135,13 @@ func TestConsumerFunctional(t *testing.T) { assert.Equal(t, "Produce Topic gotest", s0.Tag(ext.ResourceName)) assert.Equal(t, 0.1, s0.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s0.Tag(ext.SpanType)) - assert.Equal(t, int32(0), s0.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s0.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "confluentinc/confluent-kafka-go/kafka", s0.Tag(ext.Component)) + assert.Equal(t, "confluentinc/confluent-kafka-go/kafka", s0.Integration()) assert.Equal(t, ext.SpanKindProducer, s0.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s0.Tag(ext.MessagingSystem)) assert.Equal(t, "127.0.0.1", s0.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, "gotest", s0.Tag("messaging.destination.name")) s1 := spans[1] // consume assert.Equal(t, "kafka.consume", s1.OperationName()) @@ -148,11 +149,13 @@ func TestConsumerFunctional(t *testing.T) { assert.Equal(t, "Consume Topic gotest", s1.Tag(ext.ResourceName)) assert.Equal(t, nil, s1.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s1.Tag(ext.SpanType)) - assert.Equal(t, int32(0), s1.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s1.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "confluentinc/confluent-kafka-go/kafka", s1.Tag(ext.Component)) + assert.Equal(t, "confluentinc/confluent-kafka-go/kafka", s1.Integration()) assert.Equal(t, ext.SpanKindConsumer, s1.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s1.Tag(ext.MessagingSystem)) assert.Equal(t, "127.0.0.1", s1.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, "gotest", s1.Tag("messaging.destination.name")) p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), NewMessageCarrier(msg))) assert.True(t, ok) @@ -187,6 +190,7 @@ func TestDeprecatedContext(t *testing.T) { "session.timeout.ms": 10, "enable.auto.offset.store": false, }, WithContext(ctx)) // Adds the parent context containing a span + assert.NoError(t, err) err = c.Subscribe(testTopic, nil) assert.NoError(t, err) @@ -278,22 +282,7 @@ func TestCustomTags(t *testing.T) { s := spans[0] assert.Equal(t, "bar", s.Tag("foo")) - assert.Equal(t, []byte("key1"), s.Tag("key")) -} - -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - consumerAction := consumerActionFn(func(c *Consumer) (*kafka.Message, error) { - return c.ReadMessage(3000 * time.Millisecond) - }) - spans, _ := produceThenConsume(t, consumerAction, opts, opts) - return spans - } - namingschematest.NewKafkaTest(genSpans)(t) + assert.Equal(t, "key1", s.Tag("key")) } // Test we don't leak goroutines and properly close the span when Produce returns an error @@ -343,7 +332,7 @@ func TestProduceError(t *testing.T) { type consumerActionFn func(c *Consumer) (*kafka.Message, error) -func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerOpts []Option, consumerOpts []Option) ([]mocktracer.Span, *kafka.Message) { +func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerOpts []Option, consumerOpts []Option) ([]*mocktracer.Span, *kafka.Message) { if _, ok := os.LookupEnv("INTEGRATION"); !ok { t.Skip("to enable integration test, set the INTEGRATION environment variable") } @@ -402,7 +391,7 @@ func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerO if c.tracer.DSMEnabled() { backlogs := mt.SentDSMBacklogs() - toMap := func(_ []internaldsm.Backlog) map[string]struct{} { + toMap := func(_ []mocktracer.DSMBacklog) map[string]struct{} { m := make(map[string]struct{}) for _, b := range backlogs { m[strings.Join(b.Tags, "")] = struct{}{} @@ -416,3 +405,27 @@ func produceThenConsume(t *testing.T, consumerAction consumerActionFn, producerO } return spans, msg2 } + +/* +to run the integration test locally: + + docker network create confluent + + docker run --rm \ + --name zookeeper \ + --network confluent \ + -p 2181:2181 \ + -e ZOOKEEPER_CLIENT_PORT=2181 \ + confluentinc/cp-zookeeper:5.0.0 + + docker run --rm \ + --name kafka \ + --network confluent \ + -p 9092:9092 \ + -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ + -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ + -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ + -e KAFKA_CREATE_TOPICS=gotest:1:1 \ + -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \ + confluentinc/cp-kafka:5.0.0 +*/ diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/option.go b/contrib/confluentinc/confluent-kafka-go/kafka/option.go index 707bdd1214..2b2b215797 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/option.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/option.go @@ -8,43 +8,45 @@ package kafka import ( "github.com/confluentinc/confluent-kafka-go/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" ) // An Option customizes the config. -type Option = tracing.Option +type Option = kafkatrace.Option + +type OptionFn = kafkatrace.OptionFn // WithContext sets the config context to ctx. // Deprecated: This is deprecated in favor of passing the context // via the message headers -var WithContext = tracing.WithContext +var WithContext = kafkatrace.WithContext -// WithServiceName sets the config service name to serviceName. -var WithServiceName = tracing.WithServiceName +// WithService sets the config service name to serviceName. +var WithService = kafkatrace.WithService // WithAnalytics enables Trace Analytics for all started spans. -var WithAnalytics = tracing.WithAnalytics +var WithAnalytics = kafkatrace.WithAnalytics // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -var WithAnalyticsRate = tracing.WithAnalyticsRate +var WithAnalyticsRate = kafkatrace.WithAnalyticsRate // WithCustomTag will cause the given tagFn to be evaluated after executing // a query and attach the result to the span tagged by the key. -func WithCustomTag(tag string, tagFn func(msg *kafka.Message) interface{}) Option { - wrapped := func(msg tracing.Message) interface{} { +func WithCustomTag(tag string, tagFn func(msg *kafka.Message) interface{}) kafkatrace.OptionFn { + wrapped := func(msg kafkatrace.Message) interface{} { if m, ok := msg.Unwrap().(*kafka.Message); ok { return tagFn(m) } return nil } - return tracing.WithCustomTag(tag, wrapped) + return kafkatrace.WithCustomTag(tag, wrapped) } // WithConfig extracts the config information for the client to be tagged -func WithConfig(cm *kafka.ConfigMap) Option { - return tracing.WithConfig(wrapConfigMap(cm)) +func WithConfig(cm *kafka.ConfigMap) kafkatrace.OptionFn { + return kafkatrace.WithConfig(wrapConfigMap(cm)) } // WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ -var WithDataStreams = tracing.WithDataStreams +var WithDataStreams = kafkatrace.WithDataStreams diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/orchestrion.yml b/contrib/confluentinc/confluent-kafka-go/kafka/orchestrion.yml new file mode 100644 index 0000000000..2458115acf --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafka/orchestrion.yml @@ -0,0 +1,473 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 + description: confluent-kafka-go is a Go library for Apache Kafka + +aspects: + - id: Consumer + join-point: + struct-definition: github.com/confluentinc/confluent-kafka-go/kafka.Consumer + advice: + - add-struct-field: + name: __dd_tracer + type: "*__dd_kafkaTracer" + - add-struct-field: + name: __dd_events + type: "__dd_eventChan" + - add-struct-field: + name: __dd_confmap + type: "*ConfigMap" + - inject-declarations: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 + template: |- + const __dd_ckgoVersion = kafkatrace.CKGoVersion1 + var __dd_instr *instrumentation.Instrumentation + + type __dd_wMessage struct { + *Message + } + + func __dd_wrapMessage(msg *Message) kafkatrace.Message { + if msg == nil { + return nil + } + return &__dd_wMessage{msg} + } + + func (w *__dd_wMessage) Unwrap() any { + return w.Message + } + + func (w *__dd_wMessage) GetValue() []byte { + return w.Message.Value + } + + func (w *__dd_wMessage) GetKey() []byte { + return w.Message.Key + } + + func (w *__dd_wMessage) GetHeaders() []kafkatrace.Header { + hs := make([]kafkatrace.Header, 0, len(w.Headers)) + for _, h := range w.Headers { + hs = append(hs, __dd_wrapHeader(h)) + } + return hs + } + + func (w *__dd_wMessage) SetHeaders(headers []kafkatrace.Header) { + hs := make([]Header, 0, len(headers)) + for _, h := range headers { + hs = append(hs, Header{ + Key: h.GetKey(), + Value: h.GetValue(), + }) + } + w.Message.Headers = hs + } + + func (w *__dd_wMessage) GetTopicPartition() kafkatrace.TopicPartition { + return __dd_wrapTopicPartition(w.Message.TopicPartition) + } + + type __dd_wHeader struct { + Header + } + + func __dd_wrapHeader(h Header) kafkatrace.Header { + return &__dd_wHeader{h} + } + + func (w __dd_wHeader) GetKey() string { + return w.Header.Key + } + + func (w __dd_wHeader) GetValue() []byte { + return w.Header.Value + } + + type __dd_wTopicPartition struct { + TopicPartition + } + + func __dd_wrapTopicPartition(tp TopicPartition) kafkatrace.TopicPartition { + return __dd_wTopicPartition{tp} + } + + func __dd_wrapTopicPartitions(tps []TopicPartition) []kafkatrace.TopicPartition { + wtps := make([]kafkatrace.TopicPartition, 0, len(tps)) + for _, tp := range tps { + wtps = append(wtps, __dd_wTopicPartition{tp}) + } + return wtps + } + + func (w __dd_wTopicPartition) GetTopic() string { + if w.Topic == nil { + return "" + } + return *w.Topic + } + + func (w __dd_wTopicPartition) GetPartition() int32 { + return w.Partition + } + + func (w __dd_wTopicPartition) GetOffset() int64 { + return int64(w.Offset) + } + + func (w __dd_wTopicPartition) GetError() error { + return w.Error + } + + type __dd_wEvent struct { + Event + } + + func __dd_wrapEvent(event Event) kafkatrace.Event { + return __dd_wEvent{event} + } + + func (w __dd_wEvent) KafkaMessage() (kafkatrace.Message, bool) { + if m, ok := w.Event.(*Message); ok { + return __dd_wrapMessage(m), true + } + return nil, false + } + + func (w __dd_wEvent) KafkaOffsetsCommitted() (kafkatrace.OffsetsCommitted, bool) { + if oc, ok := w.Event.(OffsetsCommitted); ok { + return __dd_wrapOffsetsCommitted(oc), true + } + return nil, false + } + + type __dd_wOffsetsCommitted struct { + OffsetsCommitted + } + + func __dd_wrapOffsetsCommitted(oc OffsetsCommitted) kafkatrace.OffsetsCommitted { + return __dd_wOffsetsCommitted{oc} + } + + func (w __dd_wOffsetsCommitted) GetError() error { + return w.Error + } + + func (w __dd_wOffsetsCommitted) GetOffsets() []kafkatrace.TopicPartition { + ttps := make([]kafkatrace.TopicPartition, 0, len(w.Offsets)) + for _, tp := range w.Offsets { + ttps = append(ttps, __dd_wrapTopicPartition(tp)) + } + return ttps + } + + type __dd_wConfigMap struct { + cfg *ConfigMap + } + + func __dd_wrapConfigMap(cm *ConfigMap) kafkatrace.ConfigMap { + return &__dd_wConfigMap{cm} + } + + func (w *__dd_wConfigMap) Get(key string, defVal any) (any, error) { + return w.cfg.Get(key, defVal) + } + + func init() { + __dd_instr = kafkatrace.Package(__dd_ckgoVersion) + } + + func __dd_newKafkaTracer(opts ...kafkatrace.Option) *kafkatrace.Tracer { + v, _ := LibraryVersion() + return kafkatrace.NewKafkaTracer(__dd_instr, __dd_ckgoVersion, v, opts...) + } + + func __dd_initConsumer(c *Consumer) { + if c.__dd_tracer != nil { + return + } + var opts []kafkatrace.Option + if c.__dd_confmap != nil { + opts = append(opts, kafkatrace.WithConfig(__dd_wrapConfigMap(c.__dd_confmap))) + } + c.__dd_tracer = __dd_newKafkaTracer(opts...) + // TODO: accessing c.events here might break if the library renames this variable... + c.__dd_events = kafkatrace.WrapConsumeEventsChannel(c.__dd_tracer, c.events, c, __dd_wrapEvent) + } + + func __dd_initProducer(p *Producer) { + if p.__dd_tracer != nil { + return + } + p.__dd_tracer = __dd_newKafkaTracer() + // TODO: accessing p.events and p.produceChannel here might break if the library renames this variable... + p.__dd_events = p.events + p.__dd_produceChannel = kafkatrace.WrapProduceChannel(p.__dd_tracer, p.produceChannel, __dd_wrapMessage) + if p.__dd_tracer.DSMEnabled() { + p.__dd_events = kafkatrace.WrapProduceEventsChannel(p.__dd_tracer, p.events, __dd_wrapEvent) + } + } + + type __dd_eventChan = chan Event + type __dd_messageChan = chan *Message + type __dd_kafkaTracer = kafkatrace.Tracer + + ## Trace Consumer ## + + - id: NewConsumer + join-point: + all-of: + - import-path: github.com/confluentinc/confluent-kafka-go/kafka + - function-body: + function: + - name: NewConsumer + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $conf := .Function.Argument 0 -}} + {{- $c := .Function.Result 0 -}} + defer func() { + if {{ $c }} == nil { + return + } + {{ $c }}.__dd_confmap = {{ $conf }} + __dd_initConsumer({{ $c }}) + }() + + - id: Consumer.Close + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Consumer' + - name: Close + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + __dd_initConsumer({{ $c }}) + defer func() { + if {{ $c }}.__dd_events == nil && {{ $c }}.__dd_tracer.PrevSpan != nil { + {{ $c }}.__dd_tracer.PrevSpan.Finish() + {{ $c }}.__dd_tracer.PrevSpan = nil + } + }() + + - id: Consumer.Events + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Consumer' + - name: Events + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $events := .Function.Result 0 -}} + __dd_initConsumer({{ $c }}) + defer func() { + {{ $events }} = {{ $c }}.__dd_events + }() + + # kafka.Consumer#ReadMessage calls kafka.Consumer#Poll internally, so there's no need to trace it. + - id: Consumer.Poll + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Consumer' + - name: Poll + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $event := .Function.Result 0 -}} + __dd_initConsumer({{ $c }}) + if {{ $c }}.__dd_tracer.PrevSpan != nil { + {{ $c }}.__dd_tracer.PrevSpan.Finish() + {{ $c }}.__dd_tracer.PrevSpan = nil + } + defer func() { + if msg, ok := {{ $event }}.(*Message); ok { + tMsg := __dd_wrapMessage(msg) + {{ $c }}.__dd_tracer.SetConsumeCheckpoint(tMsg) + {{ $c }}.__dd_tracer.PrevSpan = {{ $c }}.__dd_tracer.StartConsumeSpan(tMsg) + } else if offset, ok := {{ $event }}.(OffsetsCommitted); ok { + tOffsets := __dd_wrapTopicPartitions(offset.Offsets) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, offset.Error) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + } + }() + + - id: Consumer.Commit + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Consumer' + - name: Commit + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $tps := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initConsumer({{ $c }}) + defer func() { + tOffsets := __dd_wrapTopicPartitions({{ $tps }}) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, {{ $err }}) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + }() + + - id: Consumer.CommitMessage + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Consumer' + - name: CommitMessage + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $tps := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initConsumer({{ $c }}) + defer func() { + tOffsets := __dd_wrapTopicPartitions({{ $tps }}) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, {{ $err }}) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + }() + + - id: Consumer.CommitOffsets + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Consumer' + - name: CommitOffsets + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + template: |- + {{- $c := .Function.Receiver -}} + {{- $tps := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initConsumer({{ $c }}) + defer func() { + tOffsets := __dd_wrapTopicPartitions({{ $tps }}) + {{ $c }}.__dd_tracer.TrackCommitOffsets(tOffsets, {{ $err }}) + {{ $c }}.__dd_tracer.TrackHighWatermarkOffset(tOffsets, {{ $c }}) + }() + + ## Trace Producer ## + + - id: Producer + join-point: + struct-definition: github.com/confluentinc/confluent-kafka-go/kafka.Producer + advice: + - add-struct-field: + name: __dd_tracer + type: "*__dd_kafkaTracer" + - add-struct-field: + name: __dd_events + type: "__dd_eventChan" + - add-struct-field: + name: __dd_produceChannel + type: "__dd_messageChan" + + - id: Producer.Events + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Producer' + - name: Events + advice: + - prepend-statements: + template: |- + {{- $p := .Function.Receiver -}} + {{- $events := .Function.Result 0 -}} + __dd_initProducer({{ $p }}) + defer func() { + {{ $events }} = {{ $p }}.__dd_events + }() + + - id: Producer.ProduceChannel + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Producer' + - name: ProduceChannel + advice: + - prepend-statements: + template: |- + {{- $p := .Function.Receiver -}} + {{- $produceChannel := .Function.Result 0 -}} + __dd_initProducer({{ $p }}) + defer func() { + {{ $produceChannel }} = {{ $p }}.__dd_produceChannel + }() + + - id: Producer.Close + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Producer' + - name: Close + advice: + - prepend-statements: + template: |- + {{- $p := .Function.Receiver -}} + __dd_initProducer({{ $p }}) + close({{ $p }}.__dd_produceChannel) + + - id: Producer.Produce + join-point: + function-body: + function: + - receiver: '*github.com/confluentinc/confluent-kafka-go/kafka.Producer' + - name: Produce + advice: + - prepend-statements: + imports: + kafkatrace: github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + template: |- + {{- $p := .Function.Receiver -}} + {{- $msg := .Function.Argument 0 -}} + {{- $deliveryChan := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + __dd_initProducer({{ $p }}) + tMsg := __dd_wrapMessage({{ $msg }}) + span := p.__dd_tracer.StartProduceSpan(tMsg) + + var errChan chan error + {{ $deliveryChan }}, errChan = kafkatrace.WrapDeliveryChannel({{ $p }}.__dd_tracer, {{ $deliveryChan }}, span, __dd_wrapEvent) + + {{ $p }}.__dd_tracer.SetProduceCheckpoint(tMsg) + defer func() { + if {{ $err }} != nil { + if errChan != nil { + errChan <- {{ $err }} + } else { + span.Finish(tracer.WithError({{ $err }})) + } + } + }() diff --git a/contrib/confluentinc/confluent-kafka-go/kafka/tracing.go b/contrib/confluentinc/confluent-kafka-go/kafka/types.go similarity index 67% rename from contrib/confluentinc/confluent-kafka-go/kafka/tracing.go rename to contrib/confluentinc/confluent-kafka-go/kafka/types.go index 9e4c379ff9..aad46e827f 100644 --- a/contrib/confluentinc/confluent-kafka-go/kafka/tracing.go +++ b/contrib/confluentinc/confluent-kafka-go/kafka/types.go @@ -8,14 +8,14 @@ package kafka import ( "github.com/confluentinc/confluent-kafka-go/kafka" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/confluentinc/confluent-kafka-go/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/contrib/confluentinc/confluent-kafka-go/kafkatrace" ) type wMessage struct { *kafka.Message } -func wrapMessage(msg *kafka.Message) tracing.Message { +func wrapMessage(msg *kafka.Message) kafkatrace.Message { if msg == nil { return nil } @@ -34,15 +34,15 @@ func (w *wMessage) GetKey() []byte { return w.Message.Key } -func (w *wMessage) GetHeaders() []tracing.Header { - hs := make([]tracing.Header, 0, len(w.Headers)) +func (w *wMessage) GetHeaders() []kafkatrace.Header { + hs := make([]kafkatrace.Header, 0, len(w.Headers)) for _, h := range w.Headers { hs = append(hs, wrapHeader(h)) } return hs } -func (w *wMessage) SetHeaders(headers []tracing.Header) { +func (w *wMessage) SetHeaders(headers []kafkatrace.Header) { hs := make([]kafka.Header, 0, len(headers)) for _, h := range headers { hs = append(hs, kafka.Header{ @@ -53,7 +53,7 @@ func (w *wMessage) SetHeaders(headers []tracing.Header) { w.Message.Headers = hs } -func (w *wMessage) GetTopicPartition() tracing.TopicPartition { +func (w *wMessage) GetTopicPartition() kafkatrace.TopicPartition { return wrapTopicPartition(w.Message.TopicPartition) } @@ -61,7 +61,7 @@ type wHeader struct { kafka.Header } -func wrapHeader(h kafka.Header) tracing.Header { +func wrapHeader(h kafka.Header) kafkatrace.Header { return &wHeader{h} } @@ -77,12 +77,12 @@ type wTopicPartition struct { kafka.TopicPartition } -func wrapTopicPartition(tp kafka.TopicPartition) tracing.TopicPartition { +func wrapTopicPartition(tp kafka.TopicPartition) kafkatrace.TopicPartition { return wTopicPartition{tp} } -func wrapTopicPartitions(tps []kafka.TopicPartition) []tracing.TopicPartition { - wtps := make([]tracing.TopicPartition, 0, len(tps)) +func wrapTopicPartitions(tps []kafka.TopicPartition) []kafkatrace.TopicPartition { + wtps := make([]kafkatrace.TopicPartition, 0, len(tps)) for _, tp := range tps { wtps = append(wtps, wTopicPartition{tp}) } @@ -112,18 +112,18 @@ type wEvent struct { kafka.Event } -func wrapEvent(event kafka.Event) tracing.Event { +func wrapEvent(event kafka.Event) kafkatrace.Event { return wEvent{event} } -func (w wEvent) KafkaMessage() (tracing.Message, bool) { +func (w wEvent) KafkaMessage() (kafkatrace.Message, bool) { if m, ok := w.Event.(*kafka.Message); ok { return wrapMessage(m), true } return nil, false } -func (w wEvent) KafkaOffsetsCommitted() (tracing.OffsetsCommitted, bool) { +func (w wEvent) KafkaOffsetsCommitted() (kafkatrace.OffsetsCommitted, bool) { if oc, ok := w.Event.(kafka.OffsetsCommitted); ok { return wrapOffsetsCommitted(oc), true } @@ -134,7 +134,7 @@ type wOffsetsCommitted struct { kafka.OffsetsCommitted } -func wrapOffsetsCommitted(oc kafka.OffsetsCommitted) tracing.OffsetsCommitted { +func wrapOffsetsCommitted(oc kafka.OffsetsCommitted) kafkatrace.OffsetsCommitted { return wOffsetsCommitted{oc} } @@ -142,8 +142,8 @@ func (w wOffsetsCommitted) GetError() error { return w.Error } -func (w wOffsetsCommitted) GetOffsets() []tracing.TopicPartition { - ttps := make([]tracing.TopicPartition, 0, len(w.Offsets)) +func (w wOffsetsCommitted) GetOffsets() []kafkatrace.TopicPartition { + ttps := make([]kafkatrace.TopicPartition, 0, len(w.Offsets)) for _, tp := range w.Offsets { ttps = append(ttps, wrapTopicPartition(tp)) } @@ -154,7 +154,7 @@ type wConfigMap struct { cfg *kafka.ConfigMap } -func wrapConfigMap(cm *kafka.ConfigMap) tracing.ConfigMap { +func wrapConfigMap(cm *kafka.ConfigMap) kafkatrace.ConfigMap { return &wConfigMap{cm} } diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/consumer.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/consumer.go similarity index 78% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/consumer.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/consumer.go index 90678c4ed2..f31ee00fd1 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/consumer.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/consumer.go @@ -3,17 +3,16 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) -func WrapConsumeEventsChannel[E any, TE Event](tr *KafkaTracer, in chan E, consumer Consumer, translateFn func(E) TE) chan E { +func WrapConsumeEventsChannel[E any, TE Event](tr *Tracer, in chan E, consumer Consumer, translateFn func(E) TE) chan E { // in will be nil when consuming via the events channel is not enabled if in == nil { return nil @@ -24,7 +23,7 @@ func WrapConsumeEventsChannel[E any, TE Event](tr *KafkaTracer, in chan E, consu defer close(out) for evt := range in { tEvt := translateFn(evt) - var next ddtrace.Span + var next *tracer.Span // only trace messages if msg, ok := tEvt.KafkaMessage(); ok { @@ -51,7 +50,7 @@ func WrapConsumeEventsChannel[E any, TE Event](tr *KafkaTracer, in chan E, consu return out } -func (tr *KafkaTracer) StartConsumeSpan(msg Message) ddtrace.Span { +func (tr *Tracer) StartConsumeSpan(msg Message) *tracer.Span { opts := []tracer.StartSpanOption{ tracer.ServiceName(tr.consumerServiceName), tracer.ResourceName("Consume Topic " + msg.GetTopicPartition().GetTopic()), @@ -61,6 +60,7 @@ func (tr *KafkaTracer) StartConsumeSpan(msg Message) ddtrace.Span { tracer.Tag(ext.Component, ComponentName(tr.ckgoVersion)), tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), + tracer.Tag(ext.MessagingDestinationName, msg.GetTopicPartition().GetTopic()), tracer.Measured(), } if tr.bootstrapServers != "" { @@ -77,6 +77,10 @@ func (tr *KafkaTracer) StartConsumeSpan(msg Message) ddtrace.Span { // kafka supports headers, so try to extract a span context carrier := MessageCarrier{msg: msg} if spanctx, err := tracer.Extract(carrier); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } span, _ := tracer.StartSpanFromContext(tr.ctx, tr.consumerSpanName, opts...) diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/dsm.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/dsm.go similarity index 81% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/dsm.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/dsm.go index d27dc18ab8..d3477e873a 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/dsm.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/dsm.go @@ -3,17 +3,17 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) -func (tr *KafkaTracer) TrackCommitOffsets(offsets []TopicPartition, err error) { +func (tr *Tracer) TrackCommitOffsets(offsets []TopicPartition, err error) { if err != nil || tr.groupID == "" || !tr.dsmEnabled { return } @@ -22,7 +22,7 @@ func (tr *KafkaTracer) TrackCommitOffsets(offsets []TopicPartition, err error) { } } -func (tr *KafkaTracer) TrackHighWatermarkOffset(offsets []TopicPartition, consumer Consumer) { +func (tr *Tracer) TrackHighWatermarkOffset(offsets []TopicPartition, consumer Consumer) { if !tr.dsmEnabled { return } @@ -33,7 +33,7 @@ func (tr *KafkaTracer) TrackHighWatermarkOffset(offsets []TopicPartition, consum } } -func (tr *KafkaTracer) TrackProduceOffsets(msg Message) { +func (tr *Tracer) TrackProduceOffsets(msg Message) { err := msg.GetTopicPartition().GetError() if err != nil || !tr.dsmEnabled || msg.GetTopicPartition().GetTopic() == "" { return @@ -42,7 +42,7 @@ func (tr *KafkaTracer) TrackProduceOffsets(msg Message) { tracer.TrackKafkaProduceOffset(tp.GetTopic(), tp.GetPartition(), tp.GetOffset()) } -func (tr *KafkaTracer) SetConsumeCheckpoint(msg Message) { +func (tr *Tracer) SetConsumeCheckpoint(msg Message) { if !tr.dsmEnabled || msg == nil { return } @@ -62,7 +62,7 @@ func (tr *KafkaTracer) SetConsumeCheckpoint(msg Message) { datastreams.InjectToBase64Carrier(ctx, carrier) } -func (tr *KafkaTracer) SetProduceCheckpoint(msg Message) { +func (tr *Tracer) SetProduceCheckpoint(msg Message) { if !tr.dsmEnabled || msg == nil { return } diff --git a/contrib/confluentinc/confluent-kafka-go/kafkatrace/kafkatrace.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/kafkatrace.go new file mode 100644 index 0000000000..59f1940ad4 --- /dev/null +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/kafkatrace.go @@ -0,0 +1,40 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package kafkatrace provides common tracing functionality for different confluentinc/confluent-kafka-go versions. +// +// This package is not meant to be used directly (use instead +// github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 or +// github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2) +package kafkatrace + +import "github.com/DataDog/dd-trace-go/v2/instrumentation" + +type CKGoVersion int32 + +const ( + CKGoVersion1 CKGoVersion = 1 + CKGoVersion2 CKGoVersion = 2 +) + +func ComponentName(v CKGoVersion) string { + switch v { + case CKGoVersion1: + return "confluentinc/confluent-kafka-go/kafka" + case CKGoVersion2: + return "confluentinc/confluent-kafka-go/kafka.v2" + default: + return "" + } +} + +func Package(v CKGoVersion) *instrumentation.Instrumentation { + switch v { + case CKGoVersion2: + return instrumentation.Load(instrumentation.PackageConfluentKafkaGoV2) + default: + return instrumentation.Load(instrumentation.PackageConfluentKafkaGo) + } +} diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/message_carrier.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/message_carrier.go similarity index 94% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/message_carrier.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/message_carrier.go index 5fbeecf9e0..ca189c9d5e 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/message_carrier.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/message_carrier.go @@ -3,9 +3,9 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace -import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +import "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" // A MessageCarrier implements TextMapReader/TextMapWriter for extracting/injecting traces on a kafka.msg type MessageCarrier struct { diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/producer.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/producer.go similarity index 75% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/producer.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/producer.go index 25b043017f..f67c004b3d 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/producer.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/producer.go @@ -3,17 +3,16 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) -func WrapProduceChannel[M any, TM Message](tr *KafkaTracer, out chan M, translateFn func(M) TM) chan M { +func WrapProduceChannel[M any, TM Message](tr *Tracer, out chan M, translateFn func(M) TM) chan M { if out == nil { return out } @@ -30,7 +29,7 @@ func WrapProduceChannel[M any, TM Message](tr *KafkaTracer, out chan M, translat return in } -func WrapProduceEventsChannel[E any, TE Event](tr *KafkaTracer, in chan E, translateFn func(E) TE) chan E { +func WrapProduceEventsChannel[E any, TE Event](tr *Tracer, in chan E, translateFn func(E) TE) chan E { if in == nil { return nil } @@ -48,7 +47,7 @@ func WrapProduceEventsChannel[E any, TE Event](tr *KafkaTracer, in chan E, trans return out } -func (tr *KafkaTracer) StartProduceSpan(msg Message) ddtrace.Span { +func (tr *Tracer) StartProduceSpan(msg Message) *tracer.Span { opts := []tracer.StartSpanOption{ tracer.ServiceName(tr.producerServiceName), tracer.ResourceName("Produce Topic " + msg.GetTopicPartition().GetTopic()), @@ -57,6 +56,7 @@ func (tr *KafkaTracer) StartProduceSpan(msg Message) ddtrace.Span { tracer.Tag(ext.SpanKind, ext.SpanKindProducer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), tracer.Tag(ext.MessagingKafkaPartition, msg.GetTopicPartition().GetPartition()), + tracer.Tag(ext.MessagingDestinationName, msg.GetTopicPartition().GetTopic()), } if tr.bootstrapServers != "" { opts = append(opts, tracer.Tag(ext.KafkaBootstrapServers, tr.bootstrapServers)) @@ -67,6 +67,10 @@ func (tr *KafkaTracer) StartProduceSpan(msg Message) ddtrace.Span { // if there's a span context in the headers, use that as the parent carrier := NewMessageCarrier(msg) if spanctx, err := tracer.Extract(carrier); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } span, _ := tracer.StartSpanFromContext(tr.ctx, tr.producerSpanName, opts...) @@ -75,7 +79,7 @@ func (tr *KafkaTracer) StartProduceSpan(msg Message) ddtrace.Span { return span } -func WrapDeliveryChannel[E any, TE Event](tr *KafkaTracer, deliveryChan chan E, span ddtrace.Span, translateFn func(E) TE) (chan E, chan error) { +func WrapDeliveryChannel[E any, TE Event](tr *Tracer, deliveryChan chan E, span *tracer.Span, translateFn func(E) TE) (chan E, chan error) { // if the user has selected a delivery channel, we will wrap it and // wait for the delivery event to finish the span if deliveryChan == nil { diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/kafka_tracer.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/tracer.go similarity index 51% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/kafka_tracer.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/tracer.go index b293c698ea..f352eda117 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/kafka_tracer.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/tracer.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace import ( "context" @@ -11,15 +11,13 @@ import ( "net" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/internal" ) -const defaultServiceName = "kafka" - -type KafkaTracer struct { - PrevSpan ddtrace.Span +type Tracer struct { + PrevSpan *tracer.Span ctx context.Context consumerServiceName string producerServiceName string @@ -34,33 +32,44 @@ type KafkaTracer struct { librdKafkaVersion int } -func (tr *KafkaTracer) DSMEnabled() bool { +func (tr *Tracer) DSMEnabled() bool { return tr.dsmEnabled } -// An Option customizes the KafkaTracer. -type Option func(tr *KafkaTracer) +type Option interface { + apply(*Tracer) +} + +// OptionFn represents options applicable to NewConsumer, NewProducer, WrapConsumer and WrapProducer. +type OptionFn func(*Tracer) -func NewKafkaTracer(ckgoVersion CKGoVersion, librdKafkaVersion int, opts ...Option) *KafkaTracer { - tr := &KafkaTracer{ - ctx: context.Background(), - // analyticsRate: globalconfig.AnalyticsRate(), - analyticsRate: math.NaN(), +func (fn OptionFn) apply(cfg *Tracer) { + fn(cfg) +} + +func NewKafkaTracer(instr *instrumentation.Instrumentation, ckgoVersion CKGoVersion, librdKafkaVersion int, opts ...Option) *Tracer { + tr := &Tracer{ + ctx: context.Background(), + analyticsRate: instr.AnalyticsRate(false), ckgoVersion: ckgoVersion, librdKafkaVersion: librdKafkaVersion, } - tr.dsmEnabled = internal.BoolEnv("DD_DATA_STREAMS_ENABLED", false) if internal.BoolEnv("DD_TRACE_KAFKA_ANALYTICS_ENABLED", false) { tr.analyticsRate = 1.0 } - tr.consumerServiceName = namingschema.ServiceName(defaultServiceName) - tr.producerServiceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - tr.consumerSpanName = namingschema.OpName(namingschema.KafkaInbound) - tr.producerSpanName = namingschema.OpName(namingschema.KafkaOutbound) + tr.dsmEnabled = instr.DataStreamsEnabled() + + tr.consumerServiceName = instr.ServiceName(instrumentation.ComponentConsumer, nil) + tr.producerServiceName = instr.ServiceName(instrumentation.ComponentProducer, nil) + tr.consumerSpanName = instr.OperationName(instrumentation.ComponentConsumer, nil) + tr.producerSpanName = instr.OperationName(instrumentation.ComponentProducer, nil) for _, opt := range opts { - opt(tr) + if opt == nil { + continue + } + opt.apply(tr) } return tr } @@ -68,57 +77,57 @@ func NewKafkaTracer(ckgoVersion CKGoVersion, librdKafkaVersion int, opts ...Opti // WithContext sets the config context to ctx. // Deprecated: This is deprecated in favor of passing the context // via the message headers -func WithContext(ctx context.Context) Option { - return func(tr *KafkaTracer) { +func WithContext(ctx context.Context) OptionFn { + return func(tr *Tracer) { tr.ctx = ctx } } -// WithServiceName sets the config service name to serviceName. -func WithServiceName(serviceName string) Option { - return func(tr *KafkaTracer) { - tr.consumerServiceName = serviceName - tr.producerServiceName = serviceName +// WithService sets the config service name to serviceName. +func WithService(serviceName string) OptionFn { + return func(cfg *Tracer) { + cfg.consumerServiceName = serviceName + cfg.producerServiceName = serviceName } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(tr *KafkaTracer) { +func WithAnalytics(on bool) OptionFn { + return func(cfg *Tracer) { if on { - tr.analyticsRate = 1.0 + cfg.analyticsRate = 1.0 } else { - tr.analyticsRate = math.NaN() + cfg.analyticsRate = math.NaN() } } } // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(tr *KafkaTracer) { +func WithAnalyticsRate(rate float64) OptionFn { + return func(cfg *Tracer) { if rate >= 0.0 && rate <= 1.0 { - tr.analyticsRate = rate + cfg.analyticsRate = rate } else { - tr.analyticsRate = math.NaN() + cfg.analyticsRate = math.NaN() } } } // WithCustomTag will cause the given tagFn to be evaluated after executing // a query and attach the result to the span tagged by the key. -func WithCustomTag(tag string, tagFn func(msg Message) interface{}) Option { - return func(tr *KafkaTracer) { - if tr.tagFns == nil { - tr.tagFns = make(map[string]func(msg Message) interface{}) +func WithCustomTag(tag string, tagFn func(msg Message) interface{}) OptionFn { + return func(cfg *Tracer) { + if cfg.tagFns == nil { + cfg.tagFns = make(map[string]func(msg Message) interface{}) } - tr.tagFns[tag] = tagFn + cfg.tagFns[tag] = tagFn } } // WithConfig extracts the config information for the client to be tagged -func WithConfig(cg ConfigMap) Option { - return func(tr *KafkaTracer) { +func WithConfig(cg ConfigMap) OptionFn { + return func(tr *Tracer) { if groupID, err := cg.Get("group.id", ""); err == nil { tr.groupID = groupID.(string) } @@ -135,8 +144,8 @@ func WithConfig(cg ConfigMap) Option { } // WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ -func WithDataStreams() Option { - return func(tr *KafkaTracer) { +func WithDataStreams() OptionFn { + return func(tr *Tracer) { tr.dsmEnabled = true } } diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/kafka_tracer_test.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/tracer_test.go similarity index 64% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/kafka_tracer_test.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/tracer_test.go index f426458dbb..f103909a8c 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/kafka_tracer_test.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/tracer_test.go @@ -3,65 +3,64 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace import ( "math" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) +var testInstr = &instrumentation.Instrumentation{} + func TestDataStreamsActivation(t *testing.T) { t.Run("default", func(t *testing.T) { - tr := NewKafkaTracer(0, 0) + tr := NewKafkaTracer(testInstr, 0, 0) assert.False(t, tr.DSMEnabled()) }) t.Run("withOption", func(t *testing.T) { - tr := NewKafkaTracer(0, 0, WithDataStreams()) + tr := NewKafkaTracer(testInstr, 0, 0, WithDataStreams()) assert.True(t, tr.DSMEnabled()) }) t.Run("withEnv", func(t *testing.T) { t.Setenv("DD_DATA_STREAMS_ENABLED", "true") - tr := NewKafkaTracer(0, 0) + tr := NewKafkaTracer(testInstr, 0, 0) assert.True(t, tr.DSMEnabled()) }) t.Run("optionOverridesEnv", func(t *testing.T) { t.Setenv("DD_DATA_STREAMS_ENABLED", "false") - tr := NewKafkaTracer(0, 0, WithDataStreams()) + tr := NewKafkaTracer(testInstr, 0, 0, WithDataStreams()) assert.True(t, tr.DSMEnabled()) }) } func TestAnalyticsSettings(t *testing.T) { t.Run("defaults", func(t *testing.T) { - tr := NewKafkaTracer(0, 0) + tr := NewKafkaTracer(testInstr, 0, 0) assert.True(t, math.IsNaN(tr.analyticsRate)) }) t.Run("global", func(t *testing.T) { t.Skip("global flag disabled") - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) - tr := NewKafkaTracer(0, 0) + tr := NewKafkaTracer(testInstr, 0, 0) assert.Equal(t, 0.4, tr.analyticsRate) }) t.Run("enabled", func(t *testing.T) { - tr := NewKafkaTracer(0, 0, WithAnalytics(true)) + tr := NewKafkaTracer(testInstr, 0, 0, WithAnalytics(true)) assert.Equal(t, 1.0, tr.analyticsRate) }) t.Run("override", func(t *testing.T) { - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) - tr := NewKafkaTracer(0, 0, WithAnalyticsRate(0.2)) + tr := NewKafkaTracer(testInstr, 0, 0, WithAnalyticsRate(0.2)) assert.Equal(t, 0.2, tr.analyticsRate) }) } diff --git a/contrib/confluentinc/confluent-kafka-go/internal/tracing/types.go b/contrib/confluentinc/confluent-kafka-go/kafkatrace/types.go similarity index 92% rename from contrib/confluentinc/confluent-kafka-go/internal/tracing/types.go rename to contrib/confluentinc/confluent-kafka-go/kafkatrace/types.go index 537c111341..e3e3ba1044 100644 --- a/contrib/confluentinc/confluent-kafka-go/internal/tracing/types.go +++ b/contrib/confluentinc/confluent-kafka-go/kafkatrace/types.go @@ -3,11 +3,9 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package tracing +package kafkatrace -import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" -) +import "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" type Message interface { GetValue() []byte @@ -62,5 +60,5 @@ type ConfigMap interface { } type SpanStore struct { - Prev ddtrace.Span + Prev *tracer.Span } diff --git a/contrib/contrib.go b/contrib/contrib.go new file mode 100644 index 0000000000..015dec46b7 --- /dev/null +++ b/contrib/contrib.go @@ -0,0 +1,14 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +// The purpose of the packages held in contrib is to provide tracing on top of commonly used +// packages from the standard library as well as the community in a "plug-and-play" manner. +// This means that by simply importing the appropriate path, functions are exposed having +// the same signature as the original package. These functions return structures that embed +// the original return value, allowing them to be used as they normally would with tracing +// activated out of the box. + +// All of these libraries are supported by our https://www.datadoghq.com/apm/. +package contrib diff --git a/contrib/database/sql/appsec_test.go b/contrib/database/sql/appsec_test.go new file mode 100644 index 0000000000..a08fab4059 --- /dev/null +++ b/contrib/database/sql/appsec_test.go @@ -0,0 +1,164 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package sql + +import ( + "database/sql" + "fmt" + "log" + "math/rand" + "net/http" + "net/http/httptest" + "net/url" + "testing" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptracemock" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/stretchr/testify/require" + + _ "modernc.org/sqlite" +) + +func prepareSQLDB(nbEntries int) (*sql.DB, error) { + const tables = ` +CREATE TABLE user ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name text NOT NULL, + email text NOT NULL, + password text NOT NULL +); +CREATE TABLE product ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + name text NOT NULL, + category text NOT NULL, + price int NOT NULL +); +` + db, err := Open("sqlite", ":memory:") + if err != nil { + log.Fatalln("unexpected sqltrace.Open error:", err) + } + + if _, err := db.Exec(tables); err != nil { + return nil, err + } + + for i := 0; i < nbEntries; i++ { + _, err := db.Exec( + "INSERT INTO user (name, email, password) VALUES (?, ?, ?)", + fmt.Sprintf("User#%d", i), + fmt.Sprintf("user%d@mail.com", i), + fmt.Sprintf("secret-password#%d", i)) + if err != nil { + return nil, err + } + + _, err = db.Exec( + "INSERT INTO product (name, category, price) VALUES (?, ?, ?)", + fmt.Sprintf("Product %d", i), + "sneaker", + rand.Intn(500)) + if err != nil { + return nil, err + } + } + + return db, nil +} + +func TestRASPSQLi(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/rasp.json") + testutils.StartAppSec(t) + + if !instr.AppSecRASPEnabled() { + t.Skip("RASP needs to be enabled for this test") + } + db, err := prepareSQLDB(10) + require.NoError(t, err) + + // Setup the http server + mux := httptracemock.NewServeMux() + mux.HandleFunc("/query", func(w http.ResponseWriter, r *http.Request) { + // Subsequent spans inherit their parent from context. + q := r.URL.Query().Get("query") + rows, err := db.QueryContext(r.Context(), q) + if events.IsSecurityError(err) { + return + } + if err == nil { + rows.Close() + } + w.Write([]byte("Hello World!\n")) + }) + mux.HandleFunc("/exec", func(w http.ResponseWriter, r *http.Request) { + // Subsequent spans inherit their parent from context. + q := r.URL.Query().Get("query") + _, err := db.ExecContext(r.Context(), q) + if events.IsSecurityError(err) { + return + } + w.Write([]byte("Hello World!\n")) + }) + srv := httptest.NewServer(mux) + defer srv.Close() + + for name, tc := range map[string]struct { + query string + err error + }{ + "no-error": { + query: url.QueryEscape("SELECT 1"), + }, + "injection/SELECT": { + query: url.QueryEscape("SELECT * FROM users WHERE user=\"\" UNION ALL SELECT NULL;version()--"), + err: &events.BlockingSecurityEvent{}, + }, + "injection/UPDATE": { + query: url.QueryEscape("UPDATE users SET pwd = \"root\" WHERE id = \"\" OR 1 = 1--"), + err: &events.BlockingSecurityEvent{}, + }, + "injection/EXEC": { + query: url.QueryEscape("EXEC version(); DROP TABLE users--"), + err: &events.BlockingSecurityEvent{}, + }, + } { + for _, endpoint := range []string{"/query", "/exec"} { + t.Run(name+endpoint, func(t *testing.T) { + // Start tracer and appsec + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srv.URL+endpoint+"?query="+tc.query, nil) + require.NoError(t, err) + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + + spans := mt.FinishedSpans() + + require.Len(t, spans, 2) + + if tc.err != nil { + require.Equal(t, 403, res.StatusCode) + + for _, sp := range spans { + switch sp.OperationName() { + case "http.request": + require.Contains(t, sp.Tag("_dd.appsec.json"), "rasp-942-100") + case "sqlite.query": + require.NotContains(t, sp.Tags(), "error") + } + } + } else { + require.Equal(t, 200, res.StatusCode) + } + + }) + } + } +} diff --git a/contrib/database/sql/conn.go b/contrib/database/sql/conn.go index 91cadea451..f714327431 100644 --- a/contrib/database/sql/conn.go +++ b/contrib/database/sql/conn.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package sql // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" +package sql // import "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" import ( "context" @@ -11,14 +11,11 @@ import ( "math" "time" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/sqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/sqlsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" ) var _ driver.Conn = (*TracedConn)(nil) @@ -60,7 +57,7 @@ type TracedConn struct { // checkQuerySafety runs ASM RASP SQLi checks on the query to verify if it can safely be run. // If it's unsafe to run, an *events.BlockingSecurityEvent is returned func checkQuerySecurity(ctx context.Context, query, driver string) error { - if !appsec.Enabled() { + if !instr.AppSecEnabled() { return nil } return sqlsec.ProtectSQLOperation(ctx, query, driver) @@ -292,7 +289,7 @@ func (tc *TracedConn) injectComments(ctx context.Context, query string, mode tra // when a driver returns driver.ErrSkip. In order to work with those constraints, a new span id is generated and // used during SQL comment injection and returned for the sql span to be used later when/if the span // gets created. - var spanCtx ddtrace.SpanContext + var spanCtx *tracer.SpanContext if span, ok := tracer.SpanFromContext(ctx); ok { spanCtx = span.Context() } @@ -300,7 +297,7 @@ func (tc *TracedConn) injectComments(ctx context.Context, query string, mode tra carrier := tracer.SQLCommentCarrier{Query: query, Mode: mode, DBServiceName: tc.cfg.serviceName, PeerDBHostname: tc.meta[ext.TargetHost], PeerDBName: tc.meta[ext.DBName], PeerService: tc.providedPeerService(ctx)} if err := carrier.Inject(spanCtx); err != nil { // this should never happen - log.Warn("contrib/database/sql: failed to inject query comments: %v", err) + instr.Logger().Warn("contrib/database/sql: failed to inject query comments: %s", err.Error()) } return carrier.Query, carrier.SpanID } @@ -313,7 +310,7 @@ func withDBMTraceInjectedTag(mode tracer.DBMPropagationMode) []tracer.StartSpanO } // tryTrace will create a span using the given arguments, but will act as a no-op when err is driver.ErrSkip. -func (tp *traceParams) tryTrace(ctx context.Context, qtype QueryType, query string, startTime time.Time, err error, spanOpts ...ddtrace.StartSpanOption) { +func (tp *traceParams) tryTrace(ctx context.Context, qtype QueryType, query string, startTime time.Time, err error, spanOpts ...tracer.StartSpanOption) { if err == driver.ErrSkip { // Not a user error: driver is telling sql package that an // optional interface method is not implemented. There is @@ -330,7 +327,7 @@ func (tp *traceParams) tryTrace(ctx context.Context, qtype QueryType, query stri return } dbSystem, _ := normalizeDBSystem(tp.driverName) - opts := options.Copy(spanOpts...) + opts := options.Expand(spanOpts, 0, 6+len(tp.cfg.tags)+1) opts = append(opts, tracer.ServiceName(tp.cfg.serviceName), tracer.SpanType(ext.SpanTypeSQL), diff --git a/contrib/database/sql/conn_test.go b/contrib/database/sql/conn_test.go index e3d295b7a9..44f9b267c0 100644 --- a/contrib/database/sql/conn_test.go +++ b/contrib/database/sql/conn_test.go @@ -13,8 +13,8 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" "github.com/go-sql-driver/mysql" "github.com/lib/pq" @@ -27,7 +27,7 @@ func TestWithSpanTags(t *testing.T) { name string dsn string driver driver.Driver - opts []RegisterOption + opts []Option } type want struct { opName string @@ -45,7 +45,7 @@ func TestWithSpanTags(t *testing.T) { name: "mysql", dsn: "test:test@tcp(127.0.0.1:3306)/test", driver: &mysql.MySQLDriver{}, - opts: []RegisterOption{}, + opts: []Option{}, }, want: want{ opName: "mysql.query", @@ -63,8 +63,8 @@ func TestWithSpanTags(t *testing.T) { name: "postgres", dsn: "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", driver: &pq.Driver{}, - opts: []RegisterOption{ - WithServiceName("postgres-test"), + opts: []Option{ + WithService("postgres-test"), WithAnalyticsRate(0.2), }, }, @@ -108,6 +108,7 @@ func TestWithSpanTags(t *testing.T) { } assert.Equal(t, ext.SpanKindClient, connectSpan.Tag(ext.SpanKind)) assert.Equal(t, "database/sql", connectSpan.Tag(ext.Component)) + assert.Equal(t, string(componentName), connectSpan.Integration()) assert.Equal(t, tt.want.dbSystem, connectSpan.Tag(ext.DBSystem)) span := spans[1] @@ -117,6 +118,7 @@ func TestWithSpanTags(t *testing.T) { } assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(t, "database/sql", span.Tag(ext.Component)) + assert.Equal(t, string(componentName), connectSpan.Integration()) assert.Equal(t, tt.want.dbSystem, connectSpan.Tag(ext.DBSystem)) }) } @@ -127,7 +129,7 @@ func TestWithIgnoreQueryTypes(t *testing.T) { name string dsn string driver driver.Driver - opts []RegisterOption + opts []Option } testcases := []struct { name string @@ -141,7 +143,7 @@ func TestWithIgnoreQueryTypes(t *testing.T) { name: "mysql", dsn: "test:test@tcp(127.0.0.1:3306)/test", driver: &mysql.MySQLDriver{}, - opts: []RegisterOption{ + opts: []Option{ WithIgnoreQueryTypes(QueryTypeConnect), }, }, @@ -159,7 +161,7 @@ func TestWithIgnoreQueryTypes(t *testing.T) { name: "postgres", dsn: "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", driver: &pq.Driver{}, - opts: []RegisterOption{ + opts: []Option{ WithIgnoreQueryTypes(QueryTypeConnect), }, }, @@ -196,7 +198,7 @@ func TestWithChildSpansOnly(t *testing.T) { name string dsn string driver driver.Driver - opts []RegisterOption + opts []Option } testcases := []struct { name string @@ -208,7 +210,7 @@ func TestWithChildSpansOnly(t *testing.T) { name: "mysql", dsn: "test:test@tcp(127.0.0.1:3306)/test", driver: &mysql.MySQLDriver{}, - opts: []RegisterOption{ + opts: []Option{ WithChildSpansOnly(), }, }, @@ -219,9 +221,9 @@ func TestWithChildSpansOnly(t *testing.T) { name: "postgres", dsn: "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", driver: &pq.Driver{}, - opts: []RegisterOption{ + opts: []Option{ WithChildSpansOnly(), - WithServiceName("postgres-test"), + WithService("postgres-test"), WithAnalyticsRate(0.2), }, }, @@ -271,13 +273,13 @@ func TestWithErrorCheck(t *testing.T) { assert.True(t, len(spans) > 0) s := spans[len(spans)-1] - assert.Equal(t, errExist, s.Tag(ext.Error) != nil) + assert.Equal(t, errExist, s.Tag(ext.ErrorMsg) != nil) } } t.Run("defaults", testOpts(true)) t.Run("errcheck", testOpts(false, WithErrorCheck(func(err error) bool { - return !strings.Contains(err.Error(), `Error 1054: Unknown column 'a' in 'field list'`) + return !strings.Contains(err.Error(), `Unknown column 'a' in 'field list'`) }))) } @@ -310,7 +312,7 @@ func TestWithCustomTag(t *testing.T) { opName: "mysql.query", customTags: map[string]interface{}{ "foo": "bar", - "baz": 123, + "baz": float64(123), }, dbSystem: ext.DBSystemMySQL, }, @@ -330,7 +332,7 @@ func TestWithCustomTag(t *testing.T) { opName: "postgres.query", customTags: map[string]interface{}{ "foo": "bar", - "baz": 123, + "baz": float64(123), }, dbSystem: "postgresql", }, @@ -368,6 +370,7 @@ func TestWithCustomTag(t *testing.T) { } assert.Equal(t, ext.SpanKindClient, connectSpan.Tag(ext.SpanKind)) assert.Equal(t, "database/sql", connectSpan.Tag(ext.Component)) + assert.Equal(t, string(componentName), connectSpan.Integration()) assert.Equal(t, tt.want.dbSystem, connectSpan.Tag(ext.DBSystem)) span := spans[1] @@ -377,6 +380,7 @@ func TestWithCustomTag(t *testing.T) { } assert.Equal(t, ext.SpanKindClient, connectSpan.Tag(ext.SpanKind)) assert.Equal(t, "database/sql", connectSpan.Tag(ext.Component)) + assert.Equal(t, string(componentName), connectSpan.Integration()) assert.Equal(t, tt.want.dbSystem, connectSpan.Tag(ext.DBSystem)) }) } diff --git a/contrib/database/sql/example_test.go b/contrib/database/sql/example_test.go index 35b54f670d..ef0c72044d 100644 --- a/contrib/database/sql/example_test.go +++ b/contrib/database/sql/example_test.go @@ -9,9 +9,9 @@ import ( "context" "log" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/go-sql-driver/mysql" "github.com/lib/pq" @@ -37,8 +37,11 @@ func Example() { } func Example_context() { + tracer.Start() + defer tracer.Stop() + // Register the driver that we will be using (in this case mysql) under a custom service name. - sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("my-db")) + sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithService("my-db")) // Open a connection to the DB using the driver we've just registered with tracing. db, err := sqltrace.Open("mysql", "user:password@/dbname") @@ -64,7 +67,7 @@ func Example_context() { func Example_sqlite() { // Register the driver that we will be using (in this case Sqlite) under a custom service name. - sqltrace.Register("sqlite", &sqlite.SQLiteDriver{}, sqltrace.WithServiceName("sqlite-example")) + sqltrace.Register("sqlite", &sqlite.SQLiteDriver{}, sqltrace.WithService("sqlite-example")) // Open a connection to the DB using the driver we've just registered with tracing. db, err := sqltrace.Open("sqlite", "./test.db") diff --git a/contrib/database/sql/go.mod b/contrib/database/sql/go.mod new file mode 100644 index 0000000000..395f7a3be2 --- /dev/null +++ b/contrib/database/sql/go.mod @@ -0,0 +1,115 @@ +module github.com/DataDog/dd-trace-go/contrib/database/sql/v2 + +go 1.24.0 + +godebug x509negativeserial=1 + +require ( + github.com/DataDog/datadog-go/v5 v5.6.0 + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/denisenkom/go-mssqldb v0.11.0 + github.com/go-sql-driver/mysql v1.6.0 + github.com/lib/pq v1.10.2 + github.com/mattn/go-sqlite3 v1.14.18 + github.com/stretchr/testify v1.11.1 + modernc.org/sqlite v1.28.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/uint128 v1.3.0 // indirect + modernc.org/cc/v3 v3.41.0 // indirect + modernc.org/ccgo/v3 v3.16.15 // indirect + modernc.org/libc v1.37.6 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/database/sql/go.sum b/contrib/database/sql/go.sum new file mode 100644 index 0000000000..eb230270fe --- /dev/null +++ b/contrib/database/sql/go.sum @@ -0,0 +1,360 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= diff --git a/contrib/database/sql/internal/dsn.go b/contrib/database/sql/internal/dsn.go index 9d9eee9d40..babe32ae90 100644 --- a/contrib/database/sql/internal/dsn.go +++ b/contrib/database/sql/internal/dsn.go @@ -3,17 +3,26 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package internal // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql/internal" +package internal import ( + "errors" + "fmt" "net" "net/url" + "regexp" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageDatabaseSQL) +} + // ParseDSN parses various supported DSN types into a map of key/value pairs which can be used as valid tags. func ParseDSN(driverName, dsn string) (meta map[string]string, err error) { meta = make(map[string]string) @@ -21,27 +30,27 @@ func ParseDSN(driverName, dsn string) (meta map[string]string, err error) { case "mysql": meta, err = parseMySQLDSN(dsn) if err != nil { - log.Debug("Error parsing DSN for mysql: %v", err) + instr.Logger().Debug("Error parsing DSN for mysql: %v", sanitizeError(err)) return } case "postgres", "pgx": meta, err = parsePostgresDSN(dsn) if err != nil { - log.Debug("Error parsing DSN for postgres: %v", err) + instr.Logger().Debug("Error parsing DSN for postgres: %v", sanitizeError(err)) return } case "sqlserver": meta, err = parseSQLServerDSN(dsn) if err != nil { - log.Debug("Error parsing DSN for sqlserver: %v", err) + instr.Logger().Debug("Error parsing DSN for sqlserver: %v", sanitizeError(err)) return } default: // Try to parse the DSN and see if the scheme contains a known driver name. - u, e := url.Parse(dsn) + u, e := parseSafe(dsn) if e != nil { // dsn is not a valid URL, so just ignore - log.Debug("Error parsing driver name from DSN: %v", e) + instr.Logger().Debug("Error parsing driver name from DSN: %v", e) return } if driverName != u.Scheme { @@ -76,19 +85,19 @@ func reduceKeys(meta map[string]string) map[string]string { } // parseMySQLDSN parses a mysql-type dsn into a map. -func parseMySQLDSN(dsn string) (m map[string]string, err error) { - var cfg *mySQLConfig - if cfg, err = mySQLConfigFromDSN(dsn); err == nil { - host, port, _ := net.SplitHostPort(cfg.Addr) - m = map[string]string{ - "user": cfg.User, - "host": host, - "port": port, - "dbname": cfg.DBName, - } - return m, nil +func parseMySQLDSN(dsn string) (map[string]string, error) { + cfg, err := mySQLConfigFromDSN(dsn) + if err != nil { + return nil, err + } + host, port, _ := net.SplitHostPort(cfg.Addr) + meta := map[string]string{ + "user": cfg.User, + "host": host, + "port": port, + "dbname": cfg.DBName, } - return nil, err + return meta, nil } // parsePostgresDSN parses a postgres-type dsn into a map. @@ -129,3 +138,165 @@ func parseSQLServerDSN(dsn string) (map[string]string, error) { delete(meta, "password") return meta, nil } + +// parseSafe behaves like url.Parse, but if parsing fails it returns an +// error with any credential part of the URL already scrubbed. +func parseSafe(raw string) (*url.URL, error) { + u, err := url.Parse(raw) + if err == nil { + return u, nil + } + // url.Parse always wraps the real problem in *url.Error. + var ue *url.Error + if !errors.As(err, &ue) { + return nil, err + } + return nil, sanitizeURLError(ue) +} + +// sanitizeURLError returns a copy of e whose URL field is redacted. +func sanitizeURLError(e *url.Error) *url.Error { + // Best-case: we can still parse enough to use URL.Redacted(). + if parsed, perr := url.Parse(e.URL); perr == nil { + e.URL = parsed.Redacted() + return e + } + + // Fallback: use the comprehensive sanitize() function for all password patterns. + e.URL = sanitize(e.URL) + return e +} + +// sanitizeError returns an error with sensitive information redacted. +// It handles both URL errors and general errors containing DSN information. +func sanitizeError(err error) error { + if err == nil { + return nil + } + + // Check if it's a URL error and use the existing sanitizer. + var ue *url.Error + if errors.As(err, &ue) { + return sanitizeURLError(ue) + } + + // For other errors, sanitize the error message. + return fmt.Errorf("%s", sanitize(err.Error())) +} + +func sanitize(msg string) string { + msg = sanitizeKeyValuePasswords(msg) + msg = sanitizeURLPasswords(msg) + msg = sanitizeMySQLPasswords(msg) + return msg +} + +// Compiled regex patterns for password sanitization - compiled once at package init +var ( + keyValueSpacePattern = regexp.MustCompile(`(?i)(password|passwd|pwd)\s*=\s*(.+?)(\s+(?:host|user|port|database|dbname)\s*=)`) + keyValueSemiPattern = regexp.MustCompile(`(?i)(password|passwd|pwd)\s*=\s*([^;]+)(;)`) + keyValuePattern = regexp.MustCompile(`(?i)(password|passwd|pwd)\s*=\s*([^\s;]+)`) +) + +// sanitizeKeyValuePasswords sanitizes password values in key=value format +func sanitizeKeyValuePasswords(msg string) string { + result := keyValueSpacePattern.ReplaceAllString(msg, `$1=xxxxx$3`) + result = keyValueSemiPattern.ReplaceAllString(result, `$1=xxxxx$3`) + result = keyValuePattern.ReplaceAllString(result, `$1=xxxxx`) + return result +} + +// sanitizeURLPasswords sanitizes passwords in URL format (user:pass@host). +func sanitizeURLPasswords(msg string) string { + // Look for URL patterns and manually handle them to avoid issues with @ in passwords. + urlStart := strings.Index(msg, "://") + if urlStart == -1 { + return msg + } + + // Find the start of the credentials section + credStart := urlStart + 3 + + // Look for the rightmost @ that separates credentials from host + hostStart := -1 + for i := len(msg) - 1; i >= credStart; i-- { + if msg[i] == '@' { + // Check if this @ is followed by what looks like a hostname + remaining := msg[i+1:] + if hostIdx := strings.IndexAny(remaining, " /\"?"); hostIdx != -1 { + remaining = remaining[:hostIdx] + } + // Simple hostname validation: starts with alphanumeric, contains valid hostname chars + if len(remaining) > 0 && isValidHostnameStart(remaining) { + hostStart = i + break + } + } + } + + if hostStart == -1 { + return msg + } + + // Find the colon that separates username from password + credSection := msg[credStart:hostStart] + colonIdx := strings.Index(credSection, ":") + if colonIdx == -1 { + return msg + } + + // Replace the password + absoluteColonIdx := credStart + colonIdx + result := msg[:absoluteColonIdx+1] + "xxxxx" + msg[hostStart:] + return result +} + +// isValidHostnameStart checks if a string starts like a valid hostname +func isValidHostnameStart(s string) bool { + if len(s) == 0 { + return false + } + // Must start with alphanumeric + first := s[0] + if !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || (first >= '0' && first <= '9')) { + return false + } + // Should contain hostname-like patterns + return strings.Contains(s, ".") || strings.Contains(s, ":") || + strings.Contains(s, "/") || s == strings.TrimSpace(s) +} + +// sanitizeMySQLPasswords sanitizes passwords in MySQL DSN format (user:pass@tcp...). +func sanitizeMySQLPasswords(msg string) string { + // Find @tcp( and work backwards to find the username:password pattern. + tcpIndex := strings.Index(msg, "@tcp(") + if tcpIndex == -1 { + return msg + } + + // Work backwards from @tcp( to find the start of username:password. + start := tcpIndex - 1 + for start >= 0 && msg[start] != ' ' && msg[start] != '\t' && msg[start] != ':' { + start-- + } + + // If we stopped at a colon, we need to find the username before it. + if start >= 0 && msg[start] == ':' { + // Continue backwards to find the start of the username. + userStart := start - 1 + for userStart >= 0 && (msg[userStart] >= 'a' && msg[userStart] <= 'z' || + msg[userStart] >= 'A' && msg[userStart] <= 'Z' || + msg[userStart] >= '0' && msg[userStart] <= '9' || + msg[userStart] == '_') { + userStart-- + } + userStart++ // Move to the first character of the username. + + // Replace the password part. + username := msg[userStart:start] + result := msg[:userStart] + username + ":xxxxx@tcp(" + msg[tcpIndex+5:] + return result + } + + return msg +} diff --git a/contrib/database/sql/internal/dsn_test.go b/contrib/database/sql/internal/dsn_test.go index 6d283e6fc8..929ae8e375 100644 --- a/contrib/database/sql/internal/dsn_test.go +++ b/contrib/database/sql/internal/dsn_test.go @@ -6,9 +6,11 @@ package internal import ( + "errors" + "net/url" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/stretchr/testify/assert" ) @@ -178,3 +180,256 @@ func TestParseSqlServerDSN(t *testing.T) { }) } } + +func TestSanitizeError(t *testing.T) { + tests := []struct { + name string + err error + expected string + }{ + // Nil error handling + { + name: "nil_error", + err: nil, + expected: "", + }, + + // URL error type detection + { + name: "url_error_with_password", + err: &url.Error{Op: "parse", URL: "postgres://user:secret123@localhost:5432/db", Err: errors.New("invalid port")}, + expected: `parse "postgres://user:xxxxx@localhost:5432/db": invalid port`, + }, + + // General error sanitization (non-URL errors) + { + name: "mysql_dsn_error_with_password", + err: errors.New("invalid DSN: user:secretpass@tcp(localhost:3306)/database"), + expected: "invalid DSN: user:xxxxx@tcp(localhost:3306)/database", + }, + { + name: "key_value_password", + err: errors.New("pq: password authentication failed with password=MySecretPass123 host=localhost"), + expected: "pq: password authentication failed with password=xxxxx host=localhost", + }, + { + name: "mixed_format_error", + err: errors.New("tried postgres://user:pass123@host/db and password=pass456 but failed"), + expected: "tried postgres://user:xxxxx@host/db and password=xxxxx but failed", + }, + + // Errors without sensitive data (should remain unchanged) + { + name: "no_sensitive_data", + err: errors.New("connection timeout: unable to reach server at localhost:5432"), + expected: "connection timeout: unable to reach server at localhost:5432", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := sanitizeError(tt.err) + if tt.err == nil { + assert.Nil(t, result) + } else { + assert.NotNil(t, result) + assert.Equal(t, tt.expected, result.Error()) + } + }) + } +} + +func TestParseDSNErrorHandling(t *testing.T) { + testCases := []struct { + name string + driverName string + dsn string + }{ + { + name: "invalid_mysql_dsn", + driverName: "mysql", + dsn: "user:pass@invalid@tcp(host:port)/db", + }, + { + name: "unknown_driver_with_valid_url", + driverName: "unknown", + dsn: "postgres://user:pass@host:5432/db", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + assert.NotPanics(t, func() { + ParseDSN(tc.driverName, tc.dsn) + }) + }) + } +} + +func TestParseSafe(t *testing.T) { + tests := []struct { + name string + rawURL string + expectError bool + expectURL bool + expectedErr string + }{ + // Successful parsing cases + { + name: "valid_url_with_credentials", + rawURL: "postgres://user:pass@localhost:5432/db", + expectError: false, + expectURL: true, + }, + + // Error sanitization test + { + name: "invalid_port_with_credentials", + rawURL: "postgres://user:secret123@localhost:invalid_port/db", + expectError: true, + expectURL: false, + expectedErr: `parse "postgres://user:xxxxx@localhost:invalid_port/db": invalid port ":invalid_port" after host`, + }, + + // Non-credential error (should remain unchanged) + { + name: "invalid_port_no_credentials", + rawURL: "postgres://localhost:invalid_port/db", + expectError: true, + expectURL: false, + expectedErr: `parse "postgres://localhost:invalid_port/db": invalid port ":invalid_port" after host`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := parseSafe(tt.rawURL) + + if tt.expectError { + assert.Error(t, err) + assert.Nil(t, result) + if tt.expectedErr != "" { + assert.Equal(t, tt.expectedErr, err.Error()) + } + } else { + assert.NoError(t, err) + if tt.expectURL { + assert.NotNil(t, result) + } + } + }) + } +} + +// Test individual sanitization functions directly +func TestSanitizeKeyValuePasswords(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "space_separated_password", + input: "password=secret123 host=localhost", + expected: "password=xxxxx host=localhost", + }, + { + name: "semicolon_separated_password", + input: "Server=host;Password=secret;Database=db;", + expected: "Server=host;Password=xxxxx;Database=db;", + }, + { + name: "case_insensitive", + input: "PASSWORD=secret PWD=secret2", + expected: "PASSWORD=xxxxx PWD=xxxxx", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := sanitizeKeyValuePasswords(tt.input) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestSanitizeURLPasswords(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "simple_url_password", + input: "postgres://user:secret@localhost:5432/db", + expected: "postgres://user:xxxxx@localhost:5432/db", + }, + { + name: "complex_password_with_special_chars", + input: "mysql://admin:p@$$w0rd@host.com/database", + expected: "mysql://admin:xxxxx@host.com/database", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := sanitizeURLPasswords(tt.input) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestSanitizeMySQLPasswords(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "mysql_dsn_format", + input: "Error connecting: user:password@tcp(localhost:3306)/db", + expected: "Error connecting: user:xxxxx@tcp(localhost:3306)/db", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := sanitizeMySQLPasswords(tt.input) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestSanitizeURLError(t *testing.T) { + tests := []struct { + name string + urlError *url.Error + expected string + }{ + { + name: "parseable_url_with_password", + urlError: &url.Error{ + Op: "parse", + URL: "postgres://user:secret@localhost:5432/db", + Err: errors.New("test error"), + }, + expected: `parse "postgres://user:xxxxx@localhost:5432/db": test error`, + }, + { + name: "unparseable_url_fallback", + urlError: &url.Error{ + Op: "parse", + URL: "postgres://user:pass@host with spaces/db", + Err: errors.New("invalid character in host name"), + }, + expected: `parse "postgres://user:xxxxx@host with spaces/db": invalid character in host name`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := sanitizeURLError(tt.urlError) + assert.Equal(t, tt.expected, result.Error()) + }) + } +} diff --git a/contrib/database/sql/internal/sqlserver.go b/contrib/database/sql/internal/sqlserver.go index 1851e1b631..38f1443197 100644 --- a/contrib/database/sql/internal/sqlserver.go +++ b/contrib/database/sql/internal/sqlserver.go @@ -11,7 +11,7 @@ import ( nurl "net/url" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" ) func parseSQLServerURL(url string) (map[string]string, error) { diff --git a/contrib/database/sql/metrics.go b/contrib/database/sql/metrics.go index d8ff4ed266..a5aa60c3f1 100644 --- a/contrib/database/sql/metrics.go +++ b/contrib/database/sql/metrics.go @@ -3,15 +3,13 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package sql // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" +package sql // import "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" import ( "database/sql" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const tracerPrefix = "datadog.tracer." @@ -33,29 +31,35 @@ var interval = 10 * time.Second // pollDBStats calls (*DB).Stats on the db at a predetermined interval. It pushes the DBStats off to the statsd client. // the caller should always ensure that db & statsd are non-nil -func pollDBStats(statsd internal.StatsdClient, db *sql.DB) { - log.Debug("DB stats will be gathered and sent every %v.", interval) - for range time.NewTicker(interval).C { - log.Debug("Reporting DB.Stats metrics...") - stat := db.Stats() - statsd.Gauge(MaxOpenConnections, float64(stat.MaxOpenConnections), []string{}, 1) - statsd.Gauge(OpenConnections, float64(stat.OpenConnections), []string{}, 1) - statsd.Gauge(InUse, float64(stat.InUse), []string{}, 1) - statsd.Gauge(Idle, float64(stat.Idle), []string{}, 1) - statsd.Gauge(WaitCount, float64(stat.WaitCount), []string{}, 1) - statsd.Timing(WaitDuration, stat.WaitDuration, []string{}, 1) - statsd.Gauge(MaxIdleClosed, float64(stat.MaxIdleClosed), []string{}, 1) - statsd.Gauge(MaxIdleTimeClosed, float64(stat.MaxIdleTimeClosed), []string{}, 1) - statsd.Gauge(MaxLifetimeClosed, float64(stat.MaxLifetimeClosed), []string{}, 1) +func pollDBStats(statsd instrumentation.StatsdClient, db *sql.DB, stop chan struct{}) { + instr.Logger().Debug("DB stats will be gathered and sent every %v.", interval) + ticker := time.NewTicker(interval) + defer ticker.Stop() + for { + select { + case <-ticker.C: + instr.Logger().Debug("Reporting DB.Stats metrics...") + stat := db.Stats() + statsd.Gauge(MaxOpenConnections, float64(stat.MaxOpenConnections), []string{}, 1) + statsd.Gauge(OpenConnections, float64(stat.OpenConnections), []string{}, 1) + statsd.Gauge(InUse, float64(stat.InUse), []string{}, 1) + statsd.Gauge(Idle, float64(stat.Idle), []string{}, 1) + statsd.Gauge(WaitCount, float64(stat.WaitCount), []string{}, 1) + statsd.Timing(WaitDuration, stat.WaitDuration, []string{}, 1) + statsd.Gauge(MaxIdleClosed, float64(stat.MaxIdleClosed), []string{}, 1) + statsd.Gauge(MaxIdleTimeClosed, float64(stat.MaxIdleTimeClosed), []string{}, 1) + statsd.Gauge(MaxLifetimeClosed, float64(stat.MaxLifetimeClosed), []string{}, 1) + case <-stop: + return + } } } -func statsTags(c *config) []string { - tags := globalconfig.StatsTags() +func (c *config) statsdExtraTags() []string { + var tags []string if c.serviceName != "" { tags = append(tags, "service:"+c.serviceName) } - // TODO: grab tracer config's env and hostname for globaltags for k, v := range c.tags { if vstr, ok := v.(string); ok { tags = append(tags, k+":"+vstr) diff --git a/contrib/database/sql/metrics_test.go b/contrib/database/sql/metrics_test.go index e68e968229..f135f83be1 100644 --- a/contrib/database/sql/metrics_test.go +++ b/contrib/database/sql/metrics_test.go @@ -6,61 +6,53 @@ package sql import ( + "sync" "testing" + "github.com/DataDog/datadog-go/v5/statsd" + "github.com/lib/pq" "github.com/stretchr/testify/assert" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/stretchr/testify/require" ) -func (cfg *config) applyTags() { +func applyTags(cfg *config) { cfg.serviceName = "my-svc" cfg.tags = make(map[string]interface{}) cfg.tags["tag"] = "value" } -func setGlobalCfgTags() { - globalconfig.SetStatsTags([]string{"globaltag:globalvalue"}) -} - -func resetGlobalConfig() { - globalconfig.SetStatsTags([]string{}) -} - // Test that statsTags(*config) returns tags from the provided *config + whatever is on the globalconfig func TestStatsTags(t *testing.T) { t.Run("default none", func(t *testing.T) { - resetGlobalConfig() cfg := new(config) - tags := statsTags(cfg) + tags := cfg.statsdExtraTags() assert.Len(t, tags, 0) }) - t.Run("cfg only", func(t *testing.T) { - resetGlobalConfig() + t.Run("add tags from config", func(t *testing.T) { cfg := new(config) - cfg.applyTags() - tags := statsTags(cfg) + applyTags(cfg) + tags := cfg.statsdExtraTags() assert.Len(t, tags, 2) assert.Contains(t, tags, "service:my-svc") assert.Contains(t, tags, "tag:value") }) - t.Run("inherit globalconfig", func(t *testing.T) { - resetGlobalConfig() - cfg := new(config) - setGlobalCfgTags() - tags := statsTags(cfg) - assert.Len(t, tags, 1) - assert.Contains(t, tags, "globaltag:globalvalue") - }) - t.Run("both", func(t *testing.T) { - resetGlobalConfig() - cfg := new(config) - cfg.applyTags() - setGlobalCfgTags() - tags := statsTags(cfg) - assert.Len(t, tags, 3) - assert.Contains(t, tags, "globaltag:globalvalue") - assert.Contains(t, tags, "service:my-svc") - assert.Contains(t, tags, "tag:value") - }) - resetGlobalConfig() +} + +func TestPollDBStatsStop(t *testing.T) { + driverName := "postgres" + Register(driverName, &pq.Driver{}, WithService("postgres-test"), WithAnalyticsRate(0.2)) + defer unregister(driverName) + db, err := Open(driverName, "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") + require.NoError(t, err) + defer db.Close() + + var wg sync.WaitGroup + stop := make(chan struct{}) + wg.Add(1) + go func() { + defer wg.Done() + pollDBStats(&statsd.NoOpClientDirect{}, db, stop) + }() + close(stop) + wg.Wait() } diff --git a/contrib/database/sql/option.go b/contrib/database/sql/option.go index 567c861cb8..39ff7cc93d 100644 --- a/contrib/database/sql/option.go +++ b/contrib/database/sql/option.go @@ -7,17 +7,14 @@ package sql import ( "database/sql/driver" - "fmt" "math" - "os" "reflect" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" ) type config struct { @@ -31,7 +28,7 @@ type config struct { tags map[string]interface{} dbmPropagationMode tracer.DBMPropagationMode dbStats bool - statsdClient internal.StatsdClient + statsdClient instrumentation.StatsdClient } // checkStatsdRequired adds a statsdclient onto the config if dbstats is enabled @@ -40,12 +37,11 @@ func (c *config) checkStatsdRequired() { if c.dbStats && c.statsdClient == nil { // contrib/database/sql's statsdclient should always inherit its address from the tracer's statsdclient via the globalconfig // destination is not user-configurable - sc, err := internal.NewStatsdClient(globalconfig.DogstatsdAddr(), statsTags(c)) + sc, err := instr.StatsdClient(c.statsdExtraTags()) if err == nil { c.statsdClient = sc - log.Debug("Metrics from the database/sql contrib will be sent to %v", globalconfig.DogstatsdAddr()) } else { - log.Warn("Error creating statsd client for database/sql contrib; DB Stats disabled: %v", err) + instr.Logger().Warn("Error creating statsd client for database/sql contrib; DB Stats disabled: %s", err.Error()) c.dbStats = false } } @@ -57,7 +53,7 @@ func (c *config) checkDBMPropagation(driverName string, driver driver.Driver, ds dsn = c.dsn } if dbSystem, ok := dbmFullModeUnsupported(driverName, driver, dsn); ok { - log.Warn("Using DBM_PROPAGATION_MODE in 'full' mode is not supported for %s, downgrading to 'service' mode. "+ + instr.Logger().Warn("Using DBM_PROPAGATION_MODE in 'full' mode is not supported for %s, downgrading to 'service' mode. "+ "See https://docs.datadoghq.com/database_monitoring/connect_dbm_and_apm/ for more info.", dbSystem, ) @@ -127,27 +123,28 @@ func dbmFullModeUnsupported(driverName string, driver driver.Driver, dsn string) return "", false } -// Option represents an option that can be passed to Register, Open or OpenDB. -type Option func(*config) +// Option describes options for the database/sql integration. +type Option interface { + apply(*config) +} -type registerConfig = config +// OptionFn represents options applicable to Register, Open or OpenDB. +type OptionFn func(*config) -// RegisterOption has been deprecated in favor of Option. -type RegisterOption = Option +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +type registerConfig = config func defaults(cfg *config, driverName string, rc *registerConfig) { - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_SQL_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - mode := os.Getenv("DD_DBM_PROPAGATION_MODE") + cfg.analyticsRate = instr.AnalyticsRate(false) + mode := env.Get("DD_DBM_PROPAGATION_MODE") if mode == "" { - mode = os.Getenv("DD_TRACE_SQL_COMMENT_INJECTION_MODE") + mode = env.Get("DD_TRACE_SQL_COMMENT_INJECTION_MODE") } cfg.dbmPropagationMode = tracer.DBMPropagationMode(mode) - cfg.serviceName = getServiceName(driverName, rc) + cfg.serviceName = defaultServiceName(driverName, rc) cfg.spanName = getSpanName(driverName) if rc != nil { // use registered config as the default value for some options @@ -164,14 +161,16 @@ func defaults(cfg *config, driverName string, rc *registerConfig) { } } -func getServiceName(driverName string, rc *registerConfig) string { - defaultServiceName := fmt.Sprintf("%s.db", driverName) +func defaultServiceName(driverName string, rc *registerConfig) string { + registerService := "" if rc != nil { - // if service name was set during Register, we use that value as default instead of - // the one calculated above. - defaultServiceName = rc.serviceName + // if service name was set during Register, we use that value as default. + registerService = rc.serviceName } - return namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) + return instr.ServiceName(instrumentation.ComponentDefault, instrumentation.OperationContext{ + "driverName": driverName, + "registerService": registerService, + }) } func getSpanName(driverName string) string { @@ -179,19 +178,22 @@ func getSpanName(driverName string) string { if normalizedDBSystem, ok := normalizeDBSystem(driverName); ok { dbSystem = normalizedDBSystem } - return namingschema.DBOpName(dbSystem, fmt.Sprintf("%s.query", driverName)) + return instr.OperationName(instrumentation.ComponentDefault, instrumentation.OperationContext{ + "driverName": driverName, + ext.DBSystem: dbSystem, + }) } -// WithServiceName sets the given service name when registering a driver, +// WithService sets the given service name when registering a driver, // or opening a database connection. -func WithServiceName(name string) Option { +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -203,7 +205,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -216,7 +218,7 @@ func WithAnalyticsRate(rate float64) Option { // WithDSN allows the data source name (DSN) to be provided when // using OpenDB and a driver.Connector. // The value is used to automatically set tags on spans. -func WithDSN(name string) Option { +func WithDSN(name string) OptionFn { return func(cfg *config) { cfg.dsn = name } @@ -224,7 +226,7 @@ func WithDSN(name string) Option { // WithIgnoreQueryTypes specifies the query types for which spans should not be // created. -func WithIgnoreQueryTypes(qtypes ...QueryType) Option { +func WithIgnoreQueryTypes(qtypes ...QueryType) OptionFn { return func(cfg *config) { if cfg.ignoreQueryTypes == nil { cfg.ignoreQueryTypes = make(map[QueryType]struct{}) @@ -237,7 +239,7 @@ func WithIgnoreQueryTypes(qtypes ...QueryType) Option { // WithChildSpansOnly causes spans to be created only when // there is an existing parent span in the Context. -func WithChildSpansOnly() Option { +func WithChildSpansOnly() OptionFn { return func(cfg *config) { cfg.childSpansOnly = true } @@ -246,14 +248,14 @@ func WithChildSpansOnly() Option { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. The fn is called whenever a database/sql operation // finishes with an error -func WithErrorCheck(fn func(err error) bool) Option { +func WithErrorCheck(fn func(err error) bool) OptionFn { return func(cfg *config) { cfg.errCheck = fn } } -// WithCustomTag will attach the value to the span tagged by the key -func WithCustomTag(key string, value interface{}) Option { +// WithCustomTag will attach the key-value pair as a tag onto the spans generated by this integration, as well as DB Stats metrics if dbstats is enabled +func WithCustomTag(key string, value interface{}) OptionFn { return func(cfg *config) { if cfg.tags == nil { cfg.tags = make(map[string]interface{}) @@ -262,15 +264,6 @@ func WithCustomTag(key string, value interface{}) Option { } } -// WithSQLCommentInjection enables injection of tags as sql comments on traced queries. -// This includes dynamic values like span id, trace id and sampling priority which can make queries -// unique for some cache implementations. -// -// Deprecated: Use WithDBMPropagation instead. -func WithSQLCommentInjection(mode tracer.SQLCommentInjectionMode) Option { - return WithDBMPropagation(tracer.DBMPropagationMode(mode)) -} - // WithDBMPropagation enables injection of tags as sql comments on traced queries. // This includes dynamic values like span id, trace id and the sampled flag which can make queries // unique for some cache implementations. Use DBMPropagationModeService if this is a concern. @@ -278,7 +271,7 @@ func WithSQLCommentInjection(mode tracer.SQLCommentInjectionMode) Option { // Note that enabling sql comment propagation results in potentially confidential data (service names) // being stored in the databases which can then be accessed by other 3rd parties that have been granted // access to the database. -func WithDBMPropagation(mode tracer.DBMPropagationMode) Option { +func WithDBMPropagation(mode tracer.DBMPropagationMode) OptionFn { return func(cfg *config) { cfg.dbmPropagationMode = mode } @@ -287,7 +280,7 @@ func WithDBMPropagation(mode tracer.DBMPropagationMode) Option { // WithDBStats enables polling of DBStats metrics // ref: https://pkg.go.dev/database/sql#DBStats // These metrics are submitted to Datadog and are not billed as custom metrics -func WithDBStats() Option { +func WithDBStats() OptionFn { return func(cfg *config) { cfg.dbStats = true } diff --git a/contrib/database/sql/option_test.go b/contrib/database/sql/option_test.go index e04c5ef452..a0236c4a3a 100644 --- a/contrib/database/sql/option_test.go +++ b/contrib/database/sql/option_test.go @@ -8,18 +8,16 @@ package sql import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "github.com/DataDog/datadog-go/v5/statsd" "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestAnalyticsSettings(t *testing.T) { t.Run("global", func(t *testing.T) { t.Skip("global flag disabled") - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) cfg := new(registerConfig) defaults(cfg, "", nil) @@ -34,9 +32,7 @@ func TestAnalyticsSettings(t *testing.T) { }) t.Run("override", func(t *testing.T) { - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) cfg := new(registerConfig) defaults(cfg, "", nil) @@ -69,11 +65,11 @@ func TestCheckStatsdRequired(t *testing.T) { cfg := new(config) cfg.dbStats = true cfg.checkStatsdRequired() - _, ok := cfg.statsdClient.(*statsd.Client) + _, ok := cfg.statsdClient.(*statsd.ClientDirect) assert.True(t, ok) }) t.Run("invalid address", func(t *testing.T) { - globalconfig.SetDogstatsdAddr("unreachable/socket/path/dsd.socket") + testutils.SetGlobalDogstatsdAddr(t, "unreachable/socket/path/dsd.socket") cfg := new(config) cfg.dbStats = true cfg.checkStatsdRequired() diff --git a/contrib/database/sql/orchestrion.yml b/contrib/database/sql/orchestrion.yml new file mode 100644 index 0000000000..e8e19ea9fd --- /dev/null +++ b/contrib/database/sql/orchestrion.yml @@ -0,0 +1,37 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/database/sql/v2 + description: A generic interface around SQL (or SQL-like) databases. + +aspects: + - id: sql.Register + join-point: + function-call: database/sql.Register + advice: + - wrap-expression: + imports: + sqltrace: github.com/DataDog/dd-trace-go/contrib/database/sql/v2 + sql: database/sql + driver: database/sql/driver + template: |- + func(driverName string, driver driver.Driver) { + sql.Register(driverName, driver) + sqltrace.Register(driverName, driver) + }({{ index .AST.Args 0 }}, {{ index .AST.Args 1 }}) + + - id: sql.Open + join-point: + function-call: database/sql.Open + advice: + - replace-function: github.com/DataDog/dd-trace-go/contrib/database/sql/v2.Open + + - id: sql.OpenDB + join-point: + function-call: database/sql.OpenDB + advice: + - replace-function: github.com/DataDog/dd-trace-go/contrib/database/sql/v2.OpenDB diff --git a/contrib/database/sql/propagation_test.go b/contrib/database/sql/propagation_test.go index e91f79c63d..a1b5a8598f 100644 --- a/contrib/database/sql/propagation_test.go +++ b/contrib/database/sql/propagation_test.go @@ -15,27 +15,22 @@ import ( "regexp" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - mssql "github.com/denisenkom/go-mssqldb" "github.com/go-sql-driver/mysql" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/contrib/database/sql/v2/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestDBMPropagation(t *testing.T) { - // Ensure the global service name is set to the previous value after we finish the test, since the - // tracer.WithService option overrides it. - prevServiceName := globalconfig.ServiceName() - defer globalconfig.SetServiceName(prevServiceName) - testCases := []struct { name string - opts []RegisterOption + opts []Option callDB func(ctx context.Context, db *sql.DB) error prepared []string dsn string @@ -46,7 +41,7 @@ func TestDBMPropagation(t *testing.T) { }{ { name: "prepare", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.PrepareContext(ctx, "SELECT 1 from DUAL") return err @@ -55,7 +50,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "prepare-disabled", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.PrepareContext(ctx, "SELECT 1 from DUAL") return err @@ -64,7 +59,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "prepare-service", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeService)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeService)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.PrepareContext(ctx, "SELECT 1 from DUAL") return err @@ -73,7 +68,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "prepare-full", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.PrepareContext(ctx, "SELECT 1 from DUAL") return err @@ -84,7 +79,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "query", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -93,7 +88,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "query-disabled", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -102,7 +97,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "query-service", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeService)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeService)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -111,7 +106,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "query-full", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -122,7 +117,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -131,7 +126,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-disabled", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -140,7 +135,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-service", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeService)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeService)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -149,7 +144,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-full", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -160,7 +155,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-full-peer-service-tag", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -171,7 +166,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-full-peer-service-custom-tag", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -182,7 +177,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-full-peer-service-precedence-tag-over-conn-context", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -194,7 +189,7 @@ func TestDBMPropagation(t *testing.T) { }, { name: "exec-full-peer-service-precedence-conn-context-over-open-custom-tag", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -208,13 +203,15 @@ func TestDBMPropagation(t *testing.T) { for _, tc := range testCases { t.Run(tc.name, func(t *testing.T) { - tracer.Start( - tracer.WithService("test-service"), + err := tracer.Start( tracer.WithEnv("test-env"), tracer.WithServiceVersion("1.0.0"), - tracer.WithHTTPRoundTripper(&mockRoundTripper{}), + tracer.WithHTTPClient(&http.Client{Transport: &mockRoundTripper{}}), + tracer.WithLogger(testutils.DiscardLogger()), ) + require.NoError(t, err) defer tracer.Stop() + testutils.SetGlobalServiceName(t, "test-service") d := &internal.MockDriver{} Register("test", d, tc.opts...) @@ -262,14 +259,14 @@ func TestDBMPropagation(t *testing.T) { func TestDBMTraceContextTagging(t *testing.T) { testCases := []struct { name string - opts []RegisterOption + opts []Option callDB func(ctx context.Context, db *sql.DB) error spanType string traceContextInjectedTag bool }{ { name: "prepare", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.PrepareContext(ctx, "SELECT 1 from DUAL") return err @@ -279,7 +276,7 @@ func TestDBMTraceContextTagging(t *testing.T) { }, { name: "query-disabled", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -289,7 +286,7 @@ func TestDBMTraceContextTagging(t *testing.T) { }, { name: "query-service", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeService)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeService)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -299,7 +296,7 @@ func TestDBMTraceContextTagging(t *testing.T) { }, { name: "query-full", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.QueryContext(ctx, "SELECT 1 from DUAL") return err @@ -309,7 +306,7 @@ func TestDBMTraceContextTagging(t *testing.T) { }, { name: "exec-disabled", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeDisabled)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -319,7 +316,7 @@ func TestDBMTraceContextTagging(t *testing.T) { }, { name: "exec-service", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeService)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeService)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -329,7 +326,7 @@ func TestDBMTraceContextTagging(t *testing.T) { }, { name: "exec-full", - opts: []RegisterOption{WithDBMPropagation(tracer.DBMPropagationModeFull)}, + opts: []Option{WithDBMPropagation(tracer.DBMPropagationModeFull)}, callDB: func(ctx context.Context, db *sql.DB) error { _, err := db.ExecContext(ctx, "SELECT 1 from DUAL") return err @@ -362,7 +359,7 @@ func TestDBMTraceContextTagging(t *testing.T) { for _, s := range sps { tags := s.Tags() if tc.traceContextInjectedTag { - assert.Equal(t, true, tags[keyDBMTraceInjected]) + assert.Equal(t, "true", tags[keyDBMTraceInjected]) } else { _, ok := tags[keyDBMTraceInjected] assert.False(t, ok) @@ -519,8 +516,8 @@ func TestDBMFullModeUnsupported(t *testing.T) { } } -func spansOfType(spans []mocktracer.Span, spanType string) (filtered []mocktracer.Span) { - filtered = make([]mocktracer.Span, 0) +func spansOfType(spans []*mocktracer.Span, spanType string) (filtered []*mocktracer.Span) { + filtered = make([]*mocktracer.Span, 0) for _, s := range spans { if s.Tag("sql.query_type") == spanType { filtered = append(filtered, s) diff --git a/contrib/database/sql/sql.go b/contrib/database/sql/sql.go index b26318d0d3..80b1422f8a 100644 --- a/contrib/database/sql/sql.go +++ b/contrib/database/sql/sql.go @@ -21,19 +21,25 @@ import ( "database/sql/driver" "reflect" "sync" + "sync/atomic" "time" - sqlinternal "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + sqlinternal "github.com/DataDog/dd-trace-go/contrib/database/sql/v2/internal" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" ) -const componentName = "database/sql" +const componentName = instrumentation.PackageDatabaseSQL + +var instr *instrumentation.Instrumentation + +var ( + testMode atomic.Bool + testModeInitOnce sync.Once +) func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageDatabaseSQL) } // registeredDrivers holds a registry of all drivers registered via the sqltrace package. @@ -112,19 +118,28 @@ func (d *driverRegistry) unregister(name string) { // Register tells the sql integration package about the driver that we will be tracing. If used, it // must be called before Open. It uses the driverName suffixed with ".db" as the default service // name. -func Register(driverName string, driver driver.Driver, opts ...RegisterOption) { +func Register(driverName string, driver driver.Driver, opts ...Option) { if driver == nil { panic("sqltrace: Register driver is nil") } + testModeInitOnce.Do(func() { + _, ok := env.Lookup("__DD_TRACE_SQL_TEST") + testMode.Store(ok) + }) + testModeEnabled := testMode.Load() if registeredDrivers.isRegistered(driverName) { // already registered, don't change things - return + if !testModeEnabled { + return + } + // if we are in test mode, just unregister the driver and replace it + unregister(driverName) } cfg := new(config) defaults(cfg, driverName, nil) processOptions(cfg, driverName, driver, "", opts...) - log.Debug("contrib/database/sql: Registering driver: %s %#v", driverName, cfg) + instr.Logger().Debug("contrib/database/sql: Registering driver: %s %#v", driverName, cfg) registeredDrivers.add(driverName, driver, cfg) } @@ -139,6 +154,7 @@ type tracedConnector struct { connector driver.Connector driverName string cfg *config + dbClose chan struct{} } func (t *tracedConnector) Connect(ctx context.Context) (driver.Conn, error) { @@ -171,6 +187,13 @@ func (t *tracedConnector) Driver() driver.Driver { return t.connector.Driver() } +// Close closes the dbClose channel +// This method will be invoked when DB.Close() is called, which we expect to occur only once: https://cs.opensource.google/go/go/+/refs/tags/go1.23.4:src/database/sql/sql.go;l=918-950 +func (t *tracedConnector) Close() error { + close(t.dbClose) + return nil +} + // from Go stdlib implementation of sql.Open type dsnConnector struct { dsn string @@ -208,10 +231,11 @@ func OpenDB(c driver.Connector, opts ...Option) *sql.DB { connector: c, driverName: driverName, cfg: cfg, + dbClose: make(chan struct{}), } db := sql.OpenDB(tc) if cfg.dbStats && cfg.statsdClient != nil { - go pollDBStats(cfg.statsdClient, db) + go pollDBStats(cfg.statsdClient, db, tc.dbClose) } return db } @@ -250,7 +274,7 @@ func Open(driverName, dataSourceName string, opts ...Option) (*sql.DB, error) { func processOptions(cfg *config, driverName string, driver driver.Driver, dsn string, opts ...Option) { for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } cfg.checkDBMPropagation(driverName, driver, dsn) cfg.checkStatsdRequired() diff --git a/contrib/database/sql/sql_test.go b/contrib/database/sql/sql_test.go index 5b50b7effc..3453b867de 100644 --- a/contrib/database/sql/sql_test.go +++ b/contrib/database/sql/sql_test.go @@ -17,18 +17,17 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/sqltest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/statsdtest" - mssql "github.com/denisenkom/go-mssqldb" "github.com/go-sql-driver/mysql" "github.com/lib/pq" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + sqltest "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/sql" ) // tableName holds the SQL table that these tests will be run against. It must be unique cross-repo. @@ -102,7 +101,7 @@ func TestMySQL(t *testing.T) { func TestPostgres(t *testing.T) { driverName := "postgres" - Register(driverName, &pq.Driver{}, WithServiceName("postgres-test"), WithAnalyticsRate(0.2)) + Register(driverName, &pq.Driver{}, WithService("postgres-test"), WithAnalyticsRate(0.2)) defer unregister(driverName) db, err := Open(driverName, "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") require.NoError(t, err) @@ -138,9 +137,9 @@ func TestOpenOptions(t *testing.T) { }) t.Run("Open", func(t *testing.T) { - Register(driverName, &pq.Driver{}, WithServiceName("postgres-test"), WithAnalyticsRate(0.2)) + Register(driverName, &pq.Driver{}, WithService("postgres-test"), WithAnalyticsRate(0.2)) defer unregister(driverName) - db, err := Open(driverName, dsn, WithServiceName("override-test"), WithAnalytics(true)) + db, err := Open(driverName, dsn, WithService("override-test"), WithAnalytics(true)) require.NoError(t, err) defer db.Close() @@ -164,7 +163,7 @@ func TestOpenOptions(t *testing.T) { }) t.Run("OpenDB", func(t *testing.T) { - Register(driverName, &pq.Driver{}, WithServiceName("postgres-test"), WithAnalyticsRate(0.2)) + Register(driverName, &pq.Driver{}, WithService("postgres-test"), WithAnalyticsRate(0.2)) defer unregister(driverName) c, err := pq.NewConnector(dsn) require.NoError(t, err) @@ -191,7 +190,7 @@ func TestOpenOptions(t *testing.T) { }) t.Run("WithDSN", func(t *testing.T) { - Register(driverName, &pq.Driver{}, WithServiceName("postgres-test"), WithAnalyticsRate(0.2)) + Register(driverName, &pq.Driver{}, WithService("postgres-test"), WithAnalyticsRate(0.2)) defer unregister(driverName) c, err := pq.NewConnector(dsn) require.NoError(t, err) @@ -235,7 +234,7 @@ func TestOpenOptions(t *testing.T) { }) t.Run("WithIgnoreQueryTypes", func(t *testing.T) { - registerOpts := []RegisterOption{WithIgnoreQueryTypes(QueryTypeConnect)} + registerOpts := []Option{WithIgnoreQueryTypes(QueryTypeConnect)} openDBOpts := []Option{WithIgnoreQueryTypes(QueryTypeConnect, QueryTypePing)} Register(driverName, &pq.Driver{}, registerOpts...) defer unregister(driverName) @@ -254,8 +253,8 @@ func TestOpenOptions(t *testing.T) { }) t.Run("RegisterOptionsAsDefault", func(t *testing.T) { - registerOpts := []RegisterOption{ - WithServiceName("register-override"), + registerOpts := []Option{ + WithService("register-override"), WithIgnoreQueryTypes(QueryTypeConnect), } Register(driverName, &pq.Driver{}, registerOpts...) @@ -278,20 +277,21 @@ func TestOpenOptions(t *testing.T) { }) t.Run("WithDBStats", func(t *testing.T) { - var tg statsdtest.TestStatsdClient + m := testutils.NewMockStatsdClient() Register(driverName, &pq.Driver{}) defer unregister(driverName) - _, err := Open(driverName, dsn, withStatsdClient(&tg), WithDBStats()) + db, err := Open(driverName, dsn, withStatsdClient(m), WithDBStats()) require.NoError(t, err) // The polling interval has been reduced to 500ms for the sake of this test, so at least one round of `pollDBStats` should be complete in 1s deadline := time.Now().Add(1 * time.Second) wantStats := []string{MaxOpenConnections, OpenConnections, InUse, Idle, WaitCount, WaitDuration, MaxIdleClosed, MaxIdleTimeClosed, MaxLifetimeClosed} + var calls1 []string for { if time.Now().After(deadline) { t.Fatalf("Stats not collected in expected interval of %v", interval) } - calls := tg.CallNames() + calls := m.CallNames() // if the expected volume of stats has been collected, ensure 9/9 of the DB Stats are included if len(calls) >= len(wantStats) { for _, s := range wantStats { @@ -300,15 +300,20 @@ func TestOpenOptions(t *testing.T) { } } // all expected stats have been collected; exit out of loop, test should pass + calls1 = calls break } // not all stats have been collected yet, try again in 50ms time.Sleep(50 * time.Millisecond) } + // Close DB and assert the no further stats have been collected; db.Close should stop the pollDBStats goroutine. + db.Close() + time.Sleep(50 * time.Millisecond) + assert.Equal(t, calls1, m.CallNames()) }) } -func withStatsdClient(s internal.StatsdClient) Option { +func withStatsdClient(s instrumentation.StatsdClient) OptionFn { return func(c *config) { c.statsdClient = s } @@ -397,135 +402,3 @@ func TestRegister(_ *testing.T) { unregister("test" + strconv.FormatInt(int64(i), 10)) } } - -func TestNamingSchema(t *testing.T) { - newGenSpansFunc := func(t *testing.T, driverName string, registerOverride bool) namingschematest.GenSpansFn { - return func(t *testing.T, serviceOverride string) []mocktracer.Span { - var registerOpts []RegisterOption - // serviceOverride has higher priority than the registerOverride parameter. - if serviceOverride != "" { - registerOpts = append(registerOpts, WithServiceName(serviceOverride)) - } else if registerOverride { - registerOpts = append(registerOpts, WithServiceName("register-override")) - } - var openOpts []Option - if serviceOverride != "" { - openOpts = append(openOpts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - var ( - dv driver.Driver - dsn string - ) - switch driverName { - case "sqlserver": - dv = &mssql.Driver{} - dsn = "sqlserver://sa:myPassw0rd@127.0.0.1:1433?database=master" - case "postgres": - dv = &pq.Driver{} - dsn = "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable" - case "mysql": - dv = &mysql.MySQLDriver{} - dsn = "test:test@tcp(127.0.0.1:3306)/test" - default: - t.Fatal("unknown driver: ", driverName) - } - Register(driverName, dv, registerOpts...) - defer unregister(driverName) - db, err := Open(driverName, dsn, openOpts...) - require.NoError(t, err) - - err = db.Ping() - require.NoError(t, err) - - spans := mt.FinishedSpans() - require.Len(t, spans, 2) - return spans - } - } - t.Run("SQLServer", func(t *testing.T) { - genSpans := newGenSpansFunc(t, "sqlserver", false) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "sqlserver.query", spans[0].OperationName()) - assert.Equal(t, "sqlserver.query", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "mssql.query", spans[0].OperationName()) - assert.Equal(t, "mssql.query", spans[1].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"sqlserver.db", "sqlserver.db"}, - WithDDService: []string{"sqlserver.db", "sqlserver.db"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride, namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - }) - t.Run("Postgres", func(t *testing.T) { - genSpans := newGenSpansFunc(t, "postgres", false) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "postgres.query", spans[0].OperationName()) - assert.Equal(t, "postgres.query", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "postgresql.query", spans[0].OperationName()) - assert.Equal(t, "postgresql.query", spans[1].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"postgres.db", "postgres.db"}, - WithDDService: []string{"postgres.db", "postgres.db"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride, namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - }) - t.Run("PostgresWithRegisterOverride", func(t *testing.T) { - genSpans := newGenSpansFunc(t, "postgres", true) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "postgres.query", spans[0].OperationName()) - assert.Equal(t, "postgres.query", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "postgresql.query", spans[0].OperationName()) - assert.Equal(t, "postgresql.query", spans[1].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - // when the WithServiceName option is set during Register and not providing a service name when opening - // the DB connection, that value is used as default instead of postgres.db. - WithDefaults: []string{"register-override", "register-override"}, - // in v0, DD_SERVICE is ignored for this integration. - WithDDService: []string{"register-override", "register-override"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride, namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - }) - t.Run("MySQL", func(t *testing.T) { - genSpans := newGenSpansFunc(t, "mysql", false) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "mysql.query", spans[0].OperationName()) - assert.Equal(t, "mysql.query", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "mysql.query", spans[0].OperationName()) - assert.Equal(t, "mysql.query", spans[1].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"mysql.db", "mysql.db"}, - WithDDService: []string{"mysql.db", "mysql.db"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride, namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - }) -} diff --git a/contrib/database/sql/tx.go b/contrib/database/sql/tx.go index c6d160bbfd..a3a0b8ceba 100644 --- a/contrib/database/sql/tx.go +++ b/contrib/database/sql/tx.go @@ -10,8 +10,6 @@ import ( "database/sql/driver" "runtime/trace" "time" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" ) var _ driver.Tx = (*tracedTx)(nil) @@ -38,7 +36,7 @@ func startTraceTask(ctx context.Context, name string) (context.Context, func()) return ctx, noopTaskEnd } ctx, task := trace.NewTask(ctx, name) - return internal.WithExecutionTraced(ctx), task.End + return instr.WithExecutionTraced(ctx), task.End } // Commit sends a span at the end of the transaction diff --git a/contrib/dimfeld/httptreemux.v5/contextmux_test.go b/contrib/dimfeld/httptreemux.v5/contextmux_test.go index b7d8e8aaa6..b48c68ecd7 100644 --- a/contrib/dimfeld/httptreemux.v5/contextmux_test.go +++ b/contrib/dimfeld/httptreemux.v5/contextmux_test.go @@ -10,9 +10,9 @@ import ( "net/http/httptest" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/dimfeld/httptreemux/v5" "github.com/stretchr/testify/assert" @@ -24,7 +24,7 @@ func TestContextMux200(t *testing.T) { defer mt.Stop() router := NewWithContext( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) @@ -49,7 +49,7 @@ func TestContextMux200(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) } func TestContextMux404(t *testing.T) { @@ -62,7 +62,7 @@ func TestContextMux404(t *testing.T) { r := httptest.NewRequest("GET", url, nil) w := httptest.NewRecorder() NewWithContext( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ).ServeHTTP(w, r) assert.Equal(404, w.Code) @@ -79,7 +79,7 @@ func TestContextMux404(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) } func TestContextMux500(t *testing.T) { @@ -88,7 +88,7 @@ func TestContextMux500(t *testing.T) { defer mt.Stop() router := NewWithContext( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) @@ -112,7 +112,7 @@ func TestContextMux500(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal("500: Internal Server Error", s.Tag(ext.Error).(error).Error()) + assert.Equal("500: Internal Server Error", s.Tag(ext.ErrorMsg)) } func TestContextMuxDefaultResourceNamer(t *testing.T) { @@ -201,7 +201,7 @@ func TestContextMuxDefaultResourceNamer(t *testing.T) { assert.Equal("200", s.Tag(ext.HTTPCode)) assert.Equal(tc.method, s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+tc.url, s.Tag(ext.HTTPURL)) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) }) } } @@ -217,7 +217,7 @@ func TestContextMuxResourceNamer(t *testing.T) { defer mt.Stop() router := NewWithContext( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), WithResourceNamer(staticNamer), ) @@ -243,7 +243,7 @@ func TestContextMuxResourceNamer(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) } func handlerWithContext200(t *testing.T, route string, params map[string]string) http.HandlerFunc { diff --git a/contrib/dimfeld/httptreemux.v5/example_test.go b/contrib/dimfeld/httptreemux.v5/example_test.go index 9ca850f619..d49197d54a 100644 --- a/contrib/dimfeld/httptreemux.v5/example_test.go +++ b/contrib/dimfeld/httptreemux.v5/example_test.go @@ -10,9 +10,9 @@ import ( "log" "net/http" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/dimfeld/httptreemux.v5" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + httptrace "github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func Index(w http.ResponseWriter, _ *http.Request, _ map[string]string) { @@ -24,6 +24,9 @@ func Hello(w http.ResponseWriter, _ *http.Request, params map[string]string) { } func Example() { + tracer.Start() + defer tracer.Stop() + router := httptrace.New() router.GET("/", Index) router.GET("/hello/:name", Hello) @@ -32,7 +35,10 @@ func Example() { } func Example_withServiceName() { - router := httptrace.New(httptrace.WithServiceName("http.router")) + tracer.Start() + defer tracer.Stop() + + router := httptrace.New(httptrace.WithService("http.router")) router.GET("/", Index) router.GET("/hello/:name", Hello) @@ -40,10 +46,13 @@ func Example_withServiceName() { } func Example_withSpanOpts() { + tracer.Start() + defer tracer.Stop() + router := httptrace.New( - httptrace.WithServiceName("http.router"), + httptrace.WithService("http.router"), httptrace.WithSpanOptions( - tracer.Tag(ext.SamplingPriority, ext.PriorityUserKeep), + tracer.Tag(ext.ManualKeep, true), ), ) diff --git a/contrib/dimfeld/httptreemux.v5/go.mod b/contrib/dimfeld/httptreemux.v5/go.mod new file mode 100644 index 0000000000..8f5bd429c0 --- /dev/null +++ b/contrib/dimfeld/httptreemux.v5/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/dimfeld/httptreemux/v5 v5.5.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/dimfeld/httptreemux.v5/go.sum b/contrib/dimfeld/httptreemux.v5/go.sum new file mode 100644 index 0000000000..00a22d808d --- /dev/null +++ b/contrib/dimfeld/httptreemux.v5/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dimfeld/httptreemux/v5 v5.5.0 h1:p8jkiMrCuZ0CmhwYLcbNbl7DDo21fozhKHQ2PccwOFQ= +github.com/dimfeld/httptreemux/v5 v5.5.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/dimfeld/httptreemux.v5/httptreemux.go b/contrib/dimfeld/httptreemux.v5/httptreemux.go index d9ae06e91d..8bfcec19c5 100644 --- a/contrib/dimfeld/httptreemux.v5/httptreemux.go +++ b/contrib/dimfeld/httptreemux.v5/httptreemux.go @@ -4,26 +4,26 @@ // Copyright 2016 Datadog, Inc. // Package httptreemux provides functions to trace the dimfeld/httptreemux/v5 package (https://github.com/dimfeld/httptreemux). -package httptreemux // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/dimfeld/httptreemux.v5" +package httptreemux // import "github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2" import ( "net/http" "strings" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/dimfeld/httptreemux/v5" + + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "dimfeld/httptreemux.v5" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/dimfeld/httptreemux/v5") + instr = instrumentation.Load(instrumentation.PackageDimfeldHTTPTreeMuxV5) } // Router is a traced version of httptreemux.TreeMux. @@ -37,12 +37,12 @@ func New(opts ...RouterOption) *Router { cfg := new(routerConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } cfg.spanOpts = append(cfg.spanOpts, tracer.Measured()) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) - log.Debug("contrib/dimfeld/httptreemux.v5: Configuring Router: %#v", cfg) + instr.Logger().Debug("contrib/dimfeld/httptreemux.v5: Configuring Router: %#v", cfg) return &Router{httptreemux.New(), cfg} } @@ -52,10 +52,11 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { route, _ := getRoute(r.TreeMux, w, req) // pass r.TreeMux to avoid a circular reference panic on calling r.ServeHTTP httptrace.TraceAndServe(r.TreeMux, w, req, &httptrace.ServeConfig{ - Service: r.config.serviceName, - Resource: resource, - SpanOpts: r.config.spanOpts, - Route: route, + Framework: "github.com/dimfeld/httptreemux/v5", + Service: r.config.serviceName, + Resource: resource, + SpanOpts: r.config.spanOpts, + Route: route, }) } @@ -72,12 +73,12 @@ func NewWithContext(opts ...RouterOption) *ContextRouter { cfg := new(routerConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } cfg.spanOpts = append(cfg.spanOpts, tracer.Measured()) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) - log.Debug("contrib/dimfeld/httptreemux.v5: Configuring ContextRouter: %#v", cfg) + instr.Logger().Debug("contrib/dimfeld/httptreemux.v5: Configuring ContextRouter: %#v", cfg) return &ContextRouter{httptreemux.NewContextMux(), cfg} } @@ -87,10 +88,11 @@ func (r *ContextRouter) ServeHTTP(w http.ResponseWriter, req *http.Request) { route, _ := getRoute(r.TreeMux, w, req) // pass r.TreeMux to avoid a circular reference panic on calling r.ServeHTTP httptrace.TraceAndServe(r.TreeMux, w, req, &httptrace.ServeConfig{ - Service: r.config.serviceName, - Resource: resource, - SpanOpts: r.config.spanOpts, - Route: route, + Framework: "github.com/dimfeld/httptreemux/v5", + Service: r.config.serviceName, + Resource: resource, + SpanOpts: r.config.spanOpts, + Route: route, }) } @@ -145,7 +147,10 @@ func getRoute(router *httptreemux.TreeMux, w http.ResponseWriter, req *http.Requ // replace parameter at end of the path, i.e. "../:param" oldP = "/" + v newP = "/:" + k - route = strings.Replace(route, oldP, newP, 1) + if strings.HasSuffix(route, oldP) { + endPos := strings.LastIndex(route, oldP) + route = route[:endPos] + newP + } } return route, true } diff --git a/contrib/dimfeld/httptreemux.v5/httptreemux_test.go b/contrib/dimfeld/httptreemux.v5/httptreemux_test.go index 6bf900217c..41e98ef71f 100644 --- a/contrib/dimfeld/httptreemux.v5/httptreemux_test.go +++ b/contrib/dimfeld/httptreemux.v5/httptreemux_test.go @@ -10,13 +10,12 @@ import ( "net/http/httptest" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "github.com/dimfeld/httptreemux/v5" "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func TestHttpTracer200(t *testing.T) { @@ -43,8 +42,9 @@ func TestHttpTracer200(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("/200", s.Tag(ext.HTTPRoute)) + assert.Equal(componentName, s.Integration()) } func TestHttpTracer404(t *testing.T) { @@ -71,7 +71,8 @@ func TestHttpTracer404(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) + assert.Equal(componentName, s.Integration()) assert.NotContains(s.Tags(), ext.HTTPRoute) } @@ -99,8 +100,9 @@ func TestHttpTracer500(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal("500: Internal Server Error", s.Tag(ext.Error).(error).Error()) + assert.Equal("500: Internal Server Error", s.Tag(ext.ErrorMsg)) assert.Equal("/500", s.Tag(ext.HTTPRoute)) + assert.Equal(componentName, s.Integration()) } func TestDefaultResourceNamer(t *testing.T) { @@ -172,8 +174,9 @@ func TestDefaultResourceNamer(t *testing.T) { assert.Equal("200", s.Tag(ext.HTTPCode)) assert.Equal(tc.method, s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+tc.url, s.Tag(ext.HTTPURL)) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal(tc.path, s.Tag(ext.HTTPRoute)) + assert.Equal(componentName, s.Integration()) }) } } @@ -189,7 +192,7 @@ func TestResourceNamer(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), WithResourceNamer(staticNamer), ) @@ -216,26 +219,7 @@ func TestResourceNamer(t *testing.T) { assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) assert.Equal(nil, s.Tag(ext.Error)) -} - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []RouterOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := New(opts...) - mux.GET("/200", handler200) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "http.router")(t) + assert.Equal(componentName, s.Integration()) } func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { @@ -245,7 +229,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.RedirectBehavior = httptreemux.Redirect301 // default @@ -271,8 +255,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.NotContains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter", func(t *testing.T) { @@ -281,7 +266,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter", handler200) // without trailing slash @@ -306,8 +291,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue/", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter/", func(t *testing.T) { @@ -316,7 +302,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter/", handler200) // with trailing slash @@ -341,8 +327,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect301(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) } @@ -353,7 +340,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect307(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.RedirectBehavior = httptreemux.Redirect307 @@ -379,8 +366,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect307(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.NotContains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter", func(t *testing.T) { @@ -389,7 +377,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect307(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter", handler200) // without trailing slash @@ -414,8 +402,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect307(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue/", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter/", func(t *testing.T) { @@ -424,7 +413,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect307(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter/", handler200) // with trailing slash @@ -449,8 +438,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect307(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) } @@ -461,7 +451,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect308(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.RedirectBehavior = httptreemux.Redirect308 @@ -487,8 +477,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect308(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.NotContains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter", func(t *testing.T) { @@ -497,7 +488,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect308(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter", handler200) // without trailing slash @@ -522,8 +513,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect308(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue/", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter/", func(t *testing.T) { @@ -532,7 +524,7 @@ func TestTrailingSlashRoutesWithBehaviorRedirect308(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter/", handler200) // with trailing slash @@ -557,8 +549,9 @@ func TestTrailingSlashRoutesWithBehaviorRedirect308(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) } @@ -569,7 +562,7 @@ func TestTrailingSlashRoutesWithBehaviorUseHandler(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.RedirectBehavior = httptreemux.UseHandler @@ -595,8 +588,9 @@ func TestTrailingSlashRoutesWithBehaviorUseHandler(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.NotContains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter", func(t *testing.T) { @@ -605,7 +599,7 @@ func TestTrailingSlashRoutesWithBehaviorUseHandler(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter", handler200) // without trailing slash @@ -630,8 +624,9 @@ func TestTrailingSlashRoutesWithBehaviorUseHandler(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue/", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) t.Run("GET /api/:parameter/", func(t *testing.T) { @@ -640,7 +635,7 @@ func TestTrailingSlashRoutesWithBehaviorUseHandler(t *testing.T) { defer mt.Stop() router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) router.GET("/api/:parameter/", handler200) // with trailing slash @@ -665,11 +660,50 @@ func TestTrailingSlashRoutesWithBehaviorUseHandler(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/api/paramvalue", s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Contains(s.Tags(), ext.HTTPRoute) + assert.Equal(componentName, s.Integration()) }) } +func TestDuplicateWordsParamsHandler(t *testing.T) { + tests := []struct { + name string + route string + url string + }{ + { + name: "Test minimal case", + route: "/1a/:n", + url: "/1a/1", + }, + { + name: "Test string with separators", + route: "/foo/2by4/bar/:n", + url: "/foo/2by4/bar/2", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + router := New() + router.GET(tt.route, handler200) + + r := httptest.NewRequest("GET", tt.url, nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + + spans := mt.FinishedSpans() + assert.Equal(1, len(spans)) + assert.Equal("GET "+tt.route, spans[0].Tag(ext.ResourceName)) + }) + } +} + func TestIsSupportedRedirectStatus(t *testing.T) { tests := []struct { name string @@ -865,7 +899,7 @@ func TestRouterRedirectEnabled(t *testing.T) { func router() http.Handler { router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) diff --git a/contrib/dimfeld/httptreemux.v5/option.go b/contrib/dimfeld/httptreemux.v5/option.go index d7f65ff1e7..a96dc86996 100644 --- a/contrib/dimfeld/httptreemux.v5/option.go +++ b/contrib/dimfeld/httptreemux.v5/option.go @@ -9,37 +9,44 @@ package httptreemux import ( "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "github.com/dimfeld/httptreemux/v5" -) -const defaultServiceName = "http.router" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) type routerConfig struct { serviceName string - spanOpts []ddtrace.StartSpanOption + spanOpts []tracer.StartSpanOption resourceNamer func(*httptreemux.TreeMux, http.ResponseWriter, *http.Request) string } -// RouterOption represents an option that can be passed to New. -type RouterOption func(*routerConfig) +// RouterOption describes options for the router. +type RouterOption interface { + apply(*routerConfig) +} + +// RouterOptionFn represents options applicable to New and NewWithContext. +type RouterOptionFn func(*routerConfig) + +func (fn RouterOptionFn) apply(cfg *routerConfig) { + fn(cfg) +} func defaults(cfg *routerConfig) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) cfg.resourceNamer = defaultResourceNamer } -// WithServiceName sets the given service name for the returned router. -func WithServiceName(name string) RouterOption { +// WithService sets the given service name for the returned router. +func WithService(name string) RouterOptionFn { return func(cfg *routerConfig) { cfg.serviceName = name } } // WithSpanOptions applies the given set of options to the span started by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) RouterOption { +func WithSpanOptions(opts ...tracer.StartSpanOption) RouterOptionFn { return func(cfg *routerConfig) { cfg.spanOpts = opts } @@ -47,7 +54,7 @@ func WithSpanOptions(opts ...ddtrace.StartSpanOption) RouterOption { // WithResourceNamer specifies a function which will be used to obtain the // resource name for a given request. -func WithResourceNamer(namer func(router *httptreemux.TreeMux, w http.ResponseWriter, req *http.Request) string) RouterOption { +func WithResourceNamer(namer func(router *httptreemux.TreeMux, w http.ResponseWriter, req *http.Request) string) RouterOptionFn { return func(cfg *routerConfig) { cfg.resourceNamer = namer } diff --git a/contrib/elastic/go-elasticsearch.v6/elastictrace.go b/contrib/elastic/go-elasticsearch.v6/elastictrace.go index eaf0a3e6c8..569ba1faa0 100644 --- a/contrib/elastic/go-elasticsearch.v6/elastictrace.go +++ b/contrib/elastic/go-elasticsearch.v6/elastictrace.go @@ -4,7 +4,7 @@ // Copyright 2016 Datadog, Inc. // Package elastic provides functions to trace the github.com/elastic/go-elasticsearch packages. -package elastic // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/elastic/go-elasticsearch +package elastic // import "github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch/v2 import ( "bufio" @@ -18,17 +18,17 @@ import ( "regexp" "strconv" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "elastic/go-elasticsearch.v6" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/elastic/go-elasticsearch/v6") + instr = instrumentation.Load(instrumentation.PackageGoElasticSearchV6) } // NewRoundTripper returns a new http.Client which traces requests under the given service name. @@ -36,7 +36,7 @@ func NewRoundTripper(opts ...ClientOption) http.RoundTripper { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } return &roundTripper{config: *cfg} } @@ -58,7 +58,7 @@ func (t *roundTripper) RoundTrip(req *http.Request) (*http.Response, error) { url := req.URL.Path method := req.Method resource := t.config.resourceNamer(url, method) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(t.config.serviceName), tracer.SpanType(ext.SpanTypeElasticSearch), tracer.ResourceName(resource), diff --git a/contrib/elastic/go-elasticsearch.v6/elastictrace_v6_test.go b/contrib/elastic/go-elasticsearch.v6/elastictrace_v6_test.go index c5e4abe04c..3ae09950c9 100644 --- a/contrib/elastic/go-elasticsearch.v6/elastictrace_v6_test.go +++ b/contrib/elastic/go-elasticsearch.v6/elastictrace_v6_test.go @@ -7,17 +7,16 @@ package elastic import ( "context" - "fmt" "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - elasticsearch6 "github.com/elastic/go-elasticsearch/v6" esapi6 "github.com/elastic/go-elasticsearch/v6/esapi" "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func checkGETTraceV6(assert *assert.Assertions, mt mocktracer.Tracer) { @@ -27,6 +26,7 @@ func checkGETTraceV6(assert *assert.Assertions, mt mocktracer.Tracer) { assert.Equal("/twitter/tweet/1", span.Tag("elasticsearch.url")) assert.Equal("GET", span.Tag("elasticsearch.method")) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) + assert.Equal(componentName, span.Integration()) } func checkErrTraceV6(assert *assert.Assertions, mt mocktracer.Tracer) { @@ -34,9 +34,9 @@ func checkErrTraceV6(assert *assert.Assertions, mt mocktracer.Tracer) { assert.Equal("my-es-service", span.Tag(ext.ServiceName)) assert.Equal("GET /not-real-index/_doc/?", span.Tag(ext.ResourceName)) assert.Equal("/not-real-index/_doc/1", span.Tag("elasticsearch.url")) - assert.NotEmpty(span.Tag(ext.Error)) - assert.Equal("*errors.errorString", fmt.Sprintf("%T", span.Tag(ext.Error).(error))) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) + assert.Equal(componentName, span.Integration()) } func TestClientV6(t *testing.T) { @@ -45,7 +45,7 @@ func TestClientV6(t *testing.T) { defer mt.Stop() cfg := elasticsearch6.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ elasticV6URL, }, @@ -91,7 +91,7 @@ func TestClientErrorCutoffV6(t *testing.T) { bodyCutoff = 10 cfg := elasticsearch6.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ elasticV6URL, }, @@ -106,7 +106,7 @@ func TestClientErrorCutoffV6(t *testing.T) { assert.NoError(err) span := mt.FinishedSpans()[0] - assert.Equal(`{"error":{`, span.Tag(ext.Error).(error).Error()) + assert.Equal(`{"error":{`, span.Tag(ext.ErrorMsg)) } func TestClientV6Failure(t *testing.T) { @@ -115,7 +115,7 @@ func TestClientV6Failure(t *testing.T) { defer mt.Stop() cfg := elasticsearch6.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ "http://127.0.0.1:9207/", // inexistent service, it must fail }, @@ -131,13 +131,12 @@ func TestClientV6Failure(t *testing.T) { assert.Error(err) spans := mt.FinishedSpans() - assert.NotEmpty(spans[0].Tag(ext.Error)) - assert.Equal("*net.OpError", fmt.Sprintf("%T", spans[0].Tag(ext.Error).(error))) + assert.NotEmpty(spans[0].Tag(ext.ErrorMsg)) } func TestResourceNamerSettingsV6(t *testing.T) { staticName := "static resource name" - staticNamer := func(url, method string) string { + staticNamer := func(_, _ string) string { return staticName } @@ -225,10 +224,7 @@ func TestAnalyticsSettingsV6(t *testing.T) { t.Skip("global flag disabled") mt := mocktracer.Start() defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -250,10 +246,7 @@ func TestAnalyticsSettingsV6(t *testing.T) { t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) diff --git a/contrib/elastic/go-elasticsearch.v6/elastictrace_v7_test.go b/contrib/elastic/go-elasticsearch.v6/elastictrace_v7_test.go index 0ec177f4a6..7ae50dd1fb 100644 --- a/contrib/elastic/go-elasticsearch.v6/elastictrace_v7_test.go +++ b/contrib/elastic/go-elasticsearch.v6/elastictrace_v7_test.go @@ -7,14 +7,12 @@ package elastic import ( "context" - "fmt" "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" elasticsearch7 "github.com/elastic/go-elasticsearch/v7" esapi7 "github.com/elastic/go-elasticsearch/v7/esapi" "github.com/stretchr/testify/assert" @@ -27,6 +25,7 @@ func checkGETTraceV7(assert *assert.Assertions, mt mocktracer.Tracer) { assert.Equal("/twitter/tweet/1", span.Tag("elasticsearch.url")) assert.Equal("GET", span.Tag("elasticsearch.method")) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) + assert.Equal(componentName, span.Integration()) } func checkErrTraceV7(assert *assert.Assertions, mt mocktracer.Tracer) { @@ -34,9 +33,9 @@ func checkErrTraceV7(assert *assert.Assertions, mt mocktracer.Tracer) { assert.Equal("my-es-service", span.Tag(ext.ServiceName)) assert.Equal("GET /not-real-index/_doc/?", span.Tag(ext.ResourceName)) assert.Equal("/not-real-index/_doc/1", span.Tag("elasticsearch.url")) - assert.NotEmpty(span.Tag(ext.Error)) - assert.Equal("*errors.errorString", fmt.Sprintf("%T", span.Tag(ext.Error).(error))) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) + assert.Equal(componentName, span.Integration()) } func TestClientV7(t *testing.T) { @@ -45,7 +44,7 @@ func TestClientV7(t *testing.T) { defer mt.Stop() cfg := elasticsearch7.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ elasticV7URL, }, @@ -91,7 +90,7 @@ func TestClientErrorCutoffV7(t *testing.T) { bodyCutoff = 10 cfg := elasticsearch7.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ elasticV7URL, }, @@ -106,7 +105,7 @@ func TestClientErrorCutoffV7(t *testing.T) { assert.NoError(err) span := mt.FinishedSpans()[1] - assert.Equal(`{"error":{`, span.Tag(ext.Error).(error).Error()) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) } func TestClientV7Failure(t *testing.T) { @@ -115,7 +114,7 @@ func TestClientV7Failure(t *testing.T) { defer mt.Stop() cfg := elasticsearch7.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ "http://127.0.0.1:9207/", // inexistent service, it must fail }, @@ -131,13 +130,12 @@ func TestClientV7Failure(t *testing.T) { assert.Error(err) spans := mt.FinishedSpans() - assert.NotEmpty(spans[0].Tag(ext.Error)) - assert.Equal("*net.OpError", fmt.Sprintf("%T", spans[0].Tag(ext.Error).(error))) + assert.NotEmpty(spans[0].Tag(ext.ErrorMsg)) } func TestResourceNamerSettingsV7(t *testing.T) { staticName := "static resource name" - staticNamer := func(url, method string) string { + staticNamer := func(_, _ string) string { return staticName } @@ -225,10 +223,7 @@ func TestAnalyticsSettingsV7(t *testing.T) { t.Skip("global flag disabled") mt := mocktracer.Start() defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -250,10 +245,7 @@ func TestAnalyticsSettingsV7(t *testing.T) { t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) diff --git a/contrib/elastic/go-elasticsearch.v6/elastictrace_v8_test.go b/contrib/elastic/go-elasticsearch.v6/elastictrace_v8_test.go index 8b0844e287..4de0b3dcf8 100644 --- a/contrib/elastic/go-elasticsearch.v6/elastictrace_v8_test.go +++ b/contrib/elastic/go-elasticsearch.v6/elastictrace_v8_test.go @@ -7,19 +7,15 @@ package elastic import ( "context" - "fmt" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" elasticsearch8 "github.com/elastic/go-elasticsearch/v8" esapi8 "github.com/elastic/go-elasticsearch/v8/esapi" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func checkGETTraceV8(assert *assert.Assertions, mt mocktracer.Tracer) { @@ -29,6 +25,7 @@ func checkGETTraceV8(assert *assert.Assertions, mt mocktracer.Tracer) { assert.Equal("/twitter/_doc/1", span.Tag("elasticsearch.url")) assert.Equal("GET", span.Tag("elasticsearch.method")) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) + assert.Equal(componentName, span.Integration()) } func checkErrTraceV8(assert *assert.Assertions, mt mocktracer.Tracer) { @@ -36,9 +33,9 @@ func checkErrTraceV8(assert *assert.Assertions, mt mocktracer.Tracer) { assert.Equal("my-es-service", span.Tag(ext.ServiceName)) assert.Equal("GET /not-real-index/_doc/?", span.Tag(ext.ResourceName)) assert.Equal("/not-real-index/_doc/1", span.Tag("elasticsearch.url")) - assert.NotEmpty(span.Tag(ext.Error)) - assert.Equal("*errors.errorString", fmt.Sprintf("%T", span.Tag(ext.Error).(error))) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) + assert.Equal(componentName, span.Integration()) } func TestClientV8(t *testing.T) { @@ -47,7 +44,7 @@ func TestClientV8(t *testing.T) { defer mt.Stop() cfg := elasticsearch8.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ elasticV8URL, }, @@ -91,7 +88,7 @@ func TestClientErrorCutoffV8(t *testing.T) { bodyCutoff = 10 cfg := elasticsearch8.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ elasticV8URL, }, @@ -106,7 +103,7 @@ func TestClientErrorCutoffV8(t *testing.T) { assert.NoError(err) span := mt.FinishedSpans()[0] - assert.Equal(`{"error":{`, span.Tag(ext.Error).(error).Error()) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) } func TestClientV8Failure(t *testing.T) { @@ -115,7 +112,7 @@ func TestClientV8Failure(t *testing.T) { defer mt.Stop() cfg := elasticsearch8.Config{ - Transport: NewRoundTripper(WithServiceName("my-es-service")), + Transport: NewRoundTripper(WithService("my-es-service")), Addresses: []string{ "http://127.0.0.1:9207/", // inexistent service, it must fail }, @@ -131,13 +128,12 @@ func TestClientV8Failure(t *testing.T) { assert.Error(err) spans := mt.FinishedSpans() - assert.NotEmpty(spans[0].Tag(ext.Error)) - assert.Equal("*net.OpError", fmt.Sprintf("%T", spans[0].Tag(ext.Error).(error))) + assert.NotEmpty(spans[0].Tag(ext.ErrorMsg)) } func TestResourceNamerSettingsV8(t *testing.T) { staticName := "static resource name" - staticNamer := func(url, method string) string { + staticNamer := func(_, _ string) string { return staticName } @@ -222,10 +218,7 @@ func TestAnalyticsSettingsV8(t *testing.T) { t.Skip("global flag disabled") mt := mocktracer.Start() defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -247,56 +240,8 @@ func TestAnalyticsSettingsV8(t *testing.T) { t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - cfg := elasticsearch8.Config{ - Transport: NewRoundTripper(opts...), - Addresses: []string{ - elasticV8URL, - }, - } - client, err := elasticsearch8.NewClient(cfg) - require.NoError(t, err) - - _, err = esapi8.IndexRequest{ - Index: "twitter", - DocumentID: "1", - Body: strings.NewReader(`{"user": "test", "message": "hello"}`), - }.Do(context.Background(), client) - require.NoError(t, err) - - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - return spans - } - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"elastic.client"}, - WithDDService: []string{"elastic.client"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} diff --git a/contrib/elastic/go-elasticsearch.v6/example_test.go b/contrib/elastic/go-elasticsearch.v6/example_test.go index 783c629194..a0100210d1 100644 --- a/contrib/elastic/go-elasticsearch.v6/example_test.go +++ b/contrib/elastic/go-elasticsearch.v6/example_test.go @@ -9,8 +9,8 @@ import ( "log" "strings" - elastictrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/elastic/go-elasticsearch.v6" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + elastictrace "github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" elasticsearch "github.com/elastic/go-elasticsearch/v8" "github.com/elastic/go-elasticsearch/v8/esapi" @@ -18,7 +18,7 @@ import ( func Example_v8() { cfg := elasticsearch.Config{ - Transport: elastictrace.NewRoundTripper(elastictrace.WithServiceName("my-es-service")), + Transport: elastictrace.NewRoundTripper(elastictrace.WithService("my-es-service")), Addresses: []string{ "http://127.0.0.1:9200/", }, diff --git a/contrib/elastic/go-elasticsearch.v6/go.mod b/contrib/elastic/go-elasticsearch.v6/go.mod new file mode 100644 index 0000000000..64e9a0f3b0 --- /dev/null +++ b/contrib/elastic/go-elasticsearch.v6/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/elastic/go-elasticsearch/v6 v6.8.5 + github.com/elastic/go-elasticsearch/v7 v7.17.1 + github.com/elastic/go-elasticsearch/v8 v8.4.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/elastic/elastic-transport-go/v8 v8.1.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/elastic/go-elasticsearch.v6/go.sum b/contrib/elastic/go-elasticsearch.v6/go.sum new file mode 100644 index 0000000000..ab4ccddfdb --- /dev/null +++ b/contrib/elastic/go-elasticsearch.v6/go.sum @@ -0,0 +1,317 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/elastic-transport-go/v8 v8.1.0 h1:NeqEz1ty4RQz+TVbUrpSU7pZ48XkzGWQj02k5koahIE= +github.com/elastic/elastic-transport-go/v8 v8.1.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= +github.com/elastic/go-elasticsearch/v6 v6.8.5 h1:U2HtkBseC1FNBmDr0TR2tKltL6FxoY+niDAlj5M8TK8= +github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= +github.com/elastic/go-elasticsearch/v7 v7.17.1 h1:49mHcHx7lpCL8cW1aioEwSEVKQF3s+Igi4Ye/QTWwmk= +github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/go-elasticsearch/v8 v8.4.0 h1:Rn1mcqaIMcNT43hnx2H62cIFZ+B6mjWtzj85BDKrvCE= +github.com/elastic/go-elasticsearch/v8 v8.4.0/go.mod h1:yY52i2Vj0unLz+N3Nwx1gM5LXwoj3h2dgptNGBYkMLA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/elastic/go-elasticsearch.v6/option.go b/contrib/elastic/go-elasticsearch.v6/option.go index 8bdce50b28..41ab3271fa 100644 --- a/contrib/elastic/go-elasticsearch.v6/option.go +++ b/contrib/elastic/go-elasticsearch.v6/option.go @@ -6,15 +6,11 @@ package elastic import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" "math" "net/http" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" ) -const defaultServiceName = "elastic.client" - type clientConfig struct { serviceName string operationName string @@ -23,37 +19,42 @@ type clientConfig struct { resourceNamer func(url, method string) string } -// ClientOption represents an option that can be used when creating a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the client. +type ClientOption interface { + apply(*clientConfig) +} + +// ClientOptionFn represents options applicable to NewRoundTripper. +type ClientOptionFn func(*clientConfig) + +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.operationName = namingschema.OpName(namingschema.ElasticSearchOutbound) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.operationName = instr.OperationName(instrumentation.ComponentDefault, nil) cfg.transport = http.DefaultTransport cfg.resourceNamer = quantize - if internal.BoolEnv("DD_TRACE_ELASTIC_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.analyticsRate = instr.AnalyticsRate(false) } // WithTransport sets the given transport as an http.Transport for the client. -func WithTransport(t http.RoundTripper) ClientOption { +func WithTransport(t http.RoundTripper) ClientOptionFn { return func(cfg *clientConfig) { cfg.transport = t } } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -65,7 +66,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -79,7 +80,7 @@ func WithAnalyticsRate(rate float64) ClientOption { // ElasticSearch request, using the request's URL and method. Note that the default quantizer obfuscates // IDs and indexes and by replacing it, sensitive data could possibly be exposed, unless the new quantizer // specifically takes care of that. -func WithResourceNamer(namer func(url, method string) string) ClientOption { +func WithResourceNamer(namer func(url, method string) string) ClientOptionFn { return func(cfg *clientConfig) { cfg.resourceNamer = namer } diff --git a/contrib/elastic/go-elasticsearch.v6/orchestrion.yml b/contrib/elastic/go-elasticsearch.v6/orchestrion.yml new file mode 100644 index 0000000000..661e705fc1 --- /dev/null +++ b/contrib/elastic/go-elasticsearch.v6/orchestrion.yml @@ -0,0 +1,132 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + description: The official Go client for Elasticsearch + +# FIXME: in v7 and v8, if elasticsearch.Config.CACert != nil, the call to elasticsearch.NewClient will always return +# an error when setting a non *http.Transport in the Transport (http.RoundTripper) field. +# The workaround from the user-side is to configure the certificate in the Transport instead, but for now we decide +# to not modify the configuration so we don't make the user's application crash. +# This problem will be fixed by migrating our instrumentation to use the elasticsearch.Config.Instrumentation +# field instead. +aspects: + - id: v6.Config + join-point: + struct-literal: + type: github.com/elastic/go-elasticsearch/v6.Config + match: value-only + advice: + - wrap-expression: + imports: + elasticsearch: github.com/elastic/go-elasticsearch/v6 + elastictrace: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + template: |- + func(cfg elasticsearch.Config) elasticsearch.Config { + if cfg.Transport == nil { + cfg.Transport = elastictrace.NewRoundTripper() + } else { + base := cfg.Transport + cfg.Transport = elastictrace.NewRoundTripper(elastictrace.WithTransport(base)) + } + return cfg + }({{ . }}) + + - id: '*v6.Config' + join-point: + struct-literal: + type: github.com/elastic/go-elasticsearch/v6.Config + match: pointer-only + advice: + - wrap-expression: + imports: + elasticsearch: github.com/elastic/go-elasticsearch/v6 + elastictrace: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + template: |- + func(cfg *elasticsearch.Config) *elasticsearch.Config { + if cfg.Transport == nil { + cfg.Transport = elastictrace.NewRoundTripper() + } else { + base := cfg.Transport + cfg.Transport = elastictrace.NewRoundTripper(elastictrace.WithTransport(base)) + } + return cfg + }({{ . }}) + + - id: v7.Config + join-point: + struct-literal: + type: github.com/elastic/go-elasticsearch/v7.Config + match: value-only + advice: + - wrap-expression: + imports: + elasticsearch: github.com/elastic/go-elasticsearch/v7 + elastictrace: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + template: &templateValV7 |- + func(cfg elasticsearch.Config) elasticsearch.Config { + if cfg.CACert != nil { + // refuse to set transport as it will make the NewClient call fail. + return cfg + } + if cfg.Transport == nil { + cfg.Transport = elastictrace.NewRoundTripper() + } else { + base := cfg.Transport + cfg.Transport = elastictrace.NewRoundTripper(elastictrace.WithTransport(base)) + } + return cfg + }({{ . }}) + + - id: '*v7.Config' + join-point: + struct-literal: + type: github.com/elastic/go-elasticsearch/v7.Config + match: pointer-only + advice: + - wrap-expression: + imports: + elasticsearch: github.com/elastic/go-elasticsearch/v7 + elastictrace: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + template: &templatePtrV7 |- + func(cfg *elasticsearch.Config) *elasticsearch.Config { + if cfg.CACert != nil { + // refuse to set transport as it will make the NewClient call fail. + return cfg + } + if cfg.Transport == nil { + cfg.Transport = elastictrace.NewRoundTripper() + } else { + base := cfg.Transport + cfg.Transport = elastictrace.NewRoundTripper(elastictrace.WithTransport(base)) + } + return cfg + }({{ . }}) + + - id: v8.Config + join-point: + struct-literal: + type: github.com/elastic/go-elasticsearch/v8.Config + match: value-only + advice: + - wrap-expression: + imports: + elasticsearch: github.com/elastic/go-elasticsearch/v8 + elastictrace: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + template: *templateValV7 + + - id: '*v8.Config' + join-point: + struct-literal: + type: github.com/elastic/go-elasticsearch/v8.Config + match: pointer-only + advice: + - wrap-expression: + imports: + elasticsearch: github.com/elastic/go-elasticsearch/v8 + elastictrace: github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 + template: *templatePtrV7 diff --git a/contrib/emicklei/go-restful.v3/example_test.go b/contrib/emicklei/go-restful.v3/example_test.go index 80ea371e88..356242e632 100644 --- a/contrib/emicklei/go-restful.v3/example_test.go +++ b/contrib/emicklei/go-restful.v3/example_test.go @@ -10,20 +10,23 @@ import ( "log" "net/http" - restfultrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/emicklei/go-restful.v3" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + restfultrace "github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/emicklei/go-restful/v3" ) // To start tracing requests, add the trace filter to your go-restful router. func Example() { + tracer.Start() + defer tracer.Stop() + // create new go-restful service ws := new(restful.WebService) // create the Datadog filter filter := restfultrace.FilterFunc( - restfultrace.WithServiceName("my-service"), + restfultrace.WithService("my-service"), ) // use it @@ -31,7 +34,7 @@ func Example() { // set endpoint ws.Route(ws.GET("/hello").To( - func(request *restful.Request, response *restful.Response) { + func(_ *restful.Request, response *restful.Response) { io.WriteString(response, "world") })) restful.Add(ws) @@ -41,13 +44,16 @@ func Example() { } func Example_spanFromContext() { + tracer.Start() + defer tracer.Stop() + ws := new(restful.WebService) ws.Filter(restfultrace.FilterFunc( - restfultrace.WithServiceName("my-service"), + restfultrace.WithService("my-service"), )) ws.Route(ws.GET("/image/encode").To( - func(request *restful.Request, response *restful.Response) { + func(request *restful.Request, _ *restful.Response) { // create a child span to track operation timing. encodeSpan, _ := tracer.StartSpanFromContext(request.Request.Context(), "image.encode") // encode a image diff --git a/contrib/emicklei/go-restful.v3/go.mod b/contrib/emicklei/go-restful.v3/go.mod new file mode 100644 index 0000000000..6c37a0775a --- /dev/null +++ b/contrib/emicklei/go-restful.v3/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/emicklei/go-restful/v3 v3.11.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/emicklei/go-restful.v3/go.sum b/contrib/emicklei/go-restful.v3/go.sum new file mode 100644 index 0000000000..77287df647 --- /dev/null +++ b/contrib/emicklei/go-restful.v3/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/emicklei/go-restful.v3/option.go b/contrib/emicklei/go-restful.v3/option.go index c904c2e102..4311ad5287 100644 --- a/contrib/emicklei/go-restful.v3/option.go +++ b/contrib/emicklei/go-restful.v3/option.go @@ -8,45 +8,44 @@ package restful import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "go-restful" - type config struct { serviceName string analyticsRate float64 - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags } func newConfig() *config { - rate := globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_RESTFUL_ANALYTICS_ENABLED", false) { - rate = 1.0 - } - serviceName := namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) return &config{ - serviceName: serviceName, - analyticsRate: rate, - headerTags: globalconfig.HeaderTagMap(), + serviceName: instr.ServiceName(instrumentation.ComponentServer, nil), + analyticsRate: instr.AnalyticsRate(true), + headerTags: instr.HTTPHeadersAsTags(), } } -// Option specifies instrumentation configuration options. -type Option func(*config) +// Option describes options for the go-restful integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to FilterFunc. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} -// WithServiceName sets the service name to by used by the filter. -func WithServiceName(name string) Option { +// WithService sets the service name to by used by the filter. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -58,7 +57,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -72,9 +71,8 @@ func WithAnalyticsRate(rate float64) Option { // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) OptionFn { return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } diff --git a/contrib/emicklei/go-restful.v3/restful.go b/contrib/emicklei/go-restful.v3/restful.go index 1d1e153c2d..57aa012553 100644 --- a/contrib/emicklei/go-restful.v3/restful.go +++ b/contrib/emicklei/go-restful.v3/restful.go @@ -9,31 +9,30 @@ package restful import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/emicklei/go-restful/v3" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" ) const componentName = "emicklei/go-restful.v3" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/emicklei/go-restful/v3") + instr = instrumentation.Load(instrumentation.PackageEmickleiGoRestfulV3) } // FilterFunc returns a restful.FilterFunction which will automatically trace incoming request. func FilterFunc(configOpts ...Option) restful.FilterFunction { cfg := newConfig() for _, opt := range configOpts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/emicklei/go-restful/v3: Creating tracing filter: %#v", cfg) - spanOpts := []ddtrace.StartSpanOption{tracer.ServiceName(cfg.serviceName)} + instr.Logger().Debug("contrib/emicklei/go-restful/v3: Creating tracing filter: %#v", cfg) + spanOpts := []tracer.StartSpanOption{tracer.ServiceName(cfg.serviceName)} return func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { spanOpts := append( spanOpts, @@ -46,9 +45,9 @@ func FilterFunc(configOpts ...Option) restful.FilterFunction { spanOpts = append(spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } spanOpts = append(spanOpts, httptrace.HeaderTagsFromRequest(req.Request, cfg.headerTags)) - span, ctx := httptrace.StartRequestSpan(req.Request, spanOpts...) + _, ctx, finishSpans := httptrace.StartRequestSpan(req.Request, spanOpts...) defer func() { - httptrace.FinishRequestSpan(span, resp.StatusCode(), tracer.WithError(resp.Error())) + finishSpans(resp.StatusCode(), nil, tracer.WithError(resp.Error())) }() // pass the span through the request context diff --git a/contrib/emicklei/go-restful.v3/restful_test.go b/contrib/emicklei/go-restful.v3/restful_test.go index d452925809..4e90d89b01 100644 --- a/contrib/emicklei/go-restful.v3/restful_test.go +++ b/contrib/emicklei/go-restful.v3/restful_test.go @@ -10,27 +10,23 @@ import ( "math" "net/http" "net/http/httptest" - "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - "github.com/emicklei/go-restful/v3" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestWithHeaderTags(t *testing.T) { setupReq := func(opts ...Option) *http.Request { ws := new(restful.WebService) ws.Filter(FilterFunc(opts...)) - ws.Route(ws.GET("/test").To(func(request *restful.Request, response *restful.Response) { + ws.Route(ws.GET("/test").To(func(_ *restful.Request, response *restful.Response) { response.Write([]byte("test")) })) @@ -57,10 +53,10 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { @@ -68,54 +64,51 @@ func TestWithHeaderTags(t *testing.T) { defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) - globalconfig.SetHeaderTag("other", tag) + testutils.SetGlobalHeaderTags(t, "3header", "other") - r := setupReq() + _ = setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") }) } @@ -125,7 +118,7 @@ func TestTrace200(t *testing.T) { defer mt.Stop() ws := new(restful.WebService) - ws.Filter(FilterFunc(WithServiceName("my-service"))) + ws.Filter(FilterFunc(WithService("my-service"))) ws.Route(ws.GET("/user/{id}").Param(restful.PathParameter("id", "user ID")). To(func(request *restful.Request, response *restful.Response) { _, ok := tracer.SpanFromContext(request.Request.Context()) @@ -157,6 +150,7 @@ func TestTrace200(t *testing.T) { assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("emicklei/go-restful.v3", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal("/user/{id}", span.Tag(ext.HTTPRoute)) } @@ -169,7 +163,7 @@ func TestError(t *testing.T) { ws := new(restful.WebService) ws.Filter(FilterFunc()) - ws.Route(ws.GET("/err").To(func(request *restful.Request, response *restful.Response) { + ws.Route(ws.GET("/err").To(func(_ *restful.Request, response *restful.Response) { response.WriteError(500, wantErr) })) @@ -189,9 +183,10 @@ func TestError(t *testing.T) { span := spans[0] assert.Equal("http.request", span.OperationName()) assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) + assert.Equal(wantErr.Error(), span.Tag(ext.ErrorMsg)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("emicklei/go-restful.v3", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) } func TestPropagation(t *testing.T) { @@ -207,10 +202,10 @@ func TestPropagation(t *testing.T) { ws := new(restful.WebService) ws.Filter(FilterFunc()) - ws.Route(ws.GET("/user/{id}").To(func(request *restful.Request, response *restful.Response) { + ws.Route(ws.GET("/user/{id}").To(func(request *restful.Request, _ *restful.Response) { span, ok := tracer.SpanFromContext(request.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) + assert.Equal(mocktracer.MockSpan(span).ParentID(), mocktracer.MockSpan(pspan).SpanID()) })) container := restful.NewContainer() @@ -223,7 +218,7 @@ func TestAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate float64, opts ...Option) { ws := new(restful.WebService) ws.Filter(FilterFunc(opts...)) - ws.Route(ws.GET("/user/{id}").To(func(request *restful.Request, response *restful.Response) {})) + ws.Route(ws.GET("/user/{id}").To(func(_ *restful.Request, _ *restful.Response) {})) container := restful.NewContainer() container.Add(ws) @@ -243,17 +238,14 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, globalconfig.AnalyticsRate()) + assertRate(t, mt, math.NaN()) }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -275,47 +267,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - ws := new(restful.WebService) - ws.Filter(FilterFunc(opts...)) - ws.Route(ws.GET("/user/{id}").Param(restful.PathParameter("id", "user ID")). - To(func(request *restful.Request, response *restful.Response) { - _, err := response.Write([]byte(request.PathParameter("id"))) - require.NoError(t, err) - })) - container := restful.NewContainer() - container.Add(ws) - - r := httptest.NewRequest("GET", "/user/200", nil) - w := httptest.NewRecorder() - container.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"go-restful"}, - WithDDService: []string{"go-restful"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - namingschematest.NewHTTPServerTest( - genSpans, - "go-restful", - namingschematest.WithServiceNameAssertions(namingschema.SchemaV0, wantServiceNameV0), - )(t) -} diff --git a/contrib/emicklei/go-restful/example_test.go b/contrib/emicklei/go-restful/example_test.go deleted file mode 100644 index 7f85b6b421..0000000000 --- a/contrib/emicklei/go-restful/example_test.go +++ /dev/null @@ -1,54 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package restful_test - -import ( - "io" - "log" - "net/http" - - restfultrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/emicklei/go-restful" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - "github.com/emicklei/go-restful" -) - -// To start tracing requests, add the trace filter to your go-restful router. -func Example() { - // create new go-restful service - ws := new(restful.WebService) - - // create the Datadog filter - filter := restfultrace.FilterFunc( - restfultrace.WithServiceName("my-service"), - ) - - // use it - ws.Filter(filter) - - // set endpoint - ws.Route(ws.GET("/hello").To( - func(request *restful.Request, response *restful.Response) { - io.WriteString(response, "world") - })) - restful.Add(ws) - - // serve request - log.Fatal(http.ListenAndServe(":8080", nil)) -} - -func Example_spanFromContext() { - ws := new(restful.WebService) - ws.Filter(restfultrace.Filter) - - ws.Route(ws.GET("/image/encode").To( - func(request *restful.Request, response *restful.Response) { - // create a child span to track operation timing. - encodeSpan, _ := tracer.StartSpanFromContext(request.Request.Context(), "image.encode") - // encode a image - encodeSpan.Finish() - })) -} diff --git a/contrib/emicklei/go-restful/option.go b/contrib/emicklei/go-restful/option.go deleted file mode 100644 index c904c2e102..0000000000 --- a/contrib/emicklei/go-restful/option.go +++ /dev/null @@ -1,80 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package restful - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" -) - -const defaultServiceName = "go-restful" - -type config struct { - serviceName string - analyticsRate float64 - headerTags *internal.LockMap -} - -func newConfig() *config { - rate := globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_RESTFUL_ANALYTICS_ENABLED", false) { - rate = 1.0 - } - serviceName := namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - return &config{ - serviceName: serviceName, - analyticsRate: rate, - headerTags: globalconfig.HeaderTagMap(), - } -} - -// Option specifies instrumentation configuration options. -type Option func(*config) - -// WithServiceName sets the service name to by used by the filter. -func WithServiceName(name string) Option { - return func(cfg *config) { - cfg.serviceName = name - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(cfg *config) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(cfg *config) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithHeaderTags enables the integration to attach HTTP request headers as span tags. -// Warning: -// Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. -// Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) - return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) - } -} diff --git a/contrib/emicklei/go-restful/restful.go b/contrib/emicklei/go-restful/restful.go deleted file mode 100644 index 164c3fd263..0000000000 --- a/contrib/emicklei/go-restful/restful.go +++ /dev/null @@ -1,70 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package restful provides functions to trace the emicklei/go-restful package (https://github.com/emicklei/go-restful). -// WARNING: The underlying v2 version of emicklei/go-restful has known security vulnerabilities that have been resolved in v3 -// and is no longer under active development. As such consider this package DEPRECATED. -// It is highly recommended that you update to the latest version available at emicklei/go-restful.v3. -package restful - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "github.com/emicklei/go-restful" -) - -const componentName = "emicklei/go-restful" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/emicklei/go-restful") -} - -// FilterFunc returns a restful.FilterFunction which will automatically trace incoming request. -func FilterFunc(configOpts ...Option) restful.FilterFunction { - cfg := newConfig() - for _, opt := range configOpts { - opt(cfg) - } - log.Debug("contrib/emicklei/go-restful: Creating tracing filter: %#v", cfg) - spanOpts := []ddtrace.StartSpanOption{tracer.ServiceName(cfg.serviceName)} - return func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - spanOpts := append(spanOpts, tracer.ResourceName(req.SelectedRoutePath())) - spanOpts = append(spanOpts, tracer.Tag(ext.Component, componentName)) - spanOpts = append(spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - - if !math.IsNaN(cfg.analyticsRate) { - spanOpts = append(spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - spanOpts = append(spanOpts, httptrace.HeaderTagsFromRequest(req.Request, cfg.headerTags)) - span, ctx := httptrace.StartRequestSpan(req.Request, spanOpts...) - defer func() { - httptrace.FinishRequestSpan(span, resp.StatusCode(), tracer.WithError(resp.Error())) - }() - - // pass the span through the request context - req.Request = req.Request.WithContext(ctx) - chain.ProcessFilter(req, resp) - } -} - -// Filter is deprecated. Please use FilterFunc. -func Filter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { - span, ctx := httptrace.StartRequestSpan(req.Request, tracer.ResourceName(req.SelectedRoutePath())) - defer func() { - httptrace.FinishRequestSpan(span, resp.StatusCode(), tracer.WithError(resp.Error())) - }() - - // pass the span through the request context - req.Request = req.Request.WithContext(ctx) - chain.ProcessFilter(req, resp) -} diff --git a/contrib/emicklei/go-restful/restful_test.go b/contrib/emicklei/go-restful/restful_test.go deleted file mode 100644 index 000741a12f..0000000000 --- a/contrib/emicklei/go-restful/restful_test.go +++ /dev/null @@ -1,320 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package restful - -import ( - "errors" - "math" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - - "github.com/emicklei/go-restful" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestWithHeaderTags(t *testing.T) { - setupReq := func(opts ...Option) *http.Request { - ws := new(restful.WebService) - ws.Filter(FilterFunc(opts...)) - ws.Route(ws.GET("/test").To(func(request *restful.Request, response *restful.Response) { - response.Write([]byte("test")) - })) - - container := restful.NewContainer() - container.Add(ws) - - r := httptest.NewRequest("GET", "/test", nil) - r.Header.Set("h!e@a-d.e*r", "val") - r.Header.Add("h!e@a-d.e*r", "val2") - r.Header.Set("2header", "2val") - r.Header.Set("3header", "3val") - w := httptest.NewRecorder() - - container.ServeHTTP(w, r) - return r - } - - t.Run("default-off", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - htArgs := []string{"h!e@a-d.e*r", "2header", "3header"} - setupReq() - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) - assert.NotContains(s.Tags(), tag) - } - }) - - t.Run("integration", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - }) - - t.Run("global", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) - globalconfig.SetHeaderTag("other", tag) - - r := setupReq() - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) - - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) - }) -} - -func TestTrace200(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - ws := new(restful.WebService) - ws.Filter(FilterFunc(WithServiceName("my-service"))) - ws.Route(ws.GET("/user/{id}").Param(restful.PathParameter("id", "user ID")). - To(func(request *restful.Request, response *restful.Response) { - _, ok := tracer.SpanFromContext(request.Request.Context()) - assert.True(ok) - id := request.PathParameter("id") - response.Write([]byte(id)) - })) - - container := restful.NewContainer() - container.Add(ws) - - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - - container.ServeHTTP(w, r) - response := w.Result() - defer response.Body.Close() - assert.Equal(response.StatusCode, 200) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Contains(span.Tag(ext.ResourceName), "/user/{id}") - assert.Equal("my-service", span.Tag(ext.ServiceName)) - assert.Equal("200", span.Tag(ext.HTTPCode)) - assert.Equal("GET", span.Tag(ext.HTTPMethod)) - assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - assert.Equal("emicklei/go-restful", span.Tag(ext.Component)) -} - -func TestError(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - wantErr := errors.New("oh no") - - ws := new(restful.WebService) - ws.Filter(FilterFunc()) - ws.Route(ws.GET("/err").To(func(request *restful.Request, response *restful.Response) { - response.WriteError(500, wantErr) - })) - - container := restful.NewContainer() - container.Add(ws) - - r := httptest.NewRequest("GET", "/err", nil) - w := httptest.NewRecorder() - - container.ServeHTTP(w, r) - response := w.Result() - defer response.Body.Close() - assert.Equal(response.StatusCode, 500) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - assert.Equal("emicklei/go-restful", span.Tag(ext.Component)) -} - -func TestPropagation(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - - pspan := tracer.StartSpan("test") - tracer.Inject(pspan.Context(), tracer.HTTPHeadersCarrier(r.Header)) - - ws := new(restful.WebService) - ws.Filter(FilterFunc()) - ws.Route(ws.GET("/user/{id}").To(func(request *restful.Request, response *restful.Response) { - span, ok := tracer.SpanFromContext(request.Request.Context()) - assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) - })) - - container := restful.NewContainer() - container.Add(ws) - - container.ServeHTTP(w, r) -} - -func TestAnalyticsSettings(t *testing.T) { - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate float64, opts ...Option) { - ws := new(restful.WebService) - ws.Filter(FilterFunc(opts...)) - ws.Route(ws.GET("/user/{id}").To(func(request *restful.Request, response *restful.Response) {})) - - container := restful.NewContainer() - container.Add(ws) - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - container.ServeHTTP(w, r) - - spans := mt.FinishedSpans() - assert.Len(t, spans, 1) - s := spans[0] - if !math.IsNaN(rate) { - assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) - } - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, globalconfig.AnalyticsRate()) - }) - - t.Run("global", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - - t.Run("enabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, 1.0, WithAnalytics(true)) - }) - - t.Run("disabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, math.NaN(), WithAnalytics(false)) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) - }) -} - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - ws := new(restful.WebService) - ws.Filter(FilterFunc(opts...)) - ws.Route(ws.GET("/user/{id}").Param(restful.PathParameter("id", "user ID")). - To(func(request *restful.Request, response *restful.Response) { - _, err := response.Write([]byte(request.PathParameter("id"))) - require.NoError(t, err) - })) - container := restful.NewContainer() - container.Add(ws) - - r := httptest.NewRequest("GET", "/user/200", nil) - w := httptest.NewRecorder() - container.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"go-restful"}, - WithDDService: []string{"go-restful"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - namingschematest.NewHTTPServerTest( - genSpans, - "go-restful", - namingschematest.WithServiceNameAssertions(namingschema.SchemaV0, wantServiceNameV0), - )(t) -} diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/.gitignore b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/.gitignore new file mode 100644 index 0000000000..68295c4a55 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/.gitignore @@ -0,0 +1 @@ +serviceextensions \ No newline at end of file diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/Dockerfile b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/Dockerfile new file mode 100644 index 0000000000..120f13a75a --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/Dockerfile @@ -0,0 +1,48 @@ +# Build stage +FROM golang:1.24-alpine AS builder +ENV CGO_ENABLED=1 + +WORKDIR /app +COPY . . + +RUN apk add --no-cache --update git build-base openssl + +# Generate SSL self-signed localhost certificate +RUN openssl genrsa -out localhost.key 3072 +RUN openssl req -new \ + -key localhost.key \ + -subj "/C=US/ST=New York/O=Datadog/OU=gRPC/CN=localhost" \ + -out request.csr +RUN openssl x509 -req -days 3660 \ + -in request.csr \ + -signkey localhost.key \ + -out localhost.crt + +# Build the serviceextensions binary +RUN go build -tags=appsec -o ./contrib/envoyproxy/go-control-plane/cmd/serviceextensions/serviceextensions ./contrib/envoyproxy/go-control-plane/cmd/serviceextensions + +# Runtime stage +FROM alpine:3.20.3 + +# Set opencontainers labels for Github container registry +LABEL org.opencontainers.image.source=https://github.com/DataDog/dd-trace-go/tree/main/contrib/envoyproxy/go-control-plane/cmd/serviceextensions +LABEL org.opencontainers.image.description="An Envoy External Processor service with Datadog App & API Protection support" +LABEL org.opencontainers.image.licenses=Apache-2.0 + +ARG COMMIT_SHA="" +LABEL org.opencontainers.image.revision=${COMMIT_SHA} + +RUN apk --no-cache add ca-certificates tzdata libc6-compat libgcc libstdc++ +WORKDIR /app + +ARG DD_VERSION="" +ENV DD_VERSION=${DD_VERSION} + +COPY --from=builder /app/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/serviceextensions /app/serviceextensions +COPY --from=builder /app/localhost.crt /app/localhost.crt +COPY --from=builder /app/localhost.key /app/localhost.key + +EXPOSE 80 +EXPOSE 443 + +CMD ["./serviceextensions"] diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/README.md b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/README.md new file mode 100644 index 0000000000..89e87fee82 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/README.md @@ -0,0 +1,47 @@ +# ASM Service Extension + +[GCP Services Extensions](https://cloud.google.com/service-extensions/docs/overview) enable Google Cloud users to provide programmability and extensibility on Cloud Load Balancing data paths and at the edge. + +## Installation + +### From Release + +This package provides a docker image to be used with Google Cloud Service Extensions. +The images are published at each release of the tracer and can be found in [the repo registry](https://github.com/DataDog/dd-trace-go/pkgs/container/dd-trace-go%2Fservice-extensions-callout). + +### Build image + +The docker image can be build locally using docker. Start by cloning the `dd-trace-go` repo, `cd` inside it and run that command: +```sh +docker build --build-arg -f contrib/envoyproxy/go-control-plane/cmd/serviceextensions/Dockerfile -t datadog/dd-trace-go/service-extensions-callout:local . +``` + +## Configuration + +The ASM Service Extension expose some configuration. The configuration can be tweaked if the Service Extension is only used as an External Processor for Envoy that is not operated by GCP. + +>**GCP requires that the default configuration for the Service Extension should not change.** + +| Environment variable | Default value | Description | +|-------------------------------------------|-----------------|---------------------------------------------------------------------------------------------------------------| +| `DD_SERVICE_EXTENSION_HOST` | `0.0.0.0` | Host on where the gRPC and HTTP server should listen to. | +| `DD_SERVICE_EXTENSION_PORT` | `443` | Port used by the gRPC Server.
Envoy Google backend’s is only using secure connection to Service Extension. | +| `DD_SERVICE_EXTENSION_HEALTHCHECK_PORT` | `80` | Port used for the HTTP server for the health check. | +| `DD_SERVICE_EXTENSION_OBSERVABILITY_MODE` | `false` | Enable observability mode. This will process a request asynchronously (blocking would be disabled). | +| `DD_APPSEC_BODY_PARSING_SIZE_LIMIT` | `10485760` | Maximum size of the bodies to be processed in bytes. If set to 0, the bodies are not processed. | +| `DD_SERVICE_EXTENSION_TLS` | `true` | Enable the gRPC TLS layer. Do not modify if you are using GCP. | +| `DD_SERVICE_EXTENSION_TLS_KEY_FILE` | `localhost.key` | Change the default gRPC TLS layer key. Do not modify if you are using GCP. | +| `DD_SERVICE_EXTENSION_TLS_CERT_FILE` | `localhost.crt` | Change the default gRPC TLS layer cert. Do not modify if you are using GCP. | + +> The Service Extension need to be connected to a deployed [Datadog agent](https://docs.datadoghq.com/agent). + +| Environment variable | Default value | Description | +|-----------------------|---------------|----------------------------------| +| `DD_AGENT_HOST` | `N/A` | Host of a running Datadog Agent. | +| `DD_TRACE_AGENT_PORT` | `8126` | Port of a running Datadog Agent. | + +### SSL Configuration + +The Envoy of GCP is configured to communicate to the Service Extension with TLS. + +`localhost` self signed certificates are generated and bundled into the App & API Protection Service Extension docker image and loaded at the start of the gRPC server. diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/env.go b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/env.go new file mode 100644 index 0000000000..5fb1140863 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/env.go @@ -0,0 +1,97 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "net" + "strconv" + + gocontrolplane "github.com/DataDog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" +) + +// IntEnv returns the parsed int value of an environment variable, or +// def otherwise. +func intEnv(key string, def int) int { + vv, ok := env.Lookup(key) + if !ok { + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginDefault) + return def + } + v, err := strconv.Atoi(vv) + if err != nil { + log.Warn("Non-integer value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err) + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginDefault) + return def + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginEnvVar) + return v +} + +// intEnvNil returns the parsed int value of an environment variable if it exists, or +// return nil if unset or failed to parse. +func intEnvNil(key string) *int { + vv, ok := env.Lookup(key) + if !ok { + return nil + } + v, err := strconv.Atoi(vv) + if err != nil { + log.Warn("Non-integer value for env var %s. Parse failed with error: %v", key, err) + return nil + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, &v, instrumentation.TelemetryOriginEnvVar) + return &v +} + +// IpEnv returns the valid IP value of an environment variable, or def otherwise. +func ipEnv(key string, def net.IP) net.IP { + vv, ok := env.Lookup(key) + if !ok { + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def.String(), instrumentation.TelemetryOriginDefault) + return def + } + + ip := net.ParseIP(vv) + if ip == nil { + log.Warn("Non-IP value for env var %s, defaulting to %s", key, def.String()) + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def.String(), instrumentation.TelemetryOriginDefault) + return def + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, vv, instrumentation.TelemetryOriginEnvVar) + return ip +} + +// BoolEnv returns the parsed boolean value of an environment variable, or +// def otherwise. +func boolEnv(key string, def bool) bool { + vv, ok := env.Lookup(key) + if !ok { + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginDefault) + return def + } + v, err := strconv.ParseBool(vv) + if err != nil { + log.Warn("Non-boolean value for env var %s, defaulting to %t. Parse failed with error: %v", key, def, err) + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginDefault) + return def + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, v, instrumentation.TelemetryOriginEnvVar) + return v +} + +// stringEnv returns the string value of an environment variable, or +// def otherwise. +func stringEnv(key, def string) string { + v, ok := env.Lookup(key) + if !ok { + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, v, instrumentation.TelemetryOriginDefault) + return def + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(key, v, instrumentation.TelemetryOriginEnvVar) + return v +} diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/log.go b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/log.go new file mode 100644 index 0000000000..acf5ada9f7 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/log.go @@ -0,0 +1,47 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package main + +import ( + ll "log" + "os" +) + +// Logger wraps the standard library log.Logger +type Logger struct { + *ll.Logger +} + +// NewLogger creates a new Logger instance +func NewLogger() *Logger { + return &Logger{ + Logger: ll.New(os.Stdout, "", ll.LstdFlags), + } +} + +// Info logs an informational message +func (l *Logger) Info(format string, v ...interface{}) { + l.SetPrefix("INFO: ") + l.Printf(format, v...) +} + +// Warn logs a warning message +func (l *Logger) Warn(format string, v ...interface{}) { + l.SetPrefix("WARN: ") + l.Printf(format, v...) +} + +// Error logs an error message +func (l *Logger) Error(format string, v ...interface{}) { + l.SetPrefix("ERROR: ") + l.Printf(format, v...) +} + +// Debug logs a debug message +func (l *Logger) Debug(format string, v ...interface{}) { + l.SetPrefix("DEBUG: ") + l.Printf(format, v...) +} diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/main.go b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/main.go new file mode 100644 index 0000000000..dd6da54696 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/main.go @@ -0,0 +1,234 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package main + +import ( + "context" + "crypto/tls" + "errors" + "fmt" + "net" + "net/http" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + "golang.org/x/sync/errgroup" + "google.golang.org/grpc/credentials" + + gocontrolplane "github.com/DataDog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + + extproc "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" + "google.golang.org/grpc" +) + +// AppsecCalloutExtensionService defines the struct that follows the ExternalProcessorServer interface. +type AppsecCalloutExtensionService struct { + extproc.ExternalProcessorServer +} + +type tlsConfig struct { + certFile string + keyFile string +} + +type serviceExtensionConfig struct { + extensionPort string + extensionHost string + healthcheckPort string + observabilityMode bool + bodyParsingSizeLimit *int + tls *tlsConfig +} + +var log = NewLogger() + +func getDefaultEnvVars() map[string]string { + return map[string]string{ + "DD_VERSION": instrumentation.Version(), // Version of the tracer + "DD_APM_TRACING_ENABLED": "false", // Appsec Standalone + "DD_APPSEC_WAF_TIMEOUT": "10ms", // Proxy specific WAF timeout + "_DD_APPSEC_PROXY_ENVIRONMENT": "true", // Internal config: Enable API Security proxy sampler + } +} + +// initializeEnvironment sets up required environment variables with their defaults +func initializeEnvironment() { + for k, v := range getDefaultEnvVars() { + setValue := env.Get(k) + if setValue == "" { + if err := os.Setenv(k, v); err != nil { + log.Error("service_extension: failed to set %s environment variable: %s\n", k, err.Error()) + continue + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(k, v, instrumentation.TelemetryOriginDefault) + continue + } + gocontrolplane.Instrumentation().TelemetryRegisterAppConfig(k, setValue, instrumentation.TelemetryOriginEnvVar) + } +} + +// configureObservabilityMode disables blocking when observability mode is enabled. +// Note: This requires the Envoy configuration option "observability_mode: true" to be set. +// This option is only supported when configuring Envoy directly, and is not available when using GCP Service Extension. +func configureObservabilityMode(mode bool) error { + if !mode { + return nil + } + const internalBlockingUnavailableKey = "_DD_APPSEC_BLOCKING_UNAVAILABLE" + if err := os.Setenv(internalBlockingUnavailableKey, "true"); err != nil { + return fmt.Errorf("failed to set %s environment variable: %s", internalBlockingUnavailableKey, err) + } + log.Debug("service_extension: observability mode enabled, disabling blocking\n") + return nil +} + +// loadConfig loads the configuration from the environment variables +func loadConfig() serviceExtensionConfig { + extensionPortInt := intEnv("DD_SERVICE_EXTENSION_PORT", 443) + healthcheckPortInt := intEnv("DD_SERVICE_EXTENSION_HEALTHCHECK_PORT", 80) + extensionHostStr := ipEnv("DD_SERVICE_EXTENSION_HOST", net.IP{0, 0, 0, 0}).String() + observabilityMode := boolEnv("DD_SERVICE_EXTENSION_OBSERVABILITY_MODE", false) + bodyParsingSizeLimit := intEnvNil("DD_APPSEC_BODY_PARSING_SIZE_LIMIT") + enableTLS := boolEnv("DD_SERVICE_EXTENSION_TLS", true) + keyFile := stringEnv("DD_SERVICE_EXTENSION_TLS_KEY_FILE", "localhost.key") + certFile := stringEnv("DD_SERVICE_EXTENSION_TLS_CERT_FILE", "localhost.crt") + + extensionPortStr := strconv.FormatInt(int64(extensionPortInt), 10) + healthcheckPortStr := strconv.FormatInt(int64(healthcheckPortInt), 10) + + var tlsConf *tlsConfig + if enableTLS { + tlsConf = &tlsConfig{ + certFile: certFile, + keyFile: keyFile, + } + } + + return serviceExtensionConfig{ + extensionPort: extensionPortStr, + extensionHost: extensionHostStr, + healthcheckPort: healthcheckPortStr, + observabilityMode: observabilityMode, + bodyParsingSizeLimit: bodyParsingSizeLimit, + tls: tlsConf, + } +} + +func main() { + initializeEnvironment() + + config := loadConfig() + + if err := configureObservabilityMode(config.observabilityMode); err != nil { + log.Error("service_extension: %s\n", err.Error()) + } + + if err := startService(config); err != nil { + log.Error("service_extension: %s\n", err.Error()) + } + + log.Info("service_extension: shutting down\n") +} + +func startService(config serviceExtensionConfig) error { + var extensionService AppsecCalloutExtensionService + + tracer.Start(tracer.WithAppSecEnabled(true)) + defer tracer.Stop() + + ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer cancel() + g, ctx := errgroup.WithContext(ctx) + + g.Go(func() error { + return startGPRCSsl(ctx, &extensionService, config) + }) + + g.Go(func() error { + return startHealthCheck(ctx, config) + }) + + return g.Wait() +} + +func startHealthCheck(ctx context.Context, config serviceExtensionConfig) error { + muxServer := http.NewServeMux() + muxServer.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"status": "ok", "library": {"language": "golang", "version": "` + instrumentation.Version() + `"}}`)) + }) + + server := &http.Server{ + Addr: config.extensionHost + ":" + config.healthcheckPort, + Handler: muxServer, + } + + go func() { + <-ctx.Done() + shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := server.Shutdown(shutdownCtx); err != nil { + log.Error("service_extension: health check server shutdown: %s\n", err.Error()) + } + }() + + log.Info("service_extension: health check server started on %s:%s\n", config.extensionHost, config.healthcheckPort) + if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + return fmt.Errorf("health check http server: %s", err) + } + + return nil +} + +func startGPRCSsl(ctx context.Context, service extproc.ExternalProcessorServer, config serviceExtensionConfig) error { + lis, err := net.Listen("tcp", config.extensionHost+":"+config.extensionPort) + if err != nil { + return fmt.Errorf("gRPC server: %s", err) + } + + var serverOptions []grpc.ServerOption + + if config.tls != nil { + cert, err := tls.LoadX509KeyPair(config.tls.certFile, config.tls.keyFile) + if err != nil { + return fmt.Errorf("failed to load key pair: %s", err) + } + serverOptions = append(serverOptions, grpc.Creds(credentials.NewServerTLSFromCert(&cert))) + log.Info("service_extension: TLS enabled for gRPC server") + log.Info("service_extension: TLS key file path: %s\n", config.tls.keyFile) + log.Info("service_extension: TLS cert file path: %s\n", config.tls.certFile) + } + + grpcServer := grpc.NewServer(serverOptions...) + appsecEnvoyExternalProcessorServer := gocontrolplane.AppsecEnvoyExternalProcessorServer( + service, + gocontrolplane.AppsecEnvoyConfig{ + Integration: gocontrolplane.GCPServiceExtensionIntegration, + BlockingUnavailable: config.observabilityMode, + Context: ctx, + BodyParsingSizeLimit: config.bodyParsingSizeLimit, + }) + + go func() { + <-ctx.Done() + grpcServer.GracefulStop() + }() + + extproc.RegisterExternalProcessorServer(grpcServer, appsecEnvoyExternalProcessorServer) + log.Info("service_extension: callout gRPC server started on %s:%s\n", config.extensionHost, config.extensionPort) + if err := grpcServer.Serve(lis); err != nil { + return fmt.Errorf("error starting gRPC server: %s", err) + } + + return nil +} diff --git a/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/main_test.go b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/main_test.go new file mode 100644 index 0000000000..aea5390f74 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/cmd/serviceextensions/main_test.go @@ -0,0 +1,189 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestInitializeEnvironment_All(t *testing.T) { + type envCase struct { + name string + preEnv map[string]string + wantEnvVal map[string]string + } + + cases := []envCase{ + { + name: "defaults", + preEnv: nil, + wantEnvVal: nil, // will use the default values + }, + { + name: "existing preserved", + preEnv: map[string]string{ + "DD_APM_TRACING_ENABLED": "true", + "DD_APPSEC_WAF_TIMEOUT": "5ms", + }, + wantEnvVal: map[string]string{ + "DD_APM_TRACING_ENABLED": "true", + "DD_APPSEC_WAF_TIMEOUT": "5ms", + }, + }, + } + + var allKeys []string + for k := range getDefaultEnvVars() { + allKeys = append(allKeys, k) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unsetEnv(allKeys...) + setEnv(tc.preEnv) + + initializeEnvironment() + + expected := tc.wantEnvVal + if expected == nil { + expected = getDefaultEnvVars() + } + + for k, want := range expected { + assert.Equal(t, want, os.Getenv(k), "%s should match", k) + } + }) + } +} + +func TestConfigureObservabilityMode_All(t *testing.T) { + unsetEnv("_DD_APPSEC_BLOCKING_UNAVAILABLE") + assert.NoError(t, configureObservabilityMode(false)) + assert.Equal(t, "", os.Getenv("_DD_APPSEC_BLOCKING_UNAVAILABLE")) + + unsetEnv("_DD_APPSEC_BLOCKING_UNAVAILABLE") + assert.NoError(t, configureObservabilityMode(true)) + assert.Equal(t, "true", os.Getenv("_DD_APPSEC_BLOCKING_UNAVAILABLE")) +} + +func TestLoadConfig_VariousCases(t *testing.T) { + type want struct { + extensionPort string + healthcheckPort string + extensionHost string + observabilityMode bool + bodyParsingSizeLimit *int + tlsEnabled bool + tlsCertFile string + tlsKeyFile string + } + + cases := []struct { + name string + env map[string]string + want want + }{ + { + name: "defaults", + env: nil, + want: want{"443", "80", "0.0.0.0", false, nil, true, "localhost.crt", "localhost.key"}, + }, + { + name: "valid overrides", + env: map[string]string{ + "DD_SERVICE_EXTENSION_PORT": "1234", + "DD_SERVICE_EXTENSION_HEALTHCHECK_PORT": "4321", + "DD_SERVICE_EXTENSION_HOST": "127.0.0.1", + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE": "true", + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT": "100000000", + }, + want: want{"1234", "4321", "127.0.0.1", true, intPtr(100000000), true, "localhost.crt", "localhost.key"}, + }, + { + name: "bad values fall back", + env: map[string]string{ + "DD_SERVICE_EXTENSION_PORT": "badport", + "DD_SERVICE_EXTENSION_HEALTHCHECK_PORT": "gopher", + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE": "notabool", + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT": "notanint", + "DD_SERVICE_EXTENSION_HOST": "notanip", + }, + want: want{"443", "80", "0.0.0.0", false, nil, true, "localhost.crt", "localhost.key"}, + }, + { + name: "no-tls", + env: map[string]string{ + "DD_SERVICE_EXTENSION_TLS": "false", + }, + want: want{"443", "80", "0.0.0.0", false, nil, false, "localhost.key", "localhost.crt"}, + }, + { + name: "custom-tls", + env: map[string]string{ + "DD_SERVICE_EXTENSION_TLS_KEY_FILE": "/tls/tls.key", + "DD_SERVICE_EXTENSION_TLS_CERT_FILE": "/tls/tls.crt", + }, + want: want{"443", "80", "0.0.0.0", false, nil, true, "/tls/tls.crt", "/tls/tls.key"}, + }, + } + + allKeys := []string{ + "DD_SERVICE_EXTENSION_PORT", + "DD_SERVICE_EXTENSION_HEALTHCHECK_PORT", + "DD_SERVICE_EXTENSION_HOST", + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE", + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT", + "DD_SERVICE_EXTENSION_TLS_CERT", + "DD_SERVICE_EXTENSION_TLS_KEY", + "DD_SERVICE_EXTENSION_TLS", + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unsetEnv(allKeys...) + setEnv(tc.env) + + cfg := loadConfig() + assert.Equal(t, tc.want.extensionPort, cfg.extensionPort, "extensionPort") + assert.Equal(t, tc.want.healthcheckPort, cfg.healthcheckPort, "healthcheckPort") + assert.Equal(t, tc.want.extensionHost, cfg.extensionHost, "extensionHost") + assert.Equal(t, tc.want.observabilityMode, cfg.observabilityMode, "observabilityMode") + assert.Equal(t, tc.want.bodyParsingSizeLimit, cfg.bodyParsingSizeLimit, "bodyParsingSizeLimit") + + assert.Equal(t, tc.want.tlsEnabled, cfg.tls != nil, "tlsEnabled") + if cfg.tls != nil { + assert.Equal(t, tc.want.tlsCertFile, cfg.tls.certFile, "tlsCertFile") + assert.Equal(t, tc.want.tlsKeyFile, cfg.tls.keyFile, "tlsKeyFile") + } + }) + } +} + +func intPtr(v int) *int { + return &v +} + +// Helpers +func unsetEnv(keys ...string) { + for _, k := range keys { + err := os.Unsetenv(k) + if err != nil { + panic(err) + } + } +} + +func setEnv(env map[string]string) { + for k, v := range env { + err := os.Setenv(k, v) + if err != nil { + panic(err) + } + } +} diff --git a/contrib/envoyproxy/go-control-plane/envoy.go b/contrib/envoyproxy/go-control-plane/envoy.go new file mode 100644 index 0000000000..c7a2a37aa6 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/envoy.go @@ -0,0 +1,177 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package gocontrolplane + +import ( + "context" + "errors" + "io" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + + envoyextproc "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageEnvoyProxyGoControlPlane) +} + +// Instrumentation returns the instrumentation.Instrumentation package instrumentation +func Instrumentation() *instrumentation.Instrumentation { + return instr +} + +// Integration represents the proxy integration type that is used for the External Processing. +type Integration int + +const ( + _ Integration = iota + GCPServiceExtensionIntegration + EnvoyIntegration + EnvoyGatewayIntegration + IstioIntegration +) + +// AppsecEnvoyConfig contains configuration for the AppSec Envoy processor +type AppsecEnvoyConfig struct { + Integration Integration + BlockingUnavailable bool + Context context.Context + BodyParsingSizeLimit *int +} + +// appsecEnvoyExternalProcessorServer is a server that implements the Envoy ExternalProcessorServer interface. +type appsecEnvoyExternalProcessorServer struct { + envoyextproc.ExternalProcessorServer + config AppsecEnvoyConfig + messageProcessor proxy.Processor +} + +// AppsecEnvoyExternalProcessorServer creates a new external processor server with AAP enabled +func AppsecEnvoyExternalProcessorServer(userImplementation envoyextproc.ExternalProcessorServer, config AppsecEnvoyConfig) envoyextproc.ExternalProcessorServer { + switch config.Integration { + case GCPServiceExtensionIntegration, EnvoyIntegration, IstioIntegration, EnvoyGatewayIntegration: + default: + instr.Logger().Error("external_processing: invalid proxy integration type %d. Defaulting to GCPServiceExtensionIntegration", config.Integration) + config.Integration = GCPServiceExtensionIntegration + } + + return &appsecEnvoyExternalProcessorServer{ + ExternalProcessorServer: userImplementation, + config: config, + messageProcessor: proxy.NewProcessor(proxy.ProcessorConfig{ + BlockingUnavailable: config.BlockingUnavailable, + BodyParsingSizeLimit: config.BodyParsingSizeLimit, + Framework: "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3", + Context: config.Context, + ContinueMessageFunc: continueActionFunc, + BlockMessageFunc: blockActionFunc, + }, instr), + } +} + +type processServerKeyType struct{} + +var processServerKey processServerKeyType + +// Process handles the bidirectional stream that Envoy uses to control the filter +func (s *appsecEnvoyExternalProcessorServer) Process(processServer envoyextproc.ExternalProcessor_ProcessServer) error { + var ( + ctx = context.WithValue(processServer.Context(), processServerKey, processServer) + currentRequest proxy.RequestState + ) + + // Ensure cleanup on exit + defer func() { + if currentRequest.State.Ongoing() { + instr.Logger().Warn("external_processing: stream stopped during a request, making sure the current span is closed\n") + currentRequest.Close() + } + }() + + for { + if err := s.checkContext(processServer.Context()); err != nil { + return err + } + + var processingRequest envoyextproc.ProcessingRequest + if err := processServer.RecvMsg(&processingRequest); err != nil { + return s.handleReceiveError(err) + } + + // Process the message + err := s.processMessage(ctx, &processingRequest, ¤tRequest) + if err != nil && err != io.EOF { + instr.Logger().Error("external_processing: error processing request: %s\n", err.Error()) + return err + } + + if err == io.EOF { + return nil + } + } +} + +// checkContext checks if the context has been cancelled or other if there's an unexpected error +func (s *appsecEnvoyExternalProcessorServer) checkContext(ctx context.Context) error { + select { + case <-ctx.Done(): + if errors.Is(ctx.Err(), context.Canceled) { + return nil + } + return ctx.Err() + default: + return nil + } +} + +// handleReceiveError handles errors when receiving messages +func (s *appsecEnvoyExternalProcessorServer) handleReceiveError(err error) error { + if st, ok := status.FromError(err); (ok && st.Code() == codes.Canceled) || err == io.EOF { + return nil + } + + instr.Logger().Error("external_processing: error receiving request/response: %s\n", err.Error()) + return status.Errorf(codes.Unknown, "Error receiving request/response: %s", err.Error()) +} + +// processMessage processes a single message based on its type +func (s *appsecEnvoyExternalProcessorServer) processMessage(ctx context.Context, req *envoyextproc.ProcessingRequest, currentRequest *proxy.RequestState) (err error) { + switch v := req.Request.(type) { + case *envoyextproc.ProcessingRequest_RequestHeaders: + *currentRequest, err = s.messageProcessor.OnRequestHeaders(ctx, &messageRequestHeaders{ProcessingRequest: req, HttpHeaders: req.GetRequestHeaders(), integration: s.config.Integration}) + return err + + case *envoyextproc.ProcessingRequest_RequestBody: + return s.messageProcessor.OnRequestBody(&messageBody{ProcessingRequest: req, HttpBody: req.GetRequestBody()}, currentRequest) + + case *envoyextproc.ProcessingRequest_ResponseHeaders: + if !currentRequest.State.Ongoing() { + // Handle case where request headers were never sent + instr.Logger().Warn("external_processing: can't process the response: envoy never sent the beginning of the request, this is a known issue" + + " and can happen when a malformed request is sent to Envoy where the header Host is missing. See link to issue https://github.com/envoyproxy/envoy/issues/38022") + return status.Errorf(codes.InvalidArgument, "Error processing response headers from ext_proc: can't process the response") + } + return s.messageProcessor.OnResponseHeaders(&responseHeadersEnvoy{ProcessingRequest: req, HttpHeaders: req.GetResponseHeaders()}, currentRequest) + + case *envoyextproc.ProcessingRequest_ResponseBody: + return s.messageProcessor.OnResponseBody(&messageBody{ProcessingRequest: req, HttpBody: req.GetResponseBody()}, currentRequest) + + case *envoyextproc.ProcessingRequest_RequestTrailers: + return s.messageProcessor.OnRequestTrailers(currentRequest) + + case *envoyextproc.ProcessingRequest_ResponseTrailers: + return s.messageProcessor.OnResponseTrailers(currentRequest) + + default: + return status.Errorf(codes.Unknown, "Unknown request type: %T", v) + } +} diff --git a/contrib/envoyproxy/go-control-plane/envoy_http.go b/contrib/envoyproxy/go-control-plane/envoy_http.go new file mode 100644 index 0000000000..1349fa6a61 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/envoy_http.go @@ -0,0 +1,237 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package gocontrolplane + +import ( + "context" + "fmt" + "math" + "net/http" + "strings" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + corev3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" + envoycore "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" + envoyextprocfilter "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/ext_proc/v3" + envoyextproc "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" + envoytypes "github.com/envoyproxy/go-control-plane/envoy/type/v3" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +func continueActionFunc(ctx context.Context, options proxy.ContinueActionOptions) error { + if len(options.HeaderMutations) > 0 || options.Body { + return buildHeadersResponse(ctx, options) + } + + emptyResp, err := buildEmptyContinueResponse(options) + if err != nil { + return err + } + + return sendResponse(ctx, &emptyResp) +} + +func buildEmptyContinueResponse(options proxy.ContinueActionOptions) (envoyextproc.ProcessingResponse, error) { + common := &envoyextproc.CommonResponse{ + Status: envoyextproc.CommonResponse_CONTINUE, + } + + switch options.MessageType { + case proxy.MessageTypeRequestHeaders: + return envoyextproc.ProcessingResponse{Response: &envoyextproc.ProcessingResponse_RequestHeaders{RequestHeaders: &envoyextproc.HeadersResponse{Response: common}}}, nil + case proxy.MessageTypeRequestBody: + return envoyextproc.ProcessingResponse{Response: &envoyextproc.ProcessingResponse_RequestBody{RequestBody: &envoyextproc.BodyResponse{Response: common}}}, nil + case proxy.MessageTypeResponseHeaders: + return envoyextproc.ProcessingResponse{Response: &envoyextproc.ProcessingResponse_ResponseHeaders{ResponseHeaders: &envoyextproc.HeadersResponse{Response: common}}}, nil + case proxy.MessageTypeResponseBody: + return envoyextproc.ProcessingResponse{Response: &envoyextproc.ProcessingResponse_ResponseBody{ResponseBody: &envoyextproc.BodyResponse{Response: common}}}, nil + case proxy.MessageTypeRequestTrailers: + return envoyextproc.ProcessingResponse{Response: &envoyextproc.ProcessingResponse_RequestTrailers{RequestTrailers: &envoyextproc.TrailersResponse{}}}, nil + case proxy.MessageTypeResponseTrailers: + return envoyextproc.ProcessingResponse{Response: &envoyextproc.ProcessingResponse_ResponseTrailers{ResponseTrailers: &envoyextproc.TrailersResponse{}}}, nil + default: + return envoyextproc.ProcessingResponse{}, status.Errorf(codes.Unknown, "Unknown request type: %v", options.MessageType) + } +} + +func blockActionFunc(ctx context.Context, data proxy.BlockActionOptions) error { + blockedHeaders := convertHeadersToEnvoy(data.Headers) + + var statusCode int32 + if data.StatusCode > 0 && data.StatusCode <= math.MaxInt32 { + statusCode = int32(data.StatusCode) + } + + resp := envoyextproc.ProcessingResponse{ + Response: &envoyextproc.ProcessingResponse_ImmediateResponse{ + ImmediateResponse: &envoyextproc.ImmediateResponse{ + Status: &envoytypes.HttpStatus{ + Code: envoytypes.StatusCode(statusCode), + }, + Headers: &envoyextproc.HeaderMutation{ + SetHeaders: blockedHeaders, + }, + Body: data.Body, + GrpcStatus: &envoyextproc.GrpcStatus{ + Status: 0, + }, + }, + }, + } + + return sendResponse(ctx, &resp) +} + +// buildHeadersResponse creates an Envoy HeadersResponse from provided data answering a RequestHeaders or ResponseHeaders message +func buildHeadersResponse(ctx context.Context, data proxy.ContinueActionOptions) error { + var modeOverride *envoyextprocfilter.ProcessingMode + if data.Body { + if data.MessageType == proxy.MessageTypeRequestHeaders { + modeOverride = &envoyextprocfilter.ProcessingMode{RequestBodyMode: envoyextprocfilter.ProcessingMode_STREAMED} + } else { + modeOverride = &envoyextprocfilter.ProcessingMode{ResponseBodyMode: envoyextprocfilter.ProcessingMode_STREAMED} + } + } + + processingResponse := envoyextproc.ProcessingResponse{ModeOverride: modeOverride} + headersResponse := &envoyextproc.HeadersResponse{ + Response: &envoyextproc.CommonResponse{ + Status: envoyextproc.CommonResponse_CONTINUE, + HeaderMutation: &envoyextproc.HeaderMutation{ + SetHeaders: convertHeadersToEnvoy(data.HeaderMutations), + }, + }, + } + + if data.MessageType == proxy.MessageTypeRequestHeaders { + processingResponse.Response = &envoyextproc.ProcessingResponse_RequestHeaders{ + RequestHeaders: headersResponse, + } + } else { + processingResponse.Response = &envoyextproc.ProcessingResponse_ResponseHeaders{ + ResponseHeaders: headersResponse, + } + } + + return sendResponse(ctx, &processingResponse) +} + +// sendResponse sends a processing response back to Envoy +func sendResponse(ctx context.Context, response *envoyextproc.ProcessingResponse) error { + instr.Logger().Debug("external_processing: sending response: %v\n", response) + + processServer, _ := ctx.Value(processServerKey).(envoyextproc.ExternalProcessor_ProcessServer) + if processServer == nil { + return status.Errorf(codes.Unknown, "No gRPC stream available to send the response") + } + + if err := processServer.SendMsg(response); err != nil { + instr.Logger().Error("external_processing: error sending response (probably because of an Envoy timeout): %s", err.Error()) + return status.Errorf(codes.Unknown, "Error sending response (probably because of an Envoy timeout): %s", err.Error()) + } + + return nil +} + +// convertHeadersToEnvoy converts standard HTTP headers to Envoy HeaderValueOption format +func convertHeadersToEnvoy(headers http.Header) []*envoycore.HeaderValueOption { + headerValueOptions := make([]*envoycore.HeaderValueOption, 0, len(headers)) + for k, v := range headers { + headerValueOptions = append(headerValueOptions, &envoycore.HeaderValueOption{ + Header: &envoycore.HeaderValue{ + Key: k, + RawValue: []byte(strings.Join(v, ",")), + }, + }) + } + return headerValueOptions +} + +// mergeMetadataHeaders merges the metadata headers of the grpc connection into the http headers of the request +// - Skip pseudo headers and headers that are already set +// - Set headers keys to be canonical +func mergeMetadataHeaders(md metadata.MD, headers http.Header) { + for k, v := range md { + if strings.HasPrefix(k, ":") { + continue + } + + // Skip the content-type header of the grpc request + // Note: all envoy set headers are lower-case + if k == "content-type" { + continue + } + + k = http.CanonicalHeaderKey(k) + if _, ok := headers[k]; !ok { + headers[k] = v + } + } +} + +// splitPseudoHeaders splits normal headers of the initial request made by the client and the pseudo headers of HTTP/2 +// - Format the headers to be used by the tracer as http.Header +// - Set headers keys to be canonical +func splitPseudoHeaders(receivedHeaders []*corev3.HeaderValue) (headers map[string][]string, pseudoHeaders map[string]string) { + headers = make(map[string][]string, len(receivedHeaders)-4) + pseudoHeaders = make(map[string]string, 4) + for _, v := range receivedHeaders { + key := v.GetKey() + if key == "" { + continue + } + if key[0] == ':' { + pseudoHeaders[key] = string(v.GetRawValue()) + continue + } + + canonKey := http.CanonicalHeaderKey(key) + if headers[canonKey] == nil { + headers[canonKey] = make([]string, 0, 1) + } + + headers[canonKey] = append(headers[canonKey], string(v.GetRawValue())) + } + return headers, pseudoHeaders +} + +// checkPseudoRequestHeaders Verify the required HTTP2 headers are present +// Some mandatory headers need to be set. It can happen when it wasn't a real HTTP2 request sent by Envoy, +func checkPseudoRequestHeaders(headers map[string]string) error { + for _, header := range []string{":authority", ":scheme", ":path", ":method"} { + if _, ok := headers[header]; !ok { + return fmt.Errorf("missing required headers: %q", header) + } + } + + return nil +} + +// checkPseudoResponseHeaders verifies the required HTTP2 headers are present +// Some mandatory headers need to be set. It can happen when it wasn't a real HTTP2 request sent by Envoy, +func checkPseudoResponseHeaders(headers map[string]string) error { + if _, ok := headers[":status"]; !ok { + return fmt.Errorf("missing required ':status' headers") + } + + return nil +} + +// getRemoteAddr extracts the remote address from the metadata headers of the gRPC stream +func getRemoteAddr(md metadata.MD) string { + xfwd := md.Get("x-forwarded-for") + length := len(xfwd) + if length == 0 { + return "" + } + + // Get the first right value of x-forwarded-for headers + // The rightmost IP address is the one that will be used as the remote client IP + // https://datadoghq.atlassian.net/wiki/spaces/TS/pages/2766733526/Sensitive+IP+information#Where-does-the-value-of-the-http.client_ip-tag-come-from%3F + return xfwd[length-1] +} diff --git a/contrib/envoyproxy/go-control-plane/envoy_messages.go b/contrib/envoyproxy/go-control-plane/envoy_messages.go new file mode 100644 index 0000000000..4151af2e66 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/envoy_messages.go @@ -0,0 +1,169 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package gocontrolplane + +import ( + "context" + "fmt" + "os" + "strconv" + "sync" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + extproc "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" + "google.golang.org/grpc/metadata" +) + +var _ proxy.RequestHeaders = (*messageRequestHeaders)(nil) +var _ proxy.ResponseHeaders = (*responseHeadersEnvoy)(nil) +var _ proxy.HTTPBody = (*messageBody)(nil) +var _ proxy.HTTPBody = (*messageBody)(nil) + +type messageRequestHeaders struct { + *extproc.ProcessingRequest + *extproc.HttpHeaders + integration Integration +} + +func (m messageRequestHeaders) ExtractRequest(ctx context.Context) (proxy.PseudoRequest, error) { + headers, pseudoHeaders := splitPseudoHeaders(m.GetHeaders().GetHeaders()) + if err := checkPseudoRequestHeaders(pseudoHeaders); err != nil { + return proxy.PseudoRequest{}, err + } + + var remoteAddr string + md, ok := metadata.FromIncomingContext(ctx) + if ok { + mergeMetadataHeaders(md, headers) + remoteAddr = getRemoteAddr(md) + } + + headers["Host"] = append(headers["Host"], pseudoHeaders[":authority"]) + return proxy.PseudoRequest{ + Method: pseudoHeaders[":method"], + Authority: pseudoHeaders[":authority"], + Path: pseudoHeaders[":path"], + Scheme: pseudoHeaders[":scheme"], + Headers: headers, + RemoteAddr: remoteAddr, + }, nil +} + +func (m messageRequestHeaders) MessageType() proxy.MessageType { + return proxy.MessageTypeRequestHeaders +} + +const ( + componentNameGCPServiceExtension = "gcp-service-extension" + componentNameEnvoy = "envoy" + componentNameEnvoyGateway = "envoy-gateway" + componentNameIstio = "istio" + + datadogEnvoyIntegrationHeader = "x-datadog-envoy-integration" + datadogIntegrationHeader = "x-datadog-istio-integration" +) + +var isK8s = sync.OnceValue(func() bool { + return os.Getenv("KUBERNETES") != "" +}) + +func (i Integration) String() string { + switch i { + case GCPServiceExtensionIntegration: + return componentNameGCPServiceExtension + case EnvoyIntegration: + return componentNameEnvoy + case EnvoyGatewayIntegration: + return componentNameEnvoyGateway + case IstioIntegration: + return componentNameIstio + default: + return componentNameGCPServiceExtension + } +} + +func (m messageRequestHeaders) BodyParsingSizeLimit(ctx context.Context) int { + switch m.component(ctx) { + case componentNameGCPServiceExtension: + return 0 + default: + return proxy.DefaultBodyParsingSizeLimit + } +} + +func (m messageRequestHeaders) SpanOptions(ctx context.Context) []tracer.StartSpanOption { + return []tracer.StartSpanOption{tracer.Tag(ext.Component, m.component(ctx))} +} + +func (m messageRequestHeaders) component(ctx context.Context) string { + // As the integration (callout container) is run by default with the GCP Service Extension value, + // we can consider that if this flag is false, it means that it is running in a custom integration. + if m.integration != GCPServiceExtensionIntegration { + return m.integration.String() + } + + // In newer version of the documentation, customers are instructed to inject the + // Datadog integration header in their Envoy configuration to identify the integration. + if md, ok := metadata.FromIncomingContext(ctx); ok { + valuesEnvoy := md.Get(datadogEnvoyIntegrationHeader) + if len(valuesEnvoy) > 0 && valuesEnvoy[0] == "1" { + return componentNameEnvoy + } + + valuesIstio := md.Get(datadogIntegrationHeader) + if len(valuesIstio) > 0 && valuesIstio[0] == "1" { + return componentNameIstio + } + + // We don't have the ability to add custom headers in envoy gateway EnvoyExtensionPolicy CRD. + // So we fall back to detecting if we are running in k8s or not. + // If we are running in k8s, we assume it is Envoy Gateway, otherwise GCP Service Extension. + if isK8s() { + return componentNameEnvoyGateway + } + } + + return componentNameGCPServiceExtension + +} + +type responseHeadersEnvoy struct { + *extproc.ProcessingRequest + *extproc.HttpHeaders +} + +func (m responseHeadersEnvoy) ExtractResponse() (proxy.PseudoResponse, error) { + headers, pseudoHeaders := splitPseudoHeaders(m.GetHeaders().GetHeaders()) + if err := checkPseudoResponseHeaders(pseudoHeaders); err != nil { + return proxy.PseudoResponse{}, err + } + + status, err := strconv.Atoi(pseudoHeaders[":status"]) + if err != nil { + return proxy.PseudoResponse{}, fmt.Errorf("error parsing status code %q: %w", pseudoHeaders[":status"], err) + } + + return proxy.PseudoResponse{ + StatusCode: status, + Headers: headers, + }, nil +} + +func (m responseHeadersEnvoy) MessageType() proxy.MessageType { + return proxy.MessageTypeResponseHeaders +} + +type messageBody struct { + *extproc.ProcessingRequest + *extproc.HttpBody + m proxy.MessageType +} + +func (m messageBody) MessageType() proxy.MessageType { + return m.m +} diff --git a/contrib/envoyproxy/go-control-plane/envoy_test.go b/contrib/envoyproxy/go-control-plane/envoy_test.go new file mode 100644 index 0000000000..fb83f3622f --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/envoy_test.go @@ -0,0 +1,1558 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package gocontrolplane + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net" + "os" + "testing" + + envoyextprocfilter "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/ext_proc/v3" + envoyextproc "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" + envoytypes "github.com/envoyproxy/go-control-plane/envoy/type/v3" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + + v3 "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/metadata" +) + +func TestAppSec(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/user_rules.json") + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + rig, err := newEnvoyAppsecRig(t, GCPServiceExtensionIntegration, false, nil) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("monitoring-event-on-request-headers", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "POST", map[string]string{"User-Agent": "dd-test-scanner-log"}, map[string]string{}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"ua0-600-55x": 1}) + }) + + t.Run("monitoring-event-on-response-headers-without-body", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"test": "match-no-block-response-header"}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + + t.Run("blocking-event-on-request-headers", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "dd-test-scanner-log-block"}, "GET", "/", false) + + res, err := stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "ua0-600-56x": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("blocking-event-on-request-on-query", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Mistake Not..."}, "GET", "/hello?match=match-request-query", false) + + res, err := stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"query-002": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("blocking-event-on-request-on-cookies", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"Cookie": "foo=jdfoSDGFkivRG_234"}, "OPTIONS", "/", false) + + res, err := stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"tst-037-008": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("client-ip", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "OPTION", + map[string]string{"User-Agent": "Mistake not...", "X-Forwarded-For": "18.18.18.18"}, + map[string]string{"User-Agent": "match-response-header"}, + true, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "18.18.18.18", span.Tag("http.client_ip")) + + // Appsec + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + }) + + t.Run("blocking-client-ip", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Mistake not...", "X-Forwarded-For": "111.222.111.222"}, "GET", "/", false) + + // Handle the immediate response + res, err := stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "blk-001-001": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "111.222.111.222", span.Tag("http.client_ip")) + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("no-monitoring-event-on-request-body-parsing-disabled", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) +} + +func TestAppSecBodyParsingEnabled(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/user_rules.json") + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + bodyParsingSizeLimit := 256 + rig, err := newEnvoyAppsecRig(t, EnvoyIntegration, false, &bodyParsingSizeLimit) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("monitoring-event-on-request-body", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "payload": {"name": "" } }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "crs-941-110": 1}) + }) + + t.Run("monitoring-event-on-response-headers-without-body", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"test": "match-no-block-response-header"}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + + t.Run("monitoring-event-on-response-headers-with-body-sent", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"test": "match-no-block-response-header"}, false, false, "", "body") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + + t.Run("monitoring-event-on-response-headers-with-body-not-sent", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/", false) + _, err = stream.Recv() + require.NoError(t, err) + + // Send a processing response headers with the information that it would be followed by a body, but don't send the body + // It is mimicking a scenario where the response headers are sent and a body is present, but response body processing is disabled in the Envoy configuration + sendProcessingResponseHeaders(t, stream, map[string]string{"test": "match-no-block-response-header", "Content-Type": "application/json"}, "200", true) + _, err = stream.Recv() + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + + t.Run("blocking-event-on-request-body", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/", true) + res, err := stream.Recv() + require.NoError(t, err) + + msgCount := sendProcessingRequestBodyStreamed(t, stream, []byte(`{ "name": "$globals" }`), 4) + for i := 0; i < msgCount-1; i++ { + res, err = stream.Recv() + require.NoError(t, err) + } + + res, err = stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "crs-933-130-block": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("blocking-event-on-response-headers-without-body", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "OPTION", map[string]string{"User-Agent": "Chrome"}, map[string]string{"test": "match-response-header"}, true, false, "", "") + + // Handle the immediate response + res, err := stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code) // 418 because of the rule file + require.Len(t, res.GetImmediateResponse().GetHeaders().SetHeaders, 1) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"headers-003": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("blocking-event-on-response-headers-with-body-sent", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Chrome"}, "OPTION", "/", true) + res, err := stream.Recv() + require.NoError(t, err) + + msgCount := sendProcessingRequestBodyStreamed(t, stream, []byte(`{ "name": "$globals" }`), 100) + for i := 0; i < msgCount; i++ { + res, err = stream.Recv() + require.NoError(t, err) + } + + sendProcessingResponseHeaders(t, stream, map[string]string{"test": "match-response-header", "Content-type": "application/json"}, "200", true) + res, err = stream.Recv() + require.NoError(t, err) + + msgCount = sendProcessingResponseBodyStreamed(t, stream, []byte("body"), 100) + for i := 0; i < msgCount-1; i++ { + res, err = stream.Recv() + require.NoError(t, err) + } + + // Handle the immediate response + res, err = stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(418), res.GetImmediateResponse().GetStatus().Code) // 418 because of the rule file + require.Len(t, res.GetImmediateResponse().GetHeaders().SetHeaders, 1) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"headers-003": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("no-monitoring-event-on-request-body-bad-content-type", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "text/html"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) + + t.Run("blocking-event-on-request-body-truncated", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/", true) + res, err := stream.Recv() + require.NoError(t, err) + + largeText := make([]byte, 300) + for i := range largeText { + largeText[i] = 'x' + } + requestBody := fmt.Sprintf(`{ "name": "$globals", "text": "%s" }`, largeText) + + // Should block at the first chunk + _ = sendProcessingRequestBodyStreamed(t, stream, []byte(requestBody), 300) + + res, err = stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "crs-933-130-block": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("no-blocking-event-on-request-body-attack-truncated", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + largeText := make([]byte, 300) + for i := range largeText { + largeText[i] = 'x' + } + requestBody := fmt.Sprintf(`{ "text": "%s", "name": "$globals" }`, largeText) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, requestBody, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) + + // This test is failing because the external processor is waiting for a body to run the waf on the response headers + // This scenario only happen if the Envoy configuration doesn't allow the mode override, and so Envoy never sends the body + /*t.Run("blocking-event-on-response-headers-with-body-not-sent", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/", false) + _, err = stream.Recv() + require.NoError(t, err) + + // Send a processing response headers with the information that it would be followed by a body, but don't send the body + // It is mimicking a scenario where the response headers are sent and a body is present, but response body processing is disabled in the Envoy configuration + sendProcessingResponseHeaders(t, stream, map[string]string{"test": "match-response-header", "Content-Type": "application/json"}, "200", true) + + // Res should be an immediate response with the blocking event + res, err := stream.Recv() + require.IsType(t, &envoyextproc.ProcessingResponse_ImmediateResponse{}, res.GetResponse()) + require.Equal(t, uint32(0), res.GetImmediateResponse().GetGrpcStatus().Status) + require.Equal(t, envoytypes.StatusCode(403), res.GetImmediateResponse().GetStatus().Code) + require.Equal(t, "Content-Type", res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().Key) + require.Equal(t, "application/json", string(res.GetImmediateResponse().GetHeaders().SetHeaders[0].GetHeader().RawValue)) + require.NoError(t, err) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-003": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + })*/ +} + +func TestAppSecAPISecurityBodyParsingEnabled(t *testing.T) { + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + t.Setenv("_DD_APPSEC_PROXY_ENVIRONMENT", "true") // Enable API Security proxy sampler + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + bodyParsingSizeLimit := 256 + rig, err := newEnvoyAppsecRig(t, EnvoyIntegration, false, &bodyParsingSizeLimit) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("only-headers-schema-returned", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium"}, map[string]string{"Content-Type": "text/html"}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.res.body")) + }) + + t.Run("headers-and-req-body-schema-returned", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"Content-Type": "text/html"}, false, false, `{"hello_request_body":"world"}`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"content-type":[[[8]],{"len":1}],"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Equal(t, `[{"hello_request_body":[8]}]`, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.res.body")) + }) + + t.Run("headers-and-res-body-schema-returned", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium"}, map[string]string{"Content-Type": "application/json"}, false, false, "", `{"hello_response_body": "world"}`) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Equal(t, `[{"hello_response_body":[8]}]`, span.Tag("_dd.appsec.s.res.body")) + }) + + t.Run("all-schema-returned", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"Content-Type": "application/json"}, false, false, `{"hello_request_body":"world"}`, `{"hello_response_body": "world"}`) + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"content-type":[[[8]],{"len":1}],"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Equal(t, `[{"hello_request_body":[8]}]`, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Equal(t, `[{"hello_response_body":[8]}]`, span.Tag("_dd.appsec.s.res.body")) + }) +} + +func TestAppSecBodyParsingActivation(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/user_rules.json") + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func(integration Integration, bodyParsingSizeLimit *int) (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + rig, err := newEnvoyAppsecRig(t, integration, false, bodyParsingSizeLimit) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + // Body parsing disabled by default on GCP Service Extension + t.Run("default-gcp-se-no-monitoring-event-on-request-body-parsing", func(t *testing.T) { + client, mt, cleanup := setup(GCPServiceExtensionIntegration, nil) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) + + t.Run("value_set_zero-gcp-se-no-monitoring-event-on-request-body-parsing", func(t *testing.T) { + bodySize := 0 + client, mt, cleanup := setup(GCPServiceExtensionIntegration, &bodySize) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) + + t.Run("value_set_256-gcp-se-monitoring-event-on-request-body-parsing", func(t *testing.T) { + bodySize := 256 + client, mt, cleanup := setup(GCPServiceExtensionIntegration, &bodySize) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.Contains(t, span.Tags(), "appsec.event") + require.Contains(t, span.Tags(), "_dd.appsec.json") + }) + + t.Run("default-code-envoy-monitoring-event-on-request-body-parsing", func(t *testing.T) { + client, mt, cleanup := setup(EnvoyIntegration, nil) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.Contains(t, span.Tags(), "appsec.event") + require.Contains(t, span.Tags(), "_dd.appsec.json") + }) + + t.Run("default-metadata-envoy-monitoring-event-on-request-body-parsing", func(t *testing.T) { + client, mt, cleanup := setup(GCPServiceExtensionIntegration, nil) + defer cleanup() + + // Set the metadata for an envoy request + md := metadata.New(map[string]string{ + "x-datadog-envoy-integration": "1", + }) + ctx := metadata.NewOutgoingContext(context.Background(), md) + + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.Contains(t, span.Tags(), "appsec.event") + require.Contains(t, span.Tags(), "_dd.appsec.json") + }) + + t.Run("value_set_zero-headers-envoy-no-monitoring-event-on-request-body-parsing", func(t *testing.T) { + bodySize := 0 + client, mt, cleanup := setup(GCPServiceExtensionIntegration, &bodySize) + defer cleanup() + + // Set the metadata for an envoy request + md := metadata.New(map[string]string{ + "x-datadog-envoy-integration": "1", + }) + ctx := metadata.NewOutgoingContext(context.Background(), md) + + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) +} + +func TestGeneratedSpan(t *testing.T) { + setup := func() (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + rig, err := newEnvoyAppsecRig(t, EnvoyIntegration, false, nil) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("request-span", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/../../../resource-span/.?id=test", "GET", map[string]string{"user-agent": "Mistake Not...", "test-key": "test-value"}, map[string]string{"response-test-key": "response-test-value"}, false, false, "", "body") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "http.request", span.OperationName()) + require.Equal(t, "https://datadoghq.com/resource-span/?id=test", span.Tag("http.url")) + require.Equal(t, "GET", span.Tag("http.method")) + require.Equal(t, "datadoghq.com", span.Tag("http.host")) + require.Equal(t, "GET /resource-span", span.Tag("resource.name")) + require.Equal(t, "server", span.Tag("span.kind")) + require.Equal(t, "Mistake Not...", span.Tag("http.useragent")) + require.Equal(t, "envoy", span.Tag("component")) + }) + + t.Run("span-with-injected-context", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + + // add metadata to the context + ctx = metadata.AppendToOutgoingContext(ctx, + "x-datadog-trace-id", "12345", + "x-datadog-parent-id", "67890", + ) + + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/../../../resource-span/.?id=test", "GET", map[string]string{"user-agent": "Mistake Not...", "test-key": "test-value"}, map[string]string{"response-test-key": "response-test-value"}, false, false, "", "body") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "http.request", span.OperationName()) + require.Equal(t, "https://datadoghq.com/resource-span/?id=test", span.Tag("http.url")) + require.Equal(t, "GET", span.Tag("http.method")) + require.Equal(t, "datadoghq.com", span.Tag("http.host")) + require.Equal(t, "GET /resource-span", span.Tag("resource.name")) + require.Equal(t, "server", span.Tag("span.kind")) + require.Equal(t, "Mistake Not...", span.Tag("http.useragent")) + require.Equal(t, "envoy", span.Tag("component")) + + // Check for trace context + require.Equal(t, "00000000000000000000000000003039", span.Context().TraceID()) + require.Equal(t, uint64(67890), span.ParentID()) + }) +} + +func TestMalformedEnvoyProcessing(t *testing.T) { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + rig, err := newEnvoyAppsecRig(t, EnvoyIntegration, false, nil) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("response-received-without-request", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingResponseHeaders(t, stream, map[string]string{}, "400", false) + + _, err = stream.Recv() + require.Error(t, err) + _, _ = stream.Recv() + + // No span created, the request is invalid. + // span couldn't be created without request data + finished := mt.FinishedSpans() + require.Len(t, finished, 0) + }) + + t.Run("unknown-url-escape-sequence-one", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/%u002e/resource", "GET", nil, nil, false, false, "", "") + + _, err = stream.Recv() + require.Error(t, err) + _, _ = stream.Recv() + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + }) + + t.Run("unknown-url-escape-sequence-six", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + sendProcessingRequestHeaders(t, stream, nil, "GET", "/%u002e/%ZZ/%tt/%uuuu/%uwu/%%", false) + + _, err = stream.Recv() + require.Error(t, err) + _, _ = stream.Recv() + + finished := mt.FinishedSpans() + require.Len(t, finished, 0) + }) +} + +func TestAppSecComponentName(t *testing.T) { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func(integration Integration) (envoyextproc.ExternalProcessorClient, mocktracer.Tracer, func()) { + rig, err := newEnvoyAppsecRig(t, integration, false, nil) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("gcp-se-component-enabled-via-code-config", func(t *testing.T) { + client, mt, cleanup := setup(GCPServiceExtensionIntegration) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{}, map[string]string{}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for component tag + span := finished[0] + require.Equal(t, "gcp-service-extension", span.Tag("component")) + }) + + t.Run("invalid-integration-default-gcp-se-component-via-code-config", func(t *testing.T) { + client, mt, cleanup := setup(9999) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{}, map[string]string{}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for component tag + span := finished[0] + require.Equal(t, "gcp-service-extension", span.Tag("component")) + }) + + t.Run("envoy-enabled-via-code-config", func(t *testing.T) { + client, mt, cleanup := setup(EnvoyIntegration) + defer cleanup() + + ctx := context.Background() + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{}, map[string]string{}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for component tag + span := finished[0] + require.Equal(t, "envoy", span.Tag("component")) + }) + + t.Run("envoy-enabled-via-injected-header", func(t *testing.T) { + client, mt, cleanup := setup(GCPServiceExtensionIntegration) + defer cleanup() + + md := metadata.New(map[string]string{ + "x-datadog-envoy-integration": "1", + }) + ctx := metadata.NewOutgoingContext(context.Background(), md) + + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{}, map[string]string{}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for component tag + span := finished[0] + require.Equal(t, "envoy", span.Tag("component")) + }) + + t.Run("istio-enabled-via-injected-header", func(t *testing.T) { + client, mt, cleanup := setup(GCPServiceExtensionIntegration) + defer cleanup() + + md := metadata.New(map[string]string{ + "x-datadog-istio-integration": "1", + }) + ctx := metadata.NewOutgoingContext(context.Background(), md) + + stream, err := client.Process(ctx) + require.NoError(t, err) + + end2EndStreamRequest(t, stream, "/", "GET", map[string]string{}, map[string]string{}, false, false, "", "") + + err = stream.CloseSend() + require.NoError(t, err) + _, _ = stream.Recv() // to flush the spans + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for component tag + span := finished[0] + require.Equal(t, "istio", span.Tag("component")) + }) +} + +func newEnvoyAppsecRig(t *testing.T, integration Integration, blockingUnavailable bool, bodyParsingSizeLimit *int) (*envoyAppsecRig, error) { + t.Helper() + + server := grpc.NewServer() + fixtureServer := new(envoyFixtureServer) + + if blockingUnavailable { + _ = os.Setenv("_DD_APPSEC_BLOCKING_UNAVAILABLE", "true") + } + + var appsecSrv envoyextproc.ExternalProcessorServer + appsecSrv = AppsecEnvoyExternalProcessorServer(fixtureServer, AppsecEnvoyConfig{ + Integration: integration, + BlockingUnavailable: blockingUnavailable, + BodyParsingSizeLimit: bodyParsingSizeLimit, + }) + + envoyextproc.RegisterExternalProcessorServer(server, appsecSrv) + + li, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + return nil, err + } + _, port, _ := net.SplitHostPort(li.Addr().String()) + // start our test fixtureServer. + go func() { + if server.Serve(li) != nil { + t.Errorf("error serving: %s", err) + } + }() + + opts := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())} + conn, err := grpc.NewClient(li.Addr().String(), opts...) + if err != nil { + return nil, fmt.Errorf("error dialing: %s", err) + } + return &envoyAppsecRig{ + fixtureServer: fixtureServer, + listener: li, + port: port, + server: server, + conn: conn, + client: envoyextproc.NewExternalProcessorClient(conn), + }, err +} + +// rig contains all servers and connections we'd need for a grpc integration test +type envoyAppsecRig struct { + fixtureServer *envoyFixtureServer + server *grpc.Server + port string + listener net.Listener + conn *grpc.ClientConn + client envoyextproc.ExternalProcessorClient +} + +func (r *envoyAppsecRig) Close() { + r.server.Stop() + _ = r.conn.Close() +} + +type envoyFixtureServer struct { + envoyextproc.ExternalProcessorServer +} + +// Helper functions + +func sendProcessingRequestHeaders(t *testing.T, stream envoyextproc.ExternalProcessor_ProcessClient, headers map[string]string, method string, path string, hasBody bool) { + t.Helper() + + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_RequestHeaders{ + RequestHeaders: &envoyextproc.HttpHeaders{ + Headers: makeRequestHeaders(t, headers, method, path), + EndOfStream: !hasBody, + }, + }, + }) + require.NoError(t, err) +} + +// sendProcessingRequestBodyStreamed sends the request body in chunks to simulate streaming +// Returns the total number of message chunks sent. +func sendProcessingRequestBodyStreamed(t *testing.T, stream envoyextproc.ExternalProcessor_ProcessClient, body []byte, chunkSize int) int { + t.Helper() + messagesCount := 0 + + for i := 0; i < len(body); i += chunkSize { + end := i + chunkSize + if end > len(body) { + end = len(body) + } + + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_RequestBody{ + RequestBody: &envoyextproc.HttpBody{ + Body: body[i:end], + }, + }, + }) + require.NoError(t, err) + messagesCount++ + } + + // Send a chunk of 0 bytes with EndOfStream set to true to indicate the end of the body + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_RequestBody{ + RequestBody: &envoyextproc.HttpBody{ + Body: []byte{}, + EndOfStream: true, + }, + }, + }) + require.NoError(t, err) + messagesCount++ + + return messagesCount +} + +func sendProcessingRequestTrailers(t *testing.T, stream envoyextproc.ExternalProcessor_ProcessClient, trailers map[string]string) { + t.Helper() + + trailerHeaders := &v3.HeaderMap{} + for k, v := range trailers { + trailerHeaders.Headers = append(trailerHeaders.Headers, &v3.HeaderValue{Key: k, RawValue: []byte(v)}) + } + + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_RequestTrailers{ + RequestTrailers: &envoyextproc.HttpTrailers{ + Trailers: trailerHeaders, + }, + }, + }) + require.NoError(t, err) +} + +func sendProcessingResponseHeaders(t *testing.T, stream envoyextproc.ExternalProcessor_ProcessClient, headers map[string]string, status string, hasBody bool) { + t.Helper() + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_ResponseHeaders{ + ResponseHeaders: &envoyextproc.HttpHeaders{ + Headers: makeResponseHeaders(t, headers, status), + EndOfStream: !hasBody, + }, + }, + }) + require.NoError(t, err) +} + +// sendProcessingResponseBodyStreamed sends the response body in chunks to the stream. +// Returns the total number of message chunks sent. +func sendProcessingResponseBodyStreamed(t *testing.T, stream envoyextproc.ExternalProcessor_ProcessClient, body []byte, chunkSize int) int { + t.Helper() + messagesCount := 0 + + for i := 0; i < len(body); i += chunkSize { + end := i + chunkSize + if end > len(body) { + end = len(body) + } + + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_ResponseBody{ + ResponseBody: &envoyextproc.HttpBody{ + Body: body[i:end], + }, + }, + }) + require.NoError(t, err) + messagesCount++ + } + + // Send a chunk of 0 bytes with EndOfStream set to true to indicate the end of the body + err := stream.Send(&envoyextproc.ProcessingRequest{ + Request: &envoyextproc.ProcessingRequest_ResponseBody{ + ResponseBody: &envoyextproc.HttpBody{ + Body: []byte{}, + EndOfStream: true, + }, + }, + }) + require.NoError(t, err) + messagesCount++ + + return messagesCount +} + +func end2EndStreamRequest(t *testing.T, stream envoyextproc.ExternalProcessor_ProcessClient, path string, method string, requestHeaders map[string]string, responseHeaders map[string]string, blockOnResponseHeaders bool, blockOnResponseBody bool, requestBody string, responseBody string) { + t.Helper() + + // First part: request + // 1- Send the headers + sendProcessingRequestHeaders(t, stream, requestHeaders, method, path, len(requestBody) != 0) + + res, err := stream.Recv() + require.NoError(t, err) + require.IsType(t, &envoyextproc.ProcessingResponse_RequestHeaders{}, res.GetResponse()) + require.Equal(t, envoyextproc.CommonResponse_CONTINUE, res.GetRequestHeaders().GetResponse().GetStatus()) + + if res.GetModeOverride().GetRequestBodyMode() == envoyextprocfilter.ProcessingMode_STREAMED { + // 2- Send the body + msgRequestBodySent := sendProcessingRequestBodyStreamed(t, stream, []byte(requestBody), 1) + + for i := 0; i < msgRequestBodySent; i++ { + res, err = stream.Recv() + require.NoError(t, err) + require.Equal(t, envoyextproc.CommonResponse_CONTINUE, res.GetRequestBody().GetResponse().GetStatus()) + } + } + + // 3- Send the trailers + sendProcessingRequestTrailers(t, stream, map[string]string{"key": "value"}) + + res, err = stream.Recv() + require.NoError(t, err) + require.NotNil(t, res.GetRequestTrailers()) + + // Second part: response + // 1- Send the response headers + sendProcessingResponseHeaders(t, stream, responseHeaders, "200", len(responseBody) != 0) + + if blockOnResponseHeaders { + // Should have received an immediate response for blocking + // Let the test handle the response + return + } + + res, err = stream.Recv() + if err == io.EOF { + // Stream closed, the processor don't analyze more + return + } + + require.NoError(t, err) + require.IsType(t, &envoyextproc.ProcessingResponse_ResponseHeaders{}, res.GetResponse()) + + // At this stage, the processor should have required the body (streamed mode override) + require.Equal(t, res.GetModeOverride().GetResponseBodyMode(), envoyextprocfilter.ProcessingMode_STREAMED) + require.Equal(t, envoyextproc.CommonResponse_CONTINUE, res.GetResponseHeaders().GetResponse().GetStatus()) + + // 2- Send the response body + msgResponseBodySent := sendProcessingResponseBodyStreamed(t, stream, []byte(responseBody), 1) + + // minus 1 because the last message is the end of stream, and the connection will be closed after that + // because no appsec event will be found + for i := 0; i < msgResponseBodySent-1; i++ { + res, err = stream.Recv() + require.NoError(t, err) + require.Equal(t, envoyextproc.CommonResponse_CONTINUE, res.GetResponseBody().GetResponse().GetStatus()) + } + + if blockOnResponseBody { + return + } + + // The stream should now be closed + tt, err := stream.Recv() + require.Nil(t, tt) + require.Equal(t, io.EOF, err) +} + +func checkForAppsecEvent(t *testing.T, finished []*mocktracer.Span, expectedRuleIDs map[string]int) { + t.Helper() + + // The request should have the attack attempts + event := finished[len(finished)-1].Tag("_dd.appsec.json") + require.NotNil(t, event, "the _dd.appsec.json tag was not found") + + jsonText := event.(string) + type trigger struct { + Rule struct { + ID string `json:"id"` + } `json:"rule"` + } + var parsed struct { + Triggers []trigger `json:"triggers"` + } + err := json.Unmarshal([]byte(jsonText), &parsed) + require.NoError(t, err) + + histogram := map[string]uint8{} + for _, tr := range parsed.Triggers { + histogram[tr.Rule.ID]++ + } + + for ruleID, count := range expectedRuleIDs { + require.Equal(t, count, int(histogram[ruleID]), "rule %s has been triggered %d times but expected %d", ruleID, histogram[ruleID], count) + } + + require.Len(t, parsed.Triggers, len(expectedRuleIDs), "unexpected number of rules triggered") +} + +// Construct request headers +func makeRequestHeaders(t *testing.T, headers map[string]string, method string, path string) *v3.HeaderMap { + t.Helper() + + h := &v3.HeaderMap{} + for k, v := range headers { + h.Headers = append(h.Headers, &v3.HeaderValue{Key: k, RawValue: []byte(v)}) + } + + h.Headers = append(h.Headers, + &v3.HeaderValue{Key: ":method", RawValue: []byte(method)}, + &v3.HeaderValue{Key: ":path", RawValue: []byte(path)}, + &v3.HeaderValue{Key: ":scheme", RawValue: []byte("https")}, + &v3.HeaderValue{Key: ":authority", RawValue: []byte("datadoghq.com")}, + ) + + return h +} + +func makeResponseHeaders(t *testing.T, headers map[string]string, status string) *v3.HeaderMap { + t.Helper() + + h := &v3.HeaderMap{} + for k, v := range headers { + h.Headers = append(h.Headers, &v3.HeaderValue{Key: k, RawValue: []byte(v)}) + } + + h.Headers = append(h.Headers, &v3.HeaderValue{Key: ":status", RawValue: []byte(status)}) + + return h +} diff --git a/contrib/envoyproxy/go-control-plane/example_test.go b/contrib/envoyproxy/go-control-plane/example_test.go new file mode 100644 index 0000000000..e72ca248d3 --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/example_test.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package gocontrolplane + +import ( + "context" + "log" + "net" + + "google.golang.org/grpc" + + extprocv3 "github.com/envoyproxy/go-control-plane/envoy/service/ext_proc/v3" +) + +// interface fpr external processing server +type envoyExtProcServer struct { + extprocv3.ExternalProcessorServer +} + +func Example_server() { + // Create a listener for the server. + ln, err := net.Listen("tcp", ":50051") + if err != nil { + log.Fatal(err) + } + + // Initialize the grpc server as normal, using the envoy server interceptor. + s := grpc.NewServer() + srv := &envoyExtProcServer{} + + // Register the appsec envoy external processor service + appsecSrv := AppsecEnvoyExternalProcessorServer(srv, AppsecEnvoyConfig{ + Integration: EnvoyIntegration, + BlockingUnavailable: false, + Context: context.Background(), + }) + + extprocv3.RegisterExternalProcessorServer(s, appsecSrv) + + // ... register your services + + // Start serving incoming connections. + if err := s.Serve(ln); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/contrib/envoyproxy/go-control-plane/go.mod b/contrib/envoyproxy/go-control-plane/go.mod new file mode 100644 index 0000000000..c3c0dfc4da --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/envoyproxy/go-control-plane/envoy v1.32.4 + github.com/stretchr/testify v1.11.1 + golang.org/x/sync v0.17.0 + google.golang.org/grpc v1.75.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/envoyproxy/go-control-plane/go.sum b/contrib/envoyproxy/go-control-plane/go.sum new file mode 100644 index 0000000000..66ebd375cf --- /dev/null +++ b/contrib/envoyproxy/go-control-plane/go.sum @@ -0,0 +1,317 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443 h1:aQ3y1lwWyqYPiWZThqv1aFbZMiM9vblcSArJRf2Irls= +github.com/cncf/xds/go v0.0.0-20250501225837-2ac532fd4443/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= +github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw= +github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= +github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/garyburd/redigo/example_test.go b/contrib/garyburd/redigo/example_test.go deleted file mode 100644 index 7cf67015fc..0000000000 --- a/contrib/garyburd/redigo/example_test.go +++ /dev/null @@ -1,85 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package redigo_test - -import ( - "context" - "log" - "time" - - redigotrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/garyburd/redigo" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - "github.com/garyburd/redigo/redis" -) - -// To start tracing Redis commands, use the TracedDial function to create a connection, -// passing in a service name of choice. -func Example() { - c, err := redigotrace.Dial("tcp", "127.0.0.1:6379") - if err != nil { - log.Fatal(err) - } - - // Emit spans per command by using your Redis connection as usual - c.Do("SET", "vehicle", "truck") - - // Use a context to pass information down the call chain - root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", - tracer.ServiceName("web"), - tracer.ResourceName("/home"), - ) - - // When passed a context as the final argument, c.Do will emit a span inheriting from 'parent.request' - c.Do("SET", "food", "cheese", ctx) - root.Finish() -} - -func Example_tracedConn() { - c, err := redigotrace.Dial("tcp", "127.0.0.1:6379", - redigotrace.WithServiceName("my-redis-backend"), - redis.DialKeepAlive(time.Minute), - ) - if err != nil { - log.Fatal(err) - } - - // Emit spans per command by using your Redis connection as usual - c.Do("SET", "vehicle", "truck") - - // Use a context to pass information down the call chain - root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", - tracer.ServiceName("web"), - tracer.ResourceName("/home"), - ) - - // When passed a context as the final argument, c.Do will emit a span inheriting from 'parent.request' - c.Do("SET", "food", "cheese", ctx) - root.Finish() -} - -// Alternatively, provide a redis URL to the TracedDialURL function -func Example_dialURL() { - c, err := redigotrace.DialURL("redis://127.0.0.1:6379") - if err != nil { - log.Fatal(err) - } - c.Do("SET", "vehicle", "truck") -} - -// When using a redigo Pool, set your Dial function to return a traced connection -func Example_pool() { - pool := &redis.Pool{ - Dial: func() (redis.Conn, error) { - return redigotrace.Dial("tcp", "127.0.0.1:6379", - redigotrace.WithServiceName("my-redis-backend"), - ) - }, - } - - c := pool.Get() - c.Do("SET", " whiskey", " glass") -} diff --git a/contrib/garyburd/redigo/option.go b/contrib/garyburd/redigo/option.go deleted file mode 100644 index 2b77c46118..0000000000 --- a/contrib/garyburd/redigo/option.go +++ /dev/null @@ -1,65 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package redigo // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/garyburd/redigo" - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -const defaultServiceName = "redis.conn" - -type dialConfig struct { - serviceName string - spanName string - analyticsRate float64 -} - -// DialOption represents an option that can be passed to Dial. -type DialOption func(*dialConfig) - -func defaults(cfg *dialConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.RedisOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_REDIGO_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } -} - -// WithServiceName sets the given service name for the dialled connection. -func WithServiceName(name string) DialOption { - return func(cfg *dialConfig) { - cfg.serviceName = name - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) DialOption { - return func(cfg *dialConfig) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) DialOption { - return func(cfg *dialConfig) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} diff --git a/contrib/garyburd/redigo/redigo.go b/contrib/garyburd/redigo/redigo.go deleted file mode 100644 index c3326fa2ed..0000000000 --- a/contrib/garyburd/redigo/redigo.go +++ /dev/null @@ -1,175 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package redigo provides functions to trace the garyburd/redigo package (https://github.com/garyburd/redigo). -package redigo - -import ( - "bytes" - "context" - "fmt" - "math" - "net" - "net/url" - "strconv" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - redis "github.com/garyburd/redigo/redis" -) - -const componentName = "garyburd/redigo" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/garyburd/redigo") -} - -// Conn is an implementation of the redis.Conn interface that supports tracing -type Conn struct { - redis.Conn - *params -} - -// params contains fields and metadata useful for command tracing -type params struct { - config *dialConfig - network string - host string - port string -} - -// parseOptions parses a set of arbitrary options (which can be of type redis.DialOption -// or the local DialOption) and returns the corresponding redis.DialOption set as well as -// a configured dialConfig. -func parseOptions(options ...interface{}) ([]redis.DialOption, *dialConfig) { - dialOpts := []redis.DialOption{} - cfg := new(dialConfig) - defaults(cfg) - for _, opt := range options { - switch o := opt.(type) { - case redis.DialOption: - dialOpts = append(dialOpts, o) - case DialOption: - o(cfg) - } - } - return dialOpts, cfg -} - -// Dial dials into the network address and returns a traced redis.Conn. -// The set of supported options must be either of type redis.DialOption or this package's DialOption. -func Dial(network, address string, options ...interface{}) (redis.Conn, error) { - dialOpts, cfg := parseOptions(options...) - log.Debug("contrib/garyburd/redigo: Dialing %s %s, %#v", network, address, cfg) - c, err := redis.Dial(network, address, dialOpts...) - if err != nil { - return nil, err - } - host, port, err := net.SplitHostPort(address) - if err != nil { - return nil, err - } - tc := Conn{c, ¶ms{cfg, network, host, port}} - return tc, nil -} - -// DialURL connects to a Redis server at the given URL using the Redis -// URI scheme. URLs should follow the draft IANA specification for the -// scheme (https://www.iana.org/assignments/uri-schemes/prov/redis). -// The returned redis.Conn is traced. -func DialURL(rawurl string, options ...interface{}) (redis.Conn, error) { - dialOpts, cfg := parseOptions(options...) - log.Debug("contrib/garyburd/redigo: Dialing %s, %#v", rawurl, cfg) - u, err := url.Parse(rawurl) - if err != nil { - return Conn{}, err - } - host, port, err := net.SplitHostPort(u.Host) - if err != nil { - host = u.Host - port = "6379" - } - if host == "" { - host = "localhost" - } - network := "tcp" - c, err := redis.DialURL(rawurl, dialOpts...) - tc := Conn{c, ¶ms{cfg, network, host, port}} - return tc, err -} - -// newChildSpan creates a span inheriting from the given context. It adds to the span useful metadata about the traced Redis connection -func (tc Conn) newChildSpan(ctx context.Context) ddtrace.Span { - p := tc.params - opts := []ddtrace.StartSpanOption{ - tracer.SpanType(ext.SpanTypeRedis), - tracer.ServiceName(p.config.serviceName), - tracer.Tag(ext.Component, componentName), - tracer.Tag(ext.SpanKind, ext.SpanKindClient), - tracer.Tag(ext.DBSystem, ext.DBSystemRedis), - } - if !math.IsNaN(p.config.analyticsRate) { - opts = append(opts, tracer.Tag(ext.EventSampleRate, p.config.analyticsRate)) - } - span, _ := tracer.StartSpanFromContext(ctx, p.config.spanName, opts...) - span.SetTag("out.network", p.network) - span.SetTag(ext.TargetPort, p.port) - span.SetTag(ext.TargetHost, p.host) - return span -} - -// Do wraps redis.Conn.Do. It sends a command to the Redis server and returns the received reply. -// In the process it emits a span containing key information about the command sent. -// When passed a context.Context as the final argument, Do will ensure that any span created -// inherits from this context. The rest of the arguments are passed through to the Redis server unchanged. -func (tc Conn) Do(commandName string, args ...interface{}) (reply interface{}, err error) { - ctx := context.Background() - - if n := len(args); n > 0 { - if argCtx, ok := args[n-1].(context.Context); ok { - ctx = argCtx - args = args[:n-1] - } - } - - span := tc.newChildSpan(ctx) - defer func() { - span.Finish(tracer.WithError(err)) - }() - - span.SetTag("redis.args_length", strconv.Itoa(len(args))) - - if len(commandName) > 0 { - span.SetTag(ext.ResourceName, commandName) - } else { - // When the command argument to the Do method is "", then the Do method will flush the output buffer - // See https://godoc.org/github.com/garyburd/redigo/redis#hdr-Pipelining - span.SetTag(ext.ResourceName, "redigo.Conn.Flush") - } - var b bytes.Buffer - b.WriteString(commandName) - for _, arg := range args { - b.WriteString(" ") - switch arg := arg.(type) { - case string: - b.WriteString(arg) - case int: - b.WriteString(strconv.Itoa(arg)) - case int32: - b.WriteString(strconv.FormatInt(int64(arg), 10)) - case int64: - b.WriteString(strconv.FormatInt(arg, 10)) - case fmt.Stringer: - b.WriteString(arg.String()) - } - } - span.SetTag("redis.raw_command", b.String()) - return tc.Conn.Do(commandName, args...) -} diff --git a/contrib/garyburd/redigo/redigo_test.go b/contrib/garyburd/redigo/redigo_test.go deleted file mode 100644 index c19ebef06b..0000000000 --- a/contrib/garyburd/redigo/redigo_test.go +++ /dev/null @@ -1,271 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package redigo - -import ( - "context" - "fmt" - "os" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - - "github.com/garyburd/redigo/redis" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestMain(m *testing.M) { - _, ok := os.LookupEnv("INTEGRATION") - if !ok { - fmt.Println("--- SKIP: to enable integration test, set the INTEGRATION environment variable") - os.Exit(0) - } - os.Exit(m.Run()) -} - -func TestClient(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - c, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) - assert.Nil(err) - c.Do("SET", 1, "truck") - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - - span := spans[0] - assert.Equal("redis.command", span.OperationName()) - assert.Equal(ext.SpanTypeRedis, span.Tag(ext.SpanType)) - assert.Equal("my-service", span.Tag(ext.ServiceName)) - assert.Equal("SET", span.Tag(ext.ResourceName)) - assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) - assert.Equal("6379", span.Tag(ext.TargetPort)) - assert.Equal("2", span.Tag("redis.args_length")) - assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) - assert.Equal("garyburd/redigo", span.Tag(ext.Component)) - assert.Equal("redis", span.Tag(ext.DBSystem)) -} - -func TestCommandError(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - c, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) - assert.Nil(err) - _, err = c.Do("NOT_A_COMMAND", context.Background()) - assert.NotNil(err) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - span := spans[0] - - assert.Equal(err, span.Tag(ext.Error).(error)) - assert.Equal("redis.command", span.OperationName()) - assert.Equal("my-service", span.Tag(ext.ServiceName)) - assert.Equal("NOT_A_COMMAND", span.Tag(ext.ResourceName)) - assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) - assert.Equal("6379", span.Tag(ext.TargetPort)) - assert.Equal("NOT_A_COMMAND", span.Tag("redis.raw_command")) - assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) - assert.Equal("garyburd/redigo", span.Tag(ext.Component)) - assert.Equal("redis", span.Tag(ext.DBSystem)) -} - -func TestConnectionError(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - _, err := Dial("tcp", "127.0.0.1:1000", WithServiceName("redis-service")) - - assert.NotNil(err) - assert.Contains(err.Error(), "dial tcp 127.0.0.1:1000") -} - -func TestInheritance(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.span") - client, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("redis-service")) - assert.Nil(err) - client.Do("SET", "water", "bottle", ctx) - root.Finish() - - spans := mt.FinishedSpans() - assert.Len(spans, 2) - - var child, parent mocktracer.Span - for _, s := range spans { - switch s.OperationName() { - case "redis.command": - child = s - case "parent.span": - parent = s - } - } - assert.NotNil(child) - assert.NotNil(parent) - - assert.Equal(child.ParentID(), parent.SpanID()) - assert.Equal(child.Tag(ext.TargetHost), "127.0.0.1") - assert.Equal(child.Tag(ext.TargetPort), "6379") - assert.Equal(ext.SpanKindClient, child.Tag(ext.SpanKind)) - assert.Equal("garyburd/redigo", child.Tag(ext.Component)) - assert.Equal("redis", child.Tag(ext.DBSystem)) -} - -type stringifyTest struct{ A, B int } - -func (ts stringifyTest) String() string { return fmt.Sprintf("[%d, %d]", ts.A, ts.B) } - -func TestCommandsToSring(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - str := stringifyTest{A: 57, B: 8} - c, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) - assert.Nil(err) - c.Do("SADD", "testSet", "a", int(0), int32(1), int64(2), str, context.Background()) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - span := spans[0] - - assert.Equal("redis.command", span.OperationName()) - assert.Equal("my-service", span.Tag(ext.ServiceName)) - assert.Equal("SADD", span.Tag(ext.ResourceName)) - assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) - assert.Equal("6379", span.Tag(ext.TargetPort)) - assert.Equal("SADD testSet a 0 1 2 [57, 8]", span.Tag("redis.raw_command")) - assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) - assert.Equal("garyburd/redigo", span.Tag(ext.Component)) - assert.Equal("redis", span.Tag(ext.DBSystem)) -} - -func TestPool(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - pool := &redis.Pool{ - MaxIdle: 2, - MaxActive: 3, - IdleTimeout: 23, - Wait: true, - Dial: func() (redis.Conn, error) { - return Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) - }, - } - - pc := pool.Get() - pc.Do("SET", " whiskey", " glass", context.Background()) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - span := spans[0] - assert.Equal(span.Tag("out.network"), "tcp") -} - -func TestTracingDialUrl(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - url := "redis://127.0.0.1:6379" - client, err := DialURL(url, WithServiceName("redis-service")) - assert.Nil(err) - client.Do("SET", "ONE", " TWO", context.Background()) - - spans := mt.FinishedSpans() - assert.True(len(spans) > 0) -} - -func TestAnalyticsSettings(t *testing.T) { - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...interface{}) { - c, err := Dial("tcp", "127.0.0.1:6379", opts...) - assert.Nil(t, err) - c.Do("SET", 1, "truck") - - spans := mt.FinishedSpans() - assert.Len(t, spans, 1) - - assert.Equal(t, rate, spans[0].Tag(ext.EventSampleRate)) - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil) - }) - - t.Run("global", func(t *testing.T) { - t.Skip("global flag disabled") - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - - t.Run("enabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, 1.0, WithAnalytics(true)) - }) - - t.Run("disabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil, WithAnalytics(false)) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) - }) -} - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []interface{} - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - c, err := Dial("tcp", "127.0.0.1:6379", opts...) - require.NoError(t, err) - _, err = c.Do("SET", "test_key", "test_value") - require.NoError(t, err) - - return mt.FinishedSpans() - }) - namingschematest.NewRedisTest(genSpans, "redis.conn")(t) -} diff --git a/contrib/gin-gonic/gin/appsec.go b/contrib/gin-gonic/gin/appsec.go index 791462016d..a42e2664d7 100644 --- a/contrib/gin-gonic/gin/appsec.go +++ b/contrib/gin-gonic/gin/appsec.go @@ -8,15 +8,59 @@ package gin import ( "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/binding" ) -// useAppSec executes the AppSec logic related to the operation start and -// returns the function to be executed upon finishing the operation -func useAppSec(c *gin.Context, span tracer.Span) { +// AppsecBinding wraps a [binding.BindingBody] to add AppSec monitoring of the parsed request body. +// It is used to override the default bindings in the gin binding package at init time. +// Keep in mind that this does not cover all the ways to bind a request in gin because of the +// [binding.BindingBody.BindBody] method that we do not wrap because we would be missing the request context. +// You can also you it manually by wrapping any [binding.BindingBody] you want and using it with [gin.Context.MustBindWith] +// or [gin.Context.BindWith]. +type AppsecBinding struct { + binding.BindingBody +} + +func (b AppsecBinding) Bind(req *http.Request, obj any) error { + err := b.BindingBody.Bind(req, obj) + if err != nil || !instr.AppSecEnabled() { + return err + } + + err = appsec.MonitorParsedHTTPBody(req.Context(), obj) + if events.IsSecurityError(err) { + // Write the blocking response NOW instead of waiting for the end of the request + // because the function just on top of us will write a 400 Bad Request "Could not parse request body" + op, ok := dyngo.FindOperation[httpsec.HandlerOperation](req.Context()) + if !ok { + instr.Logger().Debug("Unknown operation in context, cannot block") + return nil // Don't return the blocking error, as we cannot block ourselves which would trigger a 400 + } + + dyngo.EmitData(op, httpsec.EarlyBlock{}) + } + return err +} + +func init() { + // Override the default bindings to add AppSec monitoring of the parsed request body + binding.JSON = AppsecBinding{BindingBody: binding.JSON} + binding.XML = AppsecBinding{BindingBody: binding.XML} + binding.ProtoBuf = AppsecBinding{BindingBody: binding.ProtoBuf} + binding.MsgPack = AppsecBinding{BindingBody: binding.MsgPack} + binding.YAML = AppsecBinding{BindingBody: binding.YAML} + binding.TOML = AppsecBinding{BindingBody: binding.TOML} +} + +// useAppSec executes the AppSec logic related to the operation start +func useAppSec(c *gin.Context, span trace.TagSetter) { var params map[string]string if l := len(c.Params); l > 0 { params = make(map[string]string, l) @@ -24,11 +68,104 @@ func useAppSec(c *gin.Context, span tracer.Span) { params[p.Key] = p.Value } } - httpWrapper := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + httpWrapper := http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { c.Request = r c.Next() }) - httpsec.WrapHandler(httpWrapper, span, params, &httpsec.Config{ - OnBlock: []func(){func() { c.Abort() }}, + httpsec.WrapHandler(httpWrapper, span, &httpsec.Config{ + Framework: "github.com/gin-gonic/gin", + OnBlock: []func(){func() { c.Abort() }}, + Route: c.FullPath(), + RouteParams: params, }).ServeHTTP(c.Writer, c.Request) } + +// AsciiJSON is a wrapper around the [gin.Context.AsciiJSON] method that also performs +// appsec HTTP response body monitoring. +func AsciiJSON(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.AsciiJSON(code, obj) +} + +// IndentedJSON is a wrapper around the [gin.Context.IndentedJSON] method that also performs +// appsec HTTP response body monitoring. +func IndentedJSON(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.IndentedJSON(code, obj) +} + +// JSON is a wrapper around the [gin.Context.JSON] method that also performs +// appsec HTTP response body monitoring. +func JSON(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.JSON(code, obj) +} + +// JSONP is a wrapper around the [gin.Context.JSONP] method that also performs +// appsec HTTP response body monitoring. +func JSONP(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.JSONP(code, obj) +} + +// PureJSON is a wrapper around the [gin.Context.PureJSON] method that also performs +// appsec HTTP response body monitoring. +func PureJSON(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.PureJSON(code, obj) +} + +// SecureJSON is a wrapper around the [gin.Context.SecureJSON] method that also performs +// appsec HTTP response body monitoring. +func SecureJSON(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.SecureJSON(code, obj) +} + +// XML is a wrapper around the [gin.Context.XML] method that also performs +// appsec HTTP response body monitoring. +func XML(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.XML(code, obj) +} + +// YAML is a wrapper around the [gin.Context.YAML] method that also performs +// appsec HTTP response body monitoring. +func YAML(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.YAML(code, obj) +} + +// TOML is a wrapper around the [gin.Context.TOML] method that also performs +// appsec HTTP response body monitoring. +func TOML(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.TOML(code, obj) +} + +// ProtoBuf is a wrapper around the [gin.Context.ProtoBuf] method that also performs +// appsec HTTP response body monitoring. +func ProtoBuf(c *gin.Context, code int, obj any) { + if err := appsec.MonitorHTTPResponseBody(c.Request.Context(), obj); err != nil { + instr.Logger().Debug("appsec: monitoring of response body resulted in error: %s", err.Error()) + } + c.ProtoBuf(code, obj) +} diff --git a/contrib/gin-gonic/gin/appsec_test.go b/contrib/gin-gonic/gin/appsec_test.go index c7134d8474..9e2b2130c1 100644 --- a/contrib/gin-gonic/gin/appsec_test.go +++ b/contrib/gin-gonic/gin/appsec_test.go @@ -13,19 +13,17 @@ import ( "strings" "testing" - pappsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/gin-gonic/gin" "github.com/stretchr/testify/require" ) func TestAppSec(t *testing.T) { - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } @@ -38,9 +36,14 @@ func TestAppSec(t *testing.T) { c.String(200, "Hello Params!\n") }) r.Any("/body", func(c *gin.Context) { - pappsec.MonitorParsedHTTPBody(c.Request.Context(), "$globals") + appsec.MonitorParsedHTTPBody(c.Request.Context(), "$globals") c.String(200, "Hello Body!\n") }) + r.Any("/response-body", func(c *gin.Context) { + body := map[string]string{"hello": "world"} + appsec.MonitorHTTPResponseBody(c.Request.Context(), body) + c.JSON(200, body) + }) srv := httptest.NewServer(r) defer srv.Close() @@ -121,36 +124,59 @@ func TestAppSec(t *testing.T) { }) - // Test a PHP injection attack via request parsed body - t.Run("SDK-body", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + t.Run("SDK", func(t *testing.T) { + // Test a PHP injection attack via request parsed body + t.Run("parsed-body", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() - req, err := http.NewRequest("POST", srv.URL+"/body", nil) - if err != nil { - panic(err) - } - res, err := srv.Client().Do(req) - require.NoError(t, err) - defer res.Body.Close() + req, err := http.NewRequest("POST", srv.URL+"/body", nil) + require.NoError(t, err) - // Check that the handler was properly called - b, err := io.ReadAll(res.Body) - require.NoError(t, err) - require.Equal(t, "Hello Body!\n", string(b)) + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() - finished := mt.FinishedSpans() - require.Len(t, finished, 1) + // Check that the handler was properly called + b, err := io.ReadAll(res.Body) + require.NoError(t, err) + require.Equal(t, "Hello Body!\n", string(b)) - event := finished[0].Tag("_dd.appsec.json") - require.NotNil(t, event) - require.True(t, strings.Contains(event.(string), "crs-933-130")) + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + event := finished[0].Tag("_dd.appsec.json") + require.NotNil(t, event) + require.True(t, strings.Contains(event.(string), "crs-933-130")) + }) + + t.Run("response-body", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", srv.URL+"/response-body", nil) + require.NoError(t, err) + + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + + // Check that the handler was properly called + b, err := io.ReadAll(res.Body) + require.NoError(t, err) + require.Equal(t, `{"hello":"world"}`, string(b)) + + // Verify the WAF has indeed been able to see the response body, which means it produced the + // response body schema derivative. + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + require.Equal(t, `[{"hello":[8]}]`, finished[0].Tag("_dd.appsec.s.res.body")) + }) }) } func TestControlFlow(t *testing.T) { - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) middlewareResponseBody := "Hello Middleware" middlewareResponseStatus := 433 handlerResponseBody := "Hello Handler" @@ -239,7 +265,7 @@ func TestControlFlow(t *testing.T) { c.Abort() }, }, - handler: func(c *gin.Context) { + handler: func(_ *gin.Context) { // Do nothing so that the calling middleware can handle the response. }, test: func(t *testing.T, rec *httptest.ResponseRecorder, mt mocktracer.Tracer) { @@ -351,6 +377,7 @@ func TestControlFlow(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { mt := mocktracer.Start() + defer mt.Stop() // Create a Gin router router := gin.New() // Setup the middleware @@ -373,17 +400,26 @@ func TestControlFlow(t *testing.T) { func TestBlocking(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/blocking.json") - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { t.Skip("AppSec needs to be enabled for this test") } r := gin.New() r.Use(Middleware("appsec")) - r.Any("/", func(c *gin.Context) { + r.Any("/test", func(c *gin.Context) { c.String(200, "Hello World!\n") }) + r.Any("/body", func(c *gin.Context) { + var body struct { + Name string `json:"name"` + } + if err := c.Bind(&body); err != nil { + c.AbortWithError(400, err) // Should be ignored + return + } + c.String(200, "Hello %s!\n", body.Name) + }) srv := httptest.NewServer(r) defer srv.Close() @@ -391,7 +427,7 @@ func TestBlocking(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - req, err := http.NewRequest("POST", srv.URL, nil) + req, err := http.NewRequest("POST", srv.URL+"/test", nil) if err != nil { panic(err) } @@ -408,29 +444,54 @@ func TestBlocking(t *testing.T) { require.Equal(t, 403, res.StatusCode) }) + t.Run("body-block", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srv.URL+"/body", strings.NewReader(`{"name":"$globals"}`)) + if err != nil { + panic(err) + } + req.Header.Set("Content-Type", "application/json") + // Hardcoded IP header holding an IP that is blocked + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + + // Check that the request was blocked + b, err := io.ReadAll(res.Body) + require.NoError(t, err) + require.NotContains(t, string(b), "Hello") + require.Equal(t, 403, res.StatusCode) + }) + t.Run("no-block", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - req1, err := http.NewRequest("POST", srv.URL, nil) + req1, err := http.NewRequest("POST", srv.URL+"/test", nil) if err != nil { panic(err) } - req2, err := http.NewRequest("POST", srv.URL, nil) + req2, err := http.NewRequest("POST", srv.URL+"/test", nil) if err != nil { panic(err) } req2.Header.Set("x-forwarded-for", "1.2.3.5") + req3, err := http.NewRequest("POST", srv.URL+"/body", strings.NewReader(`{"name":"toto"}`)) + if err != nil { + panic(err) + } + req3.Header.Set("Content-Type", "application/json") - for _, r := range []*http.Request{req1, req2} { + for _, r := range []*http.Request{req1, req2, req3} { res, err := srv.Client().Do(r) require.NoError(t, err) defer res.Body.Close() // Check that the request was not blocked b, err := io.ReadAll(res.Body) require.NoError(t, err) - require.Equal(t, "Hello World!\n", string(b)) - + require.Contains(t, string(b), "Hello") } }) } diff --git a/contrib/gin-gonic/gin/example_test.go b/contrib/gin-gonic/gin/example_test.go index 6e24a191b1..01596af6a4 100644 --- a/contrib/gin-gonic/gin/example_test.go +++ b/contrib/gin-gonic/gin/example_test.go @@ -6,8 +6,8 @@ package gin_test import ( - gintrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gin-gonic/gin" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + gintrace "github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/gin-gonic/gin" ) diff --git a/contrib/gin-gonic/gin/gintrace.go b/contrib/gin-gonic/gin/gintrace.go index 1746c2689a..d4f66befbd 100644 --- a/contrib/gin-gonic/gin/gintrace.go +++ b/contrib/gin-gonic/gin/gintrace.go @@ -4,28 +4,28 @@ // Copyright 2016 Datadog, Inc. // Package gin provides functions to trace the gin-gonic/gin package (https://github.com/gin-gonic/gin). -package gin // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gin-gonic/gin" +package gin // import "github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2" import ( + "errors" "fmt" "math" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/gin-gonic/gin" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" ) const componentName = "gin-gonic/gin" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/gin-gonic/gin") + instr = instrumentation.Load(instrumentation.PackageGin) } // Middleware returns middleware that will trace incoming requests. If service is empty then the @@ -33,9 +33,9 @@ func init() { func Middleware(service string, opts ...Option) gin.HandlerFunc { cfg := newConfig(service) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/gin-gonic/gin: Configuring Middleware: Service: %s, %#v", cfg.serviceName, cfg) + instr.Logger().Debug("contrib/gin-gonic/gin: Configuring Middleware: Service: %s, %#v", cfg.serviceName, cfg) spanOpts := []tracer.StartSpanOption{ tracer.ServiceName(cfg.serviceName), tracer.Tag(ext.Component, componentName), @@ -45,23 +45,27 @@ func Middleware(service string, opts ...Option) gin.HandlerFunc { if cfg.ignoreRequest(c) { return } - opts := options.Copy(spanOpts...) // opts must be a copy of cfg.spanOpts, locally scoped, to avoid races. + opts := options.Expand(spanOpts, 0, 4) // opts must be a copy of cfg.spanOpts, locally scoped, to avoid races. opts = append(opts, tracer.ResourceName(cfg.resourceNamer(c))) if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } opts = append(opts, tracer.Tag(ext.HTTPRoute, c.FullPath())) opts = append(opts, httptrace.HeaderTagsFromRequest(c.Request, cfg.headerTags)) - span, ctx := httptrace.StartRequestSpan(c.Request, opts...) + span, ctx, finishSpans := httptrace.StartRequestSpan(c.Request, opts...) defer func() { - httptrace.FinishRequestSpan(span, c.Writer.Status()) + status := c.Writer.Status() + if cfg.useGinErrors && cfg.isStatusError(status) && len(c.Errors) > 0 { + finishSpans(status, cfg.isStatusError, tracer.WithError(errors.New(c.Errors.String()))) + } + finishSpans(status, cfg.isStatusError) }() // pass the span through the request context c.Request = c.Request.WithContext(ctx) // Use AppSec if enabled by user - if appsec.Enabled() { + if instr.AppSecEnabled() { useAppSec(c, span) } @@ -84,9 +88,8 @@ func HTML(c *gin.Context, code int, name string, obj interface{}) { err := fmt.Errorf("error rendering tmpl:%s: %s", name, r) span.Finish(tracer.WithError(err)) panic(r) - } else { - span.Finish() } + span.Finish() }() c.HTML(code, name, obj) } diff --git a/contrib/gin-gonic/gin/gintrace_test.go b/contrib/gin-gonic/gin/gintrace_test.go index 5f9794c74a..c8454df4ec 100644 --- a/contrib/gin-gonic/gin/gintrace_test.go +++ b/contrib/gin-gonic/gin/gintrace_test.go @@ -14,15 +14,16 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/testtracer" ) func init() { @@ -57,7 +58,7 @@ func TestTrace200(t *testing.T) { router.GET("/user/:id", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") id := c.Param("id") c.Writer.Write([]byte(id)) }) @@ -87,6 +88,7 @@ func TestTrace200(t *testing.T) { assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) } func TestTraceDefaultResponse(t *testing.T) { @@ -126,6 +128,7 @@ func TestTraceDefaultResponse(t *testing.T) { assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) } func TestTraceMultipleResponses(t *testing.T) { @@ -168,6 +171,7 @@ func TestTraceMultipleResponses(t *testing.T) { assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) } func TestError(t *testing.T) { @@ -175,14 +179,14 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - // setup - router := gin.New() - router.Use(Middleware("foobar")) responseErr := errors.New("oh no") - t.Run("server error", func(*testing.T) { + t.Run("server error - with error propagation", func(*testing.T) { defer mt.Reset() + router := gin.New() + router.Use(Middleware("foobar", WithUseGinErrors())) + // configure a handler that returns an error and 5xx status code router.GET("/server_err", func(c *gin.Context) { c.AbortWithError(500, responseErr) @@ -205,15 +209,89 @@ func TestError(t *testing.T) { assert.Equal("foobar", span.Tag(ext.ServiceName)) assert.Equal("500", span.Tag(ext.HTTPCode)) assert.Equal(fmt.Sprintf("Error #01: %s\n", responseErr), span.Tag("gin.errors")) - // server errors set the ext.Error tag - assert.Equal("500: Internal Server Error", span.Tag(ext.Error).(error).Error()) + // server errors set the ext.ErrorMsg tag + assert.Equal(fmt.Sprintf("Error #01: %s\n", responseErr), span.Tag(ext.ErrorMsg)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) + }) + + t.Run("server error - with error propagation - nil Errors in gin context", func(*testing.T) { + defer mt.Reset() + + router := gin.New() + router.Use(Middleware("foobar", WithUseGinErrors())) + + // configure a handler that returns an error and 5xx status code + router.GET("/server_err", func(c *gin.Context) { + c.AbortWithStatus(500) + }) + r := httptest.NewRequest("GET", "/server_err", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, 500) + + // verify the errors and status are correct + spans := mt.FinishedSpans() + assert.Len(spans, 1) + if len(spans) < 1 { + t.Fatalf("no spans") + } + span := spans[0] + assert.Equal("http.request", span.OperationName()) + assert.Equal("foobar", span.Tag(ext.ServiceName)) + assert.Equal("500", span.Tag(ext.HTTPCode)) + assert.Empty(span.Tag("gin.errors")) + // server errors set the ext.ErrorMsg tag + assert.Equal("500: Internal Server Error", span.Tag(ext.ErrorMsg)) + assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) + assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) + }) + + t.Run("server error - without error propagation", func(*testing.T) { + defer mt.Reset() + + router := gin.New() + router.Use(Middleware("foobar")) + + // configure a handler that returns an error and 5xx status code + router.GET("/server_err", func(c *gin.Context) { + c.AbortWithError(500, responseErr) + }) + r := httptest.NewRequest("GET", "/server_err", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, 500) + + // verify the errors and status are correct + spans := mt.FinishedSpans() + assert.Len(spans, 1) + if len(spans) < 1 { + t.Fatalf("no spans") + } + span := spans[0] + assert.Equal("http.request", span.OperationName()) + assert.Equal("foobar", span.Tag(ext.ServiceName)) + assert.Equal("500", span.Tag(ext.HTTPCode)) + assert.Equal(fmt.Sprintf("Error #01: %s\n", responseErr), span.Tag("gin.errors")) + // server errors set the ext.ErrorMsg tag + assert.Equal("500: Internal Server Error", span.Tag(ext.ErrorMsg)) + assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) + assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) }) t.Run("client error", func(*testing.T) { defer mt.Reset() + router := gin.New() + router.Use(Middleware("foobar")) + // configure a handler that returns an error and 4xx status code router.GET("/client_err", func(c *gin.Context) { c.AbortWithError(418, responseErr) @@ -236,10 +314,11 @@ func TestError(t *testing.T) { assert.Equal("foobar", span.Tag(ext.ServiceName)) assert.Equal("418", span.Tag(ext.HTTPCode)) assert.Equal(fmt.Sprintf("Error #01: %s\n", responseErr), span.Tag("gin.errors")) - // client errors do not set the ext.Error tag - assert.Equal(nil, span.Tag(ext.Error)) + // client errors do not set the ext.ErrorMsg tag + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gin-gonic/gin", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) }) } @@ -274,9 +353,10 @@ func TestHTML(t *testing.T) { for _, s := range spans { assert.Equal("foobar", s.Tag(ext.ServiceName), s.String()) assert.Equal("gin-gonic/gin", s.Tag(ext.Component)) + assert.Equal(componentName, s.Integration()) } - var tspan mocktracer.Span + var tspan *mocktracer.Span for _, s := range spans { // we need to pick up the span we're searching for, as the // order is not garanteed within the buffer @@ -317,14 +397,15 @@ func TestPropagation(t *testing.T) { w := httptest.NewRecorder() pspan := tracer.StartSpan("test") - tracer.Inject(pspan.Context(), tracer.HTTPHeadersCarrier(r.Header)) + err := tracer.Inject(pspan.Context(), tracer.HTTPHeadersCarrier(r.Header)) + require.NoError(t, err) router := gin.New() router.Use(Middleware("foobar")) router.GET("/user/:id", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) + assert.Equal(mocktracer.MockSpan(span).ParentID(), mocktracer.MockSpan(pspan).SpanID()) }) router.ServeHTTP(w, r) @@ -358,9 +439,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -383,25 +462,23 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } func TestResourceNamerSettings(t *testing.T) { - assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() staticName := "foo" - staticNamer := func(c *gin.Context) string { + staticNamer := func(_ *gin.Context) string { return staticName } t.Run("default", func(t *testing.T) { + assert := assert.New(t) defer mt.Reset() router := gin.New() @@ -410,7 +487,7 @@ func TestResourceNamerSettings(t *testing.T) { router.GET("/test", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ResourceName), "GET /test") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ResourceName), "GET /test") }) r := httptest.NewRequest("GET", "/test", nil) @@ -420,8 +497,8 @@ func TestResourceNamerSettings(t *testing.T) { }) t.Run("custom", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + assert := assert.New(t) + defer mt.Reset() router := gin.New() router.Use(Middleware("foobar", WithResourceNamer(staticNamer))) @@ -429,7 +506,7 @@ func TestResourceNamerSettings(t *testing.T) { router.GET("/test", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ResourceName), staticName) + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ResourceName), staticName) }) r := httptest.NewRequest("GET", "/test", nil) @@ -465,60 +542,59 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + testutils.SetGlobalHeaderTags(t, "3header") - r := setupReq() + _ = setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) - t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") }) } @@ -542,11 +618,10 @@ func TestIgnoreRequestSettings(t *testing.T) { "/skipfoo": true, } { mt := mocktracer.Start() - defer mt.Reset() - r := httptest.NewRequest("GET", "http://localhost/"+path, nil) router.ServeHTTP(httptest.NewRecorder(), r) assert.Equal(t, shouldSkip, len(mt.FinishedSpans()) == 0) + mt.Stop() } } @@ -561,7 +636,7 @@ func TestServiceName(t *testing.T) { router.GET("/ping", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "gin.router") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "gin.router") c.Status(200) }) @@ -582,8 +657,7 @@ func TestServiceName(t *testing.T) { }) t.Run("global", func(t *testing.T) { - globalconfig.SetServiceName("global-service") - defer globalconfig.SetServiceName("") + testutils.SetGlobalServiceName(t, "global-service") assert := assert.New(t) mt := mocktracer.Start() @@ -594,7 +668,7 @@ func TestServiceName(t *testing.T) { router.GET("/ping", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "global-service") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "global-service") c.Status(200) }) @@ -624,7 +698,7 @@ func TestServiceName(t *testing.T) { router.GET("/ping", func(c *gin.Context) { span, ok := tracer.SpanFromContext(c.Request.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "my-service") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "my-service") c.Status(200) }) @@ -645,21 +719,29 @@ func TestServiceName(t *testing.T) { }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - mt := mocktracer.Start() - defer mt.Stop() +// TestTracerStartedMultipleTimes tests a v2 regression where the global service name was being set to an empty string +// when the tracer is started more than once. +func TestTracerStartedMultipleTimes(t *testing.T) { + tt1 := testtracer.Start(t) + defer tt1.Stop() + tt2 := testtracer.Start(t, testtracer.WithTracerStartOpts(tracer.WithService("global_service"))) + defer tt2.Stop() - mux := gin.New() - mux.Use(Middleware(serviceOverride)) - mux.GET("/200", func(c *gin.Context) { - c.Status(200) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() + router := gin.New() + router.Use(Middleware("")) + router.GET("/ping", func(c *gin.Context) { + c.Status(200) }) - namingschematest.NewHTTPServerTest(genSpans, "gin.router")(t) + + r := httptest.NewRequest("GET", "/ping", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(t, response.StatusCode, 200) + + spans := tt2.WaitForSpans(t, 1) + span := spans[0] + + assert.Equal(t, "global_service", span.Service) } diff --git a/contrib/gin-gonic/gin/go.mod b/contrib/gin-gonic/gin/go.mod new file mode 100644 index 0000000000..9eb2fa4b0e --- /dev/null +++ b/contrib/gin-gonic/gin/go.mod @@ -0,0 +1,110 @@ +module github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/gin-gonic/gin v1.10.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/bytedance/sonic v1.12.0 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/gin-gonic/gin/go.sum b/contrib/gin-gonic/gin/go.sum new file mode 100644 index 0000000000..98f0ce99d7 --- /dev/null +++ b/contrib/gin-gonic/gin/go.sum @@ -0,0 +1,352 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bytedance/sonic v1.12.0 h1:YGPgxF9xzaCNvd/ZKdQ28yRovhfMFZQjuk6fKBzZ3ls= +github.com/bytedance/sonic v1.12.0/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= +github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= diff --git a/contrib/gin-gonic/gin/option.go b/contrib/gin-gonic/gin/option.go index a32ded2fb5..edd0bc0bde 100644 --- a/contrib/gin-gonic/gin/option.go +++ b/contrib/gin-gonic/gin/option.go @@ -9,46 +9,62 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - "github.com/gin-gonic/gin" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" ) -const defaultServiceName = "gin.router" +// envServerErrorStatuses is the name of the env var used to specify error status codes on http server spans +const envServerErrorStatuses = "DD_TRACE_HTTP_SERVER_ERROR_STATUSES" type config struct { analyticsRate float64 resourceNamer func(c *gin.Context) string serviceName string ignoreRequest func(c *gin.Context) bool - headerTags *internal.LockMap + isStatusError func(statusCode int) bool + useGinErrors bool + headerTags instrumentation.HeaderTags } func newConfig(serviceName string) *config { if serviceName == "" { - serviceName = namingschema.ServiceName(defaultServiceName) - } - rate := globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GIN_ANALYTICS_ENABLED", false) { - rate = 1.0 + serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) } - return &config{ - analyticsRate: rate, + cfg := &config{ + analyticsRate: instr.AnalyticsRate(true), resourceNamer: defaultResourceNamer, serviceName: serviceName, ignoreRequest: func(_ *gin.Context) bool { return false }, - headerTags: globalconfig.HeaderTagMap(), + useGinErrors: false, + headerTags: instr.HTTPHeadersAsTags(), + } + + if fn := httptrace.GetErrorCodesFromInput(env.Get(envServerErrorStatuses)); fn != nil { + cfg.isStatusError = fn + } else { + cfg.isStatusError = isServerError } + + return cfg +} + +// Option describes options for the Gin integration. +type Option interface { + apply(*config) } -// Option specifies instrumentation configuration options. -type Option func(*config) +// OptionFn represents options applicable to Middleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -60,7 +76,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -72,26 +88,45 @@ func WithAnalyticsRate(rate float64) Option { // WithResourceNamer specifies a function which will be used to obtain a resource name for a given // gin request, using the request's context. -func WithResourceNamer(namer func(c *gin.Context) string) Option { +func WithResourceNamer(namer func(c *gin.Context) string) OptionFn { return func(cfg *config) { cfg.resourceNamer = namer } } +// WithStatusCheck specifies a function fn which reports whether the passed +// statusCode should be considered an error. +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { + return func(cfg *config) { + cfg.isStatusError = fn + } +} + +func isServerError(statusCode int) bool { + return statusCode >= 500 && statusCode < 600 +} + +// WithUseGinErrors enables the usage of gin's errors for the span instead of crafting generic errors from the status code. +// If there are multiple errors in the gin context, they will be all added to the span. +func WithUseGinErrors() OptionFn { + return func(cfg *config) { + cfg.useGinErrors = true + } +} + // WithHeaderTags enables the integration to attach HTTP request headers as span tags. // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) OptionFn { return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } // WithIgnoreRequest specifies a function to use for determining if the // incoming HTTP request tracing should be skipped. -func WithIgnoreRequest(f func(c *gin.Context) bool) Option { +func WithIgnoreRequest(f func(c *gin.Context) bool) OptionFn { return func(cfg *config) { cfg.ignoreRequest = f } diff --git a/contrib/gin-gonic/gin/orchestrion.yml b/contrib/gin-gonic/gin/orchestrion.yml new file mode 100644 index 0000000000..8b151ae135 --- /dev/null +++ b/contrib/gin-gonic/gin/orchestrion.yml @@ -0,0 +1,123 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 + description: Gin is a web framework written in Go. + +aspects: + - id: New + join-point: + one-of: + - function-call: github.com/gin-gonic/gin.Default + - function-call: github.com/gin-gonic/gin.New + advice: + - wrap-expression: + imports: + gin: github.com/gin-gonic/gin + gintrace: github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 + template: |- + func() *gin.Engine { + e := {{ . }} + e.Use(gintrace.Middleware("")) + return e + }() + + - id: gin.Context.[Must]Bind + join-point: + function-body: + one-of: + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: Bind + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: ShouldBind + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: BindJSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: ShouldBindJSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: BindTOML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: ShouldBindTOML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: BindYAML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: ShouldBindYAML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: BindXML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: ShouldBindXML + advice: + - prepend-statements: + imports: + appsec: github.com/DataDog/dd-trace-go/v2/appsec + template: |- + {{- $c := .Function.Receiver -}} + {{- $i := .Function.Argument 0 -}} + {{- $err := .Function.Result 0 -}} + defer func() { + if {{ $err }} != nil { + return + } + {{ $err }} = appsec.MonitorParsedHTTPBody({{ $c }}.Request.Context(), {{ $i }}) + }() + + - id: Response.Body + join-point: + function-body: + one-of: + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: AsciiJSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: IndentedJSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: JSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: JSONP + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: PureJSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: SecureJSON + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: XML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: YAML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: TOML + - function: + - receiver: '*github.com/gin-gonic/gin.Context' + - name: ProtoBuf + advice: + - prepend-statements: + imports: + appsec: github.com/DataDog/dd-trace-go/v2/appsec + template: |- + {{- $c := .Function.Receiver -}} + {{- $i := .Function.Argument 1 -}} + if __err__ := appsec.MonitorHTTPResponseBody({{ $c }}.Request.Context(), {{ $i }}); __err__ != nil { + // Request has been blocked by AppSec; aborting this handler right away. The AppSec + // handlers in the middleware chain will send the configured blocking response. + return + } diff --git a/contrib/globalsign/mgo/collection.go b/contrib/globalsign/mgo/collection.go index 145dfca02b..3b14eeefd3 100644 --- a/contrib/globalsign/mgo/collection.go +++ b/contrib/globalsign/mgo/collection.go @@ -6,7 +6,7 @@ package mgo import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/globalsign/mgo" "github.com/globalsign/mgo/bson" diff --git a/contrib/globalsign/mgo/example_test.go b/contrib/globalsign/mgo/example_test.go new file mode 100644 index 0000000000..e3afb2bf50 --- /dev/null +++ b/contrib/globalsign/mgo/example_test.go @@ -0,0 +1,31 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package mgo_test + +import ( + "log" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + ddmgo "github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2" +) + +func Example() { + // Ensure your tracer is started and stopped + tracer.Start() + defer tracer.Stop() + + // Start a new session + session, err := ddmgo.Dial("localhost:8080", ddmgo.WithService("serviceName")) + if err != nil { + log.Fatal(err) + } + defer session.Close() + + // Trace the session + result := struct{}{} + session.Run("ping", &result) +} diff --git a/contrib/globalsign/mgo/go.mod b/contrib/globalsign/mgo/go.mod new file mode 100644 index 0000000000..2ed58e0df8 --- /dev/null +++ b/contrib/globalsign/mgo/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/globalsign/mgo/go.sum b/contrib/globalsign/mgo/go.sum new file mode 100644 index 0000000000..3ca6e94770 --- /dev/null +++ b/contrib/globalsign/mgo/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/globalsign/mgo/mgo.go b/contrib/globalsign/mgo/mgo.go index 8d46ff6bd1..6726628b3a 100644 --- a/contrib/globalsign/mgo/mgo.go +++ b/contrib/globalsign/mgo/mgo.go @@ -3,28 +3,30 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package mgo provides functions and types which allow tracing of the MGO MongoDB client (https://github.com/globalsign/mgo) -package mgo // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/globalsign/mgo" +// Package mgo provides functions and types which allow tracing of the MGO MongoDB client (https://github.com/globalsign/mgo). +// +// Deprecated: github.com/globalsign/mgo is unmaintained, please migrate to the official MongoDB driver +// https://github.com/mongodb/mongo-go-driver. This integration will be removed in a future release. +package mgo // import "github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2" import ( "math" "net" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/globalsign/mgo" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "globalsign/mgo" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/globalsign/mgo") + instr = instrumentation.Load(instrumentation.PackageGlobalsignMgo) } // Dial opens a connection to a MongoDB server and configures it @@ -60,9 +62,9 @@ func Dial(url string, opts ...DialOption) (*Session, error) { tags: tags, } for _, fn := range opts { - fn(s.cfg) + fn.apply(s.cfg) } - log.Debug("contrib/globalsign/mgo: Dialing: %s, %#v", url, s.cfg) + instr.Logger().Debug("contrib/globalsign/mgo: Dialing: %s, %#v", url, s.cfg) return s, err } @@ -73,8 +75,8 @@ type Session struct { tags map[string]string } -func newChildSpanFromContext(cfg *mongoConfig, tags map[string]string) ddtrace.Span { - opts := []ddtrace.StartSpanOption{ +func newChildSpanFromContext(cfg *mongoConfig, tags map[string]string) *tracer.Span { + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeMongoDB), tracer.ServiceName(cfg.serviceName), tracer.ResourceName(cfg.spanName), diff --git a/contrib/globalsign/mgo/mgo_test.go b/contrib/globalsign/mgo/mgo_test.go index a983cb76f4..a6de75bcd4 100644 --- a/contrib/globalsign/mgo/mgo_test.go +++ b/contrib/globalsign/mgo/mgo_test.go @@ -11,11 +11,10 @@ import ( "os" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/globalsign/mgo" "github.com/globalsign/mgo/bson" @@ -23,6 +22,9 @@ import ( "github.com/stretchr/testify/require" ) +// this integration only supports up to mongodb:3 +const mongodb3URL = "localhost:27018" + func TestMain(m *testing.M) { _, ok := os.LookupEnv("INTEGRATION") if !ok { @@ -32,7 +34,7 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -func testMongoCollectionCommand(t *testing.T, command func(*Collection)) []mocktracer.Span { +func testMongoCollectionCommand(t *testing.T, command func(*Collection)) []*mocktracer.Span { assert := assert.New(t) mt := mocktracer.Start() @@ -45,7 +47,7 @@ func testMongoCollectionCommand(t *testing.T, command func(*Collection)) []mockt tracer.ResourceName("insert-test"), ) - session, err := Dial("localhost:27017", WithServiceName("unit-tests"), WithContext(ctx)) + session, err := Dial(mongodb3URL, WithService("unit-tests"), WithContext(ctx)) require.NoError(t, err) defer session.Close() @@ -62,6 +64,7 @@ func testMongoCollectionCommand(t *testing.T, command func(*Collection)) []mockt for _, val := range spans { if val.OperationName() == "mongodb.query" { assert.Equal("globalsign/mgo", val.Tag(ext.Component)) + assert.Equal(componentName, val.Integration()) assert.Equal("MyCollection", val.Tag(ext.MongoDBCollection)) assert.Equal("localhost", val.Tag(ext.NetworkDestinationName)) } @@ -496,7 +499,7 @@ func TestAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...DialOption) { assert := assert.New(t) - session, err := Dial("localhost:27017", opts...) + session, err := Dial(mongodb3URL, opts...) assert.NoError(err) defer session.Close() @@ -532,9 +535,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -557,36 +558,12 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []DialOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - session, err := Dial("localhost:27017", opts...) - require.NoError(t, err) - err = session. - DB("my_db"). - C("MyCollection"). - Insert(bson.D{bson.DocElem{Name: "entity", Value: bson.DocElem{Name: "index", Value: 0}}}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - namingschematest.NewMongoDBTest(genSpans, "mongodb")(t) -} - func TestIssue2165(t *testing.T) { assert := assert.New(t) insert := func(collection *Collection) { @@ -601,7 +578,7 @@ func TestIssue2165(t *testing.T) { for _, val := range spans { if val.OperationName() != "mgo-unittest" { assert.Equal("mongodb", val.Tag(ext.DBSystem)) - if err, ok := val.Tags()[ext.Error]; ok { + if err, ok := val.Tags()[ext.ErrorMsg]; ok { assert.NotNil(err) } } diff --git a/contrib/globalsign/mgo/option.go b/contrib/globalsign/mgo/option.go index ccedc2c690..ee3efc7919 100644 --- a/contrib/globalsign/mgo/option.go +++ b/contrib/globalsign/mgo/option.go @@ -9,12 +9,9 @@ import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "mongodb" - type mongoConfig struct { ctx context.Context serviceName string @@ -23,38 +20,41 @@ type mongoConfig struct { } func newConfig() *mongoConfig { - rate := math.NaN() - if internal.BoolEnv("DD_TRACE_GIN_ANALYTICS_ENABLED", false) { - rate = 1.0 - } return &mongoConfig{ - serviceName: namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName), - spanName: namingschema.OpName(namingschema.MongoDBOutbound), - ctx: context.Background(), - // analyticsRate: globalconfig.AnalyticsRate(), - analyticsRate: rate, + serviceName: instr.ServiceName(instrumentation.ComponentDefault, nil), + spanName: instr.OperationName(instrumentation.ComponentDefault, nil), + ctx: context.Background(), + analyticsRate: instr.AnalyticsRate(false), } } -// DialOption represents an option that can be passed to Dial -type DialOption func(*mongoConfig) +type DialOption interface { + apply(*mongoConfig) +} + +// DialOptionFn represents an option that can be passed to Dial +type DialOptionFn func(*mongoConfig) + +func (fn DialOptionFn) apply(cfg *mongoConfig) { + fn(cfg) +} -// WithServiceName sets the service name for a given MongoDB context. -func WithServiceName(name string) DialOption { +// WithService sets the service name for a given MongoDB context. +func WithService(name string) DialOptionFn { return func(cfg *mongoConfig) { cfg.serviceName = name } } // WithContext sets the context. -func WithContext(ctx context.Context) DialOption { +func WithContext(ctx context.Context) DialOptionFn { return func(cfg *mongoConfig) { cfg.ctx = ctx } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) DialOption { +func WithAnalytics(on bool) DialOptionFn { return func(cfg *mongoConfig) { if on { cfg.analyticsRate = 1.0 @@ -66,7 +66,7 @@ func WithAnalytics(on bool) DialOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) DialOption { +func WithAnalyticsRate(rate float64) DialOptionFn { return func(cfg *mongoConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/globalsign/mgo/pipe.go b/contrib/globalsign/mgo/pipe.go index 910fa1efc5..94d0e33a11 100644 --- a/contrib/globalsign/mgo/pipe.go +++ b/contrib/globalsign/mgo/pipe.go @@ -6,7 +6,7 @@ package mgo import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/globalsign/mgo" ) diff --git a/contrib/globalsign/mgo/query.go b/contrib/globalsign/mgo/query.go index 00b7bb6de3..3b2786bbd2 100644 --- a/contrib/globalsign/mgo/query.go +++ b/contrib/globalsign/mgo/query.go @@ -8,7 +8,7 @@ package mgo import ( "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/globalsign/mgo" ) diff --git a/contrib/go-chi/chi.v5/appsec.go b/contrib/go-chi/chi.v5/appsec.go index 4d43e67a23..a1f2489cc3 100644 --- a/contrib/go-chi/chi.v5/appsec.go +++ b/contrib/go-chi/chi.v5/appsec.go @@ -8,25 +8,36 @@ package chi import ( "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" "github.com/go-chi/chi/v5" ) -func withAppsec(next http.Handler, r *http.Request, span tracer.Span, cfg *httpsec.Config) http.Handler { +func withAppsec(next http.Handler, r *http.Request, span trace.TagSetter, cfg *config) http.Handler { rctx := chi.RouteContext(r.Context()) if rctx == nil { - return httpsec.WrapHandler(next, span, nil, cfg) + return httpsec.WrapHandler(next, span, &cfg.appsecConfig) } - var pathParams map[string]string + + cfgCopy := cfg.appsecConfig + if cfgCopy.Route == "" { + cfgCopy.Route = cfg.modifyResourceName(rctx.RoutePattern()) + } + + if cfgCopy.RouteParams == nil && len(rctx.URLParams.Keys) > 0 { + cfgCopy.RouteParams = make(map[string]string, len(rctx.URLParams.Keys)) + } + keys := rctx.URLParams.Keys values := rctx.URLParams.Values if len(keys) > 0 && len(keys) == len(values) { - pathParams = make(map[string]string, len(keys)) for i, key := range keys { - pathParams[key] = values[i] + if _, found := cfgCopy.RouteParams[key]; !found { + cfgCopy.RouteParams[key] = values[i] + } } } - return httpsec.WrapHandler(next, span, pathParams, cfg) + + return httpsec.WrapHandler(next, span, &cfgCopy) } diff --git a/contrib/go-chi/chi.v5/chi.go b/contrib/go-chi/chi.v5/chi.go index 8caddf092a..2b3f87e1a6 100644 --- a/contrib/go-chi/chi.v5/chi.go +++ b/contrib/go-chi/chi.v5/chi.go @@ -4,30 +4,28 @@ // Copyright 2016 Datadog, Inc. // Package chi provides tracing functions for tracing the go-chi/chi/v5 package (https://github.com/go-chi/chi). -package chi // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-chi/chi.v5" +package chi // import "github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2" import ( - "fmt" "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" ) const componentName = "go-chi/chi.v5" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/go-chi/chi/v5") + instr = instrumentation.Load(instrumentation.PackageChiV5) } // Middleware returns middleware that will trace incoming requests. @@ -35,9 +33,9 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { cfg := new(config) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/go-chi/chi.v5: Configuring Middleware: %#v", cfg) + instr.Logger().Debug("contrib/go-chi/chi.v5: Configuring Middleware: %#v", cfg) spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindServer)) @@ -47,28 +45,24 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { next.ServeHTTP(w, r) return } - opts := options.Copy(spanOpts...) // opts must be a copy of spanOpts, locally scoped, to avoid races. + opts := options.Expand(spanOpts, 0, 2) // opts must be a copy of spanOpts, locally scoped, to avoid races. if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } opts = append(opts, httptrace.HeaderTagsFromRequest(r, cfg.headerTags)) - span, ctx := httptrace.StartRequestSpan(r, opts...) + span, ctx, finishSpans := httptrace.StartRequestSpan(r, opts...) ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) defer func() { status := ww.Status() - var opts []tracer.FinishOption - if cfg.isStatusError(status) { - opts = []tracer.FinishOption{tracer.WithError(fmt.Errorf("%d: %s", status, http.StatusText(status)))} - } - httptrace.FinishRequestSpan(span, status, opts...) + finishSpans(status, cfg.isStatusError) }() // pass the span through the request context r = r.WithContext(ctx) next := next // avoid modifying the value of next in the outer closure scope - if appsec.Enabled() && !cfg.appsecDisabled { - next = withAppsec(next, r, span, &cfg.appsecConfig) + if instr.AppSecEnabled() && !cfg.appsecDisabled { + next = withAppsec(next, r, span, cfg) // Note that the following response writer passed to the handler // implements the `interface { Status() int }` expected by httpsec. } diff --git a/contrib/go-chi/chi.v5/chi_test.go b/contrib/go-chi/chi.v5/chi_test.go index b798d7ee6c..b35841447a 100644 --- a/contrib/go-chi/chi.v5/chi_test.go +++ b/contrib/go-chi/chi.v5/chi_test.go @@ -15,14 +15,13 @@ import ( "sync" "testing" - pappsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/go-chi/chi/v5" "github.com/stretchr/testify/assert" @@ -35,8 +34,8 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("foobar"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) }) @@ -73,6 +72,7 @@ func TestTrace200(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) assert.Equal("go-chi/chi.v5", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -82,11 +82,11 @@ func TestTrace200(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") id := chi.URLParam(r, "id") _, err := w.Write([]byte(id)) assert.NoError(err) @@ -100,11 +100,11 @@ func TestTrace200(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("foobar"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") }) assertDoRequest(assert, mt, router) }) @@ -116,7 +116,7 @@ func TestWithModifyResourceName(t *testing.T) { router := chi.NewRouter() router.Use(Middleware(WithModifyResourceName(func(r string) string { return strings.TrimSuffix(r, "/") }))) - router.Get("/user/{id}/", func(w http.ResponseWriter, r *http.Request) {}) + router.Get("/user/{id}/", func(_ http.ResponseWriter, _ *http.Request) {}) r := httptest.NewRequest("GET", "/user/123/", nil) w := httptest.NewRecorder() @@ -138,19 +138,10 @@ func TestWithModifyResourceName(t *testing.T) { } func TestError(t *testing.T) { - assertSpan := func(assert *assert.Assertions, spans []mocktracer.Span, code int) { - assert.Len(spans, 1) - if len(spans) < 1 { - t.Fatalf("no spans") - } - span := spans[0] + assertSpan := func(assert *assert.Assertions, span mocktracer.Span, code int) { assert.Equal("http.request", span.OperationName()) assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Equal(strconv.Itoa(code), span.Tag(ext.HTTPCode)) - - wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) } t.Run("default", func(t *testing.T) { @@ -160,11 +151,11 @@ func TestError(t *testing.T) { // setup router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) code := 500 // a handler with an error and make the requests - router.Get("/err", func(w http.ResponseWriter, r *http.Request) { + router.Get("/err", func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) r := httptest.NewRequest("GET", "/err", nil) @@ -176,7 +167,11 @@ func TestError(t *testing.T) { // verify the errors and status are correct spans := mt.FinishedSpans() - assertSpan(assert, spans, code) + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) }) t.Run("custom", func(t *testing.T) { @@ -187,14 +182,14 @@ func TestError(t *testing.T) { // setup router := chi.NewRouter() router.Use(Middleware( - WithServiceName("foobar"), + WithService("foobar"), WithStatusCheck(func(statusCode int) bool { return statusCode >= 400 }), )) code := 404 // a handler with an error and make the requests - router.Get("/err", func(w http.ResponseWriter, r *http.Request) { + router.Get("/err", func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) r := httptest.NewRequest("GET", "/err", nil) @@ -206,7 +201,98 @@ func TestError(t *testing.T) { // verify the errors and status are correct spans := mt.FinishedSpans() - assertSpan(assert, spans, code) + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + }) + t.Run("envvar", func(t *testing.T) { + assert := assert.New(t) + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "200") + mt := mocktracer.Start() + defer mt.Stop() + + // re-run config defaults based on new DD_TRACE_HTTP_SERVER_ERROR_STATUSES value + httptrace.ResetCfg() + + router := chi.NewRouter() + router.Use(Middleware( + WithService("foobar"))) + code := 200 + // a handler with an error and make the requests + router.Get("/err", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r := httptest.NewRequest("GET", "/err", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, code) + + spans := mt.FinishedSpans() + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + + }) + t.Run("integration overrides global", func(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500") + + // setup + router := chi.NewRouter() + router.Use(Middleware( + WithService("foobar"), + WithStatusCheck(func(statusCode int) bool { + return statusCode == 404 + }), + )) + code := 404 + // a handler with an error and make the requests + router.Get("/404", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r := httptest.NewRequest("GET", "/404", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, code) + + // verify the errors and status are correct + spans := mt.FinishedSpans() + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + + mt.Reset() + + code = 500 + router.Get("/500", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r = httptest.NewRequest("GET", "/500", nil) + w = httptest.NewRecorder() + router.ServeHTTP(w, r) + response = w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, 500) + + // verify that span does not have error tag + spans = mt.FinishedSpans() + assert.Len(spans, 1) + span = spans[0] + assertSpan(assert, *span, 500) + assert.Empty(span.Tag(ext.ErrorMsg)) }) } @@ -239,11 +325,11 @@ func TestPropagation(t *testing.T) { tracer.Inject(pspan.Context(), tracer.HTTPHeadersCarrier(r.Header)) router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("foobar"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) + assert.Equal(mocktracer.MockSpan(span).ParentID(), mocktracer.MockSpan(pspan).SpanID()) }) router.ServeHTTP(w, r) @@ -253,7 +339,7 @@ func TestAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { router := chi.NewRouter() router.Use(Middleware(opts...)) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(t, ok) }) @@ -279,9 +365,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -304,9 +388,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -320,11 +402,11 @@ func TestIgnoreRequest(t *testing.T) { }), )) - router.Get("/ok", func(w http.ResponseWriter, r *http.Request) { + router.Get("/ok", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("ok")) }) - router.Get("/skip", func(w http.ResponseWriter, r *http.Request) { + router.Get("/skip", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("skip")) }) @@ -334,34 +416,32 @@ func TestIgnoreRequest(t *testing.T) { "/skipfoo": true, } { mt := mocktracer.Start() - defer mt.Reset() - r := httptest.NewRequest("GET", "http://localhost/"+path, nil) router.ServeHTTP(httptest.NewRecorder(), r) assert.Equal(t, shouldSkip, len(mt.FinishedSpans()) == 0) + mt.Stop() } } func TestAppSec(t *testing.T) { - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) - if !appsec.Enabled() { + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } // Start and trace an HTTP server with some testing routes router := chi.NewRouter().With(Middleware()) - router.HandleFunc("/path0.0/{myPathParam0}/path0.1/{myPathParam1}/path0.2/{myPathParam2}/path0.3/*", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/path0.0/{myPathParam0}/path0.1/{myPathParam1}/path0.2/{myPathParam2}/path0.3/*", func(w http.ResponseWriter, _ *http.Request) { _, err := w.Write([]byte("Hello World!\n")) require.NoError(t, err) }) - router.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/*", func(w http.ResponseWriter, _ *http.Request) { _, err := w.Write([]byte("Hello World!\n")) require.NoError(t, err) }) router.HandleFunc("/body", func(w http.ResponseWriter, r *http.Request) { - pappsec.MonitorParsedHTTPBody(r.Context(), "$globals") + appsec.MonitorParsedHTTPBody(r.Context(), "$globals") _, err := w.Write([]byte("Hello Body!\n")) require.NoError(t, err) }) @@ -456,7 +536,7 @@ func TestWithHeaderTags(t *testing.T) { router := chi.NewRouter() router.Use(Middleware(opts...)) - router.Get("/test", func(w http.ResponseWriter, r *http.Request) { + router.Get("/test", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("test")) }) r := httptest.NewRequest("GET", "/test", nil) @@ -478,10 +558,10 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { @@ -489,76 +569,52 @@ func TestWithHeaderTags(t *testing.T) { defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + testutils.SetGlobalHeaderTags(t, "3header") - r := setupReq() + _ = setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) - }) -} -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := chi.NewRouter().With(Middleware(opts...)) - mux.HandleFunc("/200", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte("ok")) - require.NoError(t, err) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") }) - namingschematest.NewHTTPServerTest(genSpans, "chi.router")(t) } func TestCustomResourceName(t *testing.T) { @@ -567,10 +623,10 @@ func TestCustomResourceName(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("service-name"), WithResourceNamer(func(r *http.Request) string { + router.Use(Middleware(WithService("service-name"), WithResourceNamer(func(_ *http.Request) string { return "custom-resource-name" }))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) }) @@ -591,8 +647,8 @@ func TestUnknownResourceName(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("service-name"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("service-name"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) }) @@ -616,7 +672,7 @@ func TestConcurrency(t *testing.T) { expectedCap := 10 opts := make([]Option, 0, expectedCap) opts = append(opts, []Option{ - WithServiceName("foobar"), + WithService("foobar"), WithSpanOptions(tracer.Tag("tag1", "value1")), }...) expectedLen := 2 @@ -626,7 +682,7 @@ func TestConcurrency(t *testing.T) { require.True(t, cap(opts) == expectedCap) router.Use(Middleware(opts...)) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) require.True(t, ok) }) diff --git a/contrib/go-chi/chi.v5/example_test.go b/contrib/go-chi/chi.v5/example_test.go index 23fe79b76e..7adf357ef4 100644 --- a/contrib/go-chi/chi.v5/example_test.go +++ b/contrib/go-chi/chi.v5/example_test.go @@ -8,8 +8,8 @@ package chi_test import ( "net/http" - chitrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-chi/chi.v5" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + chitrace "github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/go-chi/chi/v5" ) @@ -45,7 +45,7 @@ func Example_withServiceName() { router := chi.NewRouter() // Use the tracer middleware with your desired service name. - router.Use(chitrace.Middleware(chitrace.WithServiceName("chi-server"))) + router.Use(chitrace.Middleware(chitrace.WithService("chi-server"))) // Set up some endpoints. router.Get("/", handler) diff --git a/contrib/go-chi/chi.v5/go.mod b/contrib/go-chi/chi.v5/go.mod new file mode 100644 index 0000000000..fdeb2d453d --- /dev/null +++ b/contrib/go-chi/chi.v5/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-chi/chi/v5 v5.2.2 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go-chi/chi.v5/go.sum b/contrib/go-chi/chi.v5/go.sum new file mode 100644 index 0000000000..e2b677e7bc --- /dev/null +++ b/contrib/go-chi/chi.v5/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= +github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go-chi/chi.v5/option.go b/contrib/go-chi/chi.v5/option.go index 6a67d7694a..ac42be0c9e 100644 --- a/contrib/go-chi/chi.v5/option.go +++ b/contrib/go-chi/chi.v5/option.go @@ -9,50 +9,50 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" ) -const defaultServiceName = "chi.router" - type config struct { serviceName string - spanOpts []ddtrace.StartSpanOption // additional span options to be applied + spanOpts []tracer.StartSpanOption // additional span options to be applied analyticsRate float64 isStatusError func(statusCode int) bool ignoreRequest func(r *http.Request) bool modifyResourceName func(resourceName string) string - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags resourceNamer func(r *http.Request) string appsecDisabled bool appsecConfig httpsec.Config } -// Option represents an option that can be passed to NewRouter. -type Option func(*config) +// Option describes options for the Chi.v5 integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Middleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - if internal.BoolEnv("DD_TRACE_CHI_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } - cfg.headerTags = globalconfig.HeaderTagMap() - cfg.isStatusError = isServerError + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.analyticsRate = instr.AnalyticsRate(true) + cfg.headerTags = instr.HTTPHeadersAsTags() cfg.ignoreRequest = func(_ *http.Request) bool { return false } cfg.modifyResourceName = func(s string) string { return s } // for backward compatibility with modifyResourceName, initialize resourceName as nil. cfg.resourceNamer = nil cfg.appsecDisabled = false + cfg.appsecConfig.Framework = "github.com/go-chi/chi/v5" } -// WithServiceName sets the given service name for the router. -func WithServiceName(name string) Option { +// WithService sets the given service name for the router. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } @@ -60,14 +60,14 @@ func WithServiceName(name string) Option { // WithSpanOptions applies the given set of options to the spans started // by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { return func(cfg *config) { cfg.spanOpts = opts } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -79,7 +79,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -91,26 +91,22 @@ func WithAnalyticsRate(rate float64) Option { // WithStatusCheck specifies a function fn which reports whether the passed // statusCode should be considered an error. -func WithStatusCheck(fn func(statusCode int) bool) Option { +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { return func(cfg *config) { cfg.isStatusError = fn } } -func isServerError(statusCode int) bool { - return statusCode >= 500 && statusCode < 600 -} - // WithIgnoreRequest specifies a function to use for determining if the // incoming HTTP request tracing should be skipped. -func WithIgnoreRequest(fn func(r *http.Request) bool) Option { +func WithIgnoreRequest(fn func(r *http.Request) bool) OptionFn { return func(cfg *config) { cfg.ignoreRequest = fn } } // WithModifyResourceName specifies a function to use to modify the resource name. -func WithModifyResourceName(fn func(resourceName string) string) Option { +func WithModifyResourceName(fn func(resourceName string) string) OptionFn { return func(cfg *config) { cfg.modifyResourceName = fn } @@ -120,16 +116,15 @@ func WithModifyResourceName(fn func(resourceName string) string) Option { // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) OptionFn { return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } // WithResourceNamer specifies a function to use for determining the resource // name of the span. -func WithResourceNamer(fn func(r *http.Request) string) Option { +func WithResourceNamer(fn func(r *http.Request) string) OptionFn { return func(cfg *config) { cfg.resourceNamer = fn } @@ -138,7 +133,7 @@ func WithResourceNamer(fn func(r *http.Request) string) Option { // WithNoAppsec opts this router out of AppSec management. This allows a particular router to bypass // appsec, while the rest of the application is still being monitored/managed. This has not effect // if AppSec is not enabled globally (e.g, via the DD_APPSEC_ENABLED environment variable). -func WithNoAppsec(disabled bool) Option { +func WithNoAppsec(disabled bool) OptionFn { return func(cfg *config) { cfg.appsecDisabled = disabled } @@ -149,7 +144,7 @@ func WithNoAppsec(disabled bool) Option { // default http.ResponseWriter, such as to add synchronization. Provided functions may elect to // return a copy of the http.Header map instead of a reference to the original (e.g: to not risk // breaking synchronization). This is currently only used by AppSec. -func WithResponseHeaderCopier(f func(http.ResponseWriter) http.Header) Option { +func WithResponseHeaderCopier(f func(http.ResponseWriter) http.Header) OptionFn { return func(cfg *config) { cfg.appsecConfig.ResponseHeaderCopier = f } diff --git a/contrib/go-chi/chi.v5/orchestrion.yml b/contrib/go-chi/chi.v5/orchestrion.yml new file mode 100644 index 0000000000..f3fe375370 --- /dev/null +++ b/contrib/go-chi/chi.v5/orchestrion.yml @@ -0,0 +1,33 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 + description: chi is a lightweight, idiomatic and composable router for building Go HTTP services. + +aspects: + - id: NewMux + join-point: + all-of: + - one-of: + - function-call: github.com/go-chi/chi/v5.NewMux + - function-call: github.com/go-chi/chi/v5.NewRouter + # No instrumenting github.com/go-chi/chi/v5 as this causes a circular dependency. + - not: + one-of: + - import-path: github.com/go-chi/chi/v5 + - import-path: github.com/go-chi/chi/v5/middleware + advice: + - wrap-expression: + imports: + chi: github.com/go-chi/chi/v5 + chitrace: github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 + template: |- + func() *chi.Mux { + mux := {{ . }} + mux.Use(chitrace.Middleware()) + return mux + }() diff --git a/contrib/go-chi/chi/appsec.go b/contrib/go-chi/chi/appsec.go index 066b6b176f..a1c484cfb3 100644 --- a/contrib/go-chi/chi/appsec.go +++ b/contrib/go-chi/chi/appsec.go @@ -8,16 +8,18 @@ package chi import ( "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" "github.com/go-chi/chi" ) -func withAppsec(next http.Handler, r *http.Request, span tracer.Span) http.Handler { +func withAppsec(next http.Handler, r *http.Request, span trace.TagSetter) http.Handler { rctx := chi.RouteContext(r.Context()) if rctx == nil { - return httpsec.WrapHandler(next, span, nil, nil) + return httpsec.WrapHandler(next, span, &httpsec.Config{ + Framework: "github.com/go-chi/chi", + }) } var pathParams map[string]string keys := rctx.URLParams.Keys @@ -28,5 +30,10 @@ func withAppsec(next http.Handler, r *http.Request, span tracer.Span) http.Handl pathParams[key] = values[i] } } - return httpsec.WrapHandler(next, span, pathParams, nil) + + return httpsec.WrapHandler(next, span, &httpsec.Config{ + Framework: "github.com/go-chi/chi", + Route: rctx.RoutePattern(), + RouteParams: pathParams, + }) } diff --git a/contrib/go-chi/chi/chi.go b/contrib/go-chi/chi/chi.go index 370bf06cd2..35a27e2995 100644 --- a/contrib/go-chi/chi/chi.go +++ b/contrib/go-chi/chi/chi.go @@ -4,20 +4,17 @@ // Copyright 2016 Datadog, Inc. // Package chi provides tracing functions for tracing the go-chi/chi package (https://github.com/go-chi/chi). -package chi // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-chi/chi" +package chi // import "github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2" import ( - "fmt" "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/go-chi/chi" "github.com/go-chi/chi/middleware" @@ -25,9 +22,10 @@ import ( const componentName = "go-chi/chi" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/go-chi/chi") + instr = instrumentation.Load(instrumentation.PackageChi) } // Middleware returns middleware that will trace incoming requests. @@ -35,9 +33,9 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { cfg := new(config) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/go-chi/chi: Configuring Middleware: %#v", cfg) + instr.Logger().Debug("contrib/go-chi/chi: Configuring Middleware: %#v", cfg) spanOpts := append(cfg.spanOpts, tracer.ServiceName(cfg.serviceName), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindServer)) @@ -47,27 +45,23 @@ func Middleware(opts ...Option) func(next http.Handler) http.Handler { next.ServeHTTP(w, r) return } - opts := options.Copy(spanOpts...) // opts must be a copy of spanOpts, locally scoped, to avoid races. + opts := options.Expand(spanOpts, 0, 2) // opts must be a copy of spanOpts, locally scoped, to avoid races. if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } opts = append(opts, httptrace.HeaderTagsFromRequest(r, cfg.headerTags)) - span, ctx := httptrace.StartRequestSpan(r, opts...) + span, ctx, finishSpans := httptrace.StartRequestSpan(r, opts...) ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor) defer func() { status := ww.Status() - var opts []tracer.FinishOption - if cfg.isStatusError(status) { - opts = []tracer.FinishOption{tracer.WithError(fmt.Errorf("%d: %s", status, http.StatusText(status)))} - } - httptrace.FinishRequestSpan(span, status, opts...) + finishSpans(status, cfg.isStatusError) }() // pass the span through the request context r = r.WithContext(ctx) next := next // avoid modifying the value of next in the outer closure scope - if appsec.Enabled() { + if instr.AppSecEnabled() { next = withAppsec(next, r, span) // Note that the following response writer passed to the handler // implements the `interface { Status() int }` expected by httpsec. diff --git a/contrib/go-chi/chi/chi_test.go b/contrib/go-chi/chi/chi_test.go index 41c9d1c47c..8485b588d1 100644 --- a/contrib/go-chi/chi/chi_test.go +++ b/contrib/go-chi/chi/chi_test.go @@ -14,14 +14,13 @@ import ( "strings" "testing" - pappsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/go-chi/chi" "github.com/stretchr/testify/assert" @@ -34,8 +33,8 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("foobar"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) }) @@ -72,6 +71,7 @@ func TestTrace200(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) assert.Equal("go-chi/chi", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -81,11 +81,11 @@ func TestTrace200(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") id := chi.URLParam(r, "id") _, err := w.Write([]byte(id)) assert.NoError(err) @@ -99,30 +99,21 @@ func TestTrace200(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("foobar"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") }) assertDoRequest(assert, mt, router) }) } func TestError(t *testing.T) { - assertSpan := func(assert *assert.Assertions, spans []mocktracer.Span, code int) { - assert.Len(spans, 1) - if len(spans) < 1 { - t.Fatalf("no spans") - } - span := spans[0] + assertSpan := func(assert *assert.Assertions, span mocktracer.Span, code int) { assert.Equal("http.request", span.OperationName()) assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Equal(strconv.Itoa(code), span.Tag(ext.HTTPCode)) - - wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) } t.Run("default", func(t *testing.T) { @@ -132,11 +123,11 @@ func TestError(t *testing.T) { // setup router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) code := 500 // a handler with an error and make the requests - router.Get("/err", func(w http.ResponseWriter, r *http.Request) { + router.Get("/err", func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) r := httptest.NewRequest("GET", "/err", nil) @@ -148,7 +139,11 @@ func TestError(t *testing.T) { // verify the errors and status are correct spans := mt.FinishedSpans() - assertSpan(assert, spans, code) + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) }) t.Run("custom", func(t *testing.T) { @@ -159,14 +154,14 @@ func TestError(t *testing.T) { // setup router := chi.NewRouter() router.Use(Middleware( - WithServiceName("foobar"), + WithService("foobar"), WithStatusCheck(func(statusCode int) bool { return statusCode >= 400 }), )) code := 404 // a handler with an error and make the requests - router.Get("/err", func(w http.ResponseWriter, r *http.Request) { + router.Get("/err", func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) r := httptest.NewRequest("GET", "/err", nil) @@ -178,7 +173,97 @@ func TestError(t *testing.T) { // verify the errors and status are correct spans := mt.FinishedSpans() - assertSpan(assert, spans, code) + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + }) + t.Run("envvar", func(t *testing.T) { + assert := assert.New(t) + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "200") + mt := mocktracer.Start() + defer mt.Stop() + + // re-run config defaults based on new DD_TRACE_HTTP_SERVER_ERROR_STATUSES value + httptrace.ResetCfg() + + router := chi.NewRouter() + router.Use(Middleware( + WithService("foobar"))) + code := 200 + // a handler with an error and make the requests + router.Get("/err", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r := httptest.NewRequest("GET", "/err", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, code) + + spans := mt.FinishedSpans() + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + }) + t.Run("integration overrides global", func(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500") + + // setup + router := chi.NewRouter() + router.Use(Middleware( + WithService("foobar"), + WithStatusCheck(func(statusCode int) bool { + return statusCode == 404 + }), + )) + code := 404 + // a handler with an error and make the requests + router.Get("/404", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r := httptest.NewRequest("GET", "/404", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, code) + + // verify the errors and status are correct + spans := mt.FinishedSpans() + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, *span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + + mt.Reset() + + code = 500 + router.Get("/500", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r = httptest.NewRequest("GET", "/500", nil) + w = httptest.NewRecorder() + router.ServeHTTP(w, r) + response = w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, 500) + + // verify that span does not have error tag + spans = mt.FinishedSpans() + assert.Len(spans, 1) + span = spans[0] + assertSpan(assert, *span, 500) + assert.Empty(span.Tag(ext.ErrorMsg)) }) } @@ -187,7 +272,7 @@ func TestWithHeaderTags(t *testing.T) { router := chi.NewRouter() router.Use(Middleware(opts...)) - router.Get("/test", func(w http.ResponseWriter, r *http.Request) { + router.Get("/test", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("test")) }) r := httptest.NewRequest("GET", "/test", nil) @@ -209,10 +294,10 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { @@ -220,53 +305,51 @@ func TestWithHeaderTags(t *testing.T) { defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + testutils.SetGlobalHeaderTags(t, "3header") - r := setupReq() + _ = setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") }) } @@ -299,11 +382,11 @@ func TestPropagation(t *testing.T) { tracer.Inject(pspan.Context(), tracer.HTTPHeadersCarrier(r.Header)) router := chi.NewRouter() - router.Use(Middleware(WithServiceName("foobar"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("foobar"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) + assert.Equal(mocktracer.MockSpan(span).ParentID(), mocktracer.MockSpan(pspan).SpanID()) }) router.ServeHTTP(w, r) @@ -313,7 +396,7 @@ func TestAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { router := chi.NewRouter() router.Use(Middleware(opts...)) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(t, ok) }) @@ -339,9 +422,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -364,9 +445,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -380,11 +459,11 @@ func TestIgnoreRequest(t *testing.T) { }), )) - router.Get("/ok", func(w http.ResponseWriter, r *http.Request) { + router.Get("/ok", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("ok")) }) - router.Get("/skip", func(w http.ResponseWriter, r *http.Request) { + router.Get("/skip", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("skip")) }) @@ -394,34 +473,32 @@ func TestIgnoreRequest(t *testing.T) { "/skipfoo": true, } { mt := mocktracer.Start() - defer mt.Reset() - r := httptest.NewRequest("GET", "http://localhost/"+path, nil) router.ServeHTTP(httptest.NewRecorder(), r) assert.Equal(t, shouldSkip, len(mt.FinishedSpans()) == 0) + mt.Stop() } } func TestAppSec(t *testing.T) { - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) - if !appsec.Enabled() { + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } // Start and trace an HTTP server with some testing routes router := chi.NewRouter().With(Middleware()) - router.HandleFunc("/path0.0/{myPathParam0}/path0.1/{myPathParam1}/path0.2/{myPathParam2}/path0.3/*", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/path0.0/{myPathParam0}/path0.1/{myPathParam1}/path0.2/{myPathParam2}/path0.3/*", func(w http.ResponseWriter, _ *http.Request) { _, err := w.Write([]byte("Hello World!\n")) require.NoError(t, err) }) - router.HandleFunc("/*", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/*", func(w http.ResponseWriter, _ *http.Request) { _, err := w.Write([]byte("Hello World!\n")) require.NoError(t, err) }) router.HandleFunc("/body", func(w http.ResponseWriter, r *http.Request) { - pappsec.MonitorParsedHTTPBody(r.Context(), "$globals") + appsec.MonitorParsedHTTPBody(r.Context(), "$globals") _, err := w.Write([]byte("Hello Body!\n")) require.NoError(t, err) }) @@ -511,39 +588,16 @@ func TestAppSec(t *testing.T) { }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := chi.NewRouter().With(Middleware(opts...)) - mux.HandleFunc("/200", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte("ok")) - require.NoError(t, err) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "chi.router")(t) -} - func TestCustomResourceName(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("service-name"), WithResourceNamer(func(r *http.Request) string { + router.Use(Middleware(WithService("service-name"), WithResourceNamer(func(_ *http.Request) string { return "custom-resource-name" }))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) }) @@ -564,8 +618,8 @@ func TestUnknownResourceName(t *testing.T) { defer mt.Stop() router := chi.NewRouter() - router.Use(Middleware(WithServiceName("service-name"))) - router.Get("/user/{id}", func(w http.ResponseWriter, r *http.Request) { + router.Use(Middleware(WithService("service-name"))) + router.Get("/user/{id}", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) }) diff --git a/contrib/go-chi/chi/example_test.go b/contrib/go-chi/chi/example_test.go index 325a0f7c5f..1e5ca1fbf4 100644 --- a/contrib/go-chi/chi/example_test.go +++ b/contrib/go-chi/chi/example_test.go @@ -8,8 +8,8 @@ package chi_test import ( "net/http" - chitrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-chi/chi" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + chitrace "github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/go-chi/chi" ) @@ -45,7 +45,7 @@ func Example_withServiceName() { router := chi.NewRouter() // Use the tracer middleware with your desired service name. - router.Use(chitrace.Middleware(chitrace.WithServiceName("chi-server"))) + router.Use(chitrace.Middleware(chitrace.WithService("chi-server"))) // Set up some endpoints. router.Get("/", handler) diff --git a/contrib/go-chi/chi/go.mod b/contrib/go-chi/chi/go.mod new file mode 100644 index 0000000000..1a4feca7a9 --- /dev/null +++ b/contrib/go-chi/chi/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-chi/chi v1.5.4 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go-chi/chi/go.sum b/contrib/go-chi/chi/go.sum new file mode 100644 index 0000000000..2b614d29b0 --- /dev/null +++ b/contrib/go-chi/chi/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= +github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go-chi/chi/option.go b/contrib/go-chi/chi/option.go index b78ca8f87c..1b4450a327 100644 --- a/contrib/go-chi/chi/option.go +++ b/contrib/go-chi/chi/option.go @@ -9,39 +9,38 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/go-chi/chi" ) -const defaultServiceName = "chi.router" - type config struct { serviceName string - spanOpts []ddtrace.StartSpanOption // additional span options to be applied + spanOpts []tracer.StartSpanOption // additional span options to be applied analyticsRate float64 isStatusError func(statusCode int) bool ignoreRequest func(r *http.Request) bool resourceNamer func(r *http.Request) string - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags +} + +// Option describes options for the Chi integration. +type Option interface { + apply(*config) } -// Option represents an option that can be passed to NewRouter. -type Option func(*config) +// OptionFn represents options applicable to Middleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - if internal.BoolEnv("DD_TRACE_CHI_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } - cfg.headerTags = globalconfig.HeaderTagMap() - cfg.isStatusError = isServerError + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.analyticsRate = instr.AnalyticsRate(true) + cfg.headerTags = instr.HTTPHeadersAsTags() cfg.ignoreRequest = func(_ *http.Request) bool { return false } cfg.resourceNamer = func(r *http.Request) string { resourceName := chi.RouteContext(r.Context()).RoutePattern() @@ -53,8 +52,8 @@ func defaults(cfg *config) { } } -// WithServiceName sets the given service name for the router. -func WithServiceName(name string) Option { +// WithService sets the given service name for the router. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } @@ -62,14 +61,14 @@ func WithServiceName(name string) Option { // WithSpanOptions applies the given set of options to the spans started // by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { return func(cfg *config) { cfg.spanOpts = opts } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -81,7 +80,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -93,30 +92,25 @@ func WithAnalyticsRate(rate float64) Option { // WithStatusCheck specifies a function fn which reports whether the passed // statusCode should be considered an error. -func WithStatusCheck(fn func(statusCode int) bool) Option { +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { return func(cfg *config) { cfg.isStatusError = fn } } -func isServerError(statusCode int) bool { - return statusCode >= 500 && statusCode < 600 -} - // WithHeaderTags enables the integration to attach HTTP request headers as span tags. // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) OptionFn { return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } // WithIgnoreRequest specifies a function to use for determining if the // incoming HTTP request tracing should be skipped. -func WithIgnoreRequest(fn func(r *http.Request) bool) Option { +func WithIgnoreRequest(fn func(r *http.Request) bool) OptionFn { return func(cfg *config) { cfg.ignoreRequest = fn } @@ -124,7 +118,7 @@ func WithIgnoreRequest(fn func(r *http.Request) bool) Option { // WithResourceNamer specifies a function to use for determining the resource // name of the span. -func WithResourceNamer(fn func(r *http.Request) string) Option { +func WithResourceNamer(fn func(r *http.Request) string) OptionFn { return func(cfg *config) { cfg.resourceNamer = fn } diff --git a/contrib/go-chi/chi/orchestrion.yml b/contrib/go-chi/chi/orchestrion.yml new file mode 100644 index 0000000000..c883c0315c --- /dev/null +++ b/contrib/go-chi/chi/orchestrion.yml @@ -0,0 +1,33 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 + description: chi is a lightweight, idiomatic and composable router for building Go HTTP services. + +aspects: + - id: NewMux + join-point: + all-of: + - one-of: + - function-call: github.com/go-chi/chi.NewMux + - function-call: github.com/go-chi/chi.NewRouter + # No instrumenting github.com/go-chi/chi as this causes a circular dependency. + - not: + one-of: + - import-path: github.com/go-chi/chi + - import-path: github.com/go-chi/chi/middleware + advice: + - wrap-expression: + imports: + chi: github.com/go-chi/chi + chitrace: github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 + template: |- + func() *chi.Mux { + mux := {{ . }} + mux.Use(chitrace.Middleware()) + return mux + }() diff --git a/contrib/go-pg/pg.v10/example_test.go b/contrib/go-pg/pg.v10/example_test.go index da840bc5b4..45fd65b804 100644 --- a/contrib/go-pg/pg.v10/example_test.go +++ b/contrib/go-pg/pg.v10/example_test.go @@ -8,12 +8,16 @@ package pg_test import ( "log" - pgtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-pg/pg.v10" - "github.com/go-pg/pg/v10" + + pgtrace "github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func Example() { + tracer.Start() + defer tracer.Stop() + conn := pg.Connect(&pg.Options{ User: "go-pg-test", Database: "datadog", diff --git a/contrib/go-pg/pg.v10/go.mod b/contrib/go-pg/pg.v10/go.mod new file mode 100644 index 0000000000..9a676abe38 --- /dev/null +++ b/contrib/go-pg/pg.v10/go.mod @@ -0,0 +1,105 @@ +module github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-pg/pg/v10 v10.15.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-pg/zerochecker v0.2.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.36.2 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/vmihailenco/bufpool v0.1.11 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser v0.1.2 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + mellium.im/sasl v0.3.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go-pg/pg.v10/go.sum b/contrib/go-pg/pg.v10/go.sum new file mode 100644 index 0000000000..fb1efce867 --- /dev/null +++ b/contrib/go-pg/pg.v10/go.sum @@ -0,0 +1,380 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-pg/pg/v10 v10.15.0 h1:6DQwbaxJz/e4wvgzbxBkBLiL/Uuk87MGgHhkURtzx24= +github.com/go-pg/pg/v10 v10.15.0/go.mod h1:FIn/x04hahOf9ywQ1p68rXqaDVbTRLYlu4MQR0lhoB8= +github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU= +github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= +github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94= +github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= +mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= diff --git a/contrib/go-pg/pg.v10/option.go b/contrib/go-pg/pg.v10/option.go index a39a691e3f..d83c8353e1 100644 --- a/contrib/go-pg/pg.v10/option.go +++ b/contrib/go-pg/pg.v10/option.go @@ -8,41 +8,42 @@ package pg import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) type config struct { serviceName string + operationName string analyticsRate float64 } -// Option represents an option that can be used to create or wrap a client. -type Option func(*config) +// Option describes options for the go-pg integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Wrap. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - service := "gopg.db" - if svc := globalconfig.ServiceName(); svc != "" { - service = svc - } - cfg.serviceName = service - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GOPG_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.operationName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) Option { +// WithService sets the given service name for the client. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -54,7 +55,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/go-pg/pg.v10/pg_go.go b/contrib/go-pg/pg.v10/pg_go.go index 7f95f14a5e..e2e3b023f6 100644 --- a/contrib/go-pg/pg.v10/pg_go.go +++ b/contrib/go-pg/pg.v10/pg_go.go @@ -9,20 +9,19 @@ import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "github.com/go-pg/pg/v10" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const componentName = "go-pg/pg.v10" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/go-pg/pg/v10") + instr = instrumentation.Load(instrumentation.PackageGoPGV10) } // Wrap augments the given DB with tracing. @@ -30,9 +29,9 @@ func Wrap(db *pg.DB, opts ...Option) { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/go-pg/pg.v10: Wrapping Database") + instr.Logger().Debug("contrib/go-pg/pg.v10: Wrapping Database") db.AddQueryHook(&queryHook{cfg: cfg}) } @@ -47,7 +46,7 @@ func (h *queryHook) BeforeQuery(ctx context.Context, qe *pg.QueryEvent) (context query = []byte("unknown") } - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeSQL), tracer.ResourceName(string(query)), tracer.ServiceName(h.cfg.serviceName), @@ -57,7 +56,7 @@ func (h *queryHook) BeforeQuery(ctx context.Context, qe *pg.QueryEvent) (context if !math.IsNaN(h.cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, h.cfg.analyticsRate)) } - _, ctx = tracer.StartSpanFromContext(ctx, "go-pg", opts...) + _, ctx = tracer.StartSpanFromContext(ctx, h.cfg.operationName, opts...) return ctx, qe.Err } diff --git a/contrib/go-pg/pg.v10/pg_go_test.go b/contrib/go-pg/pg.v10/pg_go_test.go index 5f7a212af6..cd351f3887 100644 --- a/contrib/go-pg/pg.v10/pg_go_test.go +++ b/contrib/go-pg/pg.v10/pg_go_test.go @@ -11,10 +11,10 @@ import ( "os" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/go-pg/pg/v10" "github.com/stretchr/testify/assert" @@ -68,6 +68,7 @@ func TestSelect(t *testing.T) { assert.Equal("go-pg", spans[0].OperationName()) assert.Equal("http.request", spans[1].OperationName()) assert.Equal("go-pg/pg.v10", spans[0].Tag(ext.Component)) + assert.Equal(componentName, spans[0].Integration()) assert.Equal("postgresql", spans[0].Tag(ext.DBSystem)) } @@ -108,12 +109,12 @@ func TestServiceName(t *testing.T) { assert.Equal("gopg.db", spans[0].Tag(ext.ServiceName)) assert.Equal("fake-http-server", spans[1].Tag(ext.ServiceName)) assert.Equal("go-pg/pg.v10", spans[0].Tag(ext.Component)) + assert.Equal(componentName, spans[0].Integration()) assert.Equal("postgresql", spans[0].Tag(ext.DBSystem)) }) t.Run("global", func(t *testing.T) { - globalconfig.SetServiceName("global-service") - defer globalconfig.SetServiceName("") + testutils.SetGlobalServiceName(t, "global-service") assert := assert.New(t) mt := mocktracer.Start() @@ -150,6 +151,7 @@ func TestServiceName(t *testing.T) { assert.Equal("global-service", spans[0].Tag(ext.ServiceName)) assert.Equal("fake-http-server", spans[1].Tag(ext.ServiceName)) assert.Equal("go-pg/pg.v10", spans[0].Tag(ext.Component)) + assert.Equal(componentName, spans[0].Integration()) assert.Equal("postgresql", spans[0].Tag(ext.DBSystem)) }) @@ -164,7 +166,7 @@ func TestServiceName(t *testing.T) { Database: "postgres", }) - Wrap(conn, WithServiceName("my-service-name")) + Wrap(conn, WithService("my-service-name")) parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", tracer.ServiceName("fake-http-server"), @@ -189,6 +191,7 @@ func TestServiceName(t *testing.T) { assert.Equal("my-service-name", spans[0].Tag(ext.ServiceName)) assert.Equal("fake-http-server", spans[1].Tag(ext.ServiceName)) assert.Equal("go-pg/pg.v10", spans[0].Tag(ext.Component)) + assert.Equal(componentName, spans[0].Integration()) assert.Equal("postgresql", spans[0].Tag(ext.DBSystem)) }) } @@ -232,9 +235,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -257,9 +258,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) diff --git a/contrib/go-redis/redis.v7/example_test.go b/contrib/go-redis/redis.v7/example_test.go index 0d4dc834e4..ec03cf7a21 100644 --- a/contrib/go-redis/redis.v7/example_test.go +++ b/contrib/go-redis/redis.v7/example_test.go @@ -9,9 +9,9 @@ import ( "context" "time" - redistrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis.v7" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + redistrace "github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/go-redis/redis/v7" ) @@ -19,6 +19,9 @@ import ( // To start tracing Redis, simply create a new client using the library and continue // using as you normally would. func Example() { + tracer.Start() + defer tracer.Stop() + // create a new Client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} c := redistrace.NewClient(opts) @@ -44,9 +47,12 @@ func Example() { // You can also trace Redis Pipelines. Simply use as usual and the traces will be // automatically picked up by the underlying implementation. func Example_pipeliner() { + tracer.Start() + defer tracer.Stop() + // create a client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} - c := redistrace.NewClient(opts, redistrace.WithServiceName("my-redis-service")) + c := redistrace.NewClient(opts, redistrace.WithService("my-redis-service")) // open the pipeline pipe := c.Pipeline() diff --git a/contrib/go-redis/redis.v7/go.mod b/contrib/go-redis/redis.v7/go.mod new file mode 100644 index 0000000000..4c768384a5 --- /dev/null +++ b/contrib/go-redis/redis.v7/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-redis/redis/v7 v7.4.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.36.2 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go-redis/redis.v7/go.sum b/contrib/go-redis/redis.v7/go.sum new file mode 100644 index 0000000000..e6ab810847 --- /dev/null +++ b/contrib/go-redis/redis.v7/go.sum @@ -0,0 +1,373 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go-redis/redis.v7/option.go b/contrib/go-redis/redis.v7/option.go index 1f405aa8c3..d2c841aea7 100644 --- a/contrib/go-redis/redis.v7/option.go +++ b/contrib/go-redis/redis.v7/option.go @@ -8,12 +8,9 @@ package redis import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "redis.client" - type clientConfig struct { serviceName string spanName string @@ -21,30 +18,34 @@ type clientConfig struct { errCheck func(error) bool } -// ClientOption represents an option that can be used to create or wrap a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Redis integration. +type ClientOption interface { + apply(*clientConfig) +} + +// ClientOptionFn represents options applicable to NewClient and WrapClient. +type ClientOptionFn func(*clientConfig) + +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.RedisOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_REDIS_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) cfg.errCheck = func(error) bool { return true } } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -56,7 +57,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -68,7 +69,7 @@ func WithAnalyticsRate(rate float64) ClientOption { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. -func WithErrorCheck(fn func(err error) bool) ClientOption { +func WithErrorCheck(fn func(err error) bool) ClientOptionFn { return func(cfg *clientConfig) { cfg.errCheck = fn } diff --git a/contrib/go-redis/redis.v7/orchestrion.yml b/contrib/go-redis/redis.v7/orchestrion.yml new file mode 100644 index 0000000000..73da6c1479 --- /dev/null +++ b/contrib/go-redis/redis.v7/orchestrion.yml @@ -0,0 +1,27 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 + description: Redis client for Go. + +aspects: + - id: NewClient + join-point: + one-of: + - function-call: github.com/go-redis/redis/v7.NewClient + - function-call: github.com/go-redis/redis/v7.NewFailoverClient + advice: + - wrap-expression: + imports: + redis: github.com/go-redis/redis/v7 + trace: github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 + template: |- + func() (client *redis.Client) { + client = {{ . }} + trace.WrapClient(client) + return + }() diff --git a/contrib/go-redis/redis.v7/redis.go b/contrib/go-redis/redis.v7/redis.go index 5376ae5e9c..bba67ca521 100644 --- a/contrib/go-redis/redis.v7/redis.go +++ b/contrib/go-redis/redis.v7/redis.go @@ -15,19 +15,19 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/go-redis/redis/v7" ) const componentName = "go-redis/redis.v7" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/go-redis/redis/v7") + instr = instrumentation.Load(instrumentation.PackageGoRedisV7) } type datadogHook struct { @@ -37,7 +37,7 @@ type datadogHook struct { // params holds the tracer and a set of parameters which are recorded with every trace. type params struct { config *clientConfig - additionalTags []ddtrace.StartSpanOption + additionalTags []tracer.StartSpanOption } // NewClient returns a new Client that is traced with the default tracer under @@ -54,7 +54,7 @@ func WrapClient(client redis.UniversalClient, opts ...ClientOption) { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } hookParams := ¶ms{ @@ -73,13 +73,13 @@ type clusterOptions interface { Options() *redis.ClusterOptions } -func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOption { - additionalTags := []ddtrace.StartSpanOption{} +func additionalTagOptions(client redis.UniversalClient) []tracer.StartSpanOption { + additionalTags := []tracer.StartSpanOption{} if clientOptions, ok := client.(clientOptions); ok { opt := clientOptions.Options() if opt.Addr == "FailoverClient" { - additionalTags = []ddtrace.StartSpanOption{ - tracer.Tag("out.db", strconv.Itoa(opt.DB)), + additionalTags = []tracer.StartSpanOption{ + tracer.Tag(ext.TargetDB, strconv.Itoa(opt.DB)), tracer.Tag(ext.RedisDatabaseIndex, opt.DB), } } else { @@ -88,10 +88,10 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio host = opt.Addr port = "6379" } - additionalTags = []ddtrace.StartSpanOption{ + additionalTags = []tracer.StartSpanOption{ tracer.Tag(ext.TargetHost, host), tracer.Tag(ext.TargetPort, port), - tracer.Tag("out.db", strconv.Itoa(opt.DB)), + tracer.Tag(ext.TargetDB, strconv.Itoa(opt.DB)), tracer.Tag(ext.RedisDatabaseIndex, opt.DB), } } @@ -100,7 +100,7 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio for _, addr := range clientOptions.Options().Addrs { addrs = append(addrs, addr) } - additionalTags = []ddtrace.StartSpanOption{ + additionalTags = []tracer.StartSpanOption{ tracer.Tag("addrs", strings.Join(addrs, ", ")), } } @@ -112,7 +112,7 @@ func (ddh *datadogHook) BeforeProcess(ctx context.Context, cmd redis.Cmder) (con parts := strings.Split(raw, " ") length := len(parts) - 1 p := ddh.params - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), tracer.ResourceName(parts[0]), @@ -131,9 +131,9 @@ func (ddh *datadogHook) BeforeProcess(ctx context.Context, cmd redis.Cmder) (con } func (ddh *datadogHook) AfterProcess(ctx context.Context, cmd redis.Cmder) error { - var span tracer.Span + var span *tracer.Span span, _ = tracer.SpanFromContext(ctx) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption errRedis := cmd.Err() if errRedis != redis.Nil && ddh.config.errCheck(errRedis) { finishOpts = append(finishOpts, tracer.WithError(errRedis)) @@ -147,7 +147,7 @@ func (ddh *datadogHook) BeforeProcessPipeline(ctx context.Context, cmds []redis. parts := strings.Split(raw, " ") length := len(parts) - 1 p := ddh.params - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), tracer.ResourceName(parts[0]), @@ -168,9 +168,9 @@ func (ddh *datadogHook) BeforeProcessPipeline(ctx context.Context, cmds []redis. } func (ddh *datadogHook) AfterProcessPipeline(ctx context.Context, cmds []redis.Cmder) error { - var span tracer.Span + var span *tracer.Span span, _ = tracer.SpanFromContext(ctx) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption for _, cmd := range cmds { errCmd := cmd.Err() if errCmd != redis.Nil && ddh.config.errCheck(errCmd) { diff --git a/contrib/go-redis/redis.v7/redis_test.go b/contrib/go-redis/redis.v7/redis_test.go index 83823a8069..54436a1c5c 100644 --- a/contrib/go-redis/redis.v7/redis_test.go +++ b/contrib/go-redis/redis.v7/redis_test.go @@ -13,12 +13,10 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/go-redis/redis/v7" "github.com/stretchr/testify/assert" @@ -45,7 +43,7 @@ func TestClientEvalSha(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) sha1 := client.ScriptLoad("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}").Val() mt.Reset() @@ -63,10 +61,11 @@ func TestClientEvalSha(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("evalsha", span.Tag(ext.ResourceName)) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } func TestClient(t *testing.T) { @@ -75,7 +74,7 @@ func TestClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set("test_key", "test_value", 0) spans := mt.FinishedSpans() @@ -90,10 +89,11 @@ func TestClient(t *testing.T) { assert.Equal("set test_key test_value: ", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("15", span.Tag("out.db")) - assert.Equal(15, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(15), span.Tag(ext.RedisDatabaseIndex)) } func TestWrapClient(t *testing.T) { @@ -105,7 +105,10 @@ func TestWrapClient(t *testing.T) { Addrs: []string{ "127.0.0.1:6379", "127.0.0.2:6379", - }} + }, + DialTimeout: 500 * time.Millisecond, + MaxRetries: 1, + } failoverClient := redis.NewUniversalClient(failoverClientOpts) clusterClientOpts := &redis.UniversalOptions{ @@ -113,7 +116,9 @@ func TestWrapClient(t *testing.T) { "127.0.0.1:6379", "127.0.0.2:6379", }, - DialTimeout: 1} + DialTimeout: 500 * time.Millisecond, + MaxRetries: 1, + } clusterClient := redis.NewUniversalClient(clusterClientOpts) testCases := []struct { @@ -139,7 +144,7 @@ func TestWrapClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - WrapClient(tc.client, WithServiceName("my-redis")) + WrapClient(tc.client, WithService("my-redis")) tc.client.Set("test_key", "test_value", 0) spans := mt.FinishedSpans() @@ -152,6 +157,7 @@ func TestWrapClient(t *testing.T) { assert.Equal("set test_key test_value: ", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -162,7 +168,7 @@ func TestAdditionalTagsFromClient(t *testing.T) { t.Run("simple-client", func(t *testing.T) { simpleClientOpts := &redis.UniversalOptions{Addrs: []string{"127.0.0.1:6379"}} simpleClient := redis.NewUniversalClient(simpleClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "out.db": "0", "out.host": "127.0.0.1", @@ -185,7 +191,7 @@ func TestAdditionalTagsFromClient(t *testing.T) { "127.0.0.2:6379", }} failoverClient := redis.NewUniversalClient(failoverClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "out.db": "0", "db.redis.database_index": 0, @@ -206,7 +212,7 @@ func TestAdditionalTagsFromClient(t *testing.T) { }, DialTimeout: 1} clusterClient := redis.NewUniversalClient(clusterClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "addrs": "127.0.0.1:6379, 127.0.0.2:6379", } @@ -225,7 +231,7 @@ func TestPipeline(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) pipeline := client.Pipeline() pipeline.Expire("pipeline_counter", time.Hour) @@ -244,10 +250,11 @@ func TestPipeline(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("1", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) mt.Reset() pipeline.Expire("pipeline_counter", time.Hour) @@ -266,10 +273,11 @@ func TestPipeline(t *testing.T) { assert.Equal("expire pipeline_counter 3600: false\nexpire pipeline_counter_1 60: false\n", span.Tag(ext.ResourceName)) assert.Equal("2", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } func TestChildSpan(t *testing.T) { @@ -279,7 +287,7 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() // Parent span - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.span") client = client.WithContext(ctx) client.Set("test_key", "test_value", 0) @@ -288,7 +296,7 @@ func TestChildSpan(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var child, parent mocktracer.Span + var child, parent *mocktracer.Span for _, s := range spans { // order of traces in buffer is not guaranteed switch s.OperationName() { @@ -311,7 +319,7 @@ func TestMultipleCommands(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set("test_key", "test_value", 0) client.Get("test_key") client.Incr("int_key") @@ -338,7 +346,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get("key").Result() spans := mt.FinishedSpans() @@ -347,15 +355,16 @@ func TestError(t *testing.T) { assert.Equal("redis.command", span.OperationName()) assert.NotNil(err) - assert.Equal(err, span.Tag(ext.Error)) + assert.Equal(err.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6378", span.Tag(ext.TargetPort)) assert.Equal("get key: ", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) t.Run("nil", func(t *testing.T) { @@ -364,7 +373,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get("non_existent_key").Result() spans := mt.FinishedSpans() @@ -373,15 +382,16 @@ func TestError(t *testing.T) { assert.Equal(redis.Nil, err) assert.Equal("redis.command", span.OperationName()) - assert.Empty(span.Tag(ext.Error)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get non_existent_key: ", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) t.Run("errcheck", func(t *testing.T) { @@ -396,26 +406,27 @@ func TestError(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) cancel() - client := NewClient(opts, WithServiceName("my-redis"), WithErrorCheck(errCheckFn)) + client := NewClient(opts, WithService("my-redis"), WithErrorCheck(errCheckFn)) client = client.WithContext(ctx) _, err := client.Get("test_key").Result() + assert.Equal(context.Canceled, err) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] - assert.Equal(context.Canceled, err) - assert.Empty(span.Tag(ext.Error)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Equal("redis.command", span.OperationName()) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get test_key: ", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis.v7", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) } func TestAnalyticsSettings(t *testing.T) { @@ -445,9 +456,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -470,9 +479,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -491,11 +498,11 @@ func TestWithContext(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client1 := NewClient(opts, WithServiceName("my-redis")) + client1 := NewClient(opts, WithService("my-redis")) s1, ctx1 := tracer.StartSpanFromContext(context.Background(), "span1.name") client1 = client1.WithContext(ctx1) s2, ctx2 := tracer.StartSpanFromContext(context.Background(), "span2.name") - client2 := NewClient(opts, WithServiceName("my-redis")) + client2 := NewClient(opts, WithService("my-redis")) client2 = client2.WithContext(ctx2) client1.Set("test_key", "test_value", 0) client2.Get("test_key") @@ -504,7 +511,7 @@ func TestWithContext(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 4) - var span1, span2, setSpan, getSpan mocktracer.Span + var span1, span2, setSpan, getSpan *mocktracer.Span for _, s := range spans { switch s.Tag(ext.ResourceName) { case "span1.name": @@ -524,21 +531,3 @@ func TestWithContext(t *testing.T) { assert.Equal(span1.SpanID(), setSpan.ParentID()) assert.Equal(span2.SpanID(), getSpan.ParentID()) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - client := NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) - st := client.Set("test_key", "test_value", 0) - require.NoError(t, st.Err()) - - return mt.FinishedSpans() - }) - namingschematest.NewRedisTest(genSpans, "redis.client")(t) -} diff --git a/contrib/go-redis/redis.v8/example_test.go b/contrib/go-redis/redis.v8/example_test.go index 12fe41fc6d..a0cd45da2d 100644 --- a/contrib/go-redis/redis.v8/example_test.go +++ b/contrib/go-redis/redis.v8/example_test.go @@ -9,9 +9,9 @@ import ( "context" "time" - redistrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis.v8" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + redistrace "github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/go-redis/redis/v8" ) @@ -19,6 +19,9 @@ import ( // To start tracing Redis, simply create a new client using the library and continue // using as you normally would. func Example() { + tracer.Start() + defer tracer.Stop() + ctx := context.Background() // create a new Client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} @@ -42,10 +45,13 @@ func Example() { // You can also trace Redis Pipelines. Simply use as usual and the traces will be // automatically picked up by the underlying implementation. func Example_pipeliner() { + tracer.Start() + defer tracer.Stop() + ctx := context.Background() // create a client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} - c := redistrace.NewClient(opts, redistrace.WithServiceName("my-redis-service")) + c := redistrace.NewClient(opts, redistrace.WithService("my-redis-service")) // open the pipeline pipe := c.Pipeline() @@ -60,6 +66,9 @@ func Example_pipeliner() { // You can create a traced ClusterClient using WrapClient func Example_wrapClient() { + tracer.Start() + defer tracer.Stop() + c := redis.NewClusterClient(&redis.ClusterOptions{}) redistrace.WrapClient(c) diff --git a/contrib/go-redis/redis.v8/go.mod b/contrib/go-redis/redis.v8/go.mod new file mode 100644 index 0000000000..26ccd9a2da --- /dev/null +++ b/contrib/go-redis/redis.v8/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-redis/redis/v8 v8.11.5 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/onsi/gomega v1.36.2 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go-redis/redis.v8/go.sum b/contrib/go-redis/redis.v8/go.sum new file mode 100644 index 0000000000..eca246dfc5 --- /dev/null +++ b/contrib/go-redis/redis.v8/go.sum @@ -0,0 +1,324 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go-redis/redis.v8/option.go b/contrib/go-redis/redis.v8/option.go index b8f5da5da8..078cece694 100644 --- a/contrib/go-redis/redis.v8/option.go +++ b/contrib/go-redis/redis.v8/option.go @@ -8,8 +8,7 @@ package redis import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const defaultServiceName = "redis.client" @@ -22,39 +21,43 @@ type clientConfig struct { errCheck func(err error) bool } -// ClientOption represents an option that can be used to create or wrap a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Redis integration. +type ClientOption interface { + apply(*clientConfig) +} + +// ClientOptionFn represents options applicable to NewClient and WrapClient. +type ClientOptionFn func(*clientConfig) + +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.RedisOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_REDIS_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) cfg.errCheck = func(error) bool { return true } } // WithSkipRawCommand reports whether to skip setting the "redis.raw_command" tag // on instrumenation spans. This may be useful if the Datadog Agent is not // set up to obfuscate this value and it could contain sensitive information. -func WithSkipRawCommand(skip bool) ClientOption { +func WithSkipRawCommand(skip bool) ClientOptionFn { return func(cfg *clientConfig) { cfg.skipRaw = skip } } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -66,7 +69,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -78,7 +81,7 @@ func WithAnalyticsRate(rate float64) ClientOption { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. -func WithErrorCheck(fn func(err error) bool) ClientOption { +func WithErrorCheck(fn func(err error) bool) ClientOptionFn { return func(cfg *clientConfig) { cfg.errCheck = fn } diff --git a/contrib/go-redis/redis.v8/orchestrion.yml b/contrib/go-redis/redis.v8/orchestrion.yml new file mode 100644 index 0000000000..1b703ea9ab --- /dev/null +++ b/contrib/go-redis/redis.v8/orchestrion.yml @@ -0,0 +1,27 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 + description: Redis client for Go. + +aspects: + - id: NewClient + join-point: + one-of: + - function-call: github.com/go-redis/redis/v8.NewClient + - function-call: github.com/go-redis/redis/v8.NewFailoverClient + advice: + - wrap-expression: + imports: + redis: github.com/go-redis/redis/v8 + trace: github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 + template: |- + func() (client *redis.Client) { + client = {{ . }} + trace.WrapClient(client) + return + }() diff --git a/contrib/go-redis/redis.v8/redis.go b/contrib/go-redis/redis.v8/redis.go index a3ec7bc1c0..b73b06a4c3 100644 --- a/contrib/go-redis/redis.v8/redis.go +++ b/contrib/go-redis/redis.v8/redis.go @@ -15,19 +15,19 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/go-redis/redis/v8" ) const componentName = "go-redis/redis.v8" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/go-redis/redis/v8") + instr = instrumentation.Load(instrumentation.PackageGoRedisV8) } type datadogHook struct { @@ -37,7 +37,7 @@ type datadogHook struct { // params holds the tracer and a set of parameters which are recorded with every trace. type params struct { config *clientConfig - additionalTags []ddtrace.StartSpanOption + additionalTags []tracer.StartSpanOption } // NewClient returns a new Client that is traced with the default tracer under @@ -54,7 +54,7 @@ func WrapClient(client redis.UniversalClient, opts ...ClientOption) { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } hookParams := ¶ms{ @@ -72,13 +72,13 @@ type clusterOptions interface { Options() *redis.ClusterOptions } -func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOption { - additionalTags := []ddtrace.StartSpanOption{} +func additionalTagOptions(client redis.UniversalClient) []tracer.StartSpanOption { + additionalTags := []tracer.StartSpanOption{} if clientOptions, ok := client.(clientOptions); ok { opt := clientOptions.Options() if opt.Addr == "FailoverClient" { - additionalTags = []ddtrace.StartSpanOption{ - tracer.Tag("out.db", strconv.Itoa(opt.DB)), + additionalTags = []tracer.StartSpanOption{ + tracer.Tag(ext.TargetDB, strconv.Itoa(opt.DB)), tracer.Tag(ext.RedisDatabaseIndex, opt.DB), } } else { @@ -87,10 +87,10 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio host = opt.Addr port = "6379" } - additionalTags = []ddtrace.StartSpanOption{ + additionalTags = []tracer.StartSpanOption{ tracer.Tag(ext.TargetHost, host), tracer.Tag(ext.TargetPort, port), - tracer.Tag("out.db", strconv.Itoa(opt.DB)), + tracer.Tag(ext.TargetDB, strconv.Itoa(opt.DB)), tracer.Tag(ext.RedisDatabaseIndex, opt.DB), } } @@ -99,7 +99,7 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio for _, addr := range clientOptions.Options().Addrs { addrs = append(addrs, addr) } - additionalTags = []ddtrace.StartSpanOption{ + additionalTags = []tracer.StartSpanOption{ tracer.Tag("addrs", strings.Join(addrs, ", ")), } } @@ -111,7 +111,7 @@ func (ddh *datadogHook) BeforeProcess(ctx context.Context, cmd redis.Cmder) (con first := strings.SplitN(raw, " ", 2)[0] length := strings.Count(raw, " ") + 1 p := ddh.params - opts := make([]ddtrace.StartSpanOption, 0, 4+1+len(ddh.additionalTags)+1) // 4 options below + redis.raw_command + ddh.additionalTags + analyticsRate + opts := make([]tracer.StartSpanOption, 0, 4+1+len(ddh.additionalTags)+1) // 4 options below + redis.raw_command + ddh.additionalTags + analyticsRate opts = append(opts, tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), @@ -133,9 +133,9 @@ func (ddh *datadogHook) BeforeProcess(ctx context.Context, cmd redis.Cmder) (con } func (ddh *datadogHook) AfterProcess(ctx context.Context, cmd redis.Cmder) error { - var span tracer.Span + var span *tracer.Span span, _ = tracer.SpanFromContext(ctx) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption errRedis := cmd.Err() if errRedis != redis.Nil && ddh.config.errCheck(errRedis) { finishOpts = append(finishOpts, tracer.WithError(errRedis)) @@ -149,7 +149,7 @@ func (ddh *datadogHook) BeforeProcessPipeline(ctx context.Context, cmds []redis. first := strings.SplitN(raw, " ", 2)[0] length := strings.Count(raw, " ") + 1 p := ddh.params - opts := make([]ddtrace.StartSpanOption, 0, 5+1+len(ddh.additionalTags)+1) // 5 options below + redis.raw_command + ddh.additionalTags + analyticsRate + opts := make([]tracer.StartSpanOption, 0, 5+1+len(ddh.additionalTags)+1) // 5 options below + redis.raw_command + ddh.additionalTags + analyticsRate opts = append(opts, tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), @@ -172,9 +172,9 @@ func (ddh *datadogHook) BeforeProcessPipeline(ctx context.Context, cmds []redis. } func (ddh *datadogHook) AfterProcessPipeline(ctx context.Context, cmds []redis.Cmder) error { - var span tracer.Span + var span *tracer.Span span, _ = tracer.SpanFromContext(ctx) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption for _, cmd := range cmds { errCmd := cmd.Err() if errCmd != redis.Nil && ddh.config.errCheck(errCmd) { diff --git a/contrib/go-redis/redis.v8/redis_test.go b/contrib/go-redis/redis.v8/redis_test.go index 276b82a547..bb50f513fb 100644 --- a/contrib/go-redis/redis.v8/redis_test.go +++ b/contrib/go-redis/redis.v8/redis_test.go @@ -13,12 +13,10 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/go-redis/redis/v8" "github.com/stretchr/testify/assert" @@ -40,7 +38,7 @@ func TestMain(m *testing.M) { } func TestSkipRaw(t *testing.T) { - runCmds := func(t *testing.T, opts ...ClientOption) []mocktracer.Span { + runCmds := func(t *testing.T, opts ...ClientOption) []*mocktracer.Span { mt := mocktracer.Start() defer mt.Stop() ctx := context.Background() @@ -91,7 +89,7 @@ func TestClientEvalSha(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) sha1 := client.ScriptLoad(ctx, "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}").Val() mt.Reset() @@ -109,10 +107,11 @@ func TestClientEvalSha(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("evalsha", span.Tag(ext.ResourceName)) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } func TestPing(t *testing.T) { @@ -122,7 +121,7 @@ func TestPing(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Do(ctx, "PING").Result() require.NoError(t, err) @@ -138,6 +137,7 @@ func TestPing(t *testing.T) { assert.Equal("PING", span.Tag("redis.raw_command")) assert.Equal("1", span.Tag("redis.args_length")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -149,7 +149,7 @@ func TestClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set(ctx, "test_key", "test_value", 0) spans := mt.FinishedSpans() @@ -164,10 +164,11 @@ func TestClient(t *testing.T) { assert.Equal("set test_key test_value:", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("15", span.Tag("out.db")) - assert.Equal(15, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(15), span.Tag(ext.RedisDatabaseIndex)) } func TestWrapClient(t *testing.T) { @@ -179,7 +180,10 @@ func TestWrapClient(t *testing.T) { Addrs: []string{ "127.0.0.1:6379", "127.0.0.2:6379", - }} + }, + DialTimeout: 500 * time.Millisecond, + MaxRetries: 1, + } failoverClient := redis.NewUniversalClient(failoverClientOpts) clusterClientOpts := &redis.UniversalOptions{ @@ -187,7 +191,9 @@ func TestWrapClient(t *testing.T) { "127.0.0.1:6379", "127.0.0.2:6379", }, - DialTimeout: 1} + DialTimeout: 500 * time.Millisecond, + MaxRetries: 1, + } clusterClient := redis.NewUniversalClient(clusterClientOpts) testCases := []struct { @@ -214,7 +220,7 @@ func TestWrapClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - WrapClient(tc.client, WithServiceName("my-redis")) + WrapClient(tc.client, WithService("my-redis")) tc.client.Set(ctx, "test_key", "test_value", 0) spans := mt.FinishedSpans() @@ -227,6 +233,7 @@ func TestWrapClient(t *testing.T) { assert.Equal("set test_key test_value:", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -237,7 +244,7 @@ func TestAdditionalTagsFromClient(t *testing.T) { t.Run("simple-client", func(t *testing.T) { simpleClientOpts := &redis.UniversalOptions{Addrs: []string{"127.0.0.1:6379"}} simpleClient := redis.NewUniversalClient(simpleClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "out.db": "0", "out.host": "127.0.0.1", @@ -260,7 +267,7 @@ func TestAdditionalTagsFromClient(t *testing.T) { "127.0.0.2:6379", }} failoverClient := redis.NewUniversalClient(failoverClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "out.db": "0", "db.redis.database_index": 0, @@ -281,7 +288,7 @@ func TestAdditionalTagsFromClient(t *testing.T) { }, DialTimeout: 1} clusterClient := redis.NewUniversalClient(clusterClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "addrs": "127.0.0.1:6379, 127.0.0.2:6379", } @@ -301,7 +308,7 @@ func TestPipeline(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) pipeline := client.Pipeline() pipeline.Expire(ctx, "pipeline_counter", time.Hour) @@ -320,10 +327,11 @@ func TestPipeline(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("1", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) mt.Reset() pipeline.Expire(ctx, "pipeline_counter", time.Hour) @@ -342,10 +350,11 @@ func TestPipeline(t *testing.T) { assert.Equal("expire", span.Tag(ext.ResourceName)) assert.Equal("2", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } func TestChildSpan(t *testing.T) { @@ -356,7 +365,7 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() // Parent span - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) root, ctx := tracer.StartSpanFromContext(ctx, "parent.span") client.Set(ctx, "test_key", "test_value", 0) @@ -365,7 +374,7 @@ func TestChildSpan(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var child, parent mocktracer.Span + var child, parent *mocktracer.Span for _, s := range spans { // order of traces in buffer is not garanteed switch s.OperationName() { @@ -390,7 +399,7 @@ func TestMultipleCommands(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set(ctx, "test_key", "test_value", 0) client.Get(ctx, "test_key") client.Incr(ctx, "int_key") @@ -418,7 +427,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get(ctx, "key").Result() spans := mt.FinishedSpans() @@ -427,15 +436,16 @@ func TestError(t *testing.T) { assert.Equal("redis.command", span.OperationName()) assert.NotNil(err) - assert.Equal(err, span.Tag(ext.Error)) + assert.Equal(err.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6378", span.Tag(ext.TargetPort)) assert.Equal("get key:", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) t.Run("nil", func(t *testing.T) { @@ -445,7 +455,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get(ctx, "non_existent_key").Result() spans := mt.FinishedSpans() @@ -454,15 +464,16 @@ func TestError(t *testing.T) { assert.Equal(redis.Nil, err) assert.Equal("redis.command", span.OperationName()) - assert.Empty(span.Tag(ext.Error)) + assert.Empty(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get non_existent_key:", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) t.Run("errcheck", func(t *testing.T) { @@ -477,24 +488,25 @@ func TestError(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) cancel() - client := NewClient(opts, WithServiceName("my-redis"), WithErrorCheck(errCheckFn)) + client := NewClient(opts, WithService("my-redis"), WithErrorCheck(errCheckFn)) _, err := client.Get(ctx, "test_key").Result() + assert.Equal(context.Canceled, err) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] - assert.Equal(context.Canceled, err) - assert.Empty(span.Tag(ext.Error)) + assert.Empty(span.Tag(ext.ErrorMsg)) assert.Equal("redis.command", span.OperationName()) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get test_key:", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis.v8", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) } func TestAnalyticsSettings(t *testing.T) { @@ -525,9 +537,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -550,9 +560,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -573,11 +581,11 @@ func TestWithContext(t *testing.T) { ctx1 := context.Background() ctx2 := context.Background() - client1 := NewClient(opts, WithServiceName("my-redis")) + client1 := NewClient(opts, WithService("my-redis")) s1, ctx1 := tracer.StartSpanFromContext(ctx1, "span1.name") s2, ctx2 := tracer.StartSpanFromContext(ctx2, "span2.name") - client2 := NewClient(opts, WithServiceName("my-redis")) + client2 := NewClient(opts, WithService("my-redis")) client1.Set(ctx1, "test_key", "test_value", 0) client2.Get(ctx2, "test_key") s1.Finish() @@ -585,7 +593,7 @@ func TestWithContext(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 4) - var span1, span2, setSpan, getSpan mocktracer.Span + var span1, span2, setSpan, getSpan *mocktracer.Span for _, s := range spans { switch s.Tag(ext.ResourceName) { case "span1.name": @@ -606,21 +614,3 @@ func TestWithContext(t *testing.T) { assert.Equal(span1.SpanID(), setSpan.ParentID()) assert.Equal(span2.SpanID(), getSpan.ParentID()) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - client := NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) - st := client.Set(context.Background(), "test_key", "test_value", 0) - require.NoError(t, st.Err()) - - return mt.FinishedSpans() - }) - namingschematest.NewRedisTest(genSpans, "redis.client")(t) -} diff --git a/contrib/go-redis/redis/example_test.go b/contrib/go-redis/redis/example_test.go index 4a976710db..9074672127 100644 --- a/contrib/go-redis/redis/example_test.go +++ b/contrib/go-redis/redis/example_test.go @@ -9,9 +9,9 @@ import ( "context" "time" - redistrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + redistrace "github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/go-redis/redis" ) @@ -19,6 +19,9 @@ import ( // To start tracing Redis, simply create a new client using the library and continue // using as you normally would. func Example() { + tracer.Start() + defer tracer.Stop() + // create a new Client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} c := redistrace.NewClient(opts) @@ -44,9 +47,12 @@ func Example() { // You can also trace Redis Pipelines. Simply use as usual and the traces will be // automatically picked up by the underlying implementation. func Example_pipeliner() { + tracer.Start() + defer tracer.Stop() + // create a client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} - c := redistrace.NewClient(opts, redistrace.WithServiceName("my-redis-service")) + c := redistrace.NewClient(opts, redistrace.WithService("my-redis-service")) // open the pipeline pipe := c.Pipeline() diff --git a/contrib/go-redis/redis/go.mod b/contrib/go-redis/redis/go.mod new file mode 100644 index 0000000000..09e74f20f8 --- /dev/null +++ b/contrib/go-redis/redis/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-redis/redis v6.15.9+incompatible + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/onsi/ginkgo v1.16.5 // indirect + github.com/onsi/gomega v1.36.2 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go-redis/redis/go.sum b/contrib/go-redis/redis/go.sum new file mode 100644 index 0000000000..3681151bd7 --- /dev/null +++ b/contrib/go-redis/redis/go.sum @@ -0,0 +1,362 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go-redis/redis/option.go b/contrib/go-redis/redis/option.go index 03fea46c5b..932a942408 100644 --- a/contrib/go-redis/redis/option.go +++ b/contrib/go-redis/redis/option.go @@ -3,46 +3,47 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package redis // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/go-redis/redis" +package redis // import "github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2" import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "redis.client" - type clientConfig struct { serviceName string spanName string analyticsRate float64 } -// ClientOption represents an option that can be used to create or wrap a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Redis integration. +type ClientOption interface { + apply(*clientConfig) +} + +// ClientOptionFn represents options applicable to NewClient and WrapClient. +type ClientOptionFn func(*clientConfig) + +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.RedisOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_REDIS_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -54,7 +55,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/go-redis/redis/orchestrion.yml b/contrib/go-redis/redis/orchestrion.yml new file mode 100644 index 0000000000..330f9ea2a8 --- /dev/null +++ b/contrib/go-redis/redis/orchestrion.yml @@ -0,0 +1,27 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 + description: Redis client for Go. + +aspects: + - id: NewClient + join-point: + one-of: + - function-call: github.com/go-redis/redis.NewClient + - function-call: github.com/go-redis/redis.NewFailoverClient + advice: + - wrap-expression: + imports: + redis: github.com/go-redis/redis + trace: github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 + template: |- + func() (client *redis.Client) { + client = {{ . }} + trace.WrapClient(client) + return + }() diff --git a/contrib/go-redis/redis/redis.go b/contrib/go-redis/redis/redis.go index 56feb6dcfd..ffa9a7c764 100644 --- a/contrib/go-redis/redis/redis.go +++ b/contrib/go-redis/redis/redis.go @@ -16,20 +16,19 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/go-redis/redis" ) const componentName = "go-redis/redis" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/go-redis/redis") + instr = instrumentation.Load(instrumentation.PackageGoRedis) } // Client is used to trace requests to a redis server. @@ -71,9 +70,9 @@ func WrapClient(c *redis.Client, opts ...ClientOption) *Client { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/go-redis/redis: Wrapping Client: %#v", cfg) + instr.Logger().Debug("contrib/go-redis/redis: Wrapping Client: %#v", cfg) opt := c.Options() host, port, err := net.SplitHostPort(opt.Addr) if err != nil { @@ -124,13 +123,13 @@ func (c *Pipeliner) Exec() ([]redis.Cmder, error) { func (c *Pipeliner) execWithContext(ctx context.Context) ([]redis.Cmder, error) { p := c.params - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), tracer.ResourceName("redis"), tracer.Tag(ext.TargetHost, p.host), tracer.Tag(ext.TargetPort, p.port), - tracer.Tag("out.db", strconv.Itoa(p.db)), + tracer.Tag(ext.TargetDB, strconv.Itoa(p.db)), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(ext.DBSystem, ext.DBSystemRedis), @@ -143,7 +142,7 @@ func (c *Pipeliner) execWithContext(ctx context.Context) ([]redis.Cmder, error) cmds, err := c.Pipeliner.Exec() span.SetTag(ext.ResourceName, commandsToString(cmds)) span.SetTag("redis.pipeline_length", strconv.Itoa(len(cmds))) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption if err != redis.Nil { finishOpts = append(finishOpts, tracer.WithError(err)) } @@ -196,13 +195,13 @@ func createWrapperFromClient(tc *Client) func(oldProcess func(cmd redis.Cmder) e parts := strings.Split(raw, " ") length := len(parts) - 1 p := tc.params - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), tracer.ResourceName(parts[0]), tracer.Tag(ext.TargetHost, p.host), tracer.Tag(ext.TargetPort, p.port), - tracer.Tag("out.db", strconv.Itoa(p.db)), + tracer.Tag(ext.TargetDB, strconv.Itoa(p.db)), tracer.Tag("redis.raw_command", raw), tracer.Tag("redis.args_length", strconv.Itoa(length)), tracer.Tag(ext.Component, componentName), @@ -215,7 +214,7 @@ func createWrapperFromClient(tc *Client) func(oldProcess func(cmd redis.Cmder) e } span, _ := tracer.StartSpanFromContext(ctx, p.config.spanName, opts...) err := tc.process(cmd) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption if err != redis.Nil { finishOpts = append(finishOpts, tracer.WithError(err)) } diff --git a/contrib/go-redis/redis/redis_test.go b/contrib/go-redis/redis/redis_test.go index cc54ed219c..bcb8fc5faf 100644 --- a/contrib/go-redis/redis/redis_test.go +++ b/contrib/go-redis/redis/redis_test.go @@ -13,15 +13,13 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/go-redis/redis" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) const debug = false @@ -41,7 +39,7 @@ func TestClientEvalSha(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) sha1 := client.ScriptLoad("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}").Val() mt.Reset() @@ -59,16 +57,17 @@ func TestClientEvalSha(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("evalsha", span.Tag(ext.ResourceName)) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } // https://github.com/DataDog/dd-trace-go/issues/387 func TestIssue387(_ *testing.T) { opts := &redis.Options{Addr: "127.0.0.1:6379"} - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) n := 1000 client.Set("test_key", "test_value", 0) @@ -92,7 +91,7 @@ func TestClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set("test_key", "test_value", 0) spans := mt.FinishedSpans() @@ -107,10 +106,11 @@ func TestClient(t *testing.T) { assert.Equal("set test_key test_value: ", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("15", span.Tag("out.db")) - assert.Equal(15, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(15), span.Tag(ext.RedisDatabaseIndex)) } func TestPipeline(t *testing.T) { @@ -119,7 +119,7 @@ func TestPipeline(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) pipeline := client.Pipeline() pipeline.Expire("pipeline_counter", time.Hour) @@ -138,10 +138,11 @@ func TestPipeline(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("1", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) mt.Reset() pipeline.Expire("pipeline_counter", time.Hour) @@ -160,10 +161,11 @@ func TestPipeline(t *testing.T) { assert.Equal("expire pipeline_counter 3600: false\nexpire pipeline_counter_1 60: false\n", span.Tag(ext.ResourceName)) assert.Equal("2", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } func TestPipelined(t *testing.T) { @@ -172,7 +174,7 @@ func TestPipelined(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Pipelined(func(p redis.Pipeliner) error { p.Expire("pipeline_counter", time.Hour) return nil @@ -191,10 +193,11 @@ func TestPipelined(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("1", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) mt.Reset() _, err = client.Pipelined(func(p redis.Pipeliner) error { @@ -214,10 +217,11 @@ func TestPipelined(t *testing.T) { assert.Equal("expire pipeline_counter 3600: false\nexpire pipeline_counter_1 60: false\n", span.Tag(ext.ResourceName)) assert.Equal("2", span.Tag("redis.pipeline_length")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) } func TestChildSpan(t *testing.T) { @@ -227,7 +231,7 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() // Parent span - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.span") client = client.WithContext(ctx) client.Set("test_key", "test_value", 0) @@ -236,7 +240,7 @@ func TestChildSpan(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var child, parent mocktracer.Span + var child, parent *mocktracer.Span for _, s := range spans { // order of traces in buffer is not garanteed switch s.OperationName() { @@ -260,7 +264,7 @@ func TestMultipleCommands(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set("test_key", "test_value", 0) client.Get("test_key") client.Incr("int_key") @@ -287,7 +291,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get("key").Result() spans := mt.FinishedSpans() @@ -296,15 +300,16 @@ func TestError(t *testing.T) { assert.Equal("redis.command", span.OperationName()) assert.NotNil(err) - assert.Equal(err, span.Tag(ext.Error)) + assert.Equal(err.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6378", span.Tag(ext.TargetPort)) assert.Equal("get key: ", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) t.Run("nil", func(t *testing.T) { @@ -313,7 +318,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get("non_existent_key").Result() spans := mt.FinishedSpans() @@ -322,15 +327,16 @@ func TestError(t *testing.T) { assert.Equal(redis.Nil, err) assert.Equal("redis.command", span.OperationName()) - assert.Empty(span.Tag(ext.Error)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get non_existent_key: ", span.Tag("redis.raw_command")) assert.Equal("go-redis/redis", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) assert.Equal("0", span.Tag("out.db")) - assert.Equal(0, span.Tag(ext.RedisDatabaseIndex)) + assert.Equal(float64(0), span.Tag(ext.RedisDatabaseIndex)) }) } func TestAnalyticsSettings(t *testing.T) { @@ -360,9 +366,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -385,9 +389,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -406,7 +408,7 @@ func TestWithContext(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client1 := NewClient(opts, WithServiceName("my-redis")) + client1 := NewClient(opts, WithService("my-redis")) s1, ctx1 := tracer.StartSpanFromContext(context.Background(), "span1.name") client1 = client1.WithContext(ctx1) s2, ctx2 := tracer.StartSpanFromContext(context.Background(), "span2.name") @@ -418,7 +420,7 @@ func TestWithContext(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 4) - var span1, span2, setSpan, getSpan mocktracer.Span + var span1, span2, setSpan, getSpan *mocktracer.Span for _, s := range spans { switch s.Tag(ext.ResourceName) { case "span1.name": @@ -440,21 +442,3 @@ func TestWithContext(t *testing.T) { assert.Equal(span1.SpanID(), setSpan.ParentID()) assert.Equal(span2.SpanID(), getSpan.ParentID()) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - client := NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) - st := client.Set("test_key", "test_value", 0) - require.NoError(t, st.Err()) - - return mt.FinishedSpans() - }) - namingschematest.NewRedisTest(genSpans, "redis.client")(t) -} diff --git a/contrib/go.mongodb.org/mongo-driver.v2/go.mod b/contrib/go.mongodb.org/mongo-driver.v2/go.mod new file mode 100644 index 0000000000..6dcdd31fed --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/go.mod @@ -0,0 +1,100 @@ +module github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + go.mongodb.org/mongo-driver/v2 v2.2.2 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go.mongodb.org/mongo-driver.v2/go.sum b/contrib/go.mongodb.org/mongo-driver.v2/go.sum new file mode 100644 index 0000000000..b1406eea9d --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/go.sum @@ -0,0 +1,336 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver/v2 v2.2.2 h1:9cYuS3fl1Xhqwpfazso10V7BHQD58kCgtzhfAmJYz9c= +go.mongodb.org/mongo-driver/v2 v2.2.2/go.mod h1:qQkDMhCGWl3FN509DfdPd4GRBLU/41zqF/k8eTRceps= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go.mongodb.org/mongo-driver.v2/mongo/example_test.go b/contrib/go.mongodb.org/mongo-driver.v2/mongo/example_test.go new file mode 100644 index 0000000000..5623658988 --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/mongo/example_test.go @@ -0,0 +1,44 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mongo_test + +import ( + "context" + + mongotrace "github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2/mongo" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" +) + +func Example() { + tracer.Start() + defer tracer.Stop() + + // connect to MongoDB + opts := options.Client() + opts.Monitor = mongotrace.NewMonitor() + opts.ApplyURI("mongodb://localhost:27017") + client, err := mongo.Connect(opts) + if err != nil { + panic(err) + } + db := client.Database("example") + inventory := db.Collection("inventory") + + inventory.InsertOne(context.Background(), bson.D{ + {Key: "item", Value: "canvas"}, + {Key: "qty", Value: 100}, + {Key: "tags", Value: bson.A{"cotton"}}, + {Key: "size", Value: bson.D{ + {Key: "h", Value: 28}, + {Key: "w", Value: 35.5}, + {Key: "uom", Value: "cm"}, + }}, + }) +} diff --git a/contrib/go.mongodb.org/mongo-driver.v2/mongo/mongo.go b/contrib/go.mongodb.org/mongo-driver.v2/mongo/mongo.go new file mode 100644 index 0000000000..b6be72da1f --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/mongo/mongo.go @@ -0,0 +1,124 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package mongo provides functions to trace the mongodb/mongo-go-driver/v2 package (https://github.com/mongodb/mongo-go-driver). +package mongo + +import ( + "context" + "fmt" + "strings" + "sync" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/event" +) + +const componentName = instrumentation.PackageMongoDriverV2 + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageMongoDriverV2) +} + +type spanKey struct { + ConnectionID string + RequestID int64 +} + +type monitor struct { + sync.Mutex + spans map[spanKey]*tracer.Span + cfg *config +} + +func (m *monitor) Started(ctx context.Context, evt *event.CommandStartedEvent) { + hostname, port := peerInfo(evt) + b, _ := bson.MarshalExtJSON(evt.Command, false, false) + opts := []tracer.StartSpanOption{ + tracer.SpanType(ext.SpanTypeMongoDB), + tracer.ServiceName(m.cfg.serviceName), + tracer.ResourceName("mongo." + evt.CommandName), + tracer.Tag(ext.DBInstance, evt.DatabaseName), + tracer.Tag(m.cfg.spanName, string(b)), + tracer.Tag(ext.DBType, "mongo"), + tracer.Tag(ext.PeerHostname, hostname), + tracer.Tag(ext.NetworkDestinationName, hostname), + tracer.Tag(ext.PeerPort, port), + tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.SpanKind, ext.SpanKindClient), + tracer.Tag(ext.DBSystem, ext.DBSystemMongoDB), + } + span, _ := tracer.StartSpanFromContext(ctx, m.cfg.spanName, opts...) + key := spanKey{ + ConnectionID: evt.ConnectionID, + RequestID: evt.RequestID, + } + m.Lock() + m.spans[key] = span + m.Unlock() +} + +func (m *monitor) Succeeded(_ context.Context, evt *event.CommandSucceededEvent) { + m.Finished(&evt.CommandFinishedEvent, nil) +} + +func (m *monitor) Failed(_ context.Context, evt *event.CommandFailedEvent) { + m.Finished(&evt.CommandFinishedEvent, fmt.Errorf("%s", evt.Failure)) +} + +func (m *monitor) Finished(evt *event.CommandFinishedEvent, err error) { + key := spanKey{ + ConnectionID: evt.ConnectionID, + RequestID: evt.RequestID, + } + m.Lock() + span, ok := m.spans[key] + if ok { + delete(m.spans, key) + } + m.Unlock() + if !ok { + return + } + span.Finish(tracer.WithError(err)) +} + +// NewMonitor creates a new mongodb event CommandMonitor. +func NewMonitor(opts ...Option) *event.CommandMonitor { + cfg := new(config) + defaults(cfg) + for _, opt := range opts { + opt.apply(cfg) + } + instr.Logger().Debug("contrib/go.mongodb.org/mongo-driver.v2/mongo: Creating Monitor: %#v", cfg) + m := &monitor{ + spans: make(map[spanKey]*tracer.Span), + cfg: cfg, + } + return &event.CommandMonitor{ + Started: m.Started, + Succeeded: m.Succeeded, + Failed: m.Failed, + } +} + +func peerInfo(evt *event.CommandStartedEvent) (hostname, port string) { + hostname = evt.ConnectionID + port = "27017" + if idx := strings.IndexByte(hostname, '['); idx >= 0 { + hostname = hostname[:idx] + } + if idx := strings.IndexByte(hostname, ':'); idx >= 0 { + port = hostname[idx+1:] + hostname = hostname[:idx] + } + return hostname, port +} diff --git a/contrib/go.mongodb.org/mongo-driver.v2/mongo/mongo_test.go b/contrib/go.mongodb.org/mongo-driver.v2/mongo/mongo_test.go new file mode 100644 index 0000000000..4dc0aa7025 --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/mongo/mongo_test.go @@ -0,0 +1,82 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mongo + +import ( + "context" + "fmt" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func TestMain(m *testing.M) { + _, ok := os.LookupEnv("INTEGRATION") + if !ok { + fmt.Println("--- SKIP: to enable integration test, set the INTEGRATION environment variable") + os.Exit(0) + } + os.Exit(m.Run()) +} + +func Test(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + hostname, port := "localhost", "27017" + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) + defer cancel() + + span, ctx := tracer.StartSpanFromContext(ctx, "mongodb-test") + + addr := fmt.Sprintf("mongodb://localhost:27017/?connect=direct") + opts := options.Client() + opts.Monitor = NewMonitor() + opts.ApplyURI(addr) + client, err := mongo.Connect(opts) + if err != nil { + t.Fatal(err) + } + + _, err = client. + Database("test-database"). + Collection("test-collection"). + InsertOne(ctx, bson.D{{Key: "test-item", Value: "test-value"}}) + if err != nil { + t.Fatal(err) + } + + span.Finish() + + spans := mt.FinishedSpans() + assert.Len(t, spans, 2) + assert.Equal(t, spans[0].TraceID(), spans[1].TraceID()) + + s := spans[0] + assert.Equal(t, ext.SpanTypeMongoDB, s.Tag(ext.SpanType)) + assert.Equal(t, "mongo", s.Tag(ext.ServiceName)) + assert.Equal(t, "mongo.insert", s.Tag(ext.ResourceName)) + assert.Equal(t, hostname, s.Tag(ext.PeerHostname)) + assert.Equal(t, hostname, s.Tag(ext.NetworkDestinationName)) + assert.Equal(t, port, s.Tag(ext.PeerPort)) + assert.Contains(t, s.Tag("mongodb.query"), `"test-item":"test-value"`) + assert.Equal(t, "test-database", s.Tag(ext.DBInstance)) + assert.Equal(t, "mongo", s.Tag(ext.DBType)) + assert.Equal(t, "go.mongodb.org/mongo-driver.v2", s.Tag(ext.Component)) + assert.Equal(t, "go.mongodb.org/mongo-driver.v2", s.Integration()) + assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) + assert.Equal(t, "mongodb", s.Tag(ext.DBSystem)) +} diff --git a/contrib/go.mongodb.org/mongo-driver.v2/mongo/option.go b/contrib/go.mongodb.org/mongo-driver.v2/mongo/option.go new file mode 100644 index 0000000000..28f4bcbf6b --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/mongo/option.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mongo + +import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +type config struct { + serviceName string + spanName string +} + +// Option describes options for the Mongo integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to NewMonitor. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +func defaults(cfg *config) { + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) +} + +// WithService sets the given service name for this integration spans. +func WithService(name string) OptionFn { + return func(cfg *config) { + cfg.serviceName = name + } +} diff --git a/contrib/go.mongodb.org/mongo-driver.v2/mongo/orchestrion.yml b/contrib/go.mongodb.org/mongo-driver.v2/mongo/orchestrion.yml new file mode 100644 index 0000000000..163ac9a179 --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver.v2/mongo/orchestrion.yml @@ -0,0 +1,21 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2/mongo + description: Official Golang driver for MongoDB. + +aspects: + - id: Client + join-point: + function-call: go.mongodb.org/mongo-driver/v2/mongo/options.Client + advice: + - wrap-expression: + imports: + options: go.mongodb.org/mongo-driver/v2/mongo/options + mongotrace: github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2/mongo + template: |- + {{ . }}.SetMonitor(mongotrace.NewMonitor()) diff --git a/contrib/go.mongodb.org/mongo-driver/go.mod b/contrib/go.mongodb.org/mongo-driver/go.mod new file mode 100644 index 0000000000..d0ee935db2 --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver/go.mod @@ -0,0 +1,101 @@ +module github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + go.mongodb.org/mongo-driver v1.12.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/montanaflynn/stats v0.6.6 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/go.mongodb.org/mongo-driver/go.sum b/contrib/go.mongodb.org/mongo-driver/go.sum new file mode 100644 index 0000000000..8f98e55534 --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver/go.sum @@ -0,0 +1,347 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/go.mongodb.org/mongo-driver/mongo/example_test.go b/contrib/go.mongodb.org/mongo-driver/mongo/example_test.go index e614a5bb75..506d637b2f 100644 --- a/contrib/go.mongodb.org/mongo-driver/mongo/example_test.go +++ b/contrib/go.mongodb.org/mongo-driver/mongo/example_test.go @@ -8,7 +8,8 @@ package mongo_test import ( "context" - mongotrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/go.mongodb.org/mongo-driver/mongo" + mongotrace "github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2/mongo" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -16,6 +17,9 @@ import ( ) func Example() { + tracer.Start() + defer tracer.Stop() + // connect to MongoDB opts := options.Client() opts.Monitor = mongotrace.NewMonitor() diff --git a/contrib/go.mongodb.org/mongo-driver/mongo/mongo.go b/contrib/go.mongodb.org/mongo-driver/mongo/mongo.go index c8332874ca..8b7ebbdd1a 100644 --- a/contrib/go.mongodb.org/mongo-driver/mongo/mongo.go +++ b/contrib/go.mongodb.org/mongo-driver/mongo/mongo.go @@ -16,11 +16,9 @@ import ( "strings" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/event" @@ -28,9 +26,10 @@ import ( const componentName = "go.mongodb.org/mongo-driver/mongo" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("go.mongodb.org/mongo-driver") + instr = instrumentation.Load(instrumentation.PackageMongoDriver) } type spanKey struct { @@ -40,14 +39,14 @@ type spanKey struct { type monitor struct { sync.Mutex - spans map[spanKey]ddtrace.Span + spans map[spanKey]*tracer.Span cfg *config } func (m *monitor) Started(ctx context.Context, evt *event.CommandStartedEvent) { hostname, port := peerInfo(evt) b, _ := bson.MarshalExtJSON(evt.Command, false, false) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeMongoDB), tracer.ServiceName(m.cfg.serviceName), tracer.ResourceName("mongo." + evt.CommandName), @@ -104,11 +103,11 @@ func NewMonitor(opts ...Option) *event.CommandMonitor { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/go.mongodb.org/mongo-driver/mongo: Creating Monitor: %#v", cfg) + instr.Logger().Debug("contrib/go.mongodb.org/mongo-driver/mongo: Creating Monitor: %#v", cfg) m := &monitor{ - spans: make(map[spanKey]ddtrace.Span), + spans: make(map[spanKey]*tracer.Span), cfg: cfg, } return &event.CommandMonitor{ diff --git a/contrib/go.mongodb.org/mongo-driver/mongo/mongo_test.go b/contrib/go.mongodb.org/mongo-driver/mongo/mongo_test.go index 4e637b9a5f..23aa4ea956 100644 --- a/contrib/go.mongodb.org/mongo-driver/mongo/mongo_test.go +++ b/contrib/go.mongodb.org/mongo-driver/mongo/mongo_test.go @@ -12,17 +12,15 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestMain(m *testing.M) { @@ -79,6 +77,7 @@ func Test(t *testing.T) { assert.Equal(t, "test-database", s.Tag(ext.DBInstance)) assert.Equal(t, "mongo", s.Tag(ext.DBType)) assert.Equal(t, "go.mongodb.org/mongo-driver/mongo", s.Tag(ext.Component)) + assert.Equal(t, componentName, s.Integration()) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) assert.Equal(t, "mongodb", s.Tag(ext.DBSystem)) } @@ -132,36 +131,8 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - addr := fmt.Sprintf("mongodb://localhost:27017/?connect=direct") - mongopts := options.Client() - mongopts.Monitor = NewMonitor(opts...) - mongopts.ApplyURI(addr) - client, err := mongo.Connect(context.Background(), mongopts) - require.NoError(t, err) - _, err = client. - Database("test-database"). - Collection("test-collection"). - InsertOne(context.Background(), bson.D{{Key: "test-item", Value: "test-value"}}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - namingschematest.NewMongoDBTest(genSpans, "mongo")(t) -} diff --git a/contrib/go.mongodb.org/mongo-driver/mongo/option.go b/contrib/go.mongodb.org/mongo-driver/mongo/option.go index c2f4ebb307..e08eeffaa7 100644 --- a/contrib/go.mongodb.org/mongo-driver/mongo/option.go +++ b/contrib/go.mongodb.org/mongo-driver/mongo/option.go @@ -8,43 +8,42 @@ package mongo import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "mongo" - type config struct { serviceName string spanName string analyticsRate float64 } -// Option represents an option that can be passed to Dial. -type Option func(*config) +// Option describes options for the Mongo integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to NewMonitor. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.MongoDBOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_MONGO_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the dialled connection. -// When the service name is not explicitly set it will be inferred based on the -// request to AWS. -func WithServiceName(name string) Option { +// WithService sets the given service name for this integration spans. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -56,7 +55,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/go.mongodb.org/mongo-driver/mongo/orchestrion.yml b/contrib/go.mongodb.org/mongo-driver/mongo/orchestrion.yml new file mode 100644 index 0000000000..249a2edded --- /dev/null +++ b/contrib/go.mongodb.org/mongo-driver/mongo/orchestrion.yml @@ -0,0 +1,21 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2/mongo + description: Official Golang driver for MongoDB. + +aspects: + - id: Client + join-point: + function-call: go.mongodb.org/mongo-driver/mongo/options.Client + advice: + - wrap-expression: + imports: + options: go.mongodb.org/mongo-driver/mongo/options + mongotrace: github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2/mongo + template: |- + {{ . }}.SetMonitor(mongotrace.NewMonitor()) diff --git a/contrib/gocql/gocql/example_test.go b/contrib/gocql/gocql/example_test.go index 34982b5ab3..8847b90fb4 100644 --- a/contrib/gocql/gocql/example_test.go +++ b/contrib/gocql/gocql/example_test.go @@ -11,14 +11,14 @@ import ( "github.com/gocql/gocql" - gocqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gocql/gocql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + gocqltrace "github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func ExampleNewCluster() { // Initialise a wrapped Cassandra session and create a query. - cluster := gocqltrace.NewCluster([]string{"127.0.0.1:9043"}, gocqltrace.WithServiceName("ServiceName")) + cluster := gocqltrace.NewCluster([]string{"127.0.0.1:9043"}, gocqltrace.WithService("ServiceName")) session, _ := cluster.CreateSession() query := session.Query("CREATE KEYSPACE if not exists trace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor': 1}") @@ -43,7 +43,7 @@ func ExampleCreateTracedSession() { cluster.Keyspace = "my-keyspace" // Create a new traced session using any number of options - session, err := gocqltrace.CreateTracedSession(cluster, gocqltrace.WithServiceName("ServiceName")) + session, err := gocqltrace.CreateTracedSession(cluster, gocqltrace.WithService("ServiceName")) if err != nil { log.Fatal(err) } @@ -75,7 +75,7 @@ func ExampleNewObserver() { log.Fatal(err) } // Create a new observer using same set of options as gocqltrace.CreateTracedSession. - obs := gocqltrace.NewObserver(cluster, gocqltrace.WithServiceName("ServiceName")) + obs := gocqltrace.NewObserver(cluster, gocqltrace.WithService("ServiceName")) // Attach the observer to queries / batches individually. tracedQuery := session.Query("SELECT something FROM somewhere").Observer(obs) diff --git a/contrib/gocql/gocql/go.mod b/contrib/gocql/gocql/go.mod new file mode 100644 index 0000000000..724aa992fa --- /dev/null +++ b/contrib/gocql/gocql/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/gocql/gocql v1.6.0 + github.com/stretchr/testify v1.11.1 + golang.org/x/mod v0.29.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/gocql/gocql/go.sum b/contrib/gocql/gocql/go.sum new file mode 100644 index 0000000000..be28eb5841 --- /dev/null +++ b/contrib/gocql/gocql/go.sum @@ -0,0 +1,325 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= +github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/gocql/gocql/gocql.go b/contrib/gocql/gocql/gocql.go index 058c557109..0c8be71fb3 100644 --- a/contrib/gocql/gocql/gocql.go +++ b/contrib/gocql/gocql/gocql.go @@ -4,7 +4,7 @@ // Copyright 2016 Datadog, Inc. // Package gocql provides functions to trace the gocql/gocql package (https://github.com/gocql/gocql). -package gocql // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gocql/gocql" +package gocql // import "github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2" import ( "context" @@ -14,20 +14,17 @@ import ( "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/gocql/gocql" ) -const componentName = "gocql/gocql" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/gocql/gocql") + instr = instrumentation.Load(instrumentation.PackageGoCQL) } // ClusterConfig embeds gocql.ClusterConfig and keeps information relevant to tracing. @@ -142,7 +139,7 @@ func WrapQuery(q *gocql.Query, opts ...WrapOption) *Query { func wrapQuery(q *gocql.Query, hosts []string, opts ...WrapOption) *Query { cfg := defaultConfig() for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } if cfg.resourceName == "" { if parts := strings.SplitN(q.String(), "\"", 3); len(parts) == 3 { @@ -153,7 +150,7 @@ func wrapQuery(q *gocql.Query, hosts []string, opts ...WrapOption) *Query { if len(hosts) > 0 { p.clusterContactPoints = strings.Join(hosts, ",") } - log.Debug("contrib/gocql/gocql: Wrapping Query: %#v", cfg) + instr.Logger().Debug("contrib/gocql/gocql: Wrapping Query: %#v", cfg) tq := &Query{Query: q, params: p, ctx: q.Context()} return tq } @@ -168,7 +165,7 @@ func (tq *Query) WithContext(ctx context.Context) *Query { // WithWrapOptions applies the given set of options to the query. func (tq *Query) WithWrapOptions(opts ...WrapOption) *Query { for _, fn := range opts { - fn(tq.params.config) + fn.apply(tq.params.config) } return tq } @@ -223,7 +220,7 @@ func (tq *Query) ScanCAS(dest ...interface{}) (applied bool, err error) { // native gocql types instead of wrapped types. type Iter struct { *gocql.Iter - span ddtrace.Span + span *tracer.Span } // Iter starts a new span at query.Iter call. @@ -270,7 +267,7 @@ func (tIter *Iter) Close() error { // native gocql types instead of wrapped types. type Scanner struct { gocql.Scanner - span ddtrace.Span + span *tracer.Span } // Scanner returns a row Scanner which provides an interface to scan rows in a @@ -312,13 +309,13 @@ func WrapBatch(b *gocql.Batch, opts ...WrapOption) *Batch { func wrapBatch(b *gocql.Batch, hosts []string, opts ...WrapOption) *Batch { cfg := defaultConfig() for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } p := params{config: cfg} if len(hosts) > 0 { p.clusterContactPoints = strings.Join(hosts, ",") } - log.Debug("contrib/gocql/gocql: Wrapping Batch: %#v", cfg) + instr.Logger().Debug("contrib/gocql/gocql: Wrapping Batch: %#v", cfg) tb := &Batch{Batch: b, params: p, ctx: b.Context()} return tb } @@ -333,7 +330,7 @@ func (tb *Batch) WithContext(ctx context.Context) *Batch { // WithWrapOptions applies the given set of options to the batch. func (tb *Batch) WithWrapOptions(opts ...WrapOption) *Batch { for _, fn := range opts { - fn(tb.params.config) + fn.apply(tb.params.config) } return tb } @@ -362,7 +359,7 @@ func (tb *Batch) ExecuteBatch(session *gocql.Session) error { return err } -func startQuerySpan(ctx context.Context, p params) ddtrace.Span { +func startQuerySpan(ctx context.Context, p params) *tracer.Span { opts := commonStartSpanOptions(p) if p.keyspace != "" { opts = append(opts, tracer.Tag(ext.CassandraKeyspace, p.keyspace)) @@ -378,7 +375,7 @@ func startQuerySpan(ctx context.Context, p params) ddtrace.Span { } // newChildSpan creates a new span from the params and the context. -func startBatchSpan(ctx context.Context, p params) ddtrace.Span { +func startBatchSpan(ctx context.Context, p params) *tracer.Span { cfg := p.config opts := commonStartSpanOptions(p) if p.keyspace != "" { @@ -396,10 +393,10 @@ func startBatchSpan(ctx context.Context, p params) ddtrace.Span { func commonStartSpanOptions(p params) []tracer.StartSpanOption { cfg := p.config - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeCassandra), tracer.ServiceName(cfg.serviceName), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGoCQL), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(ext.DBSystem, ext.DBSystemCassandra), } @@ -433,11 +430,11 @@ func commonStartSpanOptions(p params) []tracer.StartSpanOption { return opts } -func finishSpan(span ddtrace.Span, err error, p params) { +func finishSpan(span *tracer.Span, err error, p params) { if err != nil && p.config.shouldIgnoreError(err) { err = nil } - opts := []ddtrace.FinishOption{ + opts := []tracer.FinishOption{ tracer.WithError(err), } if !p.finishTime.IsZero() { diff --git a/contrib/gocql/gocql/gocql_test.go b/contrib/gocql/gocql/gocql_test.go index 4b7e44c28b..dab29b8fcb 100644 --- a/contrib/gocql/gocql/gocql_test.go +++ b/contrib/gocql/gocql/gocql_test.go @@ -9,16 +9,15 @@ import ( "context" "fmt" "log" - "math" "os" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/gocql/gocql" "github.com/stretchr/testify/assert" @@ -77,20 +76,21 @@ func TestErrorWrapper(t *testing.T) { session, err := cluster.CreateSession() assert.Nil(err) q := session.Query("CREATE KEYSPACE trace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };") - iter := WrapQuery(q, WithServiceName("ServiceName"), WithResourceName("CREATE KEYSPACE")).Iter() + iter := wrapQuery(q, nil, WithService("ServiceName"), WithResourceName("CREATE KEYSPACE")).Iter() err = iter.Close() spans := mt.FinishedSpans() assert.Len(spans, 1) span := spans[0] - assert.Equal(span.Tag(ext.Error).(error), err) + assert.Equal(span.Tag(ext.ErrorMsg), err.Error()) assert.Equal(span.OperationName(), "cassandra.query") assert.Equal(span.Tag(ext.ResourceName), "CREATE KEYSPACE") assert.Equal(span.Tag(ext.ServiceName), "ServiceName") assert.Equal(span.Tag(ext.CassandraConsistencyLevel), "QUORUM") assert.Equal(span.Tag(ext.CassandraPaginated), "false") assert.Equal(span.Tag(ext.Component), "gocql/gocql") + assert.Equal(string(instrumentation.PackageGoCQL), span.Integration()) assert.Equal(span.Tag(ext.SpanKind), ext.SpanKindClient) assert.Equal(span.Tag(ext.DBSystem), "cassandra") assert.NotContains(span.Tags(), ext.CassandraContactPoints) @@ -117,7 +117,7 @@ func TestChildWrapperSpan(t *testing.T) { // Call WithContext before WrapQuery to prove WrapQuery needs to use the query.Context() // instead of context.Background() q := session.Query("SELECT * FROM trace.person").WithContext(ctx) - tq := WrapQuery(q, WithServiceName("TestServiceName")) + tq := wrapQuery(q, nil, WithService("TestServiceName")) iter := tq.Iter() iter.Close() parentSpan.Finish() @@ -125,7 +125,7 @@ func TestChildWrapperSpan(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var childSpan, pSpan mocktracer.Span + var childSpan, pSpan *mocktracer.Span if spans[0].ParentID() == spans[1].SpanID() { childSpan = spans[0] pSpan = spans[1] @@ -139,6 +139,7 @@ func TestChildWrapperSpan(t *testing.T) { assert.Equal(childSpan.Tag(ext.ResourceName), "SELECT * FROM trace.person") assert.Equal(childSpan.Tag(ext.CassandraKeyspace), "trace") assert.Equal(childSpan.Tag(ext.Component), "gocql/gocql") + assert.Equal(string(instrumentation.PackageGoCQL), childSpan.Integration()) assert.Equal(childSpan.Tag(ext.SpanKind), ext.SpanKindClient) assert.Equal(childSpan.Tag(ext.DBSystem), "cassandra") assert.NotContains(childSpan.Tags(), ext.CassandraContactPoints) @@ -152,7 +153,7 @@ func TestChildWrapperSpan(t *testing.T) { } func TestCompatMode(t *testing.T) { - genSpans := func(t *testing.T) []mocktracer.Span { + genSpans := func(t *testing.T) []*mocktracer.Span { mt := mocktracer.Start() defer mt.Stop() @@ -161,7 +162,7 @@ func TestCompatMode(t *testing.T) { require.NoError(t, err) q := session.Query("SELECT * FROM trace.person").WithContext(context.Background()) - tq := WrapQuery(q, WithServiceName("TestServiceName")) + tq := WrapQuery(q, WithService("TestServiceName")) iter := tq.Iter() err = iter.Close() require.NoError(t, err) @@ -228,8 +229,8 @@ func TestErrNotFound(t *testing.T) { var age int t.Run("default", func(t *testing.T) { - tq := WrapQuery(q, - WithServiceName("TestServiceName"), + tq := wrapQuery(q, nil, + WithService("TestServiceName"), // By default, not using WithErrorCheck, any error is an error from tracing POV ) err = tq.Scan(&name, &age) @@ -243,12 +244,12 @@ func TestErrNotFound(t *testing.T) { span := spans[0] assert.Equal(span.OperationName(), "cassandra.query") assert.Equal(span.Tag(ext.ResourceName), "SELECT name, age FROM trace.person WHERE name = 'This does not exist'") - assert.NotNil(span.Tag(ext.Error), "trace is marked as an error, default behavior") + assert.NotNil(span.Tag(ext.ErrorMsg), "trace is marked as an error, default behavior") }) t.Run("WithErrorCheck", func(t *testing.T) { - tq := WrapQuery(q, - WithServiceName("TestServiceName"), + tq := wrapQuery(q, nil, + WithService("TestServiceName"), // Typical use of WithErrorCheck -> do not return errors when the error is // gocql.ErrNotFound, most of the time this is fine, there is just zero rows // of data, but this can be perfectly acceptable. The gocql API returns this @@ -265,37 +266,35 @@ func TestErrNotFound(t *testing.T) { span := spans[1] assert.Equal(span.OperationName(), "cassandra.query") assert.Equal(span.Tag(ext.ResourceName), "SELECT name, age FROM trace.person WHERE name = 'This does not exist'") - assert.Nil(span.Tag(ext.Error), "trace is not marked as an error, it just has no data") + assert.Zero(span.Tag(ext.ErrorMsg), "trace is not marked as an error, it just has no data") }) } func TestAnalyticsSettings(t *testing.T) { - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate float64, opts ...WrapOption) { + assertRate := func(t *testing.T, mt mocktracer.Tracer, rate any, opts ...WrapOption) { cluster := newCassandraCluster() session, err := cluster.CreateSession() assert.Nil(t, err) // Create a query for testing Iter spans q := session.Query("CREATE KEYSPACE trace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };") - iter := WrapQuery(q, opts...).Iter() + iter := wrapQuery(q, nil, opts...).Iter() iter.Close() // this will error, we're inspecting the trace not the error // Create a query for testing Scanner spans q2 := session.Query("CREATE KEYSPACE trace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };") - scanner := WrapQuery(q2, opts...).Iter().Scanner() + scanner := wrapQuery(q2, nil, opts...).Iter().Scanner() scanner.Err() // this will error, we're inspecting the trace not the error // Create a batch query for testing Batch spans - b := WrapBatch(session.NewBatch(gocql.UnloggedBatch), opts...) + b := wrapBatch(session.NewBatch(gocql.UnloggedBatch), nil, opts...) b.Query("CREATE KEYSPACE trace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };") b.ExecuteBatch(session) // this will error, we're inspecting the trace not the error spans := mt.FinishedSpans() assert.Len(t, spans, 3) for _, s := range spans { - if !math.IsNaN(rate) { - assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) - } + assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) } } @@ -303,7 +302,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, globalconfig.AnalyticsRate()) + assertRate(t, mt, nil) }) t.Run("global", func(t *testing.T) { @@ -311,9 +310,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -329,16 +326,14 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, math.NaN(), WithAnalytics(false)) + assertRate(t, mt, nil, WithAnalytics(false)) }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -356,7 +351,7 @@ func TestIterScanner(t *testing.T) { assert.NoError(err) q := session.Query("SELECT * from trace.person") - tq := WrapQuery(q, WithServiceName("TestServiceName")) + tq := wrapQuery(q, nil, WithService("TestServiceName")) iter := tq.WithContext(ctx).Iter() sc := iter.Scanner() for sc.Next() { @@ -370,7 +365,7 @@ func TestIterScanner(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var childSpan, pSpan mocktracer.Span + var childSpan, pSpan *mocktracer.Span if spans[0].ParentID() == spans[1].SpanID() { childSpan = spans[0] pSpan = spans[1] @@ -385,6 +380,7 @@ func TestIterScanner(t *testing.T) { assert.Equal(childSpan.Tag(ext.ResourceName), "SELECT * from trace.person") assert.Equal(childSpan.Tag(ext.CassandraKeyspace), "trace") assert.Equal(childSpan.Tag(ext.Component), "gocql/gocql") + assert.Equal(string(instrumentation.PackageGoCQL), childSpan.Integration()) assert.Equal(childSpan.Tag(ext.SpanKind), ext.SpanKindClient) assert.Equal(childSpan.Tag(ext.DBSystem), "cassandra") assert.NotContains(childSpan.Tags(), ext.CassandraContactPoints) @@ -403,7 +399,7 @@ func TestBatch(t *testing.T) { assert.NoError(err) b := session.NewBatch(gocql.UnloggedBatch) - tb := WrapBatch(b, WithServiceName("TestServiceName"), WithResourceName("BatchInsert")) + tb := wrapBatch(b, nil, WithService("TestServiceName"), WithResourceName("BatchInsert")) stmt := "INSERT INTO trace.person (name, age, description) VALUES (?, ?, ?)" tb.Query(stmt, "Kate", 80, "Cassandra's sister running in kubernetes") @@ -416,7 +412,7 @@ func TestBatch(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var childSpan, pSpan mocktracer.Span + var childSpan, pSpan *mocktracer.Span if spans[0].ParentID() == spans[1].SpanID() { childSpan = spans[0] pSpan = spans[1] @@ -431,6 +427,7 @@ func TestBatch(t *testing.T) { assert.Equal(childSpan.Tag(ext.ResourceName), "BatchInsert") assert.Equal(childSpan.Tag(ext.CassandraKeyspace), "trace") assert.Equal(childSpan.Tag(ext.Component), "gocql/gocql") + assert.Equal(string(instrumentation.PackageGoCQL), childSpan.Integration()) assert.Equal(childSpan.Tag(ext.SpanKind), ext.SpanKindClient) assert.Equal(childSpan.Tag(ext.DBSystem), "cassandra") assert.NotContains(childSpan.Tags(), ext.CassandraContactPoints) @@ -479,7 +476,7 @@ func TestWithWrapOptions(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - cluster := newTracedCassandraCluster(WithServiceName("test-service"), WithResourceName("cluster-resource")) + cluster := newTracedCassandraCluster(WithService("test-service"), WithResourceName("cluster-resource")) session, err := cluster.CreateSession() require.NoError(t, err) @@ -532,7 +529,7 @@ func TestWithCustomTag(t *testing.T) { defer mt.Stop() q := session.Query("CREATE KEYSPACE IF NOT EXISTS trace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };") - iter := WrapQuery(q, WithCustomTag("custom_tag", "value")).Iter() + iter := wrapQuery(q, nil, WithCustomTag("custom_tag", "value")).Iter() err = iter.Close() require.NoError(t, err) @@ -548,7 +545,7 @@ func TestWithCustomTag(t *testing.T) { defer mt.Stop() b := session.NewBatch(gocql.UnloggedBatch) - tb := WrapBatch(b, WithCustomTag("custom_tag", "value")) + tb := wrapBatch(b, nil, WithCustomTag("custom_tag", "value")) stmt := "INSERT INTO trace.person (name, age, description) VALUES (?, ?, ?)" tb.Query(stmt, "Kate", 80, "Cassandra's sister running in kubernetes") tb.Query(stmt, "Lucas", 60, "Another person") @@ -563,51 +560,3 @@ func TestWithCustomTag(t *testing.T) { assert.Equal(t, "value", s0.Tag("custom_tag")) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []WrapOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - cluster := newTracedCassandraCluster(opts...) - session, err := cluster.CreateSession() - require.NoError(t, err) - - stmt := "INSERT INTO trace.person (name, age, description) VALUES (?, ?, ?)" - - // generate query span - err = session.Query(stmt, "name", 30, "description").Exec() - require.NoError(t, err) - - // generate batch span - tb := session.NewBatch(gocql.UnloggedBatch) - - tb.Query(stmt, "Kate", 80, "Cassandra's sister running in kubernetes") - tb.Query(stmt, "Lucas", 60, "Another person") - err = tb.ExecuteBatch(session.Session) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "cassandra.query", spans[0].OperationName()) - assert.Equal(t, "cassandra.batch", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "cassandra.query", spans[0].OperationName()) - assert.Equal(t, "cassandra.query", spans[1].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"gocql.query", "gocql.query"}, - WithDDService: []string{"gocql.query", "gocql.query"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride, namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} diff --git a/contrib/gocql/gocql/observer.go b/contrib/gocql/gocql/observer.go index a75d4c8b16..fe8ef94353 100644 --- a/contrib/gocql/gocql/observer.go +++ b/contrib/gocql/gocql/observer.go @@ -11,8 +11,8 @@ import ( "github.com/gocql/gocql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) // CreateTracedSession returns a new session augmented with tracing. @@ -38,7 +38,7 @@ func CreateTracedSession(cluster *gocql.ClusterConfig, opts ...WrapOption) (*goc func NewObserver(cluster *gocql.ClusterConfig, opts ...WrapOption) *Observer { cfg := defaultConfig() for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } return &Observer{ cfg: cfg, diff --git a/contrib/gocql/gocql/observer_test.go b/contrib/gocql/gocql/observer_test.go index 148dd3d1bb..747bd514a7 100644 --- a/contrib/gocql/gocql/observer_test.go +++ b/contrib/gocql/gocql/observer_test.go @@ -13,9 +13,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) func TestObserver_Query(t *testing.T) { @@ -25,7 +26,7 @@ func TestObserver_Query(t *testing.T) { updateQuery func(cluster *gocql.ClusterConfig, sess *gocql.Session, q *gocql.Query) *gocql.Query wantServiceName string wantResourceName string - wantRowCount int + wantRowCount float64 wantErr bool wantErrTag bool }{ @@ -37,7 +38,7 @@ func TestObserver_Query(t *testing.T) { { name: "service_and_resource_name", opts: []WrapOption{ - WithServiceName("test-service"), + WithService("test-service"), WithResourceName("test-resource"), }, wantRowCount: 1, @@ -80,7 +81,7 @@ func TestObserver_Query(t *testing.T) { WithTraceQuery(false), }, updateQuery: func(cluster *gocql.ClusterConfig, _ *gocql.Session, q *gocql.Query) *gocql.Query { - obs := NewObserver(cluster, WithResourceName("test resource"), WithServiceName("test service")) + obs := NewObserver(cluster, WithResourceName("test resource"), WithService("test service")) return q.Observer(obs) }, wantServiceName: "test service", @@ -154,9 +155,9 @@ func TestObserver_Query(t *testing.T) { assert.Equal(t, wantRowCount, querySpan.Tag(ext.CassandraRowCount)) if tc.wantErrTag { - assert.NotNil(t, querySpan.Tag(ext.Error)) + assert.NotNil(t, querySpan.Tag(ext.ErrorMsg)) } else { - assert.Nil(t, querySpan.Tag(ext.Error)) + assert.Nil(t, querySpan.Tag(ext.ErrorMsg)) } }) } @@ -179,7 +180,7 @@ func TestObserver_Batch(t *testing.T) { { name: "service_and_resource_name", opts: []WrapOption{ - WithServiceName("test-service"), + WithService("test-service"), WithResourceName("test-resource"), }, wantServiceName: "test-service", @@ -223,7 +224,7 @@ func TestObserver_Batch(t *testing.T) { WithTraceBatch(false), }, updateBatch: func(cluster *gocql.ClusterConfig, _ *gocql.Session, b *gocql.Batch) *gocql.Batch { - obs := NewObserver(cluster, WithResourceName("test resource"), WithServiceName("test service")) + obs := NewObserver(cluster, WithResourceName("test resource"), WithService("test service")) return b.Observer(obs) }, wantServiceName: "test service", @@ -298,9 +299,9 @@ func TestObserver_Batch(t *testing.T) { assert.Nil(t, batchSpan.Tag(ext.CassandraRowCount)) if tc.wantErrTag { - assert.NotNil(t, batchSpan.Tag(ext.Error)) + assert.NotNil(t, batchSpan.Tag(ext.ErrorMsg)) } else { - assert.Nil(t, batchSpan.Tag(ext.Error)) + assert.Nil(t, batchSpan.Tag(ext.ErrorMsg)) } }) } @@ -322,7 +323,7 @@ func TestObserver_Connect(t *testing.T) { { name: "service_and_resource_name", opts: []WrapOption{ - WithServiceName("test-service"), + WithService("test-service"), WithResourceName("test-resource"), }, wantServiceName: "test-service", @@ -362,9 +363,9 @@ func TestObserver_Connect(t *testing.T) { spans := mt.FinishedSpans() - var okSpans []mocktracer.Span - var okSpansHostInfo []mocktracer.Span - var errSpans []mocktracer.Span + var okSpans []*mocktracer.Span + var okSpansHostInfo []*mocktracer.Span + var errSpans []*mocktracer.Span for _, span := range spans { port := span.Tag(ext.TargetPort) @@ -390,6 +391,7 @@ func TestObserver_Connect(t *testing.T) { assert.Equal(t, wantService, span.Tag(ext.ServiceName)) assert.Equal(t, "gocql/gocql", span.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGoCQL), span.Integration()) assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(t, "cassandra", span.Tag(ext.DBSystem)) assert.Equal(t, "127.0.0.1:9042,127.0.0.1:9043", span.Tag(ext.CassandraContactPoints)) @@ -397,7 +399,7 @@ func TestObserver_Connect(t *testing.T) { } for _, span := range okSpans { assert.Equal(t, "9042", span.Tag(ext.TargetPort)) - assert.Nil(t, span.Tag(ext.Error)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) if span.Tag(ext.CassandraHostID) != nil { okSpansHostInfo = append(okSpansHostInfo, span) @@ -413,7 +415,7 @@ func TestObserver_Connect(t *testing.T) { } for _, span := range errSpans { assert.Equal(t, "9043", span.Tag(ext.TargetPort)) - assert.NotNil(t, span.Tag(ext.Error)) + assert.NotNil(t, span.Tag(ext.ErrorMsg)) // since this node does not exist, this information should not be present. assert.Nil(t, span.Tag(ext.CassandraCluster)) @@ -424,11 +426,12 @@ func TestObserver_Connect(t *testing.T) { } } -func assertCommonTags(t *testing.T, span mocktracer.Span) { +func assertCommonTags(t *testing.T, span *mocktracer.Span) { t.Helper() assert.Equal(t, "trace", span.Tag(ext.CassandraKeyspace)) assert.Equal(t, "gocql/gocql", span.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGoCQL), span.Integration()) assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(t, "cassandra", span.Tag(ext.DBSystem)) assert.Equal(t, "127.0.0.1:9042,127.0.0.1:9043", span.Tag(ext.CassandraContactPoints)) diff --git a/contrib/gocql/gocql/option.go b/contrib/gocql/gocql/option.go index e6e70a75e4..fbbd3e2421 100644 --- a/contrib/gocql/gocql/option.go +++ b/contrib/gocql/gocql/option.go @@ -7,17 +7,13 @@ package gocql import ( "math" - "os" "golang.org/x/mod/semver" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" ) -const defaultServiceName = "gocql.query" - type config struct { serviceName, resourceName string querySpanName, batchSpanName string @@ -29,8 +25,17 @@ type config struct { traceQuery, traceBatch, traceConnect bool } -// WrapOption represents an option that can be passed to WrapQuery. -type WrapOption func(*config) +// WrapOption describes options for the Cassandra integration. +type WrapOption interface { + apply(*config) +} + +// WrapOptionFn represents options applicable to NewCluster, Query.WithWrapOptions and Batch.WithWrapOptions. +type WrapOptionFn func(config *config) + +func (fn WrapOptionFn) apply(cfg *config) { + fn(cfg) +} func defaultConfig() *config { cfg := &config{ @@ -38,28 +43,25 @@ func defaultConfig() *config { traceBatch: true, traceConnect: true, } - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.querySpanName = namingschema.OpName(namingschema.CassandraOutbound) - cfg.batchSpanName = namingschema.OpNameOverrideV0(namingschema.CassandraOutbound, "cassandra.batch") - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GOCQL_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - if compatMode := os.Getenv("DD_TRACE_GOCQL_COMPAT"); compatMode != "" { + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.querySpanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.batchSpanName = instr.OperationName(instrumentation.ComponentDefault, instrumentation.OperationContext{ + "operationType": "batch", + }) + cfg.analyticsRate = instr.AnalyticsRate(false) + if compatMode := env.Get("DD_TRACE_GOCQL_COMPAT"); compatMode != "" { if semver.IsValid(compatMode) { cfg.clusterTagLegacyMode = semver.Compare(semver.MajorMinor(compatMode), "v1.65") <= 0 } else { - log.Warn("ignoring DD_TRACE_GOCQL_COMPAT: invalid version %q", compatMode) + instr.Logger().Warn("ignoring DD_TRACE_GOCQL_COMPAT: invalid version %q", compatMode) } } cfg.errCheck = func(error) bool { return true } return cfg } -// WithServiceName sets the given service name for the returned query. -func WithServiceName(name string) WrapOption { +// WithService sets the given service name for the returned query. +func WithService(name string) WrapOptionFn { return func(cfg *config) { cfg.serviceName = name } @@ -71,14 +73,14 @@ func WithServiceName(name string) WrapOption { // environments. The gocql library returns the query statement using an fmt.Sprintf // call, which can be costly when called repeatedly. Using WithResourceName will // avoid that call. Under normal circumstances, it is safe to rely on the default. -func WithResourceName(name string) WrapOption { +func WithResourceName(name string) WrapOptionFn { return func(cfg *config) { cfg.resourceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) WrapOption { +func WithAnalytics(on bool) WrapOptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -90,7 +92,7 @@ func WithAnalytics(on bool) WrapOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) WrapOption { +func WithAnalyticsRate(rate float64) WrapOptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -103,7 +105,7 @@ func WithAnalyticsRate(rate float64) WrapOption { // NoDebugStack prevents stack traces from being attached to spans finishing // with an error. This is useful in situations where errors are frequent and // performance is critical. -func NoDebugStack() WrapOption { +func NoDebugStack() WrapOptionFn { return func(cfg *config) { cfg.noDebugStack = true } @@ -116,7 +118,7 @@ func (c *config) shouldIgnoreError(err error) bool { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. The fn is called whenever a CQL request // finishes with an error. -func WithErrorCheck(fn func(err error) bool) WrapOption { +func WithErrorCheck(fn func(err error) bool) WrapOptionFn { return func(cfg *config) { // When the error is explicitly marked as not-an-error, that is // when this errCheck function returns false, the APM code will @@ -132,7 +134,7 @@ func WithErrorCheck(fn func(err error) bool) WrapOption { } // WithCustomTag will attach the value to the span tagged by the key. -func WithCustomTag(key string, value interface{}) WrapOption { +func WithCustomTag(key string, value interface{}) WrapOptionFn { return func(cfg *config) { if cfg.customTags == nil { cfg.customTags = make(map[string]interface{}) @@ -143,7 +145,7 @@ func WithCustomTag(key string, value interface{}) WrapOption { // WithTraceQuery will enable tracing for queries (default is true). // This option only takes effect in CreateTracedSession and NewObserver. -func WithTraceQuery(enabled bool) WrapOption { +func WithTraceQuery(enabled bool) WrapOptionFn { return func(cfg *config) { cfg.traceQuery = enabled } @@ -151,7 +153,7 @@ func WithTraceQuery(enabled bool) WrapOption { // WithTraceBatch will enable tracing for batches (default is true). // This option only takes effect in CreateTracedSession and NewObserver. -func WithTraceBatch(enabled bool) WrapOption { +func WithTraceBatch(enabled bool) WrapOptionFn { return func(cfg *config) { cfg.traceBatch = enabled } @@ -159,7 +161,7 @@ func WithTraceBatch(enabled bool) WrapOption { // WithTraceConnect will enable tracing for connections (default is true). // This option only takes effect in CreateTracedSession and NewObserver. -func WithTraceConnect(enabled bool) WrapOption { +func WithTraceConnect(enabled bool) WrapOptionFn { return func(cfg *config) { cfg.traceConnect = enabled } diff --git a/contrib/gocql/gocql/orchestrion.yml b/contrib/gocql/gocql/orchestrion.yml new file mode 100644 index 0000000000..63ce561910 --- /dev/null +++ b/contrib/gocql/gocql/orchestrion.yml @@ -0,0 +1,58 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 + description: Package gocql implements a fast and robust Cassandra client for the Go programming language. + +aspects: + - id: ClusterConfig + join-point: + all-of: + - one-of: + - struct-literal: + type: github.com/gocql/gocql.ClusterConfig + match: pointer-only + - function-call: github.com/gocql/gocql.NewCluster + # Avoid circular dependency. + - not: + import-path: github.com/gocql/gocql + advice: + - wrap-expression: + imports: + gocql: github.com/gocql/gocql + gocqltrace: github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 + template: |- + func(cluster *gocql.ClusterConfig) *gocql.ClusterConfig { + obs := gocqltrace.NewObserver(cluster) + cluster.QueryObserver = obs + cluster.BatchObserver = obs + cluster.ConnectObserver = obs + return cluster + }({{ . }}) + + - id: '*ClusterConfig' + join-point: + all-of: + - struct-literal: + type: github.com/gocql/gocql.ClusterConfig + match: value-only + # Avoid circular dependency. + - not: + import-path: github.com/gocql/gocql + advice: + - wrap-expression: + imports: + gocql: github.com/gocql/gocql + gocqltrace: github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 + template: |- + func(cluster gocql.ClusterConfig) gocql.ClusterConfig { + obs := gocqltrace.NewObserver(&cluster) + cluster.QueryObserver = obs + cluster.BatchObserver = obs + cluster.ConnectObserver = obs + return cluster + }({{ . }}) diff --git a/contrib/gofiber/fiber.v2/example_test.go b/contrib/gofiber/fiber.v2/example_test.go index 29149fdae1..570e4ab703 100644 --- a/contrib/gofiber/fiber.v2/example_test.go +++ b/contrib/gofiber/fiber.v2/example_test.go @@ -6,8 +6,8 @@ package fiber_test import ( - fibertrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gofiber/fiber.v2" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + fibertrace "github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/gofiber/fiber/v2" ) @@ -41,7 +41,7 @@ func Example_withServiceName() { router := fiber.New() // Use the tracer middleware with your desired service name. - router.Use(fibertrace.Middleware(fibertrace.WithServiceName("fiber"))) + router.Use(fibertrace.Middleware(fibertrace.WithService("fiber"))) // Set up some endpoints. router.Get("/", func(c *fiber.Ctx) error { diff --git a/contrib/gofiber/fiber.v2/fiber.go b/contrib/gofiber/fiber.v2/fiber.go index 7d9ef223fe..e910181528 100644 --- a/contrib/gofiber/fiber.v2/fiber.go +++ b/contrib/gofiber/fiber.v2/fiber.go @@ -4,7 +4,7 @@ // Copyright 2016 Datadog, Inc. // Package fiber provides tracing functions for tracing the fiber package (https://github.com/gofiber/fiber). -package fiber // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gofiber/fiber.v2" +package fiber // import "github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2" import ( "fmt" @@ -12,20 +12,19 @@ import ( "net/http" "strconv" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/gofiber/fiber/v2" ) const componentName = "gofiber/fiber.v2" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/gofiber/fiber/v2") + instr = instrumentation.Load(instrumentation.PackageGoFiberV2) } // Middleware returns middleware that will trace incoming requests. @@ -33,15 +32,15 @@ func Middleware(opts ...Option) func(c *fiber.Ctx) error { cfg := new(config) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("gofiber/fiber.v2: Middleware: %#v", cfg) + instr.Logger().Debug("gofiber/fiber.v2: Middleware: %#v", cfg) return func(c *fiber.Ctx) error { if cfg.ignoreRequest(c) { return c.Next() } - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeWeb), tracer.ServiceName(cfg.serviceName), tracer.Tag(ext.HTTPMethod, c.Method()), @@ -62,6 +61,10 @@ func Middleware(opts ...Option) func(c *fiber.Ctx) error { } } if spanctx, err := tracer.Extract(tracer.HTTPHeadersCarrier(h)); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } opts = append(opts, cfg.spanOpts...) @@ -69,7 +72,7 @@ func Middleware(opts ...Option) func(c *fiber.Ctx) error { tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindServer), ) - span, ctx := tracer.StartSpanFromContext(c.Context(), cfg.spanName, opts...) + span, ctx := tracer.StartSpanFromContext(c.UserContext(), cfg.spanName, opts...) defer span.Finish() @@ -95,7 +98,7 @@ func Middleware(opts ...Option) func(c *fiber.Ctx) error { span.SetTag(ext.Error, err) } else if cfg.isStatusError(status) { // mark 5xx server error - span.SetTag(ext.Error, fmt.Errorf("%d: %s", status, http.StatusText(status))) + span.SetTag(ext.ErrorNoStackTrace, fmt.Errorf("%d: %s", status, http.StatusText(status))) } return err } diff --git a/contrib/gofiber/fiber.v2/fiber_test.go b/contrib/gofiber/fiber.v2/fiber_test.go index 6bd0fb786b..5da45bf27d 100644 --- a/contrib/gofiber/fiber.v2/fiber_test.go +++ b/contrib/gofiber/fiber.v2/fiber_test.go @@ -6,20 +6,19 @@ package fiber import ( + "context" "fmt" "net/http" "net/http/httptest" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/gofiber/fiber/v2" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestChildSpan(t *testing.T) { @@ -28,7 +27,7 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/user/:id", func(c *fiber.Ctx) error { return c.SendString(c.Params("id")) }) @@ -70,6 +69,7 @@ func TestTrace200(t *testing.T) { assert.Equal("/user/123", span.Tag(ext.HTTPURL)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gofiber/fiber.v2", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal("/user/:id", span.Tag(ext.HTTPRoute)) } @@ -79,7 +79,7 @@ func TestTrace200(t *testing.T) { defer mt.Stop() router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/user/:id", func(c *fiber.Ctx) error { return c.SendString(c.Params("id")) }) @@ -93,7 +93,7 @@ func TestTrace200(t *testing.T) { defer mt.Stop() router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/user/:id", func(c *fiber.Ctx) error { return c.SendString(c.Params("id")) }) @@ -108,7 +108,7 @@ func TestStatusError(t *testing.T) { // setup router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) code := 500 wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) @@ -134,7 +134,7 @@ func TestStatusError(t *testing.T) { assert.Equal("foobar", span.Tag(ext.ServiceName)) assert.Equal("500", span.Tag(ext.HTTPCode)) assert.Equal("/err", span.Tag(ext.HTTPRoute)) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) } func TestCustomError(t *testing.T) { @@ -143,7 +143,7 @@ func TestCustomError(t *testing.T) { defer mt.Stop() router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/err", func(c *fiber.Ctx) error { c.SendStatus(400) @@ -165,9 +165,10 @@ func TestCustomError(t *testing.T) { assert.Equal("http.request", span.OperationName()) assert.Equal("foobar", span.Tag(ext.ServiceName)) assert.Equal("400", span.Tag(ext.HTTPCode)) - assert.Equal(fiber.ErrBadRequest, span.Tag(ext.Error).(*fiber.Error)) + assert.Equal(fiber.ErrBadRequest.Error(), span.Tag(ext.ErrorMsg)) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("gofiber/fiber.v2", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal("/err", span.Tag(ext.HTTPRoute)) } @@ -178,11 +179,30 @@ func TestUserContext(t *testing.T) { // setup router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + + // define a custom context key + type contextKey string + const fooKey contextKey = "foo" + + // add a middleware that adds a value to the context + router.Use(func(c *fiber.Ctx) error { + ctx := context.WithValue(c.UserContext(), fooKey, "bar") + c.SetUserContext(ctx) + return c.Next() + }) + + // add the middleware + router.Use(Middleware(WithService("foobar"))) router.Get("/", func(c *fiber.Ctx) error { // check if not default empty context assert.NotEmpty(c.UserContext()) + + // checks that the user context still has the information provided before using the middleware + foo, ok := c.UserContext().Value(fooKey).(string) + assert.True(ok) + assert.Equal(foo, "bar") + span, _ := tracer.StartSpanFromContext(c.UserContext(), "http.request") defer span.Finish() return c.SendString("test") @@ -225,7 +245,7 @@ func TestPropagation(t *testing.T) { requestWithoutSpan := httptest.NewRequest("GET", "/span/exists/false", nil) router := fiber.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.Get("/span/exists/true", func(c *fiber.Ctx) error { s, _ := tracer.SpanFromContext(c.UserContext()) assert.Equal(s.Context().TraceID() == pspan.Context().TraceID(), true) @@ -276,9 +296,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -301,38 +319,12 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := fiber.New() - mux.Use(Middleware(opts...)) - mux.Get("/200", func(c *fiber.Ctx) error { - return c.SendString("ok") - }) - req := httptest.NewRequest("GET", "/200", nil) - resp, err := mux.Test(req) - require.NoError(t, err) - defer resp.Body.Close() - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "fiber")(t) -} - func TestIgnoreRequest(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() diff --git a/contrib/gofiber/fiber.v2/go.mod b/contrib/gofiber/fiber.v2/go.mod new file mode 100644 index 0000000000..00ca171be2 --- /dev/null +++ b/contrib/gofiber/fiber.v2/go.mod @@ -0,0 +1,101 @@ +module github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/gofiber/fiber/v2 v2.52.9 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/gofiber/fiber.v2/go.sum b/contrib/gofiber/fiber.v2/go.sum new file mode 100644 index 0000000000..2e4ee5ecf1 --- /dev/null +++ b/contrib/gofiber/fiber.v2/go.sum @@ -0,0 +1,331 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw= +github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/gofiber/fiber.v2/option.go b/contrib/gofiber/fiber.v2/option.go index 5af4689cf9..d8c26462b1 100644 --- a/contrib/gofiber/fiber.v2/option.go +++ b/contrib/gofiber/fiber.v2/option.go @@ -8,45 +8,45 @@ package fiber import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/gofiber/fiber/v2" ) -const defaultServiceName = "fiber" - type config struct { serviceName string spanName string isStatusError func(statusCode int) bool - spanOpts []ddtrace.StartSpanOption // additional span options to be applied + spanOpts []tracer.StartSpanOption // additional span options to be applied analyticsRate float64 resourceNamer func(*fiber.Ctx) string ignoreRequest func(*fiber.Ctx) bool } -// Option represents an option that can be passed to NewRouter. -type Option func(*config) +// Option describes options for the Fiber.v2 integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Middleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.HTTPServer) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.analyticsRate = instr.AnalyticsRate(true) + cfg.spanName = instr.OperationName(instrumentation.ComponentServer, nil) cfg.isStatusError = isServerError cfg.resourceNamer = defaultResourceNamer cfg.ignoreRequest = defaultIgnoreRequest - - if internal.BoolEnv("DD_TRACE_FIBER_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } } -// WithServiceName sets the given service name for the router. -func WithServiceName(name string) Option { +// WithService sets the given service name for the router. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } @@ -54,14 +54,14 @@ func WithServiceName(name string) Option { // WithSpanOptions applies the given set of options to the spans started // by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { return func(cfg *config) { cfg.spanOpts = opts } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -73,7 +73,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -84,7 +84,7 @@ func WithAnalyticsRate(rate float64) Option { } // WithStatusCheck allow setting of a function to tell whether a status code is an error -func WithStatusCheck(fn func(statusCode int) bool) Option { +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { return func(cfg *config) { cfg.isStatusError = fn } @@ -93,7 +93,7 @@ func WithStatusCheck(fn func(statusCode int) bool) Option { // WithResourceNamer specifies a function which will be used to // obtain the resource name for a given request taking the go-fiber context // as input -func WithResourceNamer(fn func(*fiber.Ctx) string) Option { +func WithResourceNamer(fn func(*fiber.Ctx) string) OptionFn { return func(cfg *config) { cfg.resourceNamer = fn } @@ -101,7 +101,7 @@ func WithResourceNamer(fn func(*fiber.Ctx) string) Option { // WithIgnoreRequest specifies a function which will be used to // determining if the incoming HTTP request tracing should be skipped. -func WithIgnoreRequest(fn func(*fiber.Ctx) bool) Option { +func WithIgnoreRequest(fn func(*fiber.Ctx) bool) OptionFn { return func(cfg *config) { cfg.ignoreRequest = fn } diff --git a/contrib/gofiber/fiber.v2/orchestrion.yml b/contrib/gofiber/fiber.v2/orchestrion.yml new file mode 100644 index 0000000000..ca2f18328a --- /dev/null +++ b/contrib/gofiber/fiber.v2/orchestrion.yml @@ -0,0 +1,25 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 + description: An Express inspired web framework built on Fasthttp, the fastest HTTP engine for Go. + +aspects: + - id: New + join-point: + function-call: github.com/gofiber/fiber/v2.New + advice: + - wrap-expression: + imports: + fiber: github.com/gofiber/fiber/v2 + fibertrace: github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 + template: |- + func() *fiber.App { + app := {{ . }} + app.Use(fibertrace.Middleware()) + return app + }() diff --git a/contrib/gomodule/redigo/example_test.go b/contrib/gomodule/redigo/example_test.go index 706a6485b8..02264e775d 100644 --- a/contrib/gomodule/redigo/example_test.go +++ b/contrib/gomodule/redigo/example_test.go @@ -10,8 +10,8 @@ import ( "log" "time" - redigotrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gomodule/redigo" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + redigotrace "github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/gomodule/redigo/redis" ) @@ -19,6 +19,9 @@ import ( // To start tracing Redis commands, use the TracedDial function to create a connection, // passing in a service name of choice. func Example() { + tracer.Start() + defer tracer.Stop() + c, err := redigotrace.Dial("tcp", "127.0.0.1:6379") if err != nil { log.Fatal(err) @@ -39,8 +42,11 @@ func Example() { } func Example_tracedConn() { + tracer.Start() + defer tracer.Stop() + c, err := redigotrace.Dial("tcp", "127.0.0.1:6379", - redigotrace.WithServiceName("my-redis-backend"), + redigotrace.WithService("my-redis-backend"), redis.DialKeepAlive(time.Minute), ) if err != nil { @@ -63,6 +69,9 @@ func Example_tracedConn() { // Alternatively, provide a redis URL to the TracedDialURL function func Example_dialURL() { + tracer.Start() + defer tracer.Stop() + c, err := redigotrace.DialURL("redis://127.0.0.1:6379") if err != nil { log.Fatal(err) @@ -72,10 +81,13 @@ func Example_dialURL() { // When using a redigo Pool, set your Dial function to return a traced connection func Example_pool() { + tracer.Start() + defer tracer.Stop() + pool := &redis.Pool{ Dial: func() (redis.Conn, error) { return redigotrace.Dial("tcp", "127.0.0.1:6379", - redigotrace.WithServiceName("my-redis-backend"), + redigotrace.WithService("my-redis-backend"), ) }, } diff --git a/contrib/gomodule/redigo/go.mod b/contrib/gomodule/redigo/go.mod new file mode 100644 index 0000000000..d971dd33bd --- /dev/null +++ b/contrib/gomodule/redigo/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/gomodule/redigo v1.8.9 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/gomodule/redigo/go.sum b/contrib/gomodule/redigo/go.sum new file mode 100644 index 0000000000..75bed3a43f --- /dev/null +++ b/contrib/gomodule/redigo/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/gomodule/redigo/option.go b/contrib/gomodule/redigo/option.go index 0089dae650..caa3510ddb 100644 --- a/contrib/gomodule/redigo/option.go +++ b/contrib/gomodule/redigo/option.go @@ -3,13 +3,12 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package redigo // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gomodule/redigo" +package redigo // import "github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2" import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) type dialConfig struct { @@ -19,40 +18,42 @@ type dialConfig struct { connectionType int } -const defaultServiceName = "redis.conn" - const ( connectionTypeWithTimeout = iota connectionTypeWithContext connectionTypeDefault ) -// DialOption represents an option that can be passed to Dial. -type DialOption func(*dialConfig) +// DialOption describes options for the Redis integration. +type DialOption interface { + apply(*dialConfig) +} + +// DialOptionFn represents options applicable to Dial, DialContext and DialURL. +type DialOptionFn func(*dialConfig) + +func (fn DialOptionFn) apply(cfg *dialConfig) { + fn(cfg) +} func defaults(cfg *dialConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.RedisOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_REDIGO_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) // Default to withTimeout to maintain backwards compatibility. cfg.connectionType = connectionTypeWithTimeout } -// WithServiceName sets the given service name for the dialled connection. -func WithServiceName(name string) DialOption { +// WithService sets the given service name for the dialled connection. +func WithService(name string) DialOptionFn { return func(cfg *dialConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) DialOption { +func WithAnalytics(on bool) DialOptionFn { return func(cfg *dialConfig) { if on { cfg.analyticsRate = 1.0 @@ -64,7 +65,7 @@ func WithAnalytics(on bool) DialOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) DialOption { +func WithAnalyticsRate(rate float64) DialOptionFn { return func(cfg *dialConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -75,21 +76,21 @@ func WithAnalyticsRate(rate float64) DialOption { } // WithTimeoutConnection wraps the connection with redis.ConnWithTimeout. -func WithTimeoutConnection() DialOption { +func WithTimeoutConnection() DialOptionFn { return func(cfg *dialConfig) { cfg.connectionType = connectionTypeWithTimeout } } // WithContextConnection wraps the connection with redis.ConnWithContext. -func WithContextConnection() DialOption { +func WithContextConnection() DialOptionFn { return func(cfg *dialConfig) { cfg.connectionType = connectionTypeWithContext } } // WithDefaultConnection overrides the default connectionType to not be connectionTypeWithTimeout. -func WithDefaultConnection() DialOption { +func WithDefaultConnection() DialOptionFn { return func(cfg *dialConfig) { cfg.connectionType = connectionTypeDefault } diff --git a/contrib/gomodule/redigo/orchestrion.yml b/contrib/gomodule/redigo/orchestrion.yml new file mode 100644 index 0000000000..1e59c3b290 --- /dev/null +++ b/contrib/gomodule/redigo/orchestrion.yml @@ -0,0 +1,94 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 + description: Redigo is a Go client for the Redis database. + +aspects: + ############################################################################## + # Dial + - id: Dial + join-point: + function-call: github.com/gomodule/redigo/redis.Dial + advice: + - wrap-expression: + imports: + redigo: github.com/gomodule/redigo/redis + redigotrace: github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 + template: |- + func() (redigo.Conn, error) { + {{ if .AST.Ellipsis }} + opts := {{ index .AST.Args 2 }} + anyOpts := make([]interface{}, len(opts)) + for i, v := range opts { + anyOpts[i] = v + } + return redigotrace.Dial({{ index .AST.Args 0 }}, {{ index .AST.Args 1 }}, anyOpts...) + {{ else }} + return redigotrace.Dial( + {{- range .AST.Args -}} + {{ . }}, + {{- end -}} + ) + {{ end }} + }() + + ############################################################################## + # DialContext + - id: DialContext + join-point: + function-call: github.com/gomodule/redigo/redis.DialContext + advice: + - wrap-expression: + imports: + redigo: github.com/gomodule/redigo/redis + redigotrace: github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 + template: |- + func() (redigo.Conn, error) { + {{ if .AST.Ellipsis }} + opts := {{ index .AST.Args 3 }} + anyOpts := make([]interface{}, len(opts)) + for i, v := range opts { + anyOpts[i] = v + } + return redigotrace.DialContext({{ index .AST.Args 0 }}, {{ index .AST.Args 1 }}, {{ index .AST.Args 2 }}, anyOpts...) + {{ else }} + return redigotrace.DialContext( + {{- range .AST.Args -}} + {{ . }}, + {{- end -}} + ) + {{ end }} + }() + + ############################################################################## + # DialURL + - id: DialURL + join-point: + function-call: github.com/gomodule/redigo/redis.DialURL + advice: + - wrap-expression: + imports: + redigo: github.com/gomodule/redigo/redis + redigotrace: github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 + template: |- + func() (redigo.Conn, error) { + {{ if .AST.Ellipsis }} + opts := {{ index .AST.Args 1 }} + anyOpts := make([]interface{}, len(opts)) + for i, v := range opts { + anyOpts[i] = v + } + return redigotrace.DialURL({{ index .AST.Args 0 }}, anyOpts...) + {{ else }} + return redigotrace.DialURL( + {{- range .AST.Args -}} + {{ . }}, + {{- end -}} + ) + {{ end }} + }() diff --git a/contrib/gomodule/redigo/redigo.go b/contrib/gomodule/redigo/redigo.go index dfabb11bfd..fd1cb57f96 100644 --- a/contrib/gomodule/redigo/redigo.go +++ b/contrib/gomodule/redigo/redigo.go @@ -16,20 +16,19 @@ import ( "strconv" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" - redis "github.com/gomodule/redigo/redis" + "github.com/gomodule/redigo/redis" ) const componentName = "gomodule/redigo" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/gomodule/redigo") + instr = instrumentation.Load(instrumentation.PackageRedigo) } // Conn is an implementation of the redis.Conn interface that supports tracing @@ -70,7 +69,7 @@ func parseOptions(options ...interface{}) ([]redis.DialOption, *dialConfig) { case redis.DialOption: dialOpts = append(dialOpts, o) case DialOption: - o(cfg) + o.apply(cfg) } } return dialOpts, cfg @@ -96,25 +95,14 @@ func wrapConn(c redis.Conn, p *params) redis.Conn { // Dial dials into the network address and returns a traced redis.Conn. // The set of supported options must be either of type redis.DialOption or this package's DialOption. func Dial(network, address string, options ...interface{}) (redis.Conn, error) { - dialOpts, cfg := parseOptions(options...) - log.Debug("contrib/gomodule/redigo: Dialing %s %s, %#v", network, address, cfg) - c, err := redis.Dial(network, address, dialOpts...) - if err != nil { - return nil, err - } - host, port, err := net.SplitHostPort(address) - if err != nil { - return nil, err - } - tc := wrapConn(c, ¶ms{cfg, network, host, port}) - return tc, nil + return DialContext(context.Background(), network, address, options...) } // DialContext dials into the network address using redis.DialContext and returns a traced redis.Conn. // The set of supported options must be either of type redis.DialOption or this package's DialOption. func DialContext(ctx context.Context, network, address string, options ...interface{}) (redis.Conn, error) { dialOpts, cfg := parseOptions(options...) - log.Debug("contrib/gomodule/redigo: Dialing with context %s %s, %#v", network, address, cfg) + instr.Logger().Debug("contrib/gomodule/redigo: Dialing with context %s %s, %#v", network, address, cfg) c, err := redis.DialContext(ctx, network, address, dialOpts...) if err != nil { return nil, err @@ -132,8 +120,16 @@ func DialContext(ctx context.Context, network, address string, options ...interf // scheme (https://www.iana.org/assignments/uri-schemes/prov/redis). // The returned redis.Conn is traced. func DialURL(rawurl string, options ...interface{}) (redis.Conn, error) { + return DialURLContext(context.Background(), rawurl, options...) +} + +// DialURLContext connects to a Redis server at the given URL using the Redis +// URI scheme. URLs should follow the draft IANA specification for the +// scheme (https://www.iana.org/assignments/uri-schemes/prov/redis). +// The returned redis.Conn is traced. +func DialURLContext(ctx context.Context, rawurl string, options ...interface{}) (redis.Conn, error) { dialOpts, cfg := parseOptions(options...) - log.Debug("contrib/gomodule/redigo: Dialing %s, %#v", rawurl, cfg) + instr.Logger().Debug("contrib/gomodule/redigo: Dialing %s, %#v", rawurl, cfg) u, err := url.Parse(rawurl) if err != nil { return Conn{}, err @@ -147,14 +143,14 @@ func DialURL(rawurl string, options ...interface{}) (redis.Conn, error) { host = "localhost" } network := "tcp" - c, err := redis.DialURL(rawurl, dialOpts...) + c, err := redis.DialURLContext(ctx, rawurl, dialOpts...) tc := wrapConn(c, ¶ms{cfg, network, host, port}) return tc, err } // newChildSpan creates a span inheriting from the given context. It adds to the span useful metadata about the traced Redis connection -func newChildSpan(ctx context.Context, p *params) ddtrace.Span { - opts := []ddtrace.StartSpanOption{ +func newChildSpan(ctx context.Context, p *params) *tracer.Span { + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeRedis), tracer.ServiceName(p.config.serviceName), tracer.Tag(ext.Component, componentName), @@ -191,7 +187,7 @@ func withSpan(ctx context.Context, do func(commandName string, args ...interface span.SetTag(ext.ResourceName, commandName) } else { // When the command argument to the Do method is "", then the Do method will flush the output buffer - // See https://godoc.org/github.com/gomodule/redigo/redis#hdr-Pipelining + // See https://pkg.go.dev/github.com/gomodule/redigo/redis#hdr-Pipelining span.SetTag(ext.ResourceName, "redigo.Conn.Flush") } var b bytes.Buffer diff --git a/contrib/gomodule/redigo/redigo_test.go b/contrib/gomodule/redigo/redigo_test.go index 91010d51ad..04f5cda723 100644 --- a/contrib/gomodule/redigo/redigo_test.go +++ b/contrib/gomodule/redigo/redigo_test.go @@ -12,15 +12,13 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/gomodule/redigo/redis" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestMain(m *testing.M) { @@ -37,7 +35,7 @@ func TestClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - c, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) + c, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service")) assert.Nil(err) c.Do("SET", 1, "truck") @@ -55,6 +53,7 @@ func TestClient(t *testing.T) { assert.Equal("2", span.Tag("redis.args_length")) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("gomodule/redigo", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -63,7 +62,7 @@ func TestCommandError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - c, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) + c, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service")) assert.Nil(err) _, err = c.Do("NOT_A_COMMAND", context.Background()) assert.NotNil(err) @@ -72,7 +71,7 @@ func TestCommandError(t *testing.T) { assert.Len(spans, 1) span := spans[0] - assert.Equal(err, span.Tag(ext.Error).(error)) + assert.Equal(err.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("redis.command", span.OperationName()) assert.Equal("my-service", span.Tag(ext.ServiceName)) assert.Equal("NOT_A_COMMAND", span.Tag(ext.ResourceName)) @@ -81,6 +80,7 @@ func TestCommandError(t *testing.T) { assert.Equal("NOT_A_COMMAND", span.Tag("redis.raw_command")) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("gomodule/redigo", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -89,7 +89,7 @@ func TestConnectionError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - _, err := Dial("tcp", "127.0.0.1:1000", WithServiceName("redis-service")) + _, err := Dial("tcp", "127.0.0.1:1000", WithService("redis-service")) assert.NotNil(err) assert.Contains(err.Error(), "dial tcp 127.0.0.1:1000") @@ -101,7 +101,7 @@ func TestInheritance(t *testing.T) { defer mt.Stop() root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.span") - client, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("redis-service")) + client, err := Dial("tcp", "127.0.0.1:6379", WithService("redis-service")) assert.Nil(err) client.Do("SET", "water", "bottle", ctx) root.Finish() @@ -109,7 +109,7 @@ func TestInheritance(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 2) - var child, parent mocktracer.Span + var child, parent *mocktracer.Span for _, s := range spans { switch s.OperationName() { case "redis.command": @@ -126,6 +126,7 @@ func TestInheritance(t *testing.T) { assert.Equal(child.Tag(ext.TargetPort), "6379") assert.Equal(ext.SpanKindClient, child.Tag(ext.SpanKind)) assert.Equal("gomodule/redigo", child.Tag(ext.Component)) + assert.Equal(componentName, child.Integration()) assert.Equal("redis", child.Tag(ext.DBSystem)) } @@ -139,7 +140,7 @@ func TestCommandsToSring(t *testing.T) { defer mt.Stop() str := stringifyTest{A: 57, B: 8} - c, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) + c, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service")) assert.Nil(err) c.Do("SADD", "testSet", "a", int(0), int32(1), int64(2), str, context.Background()) @@ -155,6 +156,7 @@ func TestCommandsToSring(t *testing.T) { assert.Equal("SADD testSet a 0 1 2 [57, 8]", span.Tag("redis.raw_command")) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("gomodule/redigo", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -169,7 +171,7 @@ func TestPool(t *testing.T) { IdleTimeout: 23, Wait: true, Dial: func() (redis.Conn, error) { - return Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service")) + return Dial("tcp", "127.0.0.1:6379", WithService("my-service")) }, } @@ -188,7 +190,22 @@ func TestTracingDialUrl(t *testing.T) { defer mt.Stop() url := "redis://127.0.0.1:6379" - client, err := DialURL(url, WithServiceName("redis-service")) + client, err := DialURL(url, WithService("redis-service")) + assert.Nil(err) + client.Do("SET", "ONE", " TWO", context.Background()) + + spans := mt.FinishedSpans() + assert.True(len(spans) > 0) +} + +func TestTracingDialUrlContext(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + ctx := context.Background() + url := "redis://127.0.0.1:6379" + client, err := DialURLContext(ctx, url, WithService("redis-service")) assert.Nil(err) client.Do("SET", "ONE", " TWO", context.Background()) @@ -202,7 +219,7 @@ func TestTracingDialContext(t *testing.T) { defer mt.Stop() ctx := context.Background() - client, err := DialContext(ctx, "tcp", "127.0.0.1:6379", WithServiceName("my-service")) + client, err := DialContext(ctx, "tcp", "127.0.0.1:6379", WithService("my-service")) assert.Nil(err) _, _ = client.Do("SET", "ONE", " TWO", ctx) @@ -235,9 +252,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -260,9 +275,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -271,9 +284,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, nil, WithAnalyticsRate(1.23)) }) @@ -285,7 +296,7 @@ func TestDoWithTimeout(t *testing.T) { defer mt.Stop() url := "redis://127.0.0.1:6379" - client, err := DialURL(url, WithServiceName("redis-service"), WithTimeoutConnection()) + client, err := DialURL(url, WithService("redis-service"), WithTimeoutConnection()) assert.Nil(err) _, err = redis.DoWithTimeout(client, time.Second, "SET", "ONE", " TWO") assert.NoError(err) @@ -295,13 +306,13 @@ func TestDoWithTimeout(t *testing.T) { } func TestDo(t *testing.T) { - assert := assert.New(t) t.Run("do", func(t *testing.T) { + assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - client, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service"), WithContextConnection()) + client, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service"), WithContextConnection()) assert.Nil(err) _, err = client.Do("SET", "ONE", " TWO") assert.NoError(err) @@ -311,10 +322,11 @@ func TestDo(t *testing.T) { }) t.Run("do", func(t *testing.T) { + assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - client, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service"), WithDefaultConnection()) + client, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service"), WithDefaultConnection()) assert.Nil(err) _, err = client.Do("SET", "ONE", " TWO") assert.NoError(err) @@ -325,13 +337,13 @@ func TestDo(t *testing.T) { } func TestDoContext(t *testing.T) { - assert := assert.New(t) t.Run("do context", func(t *testing.T) { + assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - client, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service"), WithContextConnection()) + client, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service"), WithContextConnection()) assert.Nil(err) _, err = redis.DoContext(client, context.Background(), "SET", "ONE", " TWO") assert.NoError(err) @@ -341,6 +353,7 @@ func TestDoContext(t *testing.T) { }) t.Run("do context with parent", func(t *testing.T) { + assert := assert.New(t) const parentSpanID = uint64(1) mt := mocktracer.Start() @@ -349,7 +362,7 @@ func TestDoContext(t *testing.T) { span, ctx := tracer.StartSpanFromContext(context.Background(), "test", tracer.WithSpanID(parentSpanID)) defer span.Finish() - client, err := Dial("tcp", "127.0.0.1:6379", WithServiceName("my-service"), WithContextConnection()) + client, err := Dial("tcp", "127.0.0.1:6379", WithService("my-service"), WithContextConnection()) assert.Nil(err) _, err = redis.DoContext(client, ctx, "SET", "ONE", " TWO") assert.NoError(err) @@ -361,11 +374,12 @@ func TestDoContext(t *testing.T) { }) t.Run("do context with timeout", func(t *testing.T) { + assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() url := "redis://127.0.0.1:6379" - client, err := DialURL(url, WithServiceName("redis-service"), WithContextConnection()) + client, err := DialURL(url, WithService("redis-service"), WithContextConnection()) assert.Nil(err) ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) @@ -380,10 +394,11 @@ func TestDoContext(t *testing.T) { }) t.Run("do context with timeout - canceled", func(t *testing.T) { + assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - client, err := DialContext(context.Background(), "tcp", "127.0.0.1:6379", WithServiceName("my-service"), WithContextConnection()) + client, err := DialContext(context.Background(), "tcp", "127.0.0.1:6379", WithService("my-service"), WithContextConnection()) assert.Nil(err) ctx, cancel := context.WithTimeout(context.Background(), time.Hour) @@ -397,10 +412,11 @@ func TestDoContext(t *testing.T) { }) t.Run("do context with timeout - deadline exceeded", func(t *testing.T) { + assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - client, err := DialContext(context.Background(), "tcp", "127.0.0.1:6379", WithServiceName("my-service"), WithContextConnection()) + client, err := DialContext(context.Background(), "tcp", "127.0.0.1:6379", WithService("my-service"), WithContextConnection()) assert.Nil(err) ctx, cancel := context.WithTimeout(context.Background(), time.Nanosecond) @@ -413,22 +429,3 @@ func TestDoContext(t *testing.T) { assert.True(len(spans) > 0) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []interface{} - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - c, err := Dial("tcp", "127.0.0.1:6379", opts...) - require.NoError(t, err) - _, err = c.Do("SET", "test_key", "test_value") - require.NoError(t, err) - - return mt.FinishedSpans() - }) - namingschematest.NewRedisTest(genSpans, "redis.conn")(t) -} diff --git a/contrib/google.golang.org/api/api.go b/contrib/google.golang.org/api/api.go index a8bf163f0a..0e6d7ad204 100644 --- a/contrib/google.golang.org/api/api.go +++ b/contrib/google.golang.org/api/api.go @@ -11,7 +11,7 @@ // in some tag values like service.name and resource.name, depending on the google.golang.org/api that you are using in your // project. If this is not an acceptable behavior for your use-case, you can disable this feature using the // WithEndpointMetadataDisabled option. -package api // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/api" +package api // import "github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2" //go:generate go run ./internal/gen_endpoints -o gen_endpoints.json @@ -21,13 +21,11 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/api/internal/tree" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2/internal/tree" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "golang.org/x/oauth2/google" ) @@ -37,16 +35,17 @@ var endpointBytes []byte const componentName = "google.golang.org/api" -// apiEndpoints are the defined endpoints for the Google API; it is populated -// by "go generate". -var apiEndpointsTree *tree.Tree +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageGoogleAPI) initAPIEndpointsTree() } +// apiEndpoints are the defined endpoints for the Google API; it is populated +// by "go generate". +var apiEndpointsTree *tree.Tree + func loadEndpointsFromJSON() ([]*tree.Endpoint, error) { var apiEndpoints []*tree.Endpoint if err := json.Unmarshal(endpointBytes, &apiEndpoints); err != nil { @@ -58,12 +57,12 @@ func loadEndpointsFromJSON() ([]*tree.Endpoint, error) { func initAPIEndpointsTree() { apiEndpoints, err := loadEndpointsFromJSON() if err != nil { - log.Warn("contrib/google.golang.org/api: failed load json endpoints: %v", err) + instr.Logger().Warn("contrib/google.golang.org/api: failed load json endpoints: %s", err.Error()) return } tr, err := tree.New(apiEndpoints...) if err != nil { - log.Warn("contrib/google.golang.org/api: failed to create endpoints tree: %v", err) + instr.Logger().Warn("contrib/google.golang.org/api: failed to create endpoints tree: %s", err.Error()) return } apiEndpointsTree = tr @@ -73,7 +72,7 @@ func initAPIEndpointsTree() { // APIs with all requests traced automatically. func NewClient(options ...Option) (*http.Client, error) { cfg := newConfig(options...) - log.Debug("contrib/google.golang.org/api: Creating Client: %#v", cfg) + instr.Logger().Debug("contrib/google.golang.org/api: Creating Client: %#v", cfg) client, err := google.DefaultClient(cfg.ctx, cfg.scopes...) if err != nil { return nil, err @@ -86,9 +85,9 @@ func NewClient(options ...Option) (*http.Client, error) { // Google APIs and traces all requests. func WrapRoundTripper(transport http.RoundTripper, options ...Option) http.RoundTripper { cfg := newConfig(options...) - log.Debug("contrib/google.golang.org/api: Wrapping RoundTripper: %#v", cfg) + instr.Logger().Debug("contrib/google.golang.org/api: Wrapping RoundTripper: %#v", cfg) rtOpts := []httptrace.RoundTripperOption{ - httptrace.WithBefore(func(req *http.Request, span ddtrace.Span) { + httptrace.WithBefore(func(req *http.Request, span *tracer.Span) { if !cfg.endpointMetadataDisabled { setTagsWithEndpointMetadata(req, span) } else { @@ -102,12 +101,12 @@ func WrapRoundTripper(transport http.RoundTripper, options ...Option) http.Round }), } if !math.IsNaN(cfg.analyticsRate) { - rtOpts = append(rtOpts, httptrace.RTWithAnalyticsRate(cfg.analyticsRate)) + rtOpts = append(rtOpts, httptrace.WithAnalyticsRate(cfg.analyticsRate)) } return httptrace.WrapRoundTripper(transport, rtOpts...) } -func setTagsWithEndpointMetadata(req *http.Request, span ddtrace.Span) { +func setTagsWithEndpointMetadata(req *http.Request, span *tracer.Span) { e, ok := apiEndpointsTree.Get(req.URL.Hostname(), req.Method, req.URL.Path) if ok { span.SetTag(ext.ServiceName, e.ServiceName) @@ -117,7 +116,7 @@ func setTagsWithEndpointMetadata(req *http.Request, span ddtrace.Span) { } } -func setTagsWithoutEndpointMetadata(req *http.Request, span ddtrace.Span) { +func setTagsWithoutEndpointMetadata(req *http.Request, span *tracer.Span) { span.SetTag(ext.ServiceName, "google") span.SetTag(ext.ResourceName, req.Method+" "+req.URL.Hostname()) } diff --git a/contrib/google.golang.org/api/api_test.go b/contrib/google.golang.org/api/api_test.go index a9b8f54347..8fc9c073e1 100644 --- a/contrib/google.golang.org/api/api_test.go +++ b/contrib/google.golang.org/api/api_test.go @@ -13,9 +13,9 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -65,6 +65,7 @@ func TestBooks(t *testing.T) { assert.Equal(t, "GET", s0.Tag(ext.HTTPMethod)) assert.Equal(t, svc.BasePath+"books/v1/users/montana.banana/bookshelves?alt=json&prettyPrint=false", s0.Tag(ext.HTTPURL)) assert.Equal(t, "google.golang.org/api", s0.Tag(ext.Component)) + assert.Equal(t, componentName, s0.Integration()) assert.Equal(t, ext.SpanKindClient, s0.Tag(ext.SpanKind)) } @@ -76,7 +77,7 @@ func TestCivicInfo(t *testing.T) { Transport: WrapRoundTripper(badRequestTransport), })) assert.NoError(t, err) - svc.Representatives.RepresentativeInfoByAddress().Do() + svc.Elections.ElectionQuery().Do() spans := mt.FinishedSpans() assert.Len(t, spans, 1) @@ -85,11 +86,12 @@ func TestCivicInfo(t *testing.T) { assert.Equal(t, "http.request", s0.OperationName()) assert.Equal(t, "http", s0.Tag(ext.SpanType)) assert.Equal(t, "google.civicinfo", s0.Tag(ext.ServiceName)) - assert.Equal(t, "civicinfo.representatives.representativeInfoByAddress", s0.Tag(ext.ResourceName)) + assert.Equal(t, "civicinfo.elections.electionQuery", s0.Tag(ext.ResourceName)) assert.Equal(t, "400", s0.Tag(ext.HTTPCode)) assert.Equal(t, "GET", s0.Tag(ext.HTTPMethod)) - assert.Equal(t, svc.BasePath+"civicinfo/v2/representatives?alt=json&prettyPrint=false", s0.Tag(ext.HTTPURL)) + assert.Equal(t, svc.BasePath+"civicinfo/v2/elections?alt=json&prettyPrint=false", s0.Tag(ext.HTTPURL)) assert.Equal(t, "google.golang.org/api", s0.Tag(ext.Component)) + assert.Equal(t, componentName, s0.Integration()) assert.Equal(t, ext.SpanKindClient, s0.Tag(ext.SpanKind)) } @@ -117,6 +119,7 @@ func TestURLShortener(t *testing.T) { assert.Equal(t, "GET", s0.Tag(ext.HTTPMethod)) assert.Equal(t, "https://www.googleapis.com/urlshortener/v1/url/history?alt=json&prettyPrint=false", s0.Tag(ext.HTTPURL)) assert.Equal(t, "google.golang.org/api", s0.Tag(ext.Component)) + assert.Equal(t, componentName, s0.Integration()) assert.Equal(t, ext.SpanKindClient, s0.Tag(ext.SpanKind)) } @@ -128,7 +131,7 @@ func TestWithEndpointMetadataDisabled(t *testing.T) { Transport: WrapRoundTripper(badRequestTransport, WithEndpointMetadataDisabled()), })) require.NoError(t, err) - svc.Representatives.RepresentativeInfoByAddress().Do() + svc.Elections.ElectionQuery().Do() spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -140,8 +143,9 @@ func TestWithEndpointMetadataDisabled(t *testing.T) { assert.Equal(t, "GET civicinfo.googleapis.com", s0.Tag(ext.ResourceName)) assert.Equal(t, "400", s0.Tag(ext.HTTPCode)) assert.Equal(t, "GET", s0.Tag(ext.HTTPMethod)) - assert.Equal(t, svc.BasePath+"civicinfo/v2/representatives?alt=json&prettyPrint=false", s0.Tag(ext.HTTPURL)) + assert.Equal(t, svc.BasePath+"civicinfo/v2/elections?alt=json&prettyPrint=false", s0.Tag(ext.HTTPURL)) assert.Equal(t, "google.golang.org/api", s0.Tag(ext.Component)) + assert.Equal(t, componentName, s0.Integration()) assert.Equal(t, ext.SpanKindClient, s0.Tag(ext.SpanKind)) } @@ -170,9 +174,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -195,9 +197,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) diff --git a/contrib/google.golang.org/api/example_test.go b/contrib/google.golang.org/api/example_test.go index 7fc8c42b4d..361187e8ce 100644 --- a/contrib/google.golang.org/api/example_test.go +++ b/contrib/google.golang.org/api/example_test.go @@ -8,12 +8,16 @@ package api_test import ( "fmt" - apitrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/api" + apitrace "github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" cloudresourcemanager "google.golang.org/api/cloudresourcemanager/v1" ) func Example() { + tracer.Start() + defer tracer.Stop() + // create an oauth2 client suitable for use with the google APIs client, _ := apitrace.NewClient( // set scopes like this, which will vary depending on the service diff --git a/contrib/google.golang.org/api/gen_endpoints.json b/contrib/google.golang.org/api/gen_endpoints.json index 8a4a6e50b4..0b68695930 100644 --- a/contrib/google.golang.org/api/gen_endpoints.json +++ b/contrib/google.golang.org/api/gen_endpoints.json @@ -1 +1 @@ -[{"hostname":"","http_method":"GET","path_template":"/_ah/api/tshealth/v1/techs/count","path_regex":"^(?:/_ah/api/tshealth/v1/techs/count)$","service_name":"google.tshealth","resource_name":"tshealth.techs.count"},{"hostname":"","http_method":"GET","path_template":"/accounts/{accountId}/reports","path_regex":"^(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.repeated","resource_name":"adsense.accounts.reports.generate"},{"hostname":"","http_method":"GET","path_template":"/map","path_regex":"^(?:/map)$","service_name":"google.additionalprops","resource_name":"mapofstrings.getMap"},{"hostname":"","http_method":"GET","path_template":"/map","path_regex":"^(?:/map)$","service_name":"google.additionalprops","resource_name":"mapofstrings.getMap"},{"hostname":"","http_method":"GET","path_template":"/reports","path_regex":"^(?:/reports)$","service_name":"google.paramrename","resource_name":"youtubeAnalytics.reports.query"},{"hostname":"","http_method":"GET","path_template":"/{project}/metricDescriptors","path_regex":"^(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors)$","service_name":"google.getwithoutbody","resource_name":"getwithoutbody.metricDescriptors.list"},{"hostname":"","http_method":"POST","path_template":"/calendars/{calendarId}/events/{eventId}/move","path_regex":"^(?:/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.paramrename","resource_name":"calendar.events.move"},{"hostname":"abusiveexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/sites/{sitesId}","path_regex":"^(?:/v1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.abusiveexperiencereport","resource_name":"abusiveexperiencereport.sites.get"},{"hostname":"abusiveexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/violatingSites","path_regex":"^(?:/v1/violatingSites)$","service_name":"google.abusiveexperiencereport","resource_name":"abusiveexperiencereport.violatingSites.list"},{"hostname":"acceleratedmobilepageurl.googleapis.com","http_method":"POST","path_template":"/v1/ampUrls:batchGet","path_regex":"^(?:/v1/ampUrls:batchGet)$","service_name":"google.acceleratedmobilepageurl","resource_name":"acceleratedmobilepageurl.ampUrls.batchGet"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/approvalRequests","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/serviceAccount","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.getServiceAccount"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/approvalRequests","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/serviceAccount","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.getServiceAccount"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/approvalRequests","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccount","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.getServiceAccount"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/approvalRequests","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/approvalRequests","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:invalidate","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::invalidate)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.invalidate"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:invalidate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::invalidate)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.invalidate"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:invalidate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::invalidate)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.invalidate"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.dismiss"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs/{authorizedOrgsDescsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings/{gcpUserAccessBindingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies","path_regex":"^(?:/v1/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs/{authorizedOrgsDescsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings/{gcpUserAccessBindingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies","path_regex":"^(?:/v1beta/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/operations/{operationsId}","path_regex":"^(?:/v1beta/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs/{authorizedOrgsDescsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings/{gcpUserAccessBindingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies","path_regex":"^(?:/v1/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}:testIamPermissions","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.testIamPermissions"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels:replaceAll","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels:replaceAll)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.replaceAll"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}:testIamPermissions","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.testIamPermissions"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters:commit","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters:commit)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.commit"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters:replaceAll","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters:replaceAll)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.replaceAll"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.getIamPolicy"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.setIamPolicy"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.testIamPermissions"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.cancel"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1beta/accessPolicies","path_regex":"^(?:/v1beta/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.create"},{"hostname":"acmedns.googleapis.com","http_method":"GET","path_template":"/v1/acmeChallengeSets/{rootDomain}","path_regex":"^(?:/v1/acmeChallengeSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.acmedns","resource_name":"acmedns.acmeChallengeSets.get"},{"hostname":"acmedns.googleapis.com","http_method":"POST","path_template":"/v1/acmeChallengeSets/{rootDomain}:rotateChallenges","path_regex":"^(?:/v1/acmeChallengeSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rotateChallenges)$","service_name":"google.acmedns","resource_name":"acmedns.acmeChallengeSets.rotateChallenges"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.delete"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.delete"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.invitations.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations/{invitationId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.invitations.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/users","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.users.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.users.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/creatives","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}/dealAssociations","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dealAssociations)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.dealAssociations.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/finalizedProposals","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedProposals)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.finalizedProposals.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/products","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.products.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/products/{productId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.products.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/proposals","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/publisherProfiles","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.publisherProfiles.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/publisherProfiles/{publisherProfileId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.publisherProfiles.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/bidMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.bidMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/bidResponseErrors","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponseErrors)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.bidResponseErrors.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/bidResponsesWithoutBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponsesWithoutBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.bidResponsesWithoutBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBidRequests","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBidRequests)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBidRequests.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/creatives","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBids.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/details","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBids.details.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/impressionMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/impressionMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.impressionMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/losingBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/losingBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.losingBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/nonBillableWinningBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nonBillableWinningBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.nonBillableWinningBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/bidMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.bidMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/bidResponseErrors","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponseErrors)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.bidResponseErrors.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/bidResponsesWithoutBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponsesWithoutBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.bidResponsesWithoutBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBidRequests","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBidRequests)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBidRequests.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/creatives","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBids.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/details","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBids.details.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/impressionMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/impressionMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.impressionMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/losingBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/losingBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.losingBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/nonBillableWinningBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nonBillableWinningBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.nonBillableWinningBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/clients","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.invitations.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}/dealAssociations:add","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dealAssociations:add)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.dealAssociations.add"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}/dealAssociations:remove","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dealAssociations:remove)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.dealAssociations.remove"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}:stopWatching","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopWatching)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.stopWatching"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}:watch","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::watch)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.watch"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/finalizedProposals/{proposalId}:pause","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.finalizedProposals.pause"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/finalizedProposals/{proposalId}:resume","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.finalizedProposals.resume"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:accept","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.accept"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:addNote","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addNote)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.addNote"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:cancelNegotiation","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelNegotiation)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.cancelNegotiation"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:completeSetup","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeSetup)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.completeSetup"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:pause","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.pause"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:resume","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.resume"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/bidders/{biddersId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.update"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.users.update"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.update"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.update"},{"hostname":"adexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/sites/{sitesId}","path_regex":"^(?:/v1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexperiencereport","resource_name":"adexperiencereport.sites.get"},{"hostname":"adexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/violatingSites","path_regex":"^(?:/v1/violatingSites)$","service_name":"google.adexperiencereport","resource_name":"adexperiencereport.violatingSites.list"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.delete"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools/{workerpoolsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.delete"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.list"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.get"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.list"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools/{workerpoolsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.get"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.operations.get"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.patch"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools/{workerpoolsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.patch"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/instances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.create"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.create"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile/{resourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.mobiledevices.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/domainaliases/{domainAliasName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domainAliases.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/domains/{domainName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domains.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/roleassignments/{roleAssignmentId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roleAssignments.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers/{printServersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers/{printersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/groups/{groupKey}/aliases/{alias}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.aliases.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/aliases/{alias}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.aliases.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/asps/{codeId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/asps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.asps.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/tokens/{clientId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.tokens.delete"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/applications","path_regex":"^(?:/admin/datatransfer/v1/applications)$","service_name":"google.admin","resource_name":"datatransfer.applications.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/applications/{applicationId}","path_regex":"^(?:/admin/datatransfer/v1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"datatransfer.applications.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/transfers","path_regex":"^(?:/admin/datatransfer/v1/transfers)$","service_name":"google.admin","resource_name":"datatransfer.transfers.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/transfers/{dataTransferId}","path_regex":"^(?:/admin/datatransfer/v1/transfers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"datatransfer.transfers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos)$","service_name":"google.admin","resource_name":"directory.chromeosdevices.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.chromeosdevices.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}/commands/{commandId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customer.devices.chromeos.commands.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile)$","service_name":"google.admin","resource_name":"directory.mobiledevices.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile/{resourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.mobiledevices.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/orgunits","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits)$","service_name":"google.admin","resource_name":"directory.orgunits.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/schemas","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.admin","resource_name":"directory.schemas.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domainaliases","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases)$","service_name":"google.admin","resource_name":"directory.domainAliases.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domainaliases/{domainAliasName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domainAliases.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domains","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.admin","resource_name":"directory.domains.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domains/{domainName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domains.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings)$","service_name":"google.admin","resource_name":"directory.resources.buildings.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars)$","service_name":"google.admin","resource_name":"directory.resources.calendars.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/features","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features)$","service_name":"google.admin","resource_name":"directory.resources.features.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roleassignments","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments)$","service_name":"google.admin","resource_name":"directory.roleAssignments.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roleassignments/{roleAssignmentId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roleAssignments.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roles","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.admin","resource_name":"directory.roles.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roles/ALL/privileges","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/ALL/privileges)$","service_name":"google.admin","resource_name":"directory.privileges.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customerKey}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.customers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers/{printServersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers/{printersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers:listPrinterModels","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers:listPrinterModels)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.listPrinterModels"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups","path_regex":"^(?:/admin/directory/v1/groups)$","service_name":"google.admin","resource_name":"directory.groups.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/aliases","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.groups.aliases.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/hasMember/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hasMember/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.hasMember"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/members","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.admin","resource_name":"directory.members.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users","path_regex":"^(?:/admin/directory/v1/users)$","service_name":"google.admin","resource_name":"directory.users.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/aliases","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.users.aliases.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/asps","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/asps)$","service_name":"google.admin","resource_name":"directory.asps.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/asps/{codeId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/asps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.asps.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/tokens","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens)$","service_name":"google.admin","resource_name":"directory.tokens.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/tokens/{clientId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.tokens.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/verificationCodes","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verificationCodes)$","service_name":"google.admin","resource_name":"directory.verificationCodes.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/activity/users/{userKey}/applications/{applicationName}","path_regex":"^(?:/admin/reports/v1/activity/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.activities.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/usage/dates/{date}","path_regex":"^(?:/admin/reports/v1/usage/dates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.customerUsageReports.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/usage/users/{userKey}/dates/{date}","path_regex":"^(?:/admin/reports/v1/usage/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.userUsageReport.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/usage/{entityType}/{entityKey}/dates/{date}","path_regex":"^(?:/admin/reports/v1/usage/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.entityUsageReports.get"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.chromeosdevices.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customers/{customerKey}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.customers.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers/{printServersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers/{printersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.patch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/datatransfer/v1/transfers","path_regex":"^(?:/admin/datatransfer/v1/transfers)$","service_name":"google.admin","resource_name":"datatransfer.transfers.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/moveDevicesToOu","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/moveDevicesToOu)$","service_name":"google.admin","resource_name":"directory.chromeosdevices.moveDevicesToOu"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}:issueCommand","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::issueCommand)$","service_name":"google.admin","resource_name":"admin.customer.devices.chromeos.issueCommand"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{resourceId}/action","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/action)$","service_name":"google.admin","resource_name":"directory.chromeosdevices.action"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile/{resourceId}/action","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/action)$","service_name":"google.admin","resource_name":"directory.mobiledevices.action"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/orgunits","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits)$","service_name":"google.admin","resource_name":"directory.orgunits.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/schemas","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.admin","resource_name":"directory.schemas.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/domainaliases","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases)$","service_name":"google.admin","resource_name":"directory.domainAliases.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/domains","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.admin","resource_name":"directory.domains.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings)$","service_name":"google.admin","resource_name":"directory.resources.buildings.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars)$","service_name":"google.admin","resource_name":"directory.resources.calendars.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/features","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features)$","service_name":"google.admin","resource_name":"directory.resources.features.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{oldName}/rename","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rename)$","service_name":"google.admin","resource_name":"directory.resources.features.rename"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/roleassignments","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments)$","service_name":"google.admin","resource_name":"directory.roleAssignments.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/roles","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.admin","resource_name":"directory.roles.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.create"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers:batchCreatePrintServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers:batchCreatePrintServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.batchCreatePrintServers"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers:batchDeletePrintServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers:batchDeletePrintServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.batchDeletePrintServers"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.create"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers:batchCreatePrinters","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers:batchCreatePrinters)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.batchCreatePrinters"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers:batchDeletePrinters","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers:batchDeletePrinters)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.batchDeletePrinters"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/groups","path_regex":"^(?:/admin/directory/v1/groups)$","service_name":"google.admin","resource_name":"directory.groups.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/groups/{groupKey}/aliases","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.groups.aliases.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/groups/{groupKey}/members","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.admin","resource_name":"directory.members.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users","path_regex":"^(?:/admin/directory/v1/users)$","service_name":"google.admin","resource_name":"directory.users.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/watch","path_regex":"^(?:/admin/directory/v1/users/watch)$","service_name":"google.admin","resource_name":"directory.users.watch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/aliases","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.users.aliases.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/aliases/watch","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/watch)$","service_name":"google.admin","resource_name":"directory.users.aliases.watch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/makeAdmin","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/makeAdmin)$","service_name":"google.admin","resource_name":"directory.users.makeAdmin"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/signOut","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/signOut)$","service_name":"google.admin","resource_name":"directory.users.signOut"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/twoStepVerification/turnOff","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/twoStepVerification/turnOff)$","service_name":"google.admin","resource_name":"directory.twoStepVerification.turnOff"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/undelete","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/undelete)$","service_name":"google.admin","resource_name":"directory.users.undelete"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/verificationCodes/generate","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verificationCodes/generate)$","service_name":"google.admin","resource_name":"directory.verificationCodes.generate"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/verificationCodes/invalidate","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verificationCodes/invalidate)$","service_name":"google.admin","resource_name":"directory.verificationCodes.invalidate"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory_v1/channels/stop","path_regex":"^(?:/admin/directory_v1/channels/stop)$","service_name":"google.admin","resource_name":"admin.channels.stop"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/reports/v1/activity/users/{userKey}/applications/{applicationName}/watch","path_regex":"^(?:/admin/reports/v1/activity/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.admin","resource_name":"reports.activities.watch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/reports_v1/channels/stop","path_regex":"^(?:/admin/reports_v1/channels/stop)$","service_name":"google.admin","resource_name":"admin.channels.stop"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.chromeosdevices.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customers/{customerKey}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.customers.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.update"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts","path_regex":"^(?:/v1/accounts)$","service_name":"google.admob","resource_name":"admob.accounts.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admob","resource_name":"admob.accounts.get"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/adUnits","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/apps","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.admob","resource_name":"admob.accounts.apps.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts","path_regex":"^(?:/v1beta/accounts)$","service_name":"google.admob","resource_name":"admob.accounts.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admob","resource_name":"admob.accounts.get"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/adSources","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSources)$","service_name":"google.admob","resource_name":"admob.accounts.adSources.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/adUnits","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/apps","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.admob","resource_name":"admob.accounts.apps.list"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/mediationReport:generate","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.mediationReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/networkReport:generate","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.networkReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/mediationReport:generate","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.mediationReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/networkReport:generate","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.networkReport.generate"},{"hostname":"adsense.googleapis.com","http_method":"DELETE","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.delete"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts","path_regex":"^(?:/v2/accounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adBlockingRecoveryTag","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adBlockingRecoveryTag)$","service_name":"google.adsense","resource_name":"adsense.accounts.getAdBlockingRecoveryTag"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adcode","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.getAdcode"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}/adcode","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.getAdcode"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}:listLinkedCustomChannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listLinkedCustomChannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.listLinkedCustomChannels"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}:listLinkedAdUnits","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listLinkedAdUnits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.listLinkedAdUnits"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/urlchannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.urlchannels.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/urlchannels/{urlchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.urlchannels.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/alerts","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/payments","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/payments)$","service_name":"google.adsense","resource_name":"adsense.accounts.payments.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/saved","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/{reportsId}/saved","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.getSaved"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/{reportsId}/saved:generate","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/saved:generate)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generate"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/{reportsId}/saved:generateCsv","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/saved:generateCsv)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generateCsv"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports:generate","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:generate)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generate"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports:generateCsv","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:generateCsv)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generateCsv"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/sites","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.adsense","resource_name":"adsense.accounts.sites.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/sites/{sitesId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.sites.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}:listChildAccounts","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listChildAccounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.listChildAccounts"},{"hostname":"adsense.googleapis.com","http_method":"PATCH","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.patch"},{"hostname":"adsense.googleapis.com","http_method":"PATCH","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.patch"},{"hostname":"adsense.googleapis.com","http_method":"POST","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.create"},{"hostname":"adsense.googleapis.com","http_method":"POST","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.create"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/notifications","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifications)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.organizations.locations.notifications.list"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/notifications/{notificationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.organizations.locations.notifications.get"},{"hostname":"alertcenter.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/alerts/{alertId}","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.delete"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts","path_regex":"^(?:/v1beta1/alerts)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.list"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts/{alertId}","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.get"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts/{alertId}/feedback","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedback)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.feedback.list"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts/{alertId}/metadata","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.getMetadata"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/settings","path_regex":"^(?:/v1beta1/settings)$","service_name":"google.alertcenter","resource_name":"alertcenter.getSettings"},{"hostname":"alertcenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/settings","path_regex":"^(?:/v1beta1/settings)$","service_name":"google.alertcenter","resource_name":"alertcenter.updateSettings"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts/{alertId}/feedback","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedback)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.feedback.create"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts/{alertId}:undelete","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.undelete"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts:batchDelete","path_regex":"^(?:/v1beta1/alerts:batchDelete)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.batchDelete"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts:batchUndelete","path_regex":"^(?:/v1beta1/alerts:batchUndelete)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.batchUndelete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.delete"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/data/ga","path_regex":"^(?:/analytics/v3/data/ga)$","service_name":"google.analytics","resource_name":"analytics.data.ga.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/data/mcf","path_regex":"^(?:/analytics/v3/data/mcf)$","service_name":"google.analytics","resource_name":"analytics.data.mcf.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/data/realtime","path_regex":"^(?:/analytics/v3/data/realtime)$","service_name":"google.analytics","resource_name":"analytics.data.realtime.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accountSummaries","path_regex":"^(?:/analytics/v3/management/accountSummaries)$","service_name":"google.analytics","resource_name":"analytics.management.accountSummaries.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts","path_regex":"^(?:/analytics/v3/management/accounts)$","service_name":"google.analytics","resource_name":"analytics.management.accounts.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/filters","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters)$","service_name":"google.analytics","resource_name":"analytics.management.filters.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties)$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources)$","service_name":"google.analytics","resource_name":"analytics.management.customDataSources.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploads)$","service_name":"google.analytics","resource_name":"analytics.management.uploads.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads/{uploadId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.uploads.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.analytics","resource_name":"analytics.management.profiles.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.analytics","resource_name":"analytics.management.experiments.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals)$","service_name":"google.analytics","resource_name":"analytics.management.goals.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.goals.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports)$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences)$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/segments","path_regex":"^(?:/analytics/v3/management/segments)$","service_name":"google.analytics","resource_name":"analytics.management.segments.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/metadata/{reportType}/columns","path_regex":"^(?:/analytics/v3/metadata/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.analytics","resource_name":"analytics.metadata.columns.list"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.goals.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.patch"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/filters","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters)$","service_name":"google.analytics","resource_name":"analytics.management.filters.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties)$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/deleteUploadData","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteUploadData)$","service_name":"google.analytics","resource_name":"analytics.management.uploads.deleteUploadData"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploads)$","service_name":"google.analytics","resource_name":"analytics.management.uploads.uploadData"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.analytics","resource_name":"analytics.management.profiles.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.analytics","resource_name":"analytics.management.experiments.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals)$","service_name":"google.analytics","resource_name":"analytics.management.goals.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports)$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences)$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/clientId:hashClientId","path_regex":"^(?:/analytics/v3/management/clientId:hashClientId)$","service_name":"google.analytics","resource_name":"analytics.management.clientId.hashClientId"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/provisioning/createAccountTicket","path_regex":"^(?:/analytics/v3/provisioning/createAccountTicket)$","service_name":"google.analytics","resource_name":"analytics.provisioning.createAccountTicket"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/provisioning/createAccountTree","path_regex":"^(?:/analytics/v3/provisioning/createAccountTree)$","service_name":"google.analytics","resource_name":"analytics.provisioning.createAccountTree"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/userDeletion/userDeletionRequests:upsert","path_regex":"^(?:/analytics/v3/userDeletion/userDeletionRequests:upsert)$","service_name":"google.analytics","resource_name":"analytics.userDeletion.userDeletionRequest.upsert"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.goals.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.update"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/accounts/{accountsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/accounts/{accountsId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/accounts/{accountsId}/userLinks/{userLinksId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/channelGroups/{channelGroupsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks/{displayVideo360AdvertiserLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets/{expandedDataSetsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/firebaseLinks/{firebaseLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links/{searchAds360LinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/userLinks/{userLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/firebaseLinks/{firebaseLinksId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accountSummaries","path_regex":"^(?:/v1alpha/accountSummaries)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accountSummaries.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts","path_regex":"^(?:/v1alpha/accounts)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/accessBindings","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchGet","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchGet)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchGet"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/dataSharingSettings","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSharingSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.getDataSharingSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/userLinks","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/userLinks/{userLinksId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/userLinks:batchGet","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchGet)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.batchGet"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties","path_regex":"^(?:/v1alpha/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/accessBindings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchGet","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchGet)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchGet"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/attributionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getAttributionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/audiences","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/audiences/{audiencesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks/{bigQueryLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/channelGroups","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/channelGroups/{channelGroupsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/enhancedMeasurementSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enhancedMeasurementSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.getEnhancedMeasurementSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/globalSiteTag","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/globalSiteTag)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.getGlobalSiteTag"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks/{displayVideo360AdvertiserLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets/{expandedDataSetsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/googleSignalsSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleSignalsSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getGoogleSignalsSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links/{searchAds360LinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/userLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/userLinks/{userLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/userLinks:batchGet","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchGet)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.batchGet"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties:fetchConnectedGa4Property","path_regex":"^(?:/v1alpha/properties:fetchConnectedGa4Property)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.fetchConnectedGa4Property"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accountSummaries","path_regex":"^(?:/v1beta/accountSummaries)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accountSummaries.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts","path_regex":"^(?:/v1beta/accounts)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/dataSharingSettings","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSharingSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.getDataSharingSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties","path_regex":"^(?:/v1beta/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/accounts/{accountsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/accounts/{accountsId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/accounts/{accountsId}/userLinks/{userLinksId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/attributionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateAttributionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/audiences/{audiencesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/channelGroups/{channelGroupsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/enhancedMeasurementSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enhancedMeasurementSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.updateEnhancedMeasurementSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks/{displayVideo360AdvertiserLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets/{expandedDataSetsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/googleSignalsSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleSignalsSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateGoogleSignalsSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links/{searchAds360LinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/userLinks/{userLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchCreate","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchCreate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchCreate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchDelete","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchDelete)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchDelete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchUpdate","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchUpdate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchUpdate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/userLinks","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/userLinks:audit","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:audit)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.audit"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/userLinks:batchCreate","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchCreate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.batchCreate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/userLinks:batchDelete","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchDelete)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.batchDelete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/userLinks:batchUpdate","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchUpdate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.userLinks.batchUpdate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}:runAccessReport","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.runAccessReport"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}:searchChangeHistoryEvents","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchChangeHistoryEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.searchChangeHistoryEvents"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts:provisionAccountTicket","path_regex":"^(?:/v1alpha/accounts:provisionAccountTicket)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.provisionAccountTicket"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties","path_regex":"^(?:/v1alpha/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchCreate","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchCreate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchCreate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchDelete","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchDelete)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchDelete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchUpdate","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchUpdate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchUpdate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/audiences","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/audiences/{audiencesId}:archive","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/channelGroups","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customDimensions/{customDimensionsId}:archive","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customMetrics/{customMetricsId}:archive","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}:approve","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.approve"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}:cancel","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.cancel"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/userLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/userLinks:audit","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:audit)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.audit"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/userLinks:batchCreate","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchCreate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.batchCreate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/userLinks:batchDelete","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchDelete)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.batchDelete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/userLinks:batchUpdate","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLinks:batchUpdate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.userLinks.batchUpdate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}:acknowledgeUserDataCollection","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledgeUserDataCollection)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.acknowledgeUserDataCollection"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}:runAccessReport","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.runAccessReport"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:createConnectedSiteTag","path_regex":"^(?:/v1alpha/properties:createConnectedSiteTag)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.createConnectedSiteTag"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:deleteConnectedSiteTag","path_regex":"^(?:/v1alpha/properties:deleteConnectedSiteTag)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.deleteConnectedSiteTag"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:fetchAutomatedGa4ConfigurationOptOut","path_regex":"^(?:/v1alpha/properties:fetchAutomatedGa4ConfigurationOptOut)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.fetchAutomatedGa4ConfigurationOptOut"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:listConnectedSiteTags","path_regex":"^(?:/v1alpha/properties:listConnectedSiteTags)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.listConnectedSiteTags"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:setAutomatedGa4ConfigurationOptOut","path_regex":"^(?:/v1alpha/properties:setAutomatedGa4ConfigurationOptOut)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.setAutomatedGa4ConfigurationOptOut"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}:runAccessReport","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.runAccessReport"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}:searchChangeHistoryEvents","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchChangeHistoryEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.searchChangeHistoryEvents"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts:provisionAccountTicket","path_regex":"^(?:/v1beta/accounts:provisionAccountTicket)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.provisionAccountTicket"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties","path_regex":"^(?:/v1beta/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customDimensions/{customDimensionsId}:archive","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customMetrics/{customMetricsId}:archive","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:acknowledgeUserDataCollection","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledgeUserDataCollection)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.acknowledgeUserDataCollection"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runAccessReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.runAccessReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/metadata","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.getMetadata"},{"hostname":"analyticsdata.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/metadata","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.getMetadata"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}:runRealtimeReport","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runRealtimeReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runRealtimeReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:batchRunPivotReports","path_regex":"^(?:/v1alpha:batchRunPivotReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.batchRunPivotReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:batchRunReports","path_regex":"^(?:/v1alpha:batchRunReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.batchRunReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:runPivotReport","path_regex":"^(?:/v1alpha:runPivotReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.runPivotReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:runReport","path_regex":"^(?:/v1alpha:runReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.runReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:batchRunPivotReports","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchRunPivotReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.batchRunPivotReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:batchRunReports","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchRunReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.batchRunReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:checkCompatibility","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkCompatibility)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.checkCompatibility"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runPivotReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runPivotReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runPivotReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runRealtimeReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runRealtimeReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runRealtimeReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runReport"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.organizations.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.organizations.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.get"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:subscribe","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.subscribe"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.testIamPermissions"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.testIamPermissions"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:subscribe","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.subscribe"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.testIamPermissions"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.testIamPermissions"},{"hostname":"analyticsreporting.googleapis.com","http_method":"POST","path_template":"/v4/reports:batchGet","path_regex":"^(?:/v4/reports:batchGet)$","service_name":"google.analyticsreporting","resource_name":"analyticsreporting.reports.batchGet"},{"hostname":"analyticsreporting.googleapis.com","http_method":"POST","path_template":"/v4/userActivity:search","path_regex":"^(?:/v4/userActivity:search)$","service_name":"google.analyticsreporting","resource_name":"analyticsreporting.userActivity.search"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"DELETE","path_template":"/v1/customers/{customersId}/configurations/{configurationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.delete"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers","path_regex":"^(?:/v1/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/configurations","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/configurations/{configurationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/devices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/dpcs","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dpcs)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.dpcs.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.operations.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/customers","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.customers.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/devices/{devicesId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/vendors","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vendors)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.vendors.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/vendors/{vendorsId}/customers","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vendors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.vendors.customers.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"PATCH","path_template":"/v1/customers/{customersId}/configurations/{configurationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.patch"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/configurations","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.create"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/devices:applyConfiguration","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:applyConfiguration)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.applyConfiguration"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/devices:removeConfiguration","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:removeConfiguration)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.removeConfiguration"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/devices:unclaim","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:unclaim)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.unclaim"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/customers","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.customers.create"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices/{devicesId}/metadata","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.metadata"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:claim","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:claim)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.claim"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:claimAsync","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:claimAsync)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.claimAsync"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:findByIdentifier","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:findByIdentifier)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.findByIdentifier"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:findByOwner","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:findByOwner)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.findByOwner"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:unclaim","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:unclaim)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.unclaim"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:unclaimAsync","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:unclaimAsync)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.unclaimAsync"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:updateMetadataAsync","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:updateMetadataAsync)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.updateMetadataAsync"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccountKeys/{keyId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccountKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.serviceaccountkeys.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/deviceAccess","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceAccess)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.revokeDeviceAccess"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps/{webAppId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises","path_regex":"^(?:/androidenterprise/v1/enterprises)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/groupLicenses","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupLicenses)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.grouplicenses.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupLicenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.grouplicenses.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}/users","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupLicenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.grouplicenseusers.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/appRestrictionsSchema","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRestrictionsSchema)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.getAppRestrictionsSchema"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/managedConfigurationsSettings","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsSettings)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationssettings.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/permissions","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.getPermissions"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccount","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.getServiceAccount"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccountKeys","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccountKeys)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.serviceaccountkeys.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.getStoreLayout"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/availableProductSet","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/availableProductSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.getAvailableProductSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/state)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.getState"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps/{webAppId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/permissions/{permissionId}","path_regex":"^(?:/androidenterprise/v1/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.permissions.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/acknowledgeNotificationSet","path_regex":"^(?:/androidenterprise/v1/enterprises/acknowledgeNotificationSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.acknowledgeNotificationSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/completeSignup","path_regex":"^(?:/androidenterprise/v1/enterprises/completeSignup)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.completeSignup"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/enroll","path_regex":"^(?:/androidenterprise/v1/enterprises/enroll)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.enroll"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/pullNotificationSet","path_regex":"^(?:/androidenterprise/v1/enterprises/pullNotificationSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.pullNotificationSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/signupUrl","path_regex":"^(?:/androidenterprise/v1/enterprises/signupUrl)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.generateSignupUrl"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/createEnrollmentToken","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEnrollmentToken)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.createEnrollmentToken"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/createWebToken","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createWebToken)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.createWebToken"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/approve","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approve)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.approve"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/generateApprovalUrl","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generateApprovalUrl)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.generateApprovalUrl"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/unapprove","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unapprove)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.unapprove"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/sendTestPushNotification","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendTestPushNotification)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.sendTestPushNotification"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccountKeys","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccountKeys)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.serviceaccountkeys.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/unenroll","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unenroll)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.unenroll"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/authenticationToken","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authenticationToken)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.generateAuthenticationToken"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/forceReportUpload","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forceReportUpload)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.forceReportUpload"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/account","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/account)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.setAccount"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.setStoreLayout"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/availableProductSet","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/availableProductSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.setAvailableProductSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/state)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.setState"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps/{webAppId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.update"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations/{operationsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens/{enrollmentTokensId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/policies/{policiesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/webApps/{webAppsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises","path_regex":"^(?:/v1/enterprises)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/applications/{applicationsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.applications.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations/{operationsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens/{enrollmentTokensId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/policies","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/policies/{policiesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/webApps","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/webApps/{webAppsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}/policies/{policiesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}/webApps/{webAppsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises","path_regex":"^(?:/v1/enterprises)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.cancel"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}:issueCommand","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::issueCommand)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.issueCommand"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/webApps","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/webTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webTokens.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/signupUrls","path_regex":"^(?:/v1/signupUrls)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.signupUrls.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.deleteall"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.deleteall"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}/{imageId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}/grants/{grantsId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.grants.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{applicationsId}/externalTransactions/{externalTransactionsId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalTransactions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.externaltransactions.getexternaltransaction"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/deviceTierConfigs","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceTierConfigs)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.deviceTierConfigs.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/deviceTierConfigs/{deviceTierConfigId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceTierConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.deviceTierConfigs.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.apks.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/bundles","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bundles)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.bundles.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/countryAvailability/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countryAvailability/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.countryavailability.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/details","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.details.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/testers/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.testers.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/generatedApks/{versionCode}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generatedApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.generatedapks.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/generatedApks/{versionCode}/downloads/{downloadId}:download","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generatedApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/downloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.generatedapks.download"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptionsv2/tokens/{token}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptionsv2/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptionsv2.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/voidedpurchases","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/voidedpurchases)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.voidedpurchases.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/reviews","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reviews)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.reviews.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.reviews.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants/{variantId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants/{variantId}:download","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.download"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/developers/{developersId}/users","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/details","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.details.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/testers/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.testers.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}/grants/{grantsId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.grants.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/internalappsharing/{packageName}/artifacts/apk","path_regex":"^(?:/androidpublisher/v3/applications/internalappsharing/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/apk)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.internalappsharingartifacts.uploadapk"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/internalappsharing/{packageName}/artifacts/bundle","path_regex":"^(?:/androidpublisher/v3/applications/internalappsharing/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/bundle)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.internalappsharingartifacts.uploadbundle"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{applicationsId}/externalTransactions","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalTransactions)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.externaltransactions.createexternaltransaction"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{applicationsId}/externalTransactions/{externalTransactionsId}:refund","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalTransactions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refund)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.externaltransactions.refundexternaltransaction"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/deviceTierConfigs","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceTierConfigs)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.deviceTierConfigs.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.insert"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.apks.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/externallyHosted","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/externallyHosted)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.apks.addexternallyhosted"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deobfuscationFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.deobfuscationfiles.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/bundles","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bundles)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.bundles.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}:commit","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.commit"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}:validate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.validate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.insert"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/orders/{orderId}:refund","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refund)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.orders.refund"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/pricing:convertRegionPrices","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pricing:convertRegionPrices)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.convertRegionPrices"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:acknowledge","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.acknowledge"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:consume","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::consume)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.consume"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:acknowledge","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.acknowledge"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.cancel"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:defer","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::defer)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.defer"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refund)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.refund"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.revoke"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}:reply","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reply)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.reviews.reply"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}:activate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.activate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}:deactivate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.deactivate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}:activate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.activate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}:deactivate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.deactivate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}:migratePrices","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::migratePrices)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.migratePrices"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}:archive","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.archive"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/developers/{developersId}/users","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}/grants","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grants)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.grants.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/details","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.details.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/testers/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.testers.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.update"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.patch"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/analytics/datastores/{datastoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans/{rateplansId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/datacollectors/{datacollectorsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.apiproducts.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions/{debugsessionsId}/data","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.deleteData"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.undeploy"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/caches/{cachesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.caches.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/flowhooks/{flowhooksId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flowhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.flowhooks.detachSharedFlowFromFlowHook"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references/{referencesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}/{name}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.revisions.undeploy"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers/{targetserversId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides/{overridesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses/{natAddressesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/reports/{reportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.environments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories/{apicategoriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.delete"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/hybrid/issuers","path_regex":"^(?:/v1/hybrid/issuers)$","service_name":"google.apigee","resource_name":"apigee.hybrid.issuers.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations","path_regex":"^(?:/v1/organizations)$","service_name":"google.apigee","resource_name":"apigee.organizations.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/analytics/datastores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores)$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/analytics/datastores/{datastoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans/{rateplansId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.apps.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apps.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/datacollectors","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors)$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/datacollectors/{datacollectorsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/deployedIngressConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployedIngressConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.getDeployedIngressConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/balance","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/balance)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.getBalance"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/monetizationConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monetizationConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.getMonetizationConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/endpointAttachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/deployedIngressConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployedIngressConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.getDeployedIngressConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/admin/schemav2","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/admin/schemav2)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.admin.getSchemav2"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/exports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/exports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.exports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/exports/{exportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/exports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.exports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apiSecurityRuntimeConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiSecurityRuntimeConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getApiSecurityRuntimeConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions/{debugsessionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions/{debugsessionsId}/data/{dataId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.data.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.getDeployments"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/debugmask","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugmask)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getDebugmask"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/deployedConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployedConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getDeployedConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/flowhooks/{flowhooksId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flowhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.flowhooks.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}/certificate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificate)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.getCertificate"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}/csr","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csr)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.csr"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/optimizedStats/{optimizedStatsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/optimizedStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.optimizedStats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries/{queriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries/{queriesId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries/{queriesId}/resulturl","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resulturl)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.getResulturl"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references/{referencesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.listEnvironmentResources"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}/{name}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityIncidents","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityIncidents)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityIncidents.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityIncidents/{securityIncidentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityIncidents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityIncidents.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports/{securityReportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports/{securityReportsId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports/{securityReportsId}/resultView","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resultView)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.getResultView"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.revisions.getDeployments"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/stats/{statsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.stats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers/{targetserversId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getTraceConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides/{overridesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getIamPolicy"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries/{hostQueriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries/{hostQueriesId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries/{hostQueriesId}/resultView","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resultView)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.getResultView"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports/{hostSecurityReportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports/{hostSecurityReportsId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports/{hostSecurityReportsId}/resultView","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resultView)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.getResultView"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostStats/{hostStatsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.hostStats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/canaryevaluations/{canaryevaluationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/canaryevaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.canaryevaluations.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses/{natAddressesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigee","resource_name":"apigee.organizations.operations.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.operations.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/optimizedHostStats/{optimizedHostStatsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/optimizedHostStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.optimizedHostStats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/reports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/reports/{reportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/runtimeConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.getRuntimeConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityProfiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}:listRevisions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.listRevisions"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories/{apicategoriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}:getProjectMapping","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getProjectMapping)$","service_name":"google.apigee","resource_name":"apigee.organizations.getProjectMapping"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/datacollectors/{datacollectorsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.modifyEnvironment"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/debugmask","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugmask)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateDebugmask"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateTraceConfig"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides/{overridesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories/{apicategoriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.patch"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations","path_regex":"^(?:/v1/organizations)$","service_name":"google.apigee","resource_name":"apigee.organizations.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/analytics/datastores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores)$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/analytics/datastores:test","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores:test)$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.test"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.updateApiProductAttribute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.updateApiProxyRevision"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/datacollectors","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors)$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.setDeveloperStatus"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.generateKeyPairOrUpdateDeveloperAppStatus"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.updateDeveloperAppAttribute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/create","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/create)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.create.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.updateDeveloperAppKey"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.apiproducts.updateDeveloperAppKeyApiProduct"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.updateDeveloperAttribute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/balance:adjust","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/balance:adjust)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.balance.adjust"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/balance:credit","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/balance:credit)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.balance.credit"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions/{subscriptionsId}:expire","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::expire)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.expire"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/endpointAttachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/envgroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateEnvironment"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/exports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/exports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.exports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.deploy"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments:generateDeployChangeReport","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments:generateDeployChangeReport)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.deployments.generateDeployChangeReport"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments:generateUndeployChangeReport","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments:generateUndeployChangeReport)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.deployments.generateUndeployChangeReport"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}:generateDownloadUrl","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.generateDownloadUrl"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments:generateUploadUrl","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments:generateUploadUrl)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.generateUploadUrl"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityStats:queryTabularStats","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityStats:queryTabularStats)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityStats.queryTabularStats"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityStats:queryTimeSeriesStats","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityStats:queryTimeSeriesStats)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityStats.queryTimeSeriesStats"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.revisions.deploy"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.setIamPolicy"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:subscribe","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.subscribe"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.testIamPermissions"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:unsubscribe","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribe)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.unsubscribe"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/hostQueries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/canaryevaluations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/canaryevaluations)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.canaryevaluations.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses/{natAddressesId}:activate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.activate"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}:reportStatus","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.reportStatus"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps)$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/reports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}/environments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.environments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}/environments/{environmentsId}:computeEnvironmentScores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeEnvironmentScores)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.environments.computeEnvironmentScores"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sharedflows","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.updateSharedFlowRevision"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getSyncAuthorization","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getSyncAuthorization)$","service_name":"google.apigee","resource_name":"apigee.organizations.getSyncAuthorization"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setAddons","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAddons)$","service_name":"google.apigee","resource_name":"apigee.organizations.setAddons"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setSyncAuthorization","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSyncAuthorization)$","service_name":"google.apigee","resource_name":"apigee.organizations.setSyncAuthorization"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:provisionOrganization","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provisionOrganization)$","service_name":"google.apigee","resource_name":"apigee.projects.provisionOrganization"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/analytics/datastores/{datastoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans/{rateplansId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.replaceDeveloperAppKey"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/monetizationConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monetizationConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.updateMonetizationConfig"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/flowhooks/{flowhooksId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flowhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.flowhooks.attachSharedFlowToFlowHook"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references/{referencesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}/{name}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers/{targetserversId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/reports/{reportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.update"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.deleteRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.deleteRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.listRevisions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.listRevisions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtime:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtime:getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.runtime.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.rollback"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:tagRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tagRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.tagRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.rollback"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:tagRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tagRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.tagRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.cancel"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtime:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtime:setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.runtime.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtime:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtime:testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.runtime.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.replaceArtifact"},{"hostname":"apikeys.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.delete"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/keys:lookupKey","path_regex":"^(?:/v2/keys:lookupKey)$","service_name":"google.apikeys","resource_name":"apikeys.keys.lookupKey"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/operations/{operationsId}","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.operations.get"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.list"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.get"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}/keyString","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyString)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.getKeyString"},{"hostname":"apikeys.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.patch"},{"hostname":"apikeys.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.create"},{"hostname":"apikeys.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}:undelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.undelete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/authorizedDomains","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/domainMappings","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/authorizedDomains","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/domainMappings","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/locations","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/operations","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/authorizedDomains","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/domainMappings","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/locations","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/operations","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/locations","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/operations","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/locations","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/operations","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta4/apps/{appsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta5/apps/{appsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps","path_regex":"^(?:/v1/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/domainMappings","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/firewall/ingressRules:batchUpdate","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules:batchUpdate)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.batchUpdate"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}:repair","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.apps.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}:repair","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.apps.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{appsId}/domainMappings","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps","path_regex":"^(?:/v1beta/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/domainMappings","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules:batchUpdate","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules:batchUpdate)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.batchUpdate"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}:repair","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.apps.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/applications","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:repair","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta4/apps","path_regex":"^(?:/v1beta4/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta5/apps","path_regex":"^(?:/v1beta5/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"area120tables.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/tables/{tablesId}/rows/{rowsId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.delete"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables","path_regex":"^(?:/v1alpha1/tables)$","service_name":"google.area120tables","resource_name":"area120tables.tables.list"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables/{tablesId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.get"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables/{tablesId}/rows","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.list"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables/{tablesId}/rows/{rowsId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.get"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/workspaces","path_regex":"^(?:/v1alpha1/workspaces)$","service_name":"google.area120tables","resource_name":"area120tables.workspaces.list"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/workspaces/{workspacesId}","path_regex":"^(?:/v1alpha1/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.workspaces.get"},{"hostname":"area120tables.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/tables/{tablesId}/rows/{rowsId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.patch"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.create"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows:batchCreate","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows:batchCreate)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.batchCreate"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows:batchDelete","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows:batchDelete)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.batchDelete"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows:batchUpdate","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows:batchUpdate)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.batchUpdate"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.operations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/dockerImages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dockerImages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.dockerImages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/dockerImages/{dockerImagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dockerImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.dockerImages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/mavenArtifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mavenArtifacts)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.mavenArtifacts.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/mavenArtifacts/{mavenArtifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mavenArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.mavenArtifacts.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/npmPackages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/npmPackages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.npmPackages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/npmPackages/{npmPackagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/npmPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.npmPackages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/pythonPackages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pythonPackages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.pythonPackages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/pythonPackages/{pythonPackagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pythonPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.pythonPackages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.getIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vpcscConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpcscConfig)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.getVpcscConfig"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.getProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.operations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.getIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.operations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.getIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.getProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vpcscConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpcscConfig)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.updateVpcscConfig"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.updateProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.updateProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/kfpArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/kfpArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.kfpArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.setIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.testIamPermissions"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.setIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.testIamPermissions"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:create","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:import","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:create","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:import","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.setIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.testIamPermissions"},{"hostname":"assuredworkloads.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.delete"},{"hostname":"assuredworkloads.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.delete"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/organizations/{organizationsId1}/locations/{locationsId1}/workloads/{workloadsId1}:analyzeWorkloadMove","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeWorkloadMove)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.organizations.locations.workloads.analyzeWorkloadMove"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:analyzeWorkloadMove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeWorkloadMove)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.projects.organizations.locations.workloads.analyzeWorkloadMove"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.patch"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:mutatePartnerPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mutatePartnerPermissions)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.mutatePartnerPermissions"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.patch"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.create"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}:acknowledge","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.acknowledge"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:restrictAllowedResources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restrictAllowedResources)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.restrictAllowedResources"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.create"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}:acknowledge","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.acknowledge"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:restrictAllowedResources","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restrictAllowedResources)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.restrictAllowedResources"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"DELETE","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.delete"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/finalizedDeals","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.bidders.finalizedDeals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/auctionPackages","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/finalizedDeals","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals/{dealsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/publisherProfiles","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.publisherProfiles.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/publisherProfiles/{publisherProfilesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.publisherProfiles.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals/{dealsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:subscribe","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.subscribe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:subscribeClients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribeClients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.subscribeClients"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:unsubscribe","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.unsubscribe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:unsubscribeClients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribeClients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.unsubscribeClients"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}:activate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}:deactivate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}:activate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}:deactivate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:addCreative","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addCreative)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.addCreative"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:pause","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.pause"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:resume","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.resume"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:setReadyToServe","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setReadyToServe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.setReadyToServe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals:batchUpdate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals:batchUpdate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.batchUpdate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}:accept","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.accept"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}:addNote","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addNote)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.addNote"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}:cancelNegotiation","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelNegotiation)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.cancelNegotiation"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals:sendRfp","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals:sendRfp)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.sendRfp"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/sshKeys/{sshKeysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.sshKeys.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/provisioningQuotas","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningQuotas)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.provisioningQuotas.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instanceProvisioningSettings:fetch","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceProvisioningSettings:fetch)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instanceProvisioningSettings.fetch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks/{networksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks:listNetworkUsage","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks:listNetworkUsage)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.listNetworkUsage"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.operations.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs/{provisioningConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningQuotas","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningQuotas)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningQuotas.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/sshKeys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshKeys)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.sshKeys.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/luns","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/luns)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.luns.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/luns/{lunsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/luns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.luns.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks/{networksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs/{provisioningConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.cancel"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}:submitProvisioningConfig","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::submitProvisioningConfig)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.submitProvisioningConfig"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:detachLun","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachLun)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.detachLun"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:disableInteractiveSerialConsole","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableInteractiveSerialConsole)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.disableInteractiveSerialConsole"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:enableInteractiveSerialConsole","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableInteractiveSerialConsole)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.enableInteractiveSerialConsole"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reset","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.reset"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:start","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.start"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:stop","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.stop"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks/{networksId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs:submit","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs:submit)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.submit"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/sshKeys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshKeys)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.sshKeys.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/luns/{lunsId}:evict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/luns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evict)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.luns.evict"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots/{snapshotsId}:restoreVolumeSnapshot","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restoreVolumeSnapshot)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.restoreVolumeSnapshot"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}:evict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evict)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.evict"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}:resize","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resize)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.resize"},{"hostname":"batch.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.delete"},{"hostname":"batch.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.delete"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.batch","resource_name":"batch.projects.locations.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.get"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.get"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/taskGroups/{taskGroupsId}/tasks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taskGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.taskGroups.tasks.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/taskGroups/{taskGroupsId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taskGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.taskGroups.tasks.get"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.get"},{"hostname":"batch.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.create"},{"hostname":"batch.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.cancel"},{"hostname":"batch.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/state:report","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/state:report)$","service_name":"google.batch","resource_name":"batch.projects.locations.state.report"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections:resolve)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.resolve"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:resolveInstanceConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolveInstanceConfig)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.resolveInstanceConfig"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/insights","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.insights.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/insights/{insightsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.insights.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/insights/{insightsId}:configuredInsight","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configuredInsight)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.insights.configuredInsight"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections:resolve)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.resolve"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:resolveInstanceConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolveInstanceConfig)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.resolveInstanceConfig"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applications.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections:resolve)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.resolve"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:resolveInstanceConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolveInstanceConfig)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.resolveInstanceConfig"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/insights","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.insights.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/insights/{insightsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.insights.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/insights/{insightsId}:configuredInsight","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configuredInsight)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.insights.configuredInsight"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/netConnections/{netConnectionsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/netConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.netConnections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:reportStatus","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.reportStatus"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.cancel"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:reportStatus","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.reportStatus"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applications.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applications.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:reportStatus","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.reportStatus"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/netConnections/{netConnectionsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/netConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.netConnections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/netConnections/{netConnectionsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/netConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.netConnections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.cancel"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables/{tableId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models/{modelsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.models.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.routines.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/jobs/{jobsId}/delete","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/delete)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.delete"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects","path_regex":"^(?:/bigquery/v2/projects)$","service_name":"google.bigquery","resource_name":"bigquery.projects.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/datasets","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.bigquery","resource_name":"bigquery.datasets.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigquery","resource_name":"bigquery.tables.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables/{tableId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables/{tableId}/data","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data)$","service_name":"google.bigquery","resource_name":"bigquery.tabledata.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/jobs","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/jobs/{jobId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.jobs.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/queries/{jobId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.jobs.getQueryResults"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectId}/serviceAccount","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.bigquery","resource_name":"bigquery.projects.getServiceAccount"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.bigquery","resource_name":"bigquery.models.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models/{modelsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.models.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines)$","service_name":"google.bigquery","resource_name":"bigquery.routines.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.routines.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.list"},{"hostname":"bigquery.googleapis.com","http_method":"PATCH","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.patch"},{"hostname":"bigquery.googleapis.com","http_method":"PATCH","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables/{tableId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.patch"},{"hostname":"bigquery.googleapis.com","http_method":"PATCH","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models/{modelsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.models.patch"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectId}/datasets","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.bigquery","resource_name":"bigquery.datasets.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigquery","resource_name":"bigquery.tables.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables/{tableId}/insertAll","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertAll)$","service_name":"google.bigquery","resource_name":"bigquery.tabledata.insertAll"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectId}/jobs","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectId}/jobs/{jobId}/cancel","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.cancel"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectId}/queries","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.query"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines)$","service_name":"google.bigquery","resource_name":"bigquery.routines.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies/{rowAccessPoliciesId}:getIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.getIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies/{rowAccessPoliciesId}:setIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.setIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies/{rowAccessPoliciesId}:testIamPermissions","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.testIamPermissions"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.tables.getIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.tables.setIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigquery","resource_name":"bigquery.tables.testIamPermissions"},{"hostname":"bigquery.googleapis.com","http_method":"PUT","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.update"},{"hostname":"bigquery.googleapis.com","http_method":"PUT","path_template":"/bigquery/v2/projects/{projectId}/datasets/{datasetId}/tables/{tableId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.update"},{"hostname":"bigquery.googleapis.com","http_method":"PUT","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.routines.update"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.delete"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.list"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.get"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.patch"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/credential","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credential)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.updateCredential"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.create"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.getIamPolicy"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.setIamPolicy"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.testIamPermissions"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.dataSources.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.dataSources.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.dataSources.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.dataSources.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs/{runsId}/transferLogs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferLogs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.transferLogs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs/{runsId}/transferLogs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferLogs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.transferLogs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.patch"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.patch"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/dataSources/{dataSourcesId}:checkValidCreds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkValidCreds)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.dataSources.checkValidCreds"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataSources/{dataSourcesId}:checkValidCreds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkValidCreds)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.dataSources.checkValidCreds"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.create"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}:scheduleRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::scheduleRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.scheduleRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}:startManualRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startManualRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.startManualRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:enrollDataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enrollDataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.enrollDataSources"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.create"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}:scheduleRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::scheduleRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.scheduleRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}:startManualRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startManualRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.startManualRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:enrollDataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enrollDataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.enrollDataSources"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservationGrants/{reservationGrantsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservationGrants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservationGrants.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/slotPools/{slotPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slotPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.slotPools.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.getBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchAllAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAllAssignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchAllAssignments"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAssignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchAssignments"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.operations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservationGrants","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservationGrants)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservationGrants.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/slotPools","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slotPools)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.slotPools.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/slotPools/{slotPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slotPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.slotPools.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}:SearchReservationGrants","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::SearchReservationGrants)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchReservationGrants"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.getBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}:searchAssignments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAssignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchAssignments"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.updateBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/{reservationsId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.updateBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}:split","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::split)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.split"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments:merge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments:merge)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.merge"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}:move","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.move"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.operations.cancel"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservationGrants","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservationGrants)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservationGrants.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.createReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}:split","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::split)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.split"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments:merge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments:merge)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.merge"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}:move","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.move"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/operations/{operationsId}","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.operations.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles/{appProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/operations/projects/{projectsId}/operations","path_regex":"^(?:/v2/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.operations.projects.operations.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/operations/{operationsId}","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.operations.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles/{appProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/hotTablets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hotTablets)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.hotTablets.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.locations.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.locations.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.partialUpdateInstance"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles/{appProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.partialUpdateCluster"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/operations/{operationsId}:cancel","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.operations.cancel"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups:copy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups:copy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.copy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:checkConsistency","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkConsistency)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.checkConsistency"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:dropRowRange","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dropRowRange)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.dropRowRange"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:generateConsistencyToken","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConsistencyToken)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.generateConsistencyToken"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:modifyColumnFamilies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyColumnFamilies)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.modifyColumnFamilies"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:undelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.undelete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables:restore","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables:restore)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.restore"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.update"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.update"},{"hostname":"billingbudgets.googleapis.com","http_method":"DELETE","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.delete"},{"hostname":"billingbudgets.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.delete"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.list"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.get"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.list"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.get"},{"hostname":"billingbudgets.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.patch"},{"hostname":"billingbudgets.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.patch"},{"hostname":"billingbudgets.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.create"},{"hostname":"billingbudgets.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.delete"},{"hostname":"binaryauthorization.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.delete"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/policy","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.systempolicy.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/attestors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.list"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.get"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/policy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/policy:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/locations/{locationsId}/policy","path_regex":"^(?:/v1beta1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.systempolicy.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/attestors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.list"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.get"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/policy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/policy:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:validateAttestationOccurrence","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateAttestationOccurrence)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.validateAttestationOccurrence"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/policy:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/policy:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:validateAttestationOccurrence","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateAttestationOccurrence)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.validateAttestationOccurrence"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/policy:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/policy:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.update"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/policy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.updatePolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.update"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/policy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.updatePolicy"},{"hostname":"blogger.googleapis.com","http_method":"DELETE","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.delete"},{"hostname":"blogger.googleapis.com","http_method":"DELETE","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.delete"},{"hostname":"blogger.googleapis.com","http_method":"DELETE","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.delete"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogs.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/pages","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts/{postId}/comments","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/users/{userId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.users.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/users/{userId}/blogs","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs)$","service_name":"google.blogger","resource_name":"blogger.blogs.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/byurl","path_regex":"^(?:/v3/blogs/byurl)$","service_name":"google.blogger","resource_name":"blogger.blogs.getByUrl"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogs.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/comments","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.listByBlog"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/pages","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/pageviews","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pageviews)$","service_name":"google.blogger","resource_name":"blogger.pageViews.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/bypath","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/bypath)$","service_name":"google.blogger","resource_name":"blogger.posts.getByPath"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/search","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/search)$","service_name":"google.blogger","resource_name":"blogger.posts.search"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.users.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs)$","service_name":"google.blogger","resource_name":"blogger.blogs.listByUser"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs/{blogId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogUserInfos.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs/{blogId}/posts","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.get"},{"hostname":"blogger.googleapis.com","http_method":"PATCH","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.patch"},{"hostname":"blogger.googleapis.com","http_method":"PATCH","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.patch"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/pages","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.insert"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/pages/{pageId}/publish","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.blogger","resource_name":"blogger.pages.publish"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/pages/{pageId}/revert","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revert)$","service_name":"google.blogger","resource_name":"blogger.pages.revert"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.insert"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/approve","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approve)$","service_name":"google.blogger","resource_name":"blogger.comments.approve"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/removecontent","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removecontent)$","service_name":"google.blogger","resource_name":"blogger.comments.removeContent"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/spam","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spam)$","service_name":"google.blogger","resource_name":"blogger.comments.markAsSpam"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/publish","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.blogger","resource_name":"blogger.posts.publish"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/revert","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revert)$","service_name":"google.blogger","resource_name":"blogger.posts.revert"},{"hostname":"blogger.googleapis.com","http_method":"PUT","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.update"},{"hostname":"blogger.googleapis.com","http_method":"PUT","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.update"},{"hostname":"books.googleapis.com","http_method":"DELETE","path_template":"/books/v1/mylibrary/annotations/{annotationId}","path_regex":"^(?:/books/v1/mylibrary/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.annotations.delete"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/dictionary/listOfflineMetadata","path_regex":"^(?:/books/v1/dictionary/listOfflineMetadata)$","service_name":"google.books","resource_name":"books.dictionary.listOfflineMetadata"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/familysharing/getFamilyInfo","path_regex":"^(?:/books/v1/familysharing/getFamilyInfo)$","service_name":"google.books","resource_name":"books.familysharing.getFamilyInfo"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/myconfig/getUserSettings","path_regex":"^(?:/books/v1/myconfig/getUserSettings)$","service_name":"google.books","resource_name":"books.myconfig.getUserSettings"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/annotations","path_regex":"^(?:/books/v1/mylibrary/annotations)$","service_name":"google.books","resource_name":"books.mylibrary.annotations.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/bookshelves","path_regex":"^(?:/books/v1/mylibrary/bookshelves)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/bookshelves/{shelf}","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/volumes","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.volumes.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/readingpositions/{volumeId}","path_regex":"^(?:/books/v1/mylibrary/readingpositions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.readingpositions.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/notification/get","path_regex":"^(?:/books/v1/notification/get)$","service_name":"google.books","resource_name":"books.notification.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/onboarding/listCategories","path_regex":"^(?:/books/v1/onboarding/listCategories)$","service_name":"google.books","resource_name":"books.onboarding.listCategories"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/onboarding/listCategoryVolumes","path_regex":"^(?:/books/v1/onboarding/listCategoryVolumes)$","service_name":"google.books","resource_name":"books.onboarding.listCategoryVolumes"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/personalizedstream/get","path_regex":"^(?:/books/v1/personalizedstream/get)$","service_name":"google.books","resource_name":"books.personalizedstream.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/promooffer/get","path_regex":"^(?:/books/v1/promooffer/get)$","service_name":"google.books","resource_name":"books.promooffer.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/series/get","path_regex":"^(?:/books/v1/series/get)$","service_name":"google.books","resource_name":"books.series.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/series/membership/get","path_regex":"^(?:/books/v1/series/membership/get)$","service_name":"google.books","resource_name":"books.series.membership.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/users/{userId}/bookshelves","path_regex":"^(?:/books/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bookshelves)$","service_name":"google.books","resource_name":"books.bookshelves.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/users/{userId}/bookshelves/{shelf}","path_regex":"^(?:/books/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.bookshelves.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/users/{userId}/bookshelves/{shelf}/volumes","path_regex":"^(?:/books/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes)$","service_name":"google.books","resource_name":"books.bookshelves.volumes.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes","path_regex":"^(?:/books/v1/volumes)$","service_name":"google.books","resource_name":"books.volumes.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/mybooks","path_regex":"^(?:/books/v1/volumes/mybooks)$","service_name":"google.books","resource_name":"books.volumes.mybooks.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/recommended","path_regex":"^(?:/books/v1/volumes/recommended)$","service_name":"google.books","resource_name":"books.volumes.recommended.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/useruploaded","path_regex":"^(?:/books/v1/volumes/useruploaded)$","service_name":"google.books","resource_name":"books.volumes.useruploaded.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.volumes.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/associated","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associated)$","service_name":"google.books","resource_name":"books.volumes.associated.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.volumeAnnotations.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}/annotations/{annotationId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.volumeAnnotations.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}/data","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data)$","service_name":"google.books","resource_name":"books.layers.annotationData.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}/data/{annotationDataId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.annotationData.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layersummary","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layersummary)$","service_name":"google.books","resource_name":"books.layers.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layersummary/{summaryId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layersummary/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.get"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/cloudloading/addBook","path_regex":"^(?:/books/v1/cloudloading/addBook)$","service_name":"google.books","resource_name":"books.cloudloading.addBook"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/cloudloading/deleteBook","path_regex":"^(?:/books/v1/cloudloading/deleteBook)$","service_name":"google.books","resource_name":"books.cloudloading.deleteBook"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/cloudloading/updateBook","path_regex":"^(?:/books/v1/cloudloading/updateBook)$","service_name":"google.books","resource_name":"books.cloudloading.updateBook"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/familysharing/share","path_regex":"^(?:/books/v1/familysharing/share)$","service_name":"google.books","resource_name":"books.familysharing.share"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/familysharing/unshare","path_regex":"^(?:/books/v1/familysharing/unshare)$","service_name":"google.books","resource_name":"books.familysharing.unshare"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/releaseDownloadAccess","path_regex":"^(?:/books/v1/myconfig/releaseDownloadAccess)$","service_name":"google.books","resource_name":"books.myconfig.releaseDownloadAccess"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/requestAccess","path_regex":"^(?:/books/v1/myconfig/requestAccess)$","service_name":"google.books","resource_name":"books.myconfig.requestAccess"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/syncVolumeLicenses","path_regex":"^(?:/books/v1/myconfig/syncVolumeLicenses)$","service_name":"google.books","resource_name":"books.myconfig.syncVolumeLicenses"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/updateUserSettings","path_regex":"^(?:/books/v1/myconfig/updateUserSettings)$","service_name":"google.books","resource_name":"books.myconfig.updateUserSettings"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/annotations","path_regex":"^(?:/books/v1/mylibrary/annotations)$","service_name":"google.books","resource_name":"books.mylibrary.annotations.insert"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/annotations/summary","path_regex":"^(?:/books/v1/mylibrary/annotations/summary)$","service_name":"google.books","resource_name":"books.mylibrary.annotations.summary"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/addVolume","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addVolume)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.addVolume"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/clearVolumes","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clearVolumes)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.clearVolumes"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/moveVolume","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveVolume)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.moveVolume"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/removeVolume","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeVolume)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.removeVolume"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/readingpositions/{volumeId}/setPosition","path_regex":"^(?:/books/v1/mylibrary/readingpositions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPosition)$","service_name":"google.books","resource_name":"books.mylibrary.readingpositions.setPosition"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/promooffer/accept","path_regex":"^(?:/books/v1/promooffer/accept)$","service_name":"google.books","resource_name":"books.promooffer.accept"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/promooffer/dismiss","path_regex":"^(?:/books/v1/promooffer/dismiss)$","service_name":"google.books","resource_name":"books.promooffer.dismiss"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/volumes/recommended/rate","path_regex":"^(?:/books/v1/volumes/recommended/rate)$","service_name":"google.books","resource_name":"books.volumes.recommended.rate"},{"hostname":"books.googleapis.com","http_method":"PUT","path_template":"/books/v1/mylibrary/annotations/{annotationId}","path_regex":"^(?:/books/v1/mylibrary/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.annotations.update"},{"hostname":"businessprofileperformance.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/searchkeywords/impressions/monthly","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchkeywords/impressions/monthly)$","service_name":"google.businessprofileperformance","resource_name":"businessprofileperformance.locations.searchkeywords.impressions.monthly.list"},{"hostname":"businessprofileperformance.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}:fetchMultiDailyMetricsTimeSeries","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchMultiDailyMetricsTimeSeries)$","service_name":"google.businessprofileperformance","resource_name":"businessprofileperformance.locations.fetchMultiDailyMetricsTimeSeries"},{"hostname":"businessprofileperformance.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}:getDailyMetricsTimeSeries","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDailyMetricsTimeSeries)$","service_name":"google.businessprofileperformance","resource_name":"businessprofileperformance.locations.getDailyMetricsTimeSeries"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs/{certificateIssuanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries/{certificateMapEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations/{dnsAuthorizationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs/{trustConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs/{certificateIssuanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries/{certificateMapEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations/{dnsAuthorizationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs/{trustConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries/{certificateMapEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations/{dnsAuthorizationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs/{trustConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.cancel"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.create"},{"hostname":"chat.googleapis.com","http_method":"DELETE","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.delete"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.media.download"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces","path_regex":"^(?:/v1/spaces)$","service_name":"google.chat","resource_name":"chat.spaces.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/members","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.chat","resource_name":"chat.spaces.members.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/members/{membersId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.members.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.attachments.get"},{"hostname":"chat.googleapis.com","http_method":"PATCH","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.patch"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces/{spacesId}/messages","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.chat","resource_name":"chat.spaces.messages.create"},{"hostname":"chat.googleapis.com","http_method":"PUT","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.update"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps/android/{androidId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/android/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.android.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps/chrome/{chromeId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/chrome/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.chrome.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps/web/{webId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/web/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.web.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps:countChromeAppRequests","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps:countChromeAppRequests)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.countChromeAppRequests"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeBrowsersNeedingAttention","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeBrowsersNeedingAttention)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeBrowsersNeedingAttention"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeDevicesReachingAutoExpirationDate","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeDevicesReachingAutoExpirationDate)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeDevicesReachingAutoExpirationDate"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeDevicesThatNeedAttention","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeDevicesThatNeedAttention)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeDevicesThatNeedAttention"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeHardwareFleetDevices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeHardwareFleetDevices)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeHardwareFleetDevices"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeVersions","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeVersions)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeVersions"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countInstalledApps","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countInstalledApps)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countInstalledApps"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:findInstalledAppDevices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:findInstalledAppDevices)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.findInstalledAppDevices"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/devices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/devices)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.devices.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/devices/{devicesId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.devices.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/events","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/events)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.events.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/users","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/users)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.users.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/users/{usersId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.users.get"},{"hostname":"chromepolicy.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/policySchemas","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policySchemas)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policySchemas.list"},{"hostname":"chromepolicy.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/policySchemas/{policySchemasId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policySchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policySchemas.get"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/files:uploadPolicyFile","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/files:uploadPolicyFile)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.media.upload"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:batchDelete","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:batchDelete)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.batchDelete"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:batchModify","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:batchModify)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.batchModify"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:listGroupPriorityOrdering","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:listGroupPriorityOrdering)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.listGroupPriorityOrdering"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:updateGroupPriorityOrdering","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:updateGroupPriorityOrdering)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.updateGroupPriorityOrdering"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:defineCertificate","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:defineCertificate)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.defineCertificate"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:defineNetwork","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:defineNetwork)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.defineNetwork"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:removeCertificate","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:removeCertificate)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.removeCertificate"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:removeNetwork","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:removeNetwork)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.removeNetwork"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/orgunits:batchInherit","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/orgunits:batchInherit)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.orgunits.batchInherit"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/orgunits:batchModify","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/orgunits:batchModify)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.orgunits.batchModify"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies:resolve","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies:resolve)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.resolve"},{"hostname":"chromeuxreport.googleapis.com","http_method":"POST","path_template":"/v1/records:queryHistoryRecord","path_regex":"^(?:/v1/records:queryHistoryRecord)$","service_name":"google.chromeuxreport","resource_name":"chromeuxreport.records.queryHistoryRecord"},{"hostname":"chromeuxreport.googleapis.com","http_method":"POST","path_template":"/v1/records:queryRecord","path_regex":"^(?:/v1/records:queryRecord)$","service_name":"google.chromeuxreport","resource_name":"chromeuxreport.records.queryRecord"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/divisions","path_regex":"^(?:/civicinfo/v2/divisions)$","service_name":"google.civicinfo","resource_name":"civicinfo.divisions.search"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/elections","path_regex":"^(?:/civicinfo/v2/elections)$","service_name":"google.civicinfo","resource_name":"civicinfo.elections.electionQuery"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/representatives","path_regex":"^(?:/civicinfo/v2/representatives)$","service_name":"google.civicinfo","resource_name":"civicinfo.representatives.representativeInfoByAddress"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/representatives/{ocdId}","path_regex":"^(?:/civicinfo/v2/representatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.civicinfo","resource_name":"civicinfo.representatives.representativeInfoByDivision"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/voterinfo","path_regex":"^(?:/civicinfo/v2/voterinfo)$","service_name":"google.civicinfo","resource_name":"civicinfo.elections.voterInfoQuery"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/aliases/{alias}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.aliases.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/announcements/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/courseWork/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/students/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.students.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/teachers/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/topics/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.topics.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/invitations/{id}","path_regex":"^(?:/v1/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.invitations.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/registrations/{registrationId}","path_regex":"^(?:/v1/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.registrations.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/userProfiles/{studentId}/guardians/{guardianId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardians/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardians.delete"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses","path_regex":"^(?:/v1/courses)$","service_name":"google.classroom","resource_name":"classroom.courses.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/aliases","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.classroom","resource_name":"classroom.courses.aliases.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/students","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students)$","service_name":"google.classroom","resource_name":"classroom.courses.students.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/students/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.students.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/teachers","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers)$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/teachers/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/topics","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.classroom","resource_name":"classroom.courses.topics.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/topics/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.topics.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/invitations","path_regex":"^(?:/v1/invitations)$","service_name":"google.classroom","resource_name":"classroom.invitations.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/invitations/{id}","path_regex":"^(?:/v1/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.invitations.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardianInvitations","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations)$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardianInvitations/{invitationId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardians","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardians)$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardians.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardians/{guardianId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardians/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardians.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{userId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.get"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/announcements/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWork/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/topics/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.topics.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/userProfiles/{studentId}/guardianInvitations/{invitationId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.patch"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses","path_regex":"^(?:/v1/courses)$","service_name":"google.classroom","resource_name":"classroom.courses.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/aliases","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.classroom","resource_name":"classroom.courses.aliases.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/announcements","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/announcements/{id}:modifyAssignees","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAssignees)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.modifyAssignees"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:modifyAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.modifyAttachments"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:reclaim","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reclaim)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.reclaim"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:return","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::return)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.return"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:turnIn","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::turnIn)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.turnIn"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{id}:modifyAssignees","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAssignees)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.modifyAssignees"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWorkMaterials","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/students","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students)$","service_name":"google.classroom","resource_name":"classroom.courses.students.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/teachers","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers)$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/topics","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.classroom","resource_name":"classroom.courses.topics.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/invitations","path_regex":"^(?:/v1/invitations)$","service_name":"google.classroom","resource_name":"classroom.invitations.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/invitations/{id}:accept","path_regex":"^(?:/v1/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.classroom","resource_name":"classroom.invitations.accept"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/registrations","path_regex":"^(?:/v1/registrations)$","service_name":"google.classroom","resource_name":"classroom.registrations.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/userProfiles/{studentId}/guardianInvitations","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations)$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.create"},{"hostname":"classroom.googleapis.com","http_method":"PUT","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.update"},{"hostname":"cloudasset.googleapis.com","http_method":"DELETE","path_template":"/v1/{v1Id}/{v1Id1}/feeds/{feedsId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.delete"},{"hostname":"cloudasset.googleapis.com","http_method":"DELETE","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.delete"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/assets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.cloudasset","resource_name":"cloudasset.assets.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/effectiveIamPolicies:batchGet","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/effectiveIamPolicies:batchGet)$","service_name":"google.cloudasset","resource_name":"cloudasset.effectiveIamPolicies.batchGet"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/feeds","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds)$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/feeds/{feedsId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeIamPolicy)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeIamPolicy"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeMove","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeMove)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeMove"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeOrgPolicies","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeOrgPolicies)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeOrgPolicies"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeOrgPolicyGovernedAssets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeOrgPolicyGovernedAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeOrgPolicyGovernedAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeOrgPolicyGovernedContainers","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeOrgPolicyGovernedContainers)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeOrgPolicyGovernedContainers"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:batchGetAssetsHistory","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchGetAssetsHistory)$","service_name":"google.cloudasset","resource_name":"cloudasset.batchGetAssetsHistory"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:searchAllIamPolicies","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAllIamPolicies)$","service_name":"google.cloudasset","resource_name":"cloudasset.searchAllIamPolicies"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:searchAllResources","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAllResources)$","service_name":"google.cloudasset","resource_name":"cloudasset.searchAllResources"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.folders.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.organizations.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}:batchGetAssetsHistory","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchGetAssetsHistory)$","service_name":"google.cloudasset","resource_name":"cloudasset.organizations.batchGetAssetsHistory"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.projects.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}:batchGetAssetsHistory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchGetAssetsHistory)$","service_name":"google.cloudasset","resource_name":"cloudasset.projects.batchGetAssetsHistory"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/{v1p1beta1Id}/{v1p1beta1Id1}/iamPolicies:searchAll","path_regex":"^(?:/v1p1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iamPolicies:searchAll)$","service_name":"google.cloudasset","resource_name":"cloudasset.iamPolicies.searchAll"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/{v1p1beta1Id}/{v1p1beta1Id1}/resources:searchAll","path_regex":"^(?:/v1p1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources:searchAll)$","service_name":"google.cloudasset","resource_name":"cloudasset.resources.searchAll"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p4beta1/{v1p4beta1Id}/{v1p4beta1Id1}:analyzeIamPolicy","path_regex":"^(?:/v1p4beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeIamPolicy)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeIamPolicy"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p5beta1/{v1p5beta1Id}/{v1p5beta1Id1}/assets","path_regex":"^(?:/v1p5beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.cloudasset","resource_name":"cloudasset.assets.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p7beta1/{v1p7beta1Id}/{v1p7beta1Id1}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1p7beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"PATCH","path_template":"/v1/{v1Id}/{v1Id1}/feeds/{feedsId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.patch"},{"hostname":"cloudasset.googleapis.com","http_method":"PATCH","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.patch"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/feeds","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds)$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.create"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.create"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}:analyzeIamPolicyLongrunning","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeIamPolicyLongrunning)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeIamPolicyLongrunning"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}:exportAssets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}:queryAssets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.queryAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}:exportAssets","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.folders.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:exportAssets","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.organizations.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:exportAssets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.projects.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1p4beta1/{v1p4beta1Id}/{v1p4beta1Id1}:exportIamPolicyAnalysis","path_regex":"^(?:/v1p4beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportIamPolicyAnalysis)$","service_name":"google.cloudasset","resource_name":"cloudasset.exportIamPolicyAnalysis"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1p7beta1/{v1p7beta1Id}/{v1p7beta1Id1}:exportAssets","path_regex":"^(?:/v1p7beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.exportAssets"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts","path_regex":"^(?:/v1/billingAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/projects","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.projects.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}:getIamPolicy","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.getIamPolicy"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/billingInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingInfo)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.projects.getBillingInfo"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.services.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/skus","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.services.skus.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.patch"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts","path_regex":"^(?:/v1/billingAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.create"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}:setIamPolicy","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.setIamPolicy"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}:testIamPermissions","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.testIamPermissions"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1beta/billingAccounts/{billingAccountsId}:estimateCostScenario","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::estimateCostScenario)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.estimateCostScenario"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1beta:estimateCostScenario","path_regex":"^(?:/v1beta:estimateCostScenario)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.estimateCostScenario"},{"hostname":"cloudbilling.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/billingInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingInfo)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.projects.updateBillingInfo"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/triggers/{triggerId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/builds/{id}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/triggers/{triggerId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.repos.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.repos.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/triggers/{triggerId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/githubDotComWebhook:receive","path_regex":"^(?:/v1/githubDotComWebhook:receive)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.githubDotComWebhook.receive"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/regionalWebhook","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalWebhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.locations.regionalWebhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/builds/{id}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/builds/{id}:retry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.retry"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/triggers/{triggerId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.run"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/triggers/{trigger}:webhook","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::webhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.webhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/builds/{buildsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.approve"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}/connectedRepositories:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectedRepositories:batchCreate)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.connectedRepositories.batchCreate"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}:removeBitbucketServerConnectedRepository","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeBitbucketServerConnectedRepository)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.removeBitbucketServerConnectedRepository"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.approve"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}:retry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.retry"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}/connectedRepositories:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectedRepositories:batchCreate)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.connectedRepositories.batchCreate"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}:removeGitLabConnectedRepository","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeGitLabConnectedRepository)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.removeGitLabConnectedRepository"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.run"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:webhook","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::webhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.webhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/webhook","path_regex":"^(?:/v1/webhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.webhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs/{channelPartnerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs/{customerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs/{channelPartnerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs/{customerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:listEntitlementChanges","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listEntitlementChanges)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.listEntitlementChanges"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:lookupOffer","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupOffer)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.lookupOffer"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:listPurchasableOffers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listPurchasableOffers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.listPurchasableOffers"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:listPurchasableSkus","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listPurchasableSkus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.listPurchasableSkus"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/offers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.offers.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/reports","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.reports.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}:listSubscribers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSubscribers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.listSubscribers"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/products","path_regex":"^(?:/v1/products)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.products.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/products/{productsId}/skus","path_regex":"^(?:/v1/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.products.skus.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs/{channelPartnerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs/{customerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers:import","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers:import)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.import"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:activate","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.activate"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:cancel","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.cancel"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:changeOffer","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changeOffer)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.changeOffer"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:changeParameters","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changeParameters)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.changeParameters"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:changeRenewalSettings","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changeRenewalSettings)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.changeRenewalSettings"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:startPaidService","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startPaidService)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.startPaidService"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:suspend","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::suspend)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.suspend"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:provisionCloudIdentity","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provisionCloudIdentity)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.provisionCloudIdentity"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:transferEntitlements","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::transferEntitlements)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.transferEntitlements"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:transferEntitlementsToGoogle","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::transferEntitlementsToGoogle)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.transferEntitlementsToGoogle"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers:import","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers:import)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.import"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/reportJobs/{reportJobsId}:fetchReportResults","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchReportResults)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.reportJobs.fetchReportResults"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/reports/{reportsId}:run","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.reports.run"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:checkCloudIdentityAccountsExist","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkCloudIdentityAccountsExist)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.checkCloudIdentityAccountsExist"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:listTransferableOffers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTransferableOffers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.listTransferableOffers"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:listTransferableSkus","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTransferableSkus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.listTransferableSkus"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:register","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::register)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.register"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:unregister","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unregister)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.unregister"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.cancel"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/accounts","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.list"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/accounts/{accountsId}","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.get"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/entitlements","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.list"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.get"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"PATCH","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.patch"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/accounts/{accountsId}:approve","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.approve"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/accounts/{accountsId}:reject","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.reject"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/accounts/{accountsId}:reset","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.reset"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:approve","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.approve"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:approvePlanChange","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approvePlanChange)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.approvePlanChange"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:reject","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.reject"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:rejectPlanChange","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rejectPlanChange)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.rejectPlanChange"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:suspend","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::suspend)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.suspend"},{"hostname":"clouddebugger.googleapis.com","http_method":"DELETE","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.delete"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/controller/debuggees/{debuggeeId}/breakpoints","path_regex":"^(?:/v2/controller/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.controller.debuggees.breakpoints.list"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/debugger/debuggees","path_regex":"^(?:/v2/debugger/debuggees)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.list"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.list"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.get"},{"hostname":"clouddebugger.googleapis.com","http_method":"POST","path_template":"/v2/controller/debuggees/register","path_regex":"^(?:/v2/controller/debuggees/register)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.controller.debuggees.register"},{"hostname":"clouddebugger.googleapis.com","http_method":"POST","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints/set","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/set)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.set"},{"hostname":"clouddebugger.googleapis.com","http_method":"PUT","path_template":"/v2/controller/debuggees/{debuggeeId}/breakpoints/{id}","path_regex":"^(?:/v2/controller/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddebugger","resource_name":"clouddebugger.controller.debuggees.breakpoints.update"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.getConfig"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}/jobRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobRuns)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.jobRuns.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}/jobRuns/{jobRunsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.jobRuns.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.getIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.getIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.patch"},{"hostname":"clouddeploy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.patch"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}/jobRuns/{jobRunsId}:terminate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::terminate)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.jobRuns.terminate"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:advance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::advance)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.advance"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.approve"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.cancel"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:ignoreJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::ignoreJob)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.ignoreJob"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:retryJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retryJob)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.retryJob"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}:abandon","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::abandon)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.abandon"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.setIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.testIamPermissions"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.cancel"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.setIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.testIamPermissions"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/events","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.deleteEvents"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/events","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.events.list"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/groupStats","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupStats)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.groupStats.list"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.groups.get"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/events:report","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events:report)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.events.report"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.groups.update"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/operations","path_regex":"^(?:/v1beta2/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/operations/{operationsId}","path_regex":"^(?:/v1beta2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.runtimes.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.runtimes.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.runtimes.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:call","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::call)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.call"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:call","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::call)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.call"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.update"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/devices/{devicesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/groups/{groupsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/devices/{devicesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/groups/{groupsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1beta1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/userinvitations","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}:isInvitableUser","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::isInvitableUser)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.isInvitableUser"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices","path_regex":"^(?:/v1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers:lookup","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups","path_regex":"^(?:/v1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:checkTransitiveMembership","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:checkTransitiveMembership)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.checkTransitiveMembership"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:getMembershipGraph","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:getMembershipGraph)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.getMembershipGraph"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:lookup","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:searchDirectGroups","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchDirectGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchDirectGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:searchTransitiveGroups","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:searchTransitiveMemberships","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveMemberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveMemberships"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.getSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups:lookup","path_regex":"^(?:/v1/groups:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups:search","path_regex":"^(?:/v1/groups:search)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.search"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles","path_regex":"^(?:/v1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSsoAssignments","path_regex":"^(?:/v1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/customers/{customersId}/userinvitations","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}:isInvitableUser","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::isInvitableUser)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.isInvitableUser"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices","path_regex":"^(?:/v1beta1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers:lookup","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups","path_regex":"^(?:/v1beta1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:checkTransitiveMembership","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:checkTransitiveMembership)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.checkTransitiveMembership"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:getMembershipGraph","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:getMembershipGraph)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.getMembershipGraph"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:lookup","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:searchDirectGroups","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchDirectGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchDirectGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:searchTransitiveGroups","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:searchTransitiveMemberships","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveMemberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveMemberships"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.getSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups:lookup","path_regex":"^(?:/v1beta1/groups:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups:search","path_regex":"^(?:/v1beta1/groups:search)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.search"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSsoAssignments","path_regex":"^(?:/v1beta1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1beta1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/orgUnits/{orgUnitsId}/memberships","path_regex":"^(?:/v1beta1/orgUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.orgUnits.memberships.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/groups/{groupsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.updateSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/groups/{groupsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.updateSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1beta1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}:cancel","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.cancel"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}:send","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::send)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.send"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices","path_regex":"^(?:/v1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:approve","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.approve"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:block","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::block)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.block"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:cancelWipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:wipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}:cancelWipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}:wipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/groups","path_regex":"^(?:/v1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/groups/{groupsId}/memberships","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/groups/{groupsId}/memberships/{membershipsId}:modifyMembershipRoles","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyMembershipRoles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.modifyMembershipRoles"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/inboundSamlSsoProfiles","path_regex":"^(?:/v1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials:add","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials:add)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.add"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/inboundSsoAssignments","path_regex":"^(?:/v1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}:cancel","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.cancel"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}:send","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::send)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.send"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices","path_regex":"^(?:/v1beta1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:approve","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.approve"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:block","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::block)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.block"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:cancelWipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:wipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}:cancelWipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}:wipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/groups","path_regex":"^(?:/v1beta1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/groups/{groupsId}/memberships","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/groups/{groupsId}/memberships/{membershipsId}:modifyMembershipRoles","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyMembershipRoles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.modifyMembershipRoles"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/inboundSamlSsoProfiles","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials:add","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials:add)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.add"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/inboundSsoAssignments","path_regex":"^(?:/v1beta1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/orgUnits/{orgUnitsId}/memberships/{membershipsId}:move","path_regex":"^(?:/v1beta1/orgUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.orgUnits.memberships.move"},{"hostname":"cloudiot.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.delete"},{"hostname":"cloudiot.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.delete"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.get"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.get"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}/configVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configVersions)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.configVersions.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}/states","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/states)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.states.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}/devices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.devices.list"},{"hostname":"cloudiot.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.patch"},{"hostname":"cloudiot.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.patch"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.create"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.create"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}:modifyCloudToDeviceConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyCloudToDeviceConfig)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.modifyCloudToDeviceConfig"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}:sendCommandToDevice","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sendCommandToDevice)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.sendCommandToDevice"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.getIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.setIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.testIamPermissions"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:bindDeviceToGateway","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bindDeviceToGateway)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.bindDeviceToGateway"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.getIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.setIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.testIamPermissions"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:unbindDeviceFromGateway","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unbindDeviceFromGateway)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.unbindDeviceFromGateway"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.getEkmConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig:getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConfig.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:verifyConnectivity","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verifyConnectivity)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.verifyConnectivity"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}/publicKey","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicKey)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.getPublicKey"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.updateEkmConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.patch"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.patch"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.patch"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig:setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConfig.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig:testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConfig.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:asymmetricDecrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::asymmetricDecrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.asymmetricDecrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:asymmetricSign","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::asymmetricSign)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.asymmetricSign"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:destroy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.destroy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:macSign","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::macSign)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.macSign"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:macVerify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::macVerify)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.macVerify"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.restore"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions:import)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.import"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.decrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::encrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.encrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:updatePrimaryVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updatePrimaryVersion)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.updatePrimaryVersion"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:generateRandomBytes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateRandomBytes)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.generateRandomBytes"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/catalogs:search","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.folders.catalogs.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/products:search","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.folders.products.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/versions:search","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.folders.versions.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/catalogs:search","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.organizations.catalogs.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/products:search","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.organizations.products.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/versions:search","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.organizations.versions.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/catalogs:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.projects.catalogs.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/products:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.projects.products.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/versions:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.projects.versions.search"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}/associations/{associationsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs","path_regex":"^(?:/v1beta1/catalogs)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/associations","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/associations/{associationsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}:getIamPolicy","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.getIamPolicy"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.patch"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.patch"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.patch"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs","path_regex":"^(?:/v1beta1/catalogs)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/associations","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/icons:upload","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/icons:upload)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.icons.upload"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}:copy","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::copy)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.copy"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}:setIamPolicy","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.setIamPolicy"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}:testIamPermissions","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.testIamPermissions"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}:undelete","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.undelete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.cancel"},{"hostname":"cloudprofiler.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/profiles/{profilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.patch"},{"hostname":"cloudprofiler.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/profiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.create"},{"hostname":"cloudprofiler.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/profiles:createOffline","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles:createOffline)$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.createOffline"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/liens/{liensId}","path_regex":"^(?:/v1/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/folders/{foldersId}","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/liens/{liensId}","path_regex":"^(?:/v3/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagBindings/{tagBindingsId}","path_regex":"^(?:/v3/tagBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagBindings.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagKeys/{tagKeysId}","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagValues/{tagValuesId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagValues/{tagValuesId}/tagHolds/{tagHoldsId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagHolds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.tagHolds.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/liens","path_regex":"^(?:/v1/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/liens/{liensId}","path_regex":"^(?:/v1/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/{+name}","path_regex":"^(?:/v1/)((?:(?:[\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e\\x21\\x23\\x24\\x26-\\x2c\\x2f\\x3a\\x3b\\x3d\\x3f\\x40\\x5b\\x5d]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations","path_regex":"^(?:/v1beta1/organizations)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects","path_regex":"^(?:/v1beta1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/effectiveTags","path_regex":"^(?:/v3/effectiveTags)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.effectiveTags.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/folders","path_regex":"^(?:/v3/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/folders/{foldersId}","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/folders:search","path_regex":"^(?:/v3/folders:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/liens","path_regex":"^(?:/v3/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/liens/{liensId}","path_regex":"^(?:/v3/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/operations/{operationsId}","path_regex":"^(?:/v3/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/organizations/{organizationsId}","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/organizations:search","path_regex":"^(?:/v3/organizations:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/projects","path_regex":"^(?:/v3/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/projects:search","path_regex":"^(?:/v3/projects:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagBindings","path_regex":"^(?:/v3/tagBindings)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagBindings.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagKeys","path_regex":"^(?:/v3/tagKeys)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagKeys/namespaced","path_regex":"^(?:/v3/tagKeys/namespaced)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.getNamespaced"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagKeys/{tagKeysId}","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues","path_regex":"^(?:/v3/tagValues)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues/namespaced","path_regex":"^(?:/v3/tagValues/namespaced)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.getNamespaced"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues/{tagValuesId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues/{tagValuesId}/tagHolds","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagHolds)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.tagHolds.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/folders/{foldersId}","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/tagKeys/{tagKeysId}","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/tagValues/{tagValuesId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:clearOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.clearOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:getEffectiveOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectiveOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getEffectiveOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:getOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:listAvailableOrgPolicyConstraints","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAvailableOrgPolicyConstraints)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.listAvailableOrgPolicyConstraints"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:listOrgPolicies","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listOrgPolicies)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.listOrgPolicies"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:setOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/liens","path_regex":"^(?:/v1/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:clearOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.clearOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getEffectiveOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectiveOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getEffectiveOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:listAvailableOrgPolicyConstraints","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAvailableOrgPolicyConstraints)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.listAvailableOrgPolicyConstraints"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:listOrgPolicies","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listOrgPolicies)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.listOrgPolicies"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations:search","path_regex":"^(?:/v1/organizations:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations:search","path_regex":"^(?:/v1/organizations:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:getAncestry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getAncestry)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getAncestry"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:clearOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.clearOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:getEffectiveOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectiveOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getEffectiveOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:getOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:listAvailableOrgPolicyConstraints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAvailableOrgPolicyConstraints)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.listAvailableOrgPolicyConstraints"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:listOrgPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listOrgPolicies)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.listOrgPolicies"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:setOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{resource}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{resource}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{resource}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:getIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:setIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:testIamPermissions","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects","path_regex":"^(?:/v1beta1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:getAncestry","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getAncestry)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getAncestry"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{resource}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{resource}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{resource}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:getIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:getIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:move","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:move","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:setIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:setIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:testIamPermissions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:testIamPermissions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:undelete","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:undelete","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders:search","path_regex":"^(?:/v2/folders:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders:search","path_regex":"^(?:/v2/folders:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders","path_regex":"^(?:/v3/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:getIamPolicy","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:move","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:setIamPolicy","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:testIamPermissions","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:undelete","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/liens","path_regex":"^(?:/v3/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/organizations/{organizationsId}:getIamPolicy","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/organizations/{organizationsId}:setIamPolicy","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/organizations/{organizationsId}:testIamPermissions","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects","path_regex":"^(?:/v3/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:getIamPolicy","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:move","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:setIamPolicy","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:testIamPermissions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:undelete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagBindings","path_regex":"^(?:/v3/tagBindings)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagBindings.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys","path_regex":"^(?:/v3/tagKeys)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys/{tagKeysId}:getIamPolicy","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys/{tagKeysId}:setIamPolicy","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys/{tagKeysId}:testIamPermissions","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues","path_regex":"^(?:/v3/tagValues)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}/tagHolds","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagHolds)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.tagHolds.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}:getIamPolicy","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}:setIamPolicy","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}:testIamPermissions","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.update"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PUT","path_template":"/v1beta1/organizations/{organizationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.update"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.update"},{"hostname":"cloudscheduler.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.delete"},{"hostname":"cloudscheduler.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.delete"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.patch"},{"hostname":"cloudscheduler.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.patch"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.create"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.pause"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.resume"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.run"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.create"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:pause","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.pause"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.resume"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:run","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.run"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.delete"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/indexing/datasources/{datasourcesId}/schema","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schema)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.deleteSchema"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.delete"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.delete"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/debug/datasources/{datasourcesId}/items/{itemsId}/unmappedids","path_regex":"^(?:/v1/debug/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unmappedids)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.datasources.items.unmappedids.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/debug/identitysources/{identitysourcesId}/items:forunmappedidentity","path_regex":"^(?:/v1/debug/identitysources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:forunmappedidentity)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.identitysources.items.listForunmappedidentity"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/debug/identitysources/{identitysourcesId}/unmappedids","path_regex":"^(?:/v1/debug/identitysources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unmappedids)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.identitysources.unmappedids.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/indexing/datasources/{datasourcesId}/items","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/indexing/datasources/{datasourcesId}/schema","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schema)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.getSchema"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.operations.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}/lro","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lro)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.operations.lro.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/query/sources","path_regex":"^(?:/v1/query/sources)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.sources.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/customer","path_regex":"^(?:/v1/settings/customer)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.getCustomer"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/datasources","path_regex":"^(?:/v1/settings/datasources)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/searchapplications","path_regex":"^(?:/v1/settings/searchapplications)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/index","path_regex":"^(?:/v1/stats/index)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getIndex"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/index/datasources/{datasourcesId}","path_regex":"^(?:/v1/stats/index/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.index.datasources.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/query","path_regex":"^(?:/v1/stats/query)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getQuery"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/query/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/stats/query/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.query.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/searchapplication","path_regex":"^(?:/v1/stats/searchapplication)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getSearchapplication"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/session","path_regex":"^(?:/v1/stats/session)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getSession"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/session/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/stats/session/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.session.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/user","path_regex":"^(?:/v1/stats/user)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getUser"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/user/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/stats/user/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.user.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"PATCH","path_template":"/v1/settings/customer","path_regex":"^(?:/v1/settings/customer)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.updateCustomer"},{"hostname":"cloudsearch.googleapis.com","http_method":"PATCH","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.patch"},{"hostname":"cloudsearch.googleapis.com","http_method":"PATCH","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.patch"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/debug/datasources/{datasourcesId}/items/{itemsId}:checkAccess","path_regex":"^(?:/v1/debug/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkAccess)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.datasources.items.checkAccess"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/debug/datasources/{datasourcesId}/items:searchByViewUrl","path_regex":"^(?:/v1/debug/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:searchByViewUrl)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.datasources.items.searchByViewUrl"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}:index","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::index)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.index"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}:push","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::push)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.push"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}:upload","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upload)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.upload"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items:deleteQueueItems","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:deleteQueueItems)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.deleteQueueItems"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items:poll","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:poll)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.poll"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items:unreserve","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:unreserve)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.unreserve"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.media.upload"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/query/search","path_regex":"^(?:/v1/query/search)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.search"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/query/suggest","path_regex":"^(?:/v1/query/suggest)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.suggest"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/settings/datasources","path_regex":"^(?:/v1/settings/datasources)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.create"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/settings/searchapplications","path_regex":"^(?:/v1/settings/searchapplications)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.create"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/settings/searchapplications/{searchapplicationsId}:reset","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.reset"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1:initializeCustomer","path_regex":"^(?:/v1:initializeCustomer)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.initializeCustomer"},{"hostname":"cloudsearch.googleapis.com","http_method":"PUT","path_template":"/v1/indexing/datasources/{datasourcesId}/schema","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schema)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.updateSchema"},{"hostname":"cloudsearch.googleapis.com","http_method":"PUT","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.update"},{"hostname":"cloudsearch.googleapis.com","http_method":"PUT","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.update"},{"hostname":"cloudshell.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.delete"},{"hostname":"cloudshell.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}/publicKeys/{publicKeysId}","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.publicKeys.delete"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.list"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.get"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/environments/{environmentsId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.get"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.get"},{"hostname":"cloudshell.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.patch"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.cancel"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:addPublicKey","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addPublicKey)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.addPublicKey"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:authorize","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::authorize)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.authorize"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:removePublicKey","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removePublicKey)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.removePublicKey"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:start","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.start"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}/publicKeys","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicKeys)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.publicKeys.create"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}:authorize","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::authorize)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.authorize"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}:start","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.start"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/caseClassifications:search","path_regex":"^(?:/v2beta/caseClassifications:search)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.caseClassifications.search"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/cases:search","path_regex":"^(?:/v2beta/cases:search)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.search"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.get"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/attachments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.attachments.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/attachments/{attachmentsId}:download","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.media.download"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/comments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.comments.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"PATCH","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.patch"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.create"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/attachments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.media.upload"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/comments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.comments.create"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}:close","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.close"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}:escalate","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::escalate)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.escalate"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.patch"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.patch"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.patch"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/api/queue/update","path_regex":"^(?:/api/queue/update)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.api.queue.update"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:run","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.run"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.getIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:pause","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.pause"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:purge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::purge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.purge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:resume","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.resume"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.setIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.testIamPermissions"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{taskId}:buffer","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::buffer)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.buffer"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:acknowledge","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.acknowledge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:cancelLease","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelLease)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.cancelLease"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:renewLease","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renewLease)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.renewLease"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:run","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.run"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks:lease","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks:lease)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.lease"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:getIamPolicy","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.getIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:pause","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.pause"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:purge","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::purge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.purge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:resume","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.resume"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:setIamPolicy","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.setIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:testIamPermissions","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.testIamPermissions"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{taskId}:buffer","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::buffer)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.buffer"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:run","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.run"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:getIamPolicy","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.getIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:pause","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.pause"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:purge","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::purge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.purge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:resume","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.resume"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:setIamPolicy","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.setIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:testIamPermissions","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.testIamPermissions"},{"hostname":"cloudtrace.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/traceSinks/{traceSinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.delete"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/traces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.list"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/traces/{traceId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.get"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/traceSinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.list"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/traceSinks/{traceSinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.get"},{"hostname":"cloudtrace.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/traces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.patchTraces"},{"hostname":"cloudtrace.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/traceSinks/{traceSinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.patch"},{"hostname":"cloudtrace.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/traces/{tracesId}/spans/{spansId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.spans.createSpan"},{"hostname":"cloudtrace.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/traces:batchWrite","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces:batchWrite)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.batchWrite"},{"hostname":"cloudtrace.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/traceSinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.create"},{"hostname":"commentanalyzer.googleapis.com","http_method":"POST","path_template":"/v1alpha1/comments:analyze","path_regex":"^(?:/v1alpha1/comments:analyze)$","service_name":"google.commentanalyzer","resource_name":"commentanalyzer.comments.analyze"},{"hostname":"commentanalyzer.googleapis.com","http_method":"POST","path_template":"/v1alpha1/comments:suggestscore","path_regex":"^(?:/v1alpha1/comments:suggestscore)$","service_name":"google.commentanalyzer","resource_name":"commentanalyzer.comments.suggestscore"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.delete"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageVersions)$","service_name":"google.composer","resource_name":"composer.projects.locations.imageVersions.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/imageVersions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageVersions)$","service_name":"google.composer","resource_name":"composer.projects.locations.imageVersions.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.get"},{"hostname":"composer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.patch"},{"hostname":"composer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.patch"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:loadSnapshot","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::loadSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.loadSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:saveSnapshot","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::saveSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.saveSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:checkUpgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkUpgrade)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.checkUpgrade"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:loadSnapshot","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::loadSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.loadSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:restartWebServer","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restartWebServer)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.restartWebServer"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:saveSnapshot","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::saveSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.saveSnapshot"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/locations/global/operations/{operation}","path_regex":"^(?:/compute/alpha/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources/{queuedResource}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/locations/global/operations/{operation}","path_regex":"^(?:/compute/beta/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/locations/global/operations/{operation}","path_regex":"^(?:/compute/v1/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.delete"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/listAssociations","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/operations","path_regex":"^(?:/compute/alpha/locations/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/operations/{operation}","path_regex":"^(?:/compute/alpha/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/listAssociations","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.projects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/acceleratorTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/commitments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/diskTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/disks)$","service_name":"google.compute","resource_name":"compute.disks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/futureReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/healthCheckServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instances)$","service_name":"google.compute","resource_name":"compute.instances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/interconnectAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/machineTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/networkAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/networkEdgeSecurityServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/nodeGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/nodeTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/nodeTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/notificationEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/packetMirrorings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/queuedResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/queuedResources)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/reservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/resourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/routers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/routers)$","service_name":"google.compute","resource_name":"compute.routers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/serviceAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/storagePools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/subnetworks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/subnetworks/listUsable","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks/listUsable)$","service_name":"google.compute","resource_name":"compute.subnetworks.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/vpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/vpnTunnels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/getXpnHost","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.getXpnHost"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/getXpnResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnResources)$","service_name":"google.compute","resource_name":"compute.projects.getXpnResources"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/addresses/getOwnerInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/getOwnerInstance)$","service_name":"google.compute","resource_name":"compute.globalAddresses.getOwnerInstance"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images/family/{family}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/family/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.getFromFamily"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectLocations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectLocations/{interconnectLocation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectRemoteLocations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations)$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectRemoteLocations/{interconnectRemoteLocation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}/getDiagnostics","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiagnostics)$","service_name":"google.compute","resource_name":"compute.interconnects.getDiagnostics"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}/getMacsecConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getMacsecConfig)$","service_name":"google.compute","resource_name":"compute.interconnects.getMacsecConfig"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnects.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{licenseCode}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenseCodes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenseCodes.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenses/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/machineImages","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/machineImages/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/getEffectiveFirewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.networks.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/listIpAddresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listIpAddresses)$","service_name":"google.compute","resource_name":"compute.networks.listIpAddresses"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/listIpOwners","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listIpOwners)$","service_name":"google.compute","resource_name":"compute.networks.listIpOwners"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/listPeeringRoutes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPeeringRoutes)$","service_name":"google.compute","resource_name":"compute.networks.listPeeringRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/routes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/listPreconfiguredExpressionSets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/listPreconfiguredExpressionSets)$","service_name":"google.compute","resource_name":"compute.securityPolicies.listPreconfiguredExpressionSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.sslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.compute","resource_name":"compute.regions.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regions.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/diskTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/diskTypes/{diskType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/getEffectiveFirewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.regionOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getNatMappingInfo","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatMappingInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatMappingInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getRouterStatus","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRouterStatus)$","service_name":"google.compute","resource_name":"compute.routers.getRouterStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}/getStatus","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getStatus)$","service_name":"google.compute","resource_name":"compute.vpnGateways.getStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.zones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zones.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/acceleratorTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/acceleratorTypes/{acceleratorType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/diskTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/diskTypes/{diskType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.diskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/imageFamilyViews/{family}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageFamilyViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.imageFamilyViews.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getEffectiveFirewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.instances.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getGuestAttributes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getGuestAttributes)$","service_name":"google.compute","resource_name":"compute.instances.getGuestAttributes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getShieldedInstanceIdentity","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedInstanceIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedInstanceIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getShieldedVmIdentity","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedVmIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedVmIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/referrers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referrers)$","service_name":"google.compute","resource_name":"compute.instances.listReferrers"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/screenshot","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/screenshot)$","service_name":"google.compute","resource_name":"compute.instances.getScreenshot"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/serialPort","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serialPort)$","service_name":"google.compute","resource_name":"compute.instances.getSerialPortOutput"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/machineTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/machineTypes/{machineType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeTypes/{nodeType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.zoneOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources/{queuedResource}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/listAssociations","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/operations","path_regex":"^(?:/compute/beta/locations/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/operations/{operation}","path_regex":"^(?:/compute/beta/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies","path_regex":"^(?:/compute/beta/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/listAssociations","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/getAssociation","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.projects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/acceleratorTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/commitments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/diskTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/disks)$","service_name":"google.compute","resource_name":"compute.disks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instances)$","service_name":"google.compute","resource_name":"compute.instances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/interconnectAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/machineTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/networkAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/networkEdgeSecurityServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/nodeGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/nodeTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/nodeTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/packetMirrorings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/reservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/resourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/routers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/routers)$","service_name":"google.compute","resource_name":"compute.routers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/serviceAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/subnetworks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/subnetworks/listUsable","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks/listUsable)$","service_name":"google.compute","resource_name":"compute.subnetworks.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/vpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/vpnTunnels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/getXpnHost","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.getXpnHost"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/getXpnResources","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnResources)$","service_name":"google.compute","resource_name":"compute.projects.getXpnResources"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images/family/{family}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/family/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.getFromFamily"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnectLocations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnectLocations/{interconnectLocation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}/getDiagnostics","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiagnostics)$","service_name":"google.compute","resource_name":"compute.interconnects.getDiagnostics"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenseCodes/{licenseCode}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenseCodes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenses/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/machineImages","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/machineImages/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks/{network}/getEffectiveFirewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.networks.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks/{network}/listPeeringRoutes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPeeringRoutes)$","service_name":"google.compute","resource_name":"compute.networks.listPeeringRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/routes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies/listPreconfiguredExpressionSets","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/listPreconfiguredExpressionSets)$","service_name":"google.compute","resource_name":"compute.securityPolicies.listPreconfiguredExpressionSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.sslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.compute","resource_name":"compute.regions.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regions.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/diskTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/diskTypes/{diskType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/getEffectiveFirewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.regionOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/getNatMappingInfo","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatMappingInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatMappingInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/getRouterStatus","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRouterStatus)$","service_name":"google.compute","resource_name":"compute.routers.getRouterStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}/getStatus","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getStatus)$","service_name":"google.compute","resource_name":"compute.vpnGateways.getStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.zones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zones.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/acceleratorTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/acceleratorTypes/{acceleratorType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/diskTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/diskTypes/{diskType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.diskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/imageFamilyViews/{family}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageFamilyViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.imageFamilyViews.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getEffectiveFirewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.instances.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getGuestAttributes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getGuestAttributes)$","service_name":"google.compute","resource_name":"compute.instances.getGuestAttributes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getShieldedInstanceIdentity","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedInstanceIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedInstanceIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getShieldedVmIdentity","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedVmIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedVmIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/referrers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referrers)$","service_name":"google.compute","resource_name":"compute.instances.listReferrers"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/screenshot","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/screenshot)$","service_name":"google.compute","resource_name":"compute.instances.getScreenshot"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/serialPort","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serialPort)$","service_name":"google.compute","resource_name":"compute.instances.getSerialPortOutput"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/machineTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/machineTypes/{machineType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeTypes/{nodeType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.zoneOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/listAssociations","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/operations","path_regex":"^(?:/compute/v1/locations/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/operations/{operation}","path_regex":"^(?:/compute/v1/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.projects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/acceleratorTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/commitments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/diskTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/disks)$","service_name":"google.compute","resource_name":"compute.disks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instances)$","service_name":"google.compute","resource_name":"compute.instances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/interconnectAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/machineTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/networkAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/networkEdgeSecurityServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/nodeGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/nodeTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/nodeTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/packetMirrorings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/reservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/resourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/routers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/routers)$","service_name":"google.compute","resource_name":"compute.routers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/serviceAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/subnetworks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/subnetworks/listUsable","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks/listUsable)$","service_name":"google.compute","resource_name":"compute.subnetworks.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/vpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/vpnTunnels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/getXpnHost","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.getXpnHost"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/getXpnResources","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnResources)$","service_name":"google.compute","resource_name":"compute.projects.getXpnResources"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images/family/{family}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/family/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.getFromFamily"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnectLocations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnectLocations/{interconnectLocation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}/getDiagnostics","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiagnostics)$","service_name":"google.compute","resource_name":"compute.interconnects.getDiagnostics"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenseCodes/{licenseCode}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenseCodes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenses/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/machineImages","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/machineImages/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks/{network}/getEffectiveFirewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.networks.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks/{network}/listPeeringRoutes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPeeringRoutes)$","service_name":"google.compute","resource_name":"compute.networks.listPeeringRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/routes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies/listPreconfiguredExpressionSets","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/listPreconfiguredExpressionSets)$","service_name":"google.compute","resource_name":"compute.securityPolicies.listPreconfiguredExpressionSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.sslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.compute","resource_name":"compute.regions.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regions.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/diskTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/diskTypes/{diskType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/getEffectiveFirewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.regionOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/getNatMappingInfo","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatMappingInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatMappingInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/getRouterStatus","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRouterStatus)$","service_name":"google.compute","resource_name":"compute.routers.getRouterStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}/getStatus","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getStatus)$","service_name":"google.compute","resource_name":"compute.vpnGateways.getStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.zones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zones.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/acceleratorTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/acceleratorTypes/{acceleratorType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/diskTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/diskTypes/{diskType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.diskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/imageFamilyViews/{family}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageFamilyViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.imageFamilyViews.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/getEffectiveFirewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.instances.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/getGuestAttributes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getGuestAttributes)$","service_name":"google.compute","resource_name":"compute.instances.getGuestAttributes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/getShieldedInstanceIdentity","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedInstanceIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedInstanceIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/referrers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referrers)$","service_name":"google.compute","resource_name":"compute.instances.listReferrers"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/screenshot","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/screenshot)$","service_name":"google.compute","resource_name":"compute.instances.getScreenshot"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/serialPort","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serialPort)$","service_name":"google.compute","resource_name":"compute.instances.getSerialPortOutput"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/machineTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/machineTypes/{machineType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeTypes/{nodeType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.zoneOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.get"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/updatePeering","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePeering)$","service_name":"google.compute","resource_name":"compute.networks.updatePeering"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setShieldedInstanceIntegrityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedInstanceIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedInstanceIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setShieldedVmIntegrityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedVmIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedVmIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateDisplayDevice","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateDisplayDevice)$","service_name":"google.compute","resource_name":"compute.instances.updateDisplayDevice"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateNetworkInterface","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.updateNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedInstanceConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedInstanceConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedInstanceConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedVmConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedVmConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedVmConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/networks/{network}/updatePeering","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePeering)$","service_name":"google.compute","resource_name":"compute.networks.updatePeering"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setShieldedInstanceIntegrityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedInstanceIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedInstanceIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setShieldedVmIntegrityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedVmIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedVmIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateDisplayDevice","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateDisplayDevice)$","service_name":"google.compute","resource_name":"compute.instances.updateDisplayDevice"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateNetworkInterface","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.updateNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedInstanceConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedInstanceConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedInstanceConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedVmConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedVmConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedVmConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/networks/{network}/updatePeering","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePeering)$","service_name":"google.compute","resource_name":"compute.networks.updatePeering"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setShieldedInstanceIntegrityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedInstanceIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedInstanceIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateDisplayDevice","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateDisplayDevice)$","service_name":"google.compute","resource_name":"compute.instances.updateDisplayDevice"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateNetworkInterface","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.updateNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedInstanceConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedInstanceConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedInstanceConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.update"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/move","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/copyRules","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyRules)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.copyRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/move","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/disableXpnHost","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/disableXpnResource","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/enableXpnHost","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/enableXpnResource","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses/{address}/move","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.globalAddresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalAddresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalAddresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}/addSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}/deleteSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendBuckets.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/addSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/deleteSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.backendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewalls/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewalls.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.healthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{image}/deprecate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deprecate)$","service_name":"google.compute","resource_name":"compute.images.deprecate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.images.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.images.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnectLocations/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnectRemoteLocations/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnects.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnects.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnects.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenseCodes.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenseCodes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenses/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenses/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/machineImages","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/machineImages/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/machineImages/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.machineImages.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/addPeering","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPeering)$","service_name":"google.compute","resource_name":"compute.networks.addPeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/removePeering","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePeering)$","service_name":"google.compute","resource_name":"compute.networks.removePeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/switchToCustomMode","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchToCustomMode)$","service_name":"google.compute","resource_name":"compute.networks.switchToCustomMode"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/operations/{operation}/wait","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.globalOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/announce","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/withdraw","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/routes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/routes/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.securityPolicies.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.securityPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.snapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.snapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setCertificateMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setQuicOverride)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setQuicOverride"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setSslPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setBackendService","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setCertificateMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.urlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.urlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.urlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/listXpnHosts","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listXpnHosts)$","service_name":"google.compute","resource_name":"compute.projects.listXpnHosts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/moveDisk","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveDisk)$","service_name":"google.compute","resource_name":"compute.projects.moveDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/moveInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveInstance)$","service_name":"google.compute","resource_name":"compute.projects.moveInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{address}/move","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.addresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.addresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.addresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}/updateReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateReservations)$","service_name":"google.compute","resource_name":"compute.regionCommitments.updateReservations"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionCommitments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionDisks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.regionDisks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionDisks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionDisks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionDisks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.forwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resumeInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resumeInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resumeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/startInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.startInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/stopInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.stopInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/suspendInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspendInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.suspendInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instances/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionInstances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}/export","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.export"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations/{operation}/wait","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.regionOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/announce","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/withdraw","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/preview","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preview)$","service_name":"google.compute","resource_name":"compute.routers.preview"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.subnetworks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandIpCidrRange)$","service_name":"google.compute","resource_name":"compute.subnetworks.expandIpCidrRange"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPrivateIpGoogleAccess)$","service_name":"google.compute","resource_name":"compute.subnetworks.setPrivateIpGoogleAccess"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetPools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.addHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/addInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.addInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/getHealth","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.targetPools.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.removeHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/removeInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.removeInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/setBackup","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackup)$","service_name":"google.compute","resource_name":"compute.targetPools.setBackup"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetPools.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setCommonInstanceMetadata","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCommonInstanceMetadata)$","service_name":"google.compute","resource_name":"compute.projects.setCommonInstanceMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setDefaultNetworkTier","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultNetworkTier)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultNetworkTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setDefaultServiceAccount","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultServiceAccount)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setUsageExportBucket","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUsageExportBucket)$","service_name":"google.compute","resource_name":"compute.projects.setUsageExportBucket"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.autoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.disks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.disks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.disks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.disks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.disks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.futureReservations.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resumeInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resumeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resumeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/startInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.startInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/stopInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.stopInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/suspendInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspendInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.suspendInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.addInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.removeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.instanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.instances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/addAccessConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.addAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/attachDisk","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachDisk)$","service_name":"google.compute","resource_name":"compute.instances.attachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.deleteAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/detachDisk","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachDisk)$","service_name":"google.compute","resource_name":"compute.instances.detachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/performMaintenance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.instances.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/removeResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/reset","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.compute","resource_name":"compute.instances.reset"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/resume","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.compute","resource_name":"compute.instances.resume"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/sendDiagnosticInterrupt","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendDiagnosticInterrupt)$","service_name":"google.compute","resource_name":"compute.instances.sendDiagnosticInterrupt"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDiskAutoDelete)$","service_name":"google.compute","resource_name":"compute.instances.setDiskAutoDelete"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instances.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMachineResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineResources)$","service_name":"google.compute","resource_name":"compute.instances.setMachineResources"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMachineType","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineType)$","service_name":"google.compute","resource_name":"compute.instances.setMachineType"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMetadata","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMetadata)$","service_name":"google.compute","resource_name":"compute.instances.setMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMinCpuPlatform)$","service_name":"google.compute","resource_name":"compute.instances.setMinCpuPlatform"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setName","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setName)$","service_name":"google.compute","resource_name":"compute.instances.setName"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setScheduling","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setScheduling)$","service_name":"google.compute","resource_name":"compute.instances.setScheduling"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setServiceAccount","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setServiceAccount)$","service_name":"google.compute","resource_name":"compute.instances.setServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setTags","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTags)$","service_name":"google.compute","resource_name":"compute.instances.setTags"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/simulateMaintenanceEvent","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.instances.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/start","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.compute","resource_name":"compute.instances.start"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startWithEncryptionKey)$","service_name":"google.compute","resource_name":"compute.instances.startWithEncryptionKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/stop","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.compute","resource_name":"compute.instances.stop"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/suspend","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.compute","resource_name":"compute.instances.suspend"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateAccessConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/setDeletionProtection","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDeletionProtection)$","service_name":"google.compute","resource_name":"compute.instances.setDeletionProtection"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}/export","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.export"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/addNodes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.addNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/deleteNodes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.deleteNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/listNodes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.listNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/performMaintenance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.nodeGroups.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/setNodeTemplate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNodeTemplate)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setNodeTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/simulateMaintenanceEvent","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.nodeGroups.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations/{operation}/wait","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.zoneOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources/{queuedResource}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.reservations.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.reservations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.storagePools.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.storagePools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetInstances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{targetInstance}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetInstances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/move","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies","path_regex":"^(?:/compute/beta/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/addAssociation","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/copyRules","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyRules)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.copyRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/move","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/disableXpnHost","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/disableXpnResource","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/enableXpnHost","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/enableXpnResource","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses/{address}/move","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.globalAddresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalAddresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalAddresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}/addSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}/deleteSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendBuckets.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/addSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/deleteSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.backendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewalls/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewalls.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.healthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{image}/deprecate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deprecate)$","service_name":"google.compute","resource_name":"compute.images.deprecate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.images.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.images.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/interconnects","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/interconnects/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnects.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/interconnects/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnects.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenseCodes/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenseCodes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenses/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenses/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/machineImages","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/machineImages/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/machineImages/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.machineImages.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{network}/addPeering","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPeering)$","service_name":"google.compute","resource_name":"compute.networks.addPeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{network}/removePeering","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePeering)$","service_name":"google.compute","resource_name":"compute.networks.removePeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{network}/switchToCustomMode","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchToCustomMode)$","service_name":"google.compute","resource_name":"compute.networks.switchToCustomMode"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/operations/{operation}/wait","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.globalOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/routes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/routes/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.securityPolicies.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.securityPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.snapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.snapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setCertificateMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setQuicOverride)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setQuicOverride"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setSslPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setBackendService","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setCertificateMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.urlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.urlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.urlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/listXpnHosts","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listXpnHosts)$","service_name":"google.compute","resource_name":"compute.projects.listXpnHosts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/moveDisk","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveDisk)$","service_name":"google.compute","resource_name":"compute.projects.moveDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/moveInstance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveInstance)$","service_name":"google.compute","resource_name":"compute.projects.moveInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{address}/move","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.addresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.addresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.addresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{commitment}/updateReservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateReservations)$","service_name":"google.compute","resource_name":"compute.regionCommitments.updateReservations"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionCommitments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionDisks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.regionDisks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionDisks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionDisks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionDisks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.forwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instances/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionInstances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/operations/{operation}/wait","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.regionOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/preview","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preview)$","service_name":"google.compute","resource_name":"compute.routers.preview"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.subnetworks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandIpCidrRange)$","service_name":"google.compute","resource_name":"compute.subnetworks.expandIpCidrRange"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPrivateIpGoogleAccess)$","service_name":"google.compute","resource_name":"compute.subnetworks.setPrivateIpGoogleAccess"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetPools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.addHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/addInstance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.addInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/getHealth","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.targetPools.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.removeHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/removeInstance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.removeInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/setBackup","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackup)$","service_name":"google.compute","resource_name":"compute.targetPools.setBackup"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setCommonInstanceMetadata","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCommonInstanceMetadata)$","service_name":"google.compute","resource_name":"compute.projects.setCommonInstanceMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setDefaultNetworkTier","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultNetworkTier)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultNetworkTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setUsageExportBucket","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUsageExportBucket)$","service_name":"google.compute","resource_name":"compute.projects.setUsageExportBucket"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.autoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.disks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.disks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.disks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.disks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.disks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.addInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.removeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.instanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.instances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/addAccessConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.addAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/attachDisk","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachDisk)$","service_name":"google.compute","resource_name":"compute.instances.attachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.deleteAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/detachDisk","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachDisk)$","service_name":"google.compute","resource_name":"compute.instances.detachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/removeResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/reset","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.compute","resource_name":"compute.instances.reset"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/resume","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.compute","resource_name":"compute.instances.resume"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/sendDiagnosticInterrupt","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendDiagnosticInterrupt)$","service_name":"google.compute","resource_name":"compute.instances.sendDiagnosticInterrupt"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDiskAutoDelete)$","service_name":"google.compute","resource_name":"compute.instances.setDiskAutoDelete"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instances.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMachineResources","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineResources)$","service_name":"google.compute","resource_name":"compute.instances.setMachineResources"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMachineType","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineType)$","service_name":"google.compute","resource_name":"compute.instances.setMachineType"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMetadata","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMetadata)$","service_name":"google.compute","resource_name":"compute.instances.setMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMinCpuPlatform)$","service_name":"google.compute","resource_name":"compute.instances.setMinCpuPlatform"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setName","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setName)$","service_name":"google.compute","resource_name":"compute.instances.setName"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setScheduling","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setScheduling)$","service_name":"google.compute","resource_name":"compute.instances.setScheduling"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setServiceAccount","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setServiceAccount)$","service_name":"google.compute","resource_name":"compute.instances.setServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setTags","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTags)$","service_name":"google.compute","resource_name":"compute.instances.setTags"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/simulateMaintenanceEvent","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.instances.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/start","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.compute","resource_name":"compute.instances.start"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startWithEncryptionKey)$","service_name":"google.compute","resource_name":"compute.instances.startWithEncryptionKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/stop","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.compute","resource_name":"compute.instances.stop"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/suspend","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.compute","resource_name":"compute.instances.suspend"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateAccessConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/setDeletionProtection","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDeletionProtection)$","service_name":"google.compute","resource_name":"compute.instances.setDeletionProtection"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/addNodes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.addNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/deleteNodes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.deleteNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/listNodes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.listNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/setNodeTemplate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNodeTemplate)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setNodeTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/simulateMaintenanceEvent","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.nodeGroups.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations/{operation}/wait","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.zoneOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.reservations.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.reservations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetInstances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/move","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/disableXpnHost","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/disableXpnResource","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/enableXpnHost","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/enableXpnResource","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/addresses/{address}/move","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.globalAddresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/addresses/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalAddresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}/addSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}/deleteSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/addSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/deleteSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.backendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{image}/deprecate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deprecate)$","service_name":"google.compute","resource_name":"compute.images.deprecate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.images.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.images.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/interconnects","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/interconnects/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnects.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenseCodes/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenseCodes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenses/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenses/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/machineImages","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/machineImages/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/machineImages/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.machineImages.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks/{network}/addPeering","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPeering)$","service_name":"google.compute","resource_name":"compute.networks.addPeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks/{network}/removePeering","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePeering)$","service_name":"google.compute","resource_name":"compute.networks.removePeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks/{network}/switchToCustomMode","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchToCustomMode)$","service_name":"google.compute","resource_name":"compute.networks.switchToCustomMode"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/operations/{operation}/wait","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.globalOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/routes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.securityPolicies.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.snapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.snapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setCertificateMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setQuicOverride)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setQuicOverride"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setSslPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setBackendService","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setCertificateMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.urlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.urlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/listXpnHosts","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listXpnHosts)$","service_name":"google.compute","resource_name":"compute.projects.listXpnHosts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/moveDisk","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveDisk)$","service_name":"google.compute","resource_name":"compute.projects.moveDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/moveInstance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveInstance)$","service_name":"google.compute","resource_name":"compute.projects.moveInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{address}/move","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.addresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.addresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.regionDisks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionDisks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionDisks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionDisks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instances/bulkInsert","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionInstances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/operations/{operation}/wait","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.regionOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/preview","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preview)$","service_name":"google.compute","resource_name":"compute.routers.preview"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.subnetworks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandIpCidrRange)$","service_name":"google.compute","resource_name":"compute.subnetworks.expandIpCidrRange"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPrivateIpGoogleAccess)$","service_name":"google.compute","resource_name":"compute.subnetworks.setPrivateIpGoogleAccess"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.addHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/addInstance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.addInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/getHealth","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.targetPools.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.removeHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/removeInstance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.removeInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/setBackup","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackup)$","service_name":"google.compute","resource_name":"compute.targetPools.setBackup"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setCommonInstanceMetadata","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCommonInstanceMetadata)$","service_name":"google.compute","resource_name":"compute.projects.setCommonInstanceMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setDefaultNetworkTier","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultNetworkTier)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultNetworkTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setUsageExportBucket","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUsageExportBucket)$","service_name":"google.compute","resource_name":"compute.projects.setUsageExportBucket"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.disks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.disks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.disks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.disks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.addInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.removeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.instanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/bulkInsert","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.instances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addAccessConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.addAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/attachDisk","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachDisk)$","service_name":"google.compute","resource_name":"compute.instances.attachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.deleteAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/detachDisk","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachDisk)$","service_name":"google.compute","resource_name":"compute.instances.detachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/removeResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/reset","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.compute","resource_name":"compute.instances.reset"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/resume","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.compute","resource_name":"compute.instances.resume"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/sendDiagnosticInterrupt","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendDiagnosticInterrupt)$","service_name":"google.compute","resource_name":"compute.instances.sendDiagnosticInterrupt"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDiskAutoDelete)$","service_name":"google.compute","resource_name":"compute.instances.setDiskAutoDelete"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instances.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMachineResources","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineResources)$","service_name":"google.compute","resource_name":"compute.instances.setMachineResources"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMachineType","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineType)$","service_name":"google.compute","resource_name":"compute.instances.setMachineType"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMetadata","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMetadata)$","service_name":"google.compute","resource_name":"compute.instances.setMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMinCpuPlatform)$","service_name":"google.compute","resource_name":"compute.instances.setMinCpuPlatform"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setName","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setName)$","service_name":"google.compute","resource_name":"compute.instances.setName"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setScheduling","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setScheduling)$","service_name":"google.compute","resource_name":"compute.instances.setScheduling"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setServiceAccount","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setServiceAccount)$","service_name":"google.compute","resource_name":"compute.instances.setServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setTags","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTags)$","service_name":"google.compute","resource_name":"compute.instances.setTags"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/simulateMaintenanceEvent","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.instances.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/start","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.compute","resource_name":"compute.instances.start"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startWithEncryptionKey)$","service_name":"google.compute","resource_name":"compute.instances.startWithEncryptionKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/stop","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.compute","resource_name":"compute.instances.stop"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/suspend","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.compute","resource_name":"compute.instances.suspend"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateAccessConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/setDeletionProtection","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDeletionProtection)$","service_name":"google.compute","resource_name":"compute.instances.setDeletionProtection"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/addNodes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.addNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/deleteNodes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.deleteNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/listNodes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.listNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/setNodeTemplate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNodeTemplate)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setNodeTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/simulateMaintenanceEvent","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.nodeGroups.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations/{operation}/wait","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.zoneOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.reservations.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.reservations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.insert"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.update"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities/{entitiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.delete"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/settings)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.getSettings"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.getConnectionSchemaMetadata"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeActionSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeActionSchemas)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.runtimeActionSchemas.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeEntitySchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeEntitySchemas)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.runtimeEntitySchemas.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.getIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.versions.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.versions.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.getIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimeConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeConfig)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.getRuntimeConfig"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/actions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.actions.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities/{entitiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.get"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.patch"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities/{entitiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.patch"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata:refresh","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata:refresh)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.connectionSchemaMetadata.refresh"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.setIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.testIamPermissions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.cancel"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.setIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.testIamPermissions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/actions/{actionsId}:execute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.actions.execute"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities:deleteEntitiesWithConditions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:deleteEntitiesWithConditions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.deleteEntitiesWithConditions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities:updateEntitiesWithConditions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:updateEntitiesWithConditions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.updateEntitiesWithConditions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:executeSqlQuery","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeSqlQuery)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.executeSqlQuery"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters/{contactCentersId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.delete"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.delete"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.list"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.get"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.list"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters/{contactCentersId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.get"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.list"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.get"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}:queryContactCenterQuota","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryContactCenterQuota)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.queryContactCenterQuota"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters/{contactCentersId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.patch"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.create"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.cancel"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses/{analysesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues/{issuesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers/{phraseMatchersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views/{viewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses/{analysesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:calculateStats","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:calculateStats)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.calculateStats"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues/{issuesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:calculateIssueModelStats","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::calculateIssueModelStats)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.calculateIssueModelStats"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.operations.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.operations.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers/{phraseMatchersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.getSettings"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views/{viewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues/{issuesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers/{phraseMatchersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.updateSettings"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views/{viewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:bulkAnalyze","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:bulkAnalyze)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.bulkAnalyze"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:ingest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:ingest)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.ingest"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:upload)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.upload"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightsdata:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightsdata:export)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.insightsdata.export"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:deploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.deploy"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:undeploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.undeploy"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.operations.cancel"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.create"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.zones.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/operations/{operationId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/serverconfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverconfig)$","service_name":"google.container","resource_name":"container.projects.zones.getServerconfig"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/aggregated/usableSubnetworks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/usableSubnetworks)$","service_name":"google.container","resource_name":"container.projects.aggregated.usableSubnetworks.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/.well-known/openid-configuration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\.well-known/openid-configuration)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.well-known.getOpenid-configuration"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/jwks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jwks)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.getJwks"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.locations.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverConfig)$","service_name":"google.container","resource_name":"container.projects.locations.getServerConfig"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.zones.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/operations/{operationId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/serverconfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverconfig)$","service_name":"google.container","resource_name":"container.projects.zones.getServerconfig"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/aggregated/usableSubnetworks","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/usableSubnetworks)$","service_name":"google.container","resource_name":"container.projects.aggregated.usableSubnetworks.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.container","resource_name":"container.projects.locations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/.well-known/openid-configuration","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\.well-known/openid-configuration)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.well-known.getOpenid-configuration"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/jwks","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jwks)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.getJwks"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.locations.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverConfig)$","service_name":"google.container","resource_name":"container.projects.locations.getServerConfig"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addons)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.addons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/legacyAbac)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.legacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.locations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logging)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.logging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/master)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.master"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoring)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.monitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscaling)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.autoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setManagement)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSize)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/update)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.update"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceLabels)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.resourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMaintenancePolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.zones.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:completeUpgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeUpgrade)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.completeUpgrade"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setAutoscaling","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAutoscaling)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setAutoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setManagement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setManagement)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSize)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:completeIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setAddons","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAddons)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setAddons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLegacyAbac","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLegacyAbac)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLegacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLocations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLocations)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLocations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLogging","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLogging)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLogging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMaintenancePolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMasterAuth","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMonitoring","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMonitoring)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMonitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setNetworkPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setResourceLabels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setResourceLabels)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setResourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:startIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:updateMaster","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateMaster)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.updateMaster"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.locations.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addons)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.addons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/legacyAbac)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.legacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.locations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logging)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.logging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/master)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.master"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoring)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.monitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscaling)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.autoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setManagement)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSize)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/update)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.update"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceLabels)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.resourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMaintenancePolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.zones.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:completeUpgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeUpgrade)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.completeUpgrade"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setAutoscaling","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAutoscaling)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setAutoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setManagement","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setManagement)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setSize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSize)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:completeIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setAddons","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAddons)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setAddons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLegacyAbac","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLegacyAbac)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLegacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLocations)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLocations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLogging","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLogging)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLogging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMaintenancePolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMasterAuth","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMonitoring","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMonitoring)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMonitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setNetworkPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setResourceLabels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setResourceLabels)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setResourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:startIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:updateMaster","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateMaster)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.updateMaster"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.locations.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.update"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/notes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.scanConfigs.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.scanConfigs.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/providers/{providersId}/notes","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.operations.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.scanConfigs.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/resources/{resourcesId}:generatePackagesSummary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePackagesSummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.resources.generatePackagesSummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.operations.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.batchCreate"},{"hostname":"contentwarehouse.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas/{documentSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets/{ruleSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets/{synonymSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.list"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas/{documentSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.operations.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.list"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets/{ruleSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.list"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets/{synonymSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas/{documentSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/referenceId/{referenceIdId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/referenceId/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.referenceId.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets/{ruleSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets/{synonymSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/referenceId/{referenceIdId}:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/referenceId/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delete)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.referenceId.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/referenceId/{referenceIdId}:get","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/referenceId/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::get)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.referenceId.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/documentLinks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentLinks)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.documentLinks.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/documentLinks/{documentLinksId}:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delete)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.documentLinks.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/linkedSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/linkedSources)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.linkedSources"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/linkedTargets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/linkedTargets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.linkedTargets"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delete)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:fetchAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.fetchAcl"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:get","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::get)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:lock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lock)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.lock"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:setAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.setAcl"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:search)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.search"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:initialize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initialize)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.initialize"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:fetchAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.fetchAcl"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:setAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.setAcl"},{"hostname":"customsearch.googleapis.com","http_method":"GET","path_template":"/customsearch/v1","path_regex":"^(?:/customsearch/v1)$","service_name":"google.customsearch","resource_name":"search.cse.list"},{"hostname":"customsearch.googleapis.com","http_method":"GET","path_template":"/customsearch/v1/siterestrict","path_regex":"^(?:/customsearch/v1/siterestrict)$","service_name":"google.customsearch","resource_name":"search.cse.siterestrict.list"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/entries:lookup","path_regex":"^(?:/v1/entries:lookup)$","service_name":"google.datacatalog","resource_name":"datacatalog.entries.lookup"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:export)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.export"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/entries:lookup","path_regex":"^(?:/v1beta1/entries:lookup)$","service_name":"google.datacatalog","resource_name":"datacatalog.entries.lookup"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:export)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.export"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/catalog:search","path_regex":"^(?:/v1/catalog:search)$","service_name":"google.datacatalog","resource_name":"datacatalog.catalog.search"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags:reconcile","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags:reconcile)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.reconcile"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:modifyEntryContacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyEntryContacts)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.modifyEntryContacts"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:modifyEntryOverview","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyEntryOverview)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.modifyEntryOverview"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:star","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::star)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.star"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:unstar","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unstar)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.unstar"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries:import)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.import"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.cancel"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}/enumValues/{enumValuesId}:rename","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enumValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.enumValues.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}:rename","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:replace","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::replace)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.replace"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:import)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.import"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalog:search","path_regex":"^(?:/v1beta1/catalog:search)$","service_name":"google.datacatalog","resource_name":"datacatalog.catalog.search"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}/enumValues/{enumValuesId}:rename","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enumValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.enumValues.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}:rename","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:import)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.import"},{"hostname":"dataflow.googleapis.com","http_method":"DELETE","path_template":"/v1b3/projects/{projectId}/locations/{location}/snapshots/{snapshotId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.snapshots.delete"},{"hostname":"dataflow.googleapis.com","http_method":"DELETE","path_template":"/v1b3/projects/{projectId}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.deleteSnapshots"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/messages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.messages.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/metrics","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.getMetrics"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs:aggregated","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:aggregated)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.aggregated"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/executionDetails","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionDetails)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.getExecutionDetails"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/messages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.messages.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/metrics","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.getMetrics"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.snapshots.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/stages/{stageId}/executionDetails","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionDetails)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.stages.getExecutionDetails"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.snapshots.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/snapshots/{snapshotId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.snapshots.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/templates:get","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:get)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.templates.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.snapshots.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/snapshots/{snapshotId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.snapshots.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/templates:get","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:get)$","service_name":"google.dataflow","resource_name":"dataflow.projects.templates.get"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/WorkerMessages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/WorkerMessages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.workerMessages"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/debug/getConfig","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/getConfig)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.debug.getConfig"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/debug/sendCapture","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/sendCapture)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.debug.sendCapture"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/workItems:lease","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:lease)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.workItems.lease"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/workItems:reportStatus","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:reportStatus)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.workItems.reportStatus"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}:snapshot","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::snapshot)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.snapshot"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/WorkerMessages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/WorkerMessages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.workerMessages"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/flexTemplates:launch","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flexTemplates:launch)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.flexTemplates.launch"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/debug/getConfig","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/getConfig)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.debug.getConfig"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/debug/sendCapture","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/sendCapture)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.debug.sendCapture"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:lease","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:lease)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.workItems.lease"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:reportStatus","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:reportStatus)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.workItems.reportStatus"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}:snapshot","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::snapshot)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.snapshot"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/templates","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.templates.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/templates:launch","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:launch)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.templates.launch"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/templates","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.dataflow","resource_name":"dataflow.projects.templates.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/templates:launch","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:launch)$","service_name":"google.dataflow","resource_name":"dataflow.projects.templates.launch"},{"hostname":"dataflow.googleapis.com","http_method":"PUT","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.update"},{"hostname":"dataflow.googleapis.com","http_method":"PUT","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.update"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs/{releaseConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs/{workflowConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.delete"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults/{compilationResultsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults/{compilationResultsId}:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.query"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs/{releaseConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs/{workflowConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.query"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:fetchFileDiff","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchFileDiff)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.fetchFileDiff"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:fetchFileGitStatuses","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchFileGitStatuses)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.fetchFileGitStatuses"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:fetchGitAheadBehind","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchGitAheadBehind)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.fetchGitAheadBehind"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:queryDirectoryContents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryDirectoryContents)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.queryDirectoryContents"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:readFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.readFile"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:fetchRemoteBranches","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchRemoteBranches)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.fetchRemoteBranches"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.patch"},{"hostname":"dataform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs/{releaseConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.patch"},{"hostname":"dataform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs/{workflowConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.patch"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.cancel"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:commit","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.commit"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:installNpmPackages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::installNpmPackages)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.installNpmPackages"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:makeDirectory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::makeDirectory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.makeDirectory"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:moveDirectory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveDirectory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.moveDirectory"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:moveFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.moveFile"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:pull","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pull)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.pull"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:push","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::push)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.push"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:removeDirectory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeDirectory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.removeDirectory"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:removeFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.removeFile"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:reset","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.reset"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.testIamPermissions"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:writeFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::writeFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.writeFile"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings/{dnsPeeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings/{dnsPeeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.delete"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.getIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.versions.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces/{namespacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.getIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.getIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.versions.list"},{"hostname":"datafusion.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.patch"},{"hostname":"datafusion.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.patch"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.restart"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.setIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.cancel"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces/{namespacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.setIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces/{namespacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restart","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.restart"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.setIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.upgrade"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.cancel"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/{locationsId1}:removeIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.removeIamPolicy"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets/{annotationSpecSetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages/{feedbackMessagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/instructions/{instructionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets/{annotationSpecSetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/dataItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.dataItems.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/dataItems/{dataItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.dataItems.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/examples","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.examples.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/examples/{examplesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.examples.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages/{feedbackMessagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/dataItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.dataItems.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/dataItems/{dataItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.dataItems.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.evaluations.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/evaluations:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations:search)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluations.search"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/instructions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/instructions/{instructionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.cancel"},{"hostname":"datalabeling.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.patch"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/evaluations/{evaluationsId}/exampleComparisons:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleComparisons:search)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.evaluations.exampleComparisons.search"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/image:label","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/image:label)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.image.label"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/text:label","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/text:label)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.text.label"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/video:label","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/video:label)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.video.label"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}:exportData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportData)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.exportData"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}:importData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importData)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.importData"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}:pause","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.pause"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.resume"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/instructions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.create"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.delete"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.delete"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.delete"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents/{lineageEventsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.delete"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.get"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.get"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.get"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents/{lineageEventsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.get"},{"hostname":"datalineage.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.patch"},{"hostname":"datalineage.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.patch"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.cancel"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.create"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.create"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.create"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:batchSearchLinkProcesses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchSearchLinkProcesses)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.batchSearchLinkProcesses"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchLinks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchLinks)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.searchLinks"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.delete"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:describeConversionWorkspaceRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::describeConversionWorkspaceRevisions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.describeConversionWorkspaceRevisions"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:describeDatabaseEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::describeDatabaseEntities)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.describeDatabaseEntities"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:searchBackgroundJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchBackgroundJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.searchBackgroundJobs"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:fetchStaticIps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchStaticIps)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.fetchStaticIps"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.get"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.patch"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}/mappingRules:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mappingRules:import)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.mappingRules.import"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:apply","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::apply)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.apply"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.commit"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:convert","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::convert)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.convert"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.rollback"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:seed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::seed)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.seed"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:generateSshScript","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateSshScript)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.generateSshScript"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:promote","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.promote"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.restart"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.resume"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.start"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.stop"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:verify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.verify"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.cancel"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:generateSshScript","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateSshScript)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.generateSshScript"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:promote","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.promote"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:restart","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.restart"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.resume"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:start","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.start"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:stop","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.stop"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:verify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.verify"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.cancel"},{"hostname":"datapipelines.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.delete"},{"hostname":"datapipelines.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.list"},{"hostname":"datapipelines.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.get"},{"hostname":"datapipelines.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.jobs.list"},{"hostname":"datapipelines.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.patch"},{"hostname":"datapipelines.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.create"},{"hostname":"datapipelines.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.run"},{"hostname":"datapipelines.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.stop"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions/{partitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.delete"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.jobs.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.jobs.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/actions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.actions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.sessions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.jobs.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.jobs.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/actions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.actions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}/actions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.actions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions/{partitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.get"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.patch"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.run"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}/jobs/{jobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.jobs.cancel"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.run"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.cancel"},{"hostname":"dataplex.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.update"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches/{batchesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches/{batchesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups/{nodeGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.patch"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.diagnose"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:repair","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.repair"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.start"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.stop"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/jobs:submit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submit)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submit"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/jobs:submitAsOperation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submitAsOperation)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submitAsOperation"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups/{nodeGroupsId}:resize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resize)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.resize"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:injectCredentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectCredentials)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.injectCredentials"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.diagnose"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}:start","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.start"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}:stop","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.stop"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs:submit","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submit)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submit"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs:submitAsOperation","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submitAsOperation)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submitAsOperation"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:injectCredentials","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectCredentials)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.injectCredentials"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.update"},{"hostname":"datastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/indexes/{indexId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.delete"},{"hostname":"datastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.operations.delete"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.list"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/indexes/{indexId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.get"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datastore","resource_name":"datastore.projects.operations.list"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.operations.get"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.create"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:allocateIds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::allocateIds)$","service_name":"google.datastore","resource_name":"datastore.projects.allocateIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:beginTransaction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::beginTransaction)$","service_name":"google.datastore","resource_name":"datastore.projects.beginTransaction"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.datastore","resource_name":"datastore.projects.commit"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.datastore","resource_name":"datastore.projects.export"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.datastore","resource_name":"datastore.projects.import"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookup)$","service_name":"google.datastore","resource_name":"datastore.projects.lookup"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:reserveIds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reserveIds)$","service_name":"google.datastore","resource_name":"datastore.projects.reserveIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.datastore","resource_name":"datastore.projects.rollback"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:runAggregationQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runAggregationQuery"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:runQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runQuery"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datastore","resource_name":"datastore.projects.operations.cancel"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.datastore","resource_name":"datastore.projects.export"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.datastore","resource_name":"datastore.projects.import"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:allocateIds","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::allocateIds)$","service_name":"google.datastore","resource_name":"datastore.projects.allocateIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:beginTransaction","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::beginTransaction)$","service_name":"google.datastore","resource_name":"datastore.projects.beginTransaction"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:commit","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.datastore","resource_name":"datastore.projects.commit"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:lookup","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookup)$","service_name":"google.datastore","resource_name":"datastore.projects.lookup"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:reserveIds","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reserveIds)$","service_name":"google.datastore","resource_name":"datastore.projects.reserveIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:rollback","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.datastore","resource_name":"datastore.projects.rollback"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:runAggregationQuery","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runAggregationQuery"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:runQuery","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runQuery"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.delete"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:fetchStaticIps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchStaticIps)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.fetchStaticIps"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}:fetchStaticIps","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchStaticIps)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.fetchStaticIps"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.patch"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.patch"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.patch"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.patch"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles:discover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles:discover)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.discover"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.cancel"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:startBackfillJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.startBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:stopBackfillJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.stopBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects:lookup)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.lookup"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles:discover","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles:discover)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.discover"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.cancel"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:startBackfillJob","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.startBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:stopBackfillJob","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.stopBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}:fetchErrors","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchErrors)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.fetchErrors"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/manifests","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/manifests/{manifest}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/resources","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/resources/{resource}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{resource}/getIamPolicy","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.getIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/operations","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/operations/{operation}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}/types","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.listTypes"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}/types/{type}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.getType"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/types","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/types/{type}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/manifests","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/manifests/{manifest}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/resources","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/resources/{resource}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{resource}/getIamPolicy","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.getIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/operations","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/operations/{operation}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/types","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/manifests","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/manifests/{manifest}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/resources","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/resources/{resource}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{resource}/getIamPolicy","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.getIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/operations","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/operations/{operation}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}/types","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.listTypes"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}/types/{type}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.getType"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/types","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/cancelPreview","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelPreview)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.cancelPreview"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/stop","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.stop"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{resource}/setIamPolicy","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.setIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{resource}/testIamPermissions","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.testIamPermissions"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/cancelPreview","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelPreview)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.cancelPreview"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/stop","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.stop"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{resource}/setIamPolicy","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.setIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{resource}/testIamPermissions","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.testIamPermissions"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/cancelPreview","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelPreview)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.cancelPreview"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/stop","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.stop"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{resource}/setIamPolicy","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.setIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{resource}/testIamPermissions","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.testIamPermissions"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.update"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.3/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.4/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.5/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v4/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles","path_regex":"^(?:/dfareporting/v4/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertisers/{advertiserId}/invoices","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserInvoices.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/billingProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/billingProfiles/{billingProfileId}/billingAssignments","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAssignments)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingAssignments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/billingProfiles/{billingProfileId}/billingRates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingRates)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingRates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/billingProfiles/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.billingProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/customEvents/batchinsert","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customEvents/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.customEvents.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/billingProfiles/{billingProfileId}/billingAssignments","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAssignments)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingAssignments.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.5/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/billingProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets/{conversationDatasetsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/validationResult","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/answerRecords","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationDatasets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationDatasets.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationDatasets/{conversationDatasetsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationDatasets.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}/evaluations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.evaluations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.evaluations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/validationResult","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/answerRecords","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets/{conversationDatasetsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}/evaluations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.evaluations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.evaluations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/validationResult","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent:search","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/answerRecords","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/validationResult","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:search","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/answerRecords","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/operations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs/{changelogsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/continuousTestResults","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/continuousTestResults)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.continuousTestResults.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments/{deploymentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:lookupEnvironmentHistory","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEnvironmentHistory)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.lookupEnvironmentHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/validationResult","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results/{resultsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:calculateCoverage","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:calculateCoverage)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.calculateCoverage"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/validationResult","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/operations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/operations","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs/{changelogsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/continuousTestResults","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/continuousTestResults)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.continuousTestResults.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments/{deploymentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:lookupEnvironmentHistory","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEnvironmentHistory)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.lookupEnvironmentHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/validationResult","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results/{resultsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:calculateCoverage","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:calculateCoverage)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.calculateCoverage"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/validationResult","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/operations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/intents:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:restore","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:train","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationDatasets/{conversationDatasetsId}:importConversationData","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importConversationData)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationDatasets.importConversationData"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}:deploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.deploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}:undeploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.undeploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:restore","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:train","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets/{conversationDatasetsId}:importConversationData","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importConversationData)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.importConversationData"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}/evaluations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.evaluations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}:deploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.deploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}:undeploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.undeploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/intents:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:export","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:restore","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:train","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/messages:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.messages.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:compile","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:compile)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.compile"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:export","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:restore","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:train","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/messages:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.messages.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:start","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.start"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:stop","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.stop"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:deployFlow","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployFlow)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployFlow"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:runContinuousTest","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runContinuousTest)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.runContinuousTest"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:compareVersions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::compareVersions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.compareVersions"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:load","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::load)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.load"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:train","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:validate","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows:import","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}:run","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.run"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchDelete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchRun","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchRun)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchRun"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:import","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:restore","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:validate","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3alpha1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:start","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.start"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:stop","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.stop"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:deployFlow","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployFlow)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployFlow"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:runContinuousTest","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runContinuousTest)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.runContinuousTest"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:compareVersions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::compareVersions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.compareVersions"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:load","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::load)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.load"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:train","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:validate","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows:import","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}:run","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.run"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchDelete","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchRun","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchRun)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchRun"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:import","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:restore","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:validate","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"digitalassetlinks.googleapis.com","http_method":"GET","path_template":"/v1/assetlinks:check","path_regex":"^(?:/v1/assetlinks:check)$","service_name":"google.digitalassetlinks","resource_name":"digitalassetlinks.assetlinks.check"},{"hostname":"digitalassetlinks.googleapis.com","http_method":"GET","path_template":"/v1/statements:list","path_regex":"^(?:/v1/statements:list)$","service_name":"google.digitalassetlinks","resource_name":"digitalassetlinks.statements.list"},{"hostname":"digitalassetlinks.googleapis.com","http_method":"POST","path_template":"/v1/assetlinks:bulkCheck","path_regex":"^(?:/v1/assetlinks:bulkCheck)$","service_name":"google.digitalassetlinks","resource_name":"digitalassetlinks.assetlinks.bulkCheck"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.write"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations/{assignedLocationsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords/{negativeKeywordsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources/{assignedInventorySourcesId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/users/{usersId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations/{assignedLocationsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords/{negativeKeywordsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources/{assignedInventorySourcesId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/users/{usersId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers","path_regex":"^(?:/v1/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}:bulkListCampaignAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListCampaignAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.bulkListCampaignAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/channels","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/channels/{channelsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}:bulkListInsertionOrderAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListInsertionOrderAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.bulkListInsertionOrderAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/invoices","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/invoices:lookupInvoiceCurrency","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices:lookupInvoiceCurrency)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.lookupInvoiceCurrency"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}:bulkListLineItemAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListLineItemAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkListLineItemAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/locationLists/{locationListsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}:audit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::audit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.audit"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}:bulkListAdvertiserAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListAdvertiserAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.bulkListAdvertiserAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/combinedAudiences","path_regex":"^(?:/v1/combinedAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/combinedAudiences/{combinedAudiencesId}","path_regex":"^(?:/v1/combinedAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms","path_regex":"^(?:/v1/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts/{scriptsId}","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}:uploadScript","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::uploadScript)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.uploadScript"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customLists","path_regex":"^(?:/v1/customLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customLists/{customListsId}","path_regex":"^(?:/v1/customLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/firstAndThirdPartyAudiences","path_regex":"^(?:/v1/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v1/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/floodlightGroups/{floodlightGroupsId}","path_regex":"^(?:/v1/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/googleAudiences","path_regex":"^(?:/v1/googleAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/googleAudiences/{googleAudiencesId}","path_regex":"^(?:/v1/googleAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/guaranteedOrders","path_regex":"^(?:/v1/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v1/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySourceGroups","path_regex":"^(?:/v1/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySources","path_regex":"^(?:/v1/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v1/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners","path_regex":"^(?:/v1/partners)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/channels","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/channels/{channelsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/targetingTypes/{targetingTypesId}/targetingOptions","path_regex":"^(?:/v1/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/targetingTypes/{targetingTypesId}/targetingOptions/{targetingOptionsId}","path_regex":"^(?:/v1/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/users","path_regex":"^(?:/v1/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1beta/sdfdownloadtask/operations/{operationsId}","path_regex":"^(?:/v1beta/sdfdownloadtask/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtask.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1beta/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1beta/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1beta2/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1beta2/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1dev/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1dev/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers","path_regex":"^(?:/v2/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}:listAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/channels","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/channels/{channelsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}:listAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/invoices","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/invoices:lookupInvoiceCurrency","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices:lookupInvoiceCurrency)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.lookupInvoiceCurrency"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems:bulkListAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkListAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkListAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/locationLists/{locationListsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroupAds","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroupAds)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroupAds.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroupAds/{youtubeAdGroupAdsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroupAds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroupAds.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups/{youtubeAdGroupsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups/{youtubeAdGroupsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups/{youtubeAdGroupsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups:bulkListAdGroupAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups:bulkListAdGroupAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.bulkListAdGroupAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}:audit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::audit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.audit"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}:listAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/combinedAudiences","path_regex":"^(?:/v2/combinedAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/combinedAudiences/{combinedAudiencesId}","path_regex":"^(?:/v2/combinedAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms","path_regex":"^(?:/v2/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts/{scriptsId}","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}:uploadScript","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::uploadScript)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.uploadScript"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customLists","path_regex":"^(?:/v2/customLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customLists/{customListsId}","path_regex":"^(?:/v2/customLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/firstAndThirdPartyAudiences","path_regex":"^(?:/v2/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v2/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/floodlightGroups/{floodlightGroupsId}","path_regex":"^(?:/v2/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/googleAudiences","path_regex":"^(?:/v2/googleAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/googleAudiences/{googleAudiencesId}","path_regex":"^(?:/v2/googleAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/guaranteedOrders","path_regex":"^(?:/v2/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v2/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySourceGroups","path_regex":"^(?:/v2/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySources","path_regex":"^(?:/v2/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v2/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners","path_regex":"^(?:/v2/partners)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/channels","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/channels/{channelsId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v2/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/targetingTypes/{targetingTypesId}/targetingOptions","path_regex":"^(?:/v2/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/targetingTypes/{targetingTypesId}/targetingOptions/{targetingOptionsId}","path_regex":"^(?:/v2/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/users","path_regex":"^(?:/v2/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/users/{usersId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.get"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/channels/{channelId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/locationLists/{locationListId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v1/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/floodlightGroups/{floodlightGroupId}","path_regex":"^(?:/v1/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v1/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v1/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/partners/{partnersId}/channels/{channelId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/users/{usersId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/channels/{channelId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/locationLists/{locationListId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v2/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/floodlightGroups/{floodlightGroupId}","path_regex":"^(?:/v2/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v2/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v2/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/partners/{partnersId}/channels/{channelId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/users/{usersId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/media/{mediaId}","path_regex":"^(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/media/{mediaId}","path_regex":"^(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers","path_regex":"^(?:/v1/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListsId}/assignedLocations:bulkEdit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:bulkEdit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:replace","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/assets","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.assets.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/channels","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}:bulkEditLineItemAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditLineItemAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkEditLineItemAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems:generateDefault","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:generateDefault)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.generateDefault"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:activate","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.activate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:deactivate","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.deactivate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}:bulkEditAdvertiserAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAdvertiserAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.bulkEditAdvertiserAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/customBiddingAlgorithms","path_regex":"^(?:/v1/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/firstAndThirdPartyAudiences","path_regex":"^(?:/v1/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}:editCustomerMatchMembers","path_regex":"^(?:/v1/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editCustomerMatchMembers)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.editCustomerMatchMembers"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/guaranteedOrders","path_regex":"^(?:/v1/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/guaranteedOrders/{guaranteedOrdersId}:editGuaranteedOrderReadAccessors","path_regex":"^(?:/v1/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editGuaranteedOrderReadAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.editGuaranteedOrderReadAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySourceGroups","path_regex":"^(?:/v1/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources:bulkEdit","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySources","path_regex":"^(?:/v1/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySources/{inventorySourcesId}:editInventorySourceReadWriteAccessors","path_regex":"^(?:/v1/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editInventorySourceReadWriteAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.editInventorySourceReadWriteAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/channels","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}:bulkEditPartnerAssignedTargetingOptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditPartnerAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.bulkEditPartnerAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/sdfdownloadtasks","path_regex":"^(?:/v1/sdfdownloadtasks)$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/targetingTypes/{targetingTypesId}/targetingOptions:search","path_regex":"^(?:/v1/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions:search)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.search"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/users","path_regex":"^(?:/v1/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}:bulkEditAssignedUserRoles","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAssignedUserRoles)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.bulkEditAssignedUserRoles"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers","path_regex":"^(?:/v2/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListsId}/assignedLocations:bulkEdit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:bulkEdit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:replace","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/assets","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.assets.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/channels","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}:duplicate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::duplicate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.duplicate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems:bulkEditAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkEditAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkEditAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems:bulkUpdate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkUpdate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkUpdate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems:generateDefault","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:generateDefault)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.generateDefault"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:activate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.activate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:deactivate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.deactivate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}:editAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.editAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/customBiddingAlgorithms","path_regex":"^(?:/v2/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/firstAndThirdPartyAudiences","path_regex":"^(?:/v2/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}:editCustomerMatchMembers","path_regex":"^(?:/v2/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editCustomerMatchMembers)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.editCustomerMatchMembers"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/guaranteedOrders","path_regex":"^(?:/v2/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/guaranteedOrders/{guaranteedOrdersId}:editGuaranteedOrderReadAccessors","path_regex":"^(?:/v2/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editGuaranteedOrderReadAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.editGuaranteedOrderReadAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySourceGroups","path_regex":"^(?:/v2/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources:bulkEdit","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySources","path_regex":"^(?:/v2/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySources/{inventorySourcesId}:editInventorySourceReadWriteAccessors","path_regex":"^(?:/v2/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editInventorySourceReadWriteAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.editInventorySourceReadWriteAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnersId}/channels","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnersId}:editAssignedTargetingOptions","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.editAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/sdfdownloadtasks","path_regex":"^(?:/v2/sdfdownloadtasks)$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/targetingTypes/{targetingTypesId}/targetingOptions:search","path_regex":"^(?:/v2/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions:search)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.search"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/users","path_regex":"^(?:/v2/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/users/{usersId}:bulkEditAssignedUserRoles","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAssignedUserRoles)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.bulkEditAssignedUserRoles"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/infoTypes","path_regex":"^(?:/v2/infoTypes)$","service_name":"google.dlp","resource_name":"dlp.infoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/locations/{locationsId}/infoTypes","path_regex":"^(?:/v2/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/infoTypes)$","service_name":"google.dlp","resource_name":"dlp.locations.infoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/dlpJobs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.dlpJobs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/content:deidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:deidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.content.deidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/content:inspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:inspect)$","service_name":"google.dlp","resource_name":"dlp.projects.content.inspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/content:reidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:reidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.content.reidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/dlpJobs/{dlpJobsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.cancel"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/image:redact","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/image:redact)$","service_name":"google.dlp","resource_name":"dlp.projects.image.redact"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}:activate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.activate"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/content:deidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:deidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.content.deidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/content:inspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:inspect)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.content.inspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/content:reidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:reidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.content.reidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.cancel"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}:finish","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finish)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.finish"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}:hybridInspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::hybridInspect)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.hybridInspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/image:redact","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/image:redact)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.image.redact"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}:activate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.activate"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}:hybridInspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::hybridInspect)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.hybridInspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.create"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/policies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/policies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/policies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/policies","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{projectsId}/managedZones/{managedZonesId}:getIamPolicy","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.getIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{projectsId}/managedZones/{managedZonesId}:setIamPolicy","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.setIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{projectsId}/managedZones/{managedZonesId}:testIamPermissions","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dns","resource_name":"dns.managedZones.testIamPermissions"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/managedZones","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/policies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{projectsId}/managedZones/{managedZonesId}:getIamPolicy","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.getIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{projectsId}/managedZones/{managedZonesId}:setIamPolicy","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.setIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{projectsId}/managedZones/{managedZonesId}:testIamPermissions","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dns","resource_name":"dns.managedZones.testIamPermissions"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/managedZones","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/policies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/policies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2beta1/projects/{project}/managedZones","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2beta1/projects/{project}/policies","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"docs.googleapis.com","http_method":"GET","path_template":"/v1/documents/{documentId}","path_regex":"^(?:/v1/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.docs","resource_name":"docs.documents.get"},{"hostname":"docs.googleapis.com","http_method":"POST","path_template":"/v1/documents","path_regex":"^(?:/v1/documents)$","service_name":"google.docs","resource_name":"docs.documents.create"},{"hostname":"docs.googleapis.com","http_method":"POST","path_template":"/v1/documents/{documentId}:batchUpdate","path_regex":"^(?:/v1/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.docs","resource_name":"docs.documents.batchUpdate"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.operations.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.delete"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processorTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processorTypes/{processorTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:fetchProcessorTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchProcessorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.fetchProcessorTypes"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processorTypes","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processorTypes/{processorTypesId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}:fetchProcessorTypes","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchProcessorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.fetchProcessorTypes"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.cancel"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.create"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/humanReviewConfig:reviewDocument","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/humanReviewConfig:reviewDocument)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.humanReviewConfig.reviewDocument"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:batchProcess","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:deploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.deploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:evaluateProcessorVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluateProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:process","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:undeploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.undeploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions:train","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions:train)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.train"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:batchProcess","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.disable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.enable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:process","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:setDefaultProcessorVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.setDefaultProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/documents:batchProcess","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.documents.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/documents:process","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:process)$","service_name":"google.documentai","resource_name":"documentai.projects.documents.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/documents:batchProcess","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.documents.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/documents:process","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.documents.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.cancel"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.create"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/humanReviewConfig:reviewDocument","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/humanReviewConfig:reviewDocument)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.humanReviewConfig.reviewDocument"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:batchProcess","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:deploy","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.deploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:evaluateProcessorVersion","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluateProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:process","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:undeploy","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.undeploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions:importProcessorVersion","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions:importProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.importProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions:train","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions:train)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.train"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:batchProcess","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:disable","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.disable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:enable","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.enable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:process","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:setDefaultProcessorVersion","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.setDefaultProcessorVersion"},{"hostname":"domains.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.delete"},{"hostname":"domains.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.delete"},{"hostname":"domains.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.delete"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.domains","resource_name":"domains.projects.locations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.getIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveAuthorizationCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveImportableDomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveImportableDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveImportableDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveRegisterParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveRegisterParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveRegisterParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveTransferParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveTransferParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveTransferParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:searchDomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:searchDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.searchDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.domains","resource_name":"domains.projects.locations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.getIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveAuthorizationCode","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:retrieveImportableDomains","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveImportableDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveImportableDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:retrieveRegisterParameters","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveRegisterParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveRegisterParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:retrieveTransferParameters","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveTransferParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveTransferParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:searchDomains","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:searchDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.searchDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.domains","resource_name":"domains.projects.locations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.getIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveAuthorizationCode","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveImportableDomains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveImportableDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveImportableDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveRegisterParameters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveRegisterParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveRegisterParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveTransferParameters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveTransferParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveTransferParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:searchDomains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:searchDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.searchDomains"},{"hostname":"domains.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.patch"},{"hostname":"domains.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.patch"},{"hostname":"domains.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.patch"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureContactSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureContactSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureContactSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureDnsSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureDnsSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureDnsSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureManagementSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureManagementSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureManagementSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.export"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:resetAuthorizationCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.resetAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.setIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.testIamPermissions"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:import)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.import"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:register","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:register)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.register"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:transfer","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:transfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.transfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureContactSettings","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureContactSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureContactSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureDnsSettings","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureDnsSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureDnsSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureManagementSettings","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureManagementSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureManagementSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:export","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.export"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:resetAuthorizationCode","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.resetAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.setIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.testIamPermissions"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:import","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:import)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.import"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:register","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:register)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.register"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:transfer","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:transfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.transfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureContactSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureContactSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureContactSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureDnsSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureDnsSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureDnsSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureManagementSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureManagementSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureManagementSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.export"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:resetAuthorizationCode","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.resetAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.setIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.testIamPermissions"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:import)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.import"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:register","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:register)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.register"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:transfer","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:transfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.transfer"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/autnum/{autnumId}","path_regex":"^(?:/v1/autnum/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.autnum.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/domain/{domainId}","path_regex":"^(?:/v1/domain/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.domain.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/domains","path_regex":"^(?:/v1/domains)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getDomains"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/entities","path_regex":"^(?:/v1/entities)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getEntities"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/entity/{entityId}","path_regex":"^(?:/v1/entity/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.entity.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/help","path_regex":"^(?:/v1/help)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getHelp"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/ip","path_regex":"^(?:/v1/ip)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getIp"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/ip/{ipId}/{ipId1}","path_regex":"^(?:/v1/ip/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.ip.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/nameserver/{nameserverId}","path_regex":"^(?:/v1/nameserver/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.nameserver.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/nameservers","path_regex":"^(?:/v1/nameservers)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getNameservers"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"DELETE","path_template":"/doubleclickbidmanager/v1.1/query/{queryId}","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.deletequery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"DELETE","path_template":"/v2/queries/{queryId}","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.delete"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/doubleclickbidmanager/v1.1/queries","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/queries)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.listqueries"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/doubleclickbidmanager/v1.1/queries/{queryId}/reports","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.reports.listreports"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/doubleclickbidmanager/v1.1/query/{queryId}","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.getquery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries","path_regex":"^(?:/v2/queries)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.list"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries/{queryId}","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.get"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries/{queryId}/reports","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.reports.list"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries/{queryId}/reports/{reportId}","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.reports.get"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/doubleclickbidmanager/v1.1/query","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.createquery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/doubleclickbidmanager/v1.1/query/{queryId}","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.runquery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/v2/queries","path_regex":"^(?:/v2/queries)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.create"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/v2/queries/{queryId}:run","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.run"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/agency/{agencyId}/advertiser/{advertiserId}/engine/{engineAccountId}/conversion","path_regex":"^(?:/doubleclicksearch/v2/agency/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engine/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.get"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/agency/{agencyId}/advertiser/{advertiserId}/idmapping","path_regex":"^(?:/doubleclicksearch/v2/agency/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idmapping)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.getIdMappingFile"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/agency/{agencyId}/advertiser/{advertiserId}/savedcolumns","path_regex":"^(?:/doubleclicksearch/v2/agency/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedcolumns)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.savedColumns.list"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/customer/{customerId}/conversion","path_regex":"^(?:/doubleclicksearch/v2/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.getByCustomerId"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/reports/{reportId}","path_regex":"^(?:/doubleclicksearch/v2/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.get"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/reports/{reportId}/files/{reportFragment}","path_regex":"^(?:/doubleclicksearch/v2/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.getFile"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/conversion","path_regex":"^(?:/doubleclicksearch/v2/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.insert"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/conversion/updateAvailability","path_regex":"^(?:/doubleclicksearch/v2/conversion/updateAvailability)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.updateAvailability"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/reports","path_regex":"^(?:/doubleclicksearch/v2/reports)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.request"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/reports/generate","path_regex":"^(?:/doubleclicksearch/v2/reports/generate)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.generate"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"PUT","path_template":"/doubleclicksearch/v2/conversion","path_regex":"^(?:/doubleclicksearch/v2/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.update"},{"hostname":"driveactivity.googleapis.com","http_method":"POST","path_template":"/v2/activity:query","path_regex":"^(?:/v2/activity:query)$","service_name":"google.driveactivity","resource_name":"driveactivity.activity.query"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2/labels/{labelsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2/labels/{labelsId}/permissions/{permissionsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions/{permissionsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2beta/labels/{labelsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2beta/labels/{labelsId}/permissions/{permissionsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions/{permissionsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels","path_regex":"^(?:/v2/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.get"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/locks","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/locks","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/limits/label","path_regex":"^(?:/v2/limits/label)$","service_name":"google.drivelabels","resource_name":"drivelabels.limits.getLabel"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/users/{usersId}/capabilities","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capabilities)$","service_name":"google.drivelabels","resource_name":"drivelabels.users.getCapabilities"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels","path_regex":"^(?:/v2beta/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.get"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/locks","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/locks","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/limits/label","path_regex":"^(?:/v2beta/limits/label)$","service_name":"google.drivelabels","resource_name":"drivelabels.limits.getLabel"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/users/{usersId}/capabilities","path_regex":"^(?:/v2beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capabilities)$","service_name":"google.drivelabels","resource_name":"drivelabels.users.getCapabilities"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2/labels/{labelsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2beta/labels/{labelsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels","path_regex":"^(?:/v2/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/permissions:batchDelete","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/permissions:batchUpdate","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions:batchDelete","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions:batchUpdate","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:delta","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delta)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delta"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:disable","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.disable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:enable","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.enable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:publish","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.publish"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:updateLabelCopyMode","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateLabelCopyMode)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updateLabelCopyMode"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels","path_regex":"^(?:/v2beta/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/permissions:batchDelete","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/permissions:batchUpdate","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions:batchDelete","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions:batchUpdate","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:delta","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delta)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delta"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:disable","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.disable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:enable","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.enable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:publish","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.publish"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:updateLabelCopyMode","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateLabelCopyMode)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updateLabelCopyMode"},{"hostname":"essentialcontacts.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/contacts/{contactsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.delete"},{"hostname":"essentialcontacts.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/contacts/{contactsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.delete"},{"hostname":"essentialcontacts.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/contacts/{contactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.delete"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/contacts","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.list"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/contacts/{contactsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.get"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/contacts:compute","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:compute)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.compute"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/contacts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.list"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/contacts/{contactsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.get"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/contacts:compute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:compute)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.compute"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/contacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.list"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/contacts/{contactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.get"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/contacts:compute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:compute)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.compute"},{"hostname":"essentialcontacts.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/contacts/{contactsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.patch"},{"hostname":"essentialcontacts.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/contacts/{contactsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.patch"},{"hostname":"essentialcontacts.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/contacts/{contactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.patch"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/contacts","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.create"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/contacts:sendTestMessage","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:sendTestMessage)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.sendTestMessage"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/contacts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.create"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/contacts:sendTestMessage","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:sendTestMessage)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.sendTestMessage"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/contacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.create"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/contacts:sendTestMessage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:sendTestMessage)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.sendTestMessage"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.delete"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/googleChannelConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleChannelConfig)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.getGoogleChannelConfig"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.providers.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.providers.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.patch"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/googleChannelConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleChannelConfig)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.updateGoogleChannelConfig"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.patch"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.patch"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.testIamPermissions"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.testIamPermissions"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.cancel"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.testIamPermissions"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.cancel"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.testIamPermissions"},{"hostname":"factchecktools.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/pages/{pagesId}","path_regex":"^(?:/v1alpha1/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.delete"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/claims:search","path_regex":"^(?:/v1alpha1/claims:search)$","service_name":"google.factchecktools","resource_name":"factchecktools.claims.search"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/pages","path_regex":"^(?:/v1alpha1/pages)$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.list"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/pages/{pagesId}","path_regex":"^(?:/v1alpha1/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.get"},{"hostname":"factchecktools.googleapis.com","http_method":"POST","path_template":"/v1alpha1/pages","path_regex":"^(?:/v1alpha1/pages)$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.create"},{"hostname":"factchecktools.googleapis.com","http_method":"PUT","path_template":"/v1alpha1/pages/{pagesId}","path_regex":"^(?:/v1alpha1/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.update"},{"hostname":"fcm.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/messages:send","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:send)$","service_name":"google.fcm","resource_name":"fcm.projects.messages.send"},{"hostname":"fcmdata.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/deliveryData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryData)$","service_name":"google.fcmdata","resource_name":"fcmdata.projects.androidApps.deliveryData.list"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares/{sharesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.delete"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.file","resource_name":"file.projects.locations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.file","resource_name":"file.projects.locations.operations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.file","resource_name":"file.projects.locations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares)$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares/{sharesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.file","resource_name":"file.projects.locations.operations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.get"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares/{sharesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.patch"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.file","resource_name":"file.projects.locations.instances.restore"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:revert","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.file","resource_name":"file.projects.locations.instances.revert"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.file","resource_name":"file.projects.locations.operations.cancel"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares)$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restore","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.file","resource_name":"file.projects.locations.instances.restore"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:revert","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.file","resource_name":"file.projects.locations.instances.revert"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.file","resource_name":"file.projects.locations.operations.cancel"},{"hostname":"firebase.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/sha/{shaId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sha/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.sha.delete"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/availableProjects","path_regex":"^(?:/v1beta1/availableProjects)$","service_name":"google.firebase","resource_name":"firebase.availableProjects.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.operations.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects","path_regex":"^(?:/v1beta1/projects)$","service_name":"google.firebase","resource_name":"firebase.projects.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/adminSdkConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminSdkConfig)$","service_name":"google.firebase","resource_name":"firebase.projects.getAdminSdkConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/analyticsDetails","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyticsDetails)$","service_name":"google.firebase","resource_name":"firebase.projects.getAnalyticsDetails"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.getConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/sha","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sha)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.sha.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/availableLocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/availableLocations)$","service_name":"google.firebase","resource_name":"firebase.projects.availableLocations.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/iosApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.getConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/webApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.getConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}:searchApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchApps)$","service_name":"google.firebase","resource_name":"firebase.projects.searchApps"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.patch"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.patch"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.patch"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.patch"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/sha","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sha)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.sha.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}:remove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.remove"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.undelete"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/defaultLocation:finalize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultLocation:finalize)$","service_name":"google.firebase","resource_name":"firebase.projects.defaultLocation.finalize"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/iosApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}:remove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.remove"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.undelete"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/webApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}:remove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.remove"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.undelete"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:addFirebase","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFirebase)$","service_name":"google.firebase","resource_name":"firebase.projects.addFirebase"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:addGoogleAnalytics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addGoogleAnalytics)$","service_name":"google.firebase","resource_name":"firebase.projects.addGoogleAnalytics"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:removeAnalytics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeAnalytics)$","service_name":"google.firebase","resource_name":"firebase.projects.removeAnalytics"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.delete"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.delete"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/jwks","path_regex":"^(?:/v1/jwks)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.jwks.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/appAttestConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/appAttestConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/deviceCheckConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/deviceCheckConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/playIntegrityConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/playIntegrityConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/recaptchaEnterpriseConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaEnterpriseConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/recaptchaV3Config:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaV3Config:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/safetyNetConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/safetyNetConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/jwks","path_regex":"^(?:/v1beta/jwks)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.jwks.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/appAttestConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/appAttestConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/deviceCheckConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/deviceCheckConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/playIntegrityConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/playIntegrityConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/recaptchaConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/recaptchaEnterpriseConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaEnterpriseConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/recaptchaV3Config:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaV3Config:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/safetyNetConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/safetyNetConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/services","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.create"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAssertion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAssertion)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAssertion"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAttestation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAttestation)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAttestation"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeCustomToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeCustomToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeCustomToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeDebugToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDebugToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDebugToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeDeviceCheckToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDeviceCheckToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDeviceCheckToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangePlayIntegrityToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangePlayIntegrityToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangePlayIntegrityToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaEnterpriseToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaEnterpriseToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaEnterpriseToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaV3Token","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaV3Token)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaV3Token"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeSafetyNetToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeSafetyNetToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeSafetyNetToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:generateAppAttestChallenge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAppAttestChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generateAppAttestChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:generatePlayIntegrityChallenge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePlayIntegrityChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generatePlayIntegrityChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services:batchUpdate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchUpdate)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.batchUpdate"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.create"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAssertion","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAssertion)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAssertion"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAttestation","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAttestation)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAttestation"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeCustomToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeCustomToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeCustomToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeDebugToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDebugToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDebugToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeDeviceCheckToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDeviceCheckToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDeviceCheckToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangePlayIntegrityToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangePlayIntegrityToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangePlayIntegrityToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaEnterpriseToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaEnterpriseToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaEnterpriseToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaV3Token","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaV3Token)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaV3Token"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeSafetyNetToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeSafetyNetToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeSafetyNetToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:generateAppAttestChallenge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAppAttestChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generateAppAttestChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:generatePlayIntegrityChallenge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePlayIntegrityChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generatePlayIntegrityChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/services:batchUpdate","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchUpdate)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.batchUpdate"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}:verifyAppCheckToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verifyAppCheckToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.verifyAppCheckToken"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/feedbackReports/{feedbackReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.feedbackReports.delete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.delete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.delete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/aabInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aabInfo)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.getAabInfo"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/feedbackReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackReports)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.feedbackReports.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/feedbackReports/{feedbackReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.feedbackReports.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/testers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.patch"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.patch"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/testers/{testersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.patch"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.cancel"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.wait"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}:distribute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::distribute)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.distribute"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases:batchDelete)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.batchDelete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases:upload)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.media.upload"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.create"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/groups/{groupsId}:batchJoin","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchJoin)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.batchJoin"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/groups/{groupsId}:batchLeave","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchLeave)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.batchLeave"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/testers:batchAdd","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers:batchAdd)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.batchAdd"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/testers:batchRemove","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers:batchRemove)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.batchRemove"},{"hostname":"firebasedatabase.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.delete"},{"hostname":"firebasedatabase.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.list"},{"hostname":"firebasedatabase.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.get"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.create"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:disable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.disable"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reenable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reenable)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.reenable"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:undelete","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.undelete"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"GET","path_template":"/v1/{dynamicLink}/linkStats","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/linkStats)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.getLinkStats"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/installAttribution","path_regex":"^(?:/v1/installAttribution)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.installAttribution"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/managedShortLinks:create","path_regex":"^(?:/v1/managedShortLinks:create)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.managedShortLinks.create"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/reopenAttribution","path_regex":"^(?:/v1/reopenAttribution)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.reopenAttribution"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/shortLinks","path_regex":"^(?:/v1/shortLinks)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.shortLinks.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.operations.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.operations.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.operations.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.getConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}/files","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.files.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.getConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}/files","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.files.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.updateConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.updateConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.operations.cancel"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}:populateFiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::populateFiles)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.populateFiles"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions:clone","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:clone)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.clone"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}:populateFiles","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::populateFiles)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.populateFiles"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/versions:clone","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:clone)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.clone"},{"hostname":"firebasehosting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.update"},{"hostname":"firebasehosting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.update"},{"hostname":"firebaseml.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.operations.delete"},{"hostname":"firebaseml.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.delete"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.firebaseml","resource_name":"firebaseml.operations.list"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/models","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.list"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.get"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}:download","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.download"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.operations.get"},{"hostname":"firebaseml.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.patch"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebaseml","resource_name":"firebaseml.operations.cancel"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/models","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.create"},{"hostname":"firebaseremoteconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/remoteConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remoteConfig)$","service_name":"google.firebaseremoteconfig","resource_name":"firebaseremoteconfig.projects.getRemoteConfig"},{"hostname":"firebaseremoteconfig.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/remoteConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remoteConfig)$","service_name":"google.firebaseremoteconfig","resource_name":"firebaseremoteconfig.projects.updateRemoteConfig"},{"hostname":"firebaserules.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.delete"},{"hostname":"firebaserules.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/rulesets/{rulesetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.delete"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.list"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.get"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/releases/{releasesId}:getExecutable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getExecutable)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.getExecutable"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/rulesets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.list"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/rulesets/{rulesetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.get"},{"hostname":"firebaserules.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.patch"},{"hostname":"firebaserules.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.create"},{"hostname":"firebaserules.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/rulesets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.create"},{"hostname":"firebaserules.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:test","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::test)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.test"},{"hostname":"firebasestorage.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/buckets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.list"},{"hostname":"firebasestorage.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/buckets/{bucketsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.get"},{"hostname":"firebasestorage.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/buckets/{bucketsId}:addFirebase","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFirebase)$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.addFirebase"},{"hostname":"firebasestorage.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/buckets/{bucketsId}:removeFirebase","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFirebase)$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.removeFirebase"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.delete"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{collectionId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listDocuments"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}/{collectionId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.firestore","resource_name":"firestore.projects.locations.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.locations.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{collectionId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listDocuments"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}/{collectionId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.get"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.patch"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{collectionId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.createDocument"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:listCollectionIds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listCollectionIds)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listCollectionIds"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:partitionQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.partitionQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runAggregationQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runAggregationQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchGet)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchGet"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:batchWrite","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchWrite)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchWrite"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:beginTransaction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:beginTransaction)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.beginTransaction"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:commit)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.commit"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:listen","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:listen)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listen"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:rollback)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.rollback"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:write)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.write"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.cancel"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}:exportDocuments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.exportDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}:importDocuments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.importDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{collectionId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.createDocument"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:listCollectionIds","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listCollectionIds)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listCollectionIds"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:partitionQuery","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.partitionQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runAggregationQuery","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runAggregationQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runQuery","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:batchGet","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchGet)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchGet"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:batchWrite","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchWrite)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchWrite"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:beginTransaction","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:beginTransaction)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.beginTransaction"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:commit","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:commit)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.commit"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:listen","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:listen)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listen"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:rollback)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.rollback"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:write","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:write)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.write"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}:exportDocuments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.exportDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}:importDocuments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.importDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}:exportDocuments","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.exportDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}:importDocuments","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.importDocuments"},{"hostname":"fitness.googleapis.com","http_method":"DELETE","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.delete"},{"hostname":"fitness.googleapis.com","http_method":"DELETE","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/datasets/{datasetId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.datasets.delete"},{"hostname":"fitness.googleapis.com","http_method":"DELETE","path_template":"/fitness/v1/users/{userId}/sessions/{sessionId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.sessions.delete"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.list"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.get"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/dataPointChanges","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPointChanges)$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.dataPointChanges.list"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/datasets/{datasetId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.datasets.get"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/sessions","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.fitness","resource_name":"fitness.users.sessions.list"},{"hostname":"fitness.googleapis.com","http_method":"PATCH","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/datasets/{datasetId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.datasets.patch"},{"hostname":"fitness.googleapis.com","http_method":"POST","path_template":"/fitness/v1/users/{userId}/dataSources","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.create"},{"hostname":"fitness.googleapis.com","http_method":"POST","path_template":"/fitness/v1/users/{userId}/dataset:aggregate","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset:aggregate)$","service_name":"google.fitness","resource_name":"fitness.users.dataset.aggregate"},{"hostname":"fitness.googleapis.com","http_method":"PUT","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.update"},{"hostname":"fitness.googleapis.com","http_method":"PUT","path_template":"/fitness/v1/users/{userId}/sessions/{sessionId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.sessions.update"},{"hostname":"forms.googleapis.com","http_method":"DELETE","path_template":"/v1/forms/{formId}/watches/{watchId}","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.forms","resource_name":"forms.forms.watches.delete"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.forms","resource_name":"forms.forms.get"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}/responses","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responses)$","service_name":"google.forms","resource_name":"forms.forms.responses.list"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}/responses/{responseId}","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.forms","resource_name":"forms.forms.responses.get"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}/watches","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches)$","service_name":"google.forms","resource_name":"forms.forms.watches.list"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms","path_regex":"^(?:/v1/forms)$","service_name":"google.forms","resource_name":"forms.forms.create"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms/{formId}/watches","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches)$","service_name":"google.forms","resource_name":"forms.forms.watches.create"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms/{formId}/watches/{watchId}:renew","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renew)$","service_name":"google.forms","resource_name":"forms.forms.watches.renew"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms/{formId}:batchUpdate","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.forms","resource_name":"forms.forms.batchUpdate"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/achievements","path_regex":"^(?:/games/v1/achievements)$","service_name":"google.games","resource_name":"games.achievementDefinitions.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/applications/{applicationId}","path_regex":"^(?:/games/v1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.applications.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/applications/{applicationId}/verify","path_regex":"^(?:/games/v1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verify)$","service_name":"google.games","resource_name":"games.applications.verify"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/eventDefinitions","path_regex":"^(?:/games/v1/eventDefinitions)$","service_name":"google.games","resource_name":"games.events.listDefinitions"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/events","path_regex":"^(?:/games/v1/events)$","service_name":"google.games","resource_name":"games.events.listByPlayer"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards","path_regex":"^(?:/games/v1/leaderboards)$","service_name":"google.games","resource_name":"games.leaderboards.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.leaderboards.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards/{leaderboardId}/scores/{collection}","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.scores.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards/{leaderboardId}/window/{collection}","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/window/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.scores.listWindow"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/metagameConfig","path_regex":"^(?:/games/v1/metagameConfig)$","service_name":"google.games","resource_name":"games.metagame.getMetagameConfig"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/me/multipleApplicationPlayerIds","path_regex":"^(?:/games/v1/players/me/multipleApplicationPlayerIds)$","service_name":"google.games","resource_name":"games.players.getMultipleApplicationPlayerIds"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/me/players/{collection}","path_regex":"^(?:/games/v1/players/me/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.players.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/me/scopedIds","path_regex":"^(?:/games/v1/players/me/scopedIds)$","service_name":"google.games","resource_name":"games.players.getScopedPlayerIds"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.players.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/achievements","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/achievements)$","service_name":"google.games","resource_name":"games.achievements.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/categories/{collection}","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/categories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.metagame.listCategoriesByPlayer"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/leaderboards/{leaderboardId}/scores/{timeSpan}","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.scores.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/snapshots","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.games","resource_name":"games.snapshots.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/revisions/check","path_regex":"^(?:/games/v1/revisions/check)$","service_name":"google.games","resource_name":"games.revisions.check"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/snapshots/{snapshotId}","path_regex":"^(?:/games/v1/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.snapshots.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/stats","path_regex":"^(?:/games/v1/stats)$","service_name":"google.games","resource_name":"games.stats.get"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/updateMultiple","path_regex":"^(?:/games/v1/achievements/updateMultiple)$","service_name":"google.games","resource_name":"games.achievements.updateMultiple"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/increment","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/increment)$","service_name":"google.games","resource_name":"games.achievements.increment"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/reveal","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reveal)$","service_name":"google.games","resource_name":"games.achievements.reveal"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/setStepsAtLeast","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setStepsAtLeast)$","service_name":"google.games","resource_name":"games.achievements.setStepsAtLeast"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/unlock","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unlock)$","service_name":"google.games","resource_name":"games.achievements.unlock"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/applications/getEndPoint","path_regex":"^(?:/games/v1/applications/getEndPoint)$","service_name":"google.games","resource_name":"games.applications.getEndPoint"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/applications/played","path_regex":"^(?:/games/v1/applications/played)$","service_name":"google.games","resource_name":"games.applications.played"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/events","path_regex":"^(?:/games/v1/events)$","service_name":"google.games","resource_name":"games.events.record"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/leaderboards/scores","path_regex":"^(?:/games/v1/leaderboards/scores)$","service_name":"google.games","resource_name":"games.scores.submitMultiple"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/leaderboards/{leaderboardId}/scores","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores)$","service_name":"google.games","resource_name":"games.scores.submit"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"DELETE","path_template":"/games/v1configuration/achievements/{achievementId}","path_regex":"^(?:/games/v1configuration/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.delete"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"DELETE","path_template":"/games/v1configuration/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1configuration/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.delete"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/achievements/{achievementId}","path_regex":"^(?:/games/v1configuration/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.get"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/applications/{applicationId}/achievements","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/achievements)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.list"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/applications/{applicationId}/leaderboards","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leaderboards)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.list"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1configuration/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.get"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"POST","path_template":"/games/v1configuration/applications/{applicationId}/achievements","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/achievements)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.insert"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"POST","path_template":"/games/v1configuration/applications/{applicationId}/leaderboards","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leaderboards)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.insert"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"PUT","path_template":"/games/v1configuration/achievements/{achievementId}","path_regex":"^(?:/games/v1configuration/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.update"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"PUT","path_template":"/games/v1configuration/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1configuration/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.update"},{"hostname":"gameservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.delete"},{"hostname":"gameservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.delete"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.get"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.getIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.get"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.get"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.getIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.get"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.setIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.testIamPermissions"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.cancel"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.setIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.testIamPermissions"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.cancel"},{"hostname":"gamesmanagement.googleapis.com","http_method":"DELETE","path_template":"/games/v1management/applications/{applicationId}/players/hidden/{playerId}","path_regex":"^(?:/games/v1management/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/players/hidden/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesManagement","resource_name":"gamesManagement.players.unhide"},{"hostname":"gamesmanagement.googleapis.com","http_method":"GET","path_template":"/games/v1management/applications/{applicationId}/players/hidden","path_regex":"^(?:/games/v1management/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/players/hidden)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.applications.listHidden"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/reset","path_regex":"^(?:/games/v1management/achievements/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetAll"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/resetAllForAllPlayers","path_regex":"^(?:/games/v1management/achievements/resetAllForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetAllForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/resetMultipleForAllPlayers","path_regex":"^(?:/games/v1management/achievements/resetMultipleForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetMultipleForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/{achievementId}/reset","path_regex":"^(?:/games/v1management/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.reset"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/{achievementId}/resetForAllPlayers","path_regex":"^(?:/games/v1management/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/applications/{applicationId}/players/hidden/{playerId}","path_regex":"^(?:/games/v1management/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/players/hidden/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesManagement","resource_name":"gamesManagement.players.hide"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/reset","path_regex":"^(?:/games/v1management/events/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetAll"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/resetAllForAllPlayers","path_regex":"^(?:/games/v1management/events/resetAllForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetAllForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/resetMultipleForAllPlayers","path_regex":"^(?:/games/v1management/events/resetMultipleForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetMultipleForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/{eventId}/reset","path_regex":"^(?:/games/v1management/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.reset"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/{eventId}/resetForAllPlayers","path_regex":"^(?:/games/v1management/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/leaderboards/{leaderboardId}/scores/reset","path_regex":"^(?:/games/v1management/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.reset"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/leaderboards/{leaderboardId}/scores/resetForAllPlayers","path_regex":"^(?:/games/v1management/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/resetForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/scores/reset","path_regex":"^(?:/games/v1management/scores/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetAll"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/scores/resetAllForAllPlayers","path_regex":"^(?:/games/v1management/scores/resetAllForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetAllForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/scores/resetMultipleForAllPlayers","path_regex":"^(?:/games/v1management/scores/resetMultipleForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetMultipleForAllPlayers"},{"hostname":"genomics.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/pipelines/{pipelineId}","path_regex":"^(?:/v1alpha2/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.pipelines.delete"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/operations","path_regex":"^(?:/v1alpha2/operations)$","service_name":"google.genomics","resource_name":"genomics.operations.list"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/operations/{operationsId}","path_regex":"^(?:/v1alpha2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.operations.get"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/pipelines","path_regex":"^(?:/v1alpha2/pipelines)$","service_name":"google.genomics","resource_name":"genomics.pipelines.list"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/pipelines/{pipelineId}","path_regex":"^(?:/v1alpha2/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.pipelines.get"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/pipelines:getControllerConfig","path_regex":"^(?:/v1alpha2/pipelines:getControllerConfig)$","service_name":"google.genomics","resource_name":"genomics.pipelines.getControllerConfig"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/operations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.genomics","resource_name":"genomics.projects.operations.list"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.projects.operations.get"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v1alpha2/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.genomics","resource_name":"genomics.operations.cancel"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v1alpha2/pipelines","path_regex":"^(?:/v1alpha2/pipelines)$","service_name":"google.genomics","resource_name":"genomics.pipelines.create"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v1alpha2/pipelines:run","path_regex":"^(?:/v1alpha2/pipelines:run)$","service_name":"google.genomics","resource_name":"genomics.pipelines.run"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/pipelines:run","path_regex":"^(?:/v2alpha1/pipelines:run)$","service_name":"google.genomics","resource_name":"genomics.pipelines.run"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.genomics","resource_name":"genomics.projects.operations.cancel"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/workers/{workersId}:checkIn","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkIn)$","service_name":"google.genomics","resource_name":"genomics.projects.workers.checkIn"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/workers/{id}:checkIn","path_regex":"^(?:/v2alpha1/workers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkIn)$","service_name":"google.genomics","resource_name":"genomics.workers.checkIn"},{"hostname":"genomics.googleapis.com","http_method":"PUT","path_template":"/v1alpha2/pipelines:setOperationStatus","path_regex":"^(?:/v1alpha2/pipelines:setOperationStatus)$","service_name":"google.genomics","resource_name":"genomics.pipelines.setOperationStatus"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.deleteOperations"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.cancel"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.organizations.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships:listAdmin","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:listAdmin)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.listAdmin"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.organizations.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateExclusivityManifest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateExclusivityManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateExclusivityManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships:validateExclusivity","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:validateExclusivity)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.validateExclusivity"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships:validateCreate","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:validateCreate)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.validateCreate"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/global/memberships:initializeHub","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/memberships:initializeHub)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.global.memberships.initializeHub"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/rbacrolebindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.namespaces.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/drafts/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.drafts.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/messages/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.messages.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/cse/identities/{cseEmailAddress}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/delegates/{delegateEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/filters/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/threads/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.threads.delete"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/drafts","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts)$","service_name":"google.gmail","resource_name":"gmail.users.drafts.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/drafts/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.drafts.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/history","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.gmail","resource_name":"gmail.users.history.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/labels","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.gmail","resource_name":"gmail.users.labels.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/messages","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.gmail","resource_name":"gmail.users.messages.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/messages/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.messages.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/messages/{messageId}/attachments/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.messages.attachments.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/profile","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profile)$","service_name":"google.gmail","resource_name":"gmail.users.getProfile"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/autoForwarding","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/autoForwarding)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getAutoForwarding"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/identities","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/identities/{cseEmailAddress}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/delegates","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates)$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/delegates/{delegateEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/filters","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters)$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/filters/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses)$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/imap","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/imap)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getImap"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/language","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/language)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getLanguage"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/pop","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/pop)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getPop"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/vacation","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/vacation)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getVacation"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/threads","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads)$","service_name":"google.gmail","resource_name":"gmail.users.threads.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/threads/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.threads.get"},{"hostname":"gmail.googleapis.com","http_method":"PATCH","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.patch"},{"hostname":"gmail.googleapis.com","http_method":"PATCH","path_template":"/gmail/v1/users/{userId}/settings/cse/identities/{emailAddress}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.patch"},{"hostname":"gmail.googleapis.com","http_method":"PATCH","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.patch"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/drafts","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts)$","service_name":"google.gmail","resource_name":"gmail.users.drafts.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/drafts/send","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/send)$","service_name":"google.gmail","resource_name":"gmail.users.drafts.send"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/labels","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.gmail","resource_name":"gmail.users.labels.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.gmail","resource_name":"gmail.users.messages.insert"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/batchDelete","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/batchDelete)$","service_name":"google.gmail","resource_name":"gmail.users.messages.batchDelete"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/batchModify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/batchModify)$","service_name":"google.gmail","resource_name":"gmail.users.messages.batchModify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/import","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/import)$","service_name":"google.gmail","resource_name":"gmail.users.messages.import"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/send","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/send)$","service_name":"google.gmail","resource_name":"gmail.users.messages.send"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/{id}/modify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modify)$","service_name":"google.gmail","resource_name":"gmail.users.messages.modify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/{id}/trash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trash)$","service_name":"google.gmail","resource_name":"gmail.users.messages.trash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/{id}/untrash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/untrash)$","service_name":"google.gmail","resource_name":"gmail.users.messages.untrash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/identities","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:disable","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.disable"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:enable","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.enable"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:obliterate","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::obliterate)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.obliterate"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/delegates","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates)$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/filters","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters)$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses)$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.insert"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefault)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.setDefault"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/verify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verify)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.verify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/stop","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.gmail","resource_name":"gmail.users.stop"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/threads/{id}/modify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modify)$","service_name":"google.gmail","resource_name":"gmail.users.threads.modify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/threads/{id}/trash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trash)$","service_name":"google.gmail","resource_name":"gmail.users.threads.trash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/threads/{id}/untrash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/untrash)$","service_name":"google.gmail","resource_name":"gmail.users.threads.untrash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/watch","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.gmail","resource_name":"gmail.users.watch"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/drafts/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.drafts.update"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.update"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/autoForwarding","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/autoForwarding)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateAutoForwarding"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/imap","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/imap)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateImap"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/language","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/language)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateLanguage"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/pop","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/pop)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updatePop"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.update"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/vacation","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/vacation)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateVacation"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains","path_regex":"^(?:/v1/domains)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains/{domainsId}","path_regex":"^(?:/v1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.get"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains/{domainsId}/trafficStats","path_regex":"^(?:/v1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains/{domainsId}/trafficStats/{trafficStatsId}","path_regex":"^(?:/v1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.get"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains","path_regex":"^(?:/v1beta1/domains)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains/{domainsId}","path_regex":"^(?:/v1beta1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.get"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains/{domainsId}/trafficStats","path_regex":"^(?:/v1beta1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains/{domainsId}/trafficStats/{trafficStatsId}","path_regex":"^(?:/v1beta1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.get"},{"hostname":"groupsmigration.googleapis.com","http_method":"POST","path_template":"/groups/v1/groups/{groupId}/archive","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archive)$","service_name":"google.groupsmigration","resource_name":"groupsmigration.archive.insert"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.deleteRevision"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/$purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$purge)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-purge"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalDelete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/$purge","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$purge)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-purge"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:deleteRevision","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.deleteRevision"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalDelete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/$purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$purge)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-purge"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.delete"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.listRevisions"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/series","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForStudies"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveStudy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveInstance"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveFrames"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}/rendered","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/rendered","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$everything","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$everything)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-everything"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.history"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history/{_historyId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.vread"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getFHIRStoreMetrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getFHIRStoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getFHIRStoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/instances","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/series","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.searchForStudies"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.retrieveStudy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/instances","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.metadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.retrieveSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.retrieveInstance"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.frames.retrieveFrames"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}/rendered","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.frames.rendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.metadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/rendered","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.rendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.metadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Observation/$lastn","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Observation/\\$lastn)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Observation-lastn"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$everything","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$everything)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-everything"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.history"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history/{_historyId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.vread"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:listRevisions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.listRevisions"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/series","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForStudies"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveStudy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveInstance"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveFrames"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}/rendered","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/rendered","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/$references","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/\\$references)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-incoming-references"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/ConceptMap/$translate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/ConceptMap/\\$translate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.ConceptMap-search-translate"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/ConceptMap/{ConceptMapId}/$translate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/ConceptMap/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$translate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.ConceptMap-translate"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Observation/$lastn","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Observation/\\$lastn)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Observation-lastn"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$everything","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$everything)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-everything"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.history"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history/{_historyId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.vread"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getFHIRStoreMetrics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getFHIRStoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getFHIRStoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:batchGet","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:batchGet)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.batchGet"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalPatch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalPatch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.patch"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:activate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.activate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:reject","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.reject"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:revoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.revoke"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}:archive","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.archive"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:checkDataAccess","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkDataAccess)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.checkDataAccess"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:evaluateUserConsents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateUserConsents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.evaluateUserConsents"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:queryAccessibleData","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAccessibleData)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.queryAccessibleData"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:deidentify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/_search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/$validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$validate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-validate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{resourceType}/_search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search-type"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:deidentify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:ingest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:ingest)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.ingest"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.cancel"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:deidentify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/nlp:analyzeEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/nlp:analyzeEntities)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.services.nlp.analyzeEntities"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:export","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:import","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/_search","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:export","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:import","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:ingest","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:ingest)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.ingest"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:deidentify","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:evaluate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.evaluate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:activate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.activate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:reject","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.reject"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:revoke","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.revoke"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}:archive","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.archive"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:checkDataAccess","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkDataAccess)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.checkDataAccess"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:evaluateUserConsents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateUserConsents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.evaluateUserConsents"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:queryAccessibleData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAccessibleData)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.queryAccessibleData"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:deidentify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/_search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.createResource"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/$validate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$validate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-validate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{resourceType}/_search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search-type"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:configureSearch","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureSearch)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.configureSearch"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:deidentify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:ingest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:ingest)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.ingest"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.cancel"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:deidentify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/services/nlp:analyzeEntities","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/nlp:analyzeEntities)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.services.nlp.analyzeEntities"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.update"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalUpdate"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.update"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalUpdate"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.update"},{"hostname":"homegraph.googleapis.com","http_method":"DELETE","path_template":"/v1/agentUsers/{agentUsersId}","path_regex":"^(?:/v1/agentUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.homegraph","resource_name":"homegraph.agentUsers.delete"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:query","path_regex":"^(?:/v1/devices:query)$","service_name":"google.homegraph","resource_name":"homegraph.devices.query"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:reportStateAndNotification","path_regex":"^(?:/v1/devices:reportStateAndNotification)$","service_name":"google.homegraph","resource_name":"homegraph.devices.reportStateAndNotification"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:requestSync","path_regex":"^(?:/v1/devices:requestSync)$","service_name":"google.homegraph","resource_name":"homegraph.devices.requestSync"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:sync","path_regex":"^(?:/v1/devices:sync)$","service_name":"google.homegraph","resource_name":"homegraph.devices.sync"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/subjects/{subjectsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.subjects.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.organizations.roles.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/roles/{rolesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.roles.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.delete"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/subjects/{subjectsId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.subjects.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/roles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.organizations.roles.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.organizations.roles.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/roles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.projects.roles.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/roles/{rolesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.roles.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/roles","path_regex":"^(?:/v1/roles)$","service_name":"google.iam","resource_name":"iam.roles.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/roles/{rolesId}","path_regex":"^(?:/v1/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.roles.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.listPolicies"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}/operations/{operationsId}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2beta/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.listPolicies"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}/operations/{operationsId}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.operations.get"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.organizations.roles.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/roles/{rolesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.roles.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.patch"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/iamPolicies:lintPolicy","path_regex":"^(?:/v1/iamPolicies:lintPolicy)$","service_name":"google.iam","resource_name":"iam.iamPolicies.lintPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/iamPolicies:queryAuditableServices","path_regex":"^(?:/v1/iamPolicies:queryAuditableServices)$","service_name":"google.iam","resource_name":"iam.iamPolicies.queryAuditableServices"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/subjects/{subjectsId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.subjects.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:getIamPolicy","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.getIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:setIamPolicy","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.setIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:testIamPermissions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.testIamPermissions"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/roles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.organizations.roles.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}:undelete","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.organizations.roles.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/permissions:queryTestablePermissions","path_regex":"^(?:/v1/permissions:queryTestablePermissions)$","service_name":"google.iam","resource_name":"iam.permissions.queryTestablePermissions"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/roles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.projects.roles.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/roles/{rolesId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.roles.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.disable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.enable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys:upload)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.upload"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.disable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.enable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.getIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.setIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signBlob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signBlob)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.signBlob"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signJwt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signJwt)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.signJwt"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.testIamPermissions"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/roles:queryGrantableRoles","path_regex":"^(?:/v1/roles:queryGrantableRoles)$","service_name":"google.iam","resource_name":"iam.roles.queryGrantableRoles"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v2/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.createPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v2beta/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.createPolicy"},{"hostname":"iam.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.update"},{"hostname":"iam.googleapis.com","http_method":"PUT","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.update"},{"hostname":"iam.googleapis.com","http_method":"PUT","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.update"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:generateAccessToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.generateAccessToken"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:generateIdToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateIdToken)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.generateIdToken"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signBlob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signBlob)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.signBlob"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signJwt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signJwt)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.signJwt"},{"hostname":"iap.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients/{identityAwareProxyClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.delete"},{"hostname":"iap.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups/{destGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.delete"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands)$","service_name":"google.iap","resource_name":"iap.projects.brands.list"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands/{brandsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.brands.get"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients)$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.list"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients/{identityAwareProxyClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.get"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups)$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.list"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups/{destGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.get"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}:iapSettings","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::iapSettings)$","service_name":"google.iap","resource_name":"iap.getIapSettings"},{"hostname":"iap.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups/{destGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.patch"},{"hostname":"iap.googleapis.com","http_method":"PATCH","path_template":"/v1/{v1Id}:iapSettings","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::iapSettings)$","service_name":"google.iap","resource_name":"iap.updateIapSettings"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/brands","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands)$","service_name":"google.iap","resource_name":"iap.projects.brands.create"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients)$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.create"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients/{identityAwareProxyClientsId}:resetSecret","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetSecret)$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.resetSecret"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups)$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.create"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:getIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iap","resource_name":"iap.getIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:setIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iap","resource_name":"iap.setIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:testIamPermissions","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iap","resource_name":"iap.testIamPermissions"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:getIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iap","resource_name":"iap.getIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:setIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iap","resource_name":"iap.setIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:testIamPermissions","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iap","resource_name":"iap.testIamPermissions"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1alpha/ideas","path_regex":"^(?:/v1alpha/ideas)$","service_name":"google.ideahub","resource_name":"ideahub.ideas.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/ideas","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideas)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideas.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/locales","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locales)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.locales.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/ideas","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideas)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideas.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/locales","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locales)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.locales.list"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/ideaStates/{ideaStatesId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/topicStates/{topicStatesId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topicStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.topicStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/ideaStates/{ideaStatesId}","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/topicStates/{topicStatesId}","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topicStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.topicStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/ideaActivities","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaActivities)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaActivities.create"},{"hostname":"ideahub.googleapis.com","http_method":"POST","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/ideaActivities","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaActivities)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaActivities.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getProjects"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/accounts:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchGet)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.batchGet"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchGet)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.batchGet"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/publicKeys","path_regex":"^(?:/v1/publicKeys)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getPublicKeys"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/recaptchaParams","path_regex":"^(?:/v1/recaptchaParams)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getRecaptchaParams"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/sessionCookiePublicKeys","path_regex":"^(?:/v1/sessionCookiePublicKeys)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getSessionCookiePublicKeys"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/defaultSupportedIdps","path_regex":"^(?:/v2/defaultSupportedIdps)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.defaultSupportedIdps.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/config","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.getConfig"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/recaptchaConfig","path_regex":"^(?:/v2/recaptchaConfig)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getRecaptchaConfig"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/config","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.updateConfig"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:createAuthUri","path_regex":"^(?:/v1/accounts:createAuthUri)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.createAuthUri"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:delete","path_regex":"^(?:/v1/accounts:delete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:issueSamlResponse","path_regex":"^(?:/v1/accounts:issueSamlResponse)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.issueSamlResponse"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:lookup","path_regex":"^(?:/v1/accounts:lookup)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.lookup"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:resetPassword","path_regex":"^(?:/v1/accounts:resetPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.resetPassword"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:sendOobCode","path_regex":"^(?:/v1/accounts:sendOobCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.sendOobCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:sendVerificationCode","path_regex":"^(?:/v1/accounts:sendVerificationCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.sendVerificationCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithCustomToken","path_regex":"^(?:/v1/accounts:signInWithCustomToken)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithCustomToken"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithEmailLink","path_regex":"^(?:/v1/accounts:signInWithEmailLink)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithEmailLink"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithGameCenter","path_regex":"^(?:/v1/accounts:signInWithGameCenter)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithGameCenter"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithIdp","path_regex":"^(?:/v1/accounts:signInWithIdp)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithIdp"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithPassword","path_regex":"^(?:/v1/accounts:signInWithPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithPassword"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithPhoneNumber","path_regex":"^(?:/v1/accounts:signInWithPhoneNumber)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithPhoneNumber"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signUp","path_regex":"^(?:/v1/accounts:signUp)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signUp"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:update","path_regex":"^(?:/v1/accounts:update)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.update"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:verifyIosClient","path_regex":"^(?:/v1/accounts:verifyIosClient)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.verifyIosClient"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchCreate)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.batchCreate"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchDelete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.batchDelete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:delete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:lookup)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.lookup"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:query)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.query"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:sendOobCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:sendOobCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.sendOobCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:update","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:update)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.update"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchCreate)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.batchCreate"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchDelete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.batchDelete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:delete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:lookup)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.lookup"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:query)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.query"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:sendOobCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:sendOobCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.sendOobCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:update","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:update)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.update"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}:createSessionCookie","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::createSessionCookie)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.createSessionCookie"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:createSessionCookie","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::createSessionCookie)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.createSessionCookie"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:queryAccounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAccounts)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.queryAccounts"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaEnrollment:finalize","path_regex":"^(?:/v2/accounts/mfaEnrollment:finalize)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaEnrollment.finalize"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaEnrollment:start","path_regex":"^(?:/v2/accounts/mfaEnrollment:start)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaEnrollment.start"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaEnrollment:withdraw","path_regex":"^(?:/v2/accounts/mfaEnrollment:withdraw)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaEnrollment.withdraw"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaSignIn:finalize","path_regex":"^(?:/v2/accounts/mfaSignIn:finalize)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaSignIn.finalize"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaSignIn:start","path_regex":"^(?:/v2/accounts/mfaSignIn:start)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaSignIn.start"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/passkeyEnrollment:finalize","path_regex":"^(?:/v2/accounts/passkeyEnrollment:finalize)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.passkeyEnrollment.finalize"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/passkeyEnrollment:start","path_regex":"^(?:/v2/accounts/passkeyEnrollment:start)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.passkeyEnrollment.start"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/passkeySignIn:finalize","path_regex":"^(?:/v2/accounts/passkeySignIn:finalize)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.passkeySignIn.finalize"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/passkeySignIn:start","path_regex":"^(?:/v2/accounts/passkeySignIn:start)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.passkeySignIn.start"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts:revokeToken","path_regex":"^(?:/v2/accounts:revokeToken)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.revokeToken"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/identityPlatform:initializeAuth","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityPlatform:initializeAuth)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.identityPlatform.initializeAuth"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.getIamPolicy"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.setIamPolicy"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.testIamPermissions"},{"hostname":"ids.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.delete"},{"hostname":"ids.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.delete"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.ids","resource_name":"ids.projects.locations.list"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.get"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.list"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.get"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.getIamPolicy"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.list"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.get"},{"hostname":"ids.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.patch"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.create"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.setIamPolicy"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.testIamPermissions"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.cancel"},{"hostname":"indexing.googleapis.com","http_method":"GET","path_template":"/v3/urlNotifications/metadata","path_regex":"^(?:/v3/urlNotifications/metadata)$","service_name":"google.indexing","resource_name":"indexing.urlNotifications.getMetadata"},{"hostname":"indexing.googleapis.com","http_method":"POST","path_template":"/v3/urlNotifications:publish","path_regex":"^(?:/v3/urlNotifications:publish)$","service_name":"google.indexing","resource_name":"indexing.urlNotifications.publish"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/callback:generateToken","path_regex":"^(?:/v1/callback:generateToken)$","service_name":"google.integrations","resource_name":"integrations.callback.generateToken"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/connectorPlatformRegions:enumerate","path_regex":"^(?:/v1/connectorPlatformRegions:enumerate)$","service_name":"google.integrations","resource_name":"integrations.connectorPlatformRegions.enumerate"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/clientmetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientmetadata)$","service_name":"google.integrations","resource_name":"integrations.projects.getClientmetadata"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.getClients"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.getConnectionSchemaMetadata"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeActionSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeActionSchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeActionSchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeEntitySchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeEntitySchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeEntitySchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executionsnapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionsnapshots)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executionsnapshots.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executionsnapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionsnapshots)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executionsnapshots.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:getBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.getBundle"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}:listTaskEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTaskEntities)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.listTaskEntities"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:listTaskEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTaskEntities)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.listTaskEntities"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/callback:generateToken","path_regex":"^(?:/v1alpha/callback:generateToken)$","service_name":"google.integrations","resource_name":"integrations.callback.generateToken"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/connectorPlatformRegions:enumerate","path_regex":"^(?:/v1alpha/connectorPlatformRegions:enumerate)$","service_name":"google.integrations","resource_name":"integrations.connectorPlatformRegions.enumerate"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.getConnectionSchemaMetadata"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeActionSchemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeActionSchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeActionSchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeEntitySchemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeEntitySchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeEntitySchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrationtemplates/{integrationtemplatesId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrationtemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrationtemplates.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrationtemplates/{integrationtemplatesId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrationtemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrationtemplates.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:updateBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.updateBundle"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appsScriptProjects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appsScriptProjects:link","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects:link)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.link"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clients:deprovision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients:deprovision)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.clients.deprovision"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clients:provision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients:provision)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.clients.provision"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/cloudFunctions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloudFunctions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.cloudFunctions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:archive","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.archive"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:deactivate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.deactivate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.validate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:test","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::test)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.test"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/cloudFunctions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloudFunctions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.cloudFunctions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.cancel"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:archive","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.archive"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:deactivate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.deactivate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:takeoverEditLock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::takeoverEditLock)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.takeoverEditLock"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.validate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:archiveBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archiveBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.archiveBundle"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:test","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::test)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.test"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}:createBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::createBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.createBundle"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appsScriptProjects","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appsScriptProjects:link","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects:link)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.link"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:takeoverEditLock","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::takeoverEditLock)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.takeoverEditLock"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.cancel"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:takeoverEditLock","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::takeoverEditLock)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.takeoverEditLock"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrationtemplates/{integrationtemplatesId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrationtemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrationtemplates.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.create"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v2/companies/{companiesId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v2/jobs/{jobsId}","path_regex":"^(?:/v2/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3p1beta1/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3p1beta1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies/{companiesId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs/{jobsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.jobs","resource_name":"jobs.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/companies/{companiesId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/companies/{companiesId}/jobs","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.companies.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/jobs","path_regex":"^(?:/v2/jobs)$","service_name":"google.jobs","resource_name":"jobs.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/jobs/{jobsId}","path_regex":"^(?:/v2/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2:complete","path_regex":"^(?:/v2:complete)$","service_name":"google.jobs","resource_name":"jobs.complete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/companies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/jobs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}:complete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.jobs","resource_name":"jobs.projects.complete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/companies","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/jobs","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.operations.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}:complete","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.jobs","resource_name":"jobs.projects.complete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.operations.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies/{companiesId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs/{jobsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}:completeQuery","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.completeQuery"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v2/companies/{companiesId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v2/jobs/{jobsId}","path_regex":"^(?:/v2/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3p1beta1/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3p1beta1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies/{companiesId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs/{jobsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.jobs","resource_name":"jobs.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs","path_regex":"^(?:/v2/jobs)$","service_name":"google.jobs","resource_name":"jobs.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:batchDelete","path_regex":"^(?:/v2/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:deleteByFilter","path_regex":"^(?:/v2/jobs:deleteByFilter)$","service_name":"google.jobs","resource_name":"jobs.jobs.deleteByFilter"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:histogram","path_regex":"^(?:/v2/jobs:histogram)$","service_name":"google.jobs","resource_name":"jobs.jobs.histogram"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:search","path_regex":"^(?:/v2/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:searchForAlert","path_regex":"^(?:/v2/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.jobs.searchForAlert"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/clientEvents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientEvents)$","service_name":"google.jobs","resource_name":"jobs.projects.clientEvents.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/companies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs:batchDelete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs:search","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs:searchForAlert","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.searchForAlert"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/clientEvents","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientEvents)$","service_name":"google.jobs","resource_name":"jobs.projects.clientEvents.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/companies","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs:batchDelete","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs:search","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs:searchForAlert","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.searchForAlert"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/clientEvents","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientEvents)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.clientEvents.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:batchCreate","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchCreate)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.batchCreate"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:batchDelete","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:batchUpdate","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchUpdate)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.batchUpdate"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:search","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:searchForAlert","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.searchForAlert"},{"hostname":"keep.googleapis.com","http_method":"DELETE","path_template":"/v1/notes/{notesId}","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.keep","resource_name":"keep.notes.delete"},{"hostname":"keep.googleapis.com","http_method":"GET","path_template":"/v1/notes","path_regex":"^(?:/v1/notes)$","service_name":"google.keep","resource_name":"keep.notes.list"},{"hostname":"keep.googleapis.com","http_method":"GET","path_template":"/v1/notes/{notesId}","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.keep","resource_name":"keep.notes.get"},{"hostname":"keep.googleapis.com","http_method":"GET","path_template":"/v1/notes/{notesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.keep","resource_name":"keep.media.download"},{"hostname":"keep.googleapis.com","http_method":"POST","path_template":"/v1/notes","path_regex":"^(?:/v1/notes)$","service_name":"google.keep","resource_name":"keep.notes.create"},{"hostname":"keep.googleapis.com","http_method":"POST","path_template":"/v1/notes/{notesId}/permissions:batchCreate","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchCreate)$","service_name":"google.keep","resource_name":"keep.notes.permissions.batchCreate"},{"hostname":"keep.googleapis.com","http_method":"POST","path_template":"/v1/notes/{notesId}/permissions:batchDelete","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.keep","resource_name":"keep.notes.permissions.batchDelete"},{"hostname":"kgsearch.googleapis.com","http_method":"GET","path_template":"/v1/entities:search","path_regex":"^(?:/v1/entities:search)$","service_name":"google.kgsearch","resource_name":"kgsearch.entities.search"},{"hostname":"kmsinventory.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/protectedResources:search","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/protectedResources:search)$","service_name":"google.kmsinventory","resource_name":"kmsinventory.organizations.protectedResources.search"},{"hostname":"kmsinventory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/cryptoKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys)$","service_name":"google.kmsinventory","resource_name":"kmsinventory.projects.cryptoKeys.list"},{"hostname":"kmsinventory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/protectedResourcesSummary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/protectedResourcesSummary)$","service_name":"google.kmsinventory","resource_name":"kmsinventory.projects.locations.keyRings.cryptoKeys.getProtectedResourcesSummary"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeEntities","path_regex":"^(?:/v1/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeEntitySentiment","path_regex":"^(?:/v1/documents:analyzeEntitySentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeEntitySentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeSentiment","path_regex":"^(?:/v1/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeSyntax","path_regex":"^(?:/v1/documents:analyzeSyntax)$","service_name":"google.language","resource_name":"language.documents.analyzeSyntax"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:annotateText","path_regex":"^(?:/v1/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:classifyText","path_regex":"^(?:/v1/documents:classifyText)$","service_name":"google.language","resource_name":"language.documents.classifyText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:analyzeEntities","path_regex":"^(?:/v1beta1/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:analyzeSentiment","path_regex":"^(?:/v1beta1/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:analyzeSyntax","path_regex":"^(?:/v1beta1/documents:analyzeSyntax)$","service_name":"google.language","resource_name":"language.documents.analyzeSyntax"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:annotateText","path_regex":"^(?:/v1beta1/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeEntities","path_regex":"^(?:/v1beta2/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeEntitySentiment","path_regex":"^(?:/v1beta2/documents:analyzeEntitySentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeEntitySentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeSentiment","path_regex":"^(?:/v1beta2/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeSyntax","path_regex":"^(?:/v1beta2/documents:analyzeSyntax)$","service_name":"google.language","resource_name":"language.documents.analyzeSyntax"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:annotateText","path_regex":"^(?:/v1beta2/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:classifyText","path_regex":"^(?:/v1beta2/documents:classifyText)$","service_name":"google.language","resource_name":"language.documents.classifyText"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves","path_regex":"^(?:/v1/shelves)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.list"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves/{shelvesId}","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.get"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves/{shelvesId}/books","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.list"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves/{shelvesId}/books/{booksId}","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.get"},{"hostname":"libraryagent.googleapis.com","http_method":"POST","path_template":"/v1/shelves/{shelvesId}/books/{booksId}:borrow","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::borrow)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.borrow"},{"hostname":"libraryagent.googleapis.com","http_method":"POST","path_template":"/v1/shelves/{shelvesId}/books/{booksId}:return","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::return)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.return"},{"hostname":"licensing.googleapis.com","http_method":"DELETE","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.delete"},{"hostname":"licensing.googleapis.com","http_method":"GET","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.get"},{"hostname":"licensing.googleapis.com","http_method":"GET","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/users","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.listForProductAndSku"},{"hostname":"licensing.googleapis.com","http_method":"GET","path_template":"/apps/licensing/v1/product/{productId}/users","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.listForProduct"},{"hostname":"licensing.googleapis.com","http_method":"PATCH","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.patch"},{"hostname":"licensing.googleapis.com","http_method":"POST","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user)$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.insert"},{"hostname":"licensing.googleapis.com","http_method":"PUT","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.update"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.list"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.get"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.operations.list"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.operations.get"},{"hostname":"lifesciences.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.operations.cancel"},{"hostname":"lifesciences.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/pipelines:run","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines:run)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.pipelines.run"},{"hostname":"localservices.googleapis.com","http_method":"GET","path_template":"/v1/accountReports:search","path_regex":"^(?:/v1/accountReports:search)$","service_name":"google.localservices","resource_name":"localservices.accountReports.search"},{"hostname":"localservices.googleapis.com","http_method":"GET","path_template":"/v1/detailedLeadReports:search","path_regex":"^(?:/v1/detailedLeadReports:search)$","service_name":"google.localservices","resource_name":"localservices.detailedLeadReports.search"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/logs/{logsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/logs/{logsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/logs/{logsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/logs/{logsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/logs/{logsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/sinks/{sinksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices)$","service_name":"google.logging","resource_name":"logging.projects.logServices.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/indexes","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.logging","resource_name":"logging.projects.logServices.indexes.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logs","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.projects.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/cmekSettings","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.billingAccounts.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/logs","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.billingAccounts.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/settings","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.billingAccounts.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/cmekSettings","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.folders.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/exclusions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.folders.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.folders.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.folders.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/logs","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.folders.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/settings","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.folders.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/sinks","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.folders.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/monitoredResourceDescriptors","path_regex":"^(?:/v2/monitoredResourceDescriptors)$","service_name":"google.logging","resource_name":"logging.monitoredResourceDescriptors.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/cmekSettings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.organizations.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/exclusions","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.organizations.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.organizations.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/logs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.organizations.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/settings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.organizations.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/sinks","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.organizations.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/cmekSettings","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.projects.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/exclusions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.projects.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.projects.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.projects.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/logs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.projects.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/metrics","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/settings","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.projects.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/sinks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cmekSettings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/exclusions","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/operations","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/logs","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/settings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/sinks","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/sinks/{sinksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/monitoredResourceDescriptors","path_regex":"^(?:/v2beta1/monitoredResourceDescriptors)$","service_name":"google.logging","resource_name":"logging.monitoredResourceDescriptors.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/metrics","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/sinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/settings","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.folders.updateSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/cmekSettings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.organizations.updateCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/settings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.organizations.updateSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/cmekSettings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.updateCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/settings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.updateSettings"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/entries:write","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries:write)$","service_name":"google.logging","resource_name":"logging.projects.logs.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:copy","path_regex":"^(?:/v2/entries:copy)$","service_name":"google.logging","resource_name":"logging.entries.copy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:list","path_regex":"^(?:/v2/entries:list)$","service_name":"google.logging","resource_name":"logging.entries.list"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:tail","path_regex":"^(?:/v2/entries:tail)$","service_name":"google.logging","resource_name":"logging.entries.tail"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:write","path_regex":"^(?:/v2/entries:write)$","service_name":"google.logging","resource_name":"logging.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/exclusions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.folders.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.folders.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/sinks","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.folders.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/exclusions","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.organizations.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/sinks","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.organizations.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/exclusions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.projects.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.projects.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/metrics","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/sinks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/exclusions","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/sinks","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/entries:list","path_regex":"^(?:/v2beta1/entries:list)$","service_name":"google.logging","resource_name":"logging.entries.list"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/entries:write","path_regex":"^(?:/v2beta1/entries:write)$","service_name":"google.logging","resource_name":"logging.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/metrics","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/sinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/{v2Id}/{v2Id1}/sinks/{sinksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2beta1/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2beta1/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.update"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations/{sqlIntegrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations/{sqlIntegrationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations/{sqlIntegrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.updateLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.updateLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.updateLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:attachTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.attachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:detachTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.detachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:domainJoinMachine","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::domainJoinMachine)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.domainJoinMachine"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:extendSchema","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extendSchema)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.extendSchema"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:reconfigureTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reconfigureTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.reconfigureTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:resetAdminPassword","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAdminPassword)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.resetAdminPassword"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.restore"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:validateTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.validateTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:attachTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.attachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:checkMigrationPermission","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkMigrationPermission)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.checkMigrationPermission"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:detachTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.detachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:disableMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.disableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:domainJoinMachine","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::domainJoinMachine)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.domainJoinMachine"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:enableMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.enableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:extendSchema","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extendSchema)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.extendSchema"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:reconfigureTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reconfigureTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.reconfigureTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:resetAdminPassword","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAdminPassword)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.resetAdminPassword"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:restore","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.restore"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:validateTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.validateTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:attachTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.attachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:checkMigrationPermission","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkMigrationPermission)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.checkMigrationPermission"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:detachTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.detachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:disableMigration","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.disableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:domainJoinMachine","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::domainJoinMachine)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.domainJoinMachine"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:enableMigration","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.enableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:extendSchema","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extendSchema)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.extendSchema"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:reconfigureTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reconfigureTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.reconfigureTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:resetAdminPassword","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAdminPassword)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.resetAdminPassword"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:restore","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.restore"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:validateTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.validateTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.testIamPermissions"},{"hostname":"manufacturers.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications/{productCertificationsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.delete"},{"hostname":"manufacturers.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.delete"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications)$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.list"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications/{productCertificationsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.get"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/products","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.list"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.get"},{"hostname":"manufacturers.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications/{productCertificationsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.patch"},{"hostname":"manufacturers.googleapis.com","http_method":"PUT","path_template":"/v1/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.update"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.delete"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.delete"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.delete"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.delete"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.get"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.patch"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.updateParameters"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.patch"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateParameters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.updateParameters"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.create"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:applyParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.applyParameters"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.rescheduleMaintenance"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.cancel"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.create"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:applyParameters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.applyParameters"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:applySoftwareUpdate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applySoftwareUpdate)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.applySoftwareUpdate"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.rescheduleMaintenance"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.delete"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.patch"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:exportMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.exportMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.restore"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/{servicesId1}:removeIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.removeIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterLocation","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterLocation)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterLocation"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:exportMetadata","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.exportMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:moveTableToDatabase","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveTableToDatabase)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.moveTableToDatabase"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:queryMetadata","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.queryMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:restore","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.restore"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/{servicesId1}:removeIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.removeIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterLocation","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterLocation)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterLocation"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:exportMetadata","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.exportMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:moveTableToDatabase","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveTableToDatabase)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.moveTableToDatabase"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:queryMetadata","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.queryMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:restore","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.restore"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.testIamPermissions"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles/{importDataFilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports/{reportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles/{importDataFilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports/{reportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.getSettings"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.updateSettings"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:aggregateValues","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:aggregateValues)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.aggregateValues"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:batchDelete","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:batchDelete)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.batchDelete"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:batchUpdate","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:batchUpdate)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.batchUpdate"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:reportAssetFrames","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:reportAssetFrames)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.reportAssetFrames"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addAssets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addAssets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.addAssets"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeAssets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeAssets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.removeAssets"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}:run","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.run"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}:validate","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.validate"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.cancel"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.create"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.operations.delete"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.ml","resource_name":"ml.projects.locations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.ml","resource_name":"ml.projects.locations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.operations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ml","resource_name":"ml.projects.operations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ml","resource_name":"ml.projects.operations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.operations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.operations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}:getConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getConfig)$","service_name":"google.ml","resource_name":"ml.projects.getConfig"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}:getConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getConfig)$","service_name":"google.ml","resource_name":"ml.projects.getConfig"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.patch"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.jobs.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.jobs.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.jobs.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.jobs.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.locations.operations.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:addMeasurement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addMeasurement)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.addMeasurement"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:checkEarlyStoppingState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkEarlyStoppingState)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.checkEarlyStoppingState"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:complete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.complete"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.stop"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:listOptimalTrials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:listOptimalTrials)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.listOptimalTrials"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:suggest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:suggest)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.suggest"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}:setDefault","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefault)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.setDefault"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}:setDefault","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefault)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.setDefault"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.models.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.models.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.operations.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.operations.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:explain","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::explain)$","service_name":"google.ml","resource_name":"ml.projects.explain"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:predict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.ml","resource_name":"ml.projects.predict"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:predict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.ml","resource_name":"ml.projects.predict"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/global/metricsScopes/{metricsScopesId}/projects/{projectsId}","path_regex":"^(?:/v1/locations/global/metricsScopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.projects.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/dashboards/{dashboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/alertPolicies/{alertPoliciesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs/{uptimeCheckConfigsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives/{serviceLevelObjectivesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.delete"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/locations/global/metricsScopes/{metricsScopesId}","path_regex":"^(?:/v1/locations/global/metricsScopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/locations/global/metricsScopes:listMetricsScopesByMonitoredProject","path_regex":"^(?:/v1/locations/global/metricsScopes:listMetricsScopesByMonitoredProject)$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.listMetricsScopesByMonitoredProject"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.operations.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dashboards","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards)$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dashboards/{dashboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/label/{label}/values","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/label/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.label.values"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/labels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/labels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.labels.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/metadata)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.metadata.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/folders/{foldersId}/timeSeries","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.folders.timeSeries.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/organizations/{organizationsId}/timeSeries","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.organizations.timeSeries.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/alertPolicies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies)$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/alertPolicies/{alertPoliciesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/groups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/groups/{groupsId}/members","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.members.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/metricDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/monitoredResourceDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoredResourceDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.monitoredResourceDescriptors.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/monitoredResourceDescriptors/{monitoredResourceDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoredResourceDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.monitoredResourceDescriptors.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannelDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannelDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannelDescriptors.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannelDescriptors/{notificationChannelDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannelDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannelDescriptors.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannels","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/snoozes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes)$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/snoozes/{snoozesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/timeSeries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs)$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs/{uptimeCheckConfigsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/uptimeCheckIps","path_regex":"^(?:/v3/uptimeCheckIps)$","service_name":"google.monitoring","resource_name":"monitoring.uptimeCheckIps.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.monitoring","resource_name":"monitoring.services.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives)$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives/{serviceLevelObjectivesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.get"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/dashboards/{dashboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/alertPolicies/{alertPoliciesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/snoozes/{snoozesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs/{uptimeCheckConfigsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives/{serviceLevelObjectivesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.patch"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/locations/global/metricsScopes/{metricsScopesId}/projects","path_regex":"^(?:/v1/locations/global/metricsScopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.projects.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/dashboards","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards)$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/labels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/labels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.labels"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/query)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.query"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/query_exemplars","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/query_exemplars)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.query_exemplars"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/query_range","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/query_range)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.query_range"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/series","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/series)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.series"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/alertPolicies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies)$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/collectdTimeSeries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectdTimeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.projects.collectdTimeSeries.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/groups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/metricDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}:getVerificationCode","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getVerificationCode)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.getVerificationCode"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}:sendVerificationCode","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sendVerificationCode)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.sendVerificationCode"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}:verify","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.verify"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/snoozes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes)$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/timeSeries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/timeSeries:createService","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries:createService)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.createService"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/timeSeries:query","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries:query)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.query"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs)$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/{v3Id}/{v3Id1}/services","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.monitoring","resource_name":"monitoring.services.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives)$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.create"},{"hostname":"monitoring.googleapis.com","http_method":"PUT","path_template":"/v3/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.update"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/admins/{adminsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.delete"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/admins/{adminsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.delete"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts","path_regex":"^(?:/v1/accounts)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.get"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/admins","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/invitations","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.invitations.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/admins","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.patch"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/admins/{adminsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.patch"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/admins/{adminsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.patch"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts","path_regex":"^(?:/v1/accounts)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.create"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/admins","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.create"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/invitations/{invitationsId}:accept","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.invitations.accept"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/invitations/{invitationsId}:decline","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decline)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.invitations.decline"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/admins","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.create"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:transfer","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::transfer)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.transfer"},{"hostname":"mybusinessbusinesscalls.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/businesscallsinsights","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businesscallsinsights)$","service_name":"google.mybusinessbusinesscalls","resource_name":"mybusinessbusinesscalls.locations.businesscallsinsights.list"},{"hostname":"mybusinessbusinesscalls.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/businesscallssettings","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businesscallssettings)$","service_name":"google.mybusinessbusinesscalls","resource_name":"mybusinessbusinesscalls.locations.getBusinesscallssettings"},{"hostname":"mybusinessbusinesscalls.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/businesscallssettings","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businesscallssettings)$","service_name":"google.mybusinessbusinesscalls","resource_name":"mybusinessbusinesscalls.locations.updateBusinesscallssettings"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.delete"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/locations","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.accounts.locations.list"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/attributes","path_regex":"^(?:/v1/attributes)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.attributes.list"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/categories","path_regex":"^(?:/v1/categories)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.categories.list"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/categories:batchGet","path_regex":"^(?:/v1/categories:batchGet)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.categories.batchGet"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/chains/{chainsId}","path_regex":"^(?:/v1/chains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.chains.get"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/chains:search","path_regex":"^(?:/v1/chains:search)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.chains.search"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.get"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/attributes","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.getAttributes"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/attributes:getGoogleUpdated","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes:getGoogleUpdated)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.attributes.getGoogleUpdated"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}:getGoogleUpdated","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getGoogleUpdated)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.getGoogleUpdated"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.patch"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/attributes","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.updateAttributes"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/locations","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.accounts.locations.create"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"POST","path_template":"/v1/googleLocations:search","path_regex":"^(?:/v1/googleLocations:search)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.googleLocations.search"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:associate","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::associate)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.associate"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:clearLocationAssociation","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearLocationAssociation)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.clearLocationAssociation"},{"hostname":"mybusinesslodging.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/lodging","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lodging)$","service_name":"google.mybusinesslodging","resource_name":"mybusinesslodging.locations.getLodging"},{"hostname":"mybusinesslodging.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/lodging:getGoogleUpdated","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lodging:getGoogleUpdated)$","service_name":"google.mybusinesslodging","resource_name":"mybusinesslodging.locations.lodging.getGoogleUpdated"},{"hostname":"mybusinesslodging.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/lodging","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lodging)$","service_name":"google.mybusinesslodging","resource_name":"mybusinesslodging.locations.updateLodging"},{"hostname":"mybusinessnotifications.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/notificationSetting","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationSetting)$","service_name":"google.mybusinessnotifications","resource_name":"mybusinessnotifications.accounts.getNotificationSetting"},{"hostname":"mybusinessnotifications.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/notificationSetting","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationSetting)$","service_name":"google.mybusinessnotifications","resource_name":"mybusinessnotifications.accounts.updateNotificationSetting"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/placeActionLinks/{placeActionLinksId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.delete"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/placeActionLinks","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks)$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.list"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/placeActionLinks/{placeActionLinksId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.get"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"GET","path_template":"/v1/placeActionTypeMetadata","path_regex":"^(?:/v1/placeActionTypeMetadata)$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.placeActionTypeMetadata.list"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/placeActionLinks/{placeActionLinksId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.patch"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/placeActionLinks","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks)$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.create"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/questions/{questionsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.delete"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/questions/{questionsId}/answers:delete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers:delete)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.answers.delete"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/questions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.list"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/questions/{questionsId}/answers","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.answers.list"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/questions/{questionsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.patch"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/questions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.create"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/questions/{questionsId}/answers:upsert","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers:upsert)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.answers.upsert"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/VoiceOfMerchantState","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/VoiceOfMerchantState)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.getVoiceOfMerchantState"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/verifications","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifications)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.verifications.list"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/verifications/{verificationsId}:complete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.verifications.complete"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:fetchVerificationOptions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchVerificationOptions)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.fetchVerificationOptions"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:verify","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.verify"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/verificationTokens:generate","path_regex":"^(?:/v1/verificationTokens:generate)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.verificationTokens.generate"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.cancel"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.cancel"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.testIamPermissions"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.getIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.getIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.patch"},{"hostname":"networkmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.patch"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.create"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:rerun","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rerun)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.rerun"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.setIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.testIamPermissions"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.cancel"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.create"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:rerun","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rerun)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.rerun"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.setIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.testIamPermissions"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:listReferences","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listReferences)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.listReferences"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:listReferences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listReferences)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.listReferences"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.get"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:addItems","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.addItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:cloneItems","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cloneItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.cloneItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:removeItems","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.removeItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:addItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.addItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:cloneItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cloneItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.cloneItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:removeItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.removeItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.create"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheKeysets/{edgeCacheKeysetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheKeysets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheKeysets.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheOrigins/{edgeCacheOriginsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheOrigins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheOrigins.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheServices/{edgeCacheServicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheServices.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheKeysets/{edgeCacheKeysetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheKeysets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheKeysets.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheKeysets/{edgeCacheKeysetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheKeysets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheKeysets.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheOrigins/{edgeCacheOriginsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheOrigins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheOrigins.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheOrigins/{edgeCacheOriginsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheOrigins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheOrigins.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheServices/{edgeCacheServicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheServices.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheServices/{edgeCacheServicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheServices.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.cancel"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.cancel"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.create"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.delete"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getInstanceHealth","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getInstanceHealth)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getInstanceHealth"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:isUpgradeable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::isUpgradeable)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.isUpgradeable"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.getIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.get"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setAccelerator","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAccelerator)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setAccelerator"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setLabels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLabels)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setLabels"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setMachineType","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMachineType)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setMachineType"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateConfig)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.updateConfig"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateMetadataItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateMetadataItems)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.updateMetadataItems"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateShieldedInstanceConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateShieldedInstanceConfig)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.updateShieldedInstanceConfig"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.patch"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:diagnose","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.diagnose"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:report","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::report)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.report"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reportEvent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportEvent)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.reportEvent"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reset","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.reset"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.rollback"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.start"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.stop"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.testIamPermissions"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.upgrade"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgradeInternal","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeInternal)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.upgradeInternal"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances:register","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances:register)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.register"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.cancel"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:diagnose","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.diagnose"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:refreshRuntimeTokenInternal","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refreshRuntimeTokenInternal)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.refreshRuntimeTokenInternal"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:reportEvent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportEvent)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.reportEvent"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:reset","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.reset"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.setIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.start"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.stop"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:switch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::switch)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.switch"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.testIamPermissions"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.upgrade"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}:trigger","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::trigger)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.trigger"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.testIamPermissions"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.cancel"},{"hostname":"ondemandscanning.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.delete"},{"hostname":"ondemandscanning.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.delete"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.get"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scans/{scansId}/vulnerabilities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilities)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.vulnerabilities.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.get"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/scans/{scansId}/vulnerabilities","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilities)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.vulnerabilities.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.cancel"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.wait"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scans:analyzePackages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans:analyzePackages)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.analyzePackages"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.cancel"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.wait"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/scans:analyzePackages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans:analyzePackages)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.analyzePackages"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/policies/{policiesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/customConstraints/{customConstraintsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/policies/{policiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/constraints","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/constraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.constraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/policies","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/policies/{policiesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/policies/{policiesId}:getEffectivePolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectivePolicy)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.getEffectivePolicy"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/constraints","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/constraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.constraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/customConstraints","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/customConstraints/{customConstraintsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/policies","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}:getEffectivePolicy","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectivePolicy)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.getEffectivePolicy"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/constraints","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/constraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.constraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/policies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/policies/{policiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/policies/{policiesId}:getEffectivePolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectivePolicy)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.getEffectivePolicy"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/policies/{policiesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/customConstraints/{customConstraintsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/policies/{policiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/policies","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.create"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/customConstraints","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.create"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/policies","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.create"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/policies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.create"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/guestPolicies/{guestPoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventories)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventory","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/report","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/report)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/reports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReport","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReport)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.listRevisions"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchJobs/{patchJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchJobs/{patchJobsId}/instanceDetails","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceDetails)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.instanceDetails.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instanceOSPoliciesCompliances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceOSPoliciesCompliances)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instanceOSPoliciesCompliances.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instanceOSPoliciesCompliances/{instanceOSPoliciesCompliancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceOSPoliciesCompliances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instanceOSPoliciesCompliances.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventories","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventories)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventory","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/report","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/report)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/reports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReport","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReport)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}:listRevisions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.listRevisions"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/guestPolicies","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies)$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/guestPolicies/{guestPoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchJobs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchJobs/{patchJobsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchJobs/{patchJobsId}/instanceDetails","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceDetails)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.instanceDetails.list"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/guestPolicies/{guestPoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.pause"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.resume"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchJobs/{patchJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchJobs:execute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs:execute)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.execute"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/guestPolicies","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies)$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:pause","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.pause"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:resume","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.resume"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchJobs/{patchJobsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchJobs:execute","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs:execute)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.execute"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/zones/{zonesId}/instances/{instancesId}:lookupEffectiveGuestPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEffectiveGuestPolicy)$","service_name":"google.osconfig","resource_name":"osconfig.projects.zones.instances.lookupEffectiveGuestPolicy"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1/users/{usersId}/projects/{projectsId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/users/{usersId}/projects/{projectsId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/users/{usersId}/projects/{projectsId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.delete"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/loginProfile","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loginProfile)$","service_name":"google.oslogin","resource_name":"oslogin.users.getLoginProfile"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.get"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1alpha/users/{usersId}/loginProfile","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loginProfile)$","service_name":"google.oslogin","resource_name":"oslogin.users.getLoginProfile"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1alpha/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.get"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1beta/users/{usersId}/loginProfile","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loginProfile)$","service_name":"google.oslogin","resource_name":"oslogin.users.getLoginProfile"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1beta/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.get"},{"hostname":"oslogin.googleapis.com","http_method":"PATCH","path_template":"/v1/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.patch"},{"hostname":"oslogin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.patch"},{"hostname":"oslogin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.patch"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/sshPublicKeys","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys)$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.create"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}:importSshPublicKey","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.importSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1alpha/users/{usersId}/sshPublicKeys","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys)$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.create"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1alpha/users/{usersId}:importSshPublicKey","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.importSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1beta/users/{usersId}/sshPublicKeys","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys)$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.create"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1beta/users/{usersId}:importSshPublicKey","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.importSshPublicKey"},{"hostname":"pagespeedonline.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v5/runPagespeed","path_regex":"^(?:/pagespeedonline/v5/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"partners.googleapis.com","http_method":"DELETE","path_template":"/v2/users/{userId}/companyRelation","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companyRelation)$","service_name":"google.partners","resource_name":"partners.users.deleteCompanyRelation"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/analytics","path_regex":"^(?:/v2/analytics)$","service_name":"google.partners","resource_name":"partners.analytics.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.partners","resource_name":"partners.companies.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/companies/{companyId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.partners","resource_name":"partners.companies.get"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/leads","path_regex":"^(?:/v2/leads)$","service_name":"google.partners","resource_name":"partners.leads.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/offers","path_regex":"^(?:/v2/offers)$","service_name":"google.partners","resource_name":"partners.offers.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/offers/history","path_regex":"^(?:/v2/offers/history)$","service_name":"google.partners","resource_name":"partners.offers.history.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/partnersstatus","path_regex":"^(?:/v2/partnersstatus)$","service_name":"google.partners","resource_name":"partners.getPartnersstatus"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/userStates","path_regex":"^(?:/v2/userStates)$","service_name":"google.partners","resource_name":"partners.userStates.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/users/{userId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.partners","resource_name":"partners.users.get"},{"hostname":"partners.googleapis.com","http_method":"PATCH","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.partners","resource_name":"partners.updateCompanies"},{"hostname":"partners.googleapis.com","http_method":"PATCH","path_template":"/v2/leads","path_regex":"^(?:/v2/leads)$","service_name":"google.partners","resource_name":"partners.updateLeads"},{"hostname":"partners.googleapis.com","http_method":"PATCH","path_template":"/v2/users/profile","path_regex":"^(?:/v2/users/profile)$","service_name":"google.partners","resource_name":"partners.users.updateProfile"},{"hostname":"partners.googleapis.com","http_method":"POST","path_template":"/v2/clientMessages:log","path_regex":"^(?:/v2/clientMessages:log)$","service_name":"google.partners","resource_name":"partners.clientMessages.log"},{"hostname":"partners.googleapis.com","http_method":"POST","path_template":"/v2/companies/{companyId}/leads","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leads)$","service_name":"google.partners","resource_name":"partners.companies.leads.create"},{"hostname":"partners.googleapis.com","http_method":"POST","path_template":"/v2/userEvents:log","path_regex":"^(?:/v2/userEvents:log)$","service_name":"google.partners","resource_name":"partners.userEvents.log"},{"hostname":"partners.googleapis.com","http_method":"PUT","path_template":"/v2/users/{userId}/companyRelation","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companyRelation)$","service_name":"google.partners","resource_name":"partners.users.createCompanyRelation"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/products","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.products.list"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/promotions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.promotions.list"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.get"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/promotions:findEligible","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions:findEligible)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.promotions.findEligible"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.create"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:cancel","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.cancel"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:entitle","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::entitle)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.entitle"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:extend","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extend)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.extend"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:undoCancel","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undoCancel)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.undoCancel"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions:provision","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions:provision)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.provision"},{"hostname":"people.googleapis.com","http_method":"DELETE","path_template":"/v1/contactGroups/{contactGroupsId}","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.contactGroups.delete"},{"hostname":"people.googleapis.com","http_method":"DELETE","path_template":"/v1/people/{peopleId}:deleteContact","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteContact)$","service_name":"google.people","resource_name":"people.people.deleteContact"},{"hostname":"people.googleapis.com","http_method":"DELETE","path_template":"/v1/people/{peopleId}:deleteContactPhoto","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteContactPhoto)$","service_name":"google.people","resource_name":"people.people.deleteContactPhoto"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/contactGroups","path_regex":"^(?:/v1/contactGroups)$","service_name":"google.people","resource_name":"people.contactGroups.list"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/contactGroups/{contactGroupsId}","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.contactGroups.get"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/contactGroups:batchGet","path_regex":"^(?:/v1/contactGroups:batchGet)$","service_name":"google.people","resource_name":"people.contactGroups.batchGet"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/otherContacts","path_regex":"^(?:/v1/otherContacts)$","service_name":"google.people","resource_name":"people.otherContacts.list"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/otherContacts:search","path_regex":"^(?:/v1/otherContacts:search)$","service_name":"google.people","resource_name":"people.otherContacts.search"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people/{peopleId}","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.people.get"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people/{peopleId}/connections","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.people","resource_name":"people.people.connections.list"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:batchGet","path_regex":"^(?:/v1/people:batchGet)$","service_name":"google.people","resource_name":"people.people.getBatchGet"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:listDirectoryPeople","path_regex":"^(?:/v1/people:listDirectoryPeople)$","service_name":"google.people","resource_name":"people.people.listDirectoryPeople"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:searchContacts","path_regex":"^(?:/v1/people:searchContacts)$","service_name":"google.people","resource_name":"people.people.searchContacts"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:searchDirectoryPeople","path_regex":"^(?:/v1/people:searchDirectoryPeople)$","service_name":"google.people","resource_name":"people.people.searchDirectoryPeople"},{"hostname":"people.googleapis.com","http_method":"PATCH","path_template":"/v1/people/{peopleId}:updateContact","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateContact)$","service_name":"google.people","resource_name":"people.people.updateContact"},{"hostname":"people.googleapis.com","http_method":"PATCH","path_template":"/v1/people/{peopleId}:updateContactPhoto","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateContactPhoto)$","service_name":"google.people","resource_name":"people.people.updateContactPhoto"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/contactGroups","path_regex":"^(?:/v1/contactGroups)$","service_name":"google.people","resource_name":"people.contactGroups.create"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/contactGroups/{contactGroupsId}/members:modify","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members:modify)$","service_name":"google.people","resource_name":"people.contactGroups.members.modify"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/otherContacts/{otherContactsId}:copyOtherContactToMyContactsGroup","path_regex":"^(?:/v1/otherContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::copyOtherContactToMyContactsGroup)$","service_name":"google.people","resource_name":"people.otherContacts.copyOtherContactToMyContactsGroup"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:batchCreateContacts","path_regex":"^(?:/v1/people:batchCreateContacts)$","service_name":"google.people","resource_name":"people.people.batchCreateContacts"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:batchDeleteContacts","path_regex":"^(?:/v1/people:batchDeleteContacts)$","service_name":"google.people","resource_name":"people.people.batchDeleteContacts"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:batchUpdateContacts","path_regex":"^(?:/v1/people:batchUpdateContacts)$","service_name":"google.people","resource_name":"people.people.batchUpdateContacts"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:createContact","path_regex":"^(?:/v1/people:createContact)$","service_name":"google.people","resource_name":"people.people.createContact"},{"hostname":"people.googleapis.com","http_method":"PUT","path_template":"/v1/contactGroups/{contactGroupsId}","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.contactGroups.update"},{"hostname":"playablelocations.googleapis.com","http_method":"POST","path_template":"/v3:logImpressions","path_regex":"^(?:/v3:logImpressions)$","service_name":"google.playablelocations","resource_name":"playablelocations.logImpressions"},{"hostname":"playablelocations.googleapis.com","http_method":"POST","path_template":"/v3:logPlayerReports","path_regex":"^(?:/v3:logPlayerReports)$","service_name":"google.playablelocations","resource_name":"playablelocations.logPlayerReports"},{"hostname":"playablelocations.googleapis.com","http_method":"POST","path_template":"/v3:samplePlayableLocations","path_regex":"^(?:/v3:samplePlayableLocations)$","service_name":"google.playablelocations","resource_name":"playablelocations.samplePlayableLocations"},{"hostname":"playcustomapp.googleapis.com","http_method":"POST","path_template":"/playcustomapp/v1/accounts/{account}/customApps","path_regex":"^(?:/playcustomapp/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customApps)$","service_name":"google.playcustomapp","resource_name":"playcustomapp.accounts.customApps.create"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/anomalies","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anomalies)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.anomalies.list"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/anrRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/crashRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/errorCountMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/errorIssues:search","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorIssues:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.issues.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/errorReports:search","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorReports:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.reports.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/excessiveWakeupRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/slowRenderingRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/slowStartRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/anomalies","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anomalies)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.anomalies.list"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/anrRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/crashRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/errorCountMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/errorIssues:search","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorIssues:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.issues.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/errorReports:search","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorReports:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.reports.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/excessiveWakeupRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/slowRenderingRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/slowStartRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/anrRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/crashRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/errorCountMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/excessiveWakeupRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/slowRenderingRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/slowStartRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/anrRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/crashRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/errorCountMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/excessiveWakeupRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/slowRenderingRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/slowStartRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.query"},{"hostname":"playintegrity.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:decodeIntegrityToken","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decodeIntegrityToken)$","service_name":"google.playintegrity","resource_name":"playintegrity.decodeIntegrityToken"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/avails","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/avails)$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.avails.list"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/avails/{availId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/avails/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.avails.get"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/orders","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.orders.list"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/orders/{orderId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.orders.get"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/storeInfos","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeInfos)$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.storeInfos.list"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/storeInfos/{videoId}/country/{country}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeInfos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/country/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.storeInfos.country.get"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.projects.locations.activityTypes.activities.query"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.projects.locations.activityTypes.activities.query"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/operations","path_regex":"^(?:/v1alpha/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/operations/{operationsId}","path_regex":"^(?:/v1alpha/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/operations","path_regex":"^(?:/v1beta/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/operations/{operationsId}","path_regex":"^(?:/v1beta/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.create"},{"hostname":"policytroubleshooter.googleapis.com","http_method":"POST","path_template":"/v1/iam:troubleshoot","path_regex":"^(?:/v1/iam:troubleshoot)$","service_name":"google.policytroubleshooter","resource_name":"policytroubleshooter.iam.troubleshoot"},{"hostname":"policytroubleshooter.googleapis.com","http_method":"POST","path_template":"/v1beta/iam:troubleshoot","path_regex":"^(?:/v1beta/iam:troubleshoot)$","service_name":"google.policytroubleshooter","resource_name":"policytroubleshooter.iam.troubleshoot"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/assets","path_regex":"^(?:/v1/assets)$","service_name":"google.poly","resource_name":"poly.assets.list"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/assets/{assetsId}","path_regex":"^(?:/v1/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.poly","resource_name":"poly.assets.get"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/assets","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.poly","resource_name":"poly.users.assets.list"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/likedassets","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/likedassets)$","service_name":"google.poly","resource_name":"poly.users.likedassets.list"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.delete"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:fetch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetch)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.fetch"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.certificateRevocationLists.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reusableConfigs/{reusableConfigsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reusableConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.reusableConfigs.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.patch"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:activate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.activate"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.disable"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.enable"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.undelete"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates/{certificatesId}:revoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.revoke"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:fetchCaCerts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchCaCerts)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.fetchCaCerts"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.cancel"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.certificateRevocationLists.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.certificateRevocationLists.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.cancel"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reusableConfigs/{reusableConfigsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reusableConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.reusableConfigs.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reusableConfigs/{reusableConfigsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reusableConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.reusableConfigs.testIamPermissions"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers","path_regex":"^(?:/v1alpha1/customers)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.updateSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.updateSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.updateSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.signDevice"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.deployments.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:provisionDeployment","path_regex":"^(?:/v1alpha1/customers:provisionDeployment)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.provisionDeployment"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.signDevice"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:generateSecret","path_regex":"^(?:/v1alpha1/installer:generateSecret)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.installer.generateSecret"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:validate","path_regex":"^(?:/v1alpha1/installer:validate)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.installer.validate"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.signDevice"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.deployments.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:get","path_regex":"^(?:/v1alpha1/policies:get)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.policies.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:set","path_regex":"^(?:/v1alpha1/policies:set)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.policies.set"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:test","path_regex":"^(?:/v1alpha1/policies:test)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.policies.test"},{"hostname":"proximitybeacon.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/beacons/{beaconsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.delete"},{"hostname":"proximitybeacon.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/beacons/{beaconsId}/attachments/{attachmentsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.delete"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons","path_regex":"^(?:/v1beta1/beacons)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons/{beaconsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.get"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons/{beaconsId}/attachments","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons/{beaconsId}/diagnostics","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diagnostics)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.diagnostics.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/eidparams","path_regex":"^(?:/v1beta1/eidparams)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.getEidparams"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/namespaces","path_regex":"^(?:/v1beta1/namespaces)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.namespaces.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beaconinfo:getforobserved","path_regex":"^(?:/v1beta1/beaconinfo:getforobserved)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beaconinfo.getforobserved"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}/attachments","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.create"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}/attachments:batchDelete","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments:batchDelete)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.batchDelete"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}:activate","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.activate"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}:deactivate","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.deactivate"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}:decommission","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decommission)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.decommission"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons:register","path_regex":"^(?:/v1beta1/beacons:register)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.register"},{"hostname":"proximitybeacon.googleapis.com","http_method":"PUT","path_template":"/v1beta1/beacons/{beaconsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.update"},{"hostname":"proximitybeacon.googleapis.com","http_method":"PUT","path_template":"/v1beta1/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.namespaces.update"},{"hostname":"publicca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/externalAccountKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccountKeys)$","service_name":"google.publicca","resource_name":"publicca.projects.locations.externalAccountKeys.create"},{"hostname":"publicca.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/externalAccountKeys","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccountKeys)$","service_name":"google.publicca","resource_name":"publicca.projects.locations.externalAccountKeys.create"},{"hostname":"publicca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/externalAccountKeys","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccountKeys)$","service_name":"google.publicca","resource_name":"publicca.projects.locations.externalAccountKeys.create"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.deleteRevision"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1a/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta1a/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1a/topics/{topicsId}","path_regex":"^(?:/v1beta1a/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.topics.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.delete"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.listRevisions"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/subscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.snapshots.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}/subscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/subscriptions","path_regex":"^(?:/v1beta1a/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta1a/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/topics","path_regex":"^(?:/v1beta1a/topics)$","service_name":"google.pubsub","resource_name":"pubsub.topics.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/topics/{topicsId}","path_regex":"^(?:/v1beta1a/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.topics.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/subscriptions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}/subscriptions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.patch"},{"hostname":"pubsub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.patch"},{"hostname":"pubsub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.patch"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.create"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.commit"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.rollback"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas:validate)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.validate"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas:validateMessage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas:validateMessage)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.validateMessage"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.acknowledge"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:detach","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detach)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.detach"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAckDeadline)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyAckDeadline"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyPushConfig)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyPushConfig"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:pull","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pull)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.pull"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:seek","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::seek)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.seek"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:publish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.publish"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions","path_regex":"^(?:/v1beta1a/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.create"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/acknowledge","path_regex":"^(?:/v1beta1a/subscriptions/acknowledge)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.acknowledge"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/modifyAckDeadline","path_regex":"^(?:/v1beta1a/subscriptions/modifyAckDeadline)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.modifyAckDeadline"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/modifyPushConfig","path_regex":"^(?:/v1beta1a/subscriptions/modifyPushConfig)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.modifyPushConfig"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/pull","path_regex":"^(?:/v1beta1a/subscriptions/pull)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.pull"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/pullBatch","path_regex":"^(?:/v1beta1a/subscriptions/pullBatch)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.pullBatch"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/topics","path_regex":"^(?:/v1beta1a/topics)$","service_name":"google.pubsub","resource_name":"pubsub.topics.create"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/topics/publish","path_regex":"^(?:/v1beta1a/topics/publish)$","service_name":"google.pubsub","resource_name":"pubsub.topics.publish"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/topics/publishBatch","path_regex":"^(?:/v1beta1a/topics/publishBatch)$","service_name":"google.pubsub","resource_name":"pubsub.topics.publishBatch"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.acknowledge"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAckDeadline)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyAckDeadline"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyPushConfig)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyPushConfig"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:pull","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pull)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.pull"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:publish","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.publish"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.create"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/topics","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.topics.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}/partitions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.getPartitions"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}/subscriptions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.subscriptions.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/cursor/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}/cursors","path_regex":"^(?:/v1/cursor/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cursors)$","service_name":"google.pubsublite","resource_name":"pubsublite.cursor.projects.locations.subscriptions.cursors.list"},{"hostname":"pubsublite.googleapis.com","http_method":"PATCH","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.patch"},{"hostname":"pubsublite.googleapis.com","http_method":"PATCH","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.patch"},{"hostname":"pubsublite.googleapis.com","http_method":"PATCH","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.patch"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.cancel"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.create"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.create"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:seek","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::seek)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.seek"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.create"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/cursor/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:commitCursor","path_regex":"^(?:/v1/cursor/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commitCursor)$","service_name":"google.pubsublite","resource_name":"pubsublite.cursor.projects.locations.subscriptions.commitCursor"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/topicStats/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}:computeHeadCursor","path_regex":"^(?:/v1/topicStats/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeHeadCursor)$","service_name":"google.pubsublite","resource_name":"pubsublite.topicStats.projects.locations.topics.computeHeadCursor"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/topicStats/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}:computeMessageStats","path_regex":"^(?:/v1/topicStats/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeMessageStats)$","service_name":"google.pubsublite","resource_name":"pubsublite.topicStats.projects.locations.topics.computeMessageStats"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/topicStats/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}:computeTimeCursor","path_regex":"^(?:/v1/topicStats/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeTimeCursor)$","service_name":"google.pubsublite","resource_name":"pubsublite.topicStats.projects.locations.topics.computeTimeCursor"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"DELETE","path_template":"/v1/publications/{publicationsId}/readers/{readersId}","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.delete"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"GET","path_template":"/v1/publications/{publicationsId}/readers/{readersId}","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.get"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"GET","path_template":"/v1/publications/{publicationsId}/readers/{readersId}/entitlements","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.getEntitlements"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"PATCH","path_template":"/v1/publications/{publicationsId}/readers/{readersId}/entitlements","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.updateEntitlements"},{"hostname":"realtimebidding.googleapis.com","http_method":"DELETE","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.delete"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders","path_regex":"^(?:/v1/bidders)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/creatives","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.creatives.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/endpoints","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.endpoints.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.endpoints.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/publisherConnections","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/publisherConnections/{publisherConnectionsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers","path_regex":"^(?:/v1/buyers)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/creatives","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/creatives/{creativesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/userLists","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}:getRemarketingTag","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getRemarketingTag)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.getRemarketingTag"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}:getRemarketingTag","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getRemarketingTag)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.getRemarketingTag"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"PATCH","path_template":"/v1/bidders/{biddersId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.endpoints.patch"},{"hostname":"realtimebidding.googleapis.com","http_method":"PATCH","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.patch"},{"hostname":"realtimebidding.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/creatives/{creativesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.patch"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/creatives:watch","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives:watch)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.creatives.watch"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:activate","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.activate"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:addTargetedApps","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargetedApps)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.addTargetedApps"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:addTargetedPublishers","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargetedPublishers)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.addTargetedPublishers"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:addTargetedSites","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargetedSites)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.addTargetedSites"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:removeTargetedApps","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeTargetedApps)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.removeTargetedApps"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:removeTargetedPublishers","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeTargetedPublishers)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.removeTargetedPublishers"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:removeTargetedSites","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeTargetedSites)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.removeTargetedSites"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:suspend","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::suspend)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.suspend"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/publisherConnections:batchApprove","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections:batchApprove)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.batchApprove"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/publisherConnections:batchReject","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections:batchReject)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.batchReject"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/creatives","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/userLists","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}:close","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.close"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}:open","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::open)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.open"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions/{biddingFunctionsId}:activate","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.activate"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions/{biddingFunctionsId}:archive","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.archive"},{"hostname":"realtimebidding.googleapis.com","http_method":"PUT","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.update"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/firewallpolicies/{firewallpoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.delete"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.delete"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/firewallpolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/firewallpolicies/{firewallpoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.get"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.get"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys/{keysId}/metrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.getMetrics"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys/{keysId}:retrieveLegacySecretKey","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveLegacySecretKey)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.retrieveLegacySecretKey"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/relatedaccountgroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/relatedaccountgroups)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.relatedaccountgroups.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/relatedaccountgroups/{relatedaccountgroupsId}/memberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/relatedaccountgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.relatedaccountgroups.memberships.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/firewallpolicies/{firewallpoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.patch"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.patch"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/assessments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assessments)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.assessments.create"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/assessments/{assessmentsId}:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assessments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::annotate)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.assessments.annotate"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/firewallpolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.create"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.create"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/keys/{keysId}:migrate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::migrate)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.migrate"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/relatedaccountgroupmemberships:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/relatedaccountgroupmemberships:search)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.relatedaccountgroupmemberships.search"},{"hostname":"recommendationengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems/{catalogItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.delete"},{"hostname":"recommendationengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/predictionApiKeyRegistrations/{predictionApiKeyRegistrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/predictionApiKeyRegistrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.predictionApiKeyRegistrations.delete"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems/{catalogItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.get"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.operations.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.operations.get"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/predictionApiKeyRegistrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/predictionApiKeyRegistrations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.predictionApiKeyRegistrations.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:collect","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.collect"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.operations.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.operations.get"},{"hostname":"recommendationengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.patch"},{"hostname":"recommendationengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems/{catalogItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.patch"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.create"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems:import)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.import"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/placements/{placementsId}:predict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.placements.predict"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/predictionApiKeyRegistrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/predictionApiKeyRegistrations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.predictionApiKeyRegistrations.create"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.import"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.purge"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:rejoin","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.rejoin"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:write","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.write"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markSucceeded"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.delete"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.redis","resource_name":"redis.projects.locations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/authString","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authString)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.getAuthString"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.redis","resource_name":"redis.projects.locations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/authString","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authString)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.getAuthString"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.get"},{"hostname":"redis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.patch"},{"hostname":"redis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.patch"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.create"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.export"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:failover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.failover"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.import"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.rescheduleMaintenance"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.upgrade"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.cancel"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.create"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.export"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:failover","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.failover"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.import"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.rescheduleMaintenance"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.upgrade"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.cancel"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.delete"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.media.download"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.list"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.operations.get"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/actionResults/{hash}/{sizeBytes}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actionResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.actionResults.get"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/blobs/{hash}/{sizeBytes}:getTree","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getTree)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.getTree"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/capabilities","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capabilities)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.getCapabilities"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.media.upload"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.cancel"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/operations/{operationsId}:waitExecution","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::waitExecution)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.waitExecution"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/actions:execute","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions:execute)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.actions.execute"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/blobs:batchRead","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs:batchRead)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.batchRead"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/blobs:batchUpdate","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs:batchUpdate)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.batchUpdate"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/blobs:findMissing","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs:findMissing)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.findMissing"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"PUT","path_template":"/v2/{v2Id}/actionResults/{hash}/{sizeBytes}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actionResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.actionResults.update"},{"hostname":"reseller.googleapis.com","http_method":"DELETE","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.subscriptions.delete"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/customers/{customerId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.customers.get"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.subscriptions.get"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/resellernotify/getwatchdetails","path_regex":"^(?:/apps/reseller/v1/resellernotify/getwatchdetails)$","service_name":"google.reseller","resource_name":"reseller.resellernotify.getwatchdetails"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/subscriptions","path_regex":"^(?:/apps/reseller/v1/subscriptions)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.list"},{"hostname":"reseller.googleapis.com","http_method":"PATCH","path_template":"/apps/reseller/v1/customers/{customerId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.customers.patch"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers","path_regex":"^(?:/apps/reseller/v1/customers)$","service_name":"google.reseller","resource_name":"reseller.customers.insert"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.insert"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/activate","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activate)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.activate"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changePlan","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changePlan)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.changePlan"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changeRenewalSettings","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeRenewalSettings)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.changeRenewalSettings"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changeSeats","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeSeats)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.changeSeats"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/startPaidService","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startPaidService)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.startPaidService"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/suspend","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.suspend"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/resellernotify/register","path_regex":"^(?:/apps/reseller/v1/resellernotify/register)$","service_name":"google.reseller","resource_name":"reseller.resellernotify.register"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/resellernotify/unregister","path_regex":"^(?:/apps/reseller/v1/resellernotify/unregister)$","service_name":"google.reseller","resource_name":"reseller.resellernotify.unregister"},{"hostname":"reseller.googleapis.com","http_method":"PUT","path_template":"/apps/reseller/v1/customers/{customerId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.customers.update"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/settings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.resourcesettings","resource_name":"resourcesettings.folders.settings.list"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/settings/{settingsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.folders.settings.get"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/settings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.resourcesettings","resource_name":"resourcesettings.organizations.settings.list"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/settings/{settingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.organizations.settings.get"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.resourcesettings","resource_name":"resourcesettings.projects.settings.list"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/settings/{settingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.projects.settings.get"},{"hostname":"resourcesettings.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/settings/{settingsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.folders.settings.patch"},{"hostname":"resourcesettings.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/settings/{settingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.organizations.settings.patch"},{"hostname":"resourcesettings.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/settings/{settingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.projects.settings.patch"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/merchantCenterAccountLinks/{merchantCenterAccountLinksId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantCenterAccountLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.merchantCenterAccountLinks.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.delete"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:collect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.collect"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completeQuery"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/places/{placesId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/places/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.places.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/merchantCenterAccountLinks","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantCenterAccountLinks)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.merchantCenterAccountLinks.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:collect","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.collect"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completeQuery"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:collect","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.collect"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completeQuery"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.operations.get"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.patch"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:addCatalogAttribute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:addCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.addCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:removeCatalogAttribute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:removeCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.removeCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:replaceCatalogAttribute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:replaceCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.replaceCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addLocalInventories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeLocalInventories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInventory)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.setInventory"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionData:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completionData.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:pause","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.pause"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:resume","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.resume"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:tune","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.tune"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:predict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:addControl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.addControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:predict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:removeControl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.removeControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:purge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:rejoin","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.rejoin"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:write","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.write"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.setDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:addCatalogAttribute","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:addCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.addCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:batchRemoveCatalogAttributes","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:batchRemoveCatalogAttributes)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.batchRemoveCatalogAttributes"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:removeCatalogAttribute","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:removeCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.removeCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:replaceCatalogAttribute","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:replaceCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.replaceCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addLocalInventories","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeLocalInventories","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInventory)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.setInventory"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:import","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:purge","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionData:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completionData.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/merchantCenterAccountLinks","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantCenterAccountLinks)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.merchantCenterAccountLinks.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:pause","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.pause"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:resume","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.resume"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:tune","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.tune"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:predict","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:addControl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.addControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:predict","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:removeControl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.removeControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:import","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:purge","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:rejoin","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.rejoin"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:write","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.write"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.setDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:addCatalogAttribute","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:addCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.addCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:batchRemoveCatalogAttributes","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:batchRemoveCatalogAttributes)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.batchRemoveCatalogAttributes"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:removeCatalogAttribute","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:removeCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.removeCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:replaceCatalogAttribute","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:replaceCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.replaceCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addLocalInventories","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeLocalInventories","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInventory)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.setInventory"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:import","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionData:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completionData.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:pause","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.pause"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:resume","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.resume"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:tune","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.tune"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:predict","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:addControl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.addControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:predict","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:removeControl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.removeControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:import","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:purge","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:rejoin","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.rejoin"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:write","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.write"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.setDefaultBranch"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions/{executionsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.executions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/revisions/{revisionsId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.revisions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.services.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.revisions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.operations.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions/{revisionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.delete"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions","path_regex":"^(?:/apis/apiextensions\\.k8s\\.io/v1beta1/customresourcedefinitions)$","service_name":"google.run","resource_name":"run.customresourcedefinitions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/apiextensions.k8s.io/v1beta1/namespaces/{namespacesId}/customresourcedefinitions/{customresourcedefinitionsId}","path_regex":"^(?:/apis/apiextensions\\.k8s\\.io/v1beta1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customresourcedefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.customresourcedefinitions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/authorizeddomains","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizeddomains)$","service_name":"google.run","resource_name":"run.namespaces.authorizeddomains.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.run","resource_name":"run.namespaces.executions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions/{executionsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.executions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/tasks","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.run","resource_name":"run.namespaces.tasks.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/tasks/{tasksId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.tasks.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/configurations","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.run","resource_name":"run.namespaces.configurations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/configurations/{configurationsId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.configurations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/revisions","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.run","resource_name":"run.namespaces.revisions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/revisions/{revisionsId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.revisions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/routes","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.run","resource_name":"run.namespaces.routes.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/routes/{routesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.routes.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.namespaces.services.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.services.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/authorizeddomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizeddomains)$","service_name":"google.run","resource_name":"run.projects.authorizeddomains.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.run","resource_name":"run.projects.locations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizeddomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizeddomains)$","service_name":"google.run","resource_name":"run.projects.locations.authorizeddomains.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/configurations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.run","resource_name":"run.projects.locations.configurations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/configurations/{configurationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.configurations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/revisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.run","resource_name":"run.projects.locations.revisions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.revisions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.run","resource_name":"run.projects.locations.routes.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.routes.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customresourcedefinitions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customresourcedefinitions)$","service_name":"google.run","resource_name":"run.projects.locations.customresourcedefinitions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customresourcedefinitions/{customresourcedefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customresourcedefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.customresourcedefinitions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}/tasks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.tasks.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}/tasks/{tasksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.tasks.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.run","resource_name":"run.projects.locations.operations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.operations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions/{revisionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.patch"},{"hostname":"run.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.patch"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions/{executionsId}:cancel","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.run","resource_name":"run.namespaces.executions.cancel"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}:run","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.run","resource_name":"run.namespaces.jobs.run"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.namespaces.services.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.services.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:run","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.run"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.run","resource_name":"run.projects.locations.operations.wait"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.services.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"PUT","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.replaceJob"},{"hostname":"run.googleapis.com","http_method":"PUT","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.services.replaceService"},{"hostname":"run.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.replaceService"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.operations.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.operations.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.operations.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.getIamPolicy"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.operations.cancel"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.create"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.operations.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.create"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:watch","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::watch)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.watch"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.create"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.setIamPolicy"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.update"},{"hostname":"runtimeconfig.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.update"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v4/encodedFullHashes/{encodedRequest}","path_regex":"^(?:/v4/encodedFullHashes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.safebrowsing","resource_name":"safebrowsing.encodedFullHashes.get"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v4/encodedUpdates/{encodedRequest}","path_regex":"^(?:/v4/encodedUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.safebrowsing","resource_name":"safebrowsing.encodedUpdates.get"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v4/threatLists","path_regex":"^(?:/v4/threatLists)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatLists.list"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/fullHashes:find","path_regex":"^(?:/v4/fullHashes:find)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.fullHashes.find"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/threatHits","path_regex":"^(?:/v4/threatHits)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatHits.create"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/threatListUpdates:fetch","path_regex":"^(?:/v4/threatListUpdates:fetch)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatListUpdates.fetch"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/threatMatches:find","path_regex":"^(?:/v4/threatMatches:find)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatMatches.find"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.delete"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers","path_regex":"^(?:/v1alpha1/customers)$","service_name":"google.sasportal","resource_name":"sasportal.customers.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.updateSigned"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.updateSigned"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.updateSigned"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.patch"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.signDevice"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.deployments.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:provisionDeployment","path_regex":"^(?:/v1alpha1/customers:provisionDeployment)$","service_name":"google.sasportal","resource_name":"sasportal.customers.provisionDeployment"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.signDevice"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:generateSecret","path_regex":"^(?:/v1alpha1/installer:generateSecret)$","service_name":"google.sasportal","resource_name":"sasportal.installer.generateSecret"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:validate","path_regex":"^(?:/v1alpha1/installer:validate)$","service_name":"google.sasportal","resource_name":"sasportal.installer.validate"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.signDevice"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.deployments.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:get","path_regex":"^(?:/v1alpha1/policies:get)$","service_name":"google.sasportal","resource_name":"sasportal.policies.get"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:set","path_regex":"^(?:/v1alpha1/policies:set)$","service_name":"google.sasportal","resource_name":"sasportal.policies.set"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:test","path_regex":"^(?:/v1alpha1/policies:test)$","service_name":"google.sasportal","resource_name":"sasportal.policies.test"},{"hostname":"script.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{scriptId}/deployments/{deploymentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.deployments.delete"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/processes","path_regex":"^(?:/v1/processes)$","service_name":"google.script","resource_name":"script.processes.list"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/processes:listScriptProcesses","path_regex":"^(?:/v1/processes:listScriptProcesses)$","service_name":"google.script","resource_name":"script.processes.listScriptProcesses"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.get"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.script","resource_name":"script.projects.getContent"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.script","resource_name":"script.projects.deployments.list"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/deployments/{deploymentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.deployments.get"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/metrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.script","resource_name":"script.projects.getMetrics"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.script","resource_name":"script.projects.versions.list"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/versions/{versionNumber}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.versions.get"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.script","resource_name":"script.projects.create"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/projects/{scriptId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.script","resource_name":"script.projects.deployments.create"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/projects/{scriptId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.script","resource_name":"script.projects.versions.create"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/scripts/{scriptId}:run","path_regex":"^(?:/v1/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.script","resource_name":"script.scripts.run"},{"hostname":"script.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{scriptId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.script","resource_name":"script.projects.updateContent"},{"hostname":"script.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{scriptId}/deployments/{deploymentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.deployments.update"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/customers/{customersId}/customColumns","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customColumns)$","service_name":"google.searchads360","resource_name":"searchads360.customers.customColumns.list"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/customers/{customersId}/customColumns/{customColumnsId}","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customColumns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchads360","resource_name":"searchads360.customers.customColumns.get"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/searchAds360Fields/{searchAds360FieldsId}","path_regex":"^(?:/v0/searchAds360Fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchads360","resource_name":"searchads360.searchAds360Fields.get"},{"hostname":"searchads360.googleapis.com","http_method":"POST","path_template":"/v0/customers/{customersId}/searchAds360:search","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360:search)$","service_name":"google.searchads360","resource_name":"searchads360.customers.searchAds360.search"},{"hostname":"searchads360.googleapis.com","http_method":"POST","path_template":"/v0/customers/{customersId}/searchAds360:searchStream","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360:searchStream)$","service_name":"google.searchads360","resource_name":"searchads360.customers.searchAds360.searchStream"},{"hostname":"searchads360.googleapis.com","http_method":"POST","path_template":"/v0/searchAds360Fields:search","path_regex":"^(?:/v0/searchAds360Fields:search)$","service_name":"google.searchads360","resource_name":"searchads360.searchAds360Fields.search"},{"hostname":"searchconsole.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sites.delete"},{"hostname":"searchconsole.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.delete"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites","path_regex":"^(?:/webmasters/v3/sites)$","service_name":"google.searchconsole","resource_name":"webmasters.sites.list"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sites.get"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps)$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.list"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.get"},{"hostname":"searchconsole.googleapis.com","http_method":"POST","path_template":"/v1/urlInspection/index:inspect","path_regex":"^(?:/v1/urlInspection/index:inspect)$","service_name":"google.searchconsole","resource_name":"searchconsole.urlInspection.index.inspect"},{"hostname":"searchconsole.googleapis.com","http_method":"POST","path_template":"/v1/urlTestingTools/mobileFriendlyTest:run","path_regex":"^(?:/v1/urlTestingTools/mobileFriendlyTest:run)$","service_name":"google.searchconsole","resource_name":"searchconsole.urlTestingTools.mobileFriendlyTest.run"},{"hostname":"searchconsole.googleapis.com","http_method":"POST","path_template":"/webmasters/v3/sites/{siteUrl}/searchAnalytics/query","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAnalytics/query)$","service_name":"google.searchconsole","resource_name":"webmasters.searchanalytics.query"},{"hostname":"searchconsole.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sites.add"},{"hostname":"searchconsole.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.submit"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.testIamPermissions"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.testIamPermissions"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/assets","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/bigQueryExports","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/muteConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/notificationConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules:listDescendant","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/effectiveCustomModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/sources","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/assets","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/bigQueryExports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/muteConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules:listDescendant","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/effectiveCustomModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/bigQueryExports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/muteConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notificationConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules:listDescendant","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/effectiveCustomModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/assets","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/eventThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/onboardingState","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onboardingState)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getOnboardingState"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/rapidVulnerabilityDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.rapidVulnerabilityDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/securityCenterSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityCenterSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getSecurityCenterSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/securityHealthAnalyticsSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/virtualMachineThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.virtualMachineThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/webSecurityScannerSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.webSecurityScannerSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/eventThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/onboardingState","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onboardingState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOnboardingState"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/rapidVulnerabilityDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.rapidVulnerabilityDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/securityCenterSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityCenterSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getSecurityCenterSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/securityHealthAnalyticsSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/subscription","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscription)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getSubscription"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/virtualMachineThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.virtualMachineThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/webSecurityScannerSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.webSecurityScannerSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/eventThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.clusters.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.clusters.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/onboardingState","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onboardingState)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getOnboardingState"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/rapidVulnerabilityDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.rapidVulnerabilityDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/securityCenterSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityCenterSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getSecurityCenterSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/securityHealthAnalyticsSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/virtualMachineThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.virtualMachineThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/webSecurityScannerSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.webSecurityScannerSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/assets","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}/externalSystems/{externalSystemsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.externalSystems.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/externalSystems/{externalSystemsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.externalSystems.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}/externalSystems/{externalSystemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.externalSystems.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.clusters.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/assets:group","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/bigQueryExports","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/findings:bulkMute","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:bulkMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.findings.bulkMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/muteConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/notificationConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}:setMute","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.setMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/assets:group","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/assets:runDiscovery","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:runDiscovery)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.runDiscovery"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/bigQueryExports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/findings:bulkMute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:bulkMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.findings.bulkMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/muteConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setMute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.getIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.setIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.testIamPermissions"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/assets:group","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/bigQueryExports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/findings:bulkMute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:bulkMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.findings.bulkMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/muteConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notificationConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}:setMute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.setMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/assets:group","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/assets:runDiscovery","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:runDiscovery)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.runDiscovery"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}:getIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.getIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}:setIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.setIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}:testIamPermissions","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.testIamPermissions"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/assets:group","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/assets:runDiscovery","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:runDiscovery)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.runDiscovery"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}:getIamPolicy","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.getIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}:setIamPolicy","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.setIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}:testIamPermissions","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{instanceId}/service_bindings/{bindingId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}:getIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.getIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/service_bindings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.service_bindings.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/service_instances","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_instances)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.service_instances.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/catalog","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/catalog)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.catalog.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/last_operation","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}/last_operation","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/{v1alpha1Id}:getIamPolicy","path_regex":"^(?:/v1alpha1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.getIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/bindings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.bindings.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/bindings/{bindingsId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.bindings.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/catalog","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/catalog)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.catalog.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}:getIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.getIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.patch"},{"hostname":"servicebroker.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.patch"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:setIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.setIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:testIamPermissions","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicebroker","resource_name":"servicebroker.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1alpha1/{v1alpha1Id}:setIamPolicy","path_regex":"^(?:/v1alpha1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.setIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1alpha1/{v1alpha1Id}:testIamPermissions","path_regex":"^(?:/v1alpha1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicebroker","resource_name":"servicebroker.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/brokers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.create"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:setIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.setIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:testIamPermissions","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicebroker","resource_name":"servicebroker.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.create"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.create"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.create"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides/{producerOverridesId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}:search","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.search"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides/{producerOverridesId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.patch"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.cancel"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:addProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.addProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:applyProjectConfig","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyProjectConfig)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.applyProjectConfig"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:attachProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.attachProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:deleteProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.deleteProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:removeProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.removeProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:undeleteProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeleteProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.undeleteProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics:importProducerOverrides","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importProducerOverrides)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.importProducerOverrides"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:allocateQuota","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::allocateQuota)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.allocateQuota"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:check","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.check"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:report","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::report)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.report"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v2/services/{serviceName}:check","path_regex":"^(?:/v2/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.check"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v2/services/{serviceName}:report","path_regex":"^(?:/v2/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::report)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.report"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.resolve"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/serviceWorkloads/{serviceWorkloadsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceWorkloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.serviceWorkloads.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/serviceWorkloads/{serviceWorkloadsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceWorkloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.serviceWorkloads.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/serviceWorkloads/{serviceWorkloadsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceWorkloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.serviceWorkloads.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:resolve","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.resolve"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/workloads/{workloadsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.workloads.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/workloads/{workloadsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.workloads.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/workloads/{workloadsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.workloads.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrationPolicies/{registrationPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.registrationPolicies.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrationPolicies/{registrationPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.registrationPolicies.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrationPolicies/{registrationPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.registrationPolicies.testIamPermissions"},{"hostname":"servicemanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/services/{serviceName}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.delete"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.operations.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.operations.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/config","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.getConfig"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/configs","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/configs/{configId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/rollouts","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.rollouts.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/rollouts/{rolloutId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.rollouts.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.create"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}/configs","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.create"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}/configs:submit","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs:submit)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.submit"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}/rollouts","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.rollouts.create"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:undelete","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.undelete"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/consumers/{consumersId}:getIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.consumers.getIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/consumers/{consumersId}:setIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.consumers.setIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/consumers/{consumersId}:testIamPermissions","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.consumers.testIamPermissions"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.getIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.setIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.testIamPermissions"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services:generateConfigReport","path_regex":"^(?:/v1/services:generateConfigReport)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.generateConfigReport"},{"hostname":"servicenetworking.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.delete"},{"hostname":"servicenetworking.googleapis.com","http_method":"DELETE","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/peeredDnsDomains/{peeredDnsDomainsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeredDnsDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.peeredDnsDomains.delete"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/connections","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/peeredDnsDomains","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeredDnsDomains)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.peeredDnsDomains.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1beta/operations/{operationsId}","path_regex":"^(?:/v1beta/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1beta/services/{servicesId}/connections","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}/connections/{connectionsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.patch"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}:updateConsumerConfig","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateConsumerConfig)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.updateConsumerConfig"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}:disableVpcServiceControls","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableVpcServiceControls)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.disableVpcServiceControls"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}:enableVpcServiceControls","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableVpcServiceControls)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.enableVpcServiceControls"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1beta/services/{servicesId}/connections","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.updateConnections"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.cancel"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/connections","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.create"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/connections/{connectionsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.deleteConnection"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsRecordSets:add","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:add)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.add"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsRecordSets:remove","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:remove)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.remove"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsRecordSets:update","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:update)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.update"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsZones:add","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsZones:add)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsZones.add"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsZones:remove","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsZones:remove)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsZones.remove"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/peeredDnsDomains","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeredDnsDomains)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.peeredDnsDomains.create"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/roles:add","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles:add)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.roles.add"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}:addSubnetwork","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addSubnetwork)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.addSubnetwork"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:searchRange","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchRange)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.searchRange"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:validate","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.validate"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1beta/services/{servicesId}/connections","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.create"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1beta/services/{servicesId}/{servicesId1}/{servicesId2}:addSubnetwork","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addSubnetwork)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.addSubnetwork"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1beta/services/{servicesId}:searchRange","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchRange)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.searchRange"},{"hostname":"serviceusage.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.delete"},{"hostname":"serviceusage.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides/{adminOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.delete"},{"hostname":"serviceusage.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides/{consumerOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.delete"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/services","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/services/{servicesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/services:batchGet","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchGet)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.batchGet"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.list"},{"hostname":"serviceusage.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides/{adminOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.patch"},{"hostname":"serviceusage.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides/{consumerOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.patch"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.cancel"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/services/{servicesId}:disable","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.disable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/services/{servicesId}:enable","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.enable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/services:batchEnable","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchEnable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.batchEnable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.create"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.create"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics:importAdminOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importAdminOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.importAdminOverrides"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics:importConsumerOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importConsumerOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.importConsumerOverrides"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}:disable","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.disable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}:enable","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.enable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}:generateServiceIdentity","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateServiceIdentity)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.generateServiceIdentity"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services:batchEnable","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchEnable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.batchEnable"},{"hostname":"serviceuser.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.serviceuser","resource_name":"serviceuser.projects.services.list"},{"hostname":"serviceuser.googleapis.com","http_method":"GET","path_template":"/v1/services:search","path_regex":"^(?:/v1/services:search)$","service_name":"google.serviceuser","resource_name":"serviceuser.services.search"},{"hostname":"serviceuser.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services/{servicesId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.serviceuser","resource_name":"serviceuser.projects.services.disable"},{"hostname":"serviceuser.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services/{servicesId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.serviceuser","resource_name":"serviceuser.projects.services.enable"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.get"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developerMetadata/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.developerMetadata.get"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.get"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchGet","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchGet)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchGet"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets","path_regex":"^(?:/v4/spreadsheets)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.create"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/developerMetadata:search","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developerMetadata:search)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.developerMetadata.search"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::copyTo)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.sheets.copyTo"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}:append","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::append)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.append"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}:clear","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clear)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.clear"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchClear","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchClear)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchClear"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchClearByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchClearByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchGetByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchGetByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchUpdate","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchUpdate)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchUpdate"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchUpdateByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchUpdateByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}:batchUpdate","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.batchUpdate"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}:getByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.getByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"PUT","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/accounts/{accountId}/labels/{labelId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.labels.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/accounts/{accountId}/returncarrier/{carrierAccountId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.returncarrier.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/collections/{collectionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.collections.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.conversionsources.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/productdeliverytime/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productdeliverytime/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productdeliverytime.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/regions/{regionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.regions.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/repricingrules/{ruleId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingrules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.repricingrules.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/returnaddress/{returnAddressId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnaddress.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/returnpolicy/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicy.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/returnpolicyonline/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicyonline.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/accounts/authinfo","path_regex":"^(?:/content/v2\\.1/accounts/authinfo)$","service_name":"google.content","resource_name":"content.accounts.authinfo"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/accounts/{accountId}/labels","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.content","resource_name":"content.accounts.labels.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/accounts/{accountId}/returncarrier","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier)$","service_name":"google.content","resource_name":"content.accounts.returncarrier.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/liasettings/posdataproviders","path_regex":"^(?:/content/v2\\.1/liasettings/posdataproviders)$","service_name":"google.content","resource_name":"content.liasettings.listposdataproviders"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{cssGroupId}/csses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csses)$","service_name":"google.content","resource_name":"content.csses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{cssGroupId}/csses/{cssDomainId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.csses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounts","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/listlinks","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listlinks)$","service_name":"google.content","resource_name":"content.accounts.listlinks"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accountstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses)$","service_name":"google.content","resource_name":"content.accountstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accountstatuses/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accountstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounttax","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax)$","service_name":"google.content","resource_name":"content.accounttax.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.buyongoogleprograms.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collections","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections)$","service_name":"google.content","resource_name":"content.collections.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collections/{collectionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.collections.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collectionstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionstatuses)$","service_name":"google.content","resource_name":"content.collectionstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collectionstatuses/{collectionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.collectionstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/conversionsources","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources)$","service_name":"google.content","resource_name":"content.conversionsources.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.conversionsources.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeeds","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeedstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses)$","service_name":"google.content","resource_name":"content.datafeedstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeedstatuses/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeedstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/freelistingsprogram","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram)$","service_name":"google.content","resource_name":"content.freelistingsprogram.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/liasettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings)$","service_name":"google.content","resource_name":"content.liasettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/accessiblegmbaccounts","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessiblegmbaccounts)$","service_name":"google.content","resource_name":"content.liasettings.getaccessiblegmbaccounts"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreports/disbursements","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements)$","service_name":"google.content","resource_name":"content.orderreports.listdisbursements"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreports/disbursements/{disbursementId}/transactions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transactions)$","service_name":"google.content","resource_name":"content.orderreports.listtransactions"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreturns","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns)$","service_name":"google.content","resource_name":"content.orderreturns.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orderreturns.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orders","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.content","resource_name":"content.orders.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orders/{orderId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/ordersbymerchantid/{merchantOrderId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordersbymerchantid/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.getbymerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productdeliverytime/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productdeliverytime/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productdeliverytime.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/products","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses)$","service_name":"google.content","resource_name":"content.productstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productstatuses/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productstatuses/{productId}/repricingreports","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingreports)$","service_name":"google.content","resource_name":"content.productstatuses.repricingreports.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/promotions/{id}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.promotions.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/pubsubnotificationsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pubsubnotificationsettings)$","service_name":"google.content","resource_name":"content.pubsubnotificationsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/quotas","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/quotas)$","service_name":"google.content","resource_name":"content.quotas.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/recommendations/generate","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/generate)$","service_name":"google.content","resource_name":"content.recommendations.generate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/regions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.content","resource_name":"content.regions.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/regions/{regionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.regions.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/repricingrules","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingrules)$","service_name":"google.content","resource_name":"content.repricingrules.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/repricingrules/{ruleId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingrules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.repricingrules.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/repricingrules/{ruleId}/repricingreports","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingrules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingreports)$","service_name":"google.content","resource_name":"content.repricingrules.repricingreports.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnaddress","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress)$","service_name":"google.content","resource_name":"content.returnaddress.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnaddress/{returnAddressId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnaddress.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicy","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy)$","service_name":"google.content","resource_name":"content.returnpolicy.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicy/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicy.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicyonline","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline)$","service_name":"google.content","resource_name":"content.returnpolicyonline.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicyonline/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicyonline.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/settlementreports","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settlementreports)$","service_name":"google.content","resource_name":"content.settlementreports.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/settlementreports/{settlementId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settlementreports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.settlementreports.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/settlementreports/{settlementId}/transactions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settlementreports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transactions)$","service_name":"google.content","resource_name":"content.settlementtransactions.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/shippingsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings)$","service_name":"google.content","resource_name":"content.shippingsettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/shoppingadsprogram","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shoppingadsprogram)$","service_name":"google.content","resource_name":"content.shoppingadsprogram.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/supportedCarriers","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedCarriers)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedcarriers"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/supportedHolidays","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedHolidays)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedholidays"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/supportedPickupServices","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedPickupServices)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedpickupservices"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/testordertemplates/{templateName}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testordertemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.gettestordertemplate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/accounts/authinfo","path_regex":"^(?:/content/v2/accounts/authinfo)$","service_name":"google.content","resource_name":"content.accounts.authinfo"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/liasettings/posdataproviders","path_regex":"^(?:/content/v2/liasettings/posdataproviders)$","service_name":"google.content","resource_name":"content.liasettings.listposdataproviders"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounts","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accountstatuses","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses)$","service_name":"google.content","resource_name":"content.accountstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accountstatuses/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accountstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounttax","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax)$","service_name":"google.content","resource_name":"content.accounttax.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeeds","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeedstatuses","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses)$","service_name":"google.content","resource_name":"content.datafeedstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeedstatuses/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeedstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/liasettings","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings)$","service_name":"google.content","resource_name":"content.liasettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/accessiblegmbaccounts","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessiblegmbaccounts)$","service_name":"google.content","resource_name":"content.liasettings.getaccessiblegmbaccounts"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreports/disbursements","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements)$","service_name":"google.content","resource_name":"content.orderreports.listdisbursements"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreports/disbursements/{disbursementId}/transactions","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transactions)$","service_name":"google.content","resource_name":"content.orderreports.listtransactions"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreturns","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns)$","service_name":"google.content","resource_name":"content.orderreturns.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreturns/{returnId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orderreturns.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orders","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.content","resource_name":"content.orders.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orders/{orderId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/ordersbymerchantid/{merchantOrderId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordersbymerchantid/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.getbymerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/products","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/productstatuses","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses)$","service_name":"google.content","resource_name":"content.productstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/productstatuses/{productId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/shippingsettings","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings)$","service_name":"google.content","resource_name":"content.shippingsettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/supportedCarriers","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedCarriers)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedcarriers"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/supportedHolidays","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedHolidays)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedholidays"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/supportedPickupServices","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedPickupServices)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedpickupservices"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/testordertemplates/{templateName}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testordertemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.gettestordertemplate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/accounts/{accountId}/labels/{labelId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.labels.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/accounts/{accountId}/returncarrier/{carrierAccountId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.returncarrier.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.buyongoogleprograms.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.conversionsources.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/regions/{regionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.regions.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/repricingrules/{ruleId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingrules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.repricingrules.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/returnpolicyonline/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicyonline.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/batch","path_regex":"^(?:/content/v2\\.1/accounts/batch)$","service_name":"google.content","resource_name":"content.accounts.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/{accountId}/credentials","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials)$","service_name":"google.content","resource_name":"content.accounts.credentials.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/{accountId}/labels","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.content","resource_name":"content.accounts.labels.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/{accountId}/returncarrier","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier)$","service_name":"google.content","resource_name":"content.accounts.returncarrier.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accountstatuses/batch","path_regex":"^(?:/content/v2\\.1/accountstatuses/batch)$","service_name":"google.content","resource_name":"content.accountstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounttax/batch","path_regex":"^(?:/content/v2\\.1/accounttax/batch)$","service_name":"google.content","resource_name":"content.accounttax.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/datafeeds/batch","path_regex":"^(?:/content/v2\\.1/datafeeds/batch)$","service_name":"google.content","resource_name":"content.datafeeds.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/datafeedstatuses/batch","path_regex":"^(?:/content/v2\\.1/datafeedstatuses/batch)$","service_name":"google.content","resource_name":"content.datafeedstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/liasettings/batch","path_regex":"^(?:/content/v2\\.1/liasettings/batch)$","service_name":"google.content","resource_name":"content.liasettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/localinventory/batch","path_regex":"^(?:/content/v2\\.1/localinventory/batch)$","service_name":"google.content","resource_name":"content.localinventory.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/pos/batch","path_regex":"^(?:/content/v2\\.1/pos/batch)$","service_name":"google.content","resource_name":"content.pos.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/products/batch","path_regex":"^(?:/content/v2\\.1/products/batch)$","service_name":"google.content","resource_name":"content.products.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/productstatuses/batch","path_regex":"^(?:/content/v2\\.1/productstatuses/batch)$","service_name":"google.content","resource_name":"content.productstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/regionalinventory/batch","path_regex":"^(?:/content/v2\\.1/regionalinventory/batch)$","service_name":"google.content","resource_name":"content.regionalinventory.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/returnaddress/batch","path_regex":"^(?:/content/v2\\.1/returnaddress/batch)$","service_name":"google.content","resource_name":"content.returnaddress.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/returnpolicy/batch","path_regex":"^(?:/content/v2\\.1/returnpolicy/batch)$","service_name":"google.content","resource_name":"content.returnpolicy.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/shippingsettings/batch","path_regex":"^(?:/content/v2\\.1/shippingsettings/batch)$","service_name":"google.content","resource_name":"content.shippingsettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{cssGroupId}/csses/{cssDomainId}/updatelabels","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatelabels)$","service_name":"google.content","resource_name":"content.csses.updatelabels"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/claimwebsite","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/claimwebsite)$","service_name":"google.content","resource_name":"content.accounts.claimwebsite"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/link","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/link)$","service_name":"google.content","resource_name":"content.accounts.link"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/requestphoneverification","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestphoneverification)$","service_name":"google.content","resource_name":"content.accounts.requestphoneverification"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/updatelabels","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatelabels)$","service_name":"google.content","resource_name":"content.accounts.updatelabels"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/verifyphonenumber","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyphonenumber)$","service_name":"google.content","resource_name":"content.accounts.verifyphonenumber"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/activate","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activate)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.activate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/onboard","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onboard)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.onboard"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/pause","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pause)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.pause"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/requestreview","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestreview)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.requestreview"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/collections","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections)$","service_name":"google.content","resource_name":"content.collections.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/conversionsources","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources)$","service_name":"google.content","resource_name":"content.conversionsources.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}:undelete","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.content","resource_name":"content.conversionsources.undelete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/datafeeds","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}/fetchNow","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fetchNow)$","service_name":"google.content","resource_name":"content.datafeeds.fetchnow"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/freelistingsprogram/requestreview","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram/requestreview)$","service_name":"google.content","resource_name":"content.freelistingsprogram.requestreview"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/requestgmbaccess","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestgmbaccess)$","service_name":"google.content","resource_name":"content.liasettings.requestgmbaccess"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/requestinventoryverification/{country}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestinventoryverification/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.requestinventoryverification"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/setinventoryverificationcontact","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setinventoryverificationcontact)$","service_name":"google.content","resource_name":"content.liasettings.setinventoryverificationcontact"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/setposdataprovider","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setposdataprovider)$","service_name":"google.content","resource_name":"content.liasettings.setposdataprovider"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderinvoices/{orderId}/createChargeInvoice","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createChargeInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createchargeinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderinvoices/{orderId}/createRefundInvoice","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createRefundInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createrefundinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/createOrderReturn","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/createOrderReturn)$","service_name":"google.content","resource_name":"content.orderreturns.createorderreturn"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}/acknowledge","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orderreturns.acknowledge"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}/labels","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.content","resource_name":"content.orderreturns.labels.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}/process","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/process)$","service_name":"google.content","resource_name":"content.orderreturns.process"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/acknowledge","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orders.acknowledge"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/cancel","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.content","resource_name":"content.orders.cancel"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/cancelLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelLineItem)$","service_name":"google.content","resource_name":"content.orders.cancellineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/captureOrder","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/captureOrder)$","service_name":"google.content","resource_name":"content.orders.captureOrder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/inStoreRefundLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inStoreRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.instorerefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/refunditem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refunditem)$","service_name":"google.content","resource_name":"content.orders.refunditem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/refundorder","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refundorder)$","service_name":"google.content","resource_name":"content.orders.refundorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/rejectReturnLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rejectReturnLineItem)$","service_name":"google.content","resource_name":"content.orders.rejectreturnlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/returnRefundLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.returnrefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/setLineItemMetadata","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLineItemMetadata)$","service_name":"google.content","resource_name":"content.orders.setlineitemmetadata"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/shipLineItems","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shipLineItems)$","service_name":"google.content","resource_name":"content.orders.shiplineitems"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/testreturn","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testreturn)$","service_name":"google.content","resource_name":"content.orders.createtestreturn"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/updateLineItemShippingDetails","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateLineItemShippingDetails)$","service_name":"google.content","resource_name":"content.orders.updatelineitemshippingdetails"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/updateMerchantOrderId","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateMerchantOrderId)$","service_name":"google.content","resource_name":"content.orders.updatemerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/updateShipment","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShipment)$","service_name":"google.content","resource_name":"content.orders.updateshipment"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/ordertrackingsignals","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordertrackingsignals)$","service_name":"google.content","resource_name":"content.ordertrackingsignals.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/inventory","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.content","resource_name":"content.pos.inventory"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/sale","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sale)$","service_name":"google.content","resource_name":"content.pos.sale"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/productdeliverytime","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productdeliverytime)$","service_name":"google.content","resource_name":"content.productdeliverytime.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/products","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/products/{productId}/localinventory","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/localinventory)$","service_name":"google.content","resource_name":"content.localinventory.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/products/{productId}/regionalinventory","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalinventory)$","service_name":"google.content","resource_name":"content.regionalinventory.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/promotions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions)$","service_name":"google.content","resource_name":"content.promotions.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/recommendations/reportInteraction","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/reportInteraction)$","service_name":"google.content","resource_name":"content.recommendations.reportInteraction"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/regions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.content","resource_name":"content.regions.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/reports/search","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/search)$","service_name":"google.content","resource_name":"content.reports.search"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/repricingrules","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repricingrules)$","service_name":"google.content","resource_name":"content.repricingrules.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/returnaddress","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress)$","service_name":"google.content","resource_name":"content.returnaddress.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/returnpolicy","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy)$","service_name":"google.content","resource_name":"content.returnpolicy.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/returnpolicyonline","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline)$","service_name":"google.content","resource_name":"content.returnpolicyonline.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/shoppingadsprogram/requestreview","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shoppingadsprogram/requestreview)$","service_name":"google.content","resource_name":"content.shoppingadsprogram.requestreview"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/testorders","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders)$","service_name":"google.content","resource_name":"content.orders.createtestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/testorders/{orderId}/advance","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advance)$","service_name":"google.content","resource_name":"content.orders.advancetestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/testorders/{orderId}/cancelByCustomer","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelByCustomer)$","service_name":"google.content","resource_name":"content.orders.canceltestorderbycustomer"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/accounts/batch","path_regex":"^(?:/content/v2/accounts/batch)$","service_name":"google.content","resource_name":"content.accounts.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/accountstatuses/batch","path_regex":"^(?:/content/v2/accountstatuses/batch)$","service_name":"google.content","resource_name":"content.accountstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/accounttax/batch","path_regex":"^(?:/content/v2/accounttax/batch)$","service_name":"google.content","resource_name":"content.accounttax.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/datafeeds/batch","path_regex":"^(?:/content/v2/datafeeds/batch)$","service_name":"google.content","resource_name":"content.datafeeds.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/datafeedstatuses/batch","path_regex":"^(?:/content/v2/datafeedstatuses/batch)$","service_name":"google.content","resource_name":"content.datafeedstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/liasettings/batch","path_regex":"^(?:/content/v2/liasettings/batch)$","service_name":"google.content","resource_name":"content.liasettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/orders/batch","path_regex":"^(?:/content/v2/orders/batch)$","service_name":"google.content","resource_name":"content.orders.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/pos/batch","path_regex":"^(?:/content/v2/pos/batch)$","service_name":"google.content","resource_name":"content.pos.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/products/batch","path_regex":"^(?:/content/v2/products/batch)$","service_name":"google.content","resource_name":"content.products.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/productstatuses/batch","path_regex":"^(?:/content/v2/productstatuses/batch)$","service_name":"google.content","resource_name":"content.productstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/shippingsettings/batch","path_regex":"^(?:/content/v2/shippingsettings/batch)$","service_name":"google.content","resource_name":"content.shippingsettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/accounts","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/accounts/{accountId}/claimwebsite","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/claimwebsite)$","service_name":"google.content","resource_name":"content.accounts.claimwebsite"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/accounts/{accountId}/link","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/link)$","service_name":"google.content","resource_name":"content.accounts.link"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/datafeeds","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}/fetchNow","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fetchNow)$","service_name":"google.content","resource_name":"content.datafeeds.fetchnow"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/requestgmbaccess","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestgmbaccess)$","service_name":"google.content","resource_name":"content.liasettings.requestgmbaccess"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/requestinventoryverification/{country}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestinventoryverification/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.requestinventoryverification"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/setinventoryverificationcontact","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setinventoryverificationcontact)$","service_name":"google.content","resource_name":"content.liasettings.setinventoryverificationcontact"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/setposdataprovider","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setposdataprovider)$","service_name":"google.content","resource_name":"content.liasettings.setposdataprovider"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orderinvoices/{orderId}/createChargeInvoice","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createChargeInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createchargeinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orderinvoices/{orderId}/createRefundInvoice","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createRefundInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createrefundinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/acknowledge","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orders.acknowledge"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/cancel","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.content","resource_name":"content.orders.cancel"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/cancelLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelLineItem)$","service_name":"google.content","resource_name":"content.orders.cancellineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/inStoreRefundLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inStoreRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.instorerefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/refund","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refund)$","service_name":"google.content","resource_name":"content.orders.refund"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/rejectReturnLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rejectReturnLineItem)$","service_name":"google.content","resource_name":"content.orders.rejectreturnlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/returnLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnLineItem)$","service_name":"google.content","resource_name":"content.orders.returnlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/returnRefundLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.returnrefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/setLineItemMetadata","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLineItemMetadata)$","service_name":"google.content","resource_name":"content.orders.setlineitemmetadata"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/shipLineItems","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shipLineItems)$","service_name":"google.content","resource_name":"content.orders.shiplineitems"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/testreturn","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testreturn)$","service_name":"google.content","resource_name":"content.orders.createtestreturn"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/updateLineItemShippingDetails","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateLineItemShippingDetails)$","service_name":"google.content","resource_name":"content.orders.updatelineitemshippingdetails"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/updateMerchantOrderId","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateMerchantOrderId)$","service_name":"google.content","resource_name":"content.orders.updatemerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/updateShipment","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShipment)$","service_name":"google.content","resource_name":"content.orders.updateshipment"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/inventory","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.content","resource_name":"content.pos.inventory"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/sale","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sale)$","service_name":"google.content","resource_name":"content.pos.sale"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/products","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/testorders","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders)$","service_name":"google.content","resource_name":"content.orders.createtestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/testorders/{orderId}/advance","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advance)$","service_name":"google.content","resource_name":"content.orders.advancetestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/testorders/{orderId}/cancelByCustomer","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelByCustomer)$","service_name":"google.content","resource_name":"content.orders.canceltestorderbycustomer"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/pubsubnotificationsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pubsubnotificationsettings)$","service_name":"google.content","resource_name":"content.pubsubnotificationsettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.update"},{"hostname":"slides.googleapis.com","http_method":"GET","path_template":"/v1/presentations/{presentationId}/pages/{pageObjectId}","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.slides","resource_name":"slides.presentations.pages.get"},{"hostname":"slides.googleapis.com","http_method":"GET","path_template":"/v1/presentations/{presentationId}/pages/{pageObjectId}/thumbnail","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/thumbnail)$","service_name":"google.slides","resource_name":"slides.presentations.pages.getThumbnail"},{"hostname":"slides.googleapis.com","http_method":"GET","path_template":"/v1/presentations/{presentationsId}","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.slides","resource_name":"slides.presentations.get"},{"hostname":"slides.googleapis.com","http_method":"POST","path_template":"/v1/presentations","path_regex":"^(?:/v1/presentations)$","service_name":"google.slides","resource_name":"slides.presentations.create"},{"hostname":"slides.googleapis.com","http_method":"POST","path_template":"/v1/presentations/{presentationId}:batchUpdate","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.slides","resource_name":"slides.presentations.batchUpdate"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.devices.list"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.devices.get"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.list"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures/{structuresId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.get"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures/{structuresId}/rooms","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rooms)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.rooms.list"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures/{structuresId}/rooms/{roomsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rooms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.rooms.get"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}:executeCommand","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeCommand)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.devices.executeCommand"},{"hostname":"sourcerepo.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/repos/{reposId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.delete"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.getConfig"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.list"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/repos/{reposId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.get"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/repos/{reposId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.getIamPolicy"},{"hostname":"sourcerepo.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.updateConfig"},{"hostname":"sourcerepo.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/repos/{reposId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.patch"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.create"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos/{reposId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.setIamPolicy"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos/{reposId}:sync","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sync)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.sync"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos/{reposId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.dropDatabase"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backupOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backupOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databaseOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databaseOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databaseOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/databaseRoles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databaseRoles)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.databaseRoles.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/ddl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ddl)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.getDdl"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/scans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.getScans"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/scans","path_regex":"^(?:/v1/scans)$","service_name":"google.spanner","resource_name":"spanner.scans.list"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/ddl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ddl)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.updateDdl"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups:copy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups:copy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.copy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/databaseRoles/{databaseRolesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databaseRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.databaseRoles.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:beginTransaction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::beginTransaction)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.beginTransaction"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.commit"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:executeBatchDml","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeBatchDml)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.executeBatchDml"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:executeSql","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeSql)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.executeSql"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:executeStreamingSql","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeStreamingSql)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.executeStreamingSql"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:partitionQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionQuery)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.partitionQuery"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:partitionRead","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionRead)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.partitionRead"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:read","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::read)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.read"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.rollback"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:streamingRead","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamingRead)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.streamingRead"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions:batchCreate)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.batchCreate"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases:restore)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.restore"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.testIamPermissions"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.delete"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.delete"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.delete"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.delete"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.speech","resource_name":"speech.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.speech","resource_name":"speech.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/operations","path_regex":"^(?:/v1p1beta1/operations)$","service_name":"google.speech","resource_name":"speech.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/operations/{operationsId}","path_regex":"^(?:/v1p1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.get"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.patch"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.patch"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.patch"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.patch"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/speech:longrunningrecognize","path_regex":"^(?:/v1/speech:longrunningrecognize)$","service_name":"google.speech","resource_name":"speech.speech.longrunningrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/speech:recognize","path_regex":"^(?:/v1/speech:recognize)$","service_name":"google.speech","resource_name":"speech.speech.recognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1beta1/speech:asyncrecognize","path_regex":"^(?:/v1beta1/speech:asyncrecognize)$","service_name":"google.speech","resource_name":"speech.speech.asyncrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1beta1/speech:syncrecognize","path_regex":"^(?:/v1beta1/speech:syncrecognize)$","service_name":"google.speech","resource_name":"speech.speech.syncrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/speech:longrunningrecognize","path_regex":"^(?:/v1p1beta1/speech:longrunningrecognize)$","service_name":"google.speech","resource_name":"speech.speech.longrunningrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/speech:recognize","path_regex":"^(?:/v1p1beta1/speech:recognize)$","service_name":"google.speech","resource_name":"speech.speech.recognize"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.backupRuns.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.sslCerts.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/flags","path_regex":"^(?:/sql/v1beta4/flags)$","service_name":"google.sql","resource_name":"sql.flags.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/flags","path_regex":"^(?:/sql/v1beta4/flags)$","service_name":"google.sqladmin","resource_name":"sql.flags.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sql","resource_name":"sql.instances.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sql","resource_name":"sql.backupRuns.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.backupRuns.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/connectSettings","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectSettings)$","service_name":"google.sqladmin","resource_name":"sql.connect.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sql","resource_name":"sql.databases.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/getDiskShrinkConfig","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiskShrinkConfig)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.getDiskShrinkConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/listServerCas","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listServerCas)$","service_name":"google.sql","resource_name":"sql.instances.listServerCas"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/listServerCas","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listServerCas)$","service_name":"google.sqladmin","resource_name":"sql.instances.listServerCas"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sql","resource_name":"sql.sslCerts.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.sslCerts.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users/{name}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.users.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.sql","resource_name":"sql.operations.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.sqladmin","resource_name":"sql.operations.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations/{operation}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.operations.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations/{operation}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.operations.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/tiers","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tiers)$","service_name":"google.sql","resource_name":"sql.tiers.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/tiers","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tiers)$","service_name":"google.sqladmin","resource_name":"sql.tiers.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/flags","path_regex":"^(?:/v1/flags)$","service_name":"google.sqladmin","resource_name":"sql.flags.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/connectSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectSettings)$","service_name":"google.sqladmin","resource_name":"sql.connect.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/getDiskShrinkConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiskShrinkConfig)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.getDiskShrinkConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/listServerCas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listServerCas)$","service_name":"google.sqladmin","resource_name":"sql.instances.listServerCas"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/users/{name}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.users.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.sqladmin","resource_name":"sql.operations.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/operations/{operation}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.operations.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/tiers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tiers)$","service_name":"google.sqladmin","resource_name":"sql.tiers.list"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sql","resource_name":"sql.instances.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/addServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addServerCa)$","service_name":"google.sql","resource_name":"sql.instances.addServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/addServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.addServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sql","resource_name":"sql.backupRuns.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/clone","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clone)$","service_name":"google.sql","resource_name":"sql.instances.clone"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/clone","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clone)$","service_name":"google.sqladmin","resource_name":"sql.instances.clone"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/createEphemeral","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEphemeral)$","service_name":"google.sql","resource_name":"sql.sslCerts.createEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/createEphemeral","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEphemeral)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.createEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sql","resource_name":"sql.databases.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/demoteMaster","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demoteMaster)$","service_name":"google.sql","resource_name":"sql.instances.demoteMaster"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/demoteMaster","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demoteMaster)$","service_name":"google.sqladmin","resource_name":"sql.instances.demoteMaster"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/export","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.sql","resource_name":"sql.instances.export"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/export","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.sqladmin","resource_name":"sql.instances.export"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/failover","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/failover)$","service_name":"google.sql","resource_name":"sql.instances.failover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/failover","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/failover)$","service_name":"google.sqladmin","resource_name":"sql.instances.failover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/import","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.sql","resource_name":"sql.instances.import"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/import","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.sqladmin","resource_name":"sql.instances.import"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/performDiskShrink","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performDiskShrink)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.performDiskShrink"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/promoteReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promoteReplica)$","service_name":"google.sql","resource_name":"sql.instances.promoteReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/promoteReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promoteReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.promoteReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rescheduleMaintenance","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rescheduleMaintenance)$","service_name":"google.sql","resource_name":"sql.projects.instances.rescheduleMaintenance"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rescheduleMaintenance","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rescheduleMaintenance)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.rescheduleMaintenance"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/resetReplicaSize","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetReplicaSize)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.resetReplicaSize"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/resetSslConfig","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetSslConfig)$","service_name":"google.sql","resource_name":"sql.instances.resetSslConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/resetSslConfig","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetSslConfig)$","service_name":"google.sqladmin","resource_name":"sql.instances.resetSslConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restart","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.sql","resource_name":"sql.instances.restart"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restart","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.sqladmin","resource_name":"sql.instances.restart"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restoreBackup","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restoreBackup)$","service_name":"google.sql","resource_name":"sql.instances.restoreBackup"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restoreBackup","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restoreBackup)$","service_name":"google.sqladmin","resource_name":"sql.instances.restoreBackup"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rotateServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rotateServerCa)$","service_name":"google.sql","resource_name":"sql.instances.rotateServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rotateServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rotateServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.rotateServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sql","resource_name":"sql.sslCerts.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startExternalSync","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startExternalSync)$","service_name":"google.sql","resource_name":"sql.projects.instances.startExternalSync"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startExternalSync","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startExternalSync)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.startExternalSync"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startReplica)$","service_name":"google.sql","resource_name":"sql.instances.startReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.startReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/stopReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopReplica)$","service_name":"google.sql","resource_name":"sql.instances.stopReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/stopReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.stopReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/truncateLog","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/truncateLog)$","service_name":"google.sql","resource_name":"sql.instances.truncateLog"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/truncateLog","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/truncateLog)$","service_name":"google.sqladmin","resource_name":"sql.instances.truncateLog"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/verifyExternalSyncSettings","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyExternalSyncSettings)$","service_name":"google.sql","resource_name":"sql.projects.instances.verifyExternalSyncSettings"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/verifyExternalSyncSettings","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyExternalSyncSettings)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.verifyExternalSyncSettings"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}:generateEphemeralCert","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateEphemeralCert)$","service_name":"google.sqladmin","resource_name":"sql.connect.generateEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/addServerCa","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.addServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/clone","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clone)$","service_name":"google.sqladmin","resource_name":"sql.instances.clone"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/createEphemeral","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEphemeral)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.createEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/demoteMaster","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demoteMaster)$","service_name":"google.sqladmin","resource_name":"sql.instances.demoteMaster"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.sqladmin","resource_name":"sql.instances.export"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/failover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/failover)$","service_name":"google.sqladmin","resource_name":"sql.instances.failover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.sqladmin","resource_name":"sql.instances.import"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/performDiskShrink","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performDiskShrink)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.performDiskShrink"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/promoteReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promoteReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.promoteReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/rescheduleMaintenance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rescheduleMaintenance)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.rescheduleMaintenance"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/resetReplicaSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetReplicaSize)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.resetReplicaSize"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/resetSslConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetSslConfig)$","service_name":"google.sqladmin","resource_name":"sql.instances.resetSslConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.sqladmin","resource_name":"sql.instances.restart"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/restoreBackup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restoreBackup)$","service_name":"google.sqladmin","resource_name":"sql.instances.restoreBackup"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/rotateServerCa","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rotateServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.rotateServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/startExternalSync","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startExternalSync)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.startExternalSync"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/startReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.startReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/stopReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.stopReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/truncateLog","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/truncateLog)$","service_name":"google.sqladmin","resource_name":"sql.instances.truncateLog"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/verifyExternalSyncSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyExternalSyncSettings)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.verifyExternalSyncSettings"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}:generateEphemeralCert","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateEphemeralCert)$","service_name":"google.sqladmin","resource_name":"sql.connect.generateEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.update"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/notificationConfigs/{notification}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.notifications.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/projects/{projectId}/hmacKeys/{accessId}","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b","path_regex":"^(?:/storage/v1/b)$","service_name":"google.storage","resource_name":"storage.buckets.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.buckets.getIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/iam/testPermissions","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam/testPermissions)$","service_name":"google.storage","resource_name":"storage.buckets.testIamPermissions"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/notificationConfigs","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.storage","resource_name":"storage.notifications.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/notificationConfigs/{notification}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.notifications.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.objects.getIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/iam/testPermissions","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam/testPermissions)$","service_name":"google.storage","resource_name":"storage.objects.testIamPermissions"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/projects/{projectId}/hmacKeys","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys)$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/projects/{projectId}/hmacKeys/{accessId}","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/projects/{projectId}/serviceAccount","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.storage","resource_name":"storage.projects.serviceAccount.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b","path_regex":"^(?:/storage/v1beta2/b)$","service_name":"google.storage","resource_name":"storage.buckets.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b","path_regex":"^(?:/storage/v1/b)$","service_name":"google.storage","resource_name":"storage.buckets.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/lockRetentionPolicy","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lockRetentionPolicy)$","service_name":"google.storage","resource_name":"storage.buckets.lockRetentionPolicy"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/notificationConfigs","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.storage","resource_name":"storage.notifications.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o/watch","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/watch)$","service_name":"google.storage","resource_name":"storage.objects.watchAll"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{destinationBucket}/o/{destinationObject}/compose","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compose)$","service_name":"google.storage","resource_name":"storage.objects.compose"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyTo/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.copy"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rewriteTo/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.rewrite"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/channels/stop","path_regex":"^(?:/storage/v1/channels/stop)$","service_name":"google.storage","resource_name":"storage.channels.stop"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/projects/{projectId}/hmacKeys","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys)$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.create"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b","path_regex":"^(?:/storage/v1beta2/b)$","service_name":"google.storage","resource_name":"storage.buckets.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/o","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/o/watch","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/watch)$","service_name":"google.storage","resource_name":"storage.objects.watchAll"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{destinationBucket}/o/{destinationObject}/compose","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compose)$","service_name":"google.storage","resource_name":"storage.objects.compose"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyTo/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.copy"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/channels/stop","path_regex":"^(?:/storage/v1beta2/channels/stop)$","service_name":"google.storage","resource_name":"storage.channels.stop"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.buckets.setIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/o/{object}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.objects.setIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/projects/{projectId}/hmacKeys/{accessId}","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.update"},{"hostname":"storagetransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/agentPools/{agentPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.delete"},{"hostname":"storagetransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/transferJobs/{transferJobsId}","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.delete"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/googleServiceAccounts/{projectId}","path_regex":"^(?:/v1/googleServiceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.googleServiceAccounts.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/agentPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.list"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/agentPools/{agentPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferJobs","path_regex":"^(?:/v1/transferJobs)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.list"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferJobs/{transferJobsId}","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferOperations","path_regex":"^(?:/v1/transferOperations)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.list"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferOperations/{transferOperationsId}","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/agentPools/{agentPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.patch"},{"hostname":"storagetransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/transferJobs/{transferJobsId}","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.patch"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/agentPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.create"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferJobs","path_regex":"^(?:/v1/transferJobs)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.create"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferJobs/{transferJobsId}:run","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.run"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferOperations/{transferOperationsId}:cancel","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.cancel"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferOperations/{transferOperationsId}:pause","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.pause"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferOperations/{transferOperationsId}:resume","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.resume"},{"hostname":"streetviewpublish.googleapis.com","http_method":"DELETE","path_template":"/v1/photo/{photoId}","path_regex":"^(?:/v1/photo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.delete"},{"hostname":"streetviewpublish.googleapis.com","http_method":"DELETE","path_template":"/v1/photoSequence/{sequenceId}","path_regex":"^(?:/v1/photoSequence/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.delete"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photo/{photoId}","path_regex":"^(?:/v1/photo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.get"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photoSequence/{sequenceId}","path_regex":"^(?:/v1/photoSequence/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.get"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photoSequences","path_regex":"^(?:/v1/photoSequences)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequences.list"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photos","path_regex":"^(?:/v1/photos)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.list"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photos:batchGet","path_regex":"^(?:/v1/photos:batchGet)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.batchGet"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photo","path_regex":"^(?:/v1/photo)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.create"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photo:startUpload","path_regex":"^(?:/v1/photo:startUpload)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.startUpload"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photoSequence","path_regex":"^(?:/v1/photoSequence)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.create"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photoSequence:startUpload","path_regex":"^(?:/v1/photoSequence:startUpload)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.startUpload"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photos:batchDelete","path_regex":"^(?:/v1/photos:batchDelete)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.batchDelete"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photos:batchUpdate","path_regex":"^(?:/v1/photos:batchUpdate)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.batchUpdate"},{"hostname":"streetviewpublish.googleapis.com","http_method":"PUT","path_template":"/v1/photo/{id}","path_regex":"^(?:/v1/photo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.update"},{"hostname":"sts.googleapis.com","http_method":"POST","path_template":"/v1/introspect","path_regex":"^(?:/v1/introspect)$","service_name":"google.sts","resource_name":"sts.introspect"},{"hostname":"sts.googleapis.com","http_method":"POST","path_template":"/v1/oauthtoken","path_regex":"^(?:/v1/oauthtoken)$","service_name":"google.sts","resource_name":"sts.oauthtoken"},{"hostname":"sts.googleapis.com","http_method":"POST","path_template":"/v1/token","path_regex":"^(?:/v1/token)$","service_name":"google.sts","resource_name":"sts.token"},{"hostname":"sts.googleapis.com","http_method":"POST","path_template":"/v1beta/token","path_regex":"^(?:/v1beta/token)$","service_name":"google.sts","resource_name":"sts.token"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags/{tagId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers/{triggerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables/{variableId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/permissions/{permissionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config/{gtag_configId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions/{user_permissionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts","path_regex":"^(?:/tagmanager/v1/accounts)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}/entities","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.entities.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags/{tagId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers/{triggerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables/{variableId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/permissions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/permissions/{permissionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts","path_regex":"^(?:/tagmanager/v2/accounts)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/containers:lookup","path_regex":"^(?:/tagmanager/v2/accounts/containers:lookup)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.lookup"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/destinations","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destinations)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.destinations.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/destinations/{destinationsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destinations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.destinations.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/version_headers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/version_headers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.version_headers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/version_headers:latest","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/version_headers:latest)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.version_headers.latest"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions:live","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:live)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.live"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config/{gtag_configId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/status","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/status)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.getStatus"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}:snippet","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::snippet)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.snippet"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions/{user_permissionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/publish","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.publish"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/restore","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restore)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.restore"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/undelete","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/undelete)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.undelete"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/permissions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/destinations:link","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destinations:link)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.destinations.link"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}:reauthorize","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reauthorize)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.reauthorize"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}:publish","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.publish"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}:set_latest","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::set_latest)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.set_latest"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}:undelete","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.undelete"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables:revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}:entities","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::entities)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.entities"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}:move_entities_to_folder","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move_entities_to_folder)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.move_entities_to_folder"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:create_version","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::create_version)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.create_version"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:quick_preview","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::quick_preview)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.quick_preview"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:resolve_conflict","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve_conflict)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.resolve_conflict"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:sync","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sync)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.sync"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}:combine","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::combine)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.combine"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}:move_tag_id","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move_tag_id)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.move_tag_id"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.create"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/move_folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move_folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.move_folders.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/reauthorize_environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reauthorize_environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.reauthorize_environments.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags/{tagId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers/{triggerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables/{variableId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/permissions/{permissionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config/{gtag_configId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions/{user_permissionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.update"},{"hostname":"tasks.googleapis.com","http_method":"DELETE","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.delete"},{"hostname":"tasks.googleapis.com","http_method":"DELETE","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.delete"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/lists/{tasklist}/tasks","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.tasks","resource_name":"tasks.tasks.list"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.get"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/users/@me/lists","path_regex":"^(?:/tasks/v1/users/@me/lists)$","service_name":"google.tasks","resource_name":"tasks.tasklists.list"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.get"},{"hostname":"tasks.googleapis.com","http_method":"PATCH","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.patch"},{"hostname":"tasks.googleapis.com","http_method":"PATCH","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.patch"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/lists/{tasklist}/clear","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clear)$","service_name":"google.tasks","resource_name":"tasks.tasks.clear"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/lists/{tasklist}/tasks","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.tasks","resource_name":"tasks.tasks.insert"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}/move","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.tasks","resource_name":"tasks.tasks.move"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/users/@me/lists","path_regex":"^(?:/tasks/v1/users/@me/lists)$","service_name":"google.tasks","resource_name":"tasks.tasklists.insert"},{"hostname":"tasks.googleapis.com","http_method":"PUT","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.update"},{"hostname":"tasks.googleapis.com","http_method":"PUT","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.update"},{"hostname":"testing.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/testMatrices/{testMatrixId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testMatrices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.testing","resource_name":"testing.projects.testMatrices.get"},{"hostname":"testing.googleapis.com","http_method":"GET","path_template":"/v1/testEnvironmentCatalog/{environmentType}","path_regex":"^(?:/v1/testEnvironmentCatalog/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.testing","resource_name":"testing.testEnvironmentCatalog.get"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/applicationDetailService/getApkDetails","path_regex":"^(?:/v1/applicationDetailService/getApkDetails)$","service_name":"google.testing","resource_name":"testing.applicationDetailService.getApkDetails"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/testMatrices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testMatrices)$","service_name":"google.testing","resource_name":"testing.projects.testMatrices.create"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/testMatrices/{testMatrixId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testMatrices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.testing","resource_name":"testing.projects.testMatrices.cancel"},{"hostname":"texttospeech.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.texttospeech","resource_name":"texttospeech.operations.delete"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.list"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.get"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1/voices","path_regex":"^(?:/v1/voices)$","service_name":"google.texttospeech","resource_name":"texttospeech.voices.list"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.list"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.get"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1beta1/voices","path_regex":"^(?:/v1beta1/voices)$","service_name":"google.texttospeech","resource_name":"texttospeech.voices.list"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.texttospeech","resource_name":"texttospeech.operations.cancel"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:synthesizeLongAudio","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::synthesizeLongAudio)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.synthesizeLongAudio"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1/text:synthesize","path_regex":"^(?:/v1/text:synthesize)$","service_name":"google.texttospeech","resource_name":"texttospeech.text.synthesize"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}:synthesizeLongAudio","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::synthesizeLongAudio)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.synthesizeLongAudio"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1beta1/text:synthesize","path_regex":"^(?:/v1beta1/text:synthesize)$","service_name":"google.texttospeech","resource_name":"texttospeech.text.synthesize"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/clusters","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.clusters.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/clusters/{clusterId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.clusters.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/environments","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.environments.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/environments/{environmentId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.environments.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfMetricsSummary","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfMetricsSummary)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.getPerfMetricsSummary"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries/{sampleSeriesId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries/{sampleSeriesId}/samples","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/samples)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.samples.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/testCases","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.testCases.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/testCases/{testCaseId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.testCases.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/thumbnails","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/thumbnails)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.thumbnails.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/settings","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.toolresults","resource_name":"toolresults.projects.getSettings"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectsId}/histories/{historiesId}/executions/{executionsId}/steps/{stepsId}:accessibilityClusters","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accessibilityClusters)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.accessibilityClusters"},{"hostname":"toolresults.googleapis.com","http_method":"PATCH","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.patch"},{"hostname":"toolresults.googleapis.com","http_method":"PATCH","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.patch"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfMetricsSummary","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfMetricsSummary)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfMetricsSummary.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries/{sampleSeriesId}/samples:batchCreate","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/samples:batchCreate)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.samples.batchCreate"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}:publishXunitXmlFiles","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publishXunitXmlFiles)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.publishXunitXmlFiles"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}:initializeSettings","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initializeSettings)$","service_name":"google.toolresults","resource_name":"toolresults.projects.initializeSettings"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.delete"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions/{tensorflowVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions/{tensorflowVersionsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/runtimeVersions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/runtimeVersions/{runtimeVersionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/runtimeVersions","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/runtimeVersions/{runtimeVersionsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.patch"},{"hostname":"tpu.googleapis.com","http_method":"PATCH","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.patch"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:reimage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reimage)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.reimage"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:reimage","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reimage)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.reimage"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:getGuestAttributes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getGuestAttributes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.getGuestAttributes"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}:generateServiceIdentity","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateServiceIdentity)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.generateServiceIdentity"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:getGuestAttributes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getGuestAttributes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.getGuestAttributes"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:simulateMaintenanceEvent","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::simulateMaintenanceEvent)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.simulateMaintenanceEvent"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}:generateServiceIdentity","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateServiceIdentity)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.generateServiceIdentity"},{"hostname":"tracing.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/traces","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces)$","service_name":"google.tracing","resource_name":"tracing.projects.traces.list"},{"hostname":"tracing.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/traces/{tracesId}:listSpans","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSpans)$","service_name":"google.tracing","resource_name":"tracing.projects.traces.listSpans"},{"hostname":"tracing.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/traces:batchWrite","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces:batchWrite)$","service_name":"google.tracing","resource_name":"tracing.projects.traces.batchWrite"},{"hostname":"tracing.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/traces/{tracesId}/spans/{spansId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tracing","resource_name":"tracing.projects.traces.spans.create"},{"hostname":"trafficdirector.googleapis.com","http_method":"POST","path_template":"/v2/discovery:client_status","path_regex":"^(?:/v2/discovery:client_status)$","service_name":"google.trafficdirector","resource_name":"trafficdirector.discovery.client_status"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.delete"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.delete"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.delete"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.delete"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.get"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.get"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.get"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.get"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.create"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.create"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.create"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.create"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries/{glossaryEntriesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.models.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.delete"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/language/translate/v2","path_regex":"^(?:/language/translate/v2)$","service_name":"google.translate","resource_name":"language.translations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/language/translate/v2/detect","path_regex":"^(?:/language/translate/v2/detect)$","service_name":"google.translate","resource_name":"language.detections.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/language/translate/v2/languages","path_regex":"^(?:/language/translate/v2/languages)$","service_name":"google.translate","resource_name":"language.languages.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.translate","resource_name":"translate.projects.locations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/examples","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.examples.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries/{glossaryEntriesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.translate","resource_name":"translate.projects.locations.models.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.models.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/supportedLanguages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.locations.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/supportedLanguages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.translate","resource_name":"translate.projects.locations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/supportedLanguages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.locations.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/supportedLanguages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.patch"},{"hostname":"translation.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries/{glossaryEntriesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.patch"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/language/translate/v2","path_regex":"^(?:/language/translate/v2)$","service_name":"google.translate","resource_name":"language.translations.translate"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/language/translate/v2/detect","path_regex":"^(?:/language/translate/v2/detect)$","service_name":"google.translate","resource_name":"language.detections.detect"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:exportData","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportData)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.exportData"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:importData","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importData)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.importData"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.translate","resource_name":"translate.projects.locations.models.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.cancel"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.wait"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:batchTranslateDocument","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:batchTranslateText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:detectLanguage","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.locations.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:translateDocument","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:translateText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:detectLanguage","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:translateText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.translateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.cancel"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.wait"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:batchTranslateDocument","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:batchTranslateText","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:detectLanguage","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.locations.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:translateDocument","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:translateText","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}:detectLanguage","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}:translateText","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.translateText"},{"hostname":"travelimpactmodel.googleapis.com","http_method":"POST","path_template":"/v1/flights:computeFlightEmissions","path_regex":"^(?:/v1/flights:computeFlightEmissions)$","service_name":"google.travelimpactmodel","resource_name":"travelimpactmodel.flights.computeFlightEmissions"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/exports/{exportId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.exports.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/holds/{holdId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/holds/{holdId}/accounts/{accountId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.accounts.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/savedQueries/{savedQueryId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.operations.delete"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters","path_regex":"^(?:/v1/matters)$","service_name":"google.vault","resource_name":"vault.matters.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/exports","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports)$","service_name":"google.vault","resource_name":"vault.matters.exports.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/exports/{exportId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.exports.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/holds","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds)$","service_name":"google.vault","resource_name":"vault.matters.holds.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/holds/{holdId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/holds/{holdId}/accounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.accounts.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/savedQueries","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/savedQueries/{savedQueryId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.vault","resource_name":"vault.operations.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.operations.get"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters","path_regex":"^(?:/v1/matters)$","service_name":"google.vault","resource_name":"vault.matters.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/exports","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports)$","service_name":"google.vault","resource_name":"vault.matters.exports.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds)$","service_name":"google.vault","resource_name":"vault.matters.holds.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds/{holdId}/accounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.accounts.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds/{holdId}:addHeldAccounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addHeldAccounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.addHeldAccounts"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds/{holdId}:removeHeldAccounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeHeldAccounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.removeHeldAccounts"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/savedQueries","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:addPermissions","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addPermissions)$","service_name":"google.vault","resource_name":"vault.matters.addPermissions"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:close","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.vault","resource_name":"vault.matters.close"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:count","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::count)$","service_name":"google.vault","resource_name":"vault.matters.count"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:removePermissions","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removePermissions)$","service_name":"google.vault","resource_name":"vault.matters.removePermissions"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:reopen","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reopen)$","service_name":"google.vault","resource_name":"vault.matters.reopen"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:undelete","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.vault","resource_name":"vault.matters.undelete"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vault","resource_name":"vault.operations.cancel"},{"hostname":"vault.googleapis.com","http_method":"PUT","path_template":"/v1/matters/{matterId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.update"},{"hostname":"vault.googleapis.com","http_method":"PUT","path_template":"/v1/matters/{matterId}/holds/{holdId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.update"},{"hostname":"vectortile.googleapis.com","http_method":"GET","path_template":"/v1/featuretiles/{featuretilesId}","path_regex":"^(?:/v1/featuretiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vectortile","resource_name":"vectortile.featuretiles.get"},{"hostname":"vectortile.googleapis.com","http_method":"GET","path_template":"/v1/terraintiles/{terraintilesId}","path_regex":"^(?:/v1/terraintiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vectortile","resource_name":"vectortile.terraintiles.get"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v1/challenge","path_regex":"^(?:/v1/challenge)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.create"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v1/challenge:verify","path_regex":"^(?:/v1/challenge:verify)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.verify"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v2/challenge:generate","path_regex":"^(?:/v2/challenge:generate)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.generate"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v2/challenge:verify","path_regex":"^(?:/v2/challenge:verify)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.verify"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.list"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms/{platformsId}/channels","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.channels.list"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms/{platformsId}/channels/{channelsId}/versions","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.channels.versions.list"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms/{platformsId}/channels/{channelsId}/versions/{versionsId}/releases","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.channels.versions.releases.list"},{"hostname":"videointelligence.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.operations.projects.locations.operations.delete"},{"hostname":"videointelligence.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.delete"},{"hostname":"videointelligence.googleapis.com","http_method":"GET","path_template":"/v1/operations/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.operations.projects.locations.operations.get"},{"hostname":"videointelligence.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.list"},{"hostname":"videointelligence.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.get"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1/operations/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.videointelligence","resource_name":"videointelligence.operations.projects.locations.operations.cancel"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.cancel"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1/videos:annotate","path_regex":"^(?:/v1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1beta2/videos:annotate","path_regex":"^(?:/v1beta2/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/videos:annotate","path_regex":"^(?:/v1p1beta1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/videos:annotate","path_regex":"^(?:/v1p2beta1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1p3beta1/videos:annotate","path_regex":"^(?:/v1p3beta1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.operations.delete"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.delete"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.delete"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages/{referenceImagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.delete"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.locations.operations.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.vision","resource_name":"vision.operations.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.operations.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.operations.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}/products","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.products.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages/{referenceImagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.operations.get"},{"hostname":"vision.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.patch"},{"hostname":"vision.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.patch"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/files:annotate","path_regex":"^(?:/v1/files:annotate)$","service_name":"google.vision","resource_name":"vision.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/files:asyncBatchAnnotate","path_regex":"^(?:/v1/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/images:annotate","path_regex":"^(?:/v1/images:annotate)$","service_name":"google.vision","resource_name":"vision.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/images:asyncBatchAnnotate","path_regex":"^(?:/v1/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vision","resource_name":"vision.operations.cancel"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/files:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/images:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/files:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/images:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.create"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}:addProduct","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addProduct)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.addProduct"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}:removeProduct","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeProduct)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.removeProduct"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets:import)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.import"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.create"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.create"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:purge)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.purge"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/files:annotate","path_regex":"^(?:/v1p1beta1/files:annotate)$","service_name":"google.vision","resource_name":"vision.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/files:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/images:annotate","path_regex":"^(?:/v1p1beta1/images:annotate)$","service_name":"google.vision","resource_name":"vision.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/images:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/files:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/images:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/files:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/images:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/files:annotate","path_regex":"^(?:/v1p2beta1/files:annotate)$","service_name":"google.vision","resource_name":"vision.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/files:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/images:annotate","path_regex":"^(?:/v1p2beta1/images:annotate)$","service_name":"google.vision","resource_name":"vision.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/images:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/files:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/images:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/files:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/images:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.asyncBatchAnnotate"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles/{replicationCyclesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}:fetchInventory","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchInventory)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.fetchInventory"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles/{replicationCyclesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}:fetchInventory","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchInventory)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.fetchInventory"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.get"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addGroupMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.addGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeGroupMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.removeGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}:upgradeAppliance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeAppliance)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.upgradeAppliance"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:finalizeMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finalizeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.finalizeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:pauseMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pauseMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.pauseMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:resumeMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resumeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.resumeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:startMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.startMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addGroupMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.addGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeGroupMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.removeGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}:upgradeAppliance","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeAppliance)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.upgradeAppliance"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:finalizeMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finalizeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.finalizeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:pauseMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pauseMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.pauseMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:resumeMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resumeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.resumeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:startMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.startMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.create"},{"hostname":"vpcaccess.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.delete"},{"hostname":"vpcaccess.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.delete"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.patch"},{"hostname":"vpcaccess.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.patch"},{"hostname":"vpcaccess.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.create"},{"hostname":"vpcaccess.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.create"},{"hostname":"webfonts.googleapis.com","http_method":"GET","path_template":"/v1/webfonts","path_regex":"^(?:/v1/webfonts)$","service_name":"google.webfonts","resource_name":"webfonts.webfonts.list"},{"hostname":"webrisk.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.delete"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/hashes:search","path_regex":"^(?:/v1/hashes:search)$","service_name":"google.webrisk","resource_name":"webrisk.hashes.search"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.list"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.get"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/threatLists:computeDiff","path_regex":"^(?:/v1/threatLists:computeDiff)$","service_name":"google.webrisk","resource_name":"webrisk.threatLists.computeDiff"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/uris:search","path_regex":"^(?:/v1/uris:search)$","service_name":"google.webrisk","resource_name":"webrisk.uris.search"},{"hostname":"webrisk.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.cancel"},{"hostname":"webrisk.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/submissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/submissions)$","service_name":"google.webrisk","resource_name":"webrisk.projects.submissions.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.delete"},{"hostname":"websecurityscanner.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.delete"},{"hostname":"websecurityscanner.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.delete"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/crawledUrls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crawledUrls)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.crawledUrls.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findingTypeStats","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findingTypeStats)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findingTypeStats.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings/{findingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/crawledUrls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crawledUrls)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.crawledUrls.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findingTypeStats","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findingTypeStats)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findingTypeStats.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings/{findingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/crawledUrls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crawledUrls)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.crawledUrls.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findingTypeStats","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findingTypeStats)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findingTypeStats.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings/{findingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.patch"},{"hostname":"websecurityscanner.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.patch"},{"hostname":"websecurityscanner.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.patch"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.stop"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.start"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}:stop","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.stop"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}:start","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.start"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}:stop","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.stop"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}:start","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.start"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.list"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.get"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.list"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.get"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.create"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.cancel"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}:triggerPubsubExecution","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::triggerPubsubExecution)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.triggerPubsubExecution"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.create"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.cancel"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.delete"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.delete"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.delete"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.delete"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.get"},{"hostname":"workflows.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.patch"},{"hostname":"workflows.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.patch"},{"hostname":"workflows.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.create"},{"hostname":"workflows.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.create"},{"hostname":"workloadmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.delete"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}/results","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.results.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}/scannedResources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scannedResources)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.scannedResources.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/rules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.rules.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.create"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions:run)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.run"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insights:writeInsight","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights:writeInsight)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.insights.writeInsight"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.cancel"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.delete"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.getIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations:listUsable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations:listUsable)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.listUsable"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.getIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs:listUsable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs:listUsable)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.listUsable"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.patch"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.cancel"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:generateAccessToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.generateAccessToken"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.setIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:start","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.start"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:stop","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.stop"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.testIamPermissions"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.setIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.testIamPermissions"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsense/v1.4/accounts/{accountId}/alerts/{alertId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsense/v1.4/alerts/{alertId}","path_regex":"^(?:/adsense/v1\\.4/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.alerts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsensehost/v4.1/adclients/{adClientId}/urlchannels/{urlChannelId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.urlchannels.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/appstate/v1/states/{stateKey}","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appstate","resource_name":"appstate.states.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/drives/{driveId}","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/trash","path_regex":"^(?:/drive/v2/files/trash)$","service_name":"google.drive","resource_name":"drive.files.emptyTrash"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/parents/{parentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.parents.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{folderId}/children/{childId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.children.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v2/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/drives/{driveId}","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/trash","path_regex":"^(?:/drive/v3/files/trash)$","service_name":"google.drive","resource_name":"drive.files.emptyTrash"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v3/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/subscriptions/{id}","path_regex":"^(?:/mirror/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.subscriptions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/timeline/{itemId}/attachments/{attachmentId}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/surveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.surveys","resource_name":"surveys.surveys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sites.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/youtube/analytics/v1beta1/groupItems","path_regex":"^(?:/youtube/analytics/v1beta1/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.delete"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/accounts","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.2/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/creatives/{accountId}/{buyerCreativeId}","path_regex":"^(?:/adexchangebuyer/v1\\.2/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/accounts","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/billinginfo","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.3/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/creatives/{accountId}/{buyerCreativeId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/directdeals","path_regex":"^(?:/adexchangebuyer/v1\\.3/directdeals)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.directDeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/directdeals/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/directdeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.directDeals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/performancereport","path_regex":"^(?:/adexchangebuyer/v1\\.3/performancereport)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.performanceReport.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/accounts","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/billinginfo","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}/listDeals","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listDeals)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.listDeals"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/performancereport","path_regex":"^(?:/adexchangebuyer/v1\\.4/performancereport)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.performanceReport.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/products/search","path_regex":"^(?:/adexchangebuyer/v1\\.4/products/search)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.products.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/products/{productId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.products.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/search","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/search)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/notes","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacenotes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/publisher/{accountId}/profiles","path_regex":"^(?:/adexchangebuyer/v1\\.4/publisher/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pubprofiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/accounts/{accountId}","path_regex":"^(?:/adexchangeseller/v1\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/adunits","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/alerts","path_regex":"^(?:/adexchangeseller/v1\\.1/alerts)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/metadata/dimensions","path_regex":"^(?:/adexchangeseller/v1\\.1/metadata/dimensions)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/metadata/metrics","path_regex":"^(?:/adexchangeseller/v1\\.1/metadata/metrics)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/preferreddeals","path_regex":"^(?:/adexchangeseller/v1\\.1/preferreddeals)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.preferreddeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/preferreddeals/{dealId}","path_regex":"^(?:/adexchangeseller/v1\\.1/preferreddeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.preferreddeals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/reports","path_regex":"^(?:/adexchangeseller/v1\\.1/reports)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/reports/saved","path_regex":"^(?:/adexchangeseller/v1\\.1/reports/saved)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/reports/{savedReportId}","path_regex":"^(?:/adexchangeseller/v1\\.1/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients","path_regex":"^(?:/adexchangeseller/v1/adclients)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/adunits","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/reports","path_regex":"^(?:/adexchangeseller/v1/reports)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/reports/saved","path_regex":"^(?:/adexchangeseller/v1/reports/saved)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/reports/{savedReportId}","path_regex":"^(?:/adexchangeseller/v1/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients/{adClientId}/customchannels","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/alerts","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/metadata/dimensions","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata/dimensions)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/metadata/metrics","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata/metrics)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/preferreddeals","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferreddeals)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.preferreddeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/preferreddeals/{dealId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferreddeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.preferreddeals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/reports","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/reports/saved","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/reports/{savedReportId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts","path_regex":"^(?:/adsense/v1\\.3/accounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/alerts","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/reports","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/reports/saved","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/savedadstyles","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients","path_regex":"^(?:/adsense/v1\\.3/adclients)$","service_name":"google.adsense","resource_name":"adsense.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/alerts","path_regex":"^(?:/adsense/v1\\.3/alerts)$","service_name":"google.adsense","resource_name":"adsense.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/metadata/dimensions","path_regex":"^(?:/adsense/v1\\.3/metadata/dimensions)$","service_name":"google.adsense","resource_name":"adsense.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/metadata/metrics","path_regex":"^(?:/adsense/v1\\.3/metadata/metrics)$","service_name":"google.adsense","resource_name":"adsense.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/reports","path_regex":"^(?:/adsense/v1\\.3/reports)$","service_name":"google.adsense","resource_name":"adsense.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/reports/saved","path_regex":"^(?:/adsense/v1\\.3/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.3/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/savedadstyles","path_regex":"^(?:/adsense/v1\\.3/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.3/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts","path_regex":"^(?:/adsense/v1\\.4/accounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adcode","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/alerts","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/payments","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/payments)$","service_name":"google.adsense","resource_name":"adsense.accounts.payments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/reports","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/reports/saved","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/savedadstyles","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients","path_regex":"^(?:/adsense/v1\\.4/adclients)$","service_name":"google.adsense","resource_name":"adsense.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/alerts","path_regex":"^(?:/adsense/v1\\.4/alerts)$","service_name":"google.adsense","resource_name":"adsense.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/metadata/dimensions","path_regex":"^(?:/adsense/v1\\.4/metadata/dimensions)$","service_name":"google.adsense","resource_name":"adsense.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/metadata/metrics","path_regex":"^(?:/adsense/v1\\.4/metadata/metrics)$","service_name":"google.adsense","resource_name":"adsense.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/payments","path_regex":"^(?:/adsense/v1\\.4/payments)$","service_name":"google.adsense","resource_name":"adsense.payments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/reports","path_regex":"^(?:/adsense/v1\\.4/reports)$","service_name":"google.adsense","resource_name":"adsense.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/reports/saved","path_regex":"^(?:/adsense/v1\\.4/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.4/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/savedadstyles","path_regex":"^(?:/adsense/v1\\.4/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.4/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts","path_regex":"^(?:/adsensehost/v4\\.1/accounts)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adclients.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/reports","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients","path_regex":"^(?:/adsensehost/v4\\.1/adclients)$","service_name":"google.adsensehost","resource_name":"adsensehost.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.adclients.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/associationsessions/start","path_regex":"^(?:/adsensehost/v4\\.1/associationsessions/start)$","service_name":"google.adsensehost","resource_name":"adsensehost.associationsessions.start"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/associationsessions/verify","path_regex":"^(?:/adsensehost/v4\\.1/associationsessions/verify)$","service_name":"google.adsensehost","resource_name":"adsensehost.associationsessions.verify"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/reports","path_regex":"^(?:/adsensehost/v4\\.1/reports)$","service_name":"google.adsensehost","resource_name":"adsensehost.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/data","path_regex":"^(?:/analytics/v2\\.4/data)$","service_name":"google.analytics","resource_name":"analytics.data.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts","path_regex":"^(?:/analytics/v2\\.4/management/accounts)$","service_name":"google.analytics","resource_name":"analytics.management.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts/{accountId}/webproperties","path_regex":"^(?:/analytics/v2\\.4/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties)$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles","path_regex":"^(?:/analytics/v2\\.4/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.analytics","resource_name":"analytics.management.profiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals","path_regex":"^(?:/analytics/v2\\.4/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals)$","service_name":"google.analytics","resource_name":"analytics.management.goals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/segments","path_regex":"^(?:/analytics/v2\\.4/management/segments)$","service_name":"google.analytics","resource_name":"analytics.management.segments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v1.1/applications/{packageName}/inapp/{productId}/purchases/{token}","path_regex":"^(?:/androidpublisher/v1\\.1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inapp/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inapppurchases.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v2/applications/{packageName}/purchases/products/{productId}/tokens/{token}","path_regex":"^(?:/androidpublisher/v2/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v2/applications/{packageName}/purchases/voidedpurchases","path_regex":"^(?:/androidpublisher/v2/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/voidedpurchases)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.voidedpurchases.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/appsactivity/v1/activities","path_regex":"^(?:/appsactivity/v1/activities)$","service_name":"google.appsactivity","resource_name":"appsactivity.activities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/appstate/v1/states","path_regex":"^(?:/appstate/v1/states)$","service_name":"google.appstate","resource_name":"appstate.states.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/appstate/v1/states/{stateKey}","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appstate","resource_name":"appstate.states.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/byurl","path_regex":"^(?:/blogger/v3/blogs/byurl)$","service_name":"google.blogger","resource_name":"blogger.blogs.getByUrl"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/comments","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.listByBlog"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/pages","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/pageviews","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pageviews)$","service_name":"google.blogger","resource_name":"blogger.pageViews.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/bypath","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/bypath)$","service_name":"google.blogger","resource_name":"blogger.posts.getByPath"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/search","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/search)$","service_name":"google.blogger","resource_name":"blogger.posts.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.users.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs)$","service_name":"google.blogger","resource_name":"blogger.blogs.listByUser"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs/{blogId}","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogUserInfos.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs/{blogId}/posts","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/acl","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.calendar","resource_name":"calendar.acl.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/events","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.calendar","resource_name":"calendar.events.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}/instances","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.calendar","resource_name":"calendar.events.instances"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/colors","path_regex":"^(?:/calendar/v3/colors)$","service_name":"google.calendar","resource_name":"calendar.colors.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/calendarList","path_regex":"^(?:/calendar/v3/users/me/calendarList)$","service_name":"google.calendar","resource_name":"calendar.calendarList.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/settings","path_regex":"^(?:/calendar/v3/users/me/settings)$","service_name":"google.calendar","resource_name":"calendar.settings.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/settings/{setting}","path_regex":"^(?:/calendar/v3/users/me/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.settings.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/mobileAppPanels","path_regex":"^(?:/consumersurveys/v2/mobileAppPanels)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.mobileapppanels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/mobileAppPanels/{panelId}","path_regex":"^(?:/consumersurveys/v2/mobileAppPanels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.mobileapppanels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/surveys","path_regex":"^(?:/consumersurveys/v2/surveys)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}/results","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.results.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orderreturns","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns)$","service_name":"google.content","resource_name":"content.orderreturns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orderreturns/{returnId}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orderreturns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orders","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.content","resource_name":"content.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/ordersbymerchantid/{merchantOrderId}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordersbymerchantid/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.getbymerchantorderid"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/testordertemplates/{templateName}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testordertemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.gettestordertemplate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v2\\.7/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySiteContacts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySiteContacts/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.0/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySiteContacts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySiteContacts/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.1/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.2/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySiteContacts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySiteContacts/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/discovery/v1/apis","path_regex":"^(?:/discovery/v1/apis)$","service_name":"google.discovery","resource_name":"discovery.apis.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/discovery/v1/apis/{api}/{version}/rest","path_regex":"^(?:/discovery/v1/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rest)$","service_name":"google.discovery","resource_name":"discovery.apis.getRest"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/about","path_regex":"^(?:/drive/v2/about)$","service_name":"google.drive","resource_name":"drive.about.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/apps","path_regex":"^(?:/drive/v2/apps)$","service_name":"google.drive","resource_name":"drive.apps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/apps/{appId}","path_regex":"^(?:/drive/v2/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.apps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/changes","path_regex":"^(?:/drive/v2/changes)$","service_name":"google.drive","resource_name":"drive.changes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/changes/startPageToken","path_regex":"^(?:/drive/v2/changes/startPageToken)$","service_name":"google.drive","resource_name":"drive.changes.getStartPageToken"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/changes/{changeId}","path_regex":"^(?:/drive/v2/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.changes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/drives","path_regex":"^(?:/drive/v2/drives)$","service_name":"google.drive","resource_name":"drive.drives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/drives/{driveId}","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files","path_regex":"^(?:/drive/v2/files)$","service_name":"google.drive","resource_name":"drive.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/generateIds","path_regex":"^(?:/drive/v2/files/generateIds)$","service_name":"google.drive","resource_name":"drive.files.generateIds"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/export","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.drive","resource_name":"drive.files.export"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/listLabels","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listLabels)$","service_name":"google.drive","resource_name":"drive.files.listLabels"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/parents","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents)$","service_name":"google.drive","resource_name":"drive.parents.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/parents/{parentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.parents.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/permissions","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/properties","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties)$","service_name":"google.drive","resource_name":"drive.properties.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/revisions","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.drive","resource_name":"drive.revisions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{folderId}/children","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children)$","service_name":"google.drive","resource_name":"drive.children.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{folderId}/children/{childId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.children.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/permissionIds/{email}","path_regex":"^(?:/drive/v2/permissionIds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.getIdForEmail"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/teamdrives","path_regex":"^(?:/drive/v2/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v2/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/about","path_regex":"^(?:/drive/v3/about)$","service_name":"google.drive","resource_name":"drive.about.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/changes","path_regex":"^(?:/drive/v3/changes)$","service_name":"google.drive","resource_name":"drive.changes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/changes/startPageToken","path_regex":"^(?:/drive/v3/changes/startPageToken)$","service_name":"google.drive","resource_name":"drive.changes.getStartPageToken"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/drives","path_regex":"^(?:/drive/v3/drives)$","service_name":"google.drive","resource_name":"drive.drives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/drives/{driveId}","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files","path_regex":"^(?:/drive/v3/files)$","service_name":"google.drive","resource_name":"drive.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/generateIds","path_regex":"^(?:/drive/v3/files/generateIds)$","service_name":"google.drive","resource_name":"drive.files.generateIds"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/export","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.drive","resource_name":"drive.files.export"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/listLabels","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listLabels)$","service_name":"google.drive","resource_name":"drive.files.listLabels"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/permissions","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/revisions","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.drive","resource_name":"drive.revisions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/teamdrives","path_regex":"^(?:/drive/v3/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v3/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/query","path_regex":"^(?:/fusiontables/v1/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sqlGet"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables","path_regex":"^(?:/fusiontables/v1/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/tasks","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.fusiontables","resource_name":"fusiontables.task.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/query","path_regex":"^(?:/fusiontables/v2/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sqlGet"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables","path_regex":"^(?:/fusiontables/v2/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/tasks","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.fusiontables","resource_name":"fusiontables.task.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/groups/v1/groups/{groupUniqueId}","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.groupssettings","resource_name":"groupsSettings.groups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/identitytoolkit/v3/relyingparty/getProjectConfig","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getProjectConfig)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getProjectConfig"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/identitytoolkit/v3/relyingparty/getRecaptchaParam","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getRecaptchaParam)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getRecaptchaParam"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/identitytoolkit/v3/relyingparty/publicKeys","path_regex":"^(?:/identitytoolkit/v3/relyingparty/publicKeys)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getPublicKeys"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/contacts","path_regex":"^(?:/mirror/v1/contacts)$","service_name":"google.mirror","resource_name":"mirror.contacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/locations","path_regex":"^(?:/mirror/v1/locations)$","service_name":"google.mirror","resource_name":"mirror.locations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/locations/{id}","path_regex":"^(?:/mirror/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.locations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/settings/{id}","path_regex":"^(?:/mirror/v1/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.settings.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/subscriptions","path_regex":"^(?:/mirror/v1/subscriptions)$","service_name":"google.mirror","resource_name":"mirror.subscriptions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline","path_regex":"^(?:/mirror/v1/timeline)$","service_name":"google.mirror","resource_name":"mirror.timeline.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline/{itemId}/attachments","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline/{itemId}/attachments/{attachmentId}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/oauth2/v1/userinfo","path_regex":"^(?:/oauth2/v1/userinfo)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/oauth2/v2/userinfo","path_regex":"^(?:/oauth2/v2/userinfo)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v1/runPagespeed","path_regex":"^(?:/pagespeedonline/v1/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v2/runPagespeed","path_regex":"^(?:/pagespeedonline/v2/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v4/runPagespeed","path_regex":"^(?:/pagespeedonline/v4/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities","path_regex":"^(?:/plus/v1/activities)$","service_name":"google.plus","resource_name":"plus.activities.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities/{activityId}","path_regex":"^(?:/plus/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.activities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities/{activityId}/comments","path_regex":"^(?:/plus/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.plus","resource_name":"plus.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities/{activityId}/people/{collection}","path_regex":"^(?:/plus/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.people.listByActivity"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/comments/{commentId}","path_regex":"^(?:/plus/v1/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people","path_regex":"^(?:/plus/v1/people)$","service_name":"google.plus","resource_name":"plus.people.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people/{userId}","path_regex":"^(?:/plus/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.people.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people/{userId}/activities/{collection}","path_regex":"^(?:/plus/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.activities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people/{userId}/people/{collection}","path_regex":"^(?:/plus/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.people.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/activities/{activityId}","path_regex":"^(?:/plusDomains/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.activities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/activities/{activityId}/comments","path_regex":"^(?:/plusDomains/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.plusDomains","resource_name":"plusDomains.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/activities/{activityId}/people/{collection}","path_regex":"^(?:/plusDomains/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.people.listByActivity"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/comments/{commentId}","path_regex":"^(?:/plusDomains/v1/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.people.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/activities/{collection}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.activities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/audiences","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences)$","service_name":"google.plusDomains","resource_name":"plusDomains.audiences.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/circles","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/circles)$","service_name":"google.plusDomains","resource_name":"plusDomains.circles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/people/{collection}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.people.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools)$","service_name":"google.replicapool","resource_name":"replicapool.pools.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.pools.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas)$","service_name":"google.replicapool","resource_name":"replicapool.replicas.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.replicas.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.zoneOperations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.zoneOperations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/instanceUpdates","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceUpdates)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.listInstanceUpdates"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/siteVerification/v1/webResource","path_regex":"^(?:/siteVerification/v1/webResource)$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b","path_regex":"^(?:/storage/v1beta1/b)$","service_name":"google.storage","resource_name":"storage.buckets.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/surveys/v2/surveys","path_regex":"^(?:/surveys/v2/surveys)$","service_name":"google.surveys","resource_name":"surveys.surveys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/surveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.surveys","resource_name":"surveys.surveys.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/surveys/v2/surveys/{surveyUrlId}/results","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.surveys","resource_name":"surveys.results.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/urlshortener/v1/url","path_regex":"^(?:/urlshortener/v1/url)$","service_name":"google.urlshortener","resource_name":"urlshortener.url.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/urlshortener/v1/url/history","path_regex":"^(?:/urlshortener/v1/url/history)$","service_name":"google.urlshortener","resource_name":"urlshortener.url.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/userinfo/v2/me","path_regex":"^(?:/userinfo/v2/me)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.v2.me.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/userinfo/v2/me","path_regex":"^(?:/userinfo/v2/me)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.v2.me.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites","path_regex":"^(?:/webmasters/v3/sites)$","service_name":"google.webmasters","resource_name":"webmasters.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps)$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/youtube/analytics/v1beta1/groupItems","path_regex":"^(?:/youtube/analytics/v1beta1/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/youtube/analytics/v1beta1/reports","path_regex":"^(?:/youtube/analytics/v1beta1/reports)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.reports.query"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.2/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.3/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/{revisionNumber}/{updateAction}","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/drives/{driveId}","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v3/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/groups/v1/groups/{groupUniqueId}","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.groupssettings","resource_name":"groupsSettings.groups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.patch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.2/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.2/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.3/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.3/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}/addDeal/{dealId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addDeal/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.addDeal"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}/removeDeal/{dealId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeDeal/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.removeDeal"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/privateauction/{privateAuctionId}/updateproposal","path_regex":"^(?:/adexchangebuyer/v1\\.4/privateauction/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateproposal)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplaceprivateauction.updateproposal"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/insert","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/insert)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals/delete","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/delete)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.delete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals/insert","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/insert)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals/update","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/update)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.update"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/notes/insert","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/insert)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacenotes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/setupcomplete","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setupcomplete)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.setupcomplete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adsensehost/v4.1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.urlchannels.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/appstate/v1/states/{stateKey}/clear","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clear)$","service_name":"google.appstate","resource_name":"appstate.states.clear"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/pages","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/approve","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approve)$","service_name":"google.blogger","resource_name":"blogger.comments.approve"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/removecontent","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removecontent)$","service_name":"google.blogger","resource_name":"blogger.comments.removeContent"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/spam","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spam)$","service_name":"google.blogger","resource_name":"blogger.comments.markAsSpam"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/publish","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.blogger","resource_name":"blogger.posts.publish"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/revert","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revert)$","service_name":"google.blogger","resource_name":"blogger.posts.revert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars","path_regex":"^(?:/calendar/v3/calendars)$","service_name":"google.calendar","resource_name":"calendar.calendars.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/acl","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.calendar","resource_name":"calendar.acl.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/acl/watch","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/watch)$","service_name":"google.calendar","resource_name":"calendar.acl.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/clear","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clear)$","service_name":"google.calendar","resource_name":"calendar.calendars.clear"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.calendar","resource_name":"calendar.events.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/import","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/import)$","service_name":"google.calendar","resource_name":"calendar.events.import"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/quickAdd","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/quickAdd)$","service_name":"google.calendar","resource_name":"calendar.events.quickAdd"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/watch","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/watch)$","service_name":"google.calendar","resource_name":"calendar.events.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}/move","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.calendar","resource_name":"calendar.events.move"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/channels/stop","path_regex":"^(?:/calendar/v3/channels/stop)$","service_name":"google.calendar","resource_name":"calendar.channels.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/freeBusy","path_regex":"^(?:/calendar/v3/freeBusy)$","service_name":"google.calendar","resource_name":"calendar.freebusy.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/users/me/calendarList","path_regex":"^(?:/calendar/v3/users/me/calendarList)$","service_name":"google.calendar","resource_name":"calendar.calendarList.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/users/me/calendarList/watch","path_regex":"^(?:/calendar/v3/users/me/calendarList/watch)$","service_name":"google.calendar","resource_name":"calendar.calendarList.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/users/me/settings/watch","path_regex":"^(?:/calendar/v3/users/me/settings/watch)$","service_name":"google.calendar","resource_name":"calendar.settings.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/consumersurveys/v2/surveys","path_regex":"^(?:/consumersurveys/v2/surveys)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/consumersurveys/v2/surveys/{resourceId}/start","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.start"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/consumersurveys/v2/surveys/{resourceId}/stop","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/orders/batch","path_regex":"^(?:/content/v2sandbox/orders/batch)$","service_name":"google.content","resource_name":"content.orders.custombatch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderinvoices/{orderId}/createChargeInvoice","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createChargeInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createchargeinvoice"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderinvoices/{orderId}/createRefundInvoice","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createRefundInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createrefundinvoice"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyAuthApproved","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyAuthApproved)$","service_name":"google.content","resource_name":"content.orderpayments.notifyauthapproved"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyAuthDeclined","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyAuthDeclined)$","service_name":"google.content","resource_name":"content.orderpayments.notifyauthdeclined"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyCharge","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyCharge)$","service_name":"google.content","resource_name":"content.orderpayments.notifycharge"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyRefund","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyRefund)$","service_name":"google.content","resource_name":"content.orderpayments.notifyrefund"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/acknowledge","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orders.acknowledge"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/cancel","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.content","resource_name":"content.orders.cancel"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/cancelLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelLineItem)$","service_name":"google.content","resource_name":"content.orders.cancellineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/inStoreRefundLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inStoreRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.instorerefundlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/refund","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refund)$","service_name":"google.content","resource_name":"content.orders.refund"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/rejectReturnLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rejectReturnLineItem)$","service_name":"google.content","resource_name":"content.orders.rejectreturnlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/returnLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnLineItem)$","service_name":"google.content","resource_name":"content.orders.returnlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/returnRefundLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.returnrefundlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/setLineItemMetadata","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLineItemMetadata)$","service_name":"google.content","resource_name":"content.orders.setlineitemmetadata"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/shipLineItems","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shipLineItems)$","service_name":"google.content","resource_name":"content.orders.shiplineitems"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/testreturn","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testreturn)$","service_name":"google.content","resource_name":"content.orders.createtestreturn"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/updateLineItemShippingDetails","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateLineItemShippingDetails)$","service_name":"google.content","resource_name":"content.orders.updatelineitemshippingdetails"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/updateMerchantOrderId","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateMerchantOrderId)$","service_name":"google.content","resource_name":"content.orders.updatemerchantorderid"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/updateShipment","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShipment)$","service_name":"google.content","resource_name":"content.orders.updateshipment"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/testorders","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders)$","service_name":"google.content","resource_name":"content.orders.createtestorder"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/testorders/{orderId}/advance","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advance)$","service_name":"google.content","resource_name":"content.orders.advancetestorder"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/testorders/{orderId}/cancelByCustomer","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelByCustomer)$","service_name":"google.content","resource_name":"content.orders.canceltestorderbycustomer"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/changes/watch","path_regex":"^(?:/drive/v2/changes/watch)$","service_name":"google.drive","resource_name":"drive.changes.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/channels/stop","path_regex":"^(?:/drive/v2/channels/stop)$","service_name":"google.drive","resource_name":"drive.channels.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/drives","path_regex":"^(?:/drive/v2/drives)$","service_name":"google.drive","resource_name":"drive.drives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/drives/{driveId}/hide","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hide)$","service_name":"google.drive","resource_name":"drive.drives.hide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/drives/{driveId}/unhide","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unhide)$","service_name":"google.drive","resource_name":"drive.drives.unhide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files","path_regex":"^(?:/drive/v2/files)$","service_name":"google.drive","resource_name":"drive.files.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/comments","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/copy","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.drive","resource_name":"drive.files.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/modifyLabels","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modifyLabels)$","service_name":"google.drive","resource_name":"drive.files.modifyLabels"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/parents","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents)$","service_name":"google.drive","resource_name":"drive.parents.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/permissions","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/properties","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties)$","service_name":"google.drive","resource_name":"drive.properties.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/touch","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/touch)$","service_name":"google.drive","resource_name":"drive.files.touch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/trash","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trash)$","service_name":"google.drive","resource_name":"drive.files.trash"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/untrash","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/untrash)$","service_name":"google.drive","resource_name":"drive.files.untrash"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/watch","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.drive","resource_name":"drive.files.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{folderId}/children","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children)$","service_name":"google.drive","resource_name":"drive.children.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/teamdrives","path_regex":"^(?:/drive/v2/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/changes/watch","path_regex":"^(?:/drive/v3/changes/watch)$","service_name":"google.drive","resource_name":"drive.changes.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/channels/stop","path_regex":"^(?:/drive/v3/channels/stop)$","service_name":"google.drive","resource_name":"drive.channels.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/drives","path_regex":"^(?:/drive/v3/drives)$","service_name":"google.drive","resource_name":"drive.drives.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/drives/{driveId}/hide","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hide)$","service_name":"google.drive","resource_name":"drive.drives.hide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/drives/{driveId}/unhide","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unhide)$","service_name":"google.drive","resource_name":"drive.drives.unhide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files","path_regex":"^(?:/drive/v3/files)$","service_name":"google.drive","resource_name":"drive.files.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/comments","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/copy","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.drive","resource_name":"drive.files.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/modifyLabels","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modifyLabels)$","service_name":"google.drive","resource_name":"drive.files.modifyLabels"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/permissions","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/watch","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.drive","resource_name":"drive.files.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/teamdrives","path_regex":"^(?:/drive/v3/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/query","path_regex":"^(?:/fusiontables/v1/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sql"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables","path_regex":"^(?:/fusiontables/v1/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/import","path_regex":"^(?:/fusiontables/v1/tables/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importTable"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/copy","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/import","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importRows"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/query","path_regex":"^(?:/fusiontables/v2/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sql"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables","path_regex":"^(?:/fusiontables/v2/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/import","path_regex":"^(?:/fusiontables/v2/tables/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importTable"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/copy","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/import","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importRows"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/refetch","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refetch)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.refetchSheet"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/replace","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replace)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.replaceRows"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/createAuthUri","path_regex":"^(?:/identitytoolkit/v3/relyingparty/createAuthUri)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.createAuthUri"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/deleteAccount","path_regex":"^(?:/identitytoolkit/v3/relyingparty/deleteAccount)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.deleteAccount"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/downloadAccount","path_regex":"^(?:/identitytoolkit/v3/relyingparty/downloadAccount)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.downloadAccount"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/emailLinkSignin","path_regex":"^(?:/identitytoolkit/v3/relyingparty/emailLinkSignin)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.emailLinkSignin"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/getAccountInfo","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getAccountInfo)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getAccountInfo"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/getOobConfirmationCode","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getOobConfirmationCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getOobConfirmationCode"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/resetPassword","path_regex":"^(?:/identitytoolkit/v3/relyingparty/resetPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.resetPassword"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/sendVerificationCode","path_regex":"^(?:/identitytoolkit/v3/relyingparty/sendVerificationCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.sendVerificationCode"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/setAccountInfo","path_regex":"^(?:/identitytoolkit/v3/relyingparty/setAccountInfo)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.setAccountInfo"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/setProjectConfig","path_regex":"^(?:/identitytoolkit/v3/relyingparty/setProjectConfig)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.setProjectConfig"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/signOutUser","path_regex":"^(?:/identitytoolkit/v3/relyingparty/signOutUser)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.signOutUser"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/signupNewUser","path_regex":"^(?:/identitytoolkit/v3/relyingparty/signupNewUser)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.signupNewUser"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/uploadAccount","path_regex":"^(?:/identitytoolkit/v3/relyingparty/uploadAccount)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.uploadAccount"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyAssertion","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyAssertion)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyAssertion"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyCustomToken","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyCustomToken)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyCustomToken"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyPassword","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyPassword"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyPhoneNumber","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyPhoneNumber)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyPhoneNumber"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/accounts/{userToken}/{accountType}/{accountName}","path_regex":"^(?:/mirror/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.accounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/contacts","path_regex":"^(?:/mirror/v1/contacts)$","service_name":"google.mirror","resource_name":"mirror.contacts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/subscriptions","path_regex":"^(?:/mirror/v1/subscriptions)$","service_name":"google.mirror","resource_name":"mirror.subscriptions.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/timeline","path_regex":"^(?:/mirror/v1/timeline)$","service_name":"google.mirror","resource_name":"mirror.timeline.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/timeline/{itemId}/attachments","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/plusDomains/v1/people/{userId}/media/{collection}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.media.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/qpxExpress/v1/trips/search","path_regex":"^(?:/qpxExpress/v1/trips/search)$","service_name":"google.qpxExpress","resource_name":"qpxExpress.trips.search"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools)$","service_name":"google.replicapool","resource_name":"replicapool.pools.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.pools.delete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.replicas.delete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}/restart","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.replicapool","resource_name":"replicapool.replicas.restart"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/resize","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.replicapool","resource_name":"replicapool.pools.resize"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/updateTemplate","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateTemplate)$","service_name":"google.replicapool","resource_name":"replicapool.pools.updatetemplate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/cancel","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.cancel"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/pause","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pause)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.pause"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/resume","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.resume"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/rollback","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollback)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.rollback"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/siteVerification/v1/token","path_regex":"^(?:/siteVerification/v1/token)$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.getToken"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/siteVerification/v1/webResource","path_regex":"^(?:/siteVerification/v1/webResource)$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/getSpectrum","path_regex":"^(?:/spectrum/v1explorer/paws/getSpectrum)$","service_name":"google.spectrum","resource_name":"spectrum.paws.getSpectrum"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/getSpectrumBatch","path_regex":"^(?:/spectrum/v1explorer/paws/getSpectrumBatch)$","service_name":"google.spectrum","resource_name":"spectrum.paws.getSpectrumBatch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/init","path_regex":"^(?:/spectrum/v1explorer/paws/init)$","service_name":"google.spectrum","resource_name":"spectrum.paws.init"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/notifySpectrumUse","path_regex":"^(?:/spectrum/v1explorer/paws/notifySpectrumUse)$","service_name":"google.spectrum","resource_name":"spectrum.paws.notifySpectrumUse"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/register","path_regex":"^(?:/spectrum/v1explorer/paws/register)$","service_name":"google.spectrum","resource_name":"spectrum.paws.register"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/verifyDevice","path_regex":"^(?:/spectrum/v1explorer/paws/verifyDevice)$","service_name":"google.spectrum","resource_name":"spectrum.paws.verifyDevice"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b","path_regex":"^(?:/storage/v1beta1/b)$","service_name":"google.storage","resource_name":"storage.buckets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b/{bucket}/o","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/surveys/v2/surveys","path_regex":"^(?:/surveys/v2/surveys)$","service_name":"google.surveys","resource_name":"surveys.surveys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/surveys/v2/surveys/{resourceId}/start","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.surveys","resource_name":"surveys.surveys.start"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/surveys/v2/surveys/{resourceId}/stop","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.surveys","resource_name":"surveys.surveys.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/urlshortener/v1/url","path_regex":"^(?:/urlshortener/v1/url)$","service_name":"google.urlshortener","resource_name":"urlshortener.url.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/webmasters/v3/sites/{siteUrl}/searchAnalytics/query","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAnalytics/query)$","service_name":"google.webmasters","resource_name":"webmasters.searchanalytics.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/youtube/analytics/v1beta1/groupItems","path_regex":"^(?:/youtube/analytics/v1beta1/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.insert"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.2/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.3/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/{revisionNumber}/{updateAction}","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/appstate/v1/states/{stateKey}","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appstate","resource_name":"appstate.states.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/consumersurveys/v2/mobileAppPanels/{panelId}","path_regex":"^(?:/consumersurveys/v2/mobileAppPanels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.mobileapppanels.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/drives/{driveId}","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v2/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/groups/v1/groups/{groupUniqueId}","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.groupssettings","resource_name":"groupsSettings.groups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/mirror/v1/subscriptions/{id}","path_regex":"^(?:/mirror/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.subscriptions.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/surveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.surveys","resource_name":"surveys.surveys.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sites.add"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.submit"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.update"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveChat/bans","path_regex":"^(?:/youtube/v3/liveChat/bans)$","service_name":"google.youtube","resource_name":"youtube.liveChatBans.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveChat/messages","path_regex":"^(?:/youtube/v3/liveChat/messages)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveChat/moderators","path_regex":"^(?:/youtube/v3/liveChat/moderators)$","service_name":"google.youtube","resource_name":"youtube.liveChatModerators.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/subscriptions","path_regex":"^(?:/youtube/v3/subscriptions)$","service_name":"google.youtube","resource_name":"youtube.subscriptions.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.delete"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/activities","path_regex":"^(?:/youtube/v3/activities)$","service_name":"google.youtube","resource_name":"youtube.activities.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/captions/{id}","path_regex":"^(?:/youtube/v3/captions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtube","resource_name":"youtube.captions.download"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/channels","path_regex":"^(?:/youtube/v3/channels)$","service_name":"google.youtube","resource_name":"youtube.channels.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/commentThreads","path_regex":"^(?:/youtube/v3/commentThreads)$","service_name":"google.youtube","resource_name":"youtube.commentThreads.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/i18nLanguages","path_regex":"^(?:/youtube/v3/i18nLanguages)$","service_name":"google.youtube","resource_name":"youtube.i18nLanguages.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/i18nRegions","path_regex":"^(?:/youtube/v3/i18nRegions)$","service_name":"google.youtube","resource_name":"youtube.i18nRegions.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveChat/messages","path_regex":"^(?:/youtube/v3/liveChat/messages)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveChat/moderators","path_regex":"^(?:/youtube/v3/liveChat/moderators)$","service_name":"google.youtube","resource_name":"youtube.liveChatModerators.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/members","path_regex":"^(?:/youtube/v3/members)$","service_name":"google.youtube","resource_name":"youtube.members.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/membershipsLevels","path_regex":"^(?:/youtube/v3/membershipsLevels)$","service_name":"google.youtube","resource_name":"youtube.membershipsLevels.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/search","path_regex":"^(?:/youtube/v3/search)$","service_name":"google.youtube","resource_name":"youtube.search.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/subscriptions","path_regex":"^(?:/youtube/v3/subscriptions)$","service_name":"google.youtube","resource_name":"youtube.subscriptions.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/superChatEvents","path_regex":"^(?:/youtube/v3/superChatEvents)$","service_name":"google.youtube","resource_name":"youtube.superChatEvents.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videoAbuseReportReasons","path_regex":"^(?:/youtube/v3/videoAbuseReportReasons)$","service_name":"google.youtube","resource_name":"youtube.videoAbuseReportReasons.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videoCategories","path_regex":"^(?:/youtube/v3/videoCategories)$","service_name":"google.youtube","resource_name":"youtube.videoCategories.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videos/getRating","path_regex":"^(?:/youtube/v3/videos/getRating)$","service_name":"google.youtube","resource_name":"youtube.videos.getRating"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/abuseReports","path_regex":"^(?:/youtube/v3/abuseReports)$","service_name":"google.youtube","resource_name":"youtube.abuseReports.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/channelBanners/insert","path_regex":"^(?:/youtube/v3/channelBanners/insert)$","service_name":"google.youtube","resource_name":"youtube.channelBanners.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/commentThreads","path_regex":"^(?:/youtube/v3/commentThreads)$","service_name":"google.youtube","resource_name":"youtube.commentThreads.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/comments/markAsSpam","path_regex":"^(?:/youtube/v3/comments/markAsSpam)$","service_name":"google.youtube","resource_name":"youtube.comments.markAsSpam"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/comments/setModerationStatus","path_regex":"^(?:/youtube/v3/comments/setModerationStatus)$","service_name":"google.youtube","resource_name":"youtube.comments.setModerationStatus"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts/bind","path_regex":"^(?:/youtube/v3/liveBroadcasts/bind)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.bind"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts/cuepoint","path_regex":"^(?:/youtube/v3/liveBroadcasts/cuepoint)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.insertCuepoint"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts/transition","path_regex":"^(?:/youtube/v3/liveBroadcasts/transition)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.transition"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/bans","path_regex":"^(?:/youtube/v3/liveChat/bans)$","service_name":"google.youtube","resource_name":"youtube.liveChatBans.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/messages","path_regex":"^(?:/youtube/v3/liveChat/messages)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/moderators","path_regex":"^(?:/youtube/v3/liveChat/moderators)$","service_name":"google.youtube","resource_name":"youtube.liveChatModerators.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/subscriptions","path_regex":"^(?:/youtube/v3/subscriptions)$","service_name":"google.youtube","resource_name":"youtube.subscriptions.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/tests","path_regex":"^(?:/youtube/v3/tests)$","service_name":"google.youtube","resource_name":"youtube.tests.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/thumbnails/set","path_regex":"^(?:/youtube/v3/thumbnails/set)$","service_name":"google.youtube","resource_name":"youtube.thumbnails.set"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/videos/rate","path_regex":"^(?:/youtube/v3/videos/rate)$","service_name":"google.youtube","resource_name":"youtube.videos.rate"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/videos/reportAbuse","path_regex":"^(?:/youtube/v3/videos/reportAbuse)$","service_name":"google.youtube","resource_name":"youtube.videos.reportAbuse"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/watermarks/set","path_regex":"^(?:/youtube/v3/watermarks/set)$","service_name":"google.youtube","resource_name":"youtube.watermarks.set"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/watermarks/unset","path_regex":"^(?:/youtube/v3/watermarks/unset)$","service_name":"google.youtube","resource_name":"youtube.watermarks.unset"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/channels","path_regex":"^(?:/youtube/v3/channels)$","service_name":"google.youtube","resource_name":"youtube.channels.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/commentThreads","path_regex":"^(?:/youtube/v3/commentThreads)$","service_name":"google.youtube","resource_name":"youtube.youtube.v3.updateCommentThreads"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.update"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"DELETE","path_template":"/v2/groupItems","path_regex":"^(?:/v2/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.delete"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"DELETE","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.delete"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"GET","path_template":"/v2/groupItems","path_regex":"^(?:/v2/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.list"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"GET","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.list"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"GET","path_template":"/v2/reports","path_regex":"^(?:/v2/reports)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.reports.query"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"POST","path_template":"/v2/groupItems","path_regex":"^(?:/v2/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.insert"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"POST","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.insert"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"PUT","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.update"},{"hostname":"youtubereporting.googleapis.com","http_method":"DELETE","path_template":"/v1/jobs/{jobId}","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.delete"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs","path_regex":"^(?:/v1/jobs)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.list"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs/{jobId}","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.get"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs/{jobId}/reports","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.reports.list"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs/{jobId}/reports/{reportId}","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.reports.get"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.media.download"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/reportTypes","path_regex":"^(?:/v1/reportTypes)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.reportTypes.list"},{"hostname":"youtubereporting.googleapis.com","http_method":"POST","path_template":"/v1/jobs","path_regex":"^(?:/v1/jobs)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.create"}] \ No newline at end of file +[{"hostname":"","http_method":"GET","path_template":"/_ah/api/tshealth/v1/techs/count","path_regex":"^(?:/_ah/api/tshealth/v1/techs/count)$","service_name":"google.tshealth","resource_name":"tshealth.techs.count"},{"hostname":"","http_method":"GET","path_template":"/accounts/{accountId}/reports","path_regex":"^(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.repeated","resource_name":"adsense.accounts.reports.generate"},{"hostname":"","http_method":"GET","path_template":"/map","path_regex":"^(?:/map)$","service_name":"google.additionalprops","resource_name":"mapofstrings.getMap"},{"hostname":"","http_method":"GET","path_template":"/map","path_regex":"^(?:/map)$","service_name":"google.additionalprops","resource_name":"mapofstrings.getMap"},{"hostname":"","http_method":"GET","path_template":"/map","path_regex":"^(?:/map)$","service_name":"google.mapprotostruct","resource_name":"mapprotostruct.getMap"},{"hostname":"","http_method":"GET","path_template":"/reports","path_regex":"^(?:/reports)$","service_name":"google.paramrename","resource_name":"youtubeAnalytics.reports.query"},{"hostname":"","http_method":"GET","path_template":"/{project}/metricDescriptors","path_regex":"^(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors)$","service_name":"google.getwithoutbody","resource_name":"getwithoutbody.metricDescriptors.list"},{"hostname":"","http_method":"POST","path_template":"/calendars/{calendarId}/events/{eventId}/move","path_regex":"^(?:/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.paramrename","resource_name":"calendar.events.move"},{"hostname":"abusiveexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/sites/{sitesId}","path_regex":"^(?:/v1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.abusiveexperiencereport","resource_name":"abusiveexperiencereport.sites.get"},{"hostname":"abusiveexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/violatingSites","path_regex":"^(?:/v1/violatingSites)$","service_name":"google.abusiveexperiencereport","resource_name":"abusiveexperiencereport.violatingSites.list"},{"hostname":"acceleratedmobilepageurl.googleapis.com","http_method":"POST","path_template":"/v1/ampUrls:batchGet","path_regex":"^(?:/v1/ampUrls:batchGet)$","service_name":"google.acceleratedmobilepageurl","resource_name":"acceleratedmobilepageurl.ampUrls.batchGet"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.deleteAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/approvalRequests","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/serviceAccount","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.getServiceAccount"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/approvalRequests","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/serviceAccount","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.getServiceAccount"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/approvalRequests","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccount","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.getServiceAccount"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/approvalRequests","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.getAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/approvalRequests","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.list"},{"hostname":"accessapproval.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/approvalRequests/{approvalRequestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.get"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/folders/{foldersId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/accessApprovalSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalSettings)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.updateAccessApprovalSettings"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:invalidate","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::invalidate)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.invalidate"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:invalidate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::invalidate)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.invalidate"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:invalidate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::invalidate)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.invalidate"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.folders.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.organizations.approvalRequests.dismiss"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:approve","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.approve"},{"hostname":"accessapproval.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/approvalRequests/{approvalRequestsId}:dismiss","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approvalRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dismiss)$","service_name":"google.accessapproval","resource_name":"accessapproval.projects.approvalRequests.dismiss"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs/{authorizedOrgsDescsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings/{gcpUserAccessBindingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.delete"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies","path_regex":"^(?:/v1/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs/{authorizedOrgsDescsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings/{gcpUserAccessBindingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.services.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1/services/{name}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.services.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies","path_regex":"^(?:/v1beta/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.list"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"GET","path_template":"/v1beta/operations/{operationsId}","path_regex":"^(?:/v1beta/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.get"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs/{authorizedOrgsDescsId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings/{gcpUserAccessBindingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accessPolicies/{accessPoliciesId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.patch"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies","path_regex":"^(?:/v1/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels/{accessLevelsId}:testIamPermissions","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.testIamPermissions"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/accessLevels:replaceAll","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels:replaceAll)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.replaceAll"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/authorizedOrgsDescs","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedOrgsDescs)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.authorizedOrgsDescs.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters/{servicePerimetersId}:testIamPermissions","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.testIamPermissions"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters:commit","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters:commit)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.commit"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}/servicePerimeters:replaceAll","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters:replaceAll)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.replaceAll"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.getIamPolicy"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.setIamPolicy"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/accessPolicies/{accessPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.testIamPermissions"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.operations.cancel"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/gcpUserAccessBindings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gcpUserAccessBindings)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.organizations.gcpUserAccessBindings.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1beta/accessPolicies","path_regex":"^(?:/v1beta/accessPolicies)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/accessLevels","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessLevels)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.accessLevels.create"},{"hostname":"accesscontextmanager.googleapis.com","http_method":"POST","path_template":"/v1beta/accessPolicies/{accessPoliciesId}/servicePerimeters","path_regex":"^(?:/v1beta/accessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servicePerimeters)$","service_name":"google.accesscontextmanager","resource_name":"accesscontextmanager.accessPolicies.servicePerimeters.create"},{"hostname":"acmedns.googleapis.com","http_method":"GET","path_template":"/v1/acmeChallengeSets/{rootDomain}","path_regex":"^(?:/v1/acmeChallengeSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.acmedns","resource_name":"acmedns.acmeChallengeSets.get"},{"hostname":"acmedns.googleapis.com","http_method":"POST","path_template":"/v1/acmeChallengeSets/{rootDomain}:rotateChallenges","path_regex":"^(?:/v1/acmeChallengeSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rotateChallenges)$","service_name":"google.acmedns","resource_name":"acmedns.acmeChallengeSets.rotateChallenges"},{"hostname":"addressvalidation.googleapis.com","http_method":"POST","path_template":"/v1:provideValidationFeedback","path_regex":"^(?:/v1:provideValidationFeedback)$","service_name":"google.addressvalidation","resource_name":"addressvalidation.provideValidationFeedback"},{"hostname":"addressvalidation.googleapis.com","http_method":"POST","path_template":"/v1:validateAddress","path_regex":"^(?:/v1:validateAddress)$","service_name":"google.addressvalidation","resource_name":"addressvalidation.validateAddress"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.delete"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.delete"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.delete"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.invitations.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations/{invitationId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.invitations.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/users","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.users.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.users.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/creatives","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}/dealAssociations","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dealAssociations)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.dealAssociations.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/finalizedProposals","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedProposals)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.finalizedProposals.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/products","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.products.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/products/{productId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.products.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/proposals","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/publisherProfiles","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.publisherProfiles.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/accounts/{accountId}/publisherProfiles/{publisherProfileId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.publisherProfiles.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/bidMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.bidMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/bidResponseErrors","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponseErrors)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.bidResponseErrors.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/bidResponsesWithoutBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponsesWithoutBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.bidResponsesWithoutBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBidRequests","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBidRequests)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBidRequests.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/creatives","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBids.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/details","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.filteredBids.details.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/impressionMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/impressionMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.impressionMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/losingBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/losingBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.losingBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets/{filterSetsId}/nonBillableWinningBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nonBillableWinningBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.nonBillableWinningBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/bidMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.bidMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/bidResponseErrors","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponseErrors)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.bidResponseErrors.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/bidResponsesWithoutBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponsesWithoutBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.bidResponsesWithoutBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBidRequests","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBidRequests)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBidRequests.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/creatives","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBids.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/details","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.filteredBids.details.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/impressionMetrics","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/impressionMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.impressionMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/losingBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/losingBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.losingBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/bidders/{biddersId}/filterSets/{filterSetsId}/nonBillableWinningBids","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nonBillableWinningBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.nonBillableWinningBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.get"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/bidMetrics","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.bidMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/bidResponseErrors","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponseErrors)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.bidResponseErrors.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/bidResponsesWithoutBids","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bidResponsesWithoutBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.bidResponsesWithoutBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/filteredBidRequests","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBidRequests)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.filteredBidRequests.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/filteredBids","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.filteredBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/creatives","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.filteredBids.creatives.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/filteredBids/{creativeStatusId}/details","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filteredBids/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.filteredBids.details.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/impressionMetrics","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/impressionMetrics)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.impressionMetrics.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/losingBids","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/losingBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.losingBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"GET","path_template":"/v2beta1/buyers/{buyersId}/filterSets/{filterSetsId}/nonBillableWinningBids","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nonBillableWinningBids)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.nonBillableWinningBids.list"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/clients","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/invitations","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.invitations.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}/dealAssociations:add","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dealAssociations:add)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.dealAssociations.add"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}/dealAssociations:remove","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dealAssociations:remove)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.dealAssociations.remove"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}:stopWatching","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopWatching)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.stopWatching"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}:watch","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::watch)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.watch"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/finalizedProposals/{proposalId}:pause","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.finalizedProposals.pause"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/finalizedProposals/{proposalId}:resume","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.finalizedProposals.resume"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:accept","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.accept"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:addNote","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addNote)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.addNote"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:cancelNegotiation","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelNegotiation)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.cancelNegotiation"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:completeSetup","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeSetup)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.completeSetup"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:pause","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.pause"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}:resume","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.resume"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/bidders/{biddersId}/accounts/{accountsId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.accounts.filterSets.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/bidders/{biddersId}/filterSets","path_regex":"^(?:/v2beta1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.bidders.filterSets.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"POST","path_template":"/v2beta1/buyers/{buyersId}/filterSets","path_regex":"^(?:/v2beta1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filterSets)$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.buyers.filterSets.create"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.update"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/clients/{clientAccountId}/users/{userId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.clients.users.update"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/creatives/{creativeId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.creatives.update"},{"hostname":"adexchangebuyer.googleapis.com","http_method":"PUT","path_template":"/v2beta1/accounts/{accountId}/proposals/{proposalId}","path_regex":"^(?:/v2beta1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer2","resource_name":"adexchangebuyer2.accounts.proposals.update"},{"hostname":"adexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/sites/{sitesId}","path_regex":"^(?:/v1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexperiencereport","resource_name":"adexperiencereport.sites.get"},{"hostname":"adexperiencereport.googleapis.com","http_method":"GET","path_template":"/v1/violatingSites","path_regex":"^(?:/v1/violatingSites)$","service_name":"google.adexperiencereport","resource_name":"adexperiencereport.violatingSites.list"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.delete"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools/{workerpoolsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.delete"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.list"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.get"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.list"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools/{workerpoolsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.get"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.operations.get"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.patch"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools/{workerpoolsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.patch"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/instances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.create"},{"hostname":"admin-remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/instances/{instancesId}/workerpools","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerpools)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.instances.workerpools.create"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile/{resourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.mobiledevices.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/domainaliases/{domainAliasName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domainAliases.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/domains/{domainName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domains.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/roleassignments/{roleAssignmentId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roleAssignments.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers/{printServersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers/{printersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/groups/{groupKey}/aliases/{alias}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.aliases.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/aliases/{alias}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.aliases.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/asps/{codeId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/asps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.asps.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.delete"},{"hostname":"admin.googleapis.com","http_method":"DELETE","path_template":"/admin/directory/v1/users/{userKey}/tokens/{clientId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.tokens.delete"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/applications","path_regex":"^(?:/admin/datatransfer/v1/applications)$","service_name":"google.admin","resource_name":"datatransfer.applications.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/applications/{applicationId}","path_regex":"^(?:/admin/datatransfer/v1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"datatransfer.applications.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/transfers","path_regex":"^(?:/admin/datatransfer/v1/transfers)$","service_name":"google.admin","resource_name":"datatransfer.transfers.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/datatransfer/v1/transfers/{dataTransferId}","path_regex":"^(?:/admin/datatransfer/v1/transfers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"datatransfer.transfers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos)$","service_name":"google.admin","resource_name":"directory.chromeosdevices.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.chromeosdevices.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}/commands/{commandId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customer.devices.chromeos.commands.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile)$","service_name":"google.admin","resource_name":"directory.mobiledevices.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile/{resourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.mobiledevices.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/orgunits","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits)$","service_name":"google.admin","resource_name":"directory.orgunits.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/schemas","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.admin","resource_name":"directory.schemas.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domainaliases","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases)$","service_name":"google.admin","resource_name":"directory.domainAliases.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domainaliases/{domainAliasName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domainAliases.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domains","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.admin","resource_name":"directory.domains.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/domains/{domainName}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.domains.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings)$","service_name":"google.admin","resource_name":"directory.resources.buildings.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars)$","service_name":"google.admin","resource_name":"directory.resources.calendars.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/features","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features)$","service_name":"google.admin","resource_name":"directory.resources.features.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roleassignments","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments)$","service_name":"google.admin","resource_name":"directory.roleAssignments.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roleassignments/{roleAssignmentId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roleAssignments.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roles","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.admin","resource_name":"directory.roles.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roles/ALL/privileges","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/ALL/privileges)$","service_name":"google.admin","resource_name":"directory.privileges.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customerKey}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.customers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers/{printServersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers/{printersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers:listPrinterModels","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers:listPrinterModels)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.listPrinterModels"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups","path_regex":"^(?:/admin/directory/v1/groups)$","service_name":"google.admin","resource_name":"directory.groups.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/aliases","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.groups.aliases.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/hasMember/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hasMember/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.hasMember"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/members","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.admin","resource_name":"directory.members.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users","path_regex":"^(?:/admin/directory/v1/users)$","service_name":"google.admin","resource_name":"directory.users.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/aliases","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.users.aliases.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/asps","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/asps)$","service_name":"google.admin","resource_name":"directory.asps.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/asps/{codeId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/asps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.asps.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/tokens","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens)$","service_name":"google.admin","resource_name":"directory.tokens.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/tokens/{clientId}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.tokens.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/directory/v1/users/{userKey}/verificationCodes","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verificationCodes)$","service_name":"google.admin","resource_name":"directory.verificationCodes.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/activity/users/{userKey}/applications/{applicationName}","path_regex":"^(?:/admin/reports/v1/activity/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.activities.list"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/usage/dates/{date}","path_regex":"^(?:/admin/reports/v1/usage/dates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.customerUsageReports.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/usage/users/{userKey}/dates/{date}","path_regex":"^(?:/admin/reports/v1/usage/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.userUsageReport.get"},{"hostname":"admin.googleapis.com","http_method":"GET","path_template":"/admin/reports/v1/usage/{entityType}/{entityKey}/dates/{date}","path_regex":"^(?:/admin/reports/v1/usage/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"reports.entityUsageReports.get"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.chromeosdevices.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customers/{customerKey}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.customers.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers/{printServersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers/{printersId}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.patch"},{"hostname":"admin.googleapis.com","http_method":"PATCH","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.patch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/datatransfer/v1/transfers","path_regex":"^(?:/admin/datatransfer/v1/transfers)$","service_name":"google.admin","resource_name":"datatransfer.transfers.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/moveDevicesToOu","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/moveDevicesToOu)$","service_name":"google.admin","resource_name":"directory.chromeosdevices.moveDevicesToOu"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}:issueCommand","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::issueCommand)$","service_name":"google.admin","resource_name":"admin.customer.devices.chromeos.issueCommand"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{resourceId}/action","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/action)$","service_name":"google.admin","resource_name":"directory.chromeosdevices.action"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos:batchChangeStatus","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos:batchChangeStatus)$","service_name":"google.admin","resource_name":"admin.customer.devices.chromeos.batchChangeStatus"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/devices/mobile/{resourceId}/action","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/mobile/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/action)$","service_name":"google.admin","resource_name":"directory.mobiledevices.action"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/orgunits","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits)$","service_name":"google.admin","resource_name":"directory.orgunits.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customerId}/schemas","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.admin","resource_name":"directory.schemas.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/domainaliases","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainaliases)$","service_name":"google.admin","resource_name":"directory.domainAliases.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/domains","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.admin","resource_name":"directory.domains.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings)$","service_name":"google.admin","resource_name":"directory.resources.buildings.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars)$","service_name":"google.admin","resource_name":"directory.resources.calendars.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/features","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features)$","service_name":"google.admin","resource_name":"directory.resources.features.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{oldName}/rename","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rename)$","service_name":"google.admin","resource_name":"directory.resources.features.rename"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/roleassignments","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roleassignments)$","service_name":"google.admin","resource_name":"directory.roleAssignments.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customer/{customer}/roles","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.admin","resource_name":"directory.roles.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.create"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers:batchCreatePrintServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers:batchCreatePrintServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.batchCreatePrintServers"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printServers:batchDeletePrintServers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printServers:batchDeletePrintServers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printServers.batchDeletePrintServers"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.create"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers:batchCreatePrinters","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers:batchCreatePrinters)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.batchCreatePrinters"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/customers/{customersId}/chrome/printers:batchDeletePrinters","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chrome/printers:batchDeletePrinters)$","service_name":"google.admin","resource_name":"admin.customers.chrome.printers.batchDeletePrinters"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/groups","path_regex":"^(?:/admin/directory/v1/groups)$","service_name":"google.admin","resource_name":"directory.groups.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/groups/{groupKey}/aliases","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.groups.aliases.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/groups/{groupKey}/members","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.admin","resource_name":"directory.members.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users","path_regex":"^(?:/admin/directory/v1/users)$","service_name":"google.admin","resource_name":"directory.users.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/watch","path_regex":"^(?:/admin/directory/v1/users/watch)$","service_name":"google.admin","resource_name":"directory.users.watch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/aliases","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.admin","resource_name":"directory.users.aliases.insert"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/aliases/watch","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/watch)$","service_name":"google.admin","resource_name":"directory.users.aliases.watch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/makeAdmin","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/makeAdmin)$","service_name":"google.admin","resource_name":"directory.users.makeAdmin"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/signOut","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/signOut)$","service_name":"google.admin","resource_name":"directory.users.signOut"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/twoStepVerification/turnOff","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/twoStepVerification/turnOff)$","service_name":"google.admin","resource_name":"directory.twoStepVerification.turnOff"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/undelete","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/undelete)$","service_name":"google.admin","resource_name":"directory.users.undelete"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/verificationCodes/generate","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verificationCodes/generate)$","service_name":"google.admin","resource_name":"directory.verificationCodes.generate"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory/v1/users/{userKey}/verificationCodes/invalidate","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verificationCodes/invalidate)$","service_name":"google.admin","resource_name":"directory.verificationCodes.invalidate"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/directory_v1/channels/stop","path_regex":"^(?:/admin/directory_v1/channels/stop)$","service_name":"google.admin","resource_name":"admin.channels.stop"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/reports/v1/activity/users/{userKey}/applications/{applicationName}/watch","path_regex":"^(?:/admin/reports/v1/activity/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.admin","resource_name":"reports.activities.watch"},{"hostname":"admin.googleapis.com","http_method":"POST","path_template":"/admin/reports_v1/channels/stop","path_regex":"^(?:/admin/reports_v1/channels/stop)$","service_name":"google.admin","resource_name":"admin.channels.stop"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customerId}/devices/chromeos/{deviceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/chromeos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.chromeosdevices.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customerId}/orgunits/{orgunitsId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.orgunits.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customerId}/schemas/{schemaKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.schemas.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/resources/buildings/{buildingId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/buildings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.buildings.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/resources/calendars/{calendarResourceId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.calendars.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/resources/features/{featureKey}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.resources.features.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customer/{customer}/roles/{roleId}","path_regex":"^(?:/admin/directory/v1/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.roles.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/customers/{customerKey}","path_regex":"^(?:/admin/directory/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.customers.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/groups/{groupKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.groups.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/groups/{groupKey}/members/{memberKey}","path_regex":"^(?:/admin/directory/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.members.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/users/{userKey}","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admin","resource_name":"directory.users.update"},{"hostname":"admin.googleapis.com","http_method":"PUT","path_template":"/admin/directory/v1/users/{userKey}/photos/thumbnail","path_regex":"^(?:/admin/directory/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/thumbnail)$","service_name":"google.admin","resource_name":"directory.users.photos.update"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts","path_regex":"^(?:/v1/accounts)$","service_name":"google.admob","resource_name":"admob.accounts.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admob","resource_name":"admob.accounts.get"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/adUnits","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/apps","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.admob","resource_name":"admob.accounts.apps.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts","path_regex":"^(?:/v1beta/accounts)$","service_name":"google.admob","resource_name":"admob.accounts.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admob","resource_name":"admob.accounts.get"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/adSources","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSources)$","service_name":"google.admob","resource_name":"admob.accounts.adSources.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/adSources/{adSourcesId}/adapters","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adapters)$","service_name":"google.admob","resource_name":"admob.accounts.adSources.adapters.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/adUnits","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/adUnits/{adUnitsId}/adUnitMappings","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnitMappings)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.adUnitMappings.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/apps","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.admob","resource_name":"admob.accounts.apps.list"},{"hostname":"admob.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/mediationGroups","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationGroups)$","service_name":"google.admob","resource_name":"admob.accounts.mediationGroups.list"},{"hostname":"admob.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accounts/{accountsId}/mediationGroups/{mediationGroupsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.admob","resource_name":"admob.accounts.mediationGroups.patch"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/mediationReport:generate","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.mediationReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/networkReport:generate","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.networkReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/adUnitMappings:batchCreate","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnitMappings:batchCreate)$","service_name":"google.admob","resource_name":"admob.accounts.adUnitMappings.batchCreate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/adUnits","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.create"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/adUnits/{adUnitsId}/adUnitMappings","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adUnitMappings)$","service_name":"google.admob","resource_name":"admob.accounts.adUnits.adUnitMappings.create"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/apps","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.admob","resource_name":"admob.accounts.apps.create"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/campaignReport:generate","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.campaignReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/mediationGroups","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationGroups)$","service_name":"google.admob","resource_name":"admob.accounts.mediationGroups.create"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/mediationGroups/{mediationGroupsId}/mediationAbExperiments","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationAbExperiments)$","service_name":"google.admob","resource_name":"admob.accounts.mediationGroups.mediationAbExperiments.create"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/mediationGroups/{mediationGroupsId}/mediationAbExperiments:stop","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationAbExperiments:stop)$","service_name":"google.admob","resource_name":"admob.accounts.mediationGroups.mediationAbExperiments.stop"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/mediationReport:generate","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mediationReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.mediationReport.generate"},{"hostname":"admob.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}/networkReport:generate","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkReport:generate)$","service_name":"google.admob","resource_name":"admob.accounts.networkReport.generate"},{"hostname":"adsense.googleapis.com","http_method":"DELETE","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.delete"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts","path_regex":"^(?:/v2/accounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adBlockingRecoveryTag","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adBlockingRecoveryTag)$","service_name":"google.adsense","resource_name":"adsense.accounts.getAdBlockingRecoveryTag"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adcode","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.getAdcode"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}/adcode","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.getAdcode"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}:listLinkedCustomChannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listLinkedCustomChannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.listLinkedCustomChannels"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}:listLinkedAdUnits","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listLinkedAdUnits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.listLinkedAdUnits"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/urlchannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.urlchannels.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/urlchannels/{urlchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.urlchannels.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/alerts","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/payments","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/payments)$","service_name":"google.adsense","resource_name":"adsense.accounts.payments.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/policyIssues","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyIssues)$","service_name":"google.adsense","resource_name":"adsense.accounts.policyIssues.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/policyIssues/{policyIssuesId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyIssues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.policyIssues.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/saved","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/{reportsId}/saved","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.getSaved"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/{reportsId}/saved:generate","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/saved:generate)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generate"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports/{reportsId}/saved:generateCsv","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/saved:generateCsv)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generateCsv"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports:generate","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:generate)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generate"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/reports:generateCsv","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:generateCsv)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generateCsv"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/sites","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.adsense","resource_name":"adsense.accounts.sites.list"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}/sites/{sitesId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.sites.get"},{"hostname":"adsense.googleapis.com","http_method":"GET","path_template":"/v2/accounts/{accountsId}:listChildAccounts","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listChildAccounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.listChildAccounts"},{"hostname":"adsense.googleapis.com","http_method":"PATCH","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits/{adunitsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.patch"},{"hostname":"adsense.googleapis.com","http_method":"PATCH","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels/{customchannelsId}","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.patch"},{"hostname":"adsense.googleapis.com","http_method":"POST","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/adunits","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.adunits.create"},{"hostname":"adsense.googleapis.com","http_method":"POST","path_template":"/v2/accounts/{accountsId}/adclients/{adclientsId}/customchannels","path_regex":"^(?:/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.customchannels.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}/sites/{sitesId}","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.delete"},{"hostname":"adsenseplatform.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}/sites/{sitesId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.delete"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1/platforms/{platformsId}/accounts","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.list"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.get"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}/sites","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.list"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}/sites/{sitesId}","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.get"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1/platforms/{platformsId}/accounts:lookup","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:lookup)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.lookup"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/accounts","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.list"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.get"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}/sites","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.list"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}/sites/{sitesId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.get"},{"hostname":"adsenseplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/accounts:lookup","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:lookup)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.lookup"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1/platforms/{platformsId}/accounts","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}/events","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.events.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}/sites","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}/sites/{sitesId}:requestReview","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::requestReview)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.requestReview"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1/platforms/{platformsId}/accounts/{accountsId}:close","path_regex":"^(?:/v1/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.close"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/accounts","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}/events","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.events.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}/sites","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.create"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}/sites/{sitesId}:requestReview","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::requestReview)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.sites.requestReview"},{"hostname":"adsenseplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/accounts/{accountsId}:close","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.adsenseplatform","resource_name":"adsenseplatform.platforms.accounts.close"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/notifications","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifications)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.organizations.locations.notifications.list"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/notifications/{notificationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.organizations.locations.notifications.get"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.organizations.locations.getSettings"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notifications","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifications)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.projects.locations.notifications.list"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notifications/{notificationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.projects.locations.notifications.get"},{"hostname":"advisorynotifications.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.projects.locations.getSettings"},{"hostname":"advisorynotifications.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.organizations.locations.updateSettings"},{"hostname":"advisorynotifications.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.advisorynotifications","resource_name":"advisorynotifications.projects.locations.updateSettings"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs/{batchPredictionJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:deleteVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteVersion)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.deleteVersion"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.agents.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.apps.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs/{batchPredictionJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/cachedContents/{cachedContentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cachedContents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.cachedContents.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/edgeDevices/{edgeDevicesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeDevices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.edgeDevices.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/evaluationTasks/{evaluationTasksId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationTasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.evaluationTasks.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/exampleStores/{exampleStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.exampleStores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensionControllers/{extensionControllersId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensionControllers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensionControllers.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/modelMonitoringJobs/{modelMonitoringJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.modelMonitoringJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:deleteVersion","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteVersion)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.deleteVersion"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/solvers/{solversId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/solvers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.solvers.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.delete"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs/{batchPredictionJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.restore"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:searchDataItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchDataItems)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.searchDataItems"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}:queryDeployedModels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryDeployedModels)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.queryDeployedModels"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.listWait"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.listWait"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/featureViewSyncs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViewSyncs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.featureViewSyncs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/featureViewSyncs/{featureViewSyncsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViewSyncs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.featureViewSyncs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.listWait"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.listWait"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores:searchFeatures","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores:searchFeatures)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.searchFeatures"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}:queryArtifactLineageSubgraph","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryArtifactLineageSubgraph)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.queryArtifactLineageSubgraph"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:queryContextLineageSubgraph","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryContextLineageSubgraph)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.queryContextLineageSubgraph"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}:queryExecutionInputsAndOutputs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryExecutionInputsAndOutputs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.queryExecutionInputsAndOutputs"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/metadataSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataSchemas)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.metadataSchemas.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/metadataSchemas/{metadataSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.metadataSchemas.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/slices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slices)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.slices.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/slices/{slicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.slices.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:listVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listVersions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.listVersions"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}/nasTrialDetails","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasTrialDetails)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.nasTrialDetails.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}/nasTrialDetails/{nasTrialDetailsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasTrialDetails/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.nasTrialDetails.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}:read","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::read)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.read"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}:readBlobData","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readBlobData)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.readBlobData"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}:batchRead","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchRead)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.batchRead"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}:readSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readSize)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.readSize"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}:readUsage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readUsage)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.readUsage"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1/publishers/{publishersId}/models/{modelsId}","path_regex":"^(?:/v1/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.publishers.models.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/cacheConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cacheConfig)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.getCacheConfig"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.agents.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.agents.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/apps/{appsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.apps.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.apps.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs/{batchPredictionJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/cachedContents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cachedContents)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.cachedContents.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/cachedContents/{cachedContentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cachedContents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.cachedContents.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}:restore","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.restore"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:searchDataItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchDataItems)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.searchDataItems"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}:queryDeployedModels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryDeployedModels)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.queryDeployedModels"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/edgeDevices/{edgeDevicesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeDevices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.edgeDevices.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/edgeDevices/{edgeDevicesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeDevices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.edgeDevices.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/evaluationTasks/{evaluationTasksId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationTasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.evaluationTasks.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/evaluationTasks/{evaluationTasksId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationTasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.evaluationTasks.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/exampleStores/{exampleStoresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.exampleStores.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/exampleStores/{exampleStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.exampleStores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensionControllers/{extensionControllersId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensionControllers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensionControllers.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensionControllers/{extensionControllersId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensionControllers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensionControllers.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/featureViewSyncs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViewSyncs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.featureViewSyncs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/featureViewSyncs/{featureViewSyncsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViewSyncs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.featureViewSyncs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores:searchFeatures","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores:searchFeatures)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.searchFeatures"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}:queryArtifactLineageSubgraph","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryArtifactLineageSubgraph)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.queryArtifactLineageSubgraph"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:queryContextLineageSubgraph","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryContextLineageSubgraph)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.queryContextLineageSubgraph"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}:queryExecutionInputsAndOutputs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryExecutionInputsAndOutputs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.queryExecutionInputsAndOutputs"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/metadataSchemas","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataSchemas)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.metadataSchemas.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/metadataSchemas/{metadataSchemasId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.metadataSchemas.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/modelMonitoringJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitoringJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.modelMonitoringJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/modelMonitoringJobs/{modelMonitoringJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.modelMonitoringJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/slices","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slices)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.slices.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/slices/{slicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.slices.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:listVersions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listVersions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.listVersions"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}/nasTrialDetails","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasTrialDetails)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.nasTrialDetails.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}/nasTrialDetails/{nasTrialDetailsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasTrialDetails/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.nasTrialDetails.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/solvers/{solversId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/solvers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.solvers.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/solvers/{solversId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/solvers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.solvers.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}:read","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::read)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.read"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}:readBlobData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readBlobData)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.readBlobData"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}:batchRead","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchRead)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.batchRead"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}:readSize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readSize)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.readSize"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}:readUsage","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readUsage)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.readUsage"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tuningJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.get"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/publishers/{publishersId}/models","path_regex":"^(?:/v1beta1/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.aiplatform","resource_name":"aiplatform.publishers.models.list"},{"hostname":"aiplatform.googleapis.com","http_method":"GET","path_template":"/v1beta1/publishers/{publishersId}/models/{modelsId}","path_regex":"^(?:/v1beta1/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.publishers.models.get"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/cacheConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cacheConfig)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.updateCacheConfig"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/cachedContents/{cachedContentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cachedContents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.cachedContents.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions/{datasetVersionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.patch"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs/{batchPredictionJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.export"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.import"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:computeTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.computeTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:countTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::countTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.countTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:deployModel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployModel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.deployModel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:directPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::directPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.directPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:directRawPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::directRawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.directRawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:explain","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::explain)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.explain"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:generateContent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.generateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:mutateDeployedModel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mutateDeployedModel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.mutateDeployedModel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:predict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.predict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:rawPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.rawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:serverStreamingPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.serverStreamingPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:streamGenerateContent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamGenerateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.streamGenerateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:streamRawPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamRawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.streamRawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:undeployModel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeployModel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.undeployModel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:fetchFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.fetchFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:searchNearestEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchNearestEntities)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.searchNearestEntities"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:sync","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sync)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.sync"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features:batchCreate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.batchCreate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:deleteFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.deleteFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:exportFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.exportFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:importFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.importFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:readFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.readFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:streamingReadFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamingReadFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.streamingReadFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:writeFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::writeFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.writeFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:batchReadFeatureValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchReadFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.batchReadFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:deployIndex","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployIndex)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.deployIndex"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:findNeighbors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::findNeighbors)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.findNeighbors"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:mutateDeployedIndex","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mutateDeployedIndex)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.mutateDeployedIndex"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:readIndexDatapoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readIndexDatapoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.readIndexDatapoints"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:undeployIndex","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeployIndex)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.undeployIndex"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}:removeDatapoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeDatapoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.removeDatapoints"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}:upsertDatapoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upsertDatapoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.upsertDatapoints"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts:purge)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.purge"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:addContextArtifactsAndExecutions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addContextArtifactsAndExecutions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.addContextArtifactsAndExecutions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:addContextChildren","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addContextChildren)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.addContextChildren"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:removeContextChildren","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeContextChildren)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.removeContextChildren"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts:purge)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.purge"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}:addExecutionEvents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addExecutionEvents)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.addExecutionEvents"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions:purge)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.purge"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/metadataSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataSchemas)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.metadataSchemas.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources:batchMigrate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources:batchMigrate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.batchMigrate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migratableResources:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources:search)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.search"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.pause"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.resume"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}:searchModelDeploymentMonitoringStatsAnomalies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchModelDeploymentMonitoringStatsAnomalies)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.searchModelDeploymentMonitoringStatsAnomalies"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/slices/{slicesId}:batchImport","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchImport)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.slices.batchImport"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations:import)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.import"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.export"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:mergeVersionAliases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mergeVersionAliases)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.mergeVersionAliases"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:updateExplanationDataset","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateExplanationDataset)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.updateExplanationDataset"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models:copy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models:copy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.copy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/models:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models:upload)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.upload"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.start"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.upgrade"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes:assign","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes:assign)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.assign"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}:reboot","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reboot)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.reboot"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs:batchCancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs:batchCancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.batchCancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelineJobs:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs:batchDelete)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.batchDelete"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:computeTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.computeTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:countTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::countTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.countTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:generateContent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.generateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:predict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.predict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:rawPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.rawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:serverStreamingPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.serverStreamingPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:streamGenerateContent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamGenerateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.streamGenerateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:streamRawPredict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamRawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.streamRawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.pause"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.resume"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:addTrialMeasurement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTrialMeasurement)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.addTrialMeasurement"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:checkTrialEarlyStoppingState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkTrialEarlyStoppingState)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.checkTrialEarlyStoppingState"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:complete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.complete"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.stop"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:listOptimalTrials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:listOptimalTrials)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.listOptimalTrials"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:suggest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:suggest)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.suggest"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies:lookup)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.lookup"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}:exportTensorboardTimeSeries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportTensorboardTimeSeries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.exportTensorboardTimeSeries"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::write)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.write"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs:batchCreate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.batchCreate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchCreate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.batchCreate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::write)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.write"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:evaluateInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateInstances)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.evaluateInstances"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.agents.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.agents.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/apps/{appsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.apps.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/apps/{appsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.apps.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/batchPredictionJobs/{batchPredictionJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batchPredictionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.batchPredictionJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/cachedContents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cachedContents)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.cachedContents.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customJobs/{customJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.customJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataLabelingJobs/{dataLabelingJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataLabelingJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.dataLabelingJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationSpecs/{annotationSpecsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.annotationSpecs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/annotations/{annotationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.annotations.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataItems/{dataItemsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.dataItems.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/datasetVersions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasetVersions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.datasetVersions.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/savedQueries/{savedQueriesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.savedQueries.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.export"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.datasets.import"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/deploymentResourcePools/{deploymentResourcePoolsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deploymentResourcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.deploymentResourcePools.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/edgeDevices/{edgeDevicesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeDevices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.edgeDevices.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/edgeDevices/{edgeDevicesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeDevices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.edgeDevices.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/chat/completions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chat/completions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.chat.completions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:computeTokens","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.computeTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:countTokens","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::countTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.countTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:deployModel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployModel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.deployModel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:directPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::directPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.directPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:directRawPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::directRawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.directRawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:explain","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::explain)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.explain"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:generateContent","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.generateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:mutateDeployedModel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mutateDeployedModel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.mutateDeployedModel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:predict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.predict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:rawPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.rawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:serverStreamingPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.serverStreamingPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:streamGenerateContent","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamGenerateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.streamGenerateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:streamRawPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamRawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.streamRawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:undeployModel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeployModel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.endpoints.undeployModel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/evaluationTasks/{evaluationTasksId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationTasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.evaluationTasks.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/exampleStores/{exampleStoresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.exampleStores.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/exampleStores/{exampleStoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.exampleStores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensionControllers/{extensionControllersId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensionControllers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensionControllers.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensionControllers/{extensionControllersId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensionControllers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensionControllers.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}:execute","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.execute"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions/{extensionsId}:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.query"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/extensions:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/extensions:import)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.extensions.import"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/features/{featuresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.features.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureGroups/{featureGroupsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureGroups.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:fetchFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.fetchFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:searchNearestEntities","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchNearestEntities)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.searchNearestEntities"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:streamingFetchFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamingFetchFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.streamingFetchFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:sync","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sync)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.sync"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/featureViews/{featureViewsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.featureViews.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featureOnlineStores/{featureOnlineStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featureOnlineStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featureOnlineStores.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features/{featuresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/features:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features:batchCreate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.features.batchCreate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:deleteFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.deleteFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:exportFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.exportFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:importFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.importFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:readFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.readFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:streamingReadFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamingReadFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.streamingReadFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/entityTypes/{entityTypesId}:writeFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::writeFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.entityTypes.writeFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:batchReadFeatureValues","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchReadFeatureValues)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.batchReadFeatureValues"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/featurestores/{featurestoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/featurestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.featurestores.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/hyperparameterTuningJobs/{hyperparameterTuningJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hyperparameterTuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.hyperparameterTuningJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:deployIndex","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployIndex)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.deployIndex"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:findNeighbors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::findNeighbors)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.findNeighbors"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:mutateDeployedIndex","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mutateDeployedIndex)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.mutateDeployedIndex"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:readIndexDatapoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readIndexDatapoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.readIndexDatapoints"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexEndpoints/{indexEndpointsId}:undeployIndex","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeployIndex)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexEndpoints.undeployIndex"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}:removeDatapoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeDatapoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.removeDatapoints"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/indexes/{indexesId}:upsertDatapoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upsertDatapoints)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.indexes.upsertDatapoints"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts/{artifactsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/artifacts:purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts:purge)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.artifacts.purge"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:addContextArtifactsAndExecutions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addContextArtifactsAndExecutions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.addContextArtifactsAndExecutions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:addContextChildren","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addContextChildren)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.addContextChildren"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts/{contextsId}:removeContextChildren","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeContextChildren)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.removeContextChildren"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/contexts:purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts:purge)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.contexts.purge"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions/{executionsId}:addExecutionEvents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addExecutionEvents)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.addExecutionEvents"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/executions:purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions:purge)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.executions.purge"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/metadataSchemas","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataSchemas)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.metadataSchemas.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/metadataStores/{metadataStoresId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.metadataStores.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources/{migratableResourcesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources:batchMigrate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources:batchMigrate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.batchMigrate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migratableResources:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratableResources:search)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.migratableResources.search"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}:pause","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.pause"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.resume"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelDeploymentMonitoringJobs/{modelDeploymentMonitoringJobsId}:searchModelDeploymentMonitoringStatsAnomalies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelDeploymentMonitoringJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchModelDeploymentMonitoringStatsAnomalies)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelDeploymentMonitoringJobs.searchModelDeploymentMonitoringStatsAnomalies"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/modelMonitoringJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitoringJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.modelMonitoringJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}:searchModelMonitoringAlerts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchModelMonitoringAlerts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.searchModelMonitoringAlerts"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/modelMonitors/{modelMonitorsId}:searchModelMonitoringStats","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modelMonitors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchModelMonitoringStats)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.modelMonitors.searchModelMonitoringStats"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations/{evaluationsId}/slices/{slicesId}:batchImport","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchImport)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.slices.batchImport"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/evaluations:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations:import)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.evaluations.import"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.export"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:mergeVersionAliases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mergeVersionAliases)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.mergeVersionAliases"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models/{modelsId}:updateExplanationDataset","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateExplanationDataset)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.updateExplanationDataset"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models:copy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models:copy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.copy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/models:upload","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models:upload)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.models.upload"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/nasJobs/{nasJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nasJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.nasJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}:generateAccessToken","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.generateAccessToken"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookExecutionJobs/{notebookExecutionJobsId}:reportEvent","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookExecutionJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportEvent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookExecutionJobs.reportEvent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.setIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimeTemplates/{notebookRuntimeTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimeTemplates.testIamPermissions"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}:generateAccessToken","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.generateAccessToken"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}:reportEvent","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportEvent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.reportEvent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}:start","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.start"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes/{notebookRuntimesId}:upgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.upgrade"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notebookRuntimes:assign","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notebookRuntimes:assign)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.notebookRuntimes.assign"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/persistentResources/{persistentResourcesId}:reboot","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/persistentResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reboot)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.persistentResources.reboot"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs/{pipelineJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs:batchCancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs:batchCancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.batchCancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/pipelineJobs:batchDelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelineJobs:batchDelete)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.pipelineJobs.batchDelete"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:computeTokens","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.computeTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:countTokens","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::countTokens)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.countTokens"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:generateContent","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.generateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.getIamPolicy"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:predict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.predict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:rawPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.rawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:serverStreamingPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.serverStreamingPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:streamGenerateContent","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamGenerateContent)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.streamGenerateContent"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:streamRawPredict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamRawPredict)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.publishers.models.streamRawPredict"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles/{ragFilesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles:import)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.ragCorpora.ragFiles.import"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/ragCorpora/{ragCorporaId}/ragFiles:upload","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragCorpora/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ragFiles:upload)$","service_name":"google.aiplatform","resource_name":"aiplatform.media.upload"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reasoningEngines/{reasoningEnginesId}:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reasoningEngines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.reasoningEngines.query"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}:pause","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.pause"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.schedules.resume"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/specialistPools/{specialistPoolsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specialistPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.specialistPools.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:addTrialMeasurement","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTrialMeasurement)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.addTrialMeasurement"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:checkTrialEarlyStoppingState","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkTrialEarlyStoppingState)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.checkTrialEarlyStoppingState"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:complete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.complete"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:stop","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.stop"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:listOptimalTrials","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:listOptimalTrials)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.listOptimalTrials"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:suggest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:suggest)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.trials.suggest"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/studies:lookup","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies:lookup)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.studies.lookup"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}/timeSeries/{timeSeriesId}:exportTensorboardTimeSeries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportTensorboardTimeSeries)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.timeSeries.exportTensorboardTimeSeries"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs/{runsId}:write","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::write)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.write"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}/runs:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs:batchCreate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.runs.batchCreate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchCreate)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.batchCreate"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/experiments/{experimentsId}:write","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::write)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.experiments.write"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tensorboards/{tensorboardsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tensorboards.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.operations.wait"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/trainingPipelines/{trainingPipelinesId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trainingPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.trainingPipelines.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tuningJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.create"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tuningJobs/{tuningJobsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tuningJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.tuningJobs.cancel"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}:evaluateInstances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateInstances)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.evaluateInstances"},{"hostname":"aiplatform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}:retrieveContexts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveContexts)$","service_name":"google.aiplatform","resource_name":"aiplatform.projects.locations.retrieveContexts"},{"hostname":"airquality.googleapis.com","http_method":"GET","path_template":"/v1/mapTypes/{mapType}/heatmapTiles/{zoom}/{x}/{y}","path_regex":"^(?:/v1/mapTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/heatmapTiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.airquality","resource_name":"airquality.mapTypes.heatmapTiles.lookupHeatmapTile"},{"hostname":"airquality.googleapis.com","http_method":"POST","path_template":"/v1/currentConditions:lookup","path_regex":"^(?:/v1/currentConditions:lookup)$","service_name":"google.airquality","resource_name":"airquality.currentConditions.lookup"},{"hostname":"airquality.googleapis.com","http_method":"POST","path_template":"/v1/forecast:lookup","path_regex":"^(?:/v1/forecast:lookup)$","service_name":"google.airquality","resource_name":"airquality.forecast.lookup"},{"hostname":"airquality.googleapis.com","http_method":"POST","path_template":"/v1/history:lookup","path_regex":"^(?:/v1/history:lookup)$","service_name":"google.airquality","resource_name":"airquality.history.lookup"},{"hostname":"alertcenter.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/alerts/{alertId}","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.delete"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts","path_regex":"^(?:/v1beta1/alerts)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.list"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts/{alertId}","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.get"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts/{alertId}/feedback","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedback)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.feedback.list"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/alerts/{alertId}/metadata","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.getMetadata"},{"hostname":"alertcenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/settings","path_regex":"^(?:/v1beta1/settings)$","service_name":"google.alertcenter","resource_name":"alertcenter.getSettings"},{"hostname":"alertcenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/settings","path_regex":"^(?:/v1beta1/settings)$","service_name":"google.alertcenter","resource_name":"alertcenter.updateSettings"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts/{alertId}/feedback","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedback)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.feedback.create"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts/{alertId}:undelete","path_regex":"^(?:/v1beta1/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.undelete"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts:batchDelete","path_regex":"^(?:/v1beta1/alerts:batchDelete)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.batchDelete"},{"hostname":"alertcenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/alerts:batchUndelete","path_regex":"^(?:/v1beta1/alerts:batchUndelete)$","service_name":"google.alertcenter","resource_name":"alertcenter.alerts.batchUndelete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.delete"},{"hostname":"alloydb.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.delete"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}/connectionInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionInfo)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.getConnectionInfo"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/supportedDatabaseFlags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedDatabaseFlags)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.supportedDatabaseFlags.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}/connectionInfo","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionInfo)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.getConnectionInfo"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/supportedDatabaseFlags","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedDatabaseFlags)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.supportedDatabaseFlags.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}/connectionInfo","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionInfo)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.getConnectionInfo"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.list"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.get"},{"hostname":"alloydb.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/supportedDatabaseFlags","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedDatabaseFlags)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.supportedDatabaseFlags.list"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.patch"},{"hostname":"alloydb.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users/{usersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.patch"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:failover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.failover"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:injectFault","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectFault)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.injectFault"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.restart"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances:createsecondary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances:createsecondary)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.createsecondary"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:promote","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.promote"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:switchover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::switchover)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.switchover"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters:createsecondary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters:createsecondary)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.createsecondary"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters:restore)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.restore"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.cancel"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:failover","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.failover"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:injectFault","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectFault)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.injectFault"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:restart","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.restart"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances:createsecondary","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances:createsecondary)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.createsecondary"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:promote","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.promote"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:switchover","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::switchover)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.switchover"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters:createsecondary","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters:createsecondary)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.createsecondary"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clusters:restore","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters:restore)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.restore"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.cancel"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.backups.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:failover","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.failover"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:injectFault","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectFault)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.injectFault"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances/{instancesId}:restart","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.restart"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/instances:createsecondary","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances:createsecondary)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.instances.createsecondary"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/users","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.users.create"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:promote","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.promote"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:switchover","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::switchover)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.switchover"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters:createsecondary","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters:createsecondary)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.createsecondary"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/clusters:restore","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters:restore)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.clusters.restore"},{"hostname":"alloydb.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.alloydb","resource_name":"alloydb.projects.locations.operations.cancel"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.delete"},{"hostname":"analytics.googleapis.com","http_method":"DELETE","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.delete"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/data/ga","path_regex":"^(?:/analytics/v3/data/ga)$","service_name":"google.analytics","resource_name":"analytics.data.ga.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/data/mcf","path_regex":"^(?:/analytics/v3/data/mcf)$","service_name":"google.analytics","resource_name":"analytics.data.mcf.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/data/realtime","path_regex":"^(?:/analytics/v3/data/realtime)$","service_name":"google.analytics","resource_name":"analytics.data.realtime.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accountSummaries","path_regex":"^(?:/analytics/v3/management/accountSummaries)$","service_name":"google.analytics","resource_name":"analytics.management.accountSummaries.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts","path_regex":"^(?:/analytics/v3/management/accounts)$","service_name":"google.analytics","resource_name":"analytics.management.accounts.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/filters","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters)$","service_name":"google.analytics","resource_name":"analytics.management.filters.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties)$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources)$","service_name":"google.analytics","resource_name":"analytics.management.customDataSources.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploads)$","service_name":"google.analytics","resource_name":"analytics.management.uploads.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads/{uploadId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.uploads.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.analytics","resource_name":"analytics.management.profiles.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.analytics","resource_name":"analytics.management.experiments.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals)$","service_name":"google.analytics","resource_name":"analytics.management.goals.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.goals.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports)$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports/{unsampledReportId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences)$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.get"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/management/segments","path_regex":"^(?:/analytics/v3/management/segments)$","service_name":"google.analytics","resource_name":"analytics.management.segments.list"},{"hostname":"analytics.googleapis.com","http_method":"GET","path_template":"/analytics/v3/metadata/{reportType}/columns","path_regex":"^(?:/analytics/v3/metadata/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.analytics","resource_name":"analytics.metadata.columns.list"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.goals.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.patch"},{"hostname":"analytics.googleapis.com","http_method":"PATCH","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.patch"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/filters","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters)$","service_name":"google.analytics","resource_name":"analytics.management.filters.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties)$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/deleteUploadData","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteUploadData)$","service_name":"google.analytics","resource_name":"analytics.management.uploads.deleteUploadData"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDataSources/{customDataSourceId}/uploads","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploads)$","service_name":"google.analytics","resource_name":"analytics.management.uploads.uploadData"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.analytics","resource_name":"analytics.management.profiles.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.analytics","resource_name":"analytics.management.experiments.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals)$","service_name":"google.analytics","resource_name":"analytics.management.goals.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks)$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/unsampledReports","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unsampledReports)$","service_name":"google.analytics","resource_name":"analytics.management.unsampledReports.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences)$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.insert"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/management/clientId:hashClientId","path_regex":"^(?:/analytics/v3/management/clientId:hashClientId)$","service_name":"google.analytics","resource_name":"analytics.management.clientId.hashClientId"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/provisioning/createAccountTicket","path_regex":"^(?:/analytics/v3/provisioning/createAccountTicket)$","service_name":"google.analytics","resource_name":"analytics.provisioning.createAccountTicket"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/provisioning/createAccountTree","path_regex":"^(?:/analytics/v3/provisioning/createAccountTree)$","service_name":"google.analytics","resource_name":"analytics.provisioning.createAccountTree"},{"hostname":"analytics.googleapis.com","http_method":"POST","path_template":"/analytics/v3/userDeletion/userDeletionRequests:upsert","path_regex":"^(?:/analytics/v3/userDeletion/userDeletionRequests:upsert)$","service_name":"google.analytics","resource_name":"analytics.userDeletion.userDeletionRequest.upsert"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.accountUserLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/filters/{filterId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.filters.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customDimensions/{customDimensionId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customDimensions.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/customMetrics/{customMetricId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.customMetrics.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityAdWordsLinks/{webPropertyAdWordsLinkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityAdWordsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webPropertyAdWordsLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.webpropertyUserLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profiles.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/entityUserLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityUserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileUserLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/experiments/{experimentId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.experiments.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals/{goalId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.goals.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/profileFilterLinks/{linkId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profileFilterLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.profileFilterLinks.update"},{"hostname":"analytics.googleapis.com","http_method":"PUT","path_template":"/analytics/v3/management/accounts/{accountId}/webproperties/{webPropertyId}/remarketingAudiences/{remarketingAudienceId}","path_regex":"^(?:/analytics/v3/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analytics","resource_name":"analytics.management.remarketingAudience.update"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/accounts/{accountsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/accounts/{accountsId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/adSenseLinks/{adSenseLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSenseLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.adSenseLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks/{bigQueryLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/calculatedMetrics/{calculatedMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/calculatedMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.calculatedMetrics.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/channelGroups/{channelGroupsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventCreateRules/{eventCreateRulesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventCreateRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventCreateRules.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventEditRules/{eventEditRulesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventEditRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventEditRules.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/sKAdNetworkConversionValueSchema/{sKAdNetworkConversionValueSchemaId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sKAdNetworkConversionValueSchema/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.sKAdNetworkConversionValueSchema.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks/{displayVideo360AdvertiserLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets/{expandedDataSetsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/firebaseLinks/{firebaseLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/keyEvents/{keyEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/rollupPropertySourceLinks/{rollupPropertySourceLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollupPropertySourceLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.rollupPropertySourceLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links/{searchAds360LinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/properties/{propertiesId}/subpropertyEventFilters/{subpropertyEventFiltersId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subpropertyEventFilters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.subpropertyEventFilters.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/firebaseLinks/{firebaseLinksId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/properties/{propertiesId}/keyEvents/{keyEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.delete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accountSummaries","path_regex":"^(?:/v1alpha/accountSummaries)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accountSummaries.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts","path_regex":"^(?:/v1alpha/accounts)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/accessBindings","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchGet","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchGet)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchGet"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/dataSharingSettings","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSharingSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.getDataSharingSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties","path_regex":"^(?:/v1alpha/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/accessBindings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchGet","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchGet)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchGet"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/adSenseLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSenseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.adSenseLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/adSenseLinks/{adSenseLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSenseLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.adSenseLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/attributionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getAttributionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/audiences","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/audiences/{audiencesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks/{bigQueryLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/calculatedMetrics","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/calculatedMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.calculatedMetrics.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/calculatedMetrics/{calculatedMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/calculatedMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.calculatedMetrics.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/channelGroups","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/channelGroups/{channelGroupsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/dataRedactionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRedactionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.getDataRedactionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/enhancedMeasurementSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enhancedMeasurementSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.getEnhancedMeasurementSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventCreateRules","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventCreateRules)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventCreateRules.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventCreateRules/{eventCreateRulesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventCreateRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventCreateRules.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventEditRules","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventEditRules)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventEditRules.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventEditRules/{eventEditRulesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventEditRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventEditRules.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/globalSiteTag","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/globalSiteTag)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.getGlobalSiteTag"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/sKAdNetworkConversionValueSchema","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sKAdNetworkConversionValueSchema)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.sKAdNetworkConversionValueSchema.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/sKAdNetworkConversionValueSchema/{sKAdNetworkConversionValueSchemaId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sKAdNetworkConversionValueSchema/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.sKAdNetworkConversionValueSchema.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks/{displayVideo360AdvertiserLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets/{expandedDataSetsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/googleSignalsSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleSignalsSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getGoogleSignalsSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/keyEvents","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/keyEvents/{keyEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/rollupPropertySourceLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollupPropertySourceLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.rollupPropertySourceLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/rollupPropertySourceLinks/{rollupPropertySourceLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollupPropertySourceLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.rollupPropertySourceLinks.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links/{searchAds360LinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/subpropertyEventFilters","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subpropertyEventFilters)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.subpropertyEventFilters.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/subpropertyEventFilters/{subpropertyEventFiltersId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subpropertyEventFilters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.subpropertyEventFilters.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties:fetchConnectedGa4Property","path_regex":"^(?:/v1alpha/properties:fetchConnectedGa4Property)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.fetchConnectedGa4Property"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accountSummaries","path_regex":"^(?:/v1beta/accountSummaries)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accountSummaries.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts","path_regex":"^(?:/v1beta/accounts)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/accounts/{accountsId}/dataSharingSettings","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSharingSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.getDataSharingSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties","path_regex":"^(?:/v1beta/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.getDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/keyEvents","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.list"},{"hostname":"analyticsadmin.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/keyEvents/{keyEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.get"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/accounts/{accountsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/accounts/{accountsId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/accessBindings/{accessBindingsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/attributionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateAttributionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/audiences/{audiencesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks/{bigQueryLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/calculatedMetrics/{calculatedMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/calculatedMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.calculatedMetrics.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/channelGroups/{channelGroupsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/dataRedactionSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRedactionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.updateDataRedactionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/enhancedMeasurementSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enhancedMeasurementSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.updateEnhancedMeasurementSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventCreateRules/{eventCreateRulesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventCreateRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventCreateRules.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventEditRules/{eventEditRulesId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventEditRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventEditRules.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/sKAdNetworkConversionValueSchema/{sKAdNetworkConversionValueSchemaId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sKAdNetworkConversionValueSchema/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.sKAdNetworkConversionValueSchema.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks/{displayVideo360AdvertiserLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets/{expandedDataSetsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/googleSignalsSettings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleSignalsSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateGoogleSignalsSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/keyEvents/{keyEventsId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links/{searchAds360LinksId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/properties/{propertiesId}/subpropertyEventFilters/{subpropertyEventFiltersId}","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subpropertyEventFilters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.subpropertyEventFilters.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/accounts/{accountsId}","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/conversionEvents/{conversionEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/customDimensions/{customDimensionsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/customMetrics/{customMetricsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/dataRetentionSettings","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataRetentionSettings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.updateDataRetentionSettings"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets/{measurementProtocolSecretsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks/{googleAdsLinksId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/properties/{propertiesId}/keyEvents/{keyEventsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.patch"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchCreate","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchCreate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchCreate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchDelete","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchDelete)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchDelete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/accessBindings:batchUpdate","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchUpdate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.accessBindings.batchUpdate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}:runAccessReport","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.runAccessReport"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}:searchChangeHistoryEvents","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchChangeHistoryEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.searchChangeHistoryEvents"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts:provisionAccountTicket","path_regex":"^(?:/v1alpha/accounts:provisionAccountTicket)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.provisionAccountTicket"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties","path_regex":"^(?:/v1alpha/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchCreate","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchCreate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchCreate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchDelete","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchDelete)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchDelete"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/accessBindings:batchUpdate","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessBindings:batchUpdate)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.accessBindings.batchUpdate"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/adSenseLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adSenseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.adSenseLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/audiences","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/audiences/{audiencesId}:archive","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.audiences.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/bigQueryLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.bigQueryLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/calculatedMetrics","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/calculatedMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.calculatedMetrics.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/channelGroups","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelGroups)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.channelGroups.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customDimensions/{customDimensionsId}:archive","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/customMetrics/{customMetricsId}:archive","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventCreateRules","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventCreateRules)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventCreateRules.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventEditRules","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventEditRules)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventEditRules.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/eventEditRules:reorder","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventEditRules:reorder)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.eventEditRules.reorder"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/dataStreams/{dataStreamsId}/sKAdNetworkConversionValueSchema","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sKAdNetworkConversionValueSchema)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.sKAdNetworkConversionValueSchema.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}:approve","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.approve"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinkProposals/{displayVideo360AdvertiserLinkProposalsId}:cancel","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinkProposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinkProposals.cancel"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/displayVideo360AdvertiserLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/displayVideo360AdvertiserLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.displayVideo360AdvertiserLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/expandedDataSets","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandedDataSets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.expandedDataSets.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/keyEvents","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/rollupPropertySourceLinks","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollupPropertySourceLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.rollupPropertySourceLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/searchAds360Links","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360Links)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.searchAds360Links.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}/subpropertyEventFilters","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subpropertyEventFilters)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.subpropertyEventFilters.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}:acknowledgeUserDataCollection","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledgeUserDataCollection)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.acknowledgeUserDataCollection"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}:runAccessReport","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.runAccessReport"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:createConnectedSiteTag","path_regex":"^(?:/v1alpha/properties:createConnectedSiteTag)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.createConnectedSiteTag"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:createRollupProperty","path_regex":"^(?:/v1alpha/properties:createRollupProperty)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.createRollupProperty"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:deleteConnectedSiteTag","path_regex":"^(?:/v1alpha/properties:deleteConnectedSiteTag)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.deleteConnectedSiteTag"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:fetchAutomatedGa4ConfigurationOptOut","path_regex":"^(?:/v1alpha/properties:fetchAutomatedGa4ConfigurationOptOut)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.fetchAutomatedGa4ConfigurationOptOut"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:listConnectedSiteTags","path_regex":"^(?:/v1alpha/properties:listConnectedSiteTags)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.listConnectedSiteTags"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:provisionSubproperty","path_regex":"^(?:/v1alpha/properties:provisionSubproperty)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.provisionSubproperty"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties:setAutomatedGa4ConfigurationOptOut","path_regex":"^(?:/v1alpha/properties:setAutomatedGa4ConfigurationOptOut)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.setAutomatedGa4ConfigurationOptOut"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}:runAccessReport","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.runAccessReport"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts/{accountsId}:searchChangeHistoryEvents","path_regex":"^(?:/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchChangeHistoryEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.searchChangeHistoryEvents"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/accounts:provisionAccountTicket","path_regex":"^(?:/v1beta/accounts:provisionAccountTicket)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.accounts.provisionAccountTicket"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties","path_regex":"^(?:/v1beta/properties)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/conversionEvents","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.conversionEvents.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customDimensions","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customDimensions/{customDimensionsId}:archive","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDimensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customDimensions.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customMetrics","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/customMetrics/{customMetricsId}:archive","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.customMetrics.archive"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/dataStreams","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/dataStreams/{dataStreamsId}/measurementProtocolSecrets","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStreams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/measurementProtocolSecrets)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.dataStreams.measurementProtocolSecrets.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/firebaseLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firebaseLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.firebaseLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/googleAdsLinks","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleAdsLinks)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.googleAdsLinks.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/keyEvents","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyEvents)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.keyEvents.create"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:acknowledgeUserDataCollection","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledgeUserDataCollection)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.acknowledgeUserDataCollection"},{"hostname":"analyticsadmin.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runAccessReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAccessReport)$","service_name":"google.analyticsadmin","resource_name":"analyticsadmin.properties.runAccessReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"GET","path_template":"/v1alpha/properties/{propertiesId}/metadata","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.getMetadata"},{"hostname":"analyticsdata.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/audienceExports","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audienceExports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.audienceExports.list"},{"hostname":"analyticsdata.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/audienceExports/{audienceExportsId}","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audienceExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.audienceExports.get"},{"hostname":"analyticsdata.googleapis.com","http_method":"GET","path_template":"/v1beta/properties/{propertiesId}/metadata","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.getMetadata"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha/properties/{propertiesId}:runRealtimeReport","path_regex":"^(?:/v1alpha/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runRealtimeReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runRealtimeReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:batchRunPivotReports","path_regex":"^(?:/v1alpha:batchRunPivotReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.batchRunPivotReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:batchRunReports","path_regex":"^(?:/v1alpha:batchRunReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.batchRunReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:runPivotReport","path_regex":"^(?:/v1alpha:runPivotReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.runPivotReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1alpha:runReport","path_regex":"^(?:/v1alpha:runReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.runReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/audienceExports","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audienceExports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.audienceExports.create"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}/audienceExports/{audienceExportsId}:query","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audienceExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.audienceExports.query"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:batchRunPivotReports","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchRunPivotReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.batchRunPivotReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:batchRunReports","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchRunReports)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.batchRunReports"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:checkCompatibility","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkCompatibility)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.checkCompatibility"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runPivotReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runPivotReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runPivotReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runRealtimeReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runRealtimeReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runRealtimeReport"},{"hostname":"analyticsdata.googleapis.com","http_method":"POST","path_template":"/v1beta/properties/{propertiesId}:runReport","path_regex":"^(?:/v1beta/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runReport)$","service_name":"google.analyticsdata","resource_name":"analyticsdata.properties.runReport"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.delete"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.organizations.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:listSubscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSubscriptions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.listSubscriptions"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:listSubscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSubscriptions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listSubscriptions"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.organizations.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.get"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.list"},{"hostname":"analyticshub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.get"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.patch"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:subscribe","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.subscribe"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.testIamPermissions"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:subscribe","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.subscribe"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.testIamPermissions"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:refresh","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refresh)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.refresh"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:revoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.revoke"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.subscriptions.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.create"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:subscribe","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.subscribe"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}/listings/{listingsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.listings.testIamPermissions"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.getIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.setIamPolicy"},{"hostname":"analyticshub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/dataExchanges/{dataExchangesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataExchanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.analyticshub","resource_name":"analyticshub.projects.locations.dataExchanges.testIamPermissions"},{"hostname":"analyticsreporting.googleapis.com","http_method":"POST","path_template":"/v4/reports:batchGet","path_regex":"^(?:/v4/reports:batchGet)$","service_name":"google.analyticsreporting","resource_name":"analyticsreporting.reports.batchGet"},{"hostname":"analyticsreporting.googleapis.com","http_method":"POST","path_template":"/v4/userActivity:search","path_regex":"^(?:/v4/userActivity:search)$","service_name":"google.analyticsreporting","resource_name":"analyticsreporting.userActivity.search"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"DELETE","path_template":"/v1/customers/{customersId}/configurations/{configurationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.delete"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers","path_regex":"^(?:/v1/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/configurations","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/configurations/{configurationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/devices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/dpcs","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dpcs)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.dpcs.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.operations.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/customers","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.customers.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/devices/{devicesId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.get"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/vendors","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vendors)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.vendors.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/vendors/{vendorsId}/customers","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vendors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.vendors.customers.list"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"PATCH","path_template":"/v1/customers/{customersId}/configurations/{configurationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.patch"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/configurations","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.configurations.create"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/devices:applyConfiguration","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:applyConfiguration)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.applyConfiguration"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/devices:removeConfiguration","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:removeConfiguration)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.removeConfiguration"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/devices:unclaim","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:unclaim)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.customers.devices.unclaim"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/customers","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.customers.create"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices/{devicesId}/metadata","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.metadata"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:claim","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:claim)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.claim"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:claimAsync","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:claimAsync)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.claimAsync"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:findByIdentifier","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:findByIdentifier)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.findByIdentifier"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:findByOwner","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:findByOwner)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.findByOwner"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:getSimLockState","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:getSimLockState)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.getSimLockState"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:unclaim","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:unclaim)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.unclaim"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:unclaimAsync","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:unclaimAsync)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.unclaimAsync"},{"hostname":"androiddeviceprovisioning.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/devices:updateMetadataAsync","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:updateMetadataAsync)$","service_name":"google.androiddeviceprovisioning","resource_name":"androiddeviceprovisioning.partners.devices.updateMetadataAsync"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccountKeys/{keyId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccountKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.serviceaccountkeys.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/deviceAccess","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceAccess)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.revokeDeviceAccess"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"DELETE","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps/{webAppId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.delete"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises","path_regex":"^(?:/androidenterprise/v1/enterprises)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/groupLicenses","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupLicenses)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.grouplicenses.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupLicenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.grouplicenses.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/groupLicenses/{groupLicenseId}/users","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupLicenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.grouplicenseusers.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/appRestrictionsSchema","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRestrictionsSchema)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.getAppRestrictionsSchema"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/managedConfigurationsSettings","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsSettings)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationssettings.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/permissions","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.getPermissions"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccount","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.getServiceAccount"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccountKeys","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccountKeys)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.serviceaccountkeys.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.getStoreLayout"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/availableProductSet","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/availableProductSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.getAvailableProductSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/state)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.getState"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.list"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps/{webAppId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"GET","path_template":"/androidenterprise/v1/permissions/{permissionId}","path_regex":"^(?:/androidenterprise/v1/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.permissions.get"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/acknowledgeNotificationSet","path_regex":"^(?:/androidenterprise/v1/enterprises/acknowledgeNotificationSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.acknowledgeNotificationSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/completeSignup","path_regex":"^(?:/androidenterprise/v1/enterprises/completeSignup)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.completeSignup"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/enroll","path_regex":"^(?:/androidenterprise/v1/enterprises/enroll)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.enroll"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/pullNotificationSet","path_regex":"^(?:/androidenterprise/v1/enterprises/pullNotificationSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.pullNotificationSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/signupUrl","path_regex":"^(?:/androidenterprise/v1/enterprises/signupUrl)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.generateSignupUrl"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/createEnrollmentToken","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEnrollmentToken)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.createEnrollmentToken"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/createWebToken","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createWebToken)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.createWebToken"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/approve","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approve)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.approve"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/generateApprovalUrl","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generateApprovalUrl)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.generateApprovalUrl"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/products/{productId}/unapprove","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unapprove)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.products.unapprove"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/sendTestPushNotification","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendTestPushNotification)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.sendTestPushNotification"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/serviceAccountKeys","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccountKeys)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.serviceaccountkeys.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/unenroll","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unenroll)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.unenroll"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/authenticationToken","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authenticationToken)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.generateAuthenticationToken"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/forceReportUpload","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forceReportUpload)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.forceReportUpload"},{"hostname":"androidenterprise.googleapis.com","http_method":"POST","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.insert"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/account","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/account)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.setAccount"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.enterprises.setStoreLayout"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutpages.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/storeLayout/pages/{pageId}/clusters/{clusterId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeLayout/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.storelayoutclusters.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/availableProductSet","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/availableProductSet)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.users.setAvailableProductSet"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/installs/{installId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/installs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.installs.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/managedConfigurationsForDevice/{managedConfigurationForDeviceId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForDevice/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsfordevice.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/devices/{deviceId}/state","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/state)$","service_name":"google.androidenterprise","resource_name":"androidenterprise.devices.setState"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/entitlements/{entitlementId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.entitlements.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/users/{userId}/managedConfigurationsForUser/{managedConfigurationForUserId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedConfigurationsForUser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.managedconfigurationsforuser.update"},{"hostname":"androidenterprise.googleapis.com","http_method":"PUT","path_template":"/androidenterprise/v1/enterprises/{enterpriseId}/webApps/{webAppId}","path_regex":"^(?:/androidenterprise/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidenterprise","resource_name":"androidenterprise.webapps.update"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens/{enrollmentTokensId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/policies/{policiesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/enterprises/{enterprisesId}/webApps/{webAppsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.delete"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises","path_regex":"^(?:/v1/enterprises)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/applications/{applicationsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.applications.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations/{operationsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens/{enrollmentTokensId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/migrationTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.migrationTokens.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/migrationTokens/{migrationTokensId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.migrationTokens.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/policies","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/policies/{policiesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/webApps","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.list"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/webApps/{webAppsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"GET","path_template":"/v1/provisioningInfo/{provisioningInfoId}","path_regex":"^(?:/v1/provisioningInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.provisioningInfo.get"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}/policies/{policiesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.policies.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/enterprises/{enterprisesId}/webApps/{webAppsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.patch"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises","path_regex":"^(?:/v1/enterprises)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.operations.cancel"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}:issueCommand","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::issueCommand)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.devices.issueCommand"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/enrollmentTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enrollmentTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.enrollmentTokens.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/migrationTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.migrationTokens.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/webApps","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webApps.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/webTokens","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webTokens)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.enterprises.webTokens.create"},{"hostname":"androidmanagement.googleapis.com","http_method":"POST","path_template":"/v1/signupUrls","path_regex":"^(?:/v1/signupUrls)$","service_name":"google.androidmanagement","resource_name":"androidmanagement.signupUrls.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.deleteall"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.deleteall"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}/{imageId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"DELETE","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}/grants/{grantsId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.grants.delete"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{applicationsId}/externalTransactions/{externalTransactionsId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalTransactions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.externaltransactions.getexternaltransaction"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/appRecoveries","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRecoveries)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.apprecovery.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/deviceTierConfigs","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceTierConfigs)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.deviceTierConfigs.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/deviceTierConfigs/{deviceTierConfigId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceTierConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.deviceTierConfigs.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.apks.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/bundles","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bundles)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.bundles.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/countryAvailability/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countryAvailability/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.countryavailability.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/details","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.details.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/testers/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.testers.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/generatedApks/{versionCode}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generatedApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.generatedapks.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/generatedApks/{versionCode}/downloads/{downloadId}:download","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generatedApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/downloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.generatedapks.download"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts:batchGet","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts:batchGet)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.batchGet"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptionsv2/tokens/{token}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptionsv2/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptionsv2.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/voidedpurchases","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/voidedpurchases)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.voidedpurchases.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/reviews","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reviews)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.reviews.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.reviews.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions:batchGet","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions:batchGet)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.batchGet"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants/{variantId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.get"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants/{variantId}:download","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.download"},{"hostname":"androidpublisher.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v3/developers/{developersId}/users","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.list"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/details","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.details.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/testers/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.testers.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"PATCH","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}/grants/{grantsId}","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.grants.patch"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/internalappsharing/{packageName}/artifacts/apk","path_regex":"^(?:/androidpublisher/v3/applications/internalappsharing/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/apk)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.internalappsharingartifacts.uploadapk"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/internalappsharing/{packageName}/artifacts/bundle","path_regex":"^(?:/androidpublisher/v3/applications/internalappsharing/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/bundle)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.internalappsharingartifacts.uploadbundle"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{applicationsId}/externalTransactions","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalTransactions)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.externaltransactions.createexternaltransaction"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{applicationsId}/externalTransactions/{externalTransactionsId}:refund","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalTransactions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refund)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.externaltransactions.refundexternaltransaction"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/appRecoveries","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRecoveries)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.apprecovery.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/appRecoveries/{appRecoveryId}:addTargeting","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRecoveries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargeting)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.apprecovery.addTargeting"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/appRecoveries/{appRecoveryId}:cancel","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRecoveries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.apprecovery.cancel"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/appRecoveries/{appRecoveryId}:deploy","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appRecoveries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.apprecovery.deploy"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/dataSafety","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSafety)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.dataSafety"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/deviceTierConfigs","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceTierConfigs)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.applications.deviceTierConfigs.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.insert"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.apks.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/externallyHosted","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/externallyHosted)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.apks.addexternallyhosted"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/deobfuscationFiles/{deobfuscationFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deobfuscationFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.deobfuscationfiles.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/bundles","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bundles)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.bundles.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}/{imageType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.images.upload"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}:commit","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.commit"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}:validate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.validate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.insert"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts:batchDelete","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts:batchDelete)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.batchDelete"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts:batchUpdate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts:batchUpdate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.batchUpdate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/orders/{orderId}:refund","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refund)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.orders.refund"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/pricing:convertRegionPrices","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pricing:convertRegionPrices)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.convertRegionPrices"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:acknowledge","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.acknowledge"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/products/{productId}/tokens/{token}:consume","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::consume)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.consume"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:acknowledge","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.acknowledge"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:cancel","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.cancel"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:defer","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::defer)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.defer"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:refund","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refund)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.refund"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptions/{subscriptionId}/tokens/{token}:revoke","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptions.revoke"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/purchases/subscriptionsv2/tokens/{token}:revoke","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/subscriptionsv2/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.subscriptionsv2.revoke"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/reviews/{reviewId}:reply","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reply)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.reviews.reply"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}:activate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.activate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers/{offerId}:deactivate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.deactivate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers:batchGet","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers:batchGet)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.batchGet"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers:batchUpdate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers:batchUpdate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.batchUpdate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}/offers:batchUpdateStates","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers:batchUpdateStates)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.offers.batchUpdateStates"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}:activate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.activate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}:deactivate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.deactivate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans/{basePlanId}:migratePrices","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::migratePrices)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.migratePrices"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans:batchMigratePrices","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans:batchMigratePrices)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.batchMigratePrices"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}/basePlans:batchUpdateStates","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/basePlans:batchUpdateStates)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.basePlans.batchUpdateStates"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions/{productId}:archive","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.archive"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/subscriptions:batchUpdate","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions:batchUpdate)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.monetization.subscriptions.batchUpdate"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/applications/{packageName}/systemApks/{versionCode}/variants","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/systemApks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variants)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.systemapks.variants.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/developers/{developersId}/users","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.users.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"POST","path_template":"/androidpublisher/v3/developers/{developersId}/users/{usersId}/grants","path_regex":"^(?:/androidpublisher/v3/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grants)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.grants.create"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/apks/{apkVersionCode}/expansionFiles/{expansionFileType}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expansionFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.expansionfiles.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/details","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/details)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.details.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/listings/{language}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.listings.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/testers/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.testers.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/edits/{editId}/tracks/{track}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tracks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.edits.tracks.update"},{"hostname":"androidpublisher.googleapis.com","http_method":"PUT","path_template":"/androidpublisher/v3/applications/{packageName}/inappproducts/{sku}","path_regex":"^(?:/androidpublisher/v3/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inappproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inappproducts.update"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.delete"},{"hostname":"apigateway.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.delete"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.get"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.getIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.list"},{"hostname":"apigateway.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.get"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.patch"},{"hostname":"apigateway.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.patch"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.configs.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.apis.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.create"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.setIamPolicy"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.gateways.testIamPermissions"},{"hostname":"apigateway.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigateway","resource_name":"apigateway.projects.locations.operations.cancel"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/analytics/datastores/{datastoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans/{rateplansId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.keys.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}/keys/{keysId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.keys.apiproducts.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/datacollectors/{datacollectorsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.apiproducts.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions/{debugsessionsId}/data","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.deleteData"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.undeploy"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/caches/{cachesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.caches.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/flowhooks/{flowhooksId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flowhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.flowhooks.detachSharedFlowFromFlowHook"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references/{referencesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}/{name}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.revisions.undeploy"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers/{targetserversId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides/{overridesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses/{natAddressesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/reports/{reportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.environments.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories/{apicategoriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.delete"},{"hostname":"apigee.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs/{apidocsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.delete"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/hybrid/issuers","path_regex":"^(?:/v1/hybrid/issuers)$","service_name":"google.apigee","resource_name":"apigee.hybrid.issuers.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations","path_regex":"^(?:/v1/organizations)$","service_name":"google.apigee","resource_name":"apigee.organizations.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/analytics/datastores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores)$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/analytics/datastores/{datastoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans/{rateplansId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/appgroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups)$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.keys.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.apps.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apps.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/datacollectors","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors)$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/datacollectors/{datacollectorsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/deployedIngressConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployedIngressConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.getDeployedIngressConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/balance","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/balance)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.getBalance"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/monetizationConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monetizationConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.getMonetizationConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/endpointAttachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/deployedIngressConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployedIngressConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.getDeployedIngressConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/addonsConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addonsConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getAddonsConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/admin/schemav2","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/admin/schemav2)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.admin.getSchemav2"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/exports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/exports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.exports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/exports/{exportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/exports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.exports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apiSecurityRuntimeConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiSecurityRuntimeConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getApiSecurityRuntimeConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions/{debugsessionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions/{debugsessionsId}/data/{dataId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.data.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.getDeployments"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/debugmask","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugmask)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getDebugmask"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/deployedConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployedConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getDeployedConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/flowhooks/{flowhooksId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flowhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.flowhooks.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}/certificate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificate)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.getCertificate"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}/csr","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csr)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.csr"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/optimizedStats/{optimizedStatsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/optimizedStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.optimizedStats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries/{queriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries/{queriesId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries/{queriesId}/resulturl","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resulturl)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.getResulturl"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references/{referencesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.listEnvironmentResources"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}/{name}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityActions.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActions/{securityActionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityActions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActionsConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActionsConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getSecurityActionsConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityIncidents","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityIncidents)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityIncidents.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityIncidents/{securityIncidentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityIncidents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityIncidents.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports/{securityReportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports/{securityReportsId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports/{securityReportsId}/resultView","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resultView)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.getResultView"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.revisions.getDeployments"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/stats/{statsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.stats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers/{targetserversId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getTraceConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides/{overridesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.getIamPolicy"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries/{hostQueriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries/{hostQueriesId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostQueries/{hostQueriesId}/resultView","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resultView)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.getResultView"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports/{hostSecurityReportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports/{hostSecurityReportsId}/result","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/result)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.getResult"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports/{hostSecurityReportsId}/resultView","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resultView)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.getResultView"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/hostStats/{hostStatsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.hostStats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/canaryevaluations/{canaryevaluationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/canaryevaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.canaryevaluations.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses/{natAddressesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigee","resource_name":"apigee.organizations.operations.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.operations.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/optimizedHostStats/{optimizedHostStatsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/optimizedHostStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.optimizedHostStats.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/reports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/reports/{reportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/runtimeConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.getRuntimeConfig"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityProfiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}:listRevisions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.listRevisions"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securitySettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.apigee","resource_name":"apigee.organizations.getSecuritySettings"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.deployments.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories/{apicategoriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.list"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs/{apidocsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.get"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs/{apidocsId}/documentation","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentation)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.getDocumentation"},{"hostname":"apigee.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}:getProjectMapping","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getProjectMapping)$","service_name":"google.apigee","resource_name":"apigee.organizations.getProjectMapping"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/datacollectors/{datacollectorsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.modifyEnvironment"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/debugmask","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugmask)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateDebugmask"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActionsConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActionsConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateSecurityActionsConfig"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityIncidents/{securityIncidentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityIncidents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityIncidents.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateTraceConfig"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides/{overridesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/securitySettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.apigee","resource_name":"apigee.organizations.updateSecuritySettings"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories/{apicategoriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.patch"},{"hostname":"apigee.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs/{apidocsId}/documentation","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentation)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.updateDocumentation"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations","path_regex":"^(?:/v1/organizations)$","service_name":"google.apigee","resource_name":"apigee.organizations.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/analytics/datastores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores)$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/analytics/datastores:test","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores:test)$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.test"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.attributes.updateApiProductAttribute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans)$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.revisions.updateApiProxyRevision"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/appgroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups)$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}/keys","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.keys.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.keys.updateAppGroupAppKey"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}/keys/{keysId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.keys.apiproducts.updateAppGroupAppKeyApiProduct"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/datacollectors","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacollectors)$","service_name":"google.apigee","resource_name":"apigee.organizations.datacollectors.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.setDeveloperStatus"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.generateKeyPairOrUpdateDeveloperAppStatus"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.attributes.updateDeveloperAppAttribute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/create","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/create)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.create.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.updateDeveloperAppKey"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.apiproducts.updateDeveloperAppKeyApiProduct"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/attributes/{attributesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.attributes.updateDeveloperAttribute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/balance:adjust","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/balance:adjust)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.balance.adjust"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/balance:credit","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/balance:credit)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.balance.credit"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/subscriptions/{subscriptionsId}:expire","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::expire)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.subscriptions.expire"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/endpointAttachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.endpointAttachments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/envgroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/envgroups/{envgroupsId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/envgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.envgroups.attachments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.updateEnvironment"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/addonsConfig:setAddonEnablement","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addonsConfig:setAddonEnablement)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.addonsConfig.setAddonEnablement"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/analytics/exports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/exports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.analytics.exports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/debugsessions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugsessions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.debugsessions.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.deploy"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments:generateDeployChangeReport","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments:generateDeployChangeReport)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.deployments.generateDeployChangeReport"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/apis/{apisId}/revisions/{revisionsId}/deployments:generateUndeployChangeReport","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments:generateUndeployChangeReport)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.apis.revisions.deployments.generateUndeployChangeReport"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments/{archiveDeploymentsId}:generateDownloadUrl","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.generateDownloadUrl"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/archiveDeployments:generateUploadUrl","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archiveDeployments:generateUploadUrl)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.archiveDeployments.generateUploadUrl"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/queries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.queries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityActions.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActions/{securityActionsId}:disable","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityActions.disable"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityActions/{securityActionsId}:enable","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityActions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityActions.enable"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityIncidents:batchUpdate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityIncidents:batchUpdate)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityIncidents.batchUpdate"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityReports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityStats:queryTabularStats","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityStats:queryTabularStats)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityStats.queryTabularStats"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/securityStats:queryTimeSeriesStats","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityStats:queryTimeSeriesStats)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.securityStats.queryTimeSeriesStats"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}/deployments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.sharedflows.revisions.deploy"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/traceConfig/overrides","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceConfig/overrides)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.traceConfig.overrides.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.setIamPolicy"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:subscribe","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.subscribe"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.testIamPermissions"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}:unsubscribe","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribe)$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.unsubscribe"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/hostQueries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostQueries)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostQueries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/hostSecurityReports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hostSecurityReports)$","service_name":"google.apigee","resource_name":"apigee.organizations.hostSecurityReports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/attachments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.attachments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/canaryevaluations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/canaryevaluations)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.canaryevaluations.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}/natAddresses/{natAddressesId}:activate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/natAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.natAddresses.activate"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/instances/{instancesId}:reportStatus","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.apigee","resource_name":"apigee.organizations.instances.reportStatus"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps)$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/reports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityAssessmentResults:batchCompute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityAssessmentResults:batchCompute)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityAssessmentResults.batchCompute"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityProfiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}/environments","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.environments.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityProfiles/{securityProfilesId}/environments/{environmentsId}:computeEnvironmentScores","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeEnvironmentScores)$","service_name":"google.apigee","resource_name":"apigee.organizations.securityProfiles.environments.computeEnvironmentScores"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sharedflows","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows)$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sharedflows/{sharedflowsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sharedflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sharedflows.revisions.updateSharedFlowRevision"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apicategories","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apicategories)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apicategories.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs)$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.create"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getSyncAuthorization","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getSyncAuthorization)$","service_name":"google.apigee","resource_name":"apigee.organizations.getSyncAuthorization"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setAddons","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAddons)$","service_name":"google.apigee","resource_name":"apigee.organizations.setAddons"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setSyncAuthorization","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSyncAuthorization)$","service_name":"google.apigee","resource_name":"apigee.organizations.setSyncAuthorization"},{"hostname":"apigee.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:provisionOrganization","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provisionOrganization)$","service_name":"google.apigee","resource_name":"apigee.projects.provisionOrganization"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/analytics/datastores/{datastoresId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analytics/datastores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.analytics.datastores.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/apiproducts/{apiproductsId}/rateplans/{rateplansId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiproducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rateplans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apiproducts.rateplans.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/apis/{apisId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.apis.keyvaluemaps.entries.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/appgroups/{appgroupsId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.appgroups.apps.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/apps/{appsId}/keys/{keysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.apps.keys.replaceDeveloperAppKey"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/developers/{developersId}/monetizationConfig","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monetizationConfig)$","service_name":"google.apigee","resource_name":"apigee.organizations.developers.updateMonetizationConfig"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/flowhooks/{flowhooksId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flowhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.flowhooks.attachSharedFlowToFlowHook"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keystores/{keystoresId}/aliases/{aliasesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keystores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keystores.aliases.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.keyvaluemaps.entries.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/references/{referencesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/references/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.references.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/resourcefiles/{type}/{name}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcefiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.resourcefiles.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/environments/{environmentsId}/targetservers/{targetserversId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetservers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.environments.targetservers.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/keyvaluemaps/{keyvaluemapsId}/entries/{entriesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyvaluemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.keyvaluemaps.entries.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/reports/{reportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.reports.update"},{"hostname":"apigee.googleapis.com","http_method":"PUT","path_template":"/v1/organizations/{organizationsId}/sites/{sitesId}/apidocs/{apidocsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apidocs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigee","resource_name":"apigee.organizations.sites.apidocs.update"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.deleteRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.deleteRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.delete"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.listRevisions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.listRevisions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:getContents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getContents)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.getContents"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.documents.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.list"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.get"},{"hostname":"apigeeregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtime:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtime:getIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.runtime.getIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.patch"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.rollback"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:tagRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tagRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.tagRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.rollback"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:tagRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tagRevision)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.tagRevision"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.documents.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.documents.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.create"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.instances.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.operations.cancel"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtime:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtime:setIamPolicy)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.runtime.setIamPolicy"},{"hostname":"apigeeregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtime:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtime:testIamPermissions)$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.runtime.testIamPermissions"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/deployments/{deploymentsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.deployments.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/apis/{apisId}/versions/{versionsId}/specs/{specsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/specs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.apis.versions.specs.artifacts.replaceArtifact"},{"hostname":"apigeeregistry.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/artifacts/{artifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/artifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apigeeregistry","resource_name":"apigeeregistry.projects.locations.artifacts.replaceArtifact"},{"hostname":"apikeys.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.delete"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/keys:lookupKey","path_regex":"^(?:/v2/keys:lookupKey)$","service_name":"google.apikeys","resource_name":"apikeys.keys.lookupKey"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/operations/{operationsId}","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.operations.get"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.list"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.get"},{"hostname":"apikeys.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}/keyString","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyString)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.getKeyString"},{"hostname":"apikeys.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.patch"},{"hostname":"apikeys.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.create"},{"hostname":"apikeys.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/keys/{keysId}:undelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.apikeys","resource_name":"apikeys.projects.locations.keys.undelete"},{"hostname":"apim.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.delete"},{"hostname":"apim.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationSources/{observationSourcesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.observationSources.delete"},{"hostname":"apim.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.operations.delete"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apim","resource_name":"apim.projects.locations.list"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.get"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.list"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.get"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}/apiObservations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiObservations)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.apiObservations.list"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}/apiObservations/{apiObservationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiObservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.apiObservations.get"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}/apiObservations/{apiObservationsId}/apiOperations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiObservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiOperations)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.apiObservations.apiOperations.list"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}/apiObservations/{apiObservationsId}/apiOperations/{apiOperationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiObservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.apiObservations.apiOperations.get"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationSources","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationSources)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationSources.list"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationSources/{observationSourcesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.observationSources.get"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apim","resource_name":"apim.projects.locations.operations.list"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apim","resource_name":"apim.projects.locations.operations.get"},{"hostname":"apim.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}:listApiObservationTags","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listApiObservationTags)$","service_name":"google.apim","resource_name":"apim.projects.locations.listApiObservationTags"},{"hostname":"apim.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.create"},{"hostname":"apim.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}/apiObservations:batchEditTags","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apiObservations:batchEditTags)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.apiObservations.batchEditTags"},{"hostname":"apim.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}:disable","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.disable"},{"hostname":"apim.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationJobs/{observationJobsId}:enable","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationJobs.enable"},{"hostname":"apim.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/observationSources","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/observationSources)$","service_name":"google.apim","resource_name":"apim.projects.locations.observationSources.create"},{"hostname":"apim.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apim","resource_name":"apim.projects.locations.operations.cancel"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.delete"},{"hostname":"appengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.delete"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/authorizedDomains","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/domainMappings","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/apps/{appsId}:listRuntimes","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRuntimes)$","service_name":"google.appengine","resource_name":"appengine.apps.listRuntimes"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/authorizedDomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/authorizedDomains","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/domainMappings","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/locations","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/operations","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/authorizedDomains","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/authorizedDomains","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/domainMappings","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/locations","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/operations","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/apps/{appsId}:listRuntimes","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRuntimes)$","service_name":"google.appengine","resource_name":"appengine.apps.listRuntimes"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/authorizedDomains","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedDomains)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.applications.authorizedDomains.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.projects.locations.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/locations","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/operations","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta4/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/locations","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.appengine","resource_name":"appengine.apps.locations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/locations/{locationsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.locations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/operations","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.appengine","resource_name":"appengine.apps.operations.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.operations.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.appengine","resource_name":"appengine.apps.services.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.get"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.list"},{"hostname":"appengine.googleapis.com","http_method":"GET","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.get"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/authorizedCertificates/{authorizedCertificatesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/domainMappings/{domainMappingsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules/{ingressRulesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta4/apps/{appsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta5/apps/{appsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.patch"},{"hostname":"appengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.patch"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps","path_regex":"^(?:/v1/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/domainMappings","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/firewall/ingressRules:batchUpdate","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules:batchUpdate)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.batchUpdate"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}:repair","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.apps.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1/apps/{appsId}:repair","path_regex":"^(?:/v1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.apps.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{appsId}/domainMappings","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps","path_regex":"^(?:/v1beta/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/authorizedCertificates","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedCertificates)$","service_name":"google.appengine","resource_name":"appengine.apps.authorizedCertificates.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/domainMappings","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainMappings)$","service_name":"google.appengine","resource_name":"appengine.apps.domainMappings.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/firewall/ingressRules:batchUpdate","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewall/ingressRules:batchUpdate)$","service_name":"google.appengine","resource_name":"appengine.apps.firewall.ingressRules.batchUpdate"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta/apps/{appsId}:repair","path_regex":"^(?:/v1beta/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.appengine","resource_name":"appengine.apps.repair"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta4/apps","path_regex":"^(?:/v1beta4/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta4/apps/{appsId}/modules/{modulesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1beta4/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.modules.versions.instances.debug"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta5/apps","path_regex":"^(?:/v1beta5/apps)$","service_name":"google.appengine","resource_name":"appengine.apps.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.create"},{"hostname":"appengine.googleapis.com","http_method":"POST","path_template":"/v1beta5/apps/{appsId}/services/{servicesId}/versions/{versionsId}/instances/{instancesId}:debug","path_regex":"^(?:/v1beta5/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::debug)$","service_name":"google.appengine","resource_name":"appengine.apps.services.versions.instances.debug"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments/{serviceProjectAttachmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.delete"},{"hostname":"apphub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments/{serviceProjectAttachmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.delete"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.getIamPolicy"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveredServices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveredServices/{discoveredServicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveredServices:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices:lookup)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.lookup"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads/{discoveredWorkloadsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads:lookup)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.lookup"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments/{serviceProjectAttachmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:lookupServiceProjectAttachment","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupServiceProjectAttachment)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.lookupServiceProjectAttachment"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.getIamPolicy"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredServices","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredServices/{discoveredServicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredServices:findUnregistered","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices:findUnregistered)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.findUnregistered"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredServices:lookup","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredServices:lookup)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredServices.lookup"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads/{discoveredWorkloadsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads:findUnregistered","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads:findUnregistered)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.findUnregistered"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/discoveredWorkloads:lookup","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveredWorkloads:lookup)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.discoveredWorkloads.lookup"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.list"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments/{serviceProjectAttachmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.get"},{"hostname":"apphub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}:lookupServiceProjectAttachment","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupServiceProjectAttachment)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.lookupServiceProjectAttachment"},{"hostname":"apphub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.patch"},{"hostname":"apphub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.patch"},{"hostname":"apphub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.patch"},{"hostname":"apphub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.patch"},{"hostname":"apphub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.patch"},{"hostname":"apphub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.patch"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.setIamPolicy"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.testIamPermissions"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.cancel"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:detachServiceProjectAttachment","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachServiceProjectAttachment)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.detachServiceProjectAttachment"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/services","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.services.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}/workloads","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.workloads.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.setIamPolicy"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.applications.testIamPermissions"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.operations.cancel"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/serviceProjectAttachments","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceProjectAttachments)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.serviceProjectAttachments.create"},{"hostname":"apphub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}:detachServiceProjectAttachment","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachServiceProjectAttachment)$","service_name":"google.apphub","resource_name":"apphub.projects.locations.detachServiceProjectAttachment"},{"hostname":"area120tables.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/tables/{tablesId}/rows/{rowsId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.delete"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables","path_regex":"^(?:/v1alpha1/tables)$","service_name":"google.area120tables","resource_name":"area120tables.tables.list"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables/{tablesId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.get"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables/{tablesId}/rows","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.list"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/tables/{tablesId}/rows/{rowsId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.get"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/workspaces","path_regex":"^(?:/v1alpha1/workspaces)$","service_name":"google.area120tables","resource_name":"area120tables.workspaces.list"},{"hostname":"area120tables.googleapis.com","http_method":"GET","path_template":"/v1alpha1/workspaces/{workspacesId}","path_regex":"^(?:/v1alpha1/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.workspaces.get"},{"hostname":"area120tables.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/tables/{tablesId}/rows/{rowsId}","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.patch"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.create"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows:batchCreate","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows:batchCreate)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.batchCreate"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows:batchDelete","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows:batchDelete)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.batchDelete"},{"hostname":"area120tables.googleapis.com","http_method":"POST","path_template":"/v1alpha1/tables/{tablesId}/rows:batchUpdate","path_regex":"^(?:/v1alpha1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rows:batchUpdate)$","service_name":"google.area120tables","resource_name":"area120tables.tables.rows.batchUpdate"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.delete"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.operations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/dockerImages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dockerImages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.dockerImages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/dockerImages/{dockerImagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dockerImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.dockerImages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.download"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/mavenArtifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mavenArtifacts)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.mavenArtifacts.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/mavenArtifacts/{mavenArtifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mavenArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.mavenArtifacts.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/npmPackages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/npmPackages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.npmPackages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/npmPackages/{npmPackagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/npmPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.npmPackages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/pythonPackages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pythonPackages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.pythonPackages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/pythonPackages/{pythonPackagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pythonPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.pythonPackages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.getIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vpcscConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpcscConfig)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.getVpcscConfig"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.getProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.operations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.getIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.operations.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/files/{filesId}:download","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.files.download"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.list"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions/{versionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.get"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.getIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.getProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vpcscConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpcscConfig)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.updateVpcscConfig"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.updateProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags/{tagsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.patch"},{"hostname":"artifactregistry.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/projectSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectSettings)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.updateProjectSettings"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/genericArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/genericArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.genericArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/goModules:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goModules:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.goModules.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/googetArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googetArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.googetArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/googetArtifacts:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googetArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.googetArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/kfpArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/kfpArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.kfpArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/versions:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:batchDelete)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.versions.batchDelete"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:create","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.setIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.testIamPermissions"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.setIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.testIamPermissions"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:create","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/aptArtifacts:import","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aptArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.aptArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/packages/{packagesId}/tags","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.packages.tags.create"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:create","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:create)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.upload"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/yumArtifacts:import","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/yumArtifacts:import)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.yumArtifacts.import"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.setIamPolicy"},{"hostname":"artifactregistry.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.artifactregistry","resource_name":"artifactregistry.projects.locations.repositories.testIamPermissions"},{"hostname":"assuredworkloads.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.delete"},{"hostname":"assuredworkloads.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.delete"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:analyzeWorkloadMove","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeWorkloadMove)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.analyzeWorkloadMove"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.operations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.list"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.get"},{"hostname":"assuredworkloads.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:analyzeWorkloadMove","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeWorkloadMove)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.analyzeWorkloadMove"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.patch"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:mutatePartnerPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::mutatePartnerPermissions)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.mutatePartnerPermissions"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.patch"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.create"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}:acknowledge","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.acknowledge"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:enableResourceMonitoring","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableResourceMonitoring)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.enableResourceMonitoring"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:restrictAllowedResources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restrictAllowedResources)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.restrictAllowedResources"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.create"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}/violations/{violationsId}:acknowledge","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.violations.acknowledge"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:enableResourceMonitoring","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableResourceMonitoring)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.enableResourceMonitoring"},{"hostname":"assuredworkloads.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:restrictAllowedResources","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restrictAllowedResources)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.restrictAllowedResources"},{"hostname":"assuredworkloads.googleapis.com","http_method":"PUT","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/workloads/{workloadsId}:enableComplianceUpdates","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableComplianceUpdates)$","service_name":"google.assuredworkloads","resource_name":"assuredworkloads.organizations.locations.workloads.enableComplianceUpdates"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"DELETE","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.delete"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}/users/{usersId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.delete"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/auctionPackages","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.bidders.auctionPackages.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/finalizedDeals","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.bidders.finalizedDeals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/auctionPackages","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/finalizedDeals","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals/{dealsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/publisherProfiles","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.publisherProfiles.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/publisherProfiles/{publisherProfilesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.publisherProfiles.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/bidders/{biddersId}/auctionPackages","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.bidders.auctionPackages.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/bidders/{biddersId}/finalizedDeals","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.bidders.finalizedDeals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/auctionPackages","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/auctionPackages/{auctionPackagesId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/clients","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}/users","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}/users/{usersId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/dataSegments","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSegments)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.dataSegments.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/dataSegments/{dataSegmentsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSegments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.dataSegments.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/finalizedDeals","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/proposals","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}/deals","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}/deals/{dealsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/publisherProfiles","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.publisherProfiles.list"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"GET","path_template":"/v1alpha/buyers/{buyersId}/publisherProfiles/{publisherProfilesId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.publisherProfiles.get"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals/{dealsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/buyers/{buyersId}/dataSegments/{dataSegmentsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSegments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.dataSegments.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}/deals/{dealsId}","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.patch"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:subscribe","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.subscribe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:subscribeClients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribeClients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.subscribeClients"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:unsubscribe","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.unsubscribe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:unsubscribeClients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribeClients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.unsubscribeClients"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}:activate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}/users/{usersId}:deactivate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}:activate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/clients/{clientsId}:deactivate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:addCreative","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addCreative)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.addCreative"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:pause","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.pause"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:resume","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.resume"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:setReadyToServe","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setReadyToServe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.setReadyToServe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}/deals:batchUpdate","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals:batchUpdate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.batchUpdate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}:accept","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.accept"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}:addNote","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addNote)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.addNote"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals/{proposalsId}:cancelNegotiation","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelNegotiation)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.cancelNegotiation"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/proposals:sendRfp","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals:sendRfp)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.sendRfp"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:subscribe","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.subscribe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:subscribeClients","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::subscribeClients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.subscribeClients"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:unsubscribe","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.unsubscribe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/auctionPackages/{auctionPackagesId}:unsubscribeClients","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/auctionPackages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unsubscribeClients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.auctionPackages.unsubscribeClients"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/clients","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}/users","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}/users/{usersId}:activate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}/users/{usersId}:deactivate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.users.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}:activate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/clients/{clientsId}:deactivate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.clients.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/dataSegments","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSegments)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.dataSegments.create"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/dataSegments/{dataSegmentsId}:activate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSegments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.dataSegments.activate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/dataSegments/{dataSegmentsId}:deactivate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSegments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.dataSegments.deactivate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:addCreative","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addCreative)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.addCreative"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:pause","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.pause"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:resume","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.resume"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/finalizedDeals/{finalizedDealsId}:setReadyToServe","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/finalizedDeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setReadyToServe)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.finalizedDeals.setReadyToServe"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}/deals:batchUpdate","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals:batchUpdate)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.deals.batchUpdate"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}:accept","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.accept"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}:addNote","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addNote)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.addNote"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/proposals/{proposalsId}:cancelNegotiation","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelNegotiation)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.cancelNegotiation"},{"hostname":"authorizedbuyersmarketplace.googleapis.com","http_method":"POST","path_template":"/v1alpha/buyers/{buyersId}/proposals:sendRfp","path_regex":"^(?:/v1alpha/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proposals:sendRfp)$","service_name":"google.authorizedbuyersmarketplace","resource_name":"authorizedbuyersmarketplace.buyers.proposals.sendRfp"},{"hostname":"backupdr.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlanAssociations/{backupPlanAssociationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlanAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlanAssociations.delete"},{"hostname":"backupdr.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlans.delete"},{"hostname":"backupdr.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.delete"},{"hostname":"backupdr.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.backups.delete"},{"hostname":"backupdr.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers/{managementServersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.delete"},{"hostname":"backupdr.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.operations.delete"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlanAssociations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlanAssociations)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlanAssociations.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlanAssociations/{backupPlanAssociationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlanAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlanAssociations.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlans.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlans.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.backups.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.backups.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults:fetchUsable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults:fetchUsable)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.fetchUsable"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers/{managementServersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.get"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers/{managementServersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.getIamPolicy"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.operations.list"},{"hostname":"backupdr.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.operations.get"},{"hostname":"backupdr.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.patch"},{"hostname":"backupdr.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.patch"},{"hostname":"backupdr.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.backups.patch"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlanAssociations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlanAssociations)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlanAssociations.create"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlanAssociations/{backupPlanAssociationsId}:triggerBackup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlanAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::triggerBackup)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlanAssociations.triggerBackup"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupPlans.create"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.create"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}/backups/{backupsId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.backups.restore"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}:abandonBackup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::abandonBackup)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.abandonBackup"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}:fetchAccessToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchAccessToken)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.fetchAccessToken"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}:finalizeBackup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finalizeBackup)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.finalizeBackup"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}:initiateBackup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initiateBackup)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.initiateBackup"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}:remove","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.remove"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}/dataSources/{dataSourcesId}:setInternalStatus","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInternalStatus)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.dataSources.setInternalStatus"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupVaults/{backupVaultsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupVaults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.backupVaults.testIamPermissions"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.create"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers/{managementServersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.setIamPolicy"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/managementServers/{managementServersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.managementServers.testIamPermissions"},{"hostname":"backupdr.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.backupdr","resource_name":"backupdr.projects.locations.operations.cancel"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/sshKeys/{sshKeysId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.sshKeys.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.delete"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/provisioningQuotas","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningQuotas)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.provisioningQuotas.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:loadAuthInfo","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::loadAuthInfo)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.loadAuthInfo"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks/{networksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks:listNetworkUsage","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks:listNetworkUsage)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.listNetworkUsage"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.operations.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/osImages","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osImages)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.osImages.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/osImages/{osImagesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.osImages.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs/{provisioningConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningQuotas","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningQuotas)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningQuotas.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/sshKeys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshKeys)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.sshKeys.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/luns","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/luns)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.luns.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/luns/{lunsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/luns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.luns.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.list"},{"hostname":"baremetalsolution.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.get"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks/{networksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs/{provisioningConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.patch"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.operations.cancel"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}:submitProvisioningConfig","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::submitProvisioningConfig)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.submitProvisioningConfig"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:detachLun","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachLun)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.detachLun"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:disableHyperthreading","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableHyperthreading)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.disableHyperthreading"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:disableInteractiveSerialConsole","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableInteractiveSerialConsole)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.disableInteractiveSerialConsole"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:enableHyperthreading","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableHyperthreading)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.enableHyperthreading"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:enableInteractiveSerialConsole","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableInteractiveSerialConsole)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.enableInteractiveSerialConsole"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reimage","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reimage)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.reimage"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reset","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.reset"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:start","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.start"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:stop","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.instances.stop"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/networks/{networksId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.networks.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nfsShares/{nfsSharesId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nfsShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.nfsShares.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/provisioningConfigs:submit","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/provisioningConfigs:submit)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.provisioningConfigs.submit"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/sshKeys","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshKeys)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.sshKeys.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/luns/{lunsId}:evict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/luns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evict)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.luns.evict"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.create"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}/snapshots/{snapshotsId}:restoreVolumeSnapshot","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restoreVolumeSnapshot)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.snapshots.restoreVolumeSnapshot"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}:evict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evict)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.evict"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}:rename","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.rename"},{"hostname":"baremetalsolution.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/volumes/{volumesId}:resize","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resize)$","service_name":"google.baremetalsolution","resource_name":"baremetalsolution.projects.locations.volumes.resize"},{"hostname":"batch.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.delete"},{"hostname":"batch.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.delete"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.batch","resource_name":"batch.projects.locations.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.get"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.get"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/taskGroups/{taskGroupsId}/tasks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taskGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.taskGroups.tasks.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/taskGroups/{taskGroupsId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taskGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.taskGroups.tasks.get"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.list"},{"hostname":"batch.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.get"},{"hostname":"batch.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.batch","resource_name":"batch.projects.locations.jobs.create"},{"hostname":"batch.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.batch","resource_name":"batch.projects.locations.operations.cancel"},{"hostname":"batch.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/state:report","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/state:report)$","service_name":"google.batch","resource_name":"batch.projects.locations.state.report"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways/{securityGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.delete"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections:resolve)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.resolve"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:resolveInstanceConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolveInstanceConfig)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.resolveInstanceConfig"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:shouldThrottle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::shouldThrottle)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.shouldThrottle"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}:getIamPolicy","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}:getIamPolicy","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}:getIamPolicy","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/insights","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.insights.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/insights/{insightsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.insights.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/insights/{insightsId}:configuredInsight","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configuredInsight)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.insights.configuredInsight"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:cancel","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.cancel"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:restart","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.restart"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections:resolve)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.resolve"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:resolveInstanceConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolveInstanceConfig)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.resolveInstanceConfig"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:shouldThrottle","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::shouldThrottle)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.shouldThrottle"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applicationDomains/{applicationDomainsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applicationDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applicationDomains.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applications.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections:resolve)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.resolve"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:resolveInstanceConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolveInstanceConfig)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.resolveInstanceConfig"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/insights","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.insights.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/insights/{insightsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.insights.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/insights/{insightsId}:configuredInsight","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configuredInsight)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.insights.configuredInsight"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/netConnections/{netConnectionsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/netConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.netConnections.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.list"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways/{securityGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.get"},{"hostname":"beyondcorp.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways/{securityGatewaysId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.getIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways/{securityGatewaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.patch"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.cancel"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:reportStatus","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.reportStatus"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.cancel"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}:setIamPolicy","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/browserDlpRules/{browserDlpRulesId}:testIamPermissions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browserDlpRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.browserDlpRules.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}:setIamPolicy","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}/proxyConfigs/{proxyConfigsId}:testIamPermissions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/proxyConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.proxyConfigs.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}:setIamPolicy","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/global/partnerTenants/{partnerTenantsId}:testIamPermissions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/partnerTenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.global.partnerTenants.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.operations.cancel"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.organizations.locations.subscriptions.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnections/{appConnectionsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:reportStatus","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.reportStatus"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appConnectors/{appConnectorsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appConnectors.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appGateways/{appGatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.appGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applicationDomains/{applicationDomainsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applicationDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applicationDomains.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applicationDomains/{applicationDomainsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applicationDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applicationDomains.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applications.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/applications/{applicationsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.applications.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientConnectorServices/{clientConnectorServicesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientConnectorServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientConnectorServices.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/clientGateways/{clientGatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.clientGateways.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:reportStatus","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportStatus)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.reportStatus"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.connectors.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/netConnections/{netConnectionsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/netConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.netConnections.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/netConnections/{netConnectionsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/netConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.netConnections.testIamPermissions"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.operations.cancel"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.create"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways/{securityGatewaysId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.setIamPolicy"},{"hostname":"beyondcorp.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/securityGateways/{securityGatewaysId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.beyondcorp","resource_name":"beyondcorp.projects.locations.securityGateways.testIamPermissions"},{"hostname":"biglake.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.delete"},{"hostname":"biglake.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.delete"},{"hostname":"biglake.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}/tables/{tablesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.tables.delete"},{"hostname":"biglake.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.list"},{"hostname":"biglake.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.get"},{"hostname":"biglake.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.list"},{"hostname":"biglake.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.get"},{"hostname":"biglake.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}/tables","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.tables.list"},{"hostname":"biglake.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}/tables/{tablesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.tables.get"},{"hostname":"biglake.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.patch"},{"hostname":"biglake.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}/tables/{tablesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.tables.patch"},{"hostname":"biglake.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.create"},{"hostname":"biglake.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.create"},{"hostname":"biglake.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}/tables","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.tables.create"},{"hostname":"biglake.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/databases/{databasesId}/tables/{tablesId}:rename","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.biglake","resource_name":"biglake.projects.locations.catalogs.databases.tables.rename"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models/{modelsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.models.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.routines.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.delete"},{"hostname":"bigquery.googleapis.com","http_method":"DELETE","path_template":"/bigquery/v2/projects/{projectsId}/jobs/{jobsId}/delete","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/delete)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.delete"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects","path_regex":"^(?:/bigquery/v2/projects)$","service_name":"google.bigquery","resource_name":"bigquery.projects.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.bigquery","resource_name":"bigquery.datasets.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.bigquery","resource_name":"bigquery.models.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models/{modelsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.models.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines)$","service_name":"google.bigquery","resource_name":"bigquery.routines.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.routines.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigquery","resource_name":"bigquery.tables.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/data","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data)$","service_name":"google.bigquery","resource_name":"bigquery.tabledata.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/jobs","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.list"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.jobs.get"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/queries/{queriesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.jobs.getQueryResults"},{"hostname":"bigquery.googleapis.com","http_method":"GET","path_template":"/bigquery/v2/projects/{projectsId}/serviceAccount","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.bigquery","resource_name":"bigquery.projects.getServiceAccount"},{"hostname":"bigquery.googleapis.com","http_method":"PATCH","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.patch"},{"hostname":"bigquery.googleapis.com","http_method":"PATCH","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/models/{modelsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.models.patch"},{"hostname":"bigquery.googleapis.com","http_method":"PATCH","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.patch"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.bigquery","resource_name":"bigquery.datasets.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines)$","service_name":"google.bigquery","resource_name":"bigquery.routines.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}:getIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.routines.getIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}:setIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.routines.setIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigquery","resource_name":"bigquery.tables.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/insertAll","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertAll)$","service_name":"google.bigquery","resource_name":"bigquery.tabledata.insertAll"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies/{rowAccessPoliciesId}:getIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.getIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}/rowAccessPolicies/{rowAccessPoliciesId}:testIamPermissions","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rowAccessPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigquery","resource_name":"bigquery.rowAccessPolicies.testIamPermissions"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.tables.getIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigquery","resource_name":"bigquery.tables.setIamPolicy"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigquery","resource_name":"bigquery.tables.testIamPermissions"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}:undelete","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.bigquery","resource_name":"bigquery.datasets.undelete"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/jobs","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.insert"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/jobs/{jobsId}/cancel","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.cancel"},{"hostname":"bigquery.googleapis.com","http_method":"POST","path_template":"/bigquery/v2/projects/{projectsId}/queries","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queries)$","service_name":"google.bigquery","resource_name":"bigquery.jobs.query"},{"hostname":"bigquery.googleapis.com","http_method":"PUT","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.datasets.update"},{"hostname":"bigquery.googleapis.com","http_method":"PUT","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/routines/{routinesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.routines.update"},{"hostname":"bigquery.googleapis.com","http_method":"PUT","path_template":"/bigquery/v2/projects/{projectsId}/datasets/{datasetsId}/tables/{tablesId}","path_regex":"^(?:/bigquery/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquery","resource_name":"bigquery.tables.update"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.delete"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.delete"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.list"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.get"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.list"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.get"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.patch"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.patch"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/credential","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credential)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.updateCredential"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.create"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.getIamPolicy"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.setIamPolicy"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.testIamPermissions"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.create"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.getIamPolicy"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.setIamPolicy"},{"hostname":"bigqueryconnection.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigqueryconnection","resource_name":"bigqueryconnection.projects.locations.connections.testIamPermissions"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.delete"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies)$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.list"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.get"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.patch"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies)$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.create"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.getIamPolicy"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}:rename","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.rename"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.setIamPolicy"},{"hostname":"bigquerydatapolicy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataPolicies/{dataPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigquerydatapolicy","resource_name":"bigquerydatapolicy.projects.locations.dataPolicies.testIamPermissions"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.delete"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.dataSources.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.dataSources.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.dataSources.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.dataSources.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}/runs/{runsId}/transferLogs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferLogs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.runs.transferLogs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.get"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}/runs/{runsId}/transferLogs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferLogs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.runs.transferLogs.list"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.patch"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.patch"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/dataSources/{dataSourcesId}:checkValidCreds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkValidCreds)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.dataSources.checkValidCreds"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataSources/{dataSourcesId}:checkValidCreds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkValidCreds)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.dataSources.checkValidCreds"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.create"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}:scheduleRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::scheduleRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.scheduleRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/transferConfigs/{transferConfigsId}:startManualRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startManualRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.transferConfigs.startManualRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:enrollDataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enrollDataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.enrollDataSources"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:unenrollDataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenrollDataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.locations.unenrollDataSources"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/transferConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.create"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}:scheduleRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::scheduleRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.scheduleRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/transferConfigs/{transferConfigsId}:startManualRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transferConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startManualRuns)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.transferConfigs.startManualRuns"},{"hostname":"bigquerydatatransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:enrollDataSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enrollDataSources)$","service_name":"google.bigquerydatatransfer","resource_name":"bigquerydatatransfer.projects.enrollDataSources"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservationGrants/{reservationGrantsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservationGrants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservationGrants.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/slotPools/{slotPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slotPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.slotPools.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.delete"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.getBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchAllAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAllAssignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchAllAssignments"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAssignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchAssignments"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.operations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservationGrants","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservationGrants)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservationGrants.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/slotPools","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slotPools)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.slotPools.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/slotPools/{slotPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slotPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.slotPools.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}:SearchReservationGrants","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::SearchReservationGrants)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchReservationGrants"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.getBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.get"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.list"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}:searchAssignments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAssignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.searchAssignments"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.updateBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/{reservationsId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/biReservation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.updateBiReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.patch"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}:split","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::split)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.split"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/capacityCommitments:merge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments:merge)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.merge"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}:move","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.move"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}:failoverReservation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failoverReservation)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.failoverReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.operations.cancel"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservationGrants","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservationGrants)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservationGrants.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.createReservation"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments/{capacityCommitmentsId}:split","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::split)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.split"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/capacityCommitments:merge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capacityCommitments:merge)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.capacityCommitments.merge"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.create"},{"hostname":"bigqueryreservation.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/assignments/{assignmentsId}:move","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.bigqueryreservation","resource_name":"bigqueryreservation.projects.locations.reservations.assignments.move"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles/{appProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews/{authorizedViewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.delete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/operations/projects/{projectsId}/operations","path_regex":"^(?:/v2/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.operations.projects.operations.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/operations/{operationsId}","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.operations.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles/{appProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/hotTablets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hotTablets)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.hotTablets.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews/{authorizedViewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.get"},{"hostname":"bigtableadmin.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.locations.list"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.partialUpdateInstance"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles/{appProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.partialUpdateCluster"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews/{authorizedViewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.patch"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/appProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appProfiles)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.appProfiles.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}/backups:copy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups:copy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.backups.copy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.create"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews/{authorizedViewsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews/{authorizedViewsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}/authorizedViews/{authorizedViewsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizedViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.authorizedViews.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:checkConsistency","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkConsistency)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.checkConsistency"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:dropRowRange","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::dropRowRange)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.dropRowRange"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:generateConsistencyToken","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConsistencyToken)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.generateConsistencyToken"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:modifyColumnFamilies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyColumnFamilies)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.modifyColumnFamilies"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables/{tablesId}:undelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.undelete"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/tables:restore","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables:restore)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.tables.restore"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.getIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.setIamPolicy"},{"hostname":"bigtableadmin.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.testIamPermissions"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.update"},{"hostname":"bigtableadmin.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/instances/{instancesId}/clusters/{clustersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.bigtableadmin","resource_name":"bigtableadmin.projects.instances.clusters.update"},{"hostname":"billingbudgets.googleapis.com","http_method":"DELETE","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.delete"},{"hostname":"billingbudgets.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.delete"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.list"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.get"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.list"},{"hostname":"billingbudgets.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.get"},{"hostname":"billingbudgets.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.patch"},{"hostname":"billingbudgets.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets/{budgetsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.patch"},{"hostname":"billingbudgets.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.create"},{"hostname":"billingbudgets.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/budgets","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/budgets)$","service_name":"google.billingbudgets","resource_name":"billingbudgets.billingAccounts.budgets.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.delete"},{"hostname":"binaryauthorization.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/platforms/{platformsId}/policies/{policiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.platforms.policies.delete"},{"hostname":"binaryauthorization.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.delete"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/policy","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.systempolicy.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/attestors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.list"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.get"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/platforms/{platformsId}/policies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.platforms.policies.list"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/platforms/{platformsId}/policies/{policiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.platforms.policies.get"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/policy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/policy:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/locations/{locationsId}/policy","path_regex":"^(?:/v1beta1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.systempolicy.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/attestors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.list"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.get"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/policy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.getPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/policy:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:getIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.getIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}:validateAttestationOccurrence","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateAttestationOccurrence)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.validateAttestationOccurrence"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/platforms/gke/policies/{policiesId}:evaluate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/gke/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluate)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.platforms.gke.policies.evaluate"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/platforms/{platformsId}/policies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.platforms.policies.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/policy:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/policy:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.create"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}:validateAttestationOccurrence","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateAttestationOccurrence)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.validateAttestationOccurrence"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/policy:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:setIamPolicy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.setIamPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/policy:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy:testIamPermissions)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.policy.testIamPermissions"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.update"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/platforms/{platformsId}/policies/{policiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.platforms.policies.replacePlatformPolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/policy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.updatePolicy"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/attestors/{attestorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attestors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.attestors.update"},{"hostname":"binaryauthorization.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/policy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policy)$","service_name":"google.binaryauthorization","resource_name":"binaryauthorization.projects.updatePolicy"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/blockchainNodes/{blockchainNodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blockchainNodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.blockchainNodes.delete"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.operations.delete"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.list"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.get"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/blockchainNodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blockchainNodes)$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.blockchainNodes.list"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/blockchainNodes/{blockchainNodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blockchainNodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.blockchainNodes.get"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.operations.list"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.operations.get"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/blockchainNodes/{blockchainNodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blockchainNodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.blockchainNodes.patch"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/blockchainNodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blockchainNodes)$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.blockchainNodes.create"},{"hostname":"blockchainnodeengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.blockchainnodeengine","resource_name":"blockchainnodeengine.projects.locations.operations.cancel"},{"hostname":"blogger.googleapis.com","http_method":"DELETE","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.delete"},{"hostname":"blogger.googleapis.com","http_method":"DELETE","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.delete"},{"hostname":"blogger.googleapis.com","http_method":"DELETE","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.delete"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogs.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/pages","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts/{postId}/comments","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/v2/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/users/{userId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.users.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v2/users/{userId}/blogs","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs)$","service_name":"google.blogger","resource_name":"blogger.blogs.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/byurl","path_regex":"^(?:/v3/blogs/byurl)$","service_name":"google.blogger","resource_name":"blogger.blogs.getByUrl"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogs.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/comments","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.listByBlog"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/pages","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/pageviews","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pageviews)$","service_name":"google.blogger","resource_name":"blogger.pageViews.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/bypath","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/bypath)$","service_name":"google.blogger","resource_name":"blogger.posts.getByPath"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/search","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/search)$","service_name":"google.blogger","resource_name":"blogger.posts.search"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.users.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs)$","service_name":"google.blogger","resource_name":"blogger.blogs.listByUser"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs/{blogId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogUserInfos.get"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs/{blogId}/posts","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.list"},{"hostname":"blogger.googleapis.com","http_method":"GET","path_template":"/v3/users/{userId}/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.get"},{"hostname":"blogger.googleapis.com","http_method":"PATCH","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.patch"},{"hostname":"blogger.googleapis.com","http_method":"PATCH","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.patch"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/pages","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.insert"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/pages/{pageId}/publish","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.blogger","resource_name":"blogger.pages.publish"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/pages/{pageId}/revert","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revert)$","service_name":"google.blogger","resource_name":"blogger.pages.revert"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.insert"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/approve","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approve)$","service_name":"google.blogger","resource_name":"blogger.comments.approve"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/removecontent","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removecontent)$","service_name":"google.blogger","resource_name":"blogger.comments.removeContent"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/spam","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spam)$","service_name":"google.blogger","resource_name":"blogger.comments.markAsSpam"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/publish","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.blogger","resource_name":"blogger.posts.publish"},{"hostname":"blogger.googleapis.com","http_method":"POST","path_template":"/v3/blogs/{blogId}/posts/{postId}/revert","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revert)$","service_name":"google.blogger","resource_name":"blogger.posts.revert"},{"hostname":"blogger.googleapis.com","http_method":"PUT","path_template":"/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.update"},{"hostname":"blogger.googleapis.com","http_method":"PUT","path_template":"/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.update"},{"hostname":"books.googleapis.com","http_method":"DELETE","path_template":"/books/v1/mylibrary/annotations/{annotationId}","path_regex":"^(?:/books/v1/mylibrary/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.annotations.delete"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/dictionary/listOfflineMetadata","path_regex":"^(?:/books/v1/dictionary/listOfflineMetadata)$","service_name":"google.books","resource_name":"books.dictionary.listOfflineMetadata"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/familysharing/getFamilyInfo","path_regex":"^(?:/books/v1/familysharing/getFamilyInfo)$","service_name":"google.books","resource_name":"books.familysharing.getFamilyInfo"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/myconfig/getUserSettings","path_regex":"^(?:/books/v1/myconfig/getUserSettings)$","service_name":"google.books","resource_name":"books.myconfig.getUserSettings"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/annotations","path_regex":"^(?:/books/v1/mylibrary/annotations)$","service_name":"google.books","resource_name":"books.mylibrary.annotations.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/bookshelves","path_regex":"^(?:/books/v1/mylibrary/bookshelves)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/bookshelves/{shelf}","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/volumes","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.volumes.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/mylibrary/readingpositions/{volumeId}","path_regex":"^(?:/books/v1/mylibrary/readingpositions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.readingpositions.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/notification/get","path_regex":"^(?:/books/v1/notification/get)$","service_name":"google.books","resource_name":"books.notification.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/onboarding/listCategories","path_regex":"^(?:/books/v1/onboarding/listCategories)$","service_name":"google.books","resource_name":"books.onboarding.listCategories"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/onboarding/listCategoryVolumes","path_regex":"^(?:/books/v1/onboarding/listCategoryVolumes)$","service_name":"google.books","resource_name":"books.onboarding.listCategoryVolumes"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/personalizedstream/get","path_regex":"^(?:/books/v1/personalizedstream/get)$","service_name":"google.books","resource_name":"books.personalizedstream.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/promooffer/get","path_regex":"^(?:/books/v1/promooffer/get)$","service_name":"google.books","resource_name":"books.promooffer.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/series/get","path_regex":"^(?:/books/v1/series/get)$","service_name":"google.books","resource_name":"books.series.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/series/membership/get","path_regex":"^(?:/books/v1/series/membership/get)$","service_name":"google.books","resource_name":"books.series.membership.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/users/{userId}/bookshelves","path_regex":"^(?:/books/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bookshelves)$","service_name":"google.books","resource_name":"books.bookshelves.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/users/{userId}/bookshelves/{shelf}","path_regex":"^(?:/books/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.bookshelves.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/users/{userId}/bookshelves/{shelf}/volumes","path_regex":"^(?:/books/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumes)$","service_name":"google.books","resource_name":"books.bookshelves.volumes.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes","path_regex":"^(?:/books/v1/volumes)$","service_name":"google.books","resource_name":"books.volumes.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/mybooks","path_regex":"^(?:/books/v1/volumes/mybooks)$","service_name":"google.books","resource_name":"books.volumes.mybooks.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/recommended","path_regex":"^(?:/books/v1/volumes/recommended)$","service_name":"google.books","resource_name":"books.volumes.recommended.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/useruploaded","path_regex":"^(?:/books/v1/volumes/useruploaded)$","service_name":"google.books","resource_name":"books.volumes.useruploaded.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.volumes.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/associated","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associated)$","service_name":"google.books","resource_name":"books.volumes.associated.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.volumeAnnotations.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}/annotations/{annotationId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.volumeAnnotations.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}/data","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data)$","service_name":"google.books","resource_name":"books.layers.annotationData.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layers/{layerId}/data/{annotationDataId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/data/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.annotationData.get"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layersummary","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layersummary)$","service_name":"google.books","resource_name":"books.layers.list"},{"hostname":"books.googleapis.com","http_method":"GET","path_template":"/books/v1/volumes/{volumeId}/layersummary/{summaryId}","path_regex":"^(?:/books/v1/volumes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/layersummary/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.layers.get"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/cloudloading/addBook","path_regex":"^(?:/books/v1/cloudloading/addBook)$","service_name":"google.books","resource_name":"books.cloudloading.addBook"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/cloudloading/deleteBook","path_regex":"^(?:/books/v1/cloudloading/deleteBook)$","service_name":"google.books","resource_name":"books.cloudloading.deleteBook"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/cloudloading/updateBook","path_regex":"^(?:/books/v1/cloudloading/updateBook)$","service_name":"google.books","resource_name":"books.cloudloading.updateBook"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/familysharing/share","path_regex":"^(?:/books/v1/familysharing/share)$","service_name":"google.books","resource_name":"books.familysharing.share"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/familysharing/unshare","path_regex":"^(?:/books/v1/familysharing/unshare)$","service_name":"google.books","resource_name":"books.familysharing.unshare"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/releaseDownloadAccess","path_regex":"^(?:/books/v1/myconfig/releaseDownloadAccess)$","service_name":"google.books","resource_name":"books.myconfig.releaseDownloadAccess"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/requestAccess","path_regex":"^(?:/books/v1/myconfig/requestAccess)$","service_name":"google.books","resource_name":"books.myconfig.requestAccess"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/syncVolumeLicenses","path_regex":"^(?:/books/v1/myconfig/syncVolumeLicenses)$","service_name":"google.books","resource_name":"books.myconfig.syncVolumeLicenses"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/myconfig/updateUserSettings","path_regex":"^(?:/books/v1/myconfig/updateUserSettings)$","service_name":"google.books","resource_name":"books.myconfig.updateUserSettings"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/annotations","path_regex":"^(?:/books/v1/mylibrary/annotations)$","service_name":"google.books","resource_name":"books.mylibrary.annotations.insert"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/annotations/summary","path_regex":"^(?:/books/v1/mylibrary/annotations/summary)$","service_name":"google.books","resource_name":"books.mylibrary.annotations.summary"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/addVolume","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addVolume)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.addVolume"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/clearVolumes","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clearVolumes)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.clearVolumes"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/moveVolume","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveVolume)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.moveVolume"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/bookshelves/{shelf}/removeVolume","path_regex":"^(?:/books/v1/mylibrary/bookshelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeVolume)$","service_name":"google.books","resource_name":"books.mylibrary.bookshelves.removeVolume"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/mylibrary/readingpositions/{volumeId}/setPosition","path_regex":"^(?:/books/v1/mylibrary/readingpositions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPosition)$","service_name":"google.books","resource_name":"books.mylibrary.readingpositions.setPosition"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/promooffer/accept","path_regex":"^(?:/books/v1/promooffer/accept)$","service_name":"google.books","resource_name":"books.promooffer.accept"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/promooffer/dismiss","path_regex":"^(?:/books/v1/promooffer/dismiss)$","service_name":"google.books","resource_name":"books.promooffer.dismiss"},{"hostname":"books.googleapis.com","http_method":"POST","path_template":"/books/v1/volumes/recommended/rate","path_regex":"^(?:/books/v1/volumes/recommended/rate)$","service_name":"google.books","resource_name":"books.volumes.recommended.rate"},{"hostname":"books.googleapis.com","http_method":"PUT","path_template":"/books/v1/mylibrary/annotations/{annotationId}","path_regex":"^(?:/books/v1/mylibrary/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.books","resource_name":"books.mylibrary.annotations.update"},{"hostname":"businessprofileperformance.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/searchkeywords/impressions/monthly","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchkeywords/impressions/monthly)$","service_name":"google.businessprofileperformance","resource_name":"businessprofileperformance.locations.searchkeywords.impressions.monthly.list"},{"hostname":"businessprofileperformance.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}:fetchMultiDailyMetricsTimeSeries","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchMultiDailyMetricsTimeSeries)$","service_name":"google.businessprofileperformance","resource_name":"businessprofileperformance.locations.fetchMultiDailyMetricsTimeSeries"},{"hostname":"businessprofileperformance.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}:getDailyMetricsTimeSeries","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDailyMetricsTimeSeries)$","service_name":"google.businessprofileperformance","resource_name":"businessprofileperformance.locations.getDailyMetricsTimeSeries"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs/{certificateIssuanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries/{certificateMapEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations/{dnsAuthorizationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs/{trustConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.delete"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs/{certificateIssuanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries/{certificateMapEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations/{dnsAuthorizationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.list"},{"hostname":"certificatemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs/{trustConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.get"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs/{certificateIssuanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries/{certificateMapEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations/{dnsAuthorizationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs/{trustConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.patch"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateIssuanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateIssuanceConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateIssuanceConfigs.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateMaps/{certificateMapsId}/certificateMapEntries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateMapEntries)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificateMaps.certificateMapEntries.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.certificates.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsAuthorizations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsAuthorizations)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.dnsAuthorizations.create"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.operations.cancel"},{"hostname":"certificatemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/trustConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trustConfigs)$","service_name":"google.certificatemanager","resource_name":"certificatemanager.projects.locations.trustConfigs.create"},{"hostname":"chat.googleapis.com","http_method":"DELETE","path_template":"/v1/spaces/{spacesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.delete"},{"hostname":"chat.googleapis.com","http_method":"DELETE","path_template":"/v1/spaces/{spacesId}/members/{membersId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.members.delete"},{"hostname":"chat.googleapis.com","http_method":"DELETE","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.delete"},{"hostname":"chat.googleapis.com","http_method":"DELETE","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}/reactions/{reactionsId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reactions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.reactions.delete"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.media.download"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces","path_regex":"^(?:/v1/spaces)$","service_name":"google.chat","resource_name":"chat.spaces.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/members","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.chat","resource_name":"chat.spaces.members.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/members/{membersId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.members.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/messages","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.chat","resource_name":"chat.spaces.messages.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.attachments.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}/reactions","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reactions)$","service_name":"google.chat","resource_name":"chat.spaces.messages.reactions.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/spaceEvents","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaceEvents)$","service_name":"google.chat","resource_name":"chat.spaces.spaceEvents.list"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces/{spacesId}/spaceEvents/{spaceEventsId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaceEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.spaceEvents.get"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/spaces:findDirectMessage","path_regex":"^(?:/v1/spaces:findDirectMessage)$","service_name":"google.chat","resource_name":"chat.spaces.findDirectMessage"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/spaces/{spacesId}/spaceReadState","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaceReadState)$","service_name":"google.chat","resource_name":"chat.users.spaces.getSpaceReadState"},{"hostname":"chat.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/spaces/{spacesId}/threads/{threadsId}/threadReadState","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threadReadState)$","service_name":"google.chat","resource_name":"chat.users.spaces.threads.getThreadReadState"},{"hostname":"chat.googleapis.com","http_method":"PATCH","path_template":"/v1/spaces/{spacesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.patch"},{"hostname":"chat.googleapis.com","http_method":"PATCH","path_template":"/v1/spaces/{spacesId}/members/{membersId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.members.patch"},{"hostname":"chat.googleapis.com","http_method":"PATCH","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.patch"},{"hostname":"chat.googleapis.com","http_method":"PATCH","path_template":"/v1/users/{usersId}/spaces/{spacesId}/spaceReadState","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spaceReadState)$","service_name":"google.chat","resource_name":"chat.users.spaces.updateSpaceReadState"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces","path_regex":"^(?:/v1/spaces)$","service_name":"google.chat","resource_name":"chat.spaces.create"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces/{spacesId}/attachments:upload","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments:upload)$","service_name":"google.chat","resource_name":"chat.media.upload"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces/{spacesId}/members","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.chat","resource_name":"chat.spaces.members.create"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces/{spacesId}/messages","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.chat","resource_name":"chat.spaces.messages.create"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}/reactions","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reactions)$","service_name":"google.chat","resource_name":"chat.spaces.messages.reactions.create"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces/{spacesId}:completeImport","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeImport)$","service_name":"google.chat","resource_name":"chat.spaces.completeImport"},{"hostname":"chat.googleapis.com","http_method":"POST","path_template":"/v1/spaces:setup","path_regex":"^(?:/v1/spaces:setup)$","service_name":"google.chat","resource_name":"chat.spaces.setup"},{"hostname":"chat.googleapis.com","http_method":"PUT","path_template":"/v1/spaces/{spacesId}/messages/{messagesId}","path_regex":"^(?:/v1/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chat","resource_name":"chat.spaces.messages.update"},{"hostname":"checks.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.checks","resource_name":"checks.accounts.apps.operations.delete"},{"hostname":"checks.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/apps","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps)$","service_name":"google.checks","resource_name":"checks.accounts.apps.list"},{"hostname":"checks.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.checks","resource_name":"checks.accounts.apps.get"},{"hostname":"checks.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/operations","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.checks","resource_name":"checks.accounts.apps.operations.list"},{"hostname":"checks.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.checks","resource_name":"checks.accounts.apps.operations.get"},{"hostname":"checks.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/reports","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.checks","resource_name":"checks.accounts.apps.reports.list"},{"hostname":"checks.googleapis.com","http_method":"GET","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/reports/{reportsId}","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.checks","resource_name":"checks.accounts.apps.reports.get"},{"hostname":"checks.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.checks","resource_name":"checks.accounts.apps.operations.cancel"},{"hostname":"checks.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.checks","resource_name":"checks.accounts.apps.operations.wait"},{"hostname":"checks.googleapis.com","http_method":"POST","path_template":"/v1alpha/accounts/{accountsId}/apps/{appsId}/reports:analyzeUpload","path_regex":"^(?:/v1alpha/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:analyzeUpload)$","service_name":"google.checks","resource_name":"checks.media.upload"},{"hostname":"chromemanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/customers/{customersId}/telemetry/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.notificationConfigs.delete"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps/android/{androidId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/android/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.android.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps/chrome/{chromeId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/chrome/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.chrome.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps/web/{webId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/web/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.web.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps:countChromeAppRequests","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps:countChromeAppRequests)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.countChromeAppRequests"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps:fetchDevicesRequestingExtension","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps:fetchDevicesRequestingExtension)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.fetchDevicesRequestingExtension"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/apps:fetchUsersRequestingExtension","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps:fetchUsersRequestingExtension)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.apps.fetchUsersRequestingExtension"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeBrowsersNeedingAttention","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeBrowsersNeedingAttention)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeBrowsersNeedingAttention"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeCrashEvents","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeCrashEvents)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeCrashEvents"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeDevicesReachingAutoExpirationDate","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeDevicesReachingAutoExpirationDate)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeDevicesReachingAutoExpirationDate"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeDevicesThatNeedAttention","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeDevicesThatNeedAttention)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeDevicesThatNeedAttention"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeHardwareFleetDevices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeHardwareFleetDevices)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeHardwareFleetDevices"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countChromeVersions","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countChromeVersions)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countChromeVersions"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countInstalledApps","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countInstalledApps)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countInstalledApps"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countPrintJobsByPrinter","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countPrintJobsByPrinter)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countPrintJobsByPrinter"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:countPrintJobsByUser","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:countPrintJobsByUser)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.countPrintJobsByUser"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:enumeratePrintJobs","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:enumeratePrintJobs)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.enumeratePrintJobs"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/reports:findInstalledAppDevices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:findInstalledAppDevices)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.reports.findInstalledAppDevices"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/devices","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/devices)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.devices.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/devices/{devicesId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.devices.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/events","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/events)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.events.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/notificationConfigs","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/notificationConfigs)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.notificationConfigs.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/users","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/users)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.users.list"},{"hostname":"chromemanagement.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/telemetry/users/{usersId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.users.get"},{"hostname":"chromemanagement.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/telemetry/notificationConfigs","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/telemetry/notificationConfigs)$","service_name":"google.chromemanagement","resource_name":"chromemanagement.customers.telemetry.notificationConfigs.create"},{"hostname":"chromepolicy.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/policySchemas","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policySchemas)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policySchemas.list"},{"hostname":"chromepolicy.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/policySchemas/{policySchemasId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policySchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policySchemas.get"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/files:uploadPolicyFile","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/files:uploadPolicyFile)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.media.upload"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:batchDelete","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:batchDelete)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.batchDelete"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:batchModify","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:batchModify)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.batchModify"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:listGroupPriorityOrdering","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:listGroupPriorityOrdering)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.listGroupPriorityOrdering"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/groups:updateGroupPriorityOrdering","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/groups:updateGroupPriorityOrdering)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.groups.updateGroupPriorityOrdering"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:defineCertificate","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:defineCertificate)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.defineCertificate"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:defineNetwork","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:defineNetwork)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.defineNetwork"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:removeCertificate","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:removeCertificate)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.removeCertificate"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/networks:removeNetwork","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/networks:removeNetwork)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.networks.removeNetwork"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/orgunits:batchInherit","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/orgunits:batchInherit)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.orgunits.batchInherit"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies/orgunits:batchModify","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/orgunits:batchModify)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.orgunits.batchModify"},{"hostname":"chromepolicy.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/policies:resolve","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies:resolve)$","service_name":"google.chromepolicy","resource_name":"chromepolicy.customers.policies.resolve"},{"hostname":"chromeuxreport.googleapis.com","http_method":"POST","path_template":"/v1/records:queryHistoryRecord","path_regex":"^(?:/v1/records:queryHistoryRecord)$","service_name":"google.chromeuxreport","resource_name":"chromeuxreport.records.queryHistoryRecord"},{"hostname":"chromeuxreport.googleapis.com","http_method":"POST","path_template":"/v1/records:queryRecord","path_regex":"^(?:/v1/records:queryRecord)$","service_name":"google.chromeuxreport","resource_name":"chromeuxreport.records.queryRecord"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/divisions","path_regex":"^(?:/civicinfo/v2/divisions)$","service_name":"google.civicinfo","resource_name":"civicinfo.divisions.search"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/elections","path_regex":"^(?:/civicinfo/v2/elections)$","service_name":"google.civicinfo","resource_name":"civicinfo.elections.electionQuery"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/representatives","path_regex":"^(?:/civicinfo/v2/representatives)$","service_name":"google.civicinfo","resource_name":"civicinfo.representatives.representativeInfoByAddress"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/representatives/{ocdId}","path_regex":"^(?:/civicinfo/v2/representatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.civicinfo","resource_name":"civicinfo.representatives.representativeInfoByDivision"},{"hostname":"civicinfo.googleapis.com","http_method":"GET","path_template":"/civicinfo/v2/voterinfo","path_regex":"^(?:/civicinfo/v2/voterinfo)$","service_name":"google.civicinfo","resource_name":"civicinfo.elections.voterInfoQuery"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/aliases/{alias}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.aliases.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/announcements/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/announcements/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.addOnAttachments.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/courseWork/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.addOnAttachments.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/students/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.students.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/teachers/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{courseId}/topics/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.topics.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/invitations/{id}","path_regex":"^(?:/v1/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.invitations.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/registrations/{registrationId}","path_regex":"^(?:/v1/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.registrations.delete"},{"hostname":"classroom.googleapis.com","http_method":"DELETE","path_template":"/v1/userProfiles/{studentId}/guardians/{guardianId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardians/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardians.delete"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses","path_regex":"^(?:/v1/courses)$","service_name":"google.classroom","resource_name":"classroom.courses.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/aliases","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.classroom","resource_name":"classroom.courses.aliases.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements/{itemId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.addOnAttachments.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.addOnAttachments.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/announcements/{itemId}/addOnContext","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnContext)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.getAddOnContext"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments/{attachmentId}/studentSubmissions/{submissionId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.studentSubmissions.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnContext","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnContext)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.getAddOnContext"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{itemId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.addOnAttachments.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.addOnAttachments.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{itemId}/addOnContext","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnContext)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.getAddOnContext"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments/{attachmentId}/studentSubmissions/{submissionId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.studentSubmissions.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnContext","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnContext)$","service_name":"google.classroom","resource_name":"classroom.courses.posts.getAddOnContext"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/students","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students)$","service_name":"google.classroom","resource_name":"classroom.courses.students.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/students/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.students.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/teachers","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers)$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/teachers/{userId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/topics","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.classroom","resource_name":"classroom.courses.topics.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{courseId}/topics/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.topics.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/invitations","path_regex":"^(?:/v1/invitations)$","service_name":"google.classroom","resource_name":"classroom.invitations.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/invitations/{id}","path_regex":"^(?:/v1/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.invitations.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardianInvitations","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations)$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardianInvitations/{invitationId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardians","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardians)$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardians.list"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{studentId}/guardians/{guardianId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardians/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardians.get"},{"hostname":"classroom.googleapis.com","http_method":"GET","path_template":"/v1/userProfiles/{userId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.get"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/announcements/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/announcements/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.addOnAttachments.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWork/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments/{attachmentId}/studentSubmissions/{submissionId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.studentSubmissions.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{itemId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.addOnAttachments.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments/{attachmentId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments/{attachmentId}/studentSubmissions/{submissionId}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.studentSubmissions.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{courseId}/topics/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.topics.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.patch"},{"hostname":"classroom.googleapis.com","http_method":"PATCH","path_template":"/v1/userProfiles/{studentId}/guardianInvitations/{invitationId}","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.patch"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses","path_regex":"^(?:/v1/courses)$","service_name":"google.classroom","resource_name":"classroom.courses.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/aliases","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aliases)$","service_name":"google.classroom","resource_name":"classroom.courses.aliases.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/announcements","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/announcements/{id}:modifyAssignees","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAssignees)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.modifyAssignees"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/announcements/{itemId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announcements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.announcements.addOnAttachments.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:modifyAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.modifyAttachments"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:reclaim","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reclaim)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.reclaim"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:return","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::return)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.return"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{courseWorkId}/studentSubmissions/{id}:turnIn","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studentSubmissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::turnIn)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.studentSubmissions.turnIn"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{id}:modifyAssignees","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAssignees)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.modifyAssignees"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWork/{itemId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWork/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWork.addOnAttachments.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWorkMaterials","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/courseWorkMaterials/{itemId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/courseWorkMaterials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.courseWorkMaterials.addOnAttachments.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/posts/{postId}/addOnAttachments","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addOnAttachments)$","service_name":"google.classroom","resource_name":"classroom.courses.posts.addOnAttachments.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/students","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/students)$","service_name":"google.classroom","resource_name":"classroom.courses.students.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/teachers","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/teachers)$","service_name":"google.classroom","resource_name":"classroom.courses.teachers.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/courses/{courseId}/topics","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.classroom","resource_name":"classroom.courses.topics.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/invitations","path_regex":"^(?:/v1/invitations)$","service_name":"google.classroom","resource_name":"classroom.invitations.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/invitations/{id}:accept","path_regex":"^(?:/v1/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.classroom","resource_name":"classroom.invitations.accept"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/registrations","path_regex":"^(?:/v1/registrations)$","service_name":"google.classroom","resource_name":"classroom.registrations.create"},{"hostname":"classroom.googleapis.com","http_method":"POST","path_template":"/v1/userProfiles/{studentId}/guardianInvitations","path_regex":"^(?:/v1/userProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guardianInvitations)$","service_name":"google.classroom","resource_name":"classroom.userProfiles.guardianInvitations.create"},{"hostname":"classroom.googleapis.com","http_method":"PUT","path_template":"/v1/courses/{id}","path_regex":"^(?:/v1/courses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.classroom","resource_name":"classroom.courses.update"},{"hostname":"cloudasset.googleapis.com","http_method":"DELETE","path_template":"/v1/{v1Id}/{v1Id1}/feeds/{feedsId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.delete"},{"hostname":"cloudasset.googleapis.com","http_method":"DELETE","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.delete"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/assets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.cloudasset","resource_name":"cloudasset.assets.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/effectiveIamPolicies:batchGet","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/effectiveIamPolicies:batchGet)$","service_name":"google.cloudasset","resource_name":"cloudasset.effectiveIamPolicies.batchGet"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/feeds","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds)$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/feeds/{feedsId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeIamPolicy)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeIamPolicy"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeMove","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeMove)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeMove"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeOrgPolicies","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeOrgPolicies)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeOrgPolicies"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeOrgPolicyGovernedAssets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeOrgPolicyGovernedAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeOrgPolicyGovernedAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:analyzeOrgPolicyGovernedContainers","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeOrgPolicyGovernedContainers)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeOrgPolicyGovernedContainers"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:batchGetAssetsHistory","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchGetAssetsHistory)$","service_name":"google.cloudasset","resource_name":"cloudasset.batchGetAssetsHistory"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:searchAllIamPolicies","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAllIamPolicies)$","service_name":"google.cloudasset","resource_name":"cloudasset.searchAllIamPolicies"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}:searchAllResources","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchAllResources)$","service_name":"google.cloudasset","resource_name":"cloudasset.searchAllResources"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.folders.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.organizations.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}:batchGetAssetsHistory","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchGetAssetsHistory)$","service_name":"google.cloudasset","resource_name":"cloudasset.organizations.batchGetAssetsHistory"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.projects.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}:batchGetAssetsHistory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchGetAssetsHistory)$","service_name":"google.cloudasset","resource_name":"cloudasset.projects.batchGetAssetsHistory"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/{v1p1beta1Id}/{v1p1beta1Id1}/iamPolicies:searchAll","path_regex":"^(?:/v1p1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iamPolicies:searchAll)$","service_name":"google.cloudasset","resource_name":"cloudasset.iamPolicies.searchAll"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/{v1p1beta1Id}/{v1p1beta1Id1}/resources:searchAll","path_regex":"^(?:/v1p1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources:searchAll)$","service_name":"google.cloudasset","resource_name":"cloudasset.resources.searchAll"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p4beta1/{v1p4beta1Id}/{v1p4beta1Id1}:analyzeIamPolicy","path_regex":"^(?:/v1p4beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeIamPolicy)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeIamPolicy"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p5beta1/{v1p5beta1Id}/{v1p5beta1Id1}/assets","path_regex":"^(?:/v1p5beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.cloudasset","resource_name":"cloudasset.assets.list"},{"hostname":"cloudasset.googleapis.com","http_method":"GET","path_template":"/v1p7beta1/{v1p7beta1Id}/{v1p7beta1Id1}/operations/{operationsId}/{operationsId1}","path_regex":"^(?:/v1p7beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.operations.get"},{"hostname":"cloudasset.googleapis.com","http_method":"PATCH","path_template":"/v1/{v1Id}/{v1Id1}/feeds/{feedsId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.patch"},{"hostname":"cloudasset.googleapis.com","http_method":"PATCH","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.patch"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/feeds","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feeds)$","service_name":"google.cloudasset","resource_name":"cloudasset.feeds.create"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/savedQueries","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.cloudasset","resource_name":"cloudasset.savedQueries.create"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}:analyzeIamPolicyLongrunning","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeIamPolicyLongrunning)$","service_name":"google.cloudasset","resource_name":"cloudasset.analyzeIamPolicyLongrunning"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}:exportAssets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}:queryAssets","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.queryAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}:exportAssets","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.folders.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:exportAssets","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.organizations.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:exportAssets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.projects.exportAssets"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1p4beta1/{v1p4beta1Id}/{v1p4beta1Id1}:exportIamPolicyAnalysis","path_regex":"^(?:/v1p4beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportIamPolicyAnalysis)$","service_name":"google.cloudasset","resource_name":"cloudasset.exportIamPolicyAnalysis"},{"hostname":"cloudasset.googleapis.com","http_method":"POST","path_template":"/v1p7beta1/{v1p7beta1Id}/{v1p7beta1Id1}:exportAssets","path_regex":"^(?:/v1p7beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAssets)$","service_name":"google.cloudasset","resource_name":"cloudasset.exportAssets"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts","path_regex":"^(?:/v1/billingAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/projects","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.projects.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/subAccounts","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.subAccounts.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}:getIamPolicy","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.getIamPolicy"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/billingAccounts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.organizations.billingAccounts.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/billingAccounts/{billingAccountsId}:move","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.organizations.billingAccounts.move"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/billingInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingInfo)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.projects.getBillingInfo"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.services.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/skus","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.services.skus.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/services","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.services.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/services/{servicesId}","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.services.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skuGroups","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skuGroups)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skuGroups.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skuGroups/{skuGroupsId}","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skuGroups.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skuGroups/{skuGroupsId}/skus","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skuGroups.skus.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skuGroups/{skuGroupsId}/skus/{skusId}","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skuGroups.skus.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skus","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skus.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skus/{skusId}","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skus.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skus/{skusId}/price","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/price)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skus.price.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/billingAccounts/{billingAccountsId}/skus/{skusId}/prices","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prices)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.skus.prices.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/skuGroups","path_regex":"^(?:/v1beta/skuGroups)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.skuGroups.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/skuGroups/{skuGroupsId}","path_regex":"^(?:/v1beta/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.skuGroups.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/skuGroups/{skuGroupsId}/skus","path_regex":"^(?:/v1beta/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.skuGroups.skus.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/skuGroups/{skuGroupsId}/skus/{skusId}","path_regex":"^(?:/v1beta/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.skuGroups.skus.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/skus/{skusId}/price","path_regex":"^(?:/v1beta/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/price)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.skus.price.get"},{"hostname":"cloudbilling.googleapis.com","http_method":"GET","path_template":"/v1beta/skus/{skusId}/prices","path_regex":"^(?:/v1beta/skus/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prices)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.skus.prices.list"},{"hostname":"cloudbilling.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.patch"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts","path_regex":"^(?:/v1/billingAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.create"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/subAccounts","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.subAccounts.create"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}:move","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.move"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}:setIamPolicy","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.setIamPolicy"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}:testIamPermissions","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.testIamPermissions"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/billingAccounts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAccounts)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.organizations.billingAccounts.create"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1beta/billingAccounts/{billingAccountsId}:estimateCostScenario","path_regex":"^(?:/v1beta/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::estimateCostScenario)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.billingAccounts.estimateCostScenario"},{"hostname":"cloudbilling.googleapis.com","http_method":"POST","path_template":"/v1beta:estimateCostScenario","path_regex":"^(?:/v1beta:estimateCostScenario)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.estimateCostScenario"},{"hostname":"cloudbilling.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/billingInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingInfo)$","service_name":"google.cloudbilling","resource_name":"cloudbilling.projects.updateBillingInfo"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/triggers/{triggerId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories/{repositoriesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.delete"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/builds/{id}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/triggers/{triggerId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.repos.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/defaultServiceAccount","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultServiceAccount)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.getDefaultServiceAccount"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.repos.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.list"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories/{repositoriesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories/{repositoriesId}:fetchGitRefs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchGitRefs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.fetchGitRefs"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:fetchLinkableRepositories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchLinkableRepositories)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.fetchLinkableRepositories"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.getIamPolicy"},{"hostname":"cloudbuild.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.get"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/triggers/{triggerId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs/{githubEnterpriseConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools/{workerPoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.patch"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/githubDotComWebhook:receive","path_regex":"^(?:/v1/githubDotComWebhook:receive)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.githubDotComWebhook.receive"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/regionalWebhook","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalWebhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.locations.regionalWebhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/builds/{id}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/builds/{id}:retry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.retry"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/triggers/{triggerId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.run"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/triggers/{trigger}:webhook","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::webhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.triggers.webhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/builds/{buildsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.builds.approve"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.githubEnterpriseConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}/connectedRepositories:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectedRepositories:batchCreate)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.connectedRepositories.batchCreate"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bitbucketServerConfigs/{bitbucketServerConfigsId}:removeBitbucketServerConnectedRepository","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bitbucketServerConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeBitbucketServerConnectedRepository)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.bitbucketServerConfigs.removeBitbucketServerConnectedRepository"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.approve"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/builds/{buildsId}:retry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/builds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.builds.retry"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}/connectedRepositories:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectedRepositories:batchCreate)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.connectedRepositories.batchCreate"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gitLabConfigs/{gitLabConfigsId}:removeGitLabConnectedRepository","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitLabConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeGitLabConnectedRepository)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.gitLabConfigs.removeGitLabConnectedRepository"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/githubEnterpriseConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/githubEnterpriseConfigs)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.githubEnterpriseConfigs.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.run"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:webhook","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::webhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.triggers.webhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1/webhook","path_regex":"^(?:/v1/webhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.webhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/workerPools","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/workerPools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workerPools)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.workerPools.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.create"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories/{repositoriesId}:accessReadToken","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accessReadToken)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.accessReadToken"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories/{repositoriesId}:accessReadWriteToken","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accessReadWriteToken)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.accessReadWriteToken"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/repositories:batchCreate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories:batchCreate)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.repositories.batchCreate"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.setIamPolicy"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.testIamPermissions"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections:processWebhook","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections:processWebhook)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.connections.processWebhook"},{"hostname":"cloudbuild.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudbuild","resource_name":"cloudbuild.projects.locations.operations.cancel"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs/{channelPartnerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs/{customerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.delete"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs/{channelPartnerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs/{customerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:listEntitlementChanges","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listEntitlementChanges)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.listEntitlementChanges"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:lookupOffer","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupOffer)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.lookupOffer"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:listPurchasableOffers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listPurchasableOffers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.listPurchasableOffers"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:listPurchasableSkus","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listPurchasableSkus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.listPurchasableSkus"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:queryEligibleBillingAccounts","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryEligibleBillingAccounts)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.queryEligibleBillingAccounts"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/offers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/offers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.offers.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/reports","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.reports.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/skuGroups","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skuGroups)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.skuGroups.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/skuGroups/{skuGroupsId}/billableSkus","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skuGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billableSkus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.skuGroups.billableSkus.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}:listSubscribers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSubscribers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.listSubscribers"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/integrators/{integratorsId}:listSubscribers","path_regex":"^(?:/v1/integrators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSubscribers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.integrators.listSubscribers"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.get"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/products","path_regex":"^(?:/v1/products)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.products.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"GET","path_template":"/v1/products/{productsId}/skus","path_regex":"^(?:/v1/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/skus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.products.skus.list"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs/{channelPartnerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/customers/{customersId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs/{customerRepricingConfigsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.patch"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/channelPartnerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.channelPartnerRepricingConfigs.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/channelPartnerLinks/{channelPartnerLinksId}/customers:import","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelPartnerLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers:import)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.channelPartnerLinks.customers.import"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/customerRepricingConfigs","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customerRepricingConfigs)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.customerRepricingConfigs.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.create"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:activate","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.activate"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:cancel","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.cancel"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:changeOffer","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changeOffer)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.changeOffer"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:changeParameters","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changeParameters)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.changeParameters"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:changeRenewalSettings","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changeRenewalSettings)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.changeRenewalSettings"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:startPaidService","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startPaidService)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.startPaidService"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}/entitlements/{entitlementsId}:suspend","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::suspend)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.entitlements.suspend"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:provisionCloudIdentity","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provisionCloudIdentity)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.provisionCloudIdentity"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:transferEntitlements","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::transferEntitlements)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.transferEntitlements"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers/{customersId}:transferEntitlementsToGoogle","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::transferEntitlementsToGoogle)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.transferEntitlementsToGoogle"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/customers:import","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers:import)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.customers.import"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/reportJobs/{reportJobsId}:fetchReportResults","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchReportResults)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.reportJobs.fetchReportResults"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/reports/{reportsId}:run","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.reports.run"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:checkCloudIdentityAccountsExist","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkCloudIdentityAccountsExist)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.checkCloudIdentityAccountsExist"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:listTransferableOffers","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTransferableOffers)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.listTransferableOffers"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:listTransferableSkus","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTransferableSkus)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.listTransferableSkus"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:register","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::register)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.register"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:unregister","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unregister)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.accounts.unregister"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/integrators/{integratorsId}:register","path_regex":"^(?:/v1/integrators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::register)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.integrators.register"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/integrators/{integratorsId}:unregister","path_regex":"^(?:/v1/integrators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unregister)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.integrators.unregister"},{"hostname":"cloudchannel.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudchannel","resource_name":"cloudchannel.operations.cancel"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/accounts","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.list"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/accounts/{accountsId}","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.get"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/entitlements","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.list"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"GET","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.get"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"PATCH","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.patch"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/accounts/{accountsId}:approve","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.approve"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/accounts/{accountsId}:reject","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.reject"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/accounts/{accountsId}:reset","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.accounts.reset"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:approve","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.approve"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:approvePlanChange","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approvePlanChange)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.approvePlanChange"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:reject","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.reject"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:rejectPlanChange","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rejectPlanChange)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.rejectPlanChange"},{"hostname":"cloudcommerceprocurement.googleapis.com","http_method":"POST","path_template":"/v1/providers/{providersId}/entitlements/{entitlementsId}:suspend","path_regex":"^(?:/v1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::suspend)$","service_name":"google.cloudcommerceprocurement","resource_name":"cloudcommerceprocurement.providers.entitlements.suspend"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.get"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.get"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/accessApprovalRequests","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalRequests)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.accessApprovalRequests.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/ekmConnections","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.getEkmConnections"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/partnerPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partnerPermissions)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.getPartnerPermissions"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/violations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.violations.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/violations/{violationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.violations.get"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/partner","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partner)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.getPartner"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.get"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.get"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/accessApprovalRequests","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessApprovalRequests)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.accessApprovalRequests.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/ekmConnections","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.getEkmConnections"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/partnerPermissions","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partnerPermissions)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.getPartnerPermissions"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/violations","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.violations.list"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/customers/{customersId}/workloads/{workloadsId}/violations/{violationsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/violations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.customers.workloads.violations.get"},{"hostname":"cloudcontrolspartner.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/partner","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partner)$","service_name":"google.cloudcontrolspartner","resource_name":"cloudcontrolspartner.organizations.locations.getPartner"},{"hostname":"clouddebugger.googleapis.com","http_method":"DELETE","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.delete"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/controller/debuggees/{debuggeeId}/breakpoints","path_regex":"^(?:/v2/controller/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.controller.debuggees.breakpoints.list"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/debugger/debuggees","path_regex":"^(?:/v2/debugger/debuggees)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.list"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.list"},{"hostname":"clouddebugger.googleapis.com","http_method":"GET","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints/{breakpointId}","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.get"},{"hostname":"clouddebugger.googleapis.com","http_method":"POST","path_template":"/v2/controller/debuggees/register","path_regex":"^(?:/v2/controller/debuggees/register)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.controller.debuggees.register"},{"hostname":"clouddebugger.googleapis.com","http_method":"POST","path_template":"/v2/debugger/debuggees/{debuggeeId}/breakpoints/set","path_regex":"^(?:/v2/debugger/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/set)$","service_name":"google.clouddebugger","resource_name":"clouddebugger.debugger.debuggees.breakpoints.set"},{"hostname":"clouddebugger.googleapis.com","http_method":"PUT","path_template":"/v2/controller/debuggees/{debuggeeId}/breakpoints/{id}","path_regex":"^(?:/v2/controller/debuggees/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/breakpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddebugger","resource_name":"clouddebugger.controller.debuggees.breakpoints.update"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes/{customTargetTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automations/{automationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automations.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.delete"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.getConfig"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes/{customTargetTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes/{customTargetTypesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.getIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automationRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automationRuns)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automationRuns.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automationRuns/{automationRunsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automationRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automationRuns.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automations)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automations.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automations/{automationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automations.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}/jobRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobRuns)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.jobRuns.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}/jobRuns/{jobRunsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.jobRuns.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.getIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.list"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.get"},{"hostname":"clouddeploy.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.getIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes/{customTargetTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.patch"},{"hostname":"clouddeploy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.patch"},{"hostname":"clouddeploy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automations/{automationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automations.patch"},{"hostname":"clouddeploy.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.patch"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customTargetTypes/{customTargetTypesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customTargetTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.customTargetTypes.setIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automationRuns/{automationRunsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automationRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automationRuns.cancel"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/automations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/automations)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.automations.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}/jobRuns/{jobRunsId}:terminate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::terminate)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.jobRuns.terminate"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:advance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::advance)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.advance"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:approve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.approve"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.cancel"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:ignoreJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::ignoreJob)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.ignoreJob"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}/rollouts/{rolloutsId}:retryJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retryJob)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.rollouts.retryJob"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}/releases/{releasesId}:abandon","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::abandon)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.releases.abandon"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:rollbackTarget","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollbackTarget)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.rollbackTarget"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.setIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deliveryPipelines/{deliveryPipelinesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryPipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.deliveryPipelines.testIamPermissions"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.operations.cancel"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.create"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.setIamPolicy"},{"hostname":"clouddeploy.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targets/{targetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.clouddeploy","resource_name":"clouddeploy.projects.locations.targets.testIamPermissions"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/events","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.deleteEvents"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/events","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.locations.deleteEvents"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/events","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.events.list"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/groupStats","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupStats)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.groupStats.list"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.groups.get"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/events","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.locations.events.list"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/groupStats","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groupStats)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.locations.groupStats.list"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.locations.groups.get"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/events:report","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events:report)$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.events.report"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.groups.update"},{"hostname":"clouderrorreporting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.clouderrorreporting","resource_name":"clouderrorreporting.projects.locations.groups.update"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.delete"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/operations","path_regex":"^(?:/v1beta2/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/operations/{operationsId}","path_regex":"^(?:/v1beta2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.runtimes.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.runtimes.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:getIamPolicy","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.getIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.operations.get"},{"hostname":"cloudfunctions.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.runtimes.list"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.patch"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:call","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::call)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.call"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:call","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::call)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.call"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:abortFunctionUpgrade","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::abortFunctionUpgrade)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.abortFunctionUpgrade"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:commitFunctionUpgrade","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commitFunctionUpgrade)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.commitFunctionUpgrade"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:redirectFunctionUpgradeTraffic","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::redirectFunctionUpgradeTraffic)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.redirectFunctionUpgradeTraffic"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:rollbackFunctionUpgradeTraffic","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollbackFunctionUpgradeTraffic)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.rollbackFunctionUpgradeTraffic"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setupFunctionUpgradeConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setupFunctionUpgradeConfig)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setupFunctionUpgradeConfig"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:abortFunctionUpgrade","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::abortFunctionUpgrade)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.abortFunctionUpgrade"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:commitFunctionUpgrade","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commitFunctionUpgrade)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.commitFunctionUpgrade"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:redirectFunctionUpgradeTraffic","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::redirectFunctionUpgradeTraffic)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.redirectFunctionUpgradeTraffic"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:rollbackFunctionUpgradeTraffic","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollbackFunctionUpgradeTraffic)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.rollbackFunctionUpgradeTraffic"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setupFunctionUpgradeConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setupFunctionUpgradeConfig)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setupFunctionUpgradeConfig"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.create"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:abortFunctionUpgrade","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::abortFunctionUpgrade)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.abortFunctionUpgrade"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:commitFunctionUpgrade","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commitFunctionUpgrade)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.commitFunctionUpgrade"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:generateDownloadUrl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDownloadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateDownloadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:redirectFunctionUpgradeTraffic","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::redirectFunctionUpgradeTraffic)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.redirectFunctionUpgradeTraffic"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:rollbackFunctionUpgradeTraffic","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollbackFunctionUpgradeTraffic)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.rollbackFunctionUpgradeTraffic"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setIamPolicy","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setIamPolicy"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:setupFunctionUpgradeConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setupFunctionUpgradeConfig)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.setupFunctionUpgradeConfig"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}:testIamPermissions","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.testIamPermissions"},{"hostname":"cloudfunctions.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/functions:generateUploadUrl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions:generateUploadUrl)$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.generateUploadUrl"},{"hostname":"cloudfunctions.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/functions/{functionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/functions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudfunctions","resource_name":"cloudfunctions.projects.locations.functions.update"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/devices/{devicesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/groups/{groupsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/devices/{devicesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/groups/{groupsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1beta1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.delete"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/userinvitations","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}:isInvitableUser","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::isInvitableUser)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.isInvitableUser"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices","path_regex":"^(?:/v1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/devices/{devicesId}/deviceUsers:lookup","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups","path_regex":"^(?:/v1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:checkTransitiveMembership","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:checkTransitiveMembership)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.checkTransitiveMembership"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:getMembershipGraph","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:getMembershipGraph)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.getMembershipGraph"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:lookup","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:searchDirectGroups","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchDirectGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchDirectGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:searchTransitiveGroups","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/memberships:searchTransitiveMemberships","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveMemberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveMemberships"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.getSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups:lookup","path_regex":"^(?:/v1/groups:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/groups:search","path_regex":"^(?:/v1/groups:search)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.search"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles","path_regex":"^(?:/v1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSsoAssignments","path_regex":"^(?:/v1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/customers/{customersId}/userinvitations","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}:isInvitableUser","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::isInvitableUser)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.isInvitableUser"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices","path_regex":"^(?:/v1beta1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/devices/{devicesId}/deviceUsers:lookup","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups","path_regex":"^(?:/v1beta1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:checkTransitiveMembership","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:checkTransitiveMembership)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.checkTransitiveMembership"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:getMembershipGraph","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:getMembershipGraph)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.getMembershipGraph"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:lookup","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:searchDirectGroups","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchDirectGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchDirectGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:searchTransitiveGroups","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveGroups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveGroups"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/memberships:searchTransitiveMemberships","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:searchTransitiveMemberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.searchTransitiveMemberships"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.getSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups:lookup","path_regex":"^(?:/v1beta1/groups:lookup)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.lookup"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/groups:search","path_regex":"^(?:/v1beta1/groups:search)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.search"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials/{idpCredentialsId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSsoAssignments","path_regex":"^(?:/v1beta1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1beta1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.get"},{"hostname":"cloudidentity.googleapis.com","http_method":"GET","path_template":"/v1beta1/orgUnits/{orgUnitsId}/memberships","path_regex":"^(?:/v1beta1/orgUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.orgUnits.memberships.list"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/groups/{groupsId}","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.updateSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}/clientStates/{clientStatesId}","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.clientStates.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/groups/{groupsId}","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/groups/{groupsId}/securitySettings","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.updateSecuritySettings"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/inboundSsoAssignments/{inboundSsoAssignmentsId}","path_regex":"^(?:/v1beta1/inboundSsoAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.patch"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}:cancel","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.cancel"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/customers/{customersId}/userinvitations/{userinvitationsId}:send","path_regex":"^(?:/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::send)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.send"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices","path_regex":"^(?:/v1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:approve","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.approve"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:block","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::block)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.block"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:cancelWipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}/deviceUsers/{deviceUsersId}:wipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}:cancelWipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/devices/{devicesId}:wipe","path_regex":"^(?:/v1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/groups","path_regex":"^(?:/v1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/groups/{groupsId}/memberships","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/groups/{groupsId}/memberships/{membershipsId}:modifyMembershipRoles","path_regex":"^(?:/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyMembershipRoles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.modifyMembershipRoles"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/inboundSamlSsoProfiles","path_regex":"^(?:/v1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials:add","path_regex":"^(?:/v1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials:add)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.add"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1/inboundSsoAssignments","path_regex":"^(?:/v1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}:cancel","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.cancel"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/customers/{customersId}/userinvitations/{userinvitationsId}:send","path_regex":"^(?:/v1beta1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userinvitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::send)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.customers.userinvitations.send"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices","path_regex":"^(?:/v1beta1/devices)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:approve","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::approve)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.approve"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:block","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::block)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.block"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:cancelWipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}/deviceUsers/{deviceUsersId}:wipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.deviceUsers.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}:cancelWipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelWipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.cancelWipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/devices/{devicesId}:wipe","path_regex":"^(?:/v1beta1/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wipe)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.devices.wipe"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/groups","path_regex":"^(?:/v1beta1/groups)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/groups/{groupsId}/memberships","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/groups/{groupsId}/memberships/{membershipsId}:modifyMembershipRoles","path_regex":"^(?:/v1beta1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyMembershipRoles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.groups.memberships.modifyMembershipRoles"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/inboundSamlSsoProfiles","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/inboundSamlSsoProfiles/{inboundSamlSsoProfilesId}/idpCredentials:add","path_regex":"^(?:/v1beta1/inboundSamlSsoProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idpCredentials:add)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSamlSsoProfiles.idpCredentials.add"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/inboundSsoAssignments","path_regex":"^(?:/v1beta1/inboundSsoAssignments)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.inboundSsoAssignments.create"},{"hostname":"cloudidentity.googleapis.com","http_method":"POST","path_template":"/v1beta1/orgUnits/{orgUnitsId}/memberships/{membershipsId}:move","path_regex":"^(?:/v1beta1/orgUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudidentity","resource_name":"cloudidentity.orgUnits.memberships.move"},{"hostname":"cloudiot.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.delete"},{"hostname":"cloudiot.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.delete"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.get"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.get"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}/configVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configVersions)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.configVersions.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}/states","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/states)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.states.list"},{"hostname":"cloudiot.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}/devices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.devices.list"},{"hostname":"cloudiot.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.patch"},{"hostname":"cloudiot.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.patch"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.create"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.create"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}:modifyCloudToDeviceConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyCloudToDeviceConfig)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.modifyCloudToDeviceConfig"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/devices/{devicesId}:sendCommandToDevice","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sendCommandToDevice)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.devices.sendCommandToDevice"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.getIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.setIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}/groups/{groupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.groups.testIamPermissions"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:bindDeviceToGateway","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bindDeviceToGateway)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.bindDeviceToGateway"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.getIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.setIamPolicy"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.testIamPermissions"},{"hostname":"cloudiot.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registries/{registriesId}:unbindDeviceFromGateway","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unbindDeviceFromGateway)$","service_name":"google.cloudiot","resource_name":"cloudiot.projects.locations.registries.unbindDeviceFromGateway"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/autokeyConfig","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autokeyConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.folders.getAutokeyConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.getEkmConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig:getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConfig.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:verifyConnectivity","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verifyConnectivity)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.verifyConnectivity"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyHandles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyHandles)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyHandles.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyHandles/{keyHandlesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyHandles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyHandles.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}/publicKey","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicKey)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.getPublicKey"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.list"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.getIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.operations.get"},{"hostname":"cloudkms.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}:showEffectiveAutokeyConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::showEffectiveAutokeyConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.showEffectiveAutokeyConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/autokeyConfig","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autokeyConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.folders.updateAutokeyConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.updateEkmConfig"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.patch"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.patch"},{"hostname":"cloudkms.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.patch"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig:setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConfig.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConfig:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConfig:testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConfig.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ekmConnections/{ekmConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ekmConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.ekmConnections.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyHandles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyHandles)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyHandles.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:asymmetricDecrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::asymmetricDecrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.asymmetricDecrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:asymmetricSign","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::asymmetricSign)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.asymmetricSign"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:destroy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.destroy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:macSign","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::macSign)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.macSign"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:macVerify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::macVerify)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.macVerify"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:rawDecrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rawDecrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.rawDecrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:rawEncrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rawEncrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.rawEncrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions/{cryptoKeyVersionsId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.restore"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/cryptoKeyVersions:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeyVersions:import)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.cryptoKeyVersions.import"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:decrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.decrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:encrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::encrypt)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.encrypt"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}:updatePrimaryVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updatePrimaryVersion)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.cryptoKeys.updatePrimaryVersion"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.create"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/importJobs/{importJobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.importJobs.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.setIamPolicy"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.keyRings.testIamPermissions"},{"hostname":"cloudkms.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:generateRandomBytes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateRandomBytes)$","service_name":"google.cloudkms","resource_name":"cloudkms.projects.locations.generateRandomBytes"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/catalogs:search","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.folders.catalogs.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/products:search","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.folders.products.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/versions:search","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.folders.versions.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/catalogs:search","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.organizations.catalogs.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/products:search","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.organizations.products.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/versions:search","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.organizations.versions.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/catalogs:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.projects.catalogs.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/products:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.projects.products.search"},{"hostname":"cloudprivatecatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/versions:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:search)$","service_name":"google.cloudprivatecatalog","resource_name":"cloudprivatecatalog.projects.versions.search"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}/associations/{associationsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.delete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs","path_regex":"^(?:/v1beta1/catalogs)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/associations","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/associations/{associationsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/catalogs/{catalogsId}:getIamPolicy","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.getIamPolicy"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.list"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.get"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.patch"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.patch"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.patch"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs","path_regex":"^(?:/v1beta1/catalogs)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/associations","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/associations)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.associations.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/icons:upload","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/icons:upload)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.icons.upload"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}/versions","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.versions.create"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}/products/{productsId}:copy","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::copy)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.products.copy"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}:setIamPolicy","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.setIamPolicy"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}:testIamPermissions","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.testIamPermissions"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalogs/{catalogsId}:undelete","path_regex":"^(?:/v1beta1/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.catalogs.undelete"},{"hostname":"cloudprivatecatalogproducer.googleapis.com","http_method":"POST","path_template":"/v1beta1/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudprivatecatalogproducer","resource_name":"cloudprivatecatalogproducer.operations.cancel"},{"hostname":"cloudprofiler.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/profiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.list"},{"hostname":"cloudprofiler.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/profiles/{profilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.patch"},{"hostname":"cloudprofiler.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/profiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.create"},{"hostname":"cloudprofiler.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/profiles:createOffline","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles:createOffline)$","service_name":"google.cloudprofiler","resource_name":"cloudprofiler.projects.profiles.createOffline"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/liens/{liensId}","path_regex":"^(?:/v1/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/folders/{foldersId}","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/liens/{liensId}","path_regex":"^(?:/v3/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagBindings/{tagBindingsId}","path_regex":"^(?:/v3/tagBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagBindings.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagKeys/{tagKeysId}","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagValues/{tagValuesId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"DELETE","path_template":"/v3/tagValues/{tagValuesId}/tagHolds/{tagHoldsId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagHolds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.tagHolds.delete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/liens","path_regex":"^(?:/v1/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/liens/{liensId}","path_regex":"^(?:/v1/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1/{+name}","path_regex":"^(?:/v1/)((?:(?:[\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e\\x21\\x23\\x24\\x26-\\x2c\\x2f\\x3a\\x3b\\x3d\\x3f\\x40\\x5b\\x5d]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations","path_regex":"^(?:/v1beta1/organizations)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects","path_regex":"^(?:/v1beta1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/effectiveTags","path_regex":"^(?:/v3/effectiveTags)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.effectiveTags.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/folders","path_regex":"^(?:/v3/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/folders/{foldersId}","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/folders:search","path_regex":"^(?:/v3/folders:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/liens","path_regex":"^(?:/v3/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/liens/{liensId}","path_regex":"^(?:/v3/liens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/operations/{operationsId}","path_regex":"^(?:/v3/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.operations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/organizations/{organizationsId}","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/organizations:search","path_regex":"^(?:/v3/organizations:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/projects","path_regex":"^(?:/v3/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/projects:search","path_regex":"^(?:/v3/projects:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagBindings","path_regex":"^(?:/v3/tagBindings)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagBindings.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagKeys","path_regex":"^(?:/v3/tagKeys)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagKeys/namespaced","path_regex":"^(?:/v3/tagKeys/namespaced)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.getNamespaced"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagKeys/{tagKeysId}","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues","path_regex":"^(?:/v3/tagValues)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues/namespaced","path_regex":"^(?:/v3/tagValues/namespaced)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.getNamespaced"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues/{tagValuesId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.get"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"GET","path_template":"/v3/tagValues/{tagValuesId}/tagHolds","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagHolds)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.tagHolds.list"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/folders/{foldersId}","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/tagKeys/{tagKeysId}","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PATCH","path_template":"/v3/tagValues/{tagValuesId}","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.patch"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:clearOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.clearOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:getEffectiveOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectiveOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getEffectiveOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:getOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:listAvailableOrgPolicyConstraints","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAvailableOrgPolicyConstraints)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.listAvailableOrgPolicyConstraints"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:listOrgPolicies","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listOrgPolicies)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.listOrgPolicies"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}:setOrgPolicy","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/liens","path_regex":"^(?:/v1/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:clearOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.clearOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getEffectiveOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectiveOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getEffectiveOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:getOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:listAvailableOrgPolicyConstraints","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAvailableOrgPolicyConstraints)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.listAvailableOrgPolicyConstraints"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:listOrgPolicies","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listOrgPolicies)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.listOrgPolicies"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:setOrgPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations:search","path_regex":"^(?:/v1/organizations:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/organizations:search","path_regex":"^(?:/v1/organizations:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:getAncestry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getAncestry)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getAncestry"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:clearOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.clearOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:getEffectiveOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectiveOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getEffectiveOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:getOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:listAvailableOrgPolicyConstraints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAvailableOrgPolicyConstraints)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.listAvailableOrgPolicyConstraints"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:listOrgPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listOrgPolicies)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.listOrgPolicies"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:setOrgPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setOrgPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setOrgPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{resource}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{resource}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{resource}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:getIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:setIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}:testIamPermissions","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects","path_regex":"^(?:/v1beta1/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:getAncestry","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getAncestry)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getAncestry"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{resource}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{resource}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{resource}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders","path_regex":"^(?:/v2/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:getIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:getIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:move","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:move","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:setIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:setIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:testIamPermissions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:testIamPermissions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:undelete","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}:undelete","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders:search","path_regex":"^(?:/v2/folders:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v2/folders:search","path_regex":"^(?:/v2/folders:search)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.search"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders","path_regex":"^(?:/v3/folders)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:getIamPolicy","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:move","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:setIamPolicy","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:testIamPermissions","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/folders/{foldersId}:undelete","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.folders.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/liens","path_regex":"^(?:/v3/liens)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.liens.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/organizations/{organizationsId}:getIamPolicy","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/organizations/{organizationsId}:setIamPolicy","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/organizations/{organizationsId}:testIamPermissions","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects","path_regex":"^(?:/v3/projects)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:getIamPolicy","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:move","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.move"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:setIamPolicy","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:testIamPermissions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:undelete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.undelete"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagBindings","path_regex":"^(?:/v3/tagBindings)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagBindings.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys","path_regex":"^(?:/v3/tagKeys)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys/{tagKeysId}:getIamPolicy","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys/{tagKeysId}:setIamPolicy","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagKeys/{tagKeysId}:testIamPermissions","path_regex":"^(?:/v3/tagKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagKeys.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues","path_regex":"^(?:/v3/tagValues)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}/tagHolds","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagHolds)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.tagHolds.create"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}:getIamPolicy","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.getIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}:setIamPolicy","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.setIamPolicy"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"POST","path_template":"/v3/tagValues/{tagValuesId}:testIamPermissions","path_regex":"^(?:/v3/tagValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.tagValues.testIamPermissions"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.update"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PUT","path_template":"/v1beta1/organizations/{organizationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.organizations.update"},{"hostname":"cloudresourcemanager.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudresourcemanager","resource_name":"cloudresourcemanager.projects.update"},{"hostname":"cloudscheduler.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.delete"},{"hostname":"cloudscheduler.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.delete"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.list"},{"hostname":"cloudscheduler.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.get"},{"hostname":"cloudscheduler.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.patch"},{"hostname":"cloudscheduler.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.patch"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.create"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.pause"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.resume"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.run"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.create"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:pause","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.pause"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.resume"},{"hostname":"cloudscheduler.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:run","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudscheduler","resource_name":"cloudscheduler.projects.locations.jobs.run"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.delete"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/indexing/datasources/{datasourcesId}/schema","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schema)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.deleteSchema"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.delete"},{"hostname":"cloudsearch.googleapis.com","http_method":"DELETE","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.delete"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/debug/datasources/{datasourcesId}/items/{itemsId}/unmappedids","path_regex":"^(?:/v1/debug/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unmappedids)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.datasources.items.unmappedids.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/debug/identitysources/{identitysourcesId}/items:forunmappedidentity","path_regex":"^(?:/v1/debug/identitysources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:forunmappedidentity)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.identitysources.items.listForunmappedidentity"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/debug/identitysources/{identitysourcesId}/unmappedids","path_regex":"^(?:/v1/debug/identitysources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unmappedids)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.identitysources.unmappedids.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/indexing/datasources/{datasourcesId}/items","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/indexing/datasources/{datasourcesId}/schema","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schema)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.getSchema"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.operations.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}/lro","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lro)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.operations.lro.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/query/sources","path_regex":"^(?:/v1/query/sources)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.sources.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/customer","path_regex":"^(?:/v1/settings/customer)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.getCustomer"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/datasources","path_regex":"^(?:/v1/settings/datasources)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/searchapplications","path_regex":"^(?:/v1/settings/searchapplications)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.list"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/index","path_regex":"^(?:/v1/stats/index)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getIndex"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/index/datasources/{datasourcesId}","path_regex":"^(?:/v1/stats/index/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.index.datasources.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/query","path_regex":"^(?:/v1/stats/query)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getQuery"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/query/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/stats/query/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.query.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/searchapplication","path_regex":"^(?:/v1/stats/searchapplication)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getSearchapplication"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/session","path_regex":"^(?:/v1/stats/session)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getSession"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/session/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/stats/session/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.session.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/user","path_regex":"^(?:/v1/stats/user)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.getUser"},{"hostname":"cloudsearch.googleapis.com","http_method":"GET","path_template":"/v1/stats/user/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/stats/user/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.stats.user.searchapplications.get"},{"hostname":"cloudsearch.googleapis.com","http_method":"PATCH","path_template":"/v1/settings/customer","path_regex":"^(?:/v1/settings/customer)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.updateCustomer"},{"hostname":"cloudsearch.googleapis.com","http_method":"PATCH","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.patch"},{"hostname":"cloudsearch.googleapis.com","http_method":"PATCH","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.patch"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/debug/datasources/{datasourcesId}/items/{itemsId}:checkAccess","path_regex":"^(?:/v1/debug/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkAccess)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.datasources.items.checkAccess"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/debug/datasources/{datasourcesId}/items:searchByViewUrl","path_regex":"^(?:/v1/debug/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:searchByViewUrl)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.debug.datasources.items.searchByViewUrl"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}:index","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::index)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.index"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}:push","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::push)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.push"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items/{itemsId}:upload","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upload)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.upload"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items:deleteQueueItems","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:deleteQueueItems)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.deleteQueueItems"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items:poll","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:poll)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.poll"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/indexing/datasources/{datasourcesId}/items:unreserve","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/items:unreserve)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.items.unreserve"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.media.upload"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/query/search","path_regex":"^(?:/v1/query/search)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.search"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/query/suggest","path_regex":"^(?:/v1/query/suggest)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.suggest"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/query:debugSearch","path_regex":"^(?:/v1/query:debugSearch)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.debugSearch"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/query:removeActivity","path_regex":"^(?:/v1/query:removeActivity)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.query.removeActivity"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/settings/datasources","path_regex":"^(?:/v1/settings/datasources)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.create"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/settings/searchapplications","path_regex":"^(?:/v1/settings/searchapplications)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.create"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1/settings/searchapplications/{searchapplicationsId}:reset","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.reset"},{"hostname":"cloudsearch.googleapis.com","http_method":"POST","path_template":"/v1:initializeCustomer","path_regex":"^(?:/v1:initializeCustomer)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.initializeCustomer"},{"hostname":"cloudsearch.googleapis.com","http_method":"PUT","path_template":"/v1/indexing/datasources/{datasourcesId}/schema","path_regex":"^(?:/v1/indexing/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schema)$","service_name":"google.cloudsearch","resource_name":"cloudsearch.indexing.datasources.updateSchema"},{"hostname":"cloudsearch.googleapis.com","http_method":"PUT","path_template":"/v1/settings/datasources/{datasourcesId}","path_regex":"^(?:/v1/settings/datasources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.datasources.update"},{"hostname":"cloudsearch.googleapis.com","http_method":"PUT","path_template":"/v1/settings/searchapplications/{searchapplicationsId}","path_regex":"^(?:/v1/settings/searchapplications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsearch","resource_name":"cloudsearch.settings.searchapplications.update"},{"hostname":"cloudshell.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.delete"},{"hostname":"cloudshell.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}/publicKeys/{publicKeysId}","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.publicKeys.delete"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.list"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.get"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/environments/{environmentsId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.get"},{"hostname":"cloudshell.googleapis.com","http_method":"GET","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.get"},{"hostname":"cloudshell.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.patch"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.cloudshell","resource_name":"cloudshell.operations.cancel"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:addPublicKey","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addPublicKey)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.addPublicKey"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:authorize","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::authorize)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.authorize"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:removePublicKey","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removePublicKey)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.removePublicKey"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/environments/{environmentsId}:start","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.start"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}/publicKeys","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicKeys)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.publicKeys.create"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}:authorize","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::authorize)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.authorize"},{"hostname":"cloudshell.googleapis.com","http_method":"POST","path_template":"/v1alpha1/users/{usersId}/environments/{environmentsId}:start","path_regex":"^(?:/v1alpha1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.cloudshell","resource_name":"cloudshell.users.environments.start"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/caseClassifications:search","path_regex":"^(?:/v2/caseClassifications:search)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.caseClassifications.search"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cases","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.get"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}/attachments","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.attachments.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}/attachments/{attachmentsId}:download","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.media.download"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}/comments","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.comments.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cases:search","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases:search)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.search"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/caseClassifications:search","path_regex":"^(?:/v2beta/caseClassifications:search)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.caseClassifications.search"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/cases:search","path_regex":"^(?:/v2beta/cases:search)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.search"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.get"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/attachments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.attachments.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/attachments/{attachmentsId}:download","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.media.download"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/comments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.comments.list"},{"hostname":"cloudsupport.googleapis.com","http_method":"GET","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}:showFeed","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::showFeed)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.showFeed"},{"hostname":"cloudsupport.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.patch"},{"hostname":"cloudsupport.googleapis.com","http_method":"PATCH","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.patch"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/cases","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.create"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}/attachments","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.media.upload"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}/comments","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.comments.create"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}:close","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.close"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/cases/{casesId}:escalate","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::escalate)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.escalate"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.create"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/attachments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.media.upload"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}/comments","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.comments.create"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}:close","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.close"},{"hostname":"cloudsupport.googleapis.com","http_method":"POST","path_template":"/v2beta/{v2betaId}/{v2betaId1}/cases/{casesId}:escalate","path_regex":"^(?:/v2beta/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::escalate)$","service_name":"google.cloudsupport","resource_name":"cloudsupport.cases.escalate"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"DELETE","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.delete"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/cmekConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekConfig)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.getCmekConfig"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/cmekConfig","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekConfig)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.getCmekConfig"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/cmekConfig","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekConfig)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.getCmekConfig"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.list"},{"hostname":"cloudtasks.googleapis.com","http_method":"GET","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.get"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/cmekConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekConfig)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.updateCmekConfig"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.patch"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/cmekConfig","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekConfig)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.updateCmekConfig"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.patch"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/cmekConfig","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekConfig)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.updateCmekConfig"},{"hostname":"cloudtasks.googleapis.com","http_method":"PATCH","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.patch"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/api/queue/update","path_regex":"^(?:/api/queue/update)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.api.queue.update"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{taskId}:buffer","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::buffer)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.buffer"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:run","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.run"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.getIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:pause","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.pause"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:purge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::purge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.purge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:resume","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.resume"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.setIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.testIamPermissions"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{taskId}:buffer","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::buffer)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.buffer"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:acknowledge","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.acknowledge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:cancelLease","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelLease)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.cancelLease"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:renewLease","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renewLease)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.renewLease"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:run","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.run"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks:lease","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks:lease)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.lease"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:getIamPolicy","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.getIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:pause","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.pause"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:purge","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::purge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.purge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:resume","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.resume"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:setIamPolicy","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.setIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta2/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:testIamPermissions","path_regex":"^(?:/v2beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.testIamPermissions"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.create"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{taskId}:buffer","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::buffer)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.buffer"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}/tasks/{tasksId}:run","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.tasks.run"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:getIamPolicy","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.getIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:pause","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.pause"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:purge","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::purge)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.purge"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:resume","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.resume"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:setIamPolicy","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.setIamPolicy"},{"hostname":"cloudtasks.googleapis.com","http_method":"POST","path_template":"/v2beta3/projects/{projectsId}/locations/{locationsId}/queues/{queuesId}:testIamPermissions","path_regex":"^(?:/v2beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.cloudtasks","resource_name":"cloudtasks.projects.locations.queues.testIamPermissions"},{"hostname":"cloudtrace.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/traceSinks/{traceSinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.delete"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/traces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.list"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/traces/{traceId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.get"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/traceSinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.list"},{"hostname":"cloudtrace.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/traceSinks/{traceSinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.get"},{"hostname":"cloudtrace.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/traces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.patchTraces"},{"hostname":"cloudtrace.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/traceSinks/{traceSinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.patch"},{"hostname":"cloudtrace.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/traces/{tracesId}/spans/{spansId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.spans.createSpan"},{"hostname":"cloudtrace.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/traces:batchWrite","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces:batchWrite)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traces.batchWrite"},{"hostname":"cloudtrace.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/traceSinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traceSinks)$","service_name":"google.cloudtrace","resource_name":"cloudtrace.projects.traceSinks.create"},{"hostname":"commentanalyzer.googleapis.com","http_method":"POST","path_template":"/v1alpha1/comments:analyze","path_regex":"^(?:/v1alpha1/comments:analyze)$","service_name":"google.commentanalyzer","resource_name":"commentanalyzer.comments.analyze"},{"hostname":"commentanalyzer.googleapis.com","http_method":"POST","path_template":"/v1alpha1/comments:suggestscore","path_regex":"^(?:/v1alpha1/comments:suggestscore)$","service_name":"google.commentanalyzer","resource_name":"commentanalyzer.comments.suggestscore"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps/{userWorkloadsConfigMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets/{userWorkloadsSecretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps/{userWorkloadsConfigMapsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets/{userWorkloadsSecretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.delete"},{"hostname":"composer.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.delete"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps/{userWorkloadsConfigMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets/{userWorkloadsSecretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/workloads","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.workloads.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:fetchDatabaseProperties","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchDatabaseProperties)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.fetchDatabaseProperties"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageVersions)$","service_name":"google.composer","resource_name":"composer.projects.locations.imageVersions.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps/{userWorkloadsConfigMapsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets/{userWorkloadsSecretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.get"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/workloads","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.workloads.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:fetchDatabaseProperties","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchDatabaseProperties)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.fetchDatabaseProperties"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/imageVersions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageVersions)$","service_name":"google.composer","resource_name":"composer.projects.locations.imageVersions.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.list"},{"hostname":"composer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.operations.get"},{"hostname":"composer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.patch"},{"hostname":"composer.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.patch"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:checkUpgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkUpgrade)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.checkUpgrade"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:databaseFailover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::databaseFailover)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.databaseFailover"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:executeAirflowCommand","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeAirflowCommand)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.executeAirflowCommand"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:loadSnapshot","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::loadSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.loadSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:pollAirflowCommand","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pollAirflowCommand)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.pollAirflowCommand"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:saveSnapshot","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::saveSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.saveSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:stopAirflowCommand","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopAirflowCommand)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.stopAirflowCommand"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.create"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:checkUpgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkUpgrade)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.checkUpgrade"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:databaseFailover","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::databaseFailover)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.databaseFailover"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:executeAirflowCommand","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeAirflowCommand)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.executeAirflowCommand"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:loadSnapshot","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::loadSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.loadSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:pollAirflowCommand","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pollAirflowCommand)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.pollAirflowCommand"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:restartWebServer","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restartWebServer)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.restartWebServer"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:saveSnapshot","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::saveSnapshot)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.saveSnapshot"},{"hostname":"composer.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}:stopAirflowCommand","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopAirflowCommand)$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.stopAirflowCommand"},{"hostname":"composer.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps/{userWorkloadsConfigMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.update"},{"hostname":"composer.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets/{userWorkloadsSecretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.update"},{"hostname":"composer.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsConfigMaps/{userWorkloadsConfigMapsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsConfigMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsConfigMaps.update"},{"hostname":"composer.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}/userWorkloadsSecrets/{userWorkloadsSecretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userWorkloadsSecrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.composer","resource_name":"composer.projects.locations.environments.userWorkloadsSecrets.update"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/locations/global/operations/{operation}","path_regex":"^(?:/compute/alpha/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshotGroups/{instantSnapshotGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshotGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/multiMigs/{multiMig}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/multiMigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionMultiMigs.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots/{snapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshotGroups/{instantSnapshotGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshotGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources/{queuedResource}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/locations/global/operations/{operation}","path_regex":"^(?:/compute/beta/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/locations/global/operations/{operation}","path_regex":"^(?:/compute/v1/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.delete"},{"hostname":"compute.googleapis.com","http_method":"DELETE","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.delete"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/listAssociations","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/getPacketMirroringRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/operations","path_regex":"^(?:/compute/alpha/locations/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/operations/{operation}","path_regex":"^(?:/compute/alpha/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/listAssociations","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.projects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/acceleratorTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/commitments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/diskTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/disks)$","service_name":"google.compute","resource_name":"compute.disks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/futureReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/healthCheckServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instances)$","service_name":"google.compute","resource_name":"compute.instances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/interconnectAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/machineTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/networkAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/networkEdgeSecurityServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/nodeGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/nodeTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/nodeTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/notificationEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/packetMirrorings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/queuedResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/queuedResources)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/reservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/resourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/routers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/routers)$","service_name":"google.compute","resource_name":"compute.routers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/serviceAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/storagePoolTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePoolTypes)$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/storagePools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/subnetworks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/subnetworks/listUsable","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks/listUsable)$","service_name":"google.compute","resource_name":"compute.subnetworks.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/targetVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/vpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/aggregated/vpnTunnels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/getXpnHost","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.getXpnHost"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/getXpnResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnResources)$","service_name":"google.compute","resource_name":"compute.projects.getXpnResources"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/addresses/getOwnerInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/getOwnerInstance)$","service_name":"google.compute","resource_name":"compute.globalAddresses.getOwnerInstance"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/listUsable","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/listUsable)$","service_name":"google.compute","resource_name":"compute.backendBuckets.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices/listUsable","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/listUsable)$","service_name":"google.compute","resource_name":"compute.backendServices.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/getPacketMirroringRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images/family/{family}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/family/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.getFromFamily"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectLocations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectLocations/{interconnectLocation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectRemoteLocations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations)$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnectRemoteLocations/{interconnectRemoteLocation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}/getDiagnostics","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiagnostics)$","service_name":"google.compute","resource_name":"compute.interconnects.getDiagnostics"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}/getMacsecConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getMacsecConfig)$","service_name":"google.compute","resource_name":"compute.interconnects.getMacsecConfig"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnects.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{licenseCode}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenseCodes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenseCodes.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/licenses/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/machineImages","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/machineImages/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkPlacements","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkPlacements)$","service_name":"google.compute","resource_name":"compute.networkPlacements.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkPlacements/{networkPlacement}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkPlacements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkPlacements.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkProfiles","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkProfiles)$","service_name":"google.compute","resource_name":"compute.networkProfiles.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networkProfiles/{networkProfile}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkProfiles.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/getEffectiveFirewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.networks.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/listIpAddresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listIpAddresses)$","service_name":"google.compute","resource_name":"compute.networks.listIpAddresses"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/listIpOwners","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listIpOwners)$","service_name":"google.compute","resource_name":"compute.networks.listIpOwners"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/listPeeringRoutes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPeeringRoutes)$","service_name":"google.compute","resource_name":"compute.networks.listPeeringRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/routes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/listPreconfiguredExpressionSets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/listPreconfiguredExpressionSets)$","service_name":"google.compute","resource_name":"compute.securityPolicies.listPreconfiguredExpressionSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshotSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.snapshotSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.sslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.compute","resource_name":"compute.regions.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regions.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/listUsable","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/listUsable)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/diskSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskSettings)$","service_name":"google.compute","resource_name":"compute.regionDiskSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/diskTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/diskTypes/{diskType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/getEffectiveFirewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagerResizeRequests.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshotGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshotGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshotGroups/{instantSnapshotGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshotGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/multiMigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/multiMigs)$","service_name":"google.compute","resource_name":"compute.regionMultiMigs.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/multiMigs/{multiMig}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/multiMigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionMultiMigs.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.regionOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getNamedSet","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNamedSet)$","service_name":"google.compute","resource_name":"compute.routers.getNamedSet"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getNatIpInfo","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatIpInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatIpInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getNatMappingInfo","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatMappingInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatMappingInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getRoutePolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.getRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/getRouterStatus","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRouterStatus)$","service_name":"google.compute","resource_name":"compute.routers.getRouterStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/listBgpRoutes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listBgpRoutes)$","service_name":"google.compute","resource_name":"compute.routers.listBgpRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/listNamedSets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNamedSets)$","service_name":"google.compute","resource_name":"compute.routers.listNamedSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/listRoutePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listRoutePolicies)$","service_name":"google.compute","resource_name":"compute.routers.listRoutePolicies"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshotSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.regionSnapshotSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.compute","resource_name":"compute.regionSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots/{snapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}/getStatus","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getStatus)$","service_name":"google.compute","resource_name":"compute.vpnGateways.getStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/regions/{region}/zones","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.regionZones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.zones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zones.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/acceleratorTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/acceleratorTypes/{acceleratorType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/diskSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskSettings)$","service_name":"google.compute","resource_name":"compute.diskSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/diskTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/diskTypes/{diskType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.diskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/imageFamilyViews/{family}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageFamilyViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.imageFamilyViews.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getEffectiveFirewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.instances.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getGuestAttributes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getGuestAttributes)$","service_name":"google.compute","resource_name":"compute.instances.getGuestAttributes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getPartnerMetadata","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getPartnerMetadata)$","service_name":"google.compute","resource_name":"compute.instances.getPartnerMetadata"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getShieldedInstanceIdentity","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedInstanceIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedInstanceIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/getShieldedVmIdentity","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedVmIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedVmIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/referrers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referrers)$","service_name":"google.compute","resource_name":"compute.instances.listReferrers"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/screenshot","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/screenshot)$","service_name":"google.compute","resource_name":"compute.instances.getScreenshot"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/serialPort","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serialPort)$","service_name":"google.compute","resource_name":"compute.instances.getSerialPortOutput"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshotGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups)$","service_name":"google.compute","resource_name":"compute.instantSnapshotGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshotGroups/{instantSnapshotGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshotGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/machineTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/machineTypes/{machineType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeTypes/{nodeType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.zoneOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources/{queuedResource}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePoolTypes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePoolTypes)$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePoolTypes/{storagePoolType}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePoolTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/getIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}/listDisks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listDisks)$","service_name":"google.compute","resource_name":"compute.storagePools.listDisks"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/listAssociations","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/getPacketMirroringRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/operations","path_regex":"^(?:/compute/beta/locations/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/operations/{operation}","path_regex":"^(?:/compute/beta/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies","path_regex":"^(?:/compute/beta/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/listAssociations","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/getAssociation","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.projects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/acceleratorTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/commitments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/diskTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/disks)$","service_name":"google.compute","resource_name":"compute.disks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/futureReservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instances)$","service_name":"google.compute","resource_name":"compute.instances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/instantSnapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/interconnectAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/machineTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/networkAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/networkEdgeSecurityServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/nodeGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/nodeTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/nodeTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/packetMirrorings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/reservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/resourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/routers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/routers)$","service_name":"google.compute","resource_name":"compute.routers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/serviceAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/storagePoolTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePoolTypes)$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/storagePools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/subnetworks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/subnetworks/listUsable","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks/listUsable)$","service_name":"google.compute","resource_name":"compute.subnetworks.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/targetVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/vpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/aggregated/vpnTunnels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/getXpnHost","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.getXpnHost"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/getXpnResources","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnResources)$","service_name":"google.compute","resource_name":"compute.projects.getXpnResources"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices/listUsable","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/listUsable)$","service_name":"google.compute","resource_name":"compute.backendServices.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/getPacketMirroringRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images/family/{family}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/family/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.getFromFamily"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/images/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnectLocations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnectLocations/{interconnectLocation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnectRemoteLocations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations)$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnectRemoteLocations/{interconnectRemoteLocation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}/getDiagnostics","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiagnostics)$","service_name":"google.compute","resource_name":"compute.interconnects.getDiagnostics"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}/getMacsecConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getMacsecConfig)$","service_name":"google.compute","resource_name":"compute.interconnects.getMacsecConfig"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenseCodes/{licenseCode}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenseCodes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/licenses/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/machineImages","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/machineImages/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks/{network}/getEffectiveFirewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.networks.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/networks/{network}/listPeeringRoutes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPeeringRoutes)$","service_name":"google.compute","resource_name":"compute.networks.listPeeringRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/routes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies/listPreconfiguredExpressionSets","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/listPreconfiguredExpressionSets)$","service_name":"google.compute","resource_name":"compute.securityPolicies.listPreconfiguredExpressionSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshotSettings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.snapshotSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.sslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.compute","resource_name":"compute.regions.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regions.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/listUsable","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/listUsable)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/diskTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/diskTypes/{diskType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/getEffectiveFirewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.regionOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/getNatIpInfo","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatIpInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatIpInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/getNatMappingInfo","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatMappingInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatMappingInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/getRoutePolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.getRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/getRouterStatus","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRouterStatus)$","service_name":"google.compute","resource_name":"compute.routers.getRouterStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/listBgpRoutes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listBgpRoutes)$","service_name":"google.compute","resource_name":"compute.routers.listBgpRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/listRoutePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listRoutePolicies)$","service_name":"google.compute","resource_name":"compute.routers.listRoutePolicies"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}/getStatus","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getStatus)$","service_name":"google.compute","resource_name":"compute.vpnGateways.getStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/regions/{region}/zones","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.regionZones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.zones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zones.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/acceleratorTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/acceleratorTypes/{acceleratorType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/diskTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/diskTypes/{diskType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.diskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/imageFamilyViews/{family}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageFamilyViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.imageFamilyViews.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getEffectiveFirewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.instances.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getGuestAttributes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getGuestAttributes)$","service_name":"google.compute","resource_name":"compute.instances.getGuestAttributes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getPartnerMetadata","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getPartnerMetadata)$","service_name":"google.compute","resource_name":"compute.instances.getPartnerMetadata"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getShieldedInstanceIdentity","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedInstanceIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedInstanceIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/getShieldedVmIdentity","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedVmIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedVmIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/referrers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referrers)$","service_name":"google.compute","resource_name":"compute.instances.listReferrers"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/screenshot","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/screenshot)$","service_name":"google.compute","resource_name":"compute.instances.getScreenshot"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/serialPort","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serialPort)$","service_name":"google.compute","resource_name":"compute.instances.getSerialPortOutput"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/machineTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/machineTypes/{machineType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeTypes/{nodeType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.zoneOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePoolTypes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePoolTypes)$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePoolTypes/{storagePoolType}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePoolTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{resource}/getIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{storagePool}/listDisks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listDisks)$","service_name":"google.compute","resource_name":"compute.storagePools.listDisks"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/listAssociations","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/listAssociations)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.listAssociations"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/operations","path_regex":"^(?:/compute/v1/locations/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/locations/global/operations/{operation}","path_regex":"^(?:/compute/v1/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOrganizationOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.projects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/acceleratorTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/commitments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/diskTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/disks)$","service_name":"google.compute","resource_name":"compute.disks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/futureReservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instances)$","service_name":"google.compute","resource_name":"compute.instances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/instantSnapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/interconnectAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/machineTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/networkAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/networkEdgeSecurityServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/nodeGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/nodeTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/nodeTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/packetMirrorings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/reservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/resourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/routers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/routers)$","service_name":"google.compute","resource_name":"compute.routers.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/serviceAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/storagePoolTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePoolTypes)$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/storagePools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/subnetworks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/subnetworks/listUsable","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/subnetworks/listUsable)$","service_name":"google.compute","resource_name":"compute.subnetworks.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/targetVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/vpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/aggregated/vpnTunnels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.aggregatedList"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/getXpnHost","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.getXpnHost"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/getXpnResources","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getXpnResources)$","service_name":"google.compute","resource_name":"compute.projects.getXpnResources"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalAddresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices/listUsable","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/listUsable)$","service_name":"google.compute","resource_name":"compute.backendServices.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{externalVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images/family/{family}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/family/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.getFromFamily"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/images/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnectLocations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnectLocations/{interconnectLocation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnectRemoteLocations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations)$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnectRemoteLocations/{interconnectRemoteLocation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}/getDiagnostics","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiagnostics)$","service_name":"google.compute","resource_name":"compute.interconnects.getDiagnostics"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}/getMacsecConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getMacsecConfig)$","service_name":"google.compute","resource_name":"compute.interconnects.getMacsecConfig"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenseCodes/{licenseCode}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenseCodes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenses/{license}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.licenses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/licenses/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/machineImages","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/machineImages/{machineImage}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineImages.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/machineImages/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks/{network}/getEffectiveFirewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.networks.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/networks/{network}/listPeeringRoutes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPeeringRoutes)$","service_name":"google.compute","resource_name":"compute.networks.listPeeringRoutes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.compute","resource_name":"compute.globalOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/routes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/routes/{route}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies/listPreconfiguredExpressionSets","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/listPreconfiguredExpressionSets)$","service_name":"google.compute","resource_name":"compute.securityPolicies.listPreconfiguredExpressionSets"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshotSettings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.snapshotSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/snapshots/{snapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.snapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.sslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetSslProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.compute","resource_name":"compute.regions.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regions.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{address}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.addresses.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/listUsable","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/listUsable)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.listUsable"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/diskTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/diskTypes/{diskType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDiskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/getEffectiveFirewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getAssociation"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates/{instanceTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{nodeTemplate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTemplates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints/{notificationEndpoint}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.regionOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/getNatIpInfo","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatIpInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatIpInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/getNatMappingInfo","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getNatMappingInfo)$","service_name":"google.compute","resource_name":"compute.routers.getNatMappingInfo"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/getRouterStatus","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRouterStatus)$","service_name":"google.compute","resource_name":"compute.routers.getRouterStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/getRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.getRule"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates/{sslCertificate}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/listAvailableFeatures","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/listAvailableFeatures)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.listAvailableFeatures"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetPools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies/{targetTcpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways/{targetVpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnGateways.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{vpnGateway}/getStatus","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getStatus)$","service_name":"google.compute","resource_name":"compute.vpnGateways.getStatus"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels/{vpnTunnel}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.vpnTunnels.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/regions/{region}/zones","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.regionZones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.compute","resource_name":"compute.zones.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zones.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/acceleratorTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/acceleratorTypes/{acceleratorType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.acceleratorTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers/{autoscaler}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.autoscalers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/diskTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes)$","service_name":"google.compute","resource_name":"compute.diskTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/diskTypes/{diskType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.diskTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/imageFamilyViews/{family}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageFamilyViews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.imageFamilyViews.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listErrors","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listErrors)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listErrors"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/getEffectiveFirewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getEffectiveFirewalls)$","service_name":"google.compute","resource_name":"compute.instances.getEffectiveFirewalls"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/getGuestAttributes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getGuestAttributes)$","service_name":"google.compute","resource_name":"compute.instances.getGuestAttributes"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/getShieldedInstanceIdentity","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getShieldedInstanceIdentity)$","service_name":"google.compute","resource_name":"compute.instances.getShieldedInstanceIdentity"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/referrers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referrers)$","service_name":"google.compute","resource_name":"compute.instances.listReferrers"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/screenshot","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/screenshot)$","service_name":"google.compute","resource_name":"compute.instances.getScreenshot"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/serialPort","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serialPort)$","service_name":"google.compute","resource_name":"compute.instances.getSerialPortOutput"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots/{instantSnapshot}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instantSnapshots.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/machineTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes)$","service_name":"google.compute","resource_name":"compute.machineTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/machineTypes/{machineType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/machineTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.machineTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.compute","resource_name":"compute.nodeTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeTypes/{nodeType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.compute","resource_name":"compute.zoneOperations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.zoneOperations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePoolTypes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePoolTypes)$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePoolTypes/{storagePoolType}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePoolTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePoolTypes.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{resource}/getIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.getIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.get"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{storagePool}/listDisks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listDisks)$","service_name":"google.compute","resource_name":"compute.storagePools.listDisks"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.list"},{"hostname":"compute.googleapis.com","http_method":"GET","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances/{targetInstance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetInstances.get"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/updatePeering","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePeering)$","service_name":"google.compute","resource_name":"compute.networks.updatePeering"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/snapshotSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.snapshotSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/diskSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskSettings)$","service_name":"google.compute","resource_name":"compute.regionDiskSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshotSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.regionSnapshotSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/diskSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskSettings)$","service_name":"google.compute","resource_name":"compute.diskSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setShieldedInstanceIntegrityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedInstanceIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedInstanceIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setShieldedVmIntegrityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedVmIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedVmIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateDisplayDevice","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateDisplayDevice)$","service_name":"google.compute","resource_name":"compute.instances.updateDisplayDevice"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateNetworkInterface","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.updateNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedInstanceConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedInstanceConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedInstanceConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedVmConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedVmConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedVmConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/networks/{network}/updatePeering","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePeering)$","service_name":"google.compute","resource_name":"compute.networks.updatePeering"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/snapshotSettings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.snapshotSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setShieldedInstanceIntegrityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedInstanceIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedInstanceIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setShieldedVmIntegrityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedVmIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedVmIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateDisplayDevice","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateDisplayDevice)$","service_name":"google.compute","resource_name":"compute.instances.updateDisplayDevice"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateNetworkInterface","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.updateNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedInstanceConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedInstanceConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedInstanceConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedVmConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedVmConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedVmConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/images/{image}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.images.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/interconnects/{interconnect}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnects.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/networks/{network}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/networks/{network}/updatePeering","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePeering)$","service_name":"google.compute","resource_name":"compute.networks.updatePeering"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.securityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/snapshotSettings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshotSettings)$","service_name":"google.compute","resource_name":"compute.snapshotSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.sslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies/{targetGrpcProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies/{targetHttpProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments/{commitment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionCommitments.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionDisks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.forwardingRules.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices/{healthCheckService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{interconnectAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{networkAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices/{networkEdgeSecurityService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{packetMirroring}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.packetMirrorings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resourcePolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.resourcePolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{serviceAttachment}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.serviceAttachments.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies/{sslPolicy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.subnetworks.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.disks.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/futureReservations/{futureReservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.futureReservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceSettings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceSettings)$","service_name":"google.compute","resource_name":"compute.instanceSettings.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setShieldedInstanceIntegrityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setShieldedInstanceIntegrityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setShieldedInstanceIntegrityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateDisplayDevice","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateDisplayDevice)$","service_name":"google.compute","resource_name":"compute.instances.updateDisplayDevice"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateNetworkInterface","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.updateNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateShieldedInstanceConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShieldedInstanceConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateShieldedInstanceConfig"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.nodeGroups.patch"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.reservations.update"},{"hostname":"compute.googleapis.com","http_method":"PATCH","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{storagePool}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.storagePools.update"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/addPacketMirroringRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/move","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/patchPacketMirroringRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/removePacketMirroringRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removePacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/copyRules","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyRules)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.copyRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/move","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/locations/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/alpha/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/disableXpnHost","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/disableXpnResource","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/enableXpnHost","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/enableXpnResource","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses/{address}/move","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.globalAddresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalAddresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalAddresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}/addSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}/deleteSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendBuckets.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/addSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/deleteSignedUrlKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.backendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/externalVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/addPacketMirroringRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchPacketMirroringRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/removePacketMirroringRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removePacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewalls","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/firewalls/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewalls.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.healthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{image}/deprecate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deprecate)$","service_name":"google.compute","resource_name":"compute.images.deprecate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.images.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/images/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.images.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/instanceTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnectLocations/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectLocations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnectRemoteLocations/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnectRemoteLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectRemoteLocations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnects.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnects.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/interconnects/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnects.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenseCodes.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenseCodes/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenseCodes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenses/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/licenses/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/machineImages","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/machineImages/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/machineImages/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.machineImages.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/addPeering","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPeering)$","service_name":"google.compute","resource_name":"compute.networks.addPeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/removePeering","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePeering)$","service_name":"google.compute","resource_name":"compute.networks.removePeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{network}/switchToCustomMode","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchToCustomMode)$","service_name":"google.compute","resource_name":"compute.networks.switchToCustomMode"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/networks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/operations/{operation}/wait","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.globalOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/announce","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/withdraw","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/routes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/routes/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.securityPolicies.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.securityPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.snapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.snapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetGrpcProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setCertificateMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setQuicOverride)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setQuicOverride"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setSslPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setBackendService","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setCertificateMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.urlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.urlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.urlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/listXpnHosts","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listXpnHosts)$","service_name":"google.compute","resource_name":"compute.projects.listXpnHosts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/moveDisk","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveDisk)$","service_name":"google.compute","resource_name":"compute.projects.moveDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/moveInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveInstance)$","service_name":"google.compute","resource_name":"compute.projects.moveInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{address}/move","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.addresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.addresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.addresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}/calculateCancellationFee","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/calculateCancellationFee)$","service_name":"google.compute","resource_name":"compute.regionCommitments.calculateCancellationFee"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.regionCommitments.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{commitment}/updateReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateReservations)$","service_name":"google.compute","resource_name":"compute.regionCommitments.updateReservations"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/commitments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionCommitments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionDisks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.regionDisks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionDisks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionDisks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionDisks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.forwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthCheckServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagerResizeRequests.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resumeInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resumeInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resumeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/startInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.startInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/stopInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.stopInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/suspendInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspendInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.suspendInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instances/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionInstances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshotGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshotGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/interconnectAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/multiMigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/multiMigs)$","service_name":"google.compute","resource_name":"compute.regionMultiMigs.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEdgeSecurityServices","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/nodeTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/notificationEndpoints/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/operations/{operation}/wait","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.regionOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/packetMirrorings/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/announce","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/withdraw","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/resourcePolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/deleteNamedSet","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNamedSet)$","service_name":"google.compute","resource_name":"compute.routers.deleteNamedSet"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/deleteRoutePolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.deleteRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/patchNamedSet","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchNamedSet)$","service_name":"google.compute","resource_name":"compute.routers.patchNamedSet"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/patchRoutePolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.patchRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/preview","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preview)$","service_name":"google.compute","resource_name":"compute.routers.preview"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/updateNamedSet","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateNamedSet)$","service_name":"google.compute","resource_name":"compute.routers.updateNamedSet"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}/updateRoutePolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.updateRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/serviceAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.compute","resource_name":"compute.regionSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.subnetworks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandIpCidrRange)$","service_name":"google.compute","resource_name":"compute.subnetworks.expandIpCidrRange"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPrivateIpGoogleAccess)$","service_name":"google.compute","resource_name":"compute.subnetworks.setPrivateIpGoogleAccess"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetPools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.addHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/addInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.addInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/getHealth","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.targetPools.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.removeHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/removeInstance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.removeInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/setBackup","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackup)$","service_name":"google.compute","resource_name":"compute.targetPools.setBackup"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetPools/{targetPool}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetPools.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/targetVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/regions/{region}/vpnTunnels/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setCloudArmorTier","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCloudArmorTier)$","service_name":"google.compute","resource_name":"compute.projects.setCloudArmorTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setCommonInstanceMetadata","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCommonInstanceMetadata)$","service_name":"google.compute","resource_name":"compute.projects.setCommonInstanceMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setDefaultNetworkTier","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultNetworkTier)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultNetworkTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setDefaultServiceAccount","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultServiceAccount)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setManagedProtectionTier","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setManagedProtectionTier)$","service_name":"google.compute","resource_name":"compute.projects.setManagedProtectionTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/setUsageExportBucket","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUsageExportBucket)$","service_name":"google.compute","resource_name":"compute.projects.setUsageExportBucket"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.autoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.disks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.disks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.disks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.disks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.disks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/futureReservations/{futureReservation}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.futureReservations.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resumeInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resumeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resumeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/startInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.startInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/stopInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.stopInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/suspendInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspendInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.suspendInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.addInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.removeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.instanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/bulkInsert","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.instances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/addAccessConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.addAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/addNetworkInterface","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.addNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/attachDisk","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachDisk)$","service_name":"google.compute","resource_name":"compute.instances.attachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.deleteAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/deleteNetworkInterface","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNetworkInterface)$","service_name":"google.compute","resource_name":"compute.instances.deleteNetworkInterface"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/detachDisk","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachDisk)$","service_name":"google.compute","resource_name":"compute.instances.detachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/patchPartnerMetadata","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPartnerMetadata)$","service_name":"google.compute","resource_name":"compute.instances.patchPartnerMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/performMaintenance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.instances.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/removeResourcePolicies","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/reset","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.compute","resource_name":"compute.instances.reset"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/resume","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.compute","resource_name":"compute.instances.resume"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/sendDiagnosticInterrupt","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendDiagnosticInterrupt)$","service_name":"google.compute","resource_name":"compute.instances.sendDiagnosticInterrupt"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDiskAutoDelete)$","service_name":"google.compute","resource_name":"compute.instances.setDiskAutoDelete"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instances.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMachineResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineResources)$","service_name":"google.compute","resource_name":"compute.instances.setMachineResources"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMachineType","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineType)$","service_name":"google.compute","resource_name":"compute.instances.setMachineType"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMetadata","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMetadata)$","service_name":"google.compute","resource_name":"compute.instances.setMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMinCpuPlatform)$","service_name":"google.compute","resource_name":"compute.instances.setMinCpuPlatform"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setName","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setName)$","service_name":"google.compute","resource_name":"compute.instances.setName"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setScheduling","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setScheduling)$","service_name":"google.compute","resource_name":"compute.instances.setScheduling"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setServiceAccount","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setServiceAccount)$","service_name":"google.compute","resource_name":"compute.instances.setServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/setTags","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTags)$","service_name":"google.compute","resource_name":"compute.instances.setTags"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/simulateMaintenanceEvent","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.instances.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/start","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.compute","resource_name":"compute.instances.start"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startWithEncryptionKey)$","service_name":"google.compute","resource_name":"compute.instances.startWithEncryptionKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/stop","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.compute","resource_name":"compute.instances.stop"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/suspend","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.compute","resource_name":"compute.instances.suspend"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}/updateAccessConfig","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/setDeletionProtection","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDeletionProtection)$","service_name":"google.compute","resource_name":"compute.instances.setDeletionProtection"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshotGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshotGroups)$","service_name":"google.compute","resource_name":"compute.instantSnapshotGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/networkEndpointGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/addNodes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.addNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/deleteNodes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.deleteNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/listNodes","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.listNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/performMaintenance","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.nodeGroups.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/setNodeTemplate","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNodeTemplate)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setNodeTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/simulateMaintenanceEvent","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.nodeGroups.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/nodeGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/operations/{operation}/wait","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.zoneOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/queuedResources/{queuedResource}/cancel","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.zoneQueuedResources.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{reservation}/resize","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.reservations.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/reservations/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.reservations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/setIamPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/setLabels","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.storagePools.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/storagePools/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.storagePools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{resource}/testIamPermissions","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetInstances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/alpha/projects/{project}/zones/{zone}/targetInstances/{targetInstance}/setSecurityPolicy","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetInstances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/addPacketMirroringRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/move","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/patchPacketMirroringRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/removePacketMirroringRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removePacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies","path_regex":"^(?:/compute/beta/locations/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/addAssociation","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/copyRules","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyRules)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.copyRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/move","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/locations/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/beta/locations/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.organizationSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/disableXpnHost","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/disableXpnResource","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/enableXpnHost","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/enableXpnResource","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses/{address}/move","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.globalAddresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalAddresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalAddresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}/addSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}/deleteSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendBuckets.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/addSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/deleteSignedUrlKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.backendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/externalVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/addPacketMirroringRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchPacketMirroringRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchPacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/removePacketMirroringRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePacketMirroringRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removePacketMirroringRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewalls","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/firewalls/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewalls.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.healthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{image}/deprecate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deprecate)$","service_name":"google.compute","resource_name":"compute.images.deprecate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.images.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/images/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.images.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/instanceTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/interconnects","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/interconnects/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnects.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/interconnects/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnects.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenseCodes/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenseCodes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenses/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/licenses/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/machineImages","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/machineImages/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/machineImages/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.machineImages.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{network}/addPeering","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPeering)$","service_name":"google.compute","resource_name":"compute.networks.addPeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{network}/removePeering","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePeering)$","service_name":"google.compute","resource_name":"compute.networks.removePeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{network}/switchToCustomMode","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchToCustomMode)$","service_name":"google.compute","resource_name":"compute.networks.switchToCustomMode"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/networks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/operations/{operation}/wait","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.globalOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/announce","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/withdraw","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/routes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/routes/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.securityPolicies.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.securityPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.snapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.snapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.sslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetGrpcProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setCertificateMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setQuicOverride)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setQuicOverride"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setSslPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setBackendService","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setCertificateMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.urlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.urlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.urlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/listXpnHosts","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listXpnHosts)$","service_name":"google.compute","resource_name":"compute.projects.listXpnHosts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/moveDisk","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveDisk)$","service_name":"google.compute","resource_name":"compute.projects.moveDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/moveInstance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveInstance)$","service_name":"google.compute","resource_name":"compute.projects.moveInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{address}/move","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.addresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.addresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/addresses/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.addresses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{commitment}/updateReservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateReservations)$","service_name":"google.compute","resource_name":"compute.regionCommitments.updateReservations"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/commitments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionCommitments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionDisks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.regionDisks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionDisks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionDisks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionDisks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/forwardingRules/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.forwardingRules.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthCheckServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resumeInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resumeInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resumeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/startInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.startInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/stopInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.stopInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/suspendInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspendInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.suspendInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instances/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionInstances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/interconnectAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEdgeSecurityServices","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/nodeTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/notificationEndpoints/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/operations/{operation}/wait","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.regionOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/packetMirrorings/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/announce","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/withdraw","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/resourcePolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.routers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/deleteRoutePolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.deleteRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/preview","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preview)$","service_name":"google.compute","resource_name":"compute.routers.preview"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}/updateRoutePolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateRoutePolicy)$","service_name":"google.compute","resource_name":"compute.routers.updateRoutePolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/serviceAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslCertificates/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/sslPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.subnetworks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandIpCidrRange)$","service_name":"google.compute","resource_name":"compute.subnetworks.expandIpCidrRange"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPrivateIpGoogleAccess)$","service_name":"google.compute","resource_name":"compute.subnetworks.setPrivateIpGoogleAccess"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetPools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.addHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/addInstance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.addInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/getHealth","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.targetPools.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.removeHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/removeInstance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.removeInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/setBackup","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackup)$","service_name":"google.compute","resource_name":"compute.targetPools.setBackup"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetPools/{targetPool}/setSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetPools.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetTcpProxies/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/targetVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/regions/{region}/vpnTunnels/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setCloudArmorTier","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCloudArmorTier)$","service_name":"google.compute","resource_name":"compute.projects.setCloudArmorTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setCommonInstanceMetadata","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCommonInstanceMetadata)$","service_name":"google.compute","resource_name":"compute.projects.setCommonInstanceMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setDefaultNetworkTier","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultNetworkTier)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultNetworkTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setManagedProtectionTier","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setManagedProtectionTier)$","service_name":"google.compute","resource_name":"compute.projects.setManagedProtectionTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/setUsageExportBucket","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUsageExportBucket)$","service_name":"google.compute","resource_name":"compute.projects.setUsageExportBucket"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.autoscalers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.disks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.disks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.disks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.disks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.disks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/futureReservations/{futureReservation}/cancel","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.futureReservations.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeAdvanced","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeAdvanced)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resizeAdvanced"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}/cancel","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resumeInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resumeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resumeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setAutoHealingPolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setAutoHealingPolicies)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setAutoHealingPolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/startInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.startInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/stopInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.stopInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/suspendInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspendInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.suspendInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.addInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.removeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.instanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/bulkInsert","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.instances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/addAccessConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.addAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/attachDisk","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachDisk)$","service_name":"google.compute","resource_name":"compute.instances.attachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.deleteAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/detachDisk","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachDisk)$","service_name":"google.compute","resource_name":"compute.instances.detachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/patchPartnerMetadata","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPartnerMetadata)$","service_name":"google.compute","resource_name":"compute.instances.patchPartnerMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/performMaintenance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.instances.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/removeResourcePolicies","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/reset","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.compute","resource_name":"compute.instances.reset"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/resume","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.compute","resource_name":"compute.instances.resume"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/sendDiagnosticInterrupt","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendDiagnosticInterrupt)$","service_name":"google.compute","resource_name":"compute.instances.sendDiagnosticInterrupt"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDiskAutoDelete)$","service_name":"google.compute","resource_name":"compute.instances.setDiskAutoDelete"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instances.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMachineResources","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineResources)$","service_name":"google.compute","resource_name":"compute.instances.setMachineResources"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMachineType","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineType)$","service_name":"google.compute","resource_name":"compute.instances.setMachineType"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMetadata","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMetadata)$","service_name":"google.compute","resource_name":"compute.instances.setMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMinCpuPlatform)$","service_name":"google.compute","resource_name":"compute.instances.setMinCpuPlatform"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setName","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setName)$","service_name":"google.compute","resource_name":"compute.instances.setName"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setScheduling","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setScheduling)$","service_name":"google.compute","resource_name":"compute.instances.setScheduling"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setServiceAccount","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setServiceAccount)$","service_name":"google.compute","resource_name":"compute.instances.setServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/setTags","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTags)$","service_name":"google.compute","resource_name":"compute.instances.setTags"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/simulateMaintenanceEvent","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.instances.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/start","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.compute","resource_name":"compute.instances.start"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startWithEncryptionKey)$","service_name":"google.compute","resource_name":"compute.instances.startWithEncryptionKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/stop","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.compute","resource_name":"compute.instances.stop"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/suspend","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.compute","resource_name":"compute.instances.suspend"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}/updateAccessConfig","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/setDeletionProtection","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDeletionProtection)$","service_name":"google.compute","resource_name":"compute.instances.setDeletionProtection"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/networkEndpointGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/addNodes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.addNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/deleteNodes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.deleteNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/listNodes","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.listNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/performMaintenance","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.nodeGroups.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/setNodeTemplate","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNodeTemplate)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setNodeTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/simulateMaintenanceEvent","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.nodeGroups.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/nodeGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/operations/{operation}/wait","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.zoneOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{reservation}/resize","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.reservations.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/reservations/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.reservations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{resource}/setIamPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/storagePools/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.storagePools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{resource}/testIamPermissions","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.targetInstances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/beta/projects/{project}/zones/{zone}/targetInstances/{targetInstance}/setSecurityPolicy","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetInstances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/move","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/locations/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/locations/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.firewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/disableXpnHost","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/disableXpnResource","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.disableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/enableXpnHost","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnHost)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnHost"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/enableXpnResource","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enableXpnResource)$","service_name":"google.compute","resource_name":"compute.projects.enableXpnResource"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses)$","service_name":"google.compute","resource_name":"compute.globalAddresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/addresses/{address}/move","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.globalAddresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/addresses/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalAddresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets)$","service_name":"google.compute","resource_name":"compute.backendBuckets.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}/addSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}/deleteSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendBuckets.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendBuckets.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendBuckets.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices)$","service_name":"google.compute","resource_name":"compute.backendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/addSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.addSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/deleteSignedUrlKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteSignedUrlKey)$","service_name":"google.compute","resource_name":"compute.backendServices.deleteSignedUrlKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.backendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/setEdgeSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setEdgeSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setEdgeSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.backendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.backendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/externalVpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/externalVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.externalVpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/firewalls","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls)$","service_name":"google.compute","resource_name":"compute.firewalls.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.globalForwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks)$","service_name":"google.compute","resource_name":"compute.healthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks)$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images)$","service_name":"google.compute","resource_name":"compute.images.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{image}/deprecate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deprecate)$","service_name":"google.compute","resource_name":"compute.images.deprecate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.images.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.images.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/images/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/images/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.images.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/instanceTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/instanceTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instanceTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/interconnects","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects)$","service_name":"google.compute","resource_name":"compute.interconnects.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/interconnects/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/interconnects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnects.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenseCodes/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenseCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenseCodes.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses)$","service_name":"google.compute","resource_name":"compute.licenses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenses/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.licenses.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/licenses/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/licenses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.licenses.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/machineImages","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages)$","service_name":"google.compute","resource_name":"compute.machineImages.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/machineImages/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.machineImages.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/machineImages/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/machineImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.machineImages.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.globalNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks)$","service_name":"google.compute","resource_name":"compute.networks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks/{network}/addPeering","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addPeering)$","service_name":"google.compute","resource_name":"compute.networks.addPeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks/{network}/removePeering","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removePeering)$","service_name":"google.compute","resource_name":"compute.networks.removePeering"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/networks/{network}/switchToCustomMode","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchToCustomMode)$","service_name":"google.compute","resource_name":"compute.networks.switchToCustomMode"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/operations/{operation}/wait","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.globalOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/announce","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/publicAdvertisedPrefixes/{publicAdvertisedPrefix}/withdraw","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicAdvertisedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicAdvertisedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.globalPublicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/routes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/routes)$","service_name":"google.compute","resource_name":"compute.routes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies)$","service_name":"google.compute","resource_name":"compute.securityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.securityPolicies.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.securityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots)$","service_name":"google.compute","resource_name":"compute.snapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.snapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.snapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/snapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.snapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslCertificates)$","service_name":"google.compute","resource_name":"compute.sslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/sslPolicies)$","service_name":"google.compute","resource_name":"compute.sslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetGrpcProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetGrpcProxies)$","service_name":"google.compute","resource_name":"compute.targetGrpcProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setCertificateMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setQuicOverride","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setQuicOverride)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setQuicOverride"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetHttpsProxies/{targetHttpsProxy}/setSslPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setBackendService","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setCertificateMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCertificateMap)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setCertificateMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setProxyHeader","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetSslProxies/{targetSslProxy}/setSslPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetSslProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslPolicy)$","service_name":"google.compute","resource_name":"compute.targetSslProxies.setSslPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setBackendService","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackendService)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setBackendService"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/targetTcpProxies/{targetTcpProxy}/setProxyHeader","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/targetTcpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setProxyHeader)$","service_name":"google.compute","resource_name":"compute.targetTcpProxies.setProxyHeader"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps)$","service_name":"google.compute","resource_name":"compute.urlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}/invalidateCache","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invalidateCache)$","service_name":"google.compute","resource_name":"compute.urlMaps.invalidateCache"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.urlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/listXpnHosts","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listXpnHosts)$","service_name":"google.compute","resource_name":"compute.projects.listXpnHosts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/moveDisk","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveDisk)$","service_name":"google.compute","resource_name":"compute.projects.moveDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/moveInstance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/moveInstance)$","service_name":"google.compute","resource_name":"compute.projects.moveInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses)$","service_name":"google.compute","resource_name":"compute.addresses.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{address}/move","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.compute","resource_name":"compute.addresses.move"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/addresses/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.addresses.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}/getHealth","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}/setSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionBackendServices.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/commitments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commitments)$","service_name":"google.compute","resource_name":"compute.regionCommitments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.regionDisks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/bulkInsert","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionDisks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.regionDisks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.regionDisks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionDisks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.regionDisks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionDisks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionDisks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionDisks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/cloneRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneRules)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.cloneRules"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeAssociation","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeAssociation)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeAssociation"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{firewallPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/firewallPolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionNetworkFirewallPolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules)$","service_name":"google.compute","resource_name":"compute.forwardingRules.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTarget)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setTarget"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/forwardingRules/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/forwardingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.forwardingRules.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/healthCheckServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthCheckServices)$","service_name":"google.compute","resource_name":"compute.regionHealthCheckServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks)$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.regionInstanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instanceTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceTemplates)$","service_name":"google.compute","resource_name":"compute.regionInstanceTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instances/bulkInsert","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.regionInstances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.regionInstantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/interconnectAttachments/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/interconnectAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.interconnectAttachments.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments)$","service_name":"google.compute","resource_name":"compute.networkAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.networkAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEdgeSecurityServices","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEdgeSecurityServices)$","service_name":"google.compute","resource_name":"compute.networkEdgeSecurityServices.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNetworkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/nodeTemplates/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeTemplates.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/notificationEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationEndpoints)$","service_name":"google.compute","resource_name":"compute.regionNotificationEndpoints.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/operations/{operation}/wait","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.regionOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/packetMirrorings/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/packetMirrorings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.packetMirrorings.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/announce","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/announce)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.announce"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/publicDelegatedPrefixes/{publicDelegatedPrefix}/withdraw","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publicDelegatedPrefixes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/withdraw)$","service_name":"google.compute","resource_name":"compute.publicDelegatedPrefixes.withdraw"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/resourcePolicies/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.resourcePolicies.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/routers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers)$","service_name":"google.compute","resource_name":"compute.routers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}/preview","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preview)$","service_name":"google.compute","resource_name":"compute.routers.preview"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/addRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.addRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/patchRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.patchRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/securityPolicies/{securityPolicy}/removeRule","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeRule)$","service_name":"google.compute","resource_name":"compute.regionSecurityPolicies.removeRule"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/serviceAttachments/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.serviceAttachments.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/sslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCertificates)$","service_name":"google.compute","resource_name":"compute.regionSslCertificates.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/sslPolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslPolicies)$","service_name":"google.compute","resource_name":"compute.regionSslPolicies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks)$","service_name":"google.compute","resource_name":"compute.subnetworks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.subnetworks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.subnetworks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}/expandIpCidrRange","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/expandIpCidrRange)$","service_name":"google.compute","resource_name":"compute.subnetworks.expandIpCidrRange"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/subnetworks/{subnetwork}/setPrivateIpGoogleAccess","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setPrivateIpGoogleAccess)$","service_name":"google.compute","resource_name":"compute.subnetworks.setPrivateIpGoogleAccess"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.regionTargetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools)$","service_name":"google.compute","resource_name":"compute.targetPools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.addHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/addInstance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.addInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/getHealth","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getHealth)$","service_name":"google.compute","resource_name":"compute.targetPools.getHealth"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeHealthCheck)$","service_name":"google.compute","resource_name":"compute.targetPools.removeHealthCheck"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/removeInstance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstance)$","service_name":"google.compute","resource_name":"compute.targetPools.removeInstance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/setBackup","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setBackup)$","service_name":"google.compute","resource_name":"compute.targetPools.setBackup"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetPools/{targetPool}/setSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetPools.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetTcpProxies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetTcpProxies)$","service_name":"google.compute","resource_name":"compute.regionTargetTcpProxies.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/targetVpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetVpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.targetVpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}/validate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validate)$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.validate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways)$","service_name":"google.compute","resource_name":"compute.vpnGateways.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnGateways.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnGateways/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnGateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.vpnGateways.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/regions/{region}/vpnTunnels/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpnTunnels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.vpnTunnels.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setCloudArmorTier","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCloudArmorTier)$","service_name":"google.compute","resource_name":"compute.projects.setCloudArmorTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setCommonInstanceMetadata","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setCommonInstanceMetadata)$","service_name":"google.compute","resource_name":"compute.projects.setCommonInstanceMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setDefaultNetworkTier","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefaultNetworkTier)$","service_name":"google.compute","resource_name":"compute.projects.setDefaultNetworkTier"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/setUsageExportBucket","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUsageExportBucket)$","service_name":"google.compute","resource_name":"compute.projects.setUsageExportBucket"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setSslCertificates","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSslCertificates)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setSslCertificates"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/targetHttpsProxies/{targetHttpsProxy}/setUrlMap","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetHttpsProxies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setUrlMap)$","service_name":"google.compute","resource_name":"compute.targetHttpsProxies.setUrlMap"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks)$","service_name":"google.compute","resource_name":"compute.disks.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/bulkInsert","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/bulkInsert)$","service_name":"google.compute","resource_name":"compute.disks.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/stopGroupAsyncReplication","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/stopGroupAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopGroupAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/addResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/createSnapshot","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createSnapshot)$","service_name":"google.compute","resource_name":"compute.disks.createSnapshot"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/removeResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.disks.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.disks.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/startAsyncReplication","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.startAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{disk}/stopAsyncReplication","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopAsyncReplication)$","service_name":"google.compute","resource_name":"compute.disks.stopAsyncReplication"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.disks.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.disks.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/disks/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.disks.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/futureReservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations)$","service_name":"google.compute","resource_name":"compute.futureReservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/futureReservations/{futureReservation}/cancel","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/futureReservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.futureReservations.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/abandonInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/abandonInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.abandonInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/applyUpdatesToInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/applyUpdatesToInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.applyUpdatesToInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/createInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.createInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deleteInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deleteInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/deletePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deletePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.deletePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listManagedInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listManagedInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listManagedInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/listPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.listPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/patchPerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchPerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.patchPerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/recreateInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recreateInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.recreateInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/resizeRequests/{resizeRequest}/cancel","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resizeRequests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagerResizeRequests.cancel"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setInstanceTemplate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setInstanceTemplate)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setInstanceTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/setTargetPools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTargetPools)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.setTargetPools"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}/updatePerInstanceConfigs","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatePerInstanceConfigs)$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.updatePerInstanceConfigs"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups)$","service_name":"google.compute","resource_name":"compute.instanceGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/addInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.addInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/listInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.listInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/removeInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeInstances)$","service_name":"google.compute","resource_name":"compute.instanceGroups.removeInstances"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instanceGroups/{instanceGroup}/setNamedPorts","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNamedPorts)$","service_name":"google.compute","resource_name":"compute.instanceGroups.setNamedPorts"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.compute","resource_name":"compute.instances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/bulkInsert","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/bulkInsert)$","service_name":"google.compute","resource_name":"compute.instances.bulkInsert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addAccessConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.addAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/addResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.addResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/attachDisk","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachDisk)$","service_name":"google.compute","resource_name":"compute.instances.attachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/deleteAccessConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.deleteAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/detachDisk","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachDisk)$","service_name":"google.compute","resource_name":"compute.instances.detachDisk"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/performMaintenance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.instances.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/removeResourcePolicies","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeResourcePolicies)$","service_name":"google.compute","resource_name":"compute.instances.removeResourcePolicies"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/reset","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.compute","resource_name":"compute.instances.reset"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/resume","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.compute","resource_name":"compute.instances.resume"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/sendDiagnosticInterrupt","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sendDiagnosticInterrupt)$","service_name":"google.compute","resource_name":"compute.instances.sendDiagnosticInterrupt"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDiskAutoDelete)$","service_name":"google.compute","resource_name":"compute.instances.setDiskAutoDelete"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instances.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMachineResources","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineResources)$","service_name":"google.compute","resource_name":"compute.instances.setMachineResources"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMachineType","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMachineType)$","service_name":"google.compute","resource_name":"compute.instances.setMachineType"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMetadata","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMetadata)$","service_name":"google.compute","resource_name":"compute.instances.setMetadata"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setMinCpuPlatform","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setMinCpuPlatform)$","service_name":"google.compute","resource_name":"compute.instances.setMinCpuPlatform"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setName","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setName)$","service_name":"google.compute","resource_name":"compute.instances.setName"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setScheduling","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setScheduling)$","service_name":"google.compute","resource_name":"compute.instances.setScheduling"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setServiceAccount","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setServiceAccount)$","service_name":"google.compute","resource_name":"compute.instances.setServiceAccount"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/setTags","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setTags)$","service_name":"google.compute","resource_name":"compute.instances.setTags"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/simulateMaintenanceEvent","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.instances.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/start","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.compute","resource_name":"compute.instances.start"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/startWithEncryptionKey","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startWithEncryptionKey)$","service_name":"google.compute","resource_name":"compute.instances.startWithEncryptionKey"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/stop","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.compute","resource_name":"compute.instances.stop"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/suspend","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.compute","resource_name":"compute.instances.suspend"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}/updateAccessConfig","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateAccessConfig)$","service_name":"google.compute","resource_name":"compute.instances.updateAccessConfig"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/setDeletionProtection","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDeletionProtection)$","service_name":"google.compute","resource_name":"compute.instances.setDeletionProtection"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instances.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instances.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots/{resource}/setLabels","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLabels)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.setLabels"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/instantSnapshots/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instantSnapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.instantSnapshots.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/attachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.attachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/detachNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/detachNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.detachNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{networkEndpointGroup}/listNetworkEndpoints","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNetworkEndpoints)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.listNetworkEndpoints"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/networkEndpointGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkEndpointGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.networkEndpointGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.compute","resource_name":"compute.nodeGroups.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/addNodes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.addNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/deleteNodes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deleteNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.deleteNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/listNodes","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listNodes)$","service_name":"google.compute","resource_name":"compute.nodeGroups.listNodes"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/performMaintenance","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performMaintenance)$","service_name":"google.compute","resource_name":"compute.nodeGroups.performMaintenance"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/setNodeTemplate","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setNodeTemplate)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setNodeTemplate"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{nodeGroup}/simulateMaintenanceEvent","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulateMaintenanceEvent)$","service_name":"google.compute","resource_name":"compute.nodeGroups.simulateMaintenanceEvent"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.nodeGroups.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/nodeGroups/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.nodeGroups.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/operations/{operation}/wait","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/wait)$","service_name":"google.compute","resource_name":"compute.zoneOperations.wait"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.compute","resource_name":"compute.reservations.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{reservation}/resize","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.compute","resource_name":"compute.reservations.resize"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.reservations.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/reservations/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.reservations.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools)$","service_name":"google.compute","resource_name":"compute.storagePools.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{resource}/setIamPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.compute","resource_name":"compute.storagePools.setIamPolicy"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/storagePools/{resource}/testIamPermissions","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storagePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.compute","resource_name":"compute.storagePools.testIamPermissions"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances)$","service_name":"google.compute","resource_name":"compute.targetInstances.insert"},{"hostname":"compute.googleapis.com","http_method":"POST","path_template":"/compute/v1/projects/{project}/zones/{zone}/targetInstances/{targetInstance}/setSecurityPolicy","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSecurityPolicy)$","service_name":"google.compute","resource_name":"compute.targetInstances.setSecurityPolicy"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/alpha/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionInstanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/zones/{zone}/instanceGroupManagers/{instanceGroupManager}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceGroupManagers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instanceGroupManagers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/beta/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/backendBuckets/{backendBucket}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendBuckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendBuckets.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.backendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/firewalls/{firewall}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/firewalls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.firewalls.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.healthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/httpHealthChecks/{httpHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/httpsHealthChecks/{httpsHealthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/httpsHealthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.httpsHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/global/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.urlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.regionAutoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/backendServices/{backendService}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backendServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionBackendServices.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/healthChecks/{healthCheck}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/healthChecks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionHealthChecks.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/routers/{router}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.routers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/regions/{region}/urlMaps/{urlMap}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.regionUrlMaps.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/zones/{zone}/autoscalers","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalers)$","service_name":"google.compute","resource_name":"compute.autoscalers.update"},{"hostname":"compute.googleapis.com","http_method":"PUT","path_template":"/compute/v1/projects/{project}/zones/{zone}/instances/{instance}","path_regex":"^(?:/compute/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.compute","resource_name":"compute.instances.update"},{"hostname":"config.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.deployments.delete"},{"hostname":"config.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.operations.delete"},{"hostname":"config.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/previews/{previewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/previews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.previews.delete"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.config","resource_name":"config.projects.locations.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.get"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.deployments.get"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}/revisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.revisions.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.deployments.revisions.get"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}/revisions/{revisionsId}/resources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.revisions.resources.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}/revisions/{revisionsId}/resources/{resourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.deployments.revisions.resources.get"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:exportLock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportLock)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.exportLock"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.getIamPolicy"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.config","resource_name":"config.projects.locations.operations.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.operations.get"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/previews","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/previews)$","service_name":"google.config","resource_name":"config.projects.locations.previews.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/previews/{previewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/previews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.previews.get"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/terraformVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/terraformVersions)$","service_name":"google.config","resource_name":"config.projects.locations.terraformVersions.list"},{"hostname":"config.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/terraformVersions/{terraformVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/terraformVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.terraformVersions.get"},{"hostname":"config.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.config","resource_name":"config.projects.locations.deployments.patch"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.create"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}/revisions/{revisionsId}:exportState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportState)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.revisions.exportState"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:deleteState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteState)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.deleteState"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:exportState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportState)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.exportState"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:importState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importState)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.importState"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:lock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lock)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.lock"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.setIamPolicy"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.testIamPermissions"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/deployments/{deploymentsId}:unlock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unlock)$","service_name":"google.config","resource_name":"config.projects.locations.deployments.unlock"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.config","resource_name":"config.projects.locations.operations.cancel"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/previews","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/previews)$","service_name":"google.config","resource_name":"config.projects.locations.previews.create"},{"hostname":"config.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/previews/{previewsId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/previews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.config","resource_name":"config.projects.locations.previews.export"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors/{customConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/managedZones/{managedZonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.managedZones.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/eventSubscriptions/{eventSubscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventSubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.eventSubscriptions.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customConnectors/{customConnectorsId}/customConnectorVersions/{customConnectorVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.customConnectors.customConnectorVersions.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.endpointAttachments.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.delete"},{"hostname":"connectors.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities/{entitiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.delete"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors/{customConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors/{customConnectorsId}/customConnectorVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectorVersions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.customConnectorVersions.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors/{customConnectorsId}/customConnectorVersions/{customConnectorVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.customConnectorVersions.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/managedZones","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/managedZones)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.managedZones.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/managedZones/{managedZonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.managedZones.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/settings)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.getSettings"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.getConnectionSchemaMetadata"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata:getAction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata:getAction)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.connectionSchemaMetadata.getAction"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata:getEntityType","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata:getEntityType)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.connectionSchemaMetadata.getEntityType"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata:listActions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata:listActions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.connectionSchemaMetadata.listActions"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata:listEntityTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata:listEntityTypes)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.connectionSchemaMetadata.listEntityTypes"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/eventSubscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventSubscriptions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.eventSubscriptions.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/eventSubscriptions/{eventSubscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventSubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.eventSubscriptions.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeActionSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeActionSchemas)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.runtimeActionSchemas.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeEntitySchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeEntitySchemas)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.runtimeEntitySchemas.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.getIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections:search)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.search"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointAttachments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.endpointAttachments.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.endpointAttachments.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.versions.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.versions.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}/versions/{versionsId}/eventtypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventtypes)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.versions.eventtypes.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}/connectors/{connectorsId}/versions/{versionsId}/eventtypes/{eventtypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventtypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.connectors.versions.eventtypes.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.getIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/regionalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalSettings)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.getRegionalSettings"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimeConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeConfig)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.getRuntimeConfig"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/actions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.actions.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/actions/{actionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.actions.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.list"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities/{entitiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.get"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:checkReadiness","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkReadiness)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.checkReadiness"},{"hostname":"connectors.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:checkStatus","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkStatus)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.checkStatus"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors/{customConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.patch"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/managedZones/{managedZonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.managedZones.patch"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/settings)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.updateSettings"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.patch"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/eventSubscriptions/{eventSubscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventSubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.eventSubscriptions.patch"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointAttachments/{endpointAttachmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.endpointAttachments.patch"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/regionalSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalSettings)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.updateRegionalSettings"},{"hostname":"connectors.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities/{entitiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.patch"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/customConnectors/{customConnectorsId}/customConnectorVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectorVersions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.customConnectors.customConnectorVersions.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/managedZones","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/managedZones)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.global.managedZones.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata:refresh","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata:refresh)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.connectionSchemaMetadata.refresh"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/eventSubscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventSubscriptions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.eventSubscriptions.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/eventSubscriptions/{eventSubscriptionsId}:retry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventSubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.eventSubscriptions.retry"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:listenEvent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listenEvent)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.listenEvent"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:repairEventing","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repairEventing)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.repairEventing"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.setIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.testIamPermissions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customConnectors/{customConnectorsId}/customConnectorVersions/{customConnectorVersionsId}:deprecate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deprecate)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.customConnectors.customConnectorVersions.deprecate"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customConnectors:validateCustomConnectorSpec","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConnectors:validateCustomConnectorSpec)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.customConnectors.validateCustomConnectorSpec"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointAttachments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointAttachments)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.endpointAttachments.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.operations.cancel"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.setIamPolicy"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.providers.testIamPermissions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/actions/{actionsId}:execute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.actions.execute"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.create"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities:deleteEntitiesWithConditions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:deleteEntitiesWithConditions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.deleteEntitiesWithConditions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/entityTypes/{entityTypesId}/entities:updateEntitiesWithConditions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:updateEntitiesWithConditions)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.entityTypes.entities.updateEntitiesWithConditions"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:exchangeAuthCode","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAuthCode)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.exchangeAuthCode"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:executeSqlQuery","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeSqlQuery)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.executeSqlQuery"},{"hostname":"connectors.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:refreshAccessToken","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refreshAccessToken)$","service_name":"google.connectors","resource_name":"connectors.projects.locations.connections.refreshAccessToken"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters/{contactCentersId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.delete"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.delete"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.list"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.get"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.list"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters/{contactCentersId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.get"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.list"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.get"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}:queryContactCenterQuota","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryContactCenterQuota)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.queryContactCenterQuota"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters/{contactCentersId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.patch"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/contactCenters","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contactCenters)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.contactCenters.create"},{"hostname":"contactcenteraiplatform.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.contactcenteraiplatform","resource_name":"contactcenteraiplatform.projects.locations.operations.cancel"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses/{analysesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues/{issuesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers/{phraseMatchersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views/{viewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.delete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses/{analysesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:calculateStats","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:calculateStats)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.calculateStats"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/encryptionSpec","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionSpec)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.getEncryptionSpec"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues/{issuesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:calculateIssueModelStats","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::calculateIssueModelStats)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.calculateIssueModelStats"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.operations.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.operations.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers/{phraseMatchersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.getSettings"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.list"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views/{viewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.get"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}/issues/{issuesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.issues.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers/{phraseMatchersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.updateSettings"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views/{viewsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.patch"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/analyses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyses)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.analyses.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:bulkAnalyze","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:bulkAnalyze)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.bulkAnalyze"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:bulkDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:bulkDelete)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.bulkDelete"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:ingest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:ingest)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.ingest"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversations:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations:upload)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.conversations.upload"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/encryptionSpec:initialize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionSpec:initialize)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.encryptionSpec.initialize"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightsdata:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightsdata:export)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.insightsdata.export"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:deploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.deploy"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.export"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels/{issueModelsId}:undeploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.undeploy"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/issueModels:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issueModels:import)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.issueModels.import"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.operations.cancel"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseMatchers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseMatchers)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.phraseMatchers.create"},{"hostname":"contactcenterinsights.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/views","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.contactcenterinsights","resource_name":"contactcenterinsights.projects.locations.views.create"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.delete"},{"hostname":"container.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.delete"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.zones.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/operations/{operationId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/zones/{zone}/serverconfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverconfig)$","service_name":"google.container","resource_name":"container.projects.zones.getServerconfig"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/aggregated/usableSubnetworks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/usableSubnetworks)$","service_name":"google.container","resource_name":"container.projects.aggregated.usableSubnetworks.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/.well-known/openid-configuration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\.well-known/openid-configuration)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.well-known.getOpenid-configuration"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/jwks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jwks)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.getJwks"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:checkAutopilotCompatibility","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkAutopilotCompatibility)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.checkAutopilotCompatibility"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.locations.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverConfig)$","service_name":"google.container","resource_name":"container.projects.locations.getServerConfig"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.zones.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/operations/{operationId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/serverconfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverconfig)$","service_name":"google.container","resource_name":"container.projects.zones.getServerconfig"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/aggregated/usableSubnetworks","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aggregated/usableSubnetworks)$","service_name":"google.container","resource_name":"container.projects.aggregated.usableSubnetworks.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.container","resource_name":"container.projects.locations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/.well-known/openid-configuration","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\.well-known/openid-configuration)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.well-known.getOpenid-configuration"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/jwks","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jwks)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.getJwks"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:checkAutopilotCompatibility","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkAutopilotCompatibility)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.checkAutopilotCompatibility"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.container","resource_name":"container.projects.locations.operations.list"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.operations.get"},{"hostname":"container.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverConfig)$","service_name":"google.container","resource_name":"container.projects.locations.getServerConfig"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addons)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.addons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/legacyAbac)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.legacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.locations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logging)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.logging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/master)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.master"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoring)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.monitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscaling)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.autoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setManagement)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSize)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/update)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.update"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceLabels)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.resourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMaintenancePolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.zones.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:completeUpgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeUpgrade)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.completeUpgrade"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setAutoscaling","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAutoscaling)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setAutoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setManagement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setManagement)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSize)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:completeIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setAddons","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAddons)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setAddons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLegacyAbac","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLegacyAbac)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLegacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLocations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLocations)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLocations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLogging","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLogging)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLogging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMaintenancePolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMasterAuth","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMonitoring","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMonitoring)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMonitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setNetworkPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setResourceLabels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setResourceLabels)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setResourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:startIpRotation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:updateMaster","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateMaster)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.updateMaster"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.locations.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/addons","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addons)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.addons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/legacyAbac","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/legacyAbac)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.legacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.locations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/logging","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logging)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.logging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/master","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/master)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.master"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/monitoring","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoring)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.monitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/autoscaling","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscaling)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.autoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setManagement","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setManagement)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/setSize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setSize)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}/update","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/update)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.update"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/nodePools/{nodePoolId}:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}/resourceLabels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceLabels)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.resourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:completeIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMaintenancePolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setMasterAuth","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:setNetworkPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}:startIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.zones.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/operations/{operationId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.zones.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.create"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:completeUpgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeUpgrade)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.completeUpgrade"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.rollback"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setAutoscaling","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAutoscaling)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setAutoscaling"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setManagement","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setManagement)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setManagement"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}:setSize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSize)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.setSize"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:completeIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.completeIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setAddons","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAddons)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setAddons"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLegacyAbac","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLegacyAbac)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLegacyAbac"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLocations)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLocations"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setLogging","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLogging)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setLogging"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMaintenancePolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMaintenancePolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMaintenancePolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMasterAuth","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMasterAuth)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMasterAuth"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setMonitoring","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMonitoring)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setMonitoring"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setNetworkPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setNetworkPolicy)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setNetworkPolicy"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:setResourceLabels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setResourceLabels)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.setResourceLabels"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:startIpRotation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startIpRotation)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.startIpRotation"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}:updateMaster","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateMaster)$","service_name":"google.container","resource_name":"container.projects.locations.clusters.updateMaster"},{"hostname":"container.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.container","resource_name":"container.projects.locations.operations.cancel"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectId}/zones/{zone}/clusters/{clusterId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.zones.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.update"},{"hostname":"container.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/nodePools/{nodePoolsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.container","resource_name":"container.projects.locations.clusters.nodePools.update"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.delete"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/notes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.scanConfigs.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.scanConfigs.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/providers/{providersId}/notes","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.list"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.get"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getNotes"},{"hostname":"containeranalysis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/occurrences:vulnerabilitySummary","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:vulnerabilitySummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getVulnerabilitySummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.operations.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.scanConfigs.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.patch"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/notes:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/occurrences:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/resources/{resourcesId}:exportSBOM","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportSBOM)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.resources.exportSBOM"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notes:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences/{occurrencesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/occurrences:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/resources/{resourcesId}:exportSBOM","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportSBOM)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.resources.exportSBOM"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/occurrences/{occurrencesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.operations.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1alpha1/providers/{providersId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.providers.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/notes:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.notes.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/occurrences:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.occurrences.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/resources/{resourcesId}:exportSBOM","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportSBOM)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.resources.exportSBOM"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/resources/{resourcesId}:generatePackagesSummary","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePackagesSummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.locations.resources.generatePackagesSummary"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes/{notesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/notes:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.notes.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.create"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.getIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.setIamPolicy"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences/{occurrencesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.testIamPermissions"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/occurrences:batchCreate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/occurrences:batchCreate)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.occurrences.batchCreate"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/resources/{resourcesId}:exportSBOM","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportSBOM)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.resources.exportSBOM"},{"hostname":"containeranalysis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/resources/{resourcesId}:generatePackagesSummary","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePackagesSummary)$","service_name":"google.containeranalysis","resource_name":"containeranalysis.projects.resources.generatePackagesSummary"},{"hostname":"contentwarehouse.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas/{documentSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets/{ruleSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets/{synonymSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.list"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas/{documentSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.operations.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.list"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets/{ruleSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.list"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets/{synonymSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:getStatus","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getStatus)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.getStatus"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas/{documentSchemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/referenceId/{referenceIdId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/referenceId/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.referenceId.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets/{ruleSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets/{synonymSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.patch"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documentSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentSchemas)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documentSchemas.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/referenceId/{referenceIdId}:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/referenceId/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delete)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.referenceId.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/referenceId/{referenceIdId}:get","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/referenceId/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::get)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.referenceId.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/documentLinks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentLinks)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.documentLinks.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/documentLinks/{documentLinksId}:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delete)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.documentLinks.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/linkedSources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/linkedSources)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.linkedSources"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}/linkedTargets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/linkedTargets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.linkedTargets"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delete)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.delete"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:fetchAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.fetchAcl"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:get","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::get)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.get"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:lock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lock)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.lock"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents/{documentsId}:setAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.setAcl"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/documents:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:search)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.documents.search"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/ruleSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ruleSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.ruleSets.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/synonymSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/synonymSets)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.synonymSets.create"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:initialize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initialize)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.initialize"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:runPipeline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runPipeline)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.locations.runPipeline"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:fetchAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.fetchAcl"},{"hostname":"contentwarehouse.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:setAcl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAcl)$","service_name":"google.contentwarehouse","resource_name":"contentwarehouse.projects.setAcl"},{"hostname":"css.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/cssProductInputs/{cssProductInputsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cssProductInputs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.css","resource_name":"css.accounts.cssProductInputs.delete"},{"hostname":"css.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/labels/{labelsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.css","resource_name":"css.accounts.labels.delete"},{"hostname":"css.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.css","resource_name":"css.accounts.get"},{"hostname":"css.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/cssProducts","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cssProducts)$","service_name":"google.css","resource_name":"css.accounts.cssProducts.list"},{"hostname":"css.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/cssProducts/{cssProductsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cssProducts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.css","resource_name":"css.accounts.cssProducts.get"},{"hostname":"css.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/labels","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.css","resource_name":"css.accounts.labels.list"},{"hostname":"css.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}:listChildAccounts","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listChildAccounts)$","service_name":"google.css","resource_name":"css.accounts.listChildAccounts"},{"hostname":"css.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/labels/{labelsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.css","resource_name":"css.accounts.labels.patch"},{"hostname":"css.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/cssProductInputs:insert","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cssProductInputs:insert)$","service_name":"google.css","resource_name":"css.accounts.cssProductInputs.insert"},{"hostname":"css.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/labels","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.css","resource_name":"css.accounts.labels.create"},{"hostname":"css.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}:updateLabels","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateLabels)$","service_name":"google.css","resource_name":"css.accounts.updateLabels"},{"hostname":"customsearch.googleapis.com","http_method":"GET","path_template":"/customsearch/v1","path_regex":"^(?:/customsearch/v1)$","service_name":"google.customsearch","resource_name":"search.cse.list"},{"hostname":"customsearch.googleapis.com","http_method":"GET","path_template":"/customsearch/v1/siterestrict","path_regex":"^(?:/customsearch/v1/siterestrict)$","service_name":"google.customsearch","resource_name":"search.cse.siterestrict.list"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.delete"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/entries:lookup","path_regex":"^(?:/v1/entries:lookup)$","service_name":"google.datacatalog","resource_name":"datacatalog.entries.lookup"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:export)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.export"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/entries:lookup","path_regex":"^(?:/v1beta1/entries:lookup)$","service_name":"google.datacatalog","resource_name":"datacatalog.entries.lookup"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.list"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.get"},{"hostname":"datacatalog.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:export)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.export"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags/{tagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.patch"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/catalog:search","path_regex":"^(?:/v1/catalog:search)$","service_name":"google.datacatalog","resource_name":"datacatalog.catalog.search"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags:reconcile","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags:reconcile)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.reconcile"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:modifyEntryContacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyEntryContacts)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.modifyEntryContacts"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:modifyEntryOverview","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyEntryOverview)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.modifyEntryOverview"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:star","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::star)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.star"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:unstar","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unstar)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.unstar"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries:import)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.import"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.operations.cancel"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}/enumValues/{enumValuesId}:rename","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enumValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.enumValues.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}:rename","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:replace","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::replace)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.replace"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/taxonomies:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:import)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.import"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/catalog:search","path_regex":"^(?:/v1beta1/catalog:search)$","service_name":"google.datacatalog","resource_name":"datacatalog.catalog.search"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.entries.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/tags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.tags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.entryGroups.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}/enumValues/{enumValuesId}:rename","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enumValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.enumValues.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}/fields/{fieldsId}:rename","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rename)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.fields.rename"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tagTemplates/{tagTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tagTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.tagTemplates.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.create"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}/policyTags/{policyTagsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policyTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.policyTags.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.getIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.setIamPolicy"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies/{taxonomiesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.testIamPermissions"},{"hostname":"datacatalog.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/taxonomies:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/taxonomies:import)$","service_name":"google.datacatalog","resource_name":"datacatalog.projects.locations.taxonomies.import"},{"hostname":"dataflow.googleapis.com","http_method":"DELETE","path_template":"/v1b3/projects/{projectId}/locations/{location}/snapshots/{snapshotId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.snapshots.delete"},{"hostname":"dataflow.googleapis.com","http_method":"DELETE","path_template":"/v1b3/projects/{projectId}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.deleteSnapshots"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/messages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.messages.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/metrics","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.getMetrics"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/jobs:aggregated","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:aggregated)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.aggregated"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/executionDetails","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionDetails)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.getExecutionDetails"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/messages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.messages.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/metrics","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.getMetrics"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.snapshots.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/stages/{stageId}/executionDetails","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionDetails)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.stages.getExecutionDetails"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.snapshots.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/snapshots/{snapshotId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.snapshots.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/locations/{location}/templates:get","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:get)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.templates.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/snapshots","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.dataflow","resource_name":"dataflow.projects.snapshots.list"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/snapshots/{snapshotId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.snapshots.get"},{"hostname":"dataflow.googleapis.com","http_method":"GET","path_template":"/v1b3/projects/{projectId}/templates:get","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:get)$","service_name":"google.dataflow","resource_name":"dataflow.projects.templates.get"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/WorkerMessages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/WorkerMessages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.workerMessages"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/debug/getConfig","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/getConfig)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.debug.getConfig"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/debug/sendCapture","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/sendCapture)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.debug.sendCapture"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/workItems:lease","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:lease)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.workItems.lease"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}/workItems:reportStatus","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:reportStatus)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.workItems.reportStatus"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}:snapshot","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::snapshot)$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.snapshot"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/WorkerMessages","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/WorkerMessages)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.workerMessages"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/flexTemplates:launch","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flexTemplates:launch)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.flexTemplates.launch"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/debug/getConfig","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/getConfig)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.debug.getConfig"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/debug/sendCapture","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debug/sendCapture)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.debug.sendCapture"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:lease","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:lease)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.workItems.lease"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}/workItems:reportStatus","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workItems:reportStatus)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.workItems.reportStatus"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}:snapshot","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::snapshot)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.snapshot"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/templates","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.templates.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/locations/{location}/templates:launch","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:launch)$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.templates.launch"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/templates","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.dataflow","resource_name":"dataflow.projects.templates.create"},{"hostname":"dataflow.googleapis.com","http_method":"POST","path_template":"/v1b3/projects/{projectId}/templates:launch","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates:launch)$","service_name":"google.dataflow","resource_name":"dataflow.projects.templates.launch"},{"hostname":"dataflow.googleapis.com","http_method":"PUT","path_template":"/v1b3/projects/{projectId}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.jobs.update"},{"hostname":"dataflow.googleapis.com","http_method":"PUT","path_template":"/v1b3/projects/{projectId}/locations/{location}/jobs/{jobId}","path_regex":"^(?:/v1b3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataflow","resource_name":"dataflow.projects.locations.jobs.update"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs/{releaseConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs/{workflowConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.delete"},{"hostname":"dataform.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.delete"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.collections.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/commentThreads/{commentThreadsId}/comments/{commentsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commentThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.commentThreads.comments.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/commentThreads/{commentThreadsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commentThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.commentThreads.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults/{compilationResultsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults/{compilationResultsId}:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.query"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs/{releaseConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs/{workflowConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::query)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.query"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.list"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.get"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:fetchFileDiff","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchFileDiff)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.fetchFileDiff"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:fetchFileGitStatuses","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchFileGitStatuses)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.fetchFileGitStatuses"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:fetchGitAheadBehind","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchGitAheadBehind)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.fetchGitAheadBehind"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:queryDirectoryContents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryDirectoryContents)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.queryDirectoryContents"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:readFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.readFile"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:searchFiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchFiles)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.searchFiles"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:computeAccessTokenStatus","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeAccessTokenStatus)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.computeAccessTokenStatus"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:fetchHistory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchHistory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.fetchHistory"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:fetchRemoteBranches","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchRemoteBranches)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.fetchRemoteBranches"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.getIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:queryDirectoryContents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryDirectoryContents)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.queryDirectoryContents"},{"hostname":"dataform.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:readFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::readFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.readFile"},{"hostname":"dataform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.patch"},{"hostname":"dataform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs/{releaseConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.patch"},{"hostname":"dataform.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs/{workflowConfigsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.patch"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.collections.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.collections.testIamPermissions"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/commentThreads/{commentThreadsId}/comments/{commentsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commentThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.commentThreads.comments.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/commentThreads/{commentThreadsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/commentThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.commentThreads.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/compilationResults","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compilationResults)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.compilationResults.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/releaseConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.releaseConfigs.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowConfigs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowConfigs)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowConfigs.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workflowInvocations/{workflowInvocationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowInvocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workflowInvocations.cancel"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.create"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:commit","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.commit"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:installNpmPackages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::installNpmPackages)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.installNpmPackages"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:makeDirectory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::makeDirectory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.makeDirectory"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:moveDirectory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveDirectory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.moveDirectory"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:moveFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.moveFile"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:pull","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pull)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.pull"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:push","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::push)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.push"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:removeDirectory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeDirectory)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.removeDirectory"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:removeFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.removeFile"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:reset","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.reset"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.testIamPermissions"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}/workspaces/{workspacesId}:writeFile","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::writeFile)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.workspaces.writeFile"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:commit","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.commit"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.setIamPolicy"},{"hostname":"dataform.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/repositories/{repositoriesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repositories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataform","resource_name":"dataform.projects.locations.repositories.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings/{dnsPeeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings/{dnsPeeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.delete"},{"hostname":"datafusion.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.delete"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.getIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.versions.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces/{namespacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.getIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.getIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.list"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.get"},{"hostname":"datafusion.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.versions.list"},{"hostname":"datafusion.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.patch"},{"hostname":"datafusion.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.patch"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.restart"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.setIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.cancel"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/dnsPeerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsPeerings)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.dnsPeerings.create"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces/{namespacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.setIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/namespaces/{namespacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.namespaces.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restart","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.restart"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.setIamPolicy"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.testIamPermissions"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.instances.upgrade"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.operations.cancel"},{"hostname":"datafusion.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/{locationsId1}:removeIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeIamPolicy)$","service_name":"google.datafusion","resource_name":"datafusion.projects.locations.removeIamPolicy"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets/{annotationSpecSetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages/{feedbackMessagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/instructions/{instructionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.delete"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets/{annotationSpecSetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/dataItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.dataItems.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/dataItems/{dataItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.dataItems.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/examples","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.examples.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/examples/{examplesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.examples.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages/{feedbackMessagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/dataItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.dataItems.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/dataItems/{dataItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.dataItems.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.evaluations.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/evaluations:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations:search)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluations.search"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/instructions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/instructions/{instructionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.list"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.get"},{"hostname":"datalabeling.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.operations.cancel"},{"hostname":"datalabeling.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.patch"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/annotationSpecSets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationSpecSets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.annotationSpecSets.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/annotatedDatasets/{annotatedDatasetsId}/feedbackThreads/{feedbackThreadsId}/feedbackMessages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotatedDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackThreads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackMessages)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.annotatedDatasets.feedbackThreads.feedbackMessages.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/evaluations/{evaluationsId}/exampleComparisons:search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exampleComparisons:search)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.evaluations.exampleComparisons.search"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/image:label","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/image:label)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.image.label"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/text:label","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/text:label)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.text.label"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}/video:label","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/video:label)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.video.label"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}:exportData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportData)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.exportData"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/datasets/{datasetsId}:importData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importData)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.datasets.importData"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.create"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}:pause","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.pause"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/evaluationJobs/{evaluationJobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.evaluationJobs.resume"},{"hostname":"datalabeling.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/instructions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instructions)$","service_name":"google.datalabeling","resource_name":"datalabeling.projects.instructions.create"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.delete"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.delete"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.delete"},{"hostname":"datalineage.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents/{lineageEventsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.delete"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.get"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.get"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.get"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.list"},{"hostname":"datalineage.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents/{lineageEventsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.get"},{"hostname":"datalineage.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.patch"},{"hostname":"datalineage.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.patch"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.operations.cancel"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.create"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.create"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processes/{processesId}/runs/{runsId}/lineageEvents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineageEvents)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.processes.runs.lineageEvents.create"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:batchSearchLinkProcesses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchSearchLinkProcesses)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.batchSearchLinkProcesses"},{"hostname":"datalineage.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchLinks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchLinks)$","service_name":"google.datalineage","resource_name":"datalineage.projects.locations.searchLinks"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}/mappingRules/{mappingRulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mappingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.mappingRules.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.delete"},{"hostname":"datamigration.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.delete"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}/mappingRules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mappingRules)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.mappingRules.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}/mappingRules/{mappingRulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mappingRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.mappingRules.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:describeConversionWorkspaceRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::describeConversionWorkspaceRevisions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.describeConversionWorkspaceRevisions"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:describeDatabaseEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::describeDatabaseEntities)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.describeDatabaseEntities"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:searchBackgroundJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchBackgroundJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.searchBackgroundJobs"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:fetchStaticIps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchStaticIps)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.fetchStaticIps"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.get"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.getIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.list"},{"hostname":"datamigration.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.get"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.patch"},{"hostname":"datamigration.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.patch"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}/mappingRules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mappingRules)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.mappingRules.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}/mappingRules:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mappingRules:import)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.mappingRules.import"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:apply","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::apply)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.apply"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.commit"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:convert","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::convert)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.convert"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.rollback"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:seed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::seed)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.seed"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/conversionWorkspaces/{conversionWorkspacesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.conversionWorkspaces.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:demoteDestination","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::demoteDestination)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.demoteDestination"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:generateSshScript","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateSshScript)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.generateSshScript"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:generateTcpProxyScript","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateTcpProxyScript)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.generateTcpProxyScript"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:promote","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.promote"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.restart"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.resume"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.start"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.stop"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:verify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.verify"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.cancel"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.privateConnections.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.connectionProfiles.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.create"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:generateSshScript","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateSshScript)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.generateSshScript"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:promote","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promote)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.promote"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:restart","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.restart"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:resume","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.resume"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.setIamPolicy"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:start","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.start"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:stop","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.stop"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.testIamPermissions"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/migrationJobs/{migrationJobsId}:verify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.migrationJobs.verify"},{"hostname":"datamigration.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datamigration","resource_name":"datamigration.projects.locations.operations.cancel"},{"hostname":"datapipelines.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.delete"},{"hostname":"datapipelines.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.list"},{"hostname":"datapipelines.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.get"},{"hostname":"datapipelines.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.jobs.list"},{"hostname":"datapipelines.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.patch"},{"hostname":"datapipelines.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.create"},{"hostname":"datapipelines.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.run"},{"hostname":"datapipelines.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/pipelines/{pipelinesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.datapipelines","resource_name":"datapipelines.projects.locations.pipelines.stop"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes/{aspectTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.entries.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes/{entryTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions/{partitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.delete"},{"hostname":"dataplex.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.delete"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/encryptionConfigs/{encryptionConfigsId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.organizations.locations.encryptionConfigs.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes/{aspectTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes/{aspectTypesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.jobs.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.jobs.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.entries.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.entries.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes/{entryTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes/{entryTypesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.glossaries.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/governanceRules/{governanceRulesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/governanceRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.governanceRules.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/actions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.actions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.sessions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.jobs.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.jobs.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/actions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.actions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}/actions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.actions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions/{partitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.getIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataJobs)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.metadataJobs.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataJobs/{metadataJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.metadataJobs.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.list"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.get"},{"hostname":"dataplex.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:lookupEntry","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEntry)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lookupEntry"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes/{aspectTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries/{entriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.entries.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes/{entryTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.patch"},{"hostname":"dataplex.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.patch"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/encryptionConfigs/{encryptionConfigsId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.organizations.locations.encryptionConfigs.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/encryptionConfigs/{encryptionConfigsId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.organizations.locations.encryptionConfigs.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes/{aspectTypesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/aspectTypes/{aspectTypesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aspectTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.aspectTypes.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataAttributeBindings/{dataAttributeBindingsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataAttributeBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataAttributeBindings.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}/jobs/{jobsId}:generateDataQualityRules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDataQualityRules)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.jobs.generateDataQualityRules"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:generateDataQualityRules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateDataQualityRules)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.generateDataQualityRules"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.run"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataScans/{dataScansId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataScans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataScans.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}/attributes/{attributesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.attributes.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataTaxonomies/{dataTaxonomiesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataTaxonomies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.dataTaxonomies.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}/entries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.entries.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryGroups/{entryGroupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryGroups.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes/{entryTypesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/entryTypes/{entryTypesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entryTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.entryTypes.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.glossaries.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.glossaries.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/governanceRules/{governanceRulesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/governanceRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.governanceRules.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/governanceRules/{governanceRulesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/governanceRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.governanceRules.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/content/{contentId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.content.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/contentitems/{contentitemsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentitems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.contentitems.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/environments/{environmentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.environments.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}/jobs/{jobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.jobs.cancel"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.run"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/tasks/{tasksId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.tasks.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/assets/{assetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.assets.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}/partitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.partitions.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.setIamPolicy"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.testIamPermissions"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataJobs)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.metadataJobs.create"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/metadataJobs/{metadataJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.metadataJobs.cancel"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.operations.cancel"},{"hostname":"dataplex.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:searchEntries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchEntries)$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.searchEntries"},{"hostname":"dataplex.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lakes/{lakesId}/zones/{zonesId}/entities/{entitiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lakes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataplex","resource_name":"dataplex.projects.locations.lakes.zones.entities.update"},{"hostname":"dataportability.googleapis.com","http_method":"GET","path_template":"/v1/archiveJobs/{archiveJobsId}/portabilityArchiveState","path_regex":"^(?:/v1/archiveJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/portabilityArchiveState)$","service_name":"google.dataportability","resource_name":"dataportability.archiveJobs.getPortabilityArchiveState"},{"hostname":"dataportability.googleapis.com","http_method":"GET","path_template":"/v1beta/archiveJobs/{archiveJobsId}/portabilityArchiveState","path_regex":"^(?:/v1beta/archiveJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/portabilityArchiveState)$","service_name":"google.dataportability","resource_name":"dataportability.archiveJobs.getPortabilityArchiveState"},{"hostname":"dataportability.googleapis.com","http_method":"POST","path_template":"/v1/archiveJobs/{archiveJobsId}:retry","path_regex":"^(?:/v1/archiveJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.dataportability","resource_name":"dataportability.archiveJobs.retry"},{"hostname":"dataportability.googleapis.com","http_method":"POST","path_template":"/v1/authorization:reset","path_regex":"^(?:/v1/authorization:reset)$","service_name":"google.dataportability","resource_name":"dataportability.authorization.reset"},{"hostname":"dataportability.googleapis.com","http_method":"POST","path_template":"/v1/portabilityArchive:initiate","path_regex":"^(?:/v1/portabilityArchive:initiate)$","service_name":"google.dataportability","resource_name":"dataportability.portabilityArchive.initiate"},{"hostname":"dataportability.googleapis.com","http_method":"POST","path_template":"/v1beta/archiveJobs/{archiveJobsId}:retry","path_regex":"^(?:/v1beta/archiveJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retry)$","service_name":"google.dataportability","resource_name":"dataportability.archiveJobs.retry"},{"hostname":"dataportability.googleapis.com","http_method":"POST","path_template":"/v1beta/authorization:reset","path_regex":"^(?:/v1beta/authorization:reset)$","service_name":"google.dataportability","resource_name":"dataportability.authorization.reset"},{"hostname":"dataportability.googleapis.com","http_method":"POST","path_template":"/v1beta/portabilityArchive:initiate","path_regex":"^(?:/v1beta/portabilityArchive:initiate)$","service_name":"google.dataportability","resource_name":"dataportability.portabilityArchive.initiate"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches/{batchesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessionTemplates/{sessionTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessionTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessionTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessions.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.delete"},{"hostname":"dataproc.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.delete"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches/{batchesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessionTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessionTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessionTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessionTemplates/{sessionTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessionTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessionTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessions.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessions.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups/{nodeGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.list"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.get"},{"hostname":"dataproc.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessionTemplates/{sessionTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessionTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessionTemplates.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.patch"},{"hostname":"dataproc.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.patch"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.diagnose"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:repair","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.repair"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.start"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/clusters/{clusterName}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.stop"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/jobs:submit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submit)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submit"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/regions/{region}/jobs:submitAsOperation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submitAsOperation)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submitAsOperation"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/batches/{batchesId}:analyze","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/batches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyze)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.batches.analyze"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.operations.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessionTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessionTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessionTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessions.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sessions/{sessionsId}:terminate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::terminate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.sessions.terminate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups/{nodeGroupsId}:repair","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.repair"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}/nodeGroups/{nodeGroupsId}:resize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resize)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.nodeGroups.resize"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:injectCredentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectCredentials)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.injectCredentials"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.getIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}:diagnose","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.diagnose"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}:start","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.start"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/clusters/{clusterName}:stop","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.stop"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs/{jobId}:cancel","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs:submit","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submit)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submit"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectId}/regions/{region}/jobs:submitAsOperation","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:submitAsOperation)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.submitAsOperation"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:injectCredentials","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::injectCredentials)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.injectCredentials"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/clusters/{clustersId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.clusters.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.jobs.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.cancel"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/operations/{operationsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.operations.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.create"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:instantiate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::instantiate)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiate"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.setIamPolicy"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.testIamPermissions"},{"hostname":"dataproc.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates:instantiateInline","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates:instantiateInline)$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.instantiateInline"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.locations.workflowTemplates.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/autoscalingPolicies/{autoscalingPoliciesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/autoscalingPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.autoscalingPolicies.update"},{"hostname":"dataproc.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/regions/{regionsId}/workflowTemplates/{workflowTemplatesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflowTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dataproc","resource_name":"dataproc.projects.regions.workflowTemplates.update"},{"hostname":"datastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectId}/indexes/{indexId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.delete"},{"hostname":"datastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.operations.delete"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.list"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/indexes/{indexId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.get"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datastore","resource_name":"datastore.projects.operations.list"},{"hostname":"datastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastore","resource_name":"datastore.projects.operations.get"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.datastore","resource_name":"datastore.projects.indexes.create"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:allocateIds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::allocateIds)$","service_name":"google.datastore","resource_name":"datastore.projects.allocateIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:beginTransaction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::beginTransaction)$","service_name":"google.datastore","resource_name":"datastore.projects.beginTransaction"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.datastore","resource_name":"datastore.projects.commit"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.datastore","resource_name":"datastore.projects.export"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.datastore","resource_name":"datastore.projects.import"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookup)$","service_name":"google.datastore","resource_name":"datastore.projects.lookup"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:reserveIds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reserveIds)$","service_name":"google.datastore","resource_name":"datastore.projects.reserveIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.datastore","resource_name":"datastore.projects.rollback"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:runAggregationQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runAggregationQuery"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}:runQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runQuery"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datastore","resource_name":"datastore.projects.operations.cancel"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.datastore","resource_name":"datastore.projects.export"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.datastore","resource_name":"datastore.projects.import"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:allocateIds","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::allocateIds)$","service_name":"google.datastore","resource_name":"datastore.projects.allocateIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:beginTransaction","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::beginTransaction)$","service_name":"google.datastore","resource_name":"datastore.projects.beginTransaction"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:commit","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.datastore","resource_name":"datastore.projects.commit"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:lookup","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookup)$","service_name":"google.datastore","resource_name":"datastore.projects.lookup"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:reserveIds","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reserveIds)$","service_name":"google.datastore","resource_name":"datastore.projects.reserveIds"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:rollback","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.datastore","resource_name":"datastore.projects.rollback"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:runAggregationQuery","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runAggregationQuery"},{"hostname":"datastore.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectId}:runQuery","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.datastore","resource_name":"datastore.projects.runQuery"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.delete"},{"hostname":"datastream.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.delete"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:fetchStaticIps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchStaticIps)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.fetchStaticIps"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes/{routesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.list"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.get"},{"hostname":"datastream.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}:fetchStaticIps","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchStaticIps)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.fetchStaticIps"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.patch"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.patch"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles/{connectionProfilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.patch"},{"hostname":"datastream.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.patch"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectionProfiles:discover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles:discover)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.discover"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.cancel"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:startBackfillJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.startBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:stopBackfillJob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.stopBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects:lookup)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.lookup"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.run"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/connectionProfiles:discover","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionProfiles:discover)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.connectionProfiles.discover"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.operations.cancel"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/routes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.privateConnections.routes.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.create"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:startBackfillJob","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.startBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}/objects/{objectsId}:stopBackfillJob","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/objects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stopBackfillJob)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.objects.stopBackfillJob"},{"hostname":"datastream.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/streams/{streamsId}:fetchErrors","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/streams/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchErrors)$","service_name":"google.datastream","resource_name":"datastream.projects.locations.streams.fetchErrors"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"DELETE","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.delete"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/manifests","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/manifests/{manifest}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/resources","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/resources/{resource}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{resource}/getIamPolicy","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.getIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/operations","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/operations/{operation}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}/types","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.listTypes"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}/types/{type}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.getType"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/types","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/alpha/projects/{project}/global/types/{type}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/manifests","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/manifests/{manifest}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/resources","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/resources/{resource}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{resource}/getIamPolicy","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.getIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/operations","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/operations/{operation}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2/projects/{project}/global/types","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/manifests","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/manifests/{manifest}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manifests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.manifests.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/resources","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/resources/{resource}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.resources.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{resource}/getIamPolicy","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.getIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/operations","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/operations/{operation}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.operations.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.get"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}/types","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.listTypes"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}/types/{type}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/types/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.getType"},{"hostname":"deploymentmanager.googleapis.com","http_method":"GET","path_template":"/deploymentmanager/v2beta/projects/{project}/global/types","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/types)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.types.list"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PATCH","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.patch"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/cancelPreview","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelPreview)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.cancelPreview"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}/stop","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.stop"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{resource}/setIamPolicy","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.setIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{resource}/testIamPermissions","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.testIamPermissions"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/cancelPreview","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelPreview)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.cancelPreview"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}/stop","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.stop"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{resource}/setIamPolicy","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.setIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{resource}/testIamPermissions","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.testIamPermissions"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/cancelPreview","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelPreview)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.cancelPreview"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}/stop","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.stop"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{resource}/setIamPolicy","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setIamPolicy)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.setIamPolicy"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{resource}/testIamPermissions","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testIamPermissions)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.testIamPermissions"},{"hostname":"deploymentmanager.googleapis.com","http_method":"POST","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders)$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.insert"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/alpha/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/alpha/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/alpha/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2beta/projects/{project}/global/compositeTypes/{compositeType}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/compositeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.compositeTypes.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2beta/projects/{project}/global/deployments/{deployment}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.deployments.update"},{"hostname":"deploymentmanager.googleapis.com","http_method":"PUT","path_template":"/deploymentmanager/v2beta/projects/{project}/global/typeProviders/{typeProvider}","path_regex":"^(?:/deploymentmanager/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/typeProviders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.deploymentmanager","resource_name":"deploymentmanager.typeProviders.update"},{"hostname":"developerconnect.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.delete"},{"hostname":"developerconnect.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks/{gitRepositoryLinksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.delete"},{"hostname":"developerconnect.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.operations.delete"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.list"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.get"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.list"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.get"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.list"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks/{gitRepositoryLinksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.get"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks/{gitRepositoryLinksId}:fetchGitRefs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchGitRefs)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.fetchGitRefs"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:fetchGitHubInstallations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchGitHubInstallations)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.fetchGitHubInstallations"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}:fetchLinkableGitRepositories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchLinkableGitRepositories)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.fetchLinkableGitRepositories"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.operations.list"},{"hostname":"developerconnect.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.operations.get"},{"hostname":"developerconnect.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.patch"},{"hostname":"developerconnect.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.create"},{"hostname":"developerconnect.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.create"},{"hostname":"developerconnect.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks/{gitRepositoryLinksId}:fetchReadToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchReadToken)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.fetchReadToken"},{"hostname":"developerconnect.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/gitRepositoryLinks/{gitRepositoryLinksId}:fetchReadWriteToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gitRepositoryLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchReadWriteToken)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.connections.gitRepositoryLinks.fetchReadWriteToken"},{"hostname":"developerconnect.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.developerconnect","resource_name":"developerconnect.projects.locations.operations.cancel"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserGroups/{advertiserGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/contentCategories/{contentCategoriesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}/creativeFieldValues/{creativeFieldValuesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/dynamicTargetingKeys/{dynamicTargetingKeysId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/eventTags/{eventTagsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities/{floodlightActivitiesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementStrategies/{placementStrategiesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRoles/{userRolesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.3/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.4/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v4/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles","path_regex":"^(?:/dfareporting/v4/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/accountUserProfiles/{accountUserProfilesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountActiveAdSummaries/{accountActiveAdSummariesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountPermissionGroups/{accountPermissionGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountPermissions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountPermissions/{accountPermissionsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accounts/{accountsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/ads/{adsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserGroups/{advertiserGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserLandingPages/{advertiserLandingPagesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertisers/{advertisersId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertisers/{advertisersId}/invoices","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserInvoices.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/billingProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingProfiles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/billingProfiles/{billingProfilesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.billingProfiles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/billingProfiles/{billingProfilesId}/billingAssignments","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAssignments)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingAssignments.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/billingProfiles/{billingProfilesId}/billingRates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingRates)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingRates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/browsers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns/{campaignsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns/{campaignsId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/changeLogs","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/changeLogs/{changeLogsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/cities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/connectionTypes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/connectionTypes/{connectionTypesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/contentCategories/{contentCategoriesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/countries","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/countries/{countriesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}/creativeFieldValues/{creativeFieldValuesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeGroups/{creativeGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creatives/{creativesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/directorySites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/directorySites/{directorySitesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/eventTags/{eventTagsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities/{floodlightActivitiesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivityGroups/{floodlightActivityGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightConfigurations/{floodlightConfigurationsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/languages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/metros","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/mobileApps","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/mobileApps/{mobileAppsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/mobileCarriers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/mobileCarriers/{mobileCarriersId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/operatingSystemVersions/{operatingSystemVersionsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/operatingSystems","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/operatingSystems/{operatingSystemsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementGroups/{placementGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementStrategies/{placementStrategiesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placements/{placementsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/platformTypes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/platformTypes/{platformTypesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/postalCodes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/postalCodes/{postalCodesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/projects","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/projects/{projectId}/inventoryItems/{inventoryItemsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/projects/{projectId}/orders/{ordersId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/projects/{projectsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/regions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingListShares/{remarketingListSharesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingLists/{remarketingListsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sites/{sitesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sizes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sizes/{sizesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/subaccounts/{subaccountsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetableRemarketingLists/{targetableRemarketingListsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetingTemplates/{targetingTemplatesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRolePermissionGroups/{userRolePermissionGroupsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRolePermissions","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRolePermissions/{userRolePermissionsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRoles/{userRolesId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/videoFormats","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"dfareporting.googleapis.com","http_method":"GET","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/videoFormats/{videoFormatsId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingListShares","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/customEvents/batchinsert","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customEvents/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.customEvents.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.5/userprofiles/{userprofilesId}/creativeAssets/{creativeAssetsId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.5/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.media.upload"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/billingProfiles/{billingProfilesId}/billingAssignments","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingAssignments)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingAssignments.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns/{campaignsId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeAssets/{creativeAssetsId}/creativeAssets","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/directorySites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placements/generatetags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sizes","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"POST","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.3/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.3/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.4/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/accounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/ads","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/advertisers","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/billingProfiles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/billingProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.billingProfiles.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/campaigns","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/contentCategories","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeFields/{creativeFieldsId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creativeGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/creatives","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/eventTags","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivities","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementGroups","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placementStrategies","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/placements","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingListShares","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/remarketingLists","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/sites","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/subaccounts","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/targetingTemplates","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"dfareporting.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v4/userprofiles/{userprofilesId}/userRoles","path_regex":"^(?:/dfareporting/v4/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets/{conversationDatasetsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/generators/{generatorsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.deleteAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.deleteContexts"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/generators/{generatorsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators/{generatorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/conversations/{conversationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.conversations.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators/{generatorsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/examples/{examplesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.examples.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.versions.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/tools/{toolsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.tools.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.delete"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/validationResult","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/agent:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/answerRecords","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationDatasets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationDatasets.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationDatasets/{conversationDatasetsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationDatasets.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}/evaluations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.evaluations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.evaluations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/generators","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.generators.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/validationResult","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/answerRecords","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets/{conversationDatasetsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}/evaluations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.evaluations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.evaluations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/encryptionSpec","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionSpec)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.getEncryptionSpec"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/generators","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/generators/{generatorsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/validationResult","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/agent:search","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/answerRecords","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/generators","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.generators.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.getAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/history","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.getHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/validationResult","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:search","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:search)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.search"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/answerRecords","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/messages","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.messages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/encryptionSpec","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionSpec)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.getEncryptionSpec"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/generators","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/generators/{generatorsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/operations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs/{changelogsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/continuousTestResults","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/continuousTestResults)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.continuousTestResults.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments/{deploymentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:lookupEnvironmentHistory","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEnvironmentHistory)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.lookupEnvironmentHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/validationResult","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generativeSettings","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generativeSettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.getGenerativeSettings"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators/{generatorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results/{resultsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:calculateCoverage","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:calculateCoverage)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.calculateCoverage"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/validationResult","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/operations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/operations","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3alpha1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/changelogs/{changelogsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changelogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.changelogs.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/conversations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.conversations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/conversations/{conversationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.conversations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/continuousTestResults","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/continuousTestResults)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.continuousTestResults.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/deployments/{deploymentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:lookupEnvironmentHistory","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEnvironmentHistory)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.lookupEnvironmentHistory"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/validationResult","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generativeSettings","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generativeSettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.getGenerativeSettings"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators/{generatorsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/examples","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.examples.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/examples/{examplesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.examples.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/versions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.versions.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.versions.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}/results/{resultsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.results.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:calculateCoverage","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:calculateCoverage)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.calculateCoverage"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/tools","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tools)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.tools.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/tools/{toolsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.tools.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/validationResult","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/validationResult)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.getValidationResult"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.get"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/operations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.list"},{"hostname":"dialogflow.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.get"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/generators/{generatorsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/fulfillment","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/fulfillment)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.updateFulfillment"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents/{intentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts/{contextsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions/{versionsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/answerRecords/{answerRecordsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answerRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.answerRecords.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/generators/{generatorsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generativeSettings","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generativeSettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.updateGenerativeSettings"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators/{generatorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages/{pagesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generativeSettings","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generativeSettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.updateGenerativeSettings"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators/{generatorsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents/{intentsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/examples/{examplesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.examples.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes/{entityTypesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/tools/{toolsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.tools.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups/{transitionRouteGroupsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks/{webhooksId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"PATCH","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings/{securitySettingsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.patch"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/intents:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:restore","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/agent:train","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationDatasets/{conversationDatasetsId}:importConversationData","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importConversationData)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationDatasets.importConversationData"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}:deploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.deploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationModels/{conversationModelsId}:undeploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationModels.undeploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestKnowledgeAssist","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestKnowledgeAssist)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestKnowledgeAssist"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/generators","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.generators.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents:batchDelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:restore","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/agent:train","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationDatasets/{conversationDatasetsId}:importConversationData","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importConversationData)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationDatasets.importConversationData"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}/evaluations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.evaluations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}:deploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.deploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationModels/{conversationModelsId}:undeploy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationModels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationModels.undeploy"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestKnowledgeAssist","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestKnowledgeAssist)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestKnowledgeAssist"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/encryptionSpec:initialize","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionSpec:initialize)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.encryptionSpec.initialize"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/generators","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:export","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/statelessSuggestion:generate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/statelessSuggestion:generate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.statelessSuggestion.generate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/suggestions:generateStatelessSummary","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:generateStatelessSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.suggestions.generateStatelessSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/suggestions:generateStatelessSummary","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:generateStatelessSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.suggestions.generateStatelessSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/intents:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:export","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:restore","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/agent:train","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/messages:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.messages.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:compile","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:compile)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.compile"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestKnowledgeAssist","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestKnowledgeAssist)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestKnowledgeAssist"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/generators","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.generators.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.setAgent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes/{entityTypesId}/entities:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.entities.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/entityTypes:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/entityTypes:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.entityTypes.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/environments/{environmentsId}/users/{usersId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.environments.users.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents:batchDelete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/intents:batchUpdate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/intents:batchUpdate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.intents.batchUpdate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/contexts","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contexts)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.contexts.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent/versions","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:export","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:restore","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/agent:train","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agent:train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agent.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:clearSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clearSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.clearSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversationProfiles/{conversationProfilesId}:setSuggestionFeatureConfig","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversationProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setSuggestionFeatureConfig)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversationProfiles.setSuggestionFeatureConfig"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/messages:batchCreate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:batchCreate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.messages.batchCreate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestArticles","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestArticles)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestArticles"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestFaqAnswers","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestFaqAnswers)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestFaqAnswers"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestKnowledgeAssist","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestKnowledgeAssist)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestKnowledgeAssist"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}/suggestions:suggestSmartReplies","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestSmartReplies)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.suggestions.suggestSmartReplies"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/participants/{participantsId}:analyzeContent","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::analyzeContent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.participants.analyzeContent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}/suggestions:suggestConversationSummary","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:suggestConversationSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.suggestions.suggestConversationSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/conversations/{conversationsId}:complete","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.conversations.complete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/encryptionSpec:initialize","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/encryptionSpec:initialize)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.encryptionSpec.initialize"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/generators","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.generators.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents/{documentsId}:reload","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reload)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.reload"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/knowledgeBases/{knowledgeBasesId}/documents:import","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/knowledgeBases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.knowledgeBases.documents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/statelessSuggestion:generate","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/statelessSuggestion:generate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.statelessSuggestion.generate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/suggestions:generateStatelessSummary","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:generateStatelessSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.suggestions.generateStatelessSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/suggestions:generateStatelessSummary","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:generateStatelessSummary)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.suggestions.generateStatelessSummary"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/suggestions:searchKnowledge","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestions:searchKnowledge)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.suggestions.searchKnowledge"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes:import","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:start","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.start"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:stop","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.stop"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:serverStreamingDetectIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingDetectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.serverStreamingDetectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:deployFlow","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployFlow)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployFlow"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:runContinuousTest","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runContinuousTest)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.runContinuousTest"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:compareVersions","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::compareVersions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.compareVersions"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:load","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::load)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.load"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:train","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:validate","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows:import","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents:import","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:serverStreamingDetectIntent","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingDetectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.serverStreamingDetectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:submitAnswerFeedback","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::submitAnswerFeedback)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.submitAnswerFeedback"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}:run","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.run"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchDelete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchRun","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchRun)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchRun"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:import","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:export","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:restore","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:validate","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3alpha1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/entityTypes:import","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.entityTypes.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:start","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.start"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/experiments/{experimentsId}:stop","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/experiments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.experiments.stop"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}/sessions/{sessionsId}:serverStreamingDetectIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingDetectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.sessions.serverStreamingDetectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:deployFlow","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deployFlow)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.deployFlow"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/environments/{environmentsId}:runContinuousTest","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runContinuousTest)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.environments.runContinuousTest"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/pages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.pages.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/transitionRouteGroups","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.transitionRouteGroups.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:compareVersions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::compareVersions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.compareVersions"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}/versions/{versionsId}:load","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::load)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.versions.load"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:train","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::train)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.train"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows/{flowsId}:validate","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/flows:import","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/flows:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.flows.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/generators","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/generators)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.generators.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/intents:import","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/intents:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.intents.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/examples","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.examples.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/playbooks/{playbooksId}/versions","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playbooks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.playbooks.versions.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}/entityTypes","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entityTypes)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.entityTypes.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:detectIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.detectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:fulfillIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fulfillIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.fulfillIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:matchIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::matchIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.matchIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:serverStreamingDetectIntent","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::serverStreamingDetectIntent)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.serverStreamingDetectIntent"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/sessions/{sessionsId}:submitAnswerFeedback","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::submitAnswerFeedback)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.sessions.submitAnswerFeedback"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases/{testCasesId}:run","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.run"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchDelete","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchDelete)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchDelete"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:batchRun","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:batchRun)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.batchRun"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/testCases:import","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases:import)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.testCases.import"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/tools","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tools)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.tools.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/tools:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tools:export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.tools.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/transitionRouteGroups","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transitionRouteGroups)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.transitionRouteGroups.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}/webhooks","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webhooks)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.webhooks.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:export","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.export"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:restore","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.restore"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/agents/{agentsId}:validate","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.agents.validate"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.operations.cancel"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/securitySettings","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securitySettings)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.locations.securitySettings.create"},{"hostname":"dialogflow.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dialogflow","resource_name":"dialogflow.projects.operations.cancel"},{"hostname":"digitalassetlinks.googleapis.com","http_method":"GET","path_template":"/v1/assetlinks:check","path_regex":"^(?:/v1/assetlinks:check)$","service_name":"google.digitalassetlinks","resource_name":"digitalassetlinks.assetlinks.check"},{"hostname":"digitalassetlinks.googleapis.com","http_method":"GET","path_template":"/v1/statements:list","path_regex":"^(?:/v1/statements:list)$","service_name":"google.digitalassetlinks","resource_name":"digitalassetlinks.statements.list"},{"hostname":"digitalassetlinks.googleapis.com","http_method":"POST","path_template":"/v1/assetlinks:bulkCheck","path_regex":"^(?:/v1/assetlinks:bulkCheck)$","service_name":"google.digitalassetlinks","resource_name":"digitalassetlinks.assetlinks.bulkCheck"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries/{sampleQueriesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries/{sampleQueriesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.delete"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataConnector/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataConnector/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataConnector.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataConnector/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataConnector/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataConnector.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.getSiteSearchEngine"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:fetchDomainVerificationStatus","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:fetchDomainVerificationStatus)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.fetchDomainVerificationStatus"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}:completeQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completeQuery"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.getSiteSearchEngine"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}:completeQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completeQuery"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/identity_mapping_stores/{identity_mapping_storesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identity_mapping_stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.identity_mapping_stores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/identity_mapping_stores/{identity_mapping_storesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identity_mapping_stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.identity_mapping_stores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/userEvents:collect","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/aclConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aclConfig)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.getAclConfig"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataConnector/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataConnector/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataConnector.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataConnector/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataConnector/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataConnector.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}/chunks","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chunks)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.chunks.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}/chunks/{chunksId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chunks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.chunks.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}:getProcessedDocument","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getProcessedDocument)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.getProcessedDocument"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/customModels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customModels)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.customModels.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/documentProcessingConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentProcessingConfig)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.getDocumentProcessingConfig"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.getSiteSearchEngine"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:fetchDomainVerificationStatus","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:fetchDomainVerificationStatus)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.fetchDomainVerificationStatus"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:getUriPatternDocumentData","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:getUriPatternDocumentData)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.getUriPatternDocumentData"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}:completeQuery","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completeQuery"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}/chunks","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chunks)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.chunks.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}/chunks/{chunksId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/chunks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.chunks.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}:getProcessedDocument","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getProcessedDocument)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.getProcessedDocument"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/documentProcessingConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentProcessingConfig)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.getDocumentProcessingConfig"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.getSiteSearchEngine"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}:completeQuery","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completeQuery"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}:listResults","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listResults)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.listResults"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/identity_mapping_stores/{identity_mapping_storesId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identity_mapping_stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.identity_mapping_stores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/identity_mapping_stores/{identity_mapping_storesId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identity_mapping_stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.identity_mapping_stores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries/{sampleQueriesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/userEvents:collect","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataConnector/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataConnector/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataConnector.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataConnector/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataConnector/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataConnector.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/customModels","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customModels)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.customModels.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.getSiteSearchEngine"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:fetchDomainVerificationStatus","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:fetchDomainVerificationStatus)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.fetchDomainVerificationStatus"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}:completeQuery","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completeQuery"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/models/{modelsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.models.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}/answers/{answersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.answers.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.getSiteSearchEngine"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:collect","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}:completeQuery","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completeQuery"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}:listResults","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listResults)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.listResults"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries/{sampleQueriesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/userEvents:collect","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.userEvents.collect"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.list"},{"hostname":"discoveryengine.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.get"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/aclConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aclConfig)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.updateAclConfig"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/documentProcessingConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentProcessingConfig)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.updateDocumentProcessingConfig"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/documentProcessingConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documentProcessingConfig)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.updateDocumentProcessingConfig"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries/{sampleQueriesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents/{documentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls/{controlsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas/{schemasId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions/{sessionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites/{targetSitesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries/{sampleQueriesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.patch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/completionSuggestions:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completionSuggestions.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/completionSuggestions:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completionSuggestions.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites:batchCreate)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.batchCreate"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:batchVerifyTargetSites","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:batchVerifyTargetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.batchVerifyTargetSites"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:disableAdvancedSiteSearch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:disableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.disableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:enableAdvancedSiteSearch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:enableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.enableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:recrawlUris","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:recrawlUris)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.recrawlUris"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.suggestionDenyListEntries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.suggestionDenyListEntries.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/completionSuggestions:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completionSuggestions.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/completionSuggestions:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completionSuggestions.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites:batchCreate)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.batchCreate"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:disableAdvancedSiteSearch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:disableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.disableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:enableAdvancedSiteSearch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:enableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.enableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:recrawlUris","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:recrawlUris)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.recrawlUris"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.suggestionDenyListEntries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.suggestionDenyListEntries.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groundingConfigs/{groundingConfigsId}:check","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groundingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.groundingConfigs.check"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/rankingConfigs/{rankingConfigsId}:rank","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rankingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rank)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.rankingConfigs.rank"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/userEvents:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:provision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provision)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.provision"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/completionSuggestions:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completionSuggestions.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/completionSuggestions:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completionSuggestions.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites:batchCreate","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites:batchCreate)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.batchCreate"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:batchVerifyTargetSites","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:batchVerifyTargetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.batchVerifyTargetSites"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:disableAdvancedSiteSearch","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:disableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.disableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:enableAdvancedSiteSearch","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:enableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.enableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:recrawlUris","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:recrawlUris)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.recrawlUris"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:setUriPatternDocumentData","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:setUriPatternDocumentData)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.setUriPatternDocumentData"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.suggestionDenyListEntries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.suggestionDenyListEntries.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}:trainCustomModel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::trainCustomModel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.trainCustomModel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}:pause","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.pause"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}:resume","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.resume"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}:tune","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.tune"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/completionSuggestions:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completionSuggestions.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/completionSuggestions:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completionSuggestions.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites:batchCreate","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites:batchCreate)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.batchCreate"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:disableAdvancedSiteSearch","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:disableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.disableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:enableAdvancedSiteSearch","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:enableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.enableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:recrawlUris","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:recrawlUris)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.recrawlUris"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.suggestionDenyListEntries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.suggestionDenyListEntries.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:purge","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/groundingConfigs/{groundingConfigsId}:check","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groundingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.groundingConfigs.check"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/rankingConfigs/{rankingConfigsId}:rank","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rankingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rank)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.rankingConfigs.rank"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/requirements:checkRequirement","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requirements:checkRequirement)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.requirements.checkRequirement"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries:import","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/userEvents:write","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}:estimateDataSize","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::estimateDataSize)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.estimateDataSize"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}:provision","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provision)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.provision"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}:reportConsentChange","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportConsentChange)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.reportConsentChange"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.documents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.branches.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/completionSuggestions:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completionSuggestions.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/completionSuggestions:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.completionSuggestions.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.schemas.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites:batchCreate","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites:batchCreate)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.targetSites.batchCreate"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:batchVerifyTargetSites","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:batchVerifyTargetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.batchVerifyTargetSites"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:disableAdvancedSiteSearch","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:disableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.disableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:enableAdvancedSiteSearch","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:enableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.enableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/siteSearchEngine:recrawlUris","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:recrawlUris)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.siteSearchEngine.recrawlUris"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.suggestionDenyListEntries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.suggestionDenyListEntries.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/dataStores/{dataStoresId}:trainCustomModel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::trainCustomModel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.dataStores.trainCustomModel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/controls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}/sessions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}:pause","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.pause"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}:resume","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.resume"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/collections/{collectionsId}/engines/{enginesId}:tune","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.collections.engines.tune"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/documents:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.documents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/branches/{branchesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.branches.operations.cancel"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/completionSuggestions:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completionSuggestions.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/completionSuggestions:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionSuggestions:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.completionSuggestions.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/controls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.controls.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/conversations/{conversationsId}:converse","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::converse)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.conversations.converse"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/schemas","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.schemas.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:answer","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::answer)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.answer"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:recommend","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::recommend)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.recommend"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.servingConfigs.search"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/sessions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.sessions.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine/targetSites:batchCreate","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine/targetSites:batchCreate)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.targetSites.batchCreate"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:disableAdvancedSiteSearch","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:disableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.disableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:enableAdvancedSiteSearch","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:enableAdvancedSiteSearch)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.enableAdvancedSiteSearch"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/siteSearchEngine:recrawlUris","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/siteSearchEngine:recrawlUris)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.siteSearchEngine.recrawlUris"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.suggestionDenyListEntries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/suggestionDenyListEntries:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suggestionDenyListEntries:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.suggestionDenyListEntries.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:purge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.purge"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/dataStores/{dataStoresId}/userEvents:write","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.dataStores.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.evaluations.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/groundingConfigs/{groundingConfigsId}:check","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groundingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.groundingConfigs.check"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/rankingConfigs/{rankingConfigsId}:rank","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rankingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rank)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.rankingConfigs.rank"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.create"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/sampleQuerySets/{sampleQuerySetsId}/sampleQueries:import","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQuerySets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sampleQueries:import)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.sampleQuerySets.sampleQueries.import"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/userEvents:write","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.locations.userEvents.write"},{"hostname":"discoveryengine.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}:provision","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::provision)$","service_name":"google.discoveryengine","resource_name":"discoveryengine.projects.provision"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations/{assignedLocationsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords/{negativeKeywordsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources/{assignedInventorySourcesId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v1/users/{usersId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations/{assignedLocationsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords/{negativeKeywordsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources/{assignedInventorySourcesId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v2/users/{usersId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertiserId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations/{assignedLocationsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords/{negativeKeywordsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources/{assignedInventorySourcesId}","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/partners/{partnerId}/channels/{channelsId}/sites/{sitesId}","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"DELETE","path_template":"/v3/users/{usersId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.delete"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/download/{downloadId}","path_regex":"^(?:/download/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.download"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers","path_regex":"^(?:/v1/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}:bulkListCampaignAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListCampaignAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.bulkListCampaignAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/channels","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/channels/{channelsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}:bulkListInsertionOrderAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListInsertionOrderAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.bulkListInsertionOrderAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/invoices","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/invoices:lookupInvoiceCurrency","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices:lookupInvoiceCurrency)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.lookupInvoiceCurrency"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}:bulkListLineItemAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListLineItemAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkListLineItemAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/locationLists/{locationListsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}:audit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::audit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.audit"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/advertisers/{advertisersId}:bulkListAdvertiserAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkListAdvertiserAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.bulkListAdvertiserAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/combinedAudiences","path_regex":"^(?:/v1/combinedAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/combinedAudiences/{combinedAudiencesId}","path_regex":"^(?:/v1/combinedAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms","path_regex":"^(?:/v1/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts/{scriptsId}","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}:uploadScript","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::uploadScript)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.uploadScript"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customLists","path_regex":"^(?:/v1/customLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/customLists/{customListsId}","path_regex":"^(?:/v1/customLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/firstAndThirdPartyAudiences","path_regex":"^(?:/v1/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v1/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/floodlightGroups/{floodlightGroupsId}","path_regex":"^(?:/v1/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/googleAudiences","path_regex":"^(?:/v1/googleAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/googleAudiences/{googleAudiencesId}","path_regex":"^(?:/v1/googleAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/guaranteedOrders","path_regex":"^(?:/v1/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v1/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySourceGroups","path_regex":"^(?:/v1/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySources","path_regex":"^(?:/v1/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v1/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners","path_regex":"^(?:/v1/partners)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/channels","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/channels/{channelsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/targetingTypes/{targetingTypesId}/targetingOptions","path_regex":"^(?:/v1/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/targetingTypes/{targetingTypesId}/targetingOptions/{targetingOptionsId}","path_regex":"^(?:/v1/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/users","path_regex":"^(?:/v1/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1beta/sdfdownloadtask/operations/{operationsId}","path_regex":"^(?:/v1beta/sdfdownloadtask/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtask.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1beta/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1beta/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1beta2/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1beta2/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v1dev/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v1dev/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers","path_regex":"^(?:/v2/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}:listAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/channels","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/channels/{channelsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}:listAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/invoices","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/invoices:lookupInvoiceCurrency","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices:lookupInvoiceCurrency)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.lookupInvoiceCurrency"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/lineItems:bulkListAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkListAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkListAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/locationLists/{locationListsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroupAds","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroupAds)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroupAds.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroupAds/{youtubeAdGroupAdsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroupAds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroupAds.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups/{youtubeAdGroupsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups/{youtubeAdGroupsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups/{youtubeAdGroupsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}/youtubeAdGroups:bulkListAdGroupAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/youtubeAdGroups:bulkListAdGroupAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.youtubeAdGroups.bulkListAdGroupAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}:audit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::audit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.audit"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/advertisers/{advertisersId}:listAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/combinedAudiences","path_regex":"^(?:/v2/combinedAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/combinedAudiences/{combinedAudiencesId}","path_regex":"^(?:/v2/combinedAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms","path_regex":"^(?:/v2/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts/{scriptsId}","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}:uploadScript","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::uploadScript)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.uploadScript"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customLists","path_regex":"^(?:/v2/customLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/customLists/{customListsId}","path_regex":"^(?:/v2/customLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/firstAndThirdPartyAudiences","path_regex":"^(?:/v2/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v2/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/floodlightGroups/{floodlightGroupsId}","path_regex":"^(?:/v2/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/floodlightGroups/{floodlightGroupsId}/floodlightActivities","path_regex":"^(?:/v2/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.floodlightActivities.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/floodlightGroups/{floodlightGroupsId}/floodlightActivities/{floodlightActivitiesId}","path_regex":"^(?:/v2/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.floodlightActivities.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/googleAudiences","path_regex":"^(?:/v2/googleAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/googleAudiences/{googleAudiencesId}","path_regex":"^(?:/v2/googleAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/guaranteedOrders","path_regex":"^(?:/v2/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v2/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySourceGroups","path_regex":"^(?:/v2/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySources","path_regex":"^(?:/v2/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v2/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners","path_regex":"^(?:/v2/partners)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/channels","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/channels/{channelsId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v2/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/targetingTypes/{targetingTypesId}/targetingOptions","path_regex":"^(?:/v2/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/targetingTypes/{targetingTypesId}/targetingOptions/{targetingOptionsId}","path_regex":"^(?:/v2/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/users","path_regex":"^(?:/v2/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v2/users/{usersId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers","path_regex":"^(?:/v3/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroupAds","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroupAds)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroupAds.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroupAds/{adGroupAdsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroupAds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroupAds.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroups","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroups/{adGroupsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroups/{adGroupsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroups.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroups/{adGroupsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroups.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/adGroups:bulkListAdGroupAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adGroups:bulkListAdGroupAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.adGroups.bulkListAdGroupAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/campaigns/{campaignsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/campaigns/{campaignsId}:listAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/channels","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/channels/{channelsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/channels/{channelsId}/sites","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}:listAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/invoices","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/invoices:lookupInvoiceCurrency","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invoices:lookupInvoiceCurrency)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.invoices.lookupInvoiceCurrency"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/lineItems:bulkListAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkListAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkListAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/locationLists/{locationListsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}:audit","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::audit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.audit"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/advertisers/{advertisersId}:listAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.listAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/combinedAudiences","path_regex":"^(?:/v3/combinedAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/combinedAudiences/{combinedAudiencesId}","path_regex":"^(?:/v3/combinedAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.combinedAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms","path_regex":"^(?:/v3/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}/rules","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.rules.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}/rules/{rulesId}","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.rules.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts/{scriptsId}","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}:uploadRules","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::uploadRules)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.uploadRules"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}:uploadScript","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::uploadScript)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.uploadScript"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customLists","path_regex":"^(?:/v3/customLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/customLists/{customListsId}","path_regex":"^(?:/v3/customLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customLists.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/firstAndThirdPartyAudiences","path_regex":"^(?:/v3/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v3/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/floodlightGroups/{floodlightGroupsId}","path_regex":"^(?:/v3/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/floodlightGroups/{floodlightGroupsId}/floodlightActivities","path_regex":"^(?:/v3/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.floodlightActivities.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/floodlightGroups/{floodlightGroupsId}/floodlightActivities/{floodlightActivitiesId}","path_regex":"^(?:/v3/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.floodlightActivities.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/googleAudiences","path_regex":"^(?:/v3/googleAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/googleAudiences/{googleAudiencesId}","path_regex":"^(?:/v3/googleAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.googleAudiences.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/guaranteedOrders","path_regex":"^(?:/v3/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v3/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/inventorySourceGroups","path_regex":"^(?:/v3/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupsId}","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/inventorySources","path_regex":"^(?:/v3/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v3/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners","path_regex":"^(?:/v3/partners)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners/{partnersId}","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners/{partnersId}/channels","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners/{partnersId}/channels/{channelsId}","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners/{partnersId}/channels/{channelsId}/sites","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions/{assignedTargetingOptionsId}","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v3/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/targetingTypes/{targetingTypesId}/targetingOptions","path_regex":"^(?:/v3/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/targetingTypes/{targetingTypesId}/targetingOptions/{targetingOptionsId}","path_regex":"^(?:/v3/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/users","path_regex":"^(?:/v3/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.list"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v3/users/{usersId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.get"},{"hostname":"displayvideo.googleapis.com","http_method":"GET","path_template":"/v4/sdfdownloadtasks/operations/{operationsId}","path_regex":"^(?:/v4/sdfdownloadtasks/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.operations.get"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/channels/{channelId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/locationLists/{locationListId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListId}","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v1/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/floodlightGroups/{floodlightGroupId}","path_regex":"^(?:/v1/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v1/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupId}","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v1/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/partners/{partnersId}/channels/{channelId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v1/users/{usersId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/channels/{channelId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/locationLists/{locationListId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListId}","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v2/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/floodlightGroups/{floodlightGroupId}","path_regex":"^(?:/v2/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v2/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupId}","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v2/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/partners/{partnersId}/channels/{channelId}","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v2/users/{usersId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/campaigns/{campaignsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/channels/{channelId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/creatives/{creativesId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/locationLists/{locationListId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/advertisers/{advertisersId}/negativeKeywordLists/{negativeKeywordListId}","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}","path_regex":"^(?:/v3/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/floodlightGroups/{floodlightGroupId}","path_regex":"^(?:/v3/floodlightGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.floodlightGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/guaranteedOrders/{guaranteedOrdersId}","path_regex":"^(?:/v3/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupId}","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/inventorySources/{inventorySourcesId}","path_regex":"^(?:/v3/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/partners/{partnersId}/channels/{channelId}","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"PATCH","path_template":"/v3/users/{usersId}","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.users.patch"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/media/{mediaId}","path_regex":"^(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/media/{mediaId}","path_regex":"^(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/media/{mediaId}","path_regex":"^(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/media/{mediaId}","path_regex":"^(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.displayvideo","resource_name":"displayvideo.media.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers","path_regex":"^(?:/v1/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/locationLists/{locationListsId}/assignedLocations:bulkEdit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:bulkEdit","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:replace","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/assets","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.assets.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/channels","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems/{lineItemsId}:bulkEditLineItemAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditLineItemAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkEditLineItemAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/lineItems:generateDefault","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:generateDefault)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.generateDefault"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:activate","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.activate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:deactivate","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.deactivate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/advertisers/{advertisersId}:bulkEditAdvertiserAssignedTargetingOptions","path_regex":"^(?:/v1/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAdvertiserAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.bulkEditAdvertiserAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/customBiddingAlgorithms","path_regex":"^(?:/v1/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v1/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/firstAndThirdPartyAudiences","path_regex":"^(?:/v1/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}:editCustomerMatchMembers","path_regex":"^(?:/v1/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editCustomerMatchMembers)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.editCustomerMatchMembers"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/guaranteedOrders","path_regex":"^(?:/v1/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/guaranteedOrders/{guaranteedOrdersId}:editGuaranteedOrderReadAccessors","path_regex":"^(?:/v1/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editGuaranteedOrderReadAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.editGuaranteedOrderReadAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySourceGroups","path_regex":"^(?:/v1/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources:bulkEdit","path_regex":"^(?:/v1/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySources","path_regex":"^(?:/v1/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/inventorySources/{inventorySourcesId}:editInventorySourceReadWriteAccessors","path_regex":"^(?:/v1/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editInventorySourceReadWriteAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.editInventorySourceReadWriteAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnerId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/channels","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}:bulkEditPartnerAssignedTargetingOptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditPartnerAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.bulkEditPartnerAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/sdfdownloadtasks","path_regex":"^(?:/v1/sdfdownloadtasks)$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/targetingTypes/{targetingTypesId}/targetingOptions:search","path_regex":"^(?:/v1/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions:search)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.search"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/users","path_regex":"^(?:/v1/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}:bulkEditAssignedUserRoles","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAssignedUserRoles)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.bulkEditAssignedUserRoles"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers","path_regex":"^(?:/v2/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/locationLists/{locationListsId}/assignedLocations:bulkEdit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:bulkEdit","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:replace","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/assets","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.assets.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/channels","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems/{lineItemsId}:duplicate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::duplicate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.duplicate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems:bulkEditAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkEditAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkEditAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems:bulkUpdate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkUpdate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkUpdate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/lineItems:generateDefault","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:generateDefault)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.generateDefault"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/manualTriggers","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:activate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.activate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/manualTriggers/{manualTriggersId}:deactivate","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/manualTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.manualTriggers.deactivate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/advertisers/{advertisersId}:editAssignedTargetingOptions","path_regex":"^(?:/v2/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.editAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/customBiddingAlgorithms","path_regex":"^(?:/v2/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v2/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/firstAndThirdPartyAudiences","path_regex":"^(?:/v2/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}:editCustomerMatchMembers","path_regex":"^(?:/v2/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editCustomerMatchMembers)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.editCustomerMatchMembers"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/guaranteedOrders","path_regex":"^(?:/v2/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/guaranteedOrders/{guaranteedOrdersId}:editGuaranteedOrderReadAccessors","path_regex":"^(?:/v2/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editGuaranteedOrderReadAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.editGuaranteedOrderReadAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySourceGroups","path_regex":"^(?:/v2/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources:bulkEdit","path_regex":"^(?:/v2/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySources","path_regex":"^(?:/v2/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/inventorySources/{inventorySourcesId}:editInventorySourceReadWriteAccessors","path_regex":"^(?:/v2/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editInventorySourceReadWriteAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.editInventorySourceReadWriteAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnerId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnersId}/channels","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/partners/{partnersId}:editAssignedTargetingOptions","path_regex":"^(?:/v2/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.editAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/sdfdownloadtasks","path_regex":"^(?:/v2/sdfdownloadtasks)$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/targetingTypes/{targetingTypesId}/targetingOptions:search","path_regex":"^(?:/v2/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions:search)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.search"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/users","path_regex":"^(?:/v2/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v2/users/{usersId}:bulkEditAssignedUserRoles","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAssignedUserRoles)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.bulkEditAssignedUserRoles"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers","path_regex":"^(?:/v3/advertisers)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/channels/{channelsId}/sites","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/locationLists/{locationListId}/assignedLocations","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/locationLists/{locationListsId}/assignedLocations:bulkEdit","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedLocations:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.assignedLocations.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:bulkEdit","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertiserId}/negativeKeywordLists/{negativeKeywordListsId}/negativeKeywords:replace","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywords:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.negativeKeywords.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/assets","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.assets.upload"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/campaigns","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.campaigns.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/channels","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/creatives","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.creatives.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/insertionOrders","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/insertionOrders/{insertionOrdersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insertionOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.insertionOrders.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/lineItems","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/lineItems/{lineItemsId}:duplicate","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::duplicate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.duplicate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/lineItems:bulkEditAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkEditAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkEditAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/lineItems:bulkUpdate","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:bulkUpdate)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.bulkUpdate"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/lineItems:generateDefault","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lineItems:generateDefault)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.lineItems.generateDefault"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/locationLists","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locationLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.locationLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/negativeKeywordLists","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/negativeKeywordLists)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.negativeKeywordLists.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/advertisers/{advertisersId}:editAssignedTargetingOptions","path_regex":"^(?:/v3/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.advertisers.editAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/customBiddingAlgorithms","path_regex":"^(?:/v3/customBiddingAlgorithms)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}/rules","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.rules.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/customBiddingAlgorithms/{customBiddingAlgorithmsId}/scripts","path_regex":"^(?:/v3/customBiddingAlgorithms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scripts)$","service_name":"google.displayvideo","resource_name":"displayvideo.customBiddingAlgorithms.scripts.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/firstAndThirdPartyAudiences","path_regex":"^(?:/v3/firstAndThirdPartyAudiences)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/firstAndThirdPartyAudiences/{firstAndThirdPartyAudiencesId}:editCustomerMatchMembers","path_regex":"^(?:/v3/firstAndThirdPartyAudiences/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editCustomerMatchMembers)$","service_name":"google.displayvideo","resource_name":"displayvideo.firstAndThirdPartyAudiences.editCustomerMatchMembers"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/guaranteedOrders","path_regex":"^(?:/v3/guaranteedOrders)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/guaranteedOrders/{guaranteedOrdersId}:editGuaranteedOrderReadAccessors","path_regex":"^(?:/v3/guaranteedOrders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editGuaranteedOrderReadAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.guaranteedOrders.editGuaranteedOrderReadAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/inventorySourceGroups","path_regex":"^(?:/v3/inventorySourceGroups)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/inventorySourceGroups/{inventorySourceGroupsId}/assignedInventorySources:bulkEdit","path_regex":"^(?:/v3/inventorySourceGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedInventorySources:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySourceGroups.assignedInventorySources.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/inventorySources","path_regex":"^(?:/v3/inventorySources)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/inventorySources/{inventorySourcesId}:editInventorySourceReadWriteAccessors","path_regex":"^(?:/v3/inventorySources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editInventorySourceReadWriteAccessors)$","service_name":"google.displayvideo","resource_name":"displayvideo.inventorySources.editInventorySourceReadWriteAccessors"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/partners/{partnerId}/channels/{channelsId}/sites","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/partners/{partnerId}/channels/{channelsId}/sites:bulkEdit","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:bulkEdit)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.bulkEdit"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/partners/{partnerId}/channels/{channelsId}/sites:replace","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites:replace)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.sites.replace"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/partners/{partnersId}/channels","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.channels.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/partners/{partnersId}/targetingTypes/{targetingTypesId}/assignedTargetingOptions","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.targetingTypes.assignedTargetingOptions.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/partners/{partnersId}:editAssignedTargetingOptions","path_regex":"^(?:/v3/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::editAssignedTargetingOptions)$","service_name":"google.displayvideo","resource_name":"displayvideo.partners.editAssignedTargetingOptions"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/sdfdownloadtasks","path_regex":"^(?:/v3/sdfdownloadtasks)$","service_name":"google.displayvideo","resource_name":"displayvideo.sdfdownloadtasks.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/targetingTypes/{targetingTypesId}/targetingOptions:search","path_regex":"^(?:/v3/targetingTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingOptions:search)$","service_name":"google.displayvideo","resource_name":"displayvideo.targetingTypes.targetingOptions.search"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/users","path_regex":"^(?:/v3/users)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.create"},{"hostname":"displayvideo.googleapis.com","http_method":"POST","path_template":"/v3/users/{usersId}:bulkEditAssignedUserRoles","path_regex":"^(?:/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkEditAssignedUserRoles)$","service_name":"google.displayvideo","resource_name":"displayvideo.users.bulkEditAssignedUserRoles"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.connections.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/discoveryConfigs/{discoveryConfigsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.discoveryConfigs.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/fileStoreDataProfiles/{fileStoreDataProfilesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fileStoreDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.fileStoreDataProfiles.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/tableDataProfiles/{tableDataProfilesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tableDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.tableDataProfiles.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.connections.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/discoveryConfigs/{discoveryConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.discoveryConfigs.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/fileStoreDataProfiles/{fileStoreDataProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fileStoreDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.fileStoreDataProfiles.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/tableDataProfiles/{tableDataProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tableDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.tableDataProfiles.delete"},{"hostname":"dlp.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.delete"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/infoTypes","path_regex":"^(?:/v2/infoTypes)$","service_name":"google.dlp","resource_name":"dlp.infoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/locations/{locationsId}/infoTypes","path_regex":"^(?:/v2/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/infoTypes)$","service_name":"google.dlp","resource_name":"dlp.locations.infoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/columnDataProfiles","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columnDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.columnDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/columnDataProfiles/{columnDataProfilesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columnDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.columnDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/connections","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.connections.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.connections.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/connections:search","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections:search)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.connections.search"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/discoveryConfigs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.discoveryConfigs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/discoveryConfigs/{discoveryConfigsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.discoveryConfigs.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/dlpJobs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.dlpJobs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/fileStoreDataProfiles","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fileStoreDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.fileStoreDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/fileStoreDataProfiles/{fileStoreDataProfilesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fileStoreDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.fileStoreDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/projectDataProfiles","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.projectDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/projectDataProfiles/{projectDataProfilesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.projectDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/tableDataProfiles","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tableDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.tableDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/tableDataProfiles/{tableDataProfilesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tableDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.tableDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/columnDataProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columnDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.columnDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/columnDataProfiles/{columnDataProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columnDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.columnDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.connections.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.connections.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections:search)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.connections.search"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/discoveryConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.discoveryConfigs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/discoveryConfigs/{discoveryConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.discoveryConfigs.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/fileStoreDataProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fileStoreDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.fileStoreDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/fileStoreDataProfiles/{fileStoreDataProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fileStoreDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.fileStoreDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/projectDataProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.projectDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/projectDataProfiles/{projectDataProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projectDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.projectDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/tableDataProfiles","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tableDataProfiles)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.tableDataProfiles.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/tableDataProfiles/{tableDataProfilesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tableDataProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.tableDataProfiles.get"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.list"},{"hostname":"dlp.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.get"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.connections.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/discoveryConfigs/{discoveryConfigsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.discoveryConfigs.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.connections.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates/{deidentifyTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/discoveryConfigs/{discoveryConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.discoveryConfigs.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates/{inspectTemplatesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/storedInfoTypes/{storedInfoTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.patch"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/connections","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.connections.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/discoveryConfigs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.discoveryConfigs.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.jobTriggers.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.locations.storedInfoTypes.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/storedInfoTypes","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.organizations.storedInfoTypes.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/content:deidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:deidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.content.deidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/content:inspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:inspect)$","service_name":"google.dlp","resource_name":"dlp.projects.content.inspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/content:reidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:reidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.content.reidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/dlpJobs/{dlpJobsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dlp","resource_name":"dlp.projects.dlpJobs.cancel"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/image:redact","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/image:redact)$","service_name":"google.dlp","resource_name":"dlp.projects.image.redact"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/jobTriggers/{jobTriggersId}:activate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.dlp","resource_name":"dlp.projects.jobTriggers.activate"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.connections.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/content:deidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:deidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.content.deidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/content:inspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:inspect)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.content.inspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/content:reidentify","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content:reidentify)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.content.reidentify"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/deidentifyTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deidentifyTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.deidentifyTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/discoveryConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryConfigs)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.discoveryConfigs.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.cancel"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}:finish","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finish)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.finish"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/dlpJobs/{dlpJobsId}:hybridInspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dlpJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::hybridInspect)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.dlpJobs.hybridInspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/image:redact","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/image:redact)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.image.redact"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/inspectTemplates","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inspectTemplates)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.inspectTemplates.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}:activate","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.activate"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobTriggers/{jobTriggersId}:hybridInspect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTriggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::hybridInspect)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.jobTriggers.hybridInspect"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.locations.storedInfoTypes.create"},{"hostname":"dlp.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/storedInfoTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storedInfoTypes)$","service_name":"google.dlp","resource_name":"dlp.projects.storedInfoTypes.create"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.delete"},{"hostname":"dns.googleapis.com","http_method":"DELETE","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.delete"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/policies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/policies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/policies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.projects.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/changes/{changeId}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.changes.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/dnsKeys","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys)$","service_name":"google.dns","resource_name":"dns.dnsKeys.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/dnsKeys/{dnsKeyId}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.dnsKeys.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/operations","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/operations/{operation}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZoneOperations.get"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/policies","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.list"},{"hostname":"dns.googleapis.com","http_method":"GET","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.get"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets/{name}/{type}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.patch"},{"hostname":"dns.googleapis.com","http_method":"PATCH","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.patch"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{projectsId}/managedZones/{managedZonesId}:getIamPolicy","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.getIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{projectsId}/managedZones/{managedZonesId}:setIamPolicy","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.setIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{projectsId}/managedZones/{managedZonesId}:testIamPermissions","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dns","resource_name":"dns.managedZones.testIamPermissions"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/managedZones","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/policies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{projectsId}/managedZones/{managedZonesId}:getIamPolicy","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.getIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{projectsId}/managedZones/{managedZonesId}:setIamPolicy","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.dns","resource_name":"dns.managedZones.setIamPolicy"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{projectsId}/managedZones/{managedZonesId}:testIamPermissions","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.dns","resource_name":"dns.managedZones.testIamPermissions"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/managedZones","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/policies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/responsePolicies","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}/rrsets","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rrsets)$","service_name":"google.dns","resource_name":"dns.resourceRecordSets.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/policies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies)$","service_name":"google.dns","resource_name":"dns.responsePolicies.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2beta1/projects/{project}/managedZones","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones)$","service_name":"google.dns","resource_name":"dns.managedZones.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}/changes","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changes)$","service_name":"google.dns","resource_name":"dns.changes.create"},{"hostname":"dns.googleapis.com","http_method":"POST","path_template":"/dns/v2beta1/projects/{project}/policies","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.dns","resource_name":"dns.policies.create"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v1beta2/projects/{project}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/policies/{policy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicies.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2/projects/{project}/locations/{location}/responsePolicies/{responsePolicy}/rules/{responsePolicyRule}","path_regex":"^(?:/dns/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responsePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.responsePolicyRules.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2beta1/projects/{project}/managedZones/{managedZone}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.managedZones.update"},{"hostname":"dns.googleapis.com","http_method":"PUT","path_template":"/dns/v2beta1/projects/{project}/policies/{policy}","path_regex":"^(?:/dns/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dns","resource_name":"dns.policies.update"},{"hostname":"docs.googleapis.com","http_method":"GET","path_template":"/v1/documents/{documentId}","path_regex":"^(?:/v1/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.docs","resource_name":"docs.documents.get"},{"hostname":"docs.googleapis.com","http_method":"POST","path_template":"/v1/documents","path_regex":"^(?:/v1/documents)$","service_name":"google.docs","resource_name":"docs.documents.create"},{"hostname":"docs.googleapis.com","http_method":"POST","path_template":"/v1/documents/{documentId}:batchUpdate","path_regex":"^(?:/v1/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.docs","resource_name":"docs.documents.batchUpdate"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.operations.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.delete"},{"hostname":"documentai.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.delete"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processorTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processorTypes/{processorTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:fetchProcessorTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchProcessorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.fetchProcessorTypes"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processorTypes","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processorTypes/{processorTypesId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processorTypes.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset/datasetSchema","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset/datasetSchema)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.dataset.getDatasetSchema"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset:getDocument","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset:getDocument)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.dataset.getDocument"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.list"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluations.get"},{"hostname":"documentai.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}:fetchProcessorTypes","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchProcessorTypes)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.fetchProcessorTypes"},{"hostname":"documentai.googleapis.com","http_method":"PATCH","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.updateDataset"},{"hostname":"documentai.googleapis.com","http_method":"PATCH","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset/datasetSchema","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset/datasetSchema)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.dataset.updateDatasetSchema"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.cancel"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.create"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/humanReviewConfig:reviewDocument","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/humanReviewConfig:reviewDocument)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.humanReviewConfig.reviewDocument"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:batchProcess","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:deploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.deploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:evaluateProcessorVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluateProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:process","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:undeploy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.undeploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions:train","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions:train)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.train"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:batchProcess","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.disable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.enable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:process","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:setDefaultProcessorVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.setDefaultProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/documents:batchProcess","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.documents.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/documents:process","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:process)$","service_name":"google.documentai","resource_name":"documentai.projects.documents.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/documents:batchProcess","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.documents.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/documents:process","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.documents.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.operations.cancel"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.create"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset:batchDeleteDocuments","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset:batchDeleteDocuments)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.dataset.batchDeleteDocuments"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset:importDocuments","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset:importDocuments)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.dataset.importDocuments"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/dataset:listDocuments","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset:listDocuments)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.dataset.listDocuments"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/humanReviewConfig:reviewDocument","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/humanReviewConfig:reviewDocument)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.humanReviewConfig.reviewDocument"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:batchProcess","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:deploy","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.deploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:evaluateProcessorVersion","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.evaluateProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:process","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions/{processorVersionsId}:undeploy","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeploy)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.undeploy"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions:importProcessorVersion","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions:importProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.importProcessorVersion"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}/processorVersions:train","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processorVersions:train)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.processorVersions.train"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:batchProcess","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchProcess)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.batchProcess"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:disable","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.disable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:enable","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.enable"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:process","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::process)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.process"},{"hostname":"documentai.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/locations/{locationsId}/processors/{processorsId}:setDefaultProcessorVersion","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/processors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultProcessorVersion)$","service_name":"google.documentai","resource_name":"documentai.projects.locations.processors.setDefaultProcessorVersion"},{"hostname":"domains.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.delete"},{"hostname":"domains.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.delete"},{"hostname":"domains.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.delete"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.domains","resource_name":"domains.projects.locations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.getIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveAuthorizationCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveGoogleDomainsDnsRecords","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveGoogleDomainsDnsRecords)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveGoogleDomainsDnsRecords"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveGoogleDomainsForwardingConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveGoogleDomainsForwardingConfig)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveGoogleDomainsForwardingConfig"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveImportableDomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveImportableDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveImportableDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveRegisterParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveRegisterParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveRegisterParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveTransferParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveTransferParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveTransferParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:searchDomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:searchDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.searchDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.domains","resource_name":"domains.projects.locations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.getIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveAuthorizationCode","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveGoogleDomainsDnsRecords","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveGoogleDomainsDnsRecords)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveGoogleDomainsDnsRecords"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveGoogleDomainsForwardingConfig","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveGoogleDomainsForwardingConfig)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveGoogleDomainsForwardingConfig"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:retrieveImportableDomains","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveImportableDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveImportableDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:retrieveRegisterParameters","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveRegisterParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveRegisterParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:retrieveTransferParameters","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveTransferParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveTransferParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:searchDomains","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:searchDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.searchDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.domains","resource_name":"domains.projects.locations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.operations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.list"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.get"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.getIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveAuthorizationCode","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveGoogleDomainsDnsRecords","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveGoogleDomainsDnsRecords)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveGoogleDomainsDnsRecords"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:retrieveGoogleDomainsForwardingConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveGoogleDomainsForwardingConfig)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveGoogleDomainsForwardingConfig"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveImportableDomains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveImportableDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveImportableDomains"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveRegisterParameters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveRegisterParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveRegisterParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:retrieveTransferParameters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:retrieveTransferParameters)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.retrieveTransferParameters"},{"hostname":"domains.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:searchDomains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:searchDomains)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.searchDomains"},{"hostname":"domains.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.patch"},{"hostname":"domains.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.patch"},{"hostname":"domains.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.patch"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureContactSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureContactSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureContactSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureDnsSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureDnsSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureDnsSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureManagementSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureManagementSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureManagementSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.export"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:initiatePushTransfer","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initiatePushTransfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.initiatePushTransfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:renewDomain","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renewDomain)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.renewDomain"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:resetAuthorizationCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.resetAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.setIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.testIamPermissions"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:import)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.import"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:register","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:register)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.register"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/registrations:transfer","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:transfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.transfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureContactSettings","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureContactSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureContactSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureDnsSettings","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureDnsSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureDnsSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureManagementSettings","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureManagementSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureManagementSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:export","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.export"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:initiatePushTransfer","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initiatePushTransfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.initiatePushTransfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:renewDomain","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renewDomain)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.renewDomain"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:resetAuthorizationCode","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.resetAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.setIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.testIamPermissions"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:import","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:import)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.import"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:register","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:register)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.register"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/registrations:transfer","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:transfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.transfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureContactSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureContactSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureContactSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureDnsSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureDnsSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureDnsSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:configureManagementSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureManagementSettings)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.configureManagementSettings"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.export"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:initiatePushTransfer","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initiatePushTransfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.initiatePushTransfer"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:renewDomain","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renewDomain)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.renewDomain"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:resetAuthorizationCode","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAuthorizationCode)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.resetAuthorizationCode"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.setIamPolicy"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations/{registrationsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.testIamPermissions"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:import)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.import"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:register","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:register)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.register"},{"hostname":"domains.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/registrations:transfer","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/registrations:transfer)$","service_name":"google.domains","resource_name":"domains.projects.locations.registrations.transfer"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/autnum/{autnumId}","path_regex":"^(?:/v1/autnum/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.autnum.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/domain/{domainId}","path_regex":"^(?:/v1/domain/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.domain.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/domains","path_regex":"^(?:/v1/domains)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getDomains"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/entities","path_regex":"^(?:/v1/entities)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getEntities"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/entity/{entityId}","path_regex":"^(?:/v1/entity/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.entity.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/help","path_regex":"^(?:/v1/help)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getHelp"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/ip","path_regex":"^(?:/v1/ip)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getIp"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/ip/{ipId}/{ipId1}","path_regex":"^(?:/v1/ip/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.ip.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/nameserver/{nameserverId}","path_regex":"^(?:/v1/nameserver/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.domainsrdap","resource_name":"domainsrdap.nameserver.get"},{"hostname":"domainsrdap.googleapis.com","http_method":"GET","path_template":"/v1/nameservers","path_regex":"^(?:/v1/nameservers)$","service_name":"google.domainsrdap","resource_name":"domainsrdap.getNameservers"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"DELETE","path_template":"/doubleclickbidmanager/v1.1/query/{queryId}","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.deletequery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"DELETE","path_template":"/v2/queries/{queryId}","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.delete"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/doubleclickbidmanager/v1.1/queries","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/queries)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.listqueries"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/doubleclickbidmanager/v1.1/queries/{queryId}/reports","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.reports.listreports"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/doubleclickbidmanager/v1.1/query/{queryId}","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.getquery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries","path_regex":"^(?:/v2/queries)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.list"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries/{queryId}","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.get"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries/{queryId}/reports","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.reports.list"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"GET","path_template":"/v2/queries/{queryId}/reports/{reportId}","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.reports.get"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/doubleclickbidmanager/v1.1/query","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.createquery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/doubleclickbidmanager/v1.1/query/{queryId}","path_regex":"^(?:/doubleclickbidmanager/v1\\.1/query/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.runquery"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/v2/queries","path_regex":"^(?:/v2/queries)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.create"},{"hostname":"doubleclickbidmanager.googleapis.com","http_method":"POST","path_template":"/v2/queries/{queryId}:run","path_regex":"^(?:/v2/queries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.doubleclickbidmanager","resource_name":"doubleclickbidmanager.queries.run"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/agency/{agencyId}/advertiser/{advertiserId}/engine/{engineAccountId}/conversion","path_regex":"^(?:/doubleclicksearch/v2/agency/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/engine/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.get"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/agency/{agencyId}/advertiser/{advertiserId}/idmapping","path_regex":"^(?:/doubleclicksearch/v2/agency/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/idmapping)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.getIdMappingFile"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/agency/{agencyId}/advertiser/{advertiserId}/savedcolumns","path_regex":"^(?:/doubleclicksearch/v2/agency/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiser/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedcolumns)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.savedColumns.list"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/customer/{customerId}/conversion","path_regex":"^(?:/doubleclicksearch/v2/customer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.getByCustomerId"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/reports/{reportId}","path_regex":"^(?:/doubleclicksearch/v2/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.get"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"GET","path_template":"/doubleclicksearch/v2/reports/{reportId}/files/{reportFragment}","path_regex":"^(?:/doubleclicksearch/v2/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.getFile"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/conversion","path_regex":"^(?:/doubleclicksearch/v2/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.insert"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/conversion/updateAvailability","path_regex":"^(?:/doubleclicksearch/v2/conversion/updateAvailability)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.updateAvailability"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/reports","path_regex":"^(?:/doubleclicksearch/v2/reports)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.request"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"POST","path_template":"/doubleclicksearch/v2/reports/generate","path_regex":"^(?:/doubleclicksearch/v2/reports/generate)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.reports.generate"},{"hostname":"doubleclicksearch.googleapis.com","http_method":"PUT","path_template":"/doubleclicksearch/v2/conversion","path_regex":"^(?:/doubleclicksearch/v2/conversion)$","service_name":"google.doubleclicksearch","resource_name":"doubleclicksearch.conversion.update"},{"hostname":"driveactivity.googleapis.com","http_method":"POST","path_template":"/v2/activity:query","path_regex":"^(?:/v2/activity:query)$","service_name":"google.driveactivity","resource_name":"driveactivity.activity.query"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2/labels/{labelsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2/labels/{labelsId}/permissions/{permissionsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions/{permissionsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2beta/labels/{labelsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2beta/labels/{labelsId}/permissions/{permissionsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"DELETE","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions/{permissionsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.delete"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels","path_regex":"^(?:/v2/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.get"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/locks","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/locks","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/limits/label","path_regex":"^(?:/v2/limits/label)$","service_name":"google.drivelabels","resource_name":"drivelabels.limits.getLabel"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2/users/{usersId}/capabilities","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capabilities)$","service_name":"google.drivelabels","resource_name":"drivelabels.users.getCapabilities"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels","path_regex":"^(?:/v2beta/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.get"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/locks","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/locks","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locks)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.locks.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.list"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/limits/label","path_regex":"^(?:/v2beta/limits/label)$","service_name":"google.drivelabels","resource_name":"drivelabels.limits.getLabel"},{"hostname":"drivelabels.googleapis.com","http_method":"GET","path_template":"/v2beta/users/{usersId}/capabilities","path_regex":"^(?:/v2beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capabilities)$","service_name":"google.drivelabels","resource_name":"drivelabels.users.getCapabilities"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2/labels/{labelsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2beta/labels/{labelsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"PATCH","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.updatePermissions"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels","path_regex":"^(?:/v2/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/permissions:batchDelete","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/permissions:batchUpdate","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions:batchDelete","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}/revisions/{revisionsId}/permissions:batchUpdate","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:delta","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delta)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delta"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:disable","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.disable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:enable","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.enable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:publish","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.publish"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2/labels/{labelsId}:updateLabelCopyMode","path_regex":"^(?:/v2/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateLabelCopyMode)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updateLabelCopyMode"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels","path_regex":"^(?:/v2beta/labels)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/permissions:batchDelete","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/permissions:batchUpdate","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.create"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions:batchDelete","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchDelete"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}/revisions/{revisionsId}/permissions:batchUpdate","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchUpdate)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.revisions.permissions.batchUpdate"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:delta","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::delta)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.delta"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:disable","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.disable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:enable","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.enable"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:publish","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.publish"},{"hostname":"drivelabels.googleapis.com","http_method":"POST","path_template":"/v2beta/labels/{labelsId}:updateLabelCopyMode","path_regex":"^(?:/v2beta/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateLabelCopyMode)$","service_name":"google.drivelabels","resource_name":"drivelabels.labels.updateLabelCopyMode"},{"hostname":"essentialcontacts.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/contacts/{contactsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.delete"},{"hostname":"essentialcontacts.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/contacts/{contactsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.delete"},{"hostname":"essentialcontacts.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/contacts/{contactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.delete"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/contacts","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.list"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/contacts/{contactsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.get"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/contacts:compute","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:compute)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.compute"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/contacts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.list"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/contacts/{contactsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.get"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/contacts:compute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:compute)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.compute"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/contacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.list"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/contacts/{contactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.get"},{"hostname":"essentialcontacts.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/contacts:compute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:compute)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.compute"},{"hostname":"essentialcontacts.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/contacts/{contactsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.patch"},{"hostname":"essentialcontacts.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/contacts/{contactsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.patch"},{"hostname":"essentialcontacts.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/contacts/{contactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.patch"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/contacts","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.create"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/contacts:sendTestMessage","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:sendTestMessage)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.folders.contacts.sendTestMessage"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/contacts","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.create"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/contacts:sendTestMessage","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:sendTestMessage)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.organizations.contacts.sendTestMessage"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/contacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.create"},{"hostname":"essentialcontacts.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/contacts:sendTestMessage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contacts:sendTestMessage)$","service_name":"google.essentialcontacts","resource_name":"essentialcontacts.projects.contacts.sendTestMessage"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.delete"},{"hostname":"eventarc.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.delete"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/googleChannelConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleChannelConfig)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.getGoogleChannelConfig"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.providers.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.providers.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.list"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.get"},{"hostname":"eventarc.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.getIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.patch"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/googleChannelConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/googleChannelConfig)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.updateGoogleChannelConfig"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.patch"},{"hostname":"eventarc.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.patch"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channelConnections/{channelConnectionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channelConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channelConnections.testIamPermissions"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/channels/{channelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.channels.testIamPermissions"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.cancel"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.testIamPermissions"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.operations.cancel"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.create"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.setIamPolicy"},{"hostname":"eventarc.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/triggers/{triggersId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.eventarc","resource_name":"eventarc.projects.locations.triggers.testIamPermissions"},{"hostname":"factchecktools.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/pages/{pagesId}","path_regex":"^(?:/v1alpha1/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.delete"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/claims:imageSearch","path_regex":"^(?:/v1alpha1/claims:imageSearch)$","service_name":"google.factchecktools","resource_name":"factchecktools.claims.imageSearch"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/claims:search","path_regex":"^(?:/v1alpha1/claims:search)$","service_name":"google.factchecktools","resource_name":"factchecktools.claims.search"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/pages","path_regex":"^(?:/v1alpha1/pages)$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.list"},{"hostname":"factchecktools.googleapis.com","http_method":"GET","path_template":"/v1alpha1/pages/{pagesId}","path_regex":"^(?:/v1alpha1/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.get"},{"hostname":"factchecktools.googleapis.com","http_method":"POST","path_template":"/v1alpha1/pages","path_regex":"^(?:/v1alpha1/pages)$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.create"},{"hostname":"factchecktools.googleapis.com","http_method":"PUT","path_template":"/v1alpha1/pages/{pagesId}","path_regex":"^(?:/v1alpha1/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.factchecktools","resource_name":"factchecktools.pages.update"},{"hostname":"fcm.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/messages:send","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:send)$","service_name":"google.fcm","resource_name":"fcm.projects.messages.send"},{"hostname":"fcmdata.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/deliveryData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deliveryData)$","service_name":"google.fcmdata","resource_name":"fcmdata.projects.androidApps.deliveryData.list"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares/{sharesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.delete"},{"hostname":"file.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.delete"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.file","resource_name":"file.projects.locations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.file","resource_name":"file.projects.locations.operations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.file","resource_name":"file.projects.locations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares)$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares/{sharesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.get"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.file","resource_name":"file.projects.locations.operations.list"},{"hostname":"file.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.operations.get"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.backups.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares/{sharesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.patch"},{"hostname":"file.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.patch"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:promoteReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promoteReplica)$","service_name":"google.file","resource_name":"file.projects.locations.instances.promoteReplica"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.file","resource_name":"file.projects.locations.instances.restore"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:revert","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.file","resource_name":"file.projects.locations.instances.revert"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.file","resource_name":"file.projects.locations.operations.cancel"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.file","resource_name":"file.projects.locations.backups.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.file","resource_name":"file.projects.locations.instances.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/shares","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shares)$","service_name":"google.file","resource_name":"file.projects.locations.instances.shares.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/snapshots","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.file","resource_name":"file.projects.locations.instances.snapshots.create"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:promoteReplica","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::promoteReplica)$","service_name":"google.file","resource_name":"file.projects.locations.instances.promoteReplica"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restore","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.file","resource_name":"file.projects.locations.instances.restore"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:revert","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.file","resource_name":"file.projects.locations.instances.revert"},{"hostname":"file.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.file","resource_name":"file.projects.locations.operations.cancel"},{"hostname":"firebase.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/sha/{shaId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sha/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.sha.delete"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/availableProjects","path_regex":"^(?:/v1beta1/availableProjects)$","service_name":"google.firebase","resource_name":"firebase.availableProjects.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.operations.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects","path_regex":"^(?:/v1beta1/projects)$","service_name":"google.firebase","resource_name":"firebase.projects.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/adminSdkConfig","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminSdkConfig)$","service_name":"google.firebase","resource_name":"firebase.projects.getAdminSdkConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/analyticsDetails","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyticsDetails)$","service_name":"google.firebase","resource_name":"firebase.projects.getAnalyticsDetails"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.getConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/sha","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sha)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.sha.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/availableLocations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/availableLocations)$","service_name":"google.firebase","resource_name":"firebase.projects.availableLocations.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/iosApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.getConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/webApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.list"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.get"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.getConfig"},{"hostname":"firebase.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}:searchApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchApps)$","service_name":"google.firebase","resource_name":"firebase.projects.searchApps"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.patch"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.patch"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.patch"},{"hostname":"firebase.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.patch"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}/sha","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sha)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.sha.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}:remove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.remove"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/androidApps/{androidAppsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/androidApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebase","resource_name":"firebase.projects.androidApps.undelete"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/defaultLocation:finalize","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultLocation:finalize)$","service_name":"google.firebase","resource_name":"firebase.projects.defaultLocation.finalize"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/iosApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}:remove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.remove"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/iosApps/{iosAppsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iosApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebase","resource_name":"firebase.projects.iosApps.undelete"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/webApps","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.create"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}:remove","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::remove)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.remove"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/webApps/{webAppsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebase","resource_name":"firebase.projects.webApps.undelete"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:addFirebase","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFirebase)$","service_name":"google.firebase","resource_name":"firebase.projects.addFirebase"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:addGoogleAnalytics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addGoogleAnalytics)$","service_name":"google.firebase","resource_name":"firebase.projects.addGoogleAnalytics"},{"hostname":"firebase.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}:removeAnalytics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeAnalytics)$","service_name":"google.firebase","resource_name":"firebase.projects.removeAnalytics"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.delete"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/services/{servicesId}/resourcePolicies/{resourcePoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.delete"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.delete"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}/resourcePolicies/{resourcePoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.delete"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/jwks","path_regex":"^(?:/v1/jwks)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.jwks.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/appAttestConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/appAttestConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/deviceCheckConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/deviceCheckConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/playIntegrityConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/playIntegrityConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/recaptchaEnterpriseConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaEnterpriseConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/recaptchaV3Config:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaV3Config:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/-/safetyNetConfig:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/safetyNetConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services/{servicesId}/resourcePolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services/{servicesId}/resourcePolicies/{resourcePoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/jwks","path_regex":"^(?:/v1beta/jwks)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.jwks.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/appAttestConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/appAttestConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/deviceCheckConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/deviceCheckConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/playIntegrityConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/playIntegrityConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/recaptchaConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/recaptchaEnterpriseConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaEnterpriseConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/recaptchaV3Config:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/recaptchaV3Config:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/-/safetyNetConfig:batchGet","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/-/safetyNetConfig:batchGet)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.batchGet"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/services","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}/resourcePolicies","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.list"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}/resourcePolicies/{resourcePoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.get"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/services/{servicesId}/resourcePolicies/{resourcePoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/appAttestConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appAttestConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.appAttestConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens/{debugTokensId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/deviceCheckConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceCheckConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.deviceCheckConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/playIntegrityConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/playIntegrityConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.playIntegrityConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaEnterpriseConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaEnterpriseConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaEnterpriseConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/recaptchaV3Config","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recaptchaV3Config)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.recaptchaV3Config.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/safetyNetConfig","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/safetyNetConfig)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.safetyNetConfig.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}/resourcePolicies/{resourcePoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.patch"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/oauthClients/{oauthClientsId}:exchangeAppAttestAssertion","path_regex":"^(?:/v1/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAssertion)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.exchangeAppAttestAssertion"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/oauthClients/{oauthClientsId}:exchangeAppAttestAttestation","path_regex":"^(?:/v1/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAttestation)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.exchangeAppAttestAttestation"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/oauthClients/{oauthClientsId}:exchangeDebugToken","path_regex":"^(?:/v1/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDebugToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.exchangeDebugToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/oauthClients/{oauthClientsId}:generateAppAttestChallenge","path_regex":"^(?:/v1/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAppAttestChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.generateAppAttestChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.create"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAssertion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAssertion)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAssertion"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAttestation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAttestation)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAttestation"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeCustomToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeCustomToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeCustomToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeDebugToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDebugToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDebugToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeDeviceCheckToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDeviceCheckToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDeviceCheckToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangePlayIntegrityToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangePlayIntegrityToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangePlayIntegrityToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaEnterpriseToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaEnterpriseToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaEnterpriseToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaV3Token","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaV3Token)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaV3Token"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:exchangeSafetyNetToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeSafetyNetToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeSafetyNetToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:generateAppAttestChallenge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAppAttestChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generateAppAttestChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}:generatePlayIntegrityChallenge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePlayIntegrityChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generatePlayIntegrityChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services/{servicesId}/resourcePolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.create"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services/{servicesId}/resourcePolicies:batchUpdate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies:batchUpdate)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.batchUpdate"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services:batchUpdate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchUpdate)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.batchUpdate"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/oauthClients/{oauthClientsId}:exchangeAppAttestAssertion","path_regex":"^(?:/v1beta/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAssertion)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.exchangeAppAttestAssertion"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/oauthClients/{oauthClientsId}:exchangeAppAttestAttestation","path_regex":"^(?:/v1beta/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAttestation)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.exchangeAppAttestAttestation"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/oauthClients/{oauthClientsId}:exchangeDebugToken","path_regex":"^(?:/v1beta/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDebugToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.exchangeDebugToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/oauthClients/{oauthClientsId}:generateAppAttestChallenge","path_regex":"^(?:/v1beta/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAppAttestChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.oauthClients.generateAppAttestChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}/debugTokens","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/debugTokens)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.debugTokens.create"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAssertion","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAssertion)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAssertion"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeAppAttestAttestation","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeAppAttestAttestation)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeAppAttestAttestation"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeCustomToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeCustomToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeCustomToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeDebugToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDebugToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDebugToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeDeviceCheckToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeDeviceCheckToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeDeviceCheckToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangePlayIntegrityToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangePlayIntegrityToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangePlayIntegrityToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaEnterpriseToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaEnterpriseToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaEnterpriseToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeRecaptchaV3Token","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeRecaptchaV3Token)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeRecaptchaV3Token"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:exchangeSafetyNetToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exchangeSafetyNetToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.exchangeSafetyNetToken"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:generateAppAttestChallenge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAppAttestChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generateAppAttestChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/apps/{appsId}:generatePlayIntegrityChallenge","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generatePlayIntegrityChallenge)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.apps.generatePlayIntegrityChallenge"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}/resourcePolicies","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.create"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/services/{servicesId}/resourcePolicies:batchUpdate","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourcePolicies:batchUpdate)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.resourcePolicies.batchUpdate"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/services:batchUpdate","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchUpdate)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.services.batchUpdate"},{"hostname":"firebaseappcheck.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}:verifyAppCheckToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verifyAppCheckToken)$","service_name":"google.firebaseappcheck","resource_name":"firebaseappcheck.projects.verifyAppCheckToken"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/feedbackReports/{feedbackReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.feedbackReports.delete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.delete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.delete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/aabInfo","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/aabInfo)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.getAabInfo"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/feedbackReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackReports)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.feedbackReports.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/feedbackReports/{feedbackReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/feedbackReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.feedbackReports.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/testers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{mobilesdkAppId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{mobilesdkAppId}/jwt","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jwt)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.getJwt"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{mobilesdkAppId}/release_by_hash/{uploadHash}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/release_by_hash/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.release_by_hash.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{mobilesdkAppId}/testers:getTesterUdids","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers:getTesterUdids)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.testers.getTesterUdids"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/apps/{mobilesdkAppId}/upload_status/{uploadToken}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/upload_status/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.upload_status.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/tests","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tests)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.tests.list"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/tests/{testsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.tests.get"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/apps/{appsId}/testConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testConfig)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.getTestConfig"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/testers:udids","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers:udids)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.getUdids"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.patch"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.patch"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/testers/{testersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.patch"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/apps/{appsId}/testConfig","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testConfig)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.updateTestConfig"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.cancel"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.operations.wait"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases/{releasesId}:distribute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::distribute)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.distribute"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases:batchDelete)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.batchDelete"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/apps/{appsId}/releases:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases:upload)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.media.upload"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.create"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/groups/{groupsId}:batchJoin","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchJoin)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.batchJoin"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/groups/{groupsId}:batchLeave","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchLeave)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.groups.batchLeave"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/testers:batchAdd","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers:batchAdd)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.batchAdd"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/testers:batchRemove","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testers:batchRemove)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.testers.batchRemove"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{mobilesdkAppId}","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.provisionApp"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{mobilesdkAppId}/releases/{releaseId}/enable_access","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/enable_access)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.releases.enable_access"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1alpha/apps/{mobilesdkAppId}/releases/{releaseId}/notes","path_regex":"^(?:/v1alpha/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.apps.releases.notes.create"},{"hostname":"firebaseappdistribution.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/apps/{appsId}/releases/{releasesId}/tests","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tests)$","service_name":"google.firebaseappdistribution","resource_name":"firebaseappdistribution.projects.apps.releases.tests.create"},{"hostname":"firebasedatabase.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.delete"},{"hostname":"firebasedatabase.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.list"},{"hostname":"firebasedatabase.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.get"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.create"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:disable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.disable"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reenable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reenable)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.reenable"},{"hostname":"firebasedatabase.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:undelete","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebasedatabase","resource_name":"firebasedatabase.projects.locations.instances.undelete"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"GET","path_template":"/v1/{dynamicLink}/linkStats","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/linkStats)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.getLinkStats"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/installAttribution","path_regex":"^(?:/v1/installAttribution)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.installAttribution"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/managedShortLinks:create","path_regex":"^(?:/v1/managedShortLinks:create)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.managedShortLinks.create"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/reopenAttribution","path_regex":"^(?:/v1/reopenAttribution)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.reopenAttribution"},{"hostname":"firebasedynamiclinks.googleapis.com","http_method":"POST","path_template":"/v1/shortLinks","path_regex":"^(?:/v1/shortLinks)$","service_name":"google.firebasedynamiclinks","resource_name":"firebasedynamiclinks.shortLinks.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.operations.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.operations.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.delete"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.operations.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.operations.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.getConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.operations.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.operations.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}/files","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.files.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.getConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.releases.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/releases/{releasesId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.releases.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.get"},{"hostname":"firebasehosting.googleapis.com","http_method":"GET","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}/files","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.files.list"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.updateConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/sites/{sitesId}/config","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.updateConfig"},{"hostname":"firebasehosting.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.patch"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.operations.cancel"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.operations.cancel"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.channels.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/customDomains/{customDomainsId}:undelete","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.customDomains.undelete"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions/{versionsId}:populateFiles","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::populateFiles)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.populateFiles"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/versions:clone","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:clone)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.versions.clone"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/channels","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/channels/{channelsId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.channels.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/domains","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/releases","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.releases.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/versions","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.create"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/versions/{versionsId}:populateFiles","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::populateFiles)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.populateFiles"},{"hostname":"firebasehosting.googleapis.com","http_method":"POST","path_template":"/v1beta1/sites/{sitesId}/versions:clone","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:clone)$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.versions.clone"},{"hostname":"firebasehosting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.projects.sites.domains.update"},{"hostname":"firebasehosting.googleapis.com","http_method":"PUT","path_template":"/v1beta1/sites/{sitesId}/domains/{domainsId}","path_regex":"^(?:/v1beta1/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasehosting","resource_name":"firebasehosting.sites.domains.update"},{"hostname":"firebaseml.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.operations.delete"},{"hostname":"firebaseml.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.delete"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.firebaseml","resource_name":"firebaseml.operations.list"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/models","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.list"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.get"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}:download","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.download"},{"hostname":"firebaseml.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.operations.get"},{"hostname":"firebaseml.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.patch"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firebaseml","resource_name":"firebaseml.operations.cancel"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/models","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.models.create"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:countTokens","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::countTokens)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.locations.publishers.models.countTokens"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:generateContent","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateContent)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.locations.publishers.models.generateContent"},{"hostname":"firebaseml.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/publishers/{publishersId}/models/{modelsId}:streamGenerateContent","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publishers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamGenerateContent)$","service_name":"google.firebaseml","resource_name":"firebaseml.projects.locations.publishers.models.streamGenerateContent"},{"hostname":"firebaseremoteconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/remoteConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remoteConfig)$","service_name":"google.firebaseremoteconfig","resource_name":"firebaseremoteconfig.projects.getRemoteConfig"},{"hostname":"firebaseremoteconfig.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/remoteConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remoteConfig)$","service_name":"google.firebaseremoteconfig","resource_name":"firebaseremoteconfig.projects.updateRemoteConfig"},{"hostname":"firebaserules.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.delete"},{"hostname":"firebaserules.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/rulesets/{rulesetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.delete"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.list"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.get"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/releases/{releasesId}:getExecutable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getExecutable)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.getExecutable"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/rulesets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.list"},{"hostname":"firebaserules.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/rulesets/{rulesetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.get"},{"hostname":"firebaserules.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/releases/{releasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.patch"},{"hostname":"firebaserules.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/releases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.releases.create"},{"hostname":"firebaserules.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/rulesets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rulesets)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.rulesets.create"},{"hostname":"firebaserules.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:test","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::test)$","service_name":"google.firebaserules","resource_name":"firebaserules.projects.test"},{"hostname":"firebasestorage.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/buckets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.list"},{"hostname":"firebasestorage.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/buckets/{bucketsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.get"},{"hostname":"firebasestorage.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/buckets/{bucketsId}:addFirebase","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFirebase)$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.addFirebase"},{"hostname":"firebasestorage.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/buckets/{bucketsId}:removeFirebase","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFirebase)$","service_name":"google.firebasestorage","resource_name":"firebasestorage.projects.buckets.removeFirebase"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.backupSchedules.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.locations.backups.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.delete"},{"hostname":"firestore.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.delete"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/backupSchedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.backupSchedules.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.backupSchedules.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{collectionId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listDocuments"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}/{collectionId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.firestore","resource_name":"firestore.projects.locations.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.locations.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.firestore","resource_name":"firestore.projects.locations.backups.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.locations.backups.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{collectionId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listDocuments"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}/{collectionId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes/{indexesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.get"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.list"},{"hostname":"firestore.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes/{indexesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.get"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.backupSchedules.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.patch"},{"hostname":"firestore.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/fields/{fieldsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.fields.patch"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/backupSchedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.backupSchedules.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{collectionId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.createDocument"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:listCollectionIds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listCollectionIds)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listCollectionIds"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:partitionQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.partitionQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runAggregationQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runAggregationQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchGet)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchGet"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:batchWrite","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchWrite)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchWrite"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:beginTransaction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:beginTransaction)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.beginTransaction"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:commit)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.commit"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:listen","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:listen)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listen"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:rollback)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.rollback"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/documents:write","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:write)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.write"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.operations.cancel"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}:bulkDeleteDocuments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::bulkDeleteDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.bulkDeleteDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}:exportDocuments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.exportDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases/{databasesId}:importDocuments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.importDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/databases:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases:restore)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.restore"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{collectionId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.createDocument"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:listCollectionIds","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listCollectionIds)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listCollectionIds"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:partitionQuery","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.partitionQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runAggregationQuery","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runAggregationQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runAggregationQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents/{documentsId}/{documentsId1}:runQuery","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::runQuery)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.runQuery"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:batchGet","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchGet)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchGet"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:batchWrite","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:batchWrite)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.batchWrite"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:beginTransaction","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:beginTransaction)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.beginTransaction"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:commit","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:commit)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.commit"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:listen","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:listen)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.listen"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:rollback)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.rollback"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/documents:write","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/documents:write)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.documents.write"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}/indexes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.indexes.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}:exportDocuments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.exportDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/databases/{databasesId}:importDocuments","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.importDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}/collectionGroups/{collectionGroupsId}/indexes","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.collectionGroups.indexes.create"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}:exportDocuments","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.exportDocuments"},{"hostname":"firestore.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/databases/{databasesId}:importDocuments","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importDocuments)$","service_name":"google.firestore","resource_name":"firestore.projects.databases.importDocuments"},{"hostname":"fitness.googleapis.com","http_method":"DELETE","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.delete"},{"hostname":"fitness.googleapis.com","http_method":"DELETE","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/datasets/{datasetId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.datasets.delete"},{"hostname":"fitness.googleapis.com","http_method":"DELETE","path_template":"/fitness/v1/users/{userId}/sessions/{sessionId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.sessions.delete"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.list"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.get"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/dataPointChanges","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataPointChanges)$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.dataPointChanges.list"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/datasets/{datasetId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.datasets.get"},{"hostname":"fitness.googleapis.com","http_method":"GET","path_template":"/fitness/v1/users/{userId}/sessions","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.fitness","resource_name":"fitness.users.sessions.list"},{"hostname":"fitness.googleapis.com","http_method":"PATCH","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}/datasets/{datasetId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.datasets.patch"},{"hostname":"fitness.googleapis.com","http_method":"POST","path_template":"/fitness/v1/users/{userId}/dataSources","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.create"},{"hostname":"fitness.googleapis.com","http_method":"POST","path_template":"/fitness/v1/users/{userId}/dataset:aggregate","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataset:aggregate)$","service_name":"google.fitness","resource_name":"fitness.users.dataset.aggregate"},{"hostname":"fitness.googleapis.com","http_method":"PUT","path_template":"/fitness/v1/users/{userId}/dataSources/{dataSourceId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.dataSources.update"},{"hostname":"fitness.googleapis.com","http_method":"PUT","path_template":"/fitness/v1/users/{userId}/sessions/{sessionId}","path_regex":"^(?:/fitness/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fitness","resource_name":"fitness.users.sessions.update"},{"hostname":"forms.googleapis.com","http_method":"DELETE","path_template":"/v1/forms/{formId}/watches/{watchId}","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.forms","resource_name":"forms.forms.watches.delete"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.forms","resource_name":"forms.forms.get"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}/responses","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responses)$","service_name":"google.forms","resource_name":"forms.forms.responses.list"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}/responses/{responseId}","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/responses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.forms","resource_name":"forms.forms.responses.get"},{"hostname":"forms.googleapis.com","http_method":"GET","path_template":"/v1/forms/{formId}/watches","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches)$","service_name":"google.forms","resource_name":"forms.forms.watches.list"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms","path_regex":"^(?:/v1/forms)$","service_name":"google.forms","resource_name":"forms.forms.create"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms/{formId}/watches","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches)$","service_name":"google.forms","resource_name":"forms.forms.watches.create"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms/{formId}/watches/{watchId}:renew","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::renew)$","service_name":"google.forms","resource_name":"forms.forms.watches.renew"},{"hostname":"forms.googleapis.com","http_method":"POST","path_template":"/v1/forms/{formId}:batchUpdate","path_regex":"^(?:/v1/forms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.forms","resource_name":"forms.forms.batchUpdate"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/achievements","path_regex":"^(?:/games/v1/achievements)$","service_name":"google.games","resource_name":"games.achievementDefinitions.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/applications/{applicationId}","path_regex":"^(?:/games/v1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.applications.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/applications/{applicationId}/verify","path_regex":"^(?:/games/v1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verify)$","service_name":"google.games","resource_name":"games.applications.verify"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/eventDefinitions","path_regex":"^(?:/games/v1/eventDefinitions)$","service_name":"google.games","resource_name":"games.events.listDefinitions"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/events","path_regex":"^(?:/games/v1/events)$","service_name":"google.games","resource_name":"games.events.listByPlayer"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards","path_regex":"^(?:/games/v1/leaderboards)$","service_name":"google.games","resource_name":"games.leaderboards.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.leaderboards.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards/{leaderboardId}/scores/{collection}","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.scores.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/leaderboards/{leaderboardId}/window/{collection}","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/window/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.scores.listWindow"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/metagameConfig","path_regex":"^(?:/games/v1/metagameConfig)$","service_name":"google.games","resource_name":"games.metagame.getMetagameConfig"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/me/multipleApplicationPlayerIds","path_regex":"^(?:/games/v1/players/me/multipleApplicationPlayerIds)$","service_name":"google.games","resource_name":"games.players.getMultipleApplicationPlayerIds"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/me/players/{collection}","path_regex":"^(?:/games/v1/players/me/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.players.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/me/scopedIds","path_regex":"^(?:/games/v1/players/me/scopedIds)$","service_name":"google.games","resource_name":"games.players.getScopedPlayerIds"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.players.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/achievements","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/achievements)$","service_name":"google.games","resource_name":"games.achievements.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/categories/{collection}","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/categories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.metagame.listCategoriesByPlayer"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/leaderboards/{leaderboardId}/scores/{timeSpan}","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.scores.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/players/{playerId}/snapshots","path_regex":"^(?:/games/v1/players/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.games","resource_name":"games.snapshots.list"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/recall/developerGamesLastPlayerToken/{sessionId}","path_regex":"^(?:/games/v1/recall/developerGamesLastPlayerToken/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.recall.lastTokenFromAllDeveloperGames"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/recall/gamesPlayerTokens/{sessionId}","path_regex":"^(?:/games/v1/recall/gamesPlayerTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.recall.gamesPlayerTokens"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/recall/tokens/{sessionId}","path_regex":"^(?:/games/v1/recall/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.recall.retrieveTokens"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/revisions/check","path_regex":"^(?:/games/v1/revisions/check)$","service_name":"google.games","resource_name":"games.revisions.check"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/snapshots/{snapshotId}","path_regex":"^(?:/games/v1/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.games","resource_name":"games.snapshots.get"},{"hostname":"games.googleapis.com","http_method":"GET","path_template":"/games/v1/stats","path_regex":"^(?:/games/v1/stats)$","service_name":"google.games","resource_name":"games.stats.get"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/accesstokens/generatePlayGroupingApiToken","path_regex":"^(?:/games/v1/accesstokens/generatePlayGroupingApiToken)$","service_name":"google.games","resource_name":"games.accesstokens.generatePlayGroupingApiToken"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/accesstokens/generateRecallPlayGroupingApiToken","path_regex":"^(?:/games/v1/accesstokens/generateRecallPlayGroupingApiToken)$","service_name":"google.games","resource_name":"games.accesstokens.generateRecallPlayGroupingApiToken"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/updateMultiple","path_regex":"^(?:/games/v1/achievements/updateMultiple)$","service_name":"google.games","resource_name":"games.achievements.updateMultiple"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/increment","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/increment)$","service_name":"google.games","resource_name":"games.achievements.increment"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/reveal","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reveal)$","service_name":"google.games","resource_name":"games.achievements.reveal"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/setStepsAtLeast","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setStepsAtLeast)$","service_name":"google.games","resource_name":"games.achievements.setStepsAtLeast"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/achievements/{achievementId}/unlock","path_regex":"^(?:/games/v1/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unlock)$","service_name":"google.games","resource_name":"games.achievements.unlock"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/applications/getEndPoint","path_regex":"^(?:/games/v1/applications/getEndPoint)$","service_name":"google.games","resource_name":"games.applications.getEndPoint"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/applications/played","path_regex":"^(?:/games/v1/applications/played)$","service_name":"google.games","resource_name":"games.applications.played"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/events","path_regex":"^(?:/games/v1/events)$","service_name":"google.games","resource_name":"games.events.record"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/leaderboards/scores","path_regex":"^(?:/games/v1/leaderboards/scores)$","service_name":"google.games","resource_name":"games.scores.submitMultiple"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/leaderboards/{leaderboardId}/scores","path_regex":"^(?:/games/v1/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores)$","service_name":"google.games","resource_name":"games.scores.submit"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/recall:linkPersona","path_regex":"^(?:/games/v1/recall:linkPersona)$","service_name":"google.games","resource_name":"games.recall.linkPersona"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/recall:resetPersona","path_regex":"^(?:/games/v1/recall:resetPersona)$","service_name":"google.games","resource_name":"games.recall.resetPersona"},{"hostname":"games.googleapis.com","http_method":"POST","path_template":"/games/v1/recall:unlinkPersona","path_regex":"^(?:/games/v1/recall:unlinkPersona)$","service_name":"google.games","resource_name":"games.recall.unlinkPersona"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"DELETE","path_template":"/games/v1configuration/achievements/{achievementId}","path_regex":"^(?:/games/v1configuration/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.delete"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"DELETE","path_template":"/games/v1configuration/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1configuration/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.delete"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/achievements/{achievementId}","path_regex":"^(?:/games/v1configuration/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.get"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/applications/{applicationId}/achievements","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/achievements)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.list"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/applications/{applicationId}/leaderboards","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leaderboards)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.list"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"GET","path_template":"/games/v1configuration/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1configuration/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.get"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"POST","path_template":"/games/v1configuration/applications/{applicationId}/achievements","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/achievements)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.insert"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"POST","path_template":"/games/v1configuration/applications/{applicationId}/leaderboards","path_regex":"^(?:/games/v1configuration/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leaderboards)$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.insert"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"PUT","path_template":"/games/v1configuration/achievements/{achievementId}","path_regex":"^(?:/games/v1configuration/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.achievementConfigurations.update"},{"hostname":"gamesconfiguration.googleapis.com","http_method":"PUT","path_template":"/games/v1configuration/leaderboards/{leaderboardId}","path_regex":"^(?:/games/v1configuration/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesConfiguration","resource_name":"gamesConfiguration.leaderboardConfigurations.update"},{"hostname":"gameservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.delete"},{"hostname":"gameservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.delete"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.get"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.getIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.get"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.get"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.getIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.list"},{"hostname":"gameservices.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.get"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.setIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.testIamPermissions"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.cancel"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.setIamPolicy"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/gameServerDeployments/{gameServerDeploymentsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gameServerDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.gameServerDeployments.testIamPermissions"},{"hostname":"gameservices.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gameservices","resource_name":"gameservices.projects.locations.operations.cancel"},{"hostname":"gamesmanagement.googleapis.com","http_method":"DELETE","path_template":"/games/v1management/applications/{applicationId}/players/hidden/{playerId}","path_regex":"^(?:/games/v1management/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/players/hidden/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesManagement","resource_name":"gamesManagement.players.unhide"},{"hostname":"gamesmanagement.googleapis.com","http_method":"GET","path_template":"/games/v1management/applications/{applicationId}/players/hidden","path_regex":"^(?:/games/v1management/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/players/hidden)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.applications.listHidden"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/reset","path_regex":"^(?:/games/v1management/achievements/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetAll"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/resetAllForAllPlayers","path_regex":"^(?:/games/v1management/achievements/resetAllForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetAllForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/resetMultipleForAllPlayers","path_regex":"^(?:/games/v1management/achievements/resetMultipleForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetMultipleForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/{achievementId}/reset","path_regex":"^(?:/games/v1management/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.reset"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/achievements/{achievementId}/resetForAllPlayers","path_regex":"^(?:/games/v1management/achievements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.achievements.resetForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/applications/{applicationId}/players/hidden/{playerId}","path_regex":"^(?:/games/v1management/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/players/hidden/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gamesManagement","resource_name":"gamesManagement.players.hide"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/reset","path_regex":"^(?:/games/v1management/events/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetAll"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/resetAllForAllPlayers","path_regex":"^(?:/games/v1management/events/resetAllForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetAllForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/resetMultipleForAllPlayers","path_regex":"^(?:/games/v1management/events/resetMultipleForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetMultipleForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/{eventId}/reset","path_regex":"^(?:/games/v1management/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.reset"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/events/{eventId}/resetForAllPlayers","path_regex":"^(?:/games/v1management/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.events.resetForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/leaderboards/{leaderboardId}/scores/reset","path_regex":"^(?:/games/v1management/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.reset"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/leaderboards/{leaderboardId}/scores/resetForAllPlayers","path_regex":"^(?:/games/v1management/leaderboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scores/resetForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/scores/reset","path_regex":"^(?:/games/v1management/scores/reset)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetAll"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/scores/resetAllForAllPlayers","path_regex":"^(?:/games/v1management/scores/resetAllForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetAllForAllPlayers"},{"hostname":"gamesmanagement.googleapis.com","http_method":"POST","path_template":"/games/v1management/scores/resetMultipleForAllPlayers","path_regex":"^(?:/games/v1management/scores/resetMultipleForAllPlayers)$","service_name":"google.gamesManagement","resource_name":"gamesManagement.scores.resetMultipleForAllPlayers"},{"hostname":"genomics.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/pipelines/{pipelineId}","path_regex":"^(?:/v1alpha2/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.pipelines.delete"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/operations","path_regex":"^(?:/v1alpha2/operations)$","service_name":"google.genomics","resource_name":"genomics.operations.list"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/operations/{operationsId}","path_regex":"^(?:/v1alpha2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.operations.get"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/pipelines","path_regex":"^(?:/v1alpha2/pipelines)$","service_name":"google.genomics","resource_name":"genomics.pipelines.list"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/pipelines/{pipelineId}","path_regex":"^(?:/v1alpha2/pipelines/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.pipelines.get"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v1alpha2/pipelines:getControllerConfig","path_regex":"^(?:/v1alpha2/pipelines:getControllerConfig)$","service_name":"google.genomics","resource_name":"genomics.pipelines.getControllerConfig"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/operations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.genomics","resource_name":"genomics.projects.operations.list"},{"hostname":"genomics.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.genomics","resource_name":"genomics.projects.operations.get"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v1alpha2/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.genomics","resource_name":"genomics.operations.cancel"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v1alpha2/pipelines","path_regex":"^(?:/v1alpha2/pipelines)$","service_name":"google.genomics","resource_name":"genomics.pipelines.create"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v1alpha2/pipelines:run","path_regex":"^(?:/v1alpha2/pipelines:run)$","service_name":"google.genomics","resource_name":"genomics.pipelines.run"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/pipelines:run","path_regex":"^(?:/v2alpha1/pipelines:run)$","service_name":"google.genomics","resource_name":"genomics.pipelines.run"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.genomics","resource_name":"genomics.projects.operations.cancel"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/workers/{workersId}:checkIn","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkIn)$","service_name":"google.genomics","resource_name":"genomics.projects.workers.checkIn"},{"hostname":"genomics.googleapis.com","http_method":"POST","path_template":"/v2alpha1/workers/{id}:checkIn","path_regex":"^(?:/v2alpha1/workers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkIn)$","service_name":"google.genomics","resource_name":"genomics.workers.checkIn"},{"hostname":"genomics.googleapis.com","http_method":"PUT","path_template":"/v1alpha2/pipelines:setOperationStatus","path_regex":"^(?:/v1alpha2/pipelines:setOperationStatus)$","service_name":"google.genomics","resource_name":"genomics.pipelines.setOperationStatus"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.delete"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:getBackupIndexDownloadUrl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getBackupIndexDownloadUrl)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.getBackupIndexDownloadUrl"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.list"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.get"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.getIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.patch"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}/volumeBackups/{volumeBackupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeBackups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.volumeBackups.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.backups.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/backupPlans/{backupPlansId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupPlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.backupPlans.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.operations.cancel"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.create"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}/volumeRestores/{volumeRestoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/volumeRestores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.volumeRestores.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}/restores/{restoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.restores.testIamPermissions"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.setIamPolicy"},{"hostname":"gkebackup.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/restorePlans/{restorePlansId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restorePlans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkebackup","resource_name":"gkebackup.projects.locations.restorePlans.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.delete"},{"hostname":"gkehub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.delete"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.organizations.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:listMemberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listMemberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.listMemberships"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes:listPermitted","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes:listPermitted)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.listPermitted"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.organizations.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships:listAdmin","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:listAdmin)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.listAdmin"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:listMemberships","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listMemberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.listMemberships"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes:listPermitted","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes:listPermitted)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.listPermitted"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.organizations.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:listMemberships","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listMemberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.listMemberships"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes:listPermitted","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes:listPermitted)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.listPermitted"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateConnectManifest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateConnectManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateConnectManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:generateExclusivityManifest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateExclusivityManifest)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.generateExclusivityManifest"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.getIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships:validateExclusivity","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:validateExclusivity)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.validateExclusivity"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.get"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.list"},{"hostname":"gkehub.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.get"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets/{fleetsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings/{bindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings/{rbacrolebindingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.patch"},{"hostname":"gkehub.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.patch"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings:generateMembershipRBACRoleBindingYAML","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings:generateMembershipRBACRoleBindingYAML)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.generateMembershipRBACRoleBindingYAML"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings:generateMembershipRBACRoleBindingYAML","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings:generateMembershipRBACRoleBindingYAML)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.generateMembershipRBACRoleBindingYAML"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/memberships:validateCreate","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships:validateCreate)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.validateCreate"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/global/memberships:initializeHub","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/memberships:initializeHub)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.global.memberships.initializeHub"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/features/{featuresId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/features/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.features.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/fleets","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fleets)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.fleets.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/bindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.bindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}/rbacrolebindings:generateMembershipRBACRoleBindingYAML","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings:generateMembershipRBACRoleBindingYAML)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.rbacrolebindings.generateMembershipRBACRoleBindingYAML"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/namespaces","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.namespaces.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}/rbacrolebindings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rbacrolebindings)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.rbacrolebindings.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/scopes/{scopesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.scopes.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.create"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.setIamPolicy"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/memberships/{membershipsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.memberships.testIamPermissions"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkehub.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkehub","resource_name":"gkehub.projects.locations.operations.cancel"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}:unenroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.unenroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.delete"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.delete"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}:unenroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.unenroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}:unenroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.unenroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.operations.delete"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}:unenroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.unenroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.delete"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.delete"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}:unenroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.unenroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}:unenroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unenroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.unenroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.getIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.getIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.getIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.getIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.operations.list"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.operations.get"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.getIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.getIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.patch"},{"hostname":"gkeonprem.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.patch"},{"hostname":"gkeonprem.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.patch"},{"hostname":"gkeonprem.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.patch"},{"hostname":"gkeonprem.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.patch"},{"hostname":"gkeonprem.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.patch"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.create"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.setIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters/{bareMetalAdminClustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.testIamPermissions"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters:enroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters:enroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.enroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalAdminClusters:queryVersionConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalAdminClusters:queryVersionConfig)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalAdminClusters.queryVersionConfig"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.create"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.create"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.setIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools/{bareMetalNodePoolsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.testIamPermissions"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}/bareMetalNodePools:enroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalNodePools:enroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.bareMetalNodePools.enroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.setIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters/{bareMetalClustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.testIamPermissions"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters:enroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters:enroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.enroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/bareMetalClusters:queryVersionConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bareMetalClusters:queryVersionConfig)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.bareMetalClusters.queryVersionConfig"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.operations.cancel"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.setIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters/{vmwareAdminClustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.testIamPermissions"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareAdminClusters:enroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareAdminClusters:enroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareAdminClusters.enroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.create"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.create"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.setIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools/{vmwareNodePoolsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.testIamPermissions"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}/vmwareNodePools:enroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareNodePools:enroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.vmwareNodePools.enroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.setIamPolicy"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters/{vmwareClustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.testIamPermissions"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters:enroll","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters:enroll)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.enroll"},{"hostname":"gkeonprem.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareClusters:queryVersionConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareClusters:queryVersionConfig)$","service_name":"google.gkeonprem","resource_name":"gkeonprem.projects.locations.vmwareClusters.queryVersionConfig"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/drafts/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.drafts.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/messages/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.messages.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/cse/identities/{cseEmailAddress}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/delegates/{delegateEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/filters/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.delete"},{"hostname":"gmail.googleapis.com","http_method":"DELETE","path_template":"/gmail/v1/users/{userId}/threads/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.threads.delete"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/drafts","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts)$","service_name":"google.gmail","resource_name":"gmail.users.drafts.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/drafts/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.drafts.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/history","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/history)$","service_name":"google.gmail","resource_name":"gmail.users.history.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/labels","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.gmail","resource_name":"gmail.users.labels.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/messages","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.gmail","resource_name":"gmail.users.messages.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/messages/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.messages.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/messages/{messageId}/attachments/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.messages.attachments.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/profile","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profile)$","service_name":"google.gmail","resource_name":"gmail.users.getProfile"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/autoForwarding","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/autoForwarding)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getAutoForwarding"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/identities","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/identities/{cseEmailAddress}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/delegates","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates)$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/delegates/{delegateEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/filters","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters)$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/filters/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses)$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses/{forwardingEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/imap","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/imap)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getImap"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/language","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/language)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getLanguage"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/pop","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/pop)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getPop"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.get"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/settings/vacation","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/vacation)$","service_name":"google.gmail","resource_name":"gmail.users.settings.getVacation"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/threads","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads)$","service_name":"google.gmail","resource_name":"gmail.users.threads.list"},{"hostname":"gmail.googleapis.com","http_method":"GET","path_template":"/gmail/v1/users/{userId}/threads/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.threads.get"},{"hostname":"gmail.googleapis.com","http_method":"PATCH","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.patch"},{"hostname":"gmail.googleapis.com","http_method":"PATCH","path_template":"/gmail/v1/users/{userId}/settings/cse/identities/{emailAddress}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.patch"},{"hostname":"gmail.googleapis.com","http_method":"PATCH","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.patch"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/drafts","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts)$","service_name":"google.gmail","resource_name":"gmail.users.drafts.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/drafts/send","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/send)$","service_name":"google.gmail","resource_name":"gmail.users.drafts.send"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/labels","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.gmail","resource_name":"gmail.users.labels.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.gmail","resource_name":"gmail.users.messages.insert"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/batchDelete","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/batchDelete)$","service_name":"google.gmail","resource_name":"gmail.users.messages.batchDelete"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/batchModify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/batchModify)$","service_name":"google.gmail","resource_name":"gmail.users.messages.batchModify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/import","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/import)$","service_name":"google.gmail","resource_name":"gmail.users.messages.import"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/send","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/send)$","service_name":"google.gmail","resource_name":"gmail.users.messages.send"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/{id}/modify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modify)$","service_name":"google.gmail","resource_name":"gmail.users.messages.modify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/{id}/trash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trash)$","service_name":"google.gmail","resource_name":"gmail.users.messages.trash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/messages/{id}/untrash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/untrash)$","service_name":"google.gmail","resource_name":"gmail.users.messages.untrash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/identities","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/identities)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.identities.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:disable","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.disable"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:enable","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.enable"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/cse/keypairs/{keyPairId}:obliterate","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/cse/keypairs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::obliterate)$","service_name":"google.gmail","resource_name":"gmail.users.settings.cse.keypairs.obliterate"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/delegates","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/delegates)$","service_name":"google.gmail","resource_name":"gmail.users.settings.delegates.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/filters","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/filters)$","service_name":"google.gmail","resource_name":"gmail.users.settings.filters.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/forwardingAddresses","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/forwardingAddresses)$","service_name":"google.gmail","resource_name":"gmail.users.settings.forwardingAddresses.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.create"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.insert"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/smimeInfo/{id}/setDefault","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/smimeInfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setDefault)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.smimeInfo.setDefault"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}/verify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verify)$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.verify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/stop","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.gmail","resource_name":"gmail.users.stop"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/threads/{id}/modify","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modify)$","service_name":"google.gmail","resource_name":"gmail.users.threads.modify"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/threads/{id}/trash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trash)$","service_name":"google.gmail","resource_name":"gmail.users.threads.trash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/threads/{id}/untrash","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/threads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/untrash)$","service_name":"google.gmail","resource_name":"gmail.users.threads.untrash"},{"hostname":"gmail.googleapis.com","http_method":"POST","path_template":"/gmail/v1/users/{userId}/watch","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.gmail","resource_name":"gmail.users.watch"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/drafts/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/drafts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.drafts.update"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/labels/{id}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.labels.update"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/autoForwarding","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/autoForwarding)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateAutoForwarding"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/imap","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/imap)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateImap"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/language","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/language)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateLanguage"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/pop","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/pop)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updatePop"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/sendAs/{sendAsEmail}","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/sendAs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmail","resource_name":"gmail.users.settings.sendAs.update"},{"hostname":"gmail.googleapis.com","http_method":"PUT","path_template":"/gmail/v1/users/{userId}/settings/vacation","path_regex":"^(?:/gmail/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/vacation)$","service_name":"google.gmail","resource_name":"gmail.users.settings.updateVacation"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains","path_regex":"^(?:/v1/domains)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains/{domainsId}","path_regex":"^(?:/v1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.get"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains/{domainsId}/trafficStats","path_regex":"^(?:/v1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1/domains/{domainsId}/trafficStats/{trafficStatsId}","path_regex":"^(?:/v1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.get"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains","path_regex":"^(?:/v1beta1/domains)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains/{domainsId}","path_regex":"^(?:/v1beta1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.get"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains/{domainsId}/trafficStats","path_regex":"^(?:/v1beta1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats)$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.list"},{"hostname":"gmailpostmastertools.googleapis.com","http_method":"GET","path_template":"/v1beta1/domains/{domainsId}/trafficStats/{trafficStatsId}","path_regex":"^(?:/v1beta1/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trafficStats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.gmailpostmastertools","resource_name":"gmailpostmastertools.domains.trafficStats.get"},{"hostname":"groupsmigration.googleapis.com","http_method":"POST","path_template":"/groups/v1/groups/{groupId}/archive","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/archive)$","service_name":"google.groupsmigration","resource_name":"groupsmigration.archive.insert"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.deleteRevision"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalDelete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/$purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$purge)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-purge"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalDelete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/$purge","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$purge)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-purge"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:deleteRevision","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.deleteRevision"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalDelete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/$purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$purge)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-purge"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.delete"},{"hostname":"healthcare.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.delete"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.listRevisions"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataMapperWorkspaces/{dataMapperWorkspacesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataMapperWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dataMapperWorkspaces.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/series","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForStudies"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveStudy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveInstance"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveFrames"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}/rendered","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/rendered","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}:getSeriesMetrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getSeriesMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.getSeriesMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}:getStudyMetrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getStudyMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.getStudyMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getDICOMStoreMetrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDICOMStoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getDICOMStoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$everything","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$everything)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-everything"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.history"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history/{_historyId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.vread"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getFHIRStoreMetrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getFHIRStoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getFHIRStoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getHL7v2StoreMetrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getHL7v2StoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getHL7v2StoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/instances","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/series","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.searchForStudies"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.retrieveStudy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/instances","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.metadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.retrieveSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.retrieveInstance"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.frames.retrieveFrames"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}/rendered","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.frames.rendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.metadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/rendered","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.rendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.metadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Observation/$lastn","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Observation/\\$lastn)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Observation-lastn"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$everything","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$everything)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-everything"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.history"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history/{_historyId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.vread"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/metadata","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts/{consentArtifactsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:listRevisions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.listRevisions"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataMapperWorkspaces/{dataMapperWorkspacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataMapperWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dataMapperWorkspaces.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/series","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.searchForStudies"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveStudy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.searchForSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveSeries"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.searchForInstances"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveInstance"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/bulkdata/{bulkdataId}/{bulkdataId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bulkdata/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.bulkdata.retrieveBulkdata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveFrames"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/frames/{framesId}/rendered","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/frames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.frames.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}/rendered","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rendered)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.instances.retrieveRendered"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/instances/{instancesId}:getStorageInfo","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getStorageInfo)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.instances.getStorageInfo"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.series.retrieveMetadata"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}/series/{seriesId}:getSeriesMetrics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/series/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getSeriesMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.series.getSeriesMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}:getStudyMetrics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getStudyMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.getStudyMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getDICOMStoreMetrics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDICOMStoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getDICOMStoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/$references","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/\\$references)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-incoming-references"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/ConceptMap/$translate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/ConceptMap/\\$translate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.ConceptMap-search-translate"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/ConceptMap/{ConceptMapId}/$translate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/ConceptMap/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$translate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.ConceptMap-translate"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Consent/{ConsentId}/$consent-enforcement-status","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Consent/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$consent-enforcement-status)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Consent-enforcement-status"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Observation/$lastn","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Observation/\\$lastn)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Observation-lastn"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$consent-enforcement-status","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$consent-enforcement-status)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-consent-enforcement-status"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/Patient/{PatientId}/$everything","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/Patient/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$everything)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Patient-everything"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/metadata","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/metadata)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.capabilities"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.read"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.history"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}/_history/{_historyId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_history/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.vread"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:explainDataAccess","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::explainDataAccess)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.explainDataAccess"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getFHIRStoreMetrics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getFHIRStoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getFHIRStoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:batchGet","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:batchGet)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.batchGet"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getHL7v2StoreMetrics","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getHL7v2StoreMetrics)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getHL7v2StoreMetrics"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.list"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.get"},{"hostname":"healthcare.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalPatch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalPatch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations/{annotationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions/{attributeDefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalPatch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.patch"},{"hostname":"healthcare.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages/{messagesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.patch"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:activate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.activate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:reject","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.reject"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:revoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.revoke"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}:archive","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.archive"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:checkDataAccess","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkDataAccess)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.checkDataAccess"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:evaluateUserConsents","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateUserConsents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.evaluateUserConsents"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:queryAccessibleData","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAccessibleData)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.queryAccessibleData"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataMapperWorkspaces/{dataMapperWorkspacesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataMapperWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dataMapperWorkspaces.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataMapperWorkspaces/{dataMapperWorkspacesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataMapperWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dataMapperWorkspaces.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:deidentify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/_search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/$validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$validate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-validate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{resourceType}/_search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search-type"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:deidentify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.rollback"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:ingest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:ingest)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.ingest"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.rollback"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.cancel"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:deidentify","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/nlp:analyzeEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/nlp:analyzeEntities)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.services.nlp.analyzeEntities"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:getIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.getIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:export","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:import","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/_search","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:export","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:import","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:ingest","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:ingest)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.ingest"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:deidentify","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}/annotations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.annotations.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:evaluate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.evaluate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/annotationStores/{annotationStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotationStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.annotationStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/attributeDefinitions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributeDefinitions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.attributeDefinitions.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consentArtifacts","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentArtifacts)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consentArtifacts.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:activate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.activate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:reject","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reject)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.reject"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/consents/{consentsId}:revoke","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.consents.revoke"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}/userDataMappings/{userDataMappingsId}:archive","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userDataMappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.userDataMappings.archive"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:checkDataAccess","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkDataAccess)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.checkDataAccess"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:evaluateUserConsents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::evaluateUserConsents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.evaluateUserConsents"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:queryAccessibleData","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAccessibleData)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.queryAccessibleData"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/consentStores/{consentStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consentStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.consentStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataMapperWorkspaces/{dataMapperWorkspacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataMapperWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dataMapperWorkspaces.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dataMapperWorkspaces/{dataMapperWorkspacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataMapperWorkspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dataMapperWorkspaces.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.studies.storeInstances"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}/dicomWeb/studies/{studiesId}:setBlobStorageSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomWeb/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setBlobStorageSettings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.dicomWeb.studies.setBlobStorageSettings"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:deidentify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setBlobStorageSettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setBlobStorageSettings)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setBlobStorageSettings"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/dicomStores/{dicomStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dicomStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.dicomStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.executeBundle"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/_search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.createResource"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/$validate","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/\\$validate)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.Resource-validate"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{resourceType}/_search","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/_search)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.search-type"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:applyAdminConsents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyAdminConsents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.applyAdminConsents"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:applyConsents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyConsents)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.applyConsents"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:configureSearch","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::configureSearch)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.configureSearch"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:deidentify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:exportHistory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportHistory)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.exportHistory"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:importHistory","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importHistory)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.importHistory"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.rollback"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.create"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}/messages:ingest","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/messages:ingest)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.messages.ingest"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.export"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.import"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:rollback","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.rollback"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/hl7V2Stores/{hl7V2StoresId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hl7V2Stores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.hl7V2Stores.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.operations.cancel"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:deidentify","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deidentify)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.deidentify"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.setIamPolicy"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.testIamPermissions"},{"hostname":"healthcare.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/services/nlp:analyzeEntities","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/nlp:analyzeEntities)$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.services.nlp.analyzeEntities"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalUpdate"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.update"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalUpdate"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1alpha2/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1alpha2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.update"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.conditionalUpdate"},{"hostname":"healthcare.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/fhirStores/{fhirStoresId}/fhir/{fhirId}/{fhirId1}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhirStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fhir/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.healthcare","resource_name":"healthcare.projects.locations.datasets.fhirStores.fhir.update"},{"hostname":"homegraph.googleapis.com","http_method":"DELETE","path_template":"/v1/agentUsers/{agentUsersId}","path_regex":"^(?:/v1/agentUsers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.homegraph","resource_name":"homegraph.agentUsers.delete"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:query","path_regex":"^(?:/v1/devices:query)$","service_name":"google.homegraph","resource_name":"homegraph.devices.query"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:reportStateAndNotification","path_regex":"^(?:/v1/devices:reportStateAndNotification)$","service_name":"google.homegraph","resource_name":"homegraph.devices.reportStateAndNotification"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:requestSync","path_regex":"^(?:/v1/devices:requestSync)$","service_name":"google.homegraph","resource_name":"homegraph.devices.requestSync"},{"hostname":"homegraph.googleapis.com","http_method":"POST","path_template":"/v1/devices:sync","path_regex":"^(?:/v1/devices:sync)$","service_name":"google.homegraph","resource_name":"homegraph.devices.sync"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/subjects/{subjectsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.subjects.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.organizations.roles.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}/credentials/{credentialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.credentials.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/roles/{rolesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.roles.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.delete"},{"hostname":"iam.googleapis.com","http_method":"DELETE","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.delete"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/subjects/{subjectsId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.subjects.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/roles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.organizations.roles.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.organizations.roles.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients)$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}/credentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials)$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.credentials.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}/credentials/{credentialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.credentials.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/namespaces/{namespacesId}/managedIdentities/{managedIdentitiesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedIdentities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.namespaces.managedIdentities.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/namespaces/{namespacesId}/managedIdentities/{managedIdentitiesId}/workloadSources/{workloadSourcesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedIdentities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.namespaces.managedIdentities.workloadSources.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/namespaces/{namespacesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.namespaces.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/roles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.projects.roles.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/roles/{rolesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.roles.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/roles","path_regex":"^(?:/v1/roles)$","service_name":"google.iam","resource_name":"iam.roles.list"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v1/roles/{rolesId}","path_regex":"^(?:/v1/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.roles.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.listPolicies"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}/operations/{operationsId}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.operations.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2beta/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.listPolicies"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.get"},{"hostname":"iam.googleapis.com","http_method":"GET","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}/operations/{operationsId}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.operations.get"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.organizations.roles.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}/credentials/{credentialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.credentials.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/roles/{rolesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.roles.patch"},{"hostname":"iam.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.patch"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/iamPolicies:lintPolicy","path_regex":"^(?:/v1/iamPolicies:lintPolicy)$","service_name":"google.iam","resource_name":"iam.iamPolicies.lintPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/iamPolicies:queryAuditableServices","path_regex":"^(?:/v1/iamPolicies:queryAuditableServices)$","service_name":"google.iam","resource_name":"iam.iamPolicies.queryAuditableServices"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}/keys/{keysId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.keys.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/providers/{providersId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.providers.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}/subjects/{subjectsId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.subjects.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:getIamPolicy","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.getIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:setIamPolicy","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.setIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:testIamPermissions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.testIamPermissions"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/workforcePools/{workforcePoolsId}:undelete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workforcePools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.locations.workforcePools.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/roles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.organizations.roles.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/roles/{rolesId}:undelete","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.organizations.roles.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/permissions:queryTestablePermissions","path_regex":"^(?:/v1/permissions:queryTestablePermissions)$","service_name":"google.iam","resource_name":"iam.permissions.queryTestablePermissions"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients)$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}/credentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials)$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.credentials.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/oauthClients/{oauthClientsId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.oauthClients.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}/keys/{keysId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.keys.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}/providers/{providersId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/providers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.providers.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workloadIdentityPools/{workloadIdentityPoolsId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloadIdentityPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.locations.workloadIdentityPools.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/roles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles)$","service_name":"google.iam","resource_name":"iam.projects.roles.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/roles/{rolesId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.roles.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.create"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.disable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys/{keysId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.enable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}/keys:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys:upload)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.keys.upload"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.disable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.enable"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.getIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.setIamPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signBlob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signBlob)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.signBlob"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signJwt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signJwt)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.signJwt"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.testIamPermissions"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.undelete"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v1/roles:queryGrantableRoles","path_regex":"^(?:/v1/roles:queryGrantableRoles)$","service_name":"google.iam","resource_name":"iam.roles.queryGrantableRoles"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v2/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.createPolicy"},{"hostname":"iam.googleapis.com","http_method":"POST","path_template":"/v2beta/policies/{policiesId}/{policiesId1}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.createPolicy"},{"hostname":"iam.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.projects.serviceAccounts.update"},{"hostname":"iam.googleapis.com","http_method":"PUT","path_template":"/v2/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.update"},{"hostname":"iam.googleapis.com","http_method":"PUT","path_template":"/v2beta/policies/{policiesId}/{policiesId1}/{policiesId2}","path_regex":"^(?:/v2beta/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iam","resource_name":"iam.policies.update"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:generateAccessToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.generateAccessToken"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:generateIdToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateIdToken)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.generateIdToken"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signBlob","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signBlob)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.signBlob"},{"hostname":"iamcredentials.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/serviceAccounts/{serviceAccountsId}:signJwt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signJwt)$","service_name":"google.iamcredentials","resource_name":"iamcredentials.projects.serviceAccounts.signJwt"},{"hostname":"iap.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients/{identityAwareProxyClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.delete"},{"hostname":"iap.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups/{destGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.delete"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands)$","service_name":"google.iap","resource_name":"iap.projects.brands.list"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands/{brandsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.brands.get"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients)$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.list"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients/{identityAwareProxyClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.get"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups)$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.list"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups/{destGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.get"},{"hostname":"iap.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}:iapSettings","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::iapSettings)$","service_name":"google.iap","resource_name":"iap.getIapSettings"},{"hostname":"iap.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups/{destGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.patch"},{"hostname":"iap.googleapis.com","http_method":"PATCH","path_template":"/v1/{v1Id}:iapSettings","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::iapSettings)$","service_name":"google.iap","resource_name":"iap.updateIapSettings"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/brands","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands)$","service_name":"google.iap","resource_name":"iap.projects.brands.create"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients)$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.create"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/brands/{brandsId}/identityAwareProxyClients/{identityAwareProxyClientsId}:resetSecret","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brands/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityAwareProxyClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetSecret)$","service_name":"google.iap","resource_name":"iap.projects.brands.identityAwareProxyClients.resetSecret"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/iap_tunnel/locations/{locationsId}/destGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iap_tunnel/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destGroups)$","service_name":"google.iap","resource_name":"iap.projects.iap_tunnel.locations.destGroups.create"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:getIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iap","resource_name":"iap.getIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:setIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iap","resource_name":"iap.setIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:testIamPermissions","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iap","resource_name":"iap.testIamPermissions"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:validateAttributeExpression","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateAttributeExpression)$","service_name":"google.iap","resource_name":"iap.validateAttributeExpression"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:getIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.iap","resource_name":"iap.getIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:setIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.iap","resource_name":"iap.setIamPolicy"},{"hostname":"iap.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:testIamPermissions","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.iap","resource_name":"iap.testIamPermissions"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1alpha/ideas","path_regex":"^(?:/v1alpha/ideas)$","service_name":"google.ideahub","resource_name":"ideahub.ideas.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/ideas","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideas)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideas.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/locales","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locales)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.locales.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/ideas","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideas)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideas.list"},{"hostname":"ideahub.googleapis.com","http_method":"GET","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/locales","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locales)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.locales.list"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/ideaStates/{ideaStatesId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/topicStates/{topicStatesId}","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topicStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.topicStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/ideaStates/{ideaStatesId}","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"PATCH","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/topicStates/{topicStatesId}","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topicStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.topicStates.patch"},{"hostname":"ideahub.googleapis.com","http_method":"POST","path_template":"/v1alpha/platforms/{platformsId}/properties/{propertiesId}/ideaActivities","path_regex":"^(?:/v1alpha/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaActivities)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaActivities.create"},{"hostname":"ideahub.googleapis.com","http_method":"POST","path_template":"/v1beta/platforms/{platformsId}/properties/{propertiesId}/ideaActivities","path_regex":"^(?:/v1beta/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ideaActivities)$","service_name":"google.ideahub","resource_name":"ideahub.platforms.properties.ideaActivities.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getProjects"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/accounts:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchGet)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.batchGet"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:batchGet","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchGet)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.batchGet"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/publicKeys","path_regex":"^(?:/v1/publicKeys)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getPublicKeys"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/recaptchaParams","path_regex":"^(?:/v1/recaptchaParams)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getRecaptchaParams"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v1/sessionCookiePublicKeys","path_regex":"^(?:/v1/sessionCookiePublicKeys)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getSessionCookiePublicKeys"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/defaultSupportedIdps","path_regex":"^(?:/v2/defaultSupportedIdps)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.defaultSupportedIdps.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/passwordPolicy","path_regex":"^(?:/v2/passwordPolicy)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getPasswordPolicy"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/config","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.getConfig"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.list"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.get"},{"hostname":"identitytoolkit.googleapis.com","http_method":"GET","path_template":"/v2/recaptchaConfig","path_regex":"^(?:/v2/recaptchaConfig)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.getRecaptchaConfig"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/config","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.updateConfig"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs/{defaultSupportedIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs/{inboundSamlConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs/{oauthIdpConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.patch"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:createAuthUri","path_regex":"^(?:/v1/accounts:createAuthUri)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.createAuthUri"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:delete","path_regex":"^(?:/v1/accounts:delete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:issueSamlResponse","path_regex":"^(?:/v1/accounts:issueSamlResponse)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.issueSamlResponse"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:lookup","path_regex":"^(?:/v1/accounts:lookup)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.lookup"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:resetPassword","path_regex":"^(?:/v1/accounts:resetPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.resetPassword"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:sendOobCode","path_regex":"^(?:/v1/accounts:sendOobCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.sendOobCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:sendVerificationCode","path_regex":"^(?:/v1/accounts:sendVerificationCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.sendVerificationCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithCustomToken","path_regex":"^(?:/v1/accounts:signInWithCustomToken)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithCustomToken"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithEmailLink","path_regex":"^(?:/v1/accounts:signInWithEmailLink)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithEmailLink"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithGameCenter","path_regex":"^(?:/v1/accounts:signInWithGameCenter)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithGameCenter"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithIdp","path_regex":"^(?:/v1/accounts:signInWithIdp)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithIdp"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithPassword","path_regex":"^(?:/v1/accounts:signInWithPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithPassword"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signInWithPhoneNumber","path_regex":"^(?:/v1/accounts:signInWithPhoneNumber)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signInWithPhoneNumber"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:signUp","path_regex":"^(?:/v1/accounts:signUp)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.signUp"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:update","path_regex":"^(?:/v1/accounts:update)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.update"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/accounts:verifyIosClient","path_regex":"^(?:/v1/accounts:verifyIosClient)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.verifyIosClient"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchCreate)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.batchCreate"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchDelete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.batchDelete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:delete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:lookup)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.lookup"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:query)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.query"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:sendOobCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:sendOobCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.sendOobCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/accounts:update","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:update)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.accounts.update"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchCreate)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.batchCreate"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:batchDelete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.batchDelete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:delete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:delete)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.delete"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:lookup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:lookup)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.lookup"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:query)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.query"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:sendOobCode","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:sendOobCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.sendOobCode"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}/accounts:update","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts:update)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.accounts.update"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/tenants/{tenantsId}:createSessionCookie","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::createSessionCookie)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.createSessionCookie"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:createSessionCookie","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::createSessionCookie)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.createSessionCookie"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:queryAccounts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryAccounts)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.queryAccounts"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaEnrollment:finalize","path_regex":"^(?:/v2/accounts/mfaEnrollment:finalize)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaEnrollment.finalize"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaEnrollment:start","path_regex":"^(?:/v2/accounts/mfaEnrollment:start)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaEnrollment.start"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaEnrollment:withdraw","path_regex":"^(?:/v2/accounts/mfaEnrollment:withdraw)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaEnrollment.withdraw"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaSignIn:finalize","path_regex":"^(?:/v2/accounts/mfaSignIn:finalize)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaSignIn.finalize"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts/mfaSignIn:start","path_regex":"^(?:/v2/accounts/mfaSignIn:start)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.mfaSignIn.start"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/accounts:revokeToken","path_regex":"^(?:/v2/accounts:revokeToken)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.accounts.revokeToken"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.defaultSupportedIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/identityPlatform:initializeAuth","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/identityPlatform:initializeAuth)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.identityPlatform.initializeAuth"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.inboundSamlConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.oauthIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/defaultSupportedIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultSupportedIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.defaultSupportedIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/inboundSamlConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inboundSamlConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.inboundSamlConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}/oauthIdpConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/oauthIdpConfigs)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.oauthIdpConfigs.create"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.getIamPolicy"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.setIamPolicy"},{"hostname":"identitytoolkit.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/tenants/{tenantsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.projects.tenants.testIamPermissions"},{"hostname":"ids.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.delete"},{"hostname":"ids.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.delete"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.ids","resource_name":"ids.projects.locations.list"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.get"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.list"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.get"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.getIamPolicy"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.list"},{"hostname":"ids.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.get"},{"hostname":"ids.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.patch"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.create"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.setIamPolicy"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpoints/{endpointsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ids","resource_name":"ids.projects.locations.endpoints.testIamPermissions"},{"hostname":"ids.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ids","resource_name":"ids.projects.locations.operations.cancel"},{"hostname":"indexing.googleapis.com","http_method":"GET","path_template":"/v3/urlNotifications/metadata","path_regex":"^(?:/v3/urlNotifications/metadata)$","service_name":"google.indexing","resource_name":"indexing.urlNotifications.getMetadata"},{"hostname":"indexing.googleapis.com","http_method":"POST","path_template":"/v3/urlNotifications:publish","path_regex":"^(?:/v3/urlNotifications:publish)$","service_name":"google.indexing","resource_name":"indexing.urlNotifications.publish"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.delete"},{"hostname":"integrations.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.delete"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/callback:generateToken","path_regex":"^(?:/v1/callback:generateToken)$","service_name":"google.integrations","resource_name":"integrations.callback.generateToken"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/connectorPlatformRegions:enumerate","path_regex":"^(?:/v1/connectorPlatformRegions:enumerate)$","service_name":"google.integrations","resource_name":"integrations.connectorPlatformRegions.enumerate"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/clientmetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientmetadata)$","service_name":"google.integrations","resource_name":"integrations.projects.getClientmetadata"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.getClients"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.getConnectionSchemaMetadata"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeActionSchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeActionSchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeActionSchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeEntitySchemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeEntitySchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeEntitySchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executionsnapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionsnapshots)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executionsnapshots.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executionsnapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executionsnapshots)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executionsnapshots.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:getBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.getBundle"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}:listTaskEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTaskEntities)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.listTaskEntities"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:listTaskEntities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listTaskEntities)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.listTaskEntities"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/callback:generateToken","path_regex":"^(?:/v1alpha/callback:generateToken)$","service_name":"google.integrations","resource_name":"integrations.callback.generateToken"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/connectorPlatformRegions:enumerate","path_regex":"^(?:/v1alpha/connectorPlatformRegions:enumerate)$","service_name":"google.integrations","resource_name":"integrations.connectorPlatformRegions.enumerate"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/connectionSchemaMetadata","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionSchemaMetadata)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.getConnectionSchemaMetadata"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeActionSchemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeActionSchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeActionSchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/connections/{connectionsId}/runtimeEntitySchemas","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeEntitySchemas)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.connections.runtimeEntitySchemas.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:download","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::download)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.download"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrationtemplates/{integrationtemplatesId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrationtemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrationtemplates.versions.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrationtemplates/{integrationtemplatesId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrationtemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrationtemplates.versions.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.get"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.list"},{"hostname":"integrations.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.get"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:updateBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.updateBundle"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs/{authConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates/{certificatesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.patch"},{"hostname":"integrations.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels/{sfdcChannelsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.patch"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appsScriptProjects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/appsScriptProjects:link","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects:link)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.link"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.certificates.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clients:deprovision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients:deprovision)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.clients.deprovision"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clients:provision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients:provision)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.clients.provision"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/cloudFunctions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloudFunctions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.cloudFunctions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:archive","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.archive"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:deactivate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.deactivate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.validate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:test","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::test)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.test"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/cloudFunctions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloudFunctions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.cloudFunctions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.cancel"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:archive","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.archive"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:deactivate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.deactivate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:takeoverEditLock","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::takeoverEditLock)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.takeoverEditLock"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.validate"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:archiveBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archiveBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.archiveBundle"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:test","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::test)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.test"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}:createBundle","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::createBundle)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.createBundle"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appsScriptProjects","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/appsScriptProjects:link","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/appsScriptProjects:link)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.appsScriptProjects.link"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:takeoverEditLock","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::takeoverEditLock)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.takeoverEditLock"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:executeEvent","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeEvent)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.executeEvent"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/authConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authConfigs)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.authConfigs.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/certificates","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.certificates.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:lift","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lift)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.lift"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}/suspensions/{suspensionsId}:resolve","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.suspensions.resolve"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.executions.cancel"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:publish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.publish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:takeoverEditLock","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::takeoverEditLock)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.takeoverEditLock"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions/{versionsId}:unpublish","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::unpublish)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.unpublish"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}/versions:upload","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:upload)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.versions.upload"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:execute","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::execute)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.execute"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrations/{integrationsId}:schedule","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::schedule)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrations.schedule"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/integrationtemplates/{integrationtemplatesId}/versions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/integrationtemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.integrationtemplates.versions.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/products/{productsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.products.sfdcInstances.sfdcChannels.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.create"},{"hostname":"integrations.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/sfdcInstances/{sfdcInstancesId}/sfdcChannels","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcInstances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sfdcChannels)$","service_name":"google.integrations","resource_name":"integrations.projects.locations.sfdcInstances.sfdcChannels.create"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v2/companies/{companiesId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v2/jobs/{jobsId}","path_regex":"^(?:/v2/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3p1beta1/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v3p1beta1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies/{companiesId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.delete"},{"hostname":"jobs.googleapis.com","http_method":"DELETE","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs/{jobsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.delete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.jobs","resource_name":"jobs.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/companies/{companiesId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/companies/{companiesId}/jobs","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.companies.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/jobs","path_regex":"^(?:/v2/jobs)$","service_name":"google.jobs","resource_name":"jobs.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2/jobs/{jobsId}","path_regex":"^(?:/v2/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v2:complete","path_regex":"^(?:/v2:complete)$","service_name":"google.jobs","resource_name":"jobs.complete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/companies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/jobs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}:complete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.jobs","resource_name":"jobs.projects.complete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/companies","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/jobs","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.operations.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v3p1beta1/projects/{projectsId}:complete","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.jobs","resource_name":"jobs.projects.complete"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.operations.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies/{companiesId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.list"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs/{jobsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.get"},{"hostname":"jobs.googleapis.com","http_method":"GET","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}:completeQuery","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.completeQuery"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v2/companies/{companiesId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v2/jobs/{jobsId}","path_regex":"^(?:/v2/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3p1beta1/projects/{projectsId}/companies/{companiesId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v3p1beta1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies/{companiesId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.patch"},{"hostname":"jobs.googleapis.com","http_method":"PATCH","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs/{jobsId}","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.patch"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.jobs","resource_name":"jobs.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs","path_regex":"^(?:/v2/jobs)$","service_name":"google.jobs","resource_name":"jobs.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:batchDelete","path_regex":"^(?:/v2/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:deleteByFilter","path_regex":"^(?:/v2/jobs:deleteByFilter)$","service_name":"google.jobs","resource_name":"jobs.jobs.deleteByFilter"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:histogram","path_regex":"^(?:/v2/jobs:histogram)$","service_name":"google.jobs","resource_name":"jobs.jobs.histogram"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:search","path_regex":"^(?:/v2/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v2/jobs:searchForAlert","path_regex":"^(?:/v2/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.jobs.searchForAlert"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/clientEvents","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientEvents)$","service_name":"google.jobs","resource_name":"jobs.projects.clientEvents.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/companies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs:batchDelete","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs:search","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/jobs:searchForAlert","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.searchForAlert"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/clientEvents","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientEvents)$","service_name":"google.jobs","resource_name":"jobs.projects.clientEvents.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/companies","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs:batchDelete","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs:search","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v3p1beta1/projects/{projectsId}/jobs:searchForAlert","path_regex":"^(?:/v3p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.projects.jobs.searchForAlert"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/clientEvents","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientEvents)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.clientEvents.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/companies","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companies)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.companies.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.create"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:batchCreate","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchCreate)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.batchCreate"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:batchDelete","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchDelete)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.batchDelete"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:batchUpdate","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:batchUpdate)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.batchUpdate"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:search","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:search)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.search"},{"hostname":"jobs.googleapis.com","http_method":"POST","path_template":"/v4/projects/{projectsId}/tenants/{tenantsId}/jobs:searchForAlert","path_regex":"^(?:/v4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs:searchForAlert)$","service_name":"google.jobs","resource_name":"jobs.projects.tenants.jobs.searchForAlert"},{"hostname":"keep.googleapis.com","http_method":"DELETE","path_template":"/v1/notes/{notesId}","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.keep","resource_name":"keep.notes.delete"},{"hostname":"keep.googleapis.com","http_method":"GET","path_template":"/v1/notes","path_regex":"^(?:/v1/notes)$","service_name":"google.keep","resource_name":"keep.notes.list"},{"hostname":"keep.googleapis.com","http_method":"GET","path_template":"/v1/notes/{notesId}","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.keep","resource_name":"keep.notes.get"},{"hostname":"keep.googleapis.com","http_method":"GET","path_template":"/v1/notes/{notesId}/attachments/{attachmentsId}","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.keep","resource_name":"keep.media.download"},{"hostname":"keep.googleapis.com","http_method":"POST","path_template":"/v1/notes","path_regex":"^(?:/v1/notes)$","service_name":"google.keep","resource_name":"keep.notes.create"},{"hostname":"keep.googleapis.com","http_method":"POST","path_template":"/v1/notes/{notesId}/permissions:batchCreate","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchCreate)$","service_name":"google.keep","resource_name":"keep.notes.permissions.batchCreate"},{"hostname":"keep.googleapis.com","http_method":"POST","path_template":"/v1/notes/{notesId}/permissions:batchDelete","path_regex":"^(?:/v1/notes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions:batchDelete)$","service_name":"google.keep","resource_name":"keep.notes.permissions.batchDelete"},{"hostname":"kgsearch.googleapis.com","http_method":"GET","path_template":"/v1/entities:search","path_regex":"^(?:/v1/entities:search)$","service_name":"google.kgsearch","resource_name":"kgsearch.entities.search"},{"hostname":"kmsinventory.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/protectedResources:search","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/protectedResources:search)$","service_name":"google.kmsinventory","resource_name":"kmsinventory.organizations.protectedResources.search"},{"hostname":"kmsinventory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/cryptoKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys)$","service_name":"google.kmsinventory","resource_name":"kmsinventory.projects.cryptoKeys.list"},{"hostname":"kmsinventory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/keyRings/{keyRingsId}/cryptoKeys/{cryptoKeysId}/protectedResourcesSummary","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keyRings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cryptoKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/protectedResourcesSummary)$","service_name":"google.kmsinventory","resource_name":"kmsinventory.projects.locations.keyRings.cryptoKeys.getProtectedResourcesSummary"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeEntities","path_regex":"^(?:/v1/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeEntitySentiment","path_regex":"^(?:/v1/documents:analyzeEntitySentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeEntitySentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeSentiment","path_regex":"^(?:/v1/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:analyzeSyntax","path_regex":"^(?:/v1/documents:analyzeSyntax)$","service_name":"google.language","resource_name":"language.documents.analyzeSyntax"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:annotateText","path_regex":"^(?:/v1/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:classifyText","path_regex":"^(?:/v1/documents:classifyText)$","service_name":"google.language","resource_name":"language.documents.classifyText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1/documents:moderateText","path_regex":"^(?:/v1/documents:moderateText)$","service_name":"google.language","resource_name":"language.documents.moderateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:analyzeEntities","path_regex":"^(?:/v1beta1/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:analyzeSentiment","path_regex":"^(?:/v1beta1/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:analyzeSyntax","path_regex":"^(?:/v1beta1/documents:analyzeSyntax)$","service_name":"google.language","resource_name":"language.documents.analyzeSyntax"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta1/documents:annotateText","path_regex":"^(?:/v1beta1/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeEntities","path_regex":"^(?:/v1beta2/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeEntitySentiment","path_regex":"^(?:/v1beta2/documents:analyzeEntitySentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeEntitySentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeSentiment","path_regex":"^(?:/v1beta2/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:analyzeSyntax","path_regex":"^(?:/v1beta2/documents:analyzeSyntax)$","service_name":"google.language","resource_name":"language.documents.analyzeSyntax"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:annotateText","path_regex":"^(?:/v1beta2/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:classifyText","path_regex":"^(?:/v1beta2/documents:classifyText)$","service_name":"google.language","resource_name":"language.documents.classifyText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v1beta2/documents:moderateText","path_regex":"^(?:/v1beta2/documents:moderateText)$","service_name":"google.language","resource_name":"language.documents.moderateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v2/documents:analyzeEntities","path_regex":"^(?:/v2/documents:analyzeEntities)$","service_name":"google.language","resource_name":"language.documents.analyzeEntities"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v2/documents:analyzeSentiment","path_regex":"^(?:/v2/documents:analyzeSentiment)$","service_name":"google.language","resource_name":"language.documents.analyzeSentiment"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v2/documents:annotateText","path_regex":"^(?:/v2/documents:annotateText)$","service_name":"google.language","resource_name":"language.documents.annotateText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v2/documents:classifyText","path_regex":"^(?:/v2/documents:classifyText)$","service_name":"google.language","resource_name":"language.documents.classifyText"},{"hostname":"language.googleapis.com","http_method":"POST","path_template":"/v2/documents:moderateText","path_regex":"^(?:/v2/documents:moderateText)$","service_name":"google.language","resource_name":"language.documents.moderateText"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves","path_regex":"^(?:/v1/shelves)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.list"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves/{shelvesId}","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.get"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves/{shelvesId}/books","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.list"},{"hostname":"libraryagent.googleapis.com","http_method":"GET","path_template":"/v1/shelves/{shelvesId}/books/{booksId}","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.get"},{"hostname":"libraryagent.googleapis.com","http_method":"POST","path_template":"/v1/shelves/{shelvesId}/books/{booksId}:borrow","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::borrow)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.borrow"},{"hostname":"libraryagent.googleapis.com","http_method":"POST","path_template":"/v1/shelves/{shelvesId}/books/{booksId}:return","path_regex":"^(?:/v1/shelves/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/books/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::return)$","service_name":"google.libraryagent","resource_name":"libraryagent.shelves.books.return"},{"hostname":"licensing.googleapis.com","http_method":"DELETE","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.delete"},{"hostname":"licensing.googleapis.com","http_method":"GET","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.get"},{"hostname":"licensing.googleapis.com","http_method":"GET","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/users","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.listForProductAndSku"},{"hostname":"licensing.googleapis.com","http_method":"GET","path_template":"/apps/licensing/v1/product/{productId}/users","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.listForProduct"},{"hostname":"licensing.googleapis.com","http_method":"PATCH","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.patch"},{"hostname":"licensing.googleapis.com","http_method":"POST","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user)$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.insert"},{"hostname":"licensing.googleapis.com","http_method":"PUT","path_template":"/apps/licensing/v1/product/{productId}/sku/{skuId}/user/{userId}","path_regex":"^(?:/apps/licensing/v1/product/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sku/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.licensing","resource_name":"licensing.licenseAssignments.update"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.list"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.get"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.operations.list"},{"hostname":"lifesciences.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.operations.get"},{"hostname":"lifesciences.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.operations.cancel"},{"hostname":"lifesciences.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/pipelines:run","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pipelines:run)$","service_name":"google.lifesciences","resource_name":"lifesciences.projects.locations.pipelines.run"},{"hostname":"localservices.googleapis.com","http_method":"GET","path_template":"/v1/accountReports:search","path_regex":"^(?:/v1/accountReports:search)$","service_name":"google.localservices","resource_name":"localservices.accountReports.search"},{"hostname":"localservices.googleapis.com","http_method":"GET","path_template":"/v1/detailedLeadReports:search","path_regex":"^(?:/v1/detailedLeadReports:search)$","service_name":"google.localservices","resource_name":"localservices.detailedLeadReports.search"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.savedQueries.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/logs/{logsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.savedQueries.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/logs/{logsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.savedQueries.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/logs/{logsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.savedQueries.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/logs/{logsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.exclusions.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/logs/{logsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.logs.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2/{v2Id}/{v2Id1}/sinks/{sinksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.delete"},{"hostname":"logging.googleapis.com","http_method":"DELETE","path_template":"/v2beta1/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.delete"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices)$","service_name":"google.logging","resource_name":"logging.projects.logServices.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/indexes","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/indexes)$","service_name":"google.logging","resource_name":"logging.projects.logServices.indexes.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logs","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.projects.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/cmekSettings","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.billingAccounts.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/recentQueries","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recentQueries)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.recentQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.savedQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.savedQueries.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/logs","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.billingAccounts.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/settings","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.billingAccounts.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/cmekSettings","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.folders.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/exclusions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.folders.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.folders.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.folders.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/recentQueries","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recentQueries)$","service_name":"google.logging","resource_name":"logging.folders.locations.recentQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.folders.locations.savedQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.savedQueries.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/logs","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.folders.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/settings","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.folders.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/sinks","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.folders.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/monitoredResourceDescriptors","path_regex":"^(?:/v2/monitoredResourceDescriptors)$","service_name":"google.logging","resource_name":"logging.monitoredResourceDescriptors.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/cmekSettings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.organizations.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/exclusions","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.organizations.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.organizations.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/recentQueries","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recentQueries)$","service_name":"google.logging","resource_name":"logging.organizations.locations.recentQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.organizations.locations.savedQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.savedQueries.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/logs","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.organizations.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/settings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.organizations.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/sinks","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.organizations.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/cmekSettings","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.projects.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/exclusions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.projects.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.projects.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}/logs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.projects.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/recentQueries","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recentQueries)$","service_name":"google.logging","resource_name":"logging.projects.locations.recentQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.projects.locations.savedQueries.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.savedQueries.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/logs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.projects.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/metrics","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/settings","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.projects.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/sinks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/cmekSettings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.getCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/exclusions","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.exclusions.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.exclusions.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.logging","resource_name":"logging.locations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.locations.buckets.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links/{linksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/operations","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.logging","resource_name":"logging.locations.operations.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.operations.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/logs","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs)$","service_name":"google.logging","resource_name":"logging.logs.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/settings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.getSettings"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/sinks","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/{v2Id1}/sinks/{sinksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/monitoredResourceDescriptors","path_regex":"^(?:/v2beta1/monitoredResourceDescriptors)$","service_name":"google.logging","resource_name":"logging.monitoredResourceDescriptors.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/metrics","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.get"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/sinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.list"},{"hostname":"logging.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.get"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.savedQueries.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.locations.savedQueries.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/settings","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.folders.updateSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/cmekSettings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.organizations.updateCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.locations.savedQueries.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/settings","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.organizations.updateSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/savedQueries/{savedQueriesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.locations.savedQueries.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/cmekSettings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cmekSettings)$","service_name":"google.logging","resource_name":"logging.updateCmekSettings"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/exclusions/{exclusionsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.exclusions.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.patch"},{"hostname":"logging.googleapis.com","http_method":"PATCH","path_template":"/v2/{v2Id}/{v2Id1}/settings","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.logging","resource_name":"logging.updateSettings"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/entries:write","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries:write)$","service_name":"google.logging","resource_name":"logging.projects.logs.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/entries:write","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries:write)$","service_name":"google.logging","resource_name":"logging.projects.logs.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/exclusions","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.billingAccounts.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.billingAccounts.locations.savedQueries.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:copy","path_regex":"^(?:/v2/entries:copy)$","service_name":"google.logging","resource_name":"logging.entries.copy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:list","path_regex":"^(?:/v2/entries:list)$","service_name":"google.logging","resource_name":"logging.entries.list"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:tail","path_regex":"^(?:/v2/entries:tail)$","service_name":"google.logging","resource_name":"logging.entries.tail"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/entries:write","path_regex":"^(?:/v2/entries:write)$","service_name":"google.logging","resource_name":"logging.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/exclusions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.folders.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:getIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.getIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:setIamPolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.setIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:testIamPermissions","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.views.testIamPermissions"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.folders.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.folders.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.folders.locations.savedQueries.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/sinks","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.folders.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/exclusions","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.organizations.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:getIamPolicy","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.getIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:setIamPolicy","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.setIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:testIamPermissions","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.views.testIamPermissions"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.organizations.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.organizations.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.organizations.locations.savedQueries.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/sinks","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.organizations.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/exclusions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.projects.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.getIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.setIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.views.testIamPermissions"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.projects.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.projects.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/savedQueries","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.logging","resource_name":"logging.projects.locations.savedQueries.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/metrics","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/sinks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/exclusions","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exclusions)$","service_name":"google.logging","resource_name":"logging.exclusions.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets)$","service_name":"google.logging","resource_name":"logging.locations.buckets.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/links","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/links)$","service_name":"google.logging","resource_name":"logging.locations.buckets.links.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:getIamPolicy","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.getIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:setIamPolicy","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.setIamPolicy"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}/views/{viewsId}:testIamPermissions","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/views/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.logging","resource_name":"logging.locations.buckets.views.testIamPermissions"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}:undelete","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.logging","resource_name":"logging.locations.buckets.undelete"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets/{bucketsId}:updateAsync","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateAsync)$","service_name":"google.logging","resource_name":"logging.locations.buckets.updateAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/buckets:createAsync","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buckets:createAsync)$","service_name":"google.logging","resource_name":"logging.locations.buckets.createAsync"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.logging","resource_name":"logging.locations.operations.cancel"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/{v2Id1}/sinks","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/entries:list","path_regex":"^(?:/v2beta1/entries:list)$","service_name":"google.logging","resource_name":"logging.entries.list"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/entries:write","path_regex":"^(?:/v2beta1/entries:write)$","service_name":"google.logging","resource_name":"logging.entries.write"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/metrics","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.logging","resource_name":"logging.projects.metrics.create"},{"hostname":"logging.googleapis.com","http_method":"POST","path_template":"/v2beta1/projects/{projectsId}/sinks","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks)$","service_name":"google.logging","resource_name":"logging.projects.sinks.create"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v1beta3/projects/{projectsId}/logServices/{logServicesId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logServices.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v1beta3/projects/{projectsId}/logs/{logsId}/sinks/{sinksId}","path_regex":"^(?:/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/logs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.logs.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/billingAccounts/{billingAccountsId}/sinks/{sinksId}","path_regex":"^(?:/v2/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.billingAccounts.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/folders/{foldersId}/sinks/{sinksId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.folders.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/organizations/{organizationsId}/sinks/{sinksId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.organizations.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2/{v2Id}/{v2Id1}/sinks/{sinksId}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.sinks.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2beta1/projects/{projectsId}/metrics/{metricsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.metrics.update"},{"hostname":"logging.googleapis.com","http_method":"PUT","path_template":"/v2beta1/projects/{projectsId}/sinks/{sinksId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.logging","resource_name":"logging.projects.sinks.update"},{"hostname":"looker.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.delete"},{"hostname":"looker.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.looker","resource_name":"looker.projects.locations.operations.delete"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.looker","resource_name":"looker.projects.locations.list"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.looker","resource_name":"looker.projects.locations.get"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.list"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.get"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.backups.getIamPolicy"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.getIamPolicy"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.looker","resource_name":"looker.projects.locations.operations.list"},{"hostname":"looker.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.looker","resource_name":"looker.projects.locations.operations.get"},{"hostname":"looker.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.patch"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.create"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.backups.setIamPolicy"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.backups.testIamPermissions"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.export"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.import"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restart)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.restart"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.setIamPolicy"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.looker","resource_name":"looker.projects.locations.instances.testIamPermissions"},{"hostname":"looker.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.looker","resource_name":"looker.projects.locations.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.delete"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations/{sqlIntegrationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations/{sqlIntegrationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/sqlIntegrations/{sqlIntegrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sqlIntegrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.sqlIntegrations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.list"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.get"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.getIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.get"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.updateLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.updateLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/ldapssettings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ldapssettings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.updateLdapssettings"},{"hostname":"managedidentities.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.patch"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:attachTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.attachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:checkMigrationPermission","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkMigrationPermission)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.checkMigrationPermission"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:detachTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.detachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:disableMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.disableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:domainJoinMachine","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::domainJoinMachine)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.domainJoinMachine"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:enableMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.enableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:extendSchema","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extendSchema)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.extendSchema"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:reconfigureTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reconfigureTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.reconfigureTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:resetAdminPassword","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAdminPassword)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.resetAdminPassword"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.restore"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/domains/{domainsId}:validateTrust","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.validateTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/peerings/{peeringsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:attachTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.attachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:checkMigrationPermission","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkMigrationPermission)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.checkMigrationPermission"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:detachTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.detachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:disableMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.disableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:domainJoinMachine","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::domainJoinMachine)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.domainJoinMachine"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:enableMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.enableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:extendSchema","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extendSchema)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.extendSchema"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:reconfigureTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reconfigureTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.reconfigureTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:resetAdminPassword","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAdminPassword)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.resetAdminPassword"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:restore","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.restore"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/domains/{domainsId}:validateTrust","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.validateTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/peerings/{peeringsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.backups.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:attachTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.attachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:checkMigrationPermission","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkMigrationPermission)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.checkMigrationPermission"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:detachTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detachTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.detachTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:disableMigration","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.disableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:domainJoinMachine","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::domainJoinMachine)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.domainJoinMachine"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:enableMigration","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableMigration)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.enableMigration"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:extendSchema","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extendSchema)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.extendSchema"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:reconfigureTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reconfigureTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.reconfigureTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:resetAdminPassword","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetAdminPassword)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.resetAdminPassword"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:restore","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.restore"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.testIamPermissions"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/domains/{domainsId}:validateTrust","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/domains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validateTrust)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.domains.validateTrust"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.operations.cancel"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.create"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.setIamPolicy"},{"hostname":"managedidentities.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/peerings/{peeringsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/peerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.managedidentities","resource_name":"managedidentities.projects.locations.global.peerings.testIamPermissions"},{"hostname":"manufacturers.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications/{productCertificationsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.delete"},{"hostname":"manufacturers.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.delete"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications)$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.list"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications/{productCertificationsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.get"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/products","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.list"},{"hostname":"manufacturers.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.get"},{"hostname":"manufacturers.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/languages/{languagesId}/productCertifications/{productCertificationsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productCertifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.languages.productCertifications.patch"},{"hostname":"manufacturers.googleapis.com","http_method":"PUT","path_template":"/v1/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.manufacturers","resource_name":"manufacturers.accounts.products.update"},{"hostname":"marketingplatformadmin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/organizations/{organizationsId}/analyticsAccountLinks/{analyticsAccountLinksId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyticsAccountLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.marketingplatformadmin","resource_name":"marketingplatformadmin.organizations.analyticsAccountLinks.delete"},{"hostname":"marketingplatformadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.marketingplatformadmin","resource_name":"marketingplatformadmin.organizations.get"},{"hostname":"marketingplatformadmin.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/analyticsAccountLinks","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyticsAccountLinks)$","service_name":"google.marketingplatformadmin","resource_name":"marketingplatformadmin.organizations.analyticsAccountLinks.list"},{"hostname":"marketingplatformadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/analyticsAccountLinks","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyticsAccountLinks)$","service_name":"google.marketingplatformadmin","resource_name":"marketingplatformadmin.organizations.analyticsAccountLinks.create"},{"hostname":"marketingplatformadmin.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/analyticsAccountLinks/{analyticsAccountLinksId}:setPropertyServiceLevel","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/analyticsAccountLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setPropertyServiceLevel)$","service_name":"google.marketingplatformadmin","resource_name":"marketingplatformadmin.organizations.analyticsAccountLinks.setPropertyServiceLevel"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords","path_regex":"^(?:/v2/conferenceRecords)$","service_name":"google.meet","resource_name":"meet.conferenceRecords.list"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.conferenceRecords.get"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/participants","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants)$","service_name":"google.meet","resource_name":"meet.conferenceRecords.participants.list"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.conferenceRecords.participants.get"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}/participantSessions","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participantSessions)$","service_name":"google.meet","resource_name":"meet.conferenceRecords.participants.participantSessions.list"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/participants/{participantsId}/participantSessions/{participantSessionsId}","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participants/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/participantSessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.conferenceRecords.participants.participantSessions.get"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/recordings","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recordings)$","service_name":"google.meet","resource_name":"meet.conferenceRecords.recordings.list"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/recordings/{recordingsId}","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recordings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.conferenceRecords.recordings.get"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/transcripts","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transcripts)$","service_name":"google.meet","resource_name":"meet.conferenceRecords.transcripts.list"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transcripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.conferenceRecords.transcripts.get"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}/entries","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transcripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries)$","service_name":"google.meet","resource_name":"meet.conferenceRecords.transcripts.entries.list"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/conferenceRecords/{conferenceRecordsId}/transcripts/{transcriptsId}/entries/{entriesId}","path_regex":"^(?:/v2/conferenceRecords/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transcripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.conferenceRecords.transcripts.entries.get"},{"hostname":"meet.googleapis.com","http_method":"GET","path_template":"/v2/spaces/{spacesId}","path_regex":"^(?:/v2/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.spaces.get"},{"hostname":"meet.googleapis.com","http_method":"PATCH","path_template":"/v2/spaces/{spacesId}","path_regex":"^(?:/v2/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.meet","resource_name":"meet.spaces.patch"},{"hostname":"meet.googleapis.com","http_method":"POST","path_template":"/v2/spaces","path_regex":"^(?:/v2/spaces)$","service_name":"google.meet","resource_name":"meet.spaces.create"},{"hostname":"meet.googleapis.com","http_method":"POST","path_template":"/v2/spaces/{spacesId}:endActiveConference","path_regex":"^(?:/v2/spaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::endActiveConference)$","service_name":"google.meet","resource_name":"meet.spaces.endActiveConference"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.delete"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.delete"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.delete"},{"hostname":"memcache.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.delete"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.get"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.list"},{"hostname":"memcache.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.get"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.patch"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.updateParameters"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.patch"},{"hostname":"memcache.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateParameters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.updateParameters"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.create"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:applyParameters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.applyParameters"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.rescheduleMaintenance"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.upgrade"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.cancel"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.create"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:applyParameters","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyParameters)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.applyParameters"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:applySoftwareUpdate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applySoftwareUpdate)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.applySoftwareUpdate"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.rescheduleMaintenance"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.instances.upgrade"},{"hostname":"memcache.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.memcache","resource_name":"memcache.projects.locations.operations.cancel"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/accounts/v1beta/accounts/{accountsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/accounts/v1beta/accounts/{accountsId}/regions/{regionsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.regions.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/accounts/v1beta/accounts/{accountsId}/users/{usersId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.users.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/conversions/v1beta/accounts/{accountsId}/conversionSources/{conversionSourcesId}","path_regex":"^(?:/conversions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.conversionSources.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/datasources/v1beta/accounts/{accountsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/datasources/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.dataSources.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/inventories/v1beta/accounts/{accountsId}/products/{productsId}/localInventories/{localInventoriesId}","path_regex":"^(?:/inventories/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/localInventories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.localInventories.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/inventories/v1beta/accounts/{accountsId}/products/{productsId}/regionalInventories/{regionalInventoriesId}","path_regex":"^(?:/inventories/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalInventories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.regionalInventories.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/lfp/v1beta/accounts/{accountsId}/lfpStores/{lfpStoresId}","path_regex":"^(?:/lfp/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lfpStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.lfpStores.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/notifications/v1beta/accounts/{accountsId}/notificationsubscriptions/{notificationsubscriptionsId}","path_regex":"^(?:/notifications/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationsubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.notificationsubscriptions.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"DELETE","path_template":"/products/v1beta/accounts/{accountsId}/productInputs/{productInputsId}","path_regex":"^(?:/products/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productInputs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.productInputs.delete"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts","path_regex":"^(?:/accounts/v1beta/accounts)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/businessIdentity","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businessIdentity)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.businessIdentity.getBusinessIdentity"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/businessInfo","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businessInfo)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.businessInfo.getBusinessInfo"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/homepage","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/homepage)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.homepage.getHomepage"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/issues","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/issues)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.issues.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/onlineReturnPolicies","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onlineReturnPolicies)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.onlineReturnPolicies.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/onlineReturnPolicies/{onlineReturnPoliciesId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onlineReturnPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.onlineReturnPolicies.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/programs","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/programs)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.programs.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/programs/{programsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/programs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.programs.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/regions","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.regions.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/regions/{regionsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.regions.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/shippingSettings","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingSettings)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.shippingSettings.getShippingSettings"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/termsOfServiceAgreementStates/{termsOfServiceAgreementStatesId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/termsOfServiceAgreementStates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.termsOfServiceAgreementStates.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/termsOfServiceAgreementStates:retrieveForApplication","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/termsOfServiceAgreementStates:retrieveForApplication)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.termsOfServiceAgreementStates.retrieveForApplication"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/users","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.users.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/users/{usersId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.users.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}/users/{usersId}/emailPreferences","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/emailPreferences)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.emailpreferences.getEmailPreferences"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/accounts/{accountsId}:listSubaccounts","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSubaccounts)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.listSubaccounts"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/termsOfService/{termsOfServiceId}","path_regex":"^(?:/accounts/v1beta/termsOfService/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.termsOfService.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/termsOfService/{termsOfServiceId}:accept","path_regex":"^(?:/accounts/v1beta/termsOfService/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.merchantapi","resource_name":"merchantapi.termsOfService.accept"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/accounts/v1beta/termsOfService:retrieveLatest","path_regex":"^(?:/accounts/v1beta/termsOfService:retrieveLatest)$","service_name":"google.merchantapi","resource_name":"merchantapi.termsOfService.retrieveLatest"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/conversions/v1beta/accounts/{accountsId}/conversionSources","path_regex":"^(?:/conversions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionSources)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.conversionSources.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/conversions/v1beta/accounts/{accountsId}/conversionSources/{conversionSourcesId}","path_regex":"^(?:/conversions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.conversionSources.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/datasources/v1beta/accounts/{accountsId}/dataSources","path_regex":"^(?:/datasources/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.dataSources.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/datasources/v1beta/accounts/{accountsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/datasources/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.dataSources.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/inventories/v1beta/accounts/{accountsId}/products/{productsId}/localInventories","path_regex":"^(?:/inventories/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/localInventories)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.localInventories.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/inventories/v1beta/accounts/{accountsId}/products/{productsId}/regionalInventories","path_regex":"^(?:/inventories/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalInventories)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.regionalInventories.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/lfp/v1beta/accounts/{accountsId}/lfpStores","path_regex":"^(?:/lfp/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lfpStores)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.lfpStores.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/lfp/v1beta/accounts/{accountsId}/lfpStores/{lfpStoresId}","path_regex":"^(?:/lfp/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lfpStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.lfpStores.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/notifications/v1beta/accounts/{accountsId}/notificationsubscriptions","path_regex":"^(?:/notifications/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationsubscriptions)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.notificationsubscriptions.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/notifications/v1beta/accounts/{accountsId}/notificationsubscriptions/{notificationsubscriptionsId}","path_regex":"^(?:/notifications/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationsubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.notificationsubscriptions.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/products/v1beta/accounts/{accountsId}/products","path_regex":"^(?:/products/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/products/v1beta/accounts/{accountsId}/products/{productsId}","path_regex":"^(?:/products/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/promotions/v1beta/accounts/{accountsId}/promotions","path_regex":"^(?:/promotions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.promotions.list"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/promotions/v1beta/accounts/{accountsId}/promotions/{promotionsId}","path_regex":"^(?:/promotions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.promotions.get"},{"hostname":"merchantapi.googleapis.com","http_method":"GET","path_template":"/quota/v1beta/accounts/{accountsId}/quotas","path_regex":"^(?:/quota/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/quotas)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.quotas.list"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.patch"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}/businessIdentity","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businessIdentity)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.businessIdentity.updateBusinessIdentity"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}/businessInfo","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businessInfo)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.businessInfo.updateBusinessInfo"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}/homepage","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/homepage)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.homepage.updateHomepage"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}/regions/{regionsId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.regions.patch"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}/users/{usersId}","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.users.patch"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/accounts/v1beta/accounts/{accountsId}/users/{usersId}/emailPreferences","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/emailPreferences)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.emailpreferences.updateEmailPreferences"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/conversions/v1beta/accounts/{accountsId}/conversionSources/{conversionSourcesId}","path_regex":"^(?:/conversions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.conversionSources.patch"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/datasources/v1beta/accounts/{accountsId}/dataSources/{dataSourcesId}","path_regex":"^(?:/datasources/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.dataSources.patch"},{"hostname":"merchantapi.googleapis.com","http_method":"PATCH","path_template":"/notifications/v1beta/accounts/{accountsId}/notificationsubscriptions/{notificationsubscriptionsId}","path_regex":"^(?:/notifications/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationsubscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.notificationsubscriptions.patch"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/homepage:claim","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/homepage:claim)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.homepage.claim"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/homepage:unclaim","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/homepage:unclaim)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.homepage.unclaim"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/programs/{programsId}:disable","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/programs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.programs.disable"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/programs/{programsId}:enable","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/programs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.programs.enable"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/regions","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.regions.create"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/shippingSettings:insert","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingSettings:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.shippingSettings.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts/{accountsId}/users","path_regex":"^(?:/accounts/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.users.create"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/accounts/v1beta/accounts:createAndConfigure","path_regex":"^(?:/accounts/v1beta/accounts:createAndConfigure)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.createAndConfigure"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/conversions/v1beta/accounts/{accountsId}/conversionSources","path_regex":"^(?:/conversions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionSources)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.conversionSources.create"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/conversions/v1beta/accounts/{accountsId}/conversionSources/{conversionSourcesId}:undelete","path_regex":"^(?:/conversions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.conversionSources.undelete"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/datasources/v1beta/accounts/{accountsId}/dataSources","path_regex":"^(?:/datasources/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.dataSources.create"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/datasources/v1beta/accounts/{accountsId}/dataSources/{dataSourcesId}:fetch","path_regex":"^(?:/datasources/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dataSources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetch)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.dataSources.fetch"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/inventories/v1beta/accounts/{accountsId}/products/{productsId}/localInventories:insert","path_regex":"^(?:/inventories/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/localInventories:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.localInventories.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/inventories/v1beta/accounts/{accountsId}/products/{productsId}/regionalInventories:insert","path_regex":"^(?:/inventories/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalInventories:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.products.regionalInventories.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/lfp/v1beta/accounts/{accountsId}/lfpInventories:insert","path_regex":"^(?:/lfp/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lfpInventories:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.lfpInventories.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/lfp/v1beta/accounts/{accountsId}/lfpSales:insert","path_regex":"^(?:/lfp/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lfpSales:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.lfpSales.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/lfp/v1beta/accounts/{accountsId}/lfpStores:insert","path_regex":"^(?:/lfp/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lfpStores:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.lfpStores.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/notifications/v1beta/accounts/{accountsId}/notificationsubscriptions","path_regex":"^(?:/notifications/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationsubscriptions)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.notificationsubscriptions.create"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/products/v1beta/accounts/{accountsId}/productInputs:insert","path_regex":"^(?:/products/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productInputs:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.productInputs.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/promotions/v1beta/accounts/{accountsId}/promotions:insert","path_regex":"^(?:/promotions/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions:insert)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.promotions.insert"},{"hostname":"merchantapi.googleapis.com","http_method":"POST","path_template":"/reports/v1beta/accounts/{accountsId}/reports:search","path_regex":"^(?:/reports/v1beta/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports:search)$","service_name":"google.merchantapi","resource_name":"merchantapi.accounts.reports.search"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions/{migrationExecutionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions/{migrationExecutionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.delete"},{"hostname":"metastore.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions/{migrationExecutionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.delete"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions/{migrationExecutionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions/{migrationExecutionsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.list"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/migrationExecutions/{migrationExecutionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migrationExecutions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.migrationExecutions.get"},{"hostname":"metastore.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.getIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.patch"},{"hostname":"metastore.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports/{metadataImportsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.patch"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterLocation","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterLocation)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterLocation"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterTableProperties","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterTableProperties)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterTableProperties"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:cancelMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.cancelMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:completeMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.completeMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:exportMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.exportMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:moveTableToDatabase","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveTableToDatabase)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.moveTableToDatabase"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:queryMetadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.queryMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.restore"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:startMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.startMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/{servicesId1}:removeIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.removeIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterLocation","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterLocation)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterLocation"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterTableProperties","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterTableProperties)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterTableProperties"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:cancelMigration","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.cancelMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:completeMigration","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.completeMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:exportMetadata","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.exportMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:moveTableToDatabase","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveTableToDatabase)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.moveTableToDatabase"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:queryMetadata","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.queryMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:restore","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.restore"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:startMigration","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.startMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/federations/{federationsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/federations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.federations.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.operations.cancel"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.backups.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}/tables/{tablesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.tables.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/databases/{databasesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.databases.testIamPermissions"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/metadataImports","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadataImports)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.metadataImports.create"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/{servicesId1}:removeIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.removeIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterLocation","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterLocation)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterLocation"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:alterTableProperties","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::alterTableProperties)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.alterTableProperties"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:cancelMigration","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancelMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.cancelMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:completeMigration","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.completeMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:exportMetadata","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.exportMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:moveTableToDatabase","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::moveTableToDatabase)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.moveTableToDatabase"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:queryMetadata","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::queryMetadata)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.queryMetadata"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:restore","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::restore)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.restore"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.setIamPolicy"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:startMigration","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.startMigration"},{"hostname":"metastore.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.metastore","resource_name":"metastore.projects.locations.services.testIamPermissions"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles/{importDataFilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports/{reportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assetsExportJobs/{assetsExportJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assetsExportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assetsExportJobs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles/{importDataFilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports/{reportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.delete"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveryClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles/{importDataFilesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/preferenceSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports/{reportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.getSettings"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/errorFrames","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorFrames)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.errorFrames.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/errorFrames/{errorFramesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorFrames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.errorFrames.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assetsExportJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assetsExportJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assetsExportJobs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assetsExportJobs/{assetsExportJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assetsExportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assetsExportJobs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/discoveryClients","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles/{importDataFilesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports/{reportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.getSettings"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/errorFrames","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorFrames)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.errorFrames.list"},{"hostname":"migrationcenter.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/errorFrames/{errorFramesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorFrames/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.errorFrames.get"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.updateSettings"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets/{assetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets/{preferenceSetsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/settings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.updateSettings"},{"hostname":"migrationcenter.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.patch"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets:aggregateValues","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:aggregateValues)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.aggregateValues"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets:batchDelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:batchDelete)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.batchDelete"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets:batchUpdate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:batchUpdate)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.batchUpdate"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/assets:reportAssetFrames","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:reportAssetFrames)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.reportAssetFrames"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveryClients","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}:sendHeartbeat","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sendHeartbeat)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.sendHeartbeat"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addAssets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addAssets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.addAssets"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeAssets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeAssets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.removeAssets"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.run"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.validate"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.cancel"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/preferenceSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:aggregateValues","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:aggregateValues)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.aggregateValues"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:batchDelete","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:batchDelete)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.batchDelete"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:batchUpdate","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:batchUpdate)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.batchUpdate"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assets:reportAssetFrames","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:reportAssetFrames)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assets.reportAssetFrames"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assetsExportJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assetsExportJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assetsExportJobs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/assetsExportJobs/{assetsExportJobsId}:run","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assetsExportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.assetsExportJobs.run"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/discoveryClients","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/discoveryClients/{discoveryClientsId}:sendHeartbeat","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/discoveryClients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sendHeartbeat)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.discoveryClients.sendHeartbeat"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addAssets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addAssets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.addAssets"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeAssets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeAssets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.groups.removeAssets"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}/importDataFiles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importDataFiles)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.importDataFiles.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}:run","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.run"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/importJobs/{importJobsId}:validate","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/importJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.importJobs.validate"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.operations.cancel"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/preferenceSets","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferenceSets)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.preferenceSets.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/reportConfigs/{reportConfigsId}/reports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reportConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.reportConfigs.reports.create"},{"hostname":"migrationcenter.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.migrationcenter","resource_name":"migrationcenter.projects.locations.sources.create"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.delete"},{"hostname":"ml.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.operations.delete"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.ml","resource_name":"ml.projects.locations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.ml","resource_name":"ml.projects.locations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.operations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/models/{modelsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.getIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ml","resource_name":"ml.projects.operations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ml","resource_name":"ml.projects.operations.list"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.operations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.operations.get"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}:getConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getConfig)$","service_name":"google.ml","resource_name":"ml.projects.getConfig"},{"hostname":"ml.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}:getConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getConfig)$","service_name":"google.ml","resource_name":"ml.projects.getConfig"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.jobs.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.patch"},{"hostname":"ml.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ml","resource_name":"ml.projects.models.versions.patch"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.ml","resource_name":"ml.projects.jobs.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.jobs.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.jobs.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.jobs.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.jobs.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.jobs.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.locations.operations.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:addMeasurement","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addMeasurement)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.addMeasurement"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:checkEarlyStoppingState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkEarlyStoppingState)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.checkEarlyStoppingState"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:complete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.complete"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials/{trialsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.stop"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:listOptimalTrials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:listOptimalTrials)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.listOptimalTrials"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/studies/{studiesId}/trials:suggest","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/studies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trials:suggest)$","service_name":"google.ml","resource_name":"ml.projects.locations.studies.trials.suggest"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.ml","resource_name":"ml.projects.models.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.create"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}:setDefault","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefault)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.setDefault"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}/versions/{versionsId}:setDefault","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefault)$","service_name":"google.ml","resource_name":"ml.projects.models.versions.setDefault"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.ml","resource_name":"ml.projects.models.setIamPolicy"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.models.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/models/{modelsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.ml","resource_name":"ml.projects.models.testIamPermissions"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.operations.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ml","resource_name":"ml.projects.operations.cancel"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:explain","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::explain)$","service_name":"google.ml","resource_name":"ml.projects.explain"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:predict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.ml","resource_name":"ml.projects.predict"},{"hostname":"ml.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}:predict","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.ml","resource_name":"ml.projects.predict"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/global/metricsScopes/{metricsScopesId}/projects/{projectsId}","path_regex":"^(?:/v1/locations/global/metricsScopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.projects.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/dashboards/{dashboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/alertPolicies/{alertPoliciesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs/{uptimeCheckConfigsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.delete"},{"hostname":"monitoring.googleapis.com","http_method":"DELETE","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives/{serviceLevelObjectivesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.delete"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/locations/global/metricsScopes/{metricsScopesId}","path_regex":"^(?:/v1/locations/global/metricsScopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/locations/global/metricsScopes:listMetricsScopesByMonitoredProject","path_regex":"^(?:/v1/locations/global/metricsScopes:listMetricsScopesByMonitoredProject)$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.listMetricsScopesByMonitoredProject"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.operations.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dashboards","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards)$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/dashboards/{dashboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/label/{label}/values","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/label/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.label.values"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/metadata","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/metadata)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.metadata.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/folders/{foldersId}/timeSeries","path_regex":"^(?:/v3/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.folders.timeSeries.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/organizations/{organizationsId}/timeSeries","path_regex":"^(?:/v3/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.organizations.timeSeries.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/alertPolicies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies)$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/alertPolicies/{alertPoliciesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/groups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/groups/{groupsId}/members","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members)$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.members.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/metricDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/metricDescriptors/{metricDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/monitoredResourceDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoredResourceDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.monitoredResourceDescriptors.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/monitoredResourceDescriptors/{monitoredResourceDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/monitoredResourceDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.monitoredResourceDescriptors.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannelDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannelDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannelDescriptors.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannelDescriptors/{notificationChannelDescriptorsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannelDescriptors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannelDescriptors.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannels","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/snoozes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes)$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/snoozes/{snoozesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/timeSeries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs)$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs/{uptimeCheckConfigsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/uptimeCheckIps","path_regex":"^(?:/v3/uptimeCheckIps)$","service_name":"google.monitoring","resource_name":"monitoring.uptimeCheckIps.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.monitoring","resource_name":"monitoring.services.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.get"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives)$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.list"},{"hostname":"monitoring.googleapis.com","http_method":"GET","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives/{serviceLevelObjectivesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.get"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/dashboards/{dashboardsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/alertPolicies/{alertPoliciesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/snoozes/{snoozesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs/{uptimeCheckConfigsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.patch"},{"hostname":"monitoring.googleapis.com","http_method":"PATCH","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives/{serviceLevelObjectivesId}","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.patch"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/locations/global/metricsScopes/{metricsScopesId}/projects","path_regex":"^(?:/v1/locations/global/metricsScopes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.monitoring","resource_name":"monitoring.locations.global.metricsScopes.projects.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/dashboards","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dashboards)$","service_name":"google.monitoring","resource_name":"monitoring.projects.dashboards.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/labels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/labels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.labels"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/query)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.query"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/query_exemplars","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/query_exemplars)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.query_exemplars"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/query_range","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/query_range)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.query_range"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/location/{location}/prometheus/api/v1/series","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/location/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/prometheus/api/v1/series)$","service_name":"google.monitoring","resource_name":"monitoring.projects.location.prometheus.api.v1.series"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/alertPolicies","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertPolicies)$","service_name":"google.monitoring","resource_name":"monitoring.projects.alertPolicies.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/collectdTimeSeries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectdTimeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.projects.collectdTimeSeries.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/groups","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/metricDescriptors","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metricDescriptors)$","service_name":"google.monitoring","resource_name":"monitoring.projects.metricDescriptors.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}:getVerificationCode","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getVerificationCode)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.getVerificationCode"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}:sendVerificationCode","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sendVerificationCode)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.sendVerificationCode"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/notificationChannels/{notificationChannelsId}:verify","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationChannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.monitoring","resource_name":"monitoring.projects.notificationChannels.verify"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/snoozes","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snoozes)$","service_name":"google.monitoring","resource_name":"monitoring.projects.snoozes.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/timeSeries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/timeSeries:createService","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries:createService)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.createService"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/timeSeries:query","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/timeSeries:query)$","service_name":"google.monitoring","resource_name":"monitoring.projects.timeSeries.query"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/uptimeCheckConfigs","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uptimeCheckConfigs)$","service_name":"google.monitoring","resource_name":"monitoring.projects.uptimeCheckConfigs.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/{v3Id}/{v3Id1}/services","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.monitoring","resource_name":"monitoring.services.create"},{"hostname":"monitoring.googleapis.com","http_method":"POST","path_template":"/v3/{v3Id}/{v3Id1}/services/{servicesId}/serviceLevelObjectives","path_regex":"^(?:/v3/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLevelObjectives)$","service_name":"google.monitoring","resource_name":"monitoring.services.serviceLevelObjectives.create"},{"hostname":"monitoring.googleapis.com","http_method":"PUT","path_template":"/v3/projects/{projectsId}/groups/{groupsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.monitoring","resource_name":"monitoring.projects.groups.update"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/accounts/{accountsId}/admins/{adminsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.delete"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/admins/{adminsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.delete"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts","path_regex":"^(?:/v1/accounts)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.get"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/admins","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/invitations","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.invitations.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/admins","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.list"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.patch"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/admins/{adminsId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.patch"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/admins/{adminsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.patch"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts","path_regex":"^(?:/v1/accounts)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.create"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/admins","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.admins.create"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/invitations/{invitationsId}:accept","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accept)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.invitations.accept"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/invitations/{invitationsId}:decline","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/invitations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decline)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.accounts.invitations.decline"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/admins","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/admins)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.admins.create"},{"hostname":"mybusinessaccountmanagement.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:transfer","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::transfer)$","service_name":"google.mybusinessaccountmanagement","resource_name":"mybusinessaccountmanagement.locations.transfer"},{"hostname":"mybusinessbusinesscalls.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/businesscallsinsights","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businesscallsinsights)$","service_name":"google.mybusinessbusinesscalls","resource_name":"mybusinessbusinesscalls.locations.businesscallsinsights.list"},{"hostname":"mybusinessbusinesscalls.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/businesscallssettings","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businesscallssettings)$","service_name":"google.mybusinessbusinesscalls","resource_name":"mybusinessbusinesscalls.locations.getBusinesscallssettings"},{"hostname":"mybusinessbusinesscalls.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/businesscallssettings","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/businesscallssettings)$","service_name":"google.mybusinessbusinesscalls","resource_name":"mybusinessbusinesscalls.locations.updateBusinesscallssettings"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.delete"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/locations","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.accounts.locations.list"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/attributes","path_regex":"^(?:/v1/attributes)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.attributes.list"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/categories","path_regex":"^(?:/v1/categories)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.categories.list"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/categories:batchGet","path_regex":"^(?:/v1/categories:batchGet)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.categories.batchGet"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/chains/{chainsId}","path_regex":"^(?:/v1/chains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.chains.get"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/chains:search","path_regex":"^(?:/v1/chains:search)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.chains.search"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.get"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/attributes","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.getAttributes"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/attributes:getGoogleUpdated","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes:getGoogleUpdated)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.attributes.getGoogleUpdated"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}:getGoogleUpdated","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getGoogleUpdated)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.getGoogleUpdated"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.patch"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/attributes","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributes)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.locations.updateAttributes"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"POST","path_template":"/v1/accounts/{accountsId}/locations","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.accounts.locations.create"},{"hostname":"mybusinessbusinessinformation.googleapis.com","http_method":"POST","path_template":"/v1/googleLocations:search","path_regex":"^(?:/v1/googleLocations:search)$","service_name":"google.mybusinessbusinessinformation","resource_name":"mybusinessbusinessinformation.googleLocations.search"},{"hostname":"mybusinesslodging.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/lodging","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lodging)$","service_name":"google.mybusinesslodging","resource_name":"mybusinesslodging.locations.getLodging"},{"hostname":"mybusinesslodging.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/lodging:getGoogleUpdated","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lodging:getGoogleUpdated)$","service_name":"google.mybusinesslodging","resource_name":"mybusinesslodging.locations.lodging.getGoogleUpdated"},{"hostname":"mybusinesslodging.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/lodging","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lodging)$","service_name":"google.mybusinesslodging","resource_name":"mybusinesslodging.locations.updateLodging"},{"hostname":"mybusinessnotifications.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountsId}/notificationSetting","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationSetting)$","service_name":"google.mybusinessnotifications","resource_name":"mybusinessnotifications.accounts.getNotificationSetting"},{"hostname":"mybusinessnotifications.googleapis.com","http_method":"PATCH","path_template":"/v1/accounts/{accountsId}/notificationSetting","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationSetting)$","service_name":"google.mybusinessnotifications","resource_name":"mybusinessnotifications.accounts.updateNotificationSetting"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/placeActionLinks/{placeActionLinksId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.delete"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/placeActionLinks","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks)$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.list"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/placeActionLinks/{placeActionLinksId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.get"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"GET","path_template":"/v1/placeActionTypeMetadata","path_regex":"^(?:/v1/placeActionTypeMetadata)$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.placeActionTypeMetadata.list"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/placeActionLinks/{placeActionLinksId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.patch"},{"hostname":"mybusinessplaceactions.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/placeActionLinks","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placeActionLinks)$","service_name":"google.mybusinessplaceactions","resource_name":"mybusinessplaceactions.locations.placeActionLinks.create"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/questions/{questionsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.delete"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"DELETE","path_template":"/v1/locations/{locationsId}/questions/{questionsId}/answers:delete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers:delete)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.answers.delete"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/questions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.list"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/questions/{questionsId}/answers","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.answers.list"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"PATCH","path_template":"/v1/locations/{locationsId}/questions/{questionsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.patch"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/questions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.create"},{"hostname":"mybusinessqanda.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/questions/{questionsId}/answers:upsert","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/questions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/answers:upsert)$","service_name":"google.mybusinessqanda","resource_name":"mybusinessqanda.locations.questions.answers.upsert"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/VoiceOfMerchantState","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/VoiceOfMerchantState)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.getVoiceOfMerchantState"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/verifications","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifications)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.verifications.list"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}/verifications/{verificationsId}:complete","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::complete)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.verifications.complete"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:fetchVerificationOptions","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchVerificationOptions)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.fetchVerificationOptions"},{"hostname":"mybusinessverifications.googleapis.com","http_method":"POST","path_template":"/v1/locations/{locationsId}:verify","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.mybusinessverifications","resource_name":"mybusinessverifications.locations.verify"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/regionalEndpoints/{regionalEndpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.regionalEndpoints.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionTokens/{serviceConnectionTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionTokens.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.delete"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.groups.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.groups.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/groups/{groupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.groups.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/routeTables","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routeTables)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.routeTables.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/routeTables/{routeTablesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routeTables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.routeTables.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/routeTables/{routeTablesId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routeTables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.routeTables.routes.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/routeTables/{routeTablesId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routeTables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.routeTables.routes.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:listSpokes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSpokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.listSpokes"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/regionalEndpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalEndpoints)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.regionalEndpoints.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/regionalEndpoints/{regionalEndpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.regionalEndpoints.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionTokens)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionTokens.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionTokens/{serviceConnectionTokensId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionTokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionTokens.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.list"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.get"},{"hostname":"networkconnectivity.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:getIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.getIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.groups.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.patch"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/groups/{groupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.groups.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}/groups/{groupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.groups.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:acceptSpoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acceptSpoke)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.acceptSpoke"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:rejectSpoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rejectSpoke)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.rejectSpoke"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/hubs/{hubsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/policyBasedRoutes/{policyBasedRoutesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/policyBasedRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.policyBasedRoutes.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.cancel"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/regionalEndpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalEndpoints)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.regionalEndpoints.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceClasses/{serviceClassesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceClasses.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionMaps/{serviceConnectionMapsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionMaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionMaps.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionPolicies/{serviceConnectionPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionPolicies.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceConnectionTokens","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceConnectionTokens)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.serviceConnectionTokens.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/global/hubs/{hubsId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/hubs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.global.hubs.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/internalRanges/{internalRangesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/internalRanges/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.internalRanges.testIamPermissions"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.operations.cancel"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.create"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:setIamPolicy","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.setIamPolicy"},{"hostname":"networkconnectivity.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/spokes/{spokesId}:testIamPermissions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spokes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkconnectivity","resource_name":"networkconnectivity.projects.locations.spokes.testIamPermissions"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.delete"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.getIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.getIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.list"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.get"},{"hostname":"networkmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.patch"},{"hostname":"networkmanagement.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.patch"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.create"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:rerun","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rerun)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.rerun"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.setIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.testIamPermissions"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.cancel"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.create"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:rerun","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rerun)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.rerun"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.setIamPolicy"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/connectivityTests/{connectivityTestsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/connectivityTests/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.connectivityTests.testIamPermissions"},{"hostname":"networkmanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/global/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkmanagement","resource_name":"networkmanagement.projects.locations.global.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints/{firewallEndpointsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups/{securityProfileGroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations/{firewallEndpointAssociationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints/{firewallEndpointsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups/{securityProfileGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations/{firewallEndpointAssociationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.delete"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:listReferences","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listReferences)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.listReferences"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints/{firewallEndpointsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups/{securityProfileGroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:listReferences","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listReferences)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.listReferences"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations/{firewallEndpointAssociationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:listReferences","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listReferences)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.listReferences"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints/{firewallEndpointsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups/{securityProfileGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:listReferences","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listReferences)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.listReferences"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations/{firewallEndpointAssociationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.getIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.get"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.list"},{"hostname":"networksecurity.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.get"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints/{firewallEndpointsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups/{securityProfileGroupsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations/{firewallEndpointAssociationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints/{firewallEndpointsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups/{securityProfileGroupsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles/{securityProfilesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations/{firewallEndpointAssociationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules/{rulesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies/{tlsInspectionPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists/{urlListsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.patch"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:addItems","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.addItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:cloneItems","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cloneItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.cloneItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:removeItems","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.removeItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:addItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.addItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:cloneItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cloneItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.cloneItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:removeItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.removeItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:addItems","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.addItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:cloneItems","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cloneItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.cloneItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:removeItems","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.addressGroups.removeItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/firewallEndpoints","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpoints)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.firewallEndpoints.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfileGroups","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfileGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfileGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/securityProfiles","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityProfiles)$","service_name":"google.networksecurity","resource_name":"networksecurity.organizations.locations.securityProfiles.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:addItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.addItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:cloneItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cloneItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.cloneItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:removeItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeItems)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.removeItems"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/addressGroups/{addressGroupsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addressGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.addressGroups.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authorizationPolicies/{authorizationPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizationPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authorizationPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzPolicies/{authzPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.authzPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clientTlsPolicies/{clientTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clientTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.clientTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/firewallEndpointAssociations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallEndpointAssociations)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.firewallEndpointAssociations.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gatewaySecurityPolicies/{gatewaySecurityPoliciesId}/rules","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gatewaySecurityPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.gatewaySecurityPolicies.rules.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.operations.cancel"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.setIamPolicy"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serverTlsPolicies/{serverTlsPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serverTlsPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.serverTlsPolicies.testIamPermissions"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsInspectionPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsInspectionPolicies)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.tlsInspectionPolicies.create"},{"hostname":"networksecurity.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/urlLists","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlLists)$","service_name":"google.networksecurity","resource_name":"networksecurity.projects.locations.urlLists.create"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions/{lbRouteExtensionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions/{lbTrafficExtensionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzExtensions/{authzExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.authzExtensions.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions/{lbRouteExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions/{lbTrafficExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.delete"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheKeysets/{edgeCacheKeysetsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheKeysets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheKeysets.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheOrigins/{edgeCacheOriginsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheOrigins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheOrigins.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheServices/{edgeCacheServicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheServices.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions/{lbRouteExtensionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions/{lbTrafficExtensionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzExtensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.authzExtensions.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzExtensions/{authzExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.authzExtensions.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions/{lbRouteExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions/{lbTrafficExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings/{serviceBindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.getIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.list"},{"hostname":"networkservices.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.get"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions/{lbRouteExtensionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions/{lbTrafficExtensionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzExtensions/{authzExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.authzExtensions.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies/{endpointPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways/{gatewaysId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes/{grpcRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes/{httpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions/{lbRouteExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions/{lbTrafficExtensionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes/{meshesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes/{tcpRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes/{tlsRoutesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.patch"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheKeysets/{edgeCacheKeysetsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheKeysets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheKeysets.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheKeysets/{edgeCacheKeysetsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheKeysets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheKeysets.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheOrigins/{edgeCacheOriginsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheOrigins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheOrigins.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheOrigins/{edgeCacheOriginsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheOrigins/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheOrigins.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheServices/{edgeCacheServicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheServices.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/edgeCacheServices/{edgeCacheServicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/edgeCacheServices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.edgeCacheServices.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.cancel"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/authzExtensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authzExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.authzExtensions.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/endpointPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpointPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.endpointPolicies.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/gateways","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gateways)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.gateways.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/grpcRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/grpcRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.grpcRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/httpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/httpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.httpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbRouteExtensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbRouteExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbRouteExtensions.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/lbTrafficExtensions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lbTrafficExtensions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.lbTrafficExtensions.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/meshes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/meshes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.meshes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.operations.cancel"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceBindings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceBindings)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceBindings.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.setIamPolicy"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/serviceLbPolicies/{serviceLbPoliciesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceLbPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.serviceLbPolicies.testIamPermissions"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tcpRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tcpRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tcpRoutes.create"},{"hostname":"networkservices.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/tlsRoutes","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tlsRoutes)$","service_name":"google.networkservices","resource_name":"networkservices.projects.locations.tlsRoutes.create"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.delete"},{"hostname":"notebooks.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.delete"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments/{environmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getInstanceHealth","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getInstanceHealth)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getInstanceHealth"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:isUpgradeable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::isUpgradeable)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.isUpgradeable"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.getIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.get"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:checkUpgradability","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::checkUpgradability)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.checkUpgradability"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances:getConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances:getConfig)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.getConfig"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.list"},{"hostname":"notebooks.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.get"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setAccelerator","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setAccelerator)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setAccelerator"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setLabels","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setLabels)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setLabels"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setMachineType","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMachineType)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setMachineType"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateConfig)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.updateConfig"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateMetadataItems","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateMetadataItems)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.updateMetadataItems"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:updateShieldedInstanceConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateShieldedInstanceConfig)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.updateShieldedInstanceConfig"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.patch"},{"hostname":"notebooks.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.patch"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/environments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.environments.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.executions.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:diagnose","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.diagnose"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:migrate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::migrate)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.migrate"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:report","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::report)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.report"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reportEvent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportEvent)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.reportEvent"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reset","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.reset"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.rollback"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.start"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.stop"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.testIamPermissions"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.upgrade"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgradeInternal","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeInternal)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.upgradeInternal"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances:register","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances:register)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.register"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.cancel"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:diagnose","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.diagnose"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:migrate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::migrate)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.migrate"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:refreshRuntimeTokenInternal","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::refreshRuntimeTokenInternal)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.refreshRuntimeTokenInternal"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:reportEvent","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportEvent)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.reportEvent"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:reset","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.reset"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.setIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.start"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.stop"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:switch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::switch)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.switch"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.testIamPermissions"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/runtimes/{runtimesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.runtimes.upgrade"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/schedules/{schedulesId}:trigger","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::trigger)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.schedules.trigger"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.create"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:diagnose","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::diagnose)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.diagnose"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reportInfoSystem","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reportInfoSystem)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.reportInfoSystem"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:reset","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.reset"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:resizeDisk","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resizeDisk)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.resizeDisk"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rollback","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.rollback"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.setIamPolicy"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:start","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.start"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:stop","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.stop"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.testIamPermissions"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.upgrade"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgradeSystem","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeSystem)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.instances.upgradeSystem"},{"hostname":"notebooks.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.notebooks","resource_name":"notebooks.projects.locations.operations.cancel"},{"hostname":"ondemandscanning.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.delete"},{"hostname":"ondemandscanning.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.delete"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.get"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scans/{scansId}/vulnerabilities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilities)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.vulnerabilities.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.get"},{"hostname":"ondemandscanning.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/scans/{scansId}/vulnerabilities","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilities)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.vulnerabilities.list"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.cancel"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.wait"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/scans:analyzePackages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans:analyzePackages)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.analyzePackages"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.cancel"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.operations.wait"},{"hostname":"ondemandscanning.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/scans:analyzePackages","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans:analyzePackages)$","service_name":"google.ondemandscanning","resource_name":"ondemandscanning.projects.locations.scans.analyzePackages"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/folders/{foldersId}/policies/{policiesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/customConstraints/{customConstraintsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/policies/{policiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.delete"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/constraints","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/constraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.constraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/policies","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/policies/{policiesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/folders/{foldersId}/policies/{policiesId}:getEffectivePolicy","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectivePolicy)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.getEffectivePolicy"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/constraints","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/constraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.constraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/customConstraints","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/customConstraints/{customConstraintsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/policies","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}:getEffectivePolicy","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectivePolicy)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.getEffectivePolicy"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/constraints","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/constraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.constraints.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/policies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.list"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/policies/{policiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.get"},{"hostname":"orgpolicy.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/policies/{policiesId}:getEffectivePolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getEffectivePolicy)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.getEffectivePolicy"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/folders/{foldersId}/policies/{policiesId}","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/customConstraints/{customConstraintsId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/organizations/{organizationsId}/policies/{policiesId}","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/policies/{policiesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.patch"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/folders/{foldersId}/policies","path_regex":"^(?:/v2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.folders.policies.create"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/customConstraints","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customConstraints)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.customConstraints.create"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/organizations/{organizationsId}/policies","path_regex":"^(?:/v2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.organizations.policies.create"},{"hostname":"orgpolicy.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/policies","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/policies)$","service_name":"google.orgpolicy","resource_name":"orgpolicy.projects.policies.create"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/guestPolicies/{guestPoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.delete"},{"hostname":"osconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.delete"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/global/projectFeatureSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/projectFeatureSettings)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.global.getProjectFeatureSettings"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventories","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventories)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventory","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/report","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/report)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/reports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReport","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReport)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.listRevisions"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchJobs/{patchJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/patchJobs/{patchJobsId}/instanceDetails","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceDetails)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.instanceDetails.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instanceOSPoliciesCompliances","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceOSPoliciesCompliances)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instanceOSPoliciesCompliances.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instanceOSPoliciesCompliances/{instanceOSPoliciesCompliancesId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceOSPoliciesCompliances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instanceOSPoliciesCompliances.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventories","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventories)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/inventory","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.inventories.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/report","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/report)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/osPolicyAssignments/{osPolicyAssignmentsId}/reports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.osPolicyAssignments.reports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReport","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReport)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/vulnerabilityReports","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vulnerabilityReports)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.instances.vulnerabilityReports.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}:listRevisions","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.listRevisions"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/guestPolicies","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies)$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/guestPolicies/{guestPoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchJobs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.list"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchJobs/{patchJobsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.get"},{"hostname":"osconfig.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/patchJobs/{patchJobsId}/instanceDetails","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceDetails)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.instanceDetails.list"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/global/projectFeatureSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/global/projectFeatureSettings)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.global.updateProjectFeatureSettings"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/guestPolicies/{guestPoliciesId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.patch"},{"hostname":"osconfig.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.patch"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.pause"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.resume"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchJobs/{patchJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/patchJobs:execute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs:execute)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.execute"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/osPolicyAssignments/{osPolicyAssignmentsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/osPolicyAssignments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.locations.osPolicyAssignments.operations.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/guestPolicies","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/guestPolicies)$","service_name":"google.osconfig","resource_name":"osconfig.projects.guestPolicies.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchDeployments","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.create"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:pause","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.pause"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchDeployments/{patchDeploymentsId}:resume","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchDeployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchDeployments.resume"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchJobs/{patchJobsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.cancel"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/patchJobs:execute","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/patchJobs:execute)$","service_name":"google.osconfig","resource_name":"osconfig.projects.patchJobs.execute"},{"hostname":"osconfig.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/zones/{zonesId}/instances/{instancesId}:lookupEffectiveGuestPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::lookupEffectiveGuestPolicy)$","service_name":"google.osconfig","resource_name":"osconfig.projects.zones.instances.lookupEffectiveGuestPolicy"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1/users/{usersId}/projects/{projectsId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/users/{usersId}/projects/{projectsId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/users/{usersId}/projects/{projectsId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.delete"},{"hostname":"oslogin.googleapis.com","http_method":"DELETE","path_template":"/v1beta/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.delete"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/loginProfile","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loginProfile)$","service_name":"google.oslogin","resource_name":"oslogin.users.getLoginProfile"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.get"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1alpha/users/{usersId}/loginProfile","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loginProfile)$","service_name":"google.oslogin","resource_name":"oslogin.users.getLoginProfile"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1alpha/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.get"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1beta/users/{usersId}/loginProfile","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loginProfile)$","service_name":"google.oslogin","resource_name":"oslogin.users.getLoginProfile"},{"hostname":"oslogin.googleapis.com","http_method":"GET","path_template":"/v1beta/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.get"},{"hostname":"oslogin.googleapis.com","http_method":"PATCH","path_template":"/v1/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.patch"},{"hostname":"oslogin.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.patch"},{"hostname":"oslogin.googleapis.com","http_method":"PATCH","path_template":"/v1beta/users/{usersId}/sshPublicKeys/{sshPublicKeysId}","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.patch"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}/sshPublicKeys","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys)$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.create"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1/users/{usersId}:importSshPublicKey","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.importSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1alpha/users/{usersId}/projects/{projectsId}/locations/{locationsId}:signSshPublicKey","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.locations.signSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1alpha/users/{usersId}/projects/{projectsId}/zones/{zonesId}:signSshPublicKey","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.zones.signSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1alpha/users/{usersId}/sshPublicKeys","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys)$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.create"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1alpha/users/{usersId}:importSshPublicKey","path_regex":"^(?:/v1alpha/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.importSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1beta/users/{usersId}/projects/{projectsId}/locations/{locationsId}:signSshPublicKey","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.locations.signSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1beta/users/{usersId}/projects/{projectsId}/zones/{zonesId}:signSshPublicKey","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.projects.zones.signSshPublicKey"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1beta/users/{usersId}/sshPublicKeys","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sshPublicKeys)$","service_name":"google.oslogin","resource_name":"oslogin.users.sshPublicKeys.create"},{"hostname":"oslogin.googleapis.com","http_method":"POST","path_template":"/v1beta/users/{usersId}:importSshPublicKey","path_regex":"^(?:/v1beta/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importSshPublicKey)$","service_name":"google.oslogin","resource_name":"oslogin.users.importSshPublicKey"},{"hostname":"pagespeedonline.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v5/runPagespeed","path_regex":"^(?:/pagespeedonline/v5/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"partners.googleapis.com","http_method":"DELETE","path_template":"/v2/users/{userId}/companyRelation","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companyRelation)$","service_name":"google.partners","resource_name":"partners.users.deleteCompanyRelation"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/analytics","path_regex":"^(?:/v2/analytics)$","service_name":"google.partners","resource_name":"partners.analytics.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.partners","resource_name":"partners.companies.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/companies/{companyId}","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.partners","resource_name":"partners.companies.get"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/leads","path_regex":"^(?:/v2/leads)$","service_name":"google.partners","resource_name":"partners.leads.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/offers","path_regex":"^(?:/v2/offers)$","service_name":"google.partners","resource_name":"partners.offers.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/offers/history","path_regex":"^(?:/v2/offers/history)$","service_name":"google.partners","resource_name":"partners.offers.history.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/partnersstatus","path_regex":"^(?:/v2/partnersstatus)$","service_name":"google.partners","resource_name":"partners.getPartnersstatus"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/userStates","path_regex":"^(?:/v2/userStates)$","service_name":"google.partners","resource_name":"partners.userStates.list"},{"hostname":"partners.googleapis.com","http_method":"GET","path_template":"/v2/users/{userId}","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.partners","resource_name":"partners.users.get"},{"hostname":"partners.googleapis.com","http_method":"PATCH","path_template":"/v2/companies","path_regex":"^(?:/v2/companies)$","service_name":"google.partners","resource_name":"partners.updateCompanies"},{"hostname":"partners.googleapis.com","http_method":"PATCH","path_template":"/v2/leads","path_regex":"^(?:/v2/leads)$","service_name":"google.partners","resource_name":"partners.updateLeads"},{"hostname":"partners.googleapis.com","http_method":"PATCH","path_template":"/v2/users/profile","path_regex":"^(?:/v2/users/profile)$","service_name":"google.partners","resource_name":"partners.users.updateProfile"},{"hostname":"partners.googleapis.com","http_method":"POST","path_template":"/v2/clientMessages:log","path_regex":"^(?:/v2/clientMessages:log)$","service_name":"google.partners","resource_name":"partners.clientMessages.log"},{"hostname":"partners.googleapis.com","http_method":"POST","path_template":"/v2/companies/{companyId}/leads","path_regex":"^(?:/v2/companies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/leads)$","service_name":"google.partners","resource_name":"partners.companies.leads.create"},{"hostname":"partners.googleapis.com","http_method":"POST","path_template":"/v2/userEvents:log","path_regex":"^(?:/v2/userEvents:log)$","service_name":"google.partners","resource_name":"partners.userEvents.log"},{"hostname":"partners.googleapis.com","http_method":"PUT","path_template":"/v2/users/{userId}/companyRelation","path_regex":"^(?:/v2/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/companyRelation)$","service_name":"google.partners","resource_name":"partners.users.createCompanyRelation"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/products","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.products.list"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/promotions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.promotions.list"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"GET","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.get"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/promotions:findEligible","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions:findEligible)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.promotions.findEligible"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.create"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:cancel","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.cancel"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:entitle","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::entitle)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.entitle"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:extend","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::extend)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.extend"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions/{subscriptionsId}:undoCancel","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undoCancel)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.undoCancel"},{"hostname":"paymentsresellersubscription.googleapis.com","http_method":"POST","path_template":"/v1/partners/{partnersId}/subscriptions:provision","path_regex":"^(?:/v1/partners/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions:provision)$","service_name":"google.paymentsresellersubscription","resource_name":"paymentsresellersubscription.partners.subscriptions.provision"},{"hostname":"people.googleapis.com","http_method":"DELETE","path_template":"/v1/contactGroups/{contactGroupsId}","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.contactGroups.delete"},{"hostname":"people.googleapis.com","http_method":"DELETE","path_template":"/v1/people/{peopleId}:deleteContact","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteContact)$","service_name":"google.people","resource_name":"people.people.deleteContact"},{"hostname":"people.googleapis.com","http_method":"DELETE","path_template":"/v1/people/{peopleId}:deleteContactPhoto","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteContactPhoto)$","service_name":"google.people","resource_name":"people.people.deleteContactPhoto"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/contactGroups","path_regex":"^(?:/v1/contactGroups)$","service_name":"google.people","resource_name":"people.contactGroups.list"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/contactGroups/{contactGroupsId}","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.contactGroups.get"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/contactGroups:batchGet","path_regex":"^(?:/v1/contactGroups:batchGet)$","service_name":"google.people","resource_name":"people.contactGroups.batchGet"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/otherContacts","path_regex":"^(?:/v1/otherContacts)$","service_name":"google.people","resource_name":"people.otherContacts.list"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/otherContacts:search","path_regex":"^(?:/v1/otherContacts:search)$","service_name":"google.people","resource_name":"people.otherContacts.search"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people/{peopleId}","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.people.get"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people/{peopleId}/connections","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.people","resource_name":"people.people.connections.list"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:batchGet","path_regex":"^(?:/v1/people:batchGet)$","service_name":"google.people","resource_name":"people.people.getBatchGet"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:listDirectoryPeople","path_regex":"^(?:/v1/people:listDirectoryPeople)$","service_name":"google.people","resource_name":"people.people.listDirectoryPeople"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:searchContacts","path_regex":"^(?:/v1/people:searchContacts)$","service_name":"google.people","resource_name":"people.people.searchContacts"},{"hostname":"people.googleapis.com","http_method":"GET","path_template":"/v1/people:searchDirectoryPeople","path_regex":"^(?:/v1/people:searchDirectoryPeople)$","service_name":"google.people","resource_name":"people.people.searchDirectoryPeople"},{"hostname":"people.googleapis.com","http_method":"PATCH","path_template":"/v1/people/{peopleId}:updateContact","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateContact)$","service_name":"google.people","resource_name":"people.people.updateContact"},{"hostname":"people.googleapis.com","http_method":"PATCH","path_template":"/v1/people/{peopleId}:updateContactPhoto","path_regex":"^(?:/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateContactPhoto)$","service_name":"google.people","resource_name":"people.people.updateContactPhoto"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/contactGroups","path_regex":"^(?:/v1/contactGroups)$","service_name":"google.people","resource_name":"people.contactGroups.create"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/contactGroups/{contactGroupsId}/members:modify","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/members:modify)$","service_name":"google.people","resource_name":"people.contactGroups.members.modify"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/otherContacts/{otherContactsId}:copyOtherContactToMyContactsGroup","path_regex":"^(?:/v1/otherContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::copyOtherContactToMyContactsGroup)$","service_name":"google.people","resource_name":"people.otherContacts.copyOtherContactToMyContactsGroup"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:batchCreateContacts","path_regex":"^(?:/v1/people:batchCreateContacts)$","service_name":"google.people","resource_name":"people.people.batchCreateContacts"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:batchDeleteContacts","path_regex":"^(?:/v1/people:batchDeleteContacts)$","service_name":"google.people","resource_name":"people.people.batchDeleteContacts"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:batchUpdateContacts","path_regex":"^(?:/v1/people:batchUpdateContacts)$","service_name":"google.people","resource_name":"people.people.batchUpdateContacts"},{"hostname":"people.googleapis.com","http_method":"POST","path_template":"/v1/people:createContact","path_regex":"^(?:/v1/people:createContact)$","service_name":"google.people","resource_name":"people.people.createContact"},{"hostname":"people.googleapis.com","http_method":"PUT","path_template":"/v1/contactGroups/{contactGroupsId}","path_regex":"^(?:/v1/contactGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.people","resource_name":"people.contactGroups.update"},{"hostname":"places.googleapis.com","http_method":"GET","path_template":"/v1/places/{placesId}","path_regex":"^(?:/v1/places/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.places","resource_name":"places.places.get"},{"hostname":"places.googleapis.com","http_method":"GET","path_template":"/v1/places/{placesId}/photos/{photosId}/media","path_regex":"^(?:/v1/places/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/photos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/media)$","service_name":"google.places","resource_name":"places.places.photos.getMedia"},{"hostname":"places.googleapis.com","http_method":"POST","path_template":"/v1/places:autocomplete","path_regex":"^(?:/v1/places:autocomplete)$","service_name":"google.places","resource_name":"places.places.autocomplete"},{"hostname":"places.googleapis.com","http_method":"POST","path_template":"/v1/places:searchNearby","path_regex":"^(?:/v1/places:searchNearby)$","service_name":"google.places","resource_name":"places.places.searchNearby"},{"hostname":"places.googleapis.com","http_method":"POST","path_template":"/v1/places:searchText","path_regex":"^(?:/v1/places:searchText)$","service_name":"google.places","resource_name":"places.places.searchText"},{"hostname":"playablelocations.googleapis.com","http_method":"POST","path_template":"/v3:logImpressions","path_regex":"^(?:/v3:logImpressions)$","service_name":"google.playablelocations","resource_name":"playablelocations.logImpressions"},{"hostname":"playablelocations.googleapis.com","http_method":"POST","path_template":"/v3:logPlayerReports","path_regex":"^(?:/v3:logPlayerReports)$","service_name":"google.playablelocations","resource_name":"playablelocations.logPlayerReports"},{"hostname":"playablelocations.googleapis.com","http_method":"POST","path_template":"/v3:samplePlayableLocations","path_regex":"^(?:/v3:samplePlayableLocations)$","service_name":"google.playablelocations","resource_name":"playablelocations.samplePlayableLocations"},{"hostname":"playcustomapp.googleapis.com","http_method":"POST","path_template":"/playcustomapp/v1/accounts/{account}/customApps","path_regex":"^(?:/playcustomapp/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customApps)$","service_name":"google.playcustomapp","resource_name":"playcustomapp.accounts.customApps.create"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/anomalies","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anomalies)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.anomalies.list"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/anrRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/crashRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/errorCountMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/errorIssues:search","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorIssues:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.issues.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/errorReports:search","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorReports:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.reports.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/excessiveWakeupRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/slowRenderingRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/slowStartRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps/{appsId}:fetchReleaseFilterOptions","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchReleaseFilterOptions)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.apps.fetchReleaseFilterOptions"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1alpha1/apps:search","path_regex":"^(?:/v1alpha1/apps:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.apps.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/anomalies","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anomalies)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.anomalies.list"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/anrRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/crashRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/errorCountMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/errorIssues:search","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorIssues:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.issues.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/errorReports:search","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorReports:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.reports.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/excessiveWakeupRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/slowRenderingRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/slowStartRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.get"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps/{appsId}:fetchReleaseFilterOptions","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchReleaseFilterOptions)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.apps.fetchReleaseFilterOptions"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"GET","path_template":"/v1beta1/apps:search","path_regex":"^(?:/v1beta1/apps:search)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.apps.search"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/anrRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/crashRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/errorCountMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/excessiveWakeupRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/slowRenderingRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/slowStartRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet:query","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/anrRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anrRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.anrrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/crashRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crashRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.crashrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/errorCountMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/errorCountMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.errors.counts.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/excessiveWakeupRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/excessiveWakeupRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.excessivewakeuprate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/slowRenderingRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowRenderingRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowrenderingrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/slowStartRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/slowStartRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.slowstartrate.query"},{"hostname":"playdeveloperreporting.googleapis.com","http_method":"POST","path_template":"/v1beta1/apps/{appsId}/stuckBackgroundWakelockRateMetricSet:query","path_regex":"^(?:/v1beta1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stuckBackgroundWakelockRateMetricSet:query)$","service_name":"google.playdeveloperreporting","resource_name":"playdeveloperreporting.vitals.stuckbackgroundwakelockrate.query"},{"hostname":"playgrouping.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/tokens/{tokensId}/tags:createOrUpdate","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags:createOrUpdate)$","service_name":"google.playgrouping","resource_name":"playgrouping.apps.tokens.tags.createOrUpdate"},{"hostname":"playgrouping.googleapis.com","http_method":"POST","path_template":"/v1alpha1/apps/{appsId}/tokens/{tokensId}:verify","path_regex":"^(?:/v1alpha1/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::verify)$","service_name":"google.playgrouping","resource_name":"playgrouping.apps.tokens.verify"},{"hostname":"playintegrity.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/deviceRecall:write","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceRecall:write)$","service_name":"google.playintegrity","resource_name":"playintegrity.deviceRecall.write"},{"hostname":"playintegrity.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:decodeIntegrityToken","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decodeIntegrityToken)$","service_name":"google.playintegrity","resource_name":"playintegrity.decodeIntegrityToken"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/avails","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/avails)$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.avails.list"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/avails/{availId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/avails/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.avails.get"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/orders","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.orders.list"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/orders/{orderId}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.orders.get"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/storeInfos","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeInfos)$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.storeInfos.list"},{"hostname":"playmoviespartner.googleapis.com","http_method":"GET","path_template":"/v1/accounts/{accountId}/storeInfos/{videoId}/country/{country}","path_regex":"^(?:/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storeInfos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/country/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.playmoviespartner","resource_name":"playmoviespartner.accounts.storeInfos.country.get"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.folders.locations.activityTypes.activities.query"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.organizations.locations.activityTypes.activities.query"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.projects.locations.activityTypes.activities.query"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.folders.locations.activityTypes.activities.query"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.organizations.locations.activityTypes.activities.query"},{"hostname":"policyanalyzer.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/activityTypes/{activityTypesId}/activities:query","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activityTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities:query)$","service_name":"google.policyanalyzer","resource_name":"policyanalyzer.projects.locations.activityTypes.activities.query"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/operations","path_regex":"^(?:/v1alpha/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/operations/{operationsId}","path_regex":"^(?:/v1alpha/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/orgPolicyViolations","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.orgPolicyViolations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/operations","path_regex":"^(?:/v1beta/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/operations/{operationsId}","path_regex":"^(?:/v1beta/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/orgPolicyViolations","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.orgPolicyViolations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/results","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.results.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/orgPolicyViolationsPreviews/{orgPolicyViolationsPreviewsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.orgPolicyViolationsPreviews.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.list"},{"hostname":"policysimulator.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/replays/{replaysId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.operations.get"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/replays","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1alpha/folders/{foldersId}/locations/{locationsId}/replays","path_regex":"^(?:/v1alpha/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews:generate","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews:generate)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.generate"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1alpha/organizations/{organizationsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1alpha/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1beta/folders/{foldersId}/locations/{locationsId}/replays","path_regex":"^(?:/v1beta/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.folders.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/orgPolicyViolationsPreviews:generate","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orgPolicyViolationsPreviews:generate)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.orgPolicyViolationsPreviews.generate"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1beta/organizations/{organizationsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1beta/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.organizations.locations.replays.create"},{"hostname":"policysimulator.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/replays","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replays)$","service_name":"google.policysimulator","resource_name":"policysimulator.projects.locations.replays.create"},{"hostname":"policytroubleshooter.googleapis.com","http_method":"POST","path_template":"/v1/iam:troubleshoot","path_regex":"^(?:/v1/iam:troubleshoot)$","service_name":"google.policytroubleshooter","resource_name":"policytroubleshooter.iam.troubleshoot"},{"hostname":"policytroubleshooter.googleapis.com","http_method":"POST","path_template":"/v1beta/iam:troubleshoot","path_regex":"^(?:/v1beta/iam:troubleshoot)$","service_name":"google.policytroubleshooter","resource_name":"policytroubleshooter.iam.troubleshoot"},{"hostname":"pollen.googleapis.com","http_method":"GET","path_template":"/v1/forecast:lookup","path_regex":"^(?:/v1/forecast:lookup)$","service_name":"google.pollen","resource_name":"pollen.forecast.lookup"},{"hostname":"pollen.googleapis.com","http_method":"GET","path_template":"/v1/mapTypes/{mapType}/heatmapTiles/{zoom}/{x}/{y}","path_regex":"^(?:/v1/mapTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/heatmapTiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pollen","resource_name":"pollen.mapTypes.heatmapTiles.lookupHeatmapTile"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/assets","path_regex":"^(?:/v1/assets)$","service_name":"google.poly","resource_name":"poly.assets.list"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/assets/{assetsId}","path_regex":"^(?:/v1/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.poly","resource_name":"poly.assets.get"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/assets","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.poly","resource_name":"poly.users.assets.list"},{"hostname":"poly.googleapis.com","http_method":"GET","path_template":"/v1/users/{usersId}/likedassets","path_regex":"^(?:/v1/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/likedassets)$","service_name":"google.poly","resource_name":"poly.users.likedassets.list"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.delete"},{"hostname":"privateca.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.delete"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:fetch","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetch)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.fetch"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.certificateRevocationLists.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.list"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.get"},{"hostname":"privateca.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reusableConfigs/{reusableConfigsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reusableConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.reusableConfigs.getIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates/{certificatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.patch"},{"hostname":"privateca.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.patch"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.certificateRevocationLists.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:activate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.activate"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.disable"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.enable"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificateAuthorities/{certificateAuthoritiesId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificateAuthorities.undelete"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}/certificates/{certificatesId}:revoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revoke)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.certificates.revoke"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:fetchCaCerts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchCaCerts)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.fetchCaCerts"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/caPools/{caPoolsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/caPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.caPools.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.create"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/certificateTemplates/{certificateTemplatesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateTemplates.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.cancel"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.certificateRevocationLists.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}/certificateRevocationLists/{certificateRevocationListsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateRevocationLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.certificateRevocationLists.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/certificateAuthorities/{certificateAuthoritiesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthorities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.certificateAuthorities.testIamPermissions"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.operations.cancel"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reusableConfigs/{reusableConfigsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reusableConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.reusableConfigs.setIamPolicy"},{"hostname":"privateca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/reusableConfigs/{reusableConfigsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reusableConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.privateca","resource_name":"privateca.projects.locations.reusableConfigs.testIamPermissions"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.delete"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers","path_regex":"^(?:/v1alpha1/customers)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers:listGcpProjectDeployments","path_regex":"^(?:/v1alpha1/customers:listGcpProjectDeployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.listGcpProjectDeployments"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers:listLegacyOrganizations","path_regex":"^(?:/v1alpha1/customers:listLegacyOrganizations)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.listLegacyOrganizations"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.deployments.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.devices.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.nodes.list"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.updateSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.updateSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.updateSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.patch"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.deployments.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.signDevice"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.deployments.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.nodes.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:migrateOrganization","path_regex":"^(?:/v1alpha1/customers:migrateOrganization)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.migrateOrganization"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:provisionDeployment","path_regex":"^(?:/v1alpha1/customers:provisionDeployment)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.provisionDeployment"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:setupSasAnalytics","path_regex":"^(?:/v1alpha1/customers:setupSasAnalytics)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.customers.setupSasAnalytics"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.deployments.devices.signDevice"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:generateSecret","path_regex":"^(?:/v1alpha1/installer:generateSecret)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.installer.generateSecret"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:validate","path_regex":"^(?:/v1alpha1/installer:validate)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.installer.validate"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.deployments.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.signDevice"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.deployments.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.devices.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.devices.createSigned"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.nodes.create"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.nodes.nodes.move"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:get","path_regex":"^(?:/v1alpha1/policies:get)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.policies.get"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:set","path_regex":"^(?:/v1alpha1/policies:set)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.policies.set"},{"hostname":"prod-tt-sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:test","path_regex":"^(?:/v1alpha1/policies:test)$","service_name":"google.prod_tt_sasportal","resource_name":"prod_tt_sasportal.policies.test"},{"hostname":"proximitybeacon.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/beacons/{beaconsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.delete"},{"hostname":"proximitybeacon.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/beacons/{beaconsId}/attachments/{attachmentsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.delete"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons","path_regex":"^(?:/v1beta1/beacons)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons/{beaconsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.get"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons/{beaconsId}/attachments","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/beacons/{beaconsId}/diagnostics","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diagnostics)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.diagnostics.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/eidparams","path_regex":"^(?:/v1beta1/eidparams)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.getEidparams"},{"hostname":"proximitybeacon.googleapis.com","http_method":"GET","path_template":"/v1beta1/namespaces","path_regex":"^(?:/v1beta1/namespaces)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.namespaces.list"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beaconinfo:getforobserved","path_regex":"^(?:/v1beta1/beaconinfo:getforobserved)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beaconinfo.getforobserved"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}/attachments","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.create"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}/attachments:batchDelete","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments:batchDelete)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.attachments.batchDelete"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}:activate","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.activate"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}:deactivate","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deactivate)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.deactivate"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons/{beaconsId}:decommission","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::decommission)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.decommission"},{"hostname":"proximitybeacon.googleapis.com","http_method":"POST","path_template":"/v1beta1/beacons:register","path_regex":"^(?:/v1beta1/beacons:register)$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.register"},{"hostname":"proximitybeacon.googleapis.com","http_method":"PUT","path_template":"/v1beta1/beacons/{beaconsId}","path_regex":"^(?:/v1beta1/beacons/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.beacons.update"},{"hostname":"proximitybeacon.googleapis.com","http_method":"PUT","path_template":"/v1beta1/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.proximitybeacon","resource_name":"proximitybeacon.namespaces.update"},{"hostname":"publicca.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/externalAccountKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccountKeys)$","service_name":"google.publicca","resource_name":"publicca.projects.locations.externalAccountKeys.create"},{"hostname":"publicca.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/externalAccountKeys","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccountKeys)$","service_name":"google.publicca","resource_name":"publicca.projects.locations.externalAccountKeys.create"},{"hostname":"publicca.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/externalAccountKeys","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccountKeys)$","service_name":"google.publicca","resource_name":"publicca.projects.locations.externalAccountKeys.create"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:deleteRevision","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteRevision)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.deleteRevision"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1a/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta1a/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta1a/topics/{topicsId}","path_regex":"^(?:/v1beta1a/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.topics.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.delete"},{"hostname":"pubsub.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.delete"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.listRevisions"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/subscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}/snapshots","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.snapshots.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}/subscriptions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/subscriptions","path_regex":"^(?:/v1beta1a/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta1a/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/topics","path_regex":"^(?:/v1beta1a/topics)$","service_name":"google.pubsub","resource_name":"pubsub.topics.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta1a/topics/{topicsId}","path_regex":"^(?:/v1beta1a/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.topics.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/subscriptions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.get"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}/subscriptions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.subscriptions.list"},{"hostname":"pubsub.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.getIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.patch"},{"hostname":"pubsub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.patch"},{"hostname":"pubsub.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.patch"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.create"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.commit"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.rollback"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas/{schemasId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas:validate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas:validate)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.validate"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/schemas:validateMessage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/schemas:validateMessage)$","service_name":"google.pubsub","resource_name":"pubsub.projects.schemas.validateMessage"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.acknowledge"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:detach","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detach)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.detach"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAckDeadline)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyAckDeadline"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyPushConfig)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyPushConfig"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:pull","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pull)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.pull"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:seek","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::seek)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.seek"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:publish","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.publish"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/topics/{topicsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions","path_regex":"^(?:/v1beta1a/subscriptions)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.create"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/acknowledge","path_regex":"^(?:/v1beta1a/subscriptions/acknowledge)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.acknowledge"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/modifyAckDeadline","path_regex":"^(?:/v1beta1a/subscriptions/modifyAckDeadline)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.modifyAckDeadline"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/modifyPushConfig","path_regex":"^(?:/v1beta1a/subscriptions/modifyPushConfig)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.modifyPushConfig"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/pull","path_regex":"^(?:/v1beta1a/subscriptions/pull)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.pull"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/subscriptions/pullBatch","path_regex":"^(?:/v1beta1a/subscriptions/pullBatch)$","service_name":"google.pubsub","resource_name":"pubsub.subscriptions.pullBatch"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/topics","path_regex":"^(?:/v1beta1a/topics)$","service_name":"google.pubsub","resource_name":"pubsub.topics.create"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/topics/publish","path_regex":"^(?:/v1beta1a/topics/publish)$","service_name":"google.pubsub","resource_name":"pubsub.topics.publish"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta1a/topics/publishBatch","path_regex":"^(?:/v1beta1a/topics/publishBatch)$","service_name":"google.pubsub","resource_name":"pubsub.topics.publishBatch"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:acknowledge","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::acknowledge)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.acknowledge"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyAckDeadline","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyAckDeadline)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyAckDeadline"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:modifyPushConfig","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::modifyPushConfig)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.modifyPushConfig"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:pull","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pull)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.pull"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:publish","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.publish"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.setIamPolicy"},{"hostname":"pubsub.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.testIamPermissions"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/snapshots/{snapshotsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/snapshots/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.snapshots.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.subscriptions.create"},{"hostname":"pubsub.googleapis.com","http_method":"PUT","path_template":"/v1beta2/projects/{projectsId}/topics/{topicsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsub","resource_name":"pubsub.projects.topics.create"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"DELETE","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.delete"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}/topics","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.topics.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.get"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}/partitions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/partitions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.getPartitions"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}/subscriptions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.subscriptions.list"},{"hostname":"pubsublite.googleapis.com","http_method":"GET","path_template":"/v1/cursor/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}/cursors","path_regex":"^(?:/v1/cursor/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cursors)$","service_name":"google.pubsublite","resource_name":"pubsublite.cursor.projects.locations.subscriptions.cursors.list"},{"hostname":"pubsublite.googleapis.com","http_method":"PATCH","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations/{reservationsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.patch"},{"hostname":"pubsublite.googleapis.com","http_method":"PATCH","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.patch"},{"hostname":"pubsublite.googleapis.com","http_method":"PATCH","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.patch"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.operations.cancel"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.reservations.create"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.create"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:seek","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::seek)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.subscriptions.seek"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/admin/projects/{projectsId}/locations/{locationsId}/topics","path_regex":"^(?:/v1/admin/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics)$","service_name":"google.pubsublite","resource_name":"pubsublite.admin.projects.locations.topics.create"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/cursor/projects/{projectsId}/locations/{locationsId}/subscriptions/{subscriptionsId}:commitCursor","path_regex":"^(?:/v1/cursor/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commitCursor)$","service_name":"google.pubsublite","resource_name":"pubsublite.cursor.projects.locations.subscriptions.commitCursor"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/topicStats/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}:computeHeadCursor","path_regex":"^(?:/v1/topicStats/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeHeadCursor)$","service_name":"google.pubsublite","resource_name":"pubsublite.topicStats.projects.locations.topics.computeHeadCursor"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/topicStats/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}:computeMessageStats","path_regex":"^(?:/v1/topicStats/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeMessageStats)$","service_name":"google.pubsublite","resource_name":"pubsublite.topicStats.projects.locations.topics.computeMessageStats"},{"hostname":"pubsublite.googleapis.com","http_method":"POST","path_template":"/v1/topicStats/projects/{projectsId}/locations/{locationsId}/topics/{topicsId}:computeTimeCursor","path_regex":"^(?:/v1/topicStats/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/topics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::computeTimeCursor)$","service_name":"google.pubsublite","resource_name":"pubsublite.topicStats.projects.locations.topics.computeTimeCursor"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors/{collectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.delete"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.operations.delete"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.list"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.get"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/annotations/{annotationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.annotations.get"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.list"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors/{collectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.get"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.operations.list"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.operations.get"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors/{collectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.patch"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/annotations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/annotations)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.annotations.create"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.create"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors/{collectorsId}:pause","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.pause"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors/{collectorsId}:register","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::register)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.register"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/collectors/{collectorsId}:resume","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.collectors.resume"},{"hostname":"rapidmigrationassessment.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.rapidmigrationassessment","resource_name":"rapidmigrationassessment.projects.locations.operations.cancel"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"DELETE","path_template":"/v1/publications/{publicationsId}/readers/{readersId}","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.delete"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"GET","path_template":"/v1/publications/{publicationsId}/readers/{readersId}","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.get"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"GET","path_template":"/v1/publications/{publicationsId}/readers/{readersId}/entitlements","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.getEntitlements"},{"hostname":"readerrevenuesubscriptionlinking.googleapis.com","http_method":"PATCH","path_template":"/v1/publications/{publicationsId}/readers/{readersId}/entitlements","path_regex":"^(?:/v1/publications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/readers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entitlements)$","service_name":"google.readerrevenuesubscriptionlinking","resource_name":"readerrevenuesubscriptionlinking.publications.readers.updateEntitlements"},{"hostname":"realtimebidding.googleapis.com","http_method":"DELETE","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.delete"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders","path_regex":"^(?:/v1/bidders)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/creatives","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.creatives.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/endpoints","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.endpoints.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.endpoints.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/publisherConnections","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/bidders/{biddersId}/publisherConnections/{publisherConnectionsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers","path_regex":"^(?:/v1/buyers)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/creatives","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/creatives/{creativesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/userLists","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.get"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}:getRemarketingTag","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getRemarketingTag)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.getRemarketingTag"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1/buyers/{buyersId}:getRemarketingTag","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getRemarketingTag)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.getRemarketingTag"},{"hostname":"realtimebidding.googleapis.com","http_method":"GET","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.list"},{"hostname":"realtimebidding.googleapis.com","http_method":"PATCH","path_template":"/v1/bidders/{biddersId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.endpoints.patch"},{"hostname":"realtimebidding.googleapis.com","http_method":"PATCH","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.patch"},{"hostname":"realtimebidding.googleapis.com","http_method":"PATCH","path_template":"/v1/buyers/{buyersId}/creatives/{creativesId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.patch"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/creatives:watch","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives:watch)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.creatives.watch"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:activate","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.activate"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:addTargetedApps","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargetedApps)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.addTargetedApps"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:addTargetedPublishers","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargetedPublishers)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.addTargetedPublishers"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:addTargetedSites","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addTargetedSites)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.addTargetedSites"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:removeTargetedApps","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeTargetedApps)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.removeTargetedApps"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:removeTargetedPublishers","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeTargetedPublishers)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.removeTargetedPublishers"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:removeTargetedSites","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeTargetedSites)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.removeTargetedSites"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/pretargetingConfigs/{pretargetingConfigsId}:suspend","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pretargetingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::suspend)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.pretargetingConfigs.suspend"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/publisherConnections:batchApprove","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections:batchApprove)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.batchApprove"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/bidders/{biddersId}/publisherConnections:batchReject","path_regex":"^(?:/v1/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publisherConnections:batchReject)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.publisherConnections.batchReject"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/creatives","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.creatives.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/userLists","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}:close","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.close"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}:open","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::open)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.open"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.create"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions/{biddingFunctionsId}:activate","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::activate)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.activate"},{"hostname":"realtimebidding.googleapis.com","http_method":"POST","path_template":"/v1alpha/bidders/{biddersId}/biddingFunctions/{biddingFunctionsId}:archive","path_regex":"^(?:/v1alpha/bidders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/biddingFunctions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::archive)$","service_name":"google.realtimebidding","resource_name":"realtimebidding.bidders.biddingFunctions.archive"},{"hostname":"realtimebidding.googleapis.com","http_method":"PUT","path_template":"/v1/buyers/{buyersId}/userLists/{userListsId}","path_regex":"^(?:/v1/buyers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.realtimebidding","resource_name":"realtimebidding.buyers.userLists.update"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/firewallpolicies/{firewallpoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.delete"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.delete"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/firewallpolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/firewallpolicies/{firewallpoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.get"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.get"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys/{keysId}/metrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.getMetrics"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/keys/{keysId}:retrieveLegacySecretKey","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::retrieveLegacySecretKey)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.retrieveLegacySecretKey"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/relatedaccountgroups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/relatedaccountgroups)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.relatedaccountgroups.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/relatedaccountgroups/{relatedaccountgroupsId}/memberships","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/relatedaccountgroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/memberships)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.relatedaccountgroups.memberships.list"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/firewallpolicies/{firewallpoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.patch"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/keys/{keysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.patch"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/assessments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assessments)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.assessments.create"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/assessments/{assessmentsId}:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assessments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::annotate)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.assessments.annotate"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/firewallpolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.create"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/firewallpolicies:reorder","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/firewallpolicies:reorder)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.firewallpolicies.reorder"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/keys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.create"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/keys/{keysId}:addIpOverride","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addIpOverride)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.addIpOverride"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/keys/{keysId}:migrate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/keys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::migrate)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.keys.migrate"},{"hostname":"recaptchaenterprise.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/relatedaccountgroupmemberships:search","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/relatedaccountgroupmemberships:search)$","service_name":"google.recaptchaenterprise","resource_name":"recaptchaenterprise.projects.relatedaccountgroupmemberships.search"},{"hostname":"recommendationengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems/{catalogItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.delete"},{"hostname":"recommendationengine.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/predictionApiKeyRegistrations/{predictionApiKeyRegistrationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/predictionApiKeyRegistrations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.predictionApiKeyRegistrations.delete"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems/{catalogItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.get"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.operations.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.operations.get"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/predictionApiKeyRegistrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/predictionApiKeyRegistrations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.predictionApiKeyRegistrations.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:collect","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.collect"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.operations.list"},{"hostname":"recommendationengine.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.operations.get"},{"hostname":"recommendationengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.patch"},{"hostname":"recommendationengine.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems/{catalogItemsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.patch"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.create"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/catalogItems:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogItems:import)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.catalogItems.import"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/placements/{placementsId}:predict","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.placements.predict"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/predictionApiKeyRegistrations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/predictionApiKeyRegistrations)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.predictionApiKeyRegistrations.create"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.import"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:purge","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.purge"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:rejoin","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.rejoin"},{"hostname":"recommendationengine.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/eventStores/{eventStoresId}/userEvents:write","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventStores/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.recommendationengine","resource_name":"recommendationengine.projects.locations.catalogs.eventStores.userEvents.write"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/insightTypes","path_regex":"^(?:/v1beta1/insightTypes)$","service_name":"google.recommender","resource_name":"recommender.insightTypes.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.getConfig"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.list"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.get"},{"hostname":"recommender.googleapis.com","http_method":"GET","path_template":"/v1beta1/recommenders","path_regex":"^(?:/v1beta1/recommenders)$","service_name":"google.recommender","resource_name":"recommender.recommenders.list"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/config","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.updateConfig"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/billingAccounts/{billingAccountsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/billingAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.billingAccounts.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/folders/{foldersId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.folders.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.organizations.locations.recommenders.recommendations.markSucceeded"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/insightTypes/{insightTypesId}/insights/{insightsId}:markAccepted","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insightTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markAccepted)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.insightTypes.insights.markAccepted"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markClaimed","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markClaimed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markClaimed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markDismissed","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markDismissed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markDismissed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markFailed","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markFailed)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markFailed"},{"hostname":"recommender.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/recommenders/{recommendersId}/recommendations/{recommendationsId}:markSucceeded","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommenders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::markSucceeded)$","service_name":"google.recommender","resource_name":"recommender.projects.locations.recommenders.recommendations.markSucceeded"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.delete"},{"hostname":"redis.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.delete"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.redis","resource_name":"redis.projects.locations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/certificateAuthority","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthority)$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.getCertificateAuthority"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/authString","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authString)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.getAuthString"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.redis","resource_name":"redis.projects.locations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/certificateAuthority","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/certificateAuthority)$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.getCertificateAuthority"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.get"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}/authString","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authString)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.getAuthString"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.list"},{"hostname":"redis.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.get"},{"hostname":"redis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.patch"},{"hostname":"redis.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.patch"},{"hostname":"redis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.patch"},{"hostname":"redis.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.patch"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.create"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.create"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.export"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:failover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.failover"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.import"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.rescheduleMaintenance"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.upgrade"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.cancel"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/clusters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.redis","resource_name":"redis.projects.locations.clusters.create"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.create"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:export","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::export)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.export"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:failover","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::failover)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.failover"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:import","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::import)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.import"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:rescheduleMaintenance","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rescheduleMaintenance)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.rescheduleMaintenance"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/instances/{instancesId}:upgrade","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgrade)$","service_name":"google.redis","resource_name":"redis.projects.locations.instances.upgrade"},{"hostname":"redis.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.redis","resource_name":"redis.projects.locations.operations.cancel"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.delete"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.media.download"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.list"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.projects.operations.get"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/actionResults/{hash}/{sizeBytes}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actionResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.actionResults.get"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/blobs/{hash}/{sizeBytes}:getTree","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getTree)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.getTree"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"GET","path_template":"/v2/{v2Id}/capabilities","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/capabilities)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.getCapabilities"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.media.upload"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.cancel"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/operations/{operationsId}:waitExecution","path_regex":"^(?:/v2/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::waitExecution)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.operations.waitExecution"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/actions:execute","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actions:execute)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.actions.execute"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/blobs:batchRead","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs:batchRead)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.batchRead"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/blobs:batchUpdate","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs:batchUpdate)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.batchUpdate"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"POST","path_template":"/v2/{v2Id}/blobs:findMissing","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blobs:findMissing)$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.blobs.findMissing"},{"hostname":"remotebuildexecution.googleapis.com","http_method":"PUT","path_template":"/v2/{v2Id}/actionResults/{hash}/{sizeBytes}","path_regex":"^(?:/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/actionResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.remotebuildexecution","resource_name":"remotebuildexecution.actionResults.update"},{"hostname":"reseller.googleapis.com","http_method":"DELETE","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.subscriptions.delete"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/customers/{customerId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.customers.get"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.subscriptions.get"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/resellernotify/getwatchdetails","path_regex":"^(?:/apps/reseller/v1/resellernotify/getwatchdetails)$","service_name":"google.reseller","resource_name":"reseller.resellernotify.getwatchdetails"},{"hostname":"reseller.googleapis.com","http_method":"GET","path_template":"/apps/reseller/v1/subscriptions","path_regex":"^(?:/apps/reseller/v1/subscriptions)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.list"},{"hostname":"reseller.googleapis.com","http_method":"PATCH","path_template":"/apps/reseller/v1/customers/{customerId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.customers.patch"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers","path_regex":"^(?:/apps/reseller/v1/customers)$","service_name":"google.reseller","resource_name":"reseller.customers.insert"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.insert"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/activate","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activate)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.activate"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changePlan","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changePlan)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.changePlan"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changeRenewalSettings","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeRenewalSettings)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.changeRenewalSettings"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/changeSeats","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeSeats)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.changeSeats"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/startPaidService","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startPaidService)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.startPaidService"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/customers/{customerId}/subscriptions/{subscriptionId}/suspend","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/suspend)$","service_name":"google.reseller","resource_name":"reseller.subscriptions.suspend"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/resellernotify/register","path_regex":"^(?:/apps/reseller/v1/resellernotify/register)$","service_name":"google.reseller","resource_name":"reseller.resellernotify.register"},{"hostname":"reseller.googleapis.com","http_method":"POST","path_template":"/apps/reseller/v1/resellernotify/unregister","path_regex":"^(?:/apps/reseller/v1/resellernotify/unregister)$","service_name":"google.reseller","resource_name":"reseller.resellernotify.unregister"},{"hostname":"reseller.googleapis.com","http_method":"PUT","path_template":"/apps/reseller/v1/customers/{customerId}","path_regex":"^(?:/apps/reseller/v1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.reseller","resource_name":"reseller.customers.update"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/settings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.resourcesettings","resource_name":"resourcesettings.folders.settings.list"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/settings/{settingsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.folders.settings.get"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/settings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.resourcesettings","resource_name":"resourcesettings.organizations.settings.list"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/settings/{settingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.organizations.settings.get"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/settings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.resourcesettings","resource_name":"resourcesettings.projects.settings.list"},{"hostname":"resourcesettings.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/settings/{settingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.projects.settings.get"},{"hostname":"resourcesettings.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/settings/{settingsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.folders.settings.patch"},{"hostname":"resourcesettings.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/settings/{settingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.organizations.settings.patch"},{"hostname":"resourcesettings.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/settings/{settingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.resourcesettings","resource_name":"resourcesettings.projects.settings.patch"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/merchantCenterAccountLinks/{merchantCenterAccountLinksId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantCenterAccountLinks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.merchantCenterAccountLinks.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.delete"},{"hostname":"retail.googleapis.com","http_method":"DELETE","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.delete"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:collect","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.collect"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completeQuery"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/alertConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertConfig)$","service_name":"google.retail","resource_name":"retail.projects.getAlertConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/places/{placesId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/places/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.places.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/merchantCenterAccountLinks","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantCenterAccountLinks)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.merchantCenterAccountLinks.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:collect","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.collect"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completeQuery"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/loggingConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingConfig)$","service_name":"google.retail","resource_name":"retail.projects.getLoggingConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/operations","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}/retailProject","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/retailProject)$","service_name":"google.retail","resource_name":"retail.projects.getRetailProject"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2alpha/projects/{projectsId}:enrolledSolutions","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enrolledSolutions)$","service_name":"google.retail","resource_name":"retail.projects.listEnrolledSolutions"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/alertConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertConfig)$","service_name":"google.retail","resource_name":"retail.projects.getAlertConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:collect","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:collect)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.collect"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:completeQuery","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::completeQuery)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completeQuery"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:getDefaultBranch","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.getDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.operations.get"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.retail","resource_name":"retail.projects.operations.list"},{"hostname":"retail.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.operations.get"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/alertConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertConfig)$","service_name":"google.retail","resource_name":"retail.projects.updateAlertConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2alpha/projects/{projectsId}/loggingConfig","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingConfig)$","service_name":"google.retail","resource_name":"retail.projects.updateLoggingConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/alertConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alertConfig)$","service_name":"google.retail","resource_name":"retail.projects.updateAlertConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateAttributesConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionConfig","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionConfig)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.updateCompletionConfig"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls/{controlsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.patch"},{"hostname":"retail.googleapis.com","http_method":"PATCH","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.patch"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:addCatalogAttribute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:addCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.addCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:removeCatalogAttribute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:removeCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.removeCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:replaceCatalogAttribute","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:replaceCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.replaceCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addLocalInventories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeLocalInventories","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInventory)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.setInventory"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:purge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionData:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completionData.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:pause","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.pause"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:resume","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.resume"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:tune","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.tune"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:predict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:addControl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.addControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:predict","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:removeControl","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.removeControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:import","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:purge","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:rejoin","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.rejoin"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:write","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.write"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:exportAnalyticsMetrics","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAnalyticsMetrics)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.exportAnalyticsMetrics"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.setDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:addCatalogAttribute","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:addCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.addCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:batchRemoveCatalogAttributes","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:batchRemoveCatalogAttributes)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.batchRemoveCatalogAttributes"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:removeCatalogAttribute","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:removeCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.removeCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:replaceCatalogAttribute","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:replaceCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.replaceCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addLocalInventories","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeLocalInventories","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInventory)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.setInventory"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:export","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:export)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.export"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:import","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:purge","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionData:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completionData.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/merchantCenterAccountLinks","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantCenterAccountLinks)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.merchantCenterAccountLinks.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:pause","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.pause"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:resume","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.resume"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:tune","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.tune"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:predict","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:addControl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.addControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:predict","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:removeControl","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.removeControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:export","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:export)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.export"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:import","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:purge","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:rejoin","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.rejoin"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:write","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.write"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:exportAnalyticsMetrics","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAnalyticsMetrics)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.exportAnalyticsMetrics"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.setDefaultBranch"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}/retailProject:acceptTerms","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/retailProject:acceptTerms)$","service_name":"google.retail","resource_name":"retail.projects.retailProject.acceptTerms"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2alpha/projects/{projectsId}:enrollSolution","path_regex":"^(?:/v2alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enrollSolution)$","service_name":"google.retail","resource_name":"retail.projects.enrollSolution"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:addCatalogAttribute","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:addCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.addCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:batchRemoveCatalogAttributes","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:batchRemoveCatalogAttributes)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.batchRemoveCatalogAttributes"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:removeCatalogAttribute","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:removeCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.removeCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/attributesConfig:replaceCatalogAttribute","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attributesConfig:replaceCatalogAttribute)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.attributesConfig.replaceCatalogAttribute"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addFulfillmentPlaces","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:addLocalInventories","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.addLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeFulfillmentPlaces","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeFulfillmentPlaces)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeFulfillmentPlaces"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:removeLocalInventories","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeLocalInventories)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.removeLocalInventories"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products/{productsId}:setInventory","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setInventory)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.setInventory"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:export","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:export)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.export"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:import","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/branches/{branchesId}/products:purge","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/branches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.branches.products.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/completionData:import","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/completionData:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.completionData.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/controls","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/controls)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.controls.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:pause","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.pause"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:resume","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.resume"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/models/{modelsId}:tune","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::tune)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.models.tune"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:predict","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/placements/{placementsId}:search","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.placements.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.create"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:addControl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.addControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:predict","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::predict)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.predict"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:removeControl","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeControl)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.removeControl"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/servingConfigs/{servingConfigsId}:search","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/servingConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.servingConfigs.search"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:export","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:export)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.export"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:import","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:import)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.import"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:purge","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:purge)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.purge"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:rejoin","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:rejoin)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.rejoin"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}/userEvents:write","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userEvents:write)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.userEvents.write"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:exportAnalyticsMetrics","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportAnalyticsMetrics)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.exportAnalyticsMetrics"},{"hostname":"retail.googleapis.com","http_method":"POST","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/catalogs/{catalogsId}:setDefaultBranch","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/catalogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setDefaultBranch)$","service_name":"google.retail","resource_name":"retail.projects.locations.catalogs.setDefaultBranch"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions/{executionsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.executions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/revisions/{revisionsId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.revisions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.services.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.operations.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.revisions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.operations.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.delete"},{"hostname":"run.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions/{revisionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.delete"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions","path_regex":"^(?:/apis/apiextensions\\.k8s\\.io/v1beta1/customresourcedefinitions)$","service_name":"google.run","resource_name":"run.customresourcedefinitions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/apiextensions.k8s.io/v1beta1/namespaces/{namespacesId}/customresourcedefinitions/{customresourcedefinitionsId}","path_regex":"^(?:/apis/apiextensions\\.k8s\\.io/v1beta1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customresourcedefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.customresourcedefinitions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/authorizeddomains","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizeddomains)$","service_name":"google.run","resource_name":"run.namespaces.authorizeddomains.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.run","resource_name":"run.namespaces.executions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions/{executionsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.executions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/tasks","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.run","resource_name":"run.namespaces.tasks.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/tasks/{tasksId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.tasks.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/configurations","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.run","resource_name":"run.namespaces.configurations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/configurations/{configurationsId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.configurations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/revisions","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.run","resource_name":"run.namespaces.revisions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/revisions/{revisionsId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.revisions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/routes","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.run","resource_name":"run.namespaces.routes.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/routes/{routesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.routes.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.namespaces.services.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.services.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/authorizeddomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizeddomains)$","service_name":"google.run","resource_name":"run.projects.authorizeddomains.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.run","resource_name":"run.projects.locations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/authorizeddomains","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/authorizeddomains)$","service_name":"google.run","resource_name":"run.projects.locations.authorizeddomains.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/configurations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations)$","service_name":"google.run","resource_name":"run.projects.locations.configurations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/configurations/{configurationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.configurations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings/{domainmappingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.run","resource_name":"run.projects.locations.operations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.operations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/revisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.run","resource_name":"run.projects.locations.revisions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/revisions/{revisionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.revisions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/routes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes)$","service_name":"google.run","resource_name":"run.projects.locations.routes.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/routes/{routesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/routes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.routes.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customresourcedefinitions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customresourcedefinitions)$","service_name":"google.run","resource_name":"run.projects.locations.customresourcedefinitions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/customresourcedefinitions/{customresourcedefinitionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customresourcedefinitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.customresourcedefinitions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}/tasks","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.tasks.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}/tasks/{tasksId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.tasks.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}/{executionsId1}:exportStatus","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportStatus)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.exportStatus"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.run","resource_name":"run.projects.locations.operations.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.operations.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.list"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions/{revisionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.get"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}/revisions/{revisionsId}/{revisionsId1}:exportStatus","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportStatus)$","service_name":"google.run","resource_name":"run.projects.locations.services.revisions.exportStatus"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.getIamPolicy"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/{locationsId1}:exportImageMetadata","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportImageMetadata)$","service_name":"google.run","resource_name":"run.projects.locations.exportImageMetadata"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/{locationsId1}:exportMetadata","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportMetadata)$","service_name":"google.run","resource_name":"run.projects.locations.exportMetadata"},{"hostname":"run.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}:exportProjectMetadata","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportProjectMetadata)$","service_name":"google.run","resource_name":"run.projects.locations.exportProjectMetadata"},{"hostname":"run.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.jobs.patch"},{"hostname":"run.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.patch"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/domains.cloudrun.com/v1/namespaces/{namespacesId}/domainmappings","path_regex":"^(?:/apis/domains\\.cloudrun\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.namespaces.domainmappings.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/executions/{executionsId}:cancel","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.run","resource_name":"run.namespaces.executions.cancel"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}:run","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.run","resource_name":"run.namespaces.jobs.run"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/run.googleapis.com/v1alpha1/namespaces/{namespacesId}/jobs","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1alpha1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.namespaces.jobs.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.namespaces.services.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/domainmappings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/domainmappings)$","service_name":"google.run","resource_name":"run.projects.locations.domainmappings.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.run","resource_name":"run.projects.locations.operations.wait"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.services.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.executions.cancel"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:run","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.run"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.jobs.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.run","resource_name":"run.projects.locations.operations.wait"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.run","resource_name":"run.projects.locations.services.create"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.run","resource_name":"run.projects.locations.services.setIamPolicy"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.run","resource_name":"run.projects.locations.services.testIamPermissions"},{"hostname":"run.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/{locationsId1}:exportImage","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportImage)$","service_name":"google.run","resource_name":"run.projects.locations.exportImage"},{"hostname":"run.googleapis.com","http_method":"PUT","path_template":"/apis/run.googleapis.com/v1/namespaces/{namespacesId}/jobs/{jobsId}","path_regex":"^(?:/apis/run\\.googleapis\\.com/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.jobs.replaceJob"},{"hostname":"run.googleapis.com","http_method":"PUT","path_template":"/apis/serving.knative.dev/v1/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/apis/serving\\.knative\\.dev/v1/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.namespaces.services.replaceService"},{"hostname":"run.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.run","resource_name":"run.projects.locations.services.replaceService"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.operations.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.delete"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.operations.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.operations.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.list"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.get"},{"hostname":"runtimeconfig.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.getIamPolicy"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.operations.cancel"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.create"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/operations/{operationsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.operations.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.create"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}:watch","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::watch)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.watch"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.create"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/waiters/{waitersId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/waiters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.waiters.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.setIamPolicy"},{"hostname":"runtimeconfig.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.testIamPermissions"},{"hostname":"runtimeconfig.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.update"},{"hostname":"runtimeconfig.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/configs/{configsId}/variables/{variablesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.runtimeconfig","resource_name":"runtimeconfig.projects.configs.variables.update"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v4/encodedFullHashes/{encodedRequest}","path_regex":"^(?:/v4/encodedFullHashes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.safebrowsing","resource_name":"safebrowsing.encodedFullHashes.get"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v4/encodedUpdates/{encodedRequest}","path_regex":"^(?:/v4/encodedUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.safebrowsing","resource_name":"safebrowsing.encodedUpdates.get"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v4/threatLists","path_regex":"^(?:/v4/threatLists)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatLists.list"},{"hostname":"safebrowsing.googleapis.com","http_method":"GET","path_template":"/v5/hashes:search","path_regex":"^(?:/v5/hashes:search)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.hashes.search"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/fullHashes:find","path_regex":"^(?:/v4/fullHashes:find)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.fullHashes.find"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/threatHits","path_regex":"^(?:/v4/threatHits)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatHits.create"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/threatListUpdates:fetch","path_regex":"^(?:/v4/threatListUpdates:fetch)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatListUpdates.fetch"},{"hostname":"safebrowsing.googleapis.com","http_method":"POST","path_template":"/v4/threatMatches:find","path_regex":"^(?:/v4/threatMatches:find)$","service_name":"google.safebrowsing","resource_name":"safebrowsing.threatMatches.find"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.delete"},{"hostname":"sasportal.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.delete"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers","path_regex":"^(?:/v1alpha1/customers)$","service_name":"google.sasportal","resource_name":"sasportal.customers.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers:listGcpProjectDeployments","path_regex":"^(?:/v1alpha1/customers:listGcpProjectDeployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.listGcpProjectDeployments"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/customers:listLegacyOrganizations","path_regex":"^(?:/v1alpha1/customers:listLegacyOrganizations)$","service_name":"google.sasportal","resource_name":"sasportal.customers.listLegacyOrganizations"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.get"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.deployments.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.devices.list"},{"hostname":"sasportal.googleapis.com","http_method":"GET","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.nodes.list"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.updateSigned"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.updateSigned"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.patch"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:updateSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.updateSigned"},{"hostname":"sasportal.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.patch"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.customers.deployments.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.signDevice"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/deployments","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.deployments.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers/{customersId}/nodes/{nodesId}:move","path_regex":"^(?:/v1alpha1/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.customers.nodes.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:migrateOrganization","path_regex":"^(?:/v1alpha1/customers:migrateOrganization)$","service_name":"google.sasportal","resource_name":"sasportal.customers.migrateOrganization"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:provisionDeployment","path_regex":"^(?:/v1alpha1/customers:provisionDeployment)$","service_name":"google.sasportal","resource_name":"sasportal.customers.provisionDeployment"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/customers:setupSasAnalytics","path_regex":"^(?:/v1alpha1/customers:setupSasAnalytics)$","service_name":"google.sasportal","resource_name":"sasportal.customers.setupSasAnalytics"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/deployments/{deploymentsId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.sasportal","resource_name":"sasportal.deployments.devices.signDevice"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:generateSecret","path_regex":"^(?:/v1alpha1/installer:generateSecret)$","service_name":"google.sasportal","resource_name":"sasportal.installer.generateSecret"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/installer:validate","path_regex":"^(?:/v1alpha1/installer:validate)$","service_name":"google.sasportal","resource_name":"sasportal.installer.validate"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/deployments/{deploymentsId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.deployments.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices/{devicesId}:signDevice","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::signDevice)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.signDevice"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/deployments","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.deployments.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.devices.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/devices:createSigned","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices:createSigned)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.devices.createSigned"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}/nodes","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.nodes.create"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/nodes/{nodesId}/nodes/{nodesId1}:move","path_regex":"^(?:/v1alpha1/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.sasportal","resource_name":"sasportal.nodes.nodes.move"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:get","path_regex":"^(?:/v1alpha1/policies:get)$","service_name":"google.sasportal","resource_name":"sasportal.policies.get"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:set","path_regex":"^(?:/v1alpha1/policies:set)$","service_name":"google.sasportal","resource_name":"sasportal.policies.set"},{"hostname":"sasportal.googleapis.com","http_method":"POST","path_template":"/v1alpha1/policies:test","path_regex":"^(?:/v1alpha1/policies:test)$","service_name":"google.sasportal","resource_name":"sasportal.policies.test"},{"hostname":"script.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{scriptId}/deployments/{deploymentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.deployments.delete"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/processes","path_regex":"^(?:/v1/processes)$","service_name":"google.script","resource_name":"script.processes.list"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/processes:listScriptProcesses","path_regex":"^(?:/v1/processes:listScriptProcesses)$","service_name":"google.script","resource_name":"script.processes.listScriptProcesses"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.get"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.script","resource_name":"script.projects.getContent"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.script","resource_name":"script.projects.deployments.list"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/deployments/{deploymentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.deployments.get"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/metrics","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metrics)$","service_name":"google.script","resource_name":"script.projects.getMetrics"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.script","resource_name":"script.projects.versions.list"},{"hostname":"script.googleapis.com","http_method":"GET","path_template":"/v1/projects/{scriptId}/versions/{versionNumber}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.versions.get"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/projects","path_regex":"^(?:/v1/projects)$","service_name":"google.script","resource_name":"script.projects.create"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/projects/{scriptId}/deployments","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments)$","service_name":"google.script","resource_name":"script.projects.deployments.create"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/projects/{scriptId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.script","resource_name":"script.projects.versions.create"},{"hostname":"script.googleapis.com","http_method":"POST","path_template":"/v1/scripts/{scriptId}:run","path_regex":"^(?:/v1/scripts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.script","resource_name":"script.scripts.run"},{"hostname":"script.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{scriptId}/content","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/content)$","service_name":"google.script","resource_name":"script.projects.updateContent"},{"hostname":"script.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{scriptId}/deployments/{deploymentId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deployments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.script","resource_name":"script.projects.deployments.update"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/customers/{customersId}/customColumns","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customColumns)$","service_name":"google.searchads360","resource_name":"searchads360.customers.customColumns.list"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/customers/{customersId}/customColumns/{customColumnsId}","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customColumns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchads360","resource_name":"searchads360.customers.customColumns.get"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/customers:listAccessibleCustomers","path_regex":"^(?:/v0/customers:listAccessibleCustomers)$","service_name":"google.searchads360","resource_name":"searchads360.customers.listAccessibleCustomers"},{"hostname":"searchads360.googleapis.com","http_method":"GET","path_template":"/v0/searchAds360Fields/{searchAds360FieldsId}","path_regex":"^(?:/v0/searchAds360Fields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchads360","resource_name":"searchads360.searchAds360Fields.get"},{"hostname":"searchads360.googleapis.com","http_method":"POST","path_template":"/v0/customers/{customersId}/searchAds360:search","path_regex":"^(?:/v0/customers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAds360:search)$","service_name":"google.searchads360","resource_name":"searchads360.customers.searchAds360.search"},{"hostname":"searchads360.googleapis.com","http_method":"POST","path_template":"/v0/searchAds360Fields:search","path_regex":"^(?:/v0/searchAds360Fields:search)$","service_name":"google.searchads360","resource_name":"searchads360.searchAds360Fields.search"},{"hostname":"searchconsole.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sites.delete"},{"hostname":"searchconsole.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.delete"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites","path_regex":"^(?:/webmasters/v3/sites)$","service_name":"google.searchconsole","resource_name":"webmasters.sites.list"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sites.get"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps)$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.list"},{"hostname":"searchconsole.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.get"},{"hostname":"searchconsole.googleapis.com","http_method":"POST","path_template":"/v1/urlInspection/index:inspect","path_regex":"^(?:/v1/urlInspection/index:inspect)$","service_name":"google.searchconsole","resource_name":"searchconsole.urlInspection.index.inspect"},{"hostname":"searchconsole.googleapis.com","http_method":"POST","path_template":"/v1/urlTestingTools/mobileFriendlyTest:run","path_regex":"^(?:/v1/urlTestingTools/mobileFriendlyTest:run)$","service_name":"google.searchconsole","resource_name":"searchconsole.urlTestingTools.mobileFriendlyTest.run"},{"hostname":"searchconsole.googleapis.com","http_method":"POST","path_template":"/webmasters/v3/sites/{siteUrl}/searchAnalytics/query","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAnalytics/query)$","service_name":"google.searchconsole","resource_name":"webmasters.searchanalytics.query"},{"hostname":"searchconsole.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sites.add"},{"hostname":"searchconsole.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.searchconsole","resource_name":"webmasters.sitemaps.submit"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"DELETE","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.delete"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/secrets","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}/versions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.list"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.get"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:access","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::access)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.access"},{"hostname":"secretmanager.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}:getIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.getIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.patch"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.testIamPermissions"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.testIamPermissions"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.testIamPermissions"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.locations.secrets.testIamPermissions"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.create"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:destroy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::destroy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.destroy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:disable","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.disable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}/versions/{versionsId}:enable","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.versions.enable"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}:addVersion","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addVersion)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.addVersion"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}:setIamPolicy","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.setIamPolicy"},{"hostname":"secretmanager.googleapis.com","http_method":"POST","path_template":"/v1beta2/projects/{projectsId}/secrets/{secretsId}:testIamPermissions","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/secrets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.secretmanager","resource_name":"secretmanager.projects.secrets.testIamPermissions"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.locations.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.locations.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/resourceValueConfigs/{resourceValueConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceValueConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.resourceValueConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.delete"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/assets","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/bigQueryExports","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/customModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/customModules:listDescendant","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/effectiveCustomModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/muteConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.locations.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.locations.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/muteConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/notificationConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules:listDescendant","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/effectiveCustomModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/sources","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/assets","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/bigQueryExports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/customModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/customModules:listDescendant","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/effectiveCustomModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/muteConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.locations.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.locations.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/muteConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/resourceValueConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceValueConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.resourceValueConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/resourceValueConfigs/{resourceValueConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceValueConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.resourceValueConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules:listDescendant","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/effectiveCustomModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}/attackExposureResults/{attackExposureResultsId}/attackPaths","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attackExposureResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attackPaths)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.attackExposureResults.attackPaths.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}/attackExposureResults/{attackExposureResultsId}/valuedResources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attackExposureResults/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/valuedResources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.attackExposureResults.valuedResources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}/attackPaths","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attackPaths)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.attackPaths.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}/valuedResources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/valuedResources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.valuedResources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}/valuedResources/{valuedResourcesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/valuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.valuedResources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/simulations/{simulationsId}/valuedResources/{valuedResourcesId}/attackPaths","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/simulations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/valuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attackPaths)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.simulations.valuedResources.attackPaths.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/assets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/bigQueryExports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/customModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/customModules:listDescendant","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/effectiveCustomModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/muteConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/muteConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notificationConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules:listDescendant","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:listDescendant)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.listDescendant"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/effectiveCustomModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.effectiveCustomModules.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/effectiveCustomModules/{effectiveCustomModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/effectiveCustomModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.effectiveCustomModules.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/assets","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/eventThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/rapidVulnerabilityDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.rapidVulnerabilityDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/securityCenterSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityCenterSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getSecurityCenterSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/securityHealthAnalyticsSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/virtualMachineThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.virtualMachineThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.getWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/folders/{foldersId}/webSecurityScannerSettings:calculate","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.webSecurityScannerSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/eventThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/rapidVulnerabilityDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.rapidVulnerabilityDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/securityCenterSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityCenterSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getSecurityCenterSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/securityHealthAnalyticsSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/subscription","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subscription)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getSubscription"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/virtualMachineThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.virtualMachineThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/organizations/{organizationsId}/webSecurityScannerSettings:calculate","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.webSecurityScannerSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/eventThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.clusters.getContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/containerThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.clusters.containerThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/rapidVulnerabilityDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.rapidVulnerabilityDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/securityCenterSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityCenterSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getSecurityCenterSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/securityHealthAnalyticsSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/virtualMachineThreatDetectionSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.virtualMachineThreatDetectionSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.getWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1beta2/projects/{projectsId}/webSecurityScannerSettings:calculate","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings:calculate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.webSecurityScannerSettings.calculate"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/assets","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/operations","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/operations/{operationsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.getOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.list"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.get"},{"hostname":"securitycenter.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.list"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.locations.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}/externalSystems/{externalSystemsId}","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.externalSystems.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.locations.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/resourceValueConfigs/{resourceValueConfigsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceValueConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.resourceValueConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/externalSystems/{externalSystemsId}","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.externalSystems.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/bigQueryExports/{bigQueryExportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/muteConfigs/{muteConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules/{customModulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}/externalSystems/{externalSystemsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.externalSystems.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/folders/{foldersId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.updateWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/organizations/{organizationsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/eventThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateEventThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/locations/{locationsId}/clusters/{clustersId}/containerThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containerThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.clusters.updateContainerThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/rapidVulnerabilityDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rapidVulnerabilityDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateRapidVulnerabilityDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/securityHealthAnalyticsSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateSecurityHealthAnalyticsSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/virtualMachineThreatDetectionSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/virtualMachineThreatDetectionSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateVirtualMachineThreatDetectionSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1beta2/projects/{projectsId}/webSecurityScannerSettings","path_regex":"^(?:/v1beta2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webSecurityScannerSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.updateWebSecurityScannerSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/assets/{assetsId}/securityMarks","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs/{notificationConfigsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/organizationSettings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/organizationSettings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.updateOrganizationSettings"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.patch"},{"hostname":"securitycenter.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}/securityMarks","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityMarks)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.updateSecurityMarks"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/assets:group","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/bigQueryExports","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.bigQueryExports.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings/customModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/eventThreatDetectionSettings:validateCustomModule","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:validateCustomModule)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.eventThreatDetectionSettings.validateCustomModule"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/findings:bulkMute","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:bulkMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.findings.bulkMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/locations/{locationsId}/muteConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.locations.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/muteConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/notificationConfigs","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/securityHealthAnalyticsSettings/customModules:simulate","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:simulate)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.securityHealthAnalyticsSettings.customModules.simulate"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}:setMute","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.setMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/folders/{foldersId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.folders.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/assets:group","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/assets:runDiscovery","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:runDiscovery)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.runDiscovery"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/bigQueryExports","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.bigQueryExports.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings/customModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/eventThreatDetectionSettings:validateCustomModule","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:validateCustomModule)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.eventThreatDetectionSettings.validateCustomModule"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/findings:bulkMute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:bulkMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.findings.bulkMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/locations/{locationsId}/muteConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.locations.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/muteConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/resourceValueConfigs:batchCreate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resourceValueConfigs:batchCreate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.resourceValueConfigs.batchCreate"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/securityHealthAnalyticsSettings/customModules:simulate","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:simulate)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.securityHealthAnalyticsSettings.customModules.simulate"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setMute","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}:getIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.getIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}:setIamPolicy","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.setIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/organizations/{organizationsId}/sources/{sourcesId}:testIamPermissions","path_regex":"^(?:/v1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.testIamPermissions"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/assets:group","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/bigQueryExports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bigQueryExports)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.bigQueryExports.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings/customModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/eventThreatDetectionSettings:validateCustomModule","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventThreatDetectionSettings:validateCustomModule)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.eventThreatDetectionSettings.validateCustomModule"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/findings:bulkMute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:bulkMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.findings.bulkMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/muteConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.locations.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/muteConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/muteConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.muteConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/notificationConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/securityHealthAnalyticsSettings/customModules:simulate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/securityHealthAnalyticsSettings/customModules:simulate)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.securityHealthAnalyticsSettings.customModules.simulate"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}:setMute","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setMute)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.setMute"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.projects.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/assets:group","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/assets:runDiscovery","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:runDiscovery)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.runDiscovery"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}:getIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.getIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}:setIamPolicy","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.setIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1beta1/organizations/{organizationsId}/sources/{sourcesId}:testIamPermissions","path_regex":"^(?:/v1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.testIamPermissions"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1alpha1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1p1alpha1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/assets:group","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/assets:runDiscovery","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/assets:runDiscovery)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.assets.runDiscovery"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/notificationConfigs","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.notificationConfigs.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.operations.cancel"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.create"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings/{findingsId}:setState","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setState)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.setState"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}/findings:group","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings:group)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.findings.group"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}:getIamPolicy","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.getIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}:setIamPolicy","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.setIamPolicy"},{"hostname":"securitycenter.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/organizations/{organizationsId}/sources/{sourcesId}:testIamPermissions","path_regex":"^(?:/v1p1beta1/organizations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.securitycenter","resource_name":"securitycenter.organizations.sources.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{instanceId}/service_bindings/{bindingId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.delete"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}:getIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.getIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/service_bindings","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.service_bindings.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/service_instances","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_instances)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.service_instances.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/catalog","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/catalog)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.catalog.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/last_operation","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}/last_operation","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1alpha1/{v1alpha1Id}:getIamPolicy","path_regex":"^(?:/v1alpha1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.getIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/bindings","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.bindings.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/bindings/{bindingsId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.bindings.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/instances/{instancesId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.instances.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/catalog","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/catalog)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.catalog.list"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.get"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}/last_operation","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/last_operation)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.getLast_operation"},{"hostname":"servicebroker.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}:getIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.getIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.patch"},{"hostname":"servicebroker.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.patch"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:setIamPolicy","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.setIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}:testIamPermissions","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicebroker","resource_name":"servicebroker.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1alpha1/{v1alpha1Id}:setIamPolicy","path_regex":"^(?:/v1alpha1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.setIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1alpha1/{v1alpha1Id}:testIamPermissions","path_regex":"^(?:/v1alpha1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicebroker","resource_name":"servicebroker.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/brokers","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers)$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.create"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:setIamPolicy","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicebroker","resource_name":"servicebroker.setIamPolicy"},{"hostname":"servicebroker.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}:testIamPermissions","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicebroker","resource_name":"servicebroker.testIamPermissions"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.create"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1alpha1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.create"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.create"},{"hostname":"servicebroker.googleapis.com","http_method":"PUT","path_template":"/v1beta1/projects/{projectsId}/brokers/{brokersId}/v2/service_instances/{service_instancesId}/service_bindings/{service_bindingsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/brokers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/v2/service_instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/service_bindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicebroker","resource_name":"servicebroker.projects.brokers.v2.service_instances.service_bindings.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides/{producerOverridesId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerQuotaPolicies/{producerQuotaPoliciesId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerQuotaPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerQuotaPolicies.delete"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}:search","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::search)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.search"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.get"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"GET","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerQuotaPolicies","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerQuotaPolicies)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerQuotaPolicies.list"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides/{producerOverridesId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.patch"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerQuotaPolicies/{producerQuotaPoliciesId}","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerQuotaPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerQuotaPolicies.patch"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.operations.cancel"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:addProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.addProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:applyProjectConfig","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::applyProjectConfig)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.applyProjectConfig"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:attachProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::attachProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.attachProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:deleteProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::deleteProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.deleteProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:removeProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.removeProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}/tenancyUnits/{tenancyUnitsId}:undeleteProject","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tenancyUnits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undeleteProject)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.tenancyUnits.undeleteProject"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerOverrides","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerOverrides)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerOverrides.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/producerQuotaPolicies","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/producerQuotaPolicies)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.limits.producerQuotaPolicies.create"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics:importProducerOverrides","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importProducerOverrides)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.importProducerOverrides"},{"hostname":"serviceconsumermanagement.googleapis.com","http_method":"POST","path_template":"/v1beta1/services/{servicesId}/{servicesId1}/{servicesId2}/consumerQuotaMetrics:importProducerQuotaPolicies","path_regex":"^(?:/v1beta1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importProducerQuotaPolicies)$","service_name":"google.serviceconsumermanagement","resource_name":"serviceconsumermanagement.services.consumerQuotaMetrics.importProducerQuotaPolicies"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:allocateQuota","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::allocateQuota)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.allocateQuota"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:check","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.check"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:report","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::report)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.report"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v2/services/{serviceName}:check","path_regex":"^(?:/v2/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::check)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.check"},{"hostname":"servicecontrol.googleapis.com","http_method":"POST","path_template":"/v2/services/{serviceName}:report","path_regex":"^(?:/v2/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::report)$","service_name":"google.servicecontrol","resource_name":"servicecontrol.services.report"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.delete"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.list"},{"hostname":"servicedirectory.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.get"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints/{endpointsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.patch"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:resolve","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.resolve"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}/endpoints","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/endpoints)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.endpoints.create"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:resolve","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.resolve"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.services.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/workloads/{workloadsId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.workloads.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/workloads/{workloadsId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.workloads.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}/workloads/{workloadsId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workloads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.workloads.testIamPermissions"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:getIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.getIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:setIamPolicy","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.setIamPolicy"},{"hostname":"servicedirectory.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/namespaces/{namespacesId}:testIamPermissions","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/namespaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicedirectory","resource_name":"servicedirectory.projects.locations.namespaces.testIamPermissions"},{"hostname":"servicemanagement.googleapis.com","http_method":"DELETE","path_template":"/v1/services/{serviceName}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.delete"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.operations.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.operations.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/config","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.getConfig"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/configs","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/configs/{configId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/rollouts","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.rollouts.list"},{"hostname":"servicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/services/{serviceName}/rollouts/{rolloutId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.rollouts.get"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services","path_regex":"^(?:/v1/services)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.create"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}/configs","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.create"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}/configs:submit","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/configs:submit)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.configs.submit"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}/rollouts","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollouts)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.rollouts.create"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{serviceName}:undelete","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.undelete"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/consumers/{consumersId}:getIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.consumers.getIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/consumers/{consumersId}:setIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.consumers.setIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/consumers/{consumersId}:testIamPermissions","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.consumers.testIamPermissions"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:getIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.getIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:setIamPolicy","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.setIamPolicy"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:testIamPermissions","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.testIamPermissions"},{"hostname":"servicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/services:generateConfigReport","path_regex":"^(?:/v1/services:generateConfigReport)$","service_name":"google.servicemanagement","resource_name":"servicemanagement.services.generateConfigReport"},{"hostname":"servicenetworking.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.delete"},{"hostname":"servicenetworking.googleapis.com","http_method":"DELETE","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/peeredDnsDomains/{peeredDnsDomainsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeredDnsDomains/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.peeredDnsDomains.delete"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/connections","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/dnsRecordSets:get","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:get)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/dnsRecordSets:list","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:list)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/dnsZones/{dnsZonesId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsZones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.dnsZones.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/dnsZones:list","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsZones:list)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.dnsZones.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/peeredDnsDomains","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeredDnsDomains)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.peeredDnsDomains.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/vpcServiceControls","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vpcServiceControls)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.getVpcServiceControls"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1beta/operations/{operationsId}","path_regex":"^(?:/v1beta/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.get"},{"hostname":"servicenetworking.googleapis.com","http_method":"GET","path_template":"/v1beta/services/{servicesId}/connections","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.list"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}/connections/{connectionsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.patch"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}:updateConsumerConfig","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::updateConsumerConfig)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.updateConsumerConfig"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}:disableVpcServiceControls","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disableVpcServiceControls)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.disableVpcServiceControls"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1/services/{servicesId}:enableVpcServiceControls","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enableVpcServiceControls)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.enableVpcServiceControls"},{"hostname":"servicenetworking.googleapis.com","http_method":"PATCH","path_template":"/v1beta/services/{servicesId}/connections","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.updateConnections"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.operations.cancel"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/connections","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.create"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/connections/{connectionsId}","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.deleteConnection"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsRecordSets:add","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:add)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.add"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsRecordSets:remove","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:remove)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.remove"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsRecordSets:update","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsRecordSets:update)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsRecordSets.update"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsZones:add","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsZones:add)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsZones.add"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/dnsZones:remove","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsZones:remove)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.dnsZones.remove"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/projects/{projectsId}/global/networks/{networksId}/peeredDnsDomains","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/global/networks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeredDnsDomains)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.projects.global.networks.peeredDnsDomains.create"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/roles:add","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/roles:add)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.roles.add"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}/{servicesId1}/{servicesId2}:addSubnetwork","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addSubnetwork)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.addSubnetwork"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:searchRange","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchRange)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.searchRange"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1/services/{servicesId}:validate","path_regex":"^(?:/v1/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::validate)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.validate"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1beta/services/{servicesId}/connections","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connections)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.connections.create"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1beta/services/{servicesId}/{servicesId1}/{servicesId2}:addSubnetwork","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addSubnetwork)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.addSubnetwork"},{"hostname":"servicenetworking.googleapis.com","http_method":"POST","path_template":"/v1beta/services/{servicesId}:searchRange","path_regex":"^(?:/v1beta/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::searchRange)$","service_name":"google.servicenetworking","resource_name":"servicenetworking.services.searchRange"},{"hostname":"serviceusage.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.delete"},{"hostname":"serviceusage.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides/{adminOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.delete"},{"hostname":"serviceusage.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides/{consumerOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.delete"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/services","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/services/{servicesId}","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/{v1Id1}/services:batchGet","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchGet)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.batchGet"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.get"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.list"},{"hostname":"serviceusage.googleapis.com","http_method":"GET","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.list"},{"hostname":"serviceusage.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides/{adminOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.patch"},{"hostname":"serviceusage.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides/{consumerOverridesId}","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.patch"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.serviceusage","resource_name":"serviceusage.operations.cancel"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/services/{servicesId}:disable","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.disable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/services/{servicesId}:enable","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.enable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1/{v1Id}/{v1Id1}/services:batchEnable","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchEnable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.batchEnable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/adminOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adminOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.adminOverrides.create"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics/{consumerQuotaMetricsId}/limits/{limitsId}/consumerOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/limits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.limits.consumerOverrides.create"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics:importAdminOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importAdminOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.importAdminOverrides"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}/consumerQuotaMetrics:importConsumerOverrides","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/consumerQuotaMetrics:importConsumerOverrides)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.consumerQuotaMetrics.importConsumerOverrides"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}:disable","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.disable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}:enable","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.enable"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services/{servicesId}:generateServiceIdentity","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateServiceIdentity)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.generateServiceIdentity"},{"hostname":"serviceusage.googleapis.com","http_method":"POST","path_template":"/v1beta1/{v1beta1Id}/{v1beta1Id1}/services:batchEnable","path_regex":"^(?:/v1beta1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services:batchEnable)$","service_name":"google.serviceusage","resource_name":"serviceusage.services.batchEnable"},{"hostname":"serviceuser.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/services","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services)$","service_name":"google.serviceuser","resource_name":"serviceuser.projects.services.list"},{"hostname":"serviceuser.googleapis.com","http_method":"GET","path_template":"/v1/services:search","path_regex":"^(?:/v1/services:search)$","service_name":"google.serviceuser","resource_name":"serviceuser.services.search"},{"hostname":"serviceuser.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services/{servicesId}:disable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::disable)$","service_name":"google.serviceuser","resource_name":"serviceuser.projects.services.disable"},{"hostname":"serviceuser.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/services/{servicesId}:enable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/services/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::enable)$","service_name":"google.serviceuser","resource_name":"serviceuser.projects.services.enable"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.get"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developerMetadata/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.developerMetadata.get"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.get"},{"hostname":"sheets.googleapis.com","http_method":"GET","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchGet","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchGet)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchGet"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets","path_regex":"^(?:/v4/spreadsheets)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.create"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/developerMetadata:search","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/developerMetadata:search)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.developerMetadata.search"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::copyTo)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.sheets.copyTo"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}:append","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::append)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.append"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}:clear","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::clear)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.clear"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchClear","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchClear)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchClear"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchClearByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchClearByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchGetByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchGetByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchUpdate","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchUpdate)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchUpdate"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values:batchUpdateByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.batchUpdateByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}:batchUpdate","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.batchUpdate"},{"hostname":"sheets.googleapis.com","http_method":"POST","path_template":"/v4/spreadsheets/{spreadsheetId}:getByDataFilter","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getByDataFilter)$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.getByDataFilter"},{"hostname":"sheets.googleapis.com","http_method":"PUT","path_template":"/v4/spreadsheets/{spreadsheetId}/values/{range}","path_regex":"^(?:/v4/spreadsheets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/values/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sheets","resource_name":"sheets.spreadsheets.values.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/accounts/{accountId}/labels/{labelId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.labels.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/accounts/{accountId}/returncarrier/{carrierAccountId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.returncarrier.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/collections/{collectionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.collections.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.conversionsources.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/freelistingsprogram/checkoutsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram/checkoutsettings)$","service_name":"google.content","resource_name":"content.freelistingsprogram.checkoutsettings.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/productdeliverytime/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productdeliverytime/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productdeliverytime.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/regions/{regionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.regions.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/returnaddress/{returnAddressId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnaddress.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/returnpolicy/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicy.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2.1/{merchantId}/returnpolicyonline/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicyonline.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"DELETE","path_template":"/content/v2/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.delete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/accounts/authinfo","path_regex":"^(?:/content/v2\\.1/accounts/authinfo)$","service_name":"google.content","resource_name":"content.accounts.authinfo"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/accounts/{accountId}/labels","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.content","resource_name":"content.accounts.labels.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/accounts/{accountId}/returncarrier","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier)$","service_name":"google.content","resource_name":"content.accounts.returncarrier.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/liasettings/posdataproviders","path_regex":"^(?:/content/v2\\.1/liasettings/posdataproviders)$","service_name":"google.content","resource_name":"content.liasettings.listposdataproviders"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{cssGroupId}/csses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csses)$","service_name":"google.content","resource_name":"content.csses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{cssGroupId}/csses/{cssDomainId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.csses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounts","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/listlinks","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listlinks)$","service_name":"google.content","resource_name":"content.accounts.listlinks"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accountstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses)$","service_name":"google.content","resource_name":"content.accountstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accountstatuses/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accountstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounttax","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax)$","service_name":"google.content","resource_name":"content.accounttax.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.buyongoogleprograms.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collections","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections)$","service_name":"google.content","resource_name":"content.collections.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collections/{collectionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.collections.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collectionstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionstatuses)$","service_name":"google.content","resource_name":"content.collectionstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/collectionstatuses/{collectionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collectionstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.collectionstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/conversionsources","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources)$","service_name":"google.content","resource_name":"content.conversionsources.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.conversionsources.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeeds","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeedstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses)$","service_name":"google.content","resource_name":"content.datafeedstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/datafeedstatuses/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeedstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/freelistingsprogram","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram)$","service_name":"google.content","resource_name":"content.freelistingsprogram.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/freelistingsprogram/checkoutsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram/checkoutsettings)$","service_name":"google.content","resource_name":"content.freelistingsprogram.checkoutsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/liasettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings)$","service_name":"google.content","resource_name":"content.liasettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/accessiblegmbaccounts","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessiblegmbaccounts)$","service_name":"google.content","resource_name":"content.liasettings.getaccessiblegmbaccounts"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreports/disbursements","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements)$","service_name":"google.content","resource_name":"content.orderreports.listdisbursements"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreports/disbursements/{disbursementId}/transactions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transactions)$","service_name":"google.content","resource_name":"content.orderreports.listtransactions"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreturns","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns)$","service_name":"google.content","resource_name":"content.orderreturns.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orderreturns.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orders","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.content","resource_name":"content.orders.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/orders/{orderId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/ordersbymerchantid/{merchantOrderId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordersbymerchantid/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.getbymerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productdeliverytime/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productdeliverytime/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productdeliverytime.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/products","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productstatuses","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses)$","service_name":"google.content","resource_name":"content.productstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/productstatuses/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/promotions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions)$","service_name":"google.content","resource_name":"content.promotions.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/promotions/{id}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.promotions.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/pubsubnotificationsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pubsubnotificationsettings)$","service_name":"google.content","resource_name":"content.pubsubnotificationsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/quotas","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/quotas)$","service_name":"google.content","resource_name":"content.quotas.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/recommendations/generate","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/generate)$","service_name":"google.content","resource_name":"content.recommendations.generate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/regions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.content","resource_name":"content.regions.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/regions/{regionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.regions.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnaddress","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress)$","service_name":"google.content","resource_name":"content.returnaddress.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnaddress/{returnAddressId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnaddress.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicy","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy)$","service_name":"google.content","resource_name":"content.returnpolicy.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicy/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicy.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicyonline","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline)$","service_name":"google.content","resource_name":"content.returnpolicyonline.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/returnpolicyonline/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicyonline.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/settlementreports","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settlementreports)$","service_name":"google.content","resource_name":"content.settlementreports.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/settlementreports/{settlementId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settlementreports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.settlementreports.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/settlementreports/{settlementId}/transactions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settlementreports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transactions)$","service_name":"google.content","resource_name":"content.settlementtransactions.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/shippingsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings)$","service_name":"google.content","resource_name":"content.shippingsettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/shoppingadsprogram","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shoppingadsprogram)$","service_name":"google.content","resource_name":"content.shoppingadsprogram.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/supportedCarriers","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedCarriers)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedcarriers"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/supportedHolidays","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedHolidays)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedholidays"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/supportedPickupServices","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedPickupServices)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedpickupservices"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2.1/{merchantId}/testordertemplates/{templateName}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testordertemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.gettestordertemplate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/accounts/authinfo","path_regex":"^(?:/content/v2/accounts/authinfo)$","service_name":"google.content","resource_name":"content.accounts.authinfo"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/liasettings/posdataproviders","path_regex":"^(?:/content/v2/liasettings/posdataproviders)$","service_name":"google.content","resource_name":"content.liasettings.listposdataproviders"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounts","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accountstatuses","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses)$","service_name":"google.content","resource_name":"content.accountstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accountstatuses/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accountstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounttax","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax)$","service_name":"google.content","resource_name":"content.accounttax.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeeds","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeedstatuses","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses)$","service_name":"google.content","resource_name":"content.datafeedstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/datafeedstatuses/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeedstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeedstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/liasettings","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings)$","service_name":"google.content","resource_name":"content.liasettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/accessiblegmbaccounts","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accessiblegmbaccounts)$","service_name":"google.content","resource_name":"content.liasettings.getaccessiblegmbaccounts"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreports/disbursements","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements)$","service_name":"google.content","resource_name":"content.orderreports.listdisbursements"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreports/disbursements/{disbursementId}/transactions","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreports/disbursements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transactions)$","service_name":"google.content","resource_name":"content.orderreports.listtransactions"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreturns","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns)$","service_name":"google.content","resource_name":"content.orderreturns.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orderreturns/{returnId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orderreturns.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orders","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.content","resource_name":"content.orders.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/orders/{orderId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/ordersbymerchantid/{merchantOrderId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordersbymerchantid/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.getbymerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store/{storeCode}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.pos.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/products","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/productstatuses","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses)$","service_name":"google.content","resource_name":"content.productstatuses.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/productstatuses/{productId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productstatuses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.productstatuses.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/shippingsettings","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings)$","service_name":"google.content","resource_name":"content.shippingsettings.list"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.get"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/supportedCarriers","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedCarriers)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedcarriers"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/supportedHolidays","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedHolidays)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedholidays"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/supportedPickupServices","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedPickupServices)$","service_name":"google.content","resource_name":"content.shippingsettings.getsupportedpickupservices"},{"hostname":"shoppingcontent.googleapis.com","http_method":"GET","path_template":"/content/v2/{merchantId}/testordertemplates/{templateName}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testordertemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.gettestordertemplate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/accounts/{accountId}/labels/{labelId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.labels.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/accounts/{accountId}/returncarrier/{carrierAccountId}","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.returncarrier.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.buyongoogleprograms.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.conversionsources.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/products/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.products.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/regions/{regionId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.regions.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PATCH","path_template":"/content/v2.1/{merchantId}/returnpolicyonline/{returnPolicyId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.returnpolicyonline.patch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/batch","path_regex":"^(?:/content/v2\\.1/accounts/batch)$","service_name":"google.content","resource_name":"content.accounts.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/{accountId}/credentials","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/credentials)$","service_name":"google.content","resource_name":"content.accounts.credentials.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/{accountId}/labels","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.content","resource_name":"content.accounts.labels.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounts/{accountId}/returncarrier","path_regex":"^(?:/content/v2\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returncarrier)$","service_name":"google.content","resource_name":"content.accounts.returncarrier.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accountstatuses/batch","path_regex":"^(?:/content/v2\\.1/accountstatuses/batch)$","service_name":"google.content","resource_name":"content.accountstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/accounttax/batch","path_regex":"^(?:/content/v2\\.1/accounttax/batch)$","service_name":"google.content","resource_name":"content.accounttax.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/datafeeds/batch","path_regex":"^(?:/content/v2\\.1/datafeeds/batch)$","service_name":"google.content","resource_name":"content.datafeeds.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/datafeedstatuses/batch","path_regex":"^(?:/content/v2\\.1/datafeedstatuses/batch)$","service_name":"google.content","resource_name":"content.datafeedstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/liasettings/batch","path_regex":"^(?:/content/v2\\.1/liasettings/batch)$","service_name":"google.content","resource_name":"content.liasettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/localinventory/batch","path_regex":"^(?:/content/v2\\.1/localinventory/batch)$","service_name":"google.content","resource_name":"content.localinventory.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/pos/batch","path_regex":"^(?:/content/v2\\.1/pos/batch)$","service_name":"google.content","resource_name":"content.pos.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/products/batch","path_regex":"^(?:/content/v2\\.1/products/batch)$","service_name":"google.content","resource_name":"content.products.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/productstatuses/batch","path_regex":"^(?:/content/v2\\.1/productstatuses/batch)$","service_name":"google.content","resource_name":"content.productstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/regionalinventory/batch","path_regex":"^(?:/content/v2\\.1/regionalinventory/batch)$","service_name":"google.content","resource_name":"content.regionalinventory.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/returnaddress/batch","path_regex":"^(?:/content/v2\\.1/returnaddress/batch)$","service_name":"google.content","resource_name":"content.returnaddress.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/returnpolicy/batch","path_regex":"^(?:/content/v2\\.1/returnpolicy/batch)$","service_name":"google.content","resource_name":"content.returnpolicy.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/shippingsettings/batch","path_regex":"^(?:/content/v2\\.1/shippingsettings/batch)$","service_name":"google.content","resource_name":"content.shippingsettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{cssGroupId}/csses/{cssDomainId}/updatelabels","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/csses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatelabels)$","service_name":"google.content","resource_name":"content.csses.updatelabels"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/claimwebsite","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/claimwebsite)$","service_name":"google.content","resource_name":"content.accounts.claimwebsite"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/link","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/link)$","service_name":"google.content","resource_name":"content.accounts.link"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/requestphoneverification","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestphoneverification)$","service_name":"google.content","resource_name":"content.accounts.requestphoneverification"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/updatelabels","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updatelabels)$","service_name":"google.content","resource_name":"content.accounts.updatelabels"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}/verifyphonenumber","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyphonenumber)$","service_name":"google.content","resource_name":"content.accounts.verifyphonenumber"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/activate","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activate)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.activate"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/onboard","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/onboard)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.onboard"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/pause","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pause)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.pause"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/buyongoogleprograms/{regionCode}/requestreview","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/buyongoogleprograms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestreview)$","service_name":"google.content","resource_name":"content.buyongoogleprograms.requestreview"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/collections","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/collections)$","service_name":"google.content","resource_name":"content.collections.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/conversionsources","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources)$","service_name":"google.content","resource_name":"content.conversionsources.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/conversionsources/{conversionSourceId}:undelete","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversionsources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.content","resource_name":"content.conversionsources.undelete"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/datafeeds","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}/fetchNow","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fetchNow)$","service_name":"google.content","resource_name":"content.datafeeds.fetchnow"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/freelistingsprogram/checkoutsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram/checkoutsettings)$","service_name":"google.content","resource_name":"content.freelistingsprogram.checkoutsettings.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/freelistingsprogram/requestreview","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/freelistingsprogram/requestreview)$","service_name":"google.content","resource_name":"content.freelistingsprogram.requestreview"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/requestgmbaccess","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestgmbaccess)$","service_name":"google.content","resource_name":"content.liasettings.requestgmbaccess"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/requestinventoryverification/{country}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestinventoryverification/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.requestinventoryverification"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/setinventoryverificationcontact","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setinventoryverificationcontact)$","service_name":"google.content","resource_name":"content.liasettings.setinventoryverificationcontact"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/setomnichannelexperience","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setomnichannelexperience)$","service_name":"google.content","resource_name":"content.liasettings.setomnichannelexperience"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}/setposdataprovider","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setposdataprovider)$","service_name":"google.content","resource_name":"content.liasettings.setposdataprovider"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/merchantsupport/renderaccountissues","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantsupport/renderaccountissues)$","service_name":"google.content","resource_name":"content.merchantsupport.renderaccountissues"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/merchantsupport/renderproductissues/{productId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantsupport/renderproductissues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.merchantsupport.renderproductissues"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/merchantsupport/triggeraction","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/merchantsupport/triggeraction)$","service_name":"google.content","resource_name":"content.merchantsupport.triggeraction"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderinvoices/{orderId}/createChargeInvoice","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createChargeInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createchargeinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderinvoices/{orderId}/createRefundInvoice","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createRefundInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createrefundinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/createOrderReturn","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/createOrderReturn)$","service_name":"google.content","resource_name":"content.orderreturns.createorderreturn"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}/acknowledge","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orderreturns.acknowledge"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}/labels","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/labels)$","service_name":"google.content","resource_name":"content.orderreturns.labels.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orderreturns/{returnId}/process","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/process)$","service_name":"google.content","resource_name":"content.orderreturns.process"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/acknowledge","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orders.acknowledge"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/cancel","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.content","resource_name":"content.orders.cancel"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/cancelLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelLineItem)$","service_name":"google.content","resource_name":"content.orders.cancellineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/captureOrder","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/captureOrder)$","service_name":"google.content","resource_name":"content.orders.captureOrder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/inStoreRefundLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inStoreRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.instorerefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/refunditem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refunditem)$","service_name":"google.content","resource_name":"content.orders.refunditem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/refundorder","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refundorder)$","service_name":"google.content","resource_name":"content.orders.refundorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/rejectReturnLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rejectReturnLineItem)$","service_name":"google.content","resource_name":"content.orders.rejectreturnlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/returnRefundLineItem","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.returnrefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/setLineItemMetadata","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLineItemMetadata)$","service_name":"google.content","resource_name":"content.orders.setlineitemmetadata"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/shipLineItems","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shipLineItems)$","service_name":"google.content","resource_name":"content.orders.shiplineitems"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/testreturn","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testreturn)$","service_name":"google.content","resource_name":"content.orders.createtestreturn"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/updateLineItemShippingDetails","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateLineItemShippingDetails)$","service_name":"google.content","resource_name":"content.orders.updatelineitemshippingdetails"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/updateMerchantOrderId","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateMerchantOrderId)$","service_name":"google.content","resource_name":"content.orders.updatemerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/orders/{orderId}/updateShipment","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShipment)$","service_name":"google.content","resource_name":"content.orders.updateshipment"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/ordertrackingsignals","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordertrackingsignals)$","service_name":"google.content","resource_name":"content.ordertrackingsignals.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/inventory","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.content","resource_name":"content.pos.inventory"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/sale","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sale)$","service_name":"google.content","resource_name":"content.pos.sale"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/productdeliverytime","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productdeliverytime)$","service_name":"google.content","resource_name":"content.productdeliverytime.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/products","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/products/{productId}/localinventory","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/localinventory)$","service_name":"google.content","resource_name":"content.localinventory.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/products/{productId}/regionalinventory","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regionalinventory)$","service_name":"google.content","resource_name":"content.regionalinventory.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/promotions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promotions)$","service_name":"google.content","resource_name":"content.promotions.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/recommendations/reportInteraction","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/recommendations/reportInteraction)$","service_name":"google.content","resource_name":"content.recommendations.reportInteraction"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/regions","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.content","resource_name":"content.regions.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/reports/search","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/search)$","service_name":"google.content","resource_name":"content.reports.search"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/returnaddress","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnaddress)$","service_name":"google.content","resource_name":"content.returnaddress.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/returnpolicy","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicy)$","service_name":"google.content","resource_name":"content.returnpolicy.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/returnpolicyonline","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnpolicyonline)$","service_name":"google.content","resource_name":"content.returnpolicyonline.create"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/shoppingadsprogram/requestreview","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shoppingadsprogram/requestreview)$","service_name":"google.content","resource_name":"content.shoppingadsprogram.requestreview"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/testorders","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders)$","service_name":"google.content","resource_name":"content.orders.createtestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/testorders/{orderId}/advance","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advance)$","service_name":"google.content","resource_name":"content.orders.advancetestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2.1/{merchantId}/testorders/{orderId}/cancelByCustomer","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelByCustomer)$","service_name":"google.content","resource_name":"content.orders.canceltestorderbycustomer"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/accounts/batch","path_regex":"^(?:/content/v2/accounts/batch)$","service_name":"google.content","resource_name":"content.accounts.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/accountstatuses/batch","path_regex":"^(?:/content/v2/accountstatuses/batch)$","service_name":"google.content","resource_name":"content.accountstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/accounttax/batch","path_regex":"^(?:/content/v2/accounttax/batch)$","service_name":"google.content","resource_name":"content.accounttax.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/datafeeds/batch","path_regex":"^(?:/content/v2/datafeeds/batch)$","service_name":"google.content","resource_name":"content.datafeeds.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/datafeedstatuses/batch","path_regex":"^(?:/content/v2/datafeedstatuses/batch)$","service_name":"google.content","resource_name":"content.datafeedstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/liasettings/batch","path_regex":"^(?:/content/v2/liasettings/batch)$","service_name":"google.content","resource_name":"content.liasettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/orders/batch","path_regex":"^(?:/content/v2/orders/batch)$","service_name":"google.content","resource_name":"content.orders.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/pos/batch","path_regex":"^(?:/content/v2/pos/batch)$","service_name":"google.content","resource_name":"content.pos.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/products/batch","path_regex":"^(?:/content/v2/products/batch)$","service_name":"google.content","resource_name":"content.products.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/productstatuses/batch","path_regex":"^(?:/content/v2/productstatuses/batch)$","service_name":"google.content","resource_name":"content.productstatuses.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/shippingsettings/batch","path_regex":"^(?:/content/v2/shippingsettings/batch)$","service_name":"google.content","resource_name":"content.shippingsettings.custombatch"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/accounts","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.content","resource_name":"content.accounts.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/accounts/{accountId}/claimwebsite","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/claimwebsite)$","service_name":"google.content","resource_name":"content.accounts.claimwebsite"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/accounts/{accountId}/link","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/link)$","service_name":"google.content","resource_name":"content.accounts.link"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/datafeeds","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds)$","service_name":"google.content","resource_name":"content.datafeeds.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}/fetchNow","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/fetchNow)$","service_name":"google.content","resource_name":"content.datafeeds.fetchnow"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/requestgmbaccess","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestgmbaccess)$","service_name":"google.content","resource_name":"content.liasettings.requestgmbaccess"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/requestinventoryverification/{country}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/requestinventoryverification/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.requestinventoryverification"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/setinventoryverificationcontact","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setinventoryverificationcontact)$","service_name":"google.content","resource_name":"content.liasettings.setinventoryverificationcontact"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/liasettings/{accountId}/setposdataprovider","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setposdataprovider)$","service_name":"google.content","resource_name":"content.liasettings.setposdataprovider"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orderinvoices/{orderId}/createChargeInvoice","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createChargeInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createchargeinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orderinvoices/{orderId}/createRefundInvoice","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createRefundInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createrefundinvoice"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/acknowledge","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orders.acknowledge"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/cancel","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.content","resource_name":"content.orders.cancel"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/cancelLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelLineItem)$","service_name":"google.content","resource_name":"content.orders.cancellineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/inStoreRefundLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inStoreRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.instorerefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/refund","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refund)$","service_name":"google.content","resource_name":"content.orders.refund"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/rejectReturnLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rejectReturnLineItem)$","service_name":"google.content","resource_name":"content.orders.rejectreturnlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/returnLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnLineItem)$","service_name":"google.content","resource_name":"content.orders.returnlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/returnRefundLineItem","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.returnrefundlineitem"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/setLineItemMetadata","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLineItemMetadata)$","service_name":"google.content","resource_name":"content.orders.setlineitemmetadata"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/shipLineItems","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shipLineItems)$","service_name":"google.content","resource_name":"content.orders.shiplineitems"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/testreturn","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testreturn)$","service_name":"google.content","resource_name":"content.orders.createtestreturn"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/updateLineItemShippingDetails","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateLineItemShippingDetails)$","service_name":"google.content","resource_name":"content.orders.updatelineitemshippingdetails"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/updateMerchantOrderId","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateMerchantOrderId)$","service_name":"google.content","resource_name":"content.orders.updatemerchantorderid"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/orders/{orderId}/updateShipment","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShipment)$","service_name":"google.content","resource_name":"content.orders.updateshipment"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/inventory","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventory)$","service_name":"google.content","resource_name":"content.pos.inventory"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/sale","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sale)$","service_name":"google.content","resource_name":"content.pos.sale"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/pos/{targetMerchantId}/store","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/store)$","service_name":"google.content","resource_name":"content.pos.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/products","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.content","resource_name":"content.products.insert"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/testorders","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders)$","service_name":"google.content","resource_name":"content.orders.createtestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/testorders/{orderId}/advance","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advance)$","service_name":"google.content","resource_name":"content.orders.advancetestorder"},{"hostname":"shoppingcontent.googleapis.com","http_method":"POST","path_template":"/content/v2/{merchantId}/testorders/{orderId}/cancelByCustomer","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelByCustomer)$","service_name":"google.content","resource_name":"content.orders.canceltestorderbycustomer"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/pubsubnotificationsettings","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pubsubnotificationsettings)$","service_name":"google.content","resource_name":"content.pubsubnotificationsettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2.1/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2\\.1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/accounts/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounts.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/accounttax/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounttax/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.accounttax.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/datafeeds/{datafeedId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datafeeds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.datafeeds.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/liasettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/liasettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.liasettings.update"},{"hostname":"shoppingcontent.googleapis.com","http_method":"PUT","path_template":"/content/v2/{merchantId}/shippingsettings/{accountId}","path_regex":"^(?:/content/v2/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shippingsettings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.shippingsettings.update"},{"hostname":"slides.googleapis.com","http_method":"GET","path_template":"/v1/presentations/{presentationId}/pages/{pageObjectId}","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.slides","resource_name":"slides.presentations.pages.get"},{"hostname":"slides.googleapis.com","http_method":"GET","path_template":"/v1/presentations/{presentationId}/pages/{pageObjectId}/thumbnail","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/thumbnail)$","service_name":"google.slides","resource_name":"slides.presentations.pages.getThumbnail"},{"hostname":"slides.googleapis.com","http_method":"GET","path_template":"/v1/presentations/{presentationsId}","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.slides","resource_name":"slides.presentations.get"},{"hostname":"slides.googleapis.com","http_method":"POST","path_template":"/v1/presentations","path_regex":"^(?:/v1/presentations)$","service_name":"google.slides","resource_name":"slides.presentations.create"},{"hostname":"slides.googleapis.com","http_method":"POST","path_template":"/v1/presentations/{presentationId}:batchUpdate","path_regex":"^(?:/v1/presentations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchUpdate)$","service_name":"google.slides","resource_name":"slides.presentations.batchUpdate"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.devices.list"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.devices.get"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.list"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures/{structuresId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.get"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures/{structuresId}/rooms","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rooms)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.rooms.list"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"GET","path_template":"/v1/enterprises/{enterprisesId}/structures/{structuresId}/rooms/{roomsId}","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/structures/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rooms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.structures.rooms.get"},{"hostname":"smartdevicemanagement.googleapis.com","http_method":"POST","path_template":"/v1/enterprises/{enterprisesId}/devices/{devicesId}:executeCommand","path_regex":"^(?:/v1/enterprises/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/devices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeCommand)$","service_name":"google.smartdevicemanagement","resource_name":"smartdevicemanagement.enterprises.devices.executeCommand"},{"hostname":"solar.googleapis.com","http_method":"GET","path_template":"/v1/buildingInsights:findClosest","path_regex":"^(?:/v1/buildingInsights:findClosest)$","service_name":"google.solar","resource_name":"solar.buildingInsights.findClosest"},{"hostname":"solar.googleapis.com","http_method":"GET","path_template":"/v1/dataLayers:get","path_regex":"^(?:/v1/dataLayers:get)$","service_name":"google.solar","resource_name":"solar.dataLayers.get"},{"hostname":"solar.googleapis.com","http_method":"GET","path_template":"/v1/geoTiff:get","path_regex":"^(?:/v1/geoTiff:get)$","service_name":"google.solar","resource_name":"solar.geoTiff.get"},{"hostname":"sourcerepo.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/repos/{reposId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.delete"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.getConfig"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.list"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/repos/{reposId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.get"},{"hostname":"sourcerepo.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/repos/{reposId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.getIamPolicy"},{"hostname":"sourcerepo.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/config","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/config)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.updateConfig"},{"hostname":"sourcerepo.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/repos/{reposId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.patch"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.create"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos/{reposId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.setIamPolicy"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos/{reposId}:sync","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sync)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.sync"},{"hostname":"sourcerepo.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/repos/{reposId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/repos/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.sourcerepo","resource_name":"sourcerepo.projects.repos.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/ssdCaches/{ssdCachesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ssdCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.ssdCaches.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.dropDatabase"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.delete"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/ssdCaches/{ssdCachesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ssdCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.ssdCaches.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/ssdCaches/{ssdCachesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ssdCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.ssdCaches.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backupOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backupOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databaseOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databaseOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databaseOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/databaseRoles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databaseRoles)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.databaseRoles.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/ddl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ddl)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.getDdl"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/scans","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scans)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.getScans"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitionOperations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitionOperations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitionOperations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.list"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.get"},{"hostname":"spanner.googleapis.com","http_method":"GET","path_template":"/v1/scans","path_regex":"^(?:/v1/scans)$","service_name":"google.spanner","resource_name":"spanner.scans.list"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.patch"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/ddl","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ddl)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.updateDdl"},{"hostname":"spanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.patch"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instanceConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instanceConfigs/{instanceConfigsId}/ssdCaches/{ssdCachesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ssdCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instanceConfigs.ssdCaches.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups/{backupsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/backups:copy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backups:copy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.backups.copy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/backupSchedules/{backupSchedulesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupSchedules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.backupSchedules.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/databaseRoles/{databaseRolesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databaseRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.databaseRoles.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:batchWrite","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchWrite)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.batchWrite"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:beginTransaction","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::beginTransaction)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.beginTransaction"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:commit","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::commit)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.commit"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:executeBatchDml","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeBatchDml)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.executeBatchDml"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:executeSql","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeSql)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.executeSql"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:executeStreamingSql","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::executeStreamingSql)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.executeStreamingSql"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:partitionQuery","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionQuery)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.partitionQuery"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:partitionRead","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::partitionRead)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.partitionRead"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:read","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::read)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.read"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:rollback","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::rollback)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.rollback"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions/{sessionsId}:streamingRead","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::streamingRead)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.streamingRead"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}/sessions:batchCreate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sessions:batchCreate)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.sessions.batchCreate"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:changequorum","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::changequorum)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.changequorum"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases/{databasesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.testIamPermissions"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/databases:restore","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases:restore)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.databases.restore"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.create"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/instancePartitions/{instancePartitionsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instancePartitions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.instancePartitions.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.operations.cancel"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.getIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:move","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.move"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.setIamPolicy"},{"hostname":"spanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/instances/{instancesId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.spanner","resource_name":"spanner.projects.instances.testIamPermissions"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.delete"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.delete"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.delete"},{"hostname":"speech.googleapis.com","http_method":"DELETE","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.delete"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.speech","resource_name":"speech.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations","path_regex":"^(?:/v1beta1/operations)$","service_name":"google.speech","resource_name":"speech.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1beta1/operations/{operationsId}","path_regex":"^(?:/v1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/operations","path_regex":"^(?:/v1p1beta1/operations)$","service_name":"google.speech","resource_name":"speech.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/operations/{operationsId}","path_regex":"^(?:/v1p1beta1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.get"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.list"},{"hostname":"speech.googleapis.com","http_method":"GET","path_template":"/v2beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.operations.get"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.patch"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.patch"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses/{customClassesId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.patch"},{"hostname":"speech.googleapis.com","http_method":"PATCH","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets/{phraseSetsId}","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.patch"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/speech:longrunningrecognize","path_regex":"^(?:/v1/speech:longrunningrecognize)$","service_name":"google.speech","resource_name":"speech.speech.longrunningrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1/speech:recognize","path_regex":"^(?:/v1/speech:recognize)$","service_name":"google.speech","resource_name":"speech.speech.recognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1beta1/speech:asyncrecognize","path_regex":"^(?:/v1beta1/speech:asyncrecognize)$","service_name":"google.speech","resource_name":"speech.speech.asyncrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1beta1/speech:syncrecognize","path_regex":"^(?:/v1beta1/speech:syncrecognize)$","service_name":"google.speech","resource_name":"speech.speech.syncrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/customClasses","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customClasses)$","service_name":"google.speech","resource_name":"speech.projects.locations.customClasses.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/phraseSets","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/phraseSets)$","service_name":"google.speech","resource_name":"speech.projects.locations.phraseSets.create"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/speech:longrunningrecognize","path_regex":"^(?:/v1p1beta1/speech:longrunningrecognize)$","service_name":"google.speech","resource_name":"speech.speech.longrunningrecognize"},{"hostname":"speech.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/speech:recognize","path_regex":"^(?:/v1p1beta1/speech:recognize)$","service_name":"google.speech","resource_name":"speech.speech.recognize"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.backupRuns.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.sslCerts.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.delete"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/flags","path_regex":"^(?:/sql/v1beta4/flags)$","service_name":"google.sql","resource_name":"sql.flags.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/flags","path_regex":"^(?:/sql/v1beta4/flags)$","service_name":"google.sqladmin","resource_name":"sql.flags.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sql","resource_name":"sql.instances.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sql","resource_name":"sql.backupRuns.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.backupRuns.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/connectSettings","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectSettings)$","service_name":"google.sqladmin","resource_name":"sql.connect.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sql","resource_name":"sql.databases.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/getDiskShrinkConfig","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiskShrinkConfig)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.getDiskShrinkConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/getLatestRecoveryTime","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getLatestRecoveryTime)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.getLatestRecoveryTime"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/listServerCas","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listServerCas)$","service_name":"google.sql","resource_name":"sql.instances.listServerCas"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/listServerCas","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listServerCas)$","service_name":"google.sqladmin","resource_name":"sql.instances.listServerCas"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sql","resource_name":"sql.sslCerts.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.sslCerts.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users/{name}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.users.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.sql","resource_name":"sql.operations.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.sqladmin","resource_name":"sql.operations.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations/{operation}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.operations.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/operations/{operation}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.operations.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/tiers","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tiers)$","service_name":"google.sql","resource_name":"sql.tiers.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/sql/v1beta4/projects/{project}/tiers","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tiers)$","service_name":"google.sqladmin","resource_name":"sql.tiers.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/flags","path_regex":"^(?:/v1/flags)$","service_name":"google.sqladmin","resource_name":"sql.flags.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns/{id}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/connectSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectSettings)$","service_name":"google.sqladmin","resource_name":"sql.connect.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/getDiskShrinkConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getDiskShrinkConfig)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.getDiskShrinkConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/getLatestRecoveryTime","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/getLatestRecoveryTime)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.getLatestRecoveryTime"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/listServerCas","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listServerCas)$","service_name":"google.sqladmin","resource_name":"sql.instances.listServerCas"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts/{sha1Fingerprint}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/instances/{instance}/users/{name}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.users.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.sqladmin","resource_name":"sql.operations.list"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/operations/{operation}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.operations.get"},{"hostname":"sqladmin.googleapis.com","http_method":"GET","path_template":"/v1/projects/{project}/tiers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tiers)$","service_name":"google.sqladmin","resource_name":"sql.tiers.list"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.patch"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sql","resource_name":"sql.instances.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/acquireSsrsLease","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acquireSsrsLease)$","service_name":"google.sqladmin","resource_name":"sql.instances.acquireSsrsLease"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/addServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addServerCa)$","service_name":"google.sql","resource_name":"sql.instances.addServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/addServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.addServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sql","resource_name":"sql.backupRuns.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/clone","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clone)$","service_name":"google.sql","resource_name":"sql.instances.clone"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/clone","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clone)$","service_name":"google.sqladmin","resource_name":"sql.instances.clone"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/createEphemeral","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEphemeral)$","service_name":"google.sql","resource_name":"sql.sslCerts.createEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/createEphemeral","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEphemeral)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.createEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sql","resource_name":"sql.databases.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/demote","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demote)$","service_name":"google.sqladmin","resource_name":"sql.instances.demote"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/demoteMaster","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demoteMaster)$","service_name":"google.sql","resource_name":"sql.instances.demoteMaster"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/demoteMaster","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demoteMaster)$","service_name":"google.sqladmin","resource_name":"sql.instances.demoteMaster"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/export","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.sql","resource_name":"sql.instances.export"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/export","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.sqladmin","resource_name":"sql.instances.export"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/failover","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/failover)$","service_name":"google.sql","resource_name":"sql.instances.failover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/failover","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/failover)$","service_name":"google.sqladmin","resource_name":"sql.instances.failover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/import","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.sql","resource_name":"sql.instances.import"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/import","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.sqladmin","resource_name":"sql.instances.import"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/performDiskShrink","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performDiskShrink)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.performDiskShrink"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/promoteReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promoteReplica)$","service_name":"google.sql","resource_name":"sql.instances.promoteReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/promoteReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promoteReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.promoteReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/reencrypt","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reencrypt)$","service_name":"google.sqladmin","resource_name":"sql.instances.reencrypt"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/releaseSsrsLease","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseSsrsLease)$","service_name":"google.sqladmin","resource_name":"sql.instances.releaseSsrsLease"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rescheduleMaintenance","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rescheduleMaintenance)$","service_name":"google.sql","resource_name":"sql.projects.instances.rescheduleMaintenance"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rescheduleMaintenance","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rescheduleMaintenance)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.rescheduleMaintenance"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/resetReplicaSize","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetReplicaSize)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.resetReplicaSize"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/resetSslConfig","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetSslConfig)$","service_name":"google.sql","resource_name":"sql.instances.resetSslConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/resetSslConfig","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetSslConfig)$","service_name":"google.sqladmin","resource_name":"sql.instances.resetSslConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restart","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.sql","resource_name":"sql.instances.restart"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restart","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.sqladmin","resource_name":"sql.instances.restart"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restoreBackup","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restoreBackup)$","service_name":"google.sql","resource_name":"sql.instances.restoreBackup"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/restoreBackup","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restoreBackup)$","service_name":"google.sqladmin","resource_name":"sql.instances.restoreBackup"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rotateServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rotateServerCa)$","service_name":"google.sql","resource_name":"sql.instances.rotateServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/rotateServerCa","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rotateServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.rotateServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sql","resource_name":"sql.sslCerts.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startExternalSync","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startExternalSync)$","service_name":"google.sql","resource_name":"sql.projects.instances.startExternalSync"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startExternalSync","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startExternalSync)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.startExternalSync"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startReplica)$","service_name":"google.sql","resource_name":"sql.instances.startReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/startReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.startReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/stopReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopReplica)$","service_name":"google.sql","resource_name":"sql.instances.stopReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/stopReplica","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.stopReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/switchover","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchover)$","service_name":"google.sqladmin","resource_name":"sql.instances.switchover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/truncateLog","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/truncateLog)$","service_name":"google.sql","resource_name":"sql.instances.truncateLog"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/truncateLog","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/truncateLog)$","service_name":"google.sqladmin","resource_name":"sql.instances.truncateLog"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/verifyExternalSyncSettings","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyExternalSyncSettings)$","service_name":"google.sql","resource_name":"sql.projects.instances.verifyExternalSyncSettings"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/verifyExternalSyncSettings","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyExternalSyncSettings)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.verifyExternalSyncSettings"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}:generateEphemeralCert","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateEphemeralCert)$","service_name":"google.sqladmin","resource_name":"sql.connect.generateEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/sql/v1beta4/projects/{project}/operations/{operation}/cancel","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.sqladmin","resource_name":"sql.operations.cancel"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.sqladmin","resource_name":"sql.instances.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/acquireSsrsLease","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acquireSsrsLease)$","service_name":"google.sqladmin","resource_name":"sql.instances.acquireSsrsLease"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/addServerCa","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.addServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/backupRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/backupRuns)$","service_name":"google.sqladmin","resource_name":"sql.backupRuns.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/clone","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clone)$","service_name":"google.sqladmin","resource_name":"sql.instances.clone"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/createEphemeral","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createEphemeral)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.createEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/databases","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases)$","service_name":"google.sqladmin","resource_name":"sql.databases.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/demote","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demote)$","service_name":"google.sqladmin","resource_name":"sql.instances.demote"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/demoteMaster","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/demoteMaster)$","service_name":"google.sqladmin","resource_name":"sql.instances.demoteMaster"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/export","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.sqladmin","resource_name":"sql.instances.export"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/failover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/failover)$","service_name":"google.sqladmin","resource_name":"sql.instances.failover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.sqladmin","resource_name":"sql.instances.import"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/performDiskShrink","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/performDiskShrink)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.performDiskShrink"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/promoteReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/promoteReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.promoteReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/reencrypt","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reencrypt)$","service_name":"google.sqladmin","resource_name":"sql.instances.reencrypt"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/releaseSsrsLease","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releaseSsrsLease)$","service_name":"google.sqladmin","resource_name":"sql.instances.releaseSsrsLease"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/rescheduleMaintenance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rescheduleMaintenance)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.rescheduleMaintenance"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/resetReplicaSize","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetReplicaSize)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.resetReplicaSize"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/resetSslConfig","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resetSslConfig)$","service_name":"google.sqladmin","resource_name":"sql.instances.resetSslConfig"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/restart","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.sqladmin","resource_name":"sql.instances.restart"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/restoreBackup","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restoreBackup)$","service_name":"google.sqladmin","resource_name":"sql.instances.restoreBackup"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/rotateServerCa","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rotateServerCa)$","service_name":"google.sqladmin","resource_name":"sql.instances.rotateServerCa"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/sslCerts","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sslCerts)$","service_name":"google.sqladmin","resource_name":"sql.sslCerts.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/startExternalSync","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startExternalSync)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.startExternalSync"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/startReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/startReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.startReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/stopReplica","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stopReplica)$","service_name":"google.sqladmin","resource_name":"sql.instances.stopReplica"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/switchover","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/switchover)$","service_name":"google.sqladmin","resource_name":"sql.instances.switchover"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/truncateLog","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/truncateLog)$","service_name":"google.sqladmin","resource_name":"sql.instances.truncateLog"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.insert"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}/verifyExternalSyncSettings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/verifyExternalSyncSettings)$","service_name":"google.sqladmin","resource_name":"sql.projects.instances.verifyExternalSyncSettings"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/instances/{instance}:generateEphemeralCert","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateEphemeralCert)$","service_name":"google.sqladmin","resource_name":"sql.connect.generateEphemeral"},{"hostname":"sqladmin.googleapis.com","http_method":"POST","path_template":"/v1/projects/{project}/operations/{operation}/cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.sqladmin","resource_name":"sql.operations.cancel"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.instances.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sql","resource_name":"sql.databases.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sql","resource_name":"sql.users.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/sql/v1beta4/projects/{project}/instances/{instance}/users","path_regex":"^(?:/sql/v1beta4/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{project}/instances/{instance}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.instances.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{project}/instances/{instance}/databases/{database}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/databases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.sqladmin","resource_name":"sql.databases.update"},{"hostname":"sqladmin.googleapis.com","http_method":"PUT","path_template":"/v1/projects/{project}/instances/{instance}/users","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/users)$","service_name":"google.sqladmin","resource_name":"sql.users.update"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/folders/{folder}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.folders.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/managedFolders/{managedFolder}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.managedFolders.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/notificationConfigs/{notification}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.notifications.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1/projects/{projectId}/hmacKeys/{accessId}","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.delete"},{"hostname":"storage.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.delete"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b","path_regex":"^(?:/storage/v1/b)$","service_name":"google.storage","resource_name":"storage.buckets.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/anywhereCaches","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches)$","service_name":"google.storage","resource_name":"storage.anywhereCaches.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/anywhereCaches/{anywhereCacheId}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.anywhereCaches.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/folders","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.storage","resource_name":"storage.folders.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/folders/{folder}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.folders.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.buckets.getIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/iam/testPermissions","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam/testPermissions)$","service_name":"google.storage","resource_name":"storage.buckets.testIamPermissions"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/managedFolders","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders)$","service_name":"google.storage","resource_name":"storage.managedFolders.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/managedFolders/{managedFolder}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.managedFolders.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/managedFolders/{managedFolder}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.managedFolders.getIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/managedFolders/{managedFolder}/iam/testPermissions","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam/testPermissions)$","service_name":"google.storage","resource_name":"storage.managedFolders.testIamPermissions"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/notificationConfigs","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.storage","resource_name":"storage.notifications.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/notificationConfigs/{notification}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.notifications.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.objects.getIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/o/{object}/iam/testPermissions","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam/testPermissions)$","service_name":"google.storage","resource_name":"storage.objects.testIamPermissions"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/operations","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.storage","resource_name":"storage.buckets.operations.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/operations/{operationId}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.operations.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}/storageLayout","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/storageLayout)$","service_name":"google.storage","resource_name":"storage.buckets.getStorageLayout"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/projects/{projectId}/hmacKeys","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys)$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/projects/{projectId}/hmacKeys/{accessId}","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1/projects/{projectId}/serviceAccount","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/serviceAccount)$","service_name":"google.storage","resource_name":"storage.projects.serviceAccount.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b","path_regex":"^(?:/storage/v1beta2/b)$","service_name":"google.storage","resource_name":"storage.buckets.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.get"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.list"},{"hostname":"storage.googleapis.com","http_method":"GET","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.get"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/anywhereCaches/{anywhereCacheId}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.anywhereCaches.update"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.patch"},{"hostname":"storage.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.patch"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b","path_regex":"^(?:/storage/v1/b)$","service_name":"google.storage","resource_name":"storage.buckets.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/anywhereCaches","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches)$","service_name":"google.storage","resource_name":"storage.anywhereCaches.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/anywhereCaches/{anywhereCacheId}/disable","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/disable)$","service_name":"google.storage","resource_name":"storage.anywhereCaches.disable"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/anywhereCaches/{anywhereCacheId}/pause","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pause)$","service_name":"google.storage","resource_name":"storage.anywhereCaches.pause"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/anywhereCaches/{anywhereCacheId}/resume","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/anywhereCaches/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.storage","resource_name":"storage.anywhereCaches.resume"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/folders","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.storage","resource_name":"storage.folders.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/folders/{sourceFolder}/renameTo/folders/{destinationFolder}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/renameTo/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.folders.rename"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/lockRetentionPolicy","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/lockRetentionPolicy)$","service_name":"google.storage","resource_name":"storage.buckets.lockRetentionPolicy"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/managedFolders","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders)$","service_name":"google.storage","resource_name":"storage.managedFolders.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/notificationConfigs","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notificationConfigs)$","service_name":"google.storage","resource_name":"storage.notifications.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o/bulkRestore","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/bulkRestore)$","service_name":"google.storage","resource_name":"storage.objects.bulkRestore"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o/watch","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/watch)$","service_name":"google.storage","resource_name":"storage.objects.watchAll"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/o/{object}/restore","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restore)$","service_name":"google.storage","resource_name":"storage.objects.restore"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/operations/{operationId}/cancel","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.storage","resource_name":"storage.buckets.operations.cancel"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{bucket}/restore","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restore)$","service_name":"google.storage","resource_name":"storage.buckets.restore"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{destinationBucket}/o/{destinationObject}/compose","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compose)$","service_name":"google.storage","resource_name":"storage.objects.compose"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyTo/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.copy"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/b/{sourceBucket}/o/{sourceObject}/rewriteTo/b/{destinationBucket}/o/{destinationObject}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rewriteTo/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.rewrite"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/channels/stop","path_regex":"^(?:/storage/v1/channels/stop)$","service_name":"google.storage","resource_name":"storage.channels.stop"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1/projects/{projectId}/hmacKeys","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys)$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.create"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b","path_regex":"^(?:/storage/v1beta2/b)$","service_name":"google.storage","resource_name":"storage.buckets.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl)$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/o","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/o/watch","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/watch)$","service_name":"google.storage","resource_name":"storage.objects.watchAll"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.insert"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{destinationBucket}/o/{destinationObject}/compose","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/compose)$","service_name":"google.storage","resource_name":"storage.objects.compose"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/b/{sourceBucket}/o/{sourceObject}/copyTo/b/{destinationBucket}/o/{destinationObject}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copyTo/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.copy"},{"hostname":"storage.googleapis.com","http_method":"POST","path_template":"/storage/v1beta2/channels/stop","path_regex":"^(?:/storage/v1beta2/channels/stop)$","service_name":"google.storage","resource_name":"storage.channels.stop"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.buckets.setIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/managedFolders/{managedFolder}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managedFolders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.managedFolders.setIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/b/{bucket}/o/{object}/iam","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/iam)$","service_name":"google.storage","resource_name":"storage.objects.setIamPolicy"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1/projects/{projectId}/hmacKeys/{accessId}","path_regex":"^(?:/storage/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hmacKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.projects.hmacKeys.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/defaultObjectAcl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/defaultObjectAcl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.defaultObjectAccessControls.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.update"},{"hostname":"storage.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta2/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta2/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.update"},{"hostname":"storagetransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/agentPools/{agentPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.delete"},{"hostname":"storagetransfer.googleapis.com","http_method":"DELETE","path_template":"/v1/transferJobs/{transferJobsId}","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.delete"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/googleServiceAccounts/{projectId}","path_regex":"^(?:/v1/googleServiceAccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.googleServiceAccounts.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/agentPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.list"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/agentPools/{agentPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferJobs","path_regex":"^(?:/v1/transferJobs)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.list"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferJobs/{transferJobsId}","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferOperations","path_regex":"^(?:/v1/transferOperations)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.list"},{"hostname":"storagetransfer.googleapis.com","http_method":"GET","path_template":"/v1/transferOperations/{transferOperationsId}","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.get"},{"hostname":"storagetransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/agentPools/{agentPoolsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.patch"},{"hostname":"storagetransfer.googleapis.com","http_method":"PATCH","path_template":"/v1/transferJobs/{transferJobsId}","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.patch"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/agentPools","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/agentPools)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.projects.agentPools.create"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferJobs","path_regex":"^(?:/v1/transferJobs)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.create"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferJobs/{transferJobsId}:run","path_regex":"^(?:/v1/transferJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferJobs.run"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferOperations/{transferOperationsId}:cancel","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.cancel"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferOperations/{transferOperationsId}:pause","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pause)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.pause"},{"hostname":"storagetransfer.googleapis.com","http_method":"POST","path_template":"/v1/transferOperations/{transferOperationsId}:resume","path_regex":"^(?:/v1/transferOperations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resume)$","service_name":"google.storagetransfer","resource_name":"storagetransfer.transferOperations.resume"},{"hostname":"streetviewpublish.googleapis.com","http_method":"DELETE","path_template":"/v1/photo/{photoId}","path_regex":"^(?:/v1/photo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.delete"},{"hostname":"streetviewpublish.googleapis.com","http_method":"DELETE","path_template":"/v1/photoSequence/{sequenceId}","path_regex":"^(?:/v1/photoSequence/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.delete"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photo/{photoId}","path_regex":"^(?:/v1/photo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.get"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photoSequence/{sequenceId}","path_regex":"^(?:/v1/photoSequence/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.get"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photoSequences","path_regex":"^(?:/v1/photoSequences)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequences.list"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photos","path_regex":"^(?:/v1/photos)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.list"},{"hostname":"streetviewpublish.googleapis.com","http_method":"GET","path_template":"/v1/photos:batchGet","path_regex":"^(?:/v1/photos:batchGet)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.batchGet"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photo","path_regex":"^(?:/v1/photo)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.create"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photo:startUpload","path_regex":"^(?:/v1/photo:startUpload)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.startUpload"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photoSequence","path_regex":"^(?:/v1/photoSequence)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.create"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photoSequence:startUpload","path_regex":"^(?:/v1/photoSequence:startUpload)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photoSequence.startUpload"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photos:batchDelete","path_regex":"^(?:/v1/photos:batchDelete)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.batchDelete"},{"hostname":"streetviewpublish.googleapis.com","http_method":"POST","path_template":"/v1/photos:batchUpdate","path_regex":"^(?:/v1/photos:batchUpdate)$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photos.batchUpdate"},{"hostname":"streetviewpublish.googleapis.com","http_method":"PUT","path_template":"/v1/photo/{id}","path_regex":"^(?:/v1/photo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.streetviewpublish","resource_name":"streetviewpublish.photo.update"},{"hostname":"sts.googleapis.com","http_method":"POST","path_template":"/v1/token","path_regex":"^(?:/v1/token)$","service_name":"google.sts","resource_name":"sts.token"},{"hostname":"sts.googleapis.com","http_method":"POST","path_template":"/v1beta/token","path_regex":"^(?:/v1beta/token)$","service_name":"google.sts","resource_name":"sts.token"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags/{tagId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers/{triggerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables/{variableId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v1/accounts/{accountId}/permissions/{permissionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config/{gtag_configId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/transformations/{transformationsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transformations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.transformations.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"DELETE","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions/{user_permissionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.delete"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts","path_regex":"^(?:/tagmanager/v1/accounts)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}/entities","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/entities)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.entities.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags/{tagId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers/{triggerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables/{variableId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/permissions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v1/accounts/{accountId}/permissions/{permissionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts","path_regex":"^(?:/tagmanager/v2/accounts)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/containers:lookup","path_regex":"^(?:/tagmanager/v2/accounts/containers:lookup)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.lookup"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/destinations","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destinations)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.destinations.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/destinations/{destinationsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destinations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.destinations.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/version_headers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/version_headers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.version_headers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/version_headers:latest","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/version_headers:latest)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.version_headers.latest"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions:live","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions:live)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.live"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config/{gtag_configId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/status","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/status)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.getStatus"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/transformations","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transformations)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.transformations.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/transformations/{transformationsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transformations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.transformations.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.get"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}:snippet","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::snippet)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.snippet"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.list"},{"hostname":"tagmanager.googleapis.com","http_method":"GET","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions/{user_permissionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.get"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/publish","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.publish"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/restore","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restore)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.restore"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}/undelete","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/undelete)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.undelete"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v1/accounts/{accountId}/permissions","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/destinations:link","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/destinations:link)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.destinations.link"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}:reauthorize","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reauthorize)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.reauthorize"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}:publish","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publish)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.publish"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}:set_latest","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::set_latest)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.set_latest"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}:undelete","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.undelete"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/built_in_variables:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/built_in_variables:revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.built_in_variables.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}:entities","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::entities)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.entities"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}:move_entities_to_folder","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move_entities_to_folder)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.move_entities_to_folder"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/transformations","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transformations)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.transformations.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/transformations/{transformationsId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transformations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.transformations.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.create"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}:revert","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::revert)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.revert"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:create_version","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::create_version)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.create_version"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:quick_preview","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::quick_preview)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.quick_preview"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:resolve_conflict","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resolve_conflict)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.resolve_conflict"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}:sync","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::sync)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.sync"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}:combine","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::combine)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.combine"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}:move_tag_id","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::move_tag_id)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.move_tag_id"},{"hostname":"tagmanager.googleapis.com","http_method":"POST","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions)$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.create"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.folders.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/move_folders/{folderId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move_folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.move_folders.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/reauthorize_environments/{environmentId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reauthorize_environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.reauthorize_environments.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/tags/{tagId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.tags.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/triggers/{triggerId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.triggers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/variables/{variableId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.variables.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/containers/{containerId}/versions/{containerVersionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v1/accounts/{accountId}/permissions/{permissionId}","path_regex":"^(?:/tagmanager/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.permissions.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/environments/{environmentsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.environments.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/versions/{versionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.versions.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/clients/{clientsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.clients.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/folders/{foldersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/folders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.folders.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/gtag_config/{gtag_configId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/gtag_config/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.gtag_config.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/tags/{tagsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.tags.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/templates/{templatesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.templates.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/transformations/{transformationsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/transformations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.transformations.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/triggers/{triggersId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/triggers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.triggers.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/variables/{variablesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/variables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.variables.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/containers/{containersId}/workspaces/{workspacesId}/zones/{zonesId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/containers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workspaces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.containers.workspaces.zones.update"},{"hostname":"tagmanager.googleapis.com","http_method":"PUT","path_template":"/tagmanager/v2/accounts/{accountsId}/user_permissions/{user_permissionsId}","path_regex":"^(?:/tagmanager/v2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/user_permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tagmanager","resource_name":"tagmanager.accounts.user_permissions.update"},{"hostname":"tasks.googleapis.com","http_method":"DELETE","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.delete"},{"hostname":"tasks.googleapis.com","http_method":"DELETE","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.delete"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/lists/{tasklist}/tasks","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.tasks","resource_name":"tasks.tasks.list"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.get"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/users/@me/lists","path_regex":"^(?:/tasks/v1/users/@me/lists)$","service_name":"google.tasks","resource_name":"tasks.tasklists.list"},{"hostname":"tasks.googleapis.com","http_method":"GET","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.get"},{"hostname":"tasks.googleapis.com","http_method":"PATCH","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.patch"},{"hostname":"tasks.googleapis.com","http_method":"PATCH","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.patch"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/lists/{tasklist}/clear","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clear)$","service_name":"google.tasks","resource_name":"tasks.tasks.clear"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/lists/{tasklist}/tasks","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.tasks","resource_name":"tasks.tasks.insert"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}/move","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.tasks","resource_name":"tasks.tasks.move"},{"hostname":"tasks.googleapis.com","http_method":"POST","path_template":"/tasks/v1/users/@me/lists","path_regex":"^(?:/tasks/v1/users/@me/lists)$","service_name":"google.tasks","resource_name":"tasks.tasklists.insert"},{"hostname":"tasks.googleapis.com","http_method":"PUT","path_template":"/tasks/v1/lists/{tasklist}/tasks/{task}","path_regex":"^(?:/tasks/v1/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasks.update"},{"hostname":"tasks.googleapis.com","http_method":"PUT","path_template":"/tasks/v1/users/@me/lists/{tasklist}","path_regex":"^(?:/tasks/v1/users/@me/lists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tasks","resource_name":"tasks.tasklists.update"},{"hostname":"testing.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectId}/testMatrices/{testMatrixId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testMatrices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.testing","resource_name":"testing.projects.testMatrices.get"},{"hostname":"testing.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/deviceSessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceSessions)$","service_name":"google.testing","resource_name":"testing.projects.deviceSessions.list"},{"hostname":"testing.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/deviceSessions/{deviceSessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceSessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.testing","resource_name":"testing.projects.deviceSessions.get"},{"hostname":"testing.googleapis.com","http_method":"GET","path_template":"/v1/testEnvironmentCatalog/{environmentType}","path_regex":"^(?:/v1/testEnvironmentCatalog/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.testing","resource_name":"testing.testEnvironmentCatalog.get"},{"hostname":"testing.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/deviceSessions/{deviceSessionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceSessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.testing","resource_name":"testing.projects.deviceSessions.patch"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/applicationDetailService/getApkDetails","path_regex":"^(?:/v1/applicationDetailService/getApkDetails)$","service_name":"google.testing","resource_name":"testing.applicationDetailService.getApkDetails"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/testMatrices","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testMatrices)$","service_name":"google.testing","resource_name":"testing.projects.testMatrices.create"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectId}/testMatrices/{testMatrixId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testMatrices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.testing","resource_name":"testing.projects.testMatrices.cancel"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/deviceSessions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceSessions)$","service_name":"google.testing","resource_name":"testing.projects.deviceSessions.create"},{"hostname":"testing.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/deviceSessions/{deviceSessionsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deviceSessions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.testing","resource_name":"testing.projects.deviceSessions.cancel"},{"hostname":"texttospeech.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.texttospeech","resource_name":"texttospeech.operations.delete"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.list"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.get"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1/voices","path_regex":"^(?:/v1/voices)$","service_name":"google.texttospeech","resource_name":"texttospeech.voices.list"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.list"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.operations.get"},{"hostname":"texttospeech.googleapis.com","http_method":"GET","path_template":"/v1beta1/voices","path_regex":"^(?:/v1beta1/voices)$","service_name":"google.texttospeech","resource_name":"texttospeech.voices.list"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.texttospeech","resource_name":"texttospeech.operations.cancel"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}:synthesizeLongAudio","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::synthesizeLongAudio)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.synthesizeLongAudio"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1/text:synthesize","path_regex":"^(?:/v1/text:synthesize)$","service_name":"google.texttospeech","resource_name":"texttospeech.text.synthesize"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}:synthesizeLongAudio","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::synthesizeLongAudio)$","service_name":"google.texttospeech","resource_name":"texttospeech.projects.locations.synthesizeLongAudio"},{"hostname":"texttospeech.googleapis.com","http_method":"POST","path_template":"/v1beta1/text:synthesize","path_regex":"^(?:/v1beta1/text:synthesize)$","service_name":"google.texttospeech","resource_name":"texttospeech.text.synthesize"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/clusters","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.clusters.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/clusters/{clusterId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.clusters.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/environments","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.environments.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/environments/{environmentId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/environments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.environments.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfMetricsSummary","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfMetricsSummary)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.getPerfMetricsSummary"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries/{sampleSeriesId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries/{sampleSeriesId}/samples","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/samples)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.samples.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/testCases","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.testCases.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/testCases/{testCaseId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testCases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.testCases.get"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/thumbnails","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/thumbnails)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.thumbnails.list"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectId}/settings","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/settings)$","service_name":"google.toolresults","resource_name":"toolresults.projects.getSettings"},{"hostname":"toolresults.googleapis.com","http_method":"GET","path_template":"/toolresults/v1beta3/projects/{projectsId}/histories/{historiesId}/executions/{executionsId}/steps/{stepsId}:accessibilityClusters","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::accessibilityClusters)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.accessibilityClusters"},{"hostname":"toolresults.googleapis.com","http_method":"PATCH","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.patch"},{"hostname":"toolresults.googleapis.com","http_method":"PATCH","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.patch"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfMetricsSummary","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfMetricsSummary)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfMetricsSummary.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.create"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}/perfSampleSeries/{sampleSeriesId}/samples:batchCreate","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/perfSampleSeries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/samples:batchCreate)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.perfSampleSeries.samples.batchCreate"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}/histories/{historyId}/executions/{executionId}/steps/{stepId}:publishXunitXmlFiles","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/histories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/steps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::publishXunitXmlFiles)$","service_name":"google.toolresults","resource_name":"toolresults.projects.histories.executions.steps.publishXunitXmlFiles"},{"hostname":"toolresults.googleapis.com","http_method":"POST","path_template":"/toolresults/v1beta3/projects/{projectId}:initializeSettings","path_regex":"^(?:/toolresults/v1beta3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::initializeSettings)$","service_name":"google.toolresults","resource_name":"toolresults.projects.initializeSettings"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.delete"},{"hostname":"tpu.googleapis.com","http_method":"DELETE","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.delete"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions/{tensorflowVersionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/tensorflowVersions/{tensorflowVersionsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tensorflowVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.tensorflowVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queuedResources","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/runtimeVersions","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/runtimeVersions/{runtimeVersionsId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/acceleratorTypes/{acceleratorTypesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acceleratorTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.acceleratorTypes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.get"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/reservations","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reservations)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.reservations.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/runtimeVersions","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.list"},{"hostname":"tpu.googleapis.com","http_method":"GET","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/runtimeVersions/{runtimeVersionsId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/runtimeVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.runtimeVersions.get"},{"hostname":"tpu.googleapis.com","http_method":"PATCH","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.patch"},{"hostname":"tpu.googleapis.com","http_method":"PATCH","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.patch"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:reimage","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reimage)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.reimage"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:reimage","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reimage)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.reimage"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:getGuestAttributes","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getGuestAttributes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.getGuestAttributes"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queuedResources","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}:reset","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.reset"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/locations/{locationsId}:generateServiceIdentity","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateServiceIdentity)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.generateServiceIdentity"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:getGuestAttributes","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getGuestAttributes)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.getGuestAttributes"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:simulateMaintenanceEvent","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::simulateMaintenanceEvent)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.simulateMaintenanceEvent"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:start","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.start"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/nodes/{nodesId}:stop","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.nodes.stop"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.operations.cancel"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.create"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}/queuedResources/{queuedResourcesId}:reset","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/queuedResources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reset)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.queuedResources.reset"},{"hostname":"tpu.googleapis.com","http_method":"POST","path_template":"/v2alpha1/projects/{projectsId}/locations/{locationsId}:generateServiceIdentity","path_regex":"^(?:/v2alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateServiceIdentity)$","service_name":"google.tpu","resource_name":"tpu.projects.locations.generateServiceIdentity"},{"hostname":"tracing.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/traces","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces)$","service_name":"google.tracing","resource_name":"tracing.projects.traces.list"},{"hostname":"tracing.googleapis.com","http_method":"GET","path_template":"/v2/projects/{projectsId}/traces/{tracesId}:listSpans","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listSpans)$","service_name":"google.tracing","resource_name":"tracing.projects.traces.listSpans"},{"hostname":"tracing.googleapis.com","http_method":"POST","path_template":"/v2/projects/{projectsId}/traces:batchWrite","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces:batchWrite)$","service_name":"google.tracing","resource_name":"tracing.projects.traces.batchWrite"},{"hostname":"tracing.googleapis.com","http_method":"PUT","path_template":"/v2/projects/{projectsId}/traces/{tracesId}/spans/{spansId}","path_regex":"^(?:/v2/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/traces/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spans/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.tracing","resource_name":"tracing.projects.traces.spans.create"},{"hostname":"trafficdirector.googleapis.com","http_method":"POST","path_template":"/v2/discovery:client_status","path_regex":"^(?:/v2/discovery:client_status)$","service_name":"google.trafficdirector","resource_name":"trafficdirector.discovery.client_status"},{"hostname":"trafficdirector.googleapis.com","http_method":"POST","path_template":"/v3/discovery:client_status","path_regex":"^(?:/v3/discovery:client_status)$","service_name":"google.trafficdirector","resource_name":"trafficdirector.discovery.client_status"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.delete"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.delete"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.delete"},{"hostname":"transcoder.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.delete"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.get"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.get"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates/{jobTemplatesId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.get"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.list"},{"hostname":"transcoder.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs/{jobsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.get"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.create"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.create"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobTemplates","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobTemplates)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobTemplates.create"},{"hostname":"transcoder.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/jobs","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/jobs)$","service_name":"google.transcoder","resource_name":"transcoder.projects.locations.jobs.create"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}/adaptiveMtFiles/{adaptiveMtFilesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.adaptiveMtFiles.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries/{glossaryEntriesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.models.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.delete"},{"hostname":"translation.googleapis.com","http_method":"DELETE","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.delete"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/language/translate/v2","path_regex":"^(?:/language/translate/v2)$","service_name":"google.translate","resource_name":"language.translations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/language/translate/v2/detect","path_regex":"^(?:/language/translate/v2/detect)$","service_name":"google.translate","resource_name":"language.detections.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/language/translate/v2/languages","path_regex":"^(?:/language/translate/v2/languages)$","service_name":"google.translate","resource_name":"language.languages.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.translate","resource_name":"translate.projects.locations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}/adaptiveMtFiles","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtFiles)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.adaptiveMtFiles.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}/adaptiveMtFiles/{adaptiveMtFilesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.adaptiveMtFiles.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}/adaptiveMtFiles/{adaptiveMtFilesId}/adaptiveMtSentences","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtFiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtSentences)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.adaptiveMtFiles.adaptiveMtSentences.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}/adaptiveMtSentences","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtSentences)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.adaptiveMtSentences.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}/examples","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/examples)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.examples.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries/{glossaryEntriesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.translate","resource_name":"translate.projects.locations.models.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models/{modelsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.models.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/supportedLanguages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.locations.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3/projects/{projectsId}/supportedLanguages","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.translate","resource_name":"translate.projects.locations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.list"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.get"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/supportedLanguages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.locations.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"GET","path_template":"/v3beta1/projects/{projectsId}/supportedLanguages","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/supportedLanguages)$","service_name":"google.translate","resource_name":"translate.projects.getSupportedLanguages"},{"hostname":"translation.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.patch"},{"hostname":"translation.googleapis.com","http_method":"PATCH","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries/{glossaryEntriesId}","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.patch"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/language/translate/v2","path_regex":"^(?:/language/translate/v2)$","service_name":"google.translate","resource_name":"language.translations.translate"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/language/translate/v2/detect","path_regex":"^(?:/language/translate/v2/detect)$","service_name":"google.translate","resource_name":"language.detections.detect"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/adaptiveMtDatasets/{adaptiveMtDatasetsId}:importAdaptiveMtFile","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adaptiveMtDatasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importAdaptiveMtFile)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtDatasets.importAdaptiveMtFile"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:exportData","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportData)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.exportData"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/datasets/{datasetsId}:importData","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datasets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::importData)$","service_name":"google.translate","resource_name":"translate.projects.locations.datasets.importData"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/glossaries/{glossariesId}/glossaryEntries","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaryEntries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.glossaryEntries.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/models","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/models)$","service_name":"google.translate","resource_name":"translate.projects.locations.models.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.cancel"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.wait"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:adaptiveMtTranslate","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::adaptiveMtTranslate)$","service_name":"google.translate","resource_name":"translate.projects.locations.adaptiveMtTranslate"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:batchTranslateDocument","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:batchTranslateText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:detectLanguage","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.locations.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:romanizeText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::romanizeText)$","service_name":"google.translate","resource_name":"translate.projects.locations.romanizeText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:translateDocument","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}/locations/{locationsId}:translateText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:detectLanguage","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:romanizeText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::romanizeText)$","service_name":"google.translate","resource_name":"translate.projects.romanizeText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3/projects/{projectsId}:translateText","path_regex":"^(?:/v3/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.translateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/glossaries","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/glossaries)$","service_name":"google.translate","resource_name":"translate.projects.locations.glossaries.create"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.cancel"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:wait","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::wait)$","service_name":"google.translate","resource_name":"translate.projects.locations.operations.wait"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:batchTranslateDocument","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:batchTranslateText","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::batchTranslateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.batchTranslateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:detectLanguage","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.locations.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:translateDocument","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateDocument)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateDocument"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}/locations/{locationsId}:translateText","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.locations.translateText"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}:detectLanguage","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::detectLanguage)$","service_name":"google.translate","resource_name":"translate.projects.detectLanguage"},{"hostname":"translation.googleapis.com","http_method":"POST","path_template":"/v3beta1/projects/{projectsId}:translateText","path_regex":"^(?:/v3beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::translateText)$","service_name":"google.translate","resource_name":"translate.projects.translateText"},{"hostname":"travelimpactmodel.googleapis.com","http_method":"POST","path_template":"/v1/flights:computeFlightEmissions","path_regex":"^(?:/v1/flights:computeFlightEmissions)$","service_name":"google.travelimpactmodel","resource_name":"travelimpactmodel.flights.computeFlightEmissions"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/exports/{exportId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.exports.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/holds/{holdId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/holds/{holdId}/accounts/{accountId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.accounts.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/matters/{matterId}/savedQueries/{savedQueryId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.delete"},{"hostname":"vault.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.operations.delete"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters","path_regex":"^(?:/v1/matters)$","service_name":"google.vault","resource_name":"vault.matters.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/exports","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports)$","service_name":"google.vault","resource_name":"vault.matters.exports.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/exports/{exportId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.exports.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/holds","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds)$","service_name":"google.vault","resource_name":"vault.matters.holds.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/holds/{holdId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/holds/{holdId}/accounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.accounts.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/savedQueries","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/matters/{matterId}/savedQueries/{savedQueryId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.get"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.vault","resource_name":"vault.operations.list"},{"hostname":"vault.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.operations.get"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters","path_regex":"^(?:/v1/matters)$","service_name":"google.vault","resource_name":"vault.matters.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/exports","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/exports)$","service_name":"google.vault","resource_name":"vault.matters.exports.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds)$","service_name":"google.vault","resource_name":"vault.matters.holds.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds/{holdId}/accounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.accounts.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds/{holdId}:addHeldAccounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addHeldAccounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.addHeldAccounts"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/holds/{holdId}:removeHeldAccounts","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeHeldAccounts)$","service_name":"google.vault","resource_name":"vault.matters.holds.removeHeldAccounts"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}/savedQueries","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedQueries)$","service_name":"google.vault","resource_name":"vault.matters.savedQueries.create"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:addPermissions","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addPermissions)$","service_name":"google.vault","resource_name":"vault.matters.addPermissions"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:close","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::close)$","service_name":"google.vault","resource_name":"vault.matters.close"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:count","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::count)$","service_name":"google.vault","resource_name":"vault.matters.count"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:removePermissions","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removePermissions)$","service_name":"google.vault","resource_name":"vault.matters.removePermissions"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:reopen","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reopen)$","service_name":"google.vault","resource_name":"vault.matters.reopen"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/matters/{matterId}:undelete","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.vault","resource_name":"vault.matters.undelete"},{"hostname":"vault.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vault","resource_name":"vault.operations.cancel"},{"hostname":"vault.googleapis.com","http_method":"PUT","path_template":"/v1/matters/{matterId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.update"},{"hostname":"vault.googleapis.com","http_method":"PUT","path_template":"/v1/matters/{matterId}/holds/{holdId}","path_regex":"^(?:/v1/matters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/holds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vault","resource_name":"vault.matters.holds.update"},{"hostname":"vectortile.googleapis.com","http_method":"GET","path_template":"/v1/featuretiles/{featuretilesId}","path_regex":"^(?:/v1/featuretiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vectortile","resource_name":"vectortile.featuretiles.get"},{"hostname":"vectortile.googleapis.com","http_method":"GET","path_template":"/v1/terraintiles/{terraintilesId}","path_regex":"^(?:/v1/terraintiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vectortile","resource_name":"vectortile.terraintiles.get"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v1/challenge","path_regex":"^(?:/v1/challenge)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.create"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v1/challenge:verify","path_regex":"^(?:/v1/challenge:verify)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.verify"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v2/challenge:generate","path_regex":"^(?:/v2/challenge:generate)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.generate"},{"hostname":"verifiedaccess.googleapis.com","http_method":"POST","path_template":"/v2/challenge:verify","path_regex":"^(?:/v2/challenge:verify)$","service_name":"google.verifiedaccess","resource_name":"verifiedaccess.challenge.verify"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.list"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms/{platformsId}/channels","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.channels.list"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms/{platformsId}/channels/{channelsId}/versions","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.channels.versions.list"},{"hostname":"versionhistory.googleapis.com","http_method":"GET","path_template":"/v1/{v1Id}/platforms/{platformsId}/channels/{channelsId}/versions/{versionsId}/releases","path_regex":"^(?:/v1/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platforms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/channels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/versions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/releases)$","service_name":"google.versionhistory","resource_name":"versionhistory.platforms.channels.versions.releases.list"},{"hostname":"videointelligence.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.operations.projects.locations.operations.delete"},{"hostname":"videointelligence.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.delete"},{"hostname":"videointelligence.googleapis.com","http_method":"GET","path_template":"/v1/operations/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.operations.projects.locations.operations.get"},{"hostname":"videointelligence.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.list"},{"hostname":"videointelligence.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.get"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1/operations/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.videointelligence","resource_name":"videointelligence.operations.projects.locations.operations.cancel"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.videointelligence","resource_name":"videointelligence.projects.locations.operations.cancel"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1/videos:annotate","path_regex":"^(?:/v1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1beta2/videos:annotate","path_regex":"^(?:/v1beta2/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/videos:annotate","path_regex":"^(?:/v1p1beta1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/videos:annotate","path_regex":"^(?:/v1p2beta1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"videointelligence.googleapis.com","http_method":"POST","path_template":"/v1p3beta1/videos:annotate","path_regex":"^(?:/v1p3beta1/videos:annotate)$","service_name":"google.videointelligence","resource_name":"videointelligence.videos.annotate"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.operations.delete"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.delete"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.delete"},{"hostname":"vision.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages/{referenceImagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.delete"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.locations.operations.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/operations","path_regex":"^(?:/v1/operations)$","service_name":"google.vision","resource_name":"vision.operations.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.operations.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.operations.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}/products","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.products.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.list"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages/{referenceImagesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.get"},{"hostname":"vision.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.operations.get"},{"hostname":"vision.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.patch"},{"hostname":"vision.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vision","resource_name":"vision.projects.locations.products.patch"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/files:annotate","path_regex":"^(?:/v1/files:annotate)$","service_name":"google.vision","resource_name":"vision.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/files:asyncBatchAnnotate","path_regex":"^(?:/v1/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/images:annotate","path_regex":"^(?:/v1/images:annotate)$","service_name":"google.vision","resource_name":"vision.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/images:asyncBatchAnnotate","path_regex":"^(?:/v1/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/operations/{operationsId}:cancel","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vision","resource_name":"vision.operations.cancel"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/files:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/images:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/files:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/images:annotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.create"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}:addProduct","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addProduct)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.addProduct"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets/{productSetsId}:removeProduct","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeProduct)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.removeProduct"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/productSets:import","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/productSets:import)$","service_name":"google.vision","resource_name":"vision.projects.locations.productSets.import"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.create"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products/{productsId}/referenceImages","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/referenceImages)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.referenceImages.create"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/products:purge","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/products:purge)$","service_name":"google.vision","resource_name":"vision.projects.locations.products.purge"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/files:annotate","path_regex":"^(?:/v1p1beta1/files:annotate)$","service_name":"google.vision","resource_name":"vision.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/files:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/images:annotate","path_regex":"^(?:/v1p1beta1/images:annotate)$","service_name":"google.vision","resource_name":"vision.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/images:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/files:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/images:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/files:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/images:annotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p1beta1/projects/{projectsId}/locations/{locationsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/files:annotate","path_regex":"^(?:/v1p2beta1/files:annotate)$","service_name":"google.vision","resource_name":"vision.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/files:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/images:annotate","path_regex":"^(?:/v1p2beta1/images:annotate)$","service_name":"google.vision","resource_name":"vision.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/images:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/files:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/images:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.images.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/files:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/files:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.files.asyncBatchAnnotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/images:annotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:annotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.annotate"},{"hostname":"vision.googleapis.com","http_method":"POST","path_template":"/v1p2beta1/projects/{projectsId}/locations/{locationsId}/images:asyncBatchAnnotate","path_regex":"^(?:/v1p2beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/images:asyncBatchAnnotate)$","service_name":"google.vision","resource_name":"vision.projects.locations.images.asyncBatchAnnotate"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"DELETE","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.delete"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}/imageImportJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImportJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.imageImportJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}/imageImportJobs/{imageImportJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.imageImportJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles/{replicationCyclesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}:fetchInventory","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchInventory)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.fetchInventory"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}/imageImportJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImportJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.imageImportJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}/imageImportJobs/{imageImportJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.imageImportJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/replicationCycles/{replicationCyclesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicationCycles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.replicationCycles.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports/{utilizationReportsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.get"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}:fetchInventory","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchInventory)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.fetchInventory"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.list"},{"hostname":"vmmigration.googleapis.com","http_method":"GET","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.get"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"PATCH","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects/{targetProjectsId}","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.patch"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addGroupMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.addGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeGroupMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.removeGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}/imageImportJobs/{imageImportJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.imageImportJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}:upgradeAppliance","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeAppliance)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.upgradeAppliance"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/diskMigrationJobs/{diskMigrationJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskMigrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.diskMigrationJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/diskMigrationJobs/{diskMigrationJobsId}:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskMigrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.diskMigrationJobs.run"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:finalizeMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finalizeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.finalizeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:pauseMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pauseMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.pauseMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:resumeMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resumeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.resumeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:startMigration","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.startMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:addGroupMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::addGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.addGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/groups/{groupsId}:removeGroupMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::removeGroupMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.groups.removeGroupMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/imageImports/{imageImportsId}/imageImportJobs/{imageImportJobsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/imageImportJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.imageImports.imageImportJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.operations.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/datacenterConnectors/{datacenterConnectorsId}:upgradeAppliance","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/datacenterConnectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::upgradeAppliance)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.datacenterConnectors.upgradeAppliance"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/diskMigrationJobs/{diskMigrationJobsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskMigrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.diskMigrationJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/diskMigrationJobs/{diskMigrationJobsId}:run","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/diskMigrationJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::run)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.diskMigrationJobs.run"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cloneJobs/{cloneJobsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cloneJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cloneJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}/cutoverJobs/{cutoverJobsId}:cancel","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cutoverJobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.cutoverJobs.cancel"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:finalizeMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::finalizeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.finalizeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:pauseMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::pauseMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.pauseMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:resumeMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resumeMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.resumeMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/migratingVms/{migratingVmsId}:startMigration","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/migratingVms/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::startMigration)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.migratingVms.startMigration"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/sources/{sourcesId}/utilizationReports","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sources/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/utilizationReports)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.sources.utilizationReports.create"},{"hostname":"vmmigration.googleapis.com","http_method":"POST","path_template":"/v1alpha1/projects/{projectsId}/locations/{locationsId}/targetProjects","path_regex":"^(?:/v1alpha1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetProjects)$","service_name":"google.vmmigration","resource_name":"vmmigration.projects.locations.targetProjects.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPeerings/{networkPeeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPeerings.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}/externalAccessRules/{externalAccessRulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccessRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.externalAccessRules.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.operations.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/externalAddresses/{externalAddressesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.externalAddresses.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/loggingServers/{loggingServersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.loggingServers.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/managementDnsZoneBindings/{managementDnsZoneBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementDnsZoneBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.managementDnsZoneBindings.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateConnections.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareEngineNetworks/{vmwareEngineNetworksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareEngineNetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.vmwareEngineNetworks.delete"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsBindPermission","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsBindPermission)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.getDnsBindPermission"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPeerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPeerings)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPeerings.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPeerings/{networkPeeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPeerings.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPeerings/{networkPeeringsId}/peeringRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeringRoutes)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPeerings.peeringRoutes.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}/externalAccessRules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccessRules)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.externalAccessRules.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}/externalAccessRules/{externalAccessRulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccessRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.externalAccessRules.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}:fetchExternalAddresses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::fetchExternalAddresses)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.fetchExternalAddresses"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodeTypes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.nodeTypes.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/nodeTypes/{nodeTypesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodeTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.nodeTypes.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.operations.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.operations.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}/nodes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.nodes.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}/nodes/{nodesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/nodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.nodes.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.getIamPolicy"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/dnsForwarding","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsForwarding)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.getDnsForwarding"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/externalAddresses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAddresses)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.externalAddresses.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/externalAddresses/{externalAddressesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.externalAddresses.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/hcxActivationKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hcxActivationKeys)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.hcxActivationKeys.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/hcxActivationKeys/{hcxActivationKeysId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hcxActivationKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.hcxActivationKeys.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/hcxActivationKeys/{hcxActivationKeysId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hcxActivationKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.hcxActivationKeys.getIamPolicy"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/loggingServers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingServers)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.loggingServers.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/loggingServers/{loggingServersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.loggingServers.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/managementDnsZoneBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementDnsZoneBindings)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.managementDnsZoneBindings.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/managementDnsZoneBindings/{managementDnsZoneBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementDnsZoneBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.managementDnsZoneBindings.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/subnets","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnets)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.subnets.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/subnets/{subnetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.subnets.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.getIamPolicy"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:showNsxCredentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::showNsxCredentials)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.showNsxCredentials"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:showVcenterCredentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::showVcenterCredentials)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.showVcenterCredentials"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateConnections.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateConnections.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}/peeringRoutes","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/peeringRoutes)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateConnections.peeringRoutes.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareEngineNetworks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareEngineNetworks)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.vmwareEngineNetworks.list"},{"hostname":"vmwareengine.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareEngineNetworks/{vmwareEngineNetworksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareEngineNetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.vmwareEngineNetworks.get"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPeerings/{networkPeeringsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPeerings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPeerings.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}/externalAccessRules/{externalAccessRulesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccessRules/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.externalAccessRules.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/dnsForwarding","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsForwarding)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.updateDnsForwarding"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/externalAddresses/{externalAddressesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAddresses/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.externalAddresses.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/loggingServers/{loggingServersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingServers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.loggingServers.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/managementDnsZoneBindings/{managementDnsZoneBindingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementDnsZoneBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.managementDnsZoneBindings.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/subnets/{subnetsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subnets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.subnets.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections/{privateConnectionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateConnections.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareEngineNetworks/{vmwareEngineNetworksId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareEngineNetworks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.vmwareEngineNetworks.patch"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsBindPermission:grant","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsBindPermission:grant)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.dnsBindPermission.grant"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/dnsBindPermission:revoke","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dnsBindPermission:revoke)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.dnsBindPermission.revoke"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPeerings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPeerings)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPeerings.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/networkPolicies/{networkPoliciesId}/externalAccessRules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/networkPolicies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAccessRules)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.networkPolicies.externalAccessRules.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.setIamPolicy"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/clusters/{clustersId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.clusters.testIamPermissions"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/externalAddresses","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/externalAddresses)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.externalAddresses.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/hcxActivationKeys","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hcxActivationKeys)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.hcxActivationKeys.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/hcxActivationKeys/{hcxActivationKeysId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hcxActivationKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.hcxActivationKeys.setIamPolicy"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/hcxActivationKeys/{hcxActivationKeysId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hcxActivationKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.hcxActivationKeys.testIamPermissions"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/loggingServers","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/loggingServers)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.loggingServers.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/managementDnsZoneBindings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementDnsZoneBindings)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.managementDnsZoneBindings.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}/managementDnsZoneBindings/{managementDnsZoneBindingsId}:repair","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/managementDnsZoneBindings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::repair)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.managementDnsZoneBindings.repair"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:resetNsxCredentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetNsxCredentials)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.resetNsxCredentials"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:resetVcenterCredentials","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::resetVcenterCredentials)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.resetVcenterCredentials"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.setIamPolicy"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.testIamPermissions"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateClouds/{privateCloudsId}:undelete","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateClouds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::undelete)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateClouds.undelete"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/privateConnections","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/privateConnections)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.privateConnections.create"},{"hostname":"vmwareengine.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/vmwareEngineNetworks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/vmwareEngineNetworks)$","service_name":"google.vmwareengine","resource_name":"vmwareengine.projects.locations.vmwareEngineNetworks.create"},{"hostname":"vpcaccess.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.delete"},{"hostname":"vpcaccess.googleapis.com","http_method":"DELETE","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.delete"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.list"},{"hostname":"vpcaccess.googleapis.com","http_method":"GET","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.operations.get"},{"hostname":"vpcaccess.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.patch"},{"hostname":"vpcaccess.googleapis.com","http_method":"PATCH","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors/{connectorsId}","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.patch"},{"hostname":"vpcaccess.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.create"},{"hostname":"vpcaccess.googleapis.com","http_method":"POST","path_template":"/v1beta1/projects/{projectsId}/locations/{locationsId}/connectors","path_regex":"^(?:/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectors)$","service_name":"google.vpcaccess","resource_name":"vpcaccess.projects.locations.connectors.create"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/eventTicketClass","path_regex":"^(?:/walletobjects/v1/eventTicketClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/eventTicketClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/eventTicketClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/eventTicketObject","path_regex":"^(?:/walletobjects/v1/eventTicketObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/eventTicketObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/eventTicketObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/flightClass","path_regex":"^(?:/walletobjects/v1/flightClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.flightclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/flightClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/flightClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.flightclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/flightObject","path_regex":"^(?:/walletobjects/v1/flightObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.flightobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/flightObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/flightObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.flightobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/genericClass","path_regex":"^(?:/walletobjects/v1/genericClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.genericclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/genericClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/genericClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.genericclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/genericObject","path_regex":"^(?:/walletobjects/v1/genericObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.genericobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/genericObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/genericObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.genericobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/giftCardClass","path_regex":"^(?:/walletobjects/v1/giftCardClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/giftCardClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/giftCardClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/giftCardObject","path_regex":"^(?:/walletobjects/v1/giftCardObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/giftCardObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/giftCardObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/issuer","path_regex":"^(?:/walletobjects/v1/issuer)$","service_name":"google.walletobjects","resource_name":"walletobjects.issuer.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/issuer/{resourceId}","path_regex":"^(?:/walletobjects/v1/issuer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.issuer.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/loyaltyClass","path_regex":"^(?:/walletobjects/v1/loyaltyClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/loyaltyClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/loyaltyClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/loyaltyObject","path_regex":"^(?:/walletobjects/v1/loyaltyObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/loyaltyObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/loyaltyObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/offerClass","path_regex":"^(?:/walletobjects/v1/offerClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.offerclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/offerClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/offerClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.offerclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/offerObject","path_regex":"^(?:/walletobjects/v1/offerObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.offerobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/offerObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/offerObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.offerobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/permissions/{resourceId}","path_regex":"^(?:/walletobjects/v1/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.permissions.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/transitClass","path_regex":"^(?:/walletobjects/v1/transitClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.transitclass.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/transitClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/transitClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.transitclass.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/transitObject","path_regex":"^(?:/walletobjects/v1/transitObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.transitobject.list"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/transitObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/transitObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.transitobject.get"},{"hostname":"walletobjects.googleapis.com","http_method":"GET","path_template":"/walletobjects/v1/transitObject/{resourceId}/downloadRotatingBarcodeValues","path_regex":"^(?:/walletobjects/v1/transitObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/downloadRotatingBarcodeValues)$","service_name":"google.walletobjects","resource_name":"walletobjects.media.download"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/eventTicketClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/eventTicketClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/eventTicketObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/eventTicketObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/flightClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/flightClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.flightclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/flightObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/flightObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.flightobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/genericClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/genericClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.genericclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/genericObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/genericObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.genericobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/giftCardClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/giftCardClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/giftCardObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/giftCardObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/issuer/{resourceId}","path_regex":"^(?:/walletobjects/v1/issuer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.issuer.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/loyaltyClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/loyaltyClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/loyaltyObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/loyaltyObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/offerClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/offerClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.offerclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/offerObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/offerObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.offerobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/transitClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/transitClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.transitclass.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"PATCH","path_template":"/walletobjects/v1/transitObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/transitObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.transitobject.patch"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/eventTicketClass","path_regex":"^(?:/walletobjects/v1/eventTicketClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/eventTicketClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/eventTicketClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/eventTicketObject","path_regex":"^(?:/walletobjects/v1/eventTicketObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/eventTicketObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/eventTicketObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/eventTicketObject/{resourceId}/modifyLinkedOfferObjects","path_regex":"^(?:/walletobjects/v1/eventTicketObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modifyLinkedOfferObjects)$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.modifylinkedofferobjects"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/flightClass","path_regex":"^(?:/walletobjects/v1/flightClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.flightclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/flightClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/flightClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.flightclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/flightObject","path_regex":"^(?:/walletobjects/v1/flightObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.flightobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/flightObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/flightObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.flightobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/genericClass","path_regex":"^(?:/walletobjects/v1/genericClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.genericclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/genericClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/genericClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.genericclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/genericObject","path_regex":"^(?:/walletobjects/v1/genericObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.genericobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/genericObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/genericObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.genericobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/giftCardClass","path_regex":"^(?:/walletobjects/v1/giftCardClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/giftCardClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/giftCardClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/giftCardObject","path_regex":"^(?:/walletobjects/v1/giftCardObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/giftCardObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/giftCardObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/issuer","path_regex":"^(?:/walletobjects/v1/issuer)$","service_name":"google.walletobjects","resource_name":"walletobjects.issuer.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/jwt","path_regex":"^(?:/walletobjects/v1/jwt)$","service_name":"google.walletobjects","resource_name":"walletobjects.jwt.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/loyaltyClass","path_regex":"^(?:/walletobjects/v1/loyaltyClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/loyaltyClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/loyaltyClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/loyaltyObject","path_regex":"^(?:/walletobjects/v1/loyaltyObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/loyaltyObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/loyaltyObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/loyaltyObject/{resourceId}/modifyLinkedOfferObjects","path_regex":"^(?:/walletobjects/v1/loyaltyObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modifyLinkedOfferObjects)$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.modifylinkedofferobjects"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/offerClass","path_regex":"^(?:/walletobjects/v1/offerClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.offerclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/offerClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/offerClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.offerclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/offerObject","path_regex":"^(?:/walletobjects/v1/offerObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.offerobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/offerObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/offerObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.offerobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/smartTap","path_regex":"^(?:/walletobjects/v1/smartTap)$","service_name":"google.walletobjects","resource_name":"walletobjects.smarttap.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/transitClass","path_regex":"^(?:/walletobjects/v1/transitClass)$","service_name":"google.walletobjects","resource_name":"walletobjects.transitclass.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/transitClass/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/transitClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.transitclass.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/transitObject","path_regex":"^(?:/walletobjects/v1/transitObject)$","service_name":"google.walletobjects","resource_name":"walletobjects.transitobject.insert"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/transitObject/{resourceId}/addMessage","path_regex":"^(?:/walletobjects/v1/transitObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addMessage)$","service_name":"google.walletobjects","resource_name":"walletobjects.transitobject.addmessage"},{"hostname":"walletobjects.googleapis.com","http_method":"POST","path_template":"/walletobjects/v1/transitObject/{resourceId}/uploadRotatingBarcodeValues","path_regex":"^(?:/walletobjects/v1/transitObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/uploadRotatingBarcodeValues)$","service_name":"google.walletobjects","resource_name":"walletobjects.media.upload"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/eventTicketClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/eventTicketClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/eventTicketObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/eventTicketObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.eventticketobject.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/flightClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/flightClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.flightclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/flightObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/flightObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.flightobject.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/genericClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/genericClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.genericclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/genericObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/genericObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.genericobject.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/giftCardClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/giftCardClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/giftCardObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/giftCardObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.giftcardobject.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/issuer/{resourceId}","path_regex":"^(?:/walletobjects/v1/issuer/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.issuer.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/loyaltyClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/loyaltyClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/loyaltyObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/loyaltyObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.loyaltyobject.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/offerClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/offerClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.offerclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/offerObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/offerObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.offerobject.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/permissions/{resourceId}","path_regex":"^(?:/walletobjects/v1/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.permissions.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/transitClass/{resourceId}","path_regex":"^(?:/walletobjects/v1/transitClass/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.transitclass.update"},{"hostname":"walletobjects.googleapis.com","http_method":"PUT","path_template":"/walletobjects/v1/transitObject/{resourceId}","path_regex":"^(?:/walletobjects/v1/transitObject/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.walletobjects","resource_name":"walletobjects.transitobject.update"},{"hostname":"webfonts.googleapis.com","http_method":"GET","path_template":"/v1/webfonts","path_regex":"^(?:/v1/webfonts)$","service_name":"google.webfonts","resource_name":"webfonts.webfonts.list"},{"hostname":"webrisk.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.delete"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/hashes:search","path_regex":"^(?:/v1/hashes:search)$","service_name":"google.webrisk","resource_name":"webrisk.hashes.search"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.list"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.get"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/threatLists:computeDiff","path_regex":"^(?:/v1/threatLists:computeDiff)$","service_name":"google.webrisk","resource_name":"webrisk.threatLists.computeDiff"},{"hostname":"webrisk.googleapis.com","http_method":"GET","path_template":"/v1/uris:search","path_regex":"^(?:/v1/uris:search)$","service_name":"google.webrisk","resource_name":"webrisk.uris.search"},{"hostname":"webrisk.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.webrisk","resource_name":"webrisk.projects.operations.cancel"},{"hostname":"webrisk.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/submissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/submissions)$","service_name":"google.webrisk","resource_name":"webrisk.projects.submissions.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.delete"},{"hostname":"websecurityscanner.googleapis.com","http_method":"DELETE","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.delete"},{"hostname":"websecurityscanner.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.delete"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/crawledUrls","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crawledUrls)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.crawledUrls.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findingTypeStats","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findingTypeStats)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findingTypeStats.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings/{findingsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/crawledUrls","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crawledUrls)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.crawledUrls.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findingTypeStats","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findingTypeStats)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findingTypeStats.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings/{findingsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/crawledUrls","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/crawledUrls)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.crawledUrls.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findingTypeStats","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findingTypeStats)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findingTypeStats.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.list"},{"hostname":"websecurityscanner.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}/findings/{findingsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/findings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.findings.get"},{"hostname":"websecurityscanner.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.patch"},{"hostname":"websecurityscanner.googleapis.com","http_method":"PATCH","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.patch"},{"hostname":"websecurityscanner.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.patch"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.stop"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/scanConfigs/{scanConfigsId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.start"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}:stop","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.stop"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1alpha/projects/{projectsId}/scanConfigs/{scanConfigsId}:start","path_regex":"^(?:/v1alpha/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.start"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/scanConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.create"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}/scanRuns/{scanRunsId}:stop","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanRuns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.scanRuns.stop"},{"hostname":"websecurityscanner.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/scanConfigs/{scanConfigsId}:start","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scanConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.websecurityscanner","resource_name":"websecurityscanner.projects.scanConfigs.start"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.list"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.get"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}/callbacks","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/callbacks)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.callbacks.list"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}/stepEntries","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stepEntries)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.stepEntries.list"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}/stepEntries/{stepEntriesId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stepEntries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.stepEntries.get"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}:exportData","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::exportData)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.exportData"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.list"},{"hostname":"workflowexecutions.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.get"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.create"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.cancel"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}:triggerPubsubExecution","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::triggerPubsubExecution)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.triggerPubsubExecution"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.create"},{"hostname":"workflowexecutions.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}/executions/{executionsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workflowexecutions","resource_name":"workflowexecutions.projects.locations.workflows.executions.cancel"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.delete"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.delete"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.delete"},{"hostname":"workflows.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.delete"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}:listRevisions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::listRevisions)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.listRevisions"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.operations.get"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.list"},{"hostname":"workflows.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.get"},{"hostname":"workflows.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.patch"},{"hostname":"workflows.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows/{workflowsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.patch"},{"hostname":"workflows.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.create"},{"hostname":"workflows.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workflows","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workflows)$","service_name":"google.workflows","resource_name":"workflows.projects.locations.workflows.create"},{"hostname":"workloadmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.delete"},{"hostname":"workloadmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.delete"},{"hostname":"workloadmanager.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.delete"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}/results","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.results.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions/{executionsId}/scannedResources","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/scannedResources)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.scannedResources.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.get"},{"hostname":"workloadmanager.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/rules","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rules)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.rules.list"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.create"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/evaluations/{evaluationsId}/executions:run","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/evaluations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/executions:run)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.evaluations.executions.run"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/insights:writeInsight","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/insights:writeInsight)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.insights.writeInsight"},{"hostname":"workloadmanager.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workloadmanager","resource_name":"workloadmanager.projects.locations.operations.cancel"},{"hostname":"workspaceevents.googleapis.com","http_method":"DELETE","path_template":"/v1/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workspaceevents","resource_name":"workspaceevents.subscriptions.delete"},{"hostname":"workspaceevents.googleapis.com","http_method":"GET","path_template":"/v1/operations/{operationsId}","path_regex":"^(?:/v1/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workspaceevents","resource_name":"workspaceevents.operations.get"},{"hostname":"workspaceevents.googleapis.com","http_method":"GET","path_template":"/v1/subscriptions","path_regex":"^(?:/v1/subscriptions)$","service_name":"google.workspaceevents","resource_name":"workspaceevents.subscriptions.list"},{"hostname":"workspaceevents.googleapis.com","http_method":"GET","path_template":"/v1/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workspaceevents","resource_name":"workspaceevents.subscriptions.get"},{"hostname":"workspaceevents.googleapis.com","http_method":"PATCH","path_template":"/v1/subscriptions/{subscriptionsId}","path_regex":"^(?:/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workspaceevents","resource_name":"workspaceevents.subscriptions.patch"},{"hostname":"workspaceevents.googleapis.com","http_method":"POST","path_template":"/v1/subscriptions","path_regex":"^(?:/v1/subscriptions)$","service_name":"google.workspaceevents","resource_name":"workspaceevents.subscriptions.create"},{"hostname":"workspaceevents.googleapis.com","http_method":"POST","path_template":"/v1/subscriptions/{subscriptionsId}:reactivate","path_regex":"^(?:/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::reactivate)$","service_name":"google.workspaceevents","resource_name":"workspaceevents.subscriptions.reactivate"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.delete"},{"hostname":"workstations.googleapis.com","http_method":"DELETE","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.delete"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.getIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations:listUsable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations:listUsable)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.listUsable"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:getIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.getIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs:listUsable","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs:listUsable)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.listUsable"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.list"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.get"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.getIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations:listUsable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations:listUsable)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.listUsable"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:getIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::getIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.getIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"GET","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs:listUsable","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs:listUsable)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.listUsable"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.patch"},{"hostname":"workstations.googleapis.com","http_method":"PATCH","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.patch"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.cancel"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:generateAccessToken","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.generateAccessToken"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.setIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:start","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.start"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:stop","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.stop"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.testIamPermissions"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:setIamPolicy","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.setIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:testIamPermissions","path_regex":"^(?:/v1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.testIamPermissions"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/operations/{operationsId}:cancel","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::cancel)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.operations.cancel"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.create"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:generateAccessToken","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::generateAccessToken)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.generateAccessToken"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.setIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:start","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::start)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.start"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:stop","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::stop)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.stop"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}/workstations/{workstationsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.workstations.testIamPermissions"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:setIamPolicy","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::setIamPolicy)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.setIamPolicy"},{"hostname":"workstations.googleapis.com","http_method":"POST","path_template":"/v1beta/projects/{projectsId}/locations/{locationsId}/workstationClusters/{workstationClustersId}/workstationConfigs/{workstationConfigsId}:testIamPermissions","path_regex":"^(?:/v1beta/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationClusters/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/workstationConfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?::testIamPermissions)$","service_name":"google.workstations","resource_name":"workstations.projects.locations.workstationClusters.workstationConfigs.testIamPermissions"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsense/v1.4/accounts/{accountId}/alerts/{alertId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsense/v1.4/alerts/{alertId}","path_regex":"^(?:/adsense/v1\\.4/alerts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.alerts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/adsensehost/v4.1/adclients/{adClientId}/urlchannels/{urlChannelId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.urlchannels.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/appstate/v1/states/{stateKey}","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appstate","resource_name":"appstate.states.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dynamicTargetingKeys/{objectId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/drives/{driveId}","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/trash","path_regex":"^(?:/drive/v2/files/trash)$","service_name":"google.drive","resource_name":"drive.files.emptyTrash"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/parents/{parentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.parents.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/files/{folderId}/children/{childId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.children.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v2/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v2/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/drives/{driveId}","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/trash","path_regex":"^(?:/drive/v3/files/trash)$","service_name":"google.drive","resource_name":"drive.files.emptyTrash"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/drive/v3/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v3/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/subscriptions/{id}","path_regex":"^(?:/mirror/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.subscriptions.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/mirror/v1/timeline/{itemId}/attachments/{attachmentId}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/surveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.surveys","resource_name":"surveys.surveys.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sites.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/youtube/analytics/v1beta1/groupItems","path_regex":"^(?:/youtube/analytics/v1beta1/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.delete"},{"hostname":"www.googleapis.com","http_method":"DELETE","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.delete"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/accounts","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.2/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.2/creatives/{accountId}/{buyerCreativeId}","path_regex":"^(?:/adexchangebuyer/v1\\.2/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/accounts","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/billinginfo","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.3/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/creatives/{accountId}/{buyerCreativeId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/directdeals","path_regex":"^(?:/adexchangebuyer/v1\\.3/directdeals)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.directDeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/directdeals/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/directdeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.directDeals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/performancereport","path_regex":"^(?:/adexchangebuyer/v1\\.3/performancereport)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.performanceReport.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/accounts","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/billinginfo","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.billingInfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}/listDeals","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listDeals)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.listDeals"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/performancereport","path_regex":"^(?:/adexchangebuyer/v1\\.4/performancereport)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.performanceReport.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/products/search","path_regex":"^(?:/adexchangebuyer/v1\\.4/products/search)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.products.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/products/{productId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.products.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/search","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/search)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/notes","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacenotes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangebuyer/v1.4/publisher/{accountId}/profiles","path_regex":"^(?:/adexchangebuyer/v1\\.4/publisher/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pubprofiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/accounts/{accountId}","path_regex":"^(?:/adexchangeseller/v1\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/adunits","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adexchangeseller/v1\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/alerts","path_regex":"^(?:/adexchangeseller/v1\\.1/alerts)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/metadata/dimensions","path_regex":"^(?:/adexchangeseller/v1\\.1/metadata/dimensions)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/metadata/metrics","path_regex":"^(?:/adexchangeseller/v1\\.1/metadata/metrics)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/preferreddeals","path_regex":"^(?:/adexchangeseller/v1\\.1/preferreddeals)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.preferreddeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/preferreddeals/{dealId}","path_regex":"^(?:/adexchangeseller/v1\\.1/preferreddeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.preferreddeals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/reports","path_regex":"^(?:/adexchangeseller/v1\\.1/reports)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/reports/saved","path_regex":"^(?:/adexchangeseller/v1\\.1/reports/saved)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1.1/reports/{savedReportId}","path_regex":"^(?:/adexchangeseller/v1\\.1/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients","path_regex":"^(?:/adexchangeseller/v1/adclients)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/adunits","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adexchangeseller/v1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/reports","path_regex":"^(?:/adexchangeseller/v1/reports)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/reports/saved","path_regex":"^(?:/adexchangeseller/v1/reports/saved)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v1/reports/{savedReportId}","path_regex":"^(?:/adexchangeseller/v1/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients/{adClientId}/customchannels","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/alerts","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/metadata/dimensions","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata/dimensions)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/metadata/metrics","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metadata/metrics)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/preferreddeals","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferreddeals)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.preferreddeals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/preferreddeals/{dealId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/preferreddeals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.preferreddeals.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/reports","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/reports/saved","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adexchangeseller/v2.0/accounts/{accountId}/reports/{savedReportId}","path_regex":"^(?:/adexchangeseller/v2\\.0/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangeseller","resource_name":"adexchangeseller.accounts.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts","path_regex":"^(?:/adsense/v1\\.3/accounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/alerts","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/reports","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/reports/saved","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/savedadstyles","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/accounts/{accountId}/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients","path_regex":"^(?:/adsense/v1\\.3/adclients)$","service_name":"google.adsense","resource_name":"adsense.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.3/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/alerts","path_regex":"^(?:/adsense/v1\\.3/alerts)$","service_name":"google.adsense","resource_name":"adsense.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/metadata/dimensions","path_regex":"^(?:/adsense/v1\\.3/metadata/dimensions)$","service_name":"google.adsense","resource_name":"adsense.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/metadata/metrics","path_regex":"^(?:/adsense/v1\\.3/metadata/metrics)$","service_name":"google.adsense","resource_name":"adsense.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/reports","path_regex":"^(?:/adsense/v1\\.3/reports)$","service_name":"google.adsense","resource_name":"adsense.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/reports/saved","path_regex":"^(?:/adsense/v1\\.3/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.3/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/savedadstyles","path_regex":"^(?:/adsense/v1\\.3/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.3/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.3/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts","path_regex":"^(?:/adsense/v1\\.4/accounts)$","service_name":"google.adsense","resource_name":"adsense.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adcode","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adclients.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.accounts.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.accounts.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/alerts","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/alerts)$","service_name":"google.adsense","resource_name":"adsense.accounts.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/payments","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/payments)$","service_name":"google.adsense","resource_name":"adsense.accounts.payments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/reports","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/reports/saved","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/savedadstyles","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/accounts/{accountId}/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.accounts.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients","path_regex":"^(?:/adsense/v1\\.4/adclients)$","service_name":"google.adsense","resource_name":"adsense.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsense","resource_name":"adsense.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/adunits/{adUnitId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.adunits.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsense","resource_name":"adsense.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/customchannels/{customChannelId}/adunits","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsense","resource_name":"adsense.customchannels.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsense/v1\\.4/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsense","resource_name":"adsense.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/alerts","path_regex":"^(?:/adsense/v1\\.4/alerts)$","service_name":"google.adsense","resource_name":"adsense.alerts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/metadata/dimensions","path_regex":"^(?:/adsense/v1\\.4/metadata/dimensions)$","service_name":"google.adsense","resource_name":"adsense.metadata.dimensions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/metadata/metrics","path_regex":"^(?:/adsense/v1\\.4/metadata/metrics)$","service_name":"google.adsense","resource_name":"adsense.metadata.metrics.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/payments","path_regex":"^(?:/adsense/v1\\.4/payments)$","service_name":"google.adsense","resource_name":"adsense.payments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/reports","path_regex":"^(?:/adsense/v1\\.4/reports)$","service_name":"google.adsense","resource_name":"adsense.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/reports/saved","path_regex":"^(?:/adsense/v1\\.4/reports/saved)$","service_name":"google.adsense","resource_name":"adsense.reports.saved.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/reports/{savedReportId}","path_regex":"^(?:/adsense/v1\\.4/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.reports.saved.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/savedadstyles","path_regex":"^(?:/adsense/v1\\.4/savedadstyles)$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsense/v1.4/savedadstyles/{savedAdStyleId}","path_regex":"^(?:/adsense/v1\\.4/savedadstyles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsense","resource_name":"adsense.savedadstyles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts","path_regex":"^(?:/adsensehost/v4\\.1/accounts)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adclients.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits/{adUnitId}/adcode","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adcode)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.getAdCode"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/accounts/{accountId}/reports","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients","path_regex":"^(?:/adsensehost/v4\\.1/adclients)$","service_name":"google.adsensehost","resource_name":"adsensehost.adclients.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.adclients.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels/{customChannelId}","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.urlchannels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/associationsessions/start","path_regex":"^(?:/adsensehost/v4\\.1/associationsessions/start)$","service_name":"google.adsensehost","resource_name":"adsensehost.associationsessions.start"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/associationsessions/verify","path_regex":"^(?:/adsensehost/v4\\.1/associationsessions/verify)$","service_name":"google.adsensehost","resource_name":"adsensehost.associationsessions.verify"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/adsensehost/v4.1/reports","path_regex":"^(?:/adsensehost/v4\\.1/reports)$","service_name":"google.adsensehost","resource_name":"adsensehost.reports.generate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/data","path_regex":"^(?:/analytics/v2\\.4/data)$","service_name":"google.analytics","resource_name":"analytics.data.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts","path_regex":"^(?:/analytics/v2\\.4/management/accounts)$","service_name":"google.analytics","resource_name":"analytics.management.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts/{accountId}/webproperties","path_regex":"^(?:/analytics/v2\\.4/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties)$","service_name":"google.analytics","resource_name":"analytics.management.webproperties.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles","path_regex":"^(?:/analytics/v2\\.4/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles)$","service_name":"google.analytics","resource_name":"analytics.management.profiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/accounts/{accountId}/webproperties/{webPropertyId}/profiles/{profileId}/goals","path_regex":"^(?:/analytics/v2\\.4/management/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/webproperties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/profiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/goals)$","service_name":"google.analytics","resource_name":"analytics.management.goals.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/analytics/v2.4/management/segments","path_regex":"^(?:/analytics/v2\\.4/management/segments)$","service_name":"google.analytics","resource_name":"analytics.management.segments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v1.1/applications/{packageName}/inapp/{productId}/purchases/{token}","path_regex":"^(?:/androidpublisher/v1\\.1/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inapp/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.inapppurchases.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v2/applications/{packageName}/purchases/products/{productId}/tokens/{token}","path_regex":"^(?:/androidpublisher/v2/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/products/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tokens/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.products.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/androidpublisher/v2/applications/{packageName}/purchases/voidedpurchases","path_regex":"^(?:/androidpublisher/v2/applications/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/purchases/voidedpurchases)$","service_name":"google.androidpublisher","resource_name":"androidpublisher.purchases.voidedpurchases.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/appsactivity/v1/activities","path_regex":"^(?:/appsactivity/v1/activities)$","service_name":"google.appsactivity","resource_name":"appsactivity.activities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/appstate/v1/states","path_regex":"^(?:/appstate/v1/states)$","service_name":"google.appstate","resource_name":"appstate.states.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/appstate/v1/states/{stateKey}","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appstate","resource_name":"appstate.states.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/byurl","path_regex":"^(?:/blogger/v3/blogs/byurl)$","service_name":"google.blogger","resource_name":"blogger.blogs.getByUrl"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/comments","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.listByBlog"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/pages","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/pageviews","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pageviews)$","service_name":"google.blogger","resource_name":"blogger.pageViews.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/bypath","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/bypath)$","service_name":"google.blogger","resource_name":"blogger.posts.getByPath"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/search","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/search)$","service_name":"google.blogger","resource_name":"blogger.posts.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.blogger","resource_name":"blogger.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.users.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs)$","service_name":"google.blogger","resource_name":"blogger.blogs.listByUser"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs/{blogId}","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.blogUserInfos.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs/{blogId}/posts","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/blogger/v3/users/{userId}/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/users/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.postUserInfos.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/acl","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.calendar","resource_name":"calendar.acl.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/events","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.calendar","resource_name":"calendar.events.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}/instances","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instances)$","service_name":"google.calendar","resource_name":"calendar.events.instances"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/colors","path_regex":"^(?:/calendar/v3/colors)$","service_name":"google.calendar","resource_name":"calendar.colors.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/calendarList","path_regex":"^(?:/calendar/v3/users/me/calendarList)$","service_name":"google.calendar","resource_name":"calendar.calendarList.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/settings","path_regex":"^(?:/calendar/v3/users/me/settings)$","service_name":"google.calendar","resource_name":"calendar.settings.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/calendar/v3/users/me/settings/{setting}","path_regex":"^(?:/calendar/v3/users/me/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.settings.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/mobileAppPanels","path_regex":"^(?:/consumersurveys/v2/mobileAppPanels)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.mobileapppanels.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/mobileAppPanels/{panelId}","path_regex":"^(?:/consumersurveys/v2/mobileAppPanels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.mobileapppanels.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/surveys","path_regex":"^(?:/consumersurveys/v2/surveys)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}/results","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.results.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orderreturns","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns)$","service_name":"google.content","resource_name":"content.orderreturns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orderreturns/{returnId}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderreturns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orderreturns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orders","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.content","resource_name":"content.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/ordersbymerchantid/{merchantOrderId}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ordersbymerchantid/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.getbymerchantorderid"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/content/v2sandbox/{merchantId}/testordertemplates/{templateName}","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testordertemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.content","resource_name":"content.orders.gettestordertemplate"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v2\\.7/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySiteContacts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySiteContacts/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.0/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySiteContacts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySiteContacts/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.1/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.2/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountActiveAdSummaries/{summaryAccountId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountActiveAdSummaries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountActiveAdSummaries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissionGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountPermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountPermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountPermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/browsers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/browsers)$","service_name":"google.dfareporting","resource_name":"dfareporting.browsers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/changeLogs","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs)$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/changeLogs/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/changeLogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.changeLogs.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/cities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cities)$","service_name":"google.dfareporting","resource_name":"dfareporting.cities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/connectionTypes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/connectionTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/connectionTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.connectionTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/countries","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries)$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/countries/{dartId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/countries/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.countries.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySiteContacts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySiteContacts/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySiteContacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySiteContacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySites/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/files","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/languages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/languages)$","service_name":"google.dfareporting","resource_name":"dfareporting.languages.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/metros","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/metros)$","service_name":"google.dfareporting","resource_name":"dfareporting.metros.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileApps","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileApps/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileApps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileApps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileCarriers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers)$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/mobileCarriers/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/mobileCarriers/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.mobileCarriers.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystemVersions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystemVersions/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystemVersions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystemVersions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystems","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems)$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/operatingSystems/{dartId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operatingSystems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.operatingSystems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/platformTypes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes)$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/platformTypes/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/platformTypes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.platformTypes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/postalCodes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes)$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/postalCodes/{code}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/postalCodes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.postalCodes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects)$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.projects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/inventoryItems","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems)$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/inventoryItems/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inventoryItems/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.inventoryItems.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orderDocuments","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments)$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orderDocuments/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderDocuments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orderDocuments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orders","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders)$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/projects/{projectId}/orders/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.orders.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/regions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/regions)$","service_name":"google.dfareporting","resource_name":"dfareporting.regions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingListShares/{remarketingListId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}/files","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}/files/{fileId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sizes/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetableRemarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetableRemarketingLists/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetableRemarketingLists/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetableRemarketingLists.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissionGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissionGroups/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissionGroups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissionGroups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissions","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRolePermissions/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRolePermissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRolePermissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/videoFormats","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats)$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/videoFormats/{id}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/videoFormats/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.videoFormats.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/discovery/v1/apis","path_regex":"^(?:/discovery/v1/apis)$","service_name":"google.discovery","resource_name":"discovery.apis.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/discovery/v1/apis/{api}/{version}/rest","path_regex":"^(?:/discovery/v1/apis/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rest)$","service_name":"google.discovery","resource_name":"discovery.apis.getRest"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/about","path_regex":"^(?:/drive/v2/about)$","service_name":"google.drive","resource_name":"drive.about.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/apps","path_regex":"^(?:/drive/v2/apps)$","service_name":"google.drive","resource_name":"drive.apps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/apps/{appId}","path_regex":"^(?:/drive/v2/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.apps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/changes","path_regex":"^(?:/drive/v2/changes)$","service_name":"google.drive","resource_name":"drive.changes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/changes/startPageToken","path_regex":"^(?:/drive/v2/changes/startPageToken)$","service_name":"google.drive","resource_name":"drive.changes.getStartPageToken"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/changes/{changeId}","path_regex":"^(?:/drive/v2/changes/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.changes.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/drives","path_regex":"^(?:/drive/v2/drives)$","service_name":"google.drive","resource_name":"drive.drives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/drives/{driveId}","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files","path_regex":"^(?:/drive/v2/files)$","service_name":"google.drive","resource_name":"drive.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/generateIds","path_regex":"^(?:/drive/v2/files/generateIds)$","service_name":"google.drive","resource_name":"drive.files.generateIds"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/export","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.drive","resource_name":"drive.files.export"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/listLabels","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listLabels)$","service_name":"google.drive","resource_name":"drive.files.listLabels"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/parents","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents)$","service_name":"google.drive","resource_name":"drive.parents.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/parents/{parentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.parents.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/permissions","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/properties","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties)$","service_name":"google.drive","resource_name":"drive.properties.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/revisions","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.drive","resource_name":"drive.revisions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{folderId}/children","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children)$","service_name":"google.drive","resource_name":"drive.children.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/files/{folderId}/children/{childId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.children.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/permissionIds/{email}","path_regex":"^(?:/drive/v2/permissionIds/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.getIdForEmail"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/teamdrives","path_regex":"^(?:/drive/v2/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v2/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v2/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/about","path_regex":"^(?:/drive/v3/about)$","service_name":"google.drive","resource_name":"drive.about.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/apps","path_regex":"^(?:/drive/v3/apps)$","service_name":"google.drive","resource_name":"drive.apps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/apps/{appId}","path_regex":"^(?:/drive/v3/apps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.apps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/changes","path_regex":"^(?:/drive/v3/changes)$","service_name":"google.drive","resource_name":"drive.changes.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/changes/startPageToken","path_regex":"^(?:/drive/v3/changes/startPageToken)$","service_name":"google.drive","resource_name":"drive.changes.getStartPageToken"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/drives","path_regex":"^(?:/drive/v3/drives)$","service_name":"google.drive","resource_name":"drive.drives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/drives/{driveId}","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files","path_regex":"^(?:/drive/v3/files)$","service_name":"google.drive","resource_name":"drive.files.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/generateIds","path_regex":"^(?:/drive/v3/files/generateIds)$","service_name":"google.drive","resource_name":"drive.files.generateIds"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/export","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/export)$","service_name":"google.drive","resource_name":"drive.files.export"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/listLabels","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/listLabels)$","service_name":"google.drive","resource_name":"drive.files.listLabels"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/permissions","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/revisions","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions)$","service_name":"google.drive","resource_name":"drive.revisions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/teamdrives","path_regex":"^(?:/drive/v3/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/drive/v3/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v3/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/query","path_regex":"^(?:/fusiontables/v1/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sqlGet"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables","path_regex":"^(?:/fusiontables/v1/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/tasks","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.fusiontables","resource_name":"fusiontables.task.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/query","path_regex":"^(?:/fusiontables/v2/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sqlGet"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables","path_regex":"^(?:/fusiontables/v2/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/tasks","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks)$","service_name":"google.fusiontables","resource_name":"fusiontables.task.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/tasks/{taskId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/tasks/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.task.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/groups/v1/groups/{groupUniqueId}","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.groupssettings","resource_name":"groupsSettings.groups.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/identitytoolkit/v3/relyingparty/getProjectConfig","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getProjectConfig)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getProjectConfig"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/identitytoolkit/v3/relyingparty/getRecaptchaParam","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getRecaptchaParam)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getRecaptchaParam"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/identitytoolkit/v3/relyingparty/publicKeys","path_regex":"^(?:/identitytoolkit/v3/relyingparty/publicKeys)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getPublicKeys"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/contacts","path_regex":"^(?:/mirror/v1/contacts)$","service_name":"google.mirror","resource_name":"mirror.contacts.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/locations","path_regex":"^(?:/mirror/v1/locations)$","service_name":"google.mirror","resource_name":"mirror.locations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/locations/{id}","path_regex":"^(?:/mirror/v1/locations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.locations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/settings/{id}","path_regex":"^(?:/mirror/v1/settings/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.settings.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/subscriptions","path_regex":"^(?:/mirror/v1/subscriptions)$","service_name":"google.mirror","resource_name":"mirror.subscriptions.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline","path_regex":"^(?:/mirror/v1/timeline)$","service_name":"google.mirror","resource_name":"mirror.timeline.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline/{itemId}/attachments","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/mirror/v1/timeline/{itemId}/attachments/{attachmentId}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/oauth2/v1/userinfo","path_regex":"^(?:/oauth2/v1/userinfo)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/oauth2/v2/userinfo","path_regex":"^(?:/oauth2/v2/userinfo)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v1/runPagespeed","path_regex":"^(?:/pagespeedonline/v1/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v2/runPagespeed","path_regex":"^(?:/pagespeedonline/v2/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/pagespeedonline/v4/runPagespeed","path_regex":"^(?:/pagespeedonline/v4/runPagespeed)$","service_name":"google.pagespeedonline","resource_name":"pagespeedonline.pagespeedapi.runpagespeed"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities","path_regex":"^(?:/plus/v1/activities)$","service_name":"google.plus","resource_name":"plus.activities.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities/{activityId}","path_regex":"^(?:/plus/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.activities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities/{activityId}/comments","path_regex":"^(?:/plus/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.plus","resource_name":"plus.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/activities/{activityId}/people/{collection}","path_regex":"^(?:/plus/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.people.listByActivity"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/comments/{commentId}","path_regex":"^(?:/plus/v1/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people","path_regex":"^(?:/plus/v1/people)$","service_name":"google.plus","resource_name":"plus.people.search"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people/{userId}","path_regex":"^(?:/plus/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.people.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people/{userId}/activities/{collection}","path_regex":"^(?:/plus/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.activities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plus/v1/people/{userId}/people/{collection}","path_regex":"^(?:/plus/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plus","resource_name":"plus.people.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/activities/{activityId}","path_regex":"^(?:/plusDomains/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.activities.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/activities/{activityId}/comments","path_regex":"^(?:/plusDomains/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.plusDomains","resource_name":"plusDomains.comments.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/activities/{activityId}/people/{collection}","path_regex":"^(?:/plusDomains/v1/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.people.listByActivity"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/comments/{commentId}","path_regex":"^(?:/plusDomains/v1/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.comments.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.people.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/activities/{collection}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/activities/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.activities.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/audiences","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/audiences)$","service_name":"google.plusDomains","resource_name":"plusDomains.audiences.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/circles","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/circles)$","service_name":"google.plusDomains","resource_name":"plusDomains.circles.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/plusDomains/v1/people/{userId}/people/{collection}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.people.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools)$","service_name":"google.replicapool","resource_name":"replicapool.pools.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.pools.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas)$","service_name":"google.replicapool","resource_name":"replicapool.replicas.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.replicas.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/operations","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.zoneOperations.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/operations/{operation}","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/operations/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.zoneOperations.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/instanceUpdates","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/instanceUpdates)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.listInstanceUpdates"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/siteVerification/v1/webResource","path_regex":"^(?:/siteVerification/v1/webResource)$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1/b/{bucket}","path_regex":"^(?:/storage/v1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b","path_regex":"^(?:/storage/v1beta1/b)$","service_name":"google.storage","resource_name":"storage.buckets.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/surveys/v2/surveys","path_regex":"^(?:/surveys/v2/surveys)$","service_name":"google.surveys","resource_name":"surveys.surveys.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/surveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.surveys","resource_name":"surveys.surveys.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/surveys/v2/surveys/{surveyUrlId}/results","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/results)$","service_name":"google.surveys","resource_name":"surveys.results.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/urlshortener/v1/url","path_regex":"^(?:/urlshortener/v1/url)$","service_name":"google.urlshortener","resource_name":"urlshortener.url.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/urlshortener/v1/url/history","path_regex":"^(?:/urlshortener/v1/url/history)$","service_name":"google.urlshortener","resource_name":"urlshortener.url.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/userinfo/v2/me","path_regex":"^(?:/userinfo/v2/me)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.v2.me.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/userinfo/v2/me","path_regex":"^(?:/userinfo/v2/me)$","service_name":"google.oauth2","resource_name":"oauth2.userinfo.v2.me.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites","path_regex":"^(?:/webmasters/v3/sites)$","service_name":"google.webmasters","resource_name":"webmasters.sites.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sites.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps)$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.get"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/youtube/analytics/v1beta1/groupItems","path_regex":"^(?:/youtube/analytics/v1beta1/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.list"},{"hostname":"www.googleapis.com","http_method":"GET","path_template":"/youtube/analytics/v1beta1/reports","path_regex":"^(?:/youtube/analytics/v1beta1/reports)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.reports.query"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.2/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.3/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/{revisionNumber}/{updateAction}","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/drives/{driveId}","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/drive/v3/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v3/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.update"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/groups/v1/groups/{groupUniqueId}","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.groupssettings","resource_name":"groupsSettings.groups.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.patch"},{"hostname":"www.googleapis.com","http_method":"PATCH","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.patch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.2/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.2/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.3/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.3/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/creatives","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}/addDeal/{dealId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/addDeal/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.addDeal"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/creatives/{accountId}/{buyerCreativeId}/removeDeal/{dealId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/creatives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removeDeal/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.creatives.removeDeal"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/privateauction/{privateAuctionId}/updateproposal","path_regex":"^(?:/adexchangebuyer/v1\\.4/privateauction/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateproposal)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplaceprivateauction.updateproposal"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/insert","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/insert)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals/delete","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/delete)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.delete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals/insert","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/insert)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/deals/update","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/deals/update)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacedeals.update"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/notes/insert","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notes/insert)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.marketplacenotes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/setupcomplete","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setupcomplete)$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.setupcomplete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/adsensehost/v4.1/adclients/{adClientId}/urlchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/urlchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.urlchannels.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/appstate/v1/states/{stateKey}/clear","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clear)$","service_name":"google.appstate","resource_name":"appstate.states.clear"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/pages","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages)$","service_name":"google.blogger","resource_name":"blogger.pages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts)$","service_name":"google.blogger","resource_name":"blogger.posts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/approve","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/approve)$","service_name":"google.blogger","resource_name":"blogger.comments.approve"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/removecontent","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/removecontent)$","service_name":"google.blogger","resource_name":"blogger.comments.removeContent"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/comments/{commentId}/spam","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/spam)$","service_name":"google.blogger","resource_name":"blogger.comments.markAsSpam"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/publish","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/publish)$","service_name":"google.blogger","resource_name":"blogger.posts.publish"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}/revert","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revert)$","service_name":"google.blogger","resource_name":"blogger.posts.revert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars","path_regex":"^(?:/calendar/v3/calendars)$","service_name":"google.calendar","resource_name":"calendar.calendars.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/acl","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.calendar","resource_name":"calendar.acl.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/acl/watch","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/watch)$","service_name":"google.calendar","resource_name":"calendar.acl.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/clear","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/clear)$","service_name":"google.calendar","resource_name":"calendar.calendars.clear"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events)$","service_name":"google.calendar","resource_name":"calendar.events.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/import","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/import)$","service_name":"google.calendar","resource_name":"calendar.events.import"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/quickAdd","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/quickAdd)$","service_name":"google.calendar","resource_name":"calendar.events.quickAdd"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/watch","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/watch)$","service_name":"google.calendar","resource_name":"calendar.events.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}/move","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/move)$","service_name":"google.calendar","resource_name":"calendar.events.move"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/channels/stop","path_regex":"^(?:/calendar/v3/channels/stop)$","service_name":"google.calendar","resource_name":"calendar.channels.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/freeBusy","path_regex":"^(?:/calendar/v3/freeBusy)$","service_name":"google.calendar","resource_name":"calendar.freebusy.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/users/me/calendarList","path_regex":"^(?:/calendar/v3/users/me/calendarList)$","service_name":"google.calendar","resource_name":"calendar.calendarList.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/users/me/calendarList/watch","path_regex":"^(?:/calendar/v3/users/me/calendarList/watch)$","service_name":"google.calendar","resource_name":"calendar.calendarList.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/calendar/v3/users/me/settings/watch","path_regex":"^(?:/calendar/v3/users/me/settings/watch)$","service_name":"google.calendar","resource_name":"calendar.settings.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/consumersurveys/v2/surveys","path_regex":"^(?:/consumersurveys/v2/surveys)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/consumersurveys/v2/surveys/{resourceId}/start","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.start"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/consumersurveys/v2/surveys/{resourceId}/stop","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/orders/batch","path_regex":"^(?:/content/v2sandbox/orders/batch)$","service_name":"google.content","resource_name":"content.orders.custombatch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderinvoices/{orderId}/createChargeInvoice","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createChargeInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createchargeinvoice"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderinvoices/{orderId}/createRefundInvoice","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderinvoices/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/createRefundInvoice)$","service_name":"google.content","resource_name":"content.orderinvoices.createrefundinvoice"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyAuthApproved","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyAuthApproved)$","service_name":"google.content","resource_name":"content.orderpayments.notifyauthapproved"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyAuthDeclined","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyAuthDeclined)$","service_name":"google.content","resource_name":"content.orderpayments.notifyauthdeclined"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyCharge","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyCharge)$","service_name":"google.content","resource_name":"content.orderpayments.notifycharge"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orderpayments/{orderId}/notifyRefund","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orderpayments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/notifyRefund)$","service_name":"google.content","resource_name":"content.orderpayments.notifyrefund"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/acknowledge","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acknowledge)$","service_name":"google.content","resource_name":"content.orders.acknowledge"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/cancel","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.content","resource_name":"content.orders.cancel"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/cancelLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelLineItem)$","service_name":"google.content","resource_name":"content.orders.cancellineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/inStoreRefundLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/inStoreRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.instorerefundlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/refund","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refund)$","service_name":"google.content","resource_name":"content.orders.refund"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/rejectReturnLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rejectReturnLineItem)$","service_name":"google.content","resource_name":"content.orders.rejectreturnlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/returnLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnLineItem)$","service_name":"google.content","resource_name":"content.orders.returnlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/returnRefundLineItem","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/returnRefundLineItem)$","service_name":"google.content","resource_name":"content.orders.returnrefundlineitem"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/setLineItemMetadata","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/setLineItemMetadata)$","service_name":"google.content","resource_name":"content.orders.setlineitemmetadata"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/shipLineItems","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/shipLineItems)$","service_name":"google.content","resource_name":"content.orders.shiplineitems"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/testreturn","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testreturn)$","service_name":"google.content","resource_name":"content.orders.createtestreturn"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/updateLineItemShippingDetails","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateLineItemShippingDetails)$","service_name":"google.content","resource_name":"content.orders.updatelineitemshippingdetails"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/updateMerchantOrderId","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateMerchantOrderId)$","service_name":"google.content","resource_name":"content.orders.updatemerchantorderid"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/orders/{orderId}/updateShipment","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/orders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateShipment)$","service_name":"google.content","resource_name":"content.orders.updateshipment"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/testorders","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders)$","service_name":"google.content","resource_name":"content.orders.createtestorder"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/testorders/{orderId}/advance","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advance)$","service_name":"google.content","resource_name":"content.orders.advancetestorder"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/content/v2sandbox/{merchantId}/testorders/{orderId}/cancelByCustomer","path_regex":"^(?:/content/v2sandbox/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/testorders/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancelByCustomer)$","service_name":"google.content","resource_name":"content.orders.canceltestorderbycustomer"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns/{campaignId}/campaignCreativeAssociations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaignCreativeAssociations)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaignCreativeAssociations.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/conversions/batchinsert","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchinsert)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchinsert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/conversions/batchupdate","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/conversions/batchupdate)$","service_name":"google.dfareporting","resource_name":"dfareporting.conversions.batchupdate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeAssets/{advertiserId}/creativeAssets","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeAssets)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeAssets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dimensionvalues/query","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dimensionvalues/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.dimensionValues.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/directorySites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/directorySites)$","service_name":"google.dfareporting","resource_name":"dfareporting.directorySites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/dynamicTargetingKeys","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/dynamicTargetingKeys)$","service_name":"google.dfareporting","resource_name":"dfareporting.dynamicTargetingKeys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities/generatetag","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities/generatetag)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.generatetag"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements/generatetags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements/generatetags)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.generatetags"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/compatiblefields/query","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/compatiblefields/query)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.compatibleFields.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}/run","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/run)$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.run"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sizes","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sizes)$","service_name":"google.dfareporting","resource_name":"dfareporting.sizes.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/changes/watch","path_regex":"^(?:/drive/v2/changes/watch)$","service_name":"google.drive","resource_name":"drive.changes.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/channels/stop","path_regex":"^(?:/drive/v2/channels/stop)$","service_name":"google.drive","resource_name":"drive.channels.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/drives","path_regex":"^(?:/drive/v2/drives)$","service_name":"google.drive","resource_name":"drive.drives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/drives/{driveId}/hide","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hide)$","service_name":"google.drive","resource_name":"drive.drives.hide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/drives/{driveId}/unhide","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unhide)$","service_name":"google.drive","resource_name":"drive.drives.unhide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files","path_regex":"^(?:/drive/v2/files)$","service_name":"google.drive","resource_name":"drive.files.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/comments","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/copy","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.drive","resource_name":"drive.files.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/modifyLabels","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modifyLabels)$","service_name":"google.drive","resource_name":"drive.files.modifyLabels"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/parents","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/parents)$","service_name":"google.drive","resource_name":"drive.parents.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/permissions","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/properties","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties)$","service_name":"google.drive","resource_name":"drive.properties.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/touch","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/touch)$","service_name":"google.drive","resource_name":"drive.files.touch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/trash","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/trash)$","service_name":"google.drive","resource_name":"drive.files.trash"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/untrash","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/untrash)$","service_name":"google.drive","resource_name":"drive.files.untrash"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{fileId}/watch","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.drive","resource_name":"drive.files.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/files/{folderId}/children","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/children)$","service_name":"google.drive","resource_name":"drive.children.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v2/teamdrives","path_regex":"^(?:/drive/v2/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/changes/watch","path_regex":"^(?:/drive/v3/changes/watch)$","service_name":"google.drive","resource_name":"drive.changes.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/channels/stop","path_regex":"^(?:/drive/v3/channels/stop)$","service_name":"google.drive","resource_name":"drive.channels.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/drives","path_regex":"^(?:/drive/v3/drives)$","service_name":"google.drive","resource_name":"drive.drives.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/drives/{driveId}/hide","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/hide)$","service_name":"google.drive","resource_name":"drive.drives.hide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/drives/{driveId}/unhide","path_regex":"^(?:/drive/v3/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/unhide)$","service_name":"google.drive","resource_name":"drive.drives.unhide"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files","path_regex":"^(?:/drive/v3/files)$","service_name":"google.drive","resource_name":"drive.files.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/comments","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments)$","service_name":"google.drive","resource_name":"drive.comments.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/comments/{commentId}/replies","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies)$","service_name":"google.drive","resource_name":"drive.replies.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/copy","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.drive","resource_name":"drive.files.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/modifyLabels","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/modifyLabels)$","service_name":"google.drive","resource_name":"drive.files.modifyLabels"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/permissions","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions)$","service_name":"google.drive","resource_name":"drive.permissions.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/files/{fileId}/watch","path_regex":"^(?:/drive/v3/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/watch)$","service_name":"google.drive","resource_name":"drive.files.watch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/drive/v3/teamdrives","path_regex":"^(?:/drive/v3/teamdrives)$","service_name":"google.drive","resource_name":"drive.teamdrives.create"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/query","path_regex":"^(?:/fusiontables/v1/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sql"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables","path_regex":"^(?:/fusiontables/v1/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/import","path_regex":"^(?:/fusiontables/v1/tables/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importTable"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/copy","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/import","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importRows"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v1/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/query","path_regex":"^(?:/fusiontables/v2/query)$","service_name":"google.fusiontables","resource_name":"fusiontables.query.sql"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables","path_regex":"^(?:/fusiontables/v2/tables)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/import","path_regex":"^(?:/fusiontables/v2/tables/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importTable"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/columns","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns)$","service_name":"google.fusiontables","resource_name":"fusiontables.column.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/copy","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/copy)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.copy"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/import","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/import)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.importRows"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/refetch","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/refetch)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.refetchSheet"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/replace","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replace)$","service_name":"google.fusiontables","resource_name":"fusiontables.table.replaceRows"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/styles","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles)$","service_name":"google.fusiontables","resource_name":"fusiontables.style.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/fusiontables/v2/tables/{tableId}/templates","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates)$","service_name":"google.fusiontables","resource_name":"fusiontables.template.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/createAuthUri","path_regex":"^(?:/identitytoolkit/v3/relyingparty/createAuthUri)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.createAuthUri"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/deleteAccount","path_regex":"^(?:/identitytoolkit/v3/relyingparty/deleteAccount)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.deleteAccount"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/downloadAccount","path_regex":"^(?:/identitytoolkit/v3/relyingparty/downloadAccount)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.downloadAccount"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/emailLinkSignin","path_regex":"^(?:/identitytoolkit/v3/relyingparty/emailLinkSignin)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.emailLinkSignin"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/getAccountInfo","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getAccountInfo)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getAccountInfo"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/getOobConfirmationCode","path_regex":"^(?:/identitytoolkit/v3/relyingparty/getOobConfirmationCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.getOobConfirmationCode"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/resetPassword","path_regex":"^(?:/identitytoolkit/v3/relyingparty/resetPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.resetPassword"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/sendVerificationCode","path_regex":"^(?:/identitytoolkit/v3/relyingparty/sendVerificationCode)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.sendVerificationCode"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/setAccountInfo","path_regex":"^(?:/identitytoolkit/v3/relyingparty/setAccountInfo)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.setAccountInfo"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/setProjectConfig","path_regex":"^(?:/identitytoolkit/v3/relyingparty/setProjectConfig)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.setProjectConfig"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/signOutUser","path_regex":"^(?:/identitytoolkit/v3/relyingparty/signOutUser)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.signOutUser"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/signupNewUser","path_regex":"^(?:/identitytoolkit/v3/relyingparty/signupNewUser)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.signupNewUser"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/uploadAccount","path_regex":"^(?:/identitytoolkit/v3/relyingparty/uploadAccount)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.uploadAccount"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyAssertion","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyAssertion)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyAssertion"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyCustomToken","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyCustomToken)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyCustomToken"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyPassword","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyPassword)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyPassword"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/identitytoolkit/v3/relyingparty/verifyPhoneNumber","path_regex":"^(?:/identitytoolkit/v3/relyingparty/verifyPhoneNumber)$","service_name":"google.identitytoolkit","resource_name":"identitytoolkit.relyingparty.verifyPhoneNumber"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/accounts/{userToken}/{accountType}/{accountName}","path_regex":"^(?:/mirror/v1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.accounts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/contacts","path_regex":"^(?:/mirror/v1/contacts)$","service_name":"google.mirror","resource_name":"mirror.contacts.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/subscriptions","path_regex":"^(?:/mirror/v1/subscriptions)$","service_name":"google.mirror","resource_name":"mirror.subscriptions.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/timeline","path_regex":"^(?:/mirror/v1/timeline)$","service_name":"google.mirror","resource_name":"mirror.timeline.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/mirror/v1/timeline/{itemId}/attachments","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/attachments)$","service_name":"google.mirror","resource_name":"mirror.timeline.attachments.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/plusDomains/v1/people/{userId}/media/{collection}","path_regex":"^(?:/plusDomains/v1/people/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.plusDomains","resource_name":"plusDomains.media.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/qpxExpress/v1/trips/search","path_regex":"^(?:/qpxExpress/v1/trips/search)$","service_name":"google.qpxExpress","resource_name":"qpxExpress.trips.search"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools)$","service_name":"google.replicapool","resource_name":"replicapool.pools.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.pools.delete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.replicapool","resource_name":"replicapool.replicas.delete"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/replicas/{replicaName}/restart","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replicas/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/restart)$","service_name":"google.replicapool","resource_name":"replicapool.replicas.restart"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/resize","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resize)$","service_name":"google.replicapool","resource_name":"replicapool.pools.resize"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapool/v1beta1/projects/{projectName}/zones/{zone}/pools/{poolName}/updateTemplate","path_regex":"^(?:/replicapool/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pools/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/updateTemplate)$","service_name":"google.replicapool","resource_name":"replicapool.pools.updatetemplate"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/cancel","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/cancel)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.cancel"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/pause","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pause)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.pause"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/resume","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/resume)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.resume"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/replicapoolupdater/v1beta1/projects/{project}/zones/{zone}/rollingUpdates/{rollingUpdate}/rollback","path_regex":"^(?:/replicapoolupdater/v1beta1/projects/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/zones/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollingUpdates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/rollback)$","service_name":"google.replicapoolupdater","resource_name":"replicapoolupdater.rollingUpdates.rollback"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/siteVerification/v1/token","path_regex":"^(?:/siteVerification/v1/token)$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.getToken"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/siteVerification/v1/webResource","path_regex":"^(?:/siteVerification/v1/webResource)$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/getSpectrum","path_regex":"^(?:/spectrum/v1explorer/paws/getSpectrum)$","service_name":"google.spectrum","resource_name":"spectrum.paws.getSpectrum"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/getSpectrumBatch","path_regex":"^(?:/spectrum/v1explorer/paws/getSpectrumBatch)$","service_name":"google.spectrum","resource_name":"spectrum.paws.getSpectrumBatch"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/init","path_regex":"^(?:/spectrum/v1explorer/paws/init)$","service_name":"google.spectrum","resource_name":"spectrum.paws.init"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/notifySpectrumUse","path_regex":"^(?:/spectrum/v1explorer/paws/notifySpectrumUse)$","service_name":"google.spectrum","resource_name":"spectrum.paws.notifySpectrumUse"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/register","path_regex":"^(?:/spectrum/v1explorer/paws/register)$","service_name":"google.spectrum","resource_name":"spectrum.paws.register"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/spectrum/v1explorer/paws/verifyDevice","path_regex":"^(?:/spectrum/v1explorer/paws/verifyDevice)$","service_name":"google.spectrum","resource_name":"spectrum.paws.verifyDevice"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b","path_regex":"^(?:/storage/v1beta1/b)$","service_name":"google.storage","resource_name":"storage.buckets.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b/{bucket}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b/{bucket}/o","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o)$","service_name":"google.storage","resource_name":"storage.objects.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl)$","service_name":"google.storage","resource_name":"storage.objectAccessControls.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/surveys/v2/surveys","path_regex":"^(?:/surveys/v2/surveys)$","service_name":"google.surveys","resource_name":"surveys.surveys.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/surveys/v2/surveys/{resourceId}/start","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/start)$","service_name":"google.surveys","resource_name":"surveys.surveys.start"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/surveys/v2/surveys/{resourceId}/stop","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/stop)$","service_name":"google.surveys","resource_name":"surveys.surveys.stop"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/urlshortener/v1/url","path_regex":"^(?:/urlshortener/v1/url)$","service_name":"google.urlshortener","resource_name":"urlshortener.url.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/webmasters/v3/sites/{siteUrl}/searchAnalytics/query","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/searchAnalytics/query)$","service_name":"google.webmasters","resource_name":"webmasters.searchanalytics.query"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/youtube/analytics/v1beta1/groupItems","path_regex":"^(?:/youtube/analytics/v1beta1/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.insert"},{"hostname":"www.googleapis.com","http_method":"POST","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.insert"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.2/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.2/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.3/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.3/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.3/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.3/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.3/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/accounts/{id}","path_regex":"^(?:/adexchangebuyer/v1\\.4/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/billinginfo/{accountId}/{billingId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/billinginfo/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.budget.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/pretargetingconfigs/{accountId}/{configId}","path_regex":"^(?:/adexchangebuyer/v1\\.4/pretargetingconfigs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.pretargetingConfig.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adexchangebuyer/v1.4/proposals/{proposalId}/{revisionNumber}/{updateAction}","path_regex":"^(?:/adexchangebuyer/v1\\.4/proposals/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.adexchangebuyer","resource_name":"adexchangebuyer.proposals.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adsensehost/v4.1/accounts/{accountId}/adclients/{adClientId}/adunits","path_regex":"^(?:/adsensehost/v4\\.1/accounts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/adunits)$","service_name":"google.adsensehost","resource_name":"adsensehost.accounts.adunits.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/adsensehost/v4.1/adclients/{adClientId}/customchannels","path_regex":"^(?:/adsensehost/v4\\.1/adclients/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/customchannels)$","service_name":"google.adsensehost","resource_name":"adsensehost.customchannels.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/appstate/v1/states/{stateKey}","path_regex":"^(?:/appstate/v1/states/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.appstate","resource_name":"appstate.states.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/blogger/v3/blogs/{blogId}/pages/{pageId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/pages/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.pages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/blogger/v3/blogs/{blogId}/posts/{postId}","path_regex":"^(?:/blogger/v3/blogs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/posts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.blogger","resource_name":"blogger.posts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/calendars/{calendarId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendars.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/calendars/{calendarId}/acl/{ruleId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.acl.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/calendars/{calendarId}/events/{eventId}","path_regex":"^(?:/calendar/v3/calendars/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/events/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.events.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/calendar/v3/users/me/calendarList/{calendarId}","path_regex":"^(?:/calendar/v3/users/me/calendarList/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.calendar","resource_name":"calendar.calendarList.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/consumersurveys/v2/mobileAppPanels/{panelId}","path_regex":"^(?:/consumersurveys/v2/mobileAppPanels/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.mobileapppanels.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/consumersurveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/consumersurveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.consumersurveys","resource_name":"consumersurveys.surveys.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/campaigns/{campaignId}/landingPages","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/landingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.landingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v2.7/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v2\\.7/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.0/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.0/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.1/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.1/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accountUserProfiles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accountUserProfiles)$","service_name":"google.dfareporting","resource_name":"dfareporting.accountUserProfiles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/accounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/accounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.accounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/ads","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/ads)$","service_name":"google.dfareporting","resource_name":"dfareporting.ads.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertiserLandingPages","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertiserLandingPages)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertiserLandingPages.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/advertisers","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/advertisers)$","service_name":"google.dfareporting","resource_name":"dfareporting.advertisers.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/campaigns","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/campaigns)$","service_name":"google.dfareporting","resource_name":"dfareporting.campaigns.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/contentCategories","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/contentCategories)$","service_name":"google.dfareporting","resource_name":"dfareporting.contentCategories.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFields.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeFields/{creativeFieldId}/creativeFieldValues","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFields/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeFieldValues)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeFieldValues.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creativeGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creativeGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.creativeGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/creatives","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/creatives)$","service_name":"google.dfareporting","resource_name":"dfareporting.creatives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/eventTags","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/eventTags)$","service_name":"google.dfareporting","resource_name":"dfareporting.eventTags.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivities","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivities)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivities.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightActivityGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightActivityGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightActivityGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/floodlightConfigurations","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/floodlightConfigurations)$","service_name":"google.dfareporting","resource_name":"dfareporting.floodlightConfigurations.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementGroups","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementGroups)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementGroups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placementStrategies","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placementStrategies)$","service_name":"google.dfareporting","resource_name":"dfareporting.placementStrategies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/placements","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/placements)$","service_name":"google.dfareporting","resource_name":"dfareporting.placements.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingListShares","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingListShares)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingListShares.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/remarketingLists","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/remarketingLists)$","service_name":"google.dfareporting","resource_name":"dfareporting.remarketingLists.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/reports/{reportId}","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.dfareporting","resource_name":"dfareporting.reports.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/sites","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sites)$","service_name":"google.dfareporting","resource_name":"dfareporting.sites.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/subaccounts","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/subaccounts)$","service_name":"google.dfareporting","resource_name":"dfareporting.subaccounts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/targetingTemplates","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/targetingTemplates)$","service_name":"google.dfareporting","resource_name":"dfareporting.targetingTemplates.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/dfareporting/v3.2/userprofiles/{profileId}/userRoles","path_regex":"^(?:/dfareporting/v3\\.2/userprofiles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/userRoles)$","service_name":"google.dfareporting","resource_name":"dfareporting.userRoles.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/drives/{driveId}","path_regex":"^(?:/drive/v2/drives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.drives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.files.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/comments/{commentId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.comments.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/comments/{commentId}/replies/{replyId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/comments/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/replies/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.replies.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/permissions/{permissionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/permissions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.permissions.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/properties/{propertyKey}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/properties/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.properties.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/files/{fileId}/revisions/{revisionId}","path_regex":"^(?:/drive/v2/files/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/revisions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.revisions.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/drive/v2/teamdrives/{teamDriveId}","path_regex":"^(?:/drive/v2/teamdrives/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.drive","resource_name":"drive.teamdrives.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v1/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v1/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.table.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}/columns/{columnId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/columns/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.column.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}/styles/{styleId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/styles/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.style.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/fusiontables/v2/tables/{tableId}/templates/{templateId}","path_regex":"^(?:/fusiontables/v2/tables/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/templates/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.fusiontables","resource_name":"fusiontables.template.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/groups/v1/groups/{groupUniqueId}","path_regex":"^(?:/groups/v1/groups/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.groupssettings","resource_name":"groupsSettings.groups.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/mirror/v1/contacts/{id}","path_regex":"^(?:/mirror/v1/contacts/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.contacts.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/mirror/v1/subscriptions/{id}","path_regex":"^(?:/mirror/v1/subscriptions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.subscriptions.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/mirror/v1/timeline/{id}","path_regex":"^(?:/mirror/v1/timeline/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.mirror","resource_name":"mirror.timeline.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/siteVerification/v1/webResource/{id}","path_regex":"^(?:/siteVerification/v1/webResource/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.siteVerification","resource_name":"siteVerification.webResource.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.buckets.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.bucketAccessControls.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}/o/{object}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objects.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/storage/v1beta1/b/{bucket}/o/{object}/acl/{entity}","path_regex":"^(?:/storage/v1beta1/b/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/o/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/acl/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.storage","resource_name":"storage.objectAccessControls.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/surveys/v2/surveys/{surveyUrlId}","path_regex":"^(?:/surveys/v2/surveys/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.surveys","resource_name":"surveys.surveys.update"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sites.add"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/webmasters/v3/sites/{siteUrl}/sitemaps/{feedpath}","path_regex":"^(?:/webmasters/v3/sites/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/sitemaps/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.webmasters","resource_name":"webmasters.sitemaps.submit"},{"hostname":"www.googleapis.com","http_method":"PUT","path_template":"/youtube/analytics/v1beta1/groups","path_regex":"^(?:/youtube/analytics/v1beta1/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.update"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveChat/bans","path_regex":"^(?:/youtube/v3/liveChat/bans)$","service_name":"google.youtube","resource_name":"youtube.liveChatBans.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveChat/messages","path_regex":"^(?:/youtube/v3/liveChat/messages)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveChat/moderators","path_regex":"^(?:/youtube/v3/liveChat/moderators)$","service_name":"google.youtube","resource_name":"youtube.liveChatModerators.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/playlistImages","path_regex":"^(?:/youtube/v3/playlistImages)$","service_name":"google.youtube","resource_name":"youtube.playlistImages.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/subscriptions","path_regex":"^(?:/youtube/v3/subscriptions)$","service_name":"google.youtube","resource_name":"youtube.subscriptions.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.delete"},{"hostname":"youtube.googleapis.com","http_method":"DELETE","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.delete"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/activities","path_regex":"^(?:/youtube/v3/activities)$","service_name":"google.youtube","resource_name":"youtube.activities.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/captions/{id}","path_regex":"^(?:/youtube/v3/captions/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtube","resource_name":"youtube.captions.download"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/channels","path_regex":"^(?:/youtube/v3/channels)$","service_name":"google.youtube","resource_name":"youtube.channels.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/commentThreads","path_regex":"^(?:/youtube/v3/commentThreads)$","service_name":"google.youtube","resource_name":"youtube.commentThreads.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/i18nLanguages","path_regex":"^(?:/youtube/v3/i18nLanguages)$","service_name":"google.youtube","resource_name":"youtube.i18nLanguages.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/i18nRegions","path_regex":"^(?:/youtube/v3/i18nRegions)$","service_name":"google.youtube","resource_name":"youtube.i18nRegions.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveChat/messages","path_regex":"^(?:/youtube/v3/liveChat/messages)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveChat/moderators","path_regex":"^(?:/youtube/v3/liveChat/moderators)$","service_name":"google.youtube","resource_name":"youtube.liveChatModerators.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/members","path_regex":"^(?:/youtube/v3/members)$","service_name":"google.youtube","resource_name":"youtube.members.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/membershipsLevels","path_regex":"^(?:/youtube/v3/membershipsLevels)$","service_name":"google.youtube","resource_name":"youtube.membershipsLevels.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/playlistImages","path_regex":"^(?:/youtube/v3/playlistImages)$","service_name":"google.youtube","resource_name":"youtube.playlistImages.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/search","path_regex":"^(?:/youtube/v3/search)$","service_name":"google.youtube","resource_name":"youtube.search.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/subscriptions","path_regex":"^(?:/youtube/v3/subscriptions)$","service_name":"google.youtube","resource_name":"youtube.subscriptions.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/superChatEvents","path_regex":"^(?:/youtube/v3/superChatEvents)$","service_name":"google.youtube","resource_name":"youtube.superChatEvents.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videoAbuseReportReasons","path_regex":"^(?:/youtube/v3/videoAbuseReportReasons)$","service_name":"google.youtube","resource_name":"youtube.videoAbuseReportReasons.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videoCategories","path_regex":"^(?:/youtube/v3/videoCategories)$","service_name":"google.youtube","resource_name":"youtube.videoCategories.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.list"},{"hostname":"youtube.googleapis.com","http_method":"GET","path_template":"/youtube/v3/videos/getRating","path_regex":"^(?:/youtube/v3/videos/getRating)$","service_name":"google.youtube","resource_name":"youtube.videos.getRating"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/abuseReports","path_regex":"^(?:/youtube/v3/abuseReports)$","service_name":"google.youtube","resource_name":"youtube.abuseReports.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/channelBanners/insert","path_regex":"^(?:/youtube/v3/channelBanners/insert)$","service_name":"google.youtube","resource_name":"youtube.channelBanners.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/commentThreads","path_regex":"^(?:/youtube/v3/commentThreads)$","service_name":"google.youtube","resource_name":"youtube.commentThreads.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/comments/markAsSpam","path_regex":"^(?:/youtube/v3/comments/markAsSpam)$","service_name":"google.youtube","resource_name":"youtube.comments.markAsSpam"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/comments/setModerationStatus","path_regex":"^(?:/youtube/v3/comments/setModerationStatus)$","service_name":"google.youtube","resource_name":"youtube.comments.setModerationStatus"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts/bind","path_regex":"^(?:/youtube/v3/liveBroadcasts/bind)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.bind"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts/cuepoint","path_regex":"^(?:/youtube/v3/liveBroadcasts/cuepoint)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.insertCuepoint"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveBroadcasts/transition","path_regex":"^(?:/youtube/v3/liveBroadcasts/transition)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.transition"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/bans","path_regex":"^(?:/youtube/v3/liveChat/bans)$","service_name":"google.youtube","resource_name":"youtube.liveChatBans.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/messages","path_regex":"^(?:/youtube/v3/liveChat/messages)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/messages/transition","path_regex":"^(?:/youtube/v3/liveChat/messages/transition)$","service_name":"google.youtube","resource_name":"youtube.liveChatMessages.transition"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveChat/moderators","path_regex":"^(?:/youtube/v3/liveChat/moderators)$","service_name":"google.youtube","resource_name":"youtube.liveChatModerators.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/playlistImages","path_regex":"^(?:/youtube/v3/playlistImages)$","service_name":"google.youtube","resource_name":"youtube.playlistImages.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/subscriptions","path_regex":"^(?:/youtube/v3/subscriptions)$","service_name":"google.youtube","resource_name":"youtube.subscriptions.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/tests","path_regex":"^(?:/youtube/v3/tests)$","service_name":"google.youtube","resource_name":"youtube.tests.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/thumbnails/set","path_regex":"^(?:/youtube/v3/thumbnails/set)$","service_name":"google.youtube","resource_name":"youtube.thumbnails.set"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.insert"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/videos/rate","path_regex":"^(?:/youtube/v3/videos/rate)$","service_name":"google.youtube","resource_name":"youtube.videos.rate"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/videos/reportAbuse","path_regex":"^(?:/youtube/v3/videos/reportAbuse)$","service_name":"google.youtube","resource_name":"youtube.videos.reportAbuse"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/watermarks/set","path_regex":"^(?:/youtube/v3/watermarks/set)$","service_name":"google.youtube","resource_name":"youtube.watermarks.set"},{"hostname":"youtube.googleapis.com","http_method":"POST","path_template":"/youtube/v3/watermarks/unset","path_regex":"^(?:/youtube/v3/watermarks/unset)$","service_name":"google.youtube","resource_name":"youtube.watermarks.unset"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/captions","path_regex":"^(?:/youtube/v3/captions)$","service_name":"google.youtube","resource_name":"youtube.captions.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/channelSections","path_regex":"^(?:/youtube/v3/channelSections)$","service_name":"google.youtube","resource_name":"youtube.channelSections.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/channels","path_regex":"^(?:/youtube/v3/channels)$","service_name":"google.youtube","resource_name":"youtube.channels.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/commentThreads","path_regex":"^(?:/youtube/v3/commentThreads)$","service_name":"google.youtube","resource_name":"youtube.youtube.v3.updateCommentThreads"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/comments","path_regex":"^(?:/youtube/v3/comments)$","service_name":"google.youtube","resource_name":"youtube.comments.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/liveBroadcasts","path_regex":"^(?:/youtube/v3/liveBroadcasts)$","service_name":"google.youtube","resource_name":"youtube.liveBroadcasts.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/liveStreams","path_regex":"^(?:/youtube/v3/liveStreams)$","service_name":"google.youtube","resource_name":"youtube.liveStreams.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/playlistImages","path_regex":"^(?:/youtube/v3/playlistImages)$","service_name":"google.youtube","resource_name":"youtube.playlistImages.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/playlistItems","path_regex":"^(?:/youtube/v3/playlistItems)$","service_name":"google.youtube","resource_name":"youtube.playlistItems.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/playlists","path_regex":"^(?:/youtube/v3/playlists)$","service_name":"google.youtube","resource_name":"youtube.playlists.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/thirdPartyLinks","path_regex":"^(?:/youtube/v3/thirdPartyLinks)$","service_name":"google.youtube","resource_name":"youtube.thirdPartyLinks.update"},{"hostname":"youtube.googleapis.com","http_method":"PUT","path_template":"/youtube/v3/videos","path_regex":"^(?:/youtube/v3/videos)$","service_name":"google.youtube","resource_name":"youtube.videos.update"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"DELETE","path_template":"/v2/groupItems","path_regex":"^(?:/v2/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.delete"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"DELETE","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.delete"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"GET","path_template":"/v2/groupItems","path_regex":"^(?:/v2/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.list"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"GET","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.list"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"GET","path_template":"/v2/reports","path_regex":"^(?:/v2/reports)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.reports.query"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"POST","path_template":"/v2/groupItems","path_regex":"^(?:/v2/groupItems)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groupItems.insert"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"POST","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.insert"},{"hostname":"youtubeanalytics.googleapis.com","http_method":"PUT","path_template":"/v2/groups","path_regex":"^(?:/v2/groups)$","service_name":"google.youtubeAnalytics","resource_name":"youtubeAnalytics.groups.update"},{"hostname":"youtubereporting.googleapis.com","http_method":"DELETE","path_template":"/v1/jobs/{jobId}","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.delete"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs","path_regex":"^(?:/v1/jobs)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.list"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs/{jobId}","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.get"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs/{jobId}/reports","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.reports.list"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/jobs/{jobId}/reports/{reportId}","path_regex":"^(?:/v1/jobs/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?(?:/reports/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.reports.get"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/media/{mediaId}","path_regex":"^(?:/v1/media/)((?:(?:[\\x2c\\x2d\\x2e\\x30-\\x39\\x41-\\x5a\\x5f\\x61-\\x7a\\x7e]|%[[:xdigit:]][[:xdigit:]])*))?$","service_name":"google.youtubereporting","resource_name":"youtubereporting.media.download"},{"hostname":"youtubereporting.googleapis.com","http_method":"GET","path_template":"/v1/reportTypes","path_regex":"^(?:/v1/reportTypes)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.reportTypes.list"},{"hostname":"youtubereporting.googleapis.com","http_method":"POST","path_template":"/v1/jobs","path_regex":"^(?:/v1/jobs)$","service_name":"google.youtubereporting","resource_name":"youtubereporting.jobs.create"}] \ No newline at end of file diff --git a/contrib/google.golang.org/api/go.mod b/contrib/google.golang.org/api/go.mod new file mode 100644 index 0000000000..4664a4ed61 --- /dev/null +++ b/contrib/google.golang.org/api/go.mod @@ -0,0 +1,106 @@ +module github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + golang.org/x/oauth2 v0.30.0 + google.golang.org/api v0.169.0 +) + +require ( + cloud.google.com/go/compute/metadata v0.7.0 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/s2a-go v0.1.7 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/googleapis/gax-go/v2 v2.12.2 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/google.golang.org/api/go.sum b/contrib/google.golang.org/api/go.sum new file mode 100644 index 0000000000..02e7d2dbdf --- /dev/null +++ b/contrib/google.golang.org/api/go.sum @@ -0,0 +1,401 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= +github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= +github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/gax-go/v2 v2.12.2 h1:mhN09QQW1jEWeMF74zGR81R30z4VJzjZsfkUhuHF+DA= +github.com/googleapis/gax-go/v2 v2.12.2/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.169.0 h1:QwWPy71FgMWqJN/l6jVlFHUa29a7dcUy02I8o799nPY= +google.golang.org/api v0.169.0/go.mod h1:gpNOiMA2tZ4mf5R9Iwf4rK/Dcz0fbdIgWYWVoxmsyLg= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20240205150955-31a09d347014 h1:g/4bk7P6TPMkAUbUhquq98xey1slwvuVJPosdBqYJlU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/google.golang.org/api/internal/gen_endpoints/go.mod b/contrib/google.golang.org/api/internal/gen_endpoints/go.mod index 67c11ce916..b6fd961c2d 100644 --- a/contrib/google.golang.org/api/internal/gen_endpoints/go.mod +++ b/contrib/google.golang.org/api/internal/gen_endpoints/go.mod @@ -1,5 +1,5 @@ -module github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/internal/gen_endpoints +module github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/internal/gen_endpoints/v2 -go 1.20 +go 1.24.0 require github.com/yosida95/uritemplate/v3 v3.0.2 diff --git a/contrib/google.golang.org/api/internal/gen_endpoints/main.go b/contrib/google.golang.org/api/internal/gen_endpoints/main.go index 148761d009..447e092e89 100644 --- a/contrib/google.golang.org/api/internal/gen_endpoints/main.go +++ b/contrib/google.golang.org/api/internal/gen_endpoints/main.go @@ -14,7 +14,6 @@ import ( "encoding/json" "flag" "fmt" - "github.com/yosida95/uritemplate/v3" "io" "log" "net/http" @@ -24,11 +23,13 @@ import ( "path/filepath" "sort" "strings" + + "github.com/yosida95/uritemplate/v3" ) const ( // The github.com/googleapis/google-api-go-client version to use. - version = "v0.121.0" + version = "v0.192.0" ) var ( @@ -195,6 +196,7 @@ func downloadGoogleAPISrc() (string, error) { log.Printf("Downloading %s into %s...\n", zipURL, dst) out, err := os.Create(zipFile) + assertNoError(err) defer out.Close() resp, err := http.Get(zipURL) assertNoError(err) diff --git a/contrib/google.golang.org/api/internal/tree/tree.go b/contrib/google.golang.org/api/internal/tree/tree.go index c6536b3e57..98e9967c11 100644 --- a/contrib/google.golang.org/api/internal/tree/tree.go +++ b/contrib/google.golang.org/api/internal/tree/tree.go @@ -9,9 +9,15 @@ import ( "regexp" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageGoogleAPI) +} + type ( // A Tree is a prefix tree for matching endpoints based on http requests. Tree struct { @@ -87,7 +93,7 @@ func (t *Tree) Get(hostname string, httpMethod string, httpPath string) (*Endpoi if e.pathMatcher == nil { pathMatcher, err := regexp.Compile(e.PathRegex) if err != nil { - log.Warn("contrib/google.golang.org/api: failed to create regex: %s: %v", e.PathRegex, err) + instr.Logger().Warn("contrib/google.golang.org/api: failed to create regex: %s: %v", e.PathRegex, err) continue } e.pathMatcher = pathMatcher diff --git a/contrib/google.golang.org/api/option.go b/contrib/google.golang.org/api/option.go index d11c4e81cb..7a8e8a5d07 100644 --- a/contrib/google.golang.org/api/option.go +++ b/contrib/google.golang.org/api/option.go @@ -8,8 +8,6 @@ package api import ( "context" "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" ) type config struct { @@ -21,50 +19,54 @@ type config struct { } func newConfig(options ...Option) *config { - rate := math.NaN() - if internal.BoolEnv("DD_TRACE_GOOGLE_API_ANALYTICS_ENABLED", false) { - rate = 1.0 - } cfg := &config{ - ctx: context.Background(), - // analyticsRate: globalconfig.AnalyticsRate(), - analyticsRate: rate, + ctx: context.Background(), + analyticsRate: instr.AnalyticsRate(false), endpointMetadataDisabled: false, } for _, opt := range options { - opt(cfg) + opt.apply(cfg) } return cfg } -// An Option customizes the config. -type Option func(*config) +// Option describes options for the Google API integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to NewClient and WrapRoundTripper. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} // WithContext sets the context in the config. This can be used to set span // parents or pass a context through to the underlying client constructor. -func WithContext(ctx context.Context) Option { +func WithContext(ctx context.Context) OptionFn { return func(cfg *config) { cfg.ctx = ctx } } // WithScopes sets the scopes used to create the oauth2 config for Google APIs. -func WithScopes(scopes ...string) Option { +func WithScopes(scopes ...string) OptionFn { return func(cfg *config) { cfg.scopes = scopes } } -// WithServiceName sets the service name in the config. The default service +// WithService sets the service name in the config. The default service // name is inferred from the API definitions based on the http request route. -func WithServiceName(serviceName string) Option { +func WithService(serviceName string) OptionFn { return func(cfg *config) { cfg.serviceName = serviceName } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -76,7 +78,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -89,7 +91,7 @@ func WithAnalyticsRate(rate float64) Option { // WithEndpointMetadataDisabled allows to disable the enriched Google endpoint metadata behavior for // this integration. Use this option if you are sensitive to changes in some span tags generated by this integration // that might happen when the used Google endpoint metadata gets regenerated in newer dd-trace-go versions. -func WithEndpointMetadataDisabled() Option { +func WithEndpointMetadataDisabled() OptionFn { return func(cfg *config) { cfg.endpointMetadataDisabled = true } diff --git a/contrib/google.golang.org/grpc/appsec.go b/contrib/google.golang.org/grpc/appsec.go index f7b4aecf53..770b222eec 100644 --- a/contrib/google.golang.org/grpc/appsec.go +++ b/contrib/google.golang.org/grpc/appsec.go @@ -9,15 +9,15 @@ import ( "context" "sync/atomic" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" "google.golang.org/grpc/status" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/grpcsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/actions" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/grpcsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/actions" ) func applyAction(blockAtomic *atomic.Pointer[actions.BlockGRPC], err *error) bool { @@ -36,7 +36,7 @@ func applyAction(blockAtomic *atomic.Pointer[actions.BlockGRPC], err *error) boo } // UnaryHandler wrapper to use when AppSec is enabled to monitor its execution. -func appsecUnaryHandlerMiddleware(method string, span ddtrace.Span, handler grpc.UnaryHandler) grpc.UnaryHandler { +func appsecUnaryHandlerMiddleware(method string, span *tracer.Span, handler grpc.UnaryHandler) grpc.UnaryHandler { return func(ctx context.Context, req any) (res any, rpcErr error) { md, _ := metadata.FromIncomingContext(ctx) var remoteAddr string @@ -44,7 +44,7 @@ func appsecUnaryHandlerMiddleware(method string, span ddtrace.Span, handler grpc remoteAddr = p.Addr.String() } - ctx, op, blockAtomic := grpcsec.StartHandlerOperation(ctx, grpcsec.HandlerOperationArgs{ + ctx, op, blockAtomic := grpcsec.StartHandlerOperation(ctx, span, grpcsec.HandlerOperationArgs{ Method: method, Metadata: md, RemoteAddr: remoteAddr, @@ -55,7 +55,7 @@ func appsecUnaryHandlerMiddleware(method string, span ddtrace.Span, handler grpc if statusErr, ok := rpcErr.(interface{ GRPCStatus() *status.Status }); ok && !applyAction(blockAtomic, &rpcErr) { statusCode = int(statusErr.GRPCStatus().Code()) } - op.Finish(span, grpcsec.HandlerOperationRes{StatusCode: statusCode}) + op.Finish(grpcsec.HandlerOperationRes{StatusCode: statusCode}) applyAction(blockAtomic, &rpcErr) }() @@ -80,7 +80,7 @@ func appsecUnaryHandlerMiddleware(method string, span ddtrace.Span, handler grpc } // StreamHandler wrapper to use when AppSec is enabled to monitor its execution. -func appsecStreamHandlerMiddleware(method string, span ddtrace.Span, handler grpc.StreamHandler) grpc.StreamHandler { +func appsecStreamHandlerMiddleware(method string, span *tracer.Span, handler grpc.StreamHandler) grpc.StreamHandler { return func(srv any, stream grpc.ServerStream) (rpcErr error) { ctx := stream.Context() md, _ := metadata.FromIncomingContext(ctx) @@ -90,7 +90,7 @@ func appsecStreamHandlerMiddleware(method string, span ddtrace.Span, handler grp } // Create the handler operation and listen to blocking gRPC actions to detect a blocking condition - ctx, op, blockAtomic := grpcsec.StartHandlerOperation(ctx, grpcsec.HandlerOperationArgs{ + ctx, op, blockAtomic := grpcsec.StartHandlerOperation(ctx, span, grpcsec.HandlerOperationArgs{ Method: method, Metadata: md, RemoteAddr: remoteAddr, @@ -104,7 +104,7 @@ func appsecStreamHandlerMiddleware(method string, span ddtrace.Span, handler grp statusCode = int(res.Status()) } - op.Finish(span, grpcsec.HandlerOperationRes{StatusCode: statusCode}) + op.Finish(grpcsec.HandlerOperationRes{StatusCode: statusCode}) applyAction(blockAtomic, &rpcErr) }() diff --git a/contrib/google.golang.org/grpc/appsec_test.go b/contrib/google.golang.org/grpc/appsec_test.go index 9cce816b26..7a134ab947 100644 --- a/contrib/google.golang.org/grpc/appsec_test.go +++ b/contrib/google.golang.org/grpc/appsec_test.go @@ -11,11 +11,13 @@ import ( "fmt" "io" "net" + "strings" "testing" - pappsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2/fixturepb" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -27,13 +29,13 @@ import ( func TestAppSec(t *testing.T) { t.Setenv("DD_APPSEC_WAF_TIMEOUT", "1h") // Functionally unlimited - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { + testutils.StartAppSec(t) + + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } - setup := func(t *testing.T) (FixtureClient, mocktracer.Tracer, func()) { + setup := func(t *testing.T) (fixturepb.FixtureClient, mocktracer.Tracer, func()) { rig, err := newAppsecRig(t, false) require.NoError(t, err) @@ -51,7 +53,7 @@ func TestAppSec(t *testing.T) { // Send a XSS attack in the payload along with the canary value in the RPC metadata ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("dd-canary", "dd-test-scanner-log")) - res, err := client.Ping(ctx, &FixtureRequest{Name: ""}) + res, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: ""}) // Check that the handler was properly called require.NoError(t, err) require.Equal(t, "passed", res.Message) @@ -76,9 +78,8 @@ func TestAppSec(t *testing.T) { require.NoError(t, err) // Send a XSS attack - if err := stream.Send(&FixtureRequest{Name: ""}); err != io.EOF { - require.NoError(t, err) - } + err = stream.Send(&fixturepb.FixtureRequest{Name: ""}) + require.NoError(t, err) // Check that the handler was properly called res, err := stream.Recv() @@ -87,9 +88,8 @@ func TestAppSec(t *testing.T) { for i := 0; i < 5; i++ { // Fire multiple times, each time should result in a detected event // Send a SQLi attack - if err := stream.Send(&FixtureRequest{Name: fmt.Sprintf("-%[1]d' and %[1]d=%[1]d union select * from users--", i)}); err != io.EOF { - require.NoError(t, err) - } + err = stream.Send(&fixturepb.FixtureRequest{Name: fmt.Sprintf("-%[1]d' and %[1]d=%[1]d union select * from users--", i)}) + require.NoError(t, err) // Check that the handler was properly called res, err = stream.Recv() @@ -137,13 +137,104 @@ func TestAppSec(t *testing.T) { // Test that http blocking works by using custom rules/rules data func TestBlocking(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/blocking.json") - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (fixturepb.FixtureClient, mocktracer.Tracer, func()) { + rig, err := newRig(false) + require.NoError(t, err) + + mt := mocktracer.Start() + + return rig.client, mt, func() { + rig.Close() + mt.Stop() + } + } + + t.Run("unary-block", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + // Send a XSS attack in the payload along with the canary value in the RPC metadata + ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("dd-canary", "dd-test-scanner-log", "x-client-ip", "1.2.3.4")) + reply, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: ""}) + + require.Nil(t, reply) + require.Equal(t, codes.Aborted, status.Code(err)) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + // The request should have the attack attempts + event, _ := finished[0].Tag("_dd.appsec.json").(string) + require.NotNil(t, event) + require.True(t, strings.Contains(event, "blk-001-001")) + }) + + t.Run("unary-no-block", func(t *testing.T) { + client, _, cleanup := setup() + defer cleanup() + + // Send a XSS attack in the payload along with the canary value in the RPC metadata + ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("dd-canary", "dd-test-scanner-log", "x-client-ip", "1.2.3.5")) + reply, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: ""}) + + require.Equal(t, "passed", reply.Message) + require.Equal(t, codes.OK, status.Code(err)) + }) + + t.Run("stream-block", func(t *testing.T) { + client, mt, cleanup := setup() + defer cleanup() + + ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("dd-canary", "dd-test-scanner-log", "x-client-ip", "1.2.3.4")) + stream, err := client.StreamPing(ctx) + require.NoError(t, err) + reply, err := stream.Recv() + + require.Equal(t, codes.Aborted, status.Code(err)) + require.Nil(t, reply) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + // The request should have the attack attempts + event, _ := finished[0].Tag("_dd.appsec.json").(string) + require.NotNil(t, event) + require.True(t, strings.Contains(event, "blk-001-001")) + }) + + t.Run("stream-no-block", func(t *testing.T) { + client, _, cleanup := setup() + defer cleanup() + + ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("dd-canary", "dd-test-scanner-log", "x-client-ip", "1.2.3.5")) + stream, err := client.StreamPing(ctx) + require.NoError(t, err) + + // Send a XSS attack + err = stream.Send(&fixturepb.FixtureRequest{Name: ""}) + require.NoError(t, err) + reply, err := stream.Recv() + require.Equal(t, codes.OK, status.Code(err)) + require.Equal(t, "passed", reply.Message) + + err = stream.CloseSend() + require.NoError(t, err) + }) + +} + +// Test that user blocking works by using custom rules/rules data +func TestUserBlocking(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/blocking.json") + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } - setup := func() (FixtureClient, mocktracer.Tracer, func()) { + setup := func() (fixturepb.FixtureClient, mocktracer.Tracer, func()) { rig, err := newAppsecRig(t, false) require.NoError(t, err) @@ -188,7 +279,7 @@ func TestBlocking(t *testing.T) { } { t.Run(tc.name, func(t *testing.T) { // Helper assertion function to run for the unary and stream tests - withClient := func(t *testing.T, do func(client FixtureClient)) { + withClient := func(t *testing.T, do func(client fixturepb.FixtureClient)) { client, mt, cleanup := setup() defer cleanup() @@ -209,16 +300,16 @@ func TestBlocking(t *testing.T) { } t.Run("unary", func(t *testing.T) { - withClient(t, func(client FixtureClient) { + withClient(t, func(client fixturepb.FixtureClient) { ctx := metadata.NewOutgoingContext(context.Background(), tc.md) - reply, err := client.Ping(ctx, &FixtureRequest{Name: tc.message}) + reply, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: tc.message}) require.Nil(t, reply) require.Equal(t, codes.Aborted, status.Code(err)) }) }) t.Run("stream", func(t *testing.T) { - withClient(t, func(client FixtureClient) { + withClient(t, func(client fixturepb.FixtureClient) { ctx := metadata.NewOutgoingContext(context.Background(), tc.md) // Open the stream @@ -227,7 +318,7 @@ func TestBlocking(t *testing.T) { defer func() { assert.NoError(t, stream.CloseSend()) }() // Send a message - if err := stream.Send(&FixtureRequest{Name: tc.message}); err != io.EOF { + if err := stream.Send(&fixturepb.FixtureRequest{Name: tc.message}); err != io.EOF { require.NoError(t, err) } @@ -247,13 +338,12 @@ func TestPasslist(t *testing.T) { // but only one of them is passlisted (custom-1 is passlisted, custom-2 is not and must trigger). t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/passlist.json") - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } - setup := func(t *testing.T) (FixtureClient, mocktracer.Tracer, func()) { + setup := func(t *testing.T) (fixturepb.FixtureClient, mocktracer.Tracer, func()) { rig, err := newAppsecRig(t, false) require.NoError(t, err) @@ -271,7 +361,7 @@ func TestPasslist(t *testing.T) { // Send the payload triggering the sec event thanks to the "zouzou" value in the RPC metadata ctx := metadata.NewOutgoingContext(context.Background(), metadata.Pairs("dd-canary", "zouzou")) - res, err := client.Ping(ctx, &FixtureRequest{Name: "hello"}) + res, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: "hello"}) // Check that the handler was properly called require.NoError(t, err) @@ -298,7 +388,7 @@ func TestPasslist(t *testing.T) { // Send some messages for i := 0; i < 5; i++ { - if err := stream.Send(&FixtureRequest{Name: "hello"}); err != io.EOF { + if err := stream.Send(&fixturepb.FixtureRequest{Name: "hello"}); err != io.EOF { require.NoError(t, err) } @@ -325,15 +415,15 @@ func TestPasslist(t *testing.T) { } func newAppsecRig(t *testing.T, traceClient bool, interceptorOpts ...Option) (*appsecRig, error) { - interceptorOpts = append([]InterceptorOption{WithServiceName("grpc")}, interceptorOpts...) + interceptorOpts = append([]Option{WithService("grpc")}, interceptorOpts...) server := grpc.NewServer( grpc.UnaryInterceptor(UnaryServerInterceptor(interceptorOpts...)), grpc.StreamInterceptor(StreamServerInterceptor(interceptorOpts...)), ) - fixtureServer := new(appsecFixtureServer) - RegisterFixtureServer(server, fixtureServer) + fixtureServer := &appsecFixtureServer{s: fixturepb.NewFixtureServer()} + fixturepb.RegisterFixtureServer(server, fixtureServer) li, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { @@ -360,7 +450,7 @@ func newAppsecRig(t *testing.T, traceClient bool, interceptorOpts ...Option) (*a port: port, server: server, conn: conn, - client: NewFixtureClient(conn), + client: fixturepb.NewFixtureClient(conn), }, err } @@ -372,7 +462,7 @@ type appsecRig struct { port string listener net.Listener conn *grpc.ClientConn - client FixtureClient + client fixturepb.FixtureClient } func (r *appsecRig) Close() error { @@ -381,26 +471,26 @@ func (r *appsecRig) Close() error { } type appsecFixtureServer struct { - UnimplementedFixtureServer - s fixtureServer + fixturepb.UnimplementedFixtureServer + s *fixturepb.FixtureSrv } -func (s *appsecFixtureServer) StreamPing(stream Fixture_StreamPingServer) (err error) { +func (s *appsecFixtureServer) StreamPing(stream fixturepb.Fixture_StreamPingServer) (err error) { ctx := stream.Context() md, _ := metadata.FromIncomingContext(ctx) ids := md.Get("user-id") if len(ids) > 0 { - if err := pappsec.SetUser(ctx, ids[0]); err != nil { + if err := appsec.SetUser(ctx, ids[0]); err != nil { return err } } return s.s.StreamPing(stream) } -func (s *appsecFixtureServer) Ping(ctx context.Context, in *FixtureRequest) (*FixtureReply, error) { +func (s *appsecFixtureServer) Ping(ctx context.Context, in *fixturepb.FixtureRequest) (*fixturepb.FixtureReply, error) { md, _ := metadata.FromIncomingContext(ctx) ids := md.Get("user-id") if len(ids) > 0 { - if err := pappsec.SetUser(ctx, ids[0]); err != nil { + if err := appsec.SetUser(ctx, ids[0]); err != nil { return nil, err } } diff --git a/contrib/google.golang.org/grpc/client.go b/contrib/google.golang.org/grpc/client.go index 78046f10d9..f87611a6ef 100644 --- a/contrib/google.golang.org/grpc/client.go +++ b/contrib/google.golang.org/grpc/client.go @@ -9,14 +9,11 @@ import ( "context" "net" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/internal/grpcutil" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2/internal/grpcutil" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "google.golang.org/grpc" - "google.golang.org/grpc/grpclog" "google.golang.org/grpc/metadata" "google.golang.org/grpc/peer" ) @@ -38,7 +35,7 @@ func (cs *clientStream) RecvMsg(m interface{}) (err error) { cs.Context(), cs.method, "grpc.message", - cs.cfg.serviceName, + cs.cfg.serviceName.String(), cs.cfg.startSpanOptions()..., ) span.SetTag(ext.Component, componentName) @@ -57,7 +54,7 @@ func (cs *clientStream) SendMsg(m interface{}) (err error) { cs.Context(), cs.method, "grpc.message", - cs.cfg.serviceName, + cs.cfg.serviceName.String(), cs.cfg.startSpanOptions()..., ) span.SetTag(ext.Component, componentName) @@ -76,9 +73,9 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { cfg := new(config) clientDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/google.golang.org/grpc: Configuring StreamClientInterceptor: %#v", cfg) + instr.Logger().Debug("contrib/google.golang.org/grpc: Configuring StreamClientInterceptor: %#v", cfg) return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) { var methodKind string if desc != nil { @@ -94,7 +91,7 @@ func StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor { var stream grpc.ClientStream if _, ok := cfg.untracedMethods[method]; cfg.traceStreamCalls && !ok { var ( - span tracer.Span + span *tracer.Span err error ) span, ctx, err = doClientRequest(ctx, cfg, method, methodKind, cc, opts, @@ -147,9 +144,9 @@ func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor { cfg := new(config) clientDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/google.golang.org/grpc: Configuring UnaryClientInterceptor: %#v", cfg) + instr.Logger().Debug("contrib/google.golang.org/grpc: Configuring UnaryClientInterceptor: %#v", cfg) return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { if _, ok := cfg.untracedMethods[method]; ok { return invoker(ctx, method, req, reply, cc, opts...) @@ -168,13 +165,13 @@ func UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor { func doClientRequest( ctx context.Context, cfg *config, method string, methodKind string, cc *grpc.ClientConn, opts []grpc.CallOption, handler func(ctx context.Context, opts []grpc.CallOption) error, -) (ddtrace.Span, context.Context, error) { +) (*tracer.Span, context.Context, error) { // inject the trace id into the metadata span, ctx := startSpanFromContext( ctx, method, cfg.spanName, - cfg.serviceName, + cfg.serviceName.String(), cfg.startSpanOptions( tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindClient))..., @@ -200,7 +197,7 @@ func doClientRequest( } // setSpanTargetFromPeer sets the target tags in a span based on the gRPC peer. -func setSpanTargetFromPeer(span ddtrace.Span, p peer.Peer) { +func setSpanTargetFromPeer(span *tracer.Span, p peer.Peer) { // if the peer was set, set the tags if p.Addr != nil { ip, port, err := net.SplitHostPort(p.Addr.String()) @@ -228,8 +225,7 @@ func injectSpanIntoContext(ctx context.Context) context.Context { md = metadata.MD{} } if err := tracer.Inject(span.Context(), grpcutil.MDCarrier(md)); err != nil { - // in practice this error should never really happen - grpclog.Warningf("ddtrace: failed to inject the span context into the gRPC metadata: %v", err) + instr.Logger().Warn("ddtrace: failed to inject the span context into the gRPC metadata: %s", err.Error()) } return metadata.NewOutgoingContext(ctx, md) } diff --git a/contrib/google.golang.org/grpc/example_test.go b/contrib/google.golang.org/grpc/example_test.go index e8c7860ad0..b33e4ee6b6 100644 --- a/contrib/google.golang.org/grpc/example_test.go +++ b/contrib/google.golang.org/grpc/example_test.go @@ -9,15 +9,15 @@ import ( "log" "net" - grpctrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" + grpctrace "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2" "google.golang.org/grpc" ) func Example_client() { // Create the client interceptor using the grpc trace package. - si := grpctrace.StreamClientInterceptor(grpctrace.WithServiceName("my-grpc-client")) - ui := grpctrace.UnaryClientInterceptor(grpctrace.WithServiceName("my-grpc-client")) + si := grpctrace.StreamClientInterceptor(grpctrace.WithService("my-grpc-client")) + ui := grpctrace.UnaryClientInterceptor(grpctrace.WithService("my-grpc-client")) // Dial in using the created interceptor. // Note: To use multiple UnaryInterceptors with grpc.Dial, you must use @@ -40,8 +40,8 @@ func Example_server() { } // Create the server interceptor using the grpc trace package. - si := grpctrace.StreamServerInterceptor(grpctrace.WithServiceName("my-grpc-server")) - ui := grpctrace.UnaryServerInterceptor(grpctrace.WithServiceName("my-grpc-server")) + si := grpctrace.StreamServerInterceptor(grpctrace.WithService("my-grpc-server")) + ui := grpctrace.UnaryServerInterceptor(grpctrace.WithService("my-grpc-server")) // Initialize the grpc server as normal, using the tracing interceptor. s := grpc.NewServer(grpc.StreamInterceptor(si), grpc.UnaryInterceptor(ui)) diff --git a/contrib/google.golang.org/grpc/fixtures_test.proto b/contrib/google.golang.org/grpc/fixtures_test.proto deleted file mode 100644 index c9e4610414..0000000000 --- a/contrib/google.golang.org/grpc/fixtures_test.proto +++ /dev/null @@ -1,23 +0,0 @@ -syntax = "proto3"; - -option java_multiple_files = true; -option java_package = "io.grpc.examples.testgrpc"; -option java_outer_classname = "TestGRPCProto"; -option go_package = "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc"; - -package grpc; - -service Fixture { - rpc Ping (FixtureRequest) returns (FixtureReply) {} - rpc StreamPing(stream FixtureRequest) returns (stream FixtureReply) {} -} - -// The request message containing the user's name. -message FixtureRequest { - string name = 1; -} - -// The response message containing the greetings -message FixtureReply { - string message = 1; -} diff --git a/contrib/google.golang.org/grpc/go.mod b/contrib/google.golang.org/grpc/go.mod new file mode 100644 index 0000000000..d306b74ea9 --- /dev/null +++ b/contrib/google.golang.org/grpc/go.mod @@ -0,0 +1,95 @@ +module github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/tinylib/msgp v1.3.0 + google.golang.org/grpc v1.75.0 + google.golang.org/protobuf v1.36.7 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 => ../../../instrumentation/testutils/grpc + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/google.golang.org/grpc/go.sum b/contrib/google.golang.org/grpc/go.sum new file mode 100644 index 0000000000..caa4165cda --- /dev/null +++ b/contrib/google.golang.org/grpc/go.sum @@ -0,0 +1,309 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/google.golang.org/grpc/grpc.go b/contrib/google.golang.org/grpc/grpc.go index 323edbb542..c417da06e3 100644 --- a/contrib/google.golang.org/grpc/grpc.go +++ b/contrib/google.golang.org/grpc/grpc.go @@ -3,10 +3,8 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -//go:generate sh gen_proto.sh - // Package grpc provides functions to trace the google.golang.org/grpc package v1.2. -package grpc // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" +package grpc // import "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2" import ( "context" @@ -15,11 +13,10 @@ import ( "io" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/internal/grpcutil" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2/internal/grpcutil" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" @@ -30,9 +27,10 @@ import ( const componentName = "google.golang.org/grpc" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageGRPC) } // cache a constant option: saves one allocation per call @@ -57,11 +55,11 @@ func (cfg *config) startSpanOptions(opts ...tracer.StartSpanOption) []tracer.Sta } func startSpanFromContext( - ctx context.Context, method, operation string, serviceFn func() string, opts ...tracer.StartSpanOption, -) (ddtrace.Span, context.Context) { + ctx context.Context, method, operation string, serviceName string, opts ...tracer.StartSpanOption, +) (*tracer.Span, context.Context) { methodElements := strings.SplitN(strings.TrimPrefix(method, "/"), "/", 2) opts = append(opts, - tracer.ServiceName(serviceFn()), + tracer.ServiceName(serviceName), tracer.ResourceName(method), tracer.Tag(tagMethodName, method), spanTypeRPC, @@ -71,13 +69,17 @@ func startSpanFromContext( ) md, _ := metadata.FromIncomingContext(ctx) // nil is ok if sctx, err := tracer.Extract(grpcutil.MDCarrier(md)); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if sctx != nil && sctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(sctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(sctx)) } return tracer.StartSpanFromContext(ctx, operation, opts...) } // finishWithError applies finish option and a tag with gRPC status code, disregarding OK, EOF and Canceled errors. -func finishWithError(span ddtrace.Span, err error, cfg *config) { +func finishWithError(span *tracer.Span, err error, cfg *config) { if errors.Is(err, io.EOF) || errors.Is(err, context.Canceled) { err = nil } diff --git a/contrib/google.golang.org/grpc/grpc_test.go b/contrib/google.golang.org/grpc/grpc_test.go index 2534630689..86f0fc05d0 100644 --- a/contrib/google.golang.org/grpc/grpc_test.go +++ b/contrib/google.golang.org/grpc/grpc_test.go @@ -14,17 +14,14 @@ import ( "net" "net/http" "strings" - "sync/atomic" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/lists" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2/fixturepb" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -62,7 +59,7 @@ func TestUnary(t *testing.T) { }, } { t.Run(name, func(t *testing.T) { - rig, err := newRig(true, WithServiceName("grpc"), WithRequestTags()) + rig, err := newRig(true, WithService("grpc"), WithRequestTags()) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(rig.Close()) }() client := rig.client @@ -72,7 +69,7 @@ func TestUnary(t *testing.T) { span, ctx := tracer.StartSpanFromContext(context.Background(), "a", tracer.ServiceName("b"), tracer.ResourceName("c")) - resp, err := client.Ping(ctx, &FixtureRequest{Name: tt.message}) + resp, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: tt.message}) span.Finish() if tt.error { assert.Error(err) @@ -84,7 +81,7 @@ func TestUnary(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 3) - var serverSpan, clientSpan, rootSpan mocktracer.Span + var serverSpan, clientSpan, rootSpan *mocktracer.Span for _, s := range spans { // order of traces in buffer is not garanteed @@ -110,6 +107,7 @@ func TestUnary(t *testing.T) { assert.Equal(rootSpan.TraceID(), clientSpan.TraceID()) assert.Equal(methodKindUnary, clientSpan.Tag(tagMethodKind)) assert.Equal("google.golang.org/grpc", clientSpan.Tag(ext.Component)) + assert.Equal(componentName, clientSpan.Integration()) assert.Equal(ext.SpanKindClient, clientSpan.Tag(ext.SpanKind)) assert.Equal("grpc", clientSpan.Tag(ext.RPCSystem)) assert.Equal("grpc.Fixture", clientSpan.Tag(ext.RPCService)) @@ -132,12 +130,12 @@ func TestUnary(t *testing.T) { func TestStreaming(t *testing.T) { // creates a stream, then sends/recvs two pings, then closes the stream - runPings := func(t *testing.T, ctx context.Context, client FixtureClient) { + runPings := func(t *testing.T, ctx context.Context, client fixturepb.FixtureClient) { stream, err := client.StreamPing(ctx) assert.NoError(t, err) for i := 0; i < 2; i++ { - err = stream.Send(&FixtureRequest{Name: "pass"}) + err = stream.Send(&fixturepb.FixtureRequest{Name: "pass"}) assert.NoError(t, err) resp, err := stream.Recv() @@ -149,8 +147,8 @@ func TestStreaming(t *testing.T) { stream.Recv() } - checkSpans := func(t *testing.T, rig *rig, spans []mocktracer.Span) { - var rootSpan mocktracer.Span + checkSpans := func(t *testing.T, rig *rig, spans []*mocktracer.Span) { + var rootSpan *mocktracer.Span for _, span := range spans { if span.OperationName() == "a" { rootSpan = span @@ -185,14 +183,13 @@ func TestStreaming(t *testing.T) { tagMethodKind, methodKindBidiStream, span.Tag(tagMethodKind)) fallthrough case "grpc.message": - wantCode := codes.OK - if errTag := span.Tag("error"); errTag != nil { - if err, ok := errTag.(error); ok { - wantCode = status.Convert(err).Code() - } + if span.Tag(ext.ErrorMsg) == nil { + assert.Equal(t, codes.OK.String(), span.Tag(tagCode), + "expected grpc code to be set in span: %v", span) + } else { + assert.NotEqual(t, codes.OK.String(), span.Tag(tagCode), + "expected grpc code to be set in span: %v", span) } - assert.Equal(t, wantCode.String(), span.Tag(tagCode), - "expected grpc code to be set in span: %v", span) assert.Equal(t, "/grpc.Fixture/StreamPing", span.Tag(ext.ResourceName), "expected resource name to be set in span: %v", span) assert.Equal(t, "/grpc.Fixture/StreamPing", span.Tag(tagMethodName), @@ -205,16 +202,19 @@ func TestStreaming(t *testing.T) { " expected component to be grpc-go in span %v", span) assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind), " expected spankind to be client in span %v", span) + assert.Equal(t, componentName, span.Integration()) case "grpc.server": assert.Equal(t, "google.golang.org/grpc", span.Tag(ext.Component), " expected component to be grpc-go in span %v", span) assert.Equal(t, ext.SpanKindServer, span.Tag(ext.SpanKind), " expected spankind to be server in span %v, %v", span, span.OperationName()) + assert.Equal(t, componentName, span.Integration()) case "grpc.message": assert.Equal(t, "google.golang.org/grpc", span.Tag(ext.Component), " expected component to be grpc-go in span %v", span) assert.NotContains(t, span.Tags(), ext.SpanKind, " expected no spankind tag to be in span %v", span) + assert.Equal(t, componentName, span.Integration()) } } @@ -224,7 +224,7 @@ func TestStreaming(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rig, err := newRig(true, WithServiceName("grpc")) + rig, err := newRig(true, WithService("grpc")) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(t, rig.Close()) }() @@ -249,7 +249,7 @@ func TestStreaming(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rig, err := newRig(true, WithServiceName("grpc"), WithStreamMessages(false)) + rig, err := newRig(true, WithService("grpc"), WithStreamMessages(false)) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(t, rig.Close()) }() @@ -274,7 +274,7 @@ func TestStreaming(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rig, err := newRig(true, WithServiceName("grpc"), WithStreamCalls(false)) + rig, err := newRig(true, WithService("grpc"), WithStreamCalls(false)) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(t, rig.Close()) }() @@ -297,9 +297,9 @@ func TestStreaming(t *testing.T) { } func TestSpanTree(t *testing.T) { - assertSpan := func(t *testing.T, span, parent mocktracer.Span, operationName, resourceName string) { + assertSpan := func(t *testing.T, span, parent *mocktracer.Span, operationName, resourceName string) { require.NotNil(t, span) - assert.Nil(t, span.Tag(ext.Error)) + assert.Zero(t, span.Tag(ext.ErrorMsg)) assert.Equal(t, operationName, span.OperationName()) assert.Equal(t, "grpc", span.Tag(ext.ServiceName)) assert.Equal(t, resourceName, span.Tag(ext.ResourceName)) @@ -316,7 +316,7 @@ func TestSpanTree(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rig, err := newRig(true, WithServiceName("grpc")) + rig, err := newRig(true, WithService("grpc")) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(rig.Close()) }() @@ -325,7 +325,7 @@ func TestSpanTree(t *testing.T) { // root span -> client Ping span -> server Ping span -> child span rootSpan, ctx := tracer.StartSpanFromContext(context.Background(), "root") client := rig.client - resp, err := client.Ping(ctx, &FixtureRequest{Name: "child"}) + resp, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: "child"}) assert.NoError(err) assert.Equal("child", resp.Message) rootSpan.Finish() @@ -351,7 +351,7 @@ func TestSpanTree(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rig, err := newRig(true, WithServiceName("grpc"), WithRequestTags(), WithMetadataTags()) + rig, err := newRig(true, WithService("grpc"), WithRequestTags(), WithMetadataTags()) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(rig.Close()) }() client := rig.client @@ -367,7 +367,7 @@ func TestSpanTree(t *testing.T) { ctx = metadata.AppendToOutgoingContext(ctx, "custom_metadata_key", "custom_metadata_value") stream, err := client.StreamPing(ctx) assert.NoError(err) - err = stream.SendMsg(&FixtureRequest{Name: "break"}) + err = stream.SendMsg(&fixturepb.FixtureRequest{Name: "break"}) assert.NoError(err) resp, err := stream.Recv() assert.Nil(err) @@ -387,8 +387,8 @@ func TestSpanTree(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 7) - var rootSpan, clientStreamSpan, serverStreamSpan mocktracer.Span - var messageSpans []mocktracer.Span + var rootSpan, clientStreamSpan, serverStreamSpan *mocktracer.Span + var messageSpans []*mocktracer.Span for _, s := range spans { switch n := s.OperationName(); n { case "root": @@ -419,9 +419,8 @@ func TestSpanTree(t *testing.T) { serverSpans++ if !reqMsgFound { assert.Equal("{\"name\":\"break\"}", ms.Tag(tagRequest)) - metadataTag := ms.Tag(tagMetadataPrefix + "custom_metadata_key").([]string) - assert.Len(metadataTag, 1) - assert.Equal("custom_metadata_value", metadataTag[0]) + metadataTag := ms.Tag(tagMetadataPrefix + "custom_metadata_key.0") + assert.Equal("custom_metadata_value", metadataTag) reqMsgFound = true } } @@ -436,14 +435,14 @@ func TestPass(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rig, err := newRig(false, WithServiceName("grpc")) + rig, err := newRig(false, WithService("grpc")) require.NoError(t, err, "error setting up rig") defer func() { assert.NoError(rig.Close()) }() client := rig.client ctx := context.Background() ctx = metadata.AppendToOutgoingContext(ctx, "test-key", "test-value") - resp, err := client.Ping(ctx, &FixtureRequest{Name: "pass"}) + resp, err := client.Ping(ctx, &fixturepb.FixtureRequest{Name: "pass"}) assert.Nil(err) assert.Equal("passed", resp.Message) @@ -451,7 +450,7 @@ func TestPass(t *testing.T) { assert.Len(spans, 1) s := spans[0] - assert.Nil(s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("grpc.server", s.OperationName()) assert.Equal("grpc", s.Tag(ext.ServiceName)) assert.Equal("/grpc.Fixture/Ping", s.Tag(ext.ResourceName)) @@ -477,10 +476,10 @@ func TestPreservesMetadata(t *testing.T) { ctx := context.Background() ctx = metadata.AppendToOutgoingContext(ctx, "test-key", "test-value") span, ctx := tracer.StartSpanFromContext(ctx, "x", tracer.ServiceName("y"), tracer.ResourceName("z")) - rig.client.Ping(ctx, &FixtureRequest{Name: "pass"}) + rig.client.Ping(ctx, &fixturepb.FixtureRequest{Name: "pass"}) span.Finish() - md := rig.fixtureServer.lastRequestMetadata.Load().(metadata.MD) + md := rig.fixtureServer.LastRequestMetadata.Load().(metadata.MD) assert.Equal(t, []string{"test-value"}, md.Get("test-key"), "existing metadata should be preserved") @@ -489,7 +488,7 @@ func TestPreservesMetadata(t *testing.T) { assert.NotContains(t, s.Tags(), tagMetadataPrefix+"x-datadog-trace-id") assert.NotContains(t, s.Tags(), tagMetadataPrefix+"x-datadog-parent-id") assert.NotContains(t, s.Tags(), tagMetadataPrefix+"x-datadog-sampling-priority") - assert.Equal(t, []string{"test-value"}, s.Tag(tagMetadataPrefix+"test-key")) + assert.Equal(t, "test-value", s.Tag(tagMetadataPrefix+"test-key.0")) } func TestStreamSendsErrorCode(t *testing.T) { @@ -507,7 +506,7 @@ func TestStreamSendsErrorCode(t *testing.T) { stream, err := rig.client.StreamPing(ctx) require.NoError(t, err, "no error should be returned after creating stream client") - err = stream.Send(&FixtureRequest{Name: "invalid"}) + err = stream.Send(&fixturepb.FixtureRequest{Name: "invalid"}) require.NoError(t, err, "no error should be returned after sending message") resp, err := stream.Recv() @@ -520,87 +519,31 @@ func TestStreamSendsErrorCode(t *testing.T) { // to flush the spans _, _ = stream.Recv() - containsErrorCode := false spans := mt.FinishedSpans() - // check if at least one span has error code + // check if at least one span with spank.kind=server has error code + var span mocktracer.Span for _, s := range spans { - if s.Tag(tagCode) == wantCode { - containsErrorCode = true + if s.Tag(tagCode) != wantCode { + continue } - } - assert.True(t, containsErrorCode, "at least one span should contain error code, the spans were:\n%v", spans) - - // ensure that last span contains error code also - gotLastSpanCode := spans[len(spans)-1].Tag(tagCode) - assert.Equal(t, wantCode, gotLastSpanCode, "last span should contain error code") -} - -// fixtureServer a dummy implementation of our grpc fixtureServer. -type fixtureServer struct { - UnimplementedFixtureServer - lastRequestMetadata atomic.Value -} - -func (s *fixtureServer) StreamPing(stream Fixture_StreamPingServer) (err error) { - for { - msg, err := stream.Recv() - if err != nil { - return err - } - - reply, err := s.Ping(stream.Context(), msg) - if err != nil { - return err - } - - err = stream.Send(reply) - if err != nil { - return err - } - - if msg.Name == "break" { - return nil - } - } -} - -func (s *fixtureServer) Ping(ctx context.Context, in *FixtureRequest) (*FixtureReply, error) { - if md, ok := metadata.FromIncomingContext(ctx); ok { - s.lastRequestMetadata.Store(md) - } - switch { - case in.Name == "child": - span, _ := tracer.StartSpanFromContext(ctx, "child") - span.Finish() - return &FixtureReply{Message: "child"}, nil - case in.Name == "disabled": - if _, ok := tracer.SpanFromContext(ctx); ok { - panic("should be disabled") + if s.Tag(ext.SpanKind) != ext.SpanKindServer { + continue } - return &FixtureReply{Message: "disabled"}, nil - case in.Name == "invalid": - return nil, status.Error(codes.InvalidArgument, "invalid") - case in.Name == "errorDetails": - s, _ := status.New(codes.Unknown, "unknown"). - WithDetails(&FixtureReply{Message: "a"}, &FixtureReply{Message: "b"}) - return nil, s.Err() + span = *s } - return &FixtureReply{Message: "passed"}, nil + assert.NotNilf(t, span, "at least one span should contain error code, the spans were:\n%v", spans) } -// ensure it's a fixtureServer -var _ FixtureServer = &fixtureServer{} - // rig contains all of the servers and connections we'd need for a // grpc integration test type rig struct { - fixtureServer *fixtureServer + fixtureServer *fixturepb.FixtureSrv server *grpc.Server port string listener net.Listener conn *grpc.ClientConn - client FixtureClient + client fixturepb.FixtureClient } func (r *rig) Close() error { @@ -613,8 +556,8 @@ func newRigWithInterceptors( clientInterceptors []grpc.DialOption, ) (*rig, error) { server := grpc.NewServer(serverInterceptors...) - fixtureSrv := new(fixtureServer) - RegisterFixtureServer(server, fixtureSrv) + fixtureSrv := fixturepb.NewFixtureServer() + fixturepb.RegisterFixtureServer(server, fixtureSrv) li, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { @@ -634,7 +577,7 @@ func newRigWithInterceptors( port: port, server: server, conn: conn, - client: NewFixtureClient(conn), + client: fixturepb.NewFixtureClient(conn), }, err } @@ -664,7 +607,7 @@ func waitForSpans(mt mocktracer.Tracer, sz int) { } func TestAnalyticsSettings(t *testing.T) { - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...InterceptorOption) { + assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { rig, err := newRig(true, opts...) if err != nil { t.Fatalf("error setting up rig: %s", err) @@ -672,14 +615,14 @@ func TestAnalyticsSettings(t *testing.T) { defer func() { assert.NoError(t, rig.Close()) }() client := rig.client - resp, err := client.Ping(context.Background(), &FixtureRequest{Name: "pass"}) + resp, err := client.Ping(context.Background(), &fixturepb.FixtureRequest{Name: "pass"}) assert.Nil(t, err) assert.Equal(t, "passed", resp.Message) spans := mt.FinishedSpans() assert.Len(t, spans, 2) - var serverSpan, clientSpan mocktracer.Span + var serverSpan, clientSpan *mocktracer.Span for _, s := range spans { // order of traces in buffer is not garanteed @@ -707,9 +650,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -732,9 +673,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -747,79 +686,6 @@ func TestAnalyticsSettings(t *testing.T) { }) } -func TestIgnoredMethods(t *testing.T) { - t.Run("unary", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - for _, c := range []struct { - ignore []string - exp int - }{ - {ignore: []string{}, exp: 2}, - {ignore: []string{"/some/endpoint"}, exp: 2}, - {ignore: []string{"/grpc.Fixture/Ping"}, exp: 1}, - {ignore: []string{"/grpc.Fixture/Ping", "/additional/endpoint"}, exp: 1}, - } { - rig, err := newRig(true, WithIgnoredMethods(c.ignore...)) - if err != nil { - t.Fatalf("error setting up rig: %s", err) - } - client := rig.client - resp, err := client.Ping(context.Background(), &FixtureRequest{Name: "pass"}) - assert.Nil(t, err) - assert.Equal(t, "passed", resp.Message) - - spans := mt.FinishedSpans() - assert.Len(t, spans, c.exp) - rig.Close() - mt.Reset() - } - }) - - t.Run("stream", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - for _, c := range []struct { - ignore []string - exp int - }{ - // client span: 1 send + 1 recv(OK) + 1 stream finish (OK) - // server span: 1 send + 2 recv(OK + EOF) + 1 stream finish(EOF) - {ignore: []string{}, exp: 7}, - {ignore: []string{"/some/endpoint"}, exp: 7}, - {ignore: []string{"/grpc.Fixture/StreamPing"}, exp: 3}, - {ignore: []string{"/grpc.Fixture/StreamPing", "/additional/endpoint"}, exp: 3}, - } { - rig, err := newRig(true, WithIgnoredMethods(c.ignore...)) - if err != nil { - t.Fatalf("error setting up rig: %s", err) - } - - ctx, done := context.WithCancel(context.Background()) - client := rig.client - stream, err := client.StreamPing(ctx) - assert.NoError(t, err) - - err = stream.Send(&FixtureRequest{Name: "pass"}) - assert.NoError(t, err) - - resp, err := stream.Recv() - assert.NoError(t, err) - assert.Equal(t, "passed", resp.Message) - - assert.NoError(t, stream.CloseSend()) - done() // close stream from client side - rig.Close() - - waitForSpans(mt, c.exp) - - spans := mt.FinishedSpans() - assert.Len(t, spans, c.exp) - mt.Reset() - } - }) -} - func TestUntracedMethods(t *testing.T) { t.Run("unary", func(t *testing.T) { mt := mocktracer.Start() @@ -838,7 +704,7 @@ func TestUntracedMethods(t *testing.T) { t.Fatalf("error setting up rig: %s", err) } client := rig.client - resp, err := client.Ping(context.Background(), &FixtureRequest{Name: "pass"}) + resp, err := client.Ping(context.Background(), &fixturepb.FixtureRequest{Name: "pass"}) assert.Nil(t, err) assert.Equal(t, "passed", resp.Message) @@ -873,7 +739,7 @@ func TestUntracedMethods(t *testing.T) { stream, err := client.StreamPing(ctx) assert.NoError(t, err) - err = stream.Send(&FixtureRequest{Name: "pass"}) + err = stream.Send(&fixturepb.FixtureRequest{Name: "pass"}) assert.NoError(t, err) resp, err := stream.Recv() @@ -900,9 +766,9 @@ func TestIgnoredMetadata(t *testing.T) { ignore []string exp int }{ - {ignore: []string{}, exp: 5}, - {ignore: []string{"test-key"}, exp: 4}, - {ignore: []string{"test-key", "test-key2"}, exp: 3}, + {ignore: []string{}, exp: 8}, + {ignore: []string{"test-key"}, exp: 7}, + {ignore: []string{"test-key", "test-key2"}, exp: 6}, } { rig, err := newRig(true, WithMetadataTags(), WithIgnoredMetadata(c.ignore...)) if err != nil { @@ -911,12 +777,12 @@ func TestIgnoredMetadata(t *testing.T) { ctx := context.Background() ctx = metadata.AppendToOutgoingContext(ctx, "test-key", "test-value", "test-key2", "test-value2") span, ctx := tracer.StartSpanFromContext(ctx, "x", tracer.ServiceName("y"), tracer.ResourceName("z")) - rig.client.Ping(ctx, &FixtureRequest{Name: "pass"}) + rig.client.Ping(ctx, &fixturepb.FixtureRequest{Name: "pass"}) span.Finish() spans := mt.FinishedSpans() - var serverSpan mocktracer.Span + var serverSpan *mocktracer.Span for _, s := range spans { switch s.OperationName() { case "grpc.server": @@ -945,7 +811,7 @@ func TestSpanOpts(t *testing.T) { t.Fatalf("error setting up rig: %s", err) } client := rig.client - resp, err := client.Ping(context.Background(), &FixtureRequest{Name: "pass"}) + resp, err := client.Ping(context.Background(), &fixturepb.FixtureRequest{Name: "pass"}) assert.Nil(t, err) assert.Equal(t, "passed", resp.Message) @@ -972,7 +838,7 @@ func TestSpanOpts(t *testing.T) { stream, err := client.StreamPing(ctx) assert.NoError(t, err) - err = stream.Send(&FixtureRequest{Name: "pass"}) + err = stream.Send(&fixturepb.FixtureRequest{Name: "pass"}) assert.NoError(t, err) resp, err := stream.Recv() @@ -1002,7 +868,7 @@ func TestCustomTag(t *testing.T) { value interface{} }{ {key: "foo", value: "bar"}, - {key: "val", value: 123}, + {key: "val", value: float64(123)}, } { rig, err := newRig(true, WithCustomTag(c.key, c.value)) if err != nil { @@ -1010,12 +876,12 @@ func TestCustomTag(t *testing.T) { } ctx := context.Background() span, ctx := tracer.StartSpanFromContext(ctx, "x", tracer.ServiceName("y"), tracer.ResourceName("z")) - rig.client.Ping(ctx, &FixtureRequest{Name: "pass"}) + rig.client.Ping(ctx, &fixturepb.FixtureRequest{Name: "pass"}) span.Finish() spans := mt.FinishedSpans() - var serverSpan mocktracer.Span + var serverSpan *mocktracer.Span for _, s := range spans { switch s.OperationName() { case "grpc.server": @@ -1030,52 +896,6 @@ func TestCustomTag(t *testing.T) { } } -func TestServerNamingSchema(t *testing.T) { - genSpans := getGenSpansFn(false, true) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - for i := 0; i < 4; i++ { - assert.Equal(t, "grpc.server", spans[i].OperationName()) - } - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - for i := 0; i < 4; i++ { - assert.Equal(t, "grpc.server.request", spans[i].OperationName()) - } - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: lists.RepeatString("grpc.server", 4), - WithDDService: lists.RepeatString(namingschematest.TestDDService, 4), - WithDDServiceAndOverride: lists.RepeatString(namingschematest.TestServiceOverride, 4), - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} - -func TestClientNamingSchema(t *testing.T) { - genSpans := getGenSpansFn(true, false) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - for i := 0; i < 4; i++ { - assert.Equal(t, "grpc.client", spans[i].OperationName()) - } - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 4) - for i := 0; i < 4; i++ { - assert.Equal(t, "grpc.client.request", spans[i].OperationName()) - } - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: lists.RepeatString("grpc.client", 4), - WithDDService: lists.RepeatString("grpc.client", 4), - WithDDServiceAndOverride: lists.RepeatString(namingschematest.TestServiceOverride, 4), - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} - func TestWithErrorDetailTags(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() @@ -1094,12 +914,12 @@ func TestWithErrorDetailTags(t *testing.T) { } ctx := context.Background() span, ctx := tracer.StartSpanFromContext(ctx, "x", tracer.ServiceName("y"), tracer.ResourceName("z")) - rig.client.Ping(ctx, &FixtureRequest{Name: "errorDetails"}) + rig.client.Ping(ctx, &fixturepb.FixtureRequest{Name: "errorDetails"}) span.Finish() spans := mt.FinishedSpans() - var serverSpan mocktracer.Span + var serverSpan *mocktracer.Span for _, s := range spans { switch s.OperationName() { case "grpc.server": @@ -1116,68 +936,19 @@ func TestWithErrorDetailTags(t *testing.T) { } } -func getGenSpansFn(traceClient, traceServer bool) namingschematest.GenSpansFn { - return func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - // exclude the grpc.message spans as they are not affected by naming schema - opts = append(opts, WithStreamMessages(false)) - mt := mocktracer.Start() - defer mt.Stop() - - var serverInterceptors []grpc.ServerOption - if traceServer { - serverInterceptors = append(serverInterceptors, - grpc.UnaryInterceptor(UnaryServerInterceptor(opts...)), - grpc.StreamInterceptor(StreamServerInterceptor(opts...)), - grpc.StatsHandler(NewServerStatsHandler(opts...)), - ) - } - clientInterceptors := []grpc.DialOption{grpc.WithInsecure()} - if traceClient { - clientInterceptors = append(clientInterceptors, - grpc.WithUnaryInterceptor(UnaryClientInterceptor(opts...)), - grpc.WithStreamInterceptor(StreamClientInterceptor(opts...)), - grpc.WithStatsHandler(NewClientStatsHandler(opts...)), - ) - } - rig, err := newRigWithInterceptors(serverInterceptors, clientInterceptors) - require.NoError(t, err) - defer func() { assert.NoError(t, rig.Close()) }() - _, err = rig.client.Ping(context.Background(), &FixtureRequest{Name: "pass"}) - require.NoError(t, err) - - stream, err := rig.client.StreamPing(context.Background()) - require.NoError(t, err) - err = stream.Send(&FixtureRequest{Name: "break"}) - require.NoError(t, err) - _, err = stream.Recv() - require.NoError(t, err) - err = stream.CloseSend() - require.NoError(t, err) - // to flush the spans - _, _ = stream.Recv() - - waitForSpans(mt, 4) - return mt.FinishedSpans() - } -} - func BenchmarkUnaryServerInterceptor(b *testing.B) { // need to use the real tracer to get representative measurments - tracer.Start(tracer.WithLogger(log.DiscardLogger{}), + tracer.Start(tracer.WithLogger(testutils.DiscardLogger()), tracer.WithEnv("test"), tracer.WithServiceVersion("0.1.2")) defer tracer.Stop() - doNothingOKGRPCHandler := func(ctx context.Context, req interface{}) (interface{}, error) { + doNothingOKGRPCHandler := func(_ context.Context, _ interface{}) (interface{}, error) { return nil, nil } unknownErr := status.Error(codes.Unknown, "some unknown error") - doNothingErrorGRPCHandler := func(ctx context.Context, req interface{}) (interface{}, error) { + doNothingErrorGRPCHandler := func(_ context.Context, _ interface{}) (interface{}, error) { return nil, unknownErr } @@ -1315,10 +1086,10 @@ func TestIssue2050(t *testing.T) { defer func() { assert.NoError(t, rig.Close()) }() // call tracer.Start after integration is initialized, to reproduce the issue - tracer.Start(tracer.WithHTTPClient(httpClient)) + tracer.Start(tracer.WithHTTPClient(httpClient), tracer.WithLogger(testutils.DiscardLogger())) defer tracer.Stop() - _, err = rig.client.Ping(context.Background(), &FixtureRequest{Name: "pass"}) + _, err = rig.client.Ping(context.Background(), &fixturepb.FixtureRequest{Name: "pass"}) require.NoError(t, err) select { diff --git a/contrib/google.golang.org/internal/grpcutil/mdcarrier.go b/contrib/google.golang.org/grpc/internal/grpcutil/mdcarrier.go similarity index 89% rename from contrib/google.golang.org/internal/grpcutil/mdcarrier.go rename to contrib/google.golang.org/grpc/internal/grpcutil/mdcarrier.go index 1612298da9..75fea3e147 100644 --- a/contrib/google.golang.org/internal/grpcutil/mdcarrier.go +++ b/contrib/google.golang.org/grpc/internal/grpcutil/mdcarrier.go @@ -3,12 +3,12 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package grpcutil // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/internal/grpcutil" +package grpcutil // import "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2/internal/grpcutil" import ( "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "google.golang.org/grpc/metadata" ) diff --git a/contrib/google.golang.org/internal/grpcutil/mdcarrier_test.go b/contrib/google.golang.org/grpc/internal/grpcutil/mdcarrier_test.go similarity index 100% rename from contrib/google.golang.org/internal/grpcutil/mdcarrier_test.go rename to contrib/google.golang.org/grpc/internal/grpcutil/mdcarrier_test.go diff --git a/contrib/google.golang.org/grpc/option.go b/contrib/google.golang.org/grpc/option.go index 43b1ad781b..7fbb44ddbf 100644 --- a/contrib/google.golang.org/grpc/option.go +++ b/contrib/google.golang.org/grpc/option.go @@ -6,54 +6,74 @@ package grpc import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "math" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "google.golang.org/grpc/codes" ) -const ( - defaultClientServiceName = "grpc.client" - defaultServerServiceName = "grpc.server" -) +// Option describes options for the gRPC integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to StreamClientInterceptor, UnaryClientInterceptor, StreamServerInterceptor, +// UnaryServerInterceptor, NewClientStatsHandler and NewServerStatsHandler. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +type cachedServiceName struct { + value string + getValue func() string +} + +func newCachedServiceName(getValue func() string) *cachedServiceName { + c := &cachedServiceName{getValue: getValue} + // warmup cache + _ = c.String() + return c +} -// Option specifies a configuration option for the grpc package. Not all options apply -// to all instrumented structures. -type Option func(*config) +func (cs *cachedServiceName) String() string { + if cs.value != "" { + return cs.value + } + svc := cs.getValue() + // cache only if the tracer has been started. This ensures we get the final value for service name, since this + // is where the tracer configuration is resolved (including env variables and tracer options). + if instr.TracerInitialized() { + cs.value = svc + } + return svc +} type config struct { - serviceName func() string + serviceName *cachedServiceName spanName string nonErrorCodes map[codes.Code]bool traceStreamCalls bool traceStreamMessages bool noDebugStack bool - ignoredMethods map[string]struct{} untracedMethods map[string]struct{} withMetadataTags bool ignoredMetadata map[string]struct{} withRequestTags bool withErrorDetailTags bool - spanOpts []ddtrace.StartSpanOption + spanOpts []tracer.StartSpanOption tags map[string]interface{} } -// InterceptorOption represents an option that can be passed to the grpc unary -// client and server interceptors. -// InterceptorOption is deprecated in favor of Option. -type InterceptorOption = Option - func defaults(cfg *config) { cfg.traceStreamCalls = true cfg.traceStreamMessages = true cfg.nonErrorCodes = map[codes.Code]bool{codes.Canceled: true} - // cfg.spanOpts = append(cfg.spanOpts, tracer.AnalyticsRate(globalconfig.AnalyticsRate())) - if internal.BoolEnv("DD_TRACE_GRPC_ANALYTICS_ENABLED", false) { - cfg.spanOpts = append(cfg.spanOpts, tracer.AnalyticsRate(1.0)) + if rate := instr.AnalyticsRate(false); !math.IsNaN(rate) { + cfg.spanOpts = append(cfg.spanOpts, tracer.AnalyticsRate(rate)) } cfg.ignoredMetadata = map[string]struct{}{ "x-datadog-trace-id": {}, @@ -63,37 +83,33 @@ func defaults(cfg *config) { } func clientDefaults(cfg *config) { - sn := namingschema.ServiceNameOverrideV0(defaultClientServiceName, defaultClientServiceName) - cfg.serviceName = func() string { return sn } - cfg.spanName = namingschema.OpName(namingschema.GRPCClient) + cfg.serviceName = newCachedServiceName(func() string { + return instr.ServiceName(instrumentation.ComponentClient, nil) + }) + cfg.spanName = instr.OperationName(instrumentation.ComponentClient, nil) defaults(cfg) } func serverDefaults(cfg *config) { - // We check for a configured service name, so we don't break users who are incorrectly creating their server - // before the call `tracer.Start()` - if globalconfig.ServiceName() != "" { - sn := namingschema.ServiceName(defaultServerServiceName) - cfg.serviceName = func() string { return sn } - } else { - log.Warn("No global service name was detected. GRPC Server may have been created before calling tracer.Start(). Will dynamically fetch service name for every span. " + - "Note this may have a slight performance cost, it is always recommended to start the tracer before initializing any traced packages.\n") - cfg.serviceName = func() string { return namingschema.ServiceName(defaultServerServiceName) } - } - cfg.spanName = namingschema.OpName(namingschema.GRPCServer) + cfg.serviceName = newCachedServiceName(func() string { + return instr.ServiceName(instrumentation.ComponentServer, nil) + }) + cfg.spanName = instr.OperationName(instrumentation.ComponentServer, nil) defaults(cfg) } -// WithServiceName sets the given service name for the intercepted client. -func WithServiceName(name string) Option { +// WithService sets the given service name for the intercepted client. +func WithService(name string) OptionFn { return func(cfg *config) { - cfg.serviceName = func() string { return name } + cfg.serviceName = newCachedServiceName(func() string { + return name + }) } } // WithStreamCalls enables or disables tracing of streaming calls. This option does not apply to the // stats handler. -func WithStreamCalls(enabled bool) Option { +func WithStreamCalls(enabled bool) OptionFn { return func(cfg *config) { cfg.traceStreamCalls = enabled } @@ -101,23 +117,23 @@ func WithStreamCalls(enabled bool) Option { // WithStreamMessages enables or disables tracing of streaming messages. This option does not apply // to the stats handler. -func WithStreamMessages(enabled bool) Option { +func WithStreamMessages(enabled bool) OptionFn { return func(cfg *config) { cfg.traceStreamMessages = enabled } } // NoDebugStack disables debug stacks for traces with errors. This is useful in situations -// where errors are frequent and the overhead of calling debug.Stack may affect performance. -func NoDebugStack() Option { +// where errors are frequent, and the overhead of calling debug.Stack may affect performance. +func NoDebugStack() OptionFn { return func(cfg *config) { cfg.noDebugStack = true } } -// NonErrorCodes determines the list of codes which will not be considered errors in instrumentation. +// NonErrorCodes determines the list of codes that will not be considered errors in instrumentation. // This call overrides the default handling of codes.Canceled as a non-error. -func NonErrorCodes(cs ...codes.Code) InterceptorOption { +func NonErrorCodes(cs ...codes.Code) OptionFn { return func(cfg *config) { cfg.nonErrorCodes = make(map[codes.Code]bool, len(cs)) for _, c := range cs { @@ -127,7 +143,7 @@ func NonErrorCodes(cs ...codes.Code) InterceptorOption { } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { WithSpanOptions(tracer.AnalyticsRate(1.0))(cfg) @@ -137,7 +153,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { WithSpanOptions(tracer.AnalyticsRate(rate))(cfg) @@ -145,24 +161,9 @@ func WithAnalyticsRate(rate float64) Option { } } -// WithIgnoredMethods specifies full methods to be ignored by the server side interceptor. -// When an incoming request's full method is in ms, no spans will be created. -// -// Deprecated: This is deprecated in favor of WithUntracedMethods which applies to both -// the server side and client side interceptors. -func WithIgnoredMethods(ms ...string) Option { - ims := make(map[string]struct{}, len(ms)) - for _, e := range ms { - ims[e] = struct{}{} - } - return func(cfg *config) { - cfg.ignoredMethods = ims - } -} - // WithUntracedMethods specifies full methods to be ignored by the server side and client // side interceptors. When a request's full method is in ms, no spans will be created. -func WithUntracedMethods(ms ...string) Option { +func WithUntracedMethods(ms ...string) OptionFn { ums := make(map[string]struct{}, len(ms)) for _, e := range ms { ums[e] = struct{}{} @@ -173,7 +174,7 @@ func WithUntracedMethods(ms ...string) Option { } // WithMetadataTags specifies whether gRPC metadata should be added to spans as tags. -func WithMetadataTags() Option { +func WithMetadataTags() OptionFn { return func(cfg *config) { cfg.withMetadataTags = true } @@ -181,7 +182,7 @@ func WithMetadataTags() Option { // WithIgnoredMetadata specifies keys to be ignored while tracing the metadata. Must be used // in conjunction with WithMetadataTags. -func WithIgnoredMetadata(ms ...string) Option { +func WithIgnoredMetadata(ms ...string) OptionFn { return func(cfg *config) { for _, e := range ms { cfg.ignoredMetadata[e] = struct{}{} @@ -190,21 +191,21 @@ func WithIgnoredMetadata(ms ...string) Option { } // WithRequestTags specifies whether gRPC requests should be added to spans as tags. -func WithRequestTags() Option { +func WithRequestTags() OptionFn { return func(cfg *config) { cfg.withRequestTags = true } } // WithErrorDetailTags specifies whether gRPC responses details contain should be added to spans as tags. -func WithErrorDetailTags() Option { +func WithErrorDetailTags() OptionFn { return func(cfg *config) { cfg.withErrorDetailTags = true } } // WithCustomTag will attach the value to the span tagged by the key. -func WithCustomTag(key string, value interface{}) Option { +func WithCustomTag(key string, value interface{}) OptionFn { return func(cfg *config) { if cfg.tags == nil { cfg.tags = make(map[string]interface{}) @@ -213,9 +214,9 @@ func WithCustomTag(key string, value interface{}) Option { } } -// WithSpanOptions defines a set of additional ddtrace.StartSpanOption to be added +// WithSpanOptions defines a set of additional tracer.StartSpanOption to be added // to spans started by the integration. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { return func(cfg *config) { cfg.spanOpts = append(cfg.spanOpts, opts...) } diff --git a/contrib/google.golang.org/grpc/orchestrion.yml b/contrib/google.golang.org/grpc/orchestrion.yml new file mode 100644 index 0000000000..f73cef5c97 --- /dev/null +++ b/contrib/google.golang.org/grpc/orchestrion.yml @@ -0,0 +1,41 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 + description: The Go implementation of gRPC. + +aspects: + # Client Instrumentation + - id: Client + join-point: + one-of: + - function-call: google.golang.org/grpc.Dial + - function-call: google.golang.org/grpc.DialContext + - function-call: google.golang.org/grpc.NewClient + advice: + - append-args: + type: google.golang.org/grpc.DialOption + values: + - imports: &imports + grpc: google.golang.org/grpc + grpctrace: github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 + template: grpc.WithChainStreamInterceptor(grpctrace.StreamClientInterceptor()) + - imports: *imports + template: grpc.WithChainUnaryInterceptor(grpctrace.UnaryClientInterceptor()) + + # Server Instrumentation + - id: Server + join-point: + function-call: google.golang.org/grpc.NewServer + advice: + - append-args: + type: google.golang.org/grpc.ServerOption + values: + - imports: *imports + template: grpc.ChainStreamInterceptor(grpctrace.StreamServerInterceptor()) + - imports: *imports + template: grpc.ChainUnaryInterceptor(grpctrace.UnaryServerInterceptor()) diff --git a/contrib/google.golang.org/grpc/server.go b/contrib/google.golang.org/grpc/server.go index a751e1a3a6..261349e06e 100644 --- a/contrib/google.golang.org/grpc/server.go +++ b/contrib/google.golang.org/grpc/server.go @@ -8,11 +8,8 @@ package grpc import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "google.golang.org/grpc" "google.golang.org/grpc/metadata" @@ -40,14 +37,13 @@ func (ss *serverStream) Context() context.Context { } func (ss *serverStream) RecvMsg(m interface{}) (err error) { - _, im := ss.cfg.ignoredMethods[ss.method] _, um := ss.cfg.untracedMethods[ss.method] - if ss.cfg.traceStreamMessages && !im && !um { + if ss.cfg.traceStreamMessages && !um { span, _ := startSpanFromContext( ss.ctx, ss.method, "grpc.message", - ss.cfg.serviceName, + ss.cfg.serviceName.String(), ss.cfg.startSpanOptions(tracer.Measured())..., ) span.SetTag(ext.Component, componentName) @@ -62,14 +58,13 @@ func (ss *serverStream) RecvMsg(m interface{}) (err error) { } func (ss *serverStream) SendMsg(m interface{}) (err error) { - _, im := ss.cfg.ignoredMethods[ss.method] _, um := ss.cfg.untracedMethods[ss.method] - if ss.cfg.traceStreamMessages && !im && !um { + if ss.cfg.traceStreamMessages && !um { span, _ := startSpanFromContext( ss.ctx, ss.method, "grpc.message", - ss.cfg.serviceName, + ss.cfg.serviceName.String(), ss.cfg.startSpanOptions(tracer.Measured())..., ) span.SetTag(ext.Component, componentName) @@ -84,21 +79,20 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { cfg := new(config) serverDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/google.golang.org/grpc: Configuring StreamServerInterceptor: %#v", cfg) + instr.Logger().Debug("contrib/google.golang.org/grpc: Configuring StreamServerInterceptor: %#v", cfg) return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) (err error) { ctx := ss.Context() // if we've enabled call tracing, create a span - _, im := cfg.ignoredMethods[info.FullMethod] _, um := cfg.untracedMethods[info.FullMethod] - if cfg.traceStreamCalls && !im && !um { - var span ddtrace.Span + if cfg.traceStreamCalls && !um { + var span *tracer.Span span, ctx = startSpanFromContext( ctx, info.FullMethod, cfg.spanName, - cfg.serviceName, + cfg.serviceName.String(), cfg.startSpanOptions(tracer.Measured(), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindServer))..., @@ -112,7 +106,7 @@ func StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { span.SetTag(tagMethodKind, methodKindClientStream) } defer func() { finishWithError(span, err, cfg) }() - if appsec.Enabled() { + if instr.AppSecEnabled() { handler = appsecStreamHandlerMiddleware(info.FullMethod, span, handler) } } @@ -133,20 +127,19 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { cfg := new(config) serverDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/google.golang.org/grpc: Configuring UnaryServerInterceptor: %#v", cfg) + instr.Logger().Debug("contrib/google.golang.org/grpc: Configuring UnaryServerInterceptor: %#v", cfg) return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { - _, im := cfg.ignoredMethods[info.FullMethod] _, um := cfg.untracedMethods[info.FullMethod] - if im || um { + if um { return handler(ctx, req) } span, ctx := startSpanFromContext( ctx, info.FullMethod, cfg.spanName, - cfg.serviceName, + cfg.serviceName.String(), cfg.startSpanOptions(tracer.Measured(), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindServer))..., @@ -154,7 +147,7 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { span.SetTag(tagMethodKind, methodKindUnary) withMetadataTags(ctx, cfg, span) withRequestTags(cfg, req, span) - if appsec.Enabled() { + if instr.AppSecEnabled() { handler = appsecUnaryHandlerMiddleware(info.FullMethod, span, handler) } resp, err := handler(ctx, req) @@ -163,7 +156,7 @@ func UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { } } -func withMetadataTags(ctx context.Context, cfg *config, span ddtrace.Span) { +func withMetadataTags(ctx context.Context, cfg *config, span *tracer.Span) { if cfg.withMetadataTags { md, _ := metadata.FromIncomingContext(ctx) // nil is ok for k, v := range md { @@ -174,7 +167,7 @@ func withMetadataTags(ctx context.Context, cfg *config, span ddtrace.Span) { } } -func withRequestTags(cfg *config, req interface{}, span ddtrace.Span) { +func withRequestTags(cfg *config, req interface{}, span *tracer.Span) { if cfg.withRequestTags { if p, ok := req.(proto.Message); ok { if b, err := protojson.Marshal(p); err == nil { diff --git a/contrib/google.golang.org/grpc/stats_client.go b/contrib/google.golang.org/grpc/stats_client.go index a2c0aa43da..1692bbd79e 100644 --- a/contrib/google.golang.org/grpc/stats_client.go +++ b/contrib/google.golang.org/grpc/stats_client.go @@ -10,8 +10,9 @@ import ( "net" "google.golang.org/grpc/stats" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) // NewClientStatsHandler returns a gRPC client stats.Handler to trace RPC calls. @@ -19,7 +20,7 @@ func NewClientStatsHandler(opts ...Option) stats.Handler { cfg := new(config) clientDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } return &clientStatsHandler{ cfg: cfg, @@ -35,7 +36,7 @@ func (h *clientStatsHandler) TagRPC(ctx context.Context, rti *stats.RPCTagInfo) ctx, rti.FullMethodName, h.cfg.spanName, - h.cfg.serviceName, + h.cfg.serviceName.String(), spanOpts..., ) ctx = injectSpanIntoContext(ctx) diff --git a/contrib/google.golang.org/grpc/stats_client_test.go b/contrib/google.golang.org/grpc/stats_client_test.go index f0fd394ee4..b6edf60eb1 100644 --- a/contrib/google.golang.org/grpc/stats_client_test.go +++ b/contrib/google.golang.org/grpc/stats_client_test.go @@ -9,9 +9,10 @@ import ( "context" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2/fixturepb" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/stretchr/testify/assert" "google.golang.org/grpc" @@ -23,7 +24,7 @@ func TestClientStatsHandler(t *testing.T) { assert := assert.New(t) serviceName := "grpc-service" - statsHandler := NewClientStatsHandler(WithServiceName(serviceName), WithSpanOptions(tracer.Tag("foo", "bar"))) + statsHandler := NewClientStatsHandler(WithService(serviceName), WithSpanOptions(tracer.Tag("foo", "bar"))) server, err := newClientStatsHandlerTestServer(statsHandler) if err != nil { t.Fatalf("failed to start test server: %s", err) @@ -34,7 +35,7 @@ func TestClientStatsHandler(t *testing.T) { defer mt.Stop() rootSpan, ctx := tracer.StartSpanFromContext(context.Background(), "a", tracer.ServiceName("b"), tracer.ResourceName("c")) - _, err = server.client.Ping(ctx, &FixtureRequest{Name: "name"}) + _, err = server.client.Ping(ctx, &fixturepb.FixtureRequest{Name: "name"}) assert.NoError(err) rootSpan.Finish() diff --git a/contrib/google.golang.org/grpc/stats_server.go b/contrib/google.golang.org/grpc/stats_server.go index 4da9316001..fa402c51b9 100644 --- a/contrib/google.golang.org/grpc/stats_server.go +++ b/contrib/google.golang.org/grpc/stats_server.go @@ -8,8 +8,8 @@ package grpc import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "google.golang.org/grpc/stats" ) @@ -19,7 +19,7 @@ func NewServerStatsHandler(opts ...Option) stats.Handler { cfg := new(config) serverDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } return &serverStatsHandler{ cfg: cfg, @@ -41,7 +41,7 @@ func (h *serverStatsHandler) TagRPC(ctx context.Context, rti *stats.RPCTagInfo) ctx, rti.FullMethodName, h.cfg.spanName, - h.cfg.serviceName, + h.cfg.serviceName.String(), spanOpts..., ) return ctx diff --git a/contrib/google.golang.org/grpc/stats_server_test.go b/contrib/google.golang.org/grpc/stats_server_test.go index 7bb38a9042..ef76403fe4 100644 --- a/contrib/google.golang.org/grpc/stats_server_test.go +++ b/contrib/google.golang.org/grpc/stats_server_test.go @@ -9,9 +9,10 @@ import ( "context" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2/fixturepb" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/stretchr/testify/assert" "google.golang.org/grpc" @@ -23,7 +24,7 @@ func TestServerStatsHandler(t *testing.T) { assert := assert.New(t) serviceName := "grpc-service" - statsHandler := NewServerStatsHandler(WithServiceName(serviceName), WithSpanOptions(tracer.Tag("foo", "bar"))) + statsHandler := NewServerStatsHandler(WithService(serviceName), WithSpanOptions(tracer.Tag("foo", "bar"))) server, err := newServerStatsHandlerTestServer(statsHandler) if err != nil { t.Fatalf("failed to start test server: %s", err) @@ -32,7 +33,7 @@ func TestServerStatsHandler(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - _, err = server.client.Ping(context.Background(), &FixtureRequest{Name: "name"}) + _, err = server.client.Ping(context.Background(), &fixturepb.FixtureRequest{Name: "name"}) assert.NoError(err) waitForSpans(mt, 1) @@ -50,7 +51,6 @@ func TestServerStatsHandler(t *testing.T) { assert.Equal(serviceName, tags["service.name"]) assert.Equal("/grpc.Fixture/Ping", tags["resource.name"]) assert.Equal("/grpc.Fixture/Ping", tags[tagMethodName]) - assert.Equal(1, tags["_dd.measured"]) assert.Equal("bar", tags["foo"]) assert.Equal("grpc", tags[ext.RPCSystem]) assert.Equal("/grpc.Fixture/Ping", tags[ext.GRPCFullMethod]) diff --git a/contrib/gopkg.in/jinzhu/gorm.v1/example_test.go b/contrib/gopkg.in/jinzhu/gorm.v1/example_test.go deleted file mode 100644 index 1debd79f35..0000000000 --- a/contrib/gopkg.in/jinzhu/gorm.v1/example_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package gorm_test - -import ( - "log" - - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - gormtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gopkg.in/jinzhu/gorm.v1" - - "github.com/lib/pq" - "gopkg.in/jinzhu/gorm.v1" -) - -func ExampleOpen() { - // Register augments the provided driver with tracing, enabling it to be loaded by gormtrace.Open. - sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithServiceName("my-service")) - - // Open the registered driver, allowing all uses of the returned *gorm.DB to be traced, with the specified service name. - db, err := gormtrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable", gormtrace.WithServiceName("my-gorm-service")) - defer db.Close() - if err != nil { - log.Fatal(err) - } - - user := struct { - gorm.Model - Name string - }{} - - // All calls through gorm.DB are now traced. - db.Where("name = ?", "jinzhu").First(&user) -} diff --git a/contrib/gopkg.in/jinzhu/gorm.v1/gorm.go b/contrib/gopkg.in/jinzhu/gorm.v1/gorm.go deleted file mode 100644 index dd5580e9a7..0000000000 --- a/contrib/gopkg.in/jinzhu/gorm.v1/gorm.go +++ /dev/null @@ -1,153 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package gorm provides helper functions for tracing the jinzhu/gorm package (https://github.com/jinzhu/gorm). -// -// Deprecated: The underlying gopkg.in/jinzhu/gorm packages has known security vulnerabilities and is no longer under -// active development. As such consider this package DEPRECATED. -// It is highly recommended that you update to the latest version available here as a contrib package "gorm.io/gorm.v1". -package gorm - -import ( - "context" - "math" - "time" - - sqltraced "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "gopkg.in/jinzhu/gorm.v1" -) - -const componentName = "gopkg.in/jinzhu/gorm.v1" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) -} - -const ( - gormContextKey = "dd-trace-go:context" - gormConfigKey = "dd-trace-go:config" - gormSpanStartTimeKey = "dd-trace-go:span" -) - -// Open opens a new (traced) database connection. The used dialect must be formerly registered -// using (gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql).Register. -func Open(dialect, source string, opts ...Option) (*gorm.DB, error) { - sqldb, err := sqltraced.Open(dialect, source) - if err != nil { - return nil, err - } - db, err := gorm.Open(dialect, sqldb) - if err != nil { - return db, err - } - return WithCallbacks(db, opts...), err -} - -// WithCallbacks registers callbacks to the gorm.DB for tracing. -// It should be called once, after opening the db. -// The callbacks are triggered by Create, Update, Delete, -// Query and RowQuery operations. -func WithCallbacks(db *gorm.DB, opts ...Option) *gorm.DB { - afterFunc := func(operationName string) func(*gorm.Scope) { - return func(scope *gorm.Scope) { - after(scope, operationName) - } - } - - cb := db.Callback() - cb.Create().Before("gorm:before_create").Register("dd-trace-go:before_create", before) - cb.Create().After("gorm:after_create").Register("dd-trace-go:after_create", afterFunc("gorm.create")) - cb.Update().Before("gorm:before_update").Register("dd-trace-go:before_update", before) - cb.Update().After("gorm:after_update").Register("dd-trace-go:after_update", afterFunc("gorm.update")) - cb.Delete().Before("gorm:before_delete").Register("dd-trace-go:before_delete", before) - cb.Delete().After("gorm:after_delete").Register("dd-trace-go:after_delete", afterFunc("gorm.delete")) - cb.Query().Before("gorm:query").Register("dd-trace-go:before_query", before) - cb.Query().After("gorm:after_query").Register("dd-trace-go:after_query", afterFunc("gorm.query")) - cb.RowQuery().Before("gorm:row_query").Register("dd-trace-go:before_row_query", before) - cb.RowQuery().After("gorm:row_query").Register("dd-trace-go:after_row_query", afterFunc("gorm.row_query")) - - cfg := new(config) - defaults(cfg) - for _, fn := range opts { - fn(cfg) - } - log.Debug("contrib/gopkg.in/jinzhu/gorm.v1: Registering Callbacks: %#v", cfg) - return db.Set(gormConfigKey, cfg) -} - -// WithContext attaches the specified context to the given db. The context will -// be used as a basis for creating new spans. An example use case is providing -// a context which contains a span to be used as a parent. -func WithContext(ctx context.Context, db *gorm.DB) *gorm.DB { - if ctx == nil { - return db - } - db = db.Set(gormContextKey, ctx) - return db -} - -// ContextFromDB returns any context previously attached to db using WithContext, -// otherwise returning context.Background. -func ContextFromDB(db *gorm.DB) context.Context { - if v, ok := db.Get(gormContextKey); ok { - if ctx, ok := v.(context.Context); ok { - return ctx - } - } - return context.Background() -} - -func before(scope *gorm.Scope) { - scope.Set(gormSpanStartTimeKey, time.Now()) -} - -func after(scope *gorm.Scope, operationName string) { - v, ok := scope.Get(gormContextKey) - if !ok { - return - } - ctx := v.(context.Context) - - v, ok = scope.Get(gormConfigKey) - if !ok { - return - } - cfg := v.(*config) - - v, ok = scope.Get(gormSpanStartTimeKey) - if !ok { - return - } - t, ok := v.(time.Time) - - opts := []ddtrace.StartSpanOption{ - tracer.StartTime(t), - tracer.ServiceName(cfg.serviceName), - tracer.SpanType(ext.SpanTypeSQL), - tracer.ResourceName(scope.SQL), - tracer.Tag(ext.Component, componentName), - } - if !math.IsNaN(cfg.analyticsRate) { - opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - if cfg.tagFns != nil { - for key, tagFn := range cfg.tagFns { - opts = append(opts, tracer.Tag(key, tagFn(scope))) - } - } - - span, _ := tracer.StartSpanFromContext(ctx, operationName, opts...) - defer span.Finish() - if cfg.errCheck(scope.DB().Error) { - span.SetTag(ext.Error, scope.DB().Error) - } -} diff --git a/contrib/gopkg.in/jinzhu/gorm.v1/gorm_test.go b/contrib/gopkg.in/jinzhu/gorm.v1/gorm_test.go deleted file mode 100644 index 91b24eba01..0000000000 --- a/contrib/gopkg.in/jinzhu/gorm.v1/gorm_test.go +++ /dev/null @@ -1,425 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package gorm - -import ( - "context" - "fmt" - "log" - "os" - "testing" - - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/sqltest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - - mssql "github.com/denisenkom/go-mssqldb" - "github.com/go-sql-driver/mysql" - "github.com/lib/pq" - "github.com/stretchr/testify/assert" - "gopkg.in/jinzhu/gorm.v1" -) - -// tableName holds the SQL table that these tests will be run against. It must be unique cross-repo. -const tableName = "testgorm" - -func TestMain(m *testing.M) { - _, ok := os.LookupEnv("INTEGRATION") - if !ok { - fmt.Println("--- SKIP: to enable integration test, set the INTEGRATION environment variable") - os.Exit(0) - } - cleanup := sqltest.Prepare(tableName) - testResult := m.Run() - cleanup() - os.Exit(testResult) -} - -func TestMySQL(t *testing.T) { - sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("mysql-test")) - db, err := Open("mysql", "test:test@tcp(127.0.0.1:3306)/test") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - testConfig := &sqltest.Config{ - DB: db.DB(), - DriverName: "mysql", - TableName: tableName, - ExpectName: "mysql.query", - ExpectTags: map[string]interface{}{ - ext.ServiceName: "mysql-test", - ext.SpanType: ext.SpanTypeSQL, - ext.TargetHost: "127.0.0.1", - ext.TargetPort: "3306", - "db.user": "test", - "db.name": "test", - }, - } - sqltest.RunAll(t, testConfig) -} - -func TestPostgres(t *testing.T) { - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - testConfig := &sqltest.Config{ - DB: db.DB(), - DriverName: "postgres", - TableName: tableName, - ExpectName: "postgres.query", - ExpectTags: map[string]interface{}{ - ext.ServiceName: "postgres.db", - ext.SpanType: ext.SpanTypeSQL, - ext.TargetHost: "127.0.0.1", - ext.TargetPort: "5432", - "db.user": "postgres", - "db.name": "postgres", - }, - } - sqltest.RunAll(t, testConfig) -} - -func TestSqlServer(t *testing.T) { - sqltrace.Register("sqlserver", &mssql.Driver{}) - db, err := Open("sqlserver", "sqlserver://sa:myPassw0rd@127.0.0.1:1433?database=master") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - testConfig := &sqltest.Config{ - DB: db.DB(), - DriverName: "sqlserver", - TableName: tableName, - ExpectName: "sqlserver.query", - ExpectTags: map[string]interface{}{ - ext.ServiceName: "sqlserver.db", - ext.SpanType: ext.SpanTypeSQL, - ext.TargetHost: "127.0.0.1", - ext.TargetPort: "1433", - ext.DBUser: "sa", - ext.DBName: "master", - ext.EventSampleRate: nil, - }, - } - sqltest.RunAll(t, testConfig) -} - -type Product struct { - gorm.Model - Code string - Price uint -} - -func TestCallbacks(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - t.Run("create", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - db.Create(&Product{Code: "L1212", Price: 1000}) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - span := spans[len(spans)-3] - assert.Equal("gorm.create", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal( - `INSERT INTO "products" ("created_at","updated_at","deleted_at","code","price") VALUES ($1,$2,$3,$4,$5) RETURNING "products"."id"`, - span.Tag(ext.ResourceName)) - assert.Equal("gopkg.in/jinzhu/gorm.v1", span.Tag(ext.Component)) - }) - - t.Run("query", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var product Product - db.First(&product, "code = ?", "L1212") - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 2) - - span := spans[len(spans)-2] - assert.Equal("gorm.query", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal( - `SELECT * FROM "products" WHERE "products"."deleted_at" IS NULL AND ((code = $1)) ORDER BY "products"."id" ASC LIMIT 1`, - span.Tag(ext.ResourceName)) - assert.Equal("gopkg.in/jinzhu/gorm.v1", span.Tag(ext.Component)) - }) - - t.Run("update", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var product Product - db.First(&product, "code = ?", "L1212") - db.Model(&product).Update("Price", 2000) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - span := spans[len(spans)-3] - assert.Equal("gorm.update", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal( - `UPDATE "products" SET "price" = $1, "updated_at" = $2 WHERE "products"."deleted_at" IS NULL AND "products"."id" = $3`, - span.Tag(ext.ResourceName)) - assert.Equal("gopkg.in/jinzhu/gorm.v1", span.Tag(ext.Component)) - }) - - t.Run("delete", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var product Product - db.First(&product, "code = ?", "L1212") - db.Delete(&product) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - span := spans[len(spans)-3] - assert.Equal("gorm.delete", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal( - `UPDATE "products" SET "deleted_at"=$1 WHERE "products"."deleted_at" IS NULL AND "products"."id" = $2`, - span.Tag(ext.ResourceName)) - assert.Equal("gopkg.in/jinzhu/gorm.v1", span.Tag(ext.Component)) - }) -} - -func TestAnalyticsSettings(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", opts...) - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - db.Create(&Product{Code: "L1212", Price: 1000}) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(t, len(spans) > 3) - s := spans[len(spans)-3] - assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil) - }) - - t.Run("global", func(t *testing.T) { - t.Skip("global flag disabled") - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - - t.Run("enabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, 1.0, WithAnalytics(true)) - }) - - t.Run("disabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil, WithAnalytics(false)) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) - }) -} - -func TestContext(t *testing.T) { - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - t.Run("with", func(t *testing.T) { - type key string - testCtx := context.WithValue(context.Background(), key("test context"), true) - db := WithContext(testCtx, db) - ctx := ContextFromDB(db) - assert.Equal(t, testCtx, ctx) - }) - - t.Run("without", func(t *testing.T) { - ctx := ContextFromDB(db) - assert.Equal(t, context.Background(), ctx) - }) -} - -func TestCustomTags(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", - WithCustomTag("custom_tag", func(scope *gorm.Scope) interface{} { - return scope.SQLVars[3] - }), - ) - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - db.Create(&Product{Code: "L1212", Price: 1000}) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - // We deterministically expect the span to be the third last, - // followed by the underlying postgres DB trace and the above http.request span. - span := spans[len(spans)-3] - assert.Equal("gorm.create", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal("L1212", span.Tag("custom_tag")) - assert.Equal( - `INSERT INTO "products" ("created_at","updated_at","deleted_at","code","price") VALUES ($1,$2,$3,$4,$5) RETURNING "products"."id"`, - span.Tag(ext.ResourceName)) - assert.Equal("gopkg.in/jinzhu/gorm.v1", span.Tag(ext.Component)) -} - -func TestError(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertErrCheck := func(t *testing.T, mt mocktracer.Tracer, errExist bool, opts ...Option) { - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", opts...) - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - db = WithContext(context.Background(), db) - db.Find(&Product{}, Product{Code: "L1210", Price: 2000}) - - spans := mt.FinishedSpans() - assert.True(t, len(spans) > 1) - - // Get last span (gorm.db) - s := spans[len(spans)-1] - assert.Equal(t, errExist, s.Tag(ext.Error) != nil) - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertErrCheck(t, mt, true) - }) - - t.Run("errcheck", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - errFn := func(err error) bool { - if err == gorm.ErrRecordNotFound { - return false - } - return true - } - assertErrCheck(t, mt, false, WithErrorCheck(errFn)) - }) -} diff --git a/contrib/gopkg.in/jinzhu/gorm.v1/option.go b/contrib/gopkg.in/jinzhu/gorm.v1/option.go deleted file mode 100644 index 9d229ff76a..0000000000 --- a/contrib/gopkg.in/jinzhu/gorm.v1/option.go +++ /dev/null @@ -1,87 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package gorm - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - - "gopkg.in/jinzhu/gorm.v1" -) - -type config struct { - serviceName string - analyticsRate float64 - dsn string - tagFns map[string]func(scope *gorm.Scope) interface{} - errCheck func(err error) bool -} - -// Option represents an option that can be passed to Register, Open or OpenDB. -type Option func(*config) - -func defaults(cfg *config) { - cfg.serviceName = "gorm.db" - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GORM_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - cfg.errCheck = func(error) bool { return true } -} - -// WithServiceName sets the given service name when registering a driver, -// or opening a database connection. -func WithServiceName(name string) Option { - return func(cfg *config) { - cfg.serviceName = name - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(cfg *config) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(cfg *config) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithCustomTag will cause the given tagFn to be evaluated after executing -// a query and attach the result to the span tagged by the key. -func WithCustomTag(tag string, tagFn func(scope *gorm.Scope) interface{}) Option { - return func(cfg *config) { - if cfg.tagFns == nil { - cfg.tagFns = make(map[string]func(scope *gorm.Scope) interface{}) - } - cfg.tagFns[tag] = tagFn - } -} - -// WithErrorCheck specifies a function fn which determines whether the passed -// error should be marked as an error. The fn is called whenever a gorm operation -// finishes with an error -func WithErrorCheck(fn func(err error) bool) Option { - return func(cfg *config) { - cfg.errCheck = fn - } -} diff --git a/contrib/gorilla/mux/example_test.go b/contrib/gorilla/mux/example_test.go index e4e1f9bd3c..9fd5b65b7a 100644 --- a/contrib/gorilla/mux/example_test.go +++ b/contrib/gorilla/mux/example_test.go @@ -8,7 +8,8 @@ package mux_test import ( "net/http" - muxtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gorilla/mux" + muxtrace "github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func handler(w http.ResponseWriter, _ *http.Request) { @@ -16,13 +17,19 @@ func handler(w http.ResponseWriter, _ *http.Request) { } func Example() { + tracer.Start() + defer tracer.Stop() + mux := muxtrace.NewRouter() mux.HandleFunc("/", handler) http.ListenAndServe(":8080", mux) } func Example_withServiceName() { - mux := muxtrace.NewRouter(muxtrace.WithServiceName("mux.route")) + tracer.Start() + defer tracer.Stop() + + mux := muxtrace.NewRouter(muxtrace.WithService("mux.route")) mux.HandleFunc("/", handler) http.ListenAndServe(":8080", mux) } diff --git a/contrib/gorilla/mux/go.mod b/contrib/gorilla/mux/go.mod new file mode 100644 index 0000000000..2bb37c07b3 --- /dev/null +++ b/contrib/gorilla/mux/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/gorilla/mux v1.8.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/gorilla/mux/go.sum b/contrib/gorilla/mux/go.sum new file mode 100644 index 0000000000..d4b71a0704 --- /dev/null +++ b/contrib/gorilla/mux/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/gorilla/mux/mux.go b/contrib/gorilla/mux/mux.go index 22affde4c9..b440bc3b34 100644 --- a/contrib/gorilla/mux/mux.go +++ b/contrib/gorilla/mux/mux.go @@ -4,27 +4,25 @@ // Copyright 2016 Datadog, Inc. // Package mux provides tracing functions for tracing the gorilla/mux package (https://github.com/gorilla/mux). -package mux // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/gorilla/mux" +package mux // import "github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2" import ( "net/http" - httptraceinternal "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + instrhttptrace "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/gorilla/mux" ) -const componentName = "gorilla/mux" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/gorilla/mux") + instr = instrumentation.Load(instrumentation.PackageGorillaMux) } // Router registers routes to be matched and dispatches a handler. @@ -99,7 +97,7 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { match mux.RouteMatch route string ) - spanopts := options.Copy(r.config.spanOpts...) + spanopts := options.Expand(r.config.spanOpts, 0, 2) // get the resource associated to this request if r.Match(req, &match) && match.Route != nil { if h, err := match.Route.GetHostTemplate(); err == nil { @@ -107,16 +105,18 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { } route, _ = match.Route.GetPathTemplate() } - spanopts = append(spanopts, httptraceinternal.HeaderTagsFromRequest(req, r.config.headerTags)) + spanopts = append(spanopts, instrhttptrace.HeaderTagsFromRequest(req, r.config.headerTags)) resource := r.config.resourceNamer(r, req) httptrace.TraceAndServe(r.Router, w, req, &httptrace.ServeConfig{ - Service: r.config.serviceName, - Resource: resource, - FinishOpts: r.config.finishOpts, - SpanOpts: spanopts, - QueryParams: r.config.queryParams, - RouteParams: match.Vars, - Route: route, + Framework: "github.com/gorilla/mux", + Service: r.config.serviceName, + Resource: resource, + FinishOpts: r.config.finishOpts, + SpanOpts: spanopts, + QueryParams: r.config.queryParams, + RouteParams: match.Vars, + Route: route, + IsStatusError: r.config.isStatusError, }) } @@ -124,9 +124,9 @@ func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { // requests and responses served by the router. func WrapRouter(router *mux.Router, opts ...RouterOption) *Router { cfg := newConfig(opts) - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, instrumentation.PackageGorillaMux)) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - log.Debug("contrib/gorilla/mux: Configuring Router: %#v", cfg) + instr.Logger().Debug("contrib/gorilla/mux: Configuring Router: %#v", cfg) return &Router{ Router: router, config: cfg, diff --git a/contrib/gorilla/mux/mux_test.go b/contrib/gorilla/mux/mux_test.go index 8d08812805..8ad57d7ca8 100644 --- a/contrib/gorilla/mux/mux_test.go +++ b/contrib/gorilla/mux/mux_test.go @@ -14,14 +14,12 @@ import ( "strings" "testing" - pappsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + pappsec "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -104,6 +102,7 @@ func TestHttpTracer(t *testing.T) { assert.Equal(ht.wantResource, s.Tag(ext.ResourceName)) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) assert.Equal("gorilla/mux", s.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageGorillaMux), s.Integration()) if ht.wantRoute != "" { assert.Equal(ht.wantRoute, s.Tag(ext.HTTPRoute)) } else { @@ -111,7 +110,7 @@ func TestHttpTracer(t *testing.T) { } if ht.wantErr != "" { - assert.Equal(ht.wantErr, s.Tag(ext.Error).(error).Error()) + assert.Equal(ht.wantErr, s.Tag(ext.ErrorMsg)) } }) } @@ -121,7 +120,7 @@ func TestDomain(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - mux := NewRouter(WithServiceName("my-service")) + mux := NewRouter(WithService("my-service")) mux.Handle("/200", okHandler()).Host("localhost") r := httptest.NewRequest("GET", "http://localhost/200", nil) w := httptest.NewRecorder() @@ -154,61 +153,58 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + testutils.SetGlobalHeaderTags(t, "3header") - r := setupReq() + _ = setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") }) } @@ -225,11 +221,50 @@ func TestWithQueryParams(t *testing.T) { assert.Equal("http://localhost/200?%3Credacted%3E&id=3&name=5", mt.FinishedSpans()[0].Tags()[ext.HTTPURL]) } +func TestWithStatusCheck(t *testing.T) { + for _, ht := range []struct { + name string + hasErr bool + isStatusError func(statusCode int) bool + }{ + { + name: "without-statuscheck", + hasErr: true, + isStatusError: nil, + }, + { + name: "with-statuscheck", + hasErr: false, + isStatusError: func(_ int) bool { return false }, + }, + } { + t.Run(ht.name, func(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + r := httptest.NewRequest("GET", "/500", nil) + w := httptest.NewRecorder() + mux := NewRouter(WithStatusCheck(ht.isStatusError)) + mux.Handle("/500", errorHandler(http.StatusInternalServerError)) + mux.ServeHTTP(w, r) + assert.Equal(http.StatusInternalServerError, w.Code) + + spans := mt.FinishedSpans() + assert.Equal(1, len(spans)) + + s := spans[0] + _, ok := s.Tag(ext.ErrorMsg).(string) + assert.Equal(ht.hasErr, ok) + }) + } +} + func TestSpanOptions(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - mux := NewRouter(WithSpanOptions(tracer.Tag(ext.SamplingPriority, 2))) + mux := NewRouter(WithSpanOptions(tracer.Tag(ext.ManualKeep, true))) mux.Handle("/200", okHandler()).Host("localhost") r := httptest.NewRequest("GET", "http://localhost/200", nil) w := httptest.NewRecorder() @@ -237,7 +272,7 @@ func TestSpanOptions(t *testing.T) { spans := mt.FinishedSpans() assert.Equal(1, len(spans)) - assert.Equal(2, spans[0].Tag(ext.SamplingPriority)) + assert.Equal(float64(2), spans[0].Tag("_sampling_priority_v1")) } func TestNoDebugStack(t *testing.T) { @@ -253,8 +288,8 @@ func TestNoDebugStack(t *testing.T) { spans := mt.FinishedSpans() assert.Equal(1, len(spans)) s := spans[0] - assert.EqualError(s.Tags()[ext.Error].(error), "500: Internal Server Error") - assert.Equal("", spans[0].Tags()[ext.ErrorStack]) + assert.Equal(s.Tags()[ext.ErrorMsg], "500: Internal Server Error") + assert.Empty(spans[0].Tags()[ext.ErrorStack]) } // TestImplementingMethods is a regression tests asserting that all the mux.Router methods @@ -292,9 +327,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -317,9 +350,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -380,7 +411,7 @@ func TestResourceNamer(t *testing.T) { } func router() http.Handler { - mux := NewRouter(WithServiceName("my-service")) + mux := NewRouter(WithService("my-service")) mux.Handle("/200", okHandler()) mux.Handle("/500", errorHandler(http.StatusInternalServerError)) mux.Handle("/405", okHandler()).Methods("GET") @@ -391,32 +422,31 @@ func router() http.Handler { } func errorHandler(code int) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) } func okHandler() http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + return http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("200!\n")) }) } func TestAppSec(t *testing.T) { - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) - if !appsec.Enabled() { + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } // Start and trace an HTTP server with some testing routes router := NewRouter() - router.HandleFunc("/path0.0/{myPathParam0}/path0.1/{myPathParam1}/path0.2/{myPathParam2}/path0.3/{myPathParam3}", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/path0.0/{myPathParam0}/path0.1/{myPathParam1}/path0.2/{myPathParam2}/path0.3/{myPathParam3}", func(w http.ResponseWriter, _ *http.Request) { _, err := w.Write([]byte("Hello World!\n")) require.NoError(t, err) }) - router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + router.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { _, err := w.Write([]byte("Hello World!\n")) require.NoError(t, err) }) @@ -531,23 +561,3 @@ func TestAppSec(t *testing.T) { require.True(t, strings.Contains(event.(string), "crs-933-130")) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []RouterOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := NewRouter(opts...) - mux.Handle("/200", okHandler()) - req := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, req) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "mux.router")(t) -} diff --git a/contrib/gorilla/mux/option.go b/contrib/gorilla/mux/option.go index 1346f263f9..09c42357eb 100644 --- a/contrib/gorilla/mux/option.go +++ b/contrib/gorilla/mux/option.go @@ -9,36 +9,40 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "mux.router" - type routerConfig struct { serviceName string - spanOpts []ddtrace.StartSpanOption // additional span options to be applied - finishOpts []ddtrace.FinishOption // span finish options to be applied + spanOpts []tracer.StartSpanOption // additional span options to be applied + finishOpts []tracer.FinishOption // span finish options to be applied analyticsRate float64 resourceNamer func(*Router, *http.Request) string ignoreRequest func(*http.Request) bool queryParams bool - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags + isStatusError func(statusCode int) bool +} + +// RouterOption describes options for the Gorilla mux integration. +type RouterOption interface { + apply(config *routerConfig) } -// RouterOption represents an option that can be passed to NewRouter. -type RouterOption func(*routerConfig) +// RouterOptionFn represents options applicable to NewRouter and WrapRouter. +type RouterOptionFn func(*routerConfig) + +func (fn RouterOptionFn) apply(cfg *routerConfig) { + fn(cfg) +} func newConfig(opts []RouterOption) *routerConfig { cfg := new(routerConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } if !math.IsNaN(cfg.analyticsRate) { cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) @@ -47,27 +51,23 @@ func newConfig(opts []RouterOption) *routerConfig { } func defaults(cfg *routerConfig) { - if internal.BoolEnv("DD_TRACE_MUX_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } - cfg.headerTags = globalconfig.HeaderTagMap() - cfg.serviceName = namingschema.ServiceName(defaultServiceName) + cfg.analyticsRate = instr.AnalyticsRate(true) + cfg.headerTags = instr.HTTPHeadersAsTags() + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) cfg.resourceNamer = defaultResourceNamer cfg.ignoreRequest = func(_ *http.Request) bool { return false } } // WithIgnoreRequest holds the function to use for determining if the // incoming HTTP request tracing should be skipped. -func WithIgnoreRequest(f func(*http.Request) bool) RouterOption { +func WithIgnoreRequest(f func(*http.Request) bool) RouterOptionFn { return func(cfg *routerConfig) { cfg.ignoreRequest = f } } -// WithServiceName sets the given service name for the router. -func WithServiceName(name string) RouterOption { +// WithService sets the given service name for the router. +func WithService(name string) RouterOptionFn { return func(cfg *routerConfig) { cfg.serviceName = name } @@ -75,7 +75,7 @@ func WithServiceName(name string) RouterOption { // WithSpanOptions applies the given set of options to the spans started // by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) RouterOption { +func WithSpanOptions(opts ...tracer.StartSpanOption) RouterOptionFn { return func(cfg *routerConfig) { cfg.spanOpts = opts } @@ -84,14 +84,14 @@ func WithSpanOptions(opts ...ddtrace.StartSpanOption) RouterOption { // NoDebugStack prevents stack traces from being attached to spans finishing // with an error. This is useful in situations where errors are frequent and // performance is critical. -func NoDebugStack() RouterOption { +func NoDebugStack() RouterOptionFn { return func(cfg *routerConfig) { cfg.finishOpts = append(cfg.finishOpts, tracer.NoDebugStack()) } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) RouterOption { +func WithAnalytics(on bool) RouterOptionFn { return func(cfg *routerConfig) { if on { cfg.analyticsRate = 1.0 @@ -103,7 +103,7 @@ func WithAnalytics(on bool) RouterOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) RouterOption { +func WithAnalyticsRate(rate float64) RouterOptionFn { return func(cfg *routerConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -115,7 +115,7 @@ func WithAnalyticsRate(rate float64) RouterOption { // WithResourceNamer specifies a quantizing function which will be used to // obtain the resource name for a given request. -func WithResourceNamer(namer func(router *Router, req *http.Request) string) RouterOption { +func WithResourceNamer(namer func(router *Router, req *http.Request) string) RouterOptionFn { return func(cfg *routerConfig) { cfg.resourceNamer = namer } @@ -125,18 +125,25 @@ func WithResourceNamer(namer func(router *Router, req *http.Request) string) Rou // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) RouterOption { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) RouterOptionFn { return func(cfg *routerConfig) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } // WithQueryParams specifies that the integration should attach request query parameters as APM tags. // Warning: using this feature can risk exposing sensitive data such as authorization tokens // to Datadog. -func WithQueryParams() RouterOption { +func WithQueryParams() RouterOptionFn { return func(cfg *routerConfig) { cfg.queryParams = true } } + +// WithStatusCheck specifies a function fn which reports whether the passed +// statusCode should be considered an error. +func WithStatusCheck(fn func(statusCode int) bool) RouterOptionFn { + return func(cfg *routerConfig) { + cfg.isStatusError = fn + } +} diff --git a/contrib/gorilla/mux/orchestrion.yml b/contrib/gorilla/mux/orchestrion.yml new file mode 100644 index 0000000000..723019c2ad --- /dev/null +++ b/contrib/gorilla/mux/orchestrion.yml @@ -0,0 +1,143 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 + description: Package gorilla/mux implements a request router and dispatcher for matching incoming requests to their respective handler. + +aspects: + # TODO(romain.marcadier): This is a temporary solution to instrument + # mux.Router without doing any refactor work in dd-trace-go at the moment. It + # contains a lot of code copied from the contrib that should be refactored so + # it can be re-used instead. + - id: Router.__dd_config + join-point: + struct-definition: github.com/gorilla/mux.Router + advice: + - inject-declarations: + imports: + http: net/http + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + lang: go1.18 # some parts of our codebase use generics, so ensure we can build if using old versions of gorilla/mux (e.g. if using a replace). + template: |- + var __dd_instr *instrumentation.Instrumentation + + func init() { + __dd_instr = instrumentation.Load(instrumentation.PackageGorillaMux) + } + + type ddRouterConfig struct { + ignoreRequest func(*http.Request) bool + headerTags instrumentation.HeaderTags + resourceNamer func(*Router, *http.Request) string + serviceName string + spanOpts []tracer.StartSpanOption + } + + func ddDefaultResourceNamer(router *Router, req *http.Request) string { + var ( + match RouteMatch + route = "unknown" + ) + if router.Match(req, &match) && match.Route != nil { + if r, err := match.Route.GetPathTemplate(); err == nil { + route = r + } + } + return fmt.Sprintf("%s %s", req.Method, route) + } + - add-struct-field: + name: __dd_config + type: ddRouterConfig + + - id: NewRouter + join-point: + all-of: + - import-path: github.com/gorilla/mux + - function-body: + function: + - name: NewRouter + advice: + - prepend-statements: + imports: + ext: github.com/DataDog/dd-trace-go/v2/ddtrace/ext + http: net/http + math: math + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + instrumentation: github.com/DataDog/dd-trace-go/v2/instrumentation + lang: go1.18 # some parts of our codebase use generics, so ensure we can build if using old versions of gorilla/mux (e.g. if using a replace). + template: |- + {{- $res := .Function.Result 0 -}} + defer func() { + analyticsRate := __dd_instr.AnalyticsRate(true) + {{ $res }}.__dd_config.headerTags = __dd_instr.HTTPHeadersAsTags() + {{ $res }}.__dd_config.serviceName = __dd_instr.ServiceName(instrumentation.ComponentServer, nil) + {{ $res }}.__dd_config.resourceNamer = ddDefaultResourceNamer + {{ $res }}.__dd_config.ignoreRequest = func(_ *http.Request) bool { return false } + + {{ $res }}.__dd_config.spanOpts = []tracer.StartSpanOption{ + tracer.Tag(ext.Component, instrumentation.PackageGorillaMux), + tracer.Tag(ext.SpanKind, ext.SpanKindServer), + } + if !math.IsNaN(analyticsRate) { + {{ $res }}.__dd_config.spanOpts = append( + {{ $res }}.__dd_config.spanOpts, + tracer.Tag(ext.EventSampleRate, analyticsRate), + ) + } + }() + + - id: Router.ServeHTTP + join-point: + function-body: + function: + - receiver: '*github.com/gorilla/mux.Router' + - name: ServeHTTP + advice: + - prepend-statements: + imports: + http: net/http + httptrace: github.com/DataDog/dd-trace-go/contrib/net/http/v2 + instrhttptrace: github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace + options: github.com/DataDog/dd-trace-go/v2/instrumentation/options + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + lang: go1.18 # some parts of our codebase use generics, so ensure we can build if using old versions of gorilla/mux (e.g. if using a replace). + template: |- + {{- $r := .Function.Receiver -}} + {{- $w := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + if !{{ $r }}.__dd_config.ignoreRequest({{ $req }}) { + var ( + match RouteMatch + route string + spanOpts = options.Copy({{ $r }}.__dd_config.spanOpts) + ) + if {{ $r }}.Match({{ $req }}, &match) && match.Route != nil { + if h, err := match.Route.GetHostTemplate(); err == nil { + spanOpts = append(spanOpts, tracer.Tag("mux.host", h)) + } + route, _ = match.Route.GetPathTemplate() + } + spanOpts = append(spanOpts, instrhttptrace.HeaderTagsFromRequest({{ $req }}, {{ $r }}.__dd_config.headerTags)) + resource := {{ $r }}.__dd_config.resourceNamer({{ $r }}, {{ $req }}) + + // This is a temporary workaround/hack to prevent endless recursion via httptrace.TraceAndServe, which + // basically implies passing a shallow copy of this router that ignores all requests down to + // httptrace.TraceAndServe. + var rCopy Router + rCopy = *{{ $r }} + rCopy.__dd_config.ignoreRequest = func(*http.Request) bool { return true } + + httptrace.TraceAndServe(&rCopy, {{ $w }}, {{ $req }}, &httptrace.ServeConfig{ + Service: {{ $r }}.__dd_config.serviceName, + Resource: resource, + SpanOpts: spanOpts, + RouteParams: match.Vars, + Route: route, + }) + return + } diff --git a/contrib/gorm.io/gorm.v1/example_test.go b/contrib/gorm.io/gorm.v1/example_test.go index 2b75405503..2d5326845a 100644 --- a/contrib/gorm.io/gorm.v1/example_test.go +++ b/contrib/gorm.io/gorm.v1/example_test.go @@ -10,10 +10,10 @@ import ( "errors" "log" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - gormtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/gorm.io/gorm.v1" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + gormtrace "github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/jackc/pgx/v5/stdlib" "gorm.io/driver/postgres" @@ -27,7 +27,7 @@ type User struct { func ExampleOpen() { // Register augments the provided driver with tracing, enabling it to be loaded by gormtrace.Open. - sqltrace.Register("pgx", &stdlib.Driver{}, sqltrace.WithServiceName("my-service")) + sqltrace.Register("pgx", &stdlib.Driver{}, sqltrace.WithService("my-service")) sqlDb, err := sqltrace.Open("pgx", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) @@ -45,7 +45,7 @@ func ExampleOpen() { // ExampleNewTracePlugin illustrates how to trace gorm using the gorm.Plugin api. func ExampleNewTracePlugin() { // Register augments the provided driver with tracing, enabling it to be loaded by gorm.Open and the gormtrace.TracePlugin. - sqltrace.Register("pgx", &stdlib.Driver{}, sqltrace.WithServiceName("my-service")) + sqltrace.Register("pgx", &stdlib.Driver{}, sqltrace.WithService("my-service")) sqlDb, err := sqltrace.Open("pgx", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) @@ -69,7 +69,7 @@ func ExampleNewTracePlugin() { func ExampleContext() { // Register augments the provided driver with tracing, enabling it to be loaded by gormtrace.Open. - sqltrace.Register("pgx", &stdlib.Driver{}, sqltrace.WithServiceName("my-service")) + sqltrace.Register("pgx", &stdlib.Driver{}, sqltrace.WithService("my-service")) sqlDb, err := sqltrace.Open("pgx", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) diff --git a/contrib/gorm.io/gorm.v1/go.mod b/contrib/gorm.io/gorm.v1/go.mod new file mode 100644 index 0000000000..878b9474c2 --- /dev/null +++ b/contrib/gorm.io/gorm.v1/go.mod @@ -0,0 +1,114 @@ +module github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 + +go 1.24.0 + +godebug x509negativeserial=1 + +require ( + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-sql-driver/mysql v1.6.0 + github.com/jackc/pgx/v5 v5.6.0 + github.com/lib/pq v1.10.2 + github.com/microsoft/go-mssqldb v0.21.0 + github.com/stretchr/testify v1.11.1 + gorm.io/driver/mysql v1.0.1 + gorm.io/driver/postgres v1.5.5 + gorm.io/driver/sqlserver v1.4.2 + gorm.io/gorm v1.25.5 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/database/sql/v2 => ../../database/sql + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/gorm.io/gorm.v1/go.sum b/contrib/gorm.io/gorm.v1/go.sum new file mode 100644 index 0000000000..657f48b763 --- /dev/null +++ b/contrib/gorm.io/gorm.v1/go.sum @@ -0,0 +1,434 @@ +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= +github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/microsoft/go-mssqldb v0.19.0/go.mod h1:ukJCBnnzLzpVF0qYRT+eg1e+eSwjeQ7IvenUv8QPook= +github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= +github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= +gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= +gorm.io/driver/postgres v1.5.5 h1:r1VBTQQrOAlUux3JI9V7rdxVWBPPnzxa315qNJUzmjI= +gorm.io/driver/postgres v1.5.5/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= +gorm.io/driver/sqlserver v1.4.2 h1:nMtEeKqv2R/vv9FoHUFWfXfP6SskAgRar0TPlZV1stk= +gorm.io/driver/sqlserver v1.4.2/go.mod h1:XHwBuB4Tlh7DqO0x7Ema8dmyWsQW7wi38VQOAFkrbXY= +gorm.io/gorm v1.9.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/contrib/gorm.io/gorm.v1/gorm.go b/contrib/gorm.io/gorm.v1/gorm.go index b87b8b79a0..9708a67890 100644 --- a/contrib/gorm.io/gorm.v1/gorm.go +++ b/contrib/gorm.io/gorm.v1/gorm.go @@ -9,20 +9,17 @@ package gorm import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "gorm.io/gorm" ) -const componentName = "gorm.io/gorm.v1" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageGormIOGormV1) } type key string @@ -52,7 +49,7 @@ func (g tracePlugin) Initialize(db *gorm.DB) error { } // Open opens a new (traced) database connection. The used driver must be formerly registered -// using (gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql).Register. +// using (github.com/DataDog/dd-trace-go/contrib/database/sql/v2).Register. func Open(dialector gorm.Dialector, cfg *gorm.Config, opts ...Option) (*gorm.DB, error) { var db *gorm.DB var err error @@ -68,12 +65,11 @@ func Open(dialector gorm.Dialector, cfg *gorm.Config, opts ...Option) (*gorm.DB, } func withCallbacks(db *gorm.DB, opts ...Option) (*gorm.DB, error) { - cfg := new(config) - defaults(cfg) + cfg := newConfigWithDefaults() for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("Registering Callbacks: %#v", cfg) + instr.Logger().Debug("Registering Callbacks: %#v", cfg) afterFunc := func() func(*gorm.DB) { return func(db *gorm.DB) { @@ -146,20 +142,14 @@ func before(db *gorm.DB, operationName string, cfg *config) { if db.Config == nil || db.Config.DryRun { return } - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(cfg.serviceName), tracer.SpanType(ext.SpanTypeSQL), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGormIOGormV1), } if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } - for key, tagFn := range cfg.tagFns { - if tagFn != nil { - opts = append(opts, tracer.Tag(key, tagFn(db))) - } - } - _, ctx := tracer.StartSpanFromContext(db.Statement.Context, operationName, opts...) db.Statement.Context = ctx } @@ -178,6 +168,15 @@ func after(db *gorm.DB, cfg *config) { dbErr = db.Error } span.SetTag(ext.ResourceName, db.Statement.SQL.String()) + + // process tagFns after setting the resource name to allow the resource + // name to be overridden + for key, tagFn := range cfg.tagFns { + if tagFn != nil { + span.SetTag(key, tagFn(db)) + } + } + span.Finish(tracer.WithError(dbErr)) } } diff --git a/contrib/gorm.io/gorm.v1/gorm_test.go b/contrib/gorm.io/gorm.v1/gorm_test.go index 8dac64bfcf..b6f95f9601 100644 --- a/contrib/gorm.io/gorm.v1/gorm_test.go +++ b/contrib/gorm.io/gorm.v1/gorm_test.go @@ -10,14 +10,16 @@ import ( "fmt" "log" "os" + "strings" "testing" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/sqltest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + sqltest "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/sql" "github.com/go-sql-driver/mysql" "github.com/jackc/pgx/v5/stdlib" @@ -66,7 +68,7 @@ func TestOpenDoesNotPanic(t *testing.T) { } func TestMySQL(t *testing.T) { - sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("mysql-test")) + sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithService("mysql-test")) sqlDb, err := sqltrace.Open("mysql", mysqlConnString) if err != nil { log.Fatal(err) @@ -216,6 +218,7 @@ func TestCallbacks(t *testing.T) { a.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) a.Equal(queryText, span.Tag(ext.ResourceName)) a.Equal("gorm.io/gorm.v1", span.Tag(ext.Component)) + a.Equal(string(instrumentation.PackageGormIOGormV1), span.Integration()) a.Equal(parentSpan.Context().SpanID(), span.ParentID()) for _, s := range spans { @@ -253,6 +256,7 @@ func TestCallbacks(t *testing.T) { a.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) a.Equal(queryText, span.Tag(ext.ResourceName)) a.Equal("gorm.io/gorm.v1", span.Tag(ext.Component)) + a.Equal(string(instrumentation.PackageGormIOGormV1), span.Integration()) a.Equal(parentSpan.Context().SpanID(), span.ParentID()) for _, s := range spans { @@ -311,6 +315,7 @@ func TestCallbacks(t *testing.T) { a.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) a.Equal(queryText, span.Tag(ext.ResourceName)) a.Equal("gorm.io/gorm.v1", span.Tag(ext.Component)) + a.Equal(string(instrumentation.PackageGormIOGormV1), span.Integration()) a.Equal(parentSpan.Context().SpanID(), span.ParentID()) for _, s := range spans { @@ -349,6 +354,7 @@ func TestCallbacks(t *testing.T) { a.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) a.Equal(queryText, span.Tag(ext.ResourceName)) a.Equal("gorm.io/gorm.v1", span.Tag(ext.Component)) + a.Equal(string(instrumentation.PackageGormIOGormV1), span.Integration()) a.Equal(parentSpan.Context().SpanID(), span.ParentID()) for _, s := range spans { @@ -433,51 +439,42 @@ func TestAnalyticsSettings(t *testing.T) { parentSpan.Finish() spans := mt.FinishedSpans() - assert.True(t, len(spans) > 2) + require.Greater(t, len(spans), 2) s := spans[len(spans)-2] assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) } t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() assertRate(t, mt, nil) }) t.Run("global", func(t *testing.T) { t.Skip("global flag disabled") - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) t.Run("enabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() assertRate(t, mt, 1.0, WithAnalytics(true)) }) t.Run("disabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() assertRate(t, mt, nil, WithAnalytics(false)) }) t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -526,18 +523,17 @@ func TestError(t *testing.T) { // Get last span (gorm.db) s := spans[len(spans)-1] - assert.Equal(t, errExist, s.Tag(ext.Error) != nil) + assert.Equal(t, errExist, s.Tag(ext.ErrorMsg) != nil) } t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() + assertErrCheck(t, mt, true) }) t.Run("errcheck", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() + defer mt.Reset() errFn := func(err error) bool { return err != gorm.ErrRecordNotFound } @@ -615,3 +611,32 @@ func TestPlugin(t *testing.T) { assert.NotNil(t, db.Callback().Raw().Get("dd-trace-go:before_raw_query")) assert.NotNil(t, db.Callback().Raw().Get("dd-trace-go:before_raw_query")) } + +func newStubDB() *gorm.DB { + sqlbuilder := strings.Builder{} + sqlbuilder.WriteString("SELECT * FROM products WHERE id = ?") + statement := &gorm.Statement{SQL: sqlbuilder, Context: context.Background()} + config := &gorm.Config{DryRun: false} + return &gorm.DB{Statement: statement, Config: config} +} + +func TestCustomResourceName(t *testing.T) { + // This test is meant to ensure that the resource name can be overridden by a custom tag. + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + cfg := newConfigWithDefaults() + customResourceName := "custom resource name" + WithCustomTag(ext.ResourceName, func(db *gorm.DB) interface{} { + return customResourceName + })(cfg) + + db := newStubDB() + before(db, "gorm.query", cfg) + after(db, cfg) + + spans := mt.FinishedSpans() + assert.True(len(spans) > 0) + assert.Equal(customResourceName, spans[len(spans)-1].Tag(ext.ResourceName)) +} diff --git a/contrib/gorm.io/gorm.v1/option.go b/contrib/gorm.io/gorm.v1/option.go index f305f8d96f..375205e5e3 100644 --- a/contrib/gorm.io/gorm.v1/option.go +++ b/contrib/gorm.io/gorm.v1/option.go @@ -8,8 +8,6 @@ package gorm import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gorm.io/gorm" ) @@ -21,31 +19,37 @@ type config struct { tagFns map[string]func(db *gorm.DB) interface{} } -// Option represents an option that can be passed to Register, Open or OpenDB. -type Option func(*config) +// Option describes options for the Gorm.io integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Open. +type OptionFn func(*config) -func defaults(cfg *config) { +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +func newConfigWithDefaults() *config { + cfg := new(config) cfg.serviceName = "gorm.db" - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GORM_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.analyticsRate = instr.AnalyticsRate(false) cfg.errCheck = func(error) bool { return true } cfg.tagFns = make(map[string]func(db *gorm.DB) interface{}) + return cfg } -// WithServiceName sets the given service name when registering a driver, +// WithService sets the given service name when registering a driver, // or opening a database connection. -func WithServiceName(name string) Option { +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -57,7 +61,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -70,7 +74,7 @@ func WithAnalyticsRate(rate float64) Option { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. The fn is called whenever a gorm operation // finishes -func WithErrorCheck(fn func(err error) bool) Option { +func WithErrorCheck(fn func(err error) bool) OptionFn { return func(cfg *config) { cfg.errCheck = fn } @@ -78,7 +82,7 @@ func WithErrorCheck(fn func(err error) bool) Option { // WithCustomTag will cause the given tagFn to be evaluated after executing // a query and attach the result to the span tagged by the key. -func WithCustomTag(tag string, tagFn func(db *gorm.DB) interface{}) Option { +func WithCustomTag(tag string, tagFn func(db *gorm.DB) interface{}) OptionFn { return func(cfg *config) { if tagFn != nil { cfg.tagFns[tag] = tagFn diff --git a/contrib/gorm.io/gorm.v1/orchestrion.yml b/contrib/gorm.io/gorm.v1/orchestrion.yml new file mode 100644 index 0000000000..bb11df8826 --- /dev/null +++ b/contrib/gorm.io/gorm.v1/orchestrion.yml @@ -0,0 +1,33 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 + description: The fantastic ORM library for Golang. + +aspects: + - id: Open + join-point: + function-call: gorm.io/gorm.Open + advice: + - wrap-expression: + imports: + gorm: gorm.io/gorm + gormtrace: github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 + template: |- + func() (*gorm.DB, error) { + db, err := {{ . }} + if err != nil { + return nil, err + } + if _, ok := db.Plugins["DDTracePlugin"]; ok { + return db, nil + } + if err := db.Use(gormtrace.NewTracePlugin()); err != nil { + return nil, err + } + return db, nil + }() diff --git a/contrib/graph-gophers/graphql-go/appsec_test.go b/contrib/graph-gophers/graphql-go/appsec_test.go index a0a025ba91..3d14eb9787 100644 --- a/contrib/graph-gophers/graphql-go/appsec_test.go +++ b/contrib/graph-gophers/graphql-go/appsec_test.go @@ -13,10 +13,10 @@ import ( "path" "testing" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/graph-gophers/graphql-go" "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" ) func TestAppSec(t *testing.T) { @@ -94,7 +94,7 @@ func TestAppSec(t *testing.T) { // The last finished span (which is GraphQL entry) should have the "_dd.appsec.enabled" tag. span := spans[len(spans)-1] - require.Equal(t, 1, span.Tag("_dd.appsec.enabled")) + require.Equal(t, float64(1), span.Tag("_dd.appsec.enabled")) type ddAppsecJSON struct { Triggers []struct { Rule struct { @@ -218,14 +218,13 @@ func enableAppSec(t *testing.T) func() { require.NoError(t, err) restoreDdAppsecEnabled := setEnv("DD_APPSEC_ENABLED", "1") restoreDdAppsecRules := setEnv("DD_APPSEC_RULES", rulesFile) - appsec.Start() + testutils.StartAppSec(t) restore := func() { - appsec.Stop() restoreDdAppsecEnabled() restoreDdAppsecRules() _ = os.RemoveAll(tmpDir) } - if !appsec.Enabled() { + if !instr.AppSecEnabled() { restore() t.Skip("could not enable appsec: this platform is likely not supported") } diff --git a/contrib/graph-gophers/graphql-go/example_test.go b/contrib/graph-gophers/graphql-go/example_test.go index 1f434a83ee..f2cab91678 100644 --- a/contrib/graph-gophers/graphql-go/example_test.go +++ b/contrib/graph-gophers/graphql-go/example_test.go @@ -9,7 +9,8 @@ import ( "log" "net/http" - graphqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/graph-gophers/graphql-go" + graphqltrace "github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" graphql "github.com/graph-gophers/graphql-go" "github.com/graph-gophers/graphql-go/relay" @@ -20,6 +21,9 @@ type resolver struct{} func (*resolver) Hello() string { return "Hello, world!" } func Example() { + tracer.Start() + defer tracer.Stop() + s := ` schema { query: Query diff --git a/contrib/graph-gophers/graphql-go/go.mod b/contrib/graph-gophers/graphql-go/go.mod new file mode 100644 index 0000000000..86f01faa65 --- /dev/null +++ b/contrib/graph-gophers/graphql-go/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/graph-gophers/graphql-go v1.5.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/graph-gophers/graphql-go/go.sum b/contrib/graph-gophers/graphql-go/go.sum new file mode 100644 index 0000000000..89a1b46706 --- /dev/null +++ b/contrib/graph-gophers/graphql-go/go.sum @@ -0,0 +1,316 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/graph-gophers/graphql-go/graphql.go b/contrib/graph-gophers/graphql-go/graphql.go index 040e7dff04..45493f4d57 100644 --- a/contrib/graph-gophers/graphql-go/graphql.go +++ b/contrib/graph-gophers/graphql-go/graphql.go @@ -6,33 +6,31 @@ // Package graphql provides functions to trace the graph-gophers/graphql-go package (https://github.com/graph-gophers/graphql-go). // // We use the tracing mechanism available in the -// https://godoc.org/github.com/graph-gophers/graphql-go/trace subpackage. +// https://pkg.go.dev/github.com/graph-gophers/graphql-go/trace subpackage. // Create a new Tracer with `NewTracer` and pass it as an additional option to // `MustParseSchema`. -package graphql // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/graph-gophers/graphql-go" +package graphql // import "github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2" import ( "context" "fmt" "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - ddtracer "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/graphqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/graphqlsec" + instrgraphql "github.com/DataDog/dd-trace-go/v2/instrumentation/graphql" "github.com/graph-gophers/graphql-go/errors" "github.com/graph-gophers/graphql-go/introspection" "github.com/graph-gophers/graphql-go/trace/tracer" ) -const componentName = "graph-gophers/graphql-go" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - ddtracer.MarkIntegrationImported("github.com/graph-gophers/graphql-go") + instr = instrumentation.Load(instrumentation.PackageGraphGophersGraphQLGo) } const ( @@ -53,11 +51,11 @@ var _ tracer.Tracer = (*Tracer)(nil) // TraceQuery traces a GraphQL query. func (t *Tracer) TraceQuery(ctx context.Context, queryString, operationName string, variables map[string]interface{}, _ map[string]*introspection.Type) (context.Context, tracer.QueryFinishFunc) { - opts := []ddtrace.StartSpanOption{ + opts := []ddtracer.StartSpanOption{ ddtracer.ServiceName(t.cfg.serviceName), ddtracer.Tag(tagGraphqlQuery, queryString), ddtracer.Tag(tagGraphqlOperationName, operationName), - ddtracer.Tag(ext.Component, componentName), + ddtracer.Tag(ext.Component, instrumentation.PackageGraphGophersGraphQLGo), ddtracer.Measured(), } if t.cfg.traceVariables { @@ -70,7 +68,7 @@ func (t *Tracer) TraceQuery(ctx context.Context, queryString, operationName stri } span, ctx := ddtracer.StartSpanFromContext(ctx, t.cfg.querySpanName, opts...) - ctx, request := graphqlsec.StartRequestOperation(ctx, graphqlsec.RequestOperationArgs{ + ctx, request := graphqlsec.StartRequestOperation(ctx, span, graphqlsec.RequestOperationArgs{ RawQuery: queryString, OperationName: operationName, Variables: variables, @@ -91,8 +89,9 @@ func (t *Tracer) TraceQuery(ctx context.Context, queryString, operationName stri default: err = fmt.Errorf("%s (and %d more errors)", errs[0], n-1) } + instrgraphql.AddErrorsAsSpanEvents(span, toGraphqlErrors(errs), t.cfg.errExtensions) defer span.Finish(ddtracer.WithError(err)) - defer request.Finish(span, graphqlsec.RequestOperationRes{Error: err}) + defer request.Finish(graphqlsec.RequestOperationRes{Error: err}) query.Finish(graphqlsec.ExecutionOperationRes{Error: err}) } } @@ -100,13 +99,13 @@ func (t *Tracer) TraceQuery(ctx context.Context, queryString, operationName stri // TraceField traces a GraphQL field access. func (t *Tracer) TraceField(ctx context.Context, _, typeName, fieldName string, trivial bool, arguments map[string]interface{}) (context.Context, tracer.FieldFinishFunc) { if t.cfg.omitTrivial && trivial { - return ctx, func(queryError *errors.QueryError) {} + return ctx, func(_ *errors.QueryError) {} } - opts := []ddtrace.StartSpanOption{ + opts := []ddtracer.StartSpanOption{ ddtracer.ServiceName(t.cfg.serviceName), ddtracer.Tag(tagGraphqlField, fieldName), ddtracer.Tag(tagGraphqlType, typeName), - ddtracer.Tag(ext.Component, componentName), + ddtracer.Tag(ext.Component, instrumentation.PackageGraphGophersGraphQLGo), ddtracer.Measured(), } if t.cfg.traceVariables { @@ -143,10 +142,31 @@ func NewTracer(opts ...Option) tracer.Tracer { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/graph-gophers/graphql-go: Configuring Graphql Tracer: %#v", cfg) + instr.Logger().Debug("contrib/graph-gophers/graphql-go: Configuring Graphql Tracer: %#v", cfg) return &Tracer{ cfg: cfg, } } + +func toGraphqlErrors(errs []*errors.QueryError) []instrgraphql.Error { + res := make([]instrgraphql.Error, 0, len(errs)) + for _, err := range errs { + locs := make([]instrgraphql.ErrorLocation, 0, len(err.Locations)) + for _, loc := range err.Locations { + locs = append(locs, instrgraphql.ErrorLocation{ + Line: loc.Line, + Column: loc.Column, + }) + } + res = append(res, instrgraphql.Error{ + OriginalErr: err, + Message: err.Message, + Locations: locs, + Path: err.Path, + Extensions: err.Extensions, + }) + } + return res +} diff --git a/contrib/graph-gophers/graphql-go/graphql_test.go b/contrib/graph-gophers/graphql-go/graphql_test.go index f9c892ac87..67301e28c5 100644 --- a/contrib/graph-gophers/graphql-go/graphql_test.go +++ b/contrib/graph-gophers/graphql-go/graphql_test.go @@ -11,11 +11,10 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/lists" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/graph-gophers/graphql-go" "github.com/graph-gophers/graphql-go/relay" @@ -27,6 +26,33 @@ type testResolver struct{} func (*testResolver) Hello() string { return "Hello, world!" } func (*testResolver) HelloNonTrivial() (string, error) { return "Hello, world!", nil } +func (*testResolver) WithError() (*graphql.ID, error) { + return nil, customError{ + message: "test error", + extensions: map[string]any{ + "int": 1, + "float": 1.1, + "str": "1", + "bool": true, + "slice": []string{"1", "2"}, + "unsupported_type_stringified": []any{1, "foo"}, + "not_captured": "nope", + }, + } +} + +type customError struct { + message string + extensions map[string]any +} + +func (e customError) Error() string { + return e.message +} + +func (e customError) Extensions() map[string]any { + return e.extensions +} const testServerSchema = ` schema { @@ -35,6 +61,7 @@ const testServerSchema = ` type Query { hello: String! helloNonTrivial: String! + withError: ID } ` @@ -45,7 +72,7 @@ func newTestServer(opts ...Option) *httptest.Server { func Test(t *testing.T) { makeRequest := func(opts ...Option) { - opts = append([]Option{WithServiceName("test-graphql-service")}, opts...) + opts = append([]Option{WithService("test-graphql-service")}, opts...) srv := newTestServer(opts...) defer srv.Close() q := `{"query": "query TestQuery() { hello, helloNonTrivial }", "operationName": "TestQuery"}` @@ -74,32 +101,35 @@ func Test(t *testing.T) { { s := spans[helloNonTrivialSpanIndex] assert.Equal(t, "helloNonTrivial", s.Tag(tagGraphqlField)) - assert.Nil(t, s.Tag(ext.Error)) + assert.Zero(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "test-graphql-service", s.Tag(ext.ServiceName)) assert.Equal(t, "Query", s.Tag(tagGraphqlType)) assert.Equal(t, "graphql.field", s.OperationName()) assert.Equal(t, "graphql.field", s.Tag(ext.ResourceName)) assert.Equal(t, "graph-gophers/graphql-go", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGraphGophersGraphQLGo), s.Integration()) } { s := spans[helloSpanIndex] assert.Equal(t, "hello", s.Tag(tagGraphqlField)) - assert.Nil(t, s.Tag(ext.Error)) + assert.Zero(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "test-graphql-service", s.Tag(ext.ServiceName)) assert.Equal(t, "Query", s.Tag(tagGraphqlType)) assert.Equal(t, "graphql.field", s.OperationName()) assert.Equal(t, "graphql.field", s.Tag(ext.ResourceName)) assert.Equal(t, "graph-gophers/graphql-go", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGraphGophersGraphQLGo), s.Integration()) } { s := spans[2] assert.Equal(t, "query TestQuery() { hello, helloNonTrivial }", s.Tag(tagGraphqlQuery)) assert.Equal(t, "TestQuery", s.Tag(tagGraphqlOperationName)) - assert.Nil(t, s.Tag(ext.Error)) + assert.Zero(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "test-graphql-service", s.Tag(ext.ServiceName)) assert.Equal(t, "graphql.request", s.OperationName()) assert.Equal(t, "graphql.request", s.Tag(ext.ResourceName)) assert.Equal(t, "graph-gophers/graphql-go", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGraphGophersGraphQLGo), s.Integration()) } }) t.Run("WithOmitTrivial", func(t *testing.T) { @@ -114,22 +144,24 @@ func Test(t *testing.T) { { s := spans[0] assert.Equal(t, "helloNonTrivial", s.Tag(tagGraphqlField)) - assert.Nil(t, s.Tag(ext.Error)) + assert.Zero(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "test-graphql-service", s.Tag(ext.ServiceName)) assert.Equal(t, "Query", s.Tag(tagGraphqlType)) assert.Equal(t, "graphql.field", s.OperationName()) assert.Equal(t, "graphql.field", s.Tag(ext.ResourceName)) assert.Equal(t, "graph-gophers/graphql-go", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGraphGophersGraphQLGo), s.Integration()) } { s := spans[1] assert.Equal(t, "query TestQuery() { hello, helloNonTrivial }", s.Tag(tagGraphqlQuery)) assert.Equal(t, "TestQuery", s.Tag(tagGraphqlOperationName)) - assert.Nil(t, s.Tag(ext.Error)) + assert.Zero(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "test-graphql-service", s.Tag(ext.ServiceName)) assert.Equal(t, "graphql.request", s.OperationName()) assert.Equal(t, "graphql.request", s.Tag(ext.ResourceName)) assert.Equal(t, "graph-gophers/graphql-go", s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageGraphGophersGraphQLGo), s.Integration()) } }) } @@ -160,9 +192,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -182,48 +212,56 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() +func TestErrorsAsSpanEvents(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() - srv := newTestServer(opts...) - defer srv.Close() - resp, err := http.Post(srv.URL, "application/json", strings.NewReader(`{"query": "{ hello }"}`)) - require.NoError(t, err) - defer resp.Body.Close() + srv := newTestServer(WithErrorExtensions("str", "float", "int", "bool", "slice", "unsupported_type_stringified")) + defer srv.Close() + + q := `{"query": "{ withError }"}` + resp, err := http.Post(srv.URL, "application/json", strings.NewReader(q)) + require.NoError(t, err) + defer resp.Body.Close() + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + + s0 := spans[1] + assert.Equal(t, "graphql.request", s0.OperationName()) + assert.NotNil(t, s0.Tag(ext.ErrorMsg)) - return mt.FinishedSpans() + events := s0.Events() + require.Len(t, events, 1) + + evt := events[0] + assert.Equal(t, "dd.graphql.query.error", evt.Name) + assert.NotEmpty(t, evt.TimeUnixNano) + assert.NotEmpty(t, evt.Attributes["stacktrace"]) + evt.AssertAttributes(t, map[string]any{ + "message": "test error", + "path": []string{"withError"}, + "stacktrace": evt.Attributes["stacktrace"], + "type": "*errors.QueryError", + "extensions.str": "1", + "extensions.int": 1, + "extensions.float": 1.1, + "extensions.bool": true, + "extensions.slice": []string{"1", "2"}, + "extensions.unsupported_type_stringified": "[1,\"foo\"]", }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "graphql.field", spans[0].OperationName()) - assert.Equal(t, "graphql.request", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "graphql.field", spans[0].OperationName()) - assert.Equal(t, "graphql.server.request", spans[1].OperationName()) - } - ddService := namingschematest.TestDDService - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: lists.RepeatString("graphql.server", 2), - WithDDService: lists.RepeatString(ddService, 2), - WithDDServiceAndOverride: lists.RepeatString(serviceOverride, 2), + + // the rest of the spans should not have span events + for _, s := range spans { + if s.OperationName() == "graphql.request" { + continue + } + assert.Emptyf(t, s.Events(), "span %s should not have span events", s.OperationName()) } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) } diff --git a/contrib/graph-gophers/graphql-go/option.go b/contrib/graph-gophers/graphql-go/option.go index d89a8b90e2..0cb7da4ad6 100644 --- a/contrib/graph-gophers/graphql-go/option.go +++ b/contrib/graph-gophers/graphql-go/option.go @@ -8,8 +8,8 @@ package graphql import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + instrgraphql "github.com/DataDog/dd-trace-go/v2/instrumentation/graphql" ) const defaultServiceName = "graphql.server" @@ -20,31 +20,37 @@ type config struct { analyticsRate float64 omitTrivial bool traceVariables bool + errExtensions []string } -// Option represents an option that can be used customize the Tracer. -type Option func(*config) +// Option describes options for the GraphQL-Go integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to NewTracer. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - cfg.querySpanName = namingschema.OpName(namingschema.GraphqlServer) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GRAPHQL_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.querySpanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) + cfg.errExtensions = instrgraphql.ErrorExtensionsFromEnv() } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) Option { +// WithService sets the given service name for the client. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -56,7 +62,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -68,7 +74,7 @@ func WithAnalyticsRate(rate float64) Option { // WithOmitTrivial enables omission of graphql fields marked as trivial. This // also opts trivial fields out of Threat Detection (and blocking). -func WithOmitTrivial() Option { +func WithOmitTrivial() OptionFn { return func(cfg *config) { cfg.omitTrivial = true } @@ -76,8 +82,15 @@ func WithOmitTrivial() Option { // WithTraceVariables enables tracing of variables passed into GraphQL queries // and resolvers. -func WithTraceVariables() Option { +func WithTraceVariables() OptionFn { return func(cfg *config) { cfg.traceVariables = true } } + +// WithErrorExtensions allows to configure the error extensions to include in the error span events. +func WithErrorExtensions(errExtensions ...string) OptionFn { + return func(cfg *config) { + cfg.errExtensions = instrgraphql.ParseErrorExtensions(errExtensions) + } +} diff --git a/contrib/graph-gophers/graphql-go/orchestrion.yml b/contrib/graph-gophers/graphql-go/orchestrion.yml new file mode 100644 index 0000000000..ce8696f145 --- /dev/null +++ b/contrib/graph-gophers/graphql-go/orchestrion.yml @@ -0,0 +1,25 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 + description: |- + The goal of this project is to provide full support of the [October 2021 GraphQL specification](https://spec.graphql.org/October2021/) with a set of idiomatic, easy to use Go packages. + +aspects: + - id: ParseSchema + join-point: + one-of: + - function-call: github.com/graph-gophers/graphql-go.MustParseSchema + - function-call: github.com/graph-gophers/graphql-go.ParseSchema + advice: + - append-args: + type: any + values: + - imports: + graphql: github.com/graph-gophers/graphql-go + graphqltrace: github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 + template: graphql.Tracer(graphqltrace.NewTracer()) diff --git a/contrib/graphql-go/graphql/appsec_test.go b/contrib/graphql-go/graphql/appsec_test.go index 178d3bae35..74215f0e3e 100644 --- a/contrib/graphql-go/graphql/appsec_test.go +++ b/contrib/graphql-go/graphql/appsec_test.go @@ -15,8 +15,9 @@ import ( "github.com/graphql-go/graphql" "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestAppSec(t *testing.T) { @@ -78,7 +79,7 @@ func TestAppSec(t *testing.T) { }, }, }) - opts := []Option{WithServiceName("test-graphql-service")} + opts := []Option{WithService("test-graphql-service")} schema, err := NewSchema(graphql.SchemaConfig{Query: rootQuery}, opts...) require.NoError(t, err) restore := enableAppSec(t) @@ -139,7 +140,7 @@ func TestAppSec(t *testing.T) { require.NotEmpty(t, spans) // The last finished span (which is GraphQL entry) should have the "_dd.appsec.enabled" tag. span := spans[len(spans)-1] - require.Equal(t, 1, span.Tag("_dd.appsec.enabled")) + require.Equal(t, float64(1), span.Tag("_dd.appsec.enabled")) type ddAppsecJSON struct { Triggers []struct { Rule struct { @@ -235,14 +236,13 @@ func enableAppSec(t *testing.T) func() { require.NoError(t, err) restoreDdAppsecEnabled := setEnv("DD_APPSEC_ENABLED", "1") restoreDdAppsecRules := setEnv("DD_APPSEC_RULES", rulesFile) - appsec.Start() + testutils.StartAppSec(t) restore := func() { - appsec.Stop() restoreDdAppsecEnabled() restoreDdAppsecRules() _ = os.RemoveAll(tmpDir) } - if !appsec.Enabled() { + if !instr.AppSecEnabled() { restore() t.Skip("could not enable appsec: this platform is likely not supported") } diff --git a/contrib/graphql-go/graphql/bench_test.go b/contrib/graphql-go/graphql/bench_test.go index 4587056d94..36efc830c7 100644 --- a/contrib/graphql-go/graphql/bench_test.go +++ b/contrib/graphql-go/graphql/bench_test.go @@ -13,8 +13,9 @@ import ( "github.com/graphql-go/graphql" "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func BenchmarkGraphQL(b *testing.B) { @@ -125,9 +126,9 @@ func BenchmarkGraphQL(b *testing.B) { }, } - b.Run("version=baseline", func(b *testing.B) { + b.Run("version_baseline", func(b *testing.B) { for name, tc := range testCases { - b.Run(fmt.Sprintf("scenario=%s", name), func(b *testing.B) { + b.Run(fmt.Sprintf("scenario_%s", name), func(b *testing.B) { b.StopTimer() b.ReportAllocs() schema, err := graphql.NewSchema(graphql.SchemaConfig{Query: rootQuery}) @@ -147,12 +148,12 @@ func BenchmarkGraphQL(b *testing.B) { } }) - b.Run("version=dyngo", func(b *testing.B) { + b.Run("version_dyngo", func(b *testing.B) { for name, tc := range testCases { - b.Run(fmt.Sprintf("scenario=%s", name), func(b *testing.B) { + b.Run(fmt.Sprintf("scenario_%s", name), func(b *testing.B) { b.StopTimer() b.ReportAllocs() - opts := []Option{WithServiceName("test-graphql-service")} + opts := []Option{WithService("test-graphql-service")} schema, err := NewSchema( graphql.SchemaConfig{ Query: rootQuery, @@ -249,12 +250,11 @@ func enableAppSecBench(b *testing.B) func() { require.NoError(b, err) b.Setenv("DD_APPSEC_ENABLED", "1") b.Setenv("DD_APPSEC_RULES", rulesFile) - appsec.Start() + testutils.StartAppSecBench(b) restore := func() { - appsec.Stop() _ = os.RemoveAll(tmpDir) } - if !appsec.Enabled() { + if !instr.AppSecEnabled() { restore() b.Skip("could not enable appsec: this platform is likely not supported") } diff --git a/contrib/graphql-go/graphql/example_test.go b/contrib/graphql-go/graphql/example_test.go index 0db24605a6..2d0168b540 100644 --- a/contrib/graphql-go/graphql/example_test.go +++ b/contrib/graphql-go/graphql/example_test.go @@ -11,10 +11,15 @@ import ( "github.com/graphql-go/graphql" "github.com/graphql-go/handler" - ddgraphql "gopkg.in/DataDog/dd-trace-go.v1/contrib/graphql-go/graphql" + + ddgraphql "github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func Example() { + tracer.Start() + defer tracer.Stop() + schema, err := ddgraphql.NewSchema(graphql.SchemaConfig{ Query: graphql.NewObject(graphql.ObjectConfig{ Name: "Query", diff --git a/contrib/graphql-go/graphql/go.mod b/contrib/graphql-go/graphql/go.mod new file mode 100644 index 0000000000..b6f91ceb13 --- /dev/null +++ b/contrib/graphql-go/graphql/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/graphql-go/graphql v0.8.1 + github.com/graphql-go/handler v0.2.3 + github.com/hashicorp/go-multierror v1.1.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/graphql-go/graphql/go.sum b/contrib/graphql-go/graphql/go.sum new file mode 100644 index 0000000000..d22bb49ab4 --- /dev/null +++ b/contrib/graphql-go/graphql/go.sum @@ -0,0 +1,318 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= +github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= +github.com/graphql-go/handler v0.2.3 h1:CANh8WPnl5M9uA25c2GBhPqJhE53Fg0Iue/fRNla71E= +github.com/graphql-go/handler v0.2.3/go.mod h1:leLF6RpV5uZMN1CdImAxuiayrYYhOk33bZciaUGaXeU= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/graphql-go/graphql/graphql.go b/contrib/graphql-go/graphql/graphql.go index 70c131d314..6fc92951e6 100644 --- a/contrib/graphql-go/graphql/graphql.go +++ b/contrib/graphql-go/graphql/graphql.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package graphql // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/graph-go/graphql" +package graphql // import "github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2" import ( "context" @@ -11,11 +11,11 @@ import ( "math" "reflect" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/graphqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/graphqlsec" + instrgraphql "github.com/DataDog/dd-trace-go/v2/instrumentation/graphql" "github.com/graphql-go/graphql" "github.com/graphql-go/graphql/gqlerrors" @@ -23,16 +23,14 @@ import ( "github.com/hashicorp/go-multierror" ) -const componentName = "graphql-go/graphql" - var ( + instr *instrumentation.Instrumentation spanTagKind = tracer.Tag(ext.SpanKind, ext.SpanKindServer) spanTagType = tracer.Tag(ext.SpanType, ext.SpanTypeGraphQL) ) func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/graphql-go/graphql") + instr = instrumentation.Load(instrumentation.PackageGraphQLGoGraphQL) } const ( @@ -52,7 +50,7 @@ func NewSchema(config graphql.SchemaConfig, options ...Option) (graphql.Schema, extension := datadogExtension{} defaults(&extension.config) for _, opt := range options { - opt(&extension.config) + opt.apply(&extension.config) } config.Extensions = append(config.Extensions, extension) return graphql.NewSchema(config) @@ -62,7 +60,7 @@ type datadogExtension struct{ config } type contextKey struct{} type contextData struct { - serverSpan tracer.Span + serverSpan *tracer.Span requestOp *graphqlsec.RequestOperation variables map[string]any query string @@ -72,7 +70,7 @@ type contextData struct { // finish closes the top-level request operation, as well as the server span. func (c *contextData) finish(data any, err error) { defer c.serverSpan.Finish(tracer.WithError(err)) - c.requestOp.Finish(c.serverSpan, graphqlsec.RequestOperationRes{Data: data, Error: err}) + c.requestOp.Finish(graphqlsec.RequestOperationRes{Data: data, Error: err}) } var extensionName = reflect.TypeOf((*datadogExtension)(nil)).Elem().Name() @@ -94,10 +92,10 @@ func (i datadogExtension) Init(ctx context.Context, params *graphql.Params) cont tracer.ServiceName(i.config.serviceName), spanTagKind, spanTagType, - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGraphQLGoGraphQL), tracer.Measured(), ) - ctx, request := graphqlsec.StartRequestOperation(ctx, graphqlsec.RequestOperationArgs{ + ctx, request := graphqlsec.StartRequestOperation(ctx, span, graphqlsec.RequestOperationArgs{ RawQuery: params.RequestString, Variables: params.VariableValues, OperationName: params.OperationName, @@ -119,12 +117,12 @@ func (i datadogExtension) Name() string { // ParseDidStart is being called before starting the parse func (i datadogExtension) ParseDidStart(ctx context.Context) (context.Context, graphql.ParseFinishFunc) { data, _ := ctx.Value(contextKey{}).(contextData) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(i.config.serviceName), spanTagKind, spanTagType, tracer.Tag(tagGraphqlSource, data.query), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGraphQLGoGraphQL), tracer.Measured(), } if data.operationName != "" { @@ -146,12 +144,12 @@ func (i datadogExtension) ParseDidStart(ctx context.Context) (context.Context, g // ValidationDidStart is called just before the validation begins func (i datadogExtension) ValidationDidStart(ctx context.Context) (context.Context, graphql.ValidationFinishFunc) { data, _ := ctx.Value(contextKey{}).(contextData) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(i.config.serviceName), spanTagKind, spanTagType, tracer.Tag(tagGraphqlSource, data.query), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGraphQLGoGraphQL), tracer.Measured(), } if data.operationName != "" { @@ -177,12 +175,12 @@ func (i datadogExtension) ValidationDidStart(ctx context.Context) (context.Conte // ExecutionDidStart notifies about the start of the execution func (i datadogExtension) ExecutionDidStart(ctx context.Context) (context.Context, graphql.ExecutionFinishFunc) { data, _ := ctx.Value(contextKey{}).(contextData) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(i.config.serviceName), spanTagKind, spanTagType, tracer.Tag(tagGraphqlSource, data.query), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGraphQLGoGraphQL), tracer.Measured(), } if data.operationName != "" { @@ -199,6 +197,7 @@ func (i datadogExtension) ExecutionDidStart(ctx context.Context) (context.Contex }) return ctx, func(result *graphql.Result) { err := toError(result.Errors) + instrgraphql.AddErrorsAsSpanEvents(span, toGraphqlErrors(result.Errors), i.config.errExtensions) defer func() { defer data.finish(result.Data, err) span.Finish(tracer.WithError(err)) @@ -222,13 +221,13 @@ func (i datadogExtension) ResolveFieldDidStart(ctx context.Context, info *graphq default: operationName = info.FieldName } - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(i.config.serviceName), spanTagKind, spanTagType, tracer.Tag(tagGraphqlField, info.FieldName), tracer.Tag(tagGraphqlOperationType, info.Operation.GetOperation()), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageGraphQLGoGraphQL), tracer.Tag(ext.ResourceName, fmt.Sprintf("%s.%s", info.ParentType.Name(), info.FieldName)), tracer.Measured(), } @@ -308,3 +307,24 @@ func toError(errs []gqlerrors.FormattedError) error { return fmt.Errorf("%w (and %d more errors)", errs[0], count-1) } } + +func toGraphqlErrors(errs []gqlerrors.FormattedError) []instrgraphql.Error { + res := make([]instrgraphql.Error, 0, len(errs)) + for _, err := range errs { + locs := make([]instrgraphql.ErrorLocation, 0, len(err.Locations)) + for _, loc := range err.Locations { + locs = append(locs, instrgraphql.ErrorLocation{ + Line: loc.Line, + Column: loc.Column, + }) + } + res = append(res, instrgraphql.Error{ + OriginalErr: err, + Message: err.Message, + Locations: locs, + Path: err.Path, + Extensions: err.Extensions, + }) + } + return res +} diff --git a/contrib/graphql-go/graphql/graphql_test.go b/contrib/graphql-go/graphql/graphql_test.go index cd00439719..74f5f27c60 100644 --- a/contrib/graphql-go/graphql/graphql_test.go +++ b/contrib/graphql-go/graphql/graphql_test.go @@ -7,12 +7,17 @@ package graphql import ( "fmt" + "net/http" + "net/http/httptest" + "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/graphql-go/graphql" + "github.com/graphql-go/handler" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -23,19 +28,19 @@ func Test(t *testing.T) { Fields: graphql.Fields{ "hello": { Type: graphql.String, - Resolve: func(p graphql.ResolveParams) (any, error) { + Resolve: func(_ graphql.ResolveParams) (any, error) { return "Hello, world!", nil }, }, "helloNonTrivial": { Type: graphql.String, - Resolve: func(p graphql.ResolveParams) (any, error) { + Resolve: func(_ graphql.ResolveParams) (any, error) { return "Hello, world!", nil }, }, }, }) - opts := []Option{WithServiceName("test-graphql-service")} + opts := []Option{WithService("test-graphql-service")} schema, err := NewSchema( graphql.SchemaConfig{ Query: rootQuery, @@ -57,9 +62,10 @@ func Test(t *testing.T) { traceID := spans[0].TraceID() for i := 1; i < len(spans); i++ { assert.Equal(t, traceID, spans[i].TraceID()) + assert.Equal(t, string(instrumentation.PackageGraphQLGoGraphQL), spans[i].Integration()) } assertSpanMatches(t, spans[0], - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(tagGraphqlOperationName, "TestQuery"), hasTag(tagGraphqlSource, "query TestQuery { hello, helloNonTrivial }"), hasTag(ext.ServiceName, "test-graphql-service"), @@ -68,7 +74,7 @@ func Test(t *testing.T) { hasTag(ext.Component, "graphql-go/graphql"), ) assertSpanMatches(t, spans[1], - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(tagGraphqlOperationName, "TestQuery"), hasTag(tagGraphqlSource, "query TestQuery { hello, helloNonTrivial }"), hasTag(ext.ServiceName, "test-graphql-service"), @@ -81,7 +87,7 @@ func Test(t *testing.T) { var foundField string assertSpanMatches(t, spans[2], hasTagFrom(tagGraphqlField, &expectedFields, &foundField), - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(ext.ServiceName, "test-graphql-service"), hasTag(tagGraphqlOperationType, "query"), hasOperationName("graphql.resolve"), @@ -90,7 +96,7 @@ func Test(t *testing.T) { ) assertSpanMatches(t, spans[3], hasTagFrom(tagGraphqlField, &expectedFields, &foundField), - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(ext.ServiceName, "test-graphql-service"), hasTag(tagGraphqlOperationType, "query"), hasOperationName("graphql.resolve"), @@ -98,7 +104,7 @@ func Test(t *testing.T) { hasTag(ext.Component, "graphql-go/graphql"), ) assertSpanMatches(t, spans[4], - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(tagGraphqlOperationName, "TestQuery"), hasTag(tagGraphqlSource, "query TestQuery { hello, helloNonTrivial }"), hasTag(ext.ServiceName, "test-graphql-service"), @@ -107,7 +113,7 @@ func Test(t *testing.T) { hasTag(ext.Component, "graphql-go/graphql"), ) assertSpanMatches(t, spans[5], - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(ext.ServiceName, "test-graphql-service"), hasOperationName("graphql.server"), hasTag(ext.ResourceName, "graphql.server"), @@ -153,7 +159,7 @@ func Test(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 2) assertSpanMatches(t, spans[0], - hasTag(ext.Error, resp.Errors[0].OriginalError()), + hasTag(ext.ErrorMsg, resp.Errors[0].OriginalError().Error()), hasTag(tagGraphqlOperationName, "Båd"), hasTag(tagGraphqlSource, "query is invalid"), hasTag(ext.ServiceName, "test-graphql-service"), @@ -161,13 +167,15 @@ func Test(t *testing.T) { hasTag(ext.ResourceName, "graphql.parse"), hasTag(ext.Component, "graphql-go/graphql"), ) + assert.Equal(t, string(instrumentation.PackageGraphQLGoGraphQL), spans[0].Integration()) assertSpanMatches(t, spans[1], - hasTag(ext.Error, resp.Errors[0].OriginalError()), + hasTag(ext.ErrorMsg, resp.Errors[0].OriginalError().Error()), hasTag(ext.ServiceName, "test-graphql-service"), hasOperationName("graphql.server"), hasTag(ext.ResourceName, "graphql.server"), hasTag(ext.Component, "graphql-go/graphql"), ) + assert.Equal(t, string(instrumentation.PackageGraphQLGoGraphQL), spans[1].Integration()) }) t.Run("request fails validation", func(t *testing.T) { @@ -183,7 +191,7 @@ func Test(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 3) assertSpanMatches(t, spans[0], - hasNoTag(ext.Error), + hasNoTag(ext.ErrorMsg), hasTag(tagGraphqlOperationName, "TestQuery"), hasTag(tagGraphqlSource, "query TestQuery { hello, helloNonTrivial, invalidField }"), hasTag(ext.ServiceName, "test-graphql-service"), @@ -191,8 +199,9 @@ func Test(t *testing.T) { hasTag(ext.ResourceName, "graphql.parse"), hasTag(ext.Component, "graphql-go/graphql"), ) + assert.Equal(t, string(instrumentation.PackageGraphQLGoGraphQL), spans[0].Integration()) assertSpanMatches(t, spans[1], - hasTag(ext.Error, resp.Errors[0]), + hasTag(ext.ErrorMsg, resp.Errors[0].Error()), hasTag(tagGraphqlOperationName, "TestQuery"), hasTag(tagGraphqlSource, "query TestQuery { hello, helloNonTrivial, invalidField }"), hasTag(ext.ServiceName, "test-graphql-service"), @@ -200,38 +209,139 @@ func Test(t *testing.T) { hasTag(ext.ResourceName, "graphql.validate"), hasTag(ext.Component, "graphql-go/graphql"), ) + assert.Equal(t, string(instrumentation.PackageGraphQLGoGraphQL), spans[1].Integration()) assertSpanMatches(t, spans[2], - hasTag(ext.Error, resp.Errors[0]), + hasTag(ext.ErrorMsg, resp.Errors[0].Error()), hasTag(ext.ServiceName, "test-graphql-service"), hasOperationName("graphql.server"), hasTag(ext.ResourceName, "graphql.server"), hasTag(ext.Component, "graphql-go/graphql"), ) + assert.Equal(t, string(instrumentation.PackageGraphQLGoGraphQL), spans[2].Integration()) }) } -type spanMatcher func(*testing.T, mocktracer.Span) +func TestErrorsAsSpanEvents(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() -func assertSpanMatches(t *testing.T, span mocktracer.Span, assertions ...spanMatcher) { + srv := newTestServer(t, WithErrorExtensions("str", "float", "int", "bool", "slice", "unsupported_type_stringified")) + defer srv.Close() + + q := `{"query": "{ withError }"}` + resp, err := http.Post(srv.URL, "application/json", strings.NewReader(q)) + require.NoError(t, err) + require.Equal(t, 200, resp.StatusCode) + defer resp.Body.Close() + + spans := mt.FinishedSpans() + require.Len(t, spans, 5) + + s0 := spans[3] + assert.Equal(t, "graphql.execute", s0.OperationName()) + assert.NotNil(t, s0.Tag(ext.ErrorMsg)) + + events := s0.Events() + require.Len(t, events, 1) + + evt := events[0] + assert.Equal(t, "dd.graphql.query.error", evt.Name) + assert.NotEmpty(t, evt.TimeUnixNano) + assert.NotEmpty(t, evt.Attributes["stacktrace"]) + evt.AssertAttributes(t, map[string]any{ + "message": "test error", + "path": []string{"withError"}, + "locations": []string{"1:3"}, + "stacktrace": evt.Attributes["stacktrace"], + "type": "gqlerrors.FormattedError", + "extensions.str": "1", + "extensions.int": 1, + "extensions.float": 1.1, + "extensions.bool": true, + "extensions.slice": []string{"1", "2"}, + "extensions.unsupported_type_stringified": "[1,\"foo\"]", + }) + + // the rest of the spans should not have span events + for _, s := range spans { + if s.OperationName() == "graphql.execute" { + continue + } + assert.Emptyf(t, s.Events(), "span %s should not have span events", s.OperationName()) + } +} + +func newTestServer(t *testing.T, opts ...Option) *httptest.Server { + cfg := graphql.SchemaConfig{ + Query: graphql.NewObject(graphql.ObjectConfig{ + Name: "Query", + Fields: graphql.Fields{ + "withError": &graphql.Field{ + Args: graphql.FieldConfigArgument{}, + Type: graphql.ID, + Resolve: func(_ graphql.ResolveParams) (interface{}, error) { + return nil, customError{ + message: "test error", + extensions: map[string]any{ + "int": 1, + "float": 1.1, + "str": "1", + "bool": true, + "slice": []string{"1", "2"}, + "unsupported_type_stringified": []any{1, "foo"}, + "not_captured": "nope", + }, + } + }, + }, + }, + }), + } + schema, err := NewSchema(cfg, opts...) + require.NoError(t, err) + + h := handler.New(&handler.Config{Schema: &schema, Pretty: true, GraphiQL: true}) + srv := httptest.NewServer(h) + t.Cleanup(srv.Close) + + return srv +} + +type customError struct { + message string + extensions map[string]any +} + +func (e customError) Error() string { + return e.message +} + +func (e customError) Extensions() map[string]any { + return e.extensions +} + +type spanMatcher func(*testing.T, *mocktracer.Span) + +func assertSpanMatches(t *testing.T, span *mocktracer.Span, assertions ...spanMatcher) { for _, assertion := range assertions { assertion(t, span) } } func hasOperationName(name string) spanMatcher { - return func(t *testing.T, span mocktracer.Span) { + return func(t *testing.T, span *mocktracer.Span) { _ = assert.Equal(t, name, span.OperationName()) } } func hasTag(name string, value any) spanMatcher { - return func(t *testing.T, span mocktracer.Span) { + return func(t *testing.T, span *mocktracer.Span) { _ = assert.Equal(t, value, span.Tag(name), "tag %s", name) } } func hasTagf(name string, pattern string, ptrs ...*string) spanMatcher { - return func(t *testing.T, span mocktracer.Span) { + return func(t *testing.T, span *mocktracer.Span) { args := make([]any, len(ptrs)) for i, ptr := range ptrs { if ptr != nil { @@ -247,7 +357,7 @@ func hasTagf(name string, pattern string, ptrs ...*string) spanMatcher { // provided slice. If that is the case, the found value is removed from the // slice. If found is non-nil, it's value will be set to the found value. func hasTagFrom[T comparable](name string, values *[]T, found *T) spanMatcher { - return func(t *testing.T, span mocktracer.Span) { + return func(t *testing.T, span *mocktracer.Span) { tag, _ := span.Tag(name).(T) if assert.Contains(t, *values, tag, "tag %s", name) { remaining := make([]T, 0, len(*values)-1) @@ -265,7 +375,7 @@ func hasTagFrom[T comparable](name string, values *[]T, found *T) spanMatcher { } func hasNoTag(name string) spanMatcher { - return func(t *testing.T, span mocktracer.Span) { + return func(t *testing.T, span *mocktracer.Span) { _ = assert.Nil(t, span.Tag(name)) } } diff --git a/contrib/graphql-go/graphql/option.go b/contrib/graphql-go/graphql/option.go index a37e548eac..5c32ae6f3a 100644 --- a/contrib/graphql-go/graphql/option.go +++ b/contrib/graphql-go/graphql/option.go @@ -8,8 +8,8 @@ package graphql import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + instrgraphql "github.com/DataDog/dd-trace-go/v2/instrumentation/graphql" ) const defaultServiceName = "graphql.server" @@ -17,21 +17,29 @@ const defaultServiceName = "graphql.server" type config struct { serviceName string analyticsRate float64 + errExtensions []string } -type Option func(*config) +// Option describes options for the GraphQL integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to NewSchema. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - if internal.BoolEnv("DD_TRACE_GRAPHQL_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) + cfg.errExtensions = instrgraphql.ErrorExtensionsFromEnv() } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -43,7 +51,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -53,9 +61,16 @@ func WithAnalyticsRate(rate float64) Option { } } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) Option { +// WithService sets the given service name for the client. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } + +// WithErrorExtensions allows to configure the error extensions to include in the error span events. +func WithErrorExtensions(errExtensions ...string) OptionFn { + return func(cfg *config) { + cfg.errExtensions = instrgraphql.ParseErrorExtensions(errExtensions) + } +} diff --git a/contrib/graphql-go/graphql/orchestrion.yml b/contrib/graphql-go/graphql/orchestrion.yml new file mode 100644 index 0000000000..dac64a1c25 --- /dev/null +++ b/contrib/graphql-go/graphql/orchestrion.yml @@ -0,0 +1,17 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 + description: |- + An implementation of GraphQL in Go. Follows the official reference implementation [graphql-js](https://github.com/graphql/graphql-js). + +aspects: + - id: NewSchema + join-point: + function-call: github.com/graphql-go/graphql.NewSchema + advice: + - replace-function: github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2.NewSchema diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/.gitignore b/contrib/haproxy/stream-processing-offload/cmd/spoa/.gitignore new file mode 100644 index 0000000000..71f053725a --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/.gitignore @@ -0,0 +1 @@ +spoa \ No newline at end of file diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/Dockerfile b/contrib/haproxy/stream-processing-offload/cmd/spoa/Dockerfile new file mode 100644 index 0000000000..595e3ddcae --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/Dockerfile @@ -0,0 +1,35 @@ +# Build stage +FROM golang:1.24-alpine AS builder +ENV CGO_ENABLED=1 + +WORKDIR /app +COPY . . + +RUN apk add --no-cache --update git build-base openssl + +# Build the spoa binary +RUN go build -tags=appsec -o ./contrib/haproxy/stream-processing-offload/cmd/spoa/spoa ./contrib/haproxy/stream-processing-offload/cmd/spoa + +# Runtime stage +FROM alpine:3.20.3 + +# Set opencontainers labels for Github container registry +LABEL org.opencontainers.image.source=https://github.com/DataDog/dd-trace-go/tree/main/contrib/haproxy/stream-processing-offload/cmd/spoa +LABEL org.opencontainers.image.description="An HAProxy Stream Processing Offload Agent service with Datadog App & API Protection support" +LABEL org.opencontainers.image.licenses=Apache-2.0 + +ARG COMMIT_SHA="" +LABEL org.opencontainers.image.revision=${COMMIT_SHA} + +RUN apk --no-cache add ca-certificates tzdata libc6-compat libgcc libstdc++ +WORKDIR /app + +ARG DD_VERSION="" +ENV DD_VERSION=${DD_VERSION} + +COPY --from=builder /app/contrib/haproxy/stream-processing-offload/cmd/spoa/spoa /app/spoa + +EXPOSE 3000 +EXPOSE 3080 + +CMD ["./spoa"] diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/README.md b/contrib/haproxy/stream-processing-offload/cmd/spoa/README.md new file mode 100644 index 0000000000..637bd508cd --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/README.md @@ -0,0 +1,34 @@ +# HAProxy Stream Processing Offload Agent (SPOA) with Datadog App & API Protection + +[HAProxy SPOE](https://www.haproxy.com/blog/extending-haproxy-with-the-stream-processing-offload-engine) enable users to provide programmability and extensibility on HAProxy. + +## Installation + +### From Release + +The images are published at each release of the tracer and can be found in [the repo registry](https://github.com/DataDog/dd-trace-go/pkgs/container/dd-trace-go%2Fhaproxy-spoa). + +### Build image + +The docker image can be build locally using docker. Start by cloning the `dd-trace-go` repo, `cd` inside it and run that command: +```sh +docker build -f contrib/haproxy/stream-processing-offload/cmd/spoa/Dockerfile -t datadog/dd-trace-go/haproxy-spoa:local . +``` + +## Configuration + +The HAProxy SPOA agent expose some configuration: + +| Environment variable | Default value | Description | +|-------------------------------------|---------------|-------------------------------------------------------------------------------------------------| +| `DD_HAPROXY_SPOA_HOST` | `0.0.0.0` | Host on where the SPOA and HTTP server should listen to. | +| `DD_HAPROXY_SPOA_PORT` | `3000` | Port used by the SPOA that accept communication with HAProxy. | +| `DD_HAPROXY_SPOA_HEALTHCHECK_PORT` | `3080` | Port used for the HTTP server for the health check. | +| `DD_APPSEC_BODY_PARSING_SIZE_LIMIT` | `10485760` | Maximum size of the bodies to be processed in bytes. If set to 0, the bodies are not processed. | + +> The HAProxy SPOA need to be connected to a deployed [Datadog agent](https://docs.datadoghq.com/agent). + +| Environment variable | Default value | Description | +|-----------------------|---------------|----------------------------------| +| `DD_AGENT_HOST` | `localhost` | Host of a running Datadog Agent. | +| `DD_TRACE_AGENT_PORT` | `8126` | Port of a running Datadog Agent. | diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/env.go b/contrib/haproxy/stream-processing-offload/cmd/spoa/env.go new file mode 100644 index 0000000000..38fb83bddb --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/env.go @@ -0,0 +1,51 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "net" + "strconv" + + streamprocessingoffload "github.com/DataDog/dd-trace-go/contrib/haproxy/stream-processing-offload/v2" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" +) + +// IntEnv returns the parsed int value of an environment variable, or +// def otherwise. +func intEnv(key string, def int) int { + vv, ok := env.Lookup(key) + if !ok { + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginDefault) + return def + } + v, err := strconv.Atoi(vv) + if err != nil { + log.Warn("Non-integer value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err) + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginDefault) + return def + } + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(key, def, instrumentation.TelemetryOriginEnvVar) + return v +} + +// IpEnv returns the valid IP value of an environment variable, or def otherwise. +func ipEnv(key string, def net.IP) net.IP { + vv, ok := env.Lookup(key) + if !ok { + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(key, def.String(), instrumentation.TelemetryOriginDefault) + return def + } + + ip := net.ParseIP(vv) + if ip == nil { + log.Warn("Non-IP value for env var %s, defaulting to %s", key, def.String()) + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(key, def.String(), instrumentation.TelemetryOriginDefault) + return def + } + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(key, vv, instrumentation.TelemetryOriginEnvVar) + return ip +} diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/CHANGELOG.md b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/CHANGELOG.md new file mode 100644 index 0000000000..e5ceb74a55 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/CHANGELOG.md @@ -0,0 +1,7 @@ +# CHANGELOG + +## 1.0.0 + +### Added + +- Initial release \ No newline at end of file diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/backend.cfg b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/backend.cfg new file mode 100644 index 0000000000..6ad6918419 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/backend.cfg @@ -0,0 +1,11 @@ +# ========== Datadog App & API Protection Configuration ========== +# This is the backend that will be used to send the request to the SPOA Agent. +# Please edit the values below to match your configuration. +backend spoa-backend + mode spop + timeout connect 5s + timeout server 3m + option spop-check + balance roundrobin + server spoa1 127.0.0.1:3000 check +# ================================================================ diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/datadog_aap_blocking_response.lua b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/datadog_aap_blocking_response.lua new file mode 100644 index 0000000000..df30145fee --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/datadog_aap_blocking_response.lua @@ -0,0 +1,20 @@ +core.register_action("send_blocking_response", { "http-req" }, function(txn) + local body = txn:get_var("txn.dd.body") + local status = txn:get_var("txn.dd.status") + local headers = txn:get_var("txn.dd.headers") + + local reply = txn:reply() + reply:set_status(status) + + local LINE_ITER = "[^\r\n]+" + local LINE_KV_STRICT = "^([%w%-]+): (%S.+)$" + for line in headers:gmatch(LINE_ITER) do + local k, v = line:match(LINE_KV_STRICT) + if k then + reply:add_header(k, v) + end + end + + reply:set_body(body) + txn:done(reply) +end) diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/frontend-config.cfg b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/frontend-config.cfg new file mode 100644 index 0000000000..84b1f29ba7 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/frontend-config.cfg @@ -0,0 +1,44 @@ +frontend main + # bind *:80 + + # ========== Datadog App & API Protection Configuration ========== + # DO NOT EDIT + # This configuration should be placed at the most top of the file + # to ensure it is executed first. + + filter spoe engine datadog-aap-engine config str("$DD_SPOA_SPOA_CONF_FILE") + + # Process the Request Headers + http-request set-var(txn.timeout) str("$DD_SPOA_TIMEOUT") + http-request send-spoe-group datadog-aap-engine dd-aap-http-request-headers-msg + http-request set-var(sess.span_id) var(txn.dd.span_id) + + ## Inject tracing headers when needed. Supporting only Datadog tracing format. + ## https://docs.datadoghq.com/tracing/trace_collection/trace_context_propagation/#datadog-format + http-request set-header x-datadog-trace-id %[var(txn.dd.tracing_x_datadog_trace_id)] if { var(txn.dd.tracing_x_datadog_trace_id) -m str } + http-request set-header x-datadog-parent-id %[var(txn.dd.tracing_x_datadog_parent_id)] if { var(txn.dd.tracing_x_datadog_parent_id) -m str } + http-request set-header x-datadog-origin %[var(txn.dd.tracing_x_datadog_origin)] if { var(txn.dd.tracing_x_datadog_origin) -m str } + http-request set-header x-datadog-sampling-priority %[var(txn.dd.tracing_x_datadog_sampling_priority)] if { var(txn.dd.tracing_x_datadog_sampling_priority) -m str } + http-request set-header x-datadog-tags %[var(txn.dd.tracing_x_datadog_tags)] if { var(txn.dd.tracing_x_datadog_tags) -m str } + + http-request set-var(sess.send_request_body) var(txn.dd.request_body) + http-request lua.send_blocking_response if { var(txn.dd.blocked) -m bool } + + # Process the Request Body (when needed) + http-request wait-for-body time 1s if { var(sess.send_request_body) -m bool } + http-request send-spoe-group datadog-aap-engine dd-aap-http-request-body-msg if { var(sess.send_request_body) -m bool } + http-request lua.send_blocking_response if { var(sess.send_request_body) -m bool } { var(txn.dd.blocked) -m bool } + + # Process the Response Headers + http-response send-spoe-group datadog-aap-engine dd-aap-http-response-headers-msg + http-response set-var(sess.send_response_body) var(txn.dd.request_body) + http-request lua.send_blocking_response if { var(txn.dd.blocked) -m bool } + + # Process the Response Body (when needed) + http-response wait-for-body time 1s if { var(sess.send_response_body) -m bool } + http-response send-spoe-group datadog-aap-engine dd-aap-http-response-body-msg if { var(sess.send_response_body) -m bool } + http-request lua.send_blocking_response if { var(sess.send_response_body) -m bool } { var(txn.dd.blocked) -m bool } + # ================= END OF DATADOG CONFIGURATION ================= + + # ... + # default_backend webserver diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/global-config.cfg b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/global-config.cfg new file mode 100644 index 0000000000..941781ae89 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/global-config.cfg @@ -0,0 +1,20 @@ +global + # ========== Datadog App & API Protection Configuration ========== + # Please edit the values below to match your configuration. + + # This lua file needs to be loaded to allow HAProxy to send custom response in case + # of a triggered blocking event. Adapt the path to the file to match your installation. + lua-load /etc/haproxy/lua/datadog_aap_blocking_response.lua + + # This is the path to the SPOE configuration file. Please edit the path to match your installation. + setenv DD_SPOA_SPOA_CONF_FILE /usr/local/etc/haproxy/spoe.cfg + + # The timeout value should be equal to the bigger backend server timeout where the SPOA Agent is running on. + # Default value is 1 minute. + # Example: If the biggest backend server timeout is 1 minute, set the timeout to 1m. + setenv DD_SPOA_TIMEOUT 1m + + # The processing timeout value is used to set the timeout for the SPOA Agent to process the request. + # Please increase this value if you are sending large request or response bodies. Default value is 200ms. + setenv DD_SPOA_PROCESSING_TIMEOUT 200ms + # ================================================================ diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/spoe.cfg b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/spoe.cfg new file mode 100644 index 0000000000..407930cb54 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/haproxyconf/spoe.cfg @@ -0,0 +1,53 @@ +[datadog-aap-engine] + +spoe-agent datadog-aap-agent + option set-on-error spoe_error + option var-prefix dd + + timeout hello 100ms + timeout idle "$DD_SPOA_TIMEOUT" + timeout processing "$DD_SPOA_PROCESSING_TIMEOUT" + + use-backend spoa-backend + log global + + groups dd-aap-http-request-headers-msg + groups dd-aap-http-request-body-msg + groups dd-aap-http-response-headers-msg + groups dd-aap-http-response-body-msg + +# Groups defining messages +spoe-group dd-aap-http-request-headers-msg + messages http-request-headers-msg + +spoe-group dd-aap-http-request-body-msg + messages http-request-body-msg + +spoe-group dd-aap-http-response-headers-msg + messages http-response-headers-msg + +spoe-group dd-aap-http-response-body-msg + messages http-response-body-msg + +# Messages +spoe-message http-request-headers-msg + args ip=src + args ip_port=src_port + args method=method + args path=pathq + args headers=req.hdrs_bin + args https=ssl_fc + args timeout=var(txn.timeout) + +spoe-message http-request-body-msg + args body=req.body + args span_id=var(sess.span_id) + +spoe-message http-response-headers-msg + args headers=res.hdrs_bin + args status=status + args span_id=var(sess.span_id) + +spoe-message http-response-body-msg + args body=res.body + args span_id=var(sess.span_id) diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/log.go b/contrib/haproxy/stream-processing-offload/cmd/spoa/log.go new file mode 100644 index 0000000000..85cd7c95ed --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/log.go @@ -0,0 +1,25 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + streamprocessingoffload "github.com/DataDog/dd-trace-go/contrib/haproxy/stream-processing-offload/v2" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +// Logger adapts the tracer instrumentation logger to the SPOE agent logger interface +type Logger struct { + instrumentation.Logger +} + +// NewLogger creates a new Logger instance +func NewLogger() *Logger { + return &Logger{streamprocessingoffload.Instrumentation().Logger()} +} + +func (l Logger) Errorf(format string, args ...interface{}) { + l.Error(format, args...) +} diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/main.go b/contrib/haproxy/stream-processing-offload/cmd/spoa/main.go new file mode 100644 index 0000000000..6a8a2e2edc --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/main.go @@ -0,0 +1,171 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "context" + "errors" + "fmt" + "net" + "net/http" + "os" + "os/signal" + "strconv" + "syscall" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/negasus/haproxy-spoe-go/agent" + + "github.com/DataDog/dd-trace-go/contrib/haproxy/stream-processing-offload/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" +) + +type haProxySpoaConfig struct { + extensionPort string + healthcheckPort string + extensionHost string + bodyParsingSizeLimit int +} + +var log = NewLogger() + +func getDefaultEnvVars() map[string]string { + return map[string]string{ + "DD_VERSION": instrumentation.Version(), // Version of the tracer + "DD_APM_TRACING_ENABLED": "false", // Appsec Standalone + "DD_APPSEC_WAF_TIMEOUT": "10ms", // Proxy specific WAF timeout + "_DD_APPSEC_PROXY_ENVIRONMENT": "true", // Internal config: Enable API Security proxy sampler + "DD_TRACE_PROPAGATION_STYLE": "datadog", // Only supports Datadog propagation format + } +} + +// initializeEnvironment sets up required environment variables with their defaults +func initializeEnvironment() { + for k, v := range getDefaultEnvVars() { + setValue := env.Get(k) + if setValue == "" { + if err := os.Setenv(k, v); err != nil { + log.Error("haproxy_spoa: failed to set %s environment variable: %s\n", k, err.Error()) + continue + } + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(k, v, instrumentation.TelemetryOriginDefault) + continue + } + streamprocessingoffload.Instrumentation().TelemetryRegisterAppConfig(k, setValue, instrumentation.TelemetryOriginEnvVar) + } +} + +// loadConfig loads the configuration from the environment variables +func loadConfig() haProxySpoaConfig { + extensionHostStr := ipEnv("DD_HAPROXY_SPOA_HOST", net.IP{0, 0, 0, 0}).String() + extensionPortInt := intEnv("DD_HAPROXY_SPOA_PORT", 3000) + healthcheckPortInt := intEnv("DD_HAPROXY_SPOA_HEALTHCHECK_PORT", 3080) + bodyParsingSizeLimit := intEnv("DD_APPSEC_BODY_PARSING_SIZE_LIMIT", proxy.DefaultBodyParsingSizeLimit) + + extensionPortStr := strconv.FormatInt(int64(extensionPortInt), 10) + healthcheckPortStr := strconv.FormatInt(int64(healthcheckPortInt), 10) + + return haProxySpoaConfig{ + extensionPort: extensionPortStr, + extensionHost: extensionHostStr, + healthcheckPort: healthcheckPortStr, + bodyParsingSizeLimit: bodyParsingSizeLimit, + } +} + +func main() { + initializeEnvironment() + config := loadConfig() + + if err := startService(config); err != nil { + log.Error("haproxy_spoa: %s\n", err.Error()) + os.Exit(1) + } + + log.Info("haproxy_spoa: shutting down\n") +} + +func startService(config haProxySpoaConfig) error { + ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM) + defer cancel() + + go func() { + if err := startHealthCheck(ctx, config); err != nil && ctx.Err() == nil { + cancel() + } + }() + + return startSpoa(ctx, config) +} + +func startHealthCheck(ctx context.Context, config haProxySpoaConfig) error { + muxServer := http.NewServeMux() + muxServer.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"status": "ok", "library": {"language": "golang", "version": "` + instrumentation.Version() + `"}}`)) + }) + + server := &http.Server{ + Addr: config.extensionHost + ":" + config.healthcheckPort, + Handler: muxServer, + } + + go func() { + <-ctx.Done() + shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := server.Shutdown(shutdownCtx); err != nil { + log.Error("haproxy_spoa: health check server shutdown: %s\n", err.Error()) + } + }() + + log.Info("haproxy_spoa: health check server started on %s:%s\n", config.extensionHost, config.healthcheckPort) + if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + return fmt.Errorf("health check http server: %s", err.Error()) + } + + return nil +} + +func startSpoa(ctx context.Context, config haProxySpoaConfig) error { + listener, err := net.Listen("tcp4", config.extensionHost+":"+config.extensionPort) + if err != nil { + return fmt.Errorf("error creating listener: %w", err) + } + + // Stop accepting new connections on shutdown + go func() { + <-ctx.Done() + _ = listener.Close() + }() + defer listener.Close() + + _ = tracer.Start(tracer.WithAppSecEnabled(true)) + defer tracer.Stop() + + appsecHAProxy := streamprocessingoffload.NewHAProxySPOA(streamprocessingoffload.AppsecHAProxyConfig{ + BlockingUnavailable: false, + BodyParsingSizeLimit: config.bodyParsingSizeLimit, + Context: ctx, + }) + + a := agent.New(appsecHAProxy.Handler, log) + + log.Info("haproxy_spoa: datadog stream processing offload agent started on %s:%s\n", config.extensionHost, config.extensionPort) + if err := a.Serve(listener); err != nil { + if errors.Is(ctx.Err(), context.Canceled) { + return nil // Clean shutdown + } + + return fmt.Errorf("error starting stream processing offload agent: %w", err) + } + + return nil +} diff --git a/contrib/haproxy/stream-processing-offload/cmd/spoa/main_test.go b/contrib/haproxy/stream-processing-offload/cmd/spoa/main_test.go new file mode 100644 index 0000000000..22c460a62d --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/cmd/spoa/main_test.go @@ -0,0 +1,149 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "os" + "testing" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + "github.com/stretchr/testify/assert" +) + +func TestInitializeEnvironment_All(t *testing.T) { + type envCase struct { + name string + preEnv map[string]string + wantEnvVal map[string]string + } + + cases := []envCase{ + { + name: "defaults", + preEnv: nil, + wantEnvVal: nil, // will use the default values + }, + { + name: "existing preserved", + preEnv: map[string]string{ + "DD_APM_TRACING_ENABLED": "true", + "DD_APPSEC_WAF_TIMEOUT": "5ms", + "DD_TRACE_PROPAGATION_STYLE": "datadog,tracecontext,baggage", + }, + wantEnvVal: map[string]string{ + "DD_APM_TRACING_ENABLED": "true", + "DD_APPSEC_WAF_TIMEOUT": "5ms", + "DD_TRACE_PROPAGATION_STYLE": "datadog,tracecontext,baggage", + }, + }, + } + + var allKeys []string + for k := range getDefaultEnvVars() { + allKeys = append(allKeys, k) + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unsetEnv(allKeys...) + setEnv(tc.preEnv) + + initializeEnvironment() + + expected := tc.wantEnvVal + if expected == nil { + expected = getDefaultEnvVars() + } + + for k, want := range expected { + assert.Equal(t, want, os.Getenv(k), "%s should match", k) + } + }) + } +} + +func TestLoadConfig_VariousCases(t *testing.T) { + type want struct { + extensionPort string + healthcheckPort string + extensionHost string + bodyParsingSizeLimit int + } + + cases := []struct { + name string + env map[string]string + want want + }{ + { + name: "defaults", + env: nil, + want: want{"3000", "3080", "0.0.0.0", proxy.DefaultBodyParsingSizeLimit}, + }, + { + name: "valid overrides", + env: map[string]string{ + "DD_HAPROXY_SPOA_PORT": "1234", + "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": "4321", + "DD_HAPROXY_SPOA_HOST": "127.0.0.1", + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE": "true", + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT": "100000000", + }, + want: want{"1234", "4321", "127.0.0.1", 100000000}, + }, + { + name: "bad values fall back", + env: map[string]string{ + "DD_HAPROXY_SPOA_PORT": "badport", + "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": "gopher", + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE": "notabool", + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT": "notanint", + "DD_HAPROXY_SPOA_HOST": "notanip", + }, + want: want{"3000", "3080", "0.0.0.0", proxy.DefaultBodyParsingSizeLimit}, + }, + } + + allKeys := []string{ + "DD_HAPROXY_SPOA_PORT", + "DD_HAPROXY_SPOA_HEALTHCHECK_PORT", + "DD_HAPROXY_SPOA_HOST", + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE", + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT", + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + unsetEnv(allKeys...) + setEnv(tc.env) + + cfg := loadConfig() + assert.Equal(t, tc.want.extensionPort, cfg.extensionPort, "extensionPort") + assert.Equal(t, tc.want.healthcheckPort, cfg.healthcheckPort, "healthcheckPort") + assert.Equal(t, tc.want.extensionHost, cfg.extensionHost, "extensionHost") + assert.Equal(t, tc.want.bodyParsingSizeLimit, cfg.bodyParsingSizeLimit, "bodyParsingSizeLimit") + }) + } +} + +// Helpers +func unsetEnv(keys ...string) { + for _, k := range keys { + err := os.Unsetenv(k) + if err != nil { + panic(err) + } + } +} + +func setEnv(env map[string]string) { + for k, v := range env { + err := os.Setenv(k, v) + if err != nil { + panic(err) + } + } +} diff --git a/contrib/haproxy/stream-processing-offload/example_test.go b/contrib/haproxy/stream-processing-offload/example_test.go new file mode 100644 index 0000000000..166778b7d7 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/example_test.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "context" + "log" + "net" + + "github.com/negasus/haproxy-spoe-go/agent" + "github.com/negasus/haproxy-spoe-go/logger" +) + +func Example_server() { + // Create a listener for the server. + ln, err := net.Listen("tcp4", "127.0.0.1:3000") + if err != nil { + log.Fatal(err) + } + + // Initialize the SPOA agent server with the configuration + appsecHAProxy := NewHAProxySPOA(AppsecHAProxyConfig{ + BlockingUnavailable: false, + BodyParsingSizeLimit: 1000000, // 1MB + Context: context.Background(), + }) + + a := agent.New(appsecHAProxy.Handler, logger.NewDefaultLog()) + + // Start serving incoming connections. + if err := a.Serve(ln); err != nil { + log.Fatalf("failed to serve: %v", err) + } +} diff --git a/contrib/haproxy/stream-processing-offload/go.mod b/contrib/haproxy/stream-processing-offload/go.mod new file mode 100644 index 0000000000..9c94d69d85 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/go.mod @@ -0,0 +1,95 @@ +module github.com/DataDog/dd-trace-go/contrib/haproxy/stream-processing-offload/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/jellydator/ttlcache/v3 v3.4.0 + github.com/negasus/haproxy-spoe-go v1.0.7 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/haproxy/stream-processing-offload/go.sum b/contrib/haproxy/stream-processing-offload/go.sum new file mode 100644 index 0000000000..d8a5b1e7d3 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/go.sum @@ -0,0 +1,315 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jellydator/ttlcache/v3 v3.4.0 h1:YS4P125qQS0tNhtL6aeYkheEaB/m8HCqdMMP4mnWdTY= +github.com/jellydator/ttlcache/v3 v3.4.0/go.mod h1:Hw9EgjymziQD3yGsQdf1FqFdpp7YjFMd4Srg5EJlgD4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/negasus/haproxy-spoe-go v1.0.7 h1:OhRY0zapeHudrRqoblI9DjIolJjWI0s/TO6kT/va0ao= +github.com/negasus/haproxy-spoe-go v1.0.7/go.mod h1:ZrBizxtx2EeLN37Jkg9w9g32a1AFCJizA8vg46PaAp4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/haproxy/stream-processing-offload/haproxy.go b/contrib/haproxy/stream-processing-offload/haproxy.go new file mode 100644 index 0000000000..519eeee7f2 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/haproxy.go @@ -0,0 +1,158 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "context" + "fmt" + "io" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + + "github.com/jellydator/ttlcache/v3" + "github.com/negasus/haproxy-spoe-go/request" +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageHAProxyStreamProcessingOffload) +} + +// Instrumentation returns the instrumentation.Instrumentation package instrumentation +func Instrumentation() *instrumentation.Instrumentation { + return instr +} + +// HAProxySPOA defines the AppSec HAProxy Stream Processing Offload Agent +type HAProxySPOA struct { + requestStateCache *ttlcache.Cache[uint64, *proxy.RequestState] + messageProcessor proxy.Processor +} + +// AppsecHAProxyConfig contains configuration for the AppSec HAProxy Stream Processing Offload Agent +type AppsecHAProxyConfig struct { + Context context.Context + BlockingUnavailable bool + BodyParsingSizeLimit int +} + +// NewHAProxySPOA creates a new AppSec HAProxy Stream Processing Offload Agent +func NewHAProxySPOA(config AppsecHAProxyConfig) *HAProxySPOA { + return &HAProxySPOA{ + messageProcessor: proxy.NewProcessor(proxy.ProcessorConfig{ + BlockingUnavailable: config.BlockingUnavailable, + BodyParsingSizeLimit: &config.BodyParsingSizeLimit, + Framework: "haproxy/haproxy", + Context: config.Context, + ContinueMessageFunc: continueActionFunc, + BlockMessageFunc: blockActionFunc, + }, instr), + requestStateCache: initRequestStateCache(func(rs *proxy.RequestState) { + if rs.State.Ongoing() { + instr.Logger().Warn("haproxy_spoa: backend server timeout reached, closing the span for the request.\n") + _ = rs.Close() + } + }), + } +} + +type haproxyRequestContextKey struct{} + +type haproxyRequestContextData struct { + req *request.Request + msg *haproxyMessage + timeout string +} + +// Handler processes Stream Processing Offload messages from HAProxy +func (s *HAProxySPOA) Handler(req *request.Request) { + instr.Logger().Debug("haproxy_spoa: handle request EngineID: '%s', StreamID: '%d', FrameID: '%d' with %d messages", req.EngineID, req.StreamID, req.FrameID, req.Messages.Len()) + + // Process each message + for i := 0; i < req.Messages.Len(); i++ { + msg, err := req.Messages.GetByIndex(i) + if err != nil { + instr.Logger().Warn("haproxy_spoa: failed to get message at index %d: %v", i, err) + continue + } + + hMsg := newHaproxyMessage(msg) + reqState, _ := getCurrentRequest(s.requestStateCache, hMsg) + + err = s.processMessage(req, hMsg, reqState) + if err != nil && err != io.EOF { + instr.Logger().Error("haproxy_spoa: error processing message %s: %v", msg.Name, err) + return + } + } +} + +// processMessage processes a single message from HAProxy based on its name. +func (s *HAProxySPOA) processMessage(req *request.Request, msg *haproxyMessage, currentRequest *proxy.RequestState) error { + instr.Logger().Debug("haproxy_spoa: handling message: %s", msg.Name) + + requestContextData := &haproxyRequestContextData{req: req, msg: msg} + + switch msg.Name { + case MessageHTTPRequestHeaders: + ctx := context.WithValue(context.Background(), haproxyRequestContextKey{}, requestContextData) + requestState, err := s.messageProcessor.OnRequestHeaders(ctx, &messageRequestHeaders{req: req, msg: msg}) + if err != nil { + return err + } + return s.cacheRequest(requestState, msg) + + case MessageHTTPRequestBody: + if currentRequest == nil { + return fmt.Errorf("received request body outside of a started a request") + } + + ctx := currentRequest.Context + currentRequest.Context = context.WithValue(ctx, haproxyRequestContextKey{}, requestContextData) + err := s.messageProcessor.OnRequestBody(&messageBody{msg: msg}, currentRequest) + currentRequest.Context = ctx + return err + + case MessageHTTPResponseHeaders: + if currentRequest == nil { + return fmt.Errorf("received reponse headers outside of a started a request") + } + + ctx := currentRequest.Context + currentRequest.Context = context.WithValue(ctx, haproxyRequestContextKey{}, requestContextData) + err := s.messageProcessor.OnResponseHeaders(&responseHeadersHAProxy{msg: msg}, currentRequest) + currentRequest.Context = ctx + return err + + case MessageHTTPResponseBody: + if currentRequest == nil { + return fmt.Errorf("received reponse body outside of a started a request") + } + + currentRequest.Context = context.WithValue(currentRequest.Context, haproxyRequestContextKey{}, requestContextData) + return s.messageProcessor.OnResponseBody(&messageBody{msg: msg}, currentRequest) + + default: + return fmt.Errorf("unknown message name: %s", msg.Name) + } +} + +// cacheRequest stores the request state in the cache based on the `span_id` extracted from the message. +func (s *HAProxySPOA) cacheRequest(reqState proxy.RequestState, msg *haproxyMessage) error { + timeout := msg.String("timeout") + + span, ok := reqState.Span() + if !ok { + return fmt.Errorf("failed to retreive the span from the context of the request") + } + + spanId := span.Context().SpanID() + storeRequestState(s.requestStateCache, spanId, reqState, timeout) + + return nil +} diff --git a/contrib/haproxy/stream-processing-offload/haproxy_messages.go b/contrib/haproxy/stream-processing-offload/haproxy_messages.go new file mode 100644 index 0000000000..a9d60f2f02 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/haproxy_messages.go @@ -0,0 +1,180 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "context" + "fmt" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + "github.com/negasus/haproxy-spoe-go/request" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +// The following constants define the variable or message names used for communication between +// the Go SPOA agent and HAProxy, based on the SPOE configuration. +// IMPORTANT: If you change any of these values, you MUST also update the corresponding +// names in the HAProxy configuration to match, or the integration will break. +const ( + VarIp = "ip" // The remote IP address of the client as net.IP + VarIpPort = "ip_port" // The remote port of the client as an int. + VarMethod = "method" // The HTTP method of the request as a string. + VarPath = "path" // The path of the request as a string. + VarHeaders = "headers" // The binary headers of the request as a []byte. + VarHttps = "https" // The request is HTTPS as a bool. + VarTimeout = "timeout" // The timeout duration of the request as a string. + VarStatus = "status" // The status code of the response as an int. + VarBody = "body" // The body of the request as a []byte. + VarSpanId = "span_id" // The span ID of the request as a string. + VarBlocked = "blocked" // The request is blocked as a bool. + VarRequestBody = "request_body" // The body of the request or response is requested by the SPOA, as a bool. + + VarTracingHeaderTraceId = "tracing_x_datadog_trace_id" // The Datadog trace ID header of the request as a string. + VarTracingHeaderParentId = "tracing_x_datadog_parent_id" // The Datadog parent ID header of the request as a string. + VarTracingHeaderOrigin = "tracing_x_datadog_origin" // The Datadog origin header of the request as a string. + VarTracingHeaderSamplingPriority = "tracing_x_datadog_sampling_priority" // The Datadog sampling priority header of the request as a string. + VarTracingHeaderTags = "tracing_x_datadog_tags" // The Datadog tags header of the request as a string. + + MessageHTTPRequestHeaders = "http-request-headers-msg" // SPOE message name for request headers + MessageHTTPRequestBody = "http-request-body-msg" // SPOE message name for request body + MessageHTTPResponseHeaders = "http-response-headers-msg" // SPOE message name for response headers + MessageHTTPResponseBody = "http-response-body-msg" // SPOE message name for response body +) + +var _ proxy.RequestHeaders = (*messageRequestHeaders)(nil) +var _ proxy.ResponseHeaders = (*responseHeadersHAProxy)(nil) +var _ proxy.HTTPBody = (*messageBody)(nil) +var _ proxy.HTTPBody = (*messageBody)(nil) + +type messageRequestHeaders struct { + req *request.Request + msg *haproxyMessage + hasBody bool +} + +func (m *messageRequestHeaders) BodyParsingSizeLimit(_ context.Context) int { + return proxy.DefaultBodyParsingSizeLimit +} + +func (m *messageRequestHeaders) ExtractRequest(_ context.Context) (proxy.PseudoRequest, error) { + headers, err := parseHAProxyReqHdrsBin(m.msg.Bytes(VarHeaders)) + if err != nil { + return proxy.PseudoRequest{}, err + } + + authority := headers.Get("Host") + method := m.msg.String(VarMethod) + path := m.msg.String(VarPath) + https := m.msg.Bool(VarHttps) + + if authority == "" || method == "" || path == "" { + return proxy.PseudoRequest{}, fmt.Errorf("missing required values in the http request SPOE message") + } + + scheme := "http" + if https { + scheme = "https" + } + + m.hasBody = true + + // Refine body presence if Content-Length is set + if contentLength := headers.Get("Content-Length"); contentLength != "" { + length, err := strconv.Atoi(contentLength) + if err != nil { + return proxy.PseudoRequest{}, fmt.Errorf("invalid Content-Length header: %v", err) + } + m.hasBody = length > 0 + } + + var remoteAddr string + remoteIp := m.msg.IP(VarIp) + if remoteIp != nil { + remotePort := strconv.Itoa(m.msg.Int(VarIpPort)) + remoteAddr = remoteIp.String() + ":" + remotePort + } + + return proxy.PseudoRequest{ + Method: method, + Authority: authority, + Path: path, + Scheme: scheme, + Headers: headers, + RemoteAddr: remoteAddr, + }, nil +} + +func (m *messageRequestHeaders) GetEndOfStream() bool { + return !m.hasBody +} + +func (m *messageRequestHeaders) MessageType() proxy.MessageType { + return proxy.MessageTypeRequestHeaders +} + +const componentNameHAProxySPOA = "haproxy-spoa" + +func (m *messageRequestHeaders) SpanOptions(_ context.Context) []tracer.StartSpanOption { + return []tracer.StartSpanOption{tracer.Tag(ext.Component, componentNameHAProxySPOA)} +} + +type responseHeadersHAProxy struct { + msg *haproxyMessage + hasBody bool +} + +func (m *responseHeadersHAProxy) ExtractResponse() (proxy.PseudoResponse, error) { + headers, err := parseHAProxyReqHdrsBin(m.msg.Bytes(VarHeaders)) + if err != nil { + return proxy.PseudoResponse{}, err + } + + status := m.msg.Int(VarStatus) + + m.hasBody = true + + // Refine body presence if Content-Length is set + if contentLength := headers.Get("Content-Length"); contentLength != "" { + length, err := strconv.Atoi(contentLength) + if err != nil { + return proxy.PseudoResponse{}, fmt.Errorf("invalid Content-Length header: %v", err) + } + m.hasBody = length > 0 + } + + return proxy.PseudoResponse{ + StatusCode: status, + Headers: headers, + }, nil +} + +func (m *responseHeadersHAProxy) GetEndOfStream() bool { + return !m.hasBody +} + +func (m *responseHeadersHAProxy) MessageType() proxy.MessageType { + return proxy.MessageTypeResponseHeaders +} + +type messageBody struct { + msg *haproxyMessage + m proxy.MessageType +} + +func (m messageBody) GetEndOfStream() bool { + return true +} + +func (m messageBody) GetBody() []byte { + return m.msg.Bytes(VarBody) +} + +func (m messageBody) MessageType() proxy.MessageType { + return m.m +} diff --git a/contrib/haproxy/stream-processing-offload/haproxy_test.go b/contrib/haproxy/stream-processing-offload/haproxy_test.go new file mode 100644 index 0000000000..063a3eb593 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/haproxy_test.go @@ -0,0 +1,985 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "context" + "encoding/json" + "fmt" + "net" + "os" + "regexp" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + + "github.com/negasus/haproxy-spoe-go/action" + "github.com/negasus/haproxy-spoe-go/message" + "github.com/negasus/haproxy-spoe-go/payload/kv" + "github.com/negasus/haproxy-spoe-go/request" + + "github.com/stretchr/testify/require" +) + +func TestAppSec(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/user_rules.json") + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (func(req *request.Request), mocktracer.Tracer, func()) { + rig := newHAProxyAppsecRig(t, false, 0) + mt := mocktracer.Start() + + return rig.handler, mt, func() { + mt.Stop() + } + } + + t.Run("monitoring-event-on-request-headers", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "POST", map[string]string{"User-Agent": "dd-test-scanner-log"}, map[string]string{}, false, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"ua0-600-55x": 1}) + }) + t.Run("monitoring-event-on-response-headers-without-body", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"test": "match-no-block-response-header"}, false, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + t.Run("blocking-event-on-request-headers", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + _, _, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "dd-test-scanner-log-block"}, "GET", "/") + + require.Equal(t, 403, blockedAct.statusCode) + require.Equal(t, "application/json", blockedAct.headers["Content-Type"]) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "ua0-600-56x": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + t.Run("blocking-event-on-request-on-query", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + _, _, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "Mistake Not..."}, "GET", "/hello?match=match-request-query") + + require.Equal(t, 418, blockedAct.statusCode) + require.Equal(t, "application/json", blockedAct.headers["Content-Type"]) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"query-002": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + t.Run("blocking-event-on-request-on-cookies", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + _, _, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"Cookie": "foo=jdfoSDGFkivRG_234"}, "OPTIONS", "/") + + require.Equal(t, 418, blockedAct.statusCode) + require.Equal(t, "application/json", blockedAct.headers["Content-Type"]) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"tst-037-008": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("client-ip", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "OPTION", + map[string]string{"User-Agent": "Mistake not...", "X-Forwarded-For": "18.18.18.18"}, + map[string]string{"User-Agent": "match-response-header"}, + true, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "18.18.18.18", span.Tag("http.client_ip")) + + // Appsec + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + }) + + t.Run("blocking-client-ip", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + _, _, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "Mistake not...", "X-Forwarded-For": "111.222.111.222"}, "GET", "/") + + // Handle the immediate response + require.Equal(t, 403, blockedAct.statusCode) + require.Equal(t, "application/json", blockedAct.headers["Content-Type"]) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "blk-001-001": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "111.222.111.222", span.Tag("http.client_ip")) + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + t.Run("no-monitoring-event-on-request-body-parsing-disabled", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check that no appsec event was created + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) +} + +func TestAppSecBodyParsingEnabled(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/user_rules.json") + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (func(req *request.Request), mocktracer.Tracer, func()) { + rig := newHAProxyAppsecRig(t, false, 256) + mt := mocktracer.Start() + + return rig.handler, mt, func() { + mt.Stop() + } + } + t.Run("monitoring-event-on-request-body", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, `{ "payload": {"name": "" } }`, "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "crs-941-110": 1}) + }) + + t.Run("monitoring-event-on-response-headers-without-body", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"test": "match-no-block-response-header"}, false, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + t.Run("monitoring-event-on-response-headers-with-body-sent", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"test": "match-no-block-response-header"}, false, false, "", "body") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + + t.Run("monitoring-event-on-response-headers-with-body-not-sent", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + spanId, requestedRequestBody, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json", "Content-Length": "0"}, "GET", "/") + require.False(t, requestedRequestBody) + require.Nil(t, blockedAct) + + // Send a processing response headers with the information that it would be followed by a body, but don't send the body + // It is mimicking a scenario where the response headers are sent and a body is present, but response body processing is disabled in the HAProxy configuration + requestedResponseBody, blockedAct := sendProcessingResponseHeaders(t, handler, map[string]string{"test": "match-no-block-response-header", "Content-Type": "application/json"}, "200", spanId) + require.True(t, requestedResponseBody) + require.Nil(t, blockedAct) + + // Not timed out yet, so no span finished + finished := mt.FinishedSpans() + require.Len(t, finished, 0) + + // Will timeouts because a body was expected but not sent + // (wait for 2 seconds to ensure the timeout of 1s happens and the trace is closed) + time.Sleep(2 * time.Second) + + finished = mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-004": 1}) + }) + + t.Run("blocking-event-on-request-body", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + body := []byte(`{ "name": "$globals" }`) + spanId, requestedRequestBody, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/") + require.True(t, requestedRequestBody) + require.Nil(t, blockedAct) + + blockedAct = sendProcessingRequestBody(t, handler, body, spanId) + require.NotNil(t, blockedAct) + + require.Equal(t, 403, blockedAct.statusCode) + require.Equal(t, "application/json", blockedAct.headers["Content-Type"]) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "crs-933-130-block": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("blocking-event-on-response-headers-without-body", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "OPTION", map[string]string{"User-Agent": "Chrome"}, map[string]string{"test": "match-response-header"}, true, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"headers-003": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + + t.Run("blocking-event-on-response-headers-with-body-sent", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + // Blocking on response body and not on response headers, because the afterHandle is not called when the processor is waiting for a body + end2EndStreamRequest(t, handler, "/", "OPTION", map[string]string{"User-Agent": "Chrome"}, map[string]string{"content-type": "application/json", "test": "match-response-header"}, false, true, "", "{ \"name\": \"test\" }") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"headers-003": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, 1.0, span.Tag("_dd.appsec.enabled")) + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + t.Run("no-monitoring-event-on-request-body-bad-content-type", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "text/html"}, map[string]string{}, false, false, `{ "name": "" }`, "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) + t.Run("blocking-event-on-request-body-truncated", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + largeText := make([]byte, 300) + for i := range largeText { + largeText[i] = 'x' + } + requestBody := fmt.Sprintf(`{ "name": "$globals", "text": "%s" }`, largeText) + + spanId, bodyRequested, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/") + require.True(t, bodyRequested) + require.Nil(t, blockedAct) + + // Should block at the first chunk + blockedAct = sendProcessingRequestBody(t, handler, []byte(requestBody), spanId) + require.NotNil(t, blockedAct) + + require.Equal(t, 403, blockedAct.statusCode) + require.Equal(t, "application/json", blockedAct.headers["Content-Type"]) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "crs-933-130-block": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) + t.Run("no-blocking-event-on-request-body-attack-truncated", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + largeText := make([]byte, 300) + for i := range largeText { + largeText[i] = 'x' + } + requestBody := fmt.Sprintf(`{ "text": "%s", "name": "$globals" }`, largeText) + + end2EndStreamRequest(t, handler, "/", "PUT", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{}, false, false, requestBody, "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.NotContains(t, span.Tags(), "appsec.event") + require.NotContains(t, span.Tags(), "_dd.appsec.json") + }) + + // NOTE: This test simulates a scenario where the response body is never sent, even though it was requested by the processor. + // In reality, if HAProxy fails to send the body (e.g., due to a timeout or backend error), the processor times out and marks the request as blocked in the trace. + // However, this does not necessarily reflect what the client actually received, since we have no visibility into the real response. + // This test is validating this internal timeout/blocking behavior, not the actual client experience. + t.Run("blocking-event-on-response-headers-with-body-not-sent", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + spanId, bodyRequested, _, blockedAct := sendProcessingRequestHeaders(t, handler, map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, "GET", "/") + require.True(t, bodyRequested) + require.Nil(t, blockedAct) + + // Send a processing response headers with the information that it would be followed by a body, but don't send the body + bodyRequested, blockedAct = sendProcessingResponseHeaders(t, handler, map[string]string{"test": "match-response-header", "Content-Type": "application/json"}, "200", spanId) + + // Res should be an immediate response with the blocking event + require.Nil(t, blockedAct) + require.True(t, bodyRequested) + + time.Sleep(2 * time.Second) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + checkForAppsecEvent(t, finished, map[string]int{"custom-001": 1, "headers-003": 1}) + + // Check for tags + span := finished[0] + require.Equal(t, "true", span.Tag("appsec.event")) + require.Equal(t, "true", span.Tag("appsec.blocked")) + }) +} + +func TestAppSecAPISecurityBodyParsingEnabled(t *testing.T) { + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "10ms") + t.Setenv("_DD_APPSEC_PROXY_ENVIRONMENT", "true") // Enable API Security proxy sampler + + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (func(req *request.Request), mocktracer.Tracer, func()) { + rig := newHAProxyAppsecRig(t, false, 256) + mt := mocktracer.Start() + + return rig.handler, mt, func() { + mt.Stop() + } + } + + t.Run("only-headers-schema-returned", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium"}, map[string]string{"Content-Type": "text/html"}, false, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.res.body")) + }) + + t.Run("headers-and-req-body-schema-returned", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"Content-Type": "text/html"}, false, false, `{"hello_request_body":"world"}`, "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"content-type":[[[8]],{"len":1}],"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Equal(t, `[{"hello_request_body":[8]}]`, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.res.body")) + }) + + t.Run("headers-and-res-body-schema-returned", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium"}, map[string]string{"Content-Type": "application/json"}, false, false, "", `{"hello_response_body": "world"}`) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Nil(t, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Equal(t, `[{"hello_response_body":[8]}]`, span.Tag("_dd.appsec.s.res.body")) + }) + + t.Run("all-schema-returned", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/", "GET", map[string]string{"User-Agent": "Chromium", "Content-Type": "application/json"}, map[string]string{"Content-Type": "application/json"}, false, false, `{"hello_request_body":"world"}`, `{"hello_response_body": "world"}`) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for api security schema + span := finished[0] + require.Equal(t, `[{"content-type":[[[8]],{"len":1}],"host":[[[8]],{"len":1}],"user-agent":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.req.headers")) + require.Equal(t, `[{"hello_request_body":[8]}]`, span.Tag("_dd.appsec.s.req.body")) + require.Equal(t, `[{"content-type":[[[8]],{"len":1}]}]`, span.Tag("_dd.appsec.s.res.headers")) + require.Equal(t, `[{"hello_response_body":[8]}]`, span.Tag("_dd.appsec.s.res.body")) + }) +} + +func TestGeneratedSpan(t *testing.T) { + setup := func() (func(req *request.Request), mocktracer.Tracer, func()) { + rig := newHAProxyAppsecRig(t, false, 0) + mt := mocktracer.Start() + + return rig.handler, mt, func() { + mt.Stop() + } + } + + t.Run("request-span", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/../../../resource-span/.?id=test", "GET", map[string]string{"user-agent": "Mistake Not...", "test-key": "test-value"}, map[string]string{"response-test-key": "response-test-value"}, false, false, "", "body") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "http.request", span.OperationName()) + require.Equal(t, "https://datadoghq.com/resource-span/?id=test", span.Tag("http.url")) + require.Equal(t, "GET", span.Tag("http.method")) + require.Equal(t, "datadoghq.com", span.Tag("http.host")) + require.Equal(t, "GET /resource-span", span.Tag("resource.name")) + require.Equal(t, "server", span.Tag("span.kind")) + require.Equal(t, "Mistake Not...", span.Tag("http.useragent")) + require.Equal(t, "haproxy-spoa", span.Tag("component")) + }) + t.Run("span-with-injected-context", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + // add metadata to the context + headers := map[string]string{ + "User-Agent": "Mistake Not...", + "Test-Key": "test-value", + "x-datadog-trace-id": "12345", + "x-datadog-parent-id": "67890", + } + + end2EndStreamRequest(t, handler, "/../../../resource-span/.?id=test", "GET", headers, map[string]string{"response-test-key": "response-test-value"}, false, false, "", "body") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "http.request", span.OperationName()) + require.Equal(t, "https://datadoghq.com/resource-span/?id=test", span.Tag("http.url")) + require.Equal(t, "GET", span.Tag("http.method")) + require.Equal(t, "datadoghq.com", span.Tag("http.host")) + require.Equal(t, "GET /resource-span", span.Tag("resource.name")) + require.Equal(t, "server", span.Tag("span.kind")) + require.Equal(t, "Mistake Not...", span.Tag("http.useragent")) + require.Equal(t, "haproxy-spoa", span.Tag("component")) + + // Check for trace context + require.Equal(t, "00000000000000000000000000003039", span.Context().TraceID()) + require.Equal(t, uint64(67890), span.ParentID()) + }) + t.Run("span-with-propagation-headers-set", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + spanId, _, injectedHeaders, _ := sendProcessingRequestHeaders(t, handler, map[string]string{}, "GET", "/../../../resource-span/.?id=test") + + // Check for trace propagation headers injected + require.Contains(t, injectedHeaders, "tracing_x_datadog_trace_id") + require.Contains(t, injectedHeaders, "tracing_x_datadog_parent_id") + require.Contains(t, injectedHeaders, "tracing_x_datadog_tags") + + sendProcessingResponseHeaders(t, handler, nil, "200", spanId) + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + + // Check for tags + span := finished[0] + require.Equal(t, "http.request", span.OperationName()) + require.Equal(t, "https://datadoghq.com/resource-span/?id=test", span.Tag("http.url")) + require.Equal(t, "GET", span.Tag("http.method")) + require.Equal(t, "datadoghq.com", span.Tag("http.host")) + require.Equal(t, "GET /resource-span", span.Tag("resource.name")) + require.Equal(t, "server", span.Tag("span.kind")) + require.Equal(t, "haproxy-spoa", span.Tag("component")) + }) +} + +func TestMalformedHAProxyProcessing(t *testing.T) { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + setup := func() (func(req *request.Request), mocktracer.Tracer, func()) { + rig := newHAProxyAppsecRig(t, false, 0) + mt := mocktracer.Start() + + return rig.handler, mt, func() { + mt.Stop() + } + } + + t.Run("response-received-without-request", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + requestedBody, blockedAct := sendProcessingResponseHeaders(t, handler, map[string]string{}, "400", "0") + require.False(t, requestedBody) + require.Nil(t, blockedAct) + + // No span created, the request is invalid. + // span couldn't be created without request data + finished := mt.FinishedSpans() + require.Len(t, finished, 0) + }) + t.Run("unknown-url-escape-sequence-one", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + end2EndStreamRequest(t, handler, "/%u002e/resource", "GET", nil, nil, false, false, "", "") + + finished := mt.FinishedSpans() + require.Len(t, finished, 1) + }) + t.Run("unknown-url-escape-sequence-six", func(t *testing.T) { + handler, mt, cleanup := setup() + defer cleanup() + + spanId, requestBody, _, blockedAct := sendProcessingRequestHeaders(t, handler, nil, "GET", "/%u002e/%ZZ/%tt/%uuuu/%uwu/%%") + require.False(t, requestBody) + require.Nil(t, blockedAct) + require.Empty(t, spanId) + + finished := mt.FinishedSpans() + require.Len(t, finished, 0) + }) +} + +func newHAProxyAppsecRig(t *testing.T, blockingUnavailable bool, bodyParsingSizeLimit int) *haproxyAppsecRig { + t.Helper() + + if blockingUnavailable { + _ = os.Setenv("_DD_APPSEC_BLOCKING_UNAVAILABLE", "true") + } + + appsecHAProxy := NewHAProxySPOA(AppsecHAProxyConfig{ + BlockingUnavailable: false, + BodyParsingSizeLimit: bodyParsingSizeLimit, + Context: context.Background(), + }) + + return &haproxyAppsecRig{ + handler: appsecHAProxy.Handler, + } +} + +// rig contains all servers and connections we'd need for a haproxy integration test +type haproxyAppsecRig struct { + handler func(req *request.Request) +} + +// Helper functions + +func sendProcessingRequestHeaders(t *testing.T, handler func(*request.Request), headers map[string]string, method string, path string) (string, bool, map[string]string, *blockedAction) { + t.Helper() + + if headers == nil { + headers = map[string]string{} + } + + // Only for the test: specify the Host header + if _, ok := headers["Host"]; !ok { + headers["Host"] = "datadoghq.com" + } + + mKv := kv.NewKV() + mKv.Add(VarMethod, method) + mKv.Add(VarPath, path) + mKv.Add(VarHeaders, convertBinaryHeaders(headers)) + mKv.Add(VarHttps, true) + mKv.Add(VarTimeout, "1s") + + if ip, ok := headers["X-Forwarded-For"]; ok { + mKv.Add(VarIp, net.ParseIP(ip)) + } else { + mKv.Add(VarIp, net.ParseIP("123.123.123.123")) + } + + mKv.Add(VarIpPort, 12345) + + messages := message.Messages{ + &message.Message{Name: "http-request-headers-msg", KV: mKv}, + } + + actions := action.Actions{} + + pRequest := request.Request{ + EngineID: "test-engine", + StreamID: 1, + FrameID: 1, + Messages: &messages, + Actions: actions, + } + + handler(&pRequest) + + // Handle the response + blockedAct, err := createBlockedAction(pRequest.Actions) + require.NoError(t, err) + if blockedAct != nil { + return "", false, nil, blockedAct + } + + spanId, err := findVar(pRequest.Actions, VarSpanId) + if err != nil { + return "", false, nil, nil + } + + requestedBody, err := findVar(pRequest.Actions, VarRequestBody) + if err != nil { + requestedBody = false + } + + // Handle injected headers + injectedValues := make(map[string]string, len(haproxyTracingHeaderActions)) + for _, actionName := range haproxyTracingHeaderActions { + if v, err := findVar(pRequest.Actions, actionName); err == nil { + injectedValues[actionName] = v.(string) + } + } + + return spanId.(string), requestedBody.(bool), injectedValues, nil +} + +// sendProcessingRequestBody sends the request body +func sendProcessingRequestBody(t *testing.T, handler func(*request.Request), body []byte, spanId string) *blockedAction { + t.Helper() + + mKv := kv.NewKV() + mKv.Add(VarBody, body) + mKv.Add(VarSpanId, spanId) + + messages := message.Messages{ + &message.Message{Name: "http-request-body-msg", KV: mKv}, + } + + actions := action.Actions{} + + pRequest := request.Request{ + EngineID: "test-engine", + StreamID: 1, + FrameID: 1, + Messages: &messages, + Actions: actions, + } + + handler(&pRequest) + + // Handle the response + blockedAct, err := createBlockedAction(pRequest.Actions) + require.NoError(t, err) + if blockedAct != nil { + return blockedAct + } + + return nil +} + +func sendProcessingResponseHeaders(t *testing.T, handler func(*request.Request), headers map[string]string, status string, spanId string) (bool, *blockedAction) { + t.Helper() + + mKv := kv.NewKV() + mKv.Add(VarHeaders, convertBinaryHeaders(headers)) + mKv.Add(VarStatus, status) + mKv.Add(VarSpanId, spanId) + + messages := message.Messages{ + &message.Message{Name: "http-response-headers-msg", KV: mKv}, + } + + actions := action.Actions{} + + pRequest := request.Request{ + EngineID: "test-engine", + StreamID: 1, + FrameID: 1, + Messages: &messages, + Actions: actions, + } + + handler(&pRequest) + + // Handle the response + blockedAct, err := createBlockedAction(pRequest.Actions) + require.NoError(t, err) + if blockedAct != nil { + return false, blockedAct + } + + requestedBody, err := findVar(pRequest.Actions, VarRequestBody) + if err != nil { + requestedBody = false + } + + return requestedBody.(bool), nil +} + +// sendProcessingResponseBody sends the response body in chunks to the stream. +// Returns the total number of message chunks sent. +func sendProcessingResponseBody(t *testing.T, handler func(*request.Request), body []byte, spanId string) *blockedAction { + t.Helper() + + mKv := kv.NewKV() + mKv.Add(VarBody, body) + mKv.Add(VarSpanId, spanId) + + messages := message.Messages{ + &message.Message{Name: "http-response-body-msg", KV: mKv}, + } + + actions := action.Actions{} + + pRequest := request.Request{ + EngineID: "test-engine", + StreamID: 1, + FrameID: 1, + Messages: &messages, + Actions: actions, + } + + handler(&pRequest) + + // Handle the response + blockedAct, err := createBlockedAction(pRequest.Actions) + require.NoError(t, err) + if blockedAct != nil { + return blockedAct + } + + return nil +} + +func convertBinaryHeaders(headers map[string]string) []byte { + var b []byte + for name, value := range headers { + b = encodeHeader(b, name, value) + } + return encodeTerminator(b) +} + +type blockedAction struct { + headers map[string]string + body []byte + statusCode int +} + +func createBlockedAction(actions action.Actions) (*blockedAction, error) { + blocked, err := findVar(actions, VarBlocked) + if err != nil || !blocked.(bool) { + return nil, nil + } + + headers, err := findVar(actions, VarHeaders) + if err != nil { + return nil, fmt.Errorf("blocked action without headers: %v", err) + } + + parsedHeaders, err := parseBlockedHeaders(headers.(string)) + if err != nil { + return nil, fmt.Errorf("blocked action with invalid headers: %v", err) + } + + body, err := findVar(actions, VarBody) + if err != nil { + return nil, fmt.Errorf("blocked action without body: %v", err) + } + + statusCode, err := findVar(actions, VarStatus) + if err != nil { + return nil, fmt.Errorf("blocked action without status code: %v", err) + } + + return &blockedAction{ + headers: parsedHeaders, + body: body.([]byte), + statusCode: statusCode.(int), + }, nil +} + +func findVar(actions action.Actions, name string) (interface{}, error) { + for _, a := range actions { + if a.Type == action.TypeSetVar && a.Name == name { + return a.Value, nil + } + } + + return nil, fmt.Errorf("variable %s not found in actions", name) +} + +var ( + lineRegex = regexp.MustCompile(`(?m)^[^\r\n]+`) + kvRegex = regexp.MustCompile(`^([A-Za-z0-9-]+): (\S.+)$`) +) + +func parseBlockedHeaders(s string) (map[string]string, error) { + h := make(map[string]string) + + for _, line := range lineRegex.FindAllString(s, -1) { + if m := kvRegex.FindStringSubmatch(line); m != nil { + key, val := m[1], m[2] + h[key] = val + } else { + return nil, fmt.Errorf("invalid header line: %s", line) + } + } + + return h, nil +} + +func end2EndStreamRequest(t *testing.T, handler func(*request.Request), path string, method string, requestHeaders map[string]string, responseHeaders map[string]string, blockOnResponseHeaders bool, blockOnResponseBody bool, requestBody string, responseBody string) { + t.Helper() + + // First part: request + // 1- Send the headers + spanId, requestBodyRequested, _, blocked := sendProcessingRequestHeaders(t, handler, requestHeaders, method, path) + require.Nil(t, blocked, "expected no blocked action when sending request headers") + + require.NotEmpty(t, spanId) + + // 2- Send the body: send it if the processor requested the body for analysis + if requestBodyRequested && len(requestBody) > 0 { + blocked := sendProcessingRequestBody(t, handler, []byte(requestBody), spanId) + require.Nil(t, blocked, "expected no blocked action when sending request body") + } + + // Second part: response + // 1- Send the response headers + responseBodyRequested, blocked := sendProcessingResponseHeaders(t, handler, responseHeaders, "200", spanId) + if blockOnResponseHeaders { + require.NotNil(t, blocked, "expected a blocked action when sending response headers") + return + } else { + require.Nil(t, blocked, "expected no blocked action when sending request headers") + } + + // 2- Send the body: send it if the processor requested the body for analysis + if responseBodyRequested && len(responseBody) > 0 { + blocked := sendProcessingResponseBody(t, handler, []byte(responseBody), spanId) + if blockOnResponseBody { + require.NotNil(t, blocked, "expected a blocked action when sending response body") + } else { + require.Nil(t, blocked, "expected no blocked action when sending response body") + } + } +} + +func checkForAppsecEvent(t *testing.T, finished []*mocktracer.Span, expectedRuleIDs map[string]int) { + t.Helper() + + // The request should have the attack attempts + event := finished[len(finished)-1].Tag("_dd.appsec.json") + require.NotNil(t, event, "the _dd.appsec.json tag was not found") + + jsonText := event.(string) + type trigger struct { + Rule struct { + ID string `json:"id"` + } `json:"rule"` + } + var parsed struct { + Triggers []trigger `json:"triggers"` + } + err := json.Unmarshal([]byte(jsonText), &parsed) + require.NoError(t, err) + + histogram := map[string]uint8{} + for _, tr := range parsed.Triggers { + histogram[tr.Rule.ID]++ + } + + for ruleID, count := range expectedRuleIDs { + require.Equal(t, count, int(histogram[ruleID]), "rule %s has been triggered %d times but expected %d", ruleID, histogram[ruleID], count) + } + + require.Len(t, parsed.Triggers, len(expectedRuleIDs), "unexpected number of rules triggered") +} diff --git a/contrib/haproxy/stream-processing-offload/haproxy_utils.go b/contrib/haproxy/stream-processing-offload/haproxy_utils.go new file mode 100644 index 0000000000..bf3cbcb6c7 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/haproxy_utils.go @@ -0,0 +1,203 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "context" + "fmt" + "net" + "net/http" + "strconv" + "strings" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + + "github.com/negasus/haproxy-spoe-go/action" + "github.com/negasus/haproxy-spoe-go/message" +) + +// haproxyMessage wraps the SPOE message and provides typed accessors +type haproxyMessage struct { + *message.Message +} + +// newHaproxyMessage creates a new haproxyMessage wrapper of message.Message +func newHaproxyMessage(msg *message.Message) *haproxyMessage { + return &haproxyMessage{Message: msg} +} + +// String returns the string value for the given key, or returns an empty string if it's missing or not a string +func (m *haproxyMessage) String(key string) string { + if val, exists := m.KV.Get(key); exists { + if str, ok := val.(string); ok { + return str + } + } + return "" +} + +// Int returns the int value for the given key or 0 if missing +func (m *haproxyMessage) Int(key string) int { + if val, exists := m.KV.Get(key); exists { + if i, ok := val.(int); ok { + return i + } + if i64, ok := val.(int64); ok { + return int(i64) + } + } + return 0 +} + +// Bytes returns the []byte value for the given key or nil if missing +func (m *haproxyMessage) Bytes(key string) []byte { + if val, exists := m.KV.Get(key); exists { + if b, ok := val.([]byte); ok { + return b + } + } + return nil +} + +// Bool returns the bool value for the given key or false if missing +func (m *haproxyMessage) Bool(key string) bool { + if val, exists := m.KV.Get(key); exists { + if b, ok := val.(bool); ok { + return b + } + } + return false +} + +// IP returns the net.IP value for the given key or nil if missing +func (m *haproxyMessage) IP(key string) net.IP { + if val, exists := m.KV.Get(key); exists { + if ip, ok := val.(net.IP); ok { + return ip + } + } + return nil +} + +// SpanID extracts the `span_id` from the message and returns it as uint64. +func (m *haproxyMessage) SpanID() (uint64, error) { + spanIdStr := m.String(VarSpanId) + if spanIdStr == "" { + return 0, fmt.Errorf("span_id not found in message") + } + spanId, err := strconv.ParseUint(spanIdStr, 10, 64) + if err != nil { + return 0, fmt.Errorf("failed to parse span_id '%s': %v", spanIdStr, err) + } + if spanId == 0 { + return 0, fmt.Errorf("span_id is 0") + } + return spanId, nil +} + +// continueActionFunc sets HeadersResponseData data into the request variables answering a Request Headers message +func continueActionFunc(ctx context.Context, options proxy.ContinueActionOptions) error { + requestContextData, found := ctx.Value(haproxyRequestContextKey{}).(*haproxyRequestContextData) + if !found { + return fmt.Errorf("no haproxy request data found in context") + } + + if requestContextData.req == nil || requestContextData.req.Actions == nil { + return fmt.Errorf("the haproxy context data have not been correctly initialized") + } + + // Only set the span id from a request headers message + if options.HeaderMutations != nil { + s, ok := tracer.SpanFromContext(ctx) + if !ok { + return fmt.Errorf("failed to retreive the span from the context of the request") + } + + timeout := requestContextData.msg.String(VarTimeout) + requestContextData.timeout = timeout + + spanId := s.Context().SpanID() + spanIdStr := strconv.FormatUint(spanId, 10) + requestContextData.req.Actions.SetVar(action.ScopeTransaction, VarSpanId, spanIdStr) + + injectTracingHeaders(options.HeaderMutations, &requestContextData.req.Actions) + } + + if options.Body { + requestContextData.req.Actions.SetVar(action.ScopeTransaction, VarRequestBody, true) + } + + return nil +} + +const headerCount = 5 + +// haproxyTracingHeaderActions defines the names of the actions to set tracing headers for HAProxy. +// These action names are used inside the HAProxy configuration to correctly set the tracing headers. +var haproxyTracingHeaderActions = [headerCount]string{ + VarTracingHeaderTraceId, + VarTracingHeaderParentId, + VarTracingHeaderOrigin, + VarTracingHeaderSamplingPriority, + VarTracingHeaderTags, +} + +// datadogTracingHeaders defines the names of tracing headers supported with the Datadog tracing format. +var datadogTracingHeaders = [headerCount]string{ + tracer.DefaultTraceIDHeader, + tracer.DefaultParentIDHeader, + "x-datadog-origin", + tracer.DefaultPriorityHeader, + "x-datadog-tags", +} + +// injectTracingHeaders injects tracing headers when present. Supporting only the Datadog tracing format. +// https://docs.datadoghq.com/tracing/trace_collection/trace_context_propagation/#datadog-format +func injectTracingHeaders(headerMutations map[string][]string, actions *action.Actions) { + if len(headerMutations) == 0 { + return + } + + for i := range haproxyTracingHeaderActions { + mutationHeader := http.CanonicalHeaderKey(datadogTracingHeaders[i]) + if v, ok := headerMutations[mutationHeader]; ok { + actions.SetVar(action.ScopeTransaction, haproxyTracingHeaderActions[i], strings.TrimSpace(strings.Join(v, ","))) + } + } +} + +// blockActionFunc sets blocked data into the request variables when the request is blocked +func blockActionFunc(ctx context.Context, data proxy.BlockActionOptions) error { + requestContext, found := ctx.Value(haproxyRequestContextKey{}).(*haproxyRequestContextData) + if !found { + return fmt.Errorf("no haproxy request data found in context") + } + + if requestContext.req == nil || requestContext.req.Actions == nil { + return fmt.Errorf("the haproxy context data have not been correctly initialized") + } + + requestContext.req.Actions.SetVar(action.ScopeTransaction, VarBlocked, true) + requestContext.req.Actions.SetVar(action.ScopeTransaction, VarHeaders, convertHeadersToString(data.Headers)) + requestContext.req.Actions.SetVar(action.ScopeTransaction, VarBody, data.Body) + requestContext.req.Actions.SetVar(action.ScopeTransaction, VarStatus, data.StatusCode) + + return nil +} + +// convertHeadersToString converts HTTP headers to a string format with `Header: Value` pairs separated by newlines. +// These headers will then be parsed by a lua script loaded in the HAProxy configuration. +func convertHeadersToString(headers http.Header) string { + var sb strings.Builder + for key, values := range headers { + sb.WriteString(key) + sb.WriteString(": ") + sb.WriteString(strings.Join(values, ",")) + sb.WriteString("\n") + } + return sb.String() +} diff --git a/contrib/haproxy/stream-processing-offload/hdrsbin_parser.go b/contrib/haproxy/stream-processing-offload/hdrsbin_parser.go new file mode 100644 index 0000000000..18903f2c85 --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/hdrsbin_parser.go @@ -0,0 +1,86 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "fmt" + "net/http" + + "github.com/negasus/haproxy-spoe-go/varint" +) + +// readUvarintAt reads a Peers varint starting at index p and returns the decoded value +// and the next index to read from. It validates bounds and varint correctness. +func readUvarintAt(buf []byte, p int) (val uint64, next int, err error) { + if p >= len(buf) { + return 0, p, fmt.Errorf("unexpected end of headers at index %d", p) + } + v, n := varint.Uvarint(buf[p:]) + if n < 0 { + return 0, p, fmt.Errorf("invalid varint at index %d", p) + } + return v, p + n, nil +} + +// parseHAProxyReqHdrsBin decodes HAProxy req.hdrs_bin format into an http.Header. +// Format: repeated pairs of where str is . +// The list is terminated by a pair of empty strings (length 0 for both name and value). +// https://www.haproxy.com/documentation/haproxy-configuration-manual/latest/#7.3.6-req.hdrs_bin +func parseHAProxyReqHdrsBin(buf []byte) (http.Header, error) { + if buf == nil || len(buf) == 0 { + return nil, fmt.Errorf("empty headers buffer") + } + + headers := make(http.Header) + + p := 0 + for { + // Read name length + nameLen, next, err := readUvarintAt(buf, p) + if err != nil { + return nil, fmt.Errorf("read name length: %w", err) + } + p = next + + if nameLen > uint64(len(buf)-p) { + return nil, fmt.Errorf("header name length %d exceeds remaining buffer %d", nameLen, len(buf)-p) + } + + nameStart := p + nameEnd := p + int(nameLen) + name := string(buf[nameStart:nameEnd]) + p = nameEnd + + // Read value length + valueLen, next, err := readUvarintAt(buf, p) + if err != nil { + return nil, fmt.Errorf("read value length for '%s': %w", name, err) + } + p = next + + // Termination marker: both lengths zero + if nameLen == 0 && valueLen == 0 { + break + } + + if nameLen == 0 { + return nil, fmt.Errorf("encountered empty header name with non-empty value") + } + + if valueLen > uint64(len(buf)-p) { + return nil, fmt.Errorf("header value length %d exceeds remaining buffer %d", valueLen, len(buf)-p) + } + + valueStart := p + valueEnd := p + int(valueLen) + value := string(buf[valueStart:valueEnd]) + p = valueEnd + + headers.Add(name, value) + } + + return headers, nil +} diff --git a/contrib/haproxy/stream-processing-offload/hdrsbin_parser_test.go b/contrib/haproxy/stream-processing-offload/hdrsbin_parser_test.go new file mode 100644 index 0000000000..104b8ff99f --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/hdrsbin_parser_test.go @@ -0,0 +1,240 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "bytes" + "fmt" + "net/http" + "reflect" + "testing" + + "github.com/negasus/haproxy-spoe-go/varint" + "github.com/stretchr/testify/require" +) + +func TestParseHAProxyReqHdrsBin_Table(t *testing.T) { + longName := string(bytes.Repeat([]byte("N"), 300)) + longValue := string(bytes.Repeat([]byte("V"), 500)) + + tests := []struct { + name string + build func() []byte + want http.Header + wantErr bool + check func(t *testing.T, got http.Header) + }{ + { + name: "empty-buffer-error", + build: func() []byte { return nil }, + wantErr: true, + }, + { + name: "termination-only-empty-headers", + build: func() []byte { return encodeTerminator(nil) }, + want: http.Header{}, + }, + { + name: "single-header", + build: func() []byte { + var b []byte + b = encodeHeader(b, "Host", "example.com") + return encodeTerminator(b) + }, + want: http.Header{"Host": {"example.com"}}, + }, + { + name: "multiple-headers-and-duplicates", + build: func() []byte { + var b []byte + b = encodeHeader(b, "X-A", "1") + b = encodeHeader(b, "X-A", "2") + b = encodeHeader(b, "Y", "z") + return encodeTerminator(b) + }, + want: http.Header{"X-A": {"1", "2"}, "Y": {"z"}}, + }, + { + name: "empty-value-allowed", + build: func() []byte { + var b []byte + b = encodeHeader(b, "X-Empty", "") + return encodeTerminator(b) + }, + want: http.Header{"X-Empty": {""}}, + }, + { + name: "multi-byte-varint-lengths", + build: func() []byte { + var b []byte + b = encodeHeader(b, longName, longValue) + return encodeTerminator(b) + }, + check: func(t *testing.T, got http.Header) { + if len(got.Get(longName)) != len(longValue) { + t.Fatalf("expected value length %d, got %d", len(longValue), len(got.Get(longName))) + } + }, + }, + { + name: "malformed-truncated-varint-for-name", + build: func() []byte { return []byte{0xF0} }, // >=240 => truncated + wantErr: true, + }, + { + name: "malformed-empty-name-non-empty-value", + build: func() []byte { + var tmp [10]byte + var b []byte + // name len = 0 + n := varint.PutUvarint(tmp[:], 0) + b = append(b, tmp[:n]...) + // value len = 1 + value byte + n = varint.PutUvarint(tmp[:], 1) + b = append(b, tmp[:n]...) + b = append(b, 'x') + return b + }, + wantErr: true, + }, + { + name: "name-exceeds-remaining-error", + build: func() []byte { + var tmp [10]byte + var b []byte + n := varint.PutUvarint(tmp[:], 10) + b = append(b, tmp[:n]...) + b = append(b, []byte("short")...) // only 5 bytes + return b + }, + wantErr: true, + }, + { + name: "value-exceeds-remaining-error", + build: func() []byte { + var b []byte + b = encodeHeader(b, "K", "V") + // corrupt last byte + return b[:len(b)-1] + }, + wantErr: true, + }, + { + name: "ignores-trailing-bytes-after-terminator", + build: func() []byte { + var b []byte + b = encodeHeader(b, "A", "B") + b = encodeTerminator(b) + b = append(b, 0xFF, 0xEE, 0xDD) // trailing garbage + return b + }, + want: http.Header{"A": {"B"}}, + }, + { + name: "malformed-empty", + build: func() []byte { return nil }, + wantErr: true, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got, err := parseHAProxyReqHdrsBin(tc.build()) + if tc.wantErr { + if err == nil { + t.Fatalf("expected error, got nil") + } + return + } + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if tc.check != nil { + tc.check(t, got) + return + } + + require.True(t, reflect.DeepEqual(got, tc.want), fmt.Sprintf("expected headers %v, got %v", tc.want, got)) + }) + } +} + +// FuzzParseHAProxyReqHdrsBin ensures the decoder never panics/hangs on arbitrary inputs. +func FuzzParseHAProxyReqHdrsBin(f *testing.F) { + f.Add(encodeTerminator(nil)) + + // Single header + var b1 []byte + b1 = encodeHeader(b1, "Host", "example.com") + b1 = encodeTerminator(b1) + f.Add(b1) + + // Duplicates + var b2 []byte + b2 = encodeHeader(b2, "X-A", "1") + b2 = encodeHeader(b2, "X-A", "2") + b2 = encodeTerminator(b2) + f.Add(b2) + + // Long multi-byte varints + longName := string(bytes.Repeat([]byte("N"), 300)) + longValue := string(bytes.Repeat([]byte("V"), 500)) + var b3 []byte + b3 = encodeHeader(b3, longName, longValue) + b3 = encodeTerminator(b3) + f.Add(b3) + + // Malformed: truncated varint + f.Add([]byte{0xF0}) + + // Malformed: empty name, non-empty value + var tmp [10]byte + var b4 []byte + n := varint.PutUvarint(tmp[:], 0) + b4 = append(b4, tmp[:n]...) + n = varint.PutUvarint(tmp[:], 1) + b4 = append(b4, tmp[:n]...) + b4 = append(b4, 'x') + f.Add(b4) + + f.Fuzz(func(t *testing.T, data []byte) { + // Bound the size to avoid excessive memory/time usage + if len(data) > 1<<16 { // 64KiB cap keeps runs fast + t.Skip() + } + + defer func() { + if r := recover(); r != nil { + t.Fatalf("panic: %v", r) + } + }() + + _, _ = parseHAProxyReqHdrsBin(data) + }) +} + +// encodeHeader appends a single pair using SPOE varint length-prefixed strings. +func encodeHeader(dst []byte, name, value string) []byte { + var buf [10]byte + n := varint.PutUvarint(buf[:], uint64(len(name))) + dst = append(dst, buf[:n]...) + dst = append(dst, name...) + + n = varint.PutUvarint(buf[:], uint64(len(value))) + dst = append(dst, buf[:n]...) + dst = append(dst, value...) + return dst +} + +// encodeTerminator appends the terminating empty name/value pair. +func encodeTerminator(dst []byte) []byte { + var buf [10]byte + n := varint.PutUvarint(buf[:], 0) + dst = append(dst, buf[:n]...) + n = varint.PutUvarint(buf[:], 0) + dst = append(dst, buf[:n]...) + return dst +} diff --git a/contrib/haproxy/stream-processing-offload/request_cache.go b/contrib/haproxy/stream-processing-offload/request_cache.go new file mode 100644 index 0000000000..07be7b0f5d --- /dev/null +++ b/contrib/haproxy/stream-processing-offload/request_cache.go @@ -0,0 +1,63 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package streamprocessingoffload + +import ( + "context" + "fmt" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + + "github.com/jellydator/ttlcache/v3" +) + +// initRequestStateCache creates a new cache for request states with a cleanup function that is called when a request state is evicted. +func initRequestStateCache(cleanup func(*proxy.RequestState)) *ttlcache.Cache[uint64, *proxy.RequestState] { + const requestStateTTL = time.Minute // Default TTL but will be overridden by the timeout value of the HAProxy configuration + requestStateCache := ttlcache.New[uint64, *proxy.RequestState]( + ttlcache.WithTTL[uint64, *proxy.RequestState](requestStateTTL), + ) + + requestStateCache.OnEviction(func(ctx context.Context, reason ttlcache.EvictionReason, item *ttlcache.Item[uint64, *proxy.RequestState]) { + cleanup(item.Value()) + }) + + go requestStateCache.Start() + + return requestStateCache +} + +// getCurrentRequest returns the current request state from the cache based on the `span_id` extracted from the message. +func getCurrentRequest(cache *ttlcache.Cache[uint64, *proxy.RequestState], msg *haproxyMessage) (*proxy.RequestState, error) { + if cache == nil { + return nil, fmt.Errorf("the request state cache is not initialized") + } + key, err := msg.SpanID() + if err != nil { + return nil, fmt.Errorf("failed to extract span_id from message: %w", err) + } + + if item := cache.Get(key); item != nil { + if v := item.Value(); v != nil { + return v, nil + } + } + + return nil, fmt.Errorf("no current request found for span_id %d", key) +} + +// storeRequestState stores the request state in the cache with the given `span_id`. +// The `timeout` string duration value is parsed and used to set the TTL of the cached item. +func storeRequestState(cache *ttlcache.Cache[uint64, *proxy.RequestState], spanId uint64, rs proxy.RequestState, timeout string) { + timeoutValue, err := time.ParseDuration(timeout) + if err != nil { + instr.Logger().Warn("haproxy_spoa: the timeout value '%s' is invalid. Please configure correctly the DD_SPOA_TIMEOUT variable in your HAProxy global configuration. Fallback to 1 minute.", timeout) + timeoutValue = time.Minute // Fallback to a TTL of 1 minute + } + + cache.Set(spanId, &rs, timeoutValue) +} diff --git a/contrib/hashicorp/consul/benchmark_test.go b/contrib/hashicorp/consul/benchmark_test.go index 7abd8ae6b5..fc4da38e99 100644 --- a/contrib/hashicorp/consul/benchmark_test.go +++ b/contrib/hashicorp/consul/benchmark_test.go @@ -8,7 +8,7 @@ package consul import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" consul "github.com/hashicorp/consul/api" ) diff --git a/contrib/hashicorp/consul/consul.go b/contrib/hashicorp/consul/consul.go index 4182156eaa..ca1499d4dc 100644 --- a/contrib/hashicorp/consul/consul.go +++ b/contrib/hashicorp/consul/consul.go @@ -9,20 +9,17 @@ import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" consul "github.com/hashicorp/consul/api" ) -const componentName = "hashicorp/consul" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/hashicorp/consul/api") + instr = instrumentation.Load(instrumentation.PackageHashicorpConsulAPI) } // Client wraps the regular *consul.Client and augments it with tracing. Use NewClient to initialize it. @@ -48,9 +45,9 @@ func WrapClient(c *consul.Client, opts ...ClientOption) *Client { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/hashicorp/consul: Wrapping Client: %#v", cfg) + instr.Logger().Debug("contrib/hashicorp/consul: Wrapping Client: %#v", cfg) return &Client{c, cfg, context.Background()} } @@ -72,13 +69,13 @@ func (c *Client) KV() *KV { return &KV{c.Client.KV(), c.config, c.ctx} } -func (k *KV) startSpan(resourceName string, key string) ddtrace.Span { - opts := []ddtrace.StartSpanOption{ +func (k *KV) startSpan(resourceName string, key string) *tracer.Span { + opts := []tracer.StartSpanOption{ tracer.ResourceName(resourceName), tracer.ServiceName(k.config.serviceName), tracer.SpanType(ext.SpanTypeConsul), tracer.Tag("consul.key", key), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageHashicorpConsulAPI), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(ext.DBSystem, ext.DBSystemConsulKV), } diff --git a/contrib/hashicorp/consul/consul_test.go b/contrib/hashicorp/consul/consul_test.go index 82e869d1d4..5136d3bdc3 100644 --- a/contrib/hashicorp/consul/consul_test.go +++ b/contrib/hashicorp/consul/consul_test.go @@ -11,13 +11,12 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" consul "github.com/hashicorp/consul/api" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestMain(m *testing.M) { @@ -101,46 +100,10 @@ func TestKV(t *testing.T) { assert.Equal("consul", span.Tag(ext.ServiceName)) assert.Equal(key, span.Tag("consul.key")) assert.Equal("hashicorp/consul", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpConsulAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("127.0.0.1", span.Tag(ext.NetworkDestinationName)) assert.Equal(ext.DBSystemConsulKV, span.Tag(ext.DBSystem)) }) } } -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - - mt := mocktracer.Start() - defer mt.Stop() - client, err := NewClient(consul.DefaultConfig(), opts...) - require.NoError(t, err) - kv := client.KV() - - pair := &consul.KVPair{Key: "test.key", Value: []byte("test_value")} - _, err = kv.Put(pair, nil) - require.NoError(t, err) - - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - return spans - } - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "consul.command", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "consul.query", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"consul"}, - WithDDService: []string{"consul"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("service name", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("operation name", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} diff --git a/contrib/hashicorp/consul/example_test.go b/contrib/hashicorp/consul/example_test.go index 86b4be6da6..9350a7f182 100644 --- a/contrib/hashicorp/consul/example_test.go +++ b/contrib/hashicorp/consul/example_test.go @@ -3,23 +3,27 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package consul +package consul_test import ( "context" "fmt" "log" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" consul "github.com/hashicorp/consul/api" + + ddconsul "github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2" ) // Here's an example illustrating a simple use case for interacting with consul with tracing enabled. func Example() { + tracer.Start() + defer tracer.Stop() + // Get a new Consul client - client, err := NewClient(consul.DefaultConfig(), WithServiceName("consul.example")) + client, err := ddconsul.NewClient(consul.DefaultConfig(), ddconsul.WithService("consul.example")) if err != nil { log.Fatal(err) } diff --git a/contrib/hashicorp/consul/go.mod b/contrib/hashicorp/consul/go.mod new file mode 100644 index 0000000000..c3723d91a1 --- /dev/null +++ b/contrib/hashicorp/consul/go.mod @@ -0,0 +1,112 @@ +module github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/hashicorp/consul/api v1.24.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fatih/color v1.16.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/miekg/dns v1.1.55 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +// Pin github.com/armon/go-metrics to the last version available to avoid breaking changes +// due to the migration to github.com/hashicorp/go-metrics. +// This will be a no-op once hashicorp/consul/api is updated to use the new go-metrics package. +replace github.com/armon/go-metrics => github.com/armon/go-metrics v0.4.1 + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/hashicorp/consul/go.sum b/contrib/hashicorp/consul/go.sum new file mode 100644 index 0000000000..e38dc25f0e --- /dev/null +++ b/contrib/hashicorp/consul/go.sum @@ -0,0 +1,489 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= +github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= +github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/hashicorp/consul/option.go b/contrib/hashicorp/consul/option.go index 73bdcbed5d..5dc339ee6d 100644 --- a/contrib/hashicorp/consul/option.go +++ b/contrib/hashicorp/consul/option.go @@ -9,8 +9,7 @@ import ( "math" "net" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" consul "github.com/hashicorp/consul/api" ) @@ -26,29 +25,33 @@ type clientConfig struct { hostname string } -// ClientOption represents an option that can be used to create or wrap a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Consul integration. +type ClientOption interface { + apply(*clientConfig) +} -func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.ConsulOutbound) +// ClientOptionFn represents options applicable to NewClient and WrapClient. +type ClientOptionFn func(*clientConfig) - if internal.BoolEnv("DD_TRACE_CONSUL_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} + +func defaults(cfg *clientConfig) { + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -60,7 +63,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -71,7 +74,7 @@ func WithAnalyticsRate(rate float64) ClientOption { } // WithConfig extracts the config information for the client to be tagged -func WithConfig(config *consul.Config) ClientOption { +func WithConfig(config *consul.Config) ClientOptionFn { return func(cfg *clientConfig) { if host, _, err := net.SplitHostPort(config.Address); err == nil { cfg.hostname = host diff --git a/contrib/hashicorp/vault/example_test.go b/contrib/hashicorp/vault/example_test.go index 153effa773..ce0162da7b 100644 --- a/contrib/hashicorp/vault/example_test.go +++ b/contrib/hashicorp/vault/example_test.go @@ -10,9 +10,9 @@ import ( "log" "net/http" - vaulttrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/hashicorp/vault" - "github.com/hashicorp/vault/api" + + vaulttrace "github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2" ) // This is the most basic way to enable tracing with Vault. @@ -32,7 +32,7 @@ func ExampleNewHTTPClient() { func ExampleNewHTTPClient_withOptions() { c, err := api.NewClient(&api.Config{ HttpClient: vaulttrace.NewHTTPClient( - vaulttrace.WithServiceName("my.vault"), + vaulttrace.WithService("my.vault"), vaulttrace.WithAnalytics(true), ), Address: "http://vault.mydomain.com:8200/", @@ -49,9 +49,9 @@ func ExampleNewHTTPClient_withOptions() { func ExampleWrapHTTPClient() { // We use a custom *http.Client to talk to Vault. c := &http.Client{ - CheckRedirect: func(r *http.Request, via []*http.Request) error { + CheckRedirect: func(_ *http.Request, via []*http.Request) error { if len(via) > 5 { - return fmt.Errorf("won't perform more that 5 redirects") + return fmt.Errorf("won't perform more than 5 redirects") } return nil }, @@ -72,9 +72,9 @@ func ExampleWrapHTTPClient() { func ExampleWrapHTTPClient_withOptions() { // We use a custom *http.Client to talk to Vault. c := &http.Client{ - CheckRedirect: func(r *http.Request, via []*http.Request) error { + CheckRedirect: func(_ *http.Request, via []*http.Request) error { if len(via) > 5 { - return fmt.Errorf("won't perform more that 5 redirects") + return fmt.Errorf("won't perform more than 5 redirects") } return nil }, @@ -82,7 +82,7 @@ func ExampleWrapHTTPClient_withOptions() { client, err := api.NewClient(&api.Config{ HttpClient: vaulttrace.WrapHTTPClient( c, - vaulttrace.WithServiceName("my.vault"), + vaulttrace.WithService("my.vault"), vaulttrace.WithAnalytics(true), ), Address: "http://vault.mydomain.com:8200/", diff --git a/contrib/hashicorp/vault/go.mod b/contrib/hashicorp/vault/go.mod new file mode 100644 index 0000000000..b21c1c26ff --- /dev/null +++ b/contrib/hashicorp/vault/go.mod @@ -0,0 +1,117 @@ +module github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/hashicorp/vault/api v1.15.0 + github.com/hashicorp/vault/sdk v0.15.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9 // indirect + github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +// Pin github.com/armon/go-metrics to the last version available to avoid breaking changes +// due to the migration to github.com/hashicorp/go-metrics. +// This will be a no-op once hashicorp/vault/api is updated to use the new go-metrics package. +replace github.com/armon/go-metrics => github.com/armon/go-metrics v0.4.1 + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/hashicorp/vault/go.sum b/contrib/hashicorp/vault/go.sum new file mode 100644 index 0000000000..c21c2e6fe8 --- /dev/null +++ b/contrib/hashicorp/vault/go.sum @@ -0,0 +1,352 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9 h1:FW0YttEnUNDJ2WL9XcrrfteS1xW8u+sh4ggM8pN5isQ= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/vault/api v1.15.0 h1:O24FYQCWwhwKnF7CuSqP30S51rTV7vz1iACXE/pj5DA= +github.com/hashicorp/vault/api v1.15.0/go.mod h1:+5YTO09JGn0u+b6ySD/LLVf8WkJCPLAL2Vkmrn2+CM8= +github.com/hashicorp/vault/sdk v0.15.0 h1:xNo1lL2shm0yE4coXNZkTV/6++2GfEh+/cCAfBjzEnA= +github.com/hashicorp/vault/sdk v0.15.0/go.mod h1:2Wj2tHIgfz0gNWgEPWBbCXFIiPrq96E8FTjPNV9J1Bc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/hashicorp/vault/option.go b/contrib/hashicorp/vault/option.go index fc23f3a464..3d25e7867b 100644 --- a/contrib/hashicorp/vault/option.go +++ b/contrib/hashicorp/vault/option.go @@ -8,9 +8,7 @@ package vault import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) type config struct { @@ -21,22 +19,26 @@ type config struct { const defaultServiceName = "vault" -// Option can be passed to NewHTTPClient and WrapHTTPClient to configure the integration. -type Option func(*config) +// Option describes options for the Vault integration. +type Option interface { + apply(*config) +} -func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.VaultOutbound) +// OptionFn represents options applicable to [NewHTTPClient] and [WrapHTTPClient]. +type OptionFn func(*config) - if internal.BoolEnv("DD_TRACE_VAULT_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} + +func defaults(cfg *config) { + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(true) } // WithAnalytics enables or disables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { if on { return WithAnalyticsRate(1.0) } @@ -44,14 +46,14 @@ func WithAnalytics(on bool) Option { } // WithAnalyticsRate sets the sampling rate for Trace Analytics events correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(c *config) { c.analyticsRate = rate } } -// WithServiceName sets the given service name for the http.Client. -func WithServiceName(name string) Option { +// WithService sets the given service name for the [*http.Client]. +func WithService(name string) OptionFn { return func(c *config) { c.serviceName = name } diff --git a/contrib/hashicorp/vault/orchestrion.yml b/contrib/hashicorp/vault/orchestrion.yml new file mode 100644 index 0000000000..cd739258d7 --- /dev/null +++ b/contrib/hashicorp/vault/orchestrion.yml @@ -0,0 +1,34 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 + description: Official package for interacting with a Vault server. + +aspects: + - id: Config + join-point: + struct-literal: + type: github.com/hashicorp/vault/api.Config + advice: + - wrap-expression: + imports: + vaulttrace: github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 + template: |- + {{- .AST.Type -}}{ + {{- $hasField := false -}} + {{ range .AST.Elts }} + {{- if eq .Key.Name "HttpClient" }} + {{- $hasField = true -}} + HttpClient: vaulttrace.WrapHTTPClient({{ .Value }}), + {{- else -}} + {{ . }}, + {{ end -}} + {{ end }} + {{- if not $hasField -}} + HttpClient: vaulttrace.NewHTTPClient(), + {{- end }} + } diff --git a/contrib/hashicorp/vault/vault.go b/contrib/hashicorp/vault/vault.go index 280525d453..b8c0c0fe37 100644 --- a/contrib/hashicorp/vault/vault.go +++ b/contrib/hashicorp/vault/vault.go @@ -3,16 +3,17 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package vault contains functions to construct or augment an http.Client that -// will integrate with the github.com/hashicorp/vault/api and collect traces to +// Package vault contains functions to construct or augment an [*http.Client] that +// will integrate with the [github.com/hashicorp/vault/api] and collect traces to // send to Datadog. // -// The easiest way to use this package is to create an http.Client with -// NewHTTPClient, and put it in the Vault API config that is passed to the +// The easiest way to use this package is to create an [*http.Client] with +// [NewHTTPClient], and put it in the Vault [api.Config] that is passed to +// [api.NewClient]. // -// If you are already using your own http.Client with the Vault API, you can -// use the WrapHTTPClient function to wrap the client with the tracer code. -// Your http.Client will continue to work as before, but will also capture +// If you are already using your own [*http.Client] with the Vault API, you can +// use the [WrapHTTPClient] function to wrap the client with the tracer code. +// Your [*http.Client] will continue to work as before, but will also capture // traces. package vault @@ -21,25 +22,23 @@ import ( "net" "net/http" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/hashicorp/vault/api" "github.com/hashicorp/vault/sdk/helper/consts" ) -const componentName = "hashicorp/vault" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/hashicorp/vault/api") + instr = instrumentation.Load(instrumentation.PackageHashicorpVaultAPI) } -// NewHTTPClient returns an http.Client for use in the Vault API config -// Client. A set of options can be passed in for further configuration. +// NewHTTPClient returns an [*http.Client] for use in the Vault API config +// [*api.Client]. A set of options can be passed in for further configuration. func NewHTTPClient(opts ...Option) *http.Client { dc := api.DefaultConfig() c := dc.HttpClient @@ -47,7 +46,7 @@ func NewHTTPClient(opts ...Option) *http.Client { return c } -// WrapHTTPClient takes an existing http.Client and wraps the underlying +// WrapHTTPClient takes an existing [*http.Client] and wraps the underlying // transport with tracing. func WrapHTTPClient(c *http.Client, opts ...Option) *http.Client { if c.Transport == nil { @@ -56,14 +55,14 @@ func WrapHTTPClient(c *http.Client, opts ...Option) *http.Client { var conf config defaults(&conf) for _, o := range opts { - o(&conf) + o.apply(&conf) } c.Transport = httptrace.WrapRoundTripper(c.Transport, - httptrace.RTWithAnalyticsRate(conf.analyticsRate), - httptrace.RTWithSpanNamer(func(_ *http.Request) string { + httptrace.WithAnalyticsRate(conf.analyticsRate), + httptrace.WithSpanNamer(func(_ *http.Request) string { return conf.spanName }), - httptrace.WithBefore(func(r *http.Request, s ddtrace.Span) { + httptrace.WithBefore(func(r *http.Request, s *tracer.Span) { s.SetTag(ext.ServiceName, conf.serviceName) s.SetTag(ext.HTTPURL, r.URL.Path) s.SetTag(ext.HTTPMethod, r.Method) @@ -79,7 +78,7 @@ func WrapHTTPClient(c *http.Client, opts ...Option) *http.Client { s.SetTag("vault.namespace", ns) } }), - httptrace.WithAfter(func(res *http.Response, s ddtrace.Span) { + httptrace.WithAfter(func(res *http.Response, s *tracer.Span) { if res == nil { // An error occurred during the request. return diff --git a/contrib/hashicorp/vault/vault_test.go b/contrib/hashicorp/vault/vault_test.go index 4cf3ee4e5b..c88f0fb636 100644 --- a/contrib/hashicorp/vault/vault_test.go +++ b/contrib/hashicorp/vault/vault_test.go @@ -15,13 +15,12 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/hashicorp/vault/api" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) const secretMountPath = "/ns1/ns2/secret" @@ -136,15 +135,17 @@ func testMountReadWrite(c *api.Client, t *testing.T) { // Mount operation assert.Equal("vault", span.Tag(ext.ServiceName)) + assert.Equal("http.request", span.OperationName()) assert.Equal("/v1/sys/mounts/ns1/ns2/secret", span.Tag(ext.HTTPURL)) assert.Equal(http.MethodPost, span.Tag(ext.HTTPMethod)) assert.Equal(http.MethodPost+" /v1/sys/mounts/ns1/ns2/secret", span.Tag(ext.ResourceName)) assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) - assert.Equal(200, span.Tag(ext.HTTPCode)) - assert.Nil(span.Tag(ext.Error)) + assert.Equal(float64(200), span.Tag(ext.HTTPCode)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag("vault.namespace")) assert.Equal("hashicorp/vault", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpVaultAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(hostname, span.Tag(ext.NetworkDestinationName)) }) @@ -165,15 +166,17 @@ func testMountReadWrite(c *api.Client, t *testing.T) { span := spans[1] assert.Equal("vault", span.Tag(ext.ServiceName)) + assert.Equal("http.request", span.OperationName()) assert.Equal(fullPath, span.Tag(ext.HTTPURL)) assert.Equal(http.MethodPut, span.Tag(ext.HTTPMethod)) assert.Equal(http.MethodPut+" "+fullPath, span.Tag(ext.ResourceName)) assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) - assert.Equal(200, span.Tag(ext.HTTPCode)) - assert.Nil(span.Tag(ext.Error)) + assert.Equal(float64(200), span.Tag(ext.HTTPCode)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag("vault.namespace")) assert.Equal("hashicorp/vault", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpVaultAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(hostname, span.Tag(ext.NetworkDestinationName)) }) @@ -201,15 +204,17 @@ func testMountReadWrite(c *api.Client, t *testing.T) { assert.Equal(secret.Data["Key1"], data["Key1"]) assert.Equal(secret.Data["Key2"], data["Key2"]) assert.Equal("vault", span.Tag(ext.ServiceName)) + assert.Equal("http.request", span.OperationName()) assert.Equal(fullPath, span.Tag(ext.HTTPURL)) assert.Equal(http.MethodGet, span.Tag(ext.HTTPMethod)) assert.Equal(http.MethodGet+" "+fullPath, span.Tag(ext.ResourceName)) assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) - assert.Equal(200, span.Tag(ext.HTTPCode)) - assert.Nil(span.Tag(ext.Error)) + assert.Equal(float64(200), span.Tag(ext.HTTPCode)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag("vault.namespace")) assert.Equal("hashicorp/vault", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpVaultAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(hostname, span.Tag(ext.NetworkDestinationName)) }) @@ -246,15 +251,17 @@ func TestReadError(t *testing.T) { // Read key error assert.Equal("vault", span.Tag(ext.ServiceName)) + assert.Equal("http.request", span.OperationName()) assert.Equal(fullPath, span.Tag(ext.HTTPURL)) assert.Equal(http.MethodGet, span.Tag(ext.HTTPMethod)) assert.Equal(http.MethodGet+" "+fullPath, span.Tag(ext.ResourceName)) assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) - assert.Equal(404, span.Tag(ext.HTTPCode)) - assert.Equal(true, span.Tag(ext.Error)) + assert.Equal(float64(404), span.Tag(ext.HTTPCode)) + assert.Equal("404: Not Found", span.Tag(ext.ErrorMsg)) assert.NotNil(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag("vault.namespace")) assert.Equal("hashicorp/vault", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpVaultAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(hostname, span.Tag(ext.NetworkDestinationName)) } @@ -295,15 +302,18 @@ func TestNamespace(t *testing.T) { span := spans[0] assert.Equal("vault", span.Tag(ext.ServiceName)) + assert.Equal("http.request", span.OperationName()) + assert.Equal("http.request", span.OperationName()) assert.Equal(fullPath, span.Tag(ext.HTTPURL)) assert.Equal(http.MethodPut, span.Tag(ext.HTTPMethod)) assert.Equal(http.MethodPut+" "+fullPath, span.Tag(ext.ResourceName)) assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) - assert.Equal(200, span.Tag(ext.HTTPCode)) - assert.Nil(span.Tag(ext.Error)) + assert.Equal(float64(200), span.Tag(ext.HTTPCode)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag(ext.ErrorMsg)) assert.Equal(namespace, span.Tag("vault.namespace")) assert.Equal("hashicorp/vault", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpVaultAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(hostname, span.Tag(ext.NetworkDestinationName)) }) @@ -329,15 +339,17 @@ func TestNamespace(t *testing.T) { span := spans[1] assert.Equal("vault", span.Tag(ext.ServiceName)) + assert.Equal("http.request", span.OperationName()) assert.Equal(fullPath, span.Tag(ext.HTTPURL)) assert.Equal(http.MethodGet, span.Tag(ext.HTTPMethod)) assert.Equal(http.MethodGet+" "+fullPath, span.Tag(ext.ResourceName)) assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) - assert.Equal(200, span.Tag(ext.HTTPCode)) - assert.Nil(span.Tag(ext.Error)) + assert.Equal(float64(200), span.Tag(ext.HTTPCode)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Nil(span.Tag(ext.ErrorMsg)) assert.Equal(namespace, span.Tag("vault.namespace")) assert.Equal("hashicorp/vault", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageHashicorpVaultAPI), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal(hostname, span.Tag(ext.NetworkDestinationName)) }) @@ -349,54 +361,54 @@ func TestOption(t *testing.T) { for ttName, tt := range map[string]struct { opts []Option - test func(assert *assert.Assertions, span mocktracer.Span) + test func(assert *assert.Assertions, span *mocktracer.Span) }{ "DefaultOptions": { opts: []Option{}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal(defaultServiceName, span.Tag(ext.ServiceName)) assert.Nil(span.Tag(ext.EventSampleRate)) }, }, "CustomServiceName": { - opts: []Option{WithServiceName("someServiceName")}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + opts: []Option{WithService("someServiceName")}, + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal("someServiceName", span.Tag(ext.ServiceName)) }, }, "WithAnalyticsTrue": { opts: []Option{WithAnalytics(true)}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal(1.0, span.Tag(ext.EventSampleRate)) }, }, "WithAnalyticsFalse": { opts: []Option{WithAnalytics(false)}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Nil(span.Tag(ext.EventSampleRate)) }, }, "WithAnalyticsLastOptionWins": { opts: []Option{WithAnalyticsRate(0.7), WithAnalytics(true)}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal(1.0, span.Tag(ext.EventSampleRate)) }, }, "WithAnalyticsRateMax": { opts: []Option{WithAnalyticsRate(1.0)}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal(1.0, span.Tag(ext.EventSampleRate)) }, }, "WithAnalyticsRateMin": { opts: []Option{WithAnalyticsRate(0.0)}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal(0.0, span.Tag(ext.EventSampleRate)) }, }, "WithAnalyticsRateLastOptionWins": { opts: []Option{WithAnalytics(true), WithAnalyticsRate(0.7)}, - test: func(assert *assert.Assertions, span mocktracer.Span) { + test: func(assert *assert.Assertions, span *mocktracer.Span) { assert.Equal(0.7, span.Tag(ext.EventSampleRate)) }, }, @@ -430,50 +442,3 @@ func TestOption(t *testing.T) { }) } } - -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - - mt := mocktracer.Start() - defer mt.Stop() - - ts, cleanup := setupServer(t) - defer cleanup() - - client, err := api.NewClient(&api.Config{ - HttpClient: NewHTTPClient(opts...), - Address: ts.URL, - }) - require.NoError(t, err) - if err != nil { - t.Fatal(err) - } - defer mountKV(client, t)() - - // Write key with namespace first - data := map[string]interface{}{"Key1": "Val1", "Key2": "Val2"} - _, err = client.Logical().Write("/some/path", data) - require.NoError(t, err) - - return mt.FinishedSpans() - } - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "http.request", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "vault.query", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"vault", "vault"}, - WithDDService: []string{"vault", "vault"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride, namingschematest.TestServiceOverride}, - } - t.Run("service name", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("operation name", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} diff --git a/contrib/internal/httptrace/before_handle.go b/contrib/internal/httptrace/before_handle.go deleted file mode 100644 index afd40726ed..0000000000 --- a/contrib/internal/httptrace/before_handle.go +++ /dev/null @@ -1,78 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2024 Datadog, Inc. - -package httptrace - -import ( - "net/http" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" -) - -// ServeConfig specifies the tracing configuration when using TraceAndServe. -type ServeConfig struct { - // Service specifies the service name to use. If left blank, the global service name - // will be inherited. - Service string - // Resource optionally specifies the resource name for this request. - Resource string - // QueryParams should be true in order to append the URL query values to the "http.url" tag. - QueryParams bool - // Route is the request matched route if any, or is empty otherwise - Route string - // RouteParams specifies framework-specific route parameters (e.g. for route /user/:id coming - // in as /user/123 we'll have {"id": "123"}). This field is optional and is used for monitoring - // by AppSec. It is only taken into account when AppSec is enabled. - RouteParams map[string]string - // FinishOpts specifies any options to be used when finishing the request span. - FinishOpts []ddtrace.FinishOption - // SpanOpts specifies any options to be applied to the request starting span. - SpanOpts []ddtrace.StartSpanOption -} - -// BeforeHandle contains functionality that should be executed before a http.Handler runs. -// It returns the "traced" http.ResponseWriter and http.Request, an additional afterHandle function -// that should be executed after the Handler runs, and a handled bool that instructs if the request has been handled -// or not - in case it was handled, the original handler should not run. -func BeforeHandle(cfg *ServeConfig, w http.ResponseWriter, r *http.Request) (http.ResponseWriter, *http.Request, func(), bool) { - if cfg == nil { - cfg = new(ServeConfig) - } - opts := options.Copy(cfg.SpanOpts...) // make a copy of cfg.SpanOpts to avoid races - if cfg.Service != "" { - opts = append(opts, tracer.ServiceName(cfg.Service)) - } - if cfg.Resource != "" { - opts = append(opts, tracer.ResourceName(cfg.Resource)) - } - if cfg.Route != "" { - opts = append(opts, tracer.Tag(ext.HTTPRoute, cfg.Route)) - } - span, ctx := StartRequestSpan(r, opts...) - rw, ddrw := wrapResponseWriter(w) - rt := r.WithContext(ctx) - - closeSpan := func() { - FinishRequestSpan(span, ddrw.status, cfg.FinishOpts...) - } - afterHandle := closeSpan - handled := false - if appsec.Enabled() { - secW, secReq, secAfterHandle, secHandled := httpsec.BeforeHandle(rw, rt, span, cfg.RouteParams, nil) - afterHandle = func() { - secAfterHandle() - closeSpan() - } - rw = secW - rt = secReq - handled = secHandled - } - return rw, rt, afterHandle, handled -} diff --git a/contrib/internal/httptrace/config.go b/contrib/internal/httptrace/config.go deleted file mode 100644 index 23ee0113d5..0000000000 --- a/contrib/internal/httptrace/config.go +++ /dev/null @@ -1,122 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. - -package httptrace - -import ( - "os" - "regexp" - "strconv" - "strings" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" -) - -// The env vars described below are used to configure the http security tags collection. -// See https://docs.datadoghq.com/tracing/setup_overview/configure_data_security to learn how to use those properly. -const ( - // envQueryStringDisabled is the name of the env var used to disabled query string collection. - envQueryStringDisabled = "DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED" - // envQueryStringRegexp is the name of the env var used to specify the regexp to use for query string obfuscation. - envQueryStringRegexp = "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP" - // envTraceClientIPEnabled is the name of the env var used to specify whether or not to collect client ip in span tags - envTraceClientIPEnabled = "DD_TRACE_CLIENT_IP_ENABLED" - // envServerErrorStatuses is the name of the env var used to specify error status codes on http server spans - envServerErrorStatuses = "DD_TRACE_HTTP_SERVER_ERROR_STATUSES" -) - -// defaultQueryStringRegexp is the regexp used for query string obfuscation if `envQueryStringRegexp` is empty. -var defaultQueryStringRegexp = regexp.MustCompile("(?i)(?:p(?:ass)?w(?:or)?d|pass(?:_?phrase)?|secret|(?:api_?|private_?|public_?|access_?|secret_?)key(?:_?id)?|token|consumer_?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\\s|%20)*(?:=|%3D)[^&]+|(?:\"|%22)(?:\\s|%20)*(?::|%3A)(?:\\s|%20)*(?:\"|%22)(?:%2[^2]|%[^2]|[^\"%])+(?:\"|%22))|bearer(?:\\s|%20)+[a-z0-9\\._\\-]|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\\w=-]|%3D)+\\.ey[I-L](?:[\\w=-]|%3D)+(?:\\.(?:[\\w.+\\/=-]|%3D|%2F|%2B)+)?|[\\-]{5}BEGIN(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY[\\-]{5}[^\\-]+[\\-]{5}END(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY|ssh-rsa(?:\\s|%20)*(?:[a-z0-9\\/\\.+]|%2F|%5C|%2B){100,}") - -type config struct { - queryStringRegexp *regexp.Regexp // specifies the regexp to use for query string obfuscation. - queryString bool // reports whether the query string should be included in the URL span tag. - traceClientIP bool - isStatusError func(statusCode int) bool -} - -func newConfig() config { - c := config{ - queryString: !internal.BoolEnv(envQueryStringDisabled, false), - queryStringRegexp: defaultQueryStringRegexp, - traceClientIP: internal.BoolEnv(envTraceClientIPEnabled, false), - isStatusError: isServerError, - } - v := os.Getenv(envServerErrorStatuses) - if fn := GetErrorCodesFromInput(v); fn != nil { - c.isStatusError = fn - } - if s, ok := os.LookupEnv(envQueryStringRegexp); !ok { - return c - } else if s == "" { - c.queryStringRegexp = nil - log.Debug("%s is set but empty. Query string obfuscation will be disabled.", envQueryStringRegexp) - } else if r, err := regexp.Compile(s); err == nil { - c.queryStringRegexp = r - } else { - log.Error("Could not compile regexp from %s. Using default regexp instead.", envQueryStringRegexp) - } - return c -} - -func isServerError(statusCode int) bool { - return statusCode >= 500 && statusCode < 600 -} - -// GetErrorCodesFromInput parses a comma-separated string s to determine which codes are to be considered errors -// Its purpose is to support the DD_TRACE_HTTP_SERVER_ERROR_STATUSES env var -// If error condition cannot be determined from s, `nil` is returned -// e.g, input of "100,200,300-400" returns a function that returns true on 100, 200, and all values between 300-400, inclusive -// any input that cannot be translated to integer values returns nil -func GetErrorCodesFromInput(s string) func(statusCode int) bool { - if s == "" { - return nil - } - var codes []int - var ranges [][]int - vals := strings.Split(s, ",") - for _, val := range vals { - // "-" indicates a range of values - if strings.Contains(val, "-") { - bounds := strings.Split(val, "-") - if len(bounds) != 2 { - log.Debug("Trouble parsing %v due to entry %v, using default error status determination logic", s, val) - return nil - } - before, err := strconv.Atoi(bounds[0]) - if err != nil { - log.Debug("Trouble parsing %v due to entry %v, using default error status determination logic", s, val) - return nil - } - after, err := strconv.Atoi(bounds[1]) - if err != nil { - log.Debug("Trouble parsing %v due to entry %v, using default error status determination logic", s, val) - return nil - } - ranges = append(ranges, []int{before, after}) - } else { - intVal, err := strconv.Atoi(val) - if err != nil { - log.Debug("Trouble parsing %v due to entry %v, using default error status determination logic", s, val) - return nil - } - codes = append(codes, intVal) - } - } - return func(statusCode int) bool { - for _, c := range codes { - if c == statusCode { - return true - } - } - for _, bounds := range ranges { - if statusCode >= bounds[0] && statusCode <= bounds[1] { - return true - } - } - return false - } -} diff --git a/contrib/internal/httptrace/httptrace.go b/contrib/internal/httptrace/httptrace.go deleted file mode 100644 index 6fa5a43242..0000000000 --- a/contrib/internal/httptrace/httptrace.go +++ /dev/null @@ -1,141 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package httptrace provides functionalities to trace HTTP requests that are commonly required and used across -// contrib/** integrations. -package httptrace - -import ( - "context" - "fmt" - "net/http" - "strconv" - "strings" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -var ( - cfg = newConfig() -) - -// StartRequestSpan starts an HTTP request span with the standard list of HTTP request span tags (http.method, http.url, -// http.useragent). Any further span start option can be added with opts. -func StartRequestSpan(r *http.Request, opts ...ddtrace.StartSpanOption) (tracer.Span, context.Context) { - // Append our span options before the given ones so that the caller can "overwrite" them. - // TODO(): rework span start option handling (https://github.com/DataDog/dd-trace-go/issues/1352) - - var ipTags map[string]string - if cfg.traceClientIP { - ipTags, _ = httpsec.ClientIPTags(r.Header, true, r.RemoteAddr) - } - nopts := make([]ddtrace.StartSpanOption, 0, len(opts)+1+len(ipTags)) - nopts = append(nopts, - func(cfg *ddtrace.StartSpanConfig) { - if cfg.Tags == nil { - cfg.Tags = make(map[string]interface{}) - } - cfg.Tags[ext.SpanType] = ext.SpanTypeWeb - cfg.Tags[ext.HTTPMethod] = r.Method - cfg.Tags[ext.HTTPURL] = urlFromRequest(r) - cfg.Tags[ext.HTTPUserAgent] = r.UserAgent() - cfg.Tags["_dd.measured"] = 1 - if r.Host != "" { - cfg.Tags["http.host"] = r.Host - } - if spanctx, err := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)); err == nil { - cfg.Parent = spanctx - } - for k, v := range ipTags { - cfg.Tags[k] = v - } - }) - nopts = append(nopts, opts...) - return tracer.StartSpanFromContext(r.Context(), namingschema.OpName(namingschema.HTTPServer), nopts...) -} - -// FinishRequestSpan finishes the given HTTP request span and sets the expected response-related tags such as the status -// code. Any further span finish option can be added with opts. -func FinishRequestSpan(s tracer.Span, status int, opts ...tracer.FinishOption) { - var statusStr string - // if status is 0, treat it like 200 unless 0 was called out in DD_TRACE_HTTP_SERVER_ERROR_STATUSES - if status == 0 { - if cfg.isStatusError(status) { - statusStr = "0" - s.SetTag(ext.Error, fmt.Errorf("%s: %s", statusStr, http.StatusText(status))) - } else { - statusStr = "200" - } - } else { - statusStr = strconv.Itoa(status) - if cfg.isStatusError(status) { - s.SetTag(ext.Error, fmt.Errorf("%s: %s", statusStr, http.StatusText(status))) - } - } - s.SetTag(ext.HTTPCode, statusStr) - s.Finish(opts...) -} - -// urlFromRequest returns the full URL from the HTTP request. If query params are collected, they are obfuscated granted -// obfuscation is not disabled by the user (through DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP) -// See https://docs.datadoghq.com/tracing/configure_data_security#redacting-the-query-in-the-url for more information. -func urlFromRequest(r *http.Request) string { - // Quoting net/http comments about net.Request.URL on server requests: - // "For most requests, fields other than Path and RawQuery will be - // empty. (See RFC 7230, Section 5.3)" - // This is why we don't rely on url.URL.String(), url.URL.Host, url.URL.Scheme, etc... - var url string - path := r.URL.EscapedPath() - scheme := "http" - if r.TLS != nil { - scheme = "https" - } - if r.Host != "" { - url = strings.Join([]string{scheme, "://", r.Host, path}, "") - } else { - url = path - } - // Collect the query string if we are allowed to report it and obfuscate it if possible/allowed - if cfg.queryString && r.URL.RawQuery != "" { - query := r.URL.RawQuery - if cfg.queryStringRegexp != nil { - query = cfg.queryStringRegexp.ReplaceAllLiteralString(query, "") - } - url = strings.Join([]string{url, query}, "?") - } - if frag := r.URL.EscapedFragment(); frag != "" { - url = strings.Join([]string{url, frag}, "#") - } - return url -} - -// HeaderTagsFromRequest matches req headers to user-defined list of header tags -// and creates span tags based on the header tag target and the req header value -func HeaderTagsFromRequest(req *http.Request, headerCfg *internal.LockMap) ddtrace.StartSpanOption { - var tags []struct { - key string - val string - } - - headerCfg.Iter(func(header, tag string) { - if vs, ok := req.Header[header]; ok { - tags = append(tags, struct { - key string - val string - }{tag, strings.TrimSpace(strings.Join(vs, ","))}) - } - }) - - return func(cfg *ddtrace.StartSpanConfig) { - for _, t := range tags { - cfg.Tags[t.key] = t.val - } - } -} diff --git a/contrib/internal/httptrace/httptrace_test.go b/contrib/internal/httptrace/httptrace_test.go deleted file mode 100644 index 8733a0a343..0000000000 --- a/contrib/internal/httptrace/httptrace_test.go +++ /dev/null @@ -1,374 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package httptrace - -import ( - "fmt" - "net/http" - "net/http/httptest" - "net/url" - "os" - "strconv" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - - "github.com/DataDog/appsec-internal-go/netip" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestGetErrorCodesFromInput(t *testing.T) { - codesOnly := "400,401,402" - rangesOnly := "400-405,408-410" - mixed := "400,403-405,407-410,412" - invalid1 := "1,100-200-300-" - invalid2 := "abc:@3$5^," - empty := "" - t.Run("codesOnly", func(t *testing.T) { - fn := GetErrorCodesFromInput(codesOnly) - for i := 400; i <= 402; i++ { - assert.True(t, fn(i)) - } - assert.False(t, fn(500)) - assert.False(t, fn(0)) - }) - t.Run("rangesOnly", func(t *testing.T) { - fn := GetErrorCodesFromInput(rangesOnly) - for i := 400; i <= 405; i++ { - assert.True(t, fn(i)) - } - for i := 408; i <= 410; i++ { - assert.True(t, fn(i)) - } - assert.False(t, fn(406)) - assert.False(t, fn(411)) - assert.False(t, fn(500)) - }) - t.Run("mixed", func(t *testing.T) { - fn := GetErrorCodesFromInput(mixed) - assert.True(t, fn(400)) - assert.False(t, fn(401)) - for i := 403; i <= 405; i++ { - assert.True(t, fn(i)) - } - assert.False(t, fn(406)) - for i := 407; i <= 410; i++ { - assert.True(t, fn(i)) - } - assert.False(t, fn(411)) - assert.False(t, fn(500)) - }) - // invalid entries below should result in nils - t.Run("invalid1", func(t *testing.T) { - fn := GetErrorCodesFromInput(invalid1) - assert.Nil(t, fn) - }) - t.Run("invalid2", func(t *testing.T) { - fn := GetErrorCodesFromInput(invalid2) - assert.Nil(t, fn) - }) - t.Run("empty", func(t *testing.T) { - fn := GetErrorCodesFromInput(empty) - assert.Nil(t, fn) - }) -} - -func TestConfiguredErrorStatuses(t *testing.T) { - defer os.Unsetenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES") - t.Run("configured", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - os.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "199-399,400,501") - - // reset config based on new DD_TRACE_HTTP_SERVER_ERROR_STATUSES value - oldConfig := cfg - defer func() { cfg = oldConfig }() - cfg = newConfig() - - statuses := []int{0, 200, 400, 500} - r := httptest.NewRequest(http.MethodGet, "/test", nil) - for i, status := range statuses { - sp, _ := StartRequestSpan(r) - FinishRequestSpan(sp, status) - spans := mt.FinishedSpans() - require.Len(t, spans, i+1) - - switch status { - case 0: - assert.Equal(t, "200", spans[i].Tag(ext.HTTPCode)) - assert.Nil(t, spans[i].Tag(ext.Error)) - case 200, 400: - assert.Equal(t, strconv.Itoa(status), spans[i].Tag(ext.HTTPCode)) - assert.Equal(t, fmt.Errorf("%s: %s", strconv.Itoa(status), http.StatusText(status)), spans[i].Tag(ext.Error).(error)) - case 500: - assert.Equal(t, strconv.Itoa(status), spans[i].Tag(ext.HTTPCode)) - assert.Nil(t, spans[i].Tag(ext.Error)) - } - } - }) - t.Run("zero", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - os.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "0") - - // reset config based on new DD_TRACE_HTTP_SERVER_ERROR_STATUSES value - oldConfig := cfg - defer func() { cfg = oldConfig }() - cfg = newConfig() - - r := httptest.NewRequest(http.MethodGet, "/test", nil) - sp, _ := StartRequestSpan(r) - FinishRequestSpan(sp, 0) - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - assert.Equal(t, "0", spans[0].Tag(ext.HTTPCode)) - assert.Equal(t, fmt.Errorf("0: %s", http.StatusText(0)), spans[0].Tag(ext.Error).(error)) - }) -} - -func TestHeaderTagsFromRequest(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - r := httptest.NewRequest(http.MethodGet, "/test", nil) - r.Header.Set("header1", "val1") - r.Header.Set("header2", " val2 ") - r.Header.Set("header3", "v a l 3") - r.Header.Set("x-datadog-header", "val4") - - expectedHeaderTags := map[string]string{ - "tag1": "val1", - "tag2": "val2", - "tag3": "v a l 3", - "tag4": "val4", - } - - hs := []string{"header1:tag1", "header2:tag2", "header3:tag3", "x-datadog-header:tag4"} - ht := internal.NewLockMap(normalizer.HeaderTagSlice(hs)) - s, _ := StartRequestSpan(r, HeaderTagsFromRequest(r, ht)) - s.Finish() - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - - for expectedTag, expectedTagVal := range expectedHeaderTags { - assert.Equal(t, expectedTagVal, spans[0].Tags()[expectedTag]) - } -} - -func TestStartRequestSpan(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - r := httptest.NewRequest(http.MethodGet, "/somePath", nil) - s, _ := StartRequestSpan(r) - s.Finish() - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - assert.Equal(t, "example.com", spans[0].Tag("http.host")) -} - -// TestClientIP tests behavior of StartRequestSpan based on -// the DD_TRACE_CLIENT_IP_ENABLED environment variable -func TestTraceClientIPFlag(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - tp := new(log.RecordLogger) - defer log.UseLogger(tp)() - - // use 0.0.0.0 as ip address of all test cases - // more comprehensive ip address testing is done in testing - // of ClientIPTags in appsec/dyngo/instrumentation/httpsec - validIPAddr := "0.0.0.0" - - type ipTestCase struct { - name string - remoteAddr string - traceClientIPEnvVal string - expectTrace bool - expectedIP netip.Addr - } - - oldConfig := cfg - defer func() { cfg = oldConfig }() - - for _, tc := range []ipTestCase{ - { - name: "Trace client IP set to true", - remoteAddr: validIPAddr, - expectedIP: netip.MustParseAddr(validIPAddr), - traceClientIPEnvVal: "true", - expectTrace: true, - }, - { - name: "Trace client IP set to false", - remoteAddr: validIPAddr, - expectedIP: netip.MustParseAddr(validIPAddr), - traceClientIPEnvVal: "false", - expectTrace: false, - }, - { - name: "Trace client IP unset", - remoteAddr: validIPAddr, - expectedIP: netip.MustParseAddr(validIPAddr), - traceClientIPEnvVal: "", - expectTrace: false, - }, - { - name: "Trace client IP set to non-boolean value", - remoteAddr: validIPAddr, - expectedIP: netip.MustParseAddr(validIPAddr), - traceClientIPEnvVal: "asdadsasd", - expectTrace: false, - }, - } { - t.Run(tc.name, func(t *testing.T) { - t.Setenv(envTraceClientIPEnabled, tc.traceClientIPEnvVal) - - // reset config based on new DD_TRACE_CLIENT_IP_ENABLED value - cfg = newConfig() - - r := httptest.NewRequest(http.MethodGet, "/somePath", nil) - r.RemoteAddr = tc.remoteAddr - s, _ := StartRequestSpan(r) - s.Finish() - spans := mt.FinishedSpans() - targetSpan := spans[0] - - if tc.expectTrace { - assert.Equal(t, tc.expectedIP.String(), targetSpan.Tag(ext.HTTPClientIP)) - } else { - assert.NotContains(t, targetSpan.Tags(), ext.HTTPClientIP) - if _, err := strconv.ParseBool(tc.traceClientIPEnvVal); err != nil && tc.traceClientIPEnvVal != "" { - logs := tp.Logs() - assert.Contains(t, logs[len(logs)-1], "Non-boolean value for env var DD_TRACE_CLIENT_IP_ENABLED") - tp.Reset() - } - } - mt.Reset() - }) - } -} - -func TestURLTag(t *testing.T) { - type URLTestCase struct { - name, expectedURL, host, port, path, query, fragment string - } - for _, tc := range []URLTestCase{ - { - name: "no-host", - expectedURL: "/test", - path: "/test", - }, - { - name: "basic", - expectedURL: "http://example.com/", - host: "example.com", - }, - { - name: "basic-path", - expectedURL: "http://example.com/test", - host: "example.com", - path: "/test", - }, - { - name: "basic-port", - expectedURL: "http://example.com:8080/", - host: "example.com", - port: "8080", - }, - { - name: "basic-fragment", - expectedURL: "http://example.com/#test", - host: "example.com", - fragment: "test", - }, - { - name: "query1", - expectedURL: "http://example.com/?test1=test2", - host: "example.com", - query: "test1=test2", - }, - { - name: "query2", - expectedURL: "http://example.com/?test1=test2&test3=test4", - host: "example.com", - query: "test1=test2&test3=test4", - }, - { - name: "combined", - expectedURL: "http://example.com:7777/test?test1=test2&test3=test4#test", - host: "example.com", - path: "/test", - query: "test1=test2&test3=test4", - port: "7777", - fragment: "test", - }, - { - name: "basic-obfuscation1", - expectedURL: "http://example.com/?%3Credacted%3E", - host: "example.com", - query: "token=value", - }, - { - name: "basic-obfuscation2", - expectedURL: "http://example.com/?test0=test1&%3Credacted%3E&test1=test2", - host: "example.com", - query: "test0=test1&token=value&test1=test2", - }, - { - name: "combined-obfuscation", - expectedURL: "http://example.com:7777/test?test1=test2&%3Credacted%3E&test3=test4#test", - host: "example.com", - path: "/test", - query: "test1=test2&token=value&test3=test4", - port: "7777", - fragment: "test", - }, - } { - t.Run(tc.name, func(t *testing.T) { - r := http.Request{ - URL: &url.URL{ - Path: tc.path, - RawQuery: tc.query, - Fragment: tc.fragment, - }, - Host: tc.host, - } - if tc.port != "" { - r.Host += ":" + tc.port - } - url := urlFromRequest(&r) - require.Equal(t, tc.expectedURL, url) - }) - } -} - -func BenchmarkStartRequestSpan(b *testing.B) { - b.ReportAllocs() - r, err := http.NewRequest("GET", "http://example.com/", nil) - if err != nil { - b.Errorf("Failed to create request: %v", err) - return - } - opts := []ddtrace.StartSpanOption{ - tracer.ServiceName("SomeService"), - tracer.ResourceName("SomeResource"), - tracer.Tag(ext.HTTPRoute, "/some/route/?"), - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - StartRequestSpan(r, opts...) - } -} diff --git a/contrib/internal/lists/lists.go b/contrib/internal/lists/lists.go deleted file mode 100644 index a8a4eaf29f..0000000000 --- a/contrib/internal/lists/lists.go +++ /dev/null @@ -1,52 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package lists - -// Combinations returns all possible unique selections of size `pick` of a list -// of strings for which order does not matter -// -// an example: -// -// Combinations([cat, dog, bird], 2): -// [cat] -> Combinations([dog, bird], 1) -// [cat, dog] -// [cat, bird] -// [dog] -> Combinations([bird], 1) -// [dog, bird] -// [bird] -> Combinations([], 0) -// n/a -func Combinations(list []string, pick int) (all [][]string) { - switch pick { - case 0: - // nothing to do - case 1: - for i := range list { - all = append(all, list[i:i+1]) - } - default: - // we recursively find combinations by taking each item in the list - // and then finding the combinations at (pick-1) for the remaining - // items in the list - // the reason we start at [i+1:], is because the order of the items in - // the list doesn't matter, so this will remove all the duplicates we - // would get otherwise - for i := range list { - for _, next := range Combinations(list[i+1:], pick-1) { - all = append(all, append([]string{list[i]}, next...)) - } - } - } - return all -} - -// RepeatString returns a new slice with the string s repeated n times. -func RepeatString(s string, n int) []string { - r := make([]string, 0, n) - for i := 0; i < n; i++ { - r = append(r, s) - } - return r -} diff --git a/contrib/internal/lists/lists_test.go b/contrib/internal/lists/lists_test.go deleted file mode 100644 index 27352cc5bc..0000000000 --- a/contrib/internal/lists/lists_test.go +++ /dev/null @@ -1,49 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package lists - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestCombinations(t *testing.T) { - { - combos := Combinations([]string{"cat", "dog", "bird", "mouse"}, 3) - assert.Equal(t, [][]string{ - {"cat", "dog", "bird"}, - {"cat", "dog", "mouse"}, - {"cat", "bird", "mouse"}, - {"dog", "bird", "mouse"}, - }, combos) - } - { - combos := Combinations([]string{"cat", "dog", "bird", "mouse"}, 2) - assert.Equal(t, [][]string{ - {"cat", "dog"}, - {"cat", "bird"}, - {"cat", "mouse"}, - {"dog", "bird"}, - {"dog", "mouse"}, - {"bird", "mouse"}, - }, combos) - } - { - combos := Combinations([]string{"cat", "dog", "bird", "mouse"}, 1) - assert.Equal(t, [][]string{ - {"cat"}, - {"dog"}, - {"bird"}, - {"mouse"}, - }, combos) - } -} - -func TestRepeatString(t *testing.T) { - sl := RepeatString("abc", 3) - assert.Equal(t, []string{"abc", "abc", "abc"}, sl) -} diff --git a/contrib/internal/namingschematest/cache.go b/contrib/internal/namingschematest/cache.go deleted file mode 100644 index b9c8efbd57..0000000000 --- a/contrib/internal/namingschematest/cache.go +++ /dev/null @@ -1,36 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschematest - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// NewRedisTest creates a new test for Redis naming schema. -func NewRedisTest(genSpans GenSpansFn, defaultServiceName string) func(t *testing.T) { - return func(t *testing.T) { - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "redis.command", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "redis.command", spans[0].OperationName()) - } - wantServiceNameV0 := ServiceNameAssertions{ - WithDefaults: []string{defaultServiceName}, - WithDDService: []string{defaultServiceName}, - WithDDServiceAndOverride: []string{TestServiceOverride}, - } - t.Run("ServiceName", NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - } -} diff --git a/contrib/internal/namingschematest/client_server.go b/contrib/internal/namingschematest/client_server.go deleted file mode 100644 index ece5e03fba..0000000000 --- a/contrib/internal/namingschematest/client_server.go +++ /dev/null @@ -1,41 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschematest - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// NewHTTPServerTest creates a new test for HTTP server naming schema. -func NewHTTPServerTest(genSpans GenSpansFn, defaultName string, opts ...Option) func(t *testing.T) { - cfg := newConfig() - cfg.wantServiceName[namingschema.SchemaV0] = ServiceNameAssertions{ - WithDefaults: []string{defaultName}, - WithDDService: []string{TestDDService}, - WithDDServiceAndOverride: []string{TestServiceOverride}, - } - for _, opt := range opts { - opt(cfg) - } - return func(t *testing.T) { - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "http.request", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "http.server.request", spans[0].OperationName()) - } - t.Run("ServiceName", NewServiceNameTest(genSpans, cfg.wantServiceName[namingschema.SchemaV0])) - t.Run("SpanName", NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - } -} diff --git a/contrib/internal/namingschematest/db.go b/contrib/internal/namingschematest/db.go deleted file mode 100644 index 04d681d7b8..0000000000 --- a/contrib/internal/namingschematest/db.go +++ /dev/null @@ -1,36 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschematest - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// NewMongoDBTest creates a new test for MongoDB naming schema. -func NewMongoDBTest(genSpans GenSpansFn, defaultServiceName string) func(t *testing.T) { - return func(t *testing.T) { - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "mongodb.query", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "mongodb.query", spans[0].OperationName()) - } - wantServiceNameV0 := ServiceNameAssertions{ - WithDefaults: []string{defaultServiceName}, - WithDDService: []string{defaultServiceName}, - WithDDServiceAndOverride: []string{TestServiceOverride}, - } - t.Run("ServiceName", NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - } -} diff --git a/contrib/internal/namingschematest/messaging.go b/contrib/internal/namingschematest/messaging.go deleted file mode 100644 index 81ee60cd15..0000000000 --- a/contrib/internal/namingschematest/messaging.go +++ /dev/null @@ -1,38 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschematest - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// NewKafkaTest creates a new test for Kafka naming schema. -func NewKafkaTest(genSpans GenSpansFn) func(t *testing.T) { - return func(t *testing.T) { - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "kafka.produce", spans[0].OperationName()) - assert.Equal(t, "kafka.consume", spans[1].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 2) - assert.Equal(t, "kafka.send", spans[0].OperationName()) - assert.Equal(t, "kafka.process", spans[1].OperationName()) - } - wantServiceNameV0 := ServiceNameAssertions{ - WithDefaults: []string{"kafka", "kafka"}, - WithDDService: []string{"kafka", TestDDService}, - WithDDServiceAndOverride: []string{TestServiceOverride, TestServiceOverride}, - } - t.Run("ServiceName", NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) - } -} diff --git a/contrib/internal/namingschematest/namingschematest.go b/contrib/internal/namingschematest/namingschematest.go deleted file mode 100644 index 2b25548920..0000000000 --- a/contrib/internal/namingschematest/namingschematest.go +++ /dev/null @@ -1,158 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -// Package namingschematest provides utilities to test naming schemas across different integrations. -package namingschematest - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/lists" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// GenSpansFn is used across different functions from this package to generate spans. It should be implemented in the -// tests that use this package. -// The provided serviceOverride string should be used to set the specific integration's WithServiceName option (if -// available) when initializing and configuring the package. -type GenSpansFn func(t *testing.T, serviceOverride string) []mocktracer.Span - -// ServiceNameAssertions contains assertions for different test cases used inside the generated test -// from NewServiceNameTest. -// []string fields in this struct represent the assertions to be made against the returned []mocktracer.Span from -// GenSpansFn in the same order. -type ServiceNameAssertions struct { - // WithDefaults is used for the test case where defaults are used. - WithDefaults []string - // WithDDService is used when the global DD_SERVICE configuration is enabled (in this case, the test will set the - // value to TestDDService from this package). - WithDDService []string - // WithDDServiceAndOverride is used for the test case where the global DD_SERVICE configuration is enabled and the - // contrib specific `WithServiceName` option is used (in this case, the test will set DD_SERVICE and serviceOverride - // to the TestDDService and TestServiceOverride constants from this package, respectively). - WithDDServiceAndOverride []string -} - -const ( - // TestDDService is a constant used in the test returned by NewServiceNameTest to set the value of DD_SERVICE. - TestDDService = "dd-service" - // TestServiceOverride is a constant used in the test returned by NewServiceNameTest to set the value of - // the integration's WithServiceName option. - TestServiceOverride = "service-override" -) - -// NewServiceNameTest generates a new test for span service names using the naming schema versioning. -func NewServiceNameTest(genSpans GenSpansFn, wantV0 ServiceNameAssertions) func(t *testing.T) { - return func(t *testing.T) { - testCases := []struct { - name string - serviceNameOverride string - ddService string - // the assertions are a slice that should match the number of spans returned by the genSpans function. - wantV0 []string - wantV1 []string - }{ - { - name: "WithDefaults", - serviceNameOverride: "", - ddService: "", - wantV0: wantV0.WithDefaults, - wantV1: wantV0.WithDefaults, // defaults should be the same for v1 - }, - { - name: "WithGlobalDDService", - serviceNameOverride: "", - ddService: TestDDService, - wantV0: wantV0.WithDDService, - wantV1: lists.RepeatString(TestDDService, len(wantV0.WithDDService)), - }, - { - name: "WithGlobalDDServiceAndOverride", - serviceNameOverride: TestServiceOverride, - ddService: TestDDService, - wantV0: wantV0.WithDDServiceAndOverride, - wantV1: lists.RepeatString(TestServiceOverride, len(wantV0.WithDDServiceAndOverride)), - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - if tc.ddService != "" { - reset := withDDService(tc.ddService) - defer reset() - } - t.Run("v0", func(t *testing.T) { - reset := withNamingSchemaVersion(namingschema.SchemaV0) - defer reset() - spans := genSpans(t, tc.serviceNameOverride) - assertServiceNames(t, spans, tc.wantV0) - }) - t.Run("v1", func(t *testing.T) { - reset := withNamingSchemaVersion(namingschema.SchemaV1) - defer reset() - spans := genSpans(t, tc.serviceNameOverride) - assertServiceNames(t, spans, tc.wantV1) - }) - }) - } - } -} - -func assertServiceNames(t *testing.T, spans []mocktracer.Span, wantServiceNames []string) { - t.Helper() - require.Len(t, spans, len(wantServiceNames), "the number of spans and number of assertions should be the same") - for i := 0; i < len(spans); i++ { - want, got, spanName := wantServiceNames[i], spans[i].Tag(ext.ServiceName), spans[i].OperationName() - if want == "" { - assert.Empty(t, got, "expected empty service name tag for span: %s", spanName) - } else { - assert.Equal(t, want, got, "incorrect service name for span: %s", spanName) - } - } -} - -func withNamingSchemaVersion(version namingschema.Version) func() { - prevVersion := namingschema.GetVersion() - reset := func() { namingschema.SetVersion(prevVersion) } - namingschema.SetVersion(version) - return reset -} - -func withDDService(ddService string) func() { - prevName := globalconfig.ServiceName() - reset := func() { globalconfig.SetServiceName(prevName) } - globalconfig.SetServiceName(ddService) - return reset -} - -// AssertSpansFn allows to make assertions on the generated spans. -type AssertSpansFn func(t *testing.T, spans []mocktracer.Span) - -// NewSpanNameTest returns a new test that runs the provided assertion functions for each schema version. -func NewSpanNameTest(genSpans GenSpansFn, assertV0 AssertSpansFn, assertV1 AssertSpansFn) func(t *testing.T) { - return func(t *testing.T) { - t.Run("v0", func(t *testing.T) { - version := namingschema.GetVersion() - defer namingschema.SetVersion(version) - namingschema.SetVersion(namingschema.SchemaV0) - - spans := genSpans(t, "") - assertV0(t, spans) - }) - t.Run("v1", func(t *testing.T) { - version := namingschema.GetVersion() - defer namingschema.SetVersion(version) - namingschema.SetVersion(namingschema.SchemaV1) - - spans := genSpans(t, "") - assertV1(t, spans) - }) - } -} diff --git a/contrib/internal/namingschematest/option.go b/contrib/internal/namingschematest/option.go deleted file mode 100644 index c337d59be0..0000000000 --- a/contrib/internal/namingschematest/option.go +++ /dev/null @@ -1,28 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschematest - -import "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - -type config struct { - wantServiceName map[namingschema.Version]ServiceNameAssertions -} - -func newConfig() *config { - return &config{ - wantServiceName: make(map[namingschema.Version]ServiceNameAssertions, 0), - } -} - -// Option is a type used to customize behavior of functions in this package. -type Option func(*config) - -// WithServiceNameAssertions allows you to override the service name assertions for a specific naming schema version. -func WithServiceNameAssertions(v namingschema.Version, s ServiceNameAssertions) Option { - return func(cfg *config) { - cfg.wantServiceName[v] = s - } -} diff --git a/contrib/internal/options/options.go b/contrib/internal/options/options.go deleted file mode 100644 index 63818738a2..0000000000 --- a/contrib/internal/options/options.go +++ /dev/null @@ -1,17 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package options - -import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - -// Copy should be used any time existing options are copied into -// a new locally scoped set of options. This is to avoid data races and -// accidental side effects. -func Copy(opts ...ddtrace.StartSpanOption) []ddtrace.StartSpanOption { - dup := make([]ddtrace.StartSpanOption, len(opts)) - copy(dup, opts) - return dup -} diff --git a/contrib/internal/options/options_test.go b/contrib/internal/options/options_test.go deleted file mode 100644 index ab127aa895..0000000000 --- a/contrib/internal/options/options_test.go +++ /dev/null @@ -1,37 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package options - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" -) - -func TestStringSliceModify(t *testing.T) { - t.Run("modify-original", func(t *testing.T) { - opts := []ddtrace.StartSpanOption{tracer.Tag("mytag", "myvalue")} - optsCopy := Copy(opts...) - opts[0] = tracer.ResourceName("somethingelse") - cfg := new(ddtrace.StartSpanConfig) - for _, fn := range optsCopy { - fn(cfg) - } - assert.Equal(t, "myvalue", cfg.Tags["mytag"]) - }) - t.Run("modify-copy", func(t *testing.T) { - opts := []ddtrace.StartSpanOption{tracer.Tag("mytag", "myvalue")} - optsCopy := Copy(opts...) - optsCopy[0] = tracer.ResourceName("somethingelse") - cfg := new(ddtrace.StartSpanConfig) - for _, fn := range opts { - fn(cfg) - } - assert.Equal(t, "myvalue", cfg.Tags["mytag"]) - }) -} diff --git a/contrib/internal/telemetrytest/telemetry_test.go b/contrib/internal/telemetrytest/telemetry_test.go deleted file mode 100644 index a203228fc2..0000000000 --- a/contrib/internal/telemetrytest/telemetry_test.go +++ /dev/null @@ -1,93 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. -package telemetrytest - -import ( - "encoding/json" - "os" - "os/exec" - "strings" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/gorilla/mux" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// TestIntegrationInfo verifies that an integration leveraging instrumentation telemetry -// sends the correct data to the telemetry client. -func TestIntegrationInfo(t *testing.T) { - // mux.NewRouter() uses the net/http and gorilla/mux integration - mux.NewRouter() - integrations := telemetry.Integrations() - require.Len(t, integrations, 2) - assert.Equal(t, integrations[0].Name, "net/http") - assert.True(t, integrations[0].Enabled) - assert.Equal(t, integrations[1].Name, "gorilla/mux") - assert.True(t, integrations[1].Enabled) -} - -type contribPkg struct { - ImportPath string - Name string - Imports []string - Dir string -} - -var TelemetryImport = "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - -func readPackage(t *testing.T, path string) contribPkg { - cmd := exec.Command("go", "list", "-json", path) - cmd.Stderr = os.Stderr - output, err := cmd.Output() - require.NoError(t, err) - p := contribPkg{} - err = json.Unmarshal(output, &p) - require.NoError(t, err) - return p -} - -func (p *contribPkg) hasTelemetryImport(t *testing.T) bool { - for _, imp := range p.Imports { - if imp == TelemetryImport { - return true - } - } - // if we didn't find it imported directly, it might be imported in one of sub-package imports - for _, imp := range p.Imports { - if strings.HasPrefix(imp, p.ImportPath) { - p := readPackage(t, imp) - if p.hasTelemetryImport(t) { - return true - } - } - } - return false -} - -// TestTelemetryEnabled verifies that the expected contrib packages leverage instrumentation telemetry -func TestTelemetryEnabled(t *testing.T) { - body, err := exec.Command("go", "list", "-json", "../../...").Output() - require.NoError(t, err) - - var packages []contribPkg - stream := json.NewDecoder(strings.NewReader(string(body))) - for stream.More() { - var out contribPkg - err := stream.Decode(&out) - require.NoError(t, err) - packages = append(packages, out) - } - for _, pkg := range packages { - if strings.Contains(pkg.ImportPath, "/test") || strings.Contains(pkg.ImportPath, "/internal") { - continue - } - if !pkg.hasTelemetryImport(t) { - t.Fatalf(`package %q is expected use instrumentation telemetry. For more info see https://github.com/DataDog/dd-trace-go/blob/main/contrib/README.md#instrumentation-telemetry`, pkg.ImportPath) - } - } -} diff --git a/contrib/jackc/pgx.v5/example_test.go b/contrib/jackc/pgx.v5/example_test.go index 7be774dc57..68697bf963 100644 --- a/contrib/jackc/pgx.v5/example_test.go +++ b/contrib/jackc/pgx.v5/example_test.go @@ -9,7 +9,7 @@ import ( "context" "log" - pgxtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/jackc/pgx.v5" + pgxtrace "github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2" "github.com/jackc/pgx/v5" ) @@ -45,7 +45,7 @@ func ExampleConnect() { } } -func ExamplePool() { +func ExampleNewPool() { ctx := context.TODO() // The pgxpool uses the same tracer and is exposed the same way. diff --git a/contrib/jackc/pgx.v5/go.mod b/contrib/jackc/pgx.v5/go.mod new file mode 100644 index 0000000000..87ecee321f --- /dev/null +++ b/contrib/jackc/pgx.v5/go.mod @@ -0,0 +1,98 @@ +module github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/jackc/pgx/v5 v5.6.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/jackc/pgx.v5/go.sum b/contrib/jackc/pgx.v5/go.sum new file mode 100644 index 0000000000..54eb34044d --- /dev/null +++ b/contrib/jackc/pgx.v5/go.sum @@ -0,0 +1,319 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/jackc/pgx.v5/metrics.go b/contrib/jackc/pgx.v5/metrics.go index eb94c50bfc..a59fdbd457 100644 --- a/contrib/jackc/pgx.v5/metrics.go +++ b/contrib/jackc/pgx.v5/metrics.go @@ -8,10 +8,8 @@ package pgx import ( "time" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/jackc/pgx/v5/pgxpool" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" ) const tracerPrefix = "datadog.tracer." @@ -34,10 +32,11 @@ const ( var interval = 10 * time.Second // pollPoolStats calls (*pgxpool).Stats on the pool at a predetermined interval. It pushes the pool Stats off to the statsd client. -func pollPoolStats(statsd internal.StatsdClient, pool *pgxpool.Pool) { - log.Debug("contrib/jackc/pgx.v5: Traced pool connection found: Pool stats will be gathered and sent every %v.", interval) +func pollPoolStats(statsd instrumentation.StatsdClient, pool *pgxpool.Pool) { + // TODO: Create stop condition for pgx on db.Close + instr.Logger().Debug("contrib/jackc/pgx.v5: Traced pool connection found: Pool stats will be gathered and sent every %v.", interval) for range time.NewTicker(interval).C { - log.Debug("contrib/jackc/pgx.v5: Reporting pgxpool.Stat metrics...") + instr.Logger().Debug("contrib/jackc/pgx.v5: Reporting pgxpool.Stat metrics...") stat := pool.Stat() statsd.Gauge(AcquireCount, float64(stat.AcquireCount()), []string{}, 1) statsd.Timing(AcquireDuration, stat.AcquireDuration(), []string{}, 1) @@ -55,7 +54,7 @@ func pollPoolStats(statsd internal.StatsdClient, pool *pgxpool.Pool) { } func statsTags(c *config) []string { - tags := globalconfig.StatsTags() + tags := []string{} if c.serviceName != "" { tags = append(tags, "service:"+c.serviceName) } diff --git a/contrib/jackc/pgx.v5/option.go b/contrib/jackc/pgx.v5/option.go index b89a3968a0..f6843ef144 100644 --- a/contrib/jackc/pgx.v5/option.go +++ b/contrib/jackc/pgx.v5/option.go @@ -6,10 +6,7 @@ package pgx import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) type config struct { @@ -21,12 +18,13 @@ type config struct { traceConnect bool traceAcquire bool poolStats bool - statsdClient internal.StatsdClient + errCheck func(error) bool + statsdClient instrumentation.StatsdClient } func defaultConfig() *config { return &config{ - serviceName: namingschema.ServiceName(defaultServiceName), + serviceName: instr.ServiceName(instrumentation.ComponentDefault, nil), traceQuery: true, traceBatch: true, traceCopyFrom: true, @@ -42,19 +40,19 @@ func (c *config) checkStatsdRequired() { if c.poolStats && c.statsdClient == nil { // contrib/jackc/pgx's statsdclient should always inherit its address from the tracer's statsdclient via the globalconfig // destination is not user-configurable - sc, err := internal.NewStatsdClient(globalconfig.DogstatsdAddr(), statsTags(c)) + sc, err := instr.StatsdClient(statsTags(c)) if err == nil { c.statsdClient = sc } else { - log.Warn("contrib/jackc/pgx.v5: Error creating statsd client; Pool stats will be dropped: %v", err) + instr.Logger().Warn("contrib/jackc/pgx.v5: Error creating statsd client; Pool stats will be dropped: %s", err.Error()) } } } type Option func(*config) -// WithServiceName sets the service name to use for all spans. -func WithServiceName(name string) Option { +// WithService sets the service name to use for all spans. +func WithService(name string) Option { return func(c *config) { c.serviceName = name } @@ -89,15 +87,6 @@ func WithTraceAcquire(enabled bool) Option { } // WithTracePrepare enables tracing prepared statements. -// -// conn, err := pgx.Connect(ctx, "postgres://user:pass@example.com:5432/dbname", pgx.WithTraceConnect()) -// if err != nil { -// // handle err -// } -// defer conn.Close(ctx) -// -// _, err := conn.Prepare(ctx, "stmt", "select $1::integer") -// row, err := conn.QueryRow(ctx, "stmt", 1) func WithTracePrepare(enabled bool) Option { return func(c *config) { c.tracePrepare = enabled @@ -105,8 +94,6 @@ func WithTracePrepare(enabled bool) Option { } // WithTraceConnect enables tracing calls to Connect and ConnectConfig. -// -// pgx.Connect(ctx, "postgres://user:pass@example.com:5432/dbname", pgx.WithTraceConnect()) func WithTraceConnect(enabled bool) Option { return func(c *config) { c.traceConnect = enabled @@ -121,3 +108,16 @@ func WithPoolStats() Option { cfg.poolStats = true } } + +// WithErrCheck specifies a function fn which determines whether the passed +// error should be tagged into the span as an error. +// fn is called whenever a pgx operation finishes with an error +// +// When the function returns true, the span will be tagged with the error. +// When the function returns false, the span will not be tagged with the error. +// When the function is nil, the span will be tagged with the error. +func WithErrCheck(fn func(err error) bool) Option { + return func(cfg *config) { + cfg.errCheck = fn + } +} diff --git a/contrib/jackc/pgx.v5/orchestrion.yml b/contrib/jackc/pgx.v5/orchestrion.yml new file mode 100644 index 0000000000..d555701227 --- /dev/null +++ b/contrib/jackc/pgx.v5/orchestrion.yml @@ -0,0 +1,58 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2 + description: PostgreSQL driver and toolkit for Go. + +aspects: + - id: Connect + join-point: + all-of: + - function-call: github.com/jackc/pgx/v5.Connect + - not: + one-of: + - import-path: github.com/jackc/pgx/v5 + - import-path: github.com/jackc/pgx/v5/pgxpool + advice: + - replace-function: + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2.Connect + + - id: ConnectConfig + join-point: + all-of: + - function-call: github.com/jackc/pgx/v5.ConnectConfig + - not: + one-of: + - import-path: github.com/jackc/pgx/v5 + - import-path: github.com/jackc/pgx/v5/pgxpool + advice: + - replace-function: + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2.ConnectConfig + + - id: pgxpool.New + join-point: + all-of: + - function-call: github.com/jackc/pgx/v5/pgxpool.New + - not: + one-of: + - import-path: github.com/jackc/pgx/v5 + - import-path: github.com/jackc/pgx/v5/pgxpool + advice: + - replace-function: + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2.NewPool + + - id: pgxpool.NewWithConfig + join-point: + all-of: + - function-call: github.com/jackc/pgx/v5/pgxpool.NewWithConfig + - not: + one-of: + - import-path: github.com/jackc/pgx/v5 + - import-path: github.com/jackc/pgx/v5/pgxpool + advice: + - replace-function: + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2.NewPoolWithConfig diff --git a/contrib/jackc/pgx.v5/pgx.go b/contrib/jackc/pgx.v5/pgx.go index 3150d2eb7e..8107fa1e2e 100644 --- a/contrib/jackc/pgx.v5/pgx.go +++ b/contrib/jackc/pgx.v5/pgx.go @@ -7,20 +7,20 @@ package pgx import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/jackc/pgx/v5" ) const ( - componentName = "jackc/pgx.v5" defaultServiceName = "postgres.db" ) +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/jackc/pgx.v5") + instr = instrumentation.Load(instrumentation.PackageJackcPGXV5) } // Deprecated: this type is unused internally so it will be removed in a future release, please use pgx.Batch instead. diff --git a/contrib/jackc/pgx.v5/pgx_tracer.go b/contrib/jackc/pgx.v5/pgx_tracer.go index 26e053601e..afa21c7bc7 100644 --- a/contrib/jackc/pgx.v5/pgx_tracer.go +++ b/contrib/jackc/pgx.v5/pgx_tracer.go @@ -8,9 +8,9 @@ package pgx import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" @@ -36,7 +36,7 @@ const ( ) type tracedBatchQuery struct { - span tracer.Span + span *tracer.Span data pgx.TraceBatchQueryData } @@ -124,7 +124,7 @@ func (t *pgxTracer) TraceQueryEnd(ctx context.Context, conn *pgx.Conn, data pgx. if ok { span.SetTag(tagRowsAffected, data.CommandTag.RowsAffected()) } - finishSpan(ctx, data.Err) + t.finishSpan(ctx, data.Err) } func (t *pgxTracer) TraceBatchStart(ctx context.Context, conn *pgx.Conn, data pgx.TraceBatchStartData) context.Context { @@ -175,7 +175,7 @@ func (t *pgxTracer) TraceBatchEnd(ctx context.Context, conn *pgx.Conn, data pgx. t.prevBatchQuery.finish() t.prevBatchQuery = nil } - finishSpan(ctx, data.Err) + t.finishSpan(ctx, data.Err) } func (t *pgxTracer) TraceCopyFromStart(ctx context.Context, conn *pgx.Conn, data pgx.TraceCopyFromStartData) context.Context { @@ -200,7 +200,7 @@ func (t *pgxTracer) TraceCopyFromEnd(ctx context.Context, conn *pgx.Conn, data p if t.wrapped.copyFrom != nil { t.wrapped.copyFrom.TraceCopyFromEnd(ctx, conn, data) } - finishSpan(ctx, data.Err) + t.finishSpan(ctx, data.Err) } func (t *pgxTracer) TracePrepareStart(ctx context.Context, conn *pgx.Conn, data pgx.TracePrepareStartData) context.Context { @@ -222,7 +222,7 @@ func (t *pgxTracer) TracePrepareEnd(ctx context.Context, conn *pgx.Conn, data pg if t.wrapped.prepare != nil { t.wrapped.prepare.TracePrepareEnd(ctx, conn, data) } - finishSpan(ctx, data.Err) + t.finishSpan(ctx, data.Err) } func (t *pgxTracer) TraceConnectStart(ctx context.Context, data pgx.TraceConnectStartData) context.Context { @@ -244,7 +244,7 @@ func (t *pgxTracer) TraceConnectEnd(ctx context.Context, data pgx.TraceConnectEn if t.wrapped.connect != nil { t.wrapped.connect.TraceConnectEnd(ctx, data) } - finishSpan(ctx, data.Err) + t.finishSpan(ctx, data.Err) } func (t *pgxTracer) TraceAcquireStart(ctx context.Context, pool *pgxpool.Pool, data pgxpool.TraceAcquireStartData) context.Context { @@ -266,15 +266,15 @@ func (t *pgxTracer) TraceAcquireEnd(ctx context.Context, pool *pgxpool.Pool, dat if t.wrapped.poolAcquire != nil { t.wrapped.poolAcquire.TraceAcquireEnd(ctx, pool, data) } - finishSpan(ctx, data.Err) + t.finishSpan(ctx, data.Err) } -func (t *pgxTracer) spanOptions(connConfig *pgx.ConnConfig, op operationType, sqlStatement string, extraOpts ...ddtrace.StartSpanOption) []ddtrace.StartSpanOption { - opts := []ddtrace.StartSpanOption{ +func (t *pgxTracer) spanOptions(connConfig *pgx.ConnConfig, op operationType, sqlStatement string, extraOpts ...tracer.StartSpanOption) []tracer.StartSpanOption { + opts := []tracer.StartSpanOption{ tracer.ServiceName(t.cfg.serviceName), tracer.SpanType(ext.SpanTypeSQL), tracer.Tag(ext.DBSystem, ext.DBSystemPostgreSQL), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageJackcPGXV5), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(tagOperation, string(op)), } @@ -300,10 +300,13 @@ func (t *pgxTracer) spanOptions(connConfig *pgx.ConnConfig, op operationType, sq return opts } -func finishSpan(ctx context.Context, err error) { +func (t *pgxTracer) finishSpan(ctx context.Context, err error) { span, ok := tracer.SpanFromContext(ctx) if !ok { return } - span.Finish(tracer.WithError(err)) + if err != nil && (t.cfg.errCheck == nil || t.cfg.errCheck(err)) { + span.SetTag(ext.Error, err) + } + span.Finish() } diff --git a/contrib/jackc/pgx.v5/pgx_tracer_test.go b/contrib/jackc/pgx.v5/pgx_tracer_test.go index 38867a1fe6..11ffcd5c80 100644 --- a/contrib/jackc/pgx.v5/pgx_tracer_test.go +++ b/contrib/jackc/pgx.v5/pgx_tracer_test.go @@ -10,12 +10,14 @@ import ( "fmt" "log" "os" + "strings" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgconn" @@ -76,21 +78,21 @@ func TestConnect(t *testing.T) { }{ { name: "pool", - newConnCreator: func(t *testing.T, prev *pgxMockTracer) createConnFn { + newConnCreator: func(_ *testing.T, _ *pgxMockTracer) createConnFn { opts := append(tracingAllDisabled(), WithTraceConnect(true)) return newPoolCreator(nil, opts...) }, }, { name: "conn", - newConnCreator: func(t *testing.T, prev *pgxMockTracer) createConnFn { + newConnCreator: func(_ *testing.T, _ *pgxMockTracer) createConnFn { opts := append(tracingAllDisabled(), WithTraceConnect(true)) return newConnCreator(nil, nil, opts...) }, }, { name: "conn_with_options", - newConnCreator: func(t *testing.T, prev *pgxMockTracer) createConnFn { + newConnCreator: func(_ *testing.T, _ *pgxMockTracer) createConnFn { opts := append(tracingAllDisabled(), WithTraceConnect(true)) return newConnCreator(nil, &pgx.ParseConfigOptions{}, opts...) }, @@ -155,6 +157,38 @@ func TestQuery(t *testing.T) { assert.Equal(t, ps.SpanID(), s.ParentID()) } +func TestIgnoreError(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + opts := append(tracingAllDisabled(), WithTraceQuery(true), WithErrCheck(func(err error) bool { + // Filter out errors that are not SQL error - undefined column or parameter name detected + return strings.Contains(err.Error(), "SQLSTATE 42703") + })) + + parent, ctx := tracer.StartSpanFromContext(context.Background(), "parent") + defer parent.Finish() + + // Connect + conn := newPoolCreator(nil, opts...)(t, ctx) + + // Query + var x int + err := conn.QueryRow(ctx, `SELECT 1`).Scan(x) + require.Error(t, err) + require.Equal(t, 0, x) + + err = conn.QueryRow(ctx, `SELECT unexisting_column`).Scan(x) + require.Error(t, err) + require.Equal(t, 0, x) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + + require.Equal(t, nil, spans[0].Tag(ext.ErrorMsg)) + require.Equal(t, "ERROR: column \"unexisting_column\" does not exist (SQLSTATE 42703)", spans[1].Tag(ext.ErrorMsg)) +} + func TestPrepare(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() @@ -257,8 +291,8 @@ func TestCopyFrom(t *testing.T) { assert.Equal(t, "Copy From", s.Tag(ext.ResourceName)) assert.Equal(t, "Copy From", s.Tag("db.operation")) assert.Equal(t, nil, s.Tag(ext.DBStatement)) - assert.EqualValues(t, []string{"numbers"}, s.Tag("db.copy_from.tables")) - assert.EqualValues(t, []string{"number"}, s.Tag("db.copy_from.columns")) + assert.EqualValues(t, "numbers", s.Tag("db.copy_from.tables.0")) + assert.EqualValues(t, "number", s.Tag("db.copy_from.columns.0")) assert.Equal(t, ps.SpanID(), s.ParentID()) } @@ -341,6 +375,7 @@ func tracingAllDisabled() []Option { WithTraceBatch(false), WithTraceCopyFrom(false), WithTraceAcquire(false), + WithErrCheck(nil), } } @@ -442,14 +477,15 @@ func runAllOperations(t *testing.T, createConn createConnFn) { require.NoError(t, err) } -func assertCommonTags(t *testing.T, s mocktracer.Span) { +func assertCommonTags(t *testing.T, s *mocktracer.Span) { assert.Equal(t, defaultServiceName, s.Tag(ext.ServiceName)) assert.Equal(t, ext.SpanTypeSQL, s.Tag(ext.SpanType)) assert.Equal(t, ext.DBSystemPostgreSQL, s.Tag(ext.DBSystem)) - assert.Equal(t, componentName, s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageJackcPGXV5), s.Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageJackcPGXV5), s.Integration()) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) assert.Equal(t, "127.0.0.1", s.Tag(ext.NetworkDestinationName)) - assert.Equal(t, 5432, s.Tag(ext.NetworkDestinationPort)) + assert.Equal(t, float64(5432), s.Tag(ext.NetworkDestinationPort)) assert.Equal(t, "postgres", s.Tag(ext.DBName)) assert.Equal(t, "postgres", s.Tag(ext.DBUser)) } diff --git a/contrib/jackc/pgx.v5/pgxpool_test.go b/contrib/jackc/pgx.v5/pgxpool_test.go index c784da33a3..6961cd4389 100644 --- a/contrib/jackc/pgx.v5/pgxpool_test.go +++ b/contrib/jackc/pgx.v5/pgxpool_test.go @@ -10,9 +10,9 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/statsdtest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -50,7 +50,7 @@ func TestPoolWithPoolStats(t *testing.T) { }) ctx := context.Background() - statsd := new(statsdtest.TestStatsdClient) + statsd := testutils.NewMockStatsdClient() conn, err := NewPool(ctx, postgresDSN, withStatsdClient(statsd), WithPoolStats()) require.NoError(t, err) defer conn.Close() @@ -66,7 +66,7 @@ func TestPoolWithPoolStats(t *testing.T) { } } -func withStatsdClient(s internal.StatsdClient) Option { +func withStatsdClient(s instrumentation.StatsdClient) Option { return func(c *config) { c.statsdClient = s } diff --git a/contrib/jinzhu/gorm/example_test.go b/contrib/jinzhu/gorm/example_test.go deleted file mode 100644 index 5246d37a2b..0000000000 --- a/contrib/jinzhu/gorm/example_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package gorm_test - -import ( - "log" - - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - gormtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/jinzhu/gorm" - - "github.com/jinzhu/gorm" - "github.com/lib/pq" -) - -func ExampleOpen() { - // Register augments the provided driver with tracing, enabling it to be loaded by gormtrace.Open. - sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithServiceName("my-service")) - - // Open the registered driver, allowing all uses of the returned *gorm.DB to be traced. - db, err := gormtrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") - defer db.Close() - if err != nil { - log.Fatal(err) - } - - user := struct { - gorm.Model - Name string - }{} - - // All calls through gorm.DB are now traced. - db.Where("name = ?", "jinzhu").First(&user) -} diff --git a/contrib/jinzhu/gorm/gorm.go b/contrib/jinzhu/gorm/gorm.go deleted file mode 100644 index 35d9c0f177..0000000000 --- a/contrib/jinzhu/gorm/gorm.go +++ /dev/null @@ -1,156 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package gorm provides helper functions for tracing the jinzhu/gorm package (https://github.com/jinzhu/gorm). -// -// Deprecated: The underlying github.com/jinzhu/gorm packages has known security vulnerabilities and is no longer under -// active development. -// It is highly recommended that you update to the latest version available here as a contrib package "gorm.io/gorm.v1". -package gorm - -import ( - "context" - "math" - "time" - - sqltraced "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "github.com/jinzhu/gorm" -) - -const componentName = "jinzhu/gorm" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/jinzhu/gorm") -} - -const ( - gormContextKey = "dd-trace-go:context" - gormConfigKey = "dd-trace-go:config" - gormSpanStartTimeKey = "dd-trace-go:span" -) - -// Open opens a new (traced) database connection. The used dialect must be formerly registered -// using (gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql).Register. -func Open(dialect, source string, opts ...Option) (*gorm.DB, error) { - sqldb, err := sqltraced.Open(dialect, source) - if err != nil { - return nil, err - } - db, err := gorm.Open(dialect, sqldb) - if err != nil { - return db, err - } - return WithCallbacks(db, opts...), err -} - -// WithCallbacks registers callbacks to the gorm.DB for tracing. -// It should be called once, after opening the db. -// The callbacks are triggered by Create, Update, Delete, -// Query and RowQuery operations. -func WithCallbacks(db *gorm.DB, opts ...Option) *gorm.DB { - afterFunc := func(operationName string) func(*gorm.Scope) { - return func(scope *gorm.Scope) { - after(scope, operationName) - } - } - - cb := db.Callback() - cb.Create().Before("gorm:before_create").Register("dd-trace-go:before_create", before) - cb.Create().After("gorm:after_create").Register("dd-trace-go:after_create", afterFunc("gorm.create")) - cb.Update().Before("gorm:before_update").Register("dd-trace-go:before_update", before) - cb.Update().After("gorm:after_update").Register("dd-trace-go:after_update", afterFunc("gorm.update")) - cb.Delete().Before("gorm:before_delete").Register("dd-trace-go:before_delete", before) - cb.Delete().After("gorm:after_delete").Register("dd-trace-go:after_delete", afterFunc("gorm.delete")) - cb.Query().Before("gorm:query").Register("dd-trace-go:before_query", before) - cb.Query().After("gorm:after_query").Register("dd-trace-go:after_query", afterFunc("gorm.query")) - cb.RowQuery().Before("gorm:row_query").Register("dd-trace-go:before_row_query", before) - cb.RowQuery().After("gorm:row_query").Register("dd-trace-go:after_row_query", afterFunc("gorm.row_query")) - - cfg := new(config) - defaults(cfg) - for _, fn := range opts { - fn(cfg) - } - log.Debug("contrib/jinzhu/gorm: Adding Callbacks: %#v", cfg) - return db.Set(gormConfigKey, cfg) -} - -// WithContext attaches the specified context to the given db. The context will -// be used as a basis for creating new spans. An example use case is providing -// a context which contains a span to be used as a parent. -func WithContext(ctx context.Context, db *gorm.DB) *gorm.DB { - if ctx == nil { - return db - } - db = db.Set(gormContextKey, ctx) - return db -} - -// ContextFromDB returns any context previously attached to db using WithContext, -// otherwise returning context.Background. -func ContextFromDB(db *gorm.DB) context.Context { - if v, ok := db.Get(gormContextKey); ok { - if ctx, ok := v.(context.Context); ok { - return ctx - } - } - return context.Background() -} - -func before(scope *gorm.Scope) { - scope.Set(gormSpanStartTimeKey, time.Now()) -} - -func after(scope *gorm.Scope, operationName string) { - v, ok := scope.Get(gormContextKey) - if !ok { - return - } - ctx := v.(context.Context) - - v, ok = scope.Get(gormConfigKey) - if !ok { - return - } - cfg := v.(*config) - - v, ok = scope.Get(gormSpanStartTimeKey) - if !ok { - return - } - t, ok := v.(time.Time) - if !ok { - return - } - - opts := []ddtrace.StartSpanOption{ - tracer.StartTime(t), - tracer.ServiceName(cfg.serviceName), - tracer.SpanType(ext.SpanTypeSQL), - tracer.ResourceName(scope.SQL), - tracer.Tag(ext.Component, componentName), - } - if !math.IsNaN(cfg.analyticsRate) { - opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - if cfg.tagFns != nil { - for key, tagFn := range cfg.tagFns { - opts = append(opts, tracer.Tag(key, tagFn(scope))) - } - } - - span, _ := tracer.StartSpanFromContext(ctx, operationName, opts...) - defer span.Finish() - if cfg.errCheck(scope.DB().Error) { - span.SetTag(ext.Error, scope.DB().Error) - } -} diff --git a/contrib/jinzhu/gorm/gorm_test.go b/contrib/jinzhu/gorm/gorm_test.go deleted file mode 100644 index cfaf091185..0000000000 --- a/contrib/jinzhu/gorm/gorm_test.go +++ /dev/null @@ -1,435 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package gorm - -import ( - "context" - "fmt" - "log" - "os" - "testing" - - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/sqltest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - - mssql "github.com/denisenkom/go-mssqldb" - "github.com/go-sql-driver/mysql" - "github.com/jinzhu/gorm" - "github.com/lib/pq" - "github.com/stretchr/testify/assert" -) - -// tableName holds the SQL table that these tests will be run against. It must be unique cross-repo. -const tableName = "testgorm" - -func TestMain(m *testing.M) { - _, ok := os.LookupEnv("INTEGRATION") - if !ok { - fmt.Println("--- SKIP: to enable integration test, set the INTEGRATION environment variable") - os.Exit(0) - } - cleanup := sqltest.Prepare(tableName) - testResult := m.Run() - cleanup() - os.Exit(testResult) -} - -func TestSqlServer(t *testing.T) { - sqltrace.Register("sqlserver", &mssql.Driver{}) - db, err := Open("sqlserver", "sqlserver://sa:myPassw0rd@127.0.0.1:1433?database=master") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - testConfig := &sqltest.Config{ - DB: db.DB(), - DriverName: "sqlserver", - TableName: tableName, - ExpectName: "sqlserver.query", - ExpectTags: map[string]interface{}{ - ext.ServiceName: "sqlserver.db", - ext.SpanType: ext.SpanTypeSQL, - ext.TargetHost: "127.0.0.1", - ext.TargetPort: "1433", - ext.DBUser: "sa", - ext.DBName: "master", - ext.EventSampleRate: nil, - }, - } - sqltest.RunAll(t, testConfig) -} - -func TestMySQL(t *testing.T) { - sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("mysql-test")) - db, err := Open("mysql", "test:test@tcp(127.0.0.1:3306)/test") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - testConfig := &sqltest.Config{ - DB: db.DB(), - DriverName: "mysql", - TableName: tableName, - ExpectName: "mysql.query", - ExpectTags: map[string]interface{}{ - ext.ServiceName: "mysql-test", - ext.SpanType: ext.SpanTypeSQL, - ext.TargetHost: "127.0.0.1", - ext.TargetPort: "3306", - "db.user": "test", - "db.name": "test", - }, - } - sqltest.RunAll(t, testConfig) -} - -func TestPostgres(t *testing.T) { - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - testConfig := &sqltest.Config{ - DB: db.DB(), - DriverName: "postgres", - TableName: tableName, - ExpectName: "postgres.query", - ExpectTags: map[string]interface{}{ - ext.ServiceName: "postgres.db", - ext.SpanType: ext.SpanTypeSQL, - ext.TargetHost: "127.0.0.1", - ext.TargetPort: "5432", - "db.user": "postgres", - "db.name": "postgres", - }, - } - sqltest.RunAll(t, testConfig) -} - -type Product struct { - gorm.Model - Code string - Price uint -} - -func TestCallbacks(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - t.Run("create", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var queryText string - db.Callback().Create().After("testing").Register("query text", func(scope *gorm.Scope) { - queryText = scope.SQL - }) - db.Create(&Product{Code: "L1212", Price: 1000}) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - span := spans[len(spans)-3] - assert.Equal("gorm.create", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal(queryText, span.Tag(ext.ResourceName)) - assert.Equal("jinzhu/gorm", span.Tag(ext.Component)) - }) - - t.Run("query", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var queryText string - db.Callback().Query().After("testing").Register("query text", func(scope *gorm.Scope) { - queryText = scope.SQL - }) - var product Product - db.First(&product, "code = ?", "L1212") - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 2) - - span := spans[len(spans)-2] - assert.Equal("gorm.query", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal(queryText, span.Tag(ext.ResourceName)) - assert.Equal("jinzhu/gorm", span.Tag(ext.Component)) - }) - - t.Run("update", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var queryText string - db.Callback().Update().After("testing").Register("query text", func(scope *gorm.Scope) { - queryText = scope.SQL - }) - var product Product - db.First(&product, "code = ?", "L1212") - db.Model(&product).Update("Price", 2000) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - span := spans[len(spans)-3] - assert.Equal("gorm.update", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal(queryText, span.Tag(ext.ResourceName)) - assert.Equal("jinzhu/gorm", span.Tag(ext.Component)) - }) - - t.Run("delete", func(t *testing.T) { - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var queryText string - db.Callback().Delete().After("testing").Register("query text", func(scope *gorm.Scope) { - queryText = scope.SQL - }) - var product Product - db.First(&product, "code = ?", "L1212") - db.Delete(&product) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - span := spans[len(spans)-3] - assert.Equal("gorm.delete", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal(queryText, span.Tag(ext.ResourceName)) - assert.Equal("jinzhu/gorm", span.Tag(ext.Component)) - }) -} - -func TestAnalyticsSettings(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", opts...) - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - db.Create(&Product{Code: "L1212", Price: 1000}) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(t, len(spans) > 3) - s := spans[len(spans)-3] - assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil) - }) - - t.Run("global", func(t *testing.T) { - t.Skip("global flag disabled") - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - - t.Run("enabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, 1.0, WithAnalytics(true)) - }) - - t.Run("disabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil, WithAnalytics(false)) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) - }) -} - -func TestContext(t *testing.T) { - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable") - if err != nil { - log.Fatal(err) - } - defer db.Close() - - t.Run("with", func(t *testing.T) { - type key string - testCtx := context.WithValue(context.Background(), key("test context"), true) - db := WithContext(testCtx, db) - ctx := ContextFromDB(db) - assert.Equal(t, testCtx, ctx) - }) - - t.Run("without", func(t *testing.T) { - ctx := ContextFromDB(db) - assert.Equal(t, context.Background(), ctx) - }) -} - -func TestCustomTags(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", - WithCustomTag("custom_tag", func(scope *gorm.Scope) interface{} { - return scope.SQLVars[3] - }), - ) - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - parentSpan, ctx := tracer.StartSpanFromContext(context.Background(), "http.request", - tracer.ServiceName("fake-http-server"), - tracer.SpanType(ext.SpanTypeWeb), - ) - - db = WithContext(ctx, db) - var queryText string - db.Callback().Create().After("testing").Register("query text", func(scope *gorm.Scope) { - queryText = scope.SQL - }) - db.Create(&Product{Code: "L1212", Price: 1000}) - - parentSpan.Finish() - - spans := mt.FinishedSpans() - assert.True(len(spans) >= 3) - - // We deterministically expect the span to be the third last, - // followed by the underlying postgres DB trace and the above http.request span. - span := spans[len(spans)-3] - assert.Equal("gorm.create", span.OperationName()) - assert.Equal(ext.SpanTypeSQL, span.Tag(ext.SpanType)) - assert.Equal("L1212", span.Tag("custom_tag")) - assert.Equal(queryText, span.Tag(ext.ResourceName)) - assert.Equal("jinzhu/gorm", span.Tag(ext.Component)) -} - -func TestError(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertErrCheck := func(t *testing.T, mt mocktracer.Tracer, errExist bool, opts ...Option) { - sqltrace.Register("postgres", &pq.Driver{}) - db, err := Open("postgres", "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable", opts...) - if err != nil { - log.Fatal(err) - } - defer db.Close() - db.AutoMigrate(&Product{}) - - db = WithContext(context.Background(), db) - db.Find(&Product{}, Product{Code: "L1210", Price: 2000}) - - spans := mt.FinishedSpans() - assert.True(t, len(spans) > 1) - - // Get last span (gorm.db) - s := spans[len(spans)-1] - assert.Equal(t, errExist, s.Tag(ext.Error) != nil) - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertErrCheck(t, mt, true) - }) - - t.Run("errcheck", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - errFn := func(err error) bool { - if err == gorm.ErrRecordNotFound { - return false - } - return true - } - assertErrCheck(t, mt, false, WithErrorCheck(errFn)) - }) -} diff --git a/contrib/jinzhu/gorm/option.go b/contrib/jinzhu/gorm/option.go deleted file mode 100644 index cf83683dad..0000000000 --- a/contrib/jinzhu/gorm/option.go +++ /dev/null @@ -1,87 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package gorm - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - - "github.com/jinzhu/gorm" -) - -type config struct { - serviceName string - analyticsRate float64 - dsn string - tagFns map[string]func(scope *gorm.Scope) interface{} - errCheck func(err error) bool -} - -// Option represents an option that can be passed to Register, Open or OpenDB. -type Option func(*config) - -func defaults(cfg *config) { - cfg.serviceName = "gorm.db" - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_GORM_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - cfg.errCheck = func(error) bool { return true } -} - -// WithServiceName sets the given service name when registering a driver, -// or opening a database connection. -func WithServiceName(name string) Option { - return func(cfg *config) { - cfg.serviceName = name - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(cfg *config) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(cfg *config) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithCustomTag will cause the given tagFn to be evaluated after executing -// a query and attach the result to the span tagged by the key. -func WithCustomTag(tag string, tagFn func(scope *gorm.Scope) interface{}) Option { - return func(cfg *config) { - if cfg.tagFns == nil { - cfg.tagFns = make(map[string]func(scope *gorm.Scope) interface{}) - } - cfg.tagFns[tag] = tagFn - } -} - -// WithErrorCheck specifies a function fn which determines whether the passed -// error should be marked as an error. The fn is called whenever a gorm operation -// finishes with an error -func WithErrorCheck(fn func(err error) bool) Option { - return func(cfg *config) { - cfg.errCheck = fn - } -} diff --git a/contrib/jmoiron/sqlx/example_test.go b/contrib/jmoiron/sqlx/example_test.go index c332ddeb88..65abec62ef 100644 --- a/contrib/jmoiron/sqlx/example_test.go +++ b/contrib/jmoiron/sqlx/example_test.go @@ -8,8 +8,8 @@ package sqlx_test import ( "log" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - sqlxtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/jmoiron/sqlx" + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + sqlxtrace "github.com/DataDog/dd-trace-go/contrib/jmoiron/sqlx/v2" "github.com/jmoiron/sqlx" "github.com/lib/pq" @@ -19,7 +19,7 @@ func ExampleOpen() { // Register informs the sqlxtrace package of the driver that we will be using in our program. // It uses a default service name, in the below case "postgres.db". To use a custom service // name use RegisterWithServiceName. - sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithServiceName("my-service")) + sqltrace.Register("postgres", &pq.Driver{}, sqltrace.WithService("my-service")) db, err := sqlxtrace.Open("postgres", "postgres://pqgotest:password@localhost/pqgotest?sslmode=disable") if err != nil { log.Fatal(err) diff --git a/contrib/jmoiron/sqlx/go.mod b/contrib/jmoiron/sqlx/go.mod new file mode 100644 index 0000000000..9ce1c60dc5 --- /dev/null +++ b/contrib/jmoiron/sqlx/go.mod @@ -0,0 +1,103 @@ +module github.com/DataDog/dd-trace-go/contrib/jmoiron/sqlx/v2 + +go 1.24.0 + +godebug x509negativeserial=1 + +require ( + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/denisenkom/go-mssqldb v0.11.0 + github.com/go-sql-driver/mysql v1.6.0 + github.com/jmoiron/sqlx v1.3.5 + github.com/lib/pq v1.10.2 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/database/sql/v2 => ../../database/sql + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/jmoiron/sqlx/go.sum b/contrib/jmoiron/sqlx/go.sum new file mode 100644 index 0000000000..037f9fc969 --- /dev/null +++ b/contrib/jmoiron/sqlx/go.sum @@ -0,0 +1,355 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= +github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= diff --git a/contrib/jmoiron/sqlx/sql.go b/contrib/jmoiron/sqlx/sql.go index 9db8ae4e2e..3a367bfaaf 100644 --- a/contrib/jmoiron/sqlx/sql.go +++ b/contrib/jmoiron/sqlx/sql.go @@ -8,22 +8,20 @@ // you will be using, then continue using the package as you normally would. // // For more information on registering and why this needs to happen, please check the -// github.com/DataDog/dd-trace-go/contrib/database/sql package. -package sqlx // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/jmoiron/sqlx" +// github.com/DataDog/dd-trace-go/v2 package. +package sqlx // import "github.com/DataDog/dd-trace-go/contrib/jmoiron/sqlx/v2" import ( - sqltraced "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + sqltraced "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/jmoiron/sqlx" ) -const componentName = "jmoiron/sqlx" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/jmoiron/sqlx") + instr = instrumentation.Load(instrumentation.PackageJmoironSQLx) } // Open opens a new (traced) connection to the database using the given driver and source. diff --git a/contrib/jmoiron/sqlx/sql_test.go b/contrib/jmoiron/sqlx/sql_test.go index 8b1e7d0ce2..18619fb449 100644 --- a/contrib/jmoiron/sqlx/sql_test.go +++ b/contrib/jmoiron/sqlx/sql_test.go @@ -11,9 +11,9 @@ import ( "os" "testing" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/sqltest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + sqltest "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/sql" mssql "github.com/denisenkom/go-mssqldb" "github.com/go-sql-driver/mysql" @@ -36,7 +36,7 @@ func TestMain(m *testing.M) { } func TestMySQL(t *testing.T) { - sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("mysql-test")) + sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithService("mysql-test")) dbx, err := Open("mysql", "test:test@tcp(127.0.0.1:3306)/test") if err != nil { log.Fatal(err) @@ -111,8 +111,8 @@ func TestSQLServer(t *testing.T) { } func TestOpenWithOptions(t *testing.T) { - sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithServiceName("mysql-test")) - dbx, err := Open("mysql", "test:test@tcp(127.0.0.1:3306)/test", sqltrace.WithServiceName("other-service")) + sqltrace.Register("mysql", &mysql.MySQLDriver{}, sqltrace.WithService("mysql-test")) + dbx, err := Open("mysql", "test:test@tcp(127.0.0.1:3306)/test", sqltrace.WithService("other-service")) if err != nil { log.Fatal(err) } diff --git a/contrib/julienschmidt/httprouter/example_test.go b/contrib/julienschmidt/httprouter/example_test.go index 497ada0da8..666f0a633c 100644 --- a/contrib/julienschmidt/httprouter/example_test.go +++ b/contrib/julienschmidt/httprouter/example_test.go @@ -10,9 +10,9 @@ import ( "log" "net/http" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/julienschmidt/httprouter" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + httptrace "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/julienschmidt/httprouter" ) @@ -26,6 +26,9 @@ func Hello(w http.ResponseWriter, _ *http.Request, ps httprouter.Params) { } func Example() { + tracer.Start() + defer tracer.Stop() + router := httptrace.New() router.GET("/", Index) router.GET("/hello/:name", Hello) @@ -34,7 +37,10 @@ func Example() { } func Example_withServiceName() { - router := httptrace.New(httptrace.WithServiceName("http.router")) + tracer.Start() + defer tracer.Stop() + + router := httptrace.New(httptrace.WithService("http.router")) router.GET("/", Index) router.GET("/hello/:name", Hello) @@ -42,10 +48,13 @@ func Example_withServiceName() { } func Example_withSpanOpts() { + tracer.Start() + defer tracer.Stop() + router := httptrace.New( - httptrace.WithServiceName("http.router"), + httptrace.WithService("http.router"), httptrace.WithSpanOptions( - tracer.Tag(ext.SamplingPriority, ext.PriorityUserKeep), + tracer.Tag(ext.ManualKeep, true), ), ) diff --git a/contrib/julienschmidt/httprouter/go.mod b/contrib/julienschmidt/httprouter/go.mod new file mode 100644 index 0000000000..e98395d57a --- /dev/null +++ b/contrib/julienschmidt/httprouter/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/julienschmidt/httprouter v1.3.0 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/julienschmidt/httprouter/go.sum b/contrib/julienschmidt/httprouter/go.sum new file mode 100644 index 0000000000..2c1cea88ca --- /dev/null +++ b/contrib/julienschmidt/httprouter/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/julienschmidt/httprouter/httprouter.go b/contrib/julienschmidt/httprouter/httprouter.go index cffaa28876..8df0e3f91c 100644 --- a/contrib/julienschmidt/httprouter/httprouter.go +++ b/contrib/julienschmidt/httprouter/httprouter.go @@ -3,19 +3,26 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package httprouter provides functions to trace the julienschmidt/httprouter package (https://github.com/julienschmidt/httprouter). -package httprouter // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/julienschmidt/httprouter" +// Package httprouter provides functions to trace the [github.com/julienschmidt/httprouter] package. +package httprouter // import "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2" import ( "net/http" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/julienschmidt/httprouter" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/julienschmidt/httprouter/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2/internal/tracing" ) -// Router is a traced version of httprouter.Router. +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageJulienschmidtHTTPRouter) +} + +// Router is a traced version of [httprouter.Router]. type Router struct { *httprouter.Router config *tracing.Config @@ -24,11 +31,11 @@ type Router struct { // New returns a new router augmented with tracing. func New(opts ...RouterOption) *Router { cfg := tracing.NewConfig(opts...) - log.Debug("contrib/julienschmidt/httprouter: Configuring Router: %#v", cfg) + instr.Logger().Debug("contrib/julienschmidt/httprouter: Configuring Router: %#v", cfg) return &Router{httprouter.New(), cfg} } -// ServeHTTP implements http.Handler. +// ServeHTTP implements [http.Handler]. func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) { tw, treq, afterHandle, handled := tracing.BeforeHandle(r.config, r.Router, wrapRouter, w, req) defer afterHandle() diff --git a/contrib/julienschmidt/httprouter/httprouter_test.go b/contrib/julienschmidt/httprouter/httprouter_test.go index fae16c2f56..76fbe47c56 100644 --- a/contrib/julienschmidt/httprouter/httprouter_test.go +++ b/contrib/julienschmidt/httprouter/httprouter_test.go @@ -8,15 +8,13 @@ package httprouter import ( "net/http" "net/http/httptest" - "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/julienschmidt/httprouter" "github.com/stretchr/testify/assert" @@ -47,8 +45,9 @@ func TestHttpTracer200(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("julienschmidt/httprouter", s.Tag(ext.Component)) + assert.Equal("julienschmidt/httprouter", s.Integration()) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) } @@ -77,8 +76,9 @@ func TestHttpTracer200WithPathParameter(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("julienschmidt/httprouter", s.Tag(ext.Component)) + assert.Equal("julienschmidt/httprouter", s.Integration()) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) } @@ -107,8 +107,9 @@ func TestHttpTracer500(t *testing.T) { assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) assert.Equal("testvalue", s.Tag("testkey")) - assert.Equal("500: Internal Server Error", s.Tag(ext.Error).(error).Error()) + assert.Equal("500: Internal Server Error", s.Tag(ext.ErrorMsg)) assert.Equal("julienschmidt/httprouter", s.Tag(ext.Component)) + assert.Equal("julienschmidt/httprouter", s.Integration()) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) } @@ -137,9 +138,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -162,9 +161,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -172,7 +169,7 @@ func TestAnalyticsSettings(t *testing.T) { func router() http.Handler { router := New( - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("testkey", "testvalue")), ) @@ -195,26 +192,6 @@ func handler500(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { http.Error(w, "500!", http.StatusInternalServerError) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []RouterOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := New(opts...) - mux.GET("/200", handler200) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "http.router")(t) -} - func TestWithHeaderTags(t *testing.T) { setupReq := func(opts ...RouterOption) *http.Request { mux := New(opts...) @@ -238,60 +215,58 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + testutils.SetGlobalHeaderTags(t, "3header") - r := setupReq() + _ = setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) + _ = setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") }) } diff --git a/contrib/julienschmidt/httprouter/internal/tracing/config.go b/contrib/julienschmidt/httprouter/internal/tracing/config.go index 07ee86a765..70d59d4c85 100644 --- a/contrib/julienschmidt/httprouter/internal/tracing/config.go +++ b/contrib/julienschmidt/httprouter/internal/tracing/config.go @@ -8,33 +8,28 @@ package tracing import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" ) -const defaultServiceName = "http.router" - type Config struct { - headerTags *internal.LockMap - spanOpts []ddtrace.StartSpanOption + headerTags instrumentation.HeaderTags + spanOpts []tracer.StartSpanOption serviceName string analyticsRate float64 } func NewConfig(opts ...Option) *Config { cfg := new(Config) - if internal.BoolEnv("DD_TRACE_HTTPROUTER_ANALYTICS_ENABLED", false) { + if options.GetBoolEnv("DD_TRACE_HTTPROUTER_ANALYTICS_ENABLED", false) { cfg.analyticsRate = 1.0 } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() + cfg.analyticsRate = instr.AnalyticsRate(true) } - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - cfg.headerTags = globalconfig.HeaderTagMap() + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.headerTags = instr.HTTPHeadersAsTags() for _, fn := range opts { fn(cfg) } @@ -49,15 +44,15 @@ func NewConfig(opts ...Option) *Config { type Option func(*Config) -// WithServiceName sets the given service name for the returned router. -func WithServiceName(name string) Option { +// WithService sets the given service name for the returned router. +func WithService(name string) Option { return func(cfg *Config) { cfg.serviceName = name } } // WithSpanOptions applies the given set of options to the span started by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) Option { return func(cfg *Config) { cfg.spanOpts = opts } @@ -91,8 +86,7 @@ func WithAnalyticsRate(rate float64) Option { // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) return func(cfg *Config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } diff --git a/contrib/julienschmidt/httprouter/internal/tracing/tracing.go b/contrib/julienschmidt/httprouter/internal/tracing/tracing.go index 26d46b1e79..af2aabe01e 100644 --- a/contrib/julienschmidt/httprouter/internal/tracing/tracing.go +++ b/contrib/julienschmidt/httprouter/internal/tracing/tracing.go @@ -9,17 +9,17 @@ import ( "net/http" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" ) +var instr *instrumentation.Instrumentation + const componentName = "julienschmidt/httprouter" func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/julienschmidt/httprouter") + instr = instrumentation.Load(instrumentation.PackageJulienschmidtHTTPRouter) } type Router interface { @@ -48,14 +48,16 @@ func BeforeHandle[T any, WT Router]( } resource := req.Method + " " + route - spanOpts := options.Copy(cfg.spanOpts...) // spanOpts must be a copy of r.config.spanOpts, locally scoped, to avoid races. + spanOpts := make([]tracer.StartSpanOption, len(cfg.spanOpts)) + copy(spanOpts, cfg.spanOpts) // spanOpts must be a copy of r.config.spanOpts, locally scoped, to avoid races. spanOpts = append(spanOpts, httptrace.HeaderTagsFromRequest(req, cfg.headerTags)) serveCfg := &httptrace.ServeConfig{ - Service: cfg.serviceName, - Resource: resource, - SpanOpts: spanOpts, - Route: route, + Framework: "github.com/julienschmidt/httprouter", + Service: cfg.serviceName, + Resource: resource, + SpanOpts: spanOpts, + Route: route, } return httptrace.BeforeHandle(serveCfg, w, req) } diff --git a/contrib/julienschmidt/httprouter/option.go b/contrib/julienschmidt/httprouter/option.go index 295a7705c2..df5bffd24c 100644 --- a/contrib/julienschmidt/httprouter/option.go +++ b/contrib/julienschmidt/httprouter/option.go @@ -6,25 +6,14 @@ package httprouter import ( - "gopkg.in/DataDog/dd-trace-go.v1/contrib/julienschmidt/httprouter/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2/internal/tracing" ) -const defaultServiceName = "http.router" - -type routerConfig struct { - serviceName string - spanOpts []ddtrace.StartSpanOption - analyticsRate float64 - headerTags *internal.LockMap -} - // RouterOption represents an option that can be passed to New. type RouterOption = tracing.Option -// WithServiceName sets the given service name for the returned router. -var WithServiceName = tracing.WithServiceName +// WithService sets the given service name for the returned router. +var WithService = tracing.WithService // WithSpanOptions applies the given set of options to the span started by the router. var WithSpanOptions = tracing.WithSpanOptions diff --git a/contrib/julienschmidt/httprouter/orchestrion.yml b/contrib/julienschmidt/httprouter/orchestrion.yml new file mode 100644 index 0000000000..4c1e5c9078 --- /dev/null +++ b/contrib/julienschmidt/httprouter/orchestrion.yml @@ -0,0 +1,88 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 + description: A high performance HTTP request router that scales well. + +aspects: + - id: Router.__dd_config + join-point: + struct-definition: github.com/julienschmidt/httprouter.Router + advice: + - inject-declarations: + imports: + tracing: "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2/internal/tracing" + lang: go1.18 + template: |- + type __dd_wRouter struct { + *Router + } + + func __dd_wrapRouter(r *Router) tracing.Router { + return &__dd_wRouter{r} + } + + func (w __dd_wRouter) Lookup(method string, path string) (any, []tracing.Param, bool) { + h, params, ok := w.Router.Lookup(method, path) + return h, __dd_wrapParams(params), ok + } + + type __dd_wParam struct { + Param + } + + func __dd_wrapParams(params Params) []tracing.Param { + wParams := make([]tracing.Param, len(params)) + for i, p := range params { + wParams[i] = __dd_wParam{p} + } + return wParams + } + + func (w __dd_wParam) GetKey() string { + return w.Key + } + + func (w __dd_wParam) GetValue() string { + return w.Value + } + + func __dd_init(r *Router) { + if r.__dd_config != nil { + return + } + r.__dd_config = tracing.NewConfig() + return + } + + - add-struct-field: + name: __dd_config + type: "*github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2/internal/tracing.Config" + + - id: Router.ServeHTTP + join-point: + function-body: + function: + - receiver: "*github.com/julienschmidt/httprouter.Router" + - name: ServeHTTP + advice: + - prepend-statements: + imports: + tracing: "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2/internal/tracing" + template: |- + {{- $r := .Function.Receiver -}} + {{- $w := .Function.Argument 0 -}} + {{- $req := .Function.Argument 1 -}} + __dd_init({{ $r }}) + + tw, treq, afterHandle, handled := tracing.BeforeHandle({{ $r }}.__dd_config, {{ $r }}, __dd_wrapRouter, {{ $w }}, {{ $req }}) + {{ $w }} = tw + {{ $req }} = treq + defer afterHandle() + if handled { + return + } diff --git a/contrib/k8s.io/client-go/go.mod b/contrib/k8s.io/client-go/go.mod new file mode 100644 index 0000000000..2cb9b21c84 --- /dev/null +++ b/contrib/k8s.io/client-go/go.mod @@ -0,0 +1,124 @@ +module github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + k8s.io/apimachinery v0.32.3 + k8s.io/client-go v0.31.4 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/onsi/ginkgo/v2 v2.22.1 // indirect + github.com/onsi/gomega v1.36.2 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.31.4 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/k8s.io/client-go/go.sum b/contrib/k8s.io/client-go/go.sum new file mode 100644 index 0000000000..86df32f4a1 --- /dev/null +++ b/contrib/k8s.io/client-go/go.sum @@ -0,0 +1,373 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM= +github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.31.4 h1:I2QNzitPVsPeLQvexMEsj945QumYraqv9m74isPDKhM= +k8s.io/api v0.31.4/go.mod h1:d+7vgXLvmcdT1BCo79VEgJxHHryww3V5np2OYTr6jdw= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.31.4 h1:t4QEXt4jgHIkKKlx06+W3+1JOwAFU/2OPiOo7H92eRQ= +k8s.io/client-go v0.31.4/go.mod h1:kvuMro4sFYIa8sulL5Gi5GFqUPvfH2O/dXuKstbaaeg= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/contrib/k8s.io/client-go/kubernetes/example_test.go b/contrib/k8s.io/client-go/kubernetes/example_test.go index 6ad26c51d9..3d9fefad24 100644 --- a/contrib/k8s.io/client-go/kubernetes/example_test.go +++ b/contrib/k8s.io/client-go/kubernetes/example_test.go @@ -9,7 +9,8 @@ import ( "context" "fmt" - kubernetestrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/k8s.io/client-go/kubernetes" + kubernetestrace "github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2/kubernetes" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -18,6 +19,9 @@ import ( ) func Example() { + tracer.Start() + defer tracer.Stop() + cfg, err := rest.InClusterConfig() if err != nil { panic(err.Error()) diff --git a/contrib/k8s.io/client-go/kubernetes/kubernetes.go b/contrib/k8s.io/client-go/kubernetes/kubernetes.go index 4b9fc7570c..4226b0a459 100644 --- a/contrib/k8s.io/client-go/kubernetes/kubernetes.go +++ b/contrib/k8s.io/client-go/kubernetes/kubernetes.go @@ -4,26 +4,24 @@ // Copyright 2016 Datadog, Inc. // Package kubernetes provides functions to trace k8s.io/client-go (https://github.com/kubernetes/client-go). -package kubernetes // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/k8s.io/client-go/kubernetes" +package kubernetes // import "github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2/kubernetes" import ( "net/http" - "strconv" "strings" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) +var instr *instrumentation.Instrumentation + const componentName = "k8s.io/client-go/kubernetes" func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageK8SClientGo) } const ( @@ -50,20 +48,19 @@ func WrapRoundTripper(rt http.RoundTripper) http.RoundTripper { func wrapRoundTripperWithOptions(rt http.RoundTripper, opts ...httptrace.RoundTripperOption) http.RoundTripper { localOpts := make([]httptrace.RoundTripperOption, len(opts)) copy(localOpts, opts) // make a copy of the opts, to avoid data races and side effects. - localOpts = append(localOpts, httptrace.WithBefore(func(req *http.Request, span ddtrace.Span) { + localOpts = append(localOpts, httptrace.WithBefore(func(req *http.Request, span *tracer.Span) { span.SetTag(ext.ResourceName, RequestToResource(req.Method, req.URL.Path)) span.SetTag(ext.Component, componentName) span.SetTag(ext.SpanKind, ext.SpanKindClient) traceID := span.Context().TraceID() - if traceID == 0 { + if traceID == tracer.TraceIDZero { // tracer is not running return } - kubeAuditID := strconv.FormatUint(traceID, 10) - req.Header.Set("Audit-Id", kubeAuditID) - span.SetTag("kubernetes.audit_id", kubeAuditID) + req.Header.Set("Audit-Id", traceID) + span.SetTag("kubernetes.audit_id", traceID) })) - log.Debug("contrib/k8s.io/client-go/kubernetes: Wrapping RoundTripper.") + instr.Logger().Debug("contrib/k8s.io/client-go/kubernetes: Wrapping RoundTripper.") return httptrace.WrapRoundTripper(rt, localOpts...) } diff --git a/contrib/k8s.io/client-go/kubernetes/kubernetes_test.go b/contrib/k8s.io/client-go/kubernetes/kubernetes_test.go index 706dc80d3f..931e3c6a5b 100644 --- a/contrib/k8s.io/client-go/kubernetes/kubernetes_test.go +++ b/contrib/k8s.io/client-go/kubernetes/kubernetes_test.go @@ -11,10 +11,10 @@ import ( "net/http/httptest" "testing" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -60,7 +60,7 @@ func TestKubernetes(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World")) })) defer s.Close() @@ -89,13 +89,14 @@ func TestKubernetes(t *testing.T) { assert.True(t, ok) assert.True(t, len(auditID) > 0) assert.Equal(t, "k8s.io/client-go/kubernetes", span.Tag(ext.Component)) + assert.Equal(t, componentName, span.Integration()) assert.Equal(t, ext.SpanKindClient, span.Tag(ext.SpanKind)) } } func TestAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...httptrace.RoundTripperOption) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World")) })) defer srv.Close() @@ -128,9 +129,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -139,24 +138,22 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, 1.0, httptrace.RTWithAnalytics(true)) + assertRate(t, mt, 1.0, httptrace.WithAnalytics(true)) }) t.Run("disabled", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, nil, httptrace.RTWithAnalytics(false)) + assertRate(t, mt, nil, httptrace.WithAnalytics(false)) }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) - assertRate(t, mt, 0.23, httptrace.RTWithAnalyticsRate(0.23)) + assertRate(t, mt, 0.23, httptrace.WithAnalyticsRate(0.23)) }) } diff --git a/contrib/k8s.io/client-go/kubernetes/orchestrion.go b/contrib/k8s.io/client-go/kubernetes/orchestrion.go new file mode 100644 index 0000000000..8ffbfcaf15 --- /dev/null +++ b/contrib/k8s.io/client-go/kubernetes/orchestrion.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +//go:build tools + +package kubernetes // import "github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2/kubernetes" + +// This package is imported by code injected by `orchestrion.tool.go` but is otherwise not part of +// the dependency closure of the package. This ensures the `go mod tidy` closure contains everything +// that is necessary. +import _ "k8s.io/client-go/transport" diff --git a/contrib/k8s.io/client-go/kubernetes/orchestrion.yml b/contrib/k8s.io/client-go/kubernetes/orchestrion.yml new file mode 100644 index 0000000000..9a9c37a6aa --- /dev/null +++ b/contrib/k8s.io/client-go/kubernetes/orchestrion.yml @@ -0,0 +1,35 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2/kubernetes + description: Go client for Kubernetes. + +aspects: + - id: rest.Config + join-point: + struct-literal: + type: k8s.io/client-go/rest.Config + advice: + - wrap-expression: + imports: + kubernetestrace: github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2/kubernetes + kubernetestransport: k8s.io/client-go/transport + template: |- + {{- .AST.Type -}}{ + {{- $hasField := false -}} + {{ range .AST.Elts }} + {{- if eq .Key.Name "WrapTransport" }} + {{- $hasField = true -}} + WrapTransport: kubernetestransport.Wrappers({{ .Value }}, kubernetestrace.WrapRoundTripper), + {{- else -}} + {{ . }}, + {{ end -}} + {{ end }} + {{- if not $hasField -}} + WrapTransport: kubernetestransport.Wrappers(nil, kubernetestrace.WrapRoundTripper), + {{- end }} + } diff --git a/contrib/k8s.io/gateway-api/README.md b/contrib/k8s.io/gateway-api/README.md new file mode 100644 index 0000000000..436c00452c --- /dev/null +++ b/contrib/k8s.io/gateway-api/README.md @@ -0,0 +1,78 @@ +# Appsec Gateway API Request Mirror + +This document provides a detailed guide for implementing the **Datadog AppSec Gateway API Request Mirror** feature using +the `RequestMirror` functionality of Kubernetes Gateway APIs and Datadog's `dd-trace-go`. The goal is to mirror incoming +HTTP requests to a secondary endpoint for security analysis without affecting the primary request flow. + +## Overview + +The **Datadog AppSec Gateway API Request Mirror** is designed to enhance application security by mirroring incoming HTTP +requests to a Datadog Application Security Monitoring (ASM) endpoint. This allows real-time detection and analysis of +potential application-level attacks, such as: + +- Cross-Site Scripting (XSS) +- SQL Injection (SQLi) +- Server-Side Request Forgery (SSRF) + +This feature leverages the **RequestMirror** functionality in Kubernetes Gateway APIs to duplicate traffic to a +secondary server where Datadog's request mirror deployment processes the requests. + +## Prerequisites + +- A Kubernetes cluster with Gateway API CRDs installed (instructions can be + found [here](https://gateway-api.sigs.k8s.io/guides/#installing-gateway-api)). +- A controller compatible with the Gateway API (list of supported controllers can be + found [here](https://gateway-api.sigs.k8s.io/implementations)). +- [Go](https://go.dev/doc/install) 1.24+ installed on your local machine. + +## Installation + +1. [Deploy the Datadog agent in your Kubernetes cluster](https://docs.datadoghq.com/containers/kubernetes/installation/) + +2. [Configure the Datadog agent to support incoming Appsec payloads](https://docs.datadoghq.com/tracing/guide/setting_up_apm_with_kubernetes_service/) + +3. + +4. Deploy the Appsec Gateway API Request Mirror in the namespace of your choice (e.g., `datadog`) along with its + service: + + ```bash + kubectl apply -f https://raw.githubusercontent.com/DataDog/dd-trace-go/refs/heads/main/contrib/k8s.io/gateway-api/cmd/request-mirror/deployment.yml + ``` + +4. Verify the deployment: + + ```bash + kubectl get pods -l app=request-mirror + ``` + +5. Patch your `Gateway` resources so they allow access to the namespace with the deployment (use `-help` flag for + options). + + ```bash + git clone https://github.com/DataDog/dd-trace-go.git + cd dd-trace-go + go run ./contrib/k8s.io/gateway-api/cmd/patch-gateways + ``` + +6. Patch your `HTTPRoute` resources to redirect traffic to the service. + This will add a [`RequestMirror`](https://gateway-api.sigs.k8s.io/guides/http-request-mirroring/) filter to all + `HTTPRoute` resources found in all namespace (use `-help` flag for options). Running this command regularly will + ensure that any new `HTTPRoute` resources created in the future will also have the `RequestMirror` + filter added. Adding the resulting patch to your CI/CD where HTTPRoute are modified is recommended in the long run. + + ```bash + go run ./contrib/k8s.io/gateway-api/cmd/patch-httproutes + ``` + +## Deployment Configuration + +The following environment variables are used to configure the Datadog AppSec Gateway API Request Mirror: + +| Environment Variable | Default Value | Description | +|--------------------------------------|---------------|----------------------------------------------------------------------------------------------------------------------------| +| `DD_REQUEST_MIRROR_LISTEN_ADDR` | `:8080` | Value passed in to [net/http.ListenAndServe](https://pkg.go.dev/net/http#ListenAndServe) to receive requests | +| `DD_REQUEST_MIRROR_HEALTHCHECK_ADDR` | `:8081` | Value passed in to [net/http.ListenAndServe](https://pkg.go.dev/net/http#ListenAndServe) to listen to healthcheck requests | + +By default, the request mirror traces won't enable the Datadog's APM product. It can be enabled using the env var +`DD_APM_TRACING_ENABLED=true` diff --git a/contrib/k8s.io/gateway-api/cmd/patch-gateways/main.go b/contrib/k8s.io/gateway-api/cmd/patch-gateways/main.go new file mode 100644 index 0000000000..4b2dc83606 --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/patch-gateways/main.go @@ -0,0 +1,232 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "bytes" + "context" + "encoding/json" + "flag" + "fmt" + "log" + "os" + "slices" + "strconv" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/utils/ptr" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" + "sigs.k8s.io/yaml" +) + +var ( + selector = flag.String("selector", "", "Label selector to filter Gateways") + prompt = flag.Bool("prompt", false, "Prompt before applying changes to each Gateway") + timeout = flag.Duration("timeout", time.Minute, "Timeout for the operation") + namespace = flag.String("namespace", "", "Namespace where the request-mirror is (defaults to current context)") +) + +var gvr = schema.GroupVersionResource{ + Group: "gateway.networking.k8s.io", + Version: "v1", + Resource: "gateways", +} + +func main() { + flag.Parse() + log := log.New(os.Stderr, "", 0) + + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(*timeout)) + defer cancel() + + // Load kubeconfig + kubeconfig := env.Get("KUBECONFIG") + if kubeconfig == "" { + kubeconfig = clientcmd.RecommendedHomeFile + } + + if *namespace == "" { + cfg, err := clientcmd.NewDefaultClientConfigLoadingRules().Load() + if err != nil { + log.Fatalf("Failed to load kubeconfig: %s", err.Error()) + } + + namespace = &cfg.Contexts[cfg.CurrentContext].Namespace + } + + config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) + if err != nil { + log.Fatalf("Failed to load kubeconfig: %s (Please set KUBECONFIG manually)", err.Error()) + } + + dynClient, err := dynamic.NewForConfig(config) + if err != nil { + log.Fatalf("Failed to create dynamic client: %s", err.Error()) + } + + log.Printf("Adding access to namespace %s to gateway.networking.k8s.io/v1/Gateway...\n", *namespace) + + // List all Gateways across all namespaces + gatewayList, err := dynClient.Resource(gvr).List(ctx, metav1.ListOptions{LabelSelector: *selector}) + if err != nil { + log.Fatalf("Failed to list Gateways: %s", err.Error()) + } + + for _, gw := range gatewayList.Items { + // Marshal and unmarshal to Gateway struct + data, err := json.Marshal(gw.Object) + if err != nil { + log.Printf("Failed to marshal Gateway %s/%s: %v", gw.GetNamespace(), gw.GetName(), err) + continue + } + + var gateway gatewayv1.Gateway + if err := yaml.Unmarshal(data, &gateway); err != nil { + log.Printf("Failed to unmarshal Gateway %s/%s: %v", gw.GetNamespace(), gw.GetName(), err) + continue + } + + if value, ok := gateway.Labels["admission.datadoghq.com/enabled"]; ok && value == "false" { + log.Printf("Skipping Gateway %s/%s due to admission label", gw.GetNamespace(), gw.GetName()) + continue + } + + // Flag to determine if patch is needed + needsPatch := false + + // Iterate over listeners + for i := range gateway.Spec.Listeners { + if mayPatchListener(gw.GetNamespace(), &gateway.Spec.Listeners[i]) { + needsPatch = true + } + } + + if !needsPatch { + fmt.Printf("No patch needed for Gateway %s/%s\n", gw.GetNamespace(), gw.GetName()) + continue + } + + // Prepare the patch + var output bytes.Buffer + encoder := json.NewEncoder(&output) + encoder.SetIndent("", " ") + if err := encoder.Encode(map[string]any{ + "spec": map[string]any{ + "listeners": gateway.Spec.Listeners, + }, + }); err != nil { + log.Printf("Failed to marshal patch for Gateway %s/%s: %v", gw.GetNamespace(), gw.GetName(), err) + continue + } + + patchData := output.Bytes() + + // Prompt the user if needed + if *prompt { + fmt.Printf("Found Gateway %s/%s that needs patching\n", gw.GetNamespace(), gw.GetName()) + fmt.Printf("Patch is as follows:\n") + fmt.Println(string(patchData)) + fmt.Printf("Patch Gateway %s/%s? (y/n): ", gw.GetNamespace(), gw.GetName()) + var response string + if _, err := fmt.Scanln(&response); err != nil { + log.Fatalf("Failed to read response: %s", err.Error()) + } + if resp, err := strconv.ParseBool(response); err != nil || !resp { + fmt.Printf("Skipping Gateway %s/%s\n", gw.GetNamespace(), gw.GetName()) + continue + } + } + + // Apply the patch + _, err = dynClient.Resource(gvr).Namespace(gw.GetNamespace()).Patch( + ctx, + gw.GetName(), + types.MergePatchType, + patchData, + metav1.PatchOptions{}, + ) + if err != nil { + log.Printf("Failed to patch Gateway %s/%s: %v", gw.GetNamespace(), gw.GetName(), err) + continue + } + + fmt.Printf("Patched Gateway %s/%s\n", gw.GetNamespace(), gw.GetName()) + } +} + +func mayPatchListener(gwNamespace string, listener *gatewayv1.Listener) bool { + nsFromPtr := listener.AllowedRoutes.Namespaces.From + + nsFrom := gatewayv1.NamespacesFromSame + if nsFromPtr != nil { + nsFrom = *nsFromPtr + } + + switch nsFrom { + case gatewayv1.NamespacesFromAll: + return false + case gatewayv1.NamespacesFromSame: + if gwNamespace == *namespace { + return false + } + + // Transform the selector to match the current namespace + listener.AllowedRoutes.Namespaces.From = ptr.To(gatewayv1.NamespacesFromSelector) + listener.AllowedRoutes.Namespaces.Selector = &metav1.LabelSelector{ + MatchExpressions: []metav1.LabelSelectorRequirement{ + { + Key: v1.LabelMetadataName, + Operator: metav1.LabelSelectorOpIn, + Values: []string{*namespace}, + }, + }, + } + fallthrough + case gatewayv1.NamespacesFromSelector: + if listener.AllowedRoutes.Namespaces.Selector.MatchLabels == nil { + listener.AllowedRoutes.Namespaces.Selector.MatchLabels = make(map[string]string) + } + + if listener.AllowedRoutes.Namespaces.Selector.MatchLabels[v1.LabelMetadataName] == *namespace { + return false + } + + // Add the current namespace to the selector + var preExistingMatcher *metav1.LabelSelectorRequirement + for j, expression := range listener.AllowedRoutes.Namespaces.Selector.MatchExpressions { + if expression.Key == v1.LabelMetadataName && expression.Operator == metav1.LabelSelectorOpIn { + preExistingMatcher = &listener.AllowedRoutes.Namespaces.Selector.MatchExpressions[j] + if slices.Contains(expression.Values, *namespace) { + return false + } + } + } + + if preExistingMatcher != nil { + preExistingMatcher.Values = append(preExistingMatcher.Values, *namespace) + return true + } + + listener.AllowedRoutes.Namespaces.Selector.MatchExpressions = append(listener.AllowedRoutes.Namespaces.Selector.MatchExpressions, metav1.LabelSelectorRequirement{ + Key: v1.LabelMetadataName, + Operator: metav1.LabelSelectorOpIn, + Values: []string{*namespace}, + }) + + return true + default: + log.Fatalf("Unknown namespace selector: %s", nsFrom) + } + + return false +} diff --git a/contrib/k8s.io/gateway-api/cmd/patch-httproutes/main.go b/contrib/k8s.io/gateway-api/cmd/patch-httproutes/main.go new file mode 100644 index 0000000000..719c1ea1a5 --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/patch-httproutes/main.go @@ -0,0 +1,214 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "bytes" + "context" + "encoding/json" + "flag" + "fmt" + "log" + "os" + "slices" + "strconv" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/tools/clientcmd" + "k8s.io/utils/ptr" + gatewayv1 "sigs.k8s.io/gateway-api/apis/v1" + "sigs.k8s.io/yaml" +) + +var ( + selector = flag.String("selector", "", "Label selector to filter HTTPRoute") + prompt = flag.Bool("prompt", false, "Prompt before applying changes to each HTTPRoute") + timeout = flag.Duration("timeout", 1*time.Minute, "Timeout for the operation") + service = flag.String("service", "request-mirror", "Service name to mirror requests to") + port = flag.Int("port", 8080, "Service port to mirror requests to") + namespace = flag.String("namespace", "", "Namespace where the request-mirror is (defaults to current context)") +) + +var gvr = schema.GroupVersionResource{ + Group: "gateway.networking.k8s.io", + Version: "v1", + Resource: "httproutes", +} + +func main() { + flag.Parse() + log := log.New(os.Stderr, "", 0) + + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(*timeout)) + defer cancel() + + // Load kubeconfig + kubeconfig := env.Get("KUBECONFIG") + if kubeconfig == "" { + kubeconfig = clientcmd.RecommendedHomeFile + } + + if *namespace == "" { + cfg, err := clientcmd.NewDefaultClientConfigLoadingRules().Load() + if err != nil { + log.Fatalf("Failed to load kubeconfig: %s", err.Error()) + } + + namespace = &cfg.Contexts[cfg.CurrentContext].Namespace + } + + config, err := clientcmd.BuildConfigFromFlags("", kubeconfig) + if err != nil { + log.Fatalf("Failed to load kubeconfig: %s", err.Error()) + } + + // Create dynamic client + dynClient, err := dynamic.NewForConfig(config) + if err != nil { + log.Fatalf("Failed to create dynamic client: %s", err.Error()) + } + + log.Println("Listing gateway.networking.k8s.io/v1/HTTPRoute...") + + // List all HTTPRoute across all namespaces + routes, err := dynClient.Resource(gvr).List(ctx, metav1.ListOptions{ + LabelSelector: *selector, + }) + if err != nil { + log.Fatalf("Failed to list HTTPRoutes: %s", err.Error()) + } + + for _, rawRoute := range routes.Items { + route, err := parseRoute(rawRoute.Object) + if err != nil { + log.Fatalf("Failed to parse HTTPRoute %s/%s: %v\n", rawRoute.GetNamespace(), rawRoute.GetName(), err) + } + + if !mayModifyRoute(route) { + log.Printf("No patch needed for HTTPRoute %s/%s\n", route.Namespace, route.Name) + continue + } + + // Prepare the patch + var output bytes.Buffer + encoder := json.NewEncoder(&output) + encoder.SetIndent("", " ") + if err := encoder.Encode(map[string]any{ + "spec": map[string]any{ + "rules": route.Spec.Rules, + }, + }); err != nil { + log.Printf("Failed to marshal patch for HTTPRoute %s/%s: %v\n", route.Namespace, route.Name, err) + continue + } + + patchData := output.Bytes() + + // Prompt the user if needed + if *prompt && !promptUser(route, patchData) { + log.Printf("Skipping HTTPRoute %s/%s\n", route.Namespace, route.Name) + continue + } + + // Apply the patch + _, err = dynClient.Resource(gvr).Namespace(route.Namespace).Patch( + ctx, + route.Name, + types.MergePatchType, + patchData, + metav1.PatchOptions{}, + ) + if err != nil { + log.Printf("Failed to patch HTTPRoute %s/%s: %v\n", route.Namespace, route.Name, err) + continue + } + + fmt.Printf("Patched HTTPRoute %s/%s\n", route.Namespace, route.Name) + } +} + +func parseRoute(raw map[string]any) (*gatewayv1.HTTPRoute, error) { + data, err := json.Marshal(raw) + if err != nil { + return nil, err + } + + var route gatewayv1.HTTPRoute + if err := yaml.Unmarshal(data, &route); err != nil { + return nil, err + } + + return &route, nil +} + +func mayModifyRoute(route *gatewayv1.HTTPRoute) bool { + if value, ok := route.Labels["admission.datadoghq.com/enabled"]; ok && value == "false" { + log.Printf("skipping HTTPRoute %s/%s due to label admission.datadoghq.com/enabled=false", route.Namespace, route.Name) + return false + } + + // Flag to determine if patch is needed + needsPatch := false + + // Iterate over Rules + for i, rule := range route.Spec.Rules { + newFilter := gatewayv1.HTTPRouteFilter{ + Type: gatewayv1.HTTPRouteFilterRequestMirror, + RequestMirror: &gatewayv1.HTTPRequestMirrorFilter{ + BackendRef: gatewayv1.BackendObjectReference{ + Name: gatewayv1.ObjectName(*service), + Port: ptr.To(gatewayv1.PortNumber(*port)), + }, + }, + } + + if route.Namespace != *namespace { + newFilter.RequestMirror.BackendRef.Namespace = ptr.To(gatewayv1.Namespace(*namespace)) + } + + if slices.ContainsFunc(rule.Filters, func(filter gatewayv1.HTTPRouteFilter) bool { + return alreadyContainsOurFilter(newFilter.RequestMirror.BackendRef, filter) + }) { + continue + } + + needsPatch = true + // Add the filter + route.Spec.Rules[i].Filters = append(route.Spec.Rules[i].Filters, newFilter) + } + + return needsPatch +} + +func promptUser(route *gatewayv1.HTTPRoute, patchData []byte) bool { + fmt.Printf("Found HTTPRoute %s/%s that needs patching\n", route.Namespace, route.Name) + fmt.Printf("Patch is as follows:\n") + fmt.Println(string(patchData)) + fmt.Printf("Patch HTTPRoute %s/%s? (y/n): ", route.Namespace, route.Name) + var response string + if _, err := fmt.Scanln(&response); err != nil { + log.Fatalf("Failed to read response: %s", err.Error()) + } + if resp, err := strconv.ParseBool(response); err != nil || !resp { + return false + } + + return true +} + +// alreadyContainsOurFilter checks if the filter already exists in the [gatewayv1.HTTPRouteFilters] list. +func alreadyContainsOurFilter(newBackend gatewayv1.BackendObjectReference, filter gatewayv1.HTTPRouteFilter) bool { + return filter.Type == gatewayv1.HTTPRouteFilterRequestMirror && + filter.RequestMirror != nil && + filter.RequestMirror.BackendRef.Name == newBackend.Name && + filter.RequestMirror.BackendRef.Namespace != nil && *filter.RequestMirror.BackendRef.Namespace == *newBackend.Namespace && + filter.RequestMirror.BackendRef.Port != nil && *filter.RequestMirror.BackendRef.Port == *newBackend.Port +} diff --git a/contrib/k8s.io/gateway-api/cmd/request-mirror/Dockerfile b/contrib/k8s.io/gateway-api/cmd/request-mirror/Dockerfile new file mode 100644 index 0000000000..7133b93b00 --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/request-mirror/Dockerfile @@ -0,0 +1,36 @@ +# Build stage +FROM golang:1.24-alpine AS builder +ENV CGO_ENABLED=1 + +RUN apk add --no-cache --update git build-base +RUN --mount=type=bind,src=.,dst=/build go -C /build build -tags=appsec -o /request-mirror /build/contrib/k8s.io/gateway-api/cmd/request-mirror + +# Runtime stage +FROM alpine:3.20.3 + +# Set opencontainers labels for Github container registry +LABEL org.opencontainers.image.source=https://github.com/DataDog/dd-trace-go/tree/main/contrib/k8s.io/gateway-api/ +LABEL org.opencontainers.image.description="A request mirror for the Kubernetes Gateway API with Datadog App & API Protection support" +LABEL org.opencontainers.image.licenses=Apache-2.0 + +ARG COMMIT_SHA="" +LABEL org.opencontainers.image.revision=${COMMIT_SHA} + +RUN apk --no-cache add ca-certificates tzdata libc6-compat libgcc libstdc++ +WORKDIR /app + +COPY --from=builder /request-mirror /app/request-mirror + +ENV DD_APPSEC_ENABLED=true \ + DD_APPSEC_WAF_TIMEOUT=10ms \ + _DD_APPSEC_BLOCKING_UNAVAILABLE=true \ + DD_SERVICE=request-mirror \ + DD_APM_TRACING_ENABLED=false \ + DD_TRACE_GIT_METADATA_ENABLED=false + +EXPOSE 8080 + +# Healthcheck port +EXPOSE 8081 + +CMD ["/app/request-mirror"] diff --git a/contrib/k8s.io/gateway-api/cmd/request-mirror/deployment.yml b/contrib/k8s.io/gateway-api/cmd/request-mirror/deployment.yml new file mode 100644 index 0000000000..297fe0ae16 --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/request-mirror/deployment.yml @@ -0,0 +1,51 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: request-mirror + labels: + app.kubernetes.io/component: request-mirror + app.kubernetes.io/name: datadog +spec: + strategy: + type: RollingUpdate + selector: + matchLabels: + app: request-mirror + template: + metadata: + labels: + app: request-mirror + app.kubernetes.io/component: request-mirror + app.kubernetes.io/name: datadog + spec: + containers: + - name: request-mirror + image: ghcr.io/datadog/dd-trace-go/request-mirror:latest + ports: + - containerPort: 8080 + name: http + livenessProbe: + httpGet: + path: / + port: 8081 + scheme: HTTP + readinessProbe: + httpGet: + path: / + port: 8081 + scheme: HTTP +--- +apiVersion: v1 +kind: Service +metadata: + name: request-mirror + labels: + app.kubernetes.io/component: request-mirror + app.kubernetes.io/name: datadog +spec: + selector: + app: request-mirror + ports: + - name: http + port: 8080 + targetPort: 8080 diff --git a/contrib/k8s.io/gateway-api/cmd/request-mirror/example.yml b/contrib/k8s.io/gateway-api/cmd/request-mirror/example.yml new file mode 100644 index 0000000000..a6f23a955e --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/request-mirror/example.yml @@ -0,0 +1,13 @@ +apiVersion: gateway.networking.k8s.io/v1 +kind: HTTPRoute +metadata: + name: http-filter-mirror +spec: + parentRefs: + - name: mirror-gateway + hostnames: + - mirror.example + rules: + - backendRefs: + - name: foo-v1 + port: 8080 diff --git a/contrib/k8s.io/gateway-api/cmd/request-mirror/main.go b/contrib/k8s.io/gateway-api/cmd/request-mirror/main.go new file mode 100644 index 0000000000..94d32384eb --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/request-mirror/main.go @@ -0,0 +1,96 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "net/http" + "os" + + gatewayapi "github.com/DataDog/dd-trace-go/contrib/k8s.io/gateway-api/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" +) + +var ( + instr = instrumentation.Load(instrumentation.PackageK8SGatewayAPI) + logger = instr.Logger() +) + +type Config struct { + ListenAddr string + HealthCheckAddr string +} + +func getConfig() Config { + cfg := Config{ + ListenAddr: env.Get("DD_REQUEST_MIRROR_LISTEN_ADDR"), + HealthCheckAddr: env.Get("DD_REQUEST_MIRROR_HEALTHCHECK_ADDR"), + } + + if cfg.ListenAddr == "" { + cfg.ListenAddr = ":8080" + } + + if cfg.HealthCheckAddr == "" { + cfg.HealthCheckAddr = ":8081" + } + + return cfg +} + +func main() { + config := getConfig() + + if err := tracer.Start(tracer.WithServiceVersion(instrumentation.Version())); err != nil { + logger.Error("Failed to start tracer: %s", err.Error()) + os.Exit(1) + } + + defer tracer.Stop() + + if !instr.AppSecEnabled() { + logger.Error("Failed to enable appsec, stopping the server") + os.Exit(1) + } + + mux := http.NewServeMux() + mux.Handle("/", gatewayapi.HTTPRequestMirrorHandler(gatewayapi.Config{ + ServeConfig: httptrace.ServeConfig{ + Framework: "k8s.io/gateway-api", + FinishOpts: []tracer.FinishOption{ + tracer.NoDebugStack(), + }, + SpanOpts: []tracer.StartSpanOption{ + tracer.Tag(ext.SpanKind, ext.SpanKindServer), + tracer.Tag(ext.Component, "k8s.io/gateway-api"), + }, + }, + })) + + go func() { + healthcheckMux := http.NewServeMux() + healthcheckMux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"status": "ok"}`)) + }) + + logger.Info("Starting request mirror health check server on address: %q", config.HealthCheckAddr) + if err := http.ListenAndServe(config.HealthCheckAddr, healthcheckMux); err != nil { + logger.Error("Failed to start health check server", "error", err) + os.Exit(1) + } + }() + + logger.Info("Main request mirror server starting on address: %q", config.ListenAddr) + if err := http.ListenAndServe(config.ListenAddr, mux); err != nil { + logger.Error("Failed to start server", "error", err) + os.Exit(1) + } +} diff --git a/contrib/k8s.io/gateway-api/cmd/request-mirror/main_test.go b/contrib/k8s.io/gateway-api/cmd/request-mirror/main_test.go new file mode 100644 index 0000000000..723ab03172 --- /dev/null +++ b/contrib/k8s.io/gateway-api/cmd/request-mirror/main_test.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_getConfig(t *testing.T) { + tests := []struct { + name string + env map[string]string + want Config + }{ + { + name: "No env", + env: map[string]string{}, + want: Config{ + ListenAddr: ":8080", + HealthCheckAddr: ":8081", + }, + }, + { + name: "All env", + env: map[string]string{ + "DD_REQUEST_MIRROR_LISTEN_ADDR": ":8888", + "DD_REQUEST_MIRROR_HEALTHCHECK_ADDR": ":8181", + }, + want: Config{ + ListenAddr: ":8888", + HealthCheckAddr: ":8181", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for k, v := range tt.env { + t.Setenv(k, v) + } + + got := getConfig() + require.EqualValues(t, tt.want, got) + }) + } +} diff --git a/contrib/k8s.io/gateway-api/example_test.go b/contrib/k8s.io/gateway-api/example_test.go new file mode 100644 index 0000000000..917d05ea62 --- /dev/null +++ b/contrib/k8s.io/gateway-api/example_test.go @@ -0,0 +1,21 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package gatewayapi_test + +import ( + "net/http" + + gatewayapi "github.com/DataDog/dd-trace-go/contrib/k8s.io/gateway-api/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func Example() { + tracer.Start() + defer tracer.Stop() + + http.Handle("/", gatewayapi.HTTPRequestMirrorHandler(gatewayapi.Config{})) + http.ListenAndServe(":8080", nil) +} diff --git a/contrib/k8s.io/gateway-api/go.mod b/contrib/k8s.io/gateway-api/go.mod new file mode 100644 index 0000000000..f6524fc37c --- /dev/null +++ b/contrib/k8s.io/gateway-api/go.mod @@ -0,0 +1,111 @@ +module github.com/DataDog/dd-trace-go/contrib/k8s.io/gateway-api/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + k8s.io/api v0.31.4 + k8s.io/apimachinery v0.32.3 + k8s.io/client-go v0.31.4 + k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 + sigs.k8s.io/gateway-api v1.2.1 + sigs.k8s.io/yaml v1.6.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/spf13/pflag v1.0.6 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.7.0 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/k8s.io/gateway-api/go.sum b/contrib/k8s.io/gateway-api/go.sum new file mode 100644 index 0000000000..f07b48bbb1 --- /dev/null +++ b/contrib/k8s.io/gateway-api/go.sum @@ -0,0 +1,362 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/emicklei/go-restful/v3 v3.12.0 h1:y2DdzBAURM29NFF94q6RaY4vjIH1rtwDapwQtU84iWk= +github.com/emicklei/go-restful/v3 v3.12.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.31.4 h1:I2QNzitPVsPeLQvexMEsj945QumYraqv9m74isPDKhM= +k8s.io/api v0.31.4/go.mod h1:d+7vgXLvmcdT1BCo79VEgJxHHryww3V5np2OYTr6jdw= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/client-go v0.31.4 h1:t4QEXt4jgHIkKKlx06+W3+1JOwAFU/2OPiOo7H92eRQ= +k8s.io/client-go v0.31.4/go.mod h1:kvuMro4sFYIa8sulL5Gi5GFqUPvfH2O/dXuKstbaaeg= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= +k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/gateway-api v1.2.1 h1:fZZ/+RyRb+Y5tGkwxFKuYuSRQHu9dZtbjenblleOLHM= +sigs.k8s.io/gateway-api v1.2.1/go.mod h1:EpNfEXNjiYfUJypf0eZ0P5iXA9ekSGWaS1WgPaM42X0= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.7.0 h1:qPeWmscJcXP0snki5IYF79Z8xrl8ETFxgMd7wez1XkI= +sigs.k8s.io/structured-merge-diff/v4 v4.7.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/contrib/k8s.io/gateway-api/processor_types.go b/contrib/k8s.io/gateway-api/processor_types.go new file mode 100644 index 0000000000..f81cbbd5e0 --- /dev/null +++ b/contrib/k8s.io/gateway-api/processor_types.go @@ -0,0 +1,66 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package gatewayapi + +import ( + "context" + "net/http" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" +) + +var _ proxy.RequestHeaders = (*requestHeader)(nil) + +type requestHeader struct { + *http.Request + spanOptions []tracer.StartSpanOption +} + +func (r requestHeader) GetEndOfStream() bool { + return r.Request.Body == http.NoBody || r.Request.ContentLength == 0 || r.Request.Body == nil +} + +func (r requestHeader) MessageType() proxy.MessageType { + return proxy.MessageTypeRequestHeaders +} + +func (r requestHeader) ExtractRequest(_ context.Context) (proxy.PseudoRequest, error) { + return proxy.PseudoRequest{ + Method: r.Method, + Headers: r.Header, + Scheme: r.URL.Scheme, + Path: r.URL.Path, + RemoteAddr: r.RemoteAddr, + Authority: r.URL.Host, + }, nil +} + +func (r requestHeader) SpanOptions(_ context.Context) []tracer.StartSpanOption { + return r.spanOptions +} + +func (r requestHeader) BodyParsingSizeLimit(_ context.Context) int { + return proxy.DefaultBodyParsingSizeLimit +} + +var _ proxy.HTTPBody = (*requestBody)(nil) + +type requestBody struct { + body []byte +} + +func (r requestBody) GetEndOfStream() bool { + return true +} + +func (r requestBody) MessageType() proxy.MessageType { + return proxy.MessageTypeRequestBody +} + +func (r requestBody) GetBody() []byte { + return r.body +} diff --git a/contrib/k8s.io/gateway-api/request-mirror.go b/contrib/k8s.io/gateway-api/request-mirror.go new file mode 100644 index 0000000000..1bd71aa558 --- /dev/null +++ b/contrib/k8s.io/gateway-api/request-mirror.go @@ -0,0 +1,110 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package gatewayapi + +import ( + "context" + "fmt" + "io" + "net" + "net/http" + "strings" + "sync" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/proxy" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + + "k8s.io/utils/ptr" +) + +const ( + framework = "k8s.io/gateway-api" +) + +var ( + instr = instrumentation.Load(instrumentation.PackageK8SGatewayAPI) + logger = instr.Logger() + + firstRequest sync.Once +) + +// Config holds the configuration for the request mirror server. +type Config struct { + httptrace.ServeConfig + // Hijack is a flag to indicate if the server should hijack the connection and close it before sending a response to the client. + // This is useful to reduce the number of open connections and avoid sending a response that will be ignored anyway. + Hijack *bool +} + +// HTTPRequestMirrorHandler is the handler for the request mirror server. +// It is made to receive requests from proxies supporting the request mirror feature from the k8s gateway API specification. +// It will parse the request body and send it to the WAF for analysis. +// The resulting [http.Handler] should not to be registered with the [httptrace.ServeMux] but instead with a standard [http.ServeMux]. +func HTTPRequestMirrorHandler(config Config) http.Handler { + if config.ServeConfig.SpanOpts == nil { + config.ServeConfig.SpanOpts = []tracer.StartSpanOption{ + tracer.Tag(ext.SpanKind, ext.SpanKindServer), + tracer.Tag(ext.Component, "k8s.io/gateway-api"), + } + } + + if config.Hijack == nil { + config.Hijack = ptr.To[bool](true) + } + + bodyProcessingMaxBytes := proxy.DefaultBodyParsingSizeLimit + processor := proxy.NewProcessor(proxy.ProcessorConfig{ + Context: context.Background(), + BlockingUnavailable: true, + BodyParsingSizeLimit: &bodyProcessingMaxBytes, + Framework: framework, + ContinueMessageFunc: func(_ context.Context, _ proxy.ContinueActionOptions) error { return nil }, + BlockMessageFunc: func(_ context.Context, _ proxy.BlockActionOptions) error { return nil }, + }, instr) + + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if config.Hijack != nil && *config.Hijack { + defer hijackConnection(w).Close() + } + + if strings.HasSuffix(r.Host, "-shadow") && r.Header.Get("X-Envoy-Internal") != "" { + // Remove the -shadow suffix from the host when envoy is the one sending the request + r.Host = strings.TrimSuffix(r.Host, "-shadow") + } + + reqState, err := processor.OnRequestHeaders(r.Context(), requestHeader{r, config.SpanOpts}) + if err != nil { + logger.Error("Failed to process request headers: %v", err) + return + } + + defer reqState.Close() + + body, err := io.ReadAll(io.LimitReader(r.Body, int64(bodyProcessingMaxBytes+1))) + if err := processor.OnRequestBody(requestBody{body: body}, &reqState); err != nil { + logger.Error("Failed to process request body: %v", err) + return + } + }) +} + +// hijackConnection hijacks the connection from the http.ResponseWriter if possible. Panics otherwise. +func hijackConnection(w http.ResponseWriter) net.Conn { + wr, ok := w.(http.Hijacker) + if !ok { + panic(fmt.Errorf("%T does not support http.Hijacker interface", w)) + } + + conn, _, err := wr.Hijack() + if err != nil { + panic(fmt.Errorf("failed to hijack connection: %s", err.Error())) + } + + return conn +} diff --git a/contrib/k8s.io/gateway-api/request-mirror_test.go b/contrib/k8s.io/gateway-api/request-mirror_test.go new file mode 100644 index 0000000000..59423b1c4e --- /dev/null +++ b/contrib/k8s.io/gateway-api/request-mirror_test.go @@ -0,0 +1,75 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package gatewayapi + +import ( + "io" + "net/http/httptest" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/stretchr/testify/require" +) + +func TestRequestMirror(t *testing.T) { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") + } + + srv := httptest.NewServer(HTTPRequestMirrorHandler(Config{})) + defer srv.Close() + + t.Run("query", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + // Send a request to the server + _, err := srv.Client().Get(srv.URL + "/?x=$globals") + require.Error(t, err, io.EOF, "EOF is expected because the connection is hijacked and closed") + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + // Check common span tags + require.Equal(t, "server", spans[0].Tag("span.kind")) + require.Equal(t, "GET /", spans[0].Tag("resource.name")) + require.Equal(t, "GET", spans[0].Tag("http.method")) + + // Check appsec event + require.NotEmpty(t, spans[0].Tag("appsec.event")) + require.NotEmpty(t, spans[0].Tag("_dd.appsec.enabled")) + + // Check no response tags + require.Empty(t, spans[0].Tag("http.status_code")) + }) + + t.Run("body", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + // Send a request to the server + _, err := srv.Client().Post(srv.URL, "application/json", strings.NewReader(`{"x":"$globals"}`)) + require.Error(t, err, io.EOF, "EOF is expected because the connection is hijacked and closed") + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + // Check common span tags + require.Equal(t, "server", spans[0].Tag("span.kind")) + require.Equal(t, "POST /", spans[0].Tag("resource.name")) + require.Equal(t, "POST", spans[0].Tag("http.method")) + + // Check appsec event + require.NotEmpty(t, spans[0].Tag("appsec.event")) + require.NotEmpty(t, spans[0].Tag("_dd.appsec.enabled")) + + // Check no response tags + require.Empty(t, spans[0].Tag("http.status_code")) + }) +} diff --git a/contrib/labstack/echo.v4/appsec.go b/contrib/labstack/echo.v4/appsec.go index 9cd849cc20..e3b5170526 100644 --- a/contrib/labstack/echo.v4/appsec.go +++ b/contrib/labstack/echo.v4/appsec.go @@ -8,21 +8,25 @@ package echo import ( "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" "github.com/labstack/echo/v4" ) -func withAppSec(next echo.HandlerFunc, span tracer.Span) echo.HandlerFunc { +func withAppSec(next echo.HandlerFunc, span trace.TagSetter) echo.HandlerFunc { return func(c echo.Context) error { + // Hijack the context with monitoring methods... + c = appsecContext{c} + params := make(map[string]string) for _, n := range c.ParamNames() { params[n] = c.Param(n) } var err error - handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + handler := http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { c.SetRequest(r) err = next(c) // If the error is a monitoring one, it means appsec actions will take care of writing the response @@ -32,7 +36,11 @@ func withAppSec(next echo.HandlerFunc, span tracer.Span) echo.HandlerFunc { } }) // Wrap the echo response to allow monitoring of the response status code in httpsec.WrapHandler() - httpsec.WrapHandler(handler, span, params, nil).ServeHTTP(&statusResponseWriter{Response: c.Response()}, c.Request()) + httpsec.WrapHandler(handler, span, &httpsec.Config{ + Framework: "github.com/labstack/echo/v4", + Route: c.Path(), + RouteParams: params, + }).ServeHTTP(&statusResponseWriter{Response: c.Response()}, c.Request()) // If an error occurred, wrap it under an echo.HTTPError. We need to do this so that APM doesn't override // the response code tag with 500 in case it doesn't recognize the error type. if _, ok := err.(*echo.HTTPError); !ok && err != nil { @@ -55,3 +63,50 @@ type statusResponseWriter struct { func (w *statusResponseWriter) Status() int { return w.Response.Status } + +type appsecContext struct { + echo.Context +} + +func (c appsecContext) Bind(in any) error { + err := c.Context.Bind(in) + if err == nil { + err = appsec.MonitorParsedHTTPBody(c.Request().Context(), in) + } + return err +} + +func (c appsecContext) JSON(code int, i any) error { + if err := appsec.MonitorHTTPResponseBody(c.Request().Context(), i); err != nil { + return err + } + return c.Context.JSON(code, i) +} + +func (c appsecContext) JSONPretty(code int, i any, indent string) error { + if err := appsec.MonitorHTTPResponseBody(c.Request().Context(), i); err != nil { + return err + } + return c.Context.JSONPretty(code, i, indent) +} + +func (c appsecContext) JSONP(code int, callback string, i any) error { + if err := appsec.MonitorHTTPResponseBody(c.Request().Context(), i); err != nil { + return err + } + return c.Context.JSONP(code, callback, i) +} + +func (c appsecContext) XML(code int, i any) error { + if err := appsec.MonitorHTTPResponseBody(c.Request().Context(), i); err != nil { + return err + } + return c.Context.XML(code, i) +} + +func (c appsecContext) XMLPretty(code int, i any, indent string) error { + if err := appsec.MonitorHTTPResponseBody(c.Request().Context(), i); err != nil { + return err + } + return c.Context.XMLPretty(code, i, indent) +} diff --git a/contrib/labstack/echo.v4/appsec_test.go b/contrib/labstack/echo.v4/appsec_test.go index 52d9a184b9..dd3ffdc289 100644 --- a/contrib/labstack/echo.v4/appsec_test.go +++ b/contrib/labstack/echo.v4/appsec_test.go @@ -14,20 +14,18 @@ import ( "strings" "testing" - pappsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" + pappsec "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/labstack/echo/v4" "github.com/stretchr/testify/require" ) func TestAppSec(t *testing.T) { - appsec.Start() - defer appsec.Stop() - - if !appsec.Enabled() { + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { t.Skip("appsec disabled") } @@ -239,10 +237,9 @@ func TestAppSec(t *testing.T) { // TestControlFlow ensures that the AppSec middleware behaves correctly in various execution flows and wrapping // scenarios. func TestControlFlow(t *testing.T) { - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { - t.Skip("AppSec needs to be enabled for this test") + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") } middlewareResponseBody := "Hello Middleware" @@ -262,7 +259,7 @@ func TestControlFlow(t *testing.T) { name: "middleware-first/middleware-aborts-before-handler", middlewares: []echo.MiddlewareFunc{ Middleware(), - func(next echo.HandlerFunc) echo.HandlerFunc { + func(_ echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { c.String(middlewareResponseStatus, middlewareResponseBody) return echo.NewHTTPError(middlewareResponseStatus, "middleware abort") @@ -271,7 +268,6 @@ func TestControlFlow(t *testing.T) { }, handler: func(echo.Context) error { panic("unexpected control flow") - return nil }, test: func(t *testing.T, rec *httptest.ResponseRecorder, mt mocktracer.Tracer, err error) { require.Error(t, err) @@ -366,7 +362,7 @@ func TestControlFlow(t *testing.T) { } }, }, - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return nil }, test: func(t *testing.T, rec *httptest.ResponseRecorder, mt mocktracer.Tracer, err error) { @@ -399,7 +395,7 @@ func TestControlFlow(t *testing.T) { }, Middleware(), }, - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { // Do nothing so that the calling middleware can handle the response. return nil }, @@ -428,7 +424,7 @@ func TestControlFlow(t *testing.T) { } }, func(echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { + return func(_ echo.Context) error { // Make sure echo doesn't call the next middleware when the // previous one returns an error. panic("unexpected control flow") @@ -551,10 +547,9 @@ func TestControlFlow(t *testing.T) { func TestBlocking(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/blocking.json") - appsec.Start() - defer appsec.Stop() - if !appsec.Enabled() { - t.Skip("AppSec needs to be enabled for this test") + testutils.StartAppSec(t) + if !instr.AppSecEnabled() { + t.Skip("appsec disabled") } // Start and trace an HTTP server @@ -570,6 +565,16 @@ func TestBlocking(t *testing.T) { } return c.String(http.StatusOK, "Hello, "+userID) }) + e.Any("/body", func(c echo.Context) error { + type body struct { + Name string `json:"name"` + } + var b body + if err := c.Bind(&b); err != nil { + return err + } + return c.String(http.StatusOK, "Hello, "+b.Name) + }) srv := httptest.NewServer(e) defer srv.Close() @@ -577,6 +582,7 @@ func TestBlocking(t *testing.T) { name string endpoint string headers map[string]string + body string shouldBlock bool }{ { @@ -601,12 +607,34 @@ func TestBlocking(t *testing.T) { endpoint: "/user", headers: map[string]string{"user-id": "legit-user-1"}, }, + { + name: "body/block", + endpoint: "/body", + body: `{"name":"$globals"}`, + headers: map[string]string{ + "Content-Type": "application/json", + }, + shouldBlock: true, + }, + { + name: "body/no-block", + endpoint: "/body", + body: `{"name":"legit"}`, + headers: map[string]string{ + "Content-Type": "application/json", + }, + }, } { t.Run(tc.name, func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - req, err := http.NewRequest("POST", srv.URL+tc.endpoint, nil) + var bodyReader io.Reader + if tc.body != "" { + bodyReader = strings.NewReader(tc.body) + } + + req, err := http.NewRequest("POST", srv.URL+tc.endpoint, bodyReader) for k, v := range tc.headers { req.Header.Set(k, v) } @@ -619,7 +647,7 @@ func TestBlocking(t *testing.T) { if tc.shouldBlock { require.Equal(t, http.StatusForbidden, res.StatusCode) - require.Equal(t, spans[0].Tag("appsec.blocked"), true) + require.Equal(t, spans[0].Tag("appsec.blocked"), "true") } else { require.Equal(t, http.StatusOK, res.StatusCode) require.NotContains(t, spans[0].Tags(), "appsec.blocked") diff --git a/contrib/labstack/echo.v4/echotrace.go b/contrib/labstack/echo.v4/echotrace.go index d3a8867bd4..13e971f8ea 100644 --- a/contrib/labstack/echo.v4/echotrace.go +++ b/contrib/labstack/echo.v4/echotrace.go @@ -10,25 +10,20 @@ import ( "fmt" "math" "net/http" - "strconv" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/labstack/echo/v4" ) -const componentName = "labstack/echo.v4" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/labstack/echo/v4") + instr = instrumentation.Load(instrumentation.PackageLabstackEchoV4) } // Middleware returns echo middleware which will trace incoming requests. @@ -36,18 +31,19 @@ func Middleware(opts ...Option) echo.MiddlewareFunc { cfg := new(config) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/labstack/echo.v4: Configuring Middleware: %#v", cfg) - spanOpts := make([]ddtrace.StartSpanOption, 0, 3+len(cfg.tags)) + instr.Logger().Debug("contrib/labstack/echo.v4: Configuring Middleware: %#v", cfg) + spanOpts := make([]tracer.StartSpanOption, 0, 3+len(cfg.tags)) spanOpts = append(spanOpts, tracer.ServiceName(cfg.serviceName)) for k, v := range cfg.tags { spanOpts = append(spanOpts, tracer.Tag(k, v)) } spanOpts = append(spanOpts, - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageLabstackEchoV4), tracer.Tag(ext.SpanKind, ext.SpanKindServer), ) + return func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { // If we have an ignoreRequestFunc, use it to see if we proceed with tracing @@ -58,7 +54,7 @@ func Middleware(opts ...Option) echo.MiddlewareFunc { request := c.Request() route := c.Path() resource := request.Method + " " + route - opts := options.Copy(spanOpts...) // opts must be a copy of spanOpts, locally scoped, to avoid races. + opts := options.Copy(spanOpts) // opts must be a copy of spanOpts, locally scoped, to avoid races. if !math.IsNaN(cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } @@ -72,19 +68,17 @@ func Middleware(opts ...Option) echo.MiddlewareFunc { finishOpts = []tracer.FinishOption{tracer.NoDebugStack()} } - span, ctx := httptrace.StartRequestSpan(request, opts...) - defer func() { - span.Finish(finishOpts...) - }() + span, ctx, finishSpans := httptrace.StartRequestSpan(request, opts...) // pass the span through the request context c.SetRequest(request.WithContext(ctx)) - if appsec.Enabled() { + if instr.AppSecEnabled() { next = withAppSec(next, span) } // serve the request to the next middleware err := next(c) + var echoStatus int if err != nil && !shouldIgnoreError(cfg, err) { // It is impossible to determine what the final status code of a request is in echo. // This is the best we can do. @@ -92,13 +86,14 @@ func Middleware(opts ...Option) echo.MiddlewareFunc { if cfg.isStatusError(echoErr.Code) { finishOpts = append(finishOpts, tracer.WithError(err)) } - span.SetTag(ext.HTTPCode, strconv.Itoa(echoErr.Code)) + echoStatus = echoErr.Code + } else { // Any error that is not an *echo.HTTPError will be treated as an error with 500 status code. if cfg.isStatusError(500) { finishOpts = append(finishOpts, tracer.WithError(err)) } - span.SetTag(ext.HTTPCode, "500") + echoStatus = 500 } } else if status := c.Response().Status; status > 0 { if cfg.isStatusError(status) { @@ -106,15 +101,25 @@ func Middleware(opts ...Option) echo.MiddlewareFunc { finishOpts = append(finishOpts, tracer.WithError(statusErr)) } } - span.SetTag(ext.HTTPCode, strconv.Itoa(status)) + echoStatus = status } else { if cfg.isStatusError(200) { if statusErr := errorFromStatusCode(200); !shouldIgnoreError(cfg, statusErr) { finishOpts = append(finishOpts, tracer.WithError(statusErr)) } } - span.SetTag(ext.HTTPCode, "200") + echoStatus = 200 } + defer func() { + finishSpans(echoStatus, func(status int) bool { + if cfg.isStatusError(status) { + if statusErr := errorFromStatusCode(status); !shouldIgnoreError(cfg, statusErr) { + return true + } + } + return false + }, finishOpts...) + }() return err } } diff --git a/contrib/labstack/echo.v4/echotrace_test.go b/contrib/labstack/echo.v4/echotrace_test.go index 5f62cf1b25..9a21710e7f 100644 --- a/contrib/labstack/echo.v4/echotrace_test.go +++ b/contrib/labstack/echo.v4/echotrace_test.go @@ -10,15 +10,13 @@ import ( "fmt" "net/http" "net/http/httptest" - "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" @@ -32,7 +30,7 @@ func TestChildSpan(t *testing.T) { var called, traced bool router := echo.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.GET("/user/:id", func(c echo.Context) error { called = true _, traced = tracer.SpanFromContext(c.Request().Context()) @@ -48,6 +46,90 @@ func TestChildSpan(t *testing.T) { assert.True(traced) } +func TestWithHeaderTags(t *testing.T) { + setupReq := func(opts ...Option) *http.Request { + router := echo.New() + router.Use(Middleware(opts...)) + + router.GET("/test", func(c echo.Context) error { + return c.String(http.StatusOK, "test") + }) + r := httptest.NewRequest("GET", "/test", nil) + r.Header.Set("h!e@a-d.e*r", "val") + r.Header.Add("h!e@a-d.e*r", "val2") + r.Header.Set("2header", "2val") + r.Header.Set("3header", "3val") + r.Header.Set("x-datadog-header", "value") + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + return r + } + t.Run("default-off", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + htArgs := []string{"h!e@a-d.e*r", "2header", "3header", "x-datadog-header"} + setupReq() + spans := mt.FinishedSpans() + assert := assert.New(t) + assert.Equal(len(spans), 1) + s := spans[0] + instrumentation.NewHeaderTags(htArgs).Iter(func(_ string, tag string) { + assert.NotContains(s.Tags(), tag) + }) + }) + t.Run("integration", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + _ = setupReq(WithHeaderTags(htArgs)) + spans := mt.FinishedSpans() + assert := assert.New(t) + assert.Equal(len(spans), 1) + s := spans[0] + + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + }) + + t.Run("global", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + testutils.SetGlobalHeaderTags(t, "3header") + + _ = setupReq() + spans := mt.FinishedSpans() + assert := assert.New(t) + assert.Equal(len(spans), 1) + s := spans[0] + + assert.Equal("3val", s.Tags()["http.request.headers.3header"]) + assert.NotContains(s.Tags(), "http.request.headers.other") + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + }) + + t.Run("override", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + testutils.SetGlobalHeaderTags(t, "3header") + + htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + _ = setupReq(WithHeaderTags(htArgs)) + spans := mt.FinishedSpans() + assert := assert.New(t) + assert.Equal(len(spans), 1) + s := spans[0] + + assert.Equal("val,val2", s.Tags()["http.request.headers.h_e_a-d_e_r"]) + assert.Equal("2val", s.Tags()["tag"]) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "http.request.headers.3header") + }) +} + func TestTrace200(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() @@ -55,15 +137,16 @@ func TestTrace200(t *testing.T) { var called, traced bool router := echo.New() - router.Use(Middleware(WithServiceName("foobar"), WithAnalytics(false))) + router.Use(Middleware(WithService("foobar"), WithAnalytics(false))) router.GET("/user/:id", func(c echo.Context) error { called = true - var span tracer.Span + var span *tracer.Span span, traced = tracer.SpanFromContext(c.Request().Context()) + ms := mocktracer.MockSpan(span) // we patch the span on the request context. span.SetTag("test.echo", "echony") - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(ms.Tag(ext.ServiceName), "foobar") return c.NoContent(200) }) @@ -79,7 +162,7 @@ func TestTrace200(t *testing.T) { assert.True(traced) spans := mt.FinishedSpans() - require.Len(t, spans, 1) + assert.Len(spans, 1) span := spans[0] assert.Equal("http.request", span.OperationName()) @@ -91,8 +174,8 @@ func TestTrace200(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal(root.Context().SpanID(), span.ParentID()) assert.Equal("labstack/echo.v4", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageLabstackEchoV4), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - assert.Equal("/user/:id", span.Tag(ext.HTTPRoute)) assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) } @@ -104,15 +187,16 @@ func TestTraceAnalytics(t *testing.T) { var called, traced bool router := echo.New() - router.Use(Middleware(WithServiceName("foobar"), WithAnalytics(true))) + router.Use(Middleware(WithService("foobar"), WithAnalytics(true))) router.GET("/user/:id", func(c echo.Context) error { called = true - var span tracer.Span + var span *tracer.Span span, traced = tracer.SpanFromContext(c.Request().Context()) + ms := mocktracer.MockSpan(span) // we patch the span on the request context. span.SetTag("test.echo", "echony") - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(ms.Tag(ext.ServiceName), "foobar") return c.NoContent(200) }) @@ -128,7 +212,7 @@ func TestTraceAnalytics(t *testing.T) { assert.True(traced) spans := mt.FinishedSpans() - require.Len(t, spans, 1) + assert.Len(spans, 1) span := spans[0] assert.Equal("http.request", span.OperationName()) @@ -141,6 +225,7 @@ func TestTraceAnalytics(t *testing.T) { assert.Equal(1.0, span.Tag(ext.EventSampleRate)) assert.Equal(root.Context().SpanID(), span.ParentID()) assert.Equal("labstack/echo.v4", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageLabstackEchoV4), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) @@ -151,22 +236,19 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() var called, traced bool - handlerCalled := 0 // setup router := echo.New() - router.HTTPErrorHandler = func(err error, c echo.Context) { - handlerCalled++ - } - router.Use(Middleware(WithServiceName("foobar"))) - wantErr := errors.New("oh no") + router.Use(Middleware(WithService("foobar"))) + errWant := errors.New("oh no") // a handler with an error and make the requests router.GET("/err", func(c echo.Context) error { _, traced = tracer.SpanFromContext(c.Request().Context()) called = true - err := wantErr + err := errWant + c.Error(err) return err }) r := httptest.NewRequest("GET", "/err", nil) @@ -176,17 +258,18 @@ func TestError(t *testing.T) { // verify the errors and status are correct assert.True(called) assert.True(traced) - assert.Equal(1, handlerCalled) spans := mt.FinishedSpans() - require.Len(t, spans, 1) + assert.Len(spans, 1) span := spans[0] assert.Equal("http.request", span.OperationName()) assert.Equal("foobar", span.Tag(ext.ServiceName)) assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) + require.NotNil(t, span.Tag(ext.ErrorMsg)) + assert.Equal(errWant.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("labstack/echo.v4", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageLabstackEchoV4), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -198,17 +281,17 @@ func TestErrorHandling(t *testing.T) { // setup router := echo.New() - router.HTTPErrorHandler = func(err error, ctx echo.Context) { + router.HTTPErrorHandler = func(_ error, ctx echo.Context) { ctx.Response().WriteHeader(http.StatusInternalServerError) } - router.Use(Middleware(WithServiceName("foobar"))) - wantErr := errors.New("oh no") + router.Use(Middleware(WithService("foobar"))) + errWant := errors.New("oh no") // a handler with an error and make the requests router.GET("/err", func(c echo.Context) error { _, traced = tracer.SpanFromContext(c.Request().Context()) called = true - return wantErr + return errWant }) r := httptest.NewRequest("GET", "/err", nil) w := httptest.NewRecorder() @@ -219,42 +302,45 @@ func TestErrorHandling(t *testing.T) { assert.True(traced) spans := mt.FinishedSpans() - require.Len(t, spans, 1) + assert.Len(spans, 1) span := spans[0] assert.Equal("http.request", span.OperationName()) assert.Equal("foobar", span.Tag(ext.ServiceName)) assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) + require.NotNil(t, span.Tag(ext.ErrorMsg)) + assert.Equal(errWant.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("labstack/echo.v4", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageLabstackEchoV4), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } func TestStatusError(t *testing.T) { for _, tt := range []struct { - isStatusError func(statusCode int) bool - err error - code string - handler func(c echo.Context) error + isStatusError func(statusCode int) bool + err error + code string + handler func(_ echo.Context) error + envServerErrorStatusesVal string }{ { err: errors.New("oh no"), code: "500", - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return errors.New("oh no") }, }, { err: echo.NewHTTPError(http.StatusInternalServerError, "my error message"), code: "500", - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return echo.NewHTTPError(http.StatusInternalServerError, "my error message") }, }, { err: nil, code: "400", - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, "my error message") }, }, @@ -262,7 +348,7 @@ func TestStatusError(t *testing.T) { isStatusError: func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 }, err: nil, code: "500", - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return errors.New("oh no") }, }, @@ -270,7 +356,7 @@ func TestStatusError(t *testing.T) { isStatusError: func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 }, err: nil, code: "500", - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return echo.NewHTTPError(http.StatusInternalServerError, "my error message") }, }, @@ -278,7 +364,7 @@ func TestStatusError(t *testing.T) { isStatusError: func(statusCode int) bool { return statusCode >= 400 }, err: echo.NewHTTPError(http.StatusBadRequest, "my error message"), code: "400", - handler: func(c echo.Context) error { + handler: func(_ echo.Context) error { return echo.NewHTTPError(http.StatusBadRequest, "my error message") }, }, @@ -301,14 +387,46 @@ func TestStatusError(t *testing.T) { return nil }, }, + { + isStatusError: nil, + err: echo.NewHTTPError(http.StatusInternalServerError, "my error message"), + code: "500", + handler: func(_ echo.Context) error { + return echo.NewHTTPError(http.StatusInternalServerError, "my error message") + }, + envServerErrorStatusesVal: "500", + }, + // integration-level config applies regardless of envvar + { + isStatusError: func(statusCode int) bool { return statusCode == 400 }, + err: echo.NewHTTPError(http.StatusBadRequest, "my error message"), + code: "400", + handler: func(_ echo.Context) error { + return echo.NewHTTPError(http.StatusBadRequest, "my error message") + }, + envServerErrorStatusesVal: "500", + }, + // envvar impact is discarded if integration-level config has been applied + { + isStatusError: func(statusCode int) bool { return statusCode == 400 }, + err: nil, + code: "500", + handler: func(_ echo.Context) error { + return echo.NewHTTPError(http.StatusInternalServerError, "my error message") + }, + }, } { t.Run("", func(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() + if tt.envServerErrorStatusesVal != "" { + t.Setenv(envServerErrorStatuses, tt.envServerErrorStatusesVal) + } + router := echo.New() - opts := []Option{WithServiceName("foobar")} + opts := []Option{WithService("foobar")} if tt.isStatusError != nil { opts = append(opts, WithStatusCheck(tt.isStatusError)) } @@ -319,7 +437,7 @@ func TestStatusError(t *testing.T) { router.ServeHTTP(w, r) spans := mt.FinishedSpans() - require.Len(t, spans, 1) + assert.Len(spans, 1) span := spans[0] assert.Equal("http.request", span.OperationName()) assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) @@ -327,12 +445,10 @@ func TestStatusError(t *testing.T) { assert.Contains(span.Tag(ext.ResourceName), "/err") assert.Equal(tt.code, span.Tag(ext.HTTPCode)) assert.Equal("GET", span.Tag(ext.HTTPMethod)) - err := span.Tag(ext.Error) + err := span.Tag(ext.ErrorMsg) if tt.err != nil { - if !assert.NotNil(err) { - return - } - assert.Equal(tt.err.Error(), err.(error).Error()) + assert.NotNil(err) + assert.Equal(tt.err.Error(), err) } else { assert.Nil(err) } @@ -369,14 +485,14 @@ func TestNoDebugStack(t *testing.T) { // setup router := echo.New() router.Use(Middleware(NoDebugStack())) - wantErr := errors.New("oh no") + errWant := errors.New("oh no") // a handler with an error and make the requests router.GET("/err", func(c echo.Context) error { _, traced = tracer.SpanFromContext(c.Request().Context()) called = true - err := wantErr + err := errWant c.Error(err) return err }) @@ -389,12 +505,14 @@ func TestNoDebugStack(t *testing.T) { assert.True(traced) spans := mt.FinishedSpans() - require.Len(t, spans, 1) + assert.Len(spans, 1) span := spans[0] - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) - assert.Equal("", span.Tag(ext.ErrorStack)) + require.NotNil(t, span.Tag(ext.ErrorMsg)) + assert.Equal(errWant.Error(), span.Tag(ext.ErrorMsg)) + assert.Empty(span.Tags()[ext.ErrorStack]) assert.Equal("labstack/echo.v4", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageLabstackEchoV4), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -405,7 +523,7 @@ func TestIgnoreRequestFunc(t *testing.T) { var called, traced bool // setup - ignoreRequestFunc := func(c echo.Context) bool { + ignoreRequestFunc := func(_ echo.Context) bool { return true } router := echo.New() @@ -480,115 +598,6 @@ func TestWithErrorTranslator(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := echo.New() - mux.Use(Middleware(opts...)) - mux.GET("/200", func(c echo.Context) error { - return c.NoContent(200) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "echo")(t) -} - -func TestWithHeaderTags(t *testing.T) { - setupReq := func(opts ...Option) *http.Request { - router := echo.New() - router.Use(Middleware(opts...)) - - router.GET("/test", func(c echo.Context) error { - return c.String(http.StatusOK, "test") - }) - r := httptest.NewRequest("GET", "/test", nil) - r.Header.Set("h!e@a-d.e*r", "val") - r.Header.Add("h!e@a-d.e*r", "val2") - r.Header.Set("2header", "2val") - r.Header.Set("3header", "3val") - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - return r - } - t.Run("default-off", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - htArgs := []string{"h!e@a-d.e*r", "2header", "3header"} - setupReq() - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) - assert.NotContains(s.Tags(), tag) - } - }) - t.Run("integration", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - }) - - t.Run("global", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) - - r := setupReq() - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) - - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) - }) -} - func TestWithErrorCheck(t *testing.T) { tests := []struct { name string @@ -642,7 +651,7 @@ func TestWithErrorCheck(t *testing.T) { name: "ignore-none", err: errors.New("any error"), opts: []Option{ - WithErrorCheck(func(err error) bool { + WithErrorCheck(func(_ error) bool { return true }), }, @@ -652,7 +661,7 @@ func TestWithErrorCheck(t *testing.T) { name: "ignore-all", err: errors.New("any error"), opts: []Option{ - WithErrorCheck(func(err error) bool { + WithErrorCheck(func(_ error) bool { return false }), }, @@ -670,7 +679,7 @@ func TestWithErrorCheck(t *testing.T) { WithStatusCheck(func(statusCode int) bool { return statusCode == http.StatusNotFound }), - WithErrorCheck(func(err error) bool { + WithErrorCheck(func(_ error) bool { return false }), }, @@ -703,48 +712,28 @@ func TestWithErrorCheck(t *testing.T) { span := spans[0] if tt.wantErr == nil { - assert.NotContains(t, span.Tags(), ext.Error) + assert.NotContains(t, span.Tags(), ext.ErrorMsg) return } - assert.Equal(t, tt.wantErr, span.Tag(ext.Error)) + assert.Equal(t, tt.wantErr.Error(), span.Tag(ext.ErrorMsg)) }) } } -func TestWithCustomTags(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool +func BenchmarkEchoWithTracing(b *testing.B) { + tracer.Start(tracer.WithLogger(testutils.DiscardLogger())) + defer tracer.Stop() - // setup - router := echo.New() - router.Use(Middleware( - WithServiceName("foobar"), - WithCustomTag("customTag1", "customValue1"), - WithCustomTag("customTag2", "customValue2"), - WithCustomTag(ext.SpanKind, "replace me"), - )) - - // a handler with an error and make the requests - router.GET("/test", func(c echo.Context) error { - _, traced = tracer.SpanFromContext(c.Request().Context()) - called = true - return nil + mux := echo.New() + mux.Use(Middleware()) + mux.GET("/200", func(c echo.Context) error { + return c.NoContent(200) }) - r := httptest.NewRequest("GET", "/test", nil) + r := httptest.NewRequest("GET", "/200", nil) w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify the errors and status are correct - assert.True(called) - assert.True(traced) - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - - span := spans[0] - assert.Equal("customValue1", span.Tag("customTag1")) - assert.Equal("customValue2", span.Tag("customTag2")) - assert.Equal("server", span.Tag(ext.SpanKind)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + mux.ServeHTTP(w, r) + } } diff --git a/contrib/labstack/echo.v4/example_test.go b/contrib/labstack/echo.v4/example_test.go index 07b1b3c1e1..57b0ce202b 100644 --- a/contrib/labstack/echo.v4/example_test.go +++ b/contrib/labstack/echo.v4/example_test.go @@ -3,20 +3,30 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package echo +package echo_test import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "encoding/json" + "io" + "net/http" + + echotrace "github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/labstack/echo/v4" ) // To start tracing requests, add the trace middleware to your echo router. func Example() { + tracer.Start() + defer tracer.Stop() + r := echo.New() // Use the tracer middleware with your desired service name. - r.Use(Middleware(WithServiceName("my-web-app"))) + r.Use(echotrace.Middleware(echotrace.WithService("my-web-app"))) // Set up an endpoint. r.GET("/hello", func(c echo.Context) error { @@ -29,11 +39,14 @@ func Example() { // An example illustrating tracing a child operation within the main context. func Example_spanFromContext() { + tracer.Start() + defer tracer.Stop() + // Create a new instance of echo r := echo.New() // Use the tracer middleware with your desired service name. - r.Use(Middleware(WithServiceName("image-encoder"))) + r.Use(echotrace.Middleware(echotrace.WithService("image-encoder"))) // Set up some endpoints. r.GET("/image/encode", func(c echo.Context) error { @@ -48,3 +61,75 @@ func Example_spanFromContext() { return c.String(200, "ok!") }) } + +type parsedBodyType struct { + Value string `json:"value"` +} + +func customBodyParser(body io.ReadCloser) (*parsedBodyType, error) { + var parsedBody parsedBodyType + err := json.NewDecoder(body).Decode(&parsedBody) + return &parsedBody, err +} + +// Monitor HTTP request parsed body +func ExampleMonitorParsedHTTPBody() { + tracer.Start() + defer tracer.Stop() + + mux := httptrace.NewServeMux() + mux.HandleFunc("/body", func(w http.ResponseWriter, r *http.Request) { + // Use the SDK to monitor the request's parsed body + body, err := customBodyParser(r.Body) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + appsec.MonitorParsedHTTPBody(r.Context(), body) + w.Write([]byte("Body monitored using AppSec SDK\n")) + }) + http.ListenAndServe(":8080", mux) +} + +// Monitor HTTP request parsed body with a framework customized context type +func ExampleMonitorParsedHTTPBody_customContext() { + tracer.Start() + defer tracer.Stop() + + r := echo.New() + r.Use(echotrace.Middleware()) + r.POST("/body", func(c echo.Context) (e error) { + req := c.Request() + body, err := customBodyParser(req.Body) + if err != nil { + return c.String(http.StatusInternalServerError, err.Error()) + } + // Use the SDK to monitor the request's parsed body + appsec.MonitorParsedHTTPBody(c.Request().Context(), body) + return c.String(http.StatusOK, "Body monitored using AppSec SDK") + }) + + r.Start(":8080") +} + +func userIDFromRequest(r *http.Request) string { + return r.Header.Get("user-id") +} + +// Monitor and block requests depending on user ID +func ExampleSetUser() { + tracer.Start() + defer tracer.Stop() + + mux := httptrace.NewServeMux() + mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { + // We use SetUser() here to associate the user ID to the request's span. The return value + // can then be checked to decide whether to block the request or not. + // If it should be blocked, early exit from the handler. + if err := appsec.SetUser(r.Context(), userIDFromRequest(r)); err != nil { + return + } + + w.Write([]byte("User monitored using AppSec SetUser SDK\n")) + }) +} diff --git a/contrib/labstack/echo.v4/go.mod b/contrib/labstack/echo.v4/go.mod new file mode 100644 index 0000000000..5e8373ed87 --- /dev/null +++ b/contrib/labstack/echo.v4/go.mod @@ -0,0 +1,102 @@ +module github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/labstack/echo/v4 v4.11.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/labstack/echo.v4/go.sum b/contrib/labstack/echo.v4/go.sum new file mode 100644 index 0000000000..6e02705bfb --- /dev/null +++ b/contrib/labstack/echo.v4/go.sum @@ -0,0 +1,324 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/labstack/echo.v4/option.go b/contrib/labstack/echo.v4/option.go index 2994d42c61..166100186c 100644 --- a/contrib/labstack/echo.v4/option.go +++ b/contrib/labstack/echo.v4/option.go @@ -9,15 +9,15 @@ import ( "errors" "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" "github.com/labstack/echo/v4" ) -const defaultServiceName = "echo" +// envServerErrorStatuses is the name of the env var used to specify error status codes on http server spans +const envServerErrorStatuses = "DD_TRACE_HTTP_SERVER_ERROR_STATUSES" type config struct { serviceName string @@ -26,22 +26,35 @@ type config struct { ignoreRequestFunc IgnoreRequestFunc isStatusError func(statusCode int) bool translateError func(err error) (*echo.HTTPError, bool) - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags errCheck func(error) bool tags map[string]interface{} } -// Option represents an option that can be passed to Middleware. -type Option func(*config) +// Option describes options for the Echo.v4 integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Middleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} // IgnoreRequestFunc determines if tracing will be skipped for a request. type IgnoreRequestFunc func(c echo.Context) bool func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) cfg.analyticsRate = math.NaN() - cfg.isStatusError = isServerError - cfg.headerTags = globalconfig.HeaderTagMap() + if fn := httptrace.GetErrorCodesFromInput(env.Get(envServerErrorStatuses)); fn != nil { + cfg.isStatusError = fn + } else { + cfg.isStatusError = isServerError + } + cfg.headerTags = instr.HTTPHeadersAsTags() cfg.tags = make(map[string]interface{}) cfg.translateError = func(err error) (*echo.HTTPError, bool) { var echoErr *echo.HTTPError @@ -52,15 +65,15 @@ func defaults(cfg *config) { } } -// WithServiceName sets the given service name for the system. -func WithServiceName(name string) Option { +// WithService sets the given service name for the system. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -72,7 +85,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -85,7 +98,7 @@ func WithAnalyticsRate(rate float64) Option { // NoDebugStack prevents stack traces from being attached to spans finishing // with an error. This is useful in situations where errors are frequent and // performance is critical. -func NoDebugStack() Option { +func NoDebugStack() OptionFn { return func(cfg *config) { cfg.noDebugStack = true } @@ -93,7 +106,7 @@ func NoDebugStack() Option { // WithIgnoreRequest sets a function which determines if tracing will be // skipped for a given request. -func WithIgnoreRequest(ignoreRequestFunc IgnoreRequestFunc) Option { +func WithIgnoreRequest(ignoreRequestFunc IgnoreRequestFunc) OptionFn { return func(cfg *config) { cfg.ignoreRequestFunc = ignoreRequestFunc } @@ -101,7 +114,7 @@ func WithIgnoreRequest(ignoreRequestFunc IgnoreRequestFunc) Option { // WithErrorTranslator sets a function to translate Go errors into echo Errors. // This is used for extracting the HTTP response status code. -func WithErrorTranslator(fn func(err error) (*echo.HTTPError, bool)) Option { +func WithErrorTranslator(fn func(err error) (*echo.HTTPError, bool)) OptionFn { return func(cfg *config) { cfg.translateError = fn } @@ -109,7 +122,7 @@ func WithErrorTranslator(fn func(err error) (*echo.HTTPError, bool)) Option { // WithStatusCheck specifies a function fn which reports whether the passed // statusCode should be considered an error. -func WithStatusCheck(fn func(statusCode int) bool) Option { +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { return func(cfg *config) { cfg.isStatusError = fn } @@ -123,16 +136,16 @@ func isServerError(statusCode int) bool { // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) OptionFn { + headerTagsMap := instrumentation.NewHeaderTags(headers) return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = headerTagsMap } } // WithErrorCheck sets the func which determines if err would be ignored (if it returns true, the error is not tagged). // This function also checks the errors created from the WithStatusCheck option. -func WithErrorCheck(errCheck func(error) bool) Option { +func WithErrorCheck(errCheck func(error) bool) OptionFn { return func(cfg *config) { cfg.errCheck = errCheck } @@ -140,7 +153,7 @@ func WithErrorCheck(errCheck func(error) bool) Option { // WithCustomTag will attach the value to the span tagged by the key. Standard // span tags cannot be replaced. -func WithCustomTag(key string, value interface{}) Option { +func WithCustomTag(key string, value interface{}) OptionFn { return func(cfg *config) { if cfg.tags == nil { cfg.tags = make(map[string]interface{}) diff --git a/contrib/labstack/echo.v4/orchestrion.yml b/contrib/labstack/echo.v4/orchestrion.yml new file mode 100644 index 0000000000..73f88ab707 --- /dev/null +++ b/contrib/labstack/echo.v4/orchestrion.yml @@ -0,0 +1,25 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 + description: High performance, extensible, minimalist Go web framework. + +aspects: + - id: New + join-point: + function-call: github.com/labstack/echo/v4.New + advice: + - wrap-expression: + imports: + echo: github.com/labstack/echo/v4 + echotrace: github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 + template: |- + func() *echo.Echo { + e := {{ . }} + e.Use(echotrace.Middleware()) + return e + }() diff --git a/contrib/labstack/echo/echotrace.go b/contrib/labstack/echo/echotrace.go deleted file mode 100644 index f1f7f063de..0000000000 --- a/contrib/labstack/echo/echotrace.go +++ /dev/null @@ -1,108 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package echo provides functions to trace the labstack/echo package (https://github.com/labstack/echo). -// WARNING: The underlying v3 version of labstack/echo has known security vulnerabilities that have been resolved in v4 -// and is no longer under active development. As such consider this package deprecated. -// It is highly recommended that you update to the latest version available at labstack/echo.v4. -package echo - -import ( - "errors" - "fmt" - "math" - "net/http" - "strconv" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "github.com/labstack/echo" -) - -const componentName = "labstack/echo" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/labstack/echo") -} - -// Middleware returns echo middleware which will trace incoming requests. -func Middleware(opts ...Option) echo.MiddlewareFunc { - cfg := new(config) - defaults(cfg) - for _, fn := range opts { - fn(cfg) - } - log.Debug("contrib/labstack/echo: Configuring Middleware: %#v", cfg) - spanOpts := []ddtrace.StartSpanOption{ - tracer.ServiceName(cfg.serviceName), - tracer.Tag(ext.Component, componentName), - tracer.Tag(ext.SpanKind, ext.SpanKindServer), - } - return func(next echo.HandlerFunc) echo.HandlerFunc { - return func(c echo.Context) error { - request := c.Request() - resource := request.Method + " " + c.Path() - opts := options.Copy(spanOpts...) // opts must be a copy of spanOpts, locally scoped, to avoid races. - if !math.IsNaN(cfg.analyticsRate) { - opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - opts = append(opts, - tracer.ResourceName(resource), - httptrace.HeaderTagsFromRequest(request, cfg.headerTags)) - // TODO: Should this also have an `http.route` tag like the v4 library does? - - var finishOpts []tracer.FinishOption - if cfg.noDebugStack { - finishOpts = []tracer.FinishOption{tracer.NoDebugStack()} - } - - span, ctx := httptrace.StartRequestSpan(request, opts...) - defer func() { - span.Finish(finishOpts...) - }() - - // pass the span through the request context - c.SetRequest(request.WithContext(ctx)) - - // serve the request to the next middleware - err := next(c) - if err != nil { - // It is impossible to determine what the final status code of a request is in echo. - // This is the best we can do. - var echoErr *echo.HTTPError - if errors.As(err, &echoErr) { - if cfg.isStatusError(echoErr.Code) { - finishOpts = append(finishOpts, tracer.WithError(err)) - } - span.SetTag(ext.HTTPCode, strconv.Itoa(echoErr.Code)) - } else { - // Any error that is not an *echo.HTTPError will be treated as an error with 500 status code. - if cfg.isStatusError(500) { - finishOpts = append(finishOpts, tracer.WithError(err)) - } - span.SetTag(ext.HTTPCode, "500") - } - } else if status := c.Response().Status; status > 0 { - if cfg.isStatusError(status) { - finishOpts = append(finishOpts, tracer.WithError(fmt.Errorf("%d: %s", status, http.StatusText(status)))) - } - span.SetTag(ext.HTTPCode, strconv.Itoa(status)) - } else { - if cfg.isStatusError(200) { - finishOpts = append(finishOpts, tracer.WithError(fmt.Errorf("%d: %s", 200, http.StatusText(200)))) - } - span.SetTag(ext.HTTPCode, "200") - } - return err - } - } -} diff --git a/contrib/labstack/echo/echotrace_test.go b/contrib/labstack/echo/echotrace_test.go deleted file mode 100644 index 8260bce03d..0000000000 --- a/contrib/labstack/echo/echotrace_test.go +++ /dev/null @@ -1,538 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package echo - -import ( - "errors" - "fmt" - "net/http" - "net/http/httptest" - "strings" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - - "github.com/labstack/echo" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestChildSpan(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool - - router := echo.New() - router.Use(Middleware(WithServiceName("foobar"))) - router.GET("/user/:id", func(c echo.Context) error { - called = true - _, traced = tracer.SpanFromContext(c.Request().Context()) - return c.NoContent(200) - }) - - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify traces look good - assert.True(called) - assert.True(traced) -} - -func TestWithHeaderTags(t *testing.T) { - setupReq := func(opts ...Option) *http.Request { - router := echo.New() - router.Use(Middleware(opts...)) - - router.GET("/test", func(c echo.Context) error { - return c.String(http.StatusOK, "test") - }) - r := httptest.NewRequest("GET", "/test", nil) - r.Header.Set("h!e@a-d.e*r", "val") - r.Header.Add("h!e@a-d.e*r", "val2") - r.Header.Set("2header", "2val") - r.Header.Set("3header", "3val") - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - return r - } - t.Run("default-off", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - htArgs := []string{"h!e@a-d.e*r", "2header", "3header"} - setupReq() - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) - assert.NotContains(s.Tags(), tag) - } - }) - t.Run("integration", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - }) - - t.Run("global", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) - - r := setupReq() - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) - - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} - r := setupReq(WithHeaderTags(htArgs)) - spans := mt.FinishedSpans() - assert := assert.New(t) - assert.Equal(len(spans), 1) - s := spans[0] - - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) - }) -} - -func TestTrace200(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool - - router := echo.New() - router.Use(Middleware(WithServiceName("foobar"), WithAnalytics(false))) - router.GET("/user/:id", func(c echo.Context) error { - called = true - var span tracer.Span - span, traced = tracer.SpanFromContext(c.Request().Context()) - - // we patch the span on the request context. - span.SetTag("test.echo", "echony") - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") - return c.NoContent(200) - }) - - root := tracer.StartSpan("root") - r := httptest.NewRequest("GET", "/user/123", nil) - err := tracer.Inject(root.Context(), tracer.HTTPHeadersCarrier(r.Header)) - assert.Nil(err) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify traces look good - assert.True(called) - assert.True(traced) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Equal("echony", span.Tag("test.echo")) - assert.Contains(span.Tag(ext.ResourceName), "/user/:id") - assert.Equal("200", span.Tag(ext.HTTPCode)) - assert.Equal("GET", span.Tag(ext.HTTPMethod)) - assert.Equal(root.Context().SpanID(), span.ParentID()) - assert.Equal("labstack/echo", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - - assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) -} - -func TestTraceAnalytics(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool - - router := echo.New() - router.Use(Middleware(WithServiceName("foobar"), WithAnalytics(true))) - router.GET("/user/:id", func(c echo.Context) error { - called = true - var span tracer.Span - span, traced = tracer.SpanFromContext(c.Request().Context()) - - // we patch the span on the request context. - span.SetTag("test.echo", "echony") - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") - return c.NoContent(200) - }) - - root := tracer.StartSpan("root") - r := httptest.NewRequest("GET", "/user/123", nil) - err := tracer.Inject(root.Context(), tracer.HTTPHeadersCarrier(r.Header)) - assert.Nil(err) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify traces look good - assert.True(called) - assert.True(traced) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Equal("echony", span.Tag("test.echo")) - assert.Contains(span.Tag(ext.ResourceName), "/user/:id") - assert.Equal("200", span.Tag(ext.HTTPCode)) - assert.Equal("GET", span.Tag(ext.HTTPMethod)) - assert.Equal(1.0, span.Tag(ext.EventSampleRate)) - assert.Equal(root.Context().SpanID(), span.ParentID()) - assert.Equal("labstack/echo", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - - assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) -} - -func TestError(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool - - // setup - router := echo.New() - router.Use(Middleware(WithServiceName("foobar"))) - wantErr := errors.New("oh no") - - // a handler with an error and make the requests - router.GET("/err", func(c echo.Context) error { - _, traced = tracer.SpanFromContext(c.Request().Context()) - called = true - - err := wantErr - c.Error(err) - return err - }) - r := httptest.NewRequest("GET", "/err", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify the errors and status are correct - assert.True(called) - assert.True(traced) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Equal("500", span.Tag(ext.HTTPCode)) - require.NotNil(t, span.Tag(ext.Error)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) - assert.Equal("labstack/echo", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) -} - -func TestErrorHandling(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool - - // setup - router := echo.New() - router.HTTPErrorHandler = func(err error, ctx echo.Context) { - ctx.Response().WriteHeader(http.StatusInternalServerError) - } - router.Use(Middleware(WithServiceName("foobar"))) - wantErr := errors.New("oh no") - - // a handler with an error and make the requests - router.GET("/err", func(c echo.Context) error { - _, traced = tracer.SpanFromContext(c.Request().Context()) - called = true - return wantErr - }) - r := httptest.NewRequest("GET", "/err", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify the errors and status are correct - assert.True(called) - assert.True(traced) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Equal("500", span.Tag(ext.HTTPCode)) - require.NotNil(t, span.Tag(ext.Error)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) - assert.Equal("labstack/echo", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) -} - -func TestStatusError(t *testing.T) { - for _, tt := range []struct { - isStatusError func(statusCode int) bool - err error - code string - handler func(c echo.Context) error - }{ - { - err: errors.New("oh no"), - code: "500", - handler: func(c echo.Context) error { - return errors.New("oh no") - }, - }, - { - err: echo.NewHTTPError(http.StatusInternalServerError, "my error message"), - code: "500", - handler: func(c echo.Context) error { - return echo.NewHTTPError(http.StatusInternalServerError, "my error message") - }, - }, - { - err: nil, - code: "400", - handler: func(c echo.Context) error { - return echo.NewHTTPError(http.StatusBadRequest, "my error message") - }, - }, - { - isStatusError: func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 }, - err: nil, - code: "500", - handler: func(c echo.Context) error { - return errors.New("oh no") - }, - }, - { - isStatusError: func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 }, - err: nil, - code: "500", - handler: func(c echo.Context) error { - return echo.NewHTTPError(http.StatusInternalServerError, "my error message") - }, - }, - { - isStatusError: func(statusCode int) bool { return statusCode >= 400 }, - err: echo.NewHTTPError(http.StatusBadRequest, "my error message"), - code: "400", - handler: func(c echo.Context) error { - return echo.NewHTTPError(http.StatusBadRequest, "my error message") - }, - }, - { - isStatusError: func(statusCode int) bool { return statusCode >= 200 }, - err: fmt.Errorf("201: Created"), - code: "201", - handler: func(c echo.Context) error { - c.JSON(201, map[string]string{"status": "ok", "type": "test"}) - return nil - }, - }, - { - isStatusError: func(statusCode int) bool { return statusCode >= 200 }, - err: fmt.Errorf("200: OK"), - code: "200", - handler: func(c echo.Context) error { - // It's not clear if unset (0) status is possible naturally, but we can simulate that situation. - c.Response().Status = 0 - return nil - }, - }, - } { - t.Run("", func(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - router := echo.New() - opts := []Option{WithServiceName("foobar")} - if tt.isStatusError != nil { - opts = append(opts, WithStatusCheck(tt.isStatusError)) - } - router.Use(Middleware(opts...)) - router.GET("/err", tt.handler) - r := httptest.NewRequest("GET", "/err", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Equal("foobar", span.Tag(ext.ServiceName)) - assert.Contains(span.Tag(ext.ResourceName), "/err") - assert.Equal(tt.code, span.Tag(ext.HTTPCode)) - assert.Equal("GET", span.Tag(ext.HTTPMethod)) - err := span.Tag(ext.Error) - if tt.err != nil { - assert.NotNil(err) - require.NotNil(t, span.Tag(ext.Error)) - assert.Equal(tt.err.Error(), err.(error).Error()) - } else { - assert.Nil(err) - } - }) - } -} - -func TestGetSpanNotInstrumented(t *testing.T) { - assert := assert.New(t) - router := echo.New() - var called, traced bool - - router.GET("/ping", func(c echo.Context) error { - // Assert we don't have a span on the context. - called = true - _, traced = tracer.SpanFromContext(c.Request().Context()) - return c.NoContent(200) - }) - - r := httptest.NewRequest("GET", "/ping", nil) - w := httptest.NewRecorder() - - router.ServeHTTP(w, r) - assert.True(called) - assert.False(traced) -} - -func TestNoDebugStack(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - var called, traced bool - - // setup - router := echo.New() - router.Use(Middleware(NoDebugStack())) - wantErr := errors.New("oh no") - - // a handler with an error and make the requests - router.GET("/err", func(c echo.Context) error { - _, traced = tracer.SpanFromContext(c.Request().Context()) - called = true - - err := wantErr - c.Error(err) - return err - }) - r := httptest.NewRequest("GET", "/err", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - // verify the error is correct and the stacktrace is disabled - assert.True(called) - assert.True(traced) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - - span := spans[0] - require.NotNil(t, span.Tag(ext.Error)) - assert.Equal(wantErr.Error(), span.Tag(ext.Error).(error).Error()) - assert.Equal("", span.Tag(ext.ErrorStack)) - assert.Equal("labstack/echo", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) -} - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := echo.New() - mux.Use(Middleware(opts...)) - mux.GET("/200", func(c echo.Context) error { - return c.NoContent(200) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "echo")(t) -} - -func BenchmarkEchoNoTracing(b *testing.B) { - mux := echo.New() - mux.GET("/200", func(c echo.Context) error { - return c.NoContent(200) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - mux.ServeHTTP(w, r) - } -} - -func BenchmarkEchoWithTracing(b *testing.B) { - tracer.Start(tracer.WithLogger(log.DiscardLogger{})) - defer tracer.Stop() - - mux := echo.New() - mux.Use(Middleware()) - mux.GET("/200", func(c echo.Context) error { - return c.NoContent(200) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - - b.ResetTimer() - for i := 0; i < b.N; i++ { - mux.ServeHTTP(w, r) - } -} diff --git a/contrib/labstack/echo/example_test.go b/contrib/labstack/echo/example_test.go deleted file mode 100644 index b6786f7eeb..0000000000 --- a/contrib/labstack/echo/example_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package echo - -import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - "github.com/labstack/echo" -) - -// To start tracing requests, add the trace middleware to your echo router. -func Example() { - r := echo.New() - - // Use the tracer middleware with your desired service name. - r.Use(Middleware(WithServiceName("my-web-app"))) - - // Set up an endpoint. - r.GET("/hello", func(c echo.Context) error { - return c.String(200, "hello world!") - }) - - // ...and listen for incoming requests - r.Start(":8080") -} - -// An example illustrating tracing a child operation within the main context. -func Example_spanFromContext() { - // Create a new instance of echo - r := echo.New() - - // Use the tracer middleware with your desired service name. - r.Use(Middleware(WithServiceName("image-encoder"))) - - // Set up some endpoints. - r.GET("/image/encode", func(c echo.Context) error { - // create a child span to track an operation - span, _ := tracer.StartSpanFromContext(c.Request().Context(), "image.encode") - - // encode an image ... - - // finish the child span - span.Finish() - - return c.String(200, "ok!") - }) -} diff --git a/contrib/labstack/echo/option.go b/contrib/labstack/echo/option.go deleted file mode 100644 index d65a9d2772..0000000000 --- a/contrib/labstack/echo/option.go +++ /dev/null @@ -1,101 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package echo - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" -) - -const defaultServiceName = "echo" - -type config struct { - serviceName string - analyticsRate float64 - noDebugStack bool - isStatusError func(statusCode int) bool - headerTags *internal.LockMap -} - -// Option represents an option that can be passed to Middleware. -type Option func(*config) - -func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - if internal.BoolEnv("DD_TRACE_ECHO_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - cfg.headerTags = globalconfig.HeaderTagMap() - cfg.isStatusError = isServerError -} - -// WithServiceName sets the given service name for the system. -func WithServiceName(name string) Option { - return func(cfg *config) { - cfg.serviceName = name - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(cfg *config) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(cfg *config) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// NoDebugStack prevents stack traces from being attached to spans finishing -// with an error. This is useful in situations where errors are frequent and -// performance is critical. -func NoDebugStack() Option { - return func(cfg *config) { - cfg.noDebugStack = true - } -} - -// WithStatusCheck specifies a function fn which reports whether the passed -// statusCode should be considered an error. -func WithStatusCheck(fn func(statusCode int) bool) Option { - return func(cfg *config) { - cfg.isStatusError = fn - } -} - -func isServerError(statusCode int) bool { - return statusCode >= 500 && statusCode < 600 -} - -// WithHeaderTags enables the integration to attach HTTP request headers as span tags. -// Warning: -// Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. -// Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) - return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) - } -} diff --git a/contrib/log/slog/example_test.go b/contrib/log/slog/example_test.go index 0e5683b897..2e1789a710 100644 --- a/contrib/log/slog/example_test.go +++ b/contrib/log/slog/example_test.go @@ -10,8 +10,8 @@ import ( "log/slog" "os" - slogtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/log/slog" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + slogtrace "github.com/DataDog/dd-trace-go/contrib/log/slog/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func ExampleNewJSONHandler() { diff --git a/contrib/log/slog/go.mod b/contrib/log/slog/go.mod new file mode 100644 index 0000000000..3d8567878b --- /dev/null +++ b/contrib/log/slog/go.mod @@ -0,0 +1,92 @@ +module github.com/DataDog/dd-trace-go/contrib/log/slog/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/log/slog/go.sum b/contrib/log/slog/go.sum new file mode 100644 index 0000000000..caa4165cda --- /dev/null +++ b/contrib/log/slog/go.sum @@ -0,0 +1,309 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/log/slog/orchestrion.yml b/contrib/log/slog/orchestrion.yml new file mode 100644 index 0000000000..acf0bf06f3 --- /dev/null +++ b/contrib/log/slog/orchestrion.yml @@ -0,0 +1,52 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/log/slog/v2 + description: |- + Package slog provides structured logging, in which log records include a message, a severity level, and various + other attributes expressed as key-value pairs. + +aspects: + - id: New + join-point: + all-of: + - import-path: log/slog + - function-body: + function: + - name: New + advice: + - inject-declarations: + # We need to use go:linkname to refer to a number of declarations in order to avoid creating + # circular dependencies, as these features have transitive dependencies on `log/slog`... + links: + - github.com/DataDog/dd-trace-go/contrib/log/slog/v2 + template: |- + //go:linkname __dd_slogtrace_WrapHandler github.com/DataDog/dd-trace-go/contrib/log/slog/v2.WrapHandler + func __dd_slogtrace_WrapHandler(Handler) Handler + - prepend-statements: + template: |- + {{ .Function.Argument 0 }} = __dd_slogtrace_WrapHandler({{ .Function.Argument 0 }}) + - id: SetDefault + join-point: + all-of: + - import-path: log/slog + - function-body: + function: + - name: SetDefault + advice: + - inject-declarations: + links: + - github.com/DataDog/dd-trace-go/contrib/log/slog/v2 + template: |- + //go:linkname __dd_slogtrace_IsAlreadyWrapped github.com/DataDog/dd-trace-go/contrib/log/slog/v2.IsAlreadyWrapped + func __dd_slogtrace_IsAlreadyWrapped(Handler) bool + - prepend-statements: + template: |- + if __dd_slogtrace_IsAlreadyWrapped({{ .Function.Argument 0 }}.Handler()) { + defaultLogger.Store({{ .Function.Argument 0 }}) + return + } diff --git a/contrib/log/slog/slog.go b/contrib/log/slog/slog.go index 5cb0fcbdc2..682e815a59 100644 --- a/contrib/log/slog/slog.go +++ b/contrib/log/slog/slog.go @@ -4,23 +4,41 @@ // Copyright 2016 Datadog, Inc. // Package slog provides functions to correlate logs and traces using log/slog package (https://pkg.go.dev/log/slog). -package slog // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/log/slog" +package slog // import "github.com/DataDog/dd-trace-go/contrib/log/slog/v2" import ( "context" "io" "log/slog" + "strconv" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" ) -const componentName = "log/slog" +var cfg = newConfig() func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("log/slog") + _ = instrumentation.Load(instrumentation.PackageLogSlog) +} + +var _ slog.Handler = (*handler)(nil) + +type group struct { + name string + attrs []slog.Attr +} + +type config struct { + log128bits bool +} + +func newConfig() *config { + return &config{ + log128bits: options.GetBoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", true), + } } // NewJSONHandler is a convenience function that returns a *slog.JSONHandler logger enhanced with @@ -31,22 +49,86 @@ func NewJSONHandler(w io.Writer, opts *slog.HandlerOptions) slog.Handler { // WrapHandler enhances the given logger handler attaching tracing information to logs. func WrapHandler(h slog.Handler) slog.Handler { - return &handler{h} + return &handler{wrapped: h} } type handler struct { - slog.Handler + wrapped slog.Handler + groups []group +} + +// Enabled calls the wrapped handler Enabled method. +func (h *handler) Enabled(ctx context.Context, level slog.Level) bool { + return h.wrapped.Enabled(ctx, level) } // Handle handles the given Record, attaching tracing information if found. func (h *handler) Handle(ctx context.Context, rec slog.Record) error { + reqHandler := h.wrapped + + // We need to ensure the trace id and span id keys are set at the root level: + // https://docs.datadoghq.com/tracing/other_telemetry/connect_logs_and_traces/ + // In case the user has created group loggers, we ignore those and + // set them at the root level. span, ok := tracer.SpanFromContext(ctx) - if ok { - rec = rec.Clone() - rec.Add( - slog.Uint64(ext.LogKeyTraceID, span.Context().TraceID()), - slog.Uint64(ext.LogKeySpanID, span.Context().SpanID()), - ) + if ok && span.Context().TraceID() != tracer.TraceIDZero { + var traceID string + if cfg.log128bits { + traceID = span.Context().TraceID() + } else { + traceID = strconv.FormatUint(span.Context().TraceIDLower(), 10) + } + + spanID := strconv.FormatUint(span.Context().SpanID(), 10) + + attrs := []slog.Attr{ + slog.String(ext.LogKeyTraceID, traceID), + slog.String(ext.LogKeySpanID, spanID), + } + reqHandler = reqHandler.WithAttrs(attrs) + } + for _, g := range h.groups { + reqHandler = reqHandler.WithGroup(g.name) + if len(g.attrs) > 0 { + reqHandler = reqHandler.WithAttrs(g.attrs) + } + } + return reqHandler.Handle(ctx, rec) +} + +// WithAttrs saves the provided attributes associated to the current Group. +// If Group was not called for the logger, we just call WithAttrs for the wrapped handler. +func (h *handler) WithAttrs(attrs []slog.Attr) slog.Handler { + if len(h.groups) == 0 { + return &handler{ + wrapped: h.wrapped.WithAttrs(attrs), + groups: h.groups, + } + } + groups := append([]group{}, h.groups...) + curGroup := groups[len(groups)-1] + curGroup.attrs = append(curGroup.attrs, attrs...) + groups[len(groups)-1] = curGroup + + return &handler{ + wrapped: h.wrapped, + groups: groups, + } +} + +// WithGroup saves the provided group to be used later in the Handle method. +func (h *handler) WithGroup(name string) slog.Handler { + return &handler{ + wrapped: h.wrapped, + groups: append(h.groups, group{name: name}), } - return h.Handler.Handle(ctx, rec) +} + +// IsAlreadyWrapped checks whether the given handler is already wrapped by this package. +// This can happen when a lot of packages are using slog and you want to avoid double wrapping. +// This was originally created to avoid a deadlock in calling slog.SetDefault multiple times. +// See https://github.com/golang/go/blob/86c5e2d025b6923424540d653a0c59cafc7571ca/src/log/slog/logger.go#L64-L69 +func IsAlreadyWrapped(h slog.Handler) bool { + _, ok := h.(*handler) + return ok } diff --git a/contrib/log/slog/slog_test.go b/contrib/log/slog/slog_test.go index 86254dde88..a1cc95831a 100644 --- a/contrib/log/slog/slog_test.go +++ b/contrib/log/slog/slog_test.go @@ -11,45 +11,85 @@ import ( "encoding/json" "io" "log/slog" + "os" + "strconv" "strings" "testing" + "testing/slogtest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - internallog "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) -func assertLogEntry(t *testing.T, rawEntry, wantMsg, wantLevel string) { +func assertLogEntry(t *testing.T, rawEntry, wantMsg, wantLevel string, traceID string, spanID string, assertExtra func(t *testing.T, entry map[string]interface{})) { t.Helper() - var data map[string]interface{} - err := json.Unmarshal([]byte(rawEntry), &data) + t.Log(rawEntry) + + var entry map[string]interface{} + err := json.Unmarshal([]byte(rawEntry), &entry) + require.NoError(t, err) + require.NotEmpty(t, entry) + + assert.Equal(t, wantMsg, entry["msg"]) + assert.Equal(t, wantLevel, entry["level"]) + assert.NotEmpty(t, entry["time"]) + + assert.Equal(t, traceID, entry[ext.LogKeyTraceID], "trace id not found") + assert.Equal(t, spanID, entry[ext.LogKeySpanID], "span id not found") + + if assertExtra != nil { + assertExtra(t, entry) + } +} + +func assertLogEntryNoTrace(t *testing.T, rawEntry, wantMsg, wantLevel string) { + t.Helper() + + t.Log(rawEntry) + + var entry map[string]interface{} + err := json.Unmarshal([]byte(rawEntry), &entry) require.NoError(t, err) - require.NotEmpty(t, data) + require.NotEmpty(t, entry) + + assert.Equal(t, wantMsg, entry["msg"]) + assert.Equal(t, wantLevel, entry["level"]) + assert.NotEmpty(t, entry["time"]) - assert.Equal(t, wantMsg, data["msg"]) - assert.Equal(t, wantLevel, data["level"]) - assert.NotEmpty(t, data["time"]) - assert.NotEmpty(t, data[ext.LogKeyTraceID]) - assert.NotEmpty(t, data[ext.LogKeySpanID]) + assert.NotContains(t, entry, ext.LogKeyTraceID) + assert.NotContains(t, entry, ext.LogKeySpanID) } -func testLogger(t *testing.T, createHandler func(b *bytes.Buffer) slog.Handler) { - tracer.Start(tracer.WithLogger(internallog.DiscardLogger{})) +func testLogger(t *testing.T, createLogger func(b io.Writer) *slog.Logger, assertExtra func(t *testing.T, entry map[string]interface{})) { + tracer.Start( + tracer.WithTraceEnabled(true), + tracer.WithLogger(testutils.DiscardLogger()), + ) defer tracer.Stop() // create the application logger var b bytes.Buffer - h := createHandler(&b) - logger := slog.New(h) + logger := createLogger(&b) // start a new span span, ctx := tracer.StartSpanFromContext(context.Background(), "test") defer span.Finish() + var traceID string + spanID := strconv.FormatUint(span.Context().SpanID(), 10) + if os.Getenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED") == "false" { + // Re-initialize to account for race condition between setting env var in the test and reading it in the contrib + cfg = newConfig() + traceID = strconv.FormatUint(span.Context().TraceIDLower(), 10) + } else { + traceID = span.Context().TraceID() + } + // log a message using the context containing span information logger.Log(ctx, slog.LevelInfo, "this is an info log with tracing information") logger.Log(ctx, slog.LevelError, "this is an error log with tracing information") @@ -60,19 +100,134 @@ func testLogger(t *testing.T, createHandler func(b *bytes.Buffer) slog.Handler) ) // assert log entries contain trace information require.Len(t, logs, 2) - assertLogEntry(t, logs[0], "this is an info log with tracing information", "INFO") - assertLogEntry(t, logs[1], "this is an error log with tracing information", "ERROR") + assertLogEntry(t, logs[0], "this is an info log with tracing information", "INFO", traceID, spanID, assertExtra) + assertLogEntry(t, logs[1], "this is an error log with tracing information", "ERROR", traceID, spanID, assertExtra) +} + +func testLoggerNoTrace(t *testing.T, createLogger func(b io.Writer) *slog.Logger) { + tracer.Start( + tracer.WithTraceEnabled(false), + tracer.WithLogger(testutils.DiscardLogger()), + ) + defer tracer.Stop() + + // create the application logger + var b bytes.Buffer + logger := createLogger(&b) + + // start a new span + span, ctx := tracer.StartSpanFromContext(context.Background(), "test") + defer span.Finish() + + // log a message using the context containing span information + logger.Log(ctx, slog.LevelInfo, "this is an info log with tracing information") + logger.Log(ctx, slog.LevelError, "this is an error log with tracing information") + + logs := strings.Split( + strings.TrimRight(b.String(), "\n"), + "\n", + ) + // assert log entries contain trace information + require.Len(t, logs, 2) + assertLogEntryNoTrace(t, logs[0], "this is an info log with tracing information", "INFO") + assertLogEntryNoTrace(t, logs[1], "this is an error log with tracing information", "ERROR") } func TestNewJSONHandler(t *testing.T) { - testLogger(t, func(b *bytes.Buffer) slog.Handler { - return NewJSONHandler(b, nil) - }) + createLogger := func(w io.Writer) *slog.Logger { + return slog.New(NewJSONHandler(w, nil)) + } + testLogger(t, createLogger, nil) + testLoggerNoTrace(t, createLogger) } func TestWrapHandler(t *testing.T) { - testLogger(t, func(b *bytes.Buffer) slog.Handler { - return WrapHandler(slog.NewJSONHandler(b, nil)) + t.Run("testLogger", func(t *testing.T) { + createLogger := func(w io.Writer) *slog.Logger { + return slog.New(WrapHandler(slog.NewJSONHandler(w, nil))) + } + testLogger(t, createLogger, nil) + testLoggerNoTrace(t, createLogger) + }) + + t.Run("slogtest", func(t *testing.T) { + var buf bytes.Buffer + h := WrapHandler(slog.NewJSONHandler(&buf, nil)) + results := func() []map[string]any { + var ms []map[string]any + for _, line := range bytes.Split(buf.Bytes(), []byte{'\n'}) { + if len(line) == 0 { + continue + } + var m map[string]any + require.NoError(t, json.Unmarshal(line, &m)) + ms = append(ms, m) + } + return ms + } + require.NoError(t, slogtest.TestHandler(h, results)) + }) +} + +func TestHandlerWithAttrs(t *testing.T) { + testLogger( + t, + func(w io.Writer) *slog.Logger { + return slog.New(NewJSONHandler(w, nil)). + With("key1", "val1"). + With(ext.LogKeyTraceID, "trace-id"). + With(ext.LogKeySpanID, "span-id") + }, + nil, + ) +} + +func TestHandlerWithGroup(t *testing.T) { + t.Run("simple", func(t *testing.T) { + testLogger( + t, + func(w io.Writer) *slog.Logger { + return slog.New(NewJSONHandler(w, nil)). + WithGroup("some-group"). + With("key1", "val1") + }, + func(t *testing.T, entry map[string]interface{}) { + assert.Equal(t, map[string]interface{}{ + "key1": "val1", + }, entry["some-group"], "group entry not found") + }, + ) + }) + + t.Run("nested groups", func(t *testing.T) { + testLogger( + t, + func(w io.Writer) *slog.Logger { + return slog.New(NewJSONHandler(w, nil)). + With("key0", "val0"). + WithGroup("group1"). + With("key1", "val1"). + WithGroup("group1"). // repeat same key again + With("key1", "val1"). + WithGroup("group2"). + With("key2", "val2"). + With("key3", "val3") + }, + func(t *testing.T, entry map[string]interface{}) { + groupKeys := map[string]interface{}{ + "key1": "val1", + "group1": map[string]interface{}{ + "key1": "val1", + "group2": map[string]interface{}{ + "key2": "val2", + "key3": "val3", + }, + }, + } + assert.Equal(t, "val0", entry["key0"], "root level key not found") + assert.Equal(t, groupKeys, entry["group1"], "nested group entries not found") + }, + ) }) } @@ -106,6 +261,34 @@ func TestRecordClone(t *testing.T) { assert.True(t, foundSentinel) } +func Test128BitLoggingDisabled(t *testing.T) { + os.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") + defer os.Unsetenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED") + t.Run("testLogger", func(t *testing.T) { + testLogger( + t, + func(w io.Writer) *slog.Logger { + return slog.New(WrapHandler(slog.NewJSONHandler(w, nil))) + }, + nil, + ) + }) +} + +func BenchmarkHandler(b *testing.B) { + span, ctx := tracer.StartSpanFromContext(context.Background(), "test") + defer span.Finish() + + // create a logger with a bunch of nested groups and fields + logger := slog.New(NewJSONHandler(io.Discard, nil)) + logger = logger.With("attr1", "val1").WithGroup("group1").With("attr2", "val2").WithGroup("group3").With("attr3", "val3") + + b.ResetTimer() + for i := 0; i < b.N; i++ { + logger.InfoContext(ctx, "some message") + } +} + // handlerGate calls a gate function before calling the underlying handler. This // allows simulating a concurrent modification of the record that happens after // Handle is called (and the record has been copied), but before the back array diff --git a/contrib/miekg/dns/dns.go b/contrib/miekg/dns/dns.go index 95b003ae46..b58e5e0d4a 100644 --- a/contrib/miekg/dns/dns.go +++ b/contrib/miekg/dns/dns.go @@ -11,20 +11,17 @@ import ( "net" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/miekg/dns" ) -const componentName = "miekg/dns" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/miekg/dns") + instr = instrumentation.Load(instrumentation.PackageMiekgDNS) } // ListenAndServe calls dns.ListenAndServe with a wrapped Handler. @@ -44,7 +41,7 @@ type Handler struct { // WrapHandler creates a new, wrapped DNS handler. func WrapHandler(handler dns.Handler) *Handler { - log.Debug("contrib/miekg/dns: Wrapping Handler") + instr.Logger().Debug("contrib/miekg/dns: Wrapping Handler") return &Handler{ Handler: handler, } @@ -118,21 +115,21 @@ func (c *Client) ExchangeContext(ctx context.Context, m *dns.Msg, addr string) ( return r, rtt, err } -func startSpan(ctx context.Context, opcode int) (ddtrace.Span, context.Context) { +func startSpan(ctx context.Context, opcode int) (*tracer.Span, context.Context) { return tracer.StartSpanFromContext(ctx, "dns.request", tracer.ServiceName("dns"), tracer.ResourceName(dns.OpcodeToString[opcode]), tracer.SpanType(ext.SpanTypeDNS), - tracer.Tag(ext.Component, componentName)) + tracer.Tag(ext.Component, instrumentation.PackageMiekgDNS)) } -func startClientSpan(ctx context.Context, opcode int) (ddtrace.Span, context.Context) { +func startClientSpan(ctx context.Context, opcode int) (*tracer.Span, context.Context) { span, ctx := startSpan(ctx, opcode) span.SetTag(ext.SpanKind, ext.SpanKindClient) return span, ctx } -func startServerSpan(ctx context.Context, opcode int) (ddtrace.Span, context.Context) { +func startServerSpan(ctx context.Context, opcode int) (*tracer.Span, context.Context) { span, ctx := startSpan(ctx, opcode) span.SetTag(ext.SpanKind, ext.SpanKindServer) return span, ctx diff --git a/contrib/miekg/dns/dns_test.go b/contrib/miekg/dns/dns_test.go index c1efa2a799..f2e8a67740 100644 --- a/contrib/miekg/dns/dns_test.go +++ b/contrib/miekg/dns/dns_test.go @@ -8,12 +8,13 @@ package dns_test import ( "context" "net" + "sync" "testing" "time" - dnstrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/miekg/dns" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" + dnstrace "github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" "github.com/miekg/dns" "github.com/stretchr/testify/assert" @@ -28,44 +29,46 @@ func (th *testHandler) ServeDNS(w dns.ResponseWriter, r *dns.Msg) { w.WriteMsg(m) } -func startServer(t *testing.T, traced bool) (*dns.Server, func()) { +func startServer(t *testing.T, traced bool) (*dns.Server, string) { var h dns.Handler = &testHandler{} if traced { h = dnstrace.WrapHandler(h) } - addr := getFreeAddr(t).String() - server := &dns.Server{ - Addr: addr, - Net: "udp", - Handler: h, + pc, err := net.ListenPacket("udp", "127.0.0.1:0") + require.NoError(t, err) + + srv := &dns.Server{ + PacketConn: pc, + ReadTimeout: time.Hour, + WriteTimeout: time.Hour, + Handler: h, } - // start the server + waitLock := sync.Mutex{} + waitLock.Lock() + srv.NotifyStartedFunc = waitLock.Unlock + go func() { - err := server.ListenAndServe() - if err != nil { - t.Error(err) - } + require.NoError(t, srv.ActivateAndServe()) }() - waitTillUDPReady(addr) - stopServer := func() { - err := server.Shutdown() - assert.NoError(t, err) - } - return server, stopServer + t.Cleanup(func() { + require.NoError(t, srv.Shutdown()) + }) + + waitLock.Lock() + return srv, pc.LocalAddr().String() } func TestExchange(t *testing.T) { - server, stopServer := startServer(t, false) - defer stopServer() + _, addr := startServer(t, false) mt := mocktracer.Start() defer mt.Stop() m := newMessage() - _, err := dnstrace.Exchange(m, server.Addr) - assert.NoError(t, err) + _, err := dnstrace.Exchange(m, addr) + require.NoError(t, err) spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -73,16 +76,15 @@ func TestExchange(t *testing.T) { } func TestExchangeContext(t *testing.T) { - server, stopServer := startServer(t, false) - defer stopServer() + _, addr := startServer(t, false) mt := mocktracer.Start() defer mt.Stop() m := newMessage() - _, err := dnstrace.ExchangeContext(context.Background(), m, server.Addr) - assert.NoError(t, err) + _, err := dnstrace.ExchangeContext(context.Background(), m, addr) + require.NoError(t, err) spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -90,19 +92,18 @@ func TestExchangeContext(t *testing.T) { } func TestExchangeConn(t *testing.T) { - server, stopServer := startServer(t, false) - defer stopServer() + _, addr := startServer(t, false) mt := mocktracer.Start() defer mt.Stop() m := newMessage() - conn, err := net.Dial("udp", server.Addr) + conn, err := net.Dial("udp", addr) require.NoError(t, err) _, err = dnstrace.ExchangeConn(conn, m) - assert.NoError(t, err) + require.NoError(t, err) spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -110,18 +111,16 @@ func TestExchangeConn(t *testing.T) { } func TestClient_Exchange(t *testing.T) { - server, stopServer := startServer(t, false) - defer stopServer() + _, addr := startServer(t, false) mt := mocktracer.Start() defer mt.Stop() m := newMessage() - client := newTracedClient() - _, _, err := client.Exchange(m, server.Addr) - assert.NoError(t, err) + _, _, err := client.Exchange(m, addr) + require.NoError(t, err) spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -129,18 +128,16 @@ func TestClient_Exchange(t *testing.T) { } func TestClient_ExchangeContext(t *testing.T) { - server, stopServer := startServer(t, false) - defer stopServer() + _, addr := startServer(t, false) mt := mocktracer.Start() defer mt.Stop() m := newMessage() - client := newTracedClient() - _, _, err := client.ExchangeContext(context.Background(), m, server.Addr) - assert.NoError(t, err) + _, _, err := client.ExchangeContext(context.Background(), m, addr) + require.NoError(t, err) spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -148,16 +145,18 @@ func TestClient_ExchangeContext(t *testing.T) { } func TestWrapHandler(t *testing.T) { - server, stopServer := startServer(t, true) + _, addr := startServer(t, true) mt := mocktracer.Start() defer mt.Stop() m := newMessage() - _, err := dns.Exchange(m, server.Addr) - assert.NoError(t, err) + client := newClient() + + _, _, err := client.Exchange(m, addr) + require.NoError(t, err) - stopServer() // Shutdown server so span is closed after DNS request + waitForSpans(mt, 1) spans := mt.FinishedSpans() require.Len(t, spans, 1) @@ -168,6 +167,7 @@ func TestWrapHandler(t *testing.T) { assert.Equal(t, "dns", span.Tag(ext.ServiceName)) assert.Equal(t, "QUERY", span.Tag(ext.ResourceName)) assert.Equal(t, "miekg/dns", span.Tag(ext.Component)) + assert.Equal(t, "miekg/dns", span.Integration()) assert.Equal(t, ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -177,37 +177,33 @@ func newMessage() *dns.Msg { return m } +func newClient() *dns.Client { + return &dns.Client{Net: "udp"} +} + func newTracedClient() *dnstrace.Client { - return &dnstrace.Client{Client: &dns.Client{Net: "udp"}} + return &dnstrace.Client{Client: newClient()} } -func assertClientSpan(t *testing.T, s mocktracer.Span) { +func assertClientSpan(t *testing.T, s *mocktracer.Span) { assert.Equal(t, "dns.request", s.OperationName()) assert.Equal(t, "dns", s.Tag(ext.SpanType)) assert.Equal(t, "dns", s.Tag(ext.ServiceName)) assert.Equal(t, "QUERY", s.Tag(ext.ResourceName)) assert.Equal(t, "miekg/dns", s.Tag(ext.Component)) + assert.Equal(t, "miekg/dns", s.Integration()) assert.Equal(t, ext.SpanKindClient, s.Tag(ext.SpanKind)) } -func getFreeAddr(t *testing.T) net.Addr { - li, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - addr := li.Addr() - li.Close() - return addr -} +func waitForSpans(mt mocktracer.Tracer, sz int) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() -func waitTillUDPReady(addr string) { - deadline := time.Now().Add(time.Second * 10) - for time.Now().Before(deadline) { - m := new(dns.Msg) - m.SetQuestion("miek.nl.", dns.TypeMX) - _, err := dns.Exchange(m, addr) - if err == nil { - break + for len(mt.FinishedSpans()) < sz { + select { + case <-ctx.Done(): + return + default: } time.Sleep(time.Millisecond * 100) } diff --git a/contrib/miekg/dns/example_test.go b/contrib/miekg/dns/example_test.go index 31b78ebf90..42bdbef7a7 100644 --- a/contrib/miekg/dns/example_test.go +++ b/contrib/miekg/dns/example_test.go @@ -8,7 +8,7 @@ package dns_test import ( "fmt" - dnstrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/miekg/dns" + dnstrace "github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2" "github.com/miekg/dns" ) diff --git a/contrib/miekg/dns/go.mod b/contrib/miekg/dns/go.mod new file mode 100644 index 0000000000..0bcff71e84 --- /dev/null +++ b/contrib/miekg/dns/go.mod @@ -0,0 +1,95 @@ +module github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/miekg/dns v1.1.55 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/miekg/dns/go.sum b/contrib/miekg/dns/go.sum new file mode 100644 index 0000000000..0a5e217038 --- /dev/null +++ b/contrib/miekg/dns/go.sum @@ -0,0 +1,315 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/net/http/appsec_test.go b/contrib/net/http/appsec_test.go new file mode 100644 index 0000000000..fa21293646 --- /dev/null +++ b/contrib/net/http/appsec_test.go @@ -0,0 +1,340 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package http + +import ( + "context" + "fmt" + "io" + "net/http" + "net/http/httptest" + "strconv" + "strings" + "testing" + + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/stretchr/testify/require" +) + +func TestAppsec(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/rasp.json") + + client := WrapRoundTripper(&emptyRoundTripper{}) + + for _, enabled := range []bool{true, false} { + + t.Run(strconv.FormatBool(enabled), func(t *testing.T) { + t.Setenv("DD_APPSEC_RASP_ENABLED", strconv.FormatBool(enabled)) + + mt := mocktracer.Start() + defer mt.Stop() + + testutils.StartAppSec(t) + if !internal.Instrumentation.AppSecEnabled() { + t.Skip("appsec not enabled") + } + + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", "?value=169.254.169.254", nil) + require.NoError(t, err) + + TraceAndServe(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + req, err := http.NewRequestWithContext(r.Context(), "GET", "http://169.254.169.254/", nil) + require.NoError(t, err) + + resp, err := client.RoundTrip(req) + + if enabled { + require.True(t, events.IsSecurityError(err)) + } else { + require.NoError(t, err) + } + + if resp != nil { + defer resp.Body.Close() + } + }), w, r, &ServeConfig{ + Service: "service", + Resource: "resource", + }) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) // service entry serviceSpan & http request serviceSpan + serviceSpan := spans[1] + + if !enabled { + require.NotContains(t, serviceSpan.Tags(), "_dd.appsec.json") + require.NotContains(t, serviceSpan.Tags(), "_dd.stack") + return + } + + require.Contains(t, serviceSpan.Tags(), "_dd.appsec.json") + appsecJSON := serviceSpan.Tag("_dd.appsec.json") + require.Contains(t, appsecJSON, addresses.ServerIONetURLAddr) + + require.Contains(t, serviceSpan.Tags(), "_dd.stack") + require.NotContains(t, serviceSpan.Tags(), "error.message") + + // This is a nested event so it should contain the child span id in the service entry span + // TODO(eliott.bouhana): uncomment this once we have the child span id in the service entry span + // require.Contains(t, appsecJSON, `"span_id":`+strconv.FormatUint(requestSpan.SpanID(), 10)) + }) + } +} + +func TestAppsecAPI10(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/api10.json") + t.Setenv("DD_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE", "1.0") + + var b strings.Builder + b.WriteString(`{"payload_in":"%s"`) + for i := 0; i < 1<<12; i++ { + b.WriteString(fmt.Sprintf(`,"%d":"b"`, i)) + } + b.WriteString(`}`) + + for _, tc := range []struct { + name string + request func(ctx context.Context) *http.Request + response *http.Response + tagName string + tagValue string + }{ + { + name: "method", + request: func(ctx context.Context) *http.Request { + req, _ := http.NewRequestWithContext(ctx, "TRACE", "http://localhost:8080/", nil) + return req + }, + tagName: "_dd.appsec.trace.req_method", + tagValue: "TAG_API10_REQ_METHOD", + }, + { + name: "headers", + request: func(ctx context.Context) *http.Request { + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", nil) + req.Header.Set("Witness", "pwq3ojtropiw3hjtowir") + return req + }, + tagName: "_dd.appsec.trace.req_headers", + tagValue: "TAG_API10_REQ_HEADERS", + }, + { + name: "body", + request: func(ctx context.Context) *http.Request { + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", io.NopCloser(strings.NewReader(`{"payload_in":"qw2jedrkjerbgol23ewpfirj2qw3or"}`))) + req.Header.Set("Content-Type", "application/json") + return req + }, + tagName: "_dd.appsec.trace.req_body", + tagValue: "TAG_API10_REQ_BODY", + }, + { + name: "big-body", + request: func(ctx context.Context) *http.Request { + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "1s") + body := fmt.Sprintf(b.String(), "qw2jedrkjerbgol23ewpfirj2qw3or") + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", io.NopCloser(strings.NewReader(body))) + req.Header.Set("Content-Type", "application/json") + return req + }, + tagName: "_dd.appsec.trace.req_body", + tagValue: "TAG_API10_REQ_BODY", + }, + { + name: "resp-status", + request: func(ctx context.Context) *http.Request { + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", nil) + return req + }, + response: &http.Response{ + StatusCode: 201, + }, + tagName: "_dd.appsec.trace.res_status", + tagValue: "TAG_API10_RES_STATUS", + }, + { + name: "resp-headers", + request: func(ctx context.Context) *http.Request { + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", nil) + return req + }, + response: &http.Response{ + StatusCode: 200, + Header: map[string][]string{ + "echo-headers": {"qwoierj12l3"}, + }, + }, + tagName: "_dd.appsec.trace.res_headers", + tagValue: "TAG_API10_RES_HEADERS", + }, + { + name: "resp-body", + request: func(ctx context.Context) *http.Request { + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", nil) + return req + }, + response: &http.Response{ + StatusCode: 200, + Header: map[string][]string{ + "Content-Type": {"application/json"}, + }, + Body: io.NopCloser(strings.NewReader(`{"payload_out":"kqehf09123r4lnksef"}`)), + }, + tagName: "_dd.appsec.trace.res_body", + tagValue: "TAG_API10_RES_BODY", + }, + { + name: "resp-big-body", + request: func(ctx context.Context) *http.Request { + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "1s") + req, _ := http.NewRequestWithContext(ctx, "GET", "http://localhost:8080/", nil) + return req + }, + response: &http.Response{ + StatusCode: 200, + Header: map[string][]string{ + "Content-Type": {"application/json"}, + }, + Body: io.NopCloser(strings.NewReader(fmt.Sprintf(b.String(), "kqehf09123r4lnksef"))), + }, + tagName: "_dd.appsec.trace.res_body", + tagValue: "TAG_API10_RES_BODY", + }, + } { + t.Run(tc.name, func(t *testing.T) { + + client := WrapRoundTripper(&emptyRoundTripper{customResponse: tc.response}) + + mt := mocktracer.Start() + defer mt.Stop() + + testutils.StartAppSec(t) + if !internal.Instrumentation.AppSecEnabled() { + t.Skip("appsec not enabled") + } + + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", "", nil) + require.NoError(t, err) + + TraceAndServe(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + resp, err := client.RoundTrip(tc.request(r.Context())) + require.NoError(t, err) + if resp != nil && resp.Body != nil { + defer resp.Body.Close() + } + }), w, r, &ServeConfig{ + Service: "service", + Resource: "resource", + }) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) // service entry serviceSpan & http request serviceSpan + serviceSpan := spans[1] + + require.Contains(t, serviceSpan.Tags(), tc.tagName) + require.Equal(t, serviceSpan.Tags()[tc.tagName], tc.tagValue) + }) + } +} + +func TestAppsecHTTP30X(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/api10.json") + t.Setenv("DD_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE", "1.0") + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case "/redirect": + http.Redirect(w, r, "/final", http.StatusTemporaryRedirect) + case "/move": + http.Redirect(w, r, "/final", http.StatusMovedPermanently) + case "/final": + w.WriteHeader(http.StatusOK) + default: + require.Failf(t, "unexpected request", "path: %s", r.URL.Path) + } + })) + + defer srv.Close() + + httpClient := srv.Client() + httpClient.Transport = WrapRoundTripper(httpClient.Transport) + + t.Run("move", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + testutils.StartAppSec(t) + if !internal.Instrumentation.AppSecEnabled() { + t.Skip("appsec not enabled") + } + + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", srv.URL+"/move", nil) + require.NoError(t, err) + + TraceAndServe(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + resp, err := httpClient.Do(r) + require.NoError(t, err) + if resp != nil && resp.Body != nil { + defer resp.Body.Close() + } + }), w, r, &ServeConfig{ + Service: "service", + Resource: "resource", + }) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3) // service entry serviceSpan & http request serviceSpan + serviceSpan := spans[2] + + require.Contains(t, serviceSpan.Tags(), "appsec.api.redirection.move_target") + require.Equal(t, serviceSpan.Tags()["appsec.api.redirection.move_target"], "/final") + + require.Contains(t, serviceSpan.Tags(), "appsec.api.redirection.nothing") + require.Equal(t, serviceSpan.Tags()["appsec.api.redirection.nothing"], float64(1)) + }) + + t.Run("redirect", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + testutils.StartAppSec(t) + if !internal.Instrumentation.AppSecEnabled() { + t.Skip("appsec not enabled") + } + + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", srv.URL+"/redirect", nil) + require.NoError(t, err) + + TraceAndServe(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + resp, err := httpClient.Do(r) + require.NoError(t, err) + if resp != nil && resp.Body != nil { + defer resp.Body.Close() + } + }), w, r, &ServeConfig{ + Service: "service", + Resource: "resource", + }) + + spans := mt.FinishedSpans() + require.Len(t, spans, 3) // service entry serviceSpan & http request serviceSpan + serviceSpan := spans[2] + + require.Contains(t, serviceSpan.Tags(), "appsec.api.redirection.redirect_target") + require.Equal(t, serviceSpan.Tags()["appsec.api.redirection.redirect_target"], "/final") + + require.Contains(t, serviceSpan.Tags(), "appsec.api.redirection.nothing") + require.Equal(t, serviceSpan.Tags()["appsec.api.redirection.nothing"], float64(1)) + }) +} diff --git a/contrib/net/http/client/client.go b/contrib/net/http/client/client.go new file mode 100644 index 0000000000..de34911c35 --- /dev/null +++ b/contrib/net/http/client/client.go @@ -0,0 +1,51 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package client provides [context.Context]-aware alternatives to the +// short-hand request functions [http.Get], [http.Head], [http.Post], and +// [http.PostForm]. Using these functions allows for better control over the +// trace context propagation. +package client + +import ( + "context" + "io" + "net/http" + "net/url" + "strings" +) + +// Get is a [context.Context] aware version of [http.Get]. +func Get(ctx context.Context, url string) (resp *http.Response, err error) { + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + return nil, err + } + return http.DefaultClient.Do(req) +} + +// Head is a [context.Context] aware version of [http.Head]. +func Head(ctx context.Context, url string) (resp *http.Response, err error) { + req, err := http.NewRequestWithContext(ctx, http.MethodHead, url, nil) + if err != nil { + return nil, err + } + return http.DefaultClient.Do(req) +} + +// Post is a [context.Context] aware version of [http.Post]. +func Post(ctx context.Context, url string, contentType string, body io.Reader) (resp *http.Response, err error) { + req, err := http.NewRequestWithContext(ctx, http.MethodPost, url, body) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", contentType) + return http.DefaultClient.Do(req) +} + +// PostForm is a [context.Context] aware version of [http.PostForm]. +func PostForm(ctx context.Context, url string, data url.Values) (resp *http.Response, err error) { + return Post(ctx, url, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) +} diff --git a/contrib/net/http/client/client_test.go b/contrib/net/http/client/client_test.go new file mode 100644 index 0000000000..42d5c5aab2 --- /dev/null +++ b/contrib/net/http/client/client_test.go @@ -0,0 +1,197 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package client + +import ( + "bytes" + "context" + "errors" + "io" + "net/http" + "net/url" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +const ( + validURL = "http://example.com/" + invalidURL = "http:/\x00/invalid." +) + +func TestGet(t *testing.T) { + ctx := context.Background() + t.Run("valid URL", func(t *testing.T) { + withMockDefaultClient( + func(req *http.Request) (*http.Response, error) { + assert.Equal(t, ctx, req.Context()) + assert.Equal(t, "GET", req.Method) + assert.Equal(t, validURL, req.URL.String()) + return &http.Response{StatusCode: 200}, nil + }, + func() { + res, err := Get(ctx, validURL) + require.NoError(t, err) + require.Equal(t, 200, res.StatusCode) + res.Body.Close() + }, + ) + }) + //nolint:bodyclose + t.Run("invalid URL", func(t *testing.T) { + withMockDefaultClient( + func(*http.Request) (*http.Response, error) { + assert.Fail(t, "unexpected call to RoundTrip") + return nil, errors.New("unreachable") + }, + func() { + ctx := context.Background() + res, err := Get(ctx, invalidURL) + require.Error(t, err) + require.Nil(t, res) + }, + ) + }) +} + +func TestHead(t *testing.T) { + t.Run("valid URL", func(t *testing.T) { + ctx := context.Background() + withMockDefaultClient( + func(req *http.Request) (*http.Response, error) { + assert.Equal(t, ctx, req.Context()) + assert.Equal(t, "HEAD", req.Method) + assert.Equal(t, validURL, req.URL.String()) + return &http.Response{StatusCode: 200}, nil + }, + func() { + res, err := Head(ctx, validURL) + require.NoError(t, err) + require.Equal(t, 200, res.StatusCode) + res.Body.Close() + }, + ) + }) + + //nolint:bodyclose + t.Run("invalid URL", func(t *testing.T) { + withMockDefaultClient( + func(*http.Request) (*http.Response, error) { + assert.Fail(t, "unexpected call to RoundTrip") + return nil, errors.New("unreachable") + }, + func() { + ctx := context.Background() + res, err := Head(ctx, invalidURL) + require.Error(t, err) + require.Nil(t, res) + }, + ) + }) +} + +func TestPost(t *testing.T) { + const contentType = "text/plain" + body := []byte("hello") + + t.Run("valid URL", func(t *testing.T) { + ctx := context.Background() + withMockDefaultClient( + func(req *http.Request) (*http.Response, error) { + assert.Equal(t, ctx, req.Context()) + assert.Equal(t, "POST", req.Method) + assert.Equal(t, validURL, req.URL.String()) + assert.Equal(t, contentType, req.Header.Get("content-type")) + data, err := io.ReadAll(req.Body) + require.NoError(t, err) + assert.Equal(t, body, data) + return &http.Response{StatusCode: 200}, nil + }, + func() { + res, err := Post(ctx, validURL, contentType, bytes.NewReader(body)) + require.NoError(t, err) + require.Equal(t, 200, res.StatusCode) + res.Body.Close() + }, + ) + }) + + //nolint:bodyclose + t.Run("invalid URL", func(t *testing.T) { + withMockDefaultClient( + func(*http.Request) (*http.Response, error) { + assert.Fail(t, "unexpected call to RoundTrip") + return nil, errors.New("unreachable") + }, + func() { + ctx := context.Background() + res, err := Post(ctx, invalidURL, contentType, bytes.NewReader(body)) + require.Error(t, err) + require.Nil(t, res) + }, + ) + }) +} + +func TestPostForm(t *testing.T) { + values := url.Values{ + "key": {"value1", "value2"}, + "foo": {"bar"}, + } + + t.Run("valid URL", func(t *testing.T) { + ctx := context.Background() + withMockDefaultClient( + func(req *http.Request) (*http.Response, error) { + assert.Equal(t, ctx, req.Context()) + assert.Equal(t, "POST", req.Method) + assert.Equal(t, validURL, req.URL.String()) + assert.Equal(t, "application/x-www-form-urlencoded", req.Header.Get("content-type")) + data, err := io.ReadAll(req.Body) + require.NoError(t, err) + assert.Equal(t, []byte(values.Encode()), data) + return &http.Response{StatusCode: 200}, nil + }, + func() { + res, err := PostForm(ctx, validURL, values) + require.NoError(t, err) + require.Equal(t, 200, res.StatusCode) + res.Body.Close() + }, + ) + }) + + //nolint:bodyclose + t.Run("invalid URL", func(t *testing.T) { + withMockDefaultClient( + func(*http.Request) (*http.Response, error) { + assert.Fail(t, "unexpected call to RoundTrip") + return nil, errors.New("unreachable") + }, + func() { + ctx := context.Background() + res, err := PostForm(ctx, invalidURL, values) + require.Error(t, err) + require.Nil(t, res) + }, + ) + }) +} + +func withMockDefaultClient(roundTrip func(*http.Request) (*http.Response, error), cb func()) { + backup := http.DefaultClient + defer func() { http.DefaultClient = backup }() + + http.DefaultClient = &http.Client{Transport: testTransport(roundTrip)} + cb() +} + +type testTransport func(*http.Request) (*http.Response, error) + +func (t testTransport) RoundTrip(req *http.Request) (*http.Response, error) { + return t(req) +} diff --git a/contrib/net/http/example_test.go b/contrib/net/http/example_test.go index 748e5477d6..cf0503a734 100644 --- a/contrib/net/http/example_test.go +++ b/contrib/net/http/example_test.go @@ -7,27 +7,38 @@ package http_test import ( "net/http" + "net/http/httptest" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func Example() { + tracer.Start() + defer tracer.Stop() + mux := httptrace.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World!\n")) }) http.ListenAndServe(":8080", mux) } func Example_withServiceName() { - mux := httptrace.NewServeMux(httptrace.WithServiceName("my-service")) - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + tracer.Start() + defer tracer.Stop() + + mux := httptrace.NewServeMux(httptrace.WithService("my-service")) + mux.HandleFunc("/", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World!\n")) }) http.ListenAndServe(":8080", mux) } func ExampleTraceAndServe() { + tracer.Start() + defer tracer.Stop() + mux := http.NewServeMux() mux.Handle("/", traceMiddleware(mux, http.HandlerFunc(Index))) http.ListenAndServe(":8080", mux) @@ -39,6 +50,9 @@ func Index(w http.ResponseWriter, _ *http.Request) { // ExampleWrapClient provides an example of how to connect an incoming request span to an outgoing http call. func ExampleWrapClient() { + tracer.Start() + defer tracer.Stop() + mux := httptrace.NewServeMux() // Note that `WrapClient` modifies the passed in Client, so all other users of DefaultClient in this example will have a traced http Client c := httptrace.WrapClient(http.DefaultClient) @@ -55,6 +69,40 @@ func ExampleWrapClient() { http.ListenAndServe(":8080", mux) } +// ExampleWrapClient_withClientTimings demonstrates how to enable detailed HTTP request tracing +// using httptrace.ClientTrace. This provides timing information for DNS lookups, connection +// establishment, TLS handshakes, and other HTTP request events as span tags. +func ExampleWrapClient_withClientTimings() { + tracer.Start() + defer tracer.Stop() + + // Create a test server for demonstration + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte("OK")) + })) + defer server.Close() + + // Create an HTTP client with ClientTimings enabled + c := httptrace.WrapClient(http.DefaultClient, httptrace.WithClientTimings(true)) + + // Make a request - the span will include detailed timing information + // such as http.dns.duration_ms, http.connect.duration_ms, etc. + req, _ := http.NewRequest(http.MethodGet, server.URL, nil) + resp, err := c.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + + // The resulting span will contain timing tags like: + // - http.dns.duration_ms: Time spent on DNS resolution + // - http.connect.duration_ms: Time spent establishing connection + // - http.tls.duration_ms: Time spent on TLS handshake + // - http.get_conn.duration_ms: Time spent getting connection from pool + // - http.first_byte.duration_ms: Time to first response byte +} + func traceMiddleware(mux *http.ServeMux, next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, route := mux.Handler(r) diff --git a/contrib/net/http/go.mod b/contrib/net/http/go.mod new file mode 100644 index 0000000000..c9698ce8a5 --- /dev/null +++ b/contrib/net/http/go.mod @@ -0,0 +1,92 @@ +module github.com/DataDog/dd-trace-go/contrib/net/http/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/puzpuzpuz/xsync/v3 v3.5.1 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/net/http/go.sum b/contrib/net/http/go.sum new file mode 100644 index 0000000000..caa4165cda --- /dev/null +++ b/contrib/net/http/go.sum @@ -0,0 +1,309 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/net/http/http.go b/contrib/net/http/http.go index 5aedb032a4..177397676a 100644 --- a/contrib/net/http/http.go +++ b/contrib/net/http/http.go @@ -4,110 +4,24 @@ // Copyright 2016 Datadog, Inc. // Package http provides functions to trace the net/http package (https://golang.org/pkg/net/http). -package http // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" +package http // import "github.com/DataDog/dd-trace-go/contrib/net/http/v2" import ( "net/http" - "strings" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/wrap" ) -// ServeMux is an HTTP request multiplexer that traces all the incoming requests. -type ServeMux struct { - *http.ServeMux - cfg *config -} +type ServeMux = wrap.ServeMux // NewServeMux allocates and returns an http.ServeMux augmented with the // global tracer. func NewServeMux(opts ...Option) *ServeMux { - cfg := new(config) - defaults(cfg) - for _, fn := range opts { - fn(cfg) - } - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) - log.Debug("contrib/net/http: Configuring ServeMux: %#v", cfg) - return &ServeMux{ - ServeMux: http.NewServeMux(), - cfg: cfg, - } -} - -// ServeHTTP dispatches the request to the handler -// whose pattern most closely matches the request URL. -// We only need to rewrite this function to be able to trace -// all the incoming requests to the underlying multiplexer -func (mux *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if mux.cfg.ignoreRequest(r) { - mux.ServeMux.ServeHTTP(w, r) - return - } - // get the resource associated to this request - _, pattern := mux.Handler(r) - route := patternRoute(pattern) - resource := mux.cfg.resourceNamer(r) - if resource == "" { - resource = r.Method + " " + route - } - so := make([]ddtrace.StartSpanOption, len(mux.cfg.spanOpts), len(mux.cfg.spanOpts)+1) - copy(so, mux.cfg.spanOpts) - so = append(so, httptrace.HeaderTagsFromRequest(r, mux.cfg.headerTags)) - TraceAndServe(mux.ServeMux, w, r, &ServeConfig{ - Service: mux.cfg.serviceName, - Resource: resource, - SpanOpts: so, - Route: route, - }) -} - -// patternRoute returns the route part of a go1.22 style ServeMux pattern. I.e. -// it returns "/foo" for the pattern "/foo" as well as the pattern "GET /foo". -func patternRoute(s string) string { - // Support go1.22 serve mux patterns: [METHOD ][HOST]/[PATH] - // Consider any text before a space or tab to be the method of the pattern. - // See net/http.parsePattern and the link below for more information. - // https://pkg.go.dev/net/http#hdr-Patterns - if i := strings.IndexAny(s, " \t"); i > 0 && len(s) >= i+1 { - return strings.TrimLeft(s[i+1:], " \t") - } - return s + return wrap.NewServeMux(opts...) } // WrapHandler wraps an http.Handler with tracing using the given service and resource. // If the WithResourceNamer option is provided as part of opts, it will take precedence over the resource argument. func WrapHandler(h http.Handler, service, resource string, opts ...Option) http.Handler { - cfg := new(config) - defaults(cfg) - for _, fn := range opts { - fn(cfg) - } - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) - log.Debug("contrib/net/http: Wrapping Handler: Service: %s, Resource: %s, %#v", service, resource, cfg) - return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - if cfg.ignoreRequest(req) { - h.ServeHTTP(w, req) - return - } - resc := resource - if r := cfg.resourceNamer(req); r != "" { - resc = r - } - so := make([]ddtrace.StartSpanOption, len(cfg.spanOpts), len(cfg.spanOpts)+1) - copy(so, cfg.spanOpts) - so = append(so, httptrace.HeaderTagsFromRequest(req, cfg.headerTags)) - TraceAndServe(h, w, req, &ServeConfig{ - Service: service, - Resource: resc, - FinishOpts: cfg.finishOpts, - SpanOpts: so, - }) - }) + return wrap.Handler(h, service, resource, opts...) } diff --git a/contrib/net/http/http_test.go b/contrib/net/http/http_test.go index c734bbd297..9bcf5275d8 100644 --- a/contrib/net/http/http_test.go +++ b/contrib/net/http/http_test.go @@ -12,15 +12,14 @@ import ( "sync" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestWithHeaderTags(t *testing.T) { @@ -34,78 +33,92 @@ func TestWithHeaderTags(t *testing.T) { router(opts...).ServeHTTP(w, r) return r } + t.Run("default-off", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - htArgs := []string{"h!e@a-d.e*r", "2header", "3header"} + + headerTags := instrumentation.NewHeaderTags([]string{"h!e@a-d.e*r", "2header", "3header", "x-datadog-header"}) setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + + headerTags.Iter(func(_ string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + headerTags := instrumentation.NewHeaderTags(htArgs) + r := setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + }) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { + htArgs := []string{"3header"} + testutils.SetGlobalHeaderTags(t, htArgs...) + headerTags := instrumentation.NewHeaderTags(htArgs) + mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) - r := setupReq() spans := mt.FinishedSpans() assert := assert.New(t) - assert.Equal(len(spans), 1) + require.Len(t, spans, 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + headerTags.Iter(func(header string, tag string) { + assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + }) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { + htArgsGlobal := []string{"3header"} + testutils.SetGlobalHeaderTags(t, htArgsGlobal...) + headerTagsGlobal := instrumentation.NewHeaderTags(htArgsGlobal) + mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) - htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + headerTags := instrumentation.NewHeaderTags(htArgs) + r := setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) - assert.Equal(len(spans), 1) + require.Len(t, spans, 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + }) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + headerTagsGlobal.Iter(func(_ string, tag string) { + assert.NotContains(s.Tags(), tag) + }) }) t.Run("wrap-handler", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header", "3header"} + headerTags := instrumentation.NewHeaderTags(htArgs) handler := WrapHandler(http.HandlerFunc(handler200), "my-service", "my-resource", WithHeaderTags(htArgs), @@ -130,10 +143,9 @@ func TestWithHeaderTags(t *testing.T) { s := spans[0] assert.Equal("http.request", s.OperationName()) - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + }) }) } @@ -160,10 +172,11 @@ func TestHttpTracer200(t *testing.T) { assert.Equal("200", s.Tag(ext.HTTPCode)) assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("bar", s.Tag("foo")) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) assert.Equal("net/http", s.Tag(ext.Component)) + assert.Equal("net/http", s.Integration()) } func TestHttpTracer500(t *testing.T) { @@ -190,10 +203,11 @@ func TestHttpTracer500(t *testing.T) { assert.Equal("500", s.Tag(ext.HTTPCode)) assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) - assert.Equal("500: Internal Server Error", s.Tag(ext.Error).(error).Error()) + assert.Equal("500: Internal Server Error", s.Tag(ext.ErrorMsg)) assert.Equal("bar", s.Tag("foo")) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) assert.Equal("net/http", s.Tag(ext.Component)) + assert.Equal("net/http", s.Integration()) } func TestWrapHandler200(t *testing.T) { @@ -222,10 +236,11 @@ func TestWrapHandler200(t *testing.T) { assert.Equal("200", s.Tag(ext.HTTPCode)) assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("bar", s.Tag("foo")) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) assert.Equal("net/http", s.Tag(ext.Component)) + assert.Equal("net/http", s.Integration()) } func TestNoStack(t *testing.T) { @@ -245,10 +260,11 @@ func TestNoStack(t *testing.T) { spans := mt.FinishedSpans() assert.Equal(1, len(spans)) s := spans[0] - assert.EqualError(spans[0].Tags()[ext.Error].(error), "500: Internal Server Error") - assert.Equal("", s.Tags()[ext.ErrorStack]) + assert.Equal(spans[0].Tags()[ext.ErrorMsg], "500: Internal Server Error") + assert.Empty(s.Tags()[ext.ErrorStack]) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) assert.Equal("net/http", s.Tag(ext.Component)) + assert.Equal("net/http", s.Integration()) } func TestServeMuxUsesResourceNamer(t *testing.T) { @@ -279,10 +295,11 @@ func TestServeMuxUsesResourceNamer(t *testing.T) { assert.Equal("200", s.Tag(ext.HTTPCode)) assert.Equal("GET", s.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/"+url, s.Tag(ext.HTTPURL)) - assert.Equal(nil, s.Tag(ext.Error)) + assert.Zero(s.Tag(ext.ErrorMsg)) assert.Equal("bar", s.Tag("foo")) assert.Equal(ext.SpanKindServer, s.Tag(ext.SpanKind)) assert.Equal("net/http", s.Tag(ext.Component)) + assert.Equal("net/http", s.Integration()) } func TestServeMuxGo122Patterns(t *testing.T) { @@ -344,7 +361,6 @@ func TestWrapHandlerWithResourceNameNoRace(_ *testing.T) { func TestServeMuxNoRace(_ *testing.T) { mt := mocktracer.Start() defer mt.Stop() - r := httptest.NewRequest("GET", "/", nil) mux := NewServeMux() mux.Handle("/", http.NotFoundHandler()) @@ -352,6 +368,7 @@ func TestServeMuxNoRace(_ *testing.T) { for i := 0; i < 10; i++ { wg.Add(1) go func() { + r := httptest.NewRequest("GET", "/", nil) w := httptest.NewRecorder() defer wg.Done() mux.ServeHTTP(w, r) @@ -375,7 +392,7 @@ func TestAnalyticsSettings(t *testing.T) { assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) }, "WrapHandler": func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { - f := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + f := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { message := "Hello \n" w.Write([]byte(message)) }) @@ -403,9 +420,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) test(t, mt, 0.4) }) @@ -428,9 +443,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) test(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -485,29 +498,68 @@ func TestIgnoreRequestOption(t *testing.T) { } } -func TestServerNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() +func TestStatusCheck(t *testing.T) { + tests := []struct { + url string + expectedError bool + handler http.Handler + }{ + { + url: "/200", + expectedError: false, + handler: http.HandlerFunc(handler200), + }, + { + url: "/400", + expectedError: true, + handler: http.HandlerFunc(handler400), + }, + { + url: "/404", + expectedError: false, + handler: http.HandlerFunc(handler404), + }, + } + statusCheck := func(statusCode int) bool { + return statusCode >= 400 && statusCode != http.StatusNotFound + } + for _, test := range tests { + t.Run("servemux"+test.url, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() - mux := NewServeMux(opts...) - mux.HandleFunc("/200", handler200) - r := httptest.NewRequest("GET", "http://localhost/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) + mux := NewServeMux(WithStatusCheck(statusCheck)) + mux.HandleFunc("/200", handler200) + mux.HandleFunc("/400", handler400) + mux.HandleFunc("/404", handler404) - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "http.router")(t) + r := httptest.NewRequest("GET", "http://localhost/"+test.url, nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + spans := mt.FinishedSpans() + assert.Equal(t, test.expectedError, spans[0].Tag(ext.ErrorMsg) != nil) + }) + t.Run("wraphandler"+test.url, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + r := httptest.NewRequest("GET", "http://localhost/"+test.url, nil) + w := httptest.NewRecorder() + f := test.handler + + handler := WrapHandler(f, "my-service", "my-resource", WithStatusCheck(statusCheck)) + handler.ServeHTTP(w, r) + + spans := mt.FinishedSpans() + assert.Equal(t, test.expectedError, spans[0].Tag(ext.ErrorMsg) != nil) + }) + } } func router(muxOpts ...Option) http.Handler { defaultOpts := []Option{ - WithServiceName("my-service"), + WithService("my-service"), WithSpanOptions(tracer.Tag("foo", "bar")), } mux := NewServeMux(append(defaultOpts, muxOpts...)...) @@ -520,19 +572,22 @@ func handler200(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("OK\n")) } -func handler500(w http.ResponseWriter, r *http.Request) { +func handler500(w http.ResponseWriter, _ *http.Request) { http.Error(w, "500!", http.StatusInternalServerError) } -func handler400(w http.ResponseWriter, r *http.Request) { +func handler400(w http.ResponseWriter, _ *http.Request) { http.Error(w, "400!", http.StatusBadRequest) } +func handler404(w http.ResponseWriter, r *http.Request) { + http.Error(w, "404!", http.StatusNotFound) +} + func BenchmarkHttpServeTrace(b *testing.B) { - tracer.Start(tracer.WithLogger(log.DiscardLogger{})) + err := tracer.Start(tracer.WithLogger(testutils.DiscardLogger()), tracer.WithHeaderTags([]string{"3header"})) + assert.NoError(b, err) defer tracer.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) r := httptest.NewRequest("GET", "/200", nil) r.Header.Set("h!e@a-d.e*r", "val") diff --git a/contrib/net/http/internal/config/config.go b/contrib/net/http/internal/config/config.go new file mode 100644 index 0000000000..176f1b5518 --- /dev/null +++ b/contrib/net/http/internal/config/config.go @@ -0,0 +1,116 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package config + +import ( + "math" + "net/http" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" +) + +const ComponentName = instrumentation.PackageNetHTTP + +// Option describes options for http.ServeMux. +type Option interface { + apply(*Config) +} + +// OptionFn represents options applicable to NewServeMux and WrapHandler. +type OptionFn func(*CommonConfig) + +func (o OptionFn) apply(cfg *Config) { + o(&cfg.CommonConfig) +} + +func (o OptionFn) applyRoundTripper(cfg *RoundTripperConfig) { + o(&cfg.CommonConfig) +} + +type HandlerOptionFn func(*Config) + +func (o HandlerOptionFn) apply(cfg *Config) { + o(cfg) +} + +type CommonConfig struct { + AnalyticsRate float64 + IgnoreRequest func(*http.Request) bool + ServiceName string + ResourceNamer func(*http.Request) string + SpanOpts []tracer.StartSpanOption + IsStatusError func(int) bool +} + +type Config struct { + CommonConfig + FinishOpts []tracer.FinishOption + HeaderTags instrumentation.HeaderTags +} + +func (c *Config) ApplyOpts(opts ...Option) { + for _, fn := range opts { + fn.apply(c) + } +} + +func Default(instr *instrumentation.Instrumentation) *Config { + cfg := new(Config) + if options.GetBoolEnv("DD_TRACE_HTTP_ANALYTICS_ENABLED", false) { + cfg.AnalyticsRate = 1.0 + } else { + cfg.AnalyticsRate = instr.AnalyticsRate(true) + } + cfg.ServiceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.HeaderTags = instr.HTTPHeadersAsTags() + cfg.SpanOpts = []tracer.StartSpanOption{tracer.Measured()} + if !math.IsNaN(cfg.AnalyticsRate) { + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.EventSampleRate, cfg.AnalyticsRate)) + } + cfg.IgnoreRequest = func(_ *http.Request) bool { return false } + cfg.ResourceNamer = func(_ *http.Request) string { return "" } + return cfg +} + +// A RoundTripperBeforeFunc can be used to modify a span before an http +// RoundTrip is made. +type RoundTripperBeforeFunc func(*http.Request, *tracer.Span) + +// A RoundTripperAfterFunc can be used to modify a span after an http +// RoundTrip is made. It is possible for the http Response to be nil. +type RoundTripperAfterFunc func(*http.Response, *tracer.Span) + +type RoundTripperConfig struct { + CommonConfig + Before RoundTripperBeforeFunc + After RoundTripperAfterFunc + SpanNamer func(req *http.Request) string + Propagation bool + ErrCheck func(err error) bool + QueryString bool // reports whether the query string is included in the URL tag for http client spans + ClientTimings bool // reports whether httptrace.ClientTrace should be enabled for detailed timing +} + +func (c *RoundTripperConfig) ApplyOpts(opts ...RoundTripperOption) { + for _, fn := range opts { + fn.applyRoundTripper(c) + } +} + +// RoundTripperOption describes options for http.RoundTripper. +type RoundTripperOption interface { + applyRoundTripper(*RoundTripperConfig) +} + +// RoundTripperOptionFn represents options applicable to WrapClient and WrapRoundTripper. +type RoundTripperOptionFn func(*RoundTripperConfig) + +func (o RoundTripperOptionFn) applyRoundTripper(cfg *RoundTripperConfig) { + o(cfg) +} diff --git a/contrib/net/http/internal/config/const.go b/contrib/net/http/internal/config/const.go new file mode 100644 index 0000000000..07685b3860 --- /dev/null +++ b/contrib/net/http/internal/config/const.go @@ -0,0 +1,15 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package config + +const ( + // EnvClientQueryStringEnabled is the name of the env var used to specify whether query string collection is enabled for http client spans. + EnvClientQueryStringEnabled = "DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING" + // EnvClientErrorStatuses is the name of the env var that specifies error status codes on http client spans + EnvClientErrorStatuses = "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES" + // EnvQueryStringRegexp is the name of the env var used to specify the regexp to use for query string obfuscation. + EnvQueryStringRegexp = "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP" +) diff --git a/contrib/net/http/internal/config/instrumentation.go b/contrib/net/http/internal/config/instrumentation.go new file mode 100644 index 0000000000..9f806bec29 --- /dev/null +++ b/contrib/net/http/internal/config/instrumentation.go @@ -0,0 +1,14 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package config + +import "github.com/DataDog/dd-trace-go/v2/instrumentation" + +var Instrumentation *instrumentation.Instrumentation + +func init() { + Instrumentation = instrumentation.Load(instrumentation.PackageNetHTTP) +} diff --git a/internal/osinfo/osinfo_freebsd.go b/contrib/net/http/internal/config/options.go similarity index 50% rename from internal/osinfo/osinfo_freebsd.go rename to contrib/net/http/internal/config/options.go index 543f2ffdfd..9d0a182265 100644 --- a/internal/osinfo/osinfo_freebsd.go +++ b/contrib/net/http/internal/config/options.go @@ -3,22 +3,15 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package osinfo +package config import ( - "os/exec" - "runtime" - "strings" + "net/http" ) -func osName() string { - return runtime.GOOS -} - -func osVersion() string { - out, err := exec.Command("uname", "-r").Output() - if err != nil { - return "unknown" +// WithResourceNamer populates the name of a resource based on a custom function. +func WithResourceNamer(namer func(req *http.Request) string) OptionFn { + return func(cfg *CommonConfig) { + cfg.ResourceNamer = namer } - return strings.Split(string(out), "-")[0] } diff --git a/contrib/net/http/internal/orchestrion/roundtrip.go b/contrib/net/http/internal/orchestrion/roundtrip.go new file mode 100644 index 0000000000..aa6fa4ade7 --- /dev/null +++ b/contrib/net/http/internal/orchestrion/roundtrip.go @@ -0,0 +1,68 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package orchestrion + +import ( + "fmt" + "net/http" + "sync" + + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/wrap" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" +) + +func ObserveRoundTrip(req *http.Request) (*http.Request, wrap.AfterRoundTrip, error) { + return wrap.ObserveRoundTrip(defaultRoundTripperConfig(), req) +} + +var ( + cfg *config.RoundTripperConfig + cfgOnce sync.Once +) + +func defaultRoundTripperConfig() *config.RoundTripperConfig { + cfgOnce.Do(func() { + cfg = &config.RoundTripperConfig{ + CommonConfig: config.CommonConfig{ + AnalyticsRate: func() float64 { + if options.GetBoolEnv("DD_TRACE_HTTP_ANALYTICS_ENABLED", false) { + return 1.0 + } else { + return config.Instrumentation.AnalyticsRate(true) + } + }(), + IgnoreRequest: func(*http.Request) bool { return false }, + ResourceNamer: func() func(req *http.Request) string { + if options.GetBoolEnv("DD_TRACE_HTTP_CLIENT_RESOURCE_NAME_QUANTIZE", false) { + return func(req *http.Request) string { + return fmt.Sprintf("%s %s", req.Method, httptrace.QuantizeURL(req.URL.Path)) + } + } + + return func(req *http.Request) string { return fmt.Sprintf("%s %s", req.Method, req.URL.Path) } + }(), + IsStatusError: func() func(int) bool { + envVal := env.Get(config.EnvClientErrorStatuses) + if fn := httptrace.GetErrorCodesFromInput(envVal); fn != nil { + return fn + } + return func(statusCode int) bool { return statusCode >= 400 && statusCode < 500 } + }(), + ServiceName: config.Instrumentation.ServiceName(instrumentation.ComponentClient, nil), + }, + Propagation: true, + QueryString: options.GetBoolEnv(config.EnvClientQueryStringEnabled, true), + SpanNamer: func(*http.Request) string { + return config.Instrumentation.OperationName(instrumentation.ComponentClient, nil) + }, + } + }) + return cfg +} diff --git a/contrib/net/http/internal/orchestrion/wrap-handler.go b/contrib/net/http/internal/orchestrion/wrap-handler.go new file mode 100644 index 0000000000..6472a4b32c --- /dev/null +++ b/contrib/net/http/internal/orchestrion/wrap-handler.go @@ -0,0 +1,40 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package orchestrion + +import ( + "fmt" + "net/http" + + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/wrap" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" +) + +func WrapHandler(handler http.Handler) http.Handler { + switch handler := handler.(type) { + case *wrap.ServeMux, wrap.WrappedHandler: + return handler + case *http.ServeMux: + tracedMux := wrap.NewServeMux() + tracedMux.ServeMux = handler + return tracedMux + default: + if options.GetBoolEnv("DD_TRACE_HTTP_HANDLER_RESOURCE_NAME_QUANTIZE", false) { + return wrap.Handler(handler, "", "", config.WithResourceNamer(quantizeResourceNamer)) + } + return wrap.Handler(handler, "", "", config.WithResourceNamer(resourceNamer)) + } +} + +func resourceNamer(r *http.Request) string { + return fmt.Sprintf("%s %s", r.Method, r.URL.Path) +} + +func quantizeResourceNamer(r *http.Request) string { + return fmt.Sprintf("%s %s", r.Method, httptrace.QuantizeURL(r.URL.Path)) +} diff --git a/contrib/net/http/internal/pattern/pattern.go b/contrib/net/http/internal/pattern/pattern.go new file mode 100644 index 0000000000..b58a0ab15e --- /dev/null +++ b/contrib/net/http/internal/pattern/pattern.go @@ -0,0 +1,172 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pattern + +import ( + "errors" + "fmt" + "net/http" + "strings" + "unicode" + + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/puzpuzpuz/xsync/v3" +) + +// Route returns the route part of a go1.22 style ServeMux pattern. I.e. +// it returns "/foo" for the pattern "/foo" as well as the pattern "GET /foo". +func Route(s string) string { + // Support go1.22 serve mux patterns: [METHOD ][HOST]/[PATH] + // Consider any text before a space or tab to be the method of the pattern. + // See net/http.parsePattern and the link below for more information. + // https://pkg.go.dev/net/http#hdr-Patterns-ServeMux + if i := strings.IndexAny(s, " \t"); i > 0 && len(s) >= i+1 { + return strings.TrimLeft(s[i+1:], " \t") + } + return s +} + +// PathParameters return the path parameter values and names from the request. +func PathParameters(pattern string, request *http.Request) map[string]string { + if pattern == "" { + return nil + } + names := patternNames(pattern) + res := make(map[string]string, len(names)) + for _, name := range names { + res[name] = request.PathValue(name) + } + return res +} + +var patternSegmentsCache = xsync.NewMapOf[string, []string]() + +func patternNames(pattern string) []string { + v, _ := patternSegmentsCache.LoadOrCompute(pattern, func() []string { + segments, err := parsePatternNames(pattern) + if err != nil { + // Ignore the error: Something as gone wrong, but we are not eager to find out why. + // We will just log it as a telemetry logs warning (and Debug to the user-facing log). + internal.Instrumentation.Logger().Warn("instrumentation/net/http/pattern: failed to parse mux path pattern %q: %s", pattern, err.Error()) + // here we fallthrough instead of returning to load a nil value into the cache to avoid reparsing the pattern. + } + return segments + }) + return v +} + +// parsePatternNames returns the names of the wildcards in the pattern. +// Based on https://cs.opensource.google/go/go/+/refs/tags/go1.23.4:src/net/http/pattern.go;l=84 +// but very simplified as we know that the pattern returned must be valid or `net/http` would have panicked earlier. +// +// The pattern string's syntax is +// +// [METHOD] [HOST]/[PATH] +// +// where: +// - METHOD is an HTTP method +// - HOST is a hostname +// - PATH consists of slash-separated segments, where each segment is either +// a literal or a wildcard of the form "{name}", "{name...}", or "{$}". +// +// METHOD, HOST and PATH are all optional; that is, the string can be "/". +// If METHOD is present, it must be followed by at least one space or tab. +// Wildcard names must be valid Go identifiers. +// The "{$}" and "{name...}" wildcard must occur at the end of PATH. +// PATH may end with a '/'. +// Wildcard names in a path must be distinct. +// +// Some examples could be: +// - "/foo/{bar}" returns ["bar"] +// - "/foo/{bar}/{baz}" returns ["bar", "baz"] +// - "/foo" returns [] +func parsePatternNames(pattern string) ([]string, error) { + if len(pattern) == 0 { + return nil, errors.New("empty pattern") + } + method, rest, found := pattern, "", false + if i := strings.IndexAny(pattern, " \t"); i >= 0 { + method, rest, found = pattern[:i], strings.TrimLeft(pattern[i+1:], " \t"), true + } + if !found { + rest = method + method = "" + } + + i := strings.IndexByte(rest, '/') + if i < 0 { + return nil, errors.New("host/path missing /") + } + host := rest[:i] + rest = rest[i:] + if j := strings.IndexByte(host, '{'); j >= 0 { + return nil, errors.New("host contains '{' (missing initial '/'?)") + } + + // At this point, rest is the path. + var names []string + seenNames := make(map[string]bool) + for len(rest) > 0 { + // Invariant: rest[0] == '/'. + rest = rest[1:] + if len(rest) == 0 { + // Trailing slash. + break + } + i := strings.IndexByte(rest, '/') + if i < 0 { + i = len(rest) + } + var seg string + seg, rest = rest[:i], rest[i:] + if i := strings.IndexByte(seg, '{'); i >= 0 { + // Wildcard. + if i != 0 { + return nil, errors.New("bad wildcard segment (must start with '{')") + } + if seg[len(seg)-1] != '}' { + return nil, errors.New("bad wildcard segment (must end with '}')") + } + name := seg[1 : len(seg)-1] + if name == "$" { + if len(rest) != 0 { + return nil, errors.New("{$} not at end") + } + break + } + name, multi := strings.CutSuffix(name, "...") + if multi && len(rest) != 0 { + return nil, errors.New("{...} wildcard not at end") + } + if name == "" { + return nil, errors.New("empty wildcard name") + } + if !isValidWildcardName(name) { + return nil, fmt.Errorf("bad wildcard name %q", name) + } + if seenNames[name] { + return nil, fmt.Errorf("duplicate wildcard name %q", name) + } + seenNames[name] = true + names = append(names, name) + } + } + + return names, nil +} + +func isValidWildcardName(s string) bool { + if s == "" { + return false + } + // Valid Go identifier. + for i, c := range s { + if !unicode.IsLetter(c) && c != '_' && (i == 0 || !unicode.IsDigit(c)) { + return false + } + } + return true +} diff --git a/contrib/net/http/internal/pattern/pattern_test.go b/contrib/net/http/internal/pattern/pattern_test.go new file mode 100644 index 0000000000..ee88b715d4 --- /dev/null +++ b/contrib/net/http/internal/pattern/pattern_test.go @@ -0,0 +1,169 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pattern + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPathParameters(t *testing.T) { + t.Run("blank", func(t *testing.T) { + req := httptest.NewRequest("GET", "/foo/123", nil) + assert.Equal(t, "", req.Pattern) + require.Nil(t, PathParameters(req.Pattern, req)) + }) + + for _, tt := range []struct { + name string + pattern string + url string + expected map[string]string + }{ + { + name: "simple", + pattern: "/foo/{bar}", + url: "/foo/123", + expected: map[string]string{"bar": "123"}, + }, + { + name: "multiple", + pattern: "/foo/{bar}/{baz}", + url: "/foo/123/456", + expected: map[string]string{"bar": "123", "baz": "456"}, + }, + { + name: "nested", + pattern: "/foo/{bar}/baz/{qux}", + url: "/foo/123/baz/456", + expected: map[string]string{"bar": "123", "qux": "456"}, + }, + { + name: "empty", + pattern: "/foo/{bar}", + url: "/foo/", + expected: map[string]string{"bar": ""}, + }, + { + name: "http method", + pattern: "GET /foo/{bar}", + url: "/foo/123", + expected: map[string]string{"bar": "123"}, + }, + { + name: "host", + pattern: "example.com/foo/{bar}", + url: "http://example.com/foo/123", + expected: map[string]string{"bar": "123"}, + }, + { + name: "host and method", + pattern: "GET example.com/foo/{bar}", + url: "http://example.com/foo/123", + expected: map[string]string{"bar": "123"}, + }, + } { + t.Run(tt.name, func(t *testing.T) { + mux := http.NewServeMux() + mux.HandleFunc(tt.pattern, func(_ http.ResponseWriter, r *http.Request) { + _, pattern := mux.Handler(r) + params := PathParameters(pattern, r) + assert.Equal(t, tt.expected, params) + }) + + r := httptest.NewRequest("GET", tt.url, nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + }) + } +} + +func TestParsePatternNames(t *testing.T) { + tests := []struct { + pattern string + expected []string + err bool + }{ + {"/foo/{bar}", []string{"bar"}, false}, + {"/foo/{bar}/{baz}", []string{"bar", "baz"}, false}, + {"/foo/{bar}/{bar}", nil, true}, + {"/foo/{bar}...", nil, true}, + {"/foo/{bar}.../baz", nil, true}, + {"/foo/{bar}/{baz}...", nil, true}, + {"/foo/{bar", nil, true}, + {"/foo/{bar{baz}}", nil, true}, + {"/foo/{}", nil, true}, + {"{}", nil, true}, + {"GET /foo/{bar}", []string{"bar"}, false}, + {"POST /foo/{bar}/{baz}", []string{"bar", "baz"}, false}, + {"PUT /foo/{bar}/{bar}", nil, true}, + {"DELETE /foo/{bar}...", nil, true}, + {"PATCH /foo/{bar}.../baz", nil, true}, + {"OPTIONS /foo/{bar}/{baz}...", nil, true}, + {"GET /foo/{bar", nil, true}, + {"POST /foo/{bar{baz}}", nil, true}, + {"DELETE /foo/{}", nil, true}, + {"OPTIONS {}", nil, true}, + {"GET example.com/foo/{bar}", []string{"bar"}, false}, + {"POST example.com/foo/{bar}/{baz}", []string{"bar", "baz"}, false}, + {"PUT example.com/foo/{bar}/{bar}", nil, true}, + {"DELETE example.com/foo/{bar}...", nil, true}, + {"PATCH example.com/foo/{bar}.../baz", nil, true}, + {"OPTIONS example.com/foo/{bar}/{baz}...", nil, true}, + {"GET example.com/foo/{bar", nil, true}, + {"POST example.com/foo/{bar{baz}}", nil, true}, + {"DELETE example.com/foo/{}", nil, true}, + {"OPTIONS example.com/{}", nil, true}, + } + + for _, tt := range tests { + t.Run(tt.pattern, func(t *testing.T) { + names, err := parsePatternNames(tt.pattern) + if tt.err { + assert.Error(t, err) + assert.Nil(t, names) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expected, names) + } + }) + } +} + +func TestServeMuxGo122Patterns(t *testing.T) { + // A mux with go1.21 patterns ("/bar") and go1.22 patterns ("GET /foo") + mux := http.NewServeMux() + handler := func(w http.ResponseWriter, r *http.Request) { + route := Route(r.Pattern) + w.Write([]byte(route)) + } + mux.HandleFunc("/bar/{id}", handler) + mux.HandleFunc("GET /foo/{id}/baz", handler) + + srv := httptest.NewServer(mux) + defer srv.Close() + + // Check for the /bar route + res, err := srv.Client().Get(srv.URL + "/bar/1337") + require.NoError(t, err) + body, err := io.ReadAll(res.Body) + res.Body.Close() + require.NoError(t, err) + require.Equal(t, "/bar/{id}", string(body)) + + // Check for the /foo route + res, err = srv.Client().Get(srv.URL + "/foo/42/baz") + require.NoError(t, err) + body, err = io.ReadAll(res.Body) + res.Body.Close() + require.NoError(t, err) + require.Equal(t, "/foo/{id}/baz", string(body)) +} diff --git a/contrib/net/http/internal/wrap/handler.go b/contrib/net/http/internal/wrap/handler.go new file mode 100644 index 0000000000..1a4e994213 --- /dev/null +++ b/contrib/net/http/internal/wrap/handler.go @@ -0,0 +1,59 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package wrap + +import ( + "net/http" + + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/pattern" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" +) + +type WrappedHandler struct { + http.HandlerFunc +} + +// Handler wraps an [http.Handler] with tracing using the given service and resource. +// If the WithResourceNamer option is provided as part of opts, it will take precedence over the resource argument. +func Handler(h http.Handler, service, resource string, opts ...internal.Option) http.Handler { + instr := internal.Instrumentation + cfg := internal.Default(instr) + cfg.ApplyOpts(opts...) + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.Component, internal.ComponentName)) + instr.Logger().Debug("contrib/net/http: Wrapping Handler: Service: %s, Resource: %s, %#v", service, resource, cfg) + // if the service provided from parameters is empty, + // use the one from the config (which should default to DD_SERVICE / "http.router") + if service == "" { + service = cfg.ServiceName + } + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + if cfg.IgnoreRequest(req) { + h.ServeHTTP(w, req) + return + } + resc := resource + if r := cfg.ResourceNamer(req); r != "" { + resc = r + } + so := make([]tracer.StartSpanOption, len(cfg.SpanOpts), len(cfg.SpanOpts)+1) + copy(so, cfg.SpanOpts) + so = append(so, httptrace.HeaderTagsFromRequest(req, cfg.HeaderTags)) + TraceAndServe(h, w, req, &httptrace.ServeConfig{ + Framework: "net/http", + Service: service, + Resource: resc, + FinishOpts: cfg.FinishOpts, + SpanOpts: so, + IsStatusError: cfg.IsStatusError, + Route: pattern.Route(req.Pattern), + RouteParams: pattern.PathParameters(req.Pattern, req), + }) + }) +} diff --git a/contrib/net/http/internal/wrap/mux.go b/contrib/net/http/internal/wrap/mux.go new file mode 100644 index 0000000000..6d03a265eb --- /dev/null +++ b/contrib/net/http/internal/wrap/mux.go @@ -0,0 +1,92 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package wrap + +import ( + "net/http" + + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/pattern" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" +) + +// ServeMux is an HTTP request multiplexer that traces all the incoming requests. +type ServeMux struct { + *http.ServeMux + cfg *internal.Config +} + +// NewServeMux allocates and returns an http.ServeMux augmented with the +// global tracer. +func NewServeMux(opts ...internal.Option) *ServeMux { + instr := internal.Instrumentation + cfg := internal.Default(instr) + cfg.ApplyOpts(opts...) + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.Component, internal.ComponentName)) + instr.Logger().Debug("contrib/net/http: Configuring ServeMux: %#v", cfg) + return &ServeMux{ + ServeMux: http.NewServeMux(), + cfg: cfg, + } +} + +// Handle registers the handler for the given pattern. +func (mux *ServeMux) Handle(pttrn string, inner http.Handler) { + handlerFunc := inner + if internal.Instrumentation.AppSecEnabled() { + // Calling TraceAndServe before `http.ServeMux.ServeHTTP` does not give enough information + // about routing for AppSec to work properly when using the ServeMux tracing wrapper. + // Therefore, we need to wrap the handlerFunc with a handler that finished the job here + // after pattern data and matches are available + // This also means stopping the handle from being called if security rules disallow it + handlerFunc = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if httpsec.RouteMatched(r.Context(), pattern.Route(r.Pattern), pattern.PathParameters(r.Pattern, r)) != nil { + return + } + inner.ServeHTTP(w, r) + }) + } + + mux.ServeMux.Handle(pttrn, handlerFunc) +} + +// HandleFunc registers the handler function for the given pattern. +func (mux *ServeMux) HandleFunc(pttrn string, handlerFunc func(http.ResponseWriter, *http.Request)) { + mux.Handle(pttrn, http.HandlerFunc(handlerFunc)) +} + +// ServeHTTP dispatches the request to the handler +// whose pattern most closely matches the request URL. +// We only need to rewrite this function to be able to trace +// all the incoming requests to the underlying multiplexer +func (mux *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if mux.cfg.IgnoreRequest(r) { + mux.ServeMux.ServeHTTP(w, r) + return + } + // get the resource associated to this request + _, pttrn := mux.Handler(r) + route := pattern.Route(pttrn) + resource := mux.cfg.ResourceNamer(r) + if resource == "" { + resource = r.Method + " " + route + } + so := make([]tracer.StartSpanOption, len(mux.cfg.SpanOpts), len(mux.cfg.SpanOpts)+1) + copy(so, mux.cfg.SpanOpts) + so = append(so, httptrace.HeaderTagsFromRequest(r, mux.cfg.HeaderTags)) + TraceAndServe(mux.ServeMux, w, r, &httptrace.ServeConfig{ + Framework: "net/http", + Service: mux.cfg.ServiceName, + Resource: resource, + SpanOpts: so, + Route: route, + IsStatusError: mux.cfg.IsStatusError, + }) +} diff --git a/contrib/net/http/internal/wrap/roundtrip.go b/contrib/net/http/internal/wrap/roundtrip.go new file mode 100644 index 0000000000..01b886c3e1 --- /dev/null +++ b/contrib/net/http/internal/wrap/roundtrip.go @@ -0,0 +1,204 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package wrap + +import ( + "crypto/tls" + "fmt" + "math" + "net/http" + "net/http/httptrace" + "os" + "strconv" + "time" + + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + instrumentationhttptrace "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" +) + +type AfterRoundTrip = func(*http.Response, error) (*http.Response, error) + +// httpTraceTimings captures key timing events from httptrace.ClientTrace +type httpTraceTimings struct { + dnsStart, dnsEnd time.Time + connectStart, connectEnd time.Time + tlsStart, tlsEnd time.Time + getConnStart, gotConn time.Time + wroteHeaders, gotFirstByte time.Time + connectErr error + tlsErr error +} + +// addDurationTag adds a timing tag to the span if both timestamps are valid +func (t *httpTraceTimings) addDurationTag(span *tracer.Span, tagName string, start, end time.Time) { + if !start.IsZero() && !end.IsZero() { + duration := float64(end.Sub(start).Nanoseconds()) / 1e6 + span.SetTag(tagName, duration) + } +} + +// addTimingTags adds all timing information to the span +func (t *httpTraceTimings) addTimingTags(span *tracer.Span) { + t.addDurationTag(span, "http.dns.duration_ms", t.dnsStart, t.dnsEnd) + t.addDurationTag(span, "http.connect.duration_ms", t.connectStart, t.connectEnd) + t.addDurationTag(span, "http.tls.duration_ms", t.tlsStart, t.tlsEnd) + t.addDurationTag(span, "http.get_conn.duration_ms", t.getConnStart, t.gotConn) + t.addDurationTag(span, "http.first_byte.duration_ms", t.wroteHeaders, t.gotFirstByte) + + // Add error information if present + if t.connectErr != nil { + span.SetTag("http.connect.error", t.connectErr.Error()) + } + if t.tlsErr != nil { + span.SetTag("http.tls.error", t.tlsErr.Error()) + } +} + +// newClientTrace creates a ClientTrace that captures timing information +func newClientTrace(timings *httpTraceTimings) *httptrace.ClientTrace { + return &httptrace.ClientTrace{ + DNSStart: func(httptrace.DNSStartInfo) { timings.dnsStart = time.Now() }, + DNSDone: func(httptrace.DNSDoneInfo) { timings.dnsEnd = time.Now() }, + ConnectStart: func(network, addr string) { timings.connectStart = time.Now() }, + ConnectDone: func(network, addr string, err error) { timings.connectEnd = time.Now(); timings.connectErr = err }, + TLSHandshakeStart: func() { timings.tlsStart = time.Now() }, + TLSHandshakeDone: func(_ tls.ConnectionState, err error) { timings.tlsEnd = time.Now(); timings.tlsErr = err }, + GetConn: func(hostPort string) { timings.getConnStart = time.Now() }, + GotConn: func(httptrace.GotConnInfo) { timings.gotConn = time.Now() }, + WroteHeaders: func() { timings.wroteHeaders = time.Now() }, + GotFirstResponseByte: func() { timings.gotFirstByte = time.Now() }, + } +} + +// ObserveRoundTrip performs actions before the base [http.RoundTripper.RoundTrip] using the +// provided [*config.RoundTripperConfig] (which cannot be nil). It returns the possibly modified +// [*http.Request] and a function to be called after the base [http.RoundTripper.RoundTrip] function +// is executed, and before returning control to the caller. +// +// If RASP features are enabled, an error will be returned if the request should be blocked, in +// which case the caller must immediately abort the [http.RoundTripper.RoundTrip] and forward the +// error as-is. An error is never returned in RASP features are not enabled. +func ObserveRoundTrip(cfg *config.RoundTripperConfig, req *http.Request) (*http.Request, AfterRoundTrip, error) { + if cfg.IgnoreRequest(req) { + return req, identityAfterRoundTrip, nil + } + + resourceName := cfg.ResourceNamer(req) + spanName := cfg.SpanNamer(req) + // Make a copy of the URL so we don't modify the outgoing request + url := *req.URL + url.User = nil // Do not include userinfo in the HTTPURL tag. + opts := []tracer.StartSpanOption{ + tracer.SpanType(ext.SpanTypeHTTP), + tracer.ResourceName(resourceName), + tracer.Tag(ext.HTTPMethod, req.Method), + tracer.Tag(ext.HTTPURL, instrumentationhttptrace.URLFromRequest(req, cfg.QueryString)), + tracer.Tag(ext.Component, config.ComponentName), + tracer.Tag(ext.SpanKind, ext.SpanKindClient), + tracer.Tag(ext.NetworkDestinationName, url.Hostname()), + } + if !math.IsNaN(cfg.AnalyticsRate) { + opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.AnalyticsRate)) + } + if cfg.ServiceName != "" { + opts = append(opts, tracer.ServiceName(cfg.ServiceName)) + } + if port, err := strconv.Atoi(url.Port()); err == nil { + opts = append(opts, tracer.Tag(ext.NetworkDestinationPort, port)) + } + if len(cfg.SpanOpts) > 0 { + opts = append(opts, cfg.SpanOpts...) + } + + // Start a new span + span, ctx := tracer.StartSpanFromContext(req.Context(), spanName, opts...) + + // Apply the before hook, if any + if cfg.Before != nil { + cfg.Before(req, span) + } + + // Setup ClientTrace for detailed timing if enabled + var timings *httpTraceTimings + if cfg.ClientTimings { + timings = &httpTraceTimings{} + ctx = httptrace.WithClientTrace(ctx, newClientTrace(timings)) + } + + // Clone the request so we can modify it without causing visible side-effects to the caller... + req = req.Clone(ctx) + for k, v := range baggage.All(ctx) { + span.SetBaggageItem(k, v) + } + if cfg.Propagation { + // inject the span context into the http request copy + err := tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header)) + if err != nil { + // this should never happen + fmt.Fprintf(os.Stderr, "contrib/net/http.Roundtrip: failed to inject http headers: %s\n", err.Error()) + } + } + + var afterAppsec func(*http.Response) + + // if RASP is enabled, check whether the request is supposed to be blocked. + if config.Instrumentation.AppSecRASPEnabled() { + var err error + afterAppsec, err = httpsec.ProtectRoundTrip(ctx, req) + if err != nil { + span.Finish() // Finish the span as we're blocking the request... + return nil, nil, err + } + } + + after := func(resp *http.Response, err error) (*http.Response, error) { + if afterAppsec != nil { + afterAppsec(resp) + } + + // Register http errors and observe the status code... + if err != nil { + span.SetTag("http.errors", err.Error()) + if cfg.ErrCheck == nil || cfg.ErrCheck(err) { + span.SetTag(ext.Error, err) + } + } else { + span.SetTag(ext.HTTPCode, strconv.Itoa(resp.StatusCode)) + if cfg.IsStatusError(resp.StatusCode) { + span.SetTag("http.errors", resp.Status) + span.SetTag(ext.ErrorNoStackTrace, fmt.Errorf("%d: %s", resp.StatusCode, http.StatusText(resp.StatusCode))) + } + } + + if cfg.ClientTimings && timings != nil { + timings.addTimingTags(span) + } + + // Run the after hooks & finish the span + if cfg.After != nil { + cfg.After(resp, span) + } + if !events.IsSecurityError(err) && (cfg.ErrCheck == nil || cfg.ErrCheck(err)) { + span.Finish(tracer.WithError(err)) + } else { + span.Finish() + } + + // Finally, forward the response and error back to the caller + return resp, err + } + + return req, after, nil +} + +func identityAfterRoundTrip(resp *http.Response, err error) (*http.Response, error) { + return resp, err +} diff --git a/contrib/net/http/internal/wrap/trace.go b/contrib/net/http/internal/wrap/trace.go new file mode 100644 index 0000000000..1f35e9c0fa --- /dev/null +++ b/contrib/net/http/internal/wrap/trace.go @@ -0,0 +1,24 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package wrap + +import ( + "net/http" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" +) + +// TraceAndServe serves the handler h using the given ResponseWriter and Request, applying tracing +// according to the specified config. +func TraceAndServe(h http.Handler, w http.ResponseWriter, r *http.Request, cfg *httptrace.ServeConfig) { + tw, tr, afterHandle, handled := httptrace.BeforeHandle(cfg, w, r) + defer afterHandle() + + if handled { + return + } + h.ServeHTTP(tw, tr) +} diff --git a/contrib/net/http/make_responsewriter.go b/contrib/net/http/make_responsewriter.go deleted file mode 100644 index 13ac9a8a14..0000000000 --- a/contrib/net/http/make_responsewriter.go +++ /dev/null @@ -1,88 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -//go:build ignore -// +build ignore - -// This program generates wrapper implementations of http.ResponseWriter that -// also satisfy http.Flusher, http.Pusher, http.CloseNotifier and http.Hijacker, -// based on whether or not the passed in http.ResponseWriter also satisfies -// them. - -package main - -import ( - "os" - "text/template" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/lists" -) - -func main() { - interfaces := []string{"Flusher", "Pusher", "CloseNotifier", "Hijacker"} - var combos [][][]string - for pick := len(interfaces); pick > 0; pick-- { - combos = append(combos, lists.Combinations(interfaces, pick)) - } - template.Must(template.New("").Parse(tpl)).Execute(os.Stdout, map[string]interface{}{ - "Interfaces": interfaces, - "Combinations": combos, - }) -} - -var tpl = `// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Code generated by make_responsewriter.go DO NOT EDIT - -package http - -import "net/http" - - -// wrapResponseWriter wraps an underlying http.ResponseWriter so that it can -// trace the http response codes. It also checks for various http interfaces -// (Flusher, Pusher, CloseNotifier, Hijacker) and if the underlying -// http.ResponseWriter implements them it generates an unnamed struct with the -// appropriate fields. -// -// This code is generated because we have to account for all the permutations -// of the interfaces. -// -// In case of any new interfaces or methods we didn't consider here, we also -// implement the rwUnwrapper interface, which is used internally by -// the standard library: https://github.com/golang/go/blob/6d89b38ed86e0bfa0ddaba08dc4071e6bb300eea/src/net/http/responsecontroller.go#L42-L44 -func wrapResponseWriter(w http.ResponseWriter) (http.ResponseWriter, *responseWriter) { -{{- range .Interfaces }} - h{{.}}, ok{{.}} := w.(http.{{.}}) -{{- end }} - - mw := newResponseWriter(w) - type monitoredResponseWriter interface { - http.ResponseWriter - Status() int - Unwrap() http.ResponseWriter - } - switch { -{{- range .Combinations }} - {{- range . }} - case {{ range $i, $v := . }}{{ if gt $i 0 }} && {{ end }}ok{{ $v }}{{ end }}: - w = struct { - monitoredResponseWriter - {{- range . }} - http.{{.}} - {{- end }} - }{mw{{ range . }}, h{{.}}{{ end }}} - {{- end }} -{{- end }} - default: - w = mw - } - - return w, mw -} -` diff --git a/contrib/net/http/option.go b/contrib/net/http/option.go index 22e63ee3b0..4f69e767f5 100644 --- a/contrib/net/http/option.go +++ b/contrib/net/http/option.go @@ -8,70 +8,37 @@ package http import ( "math" "net/http" - "os" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" ) -const ( - defaultServiceName = "http.router" - // envClientQueryStringEnabled is the name of the env var used to specify whether query string collection is enabled for http client spans. - envClientQueryStringEnabled = "DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING" - // envClientErrorStatuses is the name of the env var that specifies error status codes on http client spans - envClientErrorStatuses = "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES" -) - -type config struct { - serviceName string - analyticsRate float64 - spanOpts []ddtrace.StartSpanOption - finishOpts []ddtrace.FinishOption - ignoreRequest func(*http.Request) bool - resourceNamer func(*http.Request) string - headerTags *internal.LockMap -} - -// MuxOption has been deprecated in favor of Option. -type MuxOption = Option +// Option describes options for http.ServeMux. +type Option = internal.Option -// Option represents an option that can be passed to NewServeMux or WrapHandler. -type Option func(*config) +// OptionFn represents options applicable to NewServeMux and WrapHandler. +type OptionFn = internal.OptionFn -func defaults(cfg *config) { - if internal.BoolEnv("DD_TRACE_HTTP_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - cfg.headerTags = globalconfig.HeaderTagMap() - cfg.spanOpts = []ddtrace.StartSpanOption{tracer.Measured()} - if !math.IsNaN(cfg.analyticsRate) { - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - cfg.ignoreRequest = func(_ *http.Request) bool { return false } - cfg.resourceNamer = func(_ *http.Request) string { return "" } -} +// HandlerOptionFn represents options applicable to NewServeMux and WrapHandler. +type HandlerOptionFn = internal.HandlerOptionFn // WithIgnoreRequest holds the function to use for determining if the // incoming HTTP request should not be traced. -func WithIgnoreRequest(f func(*http.Request) bool) MuxOption { - return func(cfg *config) { - cfg.ignoreRequest = f +func WithIgnoreRequest(f func(*http.Request) bool) OptionFn { + return func(cfg *internal.CommonConfig) { + cfg.IgnoreRequest = f } } -// WithServiceName sets the given service name for the returned ServeMux. -func WithServiceName(name string) MuxOption { - return func(cfg *config) { - cfg.serviceName = name +// WithService sets the given service name for the returned ServeMux. +func WithService(name string) OptionFn { + return func(cfg *internal.CommonConfig) { + cfg.ServiceName = name } } @@ -79,207 +46,161 @@ func WithServiceName(name string) MuxOption { // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) - return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) +func WithHeaderTags(headers []string) HandlerOptionFn { + return func(cfg *internal.Config) { + cfg.HeaderTags = instrumentation.NewHeaderTags(headers) + } +} + +// WithStatusCheck sets a span to be an error if the passed function +// returns true for a given status code. +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { + return func(cfg *internal.CommonConfig) { + cfg.IsStatusError = fn } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) MuxOption { - return func(cfg *config) { +func WithAnalytics(on bool) OptionFn { + return func(cfg *internal.CommonConfig) { if on { - cfg.analyticsRate = 1.0 - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) + cfg.AnalyticsRate = 1.0 + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.EventSampleRate, cfg.AnalyticsRate)) } else { - cfg.analyticsRate = math.NaN() + cfg.AnalyticsRate = math.NaN() } } } // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) MuxOption { - return func(cfg *config) { +func WithAnalyticsRate(rate float64) OptionFn { + return func(cfg *internal.CommonConfig) { if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) + cfg.AnalyticsRate = rate + cfg.SpanOpts = append(cfg.SpanOpts, tracer.Tag(ext.EventSampleRate, cfg.AnalyticsRate)) } else { - cfg.analyticsRate = math.NaN() + cfg.AnalyticsRate = math.NaN() } } } -// WithSpanOptions defines a set of additional ddtrace.StartSpanOption to be added +// WithSpanOptions defines a set of additional tracer.StartSpanOption to be added // to spans started by the integration. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { - return func(cfg *config) { - cfg.spanOpts = append(cfg.spanOpts, opts...) +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { + return func(cfg *internal.CommonConfig) { + cfg.SpanOpts = append(cfg.SpanOpts, opts...) } } // WithResourceNamer populates the name of a resource based on a custom function. -func WithResourceNamer(namer func(req *http.Request) string) Option { - return func(cfg *config) { - cfg.resourceNamer = namer - } +func WithResourceNamer(namer func(req *http.Request) string) OptionFn { + return internal.WithResourceNamer(namer) } // NoDebugStack prevents stack traces from being attached to spans finishing // with an error. This is useful in situations where errors are frequent and // performance is critical. -func NoDebugStack() Option { - return func(cfg *config) { - cfg.finishOpts = append(cfg.finishOpts, tracer.NoDebugStack()) +func NoDebugStack() HandlerOptionFn { + return func(cfg *internal.Config) { + cfg.FinishOpts = append(cfg.FinishOpts, tracer.NoDebugStack()) } } -// A RoundTripperBeforeFunc can be used to modify a span before an http -// RoundTrip is made. -type RoundTripperBeforeFunc func(*http.Request, ddtrace.Span) +// RoundTripperOption describes options for http.RoundTripper. +type RoundTripperOption = internal.RoundTripperOption -// A RoundTripperAfterFunc can be used to modify a span after an http -// RoundTrip is made. It is possible for the http Response to be nil. -type RoundTripperAfterFunc func(*http.Response, ddtrace.Span) - -type roundTripperConfig struct { - before RoundTripperBeforeFunc - after RoundTripperAfterFunc - analyticsRate float64 - serviceName string - resourceNamer func(req *http.Request) string - spanNamer func(req *http.Request) string - ignoreRequest func(*http.Request) bool - spanOpts []ddtrace.StartSpanOption - propagation bool - errCheck func(err error) bool - queryString bool // reports whether the query string is included in the URL tag for http client spans - isStatusError func(statusCode int) bool -} +// RoundTripperOptionFn represents options applicable to WrapClient and WrapRoundTripper. +type RoundTripperOptionFn = internal.RoundTripperOptionFn -func newRoundTripperConfig() *roundTripperConfig { +func newRoundTripperConfig() *internal.RoundTripperConfig { defaultResourceNamer := func(_ *http.Request) string { return "http.request" } - spanName := namingschema.OpName(namingschema.HTTPClient) + instr := internal.Instrumentation + spanName := instr.OperationName(instrumentation.ComponentClient, nil) defaultSpanNamer := func(_ *http.Request) string { return spanName } - - c := &roundTripperConfig{ - serviceName: namingschema.ServiceNameOverrideV0("", ""), - analyticsRate: globalconfig.AnalyticsRate(), - resourceNamer: defaultResourceNamer, - propagation: true, - spanNamer: defaultSpanNamer, - ignoreRequest: func(_ *http.Request) bool { return false }, - queryString: internal.BoolEnv(envClientQueryStringEnabled, true), - isStatusError: isClientError, + sharedCfg := internal.CommonConfig{ + ServiceName: instr.ServiceName(instrumentation.ComponentClient, nil), + AnalyticsRate: instr.GlobalAnalyticsRate(), + ResourceNamer: defaultResourceNamer, + IgnoreRequest: func(_ *http.Request) bool { return false }, + IsStatusError: isClientError, } - v := os.Getenv(envClientErrorStatuses) + + v := env.Get(internal.EnvClientErrorStatuses) if fn := httptrace.GetErrorCodesFromInput(v); fn != nil { - c.isStatusError = fn + sharedCfg.IsStatusError = fn + } + + rtConfig := internal.RoundTripperConfig{ + CommonConfig: sharedCfg, + Propagation: true, + SpanNamer: defaultSpanNamer, + QueryString: options.GetBoolEnv(internal.EnvClientQueryStringEnabled, true), } - return c + + return &rtConfig } -// A RoundTripperOption represents an option that can be passed to -// WrapRoundTripper. -type RoundTripperOption func(*roundTripperConfig) +// A RoundTripperBeforeFunc can be used to modify a span before an http +// RoundTrip is made. +type RoundTripperBeforeFunc = internal.RoundTripperBeforeFunc + +// A RoundTripperAfterFunc can be used to modify a span after an http +// RoundTrip is made. It is possible for the http Response to be nil. +type RoundTripperAfterFunc = internal.RoundTripperAfterFunc // WithBefore adds a RoundTripperBeforeFunc to the RoundTripper // config. -func WithBefore(f RoundTripperBeforeFunc) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.before = f +func WithBefore(f RoundTripperBeforeFunc) RoundTripperOptionFn { + return func(cfg *internal.RoundTripperConfig) { + cfg.Before = f } } // WithAfter adds a RoundTripperAfterFunc to the RoundTripper // config. -func WithAfter(f RoundTripperAfterFunc) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.after = f +func WithAfter(f RoundTripperAfterFunc) RoundTripperOptionFn { + return func(cfg *internal.RoundTripperConfig) { + cfg.After = f } } -// RTWithResourceNamer specifies a function which will be used to -// obtain the resource name for a given request. -func RTWithResourceNamer(namer func(req *http.Request) string) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.resourceNamer = namer - } -} - -// RTWithSpanNamer specifies a function which will be used to +// WithSpanNamer specifies a function which will be used to // obtain the span operation name for a given request. -func RTWithSpanNamer(namer func(req *http.Request) string) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.spanNamer = namer - } -} - -// RTWithSpanOptions defines a set of additional ddtrace.StartSpanOption to be added -// to spans started by the integration. -func RTWithSpanOptions(opts ...ddtrace.StartSpanOption) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.spanOpts = append(cfg.spanOpts, opts...) +func WithSpanNamer(namer func(req *http.Request) string) RoundTripperOptionFn { + return func(cfg *internal.RoundTripperConfig) { + cfg.SpanNamer = namer } } -// RTWithServiceName sets the given service name for the RoundTripper. -func RTWithServiceName(name string) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.serviceName = name - } -} - -// RTWithAnalytics enables Trace Analytics for all started spans. -func RTWithAnalytics(on bool) RoundTripperOption { - return func(cfg *roundTripperConfig) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// RTWithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func RTWithAnalyticsRate(rate float64) RoundTripperOption { - return func(cfg *roundTripperConfig) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// RTWithPropagation enables/disables propagation for tracing headers. +// WithPropagation enables/disables propagation for tracing headers. // Disabling propagation will disconnect this trace from any downstream traces. -func RTWithPropagation(propagation bool) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.propagation = propagation +func WithPropagation(propagation bool) RoundTripperOptionFn { + return func(cfg *internal.RoundTripperConfig) { + cfg.Propagation = propagation } } -// RTWithIgnoreRequest holds the function to use for determining if the -// outgoing HTTP request should not be traced. -func RTWithIgnoreRequest(f func(*http.Request) bool) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.ignoreRequest = f +// WithErrorCheck specifies a function fn which determines whether the passed +// error should be marked as an error. The fn is called whenever an http operation +// finishes with an error +func WithErrorCheck(fn func(err error) bool) RoundTripperOptionFn { + return func(cfg *internal.RoundTripperConfig) { + cfg.ErrCheck = fn } } -// RTWithErrorCheck specifies a function fn which determines whether the passed -// error should be marked as an error. The fn is called whenever an http operation -// finishes with an error -func RTWithErrorCheck(fn func(err error) bool) RoundTripperOption { - return func(cfg *roundTripperConfig) { - cfg.errCheck = fn +// WithClientTimings enables detailed HTTP request tracing using httptrace.ClientTrace. +// When enabled, the integration will add timing information for DNS lookups, +// connection establishment, TLS handshakes, and other HTTP request events as span tags. +// This feature is disabled by default and adds minimal overhead when enabled. +func WithClientTimings(enabled bool) RoundTripperOptionFn { + return func(cfg *internal.RoundTripperConfig) { + cfg.ClientTimings = enabled } } diff --git a/contrib/net/http/orchestrion.client.yml b/contrib/net/http/orchestrion.client.yml new file mode 100644 index 0000000000..5a1768bbf0 --- /dev/null +++ b/contrib/net/http/orchestrion.client.yml @@ -0,0 +1,121 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/net/http/v2.Client + description: HTTP client implementation. + +aspects: + # Add tracing to the default http.RoundTripper implementation. + - id: Transport.DD__tracer_internal + join-point: + struct-definition: net/http.Transport + advice: + - add-struct-field: + name: DD__tracer_internal + type: bool + # In tracer internals, set the DD__tracer_internal field to true so that we do not end up + # instrumenting the tracer's internal HTTP clients (this would be a span bomb!) + - id: Transport.DD__tracer_internal=true + tracer-internal: true + join-point: + all-of: + - one-of: + - import-path: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + - import-path: github.com/DataDog/dd-trace-go/v2/internal + - import-path: github.com/DataDog/dd-trace-go/v2/openfeature + - import-path: github.com/DataDog/dd-trace-go/v2/internal/hostname/httputils + - import-path: github.com/DataDog/dd-trace-go/v2/internal/remoteconfig + - import-path: github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal + - import-path: github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net + - import-path: github.com/DataDog/dd-trace-go/v2/instrumentation/httpmem + - import-path: github.com/DataDog/dd-trace-go/v2/profiler + - struct-literal: + type: net/http.Transport + advice: + - wrap-expression: + template: |- + {{- .AST.Type -}}{ + DD__tracer_internal: true, + {{ range .AST.Elts }}{{ . }}, + {{ end }} + } + - id: Transport.RoundTrip + join-point: + function-body: + function: + - name: RoundTrip + - receiver: '*net/http.Transport' + advice: + - inject-declarations: + # We need to use go:linkname to refer to a these declarations in order to avoid creating + # circular dependencies, as these features have transitive dependencies on `net/http`... + links: + - github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/orchestrion + template: |- + type ddAfterRoundTrip = func(*Response, error) (*Response, error) + + //go:linkname __dd_httptrace_ObserveRoundTrip github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/orchestrion.ObserveRoundTrip + func __dd_httptrace_ObserveRoundTrip(*Request) (*Request, ddAfterRoundTrip, error) + - prepend-statements: + template: |- + {{- $t := .Function.Receiver -}} + {{- $req := .Function.Argument 0 -}} + {{- $res := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + if !{{ $t }}.DD__tracer_internal { + var ( + __after__ ddAfterRoundTrip + __err__ error + ) + {{ $req }}, __after__, __err__ = __dd_httptrace_ObserveRoundTrip({{ $req }}) + if __err__ != nil { + return nil, __err__ + } + defer func(){ + {{ $res }}, {{ $err }} = __after__({{ $res }}, {{ $err }}) + }() + } + + # Replace the http.Get, http.Head, http.Post, and http.PostForm short-hands with the longer forms if + # there is a context available from the surroundings. + - id: Get|Head|Post|PostForm + join-point: + all-of: + - not: + # We don't want to instrument in net/http, it'd create a circular dependency! + import-path: net/http + - one-of: + - function-call: net/http.Get + - function-call: net/http.Head + - function-call: net/http.Post + - function-call: net/http.PostForm + advice: + # Wire the context that is found to the handlers... + - wrap-expression: + imports: + # Temporarily add a namespaced alias to ensure we don't have symbol name collisions. + # The root issue is solved at https://github.com/DataDog/orchestrion/pull/678 but this should + # ensure dd-trace-go users using older Orchestrion versions don't have build errors. + __ddtrace_client: github.com/DataDog/dd-trace-go/contrib/net/http/v2/client + template: |- + {{- $ctx := .Function.ArgumentOfType "context.Context" -}} + {{- $req := .Function.ArgumentOfType "*net/http.Request" }} + {{- if $ctx -}} + __ddtrace_client.{{ .AST.Fun.Name }}( + {{ $ctx }}, + {{ range .AST.Args }}{{ . }}, + {{ end }} + ) + {{- else if $req -}} + __ddtrace_client.{{ .AST.Fun.Name }}( + {{ $req }}.Context(), + {{ range .AST.Args }}{{ . }}, + {{ end }} + ) + {{- else -}} + {{ . }} + {{- end -}} diff --git a/contrib/net/http/orchestrion.go b/contrib/net/http/orchestrion.go new file mode 100644 index 0000000000..7acd5ca72a --- /dev/null +++ b/contrib/net/http/orchestrion.go @@ -0,0 +1,15 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +//nolint:revive +package http + +// Import "./internal/orchestrion" and "./client" so that they're present in the +// dependency closure when compile-time instrumentation is used. This is +// necessary for the `orchestrion.server.yml` configuraton to be valid. +import ( + _ "github.com/DataDog/dd-trace-go/contrib/net/http/v2/client" + _ "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/orchestrion" +) diff --git a/contrib/net/http/orchestrion.server.yml b/contrib/net/http/orchestrion.server.yml new file mode 100644 index 0000000000..c8ae66b590 --- /dev/null +++ b/contrib/net/http/orchestrion.server.yml @@ -0,0 +1,34 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/net/http/v2.Server + description: HTTP server implementation. + +aspects: + - id: Server.Serve + join-point: + function-body: + function: + - receiver: '*net/http.Server' + - name: Serve + advice: + - inject-declarations: + # We need to use go:linkname to refer to a number of declarations in order to avoid creating + # circular dependencies, as these features have transitive dependencies on `net/http`... + links: + - github.com/DataDog/dd-trace-go/contrib/net/http/v2 + template: |- + //go:linkname __dd_contrib_net_http_internal_orchestrion_WrapHandler github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/orchestrion.WrapHandler + func __dd_contrib_net_http_internal_orchestrion_WrapHandler(Handler) Handler + - prepend-statements: + template: |- + {{- $srv := .Function.Receiver -}} + if {{ $srv }}.Handler == nil { + {{ $srv }}.Handler = __dd_contrib_net_http_internal_orchestrion_WrapHandler(DefaultServeMux) + } else { + {{ $srv }}.Handler = __dd_contrib_net_http_internal_orchestrion_WrapHandler({{ $srv }}.Handler) + } diff --git a/contrib/net/http/orchestrion.yml b/contrib/net/http/orchestrion.yml new file mode 100644 index 0000000000..0f1a38f167 --- /dev/null +++ b/contrib/net/http/orchestrion.yml @@ -0,0 +1,13 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/net/http/v2 + description: HTTP stack implementation. + +extends: + - ./orchestrion.client.yml + - ./orchestrion.server.yml diff --git a/contrib/net/http/roundtripper.go b/contrib/net/http/roundtripper.go index 7e47c530b6..a6819631fc 100644 --- a/contrib/net/http/roundtripper.go +++ b/contrib/net/http/roundtripper.go @@ -6,101 +6,24 @@ package http import ( - "fmt" - "math" "net/http" - "os" - "strconv" - "strings" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/wrap" ) type roundTripper struct { base http.RoundTripper - cfg *roundTripperConfig + cfg *internal.RoundTripperConfig } -func (rt *roundTripper) RoundTrip(req *http.Request) (res *http.Response, err error) { - if rt.cfg.ignoreRequest(req) { - return rt.base.RoundTrip(req) - } - resourceName := rt.cfg.resourceNamer(req) - spanName := rt.cfg.spanNamer(req) - // Make a copy of the URL so we don't modify the outgoing request - url := *req.URL - url.User = nil // Do not include userinfo in the HTTPURL tag. - opts := []ddtrace.StartSpanOption{ - tracer.SpanType(ext.SpanTypeHTTP), - tracer.ResourceName(resourceName), - tracer.Tag(ext.HTTPMethod, req.Method), - tracer.Tag(ext.HTTPURL, urlFromRequest(req, rt.cfg.queryString)), - tracer.Tag(ext.Component, componentName), - tracer.Tag(ext.SpanKind, ext.SpanKindClient), - tracer.Tag(ext.NetworkDestinationName, url.Hostname()), - } - if !math.IsNaN(rt.cfg.analyticsRate) { - opts = append(opts, tracer.Tag(ext.EventSampleRate, rt.cfg.analyticsRate)) - } - if rt.cfg.serviceName != "" { - opts = append(opts, tracer.ServiceName(rt.cfg.serviceName)) - } - if port, err := strconv.Atoi(url.Port()); err == nil { - opts = append(opts, tracer.Tag(ext.NetworkDestinationPort, port)) - } - if len(rt.cfg.spanOpts) > 0 { - opts = append(opts, rt.cfg.spanOpts...) - } - span, ctx := tracer.StartSpanFromContext(req.Context(), spanName, opts...) - defer func() { - if rt.cfg.after != nil { - rt.cfg.after(res, span) - } - if !events.IsSecurityError(err) && (rt.cfg.errCheck == nil || rt.cfg.errCheck(err)) { - span.Finish(tracer.WithError(err)) - } else { - span.Finish() - } - }() - if rt.cfg.before != nil { - rt.cfg.before(req, span) - } - r2 := req.Clone(ctx) - if rt.cfg.propagation { - // inject the span context into the http request copy - err = tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(r2.Header)) - if err != nil { - // this should never happen - fmt.Fprintf(os.Stderr, "contrib/net/http.Roundtrip: failed to inject http headers: %v\n", err) - } - } - - if appsec.RASPEnabled() { - if err := httpsec.ProtectRoundTrip(ctx, r2.URL.String()); err != nil { - return nil, err - } - } - - res, err = rt.base.RoundTrip(r2) +func (rt *roundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + req, after, err := wrap.ObserveRoundTrip(rt.cfg, req) if err != nil { - span.SetTag("http.errors", err.Error()) - if rt.cfg.errCheck == nil || rt.cfg.errCheck(err) { - span.SetTag(ext.Error, err) - } - } else { - span.SetTag(ext.HTTPCode, strconv.Itoa(res.StatusCode)) - if rt.cfg.isStatusError(res.StatusCode) { - span.SetTag("http.errors", res.Status) - span.SetTag(ext.Error, fmt.Errorf("%d: %s", res.StatusCode, http.StatusText(res.StatusCode))) - } + return nil, err } - return res, err + resp, err := rt.base.RoundTrip(req) + return after(resp, err) } // Unwrap returns the original http.RoundTripper. @@ -115,9 +38,7 @@ func WrapRoundTripper(rt http.RoundTripper, opts ...RoundTripperOption) http.Rou rt = http.DefaultTransport } cfg := newRoundTripperConfig() - for _, opt := range opts { - opt(cfg) - } + cfg.ApplyOpts(opts...) if wrapped, ok := rt.(*roundTripper); ok { rt = wrapped.base } @@ -135,32 +56,3 @@ func WrapClient(c *http.Client, opts ...RoundTripperOption) *http.Client { c.Transport = WrapRoundTripper(c.Transport, opts...) return c } - -// urlFromRequest returns the URL from the HTTP request. The URL query string is included in the return object iff queryString is true -// See https://docs.datadoghq.com/tracing/configure_data_security#redacting-the-query-in-the-url for more information. -func urlFromRequest(r *http.Request, queryString bool) string { - // Quoting net/http comments about net.Request.URL on server requests: - // "For most requests, fields other than Path and RawQuery will be - // empty. (See RFC 7230, Section 5.3)" - // This is why we don't rely on url.URL.String(), url.URL.Host, url.URL.Scheme, etc... - var url string - path := r.URL.EscapedPath() - scheme := r.URL.Scheme - if r.TLS != nil { - scheme = "https" - } - if r.Host != "" { - url = strings.Join([]string{scheme, "://", r.Host, path}, "") - } else { - url = path - } - // Collect the query string if we are allowed to report it and obfuscate it if possible/allowed - if queryString && r.URL.RawQuery != "" { - query := r.URL.RawQuery - url = strings.Join([]string{url, query}, "?") - } - if frag := r.URL.EscapedFragment(); frag != "" { - url = strings.Join([]string{url, frag}, "#") - } - return url -} diff --git a/contrib/net/http/roundtripper_test.go b/contrib/net/http/roundtripper_test.go index 4002647fe6..1e51cdcf0c 100644 --- a/contrib/net/http/roundtripper_test.go +++ b/contrib/net/http/roundtripper_test.go @@ -6,30 +6,27 @@ package http import ( + "context" "encoding/base64" "fmt" "net/http" "net/http/httptest" "net/url" - "os" "regexp" "strconv" "strings" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + internal "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/config" + "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" ) func TestWrapRoundTripperAllowNilTransport(t *testing.T) { @@ -61,10 +58,10 @@ func TestRoundTripper(t *testing.T) { defer s.Close() rt := WrapRoundTripper(http.DefaultTransport, - WithBefore(func(req *http.Request, span ddtrace.Span) { + WithBefore(func(_ *http.Request, span *tracer.Span) { span.SetTag("CalledBefore", true) }), - WithAfter(func(res *http.Response, span ddtrace.Span) { + WithAfter(func(_ *http.Response, span *tracer.Span) { span.SetTag("CalledAfter", true) })) @@ -90,8 +87,8 @@ func TestRoundTripper(t *testing.T) { assert.Equal(t, "200", s1.Tag(ext.HTTPCode)) assert.Equal(t, "GET", s1.Tag(ext.HTTPMethod)) assert.Equal(t, s.URL+"/hello/world", s1.Tag(ext.HTTPURL)) - assert.Equal(t, true, s1.Tag("CalledBefore")) - assert.Equal(t, true, s1.Tag("CalledAfter")) + assert.Equal(t, "true", s1.Tag("CalledBefore")) + assert.Equal(t, "true", s1.Tag("CalledAfter")) assert.Equal(t, ext.SpanKindClient, s1.Tag(ext.SpanKind)) assert.Equal(t, "net/http", s1.Tag(ext.Component)) assert.Equal(t, "127.0.0.1", s1.Tag(ext.NetworkDestinationName)) @@ -99,7 +96,7 @@ func TestRoundTripper(t *testing.T) { wantPort, err := strconv.Atoi(strings.TrimPrefix(s.URL, "http://127.0.0.1/")) require.NoError(t, err) require.NotEmpty(t, wantPort) - assert.Equal(t, wantPort, s1.Tag(ext.NetworkDestinationPort)) + assert.Equal(t, float64(wantPort), s1.Tag(ext.NetworkDestinationPort)) } func makeRequests(rt http.RoundTripper, url string, t *testing.T) { @@ -135,18 +132,17 @@ func TestRoundTripperErrors(t *testing.T) { spans := mt.FinishedSpans() assert.Len(t, spans, 3) s := spans[0] // 400 is error - assert.Equal(t, "400: Bad Request", s.Tag(ext.Error).(error).Error()) + assert.Equal(t, "400: Bad Request", s.Tag(ext.ErrorMsg)) assert.Equal(t, "400", s.Tag(ext.HTTPCode)) s = spans[1] // 500 is not error - assert.Empty(t, s.Tag(ext.Error)) + assert.Empty(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "500", s.Tag(ext.HTTPCode)) s = spans[2] // 200 is not error - assert.Empty(t, s.Tag(ext.Error)) + assert.Empty(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "200", s.Tag(ext.HTTPCode)) }) t.Run("custom", func(t *testing.T) { - os.Setenv("DD_TRACE_HTTP_CLIENT_ERROR_STATUSES", "500-510") - defer os.Unsetenv("DD_TRACE_HTTP_CLIENT_ERROR_STATUSES") + t.Setenv("DD_TRACE_HTTP_CLIENT_ERROR_STATUSES", "500-510") mt := mocktracer.Start() defer mt.Stop() rt := WrapRoundTripper(http.DefaultTransport) @@ -154,13 +150,13 @@ func TestRoundTripperErrors(t *testing.T) { spans := mt.FinishedSpans() assert.Len(t, spans, 3) s := spans[0] // 400 is not error - assert.Empty(t, s.Tag(ext.Error)) + assert.Empty(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "400", s.Tag(ext.HTTPCode)) s = spans[1] // 500 is error - assert.Equal(t, "500: Internal Server Error", s.Tag(ext.Error).(error).Error()) + assert.Equal(t, "500: Internal Server Error", s.Tag(ext.ErrorMsg)) assert.Equal(t, "500", s.Tag(ext.HTTPCode)) s = spans[2] // 200 is not error - assert.Empty(t, s.Tag(ext.Error)) + assert.Empty(t, s.Tag(ext.ErrorMsg)) assert.Equal(t, "200", s.Tag(ext.HTTPCode)) }) } @@ -170,7 +166,7 @@ func TestRoundTripperNetworkError(t *testing.T) { defer mt.Stop() done := make(chan struct{}) - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { _, err := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) assert.NoError(t, err) <-done @@ -179,10 +175,10 @@ func TestRoundTripperNetworkError(t *testing.T) { defer close(done) rt := WrapRoundTripper(http.DefaultTransport, - WithBefore(func(req *http.Request, span ddtrace.Span) { + WithBefore(func(_ *http.Request, span *tracer.Span) { span.SetTag("CalledBefore", true) }), - WithAfter(func(res *http.Response, span ddtrace.Span) { + WithAfter(func(_ *http.Response, span *tracer.Span) { span.SetTag("CalledAfter", true) })) @@ -203,17 +199,17 @@ func TestRoundTripperNetworkError(t *testing.T) { assert.Equal(t, nil, s0.Tag(ext.HTTPCode)) assert.Equal(t, "GET", s0.Tag(ext.HTTPMethod)) assert.Equal(t, s.URL+"/hello/world", s0.Tag(ext.HTTPURL)) - assert.NotNil(t, s0.Tag(ext.Error)) - assert.Equal(t, true, s0.Tag("CalledBefore")) - assert.Equal(t, true, s0.Tag("CalledAfter")) + assert.NotNil(t, s0.Tag(ext.ErrorMsg)) + assert.Equal(t, "true", s0.Tag("CalledBefore")) + assert.Equal(t, "true", s0.Tag("CalledAfter")) assert.Equal(t, ext.SpanKindClient, s0.Tag(ext.SpanKind)) assert.Equal(t, "net/http", s0.Tag(ext.Component)) } func TestRoundTripperNetworkErrorWithErrorCheck(t *testing.T) { - failedRequest := func(t *testing.T, mt mocktracer.Tracer, forwardErr bool, opts ...RoundTripperOption) mocktracer.Span { + failedRequest := func(t *testing.T, mt mocktracer.Tracer, forwardErr bool, _ ...Option) *mocktracer.Span { done := make(chan struct{}) - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { _, err := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) assert.NoError(t, err) <-done @@ -222,7 +218,7 @@ func TestRoundTripperNetworkErrorWithErrorCheck(t *testing.T) { defer close(done) rt := WrapRoundTripper(http.DefaultTransport, - RTWithErrorCheck(func(err error) bool { + WithErrorCheck(func(_ error) bool { return forwardErr })) @@ -246,7 +242,7 @@ func TestRoundTripperNetworkErrorWithErrorCheck(t *testing.T) { defer mt.Stop() span := failedRequest(t, mt, false) - assert.Nil(t, span.Tag(ext.Error)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) }) t.Run("error forwarded", func(t *testing.T) { @@ -254,7 +250,7 @@ func TestRoundTripperNetworkErrorWithErrorCheck(t *testing.T) { defer mt.Stop() span := failedRequest(t, mt, true) - assert.NotNil(t, span.Tag(ext.Error)) + assert.NotNil(t, span.Tag(ext.ErrorMsg)) }) } @@ -263,7 +259,7 @@ func TestRoundTripperCredentials(t *testing.T) { defer mt.Stop() var auth string - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { if enc, ok := r.Header["Authorization"]; ok { encoded := strings.TrimPrefix(enc[0], "Basic ") if b64, err := base64.StdEncoding.DecodeString(encoded); err == nil { @@ -275,10 +271,10 @@ func TestRoundTripperCredentials(t *testing.T) { defer s.Close() rt := WrapRoundTripper(http.DefaultTransport, - WithBefore(func(req *http.Request, span ddtrace.Span) { + WithBefore(func(_ *http.Request, span *tracer.Span) { span.SetTag("CalledBefore", true) }), - WithAfter(func(res *http.Response, span ddtrace.Span) { + WithAfter(func(_ *http.Response, span *tracer.Span) { span.SetTag("CalledAfter", true) })) @@ -316,7 +312,7 @@ func TestWrapClient(t *testing.T) { func TestRoundTripperAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...RoundTripperOption) { - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) })) defer srv.Close() @@ -340,41 +336,27 @@ func TestRoundTripperAnalyticsSettings(t *testing.T) { assertRate(t, mt, nil) }) - t.Run("global", func(t *testing.T) { - t.Skip("global flag disabled") - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - t.Run("enabled", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, 1.0, RTWithAnalytics(true)) + assertRate(t, mt, 1.0, WithAnalytics(true)) }) t.Run("disabled", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - assertRate(t, mt, nil, RTWithAnalytics(false)) + assertRate(t, mt, nil, WithAnalytics(false)) }) t.Run("override", func(t *testing.T) { + testutils.SetGlobalAnalyticsRate(t, 0.4) + mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.23, RTWithAnalyticsRate(0.23)) + assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } @@ -408,12 +390,12 @@ func TestRoundTripperIgnoreRequest(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World")) })) defer s.Close() - rt := WrapRoundTripper(http.DefaultTransport, RTWithIgnoreRequest( + rt := WrapRoundTripper(http.DefaultTransport, WithIgnoreRequest( func(req *http.Request) bool { return req.URL.Path == "/ignore" }, @@ -435,6 +417,58 @@ func TestRoundTripperIgnoreRequest(t *testing.T) { assert.Len(t, spans, 1) } +func TestRoundTripperStatusCheck(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/not-found" { + w.WriteHeader(http.StatusNotFound) + return + } + + w.WriteHeader(http.StatusTeapot) + })) + defer s.Close() + + rt := WrapRoundTripper(http.DefaultTransport, WithStatusCheck(func(statusCode int) bool { + return statusCode >= 400 && statusCode != http.StatusNotFound + })) + + client := &http.Client{ + Transport: rt, + } + + // First request is not marked as an error as it's a 404 + resp, err := client.Get(s.URL + "/not-found") + assert.Nil(t, err) + resp.Body.Close() + + spans := mt.FinishedSpans() + mt.Reset() + assert.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + assert.Equal(t, "http.request", spans[0].Tag(ext.ResourceName)) + assert.Equal(t, "404", spans[0].Tag(ext.HTTPCode)) + assert.Equal(t, "GET", spans[0].Tag(ext.HTTPMethod)) + assert.Nil(t, spans[0].Tag("http.errors")) + assert.Nil(t, spans[0].Tag(ext.ErrorNoStackTrace)) + + // Second request is marked as an error as it's a 418 + resp, err = client.Get(s.URL + "/hello/world") + assert.Nil(t, err) + resp.Body.Close() + + spans = mt.FinishedSpans() + assert.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + assert.Equal(t, "http.request", spans[0].Tag(ext.ResourceName)) + assert.Equal(t, "418", spans[0].Tag(ext.HTTPCode)) + assert.Equal(t, "GET", spans[0].Tag(ext.HTTPMethod)) + assert.EqualValues(t, "418 I'm a teapot", spans[0].Tag("http.errors")) + assert.EqualValues(t, "418: I'm a teapot", spans[0].Tag(ext.ErrorMsg)) +} + func TestRoundTripperURLWithoutPort(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() @@ -455,7 +489,7 @@ func TestRoundTripperURLWithoutPort(t *testing.T) { assert.Equal(t, nil, s0.Tag(ext.HTTPCode)) assert.Equal(t, "GET", s0.Tag(ext.HTTPMethod)) assert.Equal(t, "http://localhost/hello/world", s0.Tag(ext.HTTPURL)) - assert.NotNil(t, s0.Tag(ext.Error)) + assert.NotNil(t, s0.Tag(ext.ErrorMsg)) assert.Equal(t, ext.SpanKindClient, s0.Tag(ext.SpanKind)) assert.Equal(t, "net/http", s0.Tag(ext.Component)) assert.Equal(t, "localhost", s0.Tag(ext.NetworkDestinationName)) @@ -463,7 +497,7 @@ func TestRoundTripperURLWithoutPort(t *testing.T) { } func TestServiceName(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World")) })) defer s.Close() @@ -472,7 +506,7 @@ func TestServiceName(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() serviceName := "testServer" - rt := WrapRoundTripper(http.DefaultTransport, RTWithServiceName(serviceName)) + rt := WrapRoundTripper(http.DefaultTransport, WithService(serviceName)) client := &http.Client{ Transport: rt, } @@ -489,8 +523,8 @@ func TestServiceName(t *testing.T) { defer mt.Stop() serviceName := "testServer" rt := WrapRoundTripper(http.DefaultTransport, - RTWithServiceName("wrongServiceName"), - WithBefore(func(_ *http.Request, span ddtrace.Span) { + WithService("wrongServiceName"), + WithBefore(func(_ *http.Request, span *tracer.Span) { span.SetTag(ext.ServiceName, serviceName) }), ) @@ -507,7 +541,7 @@ func TestServiceName(t *testing.T) { } func TestResourceNamer(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World")) })) defer s.Close() @@ -533,7 +567,7 @@ func TestResourceNamer(t *testing.T) { customNamer := func(req *http.Request) string { return fmt.Sprintf("%s %s", req.Method, req.URL.Path) } - rt := WrapRoundTripper(http.DefaultTransport, RTWithResourceNamer(customNamer)) + rt := WrapRoundTripper(http.DefaultTransport, WithResourceNamer(customNamer)) client := &http.Client{ Transport: rt, } @@ -547,14 +581,14 @@ func TestResourceNamer(t *testing.T) { } func TestSpanOptions(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("")) })) + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("")) })) defer s.Close() tagKey := "foo" tagValue := "bar" mt := mocktracer.Start() defer mt.Stop() - rt := WrapRoundTripper(http.DefaultTransport, RTWithSpanOptions(tracer.Tag(tagKey, tagValue))) + rt := WrapRoundTripper(http.DefaultTransport, WithSpanOptions(tracer.Tag(tagKey, tagValue))) client := &http.Client{Transport: rt} resp, err := client.Get(s.URL) @@ -566,12 +600,48 @@ func TestSpanOptions(t *testing.T) { assert.Equal(t, tagValue, spans[0].Tag(tagKey)) } -func TestClientQueryString(t *testing.T) { - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +func TestClientTimings(t *testing.T) { + assertClientTimings := func(t *testing.T, enabled bool, expectTags bool) { + mt := mocktracer.Start() + defer mt.Stop() + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusOK) + })) + defer srv.Close() + + rt := WrapRoundTripper(http.DefaultTransport, WithClientTimings(enabled)) + client := &http.Client{Transport: rt} + resp, err := client.Get(srv.URL) + assert.Nil(t, err) + defer resp.Body.Close() + + spans := mt.FinishedSpans() + assert.Len(t, spans, 1) + span := spans[0] + + hasTimingTags := span.Tag("http.connect.duration_ms") != nil || + span.Tag("http.get_conn.duration_ms") != nil || + span.Tag("http.first_byte.duration_ms") != nil + + assert.Equal(t, expectTags, hasTimingTags) + } + + t.Run("disabled", func(t *testing.T) { + assertClientTimings(t, false, false) + }) + + t.Run("enabled", func(t *testing.T) { + assertClientTimings(t, true, true) + }) +} + +func TestClientQueryStringCollected(t *testing.T) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("Hello World")) })) defer s.Close() - t.Run("default", func(t *testing.T) { + t.Run("default true", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() @@ -579,20 +649,19 @@ func TestClientQueryString(t *testing.T) { client := &http.Client{ Transport: rt, } - resp, err := client.Get(s.URL + "/hello/world?querystring=xyz") + resp, err := client.Get(s.URL + "/hello/world?something=fun") assert.Nil(t, err) defer resp.Body.Close() spans := mt.FinishedSpans() assert.Len(t, spans, 1) - assert.Regexp(t, regexp.MustCompile(`^http://.*?/hello/world\?querystring=xyz$`), spans[0].Tag(ext.HTTPURL)) + assert.Regexp(t, regexp.MustCompile(`^http://.*?/hello/world\?something=fun$`), spans[0].Tag(ext.HTTPURL)) }) t.Run("false", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - os.Setenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "false") - defer os.Unsetenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING") + t.Setenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "false") rt := WrapRoundTripper(http.DefaultTransport) client := &http.Client{ @@ -611,22 +680,78 @@ func TestClientQueryString(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - os.Setenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING", "true") - os.Setenv("DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED", "true") - defer os.Unsetenv("DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING") - defer os.Unsetenv("DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED") + t.Setenv("DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED", "false") rt := WrapRoundTripper(http.DefaultTransport) client := &http.Client{ Transport: rt, } - resp, err := client.Get(s.URL + "/hello/world?querystring=xyz") + resp, err := client.Get(s.URL + "/hello/world?something=fun") + assert.Nil(t, err) + defer resp.Body.Close() + spans := mt.FinishedSpans() + assert.Len(t, spans, 1) + + assert.Regexp(t, regexp.MustCompile(`^http://.*?/hello/world\?something=fun$`), spans[0].Tag(ext.HTTPURL)) + }) +} + +func TestClientQueryStringObfuscated(t *testing.T) { + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Write([]byte("Hello World")) + })) + defer s.Close() + t.Run("default", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + rt := WrapRoundTripper(http.DefaultTransport) + client := &http.Client{ + Transport: rt, + } + resp, err := client.Get(s.URL + "/hello/world?token=value") + assert.Nil(t, err) + defer resp.Body.Close() + spans := mt.FinishedSpans() + assert.Len(t, spans, 1) + + assert.Regexp(t, regexp.MustCompile(`^http://.*?/hello/world\?$`), spans[0].Tag(ext.HTTPURL)) + }) + t.Run("empty", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + t.Setenv(internal.EnvQueryStringRegexp, "") + + rt := WrapRoundTripper(http.DefaultTransport) + client := &http.Client{ + Transport: rt, + } + resp, err := client.Get(s.URL + "/hello/world?custom=xyz") assert.Nil(t, err) defer resp.Body.Close() spans := mt.FinishedSpans() assert.Len(t, spans, 1) - assert.Contains(t, spans[0].Tag(ext.HTTPURL), "/hello/world?querystring=xyz") + assert.Regexp(t, regexp.MustCompile(`^http://.*?/hello/world\?custom=xyz$`), spans[0].Tag(ext.HTTPURL)) + }) + t.Run("custom", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + t.Setenv(internal.EnvQueryStringRegexp, "^custom") + + rt := WrapRoundTripper(http.DefaultTransport) + client := &http.Client{ + Transport: rt, + } + resp, err := client.Get(s.URL + "/hello/world?token=value") + assert.Nil(t, err) + defer resp.Body.Close() + spans := mt.FinishedSpans() + assert.Len(t, spans, 1) + + assert.Regexp(t, regexp.MustCompile(`^http://.*?/hello/world\?$`), spans[0].Tag(ext.HTTPURL)) }) } @@ -650,7 +775,7 @@ func TestRoundTripperPropagation(t *testing.T) { defer s.Close() rt := WrapRoundTripper(http.DefaultTransport, - RTWithPropagation(false)) + WithPropagation(false)) client := &http.Client{ Transport: rt, } @@ -660,116 +785,47 @@ func TestRoundTripperPropagation(t *testing.T) { defer resp.Body.Close() } -func TestClientNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []RoundTripperOption - if serviceOverride != "" { - opts = append(opts, RTWithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("")) })) - defer srv.Close() - - c := WrapClient(&http.Client{}, opts...) - req, err := http.NewRequest(http.MethodGet, srv.URL+"/200", nil) - require.NoError(t, err) - resp, err := c.Do(req) - require.NoError(t, err) - defer resp.Body.Close() - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "http.request", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "http.client.request", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{""}, - WithDDService: []string{""}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) +type emptyRoundTripper struct { + customResponse *http.Response } -type emptyRoundTripper struct{} - func (rt *emptyRoundTripper) RoundTrip(_ *http.Request) (*http.Response, error) { + if rt.customResponse != nil { + return rt.customResponse, nil + } + recorder := httptest.NewRecorder() recorder.WriteHeader(200) return recorder.Result(), nil } -func TestAppsec(t *testing.T) { - t.Setenv("DD_APPSEC_RULES", "../../../internal/appsec/testdata/rasp.json") - - client := WrapRoundTripper(&emptyRoundTripper{}) - - for _, enabled := range []bool{true, false} { +func TestRoundTripperWithBaggage(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE", "datadog,tracecontext,baggage") + tracer.Start() + defer tracer.Stop() - t.Run(strconv.FormatBool(enabled), func(t *testing.T) { - t.Setenv("DD_APPSEC_RASP_ENABLED", strconv.FormatBool(enabled)) + var capturedHeaders http.Header - mt := mocktracer.Start() - defer mt.Stop() - - appsec.Start() - if !appsec.Enabled() { - t.Skip("appsec not enabled") - } - - defer appsec.Stop() - - w := httptest.NewRecorder() - r, err := http.NewRequest("GET", "?value=169.254.169.254", nil) - require.NoError(t, err) - - TraceAndServe(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - req, err := http.NewRequest("GET", "http://169.254.169.254/", nil) - require.NoError(t, err) - - resp, err := client.RoundTrip(req.WithContext(r.Context())) - - if enabled { - require.True(t, events.IsSecurityError(err)) - } else { - require.NoError(t, err) - } - - if resp != nil { - defer resp.Body.Close() - } - }), w, r, &ServeConfig{ - Service: "service", - Resource: "resource", - }) + s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + capturedHeaders = r.Header.Clone() + w.WriteHeader(http.StatusOK) + _, _ = w.Write([]byte("Hello with Baggage!")) + })) + defer s.Close() - spans := mt.FinishedSpans() - require.Len(t, spans, 2) // service entry serviceSpan & http request serviceSpan - serviceSpan := spans[1] + rt := WrapRoundTripper(http.DefaultTransport).(*roundTripper) - if !enabled { - require.NotContains(t, serviceSpan.Tags(), "_dd.appsec.json") - require.NotContains(t, serviceSpan.Tags(), "_dd.stack") - return - } + ctx := context.Background() + ctx = baggage.Set(ctx, "foo", "bar") + ctx = baggage.Set(ctx, "baz", "qux") - require.Contains(t, serviceSpan.Tags(), "_dd.appsec.json") - appsecJSON := serviceSpan.Tag("_dd.appsec.json") - require.Contains(t, appsecJSON, addresses.ServerIoNetURLAddr) + // Build the HTTP request with that context. + req, err := http.NewRequestWithContext(ctx, http.MethodGet, s.URL+"/baggage", nil) + assert.NoError(t, err) - require.Contains(t, serviceSpan.Tags(), "_dd.stack") - require.NotContains(t, serviceSpan.Tags(), "error.message") + resp, err := rt.RoundTrip(req) + assert.NoError(t, err) + defer resp.Body.Close() - // This is a nested event so it should contain the child span id in the service entry span - // TODO(eliott.bouhana): uncomment this once we have the child span id in the service entry span - // require.Contains(t, appsecJSON, `"span_id":`+strconv.FormatUint(requestSpan.SpanID(), 10)) - }) - } + assert.NotEmpty(t, capturedHeaders.Get("baggage"), "should have baggage header") } diff --git a/contrib/net/http/trace.go b/contrib/net/http/trace.go index f78aa19a9a..ec197e5df6 100644 --- a/contrib/net/http/trace.go +++ b/contrib/net/http/trace.go @@ -3,34 +3,20 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package http // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" +package http // import "github.com/DataDog/dd-trace-go/contrib/net/http/v2" import ( "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/contrib/net/http/v2/internal/wrap" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" ) -const componentName = "net/http" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) -} - // ServeConfig specifies the tracing configuration when using TraceAndServe. type ServeConfig = httptrace.ServeConfig // TraceAndServe serves the handler h using the given ResponseWriter and Request, applying tracing // according to the specified config. func TraceAndServe(h http.Handler, w http.ResponseWriter, r *http.Request, cfg *ServeConfig) { - tw, tr, afterHandle, handled := httptrace.BeforeHandle(cfg, w, r) - defer afterHandle() - - if handled { - return - } - h.ServeHTTP(tw, tr) + wrap.TraceAndServe(h, w, r, cfg) } diff --git a/contrib/net/http/trace_test.go b/contrib/net/http/trace_test.go index e00aaa95fe..87d0db5666 100644 --- a/contrib/net/http/trace_test.go +++ b/contrib/net/http/trace_test.go @@ -13,13 +13,12 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func TestTraceAndServe(t *testing.T) { @@ -32,7 +31,7 @@ func TestTraceAndServe(t *testing.T) { w := httptest.NewRecorder() r, err := http.NewRequest("GET", "/path?token=value", nil) assert.NoError(err) - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(w http.ResponseWriter, _ *http.Request) { _, ok := w.(http.Hijacker) assert.False(ok) http.Error(w, "some error", http.StatusServiceUnavailable) @@ -53,7 +52,9 @@ func TestTraceAndServe(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("/path?", span.Tag(ext.HTTPURL)) assert.Equal("503", span.Tag(ext.HTTPCode)) - assert.Equal("503: Service Unavailable", span.Tag(ext.Error).(error).Error()) + assert.Equal("503: Service Unavailable", span.Tag(ext.ErrorMsg)) + assert.Equal("server", span.Tag(ext.SpanKind)) + assert.Equal("net/http", span.Tag(ext.Component)) }) t.Run("custom", func(t *testing.T) { @@ -68,7 +69,7 @@ func TestTraceAndServe(t *testing.T) { }{httptest.NewRecorder()} r, err := http.NewRequest("GET", "/path?token=value", nil) assert.NoError(err) - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(w http.ResponseWriter, _ *http.Request) { _, ok := w.(http.Hijacker) assert.False(ok) http.Error(w, "some error", http.StatusServiceUnavailable) @@ -89,7 +90,9 @@ func TestTraceAndServe(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("/path?", span.Tag(ext.HTTPURL)) assert.Equal("503", span.Tag(ext.HTTPCode)) - assert.Equal("503: Service Unavailable", span.Tag(ext.Error).(error).Error()) + assert.Equal("503: Service Unavailable", span.Tag(ext.ErrorMsg)) + assert.Equal("server", span.Tag(ext.SpanKind)) + assert.Equal("net/http", span.Tag(ext.Component)) }) t.Run("query-params", func(t *testing.T) { @@ -101,7 +104,7 @@ func TestTraceAndServe(t *testing.T) { w := httptest.NewRecorder() r, err := http.NewRequest("GET", "/path?token=value&id=1", nil) assert.NoError(err) - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(_ http.ResponseWriter, _ *http.Request) { called = true } TraceAndServe(http.HandlerFunc(handler), w, r, &ServeConfig{ @@ -119,7 +122,7 @@ func TestTraceAndServe(t *testing.T) { t.Run("Hijacker,Flusher,CloseNotifier", func(t *testing.T) { assert := assert.New(t) called := false - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(w http.ResponseWriter, _ *http.Request) { _, ok := w.(http.Hijacker) assert.True(ok, "ResponseWriter should implement http.Hijacker") _, ok = w.(http.Flusher) @@ -152,7 +155,7 @@ func TestTraceAndServe(t *testing.T) { defer mt.Stop() called := false - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(_ http.ResponseWriter, _ *http.Request) { called = true } @@ -171,7 +174,7 @@ func TestTraceAndServe(t *testing.T) { Resource: "resource", }) - var p, c mocktracer.Span + var p, c *mocktracer.Span spans := mt.FinishedSpans() assert.Len(spans, 2) if spans[0].OperationName() == "parent" { @@ -189,7 +192,7 @@ func TestTraceAndServe(t *testing.T) { defer mt.Stop() called := false - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(_ http.ResponseWriter, _ *http.Request) { called = true } @@ -206,7 +209,7 @@ func TestTraceAndServe(t *testing.T) { Resource: "resource", }) - var p, c mocktracer.Span + var p, c *mocktracer.Span spans := mt.FinishedSpans() assert.Len(spans, 2) if spans[0].OperationName() == "parent" { @@ -223,7 +226,7 @@ func TestTraceAndServe(t *testing.T) { assert := assert.New(t) defer mt.Stop() - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusInternalServerError) } @@ -249,7 +252,7 @@ func TestTraceAndServe(t *testing.T) { w := httptest.NewRecorder() r, err := http.NewRequest("GET", "/path?token=value", nil) assert.NoError(err) - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(w http.ResponseWriter, _ *http.Request) { _, ok := w.(http.Hijacker) assert.False(ok) called = true @@ -269,6 +272,8 @@ func TestTraceAndServe(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("/path?", span.Tag(ext.HTTPURL)) assert.Equal("200", span.Tag(ext.HTTPCode)) + assert.Equal("server", span.Tag(ext.SpanKind)) + assert.Equal("net/http", span.Tag(ext.Component)) }) t.Run("noconfig", func(t *testing.T) { @@ -280,7 +285,7 @@ func TestTraceAndServe(t *testing.T) { w := httptest.NewRecorder() r, err := http.NewRequest("GET", "/path?token=value", nil) assert.NoError(err) - handler := func(w http.ResponseWriter, r *http.Request) { + handler := func(w http.ResponseWriter, _ *http.Request) { _, ok := w.(http.Hijacker) assert.False(ok) called = true @@ -292,17 +297,147 @@ func TestTraceAndServe(t *testing.T) { assert.True(called) assert.Len(spans, 1) assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Nil(span.Tag(ext.ServiceName)) // This is nil since mocktracer does not behave like the actual tracer, which will set a default. + assert.Equal("", span.Tag(ext.ServiceName)) // This is nil since mocktracer does not behave like the actual tracer, which will set a default. assert.Equal("http.request", span.Tag(ext.ResourceName)) assert.Nil(span.Tag(ext.HTTPRoute)) assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("/path?", span.Tag(ext.HTTPURL)) assert.Equal("200", span.Tag(ext.HTTPCode)) + assert.Equal("server", span.Tag(ext.SpanKind)) + assert.Equal("net/http", span.Tag(ext.Component)) + }) + + t.Run("override kind and component", func(t *testing.T) { + mt := mocktracer.Start() + assert := assert.New(t) + defer mt.Stop() + + called := false + w := httptest.NewRecorder() + r, err := http.NewRequest("GET", "/path?token=value", nil) + assert.NoError(err) + handler := func(w http.ResponseWriter, r *http.Request) { + _, ok := w.(http.Hijacker) + assert.False(ok) + called = true + } + customOpts := []tracer.StartSpanOption{tracer.Tag(ext.SpanKind, "custom.kind"), tracer.Tag(ext.Component, "custom.component")} + TraceAndServe(http.HandlerFunc(handler), w, r, &ServeConfig{SpanOpts: customOpts}) + spans := mt.FinishedSpans() + span := spans[0] + + assert.True(called) + assert.Len(spans, 1) + assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) + assert.Equal("", span.Tag(ext.ServiceName)) // This is nil since mocktracer does not behave like the actual tracer, which will set a default. + assert.Equal("http.request", span.Tag(ext.ResourceName)) + assert.Nil(span.Tag(ext.HTTPRoute)) + assert.Equal("GET", span.Tag(ext.HTTPMethod)) + assert.Equal("/path?", span.Tag(ext.HTTPURL)) + assert.Equal("200", span.Tag(ext.HTTPCode)) + assert.Equal("custom.kind", span.Tag(ext.SpanKind)) + assert.Equal("custom.component", span.Tag(ext.Component)) + }) + + t.Run("integrationLevelErrorHandling", func(t *testing.T) { + mt := mocktracer.Start() + assert := assert.New(t) + defer mt.Stop() + + handler := func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusBadRequest) + } + r, err := http.NewRequest("GET", "/", nil) + assert.NoError(err) + w := httptest.NewRecorder() + TraceAndServe(http.HandlerFunc(handler), w, r, &ServeConfig{ + IsStatusError: func(i int) bool { return i >= 400 }, + }) + + spans := mt.FinishedSpans() + assert.Len(spans, 1) + assert.Equal("400", spans[0].Tag(ext.HTTPCode)) + assert.Equal("400: Bad Request", spans[0].Tag(ext.ErrorMsg)) + }) + + t.Run("envLevelErrorHandling", func(t *testing.T) { + mt := mocktracer.Start() + assert := assert.New(t) + defer mt.Stop() + + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500") + + cfg := &ServeConfig{ + Service: "service", + Resource: "resource", + } + + handler := func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) // 500 + } + + r, err := http.NewRequest("GET", "/", nil) + assert.NoError(err) + w := httptest.NewRecorder() + TraceAndServe(http.HandlerFunc(handler), w, r, cfg) + + spans := mt.FinishedSpans() + assert.Len(spans, 1) + assert.Equal("500", spans[0].Tag(ext.HTTPCode)) + assert.Equal("500: Internal Server Error", spans[0].Tag(ext.ErrorMsg)) + }) + + t.Run("integrationOverridesEnvConfig", func(t *testing.T) { + mt := mocktracer.Start() + assert := assert.New(t) + defer mt.Stop() + + // Set environment variable to treat 500 as an error + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500") + + cfg := &ServeConfig{ + IsStatusError: func(i int) bool { return i == 400 }, + } + + // Test a 400 response, which should be reported as an error + handler400 := func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusBadRequest) // 400 + } + + r400, err := http.NewRequest("GET", "/", nil) + assert.NoError(err) + w400 := httptest.NewRecorder() + TraceAndServe(http.HandlerFunc(handler400), w400, r400, cfg) + + spans := mt.FinishedSpans() + assert.Len(spans, 1) + assert.Equal("400", spans[0].Tag(ext.HTTPCode)) + assert.Equal("400: Bad Request", spans[0].Tag(ext.ErrorMsg)) + + // Reset the tracer + mt.Reset() + + // Test a 500 response, which should NOT be reported as an error, + // even though the environment variable says 500 is an error. + handler500 := func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusInternalServerError) // 500 + } + + r500, err := http.NewRequest("GET", "/", nil) + assert.NoError(err) + w500 := httptest.NewRecorder() + TraceAndServe(http.HandlerFunc(handler500), w500, r500, cfg) + + spans = mt.FinishedSpans() + assert.Len(spans, 1) + assert.Equal("500", spans[0].Tag(ext.HTTPCode)) + // Confirm that the span is NOT marked as an error. + assert.Nil(spans[0].Tag(ext.ErrorMsg)) }) } func TestTraceAndServeHost(t *testing.T) { - handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + handler := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) }) t.Run("on", func(t *testing.T) { @@ -400,8 +535,8 @@ func BenchmarkTraceAndServe(b *testing.B) { cfg := ServeConfig{ Service: "service-name", Resource: "resource-name", - FinishOpts: []ddtrace.FinishOption{}, - SpanOpts: []ddtrace.StartSpanOption{}, + FinishOpts: []tracer.FinishOption{}, + SpanOpts: []tracer.StartSpanOption{}, QueryParams: false, } b.ResetTimer() diff --git a/contrib/olivere/elastic/elastictrace.go b/contrib/olivere/elastic.v5/elastictrace.go similarity index 83% rename from contrib/olivere/elastic/elastictrace.go rename to contrib/olivere/elastic.v5/elastictrace.go index a5440dc5db..0a3afcc223 100644 --- a/contrib/olivere/elastic/elastictrace.go +++ b/contrib/olivere/elastic.v5/elastictrace.go @@ -3,8 +3,11 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package elastic provides functions to trace the gopkg.in/olivere/elastic.v{3,5} packages. -package elastic // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/olivere/elastic" +// Package elastic provides functions to trace the gopkg.in/olivere/elastic.v5 packages. +// +// Deprecated: https://github.com/olivere/elastic is deprecated. Please use the official Elasticsearch client for Go +// at https://github.com/elastic/go-elasticsearch and use the corresponding integration. This integration will be removed in a future release. +package elastic // import "github.com/DataDog/dd-trace-go/contrib/olivere/elastic/v2" import ( "bufio" @@ -18,19 +21,19 @@ import ( "regexp" "strconv" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) +var instr *instrumentation.Instrumentation + +// in v2 this mod was renamed to olivere/elastic.v5, so we use this instead of instrumentation.PackageOlivereElasticV5 +// to keep the same component name. const componentName = "olivere/elastic" func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("gopkg.in/olivere/elastic.v5") - tracer.MarkIntegrationImported("gopkg.in/olivere/elastic.v3") + instr = instrumentation.Load(instrumentation.PackageOlivereElasticV5) } // NewHTTPClient returns a new http.Client which traces requests under the given service name. @@ -38,9 +41,9 @@ func NewHTTPClient(opts ...ClientOption) *http.Client { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/olivere/elastic: Configuring HTTP Client: %#v", cfg) + instr.Logger().Debug("contrib/olivere/elastic: Configuring HTTP Client: %#v", cfg) return &http.Client{Transport: &httpTransport{config: cfg}} } @@ -57,7 +60,7 @@ func (t *httpTransport) RoundTrip(req *http.Request) (*http.Response, error) { url := req.URL.Path method := req.Method resource := t.config.resourceNamer(url, method) - opts := []ddtrace.StartSpanOption{ + opts := []tracer.StartSpanOption{ tracer.ServiceName(t.config.serviceName), tracer.SpanType(ext.SpanTypeElasticSearch), tracer.ResourceName(resource), diff --git a/contrib/olivere/elastic/elastictrace_test.go b/contrib/olivere/elastic.v5/elastictrace_test.go similarity index 56% rename from contrib/olivere/elastic/elastictrace_test.go rename to contrib/olivere/elastic.v5/elastictrace_test.go index 2633f2faff..5826ab2a35 100644 --- a/contrib/olivere/elastic/elastictrace_test.go +++ b/contrib/olivere/elastic.v5/elastictrace_test.go @@ -14,22 +14,18 @@ import ( "os" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - elasticv3 "gopkg.in/olivere/elastic.v3" - elasticv5 "gopkg.in/olivere/elastic.v5" + "gopkg.in/olivere/elastic.v5" ) const debug = false const ( - elasticV5URL = "http://127.0.0.1:9201/" - elasticV3URL = "http://127.0.0.1:9200/" + elasticURL = "http://127.0.0.1:9201/" elasticFakeURL = "http://127.0.0.1:29201/" ) @@ -42,17 +38,17 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -func TestClientV5(t *testing.T) { +func TestClient(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV5URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), + tc := NewHTTPClient(WithService("my-es-service")) + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), ) assert.NoError(err) @@ -77,18 +73,18 @@ func TestClientV5(t *testing.T) { checkErrTrace(assert, mt, "127.0.0.1") } -func TestClientV5Gzip(t *testing.T) { +func TestClientGzip(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV5URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), - elasticv5.SetGzip(true), + tc := NewHTTPClient(WithService("my-es-service")) + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), + elastic.SetGzip(true), ) assert.NoError(err) @@ -113,7 +109,7 @@ func TestClientV5Gzip(t *testing.T) { checkErrTrace(assert, mt, "127.0.0.1") } -func TestClientErrorCutoffV3(t *testing.T) { +func TestClientErrorCutoff(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() @@ -123,42 +119,12 @@ func TestClientErrorCutoffV3(t *testing.T) { }() bodyCutoff = 10 - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV3URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), - ) - assert.NoError(err) - - _, err = client.Index(). - Index("twitter").Id("1"). - Type("tweet"). - BodyString(`{"user": "test", "message": "hello"}`). - Do(context.TODO()) - assert.NoError(err) - - span := mt.FinishedSpans()[0] - assert.Equal(`{"user": "`, span.Tag("elasticsearch.body")) -} - -func TestClientErrorCutoffV5(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - oldCutoff := bodyCutoff - defer func() { - bodyCutoff = oldCutoff - }() - bodyCutoff = 10 - - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV5URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), + tc := NewHTTPClient(WithService("my-es-service")) + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), ) assert.NoError(err) @@ -167,85 +133,21 @@ func TestClientErrorCutoffV5(t *testing.T) { assert.Error(err) span := mt.FinishedSpans()[0] - assert.Equal(`{"error":{`, span.Tag(ext.Error).(error).Error()) -} - -func TestClientV3(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv3.NewClient( - elasticv3.SetURL(elasticV3URL), - elasticv3.SetHttpClient(tc), - elasticv3.SetSniff(false), - elasticv3.SetHealthcheck(false), - ) - assert.NoError(err) - - _, err = client.Index(). - Index("twitter").Id("1"). - Type("tweet"). - BodyString(`{"user": "test", "message": "hello"}`). - DoC(context.TODO()) - assert.NoError(err) - checkPUTTrace(assert, mt, "127.0.0.1") - - mt.Reset() - _, err = client.Get().Index("twitter").Type("tweet"). - Id("1").DoC(context.TODO()) - assert.NoError(err) - checkGETTrace(assert, mt, "127.0.0.1") - - mt.Reset() - _, err = client.Get().Index("not-real-index"). - Id("1").DoC(context.TODO()) - assert.Error(err) - checkErrTrace(assert, mt, "127.0.0.1") -} - -func TestClientV3Failure(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv3.NewClient( - // inexistent service, it must fail - elasticv3.SetURL(elasticFakeURL), - elasticv3.SetHttpClient(tc), - elasticv3.SetSniff(false), - elasticv3.SetHealthcheck(false), - ) - assert.NoError(err) - - _, err = client.Index(). - Index("twitter").Id("1"). - Type("tweet"). - BodyString(`{"user": "test", "message": "hello"}`). - DoC(context.TODO()) - assert.Error(err) - - spans := mt.FinishedSpans() - checkPUTTrace(assert, mt, "127.0.0.1") - - assert.NotEmpty(spans[0].Tag(ext.Error)) - assert.Equal("*net.OpError", fmt.Sprintf("%T", spans[0].Tag(ext.Error).(error))) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) } -func TestClientV5Failure(t *testing.T) { +func TestClientFailure(t *testing.T) { assert := assert.New(t) mt := mocktracer.Start() defer mt.Stop() - tc := NewHTTPClient(WithServiceName("my-es-service")) - client, err := elasticv5.NewClient( + tc := NewHTTPClient(WithService("my-es-service")) + client, err := elastic.NewClient( // inexistent service, it must fail - elasticv5.SetURL(elasticFakeURL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), + elastic.SetURL(elasticFakeURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), ) assert.NoError(err) @@ -259,8 +161,7 @@ func TestClientV5Failure(t *testing.T) { spans := mt.FinishedSpans() checkPUTTrace(assert, mt, "127.0.0.1") - assert.NotEmpty(spans[0].Tag(ext.Error)) - assert.Equal("*net.OpError", fmt.Sprintf("%T", spans[0].Tag(ext.Error).(error))) + assert.NotEmpty(spans[0].Tag(ext.ErrorMsg)) } func checkPUTTrace(assert *assert.Assertions, mt mocktracer.Tracer, host string) { @@ -271,6 +172,7 @@ func checkPUTTrace(assert *assert.Assertions, mt mocktracer.Tracer, host string) assert.Equal("PUT", span.Tag("elasticsearch.method")) assert.Equal(`{"user": "test", "message": "hello"}`, span.Tag("elasticsearch.body")) assert.Equal("olivere/elastic", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("elasticsearch", span.Tag(ext.DBSystem)) assert.Equal(host, span.Tag(ext.NetworkDestinationName)) @@ -283,6 +185,7 @@ func checkGETTrace(assert *assert.Assertions, mt mocktracer.Tracer, host string) assert.Equal("/twitter/tweet/1", span.Tag("elasticsearch.url")) assert.Equal("GET", span.Tag("elasticsearch.method")) assert.Equal("olivere/elastic", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("elasticsearch", span.Tag(ext.DBSystem)) assert.Equal(host, span.Tag(ext.NetworkDestinationName)) @@ -293,9 +196,9 @@ func checkErrTrace(assert *assert.Assertions, mt mocktracer.Tracer, host string) assert.Equal("my-es-service", span.Tag(ext.ServiceName)) assert.Equal("GET /not-real-index/_all/?", span.Tag(ext.ResourceName)) assert.Equal("/not-real-index/_all/1", span.Tag("elasticsearch.url")) - assert.NotEmpty(span.Tag(ext.Error)) - assert.Equal("*errors.errorString", fmt.Sprintf("%T", span.Tag(ext.Error).(error))) + assert.NotEmpty(span.Tag(ext.ErrorMsg)) assert.Equal("olivere/elastic", span.Tag(ext.Component)) + assert.Equal(componentName, span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("elasticsearch", span.Tag(ext.DBSystem)) assert.Equal(host, span.Tag(ext.NetworkDestinationName)) @@ -333,7 +236,7 @@ func TestQuantize(t *testing.T) { func TestResourceNamerSettings(t *testing.T) { staticName := "static resource name" - staticNamer := func(url, method string) string { + staticNamer := func(_, _ string) string { return staticName } @@ -342,11 +245,11 @@ func TestResourceNamerSettings(t *testing.T) { defer mt.Stop() tc := NewHTTPClient() - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV3URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), ) assert.NoError(t, err) @@ -364,11 +267,11 @@ func TestResourceNamerSettings(t *testing.T) { defer mt.Stop() tc := NewHTTPClient(WithResourceNamer(staticNamer)) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV3URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), ) assert.NoError(t, err) @@ -459,11 +362,11 @@ func TestPeek(t *testing.T) { func TestAnalyticsSettings(t *testing.T) { assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...ClientOption) { tc := NewHTTPClient(opts...) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV5URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), ) assert.NoError(t, err) @@ -492,9 +395,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -517,55 +418,8 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - tc := NewHTTPClient(opts...) - client, err := elasticv5.NewClient( - elasticv5.SetURL(elasticV5URL), - elasticv5.SetHttpClient(tc), - elasticv5.SetSniff(false), - elasticv5.SetHealthcheck(false), - ) - require.NoError(t, err) - - _, err = client.Index(). - Index("twitter").Id("1"). - Type("tweet"). - BodyString(`{"user": "test", "message": "hello"}`). - Do(context.Background()) - require.NoError(t, err) - - spans := mt.FinishedSpans() - require.Len(t, spans, 1) - return spans - } - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"elastic.client"}, - WithDDService: []string{"elastic.client"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} diff --git a/contrib/olivere/elastic.v5/example_test.go b/contrib/olivere/elastic.v5/example_test.go new file mode 100644 index 0000000000..3d9ae7a285 --- /dev/null +++ b/contrib/olivere/elastic.v5/example_test.go @@ -0,0 +1,44 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package elastic_test + +import ( + "context" + + "gopkg.in/olivere/elastic.v5" + + elastictrace "github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +// To start tracing elastic.v5 requests, create a new TracedHTTPClient that you will +// use when initializing the elastic.Client. +func Example() { + tracer.Start() + defer tracer.Stop() + + tc := elastictrace.NewHTTPClient(elastictrace.WithService("my-es-service")) + client, _ := elastic.NewClient( + elastic.SetURL("http://127.0.0.1:9200/"), + elastic.SetHttpClient(tc), + ) + + // Spans are emitted for all + client.Index(). + Index("twitter").Type("tweet").Index("1"). + BodyString(`{"user": "test", "message": "hello"}`). + Do(context.Background()) + + // Use a context to pass information down the call chain + root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", + tracer.ServiceName("web"), + tracer.ResourceName("/tweet/1"), + ) + client.Get(). + Index("twitter").Type("tweet").Index("1"). + Do(ctx) + root.Finish() +} diff --git a/contrib/olivere/elastic.v5/go.mod b/contrib/olivere/elastic.v5/go.mod new file mode 100644 index 0000000000..cd8bc4324f --- /dev/null +++ b/contrib/olivere/elastic.v5/go.mod @@ -0,0 +1,95 @@ +module github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + gopkg.in/olivere/elastic.v5 v5.0.84 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/olivere/elastic.v5/go.sum b/contrib/olivere/elastic.v5/go.sum new file mode 100644 index 0000000000..ccf33881b3 --- /dev/null +++ b/contrib/olivere/elastic.v5/go.sum @@ -0,0 +1,320 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/olivere/elastic.v5 v5.0.84 h1:acF/tRSg5geZpE3rqLglkS79CQMIMzOpWZE7hRXIkjs= +gopkg.in/olivere/elastic.v5 v5.0.84/go.mod h1:LXF6q9XNBxpMqrcgax95C6xyARXWbbCXUrtTxrNrxJI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/olivere/elastic/option.go b/contrib/olivere/elastic.v5/option.go similarity index 64% rename from contrib/olivere/elastic/option.go rename to contrib/olivere/elastic.v5/option.go index f75398ef50..443f80b5da 100644 --- a/contrib/olivere/elastic/option.go +++ b/contrib/olivere/elastic.v5/option.go @@ -9,52 +9,53 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "elastic.client" - type clientConfig struct { serviceName string spanName string - transport *http.Transport + transport http.RoundTripper analyticsRate float64 resourceNamer func(url, method string) string } -// ClientOption represents an option that can be used when creating a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Elastic integration. +type ClientOption interface { + apply(config *clientConfig) +} + +// ClientOptionFn represents options applicable to NewHTTPClient. +type ClientOptionFn func(config *clientConfig) + +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.ElasticSearchOutbound) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) cfg.transport = http.DefaultTransport.(*http.Transport) cfg.resourceNamer = quantize - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_ELASTIC_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.analyticsRate = instr.AnalyticsRate(false) } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithTransport sets the given transport as an http.Transport for the client. -func WithTransport(t *http.Transport) ClientOption { +func WithTransport(t http.RoundTripper) ClientOptionFn { return func(cfg *clientConfig) { cfg.transport = t } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -66,7 +67,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -80,7 +81,7 @@ func WithAnalyticsRate(rate float64) ClientOption { // ElasticSearch request, using the request's URL and method. Note that the default quantizer obfuscates // IDs and indexes and by replacing it, sensitive data could possibly be exposed, unless the new quantizer // specifically takes care of that. -func WithResourceNamer(namer func(url, method string) string) ClientOption { +func WithResourceNamer(namer func(url, method string) string) ClientOptionFn { return func(cfg *clientConfig) { cfg.resourceNamer = namer } diff --git a/contrib/olivere/elastic/example_test.go b/contrib/olivere/elastic/example_test.go deleted file mode 100644 index b21759b761..0000000000 --- a/contrib/olivere/elastic/example_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package elastic_test - -import ( - "context" - - elastictrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/olivere/elastic" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - elasticv3 "gopkg.in/olivere/elastic.v3" - elasticv5 "gopkg.in/olivere/elastic.v5" -) - -// To start tracing elastic.v5 requests, create a new TracedHTTPClient that you will -// use when initializing the elastic.Client. -func Example_v5() { - tc := elastictrace.NewHTTPClient(elastictrace.WithServiceName("my-es-service")) - client, _ := elasticv5.NewClient( - elasticv5.SetURL("http://127.0.0.1:9200/"), - elasticv5.SetHttpClient(tc), - ) - - // Spans are emitted for all - client.Index(). - Index("twitter").Type("tweet").Index("1"). - BodyString(`{"user": "test", "message": "hello"}`). - Do(context.Background()) - - // Use a context to pass information down the call chain - root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", - tracer.ServiceName("web"), - tracer.ResourceName("/tweet/1"), - ) - client.Get(). - Index("twitter").Type("tweet").Index("1"). - Do(ctx) - root.Finish() -} - -// To trace elastic.v3 you create a TracedHTTPClient in the same way but all requests must use -// the DoC() call to pass the request context. -func Example_v3() { - tc := elastictrace.NewHTTPClient(elastictrace.WithServiceName("my-es-service")) - client, _ := elasticv3.NewClient( - elasticv3.SetURL("http://127.0.0.1:9200/"), - elasticv3.SetHttpClient(tc), - ) - - // Spans are emitted for all - client.Index(). - Index("twitter").Type("tweet").Index("1"). - BodyString(`{"user": "test", "message": "hello"}`). - DoC(context.Background()) - - // Use a context to pass information down the call chain - root, ctx := tracer.StartSpanFromContext(context.Background(), "parent.request", - tracer.ServiceName("web"), - tracer.ResourceName("/tweet/1"), - ) - client.Get(). - Index("twitter").Type("tweet").Index("1"). - DoC(ctx) - root.Finish() -} diff --git a/contrib/os/orchestrion.yml b/contrib/os/orchestrion.yml new file mode 100644 index 0000000000..7b69710118 --- /dev/null +++ b/contrib/os/orchestrion.yml @@ -0,0 +1,59 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/v2/contrib/os + description: |- + Protection from Local File Inclusion (LFI) Attacks + + All known functions that open files are susceptible to Local File Inclusion (LFI) attacks. This aspect protects + against LFI attacks by wrapping the `os.OpenFile` function with a security operation that will block the operation if + it is deemed unsafe. + + Instrumenting only the `os.OpenFile` function is sufficient to protect against LFI attacks, as all other functions in + the `os` package that open files ultimately call `os.OpenFile` (as of Go 1.23). + +aspects: + - id: OpenFile + join-point: + all-of: + - import-path: os + - function-body: + function: + - name: OpenFile + advice: + - prepend-statements: + imports: + ossec: github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/ossec + dyngo: github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo + events: github.com/DataDog/dd-trace-go/v2/appsec/events + template: |- + __dd_parent_op, _ := dyngo.FromContext(nil) + if __dd_parent_op != nil { + __dd_op := &ossec.OpenOperation{ + Operation: dyngo.NewOperation(__dd_parent_op), + } + + var __dd_block bool + dyngo.OnData(__dd_op, func(_ *events.BlockingSecurityEvent) { + __dd_block = true + }) + + dyngo.StartOperation(__dd_op, ossec.OpenOperationArgs{ + Path: {{ .Function.Argument 0 }}, + Flags: {{ .Function.Argument 1 }}, + Perms: {{ .Function.Argument 2 }}, + }) + + defer dyngo.FinishOperation(__dd_op, ossec.OpenOperationRes[*File]{ + File: &{{ .Function.Result 0 }}, + Err: &{{ .Function.Result 1 }}, + }) + + if __dd_block { + return + } + } diff --git a/contrib/os/os.go b/contrib/os/os.go new file mode 100644 index 0000000000..c985ef6284 --- /dev/null +++ b/contrib/os/os.go @@ -0,0 +1,58 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +// Package os provides integrations into the standard library's `os` package, +// allowing protection against Local File Inclusion (LFI) attacks. +package os + +// These imports satisfy injected dependencies for Orchestrion auto instrumentation. +import ( + "context" + "os" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/ossec" +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageOS) +} + +// OpenFile is a [context.Context]-aware version of [os.OpenFile], that allows +// the use of ASM rules to protect against Local File Inclusion (LFI) attacks. +func OpenFile(ctx context.Context, path string, flag int, perm os.FileMode) (file *os.File, err error) { + parent, _ := dyngo.FromContext(ctx) + if parent != nil { + op := &ossec.OpenOperation{ + Operation: dyngo.NewOperation(parent), + } + + var block bool + dyngo.OnData(op, func(*events.BlockingSecurityEvent) { + block = true + }) + + dyngo.StartOperation(op, ossec.OpenOperationArgs{ + Path: path, + Flags: flag, + Perms: perm, + }) + + defer dyngo.FinishOperation(op, ossec.OpenOperationRes[*os.File]{ + File: &file, + Err: &err, + }) + + if block { + return + } + } + + return os.OpenFile(path, flag, perm) +} diff --git a/contrib/os/os_test.go b/contrib/os/os_test.go new file mode 100644 index 0000000000..a8737278e0 --- /dev/null +++ b/contrib/os/os_test.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package os_test + +import ( + "context" + "os" + "testing" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + wrapos "github.com/DataDog/dd-trace-go/v2/contrib/os" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/ossec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + lfi "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/ossec" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestOpenFile(t *testing.T) { + ctx := context.Background() + rootOp := dyngo.NewRootOperation() + feature, err := lfi.NewOSSecFeature( + &config.Config{ + RASP: true, + SupportedAddresses: map[string]struct{}{addresses.ServerIOFSFileAddr: {}}, + }, + rootOp, + ) + require.NoError(t, err) + defer feature.Stop() + + ctx = dyngo.RegisterOperation(ctx, rootOp) + dyngo.On(rootOp, func(op *ossec.OpenOperation, args ossec.OpenOperationArgs) { + // We shall block this request! + dyngo.EmitData(op, &events.BlockingSecurityEvent{}) + + assert.Equal(t, "/etc/passwd", args.Path) + assert.Equal(t, os.O_RDONLY, args.Flags) + assert.Equal(t, os.FileMode(0), args.Perms) + }) + + file, err := wrapos.OpenFile(ctx, "/etc/passwd", os.O_RDONLY, 0) + require.ErrorContains(t, err, "blocked") + require.Nil(t, file) +} diff --git a/contrib/redis/go-redis.v9/example_test.go b/contrib/redis/go-redis.v9/example_test.go index 0b65ab52ae..6b9f4ae21a 100644 --- a/contrib/redis/go-redis.v9/example_test.go +++ b/contrib/redis/go-redis.v9/example_test.go @@ -9,9 +9,9 @@ import ( "context" "time" - redistrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/redis/go-redis.v9" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + redistrace "github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/redis/go-redis/v9" ) @@ -19,6 +19,9 @@ import ( // To start tracing Redis, simply create a new client using the library and continue // using as you normally would. func Example() { + tracer.Start() + defer tracer.Stop() + ctx := context.Background() // create a new Client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} @@ -42,10 +45,13 @@ func Example() { // You can also trace Redis Pipelines. Simply use as usual and the traces will be // automatically picked up by the underlying implementation. func Example_pipeliner() { + tracer.Start() + defer tracer.Stop() + ctx := context.Background() // create a client opts := &redis.Options{Addr: "127.0.0.1", Password: "", DB: 0} - c := redistrace.NewClient(opts, redistrace.WithServiceName("my-redis-service")) + c := redistrace.NewClient(opts, redistrace.WithService("my-redis-service")) // open the pipeline pipe := c.Pipeline() diff --git a/contrib/redis/go-redis.v9/go.mod b/contrib/redis/go-redis.v9/go.mod new file mode 100644 index 0000000000..1279843d3f --- /dev/null +++ b/contrib/redis/go-redis.v9/go.mod @@ -0,0 +1,94 @@ +module github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/redis/go-redis/v9 v9.7.3 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/redis/go-redis.v9/go.sum b/contrib/redis/go-redis.v9/go.sum new file mode 100644 index 0000000000..25cf25af1e --- /dev/null +++ b/contrib/redis/go-redis.v9/go.sum @@ -0,0 +1,317 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/redis/go-redis.v9/option.go b/contrib/redis/go-redis.v9/option.go index b8f5da5da8..eb690a8a0d 100644 --- a/contrib/redis/go-redis.v9/option.go +++ b/contrib/redis/go-redis.v9/option.go @@ -8,12 +8,9 @@ package redis import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "redis.client" - type clientConfig struct { serviceName string spanName string @@ -22,39 +19,43 @@ type clientConfig struct { errCheck func(err error) bool } -// ClientOption represents an option that can be used to create or wrap a client. -type ClientOption func(*clientConfig) +// ClientOption describes options for the Redis integration. +type ClientOption interface { + apply(*clientConfig) +} + +// ClientOptionFn represents options applicable to NewClient and WrapClient. +type ClientOptionFn func(*clientConfig) + +func (fn ClientOptionFn) apply(cfg *clientConfig) { + fn(cfg) +} func defaults(cfg *clientConfig) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.RedisOutbound) - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_REDIS_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) cfg.errCheck = func(error) bool { return true } } // WithSkipRawCommand reports whether to skip setting the "redis.raw_command" tag // on instrumenation spans. This may be useful if the Datadog Agent is not // set up to obfuscate this value and it could contain sensitive information. -func WithSkipRawCommand(skip bool) ClientOption { +func WithSkipRawCommand(skip bool) ClientOptionFn { return func(cfg *clientConfig) { cfg.skipRaw = skip } } -// WithServiceName sets the given service name for the client. -func WithServiceName(name string) ClientOption { +// WithService sets the given service name for the client. +func WithService(name string) ClientOptionFn { return func(cfg *clientConfig) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) ClientOption { +func WithAnalytics(on bool) ClientOptionFn { return func(cfg *clientConfig) { if on { cfg.analyticsRate = 1.0 @@ -66,7 +67,7 @@ func WithAnalytics(on bool) ClientOption { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) ClientOption { +func WithAnalyticsRate(rate float64) ClientOptionFn { return func(cfg *clientConfig) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -78,7 +79,7 @@ func WithAnalyticsRate(rate float64) ClientOption { // WithErrorCheck specifies a function fn which determines whether the passed // error should be marked as an error. -func WithErrorCheck(fn func(err error) bool) ClientOption { +func WithErrorCheck(fn func(err error) bool) ClientOptionFn { return func(cfg *clientConfig) { cfg.errCheck = fn } diff --git a/contrib/redis/go-redis.v9/orchestrion.yml b/contrib/redis/go-redis.v9/orchestrion.yml new file mode 100644 index 0000000000..6caaca51c0 --- /dev/null +++ b/contrib/redis/go-redis.v9/orchestrion.yml @@ -0,0 +1,27 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 + description: Redis client for Go. + +aspects: + - id: NewClient + join-point: + one-of: + - function-call: github.com/redis/go-redis/v9.NewClient + - function-call: github.com/redis/go-redis/v9.NewFailoverClient + advice: + - wrap-expression: + imports: + redis: github.com/redis/go-redis/v9 + trace: github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 + template: |- + func() (client *redis.Client) { + client = {{ . }} + trace.WrapClient(client) + return + }() diff --git a/contrib/redis/go-redis.v9/redis.go b/contrib/redis/go-redis.v9/redis.go index 97a4fa6b10..a775f4bdc3 100644 --- a/contrib/redis/go-redis.v9/redis.go +++ b/contrib/redis/go-redis.v9/redis.go @@ -14,19 +14,17 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/redis/go-redis/v9" ) -const componentName = "redis/go-redis.v9" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/redis/go-redis/v9") + instr = instrumentation.Load(instrumentation.PackageRedisGoRedisV9) } type datadogHook struct { @@ -36,7 +34,7 @@ type datadogHook struct { // params holds the tracer and a set of parameters which are recorded with every trace. type params struct { config *clientConfig - additionalTags []ddtrace.StartSpanOption + additionalTags []tracer.StartSpanOption } // NewClient returns a new Client that is traced with the default tracer under @@ -53,7 +51,7 @@ func WrapClient(client redis.UniversalClient, opts ...ClientOption) { cfg := new(clientConfig) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } hookParams := ¶ms{ @@ -72,13 +70,13 @@ type clusterOptions interface { Options() *redis.ClusterOptions } -func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOption { - additionalTags := []ddtrace.StartSpanOption{} +func additionalTagOptions(client redis.UniversalClient) []tracer.StartSpanOption { + additionalTags := []tracer.StartSpanOption{} if clientOptions, ok := client.(clientOptions); ok { opt := clientOptions.Options() if opt.Addr == "FailoverClient" { - additionalTags = []ddtrace.StartSpanOption{ - tracer.Tag("out.db", strconv.Itoa(opt.DB)), + additionalTags = []tracer.StartSpanOption{ + tracer.Tag(ext.TargetDB, strconv.Itoa(opt.DB)), } } else { host, port, err := net.SplitHostPort(opt.Addr) @@ -86,10 +84,10 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio host = opt.Addr port = "6379" } - additionalTags = []ddtrace.StartSpanOption{ + additionalTags = []tracer.StartSpanOption{ tracer.Tag(ext.TargetHost, host), tracer.Tag(ext.TargetPort, port), - tracer.Tag("out.db", strconv.Itoa(opt.DB)), + tracer.Tag(ext.TargetDB, strconv.Itoa(opt.DB)), } } } else if clientOptions, ok := client.(clusterOptions); ok { @@ -97,13 +95,13 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio for _, addr := range clientOptions.Options().Addrs { addrs = append(addrs, addr) } - additionalTags = []ddtrace.StartSpanOption{ + additionalTags = []tracer.StartSpanOption{ tracer.Tag("addrs", strings.Join(addrs, ", ")), } } additionalTags = append(additionalTags, tracer.SpanType(ext.SpanTypeRedis), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageRedisGoRedisV9), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(ext.DBSystem, ext.DBSystemRedis), ) @@ -113,7 +111,7 @@ func additionalTagOptions(client redis.UniversalClient) []ddtrace.StartSpanOptio func (ddh *datadogHook) DialHook(hook redis.DialHook) redis.DialHook { return func(ctx context.Context, network, addr string) (net.Conn, error) { p := ddh.params - startOpts := make([]ddtrace.StartSpanOption, 0, 1+len(ddh.additionalTags)+1) // serviceName + ddh.additionalTags + analyticsRate + startOpts := make([]tracer.StartSpanOption, 0, 1+len(ddh.additionalTags)+1) // serviceName + ddh.additionalTags + analyticsRate startOpts = append(startOpts, tracer.ServiceName(p.config.serviceName)) startOpts = append(startOpts, ddh.additionalTags...) if !math.IsNaN(p.config.analyticsRate) { @@ -123,7 +121,7 @@ func (ddh *datadogHook) DialHook(hook redis.DialHook) redis.DialHook { conn, err := hook(ctx, network, addr) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption if err != nil { finishOpts = append(finishOpts, tracer.WithError(err)) } @@ -137,7 +135,7 @@ func (ddh *datadogHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook { raw := cmd.String() length := strings.Count(raw, " ") p := ddh.params - startOpts := make([]ddtrace.StartSpanOption, 0, 3+1+len(ddh.additionalTags)+1) // 3 options below + redis.raw_command + ddh.additionalTags + analyticsRate + startOpts := make([]tracer.StartSpanOption, 0, 3+1+len(ddh.additionalTags)+1) // 3 options below + redis.raw_command + ddh.additionalTags + analyticsRate startOpts = append(startOpts, tracer.ServiceName(p.config.serviceName), tracer.ResourceName(raw[:strings.IndexByte(raw, ' ')]), @@ -154,7 +152,7 @@ func (ddh *datadogHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook { err := hook(ctx, cmd) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption if err != nil && err != redis.Nil && ddh.config.errCheck(err) { finishOpts = append(finishOpts, tracer.WithError(err)) } @@ -166,7 +164,7 @@ func (ddh *datadogHook) ProcessHook(hook redis.ProcessHook) redis.ProcessHook { func (ddh *datadogHook) ProcessPipelineHook(hook redis.ProcessPipelineHook) redis.ProcessPipelineHook { return func(ctx context.Context, cmds []redis.Cmder) error { p := ddh.params - startOpts := make([]ddtrace.StartSpanOption, 0, 3+1+len(ddh.additionalTags)+1) // 3 options below + redis.raw_command + ddh.additionalTags + analyticsRate + startOpts := make([]tracer.StartSpanOption, 0, 3+1+len(ddh.additionalTags)+1) // 3 options below + redis.raw_command + ddh.additionalTags + analyticsRate startOpts = append(startOpts, tracer.ServiceName(p.config.serviceName), tracer.ResourceName("redis.pipeline"), @@ -184,7 +182,7 @@ func (ddh *datadogHook) ProcessPipelineHook(hook redis.ProcessPipelineHook) redi err := hook(ctx, cmds) - var finishOpts []ddtrace.FinishOption + var finishOpts []tracer.FinishOption if err != nil && err != redis.Nil && ddh.config.errCheck(err) { finishOpts = append(finishOpts, tracer.WithError(err)) } diff --git a/contrib/redis/go-redis.v9/redis_test.go b/contrib/redis/go-redis.v9/redis_test.go index 5df40ed7af..226ef01b8c 100644 --- a/contrib/redis/go-redis.v9/redis_test.go +++ b/contrib/redis/go-redis.v9/redis_test.go @@ -13,12 +13,11 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/redis/go-redis/v9" "github.com/stretchr/testify/assert" @@ -40,7 +39,7 @@ func TestMain(m *testing.M) { } func TestSkipRaw(t *testing.T) { - runCmds := func(t *testing.T, opts ...ClientOption) []mocktracer.Span { + runCmds := func(t *testing.T, opts ...ClientOption) []*mocktracer.Span { mt := mocktracer.Start() defer mt.Stop() ctx := context.Background() @@ -51,7 +50,7 @@ func TestSkipRaw(t *testing.T) { pipeline.Exec(ctx) spans := mt.FinishedSpans() assert.Len(t, spans, 3) // dial + set + redis.pipeline - var setSpan, expireSpan mocktracer.Span + var setSpan, expireSpan *mocktracer.Span for _, s := range spans { // pick up the spans except dial switch s.Tag(ext.ResourceName) { @@ -63,7 +62,7 @@ func TestSkipRaw(t *testing.T) { } assert.NotNil(t, setSpan) assert.NotNil(t, expireSpan) - return []mocktracer.Span{setSpan, expireSpan} + return []*mocktracer.Span{setSpan, expireSpan} } t.Run("true", func(t *testing.T) { @@ -103,7 +102,7 @@ func TestClientEvalSha(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) sha1 := client.ScriptLoad(ctx, "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}").Val() mt.Reset() @@ -121,6 +120,7 @@ func TestClientEvalSha(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("evalsha", span.Tag(ext.ResourceName)) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -132,12 +132,12 @@ func TestClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set(ctx, "test_key", "test_value", 0) spans := mt.FinishedSpans() assert.Len(spans, 2) // dial + command - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the redis.command span except dial if s.OperationName() == "redis.command" { @@ -152,6 +152,7 @@ func TestClient(t *testing.T) { assert.Equal("set test_key test_value: ", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -200,7 +201,7 @@ func TestWrapClient(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - WrapClient(tc.client, WithServiceName("my-redis")) + WrapClient(tc.client, WithService("my-redis")) tc.client.Set(ctx, "test_key", "test_value", 0) spans := mt.FinishedSpans() @@ -210,7 +211,7 @@ func TestWrapClient(t *testing.T) { assert.Len(spans, 2) } - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the redis.command span except dial if s.OperationName() == "redis.command" { @@ -223,6 +224,7 @@ func TestWrapClient(t *testing.T) { assert.Equal("set test_key test_value: ", span.Tag("redis.raw_command")) assert.Equal("3", span.Tag("redis.args_length")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -233,9 +235,9 @@ func TestAdditionalTagsFromClient(t *testing.T) { t.Run("simple-client", func(t *testing.T) { simpleClientOpts := &redis.UniversalOptions{Addrs: []string{"127.0.0.1:6379"}} simpleClient := redis.NewUniversalClient(simpleClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ - "component": "redis/go-redis.v9", + "component": instrumentation.PackageRedisGoRedisV9, "db.system": "redis", "out.db": "0", "out.host": "127.0.0.1", @@ -259,10 +261,10 @@ func TestAdditionalTagsFromClient(t *testing.T) { "127.0.0.2:6379", }} failoverClient := redis.NewUniversalClient(failoverClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "out.db": "0", - "component": "redis/go-redis.v9", + "component": instrumentation.PackageRedisGoRedisV9, "db.system": "redis", "span.kind": "client", "span.type": "redis", @@ -283,10 +285,10 @@ func TestAdditionalTagsFromClient(t *testing.T) { }, DialTimeout: 1} clusterClient := redis.NewUniversalClient(clusterClientOpts) - config := &ddtrace.StartSpanConfig{} + config := &tracer.StartSpanConfig{} expectedTags := map[string]interface{}{ "addrs": "127.0.0.1:6379, 127.0.0.2:6379", - "component": "redis/go-redis.v9", + "component": instrumentation.PackageRedisGoRedisV9, "db.system": "redis", "span.kind": "client", "span.type": "redis", @@ -308,7 +310,7 @@ func TestPipeline(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) pipeline := client.Pipeline() pipeline.Expire(ctx, "pipeline_counter", time.Hour) @@ -316,7 +318,7 @@ func TestPipeline(t *testing.T) { pipeline.Exec(ctx) spans := mt.FinishedSpans() - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the redis.command span except dial if s.OperationName() == "redis.command" { @@ -332,6 +334,7 @@ func TestPipeline(t *testing.T) { assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("1", span.Tag("redis.pipeline_length")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) @@ -352,6 +355,7 @@ func TestPipeline(t *testing.T) { assert.Equal("redis.pipeline", span.Tag(ext.ResourceName)) assert.Equal("2", span.Tag("redis.pipeline_length")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) } @@ -364,7 +368,7 @@ func TestChildSpan(t *testing.T) { defer mt.Stop() // Parent span - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) root, ctx := tracer.StartSpanFromContext(ctx, "parent.span") client.Set(ctx, "test_key", "test_value", 0) @@ -372,7 +376,7 @@ func TestChildSpan(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 3) // child + parent + dial - var child, parent, dial mocktracer.Span + var child, parent, dial *mocktracer.Span for _, s := range spans { // order of traces in buffer is not guaranteed switch s.OperationName() { @@ -401,7 +405,7 @@ func TestMultipleCommands(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Set(ctx, "test_key", "test_value", 0) client.Get(ctx, "test_key") client.Incr(ctx, "int_key") @@ -431,12 +435,12 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get(ctx, "key").Result() spans := mt.FinishedSpans() assert.Len(spans, 1+opts.MaxRetries+1) // 1 dial + dial MaxRetries + redis.command - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the redis.command span except dial if s.OperationName() == "redis.command" { @@ -445,11 +449,12 @@ func TestError(t *testing.T) { } assert.Equal("redis.command", span.OperationName()) assert.NotNil(err) - assert.Equal(err, span.Tag(ext.Error)) + assert.Equal(err.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6378", span.Tag(ext.TargetPort)) assert.Equal("get key: ", span.Tag("redis.raw_command")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -461,11 +466,11 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) _, err := client.Get(ctx, "non_existent_key").Result() spans := mt.FinishedSpans() - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the redis.command span except dial if s.OperationName() == "redis.command" { @@ -474,11 +479,12 @@ func TestError(t *testing.T) { } assert.Equal(redis.Nil, err) assert.Equal("redis.command", span.OperationName()) - assert.Empty(span.Tag(ext.Error)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get non_existent_key: ", span.Tag("redis.raw_command")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -490,7 +496,7 @@ func TestError(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) pipeline := client.Pipeline() pipeline.Get(ctx, "key") @@ -499,7 +505,7 @@ func TestError(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 1+opts.MaxRetries+1) // 1 dial + dial MaxRetries + redis.pipeline - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the redis.command span except dial if s.OperationName() == "redis.command" { @@ -508,7 +514,7 @@ func TestError(t *testing.T) { } assert.Equal("redis.command", span.OperationName()) assert.NotNil(err) - assert.Equal(err, span.Tag(ext.Error)) + assert.Equal(err.Error(), span.Tag(ext.ErrorMsg)) assert.Equal(ext.SpanTypeRedis, span.Tag(ext.SpanType)) assert.Equal("my-redis", span.Tag(ext.ServiceName)) assert.Equal("redis.pipeline", span.Tag(ext.ResourceName)) @@ -516,6 +522,7 @@ func TestError(t *testing.T) { assert.Equal("6378", span.Tag(ext.TargetPort)) assert.Equal("1", span.Tag("redis.pipeline_length")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -532,7 +539,7 @@ func TestError(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) cancel() - client := NewClient(opts, WithServiceName("my-redis"), WithErrorCheck(errCheckFn)) + client := NewClient(opts, WithService("my-redis"), WithErrorCheck(errCheckFn)) _, err := client.Get(ctx, "test_key").Result() spans := mt.FinishedSpans() @@ -540,12 +547,13 @@ func TestError(t *testing.T) { span := spans[0] assert.Equal(context.Canceled, err) - assert.Empty(span.Tag(ext.Error)) + assert.Zero(span.Tag(ext.ErrorMsg)) assert.Equal("redis.command", span.OperationName()) assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("get test_key: ", span.Tag("redis.raw_command")) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) }) @@ -578,9 +586,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -603,9 +609,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) @@ -626,11 +630,11 @@ func TestWithContext(t *testing.T) { ctx1 := context.Background() ctx2 := context.Background() - client1 := NewClient(opts, WithServiceName("my-redis")) + client1 := NewClient(opts, WithService("my-redis")) s1, ctx1 := tracer.StartSpanFromContext(ctx1, "span1.name") s2, ctx2 := tracer.StartSpanFromContext(ctx2, "span2.name") - client2 := NewClient(opts, WithServiceName("my-redis")) + client2 := NewClient(opts, WithService("my-redis")) client1.Set(ctx1, "test_key", "test_value", 0) client2.Get(ctx2, "test_key") s1.Finish() @@ -638,7 +642,7 @@ func TestWithContext(t *testing.T) { spans := mt.FinishedSpans() assert.Len(spans, 6) // 2 dial spans + span1, span2, setSpan, getSpan - var span1, span2, setSpan, getSpan mocktracer.Span + var span1, span2, setSpan, getSpan *mocktracer.Span for _, s := range spans { switch s.Tag(ext.ResourceName) { case "span1.name": @@ -667,12 +671,12 @@ func TestDial(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - client := NewClient(opts, WithServiceName("my-redis")) + client := NewClient(opts, WithService("my-redis")) client.Ping(ctx) spans := mt.FinishedSpans() assert.Len(spans, 2) // dial + ping - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { // pick up the dial span if s.OperationName() == "redis.dial" { @@ -685,34 +689,7 @@ func TestDial(t *testing.T) { assert.Equal("127.0.0.1", span.Tag(ext.TargetHost)) assert.Equal("6379", span.Tag(ext.TargetPort)) assert.Equal("redis/go-redis.v9", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageRedisGoRedisV9), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("redis", span.Tag(ext.DBSystem)) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []ClientOption - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - client := NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) - st := client.Set(context.Background(), "test_key", "test_value", 0) - require.NoError(t, st.Err()) - - spans := mt.FinishedSpans() - var span mocktracer.Span - for _, s := range spans { - // pick up the redis.command span except dial - if s.OperationName() == "redis.command" { - span = s - } - } - assert.NotNil(t, span) - return []mocktracer.Span{span} - }) - - namingschematest.NewRedisTest(genSpans, "redis.client")(t) -} diff --git a/contrib/redis/rueidis/example_test.go b/contrib/redis/rueidis/example_test.go new file mode 100644 index 0000000000..42ba1a20a8 --- /dev/null +++ b/contrib/redis/rueidis/example_test.go @@ -0,0 +1,35 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025-present Datadog, Inc. + +package rueidis_test + +import ( + "context" + "log" + + rueidistrace "github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/redis/rueidis" +) + +// To start tracing Redis, simply create a new client using the library and continue +// using as you normally would. +func Example() { + tracer.Start() + defer tracer.Stop() + + c, err := rueidistrace.NewClient(rueidis.ClientOption{ + InitAddress: []string{"localhost:6379"}, + }) + if err != nil { + log.Fatal(err) + return + } + + if err := c.Do(context.Background(), c.B().Set().Key("key").Value("value").Build()).Error(); err != nil { + log.Fatal(err) + return + } +} diff --git a/contrib/redis/rueidis/go.mod b/contrib/redis/rueidis/go.mod new file mode 100644 index 0000000000..b0ac898538 --- /dev/null +++ b/contrib/redis/rueidis/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/redis/rueidis v1.0.55 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/redis/rueidis/go.sum b/contrib/redis/rueidis/go.sum new file mode 100644 index 0000000000..1ab0847213 --- /dev/null +++ b/contrib/redis/rueidis/go.sum @@ -0,0 +1,313 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/redis/rueidis v1.0.55 h1:PrRv6eETcanBgYVNdwxn6RyUaPfxN6H+b5jUA4mfpkw= +github.com/redis/rueidis v1.0.55/go.mod h1:cr7ILwt1AqyMRfjWlA9Orubj6gp1xzn1DPyhmrhv/x0= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/redis/rueidis/option.go b/contrib/redis/rueidis/option.go new file mode 100644 index 0000000000..01de0d5d7d --- /dev/null +++ b/contrib/redis/rueidis/option.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025-present Datadog, Inc. + +package rueidis + +import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" + "github.com/redis/rueidis" +) + +type config struct { + rawCommand bool + serviceName string + errCheck func(err error) bool +} + +// Option represents an option that can be used to create or wrap a client. +type Option func(*config) + +func defaultConfig() *config { + return &config{ + rawCommand: options.GetBoolEnv("DD_TRACE_REDIS_RAW_COMMAND", false), + serviceName: instr.ServiceName(instrumentation.ComponentDefault, nil), + errCheck: func(err error) bool { + return err != nil && !rueidis.IsRedisNil(err) + }, + } +} + +// WithRawCommand can be used to set a tag `redis.raw_command` in the created spans (disabled by default). +func WithRawCommand(rawCommand bool) Option { + return func(cfg *config) { + cfg.rawCommand = rawCommand + } +} + +// WithService sets the given service name for the client. +func WithService(name string) Option { + return func(cfg *config) { + cfg.serviceName = name + } +} + +// WithErrorCheck specifies a function fn which determines whether the passed +// error should be marked as an error. +func WithErrorCheck(fn func(err error) bool) Option { + return func(cfg *config) { + cfg.errCheck = fn + } +} diff --git a/contrib/redis/rueidis/orchestrion.yml b/contrib/redis/rueidis/orchestrion.yml new file mode 100644 index 0000000000..ad96493626 --- /dev/null +++ b/contrib/redis/rueidis/orchestrion.yml @@ -0,0 +1,19 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2025-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 + description: A fast Golang Redis client that does auto pipelining and supports server-assisted client-side caching. + +aspects: + - id: NewClient + join-point: + function-call: github.com/redis/rueidis.NewClient + advice: + - wrap-expression: + imports: + rueidistrace: github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 + template: rueidistrace.NewClient({{ index .AST.Args 0 }}) diff --git a/contrib/redis/rueidis/rueidis.go b/contrib/redis/rueidis/rueidis.go new file mode 100644 index 0000000000..3c12258c90 --- /dev/null +++ b/contrib/redis/rueidis/rueidis.go @@ -0,0 +1,282 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025-present Datadog, Inc. + +// Package rueidis provides tracing functions for tracing the redis/rueidis package (https://github.com/redis/rueidis). +package rueidis + +import ( + "context" + "net" + "strconv" + "strings" + "time" + + "github.com/redis/rueidis" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageRedisRueidis) +} + +var ( + _ rueidis.Client = (*client)(nil) + _ rueidis.DedicatedClient = (*dedicatedClient)(nil) +) + +// NewClient returns a new rueidis.Client enhanced with tracing. +func NewClient(clientOption rueidis.ClientOption, opts ...Option) (rueidis.Client, error) { + rueidisClient, err := rueidis.NewClient(clientOption) + if err != nil { + return nil, err + } + cfg := defaultConfig() + for _, fn := range opts { + fn(cfg) + } + tClient := &client{ + client: rueidisClient, + cfg: cfg, + dbIndex: strconv.FormatInt(int64(clientOption.SelectDB), 10), + user: clientOption.Username, + } + if len(clientOption.InitAddress) > 0 { + host, port, err := net.SplitHostPort(clientOption.InitAddress[0]) + if err == nil { + tClient.host = host + tClient.port = port + } + } + return tClient, nil +} + +type client struct { + client rueidis.Client + cfg *config + host string + port string + dbIndex string + user string +} + +type command struct { + statement string + raw string +} + +func (c *client) startSpan(ctx context.Context, cmd command) (*tracer.Span, context.Context) { + opts := []tracer.StartSpanOption{ + tracer.ServiceName(c.cfg.serviceName), + tracer.ResourceName(cmd.statement), + tracer.SpanType(ext.SpanTypeRedis), + tracer.Tag(ext.TargetHost, c.host), + tracer.Tag(ext.TargetPort, c.port), + tracer.Tag(ext.Component, instrumentation.PackageRedisRueidis), + tracer.Tag(ext.SpanKind, ext.SpanKindClient), + tracer.Tag(ext.DBSystem, ext.DBSystemRedis), + tracer.Tag(ext.TargetDB, c.dbIndex), + } + if c.cfg.rawCommand { + opts = append(opts, tracer.Tag(ext.RedisRawCommand, cmd.raw)) + } + if c.host != "" { + opts = append(opts, tracer.Tag(ext.TargetHost, c.host)) + } + if c.port != "" { + opts = append(opts, tracer.Tag(ext.TargetPort, c.port)) + } + if c.user != "" { + opts = append(opts, tracer.Tag(ext.DBUser, c.user)) + } + return tracer.StartSpanFromContext(ctx, "redis.command", opts...) +} + +func (c *client) finishSpan(span *tracer.Span, err error) { + var opts []tracer.FinishOption + if c.cfg.errCheck(err) { + opts = append(opts, tracer.WithError(err)) + } + span.Finish(opts...) +} + +func (c *client) firstError(s []rueidis.RedisResult) error { + for _, result := range s { + if err := result.Error(); c.cfg.errCheck(err) { + return err + } + } + return nil +} + +func (c *client) B() rueidis.Builder { + return c.client.B() +} + +func (c *client) Do(ctx context.Context, cmd rueidis.Completed) rueidis.RedisResult { + span, ctx := c.startSpan(ctx, processCommand(&cmd)) + resp := c.client.Do(ctx, cmd) + setClientCacheTags(span, resp) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) DoMulti(ctx context.Context, multi ...rueidis.Completed) []rueidis.RedisResult { + span, ctx := c.startSpan(ctx, processCommandMulti(multi)) + resp := c.client.DoMulti(ctx, multi...) + c.finishSpan(span, c.firstError(resp)) + return resp +} + +func (c *client) Receive(ctx context.Context, subscribe rueidis.Completed, fn func(msg rueidis.PubSubMessage)) error { + span, ctx := c.startSpan(ctx, processCommand(&subscribe)) + err := c.client.Receive(ctx, subscribe, fn) + c.finishSpan(span, err) + return err +} + +func (c *client) Close() { + c.client.Close() +} + +func (c *client) DoCache(ctx context.Context, cmd rueidis.Cacheable, ttl time.Duration) rueidis.RedisResult { + span, ctx := c.startSpan(ctx, processCommand(&cmd)) + resp := c.client.DoCache(ctx, cmd, ttl) + setClientCacheTags(span, resp) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) DoMultiCache(ctx context.Context, multi ...rueidis.CacheableTTL) []rueidis.RedisResult { + span, ctx := c.startSpan(ctx, processCommandMultiCache(multi)) + resp := c.client.DoMultiCache(ctx, multi...) + c.finishSpan(span, c.firstError(resp)) + return resp +} + +func (c *client) DoStream(ctx context.Context, cmd rueidis.Completed) rueidis.RedisResultStream { + span, ctx := c.startSpan(ctx, processCommand(&cmd)) + resp := c.client.DoStream(ctx, cmd) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) DoMultiStream(ctx context.Context, multi ...rueidis.Completed) rueidis.MultiRedisResultStream { + span, ctx := c.startSpan(ctx, processCommandMulti(multi)) + resp := c.client.DoMultiStream(ctx, multi...) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) Dedicated(fn func(rueidis.DedicatedClient) error) (err error) { + return c.client.Dedicated(func(dc rueidis.DedicatedClient) error { + return fn(&dedicatedClient{ + client: c, + dedicatedClient: dc, + }) + }) +} + +func (c *client) Dedicate() (client rueidis.DedicatedClient, cancel func()) { + dedicated, cancel := c.client.Dedicate() + return &dedicatedClient{ + client: c, + dedicatedClient: dedicated, + }, cancel +} + +func (c *client) Nodes() map[string]rueidis.Client { + nodes := c.client.Nodes() + for addr, redisClient := range nodes { + host, port, _ := net.SplitHostPort(addr) + nodes[addr] = &client{ + client: redisClient, + cfg: c.cfg, + host: host, + port: port, + dbIndex: c.dbIndex, + user: c.user, + } + } + return nodes +} + +func (c *client) Mode() rueidis.ClientMode { + return c.client.Mode() +} + +type dedicatedClient struct { + *client + dedicatedClient rueidis.DedicatedClient +} + +func (c *dedicatedClient) SetPubSubHooks(hooks rueidis.PubSubHooks) <-chan error { + return c.dedicatedClient.SetPubSubHooks(hooks) +} + +type commander interface { + Commands() []string +} + +func processCommand(cmd commander) command { + cmds := cmd.Commands() + if len(cmds) == 0 { + return command{} + } + statement := cmds[0] + raw := strings.Join(cmds, " ") + return command{ + statement: statement, + raw: raw, + } +} + +func processCommandMulti(multi []rueidis.Completed) command { + var cmds []command + for _, cmd := range multi { + cmds = append(cmds, processCommand(&cmd)) + } + return multiCommand(cmds) +} + +func processCommandMultiCache(multi []rueidis.CacheableTTL) command { + var cmds []command + for _, cmd := range multi { + cmds = append(cmds, processCommand(&cmd.Cmd)) + } + return multiCommand(cmds) +} + +func multiCommand(cmds []command) command { + // limit to the 5 first + if len(cmds) > 5 { + cmds = cmds[:5] + } + statement := strings.Builder{} + raw := strings.Builder{} + for i, cmd := range cmds { + statement.WriteString(cmd.statement) + raw.WriteString(cmd.raw) + if i != len(cmds)-1 { + statement.WriteString(" ") + raw.WriteString(" ") + } + } + return command{ + statement: statement.String(), + raw: raw.String(), + } +} + +func setClientCacheTags(s *tracer.Span, result rueidis.RedisResult) { + s.SetTag(ext.RedisClientCacheHit, result.IsCacheHit()) + s.SetTag(ext.RedisClientCacheTTL, result.CacheTTL()) + s.SetTag(ext.RedisClientCachePTTL, result.CachePTTL()) + s.SetTag(ext.RedisClientCachePXAT, result.CachePXAT()) +} diff --git a/contrib/redis/rueidis/rueidis_test.go b/contrib/redis/rueidis/rueidis_test.go new file mode 100644 index 0000000000..bfd07d6f19 --- /dev/null +++ b/contrib/redis/rueidis/rueidis_test.go @@ -0,0 +1,389 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025-present Datadog, Inc. +package rueidis + +import ( + "context" + "errors" + "fmt" + "os" + "testing" + "time" + + "github.com/redis/rueidis" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" +) + +var ( + redisAddrs = []string{fmt.Sprintf("127.0.0.1:%d", 6379)} +) + +func TestMain(m *testing.M) { + _, ok := os.LookupEnv("INTEGRATION") + if !ok { + fmt.Println("--- SKIP: to enable integration test, set the INTEGRATION environment variable") + os.Exit(0) + } + os.Exit(m.Run()) +} + +func TestNewClient(t *testing.T) { + testutils.SetGlobalServiceName(t, "global-service") + + tests := []struct { + name string + opts []Option + runTest func(*testing.T, context.Context, rueidis.Client) + assertSpans func(*testing.T, []*mocktracer.Span) + wantServiceName string + }{ + { + name: "Test SET command with raw command", + opts: []Option{ + WithRawCommand(true), + WithService("test-service"), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + assert.NoError(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET test_key test_value", span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "test-service", + }, + { + name: "Test SET command without raw command", + opts: nil, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + require.NoError(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Nil(t, span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SET GET multi command", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + resp := client.DoMulti(ctx, client.B().Set().Key("test_key").Value("test_value").Build(), client.B().Get().Key("test_key").Build()) + require.Len(t, resp, 2) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET test_key test_value GET test_key", span.Tag(ext.RedisRawCommand)) + assert.Nil(t, span.Tag(ext.RedisClientCacheHit)) + assert.Nil(t, span.Tag(ext.RedisClientCacheTTL)) + assert.Nil(t, span.Tag(ext.RedisClientCachePXAT)) + assert.Nil(t, span.Tag(ext.RedisClientCachePTTL)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test HMGET command", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + assert.NoError(t, client.DoCache(ctx, client.B().Hmget().Key("mk").Field("1", "2").Cache(), time.Minute).Error()) + resp, err := client.DoCache(ctx, client.B().Hmget().Key("mk").Field("1", "2").Cache(), time.Minute).ToArray() + require.Len(t, resp, 2) + require.NoError(t, err) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + + span := spans[0] + assert.Equal(t, "HMGET", span.Tag(ext.ResourceName)) + assert.Equal(t, "HMGET mk 1 2", span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + + span = spans[1] + assert.Equal(t, "HMGET", span.Tag(ext.ResourceName)) + assert.Equal(t, "HMGET mk 1 2", span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test GET stream command", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + resp := client.DoStream(ctx, client.B().Get().Key("test_key").Build()) + require.NoError(t, resp.Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "GET test_key", span.Tag(ext.RedisRawCommand)) + assert.Nil(t, span.Tag(ext.RedisClientCacheHit)) + assert.Nil(t, span.Tag(ext.RedisClientCacheTTL)) + assert.Nil(t, span.Tag(ext.RedisClientCachePXAT)) + assert.Nil(t, span.Tag(ext.RedisClientCachePTTL)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test multi command should be limited to 5", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(_ *testing.T, ctx context.Context, client rueidis.Client) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, time.Nanosecond) + client.DoMulti( + ctxWithTimeout, + client.B().Set().Key("k1").Value("v1").Build(), + client.B().Get().Key("k1").Build(), + client.B().Set().Key("k2").Value("v2").Build(), + client.B().Get().Key("k2").Build(), + client.B().Set().Key("k3").Value("v3").Build(), + client.B().Get().Key("k3").Build(), + ) + cancel() + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET GET SET GET SET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET k1 v1 GET k1 SET k2 v2 GET k2 SET k3 v3", span.Tag(ext.RedisRawCommand)) + assert.Nil(t, span.Tag(ext.RedisClientCacheHit)) + assert.Nil(t, span.Tag(ext.RedisClientCacheTTL)) + assert.Nil(t, span.Tag(ext.RedisClientCachePXAT)) + assert.Nil(t, span.Tag(ext.RedisClientCachePTTL)) + assert.Equal(t, context.DeadlineExceeded.Error(), span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SUBSCRIBE command with timeout", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, time.Millisecond) + require.EqualError(t, + context.DeadlineExceeded, + client.Receive(ctxWithTimeout, client.B().Subscribe().Channel("test_channel").Build(), func(_ rueidis.PubSubMessage) {}).Error(), + ) + cancel() + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SUBSCRIBE", span.Tag(ext.ResourceName)) + assert.Equal(t, "SUBSCRIBE test_channel", span.Tag(ext.RedisRawCommand)) + assert.Nil(t, span.Tag(ext.RedisClientCacheHit)) + assert.Nil(t, span.Tag(ext.RedisClientCacheTTL)) + assert.Nil(t, span.Tag(ext.RedisClientCachePXAT)) + assert.Nil(t, span.Tag(ext.RedisClientCachePTTL)) + assert.Equal(t, context.DeadlineExceeded.Error(), span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test Dedicated client", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + err := client.Dedicated(func(d rueidis.DedicatedClient) error { + return d.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error() + }) + require.NoError(t, err) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET test_key test_value", span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SET command with canceled context and custom error check", + opts: []Option{ + WithErrorCheck(func(err error) bool { + return err != nil && !rueidis.IsRedisNil(err) && !errors.Is(err, context.Canceled) + }), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + ctx, cancel := context.WithCancel(ctx) + cancel() + require.Error(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Nil(t, span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test redis nil not attached to span", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + require.Error(t, client.Do(ctx, client.B().Get().Key("404").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "GET 404", span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SET command with canceled context and custom error check", + opts: []Option{ + WithErrorCheck(func(err error) bool { + return err != nil && !rueidis.IsRedisNil(err) && !errors.Is(err, context.Canceled) + }), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + ctx, cancel := context.WithCancel(ctx) + cancel() + require.Error(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Nil(t, span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test redis nil not attached to span", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client rueidis.Client) { + require.Error(t, client.Do(ctx, client.B().Get().Key("404").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "GET 404", span.Tag(ext.RedisRawCommand)) + assert.Equal(t, "false", span.Tag(ext.RedisClientCacheHit)) + assert.Less(t, span.Tag(ext.RedisClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.RedisClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + rueidisClientOption := rueidis.ClientOption{ + InitAddress: redisAddrs, + DisableCache: true, + } + client, err := NewClient(rueidisClientOption, tt.opts...) + require.NoError(t, err) + + root, ctx := tracer.StartSpanFromContext(context.Background(), "test.root", tracer.ServiceName("test-service")) + tt.runTest(t, ctx, client) + root.Finish() // test.root exists in the last span. + + spans := mt.FinishedSpans() + tt.assertSpans(t, spans[:len(spans)-1]) + + for _, span := range spans { + if span.OperationName() == "test.root" { + continue + } + // The following assertions are common to all spans + assert.Equal(t, tt.wantServiceName, span.Tag(ext.ServiceName)) + assert.Equal(t, "127.0.0.1", span.Tag(ext.TargetHost)) + assert.Equal(t, "6379", span.Tag(ext.TargetPort)) + assert.Equal(t, "0", span.Tag(ext.TargetDB)) + assert.Equal(t, "redis.command", span.OperationName()) + assert.Equal(t, "client", span.Tag(ext.SpanKind)) + assert.Equal(t, "redis", span.Tag(ext.SpanType)) + assert.Equal(t, "redis/rueidis", span.Tag(ext.Component)) + assert.Equal(t, "redis", span.Tag(ext.DBSystem)) + } + }) + } + +} diff --git a/contrib/segmentio/kafka.go.v0/example_test.go b/contrib/segmentio/kafka-go/example_test.go similarity index 91% rename from contrib/segmentio/kafka.go.v0/example_test.go rename to contrib/segmentio/kafka-go/example_test.go index 504b5689a4..8c6d49e99e 100644 --- a/contrib/segmentio/kafka.go.v0/example_test.go +++ b/contrib/segmentio/kafka-go/example_test.go @@ -10,8 +10,8 @@ import ( "log" "time" - kafkatrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + kafkatrace "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/segmentio/kafka-go" ) diff --git a/contrib/segmentio/kafka-go/go.mod b/contrib/segmentio/kafka-go/go.mod new file mode 100644 index 0000000000..c767a2b92d --- /dev/null +++ b/contrib/segmentio/kafka-go/go.mod @@ -0,0 +1,94 @@ +module github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/segmentio/kafka-go v0.4.42 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/segmentio/kafka-go/go.sum b/contrib/segmentio/kafka-go/go.sum new file mode 100644 index 0000000000..164799d6e2 --- /dev/null +++ b/contrib/segmentio/kafka-go/go.sum @@ -0,0 +1,338 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= +github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/segmentio/kafka-go/headers.go b/contrib/segmentio/kafka-go/headers.go new file mode 100644 index 0000000000..40557d9d31 --- /dev/null +++ b/contrib/segmentio/kafka-go/headers.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package kafka + +import ( + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + "github.com/segmentio/kafka-go" +) + +// A messageCarrier implements TextMapReader/TextMapWriter for extracting/injecting traces on a kafka.Message +type messageCarrier struct { + msg *kafka.Message +} + +var _ interface { + tracer.TextMapReader + tracer.TextMapWriter +} = (*messageCarrier)(nil) + +// ForeachKey conforms to the TextMapReader interface. +func (c messageCarrier) ForeachKey(handler func(key, val string) error) error { + for _, h := range c.msg.Headers { + err := handler(h.Key, string(h.Value)) + if err != nil { + return err + } + } + return nil +} + +// Set implements TextMapWriter +func (c messageCarrier) Set(key, val string) { + // ensure uniqueness of keys + for i := 0; i < len(c.msg.Headers); i++ { + if string(c.msg.Headers[i].Key) == key { + c.msg.Headers = append(c.msg.Headers[:i], c.msg.Headers[i+1:]...) + i-- + } + } + c.msg.Headers = append(c.msg.Headers, kafka.Header{ + Key: key, + Value: []byte(val), + }) +} + +// ExtractSpanContext retrieves the SpanContext from a kafka.Message +func ExtractSpanContext(msg kafka.Message) (*tracer.SpanContext, error) { + return tracer.Extract(messageCarrier{&msg}) +} diff --git a/contrib/segmentio/kafka.go.v0/internal/tracing/dsm.go b/contrib/segmentio/kafka-go/internal/tracing/dsm.go similarity index 93% rename from contrib/segmentio/kafka.go.v0/internal/tracing/dsm.go rename to contrib/segmentio/kafka-go/internal/tracing/dsm.go index 728308d0ad..705c110322 100644 --- a/contrib/segmentio/kafka.go.v0/internal/tracing/dsm.go +++ b/contrib/segmentio/kafka-go/internal/tracing/dsm.go @@ -8,9 +8,9 @@ package tracing import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func (tr *Tracer) SetConsumeDSMCheckpoint(msg Message) { diff --git a/contrib/segmentio/kafka.go.v0/internal/tracing/message_carrier.go b/contrib/segmentio/kafka-go/internal/tracing/message_carrier.go similarity index 96% rename from contrib/segmentio/kafka.go.v0/internal/tracing/message_carrier.go rename to contrib/segmentio/kafka-go/internal/tracing/message_carrier.go index f06c40fac1..e87f41afd7 100644 --- a/contrib/segmentio/kafka.go.v0/internal/tracing/message_carrier.go +++ b/contrib/segmentio/kafka-go/internal/tracing/message_carrier.go @@ -6,7 +6,7 @@ package tracing import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) // A MessageCarrier implements TextMapReader/TextMapWriter for extracting/injecting traces on a kafka.Message diff --git a/contrib/segmentio/kafka.go.v0/internal/tracing/tracer.go b/contrib/segmentio/kafka-go/internal/tracing/tracer.go similarity index 51% rename from contrib/segmentio/kafka.go.v0/internal/tracing/tracer.go rename to contrib/segmentio/kafka-go/internal/tracing/tracer.go index 21baa893f3..6271ee6f4b 100644 --- a/contrib/segmentio/kafka.go.v0/internal/tracing/tracer.go +++ b/contrib/segmentio/kafka-go/internal/tracing/tracer.go @@ -8,11 +8,14 @@ package tracing import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "kafka" +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageSegmentioKafkaGo) +} type Tracer struct { consumerServiceName string @@ -24,66 +27,72 @@ type Tracer struct { kafkaCfg KafkaConfig } -// An Option customizes the Tracer. -type Option func(tr *Tracer) +// Option describes options for the Kafka integration. +type Option interface { + apply(*Tracer) +} func NewTracer(kafkaCfg KafkaConfig, opts ...Option) *Tracer { tr := &Tracer{ - // analyticsRate: globalConfig.AnalyticsRate(), - analyticsRate: math.NaN(), - kafkaCfg: kafkaCfg, - } - if internal.BoolEnv("DD_TRACE_KAFKA_ANALYTICS_ENABLED", false) { - tr.analyticsRate = 1.0 + consumerServiceName: instr.ServiceName(instrumentation.ComponentConsumer, nil), + producerServiceName: instr.ServiceName(instrumentation.ComponentProducer, nil), + consumerSpanName: instr.OperationName(instrumentation.ComponentConsumer, nil), + producerSpanName: instr.OperationName(instrumentation.ComponentProducer, nil), + analyticsRate: instr.AnalyticsRate(false), + dataStreamsEnabled: instr.DataStreamsEnabled(), + kafkaCfg: kafkaCfg, } - - tr.dataStreamsEnabled = internal.BoolEnv("DD_DATA_STREAMS_ENABLED", false) - - tr.consumerServiceName = namingschema.ServiceName(defaultServiceName) - tr.producerServiceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - tr.consumerSpanName = namingschema.OpName(namingschema.KafkaInbound) - tr.producerSpanName = namingschema.OpName(namingschema.KafkaOutbound) - for _, opt := range opts { - opt(tr) + opt.apply(tr) } return tr } -// WithServiceName sets the Tracer service name to serviceName. -func WithServiceName(serviceName string) Option { - return func(tr *Tracer) { +// OptionFn represents options applicable to NewReader, NewWriter, WrapReader and WrapWriter. +type OptionFn func(*Tracer) + +func (fn OptionFn) apply(cfg *Tracer) { + fn(cfg) +} + +// WithService sets the Tracer service name to serviceName. +func WithService(serviceName string) Option { + return OptionFn(func(tr *Tracer) { tr.consumerServiceName = serviceName tr.producerServiceName = serviceName - } + }) } // WithAnalytics enables Trace Analytics for all started spans. func WithAnalytics(on bool) Option { - return func(tr *Tracer) { + return OptionFn(func(tr *Tracer) { if on { tr.analyticsRate = 1.0 } else { tr.analyticsRate = math.NaN() } - } + }) } // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. func WithAnalyticsRate(rate float64) Option { - return func(tr *Tracer) { + return OptionFn(func(tr *Tracer) { if rate >= 0.0 && rate <= 1.0 { tr.analyticsRate = rate } else { tr.analyticsRate = math.NaN() } - } + }) } // WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ func WithDataStreams() Option { - return func(tr *Tracer) { + return OptionFn(func(tr *Tracer) { tr.dataStreamsEnabled = true - } + }) +} + +func Logger() instrumentation.Logger { + return instr.Logger() } diff --git a/contrib/segmentio/kafka-go/internal/tracing/tracer_test.go b/contrib/segmentio/kafka-go/internal/tracing/tracer_test.go new file mode 100644 index 0000000000..83e1f6b630 --- /dev/null +++ b/contrib/segmentio/kafka-go/internal/tracing/tracer_test.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracing + +import ( + "math" + "testing" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + + "github.com/stretchr/testify/assert" +) + +func TestTracerAnalyticsSettings(t *testing.T) { + t.Run("defaults", func(t *testing.T) { + tr := NewTracer(KafkaConfig{}) + assert.True(t, math.IsNaN(tr.analyticsRate)) + }) + + t.Run("global", func(t *testing.T) { + t.Skip("global flag disabled") + testutils.SetGlobalAnalyticsRate(t, 0.4) + + tr := NewTracer(KafkaConfig{}) + assert.Equal(t, 0.4, tr.analyticsRate) + }) + + t.Run("enabled", func(t *testing.T) { + tr := NewTracer(KafkaConfig{}, WithAnalytics(true)) + assert.Equal(t, 1.0, tr.analyticsRate) + }) + + t.Run("override", func(t *testing.T) { + testutils.SetGlobalAnalyticsRate(t, 0.4) + + tr := NewTracer(KafkaConfig{}, WithAnalyticsRate(0.2)) + assert.Equal(t, 0.2, tr.analyticsRate) + }) + + t.Run("withEnv", func(t *testing.T) { + t.Setenv("DD_DATA_STREAMS_ENABLED", "true") + tr := NewTracer(KafkaConfig{}) + assert.True(t, tr.dataStreamsEnabled) + }) + + t.Run("optionOverridesEnv", func(t *testing.T) { + t.Setenv("DD_DATA_STREAMS_ENABLED", "false") + tr := NewTracer(KafkaConfig{}) + WithDataStreams().apply(tr) + assert.True(t, tr.dataStreamsEnabled) + }) +} diff --git a/contrib/segmentio/kafka.go.v0/internal/tracing/tracing.go b/contrib/segmentio/kafka-go/internal/tracing/tracing.go similarity index 70% rename from contrib/segmentio/kafka.go.v0/internal/tracing/tracing.go rename to contrib/segmentio/kafka-go/internal/tracing/tracing.go index 9b5f7bbb9b..8c84b5ee32 100644 --- a/contrib/segmentio/kafka.go.v0/internal/tracing/tracing.go +++ b/contrib/segmentio/kafka-go/internal/tracing/tracing.go @@ -1,7 +1,7 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2024 Datadog, Inc. +// Copyright 2016 Datadog, Inc. // Package tracing contains tracing logic for the segmentio/kafka-go.v0 instrumentation. // @@ -16,21 +16,13 @@ import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) const componentName = "segmentio/kafka.go.v0" -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/segmentio/kafka-go") -} - -func (tr *Tracer) StartConsumeSpan(ctx context.Context, msg Message) ddtrace.Span { +func (tr *Tracer) StartConsumeSpan(ctx context.Context, msg Message) *tracer.Span { opts := []tracer.StartSpanOption{ tracer.ServiceName(tr.consumerServiceName), tracer.ResourceName("Consume Topic " + msg.GetTopic()), @@ -40,9 +32,12 @@ func (tr *Tracer) StartConsumeSpan(ctx context.Context, msg Message) ddtrace.Spa tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindConsumer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), - tracer.Tag(ext.KafkaBootstrapServers, tr.kafkaCfg.BootstrapServers), + tracer.Tag(ext.MessagingDestinationName, msg.GetTopic()), tracer.Measured(), } + if tr.kafkaCfg.BootstrapServers != "" { + opts = append(opts, tracer.Tag(ext.KafkaBootstrapServers, tr.kafkaCfg.BootstrapServers)) + } if !math.IsNaN(tr.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, tr.analyticsRate)) } @@ -54,24 +49,27 @@ func (tr *Tracer) StartConsumeSpan(ctx context.Context, msg Message) ddtrace.Spa span, _ := tracer.StartSpanFromContext(ctx, tr.consumerSpanName, opts...) // reinject the span context so consumers can pick it up if err := tracer.Inject(span.Context(), carrier); err != nil { - log.Debug("contrib/segmentio/kafka.go.v0: Failed to inject span context into carrier in reader, %v", err) + instr.Logger().Debug("contrib/segmentio/kafka-go: Failed to inject span context into carrier in reader, %s", err.Error()) } return span } -func (tr *Tracer) StartProduceSpan(ctx context.Context, writer Writer, msg Message, spanOpts ...tracer.StartSpanOption) ddtrace.Span { +func (tr *Tracer) StartProduceSpan(ctx context.Context, writer Writer, msg Message, spanOpts ...tracer.StartSpanOption) *tracer.Span { + topic := writer.GetTopic() + if topic == "" { + topic = msg.GetTopic() + } opts := []tracer.StartSpanOption{ tracer.ServiceName(tr.producerServiceName), + tracer.ResourceName("Produce Topic " + topic), tracer.SpanType(ext.SpanTypeMessageProducer), tracer.Tag(ext.Component, componentName), tracer.Tag(ext.SpanKind, ext.SpanKindProducer), tracer.Tag(ext.MessagingSystem, ext.MessagingSystemKafka), - tracer.Tag(ext.KafkaBootstrapServers, tr.kafkaCfg.BootstrapServers), + tracer.Tag(ext.MessagingDestinationName, topic), } - if writer.GetTopic() != "" { - opts = append(opts, tracer.ResourceName("Produce Topic "+writer.GetTopic())) - } else { - opts = append(opts, tracer.ResourceName("Produce Topic "+msg.GetTopic())) + if tr.kafkaCfg.BootstrapServers != "" { + opts = append(opts, tracer.Tag(ext.KafkaBootstrapServers, tr.kafkaCfg.BootstrapServers)) } if !math.IsNaN(tr.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, tr.analyticsRate)) @@ -80,12 +78,12 @@ func (tr *Tracer) StartProduceSpan(ctx context.Context, writer Writer, msg Messa carrier := NewMessageCarrier(msg) span, _ := tracer.StartSpanFromContext(ctx, tr.producerSpanName, opts...) if err := tracer.Inject(span.Context(), carrier); err != nil { - log.Debug("contrib/segmentio/kafka.go.v0: Failed to inject span context into carrier in writer, %v", err) + instr.Logger().Debug("contrib/segmentio/kafka-go: Failed to inject span context into carrier in writer, %s", err.Error()) } return span } -func (*Tracer) FinishProduceSpan(span ddtrace.Span, partition int, offset int64, err error) { +func (*Tracer) FinishProduceSpan(span *tracer.Span, partition int, offset int64, err error) { span.SetTag(ext.MessagingKafkaPartition, partition) span.SetTag("offset", offset) span.Finish(tracer.WithError(err)) diff --git a/contrib/segmentio/kafka.go.v0/internal/tracing/types.go b/contrib/segmentio/kafka-go/internal/tracing/types.go similarity index 100% rename from contrib/segmentio/kafka.go.v0/internal/tracing/types.go rename to contrib/segmentio/kafka-go/internal/tracing/types.go diff --git a/contrib/segmentio/kafka.go.v0/kafka.go b/contrib/segmentio/kafka-go/kafka.go similarity index 68% rename from contrib/segmentio/kafka.go.v0/kafka.go rename to contrib/segmentio/kafka-go/kafka.go index 93af2643af..bdc7e7193c 100644 --- a/contrib/segmentio/kafka.go.v0/kafka.go +++ b/contrib/segmentio/kafka-go/kafka.go @@ -3,25 +3,24 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package kafka // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0" +package kafka // import "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2" import ( "context" "strings" - "github.com/segmentio/kafka-go" + "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + _ "github.com/DataDog/dd-trace-go/v2/instrumentation" // Blank import to pass TestIntegrationEnabled test - "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/segmentio/kafka-go" ) // A Reader wraps a kafka.Reader. type Reader struct { *kafka.Reader - tracer *tracing.Tracer - kafkaCfg *tracing.KafkaConfig - prev ddtrace.Span + tracer *tracing.Tracer + prev *tracer.Span } // NewReader calls kafka.NewReader and wraps the resulting Consumer. @@ -34,15 +33,15 @@ func WrapReader(c *kafka.Reader, opts ...Option) *Reader { wrapped := &Reader{ Reader: c, } - kafkaCfg := tracing.KafkaConfig{} + cfg := tracing.KafkaConfig{} if c.Config().Brokers != nil { - kafkaCfg.BootstrapServers = strings.Join(c.Config().Brokers, ",") + cfg.BootstrapServers = strings.Join(c.Config().Brokers, ",") } if c.Config().GroupID != "" { - kafkaCfg.ConsumerGroupID = c.Config().GroupID + cfg.ConsumerGroupID = c.Config().GroupID } - wrapped.tracer = tracing.NewTracer(kafkaCfg, opts...) - log.Debug("contrib/segmentio/kafka-go.v0/kafka: Wrapping Reader: %#v", wrapped.tracer) + wrapped.tracer = tracing.NewTracer(cfg, opts...) + tracing.Logger().Debug("contrib/segmentio/kafka-go/kafka: Wrapping Reader: %#v", wrapped.tracer) return wrapped } @@ -90,35 +89,35 @@ func (r *Reader) FetchMessage(ctx context.Context) (kafka.Message, error) { } // Writer wraps a kafka.Writer with tracing config data -type Writer struct { +type KafkaWriter struct { *kafka.Writer tracer *tracing.Tracer } // NewWriter calls kafka.NewWriter and wraps the resulting Producer. -func NewWriter(conf kafka.WriterConfig, opts ...Option) *Writer { +func NewWriter(conf kafka.WriterConfig, opts ...Option) *KafkaWriter { return WrapWriter(kafka.NewWriter(conf), opts...) } // WrapWriter wraps a kafka.Writer so requests are traced. -func WrapWriter(w *kafka.Writer, opts ...Option) *Writer { - writer := &Writer{ +func WrapWriter(w *kafka.Writer, opts ...Option) *KafkaWriter { + writer := &KafkaWriter{ Writer: w, } - kafkaCfg := tracing.KafkaConfig{} + cfg := tracing.KafkaConfig{} if w.Addr.String() != "" { - kafkaCfg.BootstrapServers = w.Addr.String() + cfg.BootstrapServers = w.Addr.String() } - writer.tracer = tracing.NewTracer(kafkaCfg, opts...) - log.Debug("contrib/segmentio/kafka.go.v0: Wrapping Writer: %#v", writer.tracer) + writer.tracer = tracing.NewTracer(cfg, opts...) + tracing.Logger().Debug("contrib/segmentio/kafka-go: Wrapping Writer: %#v", writer.tracer) return writer } -// WriteMessages calls kafka.go.v0.Writer.WriteMessages and traces the requests. -func (w *Writer) WriteMessages(ctx context.Context, msgs ...kafka.Message) error { +// WriteMessages calls kafka-go.Writer.WriteMessages and traces the requests. +func (w *KafkaWriter) WriteMessages(ctx context.Context, msgs ...kafka.Message) error { // although there's only one call made to the SyncProducer, the messages are // treated individually, so we create a span for each one - spans := make([]ddtrace.Span, len(msgs)) + spans := make([]*tracer.Span, len(msgs)) for i := range msgs { tMsg := wrapMessage(&msgs[i]) tWriter := wrapTracingWriter(w.Writer) diff --git a/contrib/segmentio/kafka.go.v0/kafka_test.go b/contrib/segmentio/kafka-go/kafka_test.go similarity index 86% rename from contrib/segmentio/kafka.go.v0/kafka_test.go rename to contrib/segmentio/kafka-go/kafka_test.go index ab4e7839c9..a1b16b0eee 100644 --- a/contrib/segmentio/kafka.go.v0/kafka_test.go +++ b/contrib/segmentio/kafka-go/kafka_test.go @@ -16,17 +16,15 @@ import ( "testing" "time" - "github.com/segmentio/kafka-go" + "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing" + "github.com/DataDog/dd-trace-go/v2/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + kafka "github.com/segmentio/kafka-go" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" ) const ( @@ -155,11 +153,11 @@ func ensureTopicReady() error { type readerOpFn func(t *testing.T, r *Reader) -func genIntegrationTestSpans(t *testing.T, mt mocktracer.Tracer, writerOp func(t *testing.T, w *Writer), readerOp readerOpFn, writerOpts []Option, readerOpts []Option) ([]mocktracer.Span, []kafka.Message) { +func genIntegrationTestSpans(t *testing.T, mt mocktracer.Tracer, writerOp func(t *testing.T, w *KafkaWriter), readerOp readerOpFn, writerOpts []Option, readerOpts []Option) ([]*mocktracer.Span, []kafka.Message) { writtenMessages := []kafka.Message{} kw := testWriter() - kw.Completion = func(messages []kafka.Message, err error) { + kw.Completion = func(messages []kafka.Message, _ error) { writtenMessages = append(writtenMessages, messages...) } w := WrapWriter(kw, writerOpts...) @@ -196,7 +194,7 @@ func TestReadMessageFunctional(t *testing.T) { spans, writtenMessages := genIntegrationTestSpans( t, mt, - func(t *testing.T, w *Writer) { + func(t *testing.T, w *KafkaWriter) { err := w.WriteMessages(context.Background(), messagesToWrite...) require.NoError(t, err, "Expected to write message to topic") }, @@ -225,11 +223,13 @@ func TestReadMessageFunctional(t *testing.T) { assert.Equal(t, "Produce Topic "+testTopic, s0.Tag(ext.ResourceName)) assert.Equal(t, 0.1, s0.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s0.Tag(ext.SpanType)) - assert.Equal(t, 0, s0.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s0.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "segmentio/kafka.go.v0", s0.Tag(ext.Component)) + assert.Equal(t, "segmentio/kafka.go.v0", s0.Integration()) assert.Equal(t, ext.SpanKindProducer, s0.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s0.Tag(ext.MessagingSystem)) assert.Equal(t, "localhost:9092,localhost:9093,localhost:9094", s0.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, testTopic, s0.Tag("messaging.destination.name")) p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), tracing.NewMessageCarrier(wrapMessage(&writtenMessages[0])))) assert.True(t, ok) @@ -245,11 +245,13 @@ func TestReadMessageFunctional(t *testing.T) { assert.Equal(t, "Consume Topic "+testTopic, s1.Tag(ext.ResourceName)) assert.Equal(t, nil, s1.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s1.Tag(ext.SpanType)) - assert.Equal(t, 0, s1.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s1.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "segmentio/kafka.go.v0", s1.Tag(ext.Component)) + assert.Equal(t, "segmentio/kafka.go.v0", s1.Integration()) assert.Equal(t, ext.SpanKindConsumer, s1.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s1.Tag(ext.MessagingSystem)) assert.Equal(t, "localhost:9092,localhost:9093,localhost:9094", s1.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, testTopic, s1.Tag("messaging.destination.name")) // context propagation assert.Equal(t, s0.SpanID(), s1.ParentID(), "consume span should be child of the produce span") @@ -283,7 +285,7 @@ func TestFetchMessageFunctional(t *testing.T) { spans, writtenMessages := genIntegrationTestSpans( t, mt, - func(t *testing.T, w *Writer) { + func(t *testing.T, w *KafkaWriter) { err := w.WriteMessages(context.Background(), messagesToWrite...) require.NoError(t, err, "Expected to write message to topic") }, @@ -309,11 +311,13 @@ func TestFetchMessageFunctional(t *testing.T) { assert.Equal(t, "Produce Topic "+testTopic, s0.Tag(ext.ResourceName)) assert.Equal(t, 0.1, s0.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s0.Tag(ext.SpanType)) - assert.Equal(t, 0, s0.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s0.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "segmentio/kafka.go.v0", s0.Tag(ext.Component)) + assert.Equal(t, "segmentio/kafka.go.v0", s0.Integration()) assert.Equal(t, ext.SpanKindProducer, s0.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s0.Tag(ext.MessagingSystem)) assert.Equal(t, "localhost:9092,localhost:9093,localhost:9094", s0.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, testTopic, s0.Tag("messaging.destination.name")) p, ok := datastreams.PathwayFromContext(datastreams.ExtractFromBase64Carrier(context.Background(), tracing.NewMessageCarrier(wrapMessage(&writtenMessages[0])))) assert.True(t, ok) @@ -329,11 +333,13 @@ func TestFetchMessageFunctional(t *testing.T) { assert.Equal(t, "Consume Topic "+testTopic, s1.Tag(ext.ResourceName)) assert.Equal(t, nil, s1.Tag(ext.EventSampleRate)) assert.Equal(t, "queue", s1.Tag(ext.SpanType)) - assert.Equal(t, 0, s1.Tag(ext.MessagingKafkaPartition)) + assert.Equal(t, float64(0), s1.Tag(ext.MessagingKafkaPartition)) assert.Equal(t, "segmentio/kafka.go.v0", s1.Tag(ext.Component)) + assert.Equal(t, "segmentio/kafka.go.v0", s1.Integration()) assert.Equal(t, ext.SpanKindConsumer, s1.Tag(ext.SpanKind)) assert.Equal(t, "kafka", s1.Tag(ext.MessagingSystem)) assert.Equal(t, "localhost:9092,localhost:9093,localhost:9094", s1.Tag(ext.KafkaBootstrapServers)) + assert.Equal(t, testTopic, s1.Tag("messaging.destination.name")) // context propagation assert.Equal(t, s0.SpanID(), s1.ParentID(), "consume span should be child of the produce span") @@ -405,50 +411,8 @@ func TestProduceMultipleMessages(t *testing.T) { } } -func TestNamingSchema(t *testing.T) { - genSpans := func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - - mt := mocktracer.Start() - defer mt.Stop() - - messagesToWrite := []kafka.Message{ - { - Key: []byte("key1"), - Value: []byte("value1"), - }, - } - - spans, _ := genIntegrationTestSpans( - t, - mt, - func(t *testing.T, w *Writer) { - err := w.WriteMessages(context.Background(), messagesToWrite...) - require.NoError(t, err, "Expected to write message to topic") - }, - func(t *testing.T, r *Reader) { - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - readMsg, err := r.FetchMessage(ctx) - require.NoError(t, err, "Expected to consume message") - assert.Equal(t, messagesToWrite[0].Value, readMsg.Value, "Values should be equal") - - err = r.CommitMessages(context.Background(), readMsg) - assert.NoError(t, err, "Expected CommitMessages to not return an error") - }, - opts, - opts, - ) - return spans - } - namingschematest.NewKafkaTest(genSpans)(t) -} - // benchSpan is a package-level variable used to prevent compiler optimisations in the benchmarks below. -var benchSpan ddtrace.Span +var benchSpan *tracer.Span func BenchmarkReaderStartSpan(b *testing.B) { ctx := context.Background() @@ -461,7 +425,7 @@ func BenchmarkReaderStartSpan(b *testing.B) { Key: []byte("key1"), Value: []byte("value1"), } - var result ddtrace.Span + var result *tracer.Span b.ResetTimer() for n := 0; n < b.N; n++ { @@ -486,7 +450,7 @@ func BenchmarkWriterStartSpan(b *testing.B) { Key: []byte("key1"), Value: []byte("value1"), } - var result ddtrace.Span + var result *tracer.Span b.ResetTimer() for n := 0; n < b.N; n++ { diff --git a/contrib/segmentio/kafka-go/option.go b/contrib/segmentio/kafka-go/option.go new file mode 100644 index 0000000000..cb84af3702 --- /dev/null +++ b/contrib/segmentio/kafka-go/option.go @@ -0,0 +1,35 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package kafka + +import "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing" + +// Option describes options for the Kafka integration. +type Option = tracing.Option + +// OptionFn represents options applicable to NewReader, NewWriter, WrapReader and WrapWriter. +type OptionFn = tracing.OptionFn + +// WithService sets the config service name to serviceName. +func WithService(serviceName string) Option { + return tracing.WithService(serviceName) +} + +// WithAnalytics enables Trace Analytics for all started spans. +func WithAnalytics(on bool) Option { + return tracing.WithAnalytics(on) +} + +// WithAnalyticsRate sets the sampling rate for Trace Analytics events +// correlated to started spans. +func WithAnalyticsRate(rate float64) Option { + return tracing.WithAnalyticsRate(rate) +} + +// WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ +func WithDataStreams() Option { + return tracing.WithDataStreams() +} diff --git a/contrib/segmentio/kafka-go/orchestrion.yml b/contrib/segmentio/kafka-go/orchestrion.yml new file mode 100644 index 0000000000..eb709a6fc9 --- /dev/null +++ b/contrib/segmentio/kafka-go/orchestrion.yml @@ -0,0 +1,229 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 + description: Kafka library in Go + +aspects: + ## Trace Consume ## + - id: Reader + join-point: + struct-definition: github.com/segmentio/kafka-go.Reader + advice: + - inject-declarations: + imports: + tracing: github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + strings: strings + template: |- + type __dd_wMessage struct { + *Message + } + + func __dd_wrapMessage(msg *Message) tracing.Message { + if msg == nil { + return nil + } + return &__dd_wMessage{msg} + } + + func (w *__dd_wMessage) GetValue() []byte { + return w.Value + } + + func (w *__dd_wMessage) GetKey() []byte { + return w.Key + } + + func (w *__dd_wMessage) GetHeaders() []tracing.Header { + hs := make([]tracing.Header, 0, len(w.Headers)) + for _, h := range w.Headers { + hs = append(hs, __dd_wrapHeader(h)) + } + return hs + } + + func (w *__dd_wMessage) SetHeaders(headers []tracing.Header) { + hs := make([]Header, 0, len(headers)) + for _, h := range headers { + hs = append(hs, Header{ + Key: h.GetKey(), + Value: h.GetValue(), + }) + } + w.Message.Headers = hs + } + + func (w *__dd_wMessage) GetTopic() string { + return w.Topic + } + + func (w *__dd_wMessage) GetPartition() int { + return w.Partition + } + + func (w *__dd_wMessage) GetOffset() int64 { + return w.Offset + } + + type __dd_wHeader struct { + Header + } + + func __dd_wrapHeader(h Header) tracing.Header { + return &__dd_wHeader{h} + } + + func (w __dd_wHeader) GetKey() string { + return w.Key + } + + func (w __dd_wHeader) GetValue() []byte { + return w.Value + } + + type __dd_wWriter struct { + *Writer + } + + func (w *__dd_wWriter) GetTopic() string { + return w.Topic + } + + func __dd_wrapTracingWriter(w *Writer) tracing.Writer { + return &__dd_wWriter{w} + } + + func __dd_initReader(r *Reader) { + if r.__dd_tracer != nil { + return + } + kafkaCfg := tracing.KafkaConfig{} + if r.Config().Brokers != nil { + kafkaCfg.BootstrapServers = strings.Join(r.Config().Brokers, ",") + } + if r.Config().GroupID != "" { + kafkaCfg.ConsumerGroupID = r.Config().GroupID + } + r.__dd_tracer = tracing.NewTracer(kafkaCfg) + } + + type __dd_tracer_Span = tracer.Span + - add-struct-field: + name: __dd_tracer + type: "*github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing.Tracer" + - add-struct-field: + name: __dd_prevSpan + type: "*__dd_tracer_Span" + + - id: Reader.FetchMessage + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Reader' + - name: FetchMessage # ReadMessage calls FetchMessage internally, so tracing this should be enough. + advice: + - prepend-statements: + imports: + tracing: github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing + template: |- + {{- $r := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msg := .Function.Result 0 -}} + {{- $err := .Function.Result 1 -}} + __dd_initReader(r) + if {{ $r }}.__dd_prevSpan != nil { + {{ $r }}.__dd_prevSpan.Finish() + {{ $r }}.__dd_prevSpan = nil + } + defer func() { + if {{ $err }} != nil { + return + } + tMsg := __dd_wrapMessage(&{{ $msg }}) + {{ $r }}.__dd_prevSpan = {{ $r }}.__dd_tracer.StartConsumeSpan({{ $ctx }}, tMsg) + {{ $r }}.__dd_tracer.SetConsumeDSMCheckpoint(tMsg) + }() + + - id: Reader.Close + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Reader' + - name: Close + advice: + - prepend-statements: + template: |- + {{- $r := .Function.Receiver -}} + if {{ $r }}.__dd_prevSpan != nil { + {{ $r }}.__dd_prevSpan.Finish() + {{ $r }}.__dd_prevSpan = nil + } + + ## Trace Produce ## + + - id: Writer + join-point: + struct-definition: github.com/segmentio/kafka-go.Writer + advice: + - inject-declarations: + imports: + tracing: github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing + template: |- + func __dd_initWriter(w *Writer) { + if w.__dd_tracer != nil { + return + } + kafkaCfg := tracing.KafkaConfig{ + BootstrapServers: w.Addr.String(), + } + w.__dd_tracer = tracing.NewTracer(kafkaCfg) + } + - add-struct-field: + name: __dd_tracer + type: "*github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing.Tracer" + + - id: Writer.WriteMessages + join-point: + function-body: + function: + - receiver: '*github.com/segmentio/kafka-go.Writer' + - name: WriteMessages + advice: + - prepend-statements: + imports: + tracing: github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + # Here we pass a nil context to tracing.StartProduceSpan as the GLS modifies the context and makes the + # spans started in the for loop child of the previous ones instead of being sibling spans (which is the + # desired behavior). Until GLS supports starting sibling spans, we set the parent span manually as a workaround. + template: |- + {{- $w := .Function.Receiver -}} + {{- $ctx := .Function.Argument 0 -}} + {{- $msgs := .Function.Argument 1 -}} + {{- $err := .Function.Result 0 -}} + spans := make([]*tracer.Span, len({{ $msgs }})) + __dd_initWriter(w) + + var spanOpts []tracer.StartSpanOption + prevSpan, ok := tracer.SpanFromContext({{ $ctx }}) + if ok { + spanOpts = append(spanOpts, tracer.ChildOf(prevSpan.Context())) + } + + for i := range {{ $msgs }} { + tMsg := __dd_wrapMessage(&{{ $msgs }}[i]) + tWriter := __dd_wrapTracingWriter({{ $w }}) + spans[i] = {{ $w }}.__dd_tracer.StartProduceSpan(nil, tWriter, tMsg, spanOpts...) + {{ $w }}.__dd_tracer.SetProduceDSMCheckpoint(tMsg, tWriter) + } + + defer func() { + for i, span := range spans { + {{ $w }}.__dd_tracer.FinishProduceSpan(span, {{ $msgs }}[i].Partition, {{ $msgs }}[i].Offset, {{ $err }}) + } + }() diff --git a/contrib/segmentio/kafka.go.v0/tracing.go b/contrib/segmentio/kafka-go/tracing.go similarity index 94% rename from contrib/segmentio/kafka.go.v0/tracing.go rename to contrib/segmentio/kafka-go/tracing.go index fdf1e84b9b..185f14964d 100644 --- a/contrib/segmentio/kafka.go.v0/tracing.go +++ b/contrib/segmentio/kafka-go/tracing.go @@ -6,9 +6,8 @@ package kafka import ( + "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2/internal/tracing" "github.com/segmentio/kafka-go" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing" ) type wMessage struct { diff --git a/contrib/segmentio/kafka.go.v0/headers.go b/contrib/segmentio/kafka.go.v0/headers.go deleted file mode 100644 index 347806d36a..0000000000 --- a/contrib/segmentio/kafka.go.v0/headers.go +++ /dev/null @@ -1,19 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package kafka - -import ( - "github.com/segmentio/kafka-go" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" -) - -// ExtractSpanContext retrieves the SpanContext from a kafka.Message -func ExtractSpanContext(msg kafka.Message) (ddtrace.SpanContext, error) { - return tracer.Extract(tracing.NewMessageCarrier(wrapMessage(&msg))) -} diff --git a/contrib/segmentio/kafka.go.v0/internal/tracing/tracer_test.go b/contrib/segmentio/kafka.go.v0/internal/tracing/tracer_test.go deleted file mode 100644 index 0bf6bedc56..0000000000 --- a/contrib/segmentio/kafka.go.v0/internal/tracing/tracer_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package tracing - -import ( - "math" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - - "github.com/stretchr/testify/assert" -) - -func TestAnalyticsSettings(t *testing.T) { - t.Run("defaults", func(t *testing.T) { - cfg := NewTracer(KafkaConfig{}) - assert.True(t, math.IsNaN(cfg.analyticsRate)) - }) - - t.Run("global", func(t *testing.T) { - t.Skip("global flag disabled") - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - cfg := NewTracer(KafkaConfig{}) - assert.Equal(t, 0.4, cfg.analyticsRate) - }) - - t.Run("enabled", func(t *testing.T) { - cfg := NewTracer(KafkaConfig{}, WithAnalytics(true)) - assert.Equal(t, 1.0, cfg.analyticsRate) - }) - - t.Run("override", func(t *testing.T) { - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - cfg := NewTracer(KafkaConfig{}, WithAnalyticsRate(0.2)) - assert.Equal(t, 0.2, cfg.analyticsRate) - }) - - t.Run("withEnv", func(t *testing.T) { - t.Setenv("DD_DATA_STREAMS_ENABLED", "true") - cfg := NewTracer(KafkaConfig{}) - assert.True(t, cfg.dataStreamsEnabled) - }) - - t.Run("optionOverridesEnv", func(t *testing.T) { - t.Setenv("DD_DATA_STREAMS_ENABLED", "false") - cfg := NewTracer(KafkaConfig{}) - WithDataStreams()(cfg) - assert.True(t, cfg.dataStreamsEnabled) - }) -} diff --git a/contrib/segmentio/kafka.go.v0/option.go b/contrib/segmentio/kafka.go.v0/option.go deleted file mode 100644 index b31d24e2d5..0000000000 --- a/contrib/segmentio/kafka.go.v0/option.go +++ /dev/null @@ -1,26 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package kafka - -import ( - "gopkg.in/DataDog/dd-trace-go.v1/contrib/segmentio/kafka.go.v0/internal/tracing" -) - -// An Option customizes the config. -type Option = tracing.Option - -// WithServiceName sets the config service name to serviceName. -var WithServiceName = tracing.WithServiceName - -// WithAnalytics enables Trace Analytics for all started spans. -var WithAnalytics = tracing.WithAnalytics - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -var WithAnalyticsRate = tracing.WithAnalyticsRate - -// WithDataStreams enables the Data Streams monitoring product features: https://www.datadoghq.com/product/data-streams-monitoring/ -var WithDataStreams = tracing.WithDataStreams diff --git a/contrib/sirupsen/logrus/example_test.go b/contrib/sirupsen/logrus/example_test.go index 4cafbcaebf..e62ad854d0 100644 --- a/contrib/sirupsen/logrus/example_test.go +++ b/contrib/sirupsen/logrus/example_test.go @@ -3,23 +3,26 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2022 Datadog, Inc. -package logrus +package logrus_test import ( "context" "os" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + ddlogrus "github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2" "github.com/sirupsen/logrus" ) func ExampleHook() { + tracer.Start() + defer tracer.Stop() // Ensure your tracer is started and stopped // Setup logrus, do this once at the beginning of your program logrus.SetFormatter(&logrus.JSONFormatter{}) - logrus.AddHook(&DDContextLogHook{}) + logrus.AddHook(&ddlogrus.DDContextLogHook{}) logrus.SetOutput(os.Stdout) span, sctx := tracer.StartSpanFromContext(context.Background(), "mySpan") @@ -29,6 +32,6 @@ func ExampleHook() { cLog := logrus.WithContext(sctx).WithTime(time.Date(2000, 1, 1, 1, 1, 1, 0, time.UTC)) // Log as desired using the context-aware logger cLog.Info("Completed some work!") - // Output: + // You should see: // {"dd.span_id":0,"dd.trace_id":0,"level":"info","msg":"Completed some work!","time":"2000-01-01T01:01:01Z"} } diff --git a/contrib/sirupsen/logrus/go.mod b/contrib/sirupsen/logrus/go.mod new file mode 100644 index 0000000000..e18f622b1d --- /dev/null +++ b/contrib/sirupsen/logrus/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/sirupsen/logrus v1.9.3 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/sirupsen/logrus/go.sum b/contrib/sirupsen/logrus/go.sum new file mode 100644 index 0000000000..5492520c2a --- /dev/null +++ b/contrib/sirupsen/logrus/go.sum @@ -0,0 +1,312 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/sirupsen/logrus/logrus.go b/contrib/sirupsen/logrus/logrus.go index d0e379d796..26859c6d44 100644 --- a/contrib/sirupsen/logrus/logrus.go +++ b/contrib/sirupsen/logrus/logrus.go @@ -7,23 +7,37 @@ package logrus import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/sirupsen/logrus" ) -const componentName = "sirupsen/logrus" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/sirupsen/logrus") + instr = instrumentation.Load(instrumentation.PackageSirupsenLogrus) } // DDContextLogHook ensures that any span in the log context is correlated to log output. type DDContextLogHook struct{} +type config struct { + log128bits bool +} + +var cfg = newConfig() + +func newConfig() *config { + return &config{ + log128bits: options.GetBoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", true), + } +} + // Levels implements logrus.Hook interface, this hook applies to all defined levels func (d *DDContextLogHook) Levels() []logrus.Level { return []logrus.Level{logrus.PanicLevel, logrus.FatalLevel, logrus.ErrorLevel, logrus.WarnLevel, logrus.InfoLevel, logrus.DebugLevel, logrus.TraceLevel} @@ -35,7 +49,11 @@ func (d *DDContextLogHook) Fire(e *logrus.Entry) error { if !found { return nil } - e.Data[ext.LogKeyTraceID] = span.Context().TraceID() - e.Data[ext.LogKeySpanID] = span.Context().SpanID() + if cfg.log128bits && span.Context().TraceID() != tracer.TraceIDZero { + e.Data[ext.LogKeyTraceID] = span.Context().TraceID() + } else { + e.Data[ext.LogKeyTraceID] = strconv.FormatUint(span.Context().TraceIDLower(), 10) + } + e.Data[ext.LogKeySpanID] = strconv.FormatUint(span.Context().SpanID(), 10) return nil } diff --git a/contrib/sirupsen/logrus/logrus_test.go b/contrib/sirupsen/logrus/logrus_test.go index be23324b4d..d20602abb8 100644 --- a/contrib/sirupsen/logrus/logrus_test.go +++ b/contrib/sirupsen/logrus/logrus_test.go @@ -7,9 +7,10 @@ package logrus import ( "context" + "strconv" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" @@ -18,14 +19,35 @@ import ( func TestFire(t *testing.T) { tracer.Start() defer tracer.Stop() - _, sctx := tracer.StartSpanFromContext(context.Background(), "testSpan", tracer.WithSpanID(1234)) + sp, sctx := tracer.StartSpanFromContext(context.Background(), "testSpan", tracer.WithSpanID(1234)) hook := &DDContextLogHook{} e := logrus.NewEntry(logrus.New()) e.Context = sctx err := hook.Fire(e) + assert.NoError(t, err) + + // By default, trace IDs are logged in 128bit format + assert.Equal(t, sp.Context().TraceID(), e.Data["dd.trace_id"]) + assert.Equal(t, strconv.FormatUint(sp.Context().SpanID(), 10), e.Data["dd.span_id"]) +} + +func TestFire128BitDisabled(t *testing.T) { + t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") + // Re-initialize to account for race condition between setting env var in the test and reading it in the contrib + cfg = newConfig() + + tracer.Start() + defer tracer.Stop() + sp, sctx := tracer.StartSpanFromContext(context.Background(), "testSpan", tracer.WithSpanID(1234)) + + hook := &DDContextLogHook{} + e := logrus.NewEntry(logrus.New()) + e.Context = sctx + err := hook.Fire(e) assert.NoError(t, err) - assert.Equal(t, uint64(1234), e.Data["dd.trace_id"]) - assert.Equal(t, uint64(1234), e.Data["dd.span_id"]) + + assert.Equal(t, strconv.FormatUint(sp.Context().TraceIDLower(), 10), e.Data["dd.trace_id"]) + assert.Equal(t, strconv.FormatUint(sp.Context().SpanID(), 10), e.Data["dd.span_id"]) } diff --git a/contrib/sirupsen/logrus/orchestrion.yml b/contrib/sirupsen/logrus/orchestrion.yml new file mode 100644 index 0000000000..52392eaf6a --- /dev/null +++ b/contrib/sirupsen/logrus/orchestrion.yml @@ -0,0 +1,89 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2 + description: Structured, pluggable logging for Go. + +aspects: + - id: DDContextLogHook + join-point: + struct-definition: github.com/sirupsen/logrus.Logger + advice: + - inject-declarations: + imports: + telemetry: github.com/DataDog/dd-trace-go/v2/internal/telemetry + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + ext: github.com/DataDog/dd-trace-go/v2/ddtrace/ext + template: |- + func init() { + telemetry.LoadIntegration("sirupsen/logrus") + tracer.MarkIntegrationImported("github.com/sirupsen/logrus") + } + + // DDContextLogHook ensures that any span in the log context is correlated to log output. + type DDContextLogHook struct{} + + // Levels implements logrus.Hook interface, this hook applies to all defined levels + func (d *DDContextLogHook) Levels() []Level { + return []Level{PanicLevel, FatalLevel, ErrorLevel, WarnLevel, InfoLevel, DebugLevel, TraceLevel} + } + + // Fire implements logrus.Hook interface, attaches trace and span details found in entry context + func (d *DDContextLogHook) Fire(e *Entry) error { + span, found := tracer.SpanFromContext(e.Context) + if !found { + return nil + } + e.Data[ext.LogKeyTraceID] = span.Context().TraceID() + e.Data[ext.LogKeySpanID] = span.Context().SpanID() + return nil + } + + - id: New + join-point: + all-of: + - import-path: github.com/sirupsen/logrus + - function-body: + function: + - name: New + advice: + - prepend-statements: + template: |- + {{- $logger := .Function.Result 0 -}} + defer func() { + {{ $logger }}.AddHook(&DDContextLogHook{}) + }() + + - id: '*logrus.Logger' + join-point: + struct-literal: + type: github.com/sirupsen/logrus.Logger + match: pointer-only + advice: + - wrap-expression: + imports: + logrus: github.com/sirupsen/logrus + template: |- + func(logger *logrus.Logger) *logrus.Logger { + logger.AddHook(&logrus.DDContextLogHook{}) + return logger + }({{ . }}) + + - id: logrus.Logger + join-point: + struct-literal: + type: github.com/sirupsen/logrus.Logger + match: value-only + advice: + - wrap-expression: + imports: + logrus: github.com/sirupsen/logrus + template: |- + func(logger logrus.Logger) logrus.Logger { + logger.AddHook(&logrus.DDContextLogHook{}) + return logger + }({{ . }}) diff --git a/contrib/supported_integrations.md b/contrib/supported_integrations.md new file mode 100644 index 0000000000..0a09005de3 --- /dev/null +++ b/contrib/supported_integrations.md @@ -0,0 +1,64 @@ +| Package | Datadog Integration | Minimum Tested Version | Maximum Tested Version | Orchestrion support | +|-------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------|----------------------------------------|---------------------| +| [github.com/99designs/gqlgen](https://pkg.go.dev/github.com/99designs/gqlgen) | [contrib/99designs/gqlgen](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2) | `v0.17.72` | `v0.17.78` | :white_check_mark: | +| [github.com/IBM/sarama](https://pkg.go.dev/github.com/IBM/sarama) | [contrib/IBM/sarama](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2) | `v1.40.0` | `v1.46.0` | :white_check_mark: | +| [github.com/aws/aws-sdk-go-v2](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2) | [contrib/aws/aws-sdk-go-v2](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2) | `v1.26.1` | `v1.39.0` | :white_check_mark: | +| [github.com/bradfitz/gomemcache](https://pkg.go.dev/github.com/bradfitz/gomemcache) | [contrib/bradfitz/gomemcache](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2) | `v0.0.0-20230611145640-acc696258285` | `v0.0.0-20250403215159-8d39553ac7cf` | | +| [cloud.google.com/go/pubsub](https://pkg.go.dev/cloud.google.com/go/pubsub) | [contrib/cloud.google.com/go/pubsub.v1](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2) | `v1.37.0` | `v1.50.1` | :white_check_mark: | +| [cloud.google.com/go/pubsub/v2](https://pkg.go.dev/cloud.google.com/go/pubsub/v2) | [contrib/cloud.google.com/go/pubsub.v2](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2) | `v2.0.0` | `v2.0.0` | :white_check_mark: | +| [github.com/confluentinc/confluent-kafka-go](https://pkg.go.dev/github.com/confluentinc/confluent-kafka-go) | [contrib/confluentinc/confluent-kafka-go/kafka](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2) | `v1.9.2` | `v1.9.2` | :white_check_mark: | +| [github.com/confluentinc/confluent-kafka-go/v2](https://pkg.go.dev/github.com/confluentinc/confluent-kafka-go/v2) | [contrib/confluentinc/confluent-kafka-go/kafka.v2](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2) | `v2.4.0` | `v2.11.1` | :white_check_mark: | +| [database/sql](https://pkg.go.dev/database/sql) | [contrib/database/sql](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/database/sql/v2) | `N/A` | `N/A` | :white_check_mark: | +| [github.com/dimfeld/httptreemux/v5](https://pkg.go.dev/github.com/dimfeld/httptreemux/v5) | [contrib/dimfeld/httptreemux.v5](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2) | `v5.5.0` | `v5.5.0` | | +| [github.com/elastic/go-elasticsearch/v6](https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6) | [contrib/elastic/go-elasticsearch.v6](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2) | `v6.8.5` | `v6.8.10` | :white_check_mark: | +| [github.com/emicklei/go-restful/v3](https://pkg.go.dev/github.com/emicklei/go-restful/v3) | [contrib/emicklei/go-restful.v3](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2) | `v3.11.0` | `v3.13.0` | | +| [github.com/envoyproxy/go-control-plane/envoy](https://pkg.go.dev/github.com/envoyproxy/go-control-plane/envoy) | [contrib/envoyproxy/go-control-plane](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2) | `v1.32.4` | `v1.32.4` | | +| [github.com/gin-gonic/gin](https://pkg.go.dev/github.com/gin-gonic/gin) | [contrib/gin-gonic/gin](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2) | `v1.10.1` | `v1.10.1` | :white_check_mark: | +| [github.com/go-chi/chi](https://pkg.go.dev/github.com/go-chi/chi) | [contrib/go-chi/chi](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2) | `v1.5.4` | `v1.5.5` | :white_check_mark: | +| [github.com/go-chi/chi/v5](https://pkg.go.dev/github.com/go-chi/chi/v5) | [contrib/go-chi/chi.v5](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2) | `v5.2.2` | `v5.2.3` | :white_check_mark: | +| [github.com/go-pg/pg/v10](https://pkg.go.dev/github.com/go-pg/pg/v10) | [contrib/go-pg/pg.v10](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2) | `v10.15.0` | `v10.15.0` | | +| [github.com/go-redis/redis](https://pkg.go.dev/github.com/go-redis/redis) | [contrib/go-redis/redis](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2) | `v6.15.9+incompatible` | `v6.15.9+incompatible` | :white_check_mark: | +| [github.com/go-redis/redis/v7](https://pkg.go.dev/github.com/go-redis/redis/v7) | [contrib/go-redis/redis.v7](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2) | `v7.4.1` | `v7.4.1` | :white_check_mark: | +| [github.com/go-redis/redis/v8](https://pkg.go.dev/github.com/go-redis/redis/v8) | [contrib/go-redis/redis.v8](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2) | `v8.11.5` | `v8.11.5` | :white_check_mark: | +| [go.mongodb.org/mongo-driver](https://pkg.go.dev/go.mongodb.org/mongo-driver) | [contrib/go.mongodb.org/mongo-driver](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2) | `v1.12.1` | `v1.17.4` | :white_check_mark: | +| [go.mongodb.org/mongo-driver/v2](https://pkg.go.dev/go.mongodb.org/mongo-driver/v2) | [contrib/go.mongodb.org/mongo-driver.v2](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2) | `v2.2.2` | `v2.3.0` | :white_check_mark: | +| [github.com/gocql/gocql](https://pkg.go.dev/github.com/gocql/gocql) | [contrib/gocql/gocql](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2) | `v1.6.0` | `v1.7.0` | :white_check_mark: | +| [github.com/gofiber/fiber/v2](https://pkg.go.dev/github.com/gofiber/fiber/v2) | [contrib/gofiber/fiber.v2](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2) | `v2.52.9` | `v2.52.9` | :white_check_mark: | +| [github.com/gomodule/redigo](https://pkg.go.dev/github.com/gomodule/redigo) | [contrib/gomodule/redigo](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2) | `v1.8.9` | `v1.9.2` | :white_check_mark: | +| [google.golang.org/api](https://pkg.go.dev/google.golang.org/api) | [contrib/google.golang.org/api](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2) | `v0.169.0` | `v0.249.0` | | +| [google.golang.org/grpc](https://pkg.go.dev/google.golang.org/grpc) | [contrib/google.golang.org/grpc](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2) | `v1.72.0` | `v1.75.1` | :white_check_mark: | +| [github.com/gorilla/mux](https://pkg.go.dev/github.com/gorilla/mux) | [contrib/gorilla/mux](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2) | `v1.8.1` | `v1.8.1` | :white_check_mark: | +| [gorm.io/gorm](https://pkg.go.dev/gorm.io/gorm) | [contrib/gorm.io/gorm.v1](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2) | `v1.25.5` | `v1.30.5` | :white_check_mark: | +| [github.com/graph-gophers/graphql-go](https://pkg.go.dev/github.com/graph-gophers/graphql-go) | [contrib/graph-gophers/graphql-go](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2) | `v1.5.0` | `v1.8.0` | :white_check_mark: | +| [github.com/graphql-go/graphql](https://pkg.go.dev/github.com/graphql-go/graphql) | [contrib/graphql-go/graphql](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2) | `v0.8.1` | `v0.8.1` | :white_check_mark: | +| [github.com/hashicorp/consul/api](https://pkg.go.dev/github.com/hashicorp/consul/api) | [contrib/hashicorp/consul](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2) | `v1.24.0` | `v1.32.1` | | +| [github.com/hashicorp/vault/api](https://pkg.go.dev/github.com/hashicorp/vault/api) | [contrib/hashicorp/vault](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2) | `v1.9.2` | `v1.21.0` | :white_check_mark: | +| [github.com/jackc/pgx/v5](https://pkg.go.dev/github.com/jackc/pgx/v5) | [contrib/jackc/pgx.v5](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2) | `v5.6.0` | `v5.7.6` | :white_check_mark: | +| [github.com/jmoiron/sqlx](https://pkg.go.dev/github.com/jmoiron/sqlx) | [contrib/jmoiron/sqlx](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/jmoiron/sqlx/v2) | `v1.3.5` | `v1.4.0` | | +| [github.com/julienschmidt/httprouter](https://pkg.go.dev/github.com/julienschmidt/httprouter) | [contrib/julienschmidt/httprouter](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2) | `v1.3.0` | `v1.3.0` | :white_check_mark: | +| [k8s.io/client-go](https://pkg.go.dev/k8s.io/client-go) | [contrib/k8s.io/client-go](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2) | `v0.31.4` | `v0.34.1` | :white_check_mark: | +| [sigs.k8s.io/gateway-api](https://pkg.go.dev/sigs.k8s.io/gateway-api) | [contrib/k8s.io/gateway-api](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/k8s.io/gateway-api/v2) | `v1.2.1` | `v1.3.0` | | +| [github.com/labstack/echo/v4](https://pkg.go.dev/github.com/labstack/echo/v4) | [contrib/labstack/echo.v4](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2) | `v4.11.1` | `v4.13.4` | :white_check_mark: | +| [log/slog](https://pkg.go.dev/log/slog) | [contrib/log/slog](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/log/slog/v2) | `N/A` | `N/A` | :white_check_mark: | +| [github.com/miekg/dns](https://pkg.go.dev/github.com/miekg/dns) | [contrib/miekg/dns](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2) | `v1.1.55` | `v1.1.68` | | +| [net/http](https://pkg.go.dev/net/http) | [contrib/net/http](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/net/http/v2) | `N/A` | `N/A` | :white_check_mark: | +| [github.com/redis/go-redis/v9](https://pkg.go.dev/github.com/redis/go-redis/v9) | [contrib/redis/go-redis.v9](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2) | `v9.7.3` | `v9.14.0` | :white_check_mark: | +| [github.com/redis/rueidis](https://pkg.go.dev/github.com/redis/rueidis) | [contrib/redis/rueidis](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2) | `v1.0.55` | `v1.0.64` | :white_check_mark: | +| [github.com/segmentio/kafka-go](https://pkg.go.dev/github.com/segmentio/kafka-go) | [contrib/segmentio/kafka-go](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2) | `v0.4.42` | `v0.4.49` | :white_check_mark: | +| [github.com/sirupsen/logrus](https://pkg.go.dev/github.com/sirupsen/logrus) | [contrib/sirupsen/logrus](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2) | `v1.9.3` | `v1.9.3` | :white_check_mark: | +| [github.com/syndtr/goleveldb](https://pkg.go.dev/github.com/syndtr/goleveldb) | [contrib/syndtr/goleveldb](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2) | `v1.0.1-0.20220721030215-126854af5e6d` | `v1.0.1-0.20220721030215-126854af5e6d` | | +| [github.com/tidwall/buntdb](https://pkg.go.dev/github.com/tidwall/buntdb) | [contrib/tidwall/buntdb](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2) | `v1.3.0` | `v1.3.2` | | +| [github.com/twitchtv/twirp](https://pkg.go.dev/github.com/twitchtv/twirp) | [contrib/twitchtv/twirp](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2) | `v8.1.3+incompatible` | `v8.1.3+incompatible` | :white_check_mark: | +| [github.com/uptrace/bun](https://pkg.go.dev/github.com/uptrace/bun) | [contrib/uptrace/bun](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/uptrace/bun/v2) | `v1.1.17` | `v1.2.15` | | +| [github.com/urfave/negroni](https://pkg.go.dev/github.com/urfave/negroni) | [contrib/urfave/negroni](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2) | `v1.0.0` | `v1.0.0` | | +| [github.com/valkey-io/valkey-go](https://pkg.go.dev/github.com/valkey-io/valkey-go) | [contrib/valkey-io/valkey-go](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2) | `v1.0.55` | `v1.0.64` | :white_check_mark: | +| [github.com/valyala/fasthttp](https://pkg.go.dev/github.com/valyala/fasthttp) | [contrib/valyala/fasthttp](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/valyala/fasthttp/v2) | `v1.51.0` | `v1.65.0` | | + +⚠️ The following integrations are marked as deprecated and will be removed in future releases. ⚠️ + +| Package | Datadog Integration | Minimum Tested Version | Maximum Tested Version | Orchestrion support | Deprecation comment | +|---------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------|------------------------------------------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [github.com/Shopify/sarama](https://pkg.go.dev/github.com/Shopify/sarama) | [contrib/Shopify/sarama](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2) | `v1.38.1` | `v1.46.0` | :white_check_mark: | - `contrib/Shopify/sarama`: github.com/Shopify/sarama is no longer maintained. Please migrate to github.com/IBM/sarama and use the corresponding integration. This integration will be removed in a future release. | +| [github.com/aws/aws-sdk-go](https://pkg.go.dev/github.com/aws/aws-sdk-go) | [contrib/aws/aws-sdk-go](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2) | `v1.44.327` | `v1.55.8` | :white_check_mark: | - `contrib/aws/aws-sdk-go/aws`: The AWS SDK for Go v1 is deprecated. Please migrate to github.com/aws/aws-sdk-go-v2 and use the corresponding integration. This integration will be removed in a future release. | +| [github.com/globalsign/mgo](https://pkg.go.dev/github.com/globalsign/mgo) | [contrib/globalsign/mgo](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2) | `v0.0.0-20181015135952-eeefdecb41b8` | `v0.0.0-20181015135952-eeefdecb41b8` | | - `contrib/globalsign/mgo`: github.com/globalsign/mgo is unmaintained, please migrate to the official MongoDB driver https://github.com/mongodb/mongo-go-driver. This integration will be removed in a future release. | +| [gopkg.in/olivere/elastic.v5](https://pkg.go.dev/gopkg.in/olivere/elastic.v5) | [contrib/olivere/elastic.v5](https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2) | `v5.0.84` | `v5.0.86` | | - `contrib/olivere/elastic.v5`: https://github.com/olivere/elastic is deprecated. Please use the official Elasticsearch client for Go at https://github.com/elastic/go-elasticsearch and use the corresponding integration. This integration will be removed in a future release. | diff --git a/contrib/syndtr/goleveldb/go.mod b/contrib/syndtr/goleveldb/go.mod new file mode 100644 index 0000000000..b8082fcadf --- /dev/null +++ b/contrib/syndtr/goleveldb/go.mod @@ -0,0 +1,96 @@ +module github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/onsi/gomega v1.36.2 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/syndtr/goleveldb/go.sum b/contrib/syndtr/goleveldb/go.sum new file mode 100644 index 0000000000..1b8d2a6fe5 --- /dev/null +++ b/contrib/syndtr/goleveldb/go.sum @@ -0,0 +1,394 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg= +github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/syndtr/goleveldb/leveldb/example_test.go b/contrib/syndtr/goleveldb/leveldb/example_test.go index 850d40f74d..d0a7a9d09c 100644 --- a/contrib/syndtr/goleveldb/leveldb/example_test.go +++ b/contrib/syndtr/goleveldb/leveldb/example_test.go @@ -8,11 +8,14 @@ package leveldb_test import ( "context" - leveldbtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/syndtr/goleveldb/leveldb" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + leveldbtrace "github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2/leveldb" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func Example() { + tracer.Start() + defer tracer.Stop() + db, _ := leveldbtrace.OpenFile("/tmp/example.leveldb", nil) // Create a root span, giving name, server and resource. diff --git a/contrib/syndtr/goleveldb/leveldb/leveldb.go b/contrib/syndtr/goleveldb/leveldb/leveldb.go index 8047d6bf72..2a03c5c307 100644 --- a/contrib/syndtr/goleveldb/leveldb/leveldb.go +++ b/contrib/syndtr/goleveldb/leveldb/leveldb.go @@ -4,17 +4,15 @@ // Copyright 2016 Datadog, Inc. // Package leveldb provides functions to trace the syndtr/goleveldb package (https://github.com/syndtr/goleveldb). -package leveldb // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/syndtr/goleveldb/leveldb" +package leveldb // import "github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2/leveldb" import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -25,9 +23,10 @@ import ( const componentName = "syndtr/goleveldb/leveldb" +var instr *instrumentation.Instrumentation + func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/syndtr/goleveldb") + instr = instrumentation.Load(instrumentation.PackageSyndtrGoLevelDB) } // A DB wraps a leveldb.DB and traces all queries. @@ -57,7 +56,7 @@ func OpenFile(path string, o *opt.Options, opts ...Option) (*DB, error) { // WrapDB wraps a leveldb.DB so that queries are traced. func WrapDB(db *leveldb.DB, opts ...Option) *DB { cfg := newConfig(opts...) - log.Debug("contrib/syndtr/goleveldb/leveldb: Wrapping DB: %#v", cfg) + instr.Logger().Debug("contrib/syndtr/goleveldb/leveldb: Wrapping DB: %#v", cfg) return &DB{ DB: db, cfg: cfg, @@ -104,9 +103,7 @@ func (db *DB) GetSnapshot() (*Snapshot, error) { if err != nil { return nil, err } - return WrapSnapshot(snap, func(cfg *config) { - *cfg = *db.cfg - }), nil + return WrapSnapshot(snap, withConfig(db.cfg)), nil } // Has calls DB.Has and traces the result. @@ -119,9 +116,7 @@ func (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { // NewIterator calls DB.NewIterator and returns a wrapped Iterator. func (db *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - return WrapIterator(db.DB.NewIterator(slice, ro), func(cfg *config) { - *cfg = *db.cfg - }) + return WrapIterator(db.DB.NewIterator(slice, ro), withConfig(db.cfg)) } // OpenTransaction calls DB.OpenTransaction and returns a wrapped Transaction. @@ -130,9 +125,7 @@ func (db *DB) OpenTransaction() (*Transaction, error) { if err != nil { return nil, err } - return WrapTransaction(tr, func(cfg *config) { - *cfg = *db.cfg - }), nil + return WrapTransaction(tr, withConfig(db.cfg)), nil } // Put calls DB.Put and traces the result. @@ -193,9 +186,7 @@ func (snap *Snapshot) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) // NewIterator calls Snapshot.NewIterator and returns a wrapped Iterator. func (snap *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - return WrapIterator(snap.Snapshot.NewIterator(slice, ro), func(cfg *config) { - *cfg = *snap.cfg - }) + return WrapIterator(snap.Snapshot.NewIterator(slice, ro), withConfig(snap.cfg)) } // A Transaction wraps a leveldb.Transaction and traces all queries. @@ -248,15 +239,13 @@ func (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) { // NewIterator calls Transaction.NewIterator and returns a wrapped Iterator. func (tr *Transaction) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - return WrapIterator(tr.Transaction.NewIterator(slice, ro), func(cfg *config) { - *cfg = *tr.cfg - }) + return WrapIterator(tr.Transaction.NewIterator(slice, ro), withConfig(tr.cfg)) } // An Iterator wraps a leveldb.Iterator and traces until Release is called. type Iterator struct { iterator.Iterator - span ddtrace.Span + span *tracer.Span } // WrapIterator wraps a leveldb.Iterator so that queries are traced. @@ -274,8 +263,8 @@ func (it *Iterator) Release() { it.span.Finish(tracer.WithError(err)) } -func startSpan(cfg *config, name string) ddtrace.Span { - opts := []ddtrace.StartSpanOption{ +func startSpan(cfg *config, name string) *tracer.Span { + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeLevelDB), tracer.ServiceName(cfg.serviceName), tracer.ResourceName(name), diff --git a/contrib/syndtr/goleveldb/leveldb/leveldb_test.go b/contrib/syndtr/goleveldb/leveldb/leveldb_test.go index a0fe6dd631..464b4827f4 100644 --- a/contrib/syndtr/goleveldb/leveldb/leveldb_test.go +++ b/contrib/syndtr/goleveldb/leveldb/leveldb_test.go @@ -9,14 +9,12 @@ import ( "context" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/opt" "github.com/syndtr/goleveldb/leveldb/storage" @@ -24,19 +22,19 @@ import ( ) func TestDB(t *testing.T) { - testAction(t, "CompactRange", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "CompactRange", func(_ mocktracer.Tracer, db *DB) { db.CompactRange(util.Range{}) }) - testAction(t, "Delete", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Delete", func(_ mocktracer.Tracer, db *DB) { db.Delete([]byte("hello"), nil) }) - testAction(t, "Has", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Has", func(_ mocktracer.Tracer, db *DB) { db.Has([]byte("hello"), nil) }) - testAction(t, "Get", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Get", func(_ mocktracer.Tracer, db *DB) { db.Get([]byte("hello"), nil) }) @@ -55,7 +53,7 @@ func TestDB(t *testing.T) { assert.Equal(t, spans[0].TraceID(), spans[1].TraceID()) }) - testAction(t, "Write", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Write", func(_ mocktracer.Tracer, db *DB) { var batch leveldb.Batch batch.Put([]byte("hello"), []byte("world")) db.Write(&batch, nil) @@ -63,7 +61,7 @@ func TestDB(t *testing.T) { } func TestSnapshot(t *testing.T) { - testAction(t, "Get", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Get", func(_ mocktracer.Tracer, db *DB) { snapshot, err := db.GetSnapshot() assert.NoError(t, err) defer snapshot.Release() @@ -92,13 +90,13 @@ func TestSnapshot(t *testing.T) { } func TestTransaction(t *testing.T) { - testAction(t, "Commit", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Commit", func(_ mocktracer.Tracer, db *DB) { transaction, err := db.OpenTransaction() assert.NoError(t, err) transaction.Commit() }) - testAction(t, "Get", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Get", func(_ mocktracer.Tracer, db *DB) { transaction, err := db.OpenTransaction() assert.NoError(t, err) defer transaction.Discard() @@ -127,7 +125,7 @@ func TestTransaction(t *testing.T) { } func TestIterator(t *testing.T) { - testAction(t, "Iterator", func(mt mocktracer.Tracer, db *DB) { + testAction(t, "Iterator", func(_ mocktracer.Tracer, db *DB) { iterator := db.NewIterator(nil, nil) iterator.Release() }) @@ -139,7 +137,7 @@ func testAction(t *testing.T, name string, f func(mt mocktracer.Tracer, db *DB)) defer mt.Stop() db, err := Open(storage.NewMemStorage(), &opt.Options{}, - WithServiceName("my-database")) + WithService("my-database")) assert.NoError(t, err) defer db.Close() @@ -151,6 +149,7 @@ func testAction(t *testing.T, name string, f func(mt mocktracer.Tracer, db *DB)) assert.Equal(t, "my-database", spans[0].Tag(ext.ServiceName)) assert.Equal(t, name, spans[0].Tag(ext.ResourceName)) assert.Equal(t, "syndtr/goleveldb/leveldb", spans[0].Tag(ext.Component)) + assert.Equal(t, componentName, spans[0].Integration()) assert.Equal(t, ext.SpanKindClient, spans[0].Tag(ext.SpanKind)) assert.Equal(t, "leveldb", spans[0].Tag(ext.DBSystem)) }) @@ -183,9 +182,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -208,44 +205,8 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - db, err := Open(storage.NewMemStorage(), &opt.Options{}, opts...) - require.NoError(t, err) - defer db.Close() - err = db.Put([]byte("key"), []byte("value"), nil) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "leveldb.query", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "leveldb.query", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"leveldb"}, - WithDDService: []string{"leveldb"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} diff --git a/contrib/syndtr/goleveldb/leveldb/option.go b/contrib/syndtr/goleveldb/leveldb/option.go index 481e4881a1..8b8cb39888 100644 --- a/contrib/syndtr/goleveldb/leveldb/option.go +++ b/contrib/syndtr/goleveldb/leveldb/option.go @@ -9,12 +9,9 @@ import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "leveldb" - type config struct { ctx context.Context serviceName string @@ -24,40 +21,45 @@ type config struct { func newConfig(opts ...Option) *config { cfg := &config{ - serviceName: namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName), - spanName: namingschema.OpName(namingschema.LevelDBOutbound), - ctx: context.Background(), - // cfg.analyticsRate: globalconfig.AnalyticsRate(), - analyticsRate: math.NaN(), - } - if internal.BoolEnv("DD_TRACE_LEVELDB_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 + serviceName: instr.ServiceName(instrumentation.ComponentDefault, nil), + spanName: instr.OperationName(instrumentation.ComponentDefault, nil), + ctx: context.Background(), + analyticsRate: instr.AnalyticsRate(false), } for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } return cfg } -// Option represents an option that can be used customize the db tracing config. -type Option func(*config) +// Option describes options for the LevelDB integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Open, OpenFile, WrapDB, WrapIterator, WrapSnapshot and WrapTransaction. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} // WithContext sets the tracing context for the db. -func WithContext(ctx context.Context) Option { +func WithContext(ctx context.Context) OptionFn { return func(cfg *config) { cfg.ctx = ctx } } -// WithServiceName sets the given service name for the db. -func WithServiceName(serviceName string) Option { +// WithService sets the given service name for the db. +func WithService(serviceName string) OptionFn { return func(cfg *config) { cfg.serviceName = serviceName } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -69,7 +71,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -78,3 +80,9 @@ func WithAnalyticsRate(rate float64) Option { } } } + +func withConfig(cfg *config) OptionFn { + return func(c *config) { + *c = *cfg + } +} diff --git a/contrib/tidwall/buntdb/buntdb.go b/contrib/tidwall/buntdb/buntdb.go index 363a08db62..e983195f0e 100644 --- a/contrib/tidwall/buntdb/buntdb.go +++ b/contrib/tidwall/buntdb/buntdb.go @@ -10,20 +10,17 @@ import ( "math" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/tidwall/buntdb" ) -const componentName = "tidwall/buntdb" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/tidwall/buntdb") + instr = instrumentation.Load(instrumentation.PackageTidwallBuntDB) } // A DB wraps a buntdb.DB, automatically tracing any transactions. @@ -92,21 +89,21 @@ func WrapTx(tx *buntdb.Tx, opts ...Option) *Tx { cfg := new(config) defaults(cfg) for _, opt := range opts { - opt(cfg) + opt.apply(cfg) } - log.Debug("contrib/tidwall/buntdb: Wrapping Transaction: %#v", cfg) + instr.Logger().Debug("contrib/tidwall/buntdb: Wrapping Transaction: %#v", cfg) return &Tx{ Tx: tx, cfg: cfg, } } -func (tx *Tx) startSpan(name string) ddtrace.Span { - opts := []ddtrace.StartSpanOption{ +func (tx *Tx) startSpan(name string) *tracer.Span { + opts := []tracer.StartSpanOption{ tracer.SpanType(ext.AppTypeDB), tracer.ServiceName(tx.cfg.serviceName), tracer.ResourceName(name), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageTidwallBuntDB), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(ext.DBSystem, ext.DBSystemBuntDB), } diff --git a/contrib/tidwall/buntdb/buntdb_test.go b/contrib/tidwall/buntdb/buntdb_test.go index 8f75ef7816..94179355a8 100644 --- a/contrib/tidwall/buntdb/buntdb_test.go +++ b/contrib/tidwall/buntdb/buntdb_test.go @@ -10,14 +10,13 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "github.com/tidwall/buntdb" ) @@ -324,7 +323,7 @@ func TestLen(t *testing.T) { func TestNearby(t *testing.T) { testView(t, "Nearby", func(tx *Tx) error { var arr []string - err := tx.Nearby("test-spatial-index", "[3 3]", func(key, value string, distance float64) bool { + err := tx.Nearby("test-spatial-index", "[3 3]", func(key, value string, _ float64) bool { arr = append(arr, key, value) return false }) @@ -384,9 +383,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -409,52 +406,12 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - db, err := Open(":memory:", opts...) - require.NoError(t, err) - defer db.Close() - - err = db.Update(func(tx *Tx) error { - _, _, err := tx.Set("key", "value", nil) - return err - }) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "buntdb.query", spans[0].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 1) - assert.Equal(t, "buntdb.query", spans[0].OperationName()) - } - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"buntdb"}, - WithDDService: []string{"buntdb"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} - func testUpdate(t *testing.T, name string, f func(tx *Tx) error) { mt := mocktracer.Start() defer mt.Stop() @@ -476,6 +433,7 @@ func testUpdate(t *testing.T, name string, f func(tx *Tx) error) { assert.Equal(t, "buntdb", spans[0].Tag(ext.ServiceName)) assert.Equal(t, "buntdb.query", spans[0].OperationName()) assert.Equal(t, "tidwall/buntdb", spans[0].Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageTidwallBuntDB), spans[0].Integration()) assert.Equal(t, ext.SpanKindClient, spans[0].Tag(ext.SpanKind)) assert.Equal(t, "buntdb", spans[0].Tag(ext.DBSystem)) } @@ -497,6 +455,7 @@ func testView(t *testing.T, name string, f func(tx *Tx) error) { assert.Equal(t, "buntdb", spans[0].Tag(ext.ServiceName)) assert.Equal(t, "buntdb.query", spans[0].OperationName()) assert.Equal(t, "tidwall/buntdb", spans[0].Tag(ext.Component)) + assert.Equal(t, string(instrumentation.PackageTidwallBuntDB), spans[0].Integration()) assert.Equal(t, ext.SpanKindClient, spans[0].Tag(ext.SpanKind)) assert.Equal(t, "buntdb", spans[0].Tag(ext.DBSystem)) } diff --git a/contrib/tidwall/buntdb/example_test.go b/contrib/tidwall/buntdb/example_test.go index d17c460a20..1741e91f4b 100644 --- a/contrib/tidwall/buntdb/example_test.go +++ b/contrib/tidwall/buntdb/example_test.go @@ -9,11 +9,14 @@ import ( "context" "log" - buntdbtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/tidwall/buntdb" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + buntdbtrace "github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) func Example() { + tracer.Start() + defer tracer.Stop() + db, err := buntdbtrace.Open(":memory:") if err != nil { log.Fatal(err) diff --git a/contrib/tidwall/buntdb/go.mod b/contrib/tidwall/buntdb/go.mod new file mode 100644 index 0000000000..62c441b586 --- /dev/null +++ b/contrib/tidwall/buntdb/go.mod @@ -0,0 +1,100 @@ +module github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/tidwall/buntdb v1.3.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tidwall/btree v1.6.0 // indirect + github.com/tidwall/gjson v1.16.0 // indirect + github.com/tidwall/grect v0.1.4 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/rtred v0.1.2 // indirect + github.com/tidwall/tinyqueue v0.1.1 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/tidwall/buntdb/go.sum b/contrib/tidwall/buntdb/go.sum new file mode 100644 index 0000000000..81c8b89c89 --- /dev/null +++ b/contrib/tidwall/buntdb/go.sum @@ -0,0 +1,331 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= +github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/buntdb v1.3.0 h1:gdhWO+/YwoB2qZMeAU9JcWWsHSYU3OvcieYgFRS0zwA= +github.com/tidwall/buntdb v1.3.0/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg= +github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/grect v0.1.4 h1:dA3oIgNgWdSspFzn1kS4S/RDpZFLrIxAZOdJKjYapOg= +github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q= +github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8= +github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/rtred v0.1.2 h1:exmoQtOLvDoO8ud++6LwVsAMTu0KPzLTUrMln8u1yu8= +github.com/tidwall/rtred v0.1.2/go.mod h1:hd69WNXQ5RP9vHd7dqekAz+RIdtfBogmglkZSRxCHFQ= +github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaymYE= +github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q096fQP5zMYw= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/tidwall/buntdb/option.go b/contrib/tidwall/buntdb/option.go index 0d25a5a21c..9cb660a4aa 100644 --- a/contrib/tidwall/buntdb/option.go +++ b/contrib/tidwall/buntdb/option.go @@ -9,12 +9,9 @@ import ( "context" "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "buntdb" - type config struct { ctx context.Context serviceName string @@ -23,36 +20,40 @@ type config struct { } func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) - cfg.spanName = namingschema.OpName(namingschema.BuntDBOutbound) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentDefault, nil) + cfg.analyticsRate = instr.AnalyticsRate(false) cfg.ctx = context.Background() - // cfg.analyticsRate = globalconfig.AnalyticsRate() - if internal.BoolEnv("DD_TRACE_BUNTDB_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } } -// An Option customizes the config. -type Option func(cfg *config) +// Option describes options for the BuntDB integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to Open, WrapDB and WrapTx. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} // WithContext sets the context for the transaction. -func WithContext(ctx context.Context) Option { +func WithContext(ctx context.Context) OptionFn { return func(cfg *config) { cfg.ctx = ctx } } -// WithServiceName sets the given service name for the transaction. -func WithServiceName(serviceName string) Option { +// WithService sets the given service name for the transaction. +func WithService(serviceName string) OptionFn { return func(cfg *config) { cfg.serviceName = serviceName } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -64,7 +65,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/twitchtv/twirp/example_test.go b/contrib/twitchtv/twirp/example_test.go index c1a593dd96..17ecd8d8dc 100644 --- a/contrib/twitchtv/twirp/example_test.go +++ b/contrib/twitchtv/twirp/example_test.go @@ -10,8 +10,8 @@ import ( "fmt" "net/http" - twirptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/twitchtv/twirp" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + twirptrace "github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/twitchtv/twirp/example" ) diff --git a/contrib/twitchtv/twirp/go.mod b/contrib/twitchtv/twirp/go.mod new file mode 100644 index 0000000000..3e0d77823e --- /dev/null +++ b/contrib/twitchtv/twirp/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/twitchtv/twirp v8.1.3+incompatible +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/twitchtv/twirp/go.sum b/contrib/twitchtv/twirp/go.sum new file mode 100644 index 0000000000..011a1266ff --- /dev/null +++ b/contrib/twitchtv/twirp/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/twitchtv/twirp v8.1.3+incompatible h1:+F4TdErPgSUbMZMwp13Q/KgDVuI7HJXP61mNV3/7iuU= +github.com/twitchtv/twirp v8.1.3+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/twitchtv/twirp/option.go b/contrib/twitchtv/twirp/option.go index 1946c123cf..8fac768cbd 100644 --- a/contrib/twitchtv/twirp/option.go +++ b/contrib/twitchtv/twirp/option.go @@ -8,14 +8,7 @@ package twirp import ( "math" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -const ( - defaultClientServiceName = "twirp-client" - defaultServerServiceName = "twirp-server" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) type config struct { @@ -24,40 +17,45 @@ type config struct { analyticsRate float64 } -// Option represents an option that can be passed to Dial. -type Option func(*config) +// Option describes options for the Twirp integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to NewServerHooks, WrapClient and WrapServer. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - if internal.BoolEnv("DD_TRACE_TWIRP_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } + cfg.analyticsRate = instr.AnalyticsRate(true) } func clientDefaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultClientServiceName) - cfg.spanName = namingschema.OpName(namingschema.TwirpClient) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentClient, nil) + cfg.spanName = instr.OperationName(instrumentation.ComponentClient, nil) defaults(cfg) } func serverDefaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServerServiceName) + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) // spanName is calculated dynamically since V0 span names are based on the twirp service name. defaults(cfg) } -// WithServiceName sets the given service name for the dialled connection. +// WithService sets the given service name for the dialled connection. // When the service name is not explicitly set, it will be inferred based on the // request to the twirp service. -func WithServiceName(name string) Option { +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { if on { return WithAnalyticsRate(1.0) } @@ -66,7 +64,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate diff --git a/contrib/twitchtv/twirp/orchestrion.yml b/contrib/twitchtv/twirp/orchestrion.yml new file mode 100644 index 0000000000..47caeb8b9b --- /dev/null +++ b/contrib/twitchtv/twirp/orchestrion.yml @@ -0,0 +1,47 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 + description: |- + A simple RPC framework with protobuf service definitions. + + ### Details & Caveats + - This instrumentation currently uses the wrappers from the dd-trace-go `contrib/net/http` package, not the + ones from `contrib/twitchtv/twirp`. + - The server-side instrumentation additionally adds rpc / twirp specific spans using `*twirp.ServerHooks`. + - Currently, the `*twirp.ClientHooks` implementation is not available in dd-trace-go, so the only generated spans are + the ones from `net/http`. + +aspects: + # TODO: Client Instrumentation - dd-trace-go does not have a *twirp.ClientHooks implementation for now. + + # Server Instrumentation + - id: Server + join-point: + struct-literal: + type: github.com/twitchtv/twirp.ServerOptions + match: any + advice: + - wrap-expression: + imports: + twirp: github.com/twitchtv/twirp + twirptrace: github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 + template: |- + {{- .AST.Type -}}{ + {{- $hasField := false -}} + {{ range .AST.Elts }} + {{- if eq .Key.Name "Hooks" }} + {{- $hasField = true -}} + Hooks: twirp.ChainHooks(twirptrace.NewServerHooks(), {{ .Value }}), + {{- else -}} + {{ . }}, + {{ end -}} + {{ end }} + {{- if not $hasField -}} + Hooks: twirptrace.NewServerHooks(), + {{- end }} + } diff --git a/contrib/twitchtv/twirp/twirp.go b/contrib/twitchtv/twirp/twirp.go index 19515575f5..5b0274b8f3 100644 --- a/contrib/twitchtv/twirp/twirp.go +++ b/contrib/twitchtv/twirp/twirp.go @@ -5,7 +5,7 @@ // Package twirp provides tracing functions for tracing clients and servers generated // by the twirp framework (https://github.com/twitchtv/twirp). -package twirp // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/twitchtv/twirp" +package twirp // import "github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2" import ( "context" @@ -14,20 +14,19 @@ import ( "net/http" "strconv" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/twitchtv/twirp" ) -const componentName = "twitchtv/twirp" +const component = instrumentation.PackageTwitchTVTwirp + +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/twitchtv/twirp") + instr = instrumentation.Load(component) } type ( @@ -52,9 +51,9 @@ func WrapClient(c HTTPClient, opts ...Option) HTTPClient { cfg := new(config) clientDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/twitchtv/twirp: Wrapping Client: %#v", cfg) + instr.Logger().Debug("contrib/twitchtv/twirp: Wrapping Client: %#v", cfg) return &wrappedClient{c: c, cfg: cfg} } @@ -64,7 +63,7 @@ func (wc *wrappedClient) Do(req *http.Request) (*http.Response, error) { tracer.ServiceName(wc.cfg.serviceName), tracer.Tag(ext.HTTPMethod, req.Method), tracer.Tag(ext.HTTPURL, req.URL.Path), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, component), tracer.Tag(ext.SpanKind, ext.SpanKindClient), tracer.Tag(ext.RPCSystem, ext.RPCSystemTwirp), } @@ -90,6 +89,10 @@ func (wc *wrappedClient) Do(req *http.Request) (*http.Response, error) { opts = append(opts, tracer.Tag(ext.EventSampleRate, wc.cfg.analyticsRate)) } if spanctx, err := tracer.Extract(tracer.HTTPHeadersCarrier(req.Header)); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + opts = append(opts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } opts = append(opts, tracer.ChildOf(spanctx)) } @@ -98,7 +101,7 @@ func (wc *wrappedClient) Do(req *http.Request) (*http.Response, error) { err := tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header)) if err != nil { - log.Warn("contrib/twitchtv/twirp.wrappedClient: failed to inject http headers: %v\n", err) + instr.Logger().Warn("contrib/twitchtv/twirp.wrappedClient: failed to inject http headers: %s\n", err.Error()) } req = req.WithContext(ctx) @@ -121,16 +124,16 @@ func WrapServer(h http.Handler, opts ...Option) http.Handler { cfg := new(config) serverDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/twitchtv/twirp: Wrapping Server: %#v", cfg) + instr.Logger().Debug("contrib/twitchtv/twirp: Wrapping Server: %#v", cfg) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { spanOpts := []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeWeb), tracer.ServiceName(cfg.serviceName), tracer.Tag(ext.HTTPMethod, r.Method), tracer.Tag(ext.HTTPURL, r.URL.Path), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, component), tracer.Tag(ext.SpanKind, ext.SpanKindServer), tracer.Tag(ext.RPCSystem, ext.RPCSystemTwirp), tracer.Measured(), @@ -139,6 +142,10 @@ func WrapServer(h http.Handler, opts ...Option) http.Handler { spanOpts = append(spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } if spanctx, err := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if spanctx != nil && spanctx.SpanLinks() != nil { + spanOpts = append(spanOpts, tracer.WithSpanLinks(spanctx.SpanLinks())) + } spanOpts = append(spanOpts, tracer.ChildOf(spanctx)) } span, ctx := tracer.StartSpanFromContext(r.Context(), "twirp.handler", spanOpts...) @@ -155,9 +162,9 @@ func NewServerHooks(opts ...Option) *twirp.ServerHooks { cfg := new(config) serverDefaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - log.Debug("contrib/twitchtv/twirp: Creating Server Hooks: %#v", cfg) + instr.Logger().Debug("contrib/twitchtv/twirp: Creating Server Hooks: %#v", cfg) return &twirp.ServerHooks{ RequestReceived: requestReceivedHook(cfg), RequestRouted: requestRoutedHook(), @@ -168,11 +175,16 @@ func NewServerHooks(opts ...Option) *twirp.ServerHooks { } func serverSpanName(ctx context.Context) string { - serviceNameV0 := "twirp.service" + rpcService := "" if svc, ok := twirp.ServiceName(ctx); ok { - serviceNameV0 = fmt.Sprintf("twirp.%s", svc) + rpcService = svc } - return namingschema.OpNameOverrideV0(namingschema.TwirpServer, serviceNameV0) + return instr.OperationName( + instrumentation.ComponentServer, + instrumentation.OperationContext{ + ext.RPCService: rpcService, + }, + ) } func requestReceivedHook(cfg *config) func(context.Context) (context.Context, error) { @@ -181,7 +193,7 @@ func requestReceivedHook(cfg *config) func(context.Context) (context.Context, er tracer.SpanType(ext.SpanTypeWeb), tracer.ServiceName(cfg.serviceName), tracer.Measured(), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, component), tracer.Tag(ext.RPCSystem, ext.RPCSystemTwirp), } if pkg, ok := twirp.PackageName(ctx); ok { @@ -198,7 +210,6 @@ func requestReceivedHook(cfg *config) func(context.Context) (context.Context, er opts = append(opts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) } span, ctx := tracer.StartSpanFromContext(ctx, serverSpanName(ctx), opts...) - ctx = context.WithValue(ctx, twirpSpanKey{}, span) return ctx, nil } @@ -208,12 +219,12 @@ func requestRoutedHook() func(context.Context) (context.Context, error) { return func(ctx context.Context) (context.Context, error) { maybeSpan := ctx.Value(twirpSpanKey{}) if maybeSpan == nil { - log.Error("contrib/twitchtv/twirp.requestRoutedHook: found no span in context") + instr.Logger().Error("contrib/twitchtv/twirp.requestRoutedHook: found no span in context") return ctx, nil } - span, ok := maybeSpan.(tracer.Span) + span, ok := maybeSpan.(*tracer.Span) if !ok { - log.Error("contrib/twitchtv/twirp.requestRoutedHook: found invalid span type in context") + instr.Logger().Error("contrib/twitchtv/twirp.requestRoutedHook: found invalid span type in context") return ctx, nil } if method, ok := twirp.MethodName(ctx); ok { @@ -237,7 +248,7 @@ func responseSentHook() func(context.Context) { if maybeSpan == nil { return } - span, ok := maybeSpan.(tracer.Span) + span, ok := maybeSpan.(*tracer.Span) if !ok { return } diff --git a/contrib/twitchtv/twirp/twirp_test.go b/contrib/twitchtv/twirp/twirp_test.go index b8100b8f01..108da9d30d 100644 --- a/contrib/twitchtv/twirp/twirp_test.go +++ b/contrib/twitchtv/twirp/twirp_test.go @@ -12,11 +12,11 @@ import ( "net/http" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -73,7 +73,7 @@ func TestClient(t *testing.T) { assert.NoError(err) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) assert.Equal("twirp.request", span.OperationName()) @@ -83,6 +83,7 @@ func TestClient(t *testing.T) { assert.Equal("Method", span.Tag("twirp.method")) assert.Equal("200", span.Tag(ext.HTTPCode)) assert.Equal("twitchtv/twirp", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageTwitchTVTwirp), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("twirp", span.Tag(ext.RPCSystem)) assert.Equal("Example", span.Tag(ext.RPCService)) @@ -104,7 +105,7 @@ func TestClient(t *testing.T) { assert.NoError(err) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) assert.Equal("twirp.request", span.OperationName()) @@ -113,8 +114,9 @@ func TestClient(t *testing.T) { assert.Equal("Example", span.Tag("twirp.service")) assert.Equal("Method", span.Tag("twirp.method")) assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal(true, span.Tag(ext.Error).(bool)) + assert.Equal("500: Internal Server Error", span.Tag(ext.ErrorMsg)) assert.Equal("twitchtv/twirp", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageTwitchTVTwirp), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("twirp", span.Tag(ext.RPCSystem)) assert.Equal("Example", span.Tag(ext.RPCService)) @@ -136,7 +138,7 @@ func TestClient(t *testing.T) { assert.Equal(context.DeadlineExceeded, err) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] assert.Equal(ext.SpanTypeHTTP, span.Tag(ext.SpanType)) assert.Equal("twirp.request", span.OperationName()) @@ -144,8 +146,9 @@ func TestClient(t *testing.T) { assert.Equal("twirp.test", span.Tag("twirp.package")) assert.Equal("Example", span.Tag("twirp.service")) assert.Equal("Method", span.Tag("twirp.method")) - assert.Equal(context.DeadlineExceeded, span.Tag(ext.Error)) + assert.Equal(context.DeadlineExceeded.Error(), span.Tag(ext.ErrorMsg)) assert.Equal("twitchtv/twirp", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageTwitchTVTwirp), span.Integration()) assert.Equal(ext.SpanKindClient, span.Tag(ext.SpanKind)) assert.Equal("twirp", span.Tag(ext.RPCSystem)) assert.Equal("Example", span.Tag(ext.RPCService)) @@ -178,7 +181,7 @@ func mockServer(hooks *twirp.ServerHooks, assert *assert.Assertions, twerr twirp func TestServerHooks(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - hooks := NewServerHooks(WithServiceName("twirp-test"), WithAnalytics(true)) + hooks := NewServerHooks(WithService("twirp-test"), WithAnalytics(true)) t.Run("success", func(t *testing.T) { defer mt.Reset() @@ -187,7 +190,7 @@ func TestServerHooks(t *testing.T) { mockServer(hooks, assert, nil) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) assert.Equal("twirp-test", span.Tag(ext.ServiceName)) @@ -197,6 +200,7 @@ func TestServerHooks(t *testing.T) { assert.Equal("Method", span.Tag("twirp.method")) assert.Equal("200", span.Tag(ext.HTTPCode)) assert.Equal("twitchtv/twirp", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageTwitchTVTwirp), span.Integration()) assert.Equal("twirp", span.Tag(ext.RPCSystem)) assert.Equal("Example", span.Tag(ext.RPCService)) assert.Equal("Method", span.Tag(ext.RPCMethod)) @@ -209,7 +213,7 @@ func TestServerHooks(t *testing.T) { mockServer(hooks, assert, twirp.InternalError("something bad or unexpected happened")) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) span := spans[0] assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) assert.Equal("twirp-test", span.Tag(ext.ServiceName)) @@ -218,8 +222,9 @@ func TestServerHooks(t *testing.T) { assert.Equal("Example", span.Tag("twirp.service")) assert.Equal("Method", span.Tag("twirp.method")) assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal("twirp error internal: something bad or unexpected happened", span.Tag(ext.Error).(error).Error()) + assert.Equal("twirp error internal: something bad or unexpected happened", span.Tag(ext.ErrorMsg)) assert.Equal("twitchtv/twirp", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageTwitchTVTwirp), span.Integration()) assert.Equal("twirp", span.Tag(ext.RPCSystem)) assert.Equal("Example", span.Tag(ext.RPCService)) assert.Equal("Method", span.Tag(ext.RPCMethod)) @@ -245,7 +250,7 @@ func TestServerHooks(t *testing.T) { mockServer(twirp.ChainHooks(hooks, otherHooks), assert, twirp.InternalError("something bad or unexpected happened")) spans := mt.FinishedSpans() - assert.Len(spans, 2) + require.Len(t, spans, 2) span := spans[0] assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) assert.Equal("twirp-test", span.Tag(ext.ServiceName)) @@ -254,8 +259,9 @@ func TestServerHooks(t *testing.T) { assert.Equal("Example", span.Tag("twirp.service")) assert.Equal("Method", span.Tag("twirp.method")) assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal("twirp error internal: something bad or unexpected happened", span.Tag(ext.Error).(error).Error()) + assert.Equal("twirp error internal: something bad or unexpected happened", span.Tag(ext.ErrorMsg)) assert.Equal("twitchtv/twirp", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageTwitchTVTwirp), span.Integration()) assert.Equal("twirp", span.Tag(ext.RPCSystem)) assert.Equal("Example", span.Tag(ext.RPCService)) assert.Equal("Method", span.Tag(ext.RPCMethod)) @@ -272,7 +278,7 @@ func TestAnalyticsSettings(t *testing.T) { mockServer(hooks, assert, nil) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) s := spans[0] assert.Equal(rate, s.Tag(ext.EventSampleRate)) } @@ -288,10 +294,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -313,10 +316,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } @@ -328,7 +328,7 @@ func TestServiceNameSettings(t *testing.T) { mockServer(hooks, assert, nil) spans := mt.FinishedSpans() - assert.Len(spans, 1) + require.Len(t, spans, 1) s := spans[0] assert.Equal(serviceName, s.Tag(ext.ServiceName)) } @@ -344,10 +344,7 @@ func TestServiceNameSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - svc := globalconfig.ServiceName() - defer globalconfig.SetServiceName(svc) - globalconfig.SetServiceName("service.global") - + testutils.SetGlobalServiceName(t, "service.global") assertServiceName(t, mt, "service.global") }) @@ -355,11 +352,8 @@ func TestServiceNameSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - svc := globalconfig.ServiceName() - defer globalconfig.SetServiceName(svc) - globalconfig.SetServiceName("service.global") - - assertServiceName(t, mt, "service.local", WithServiceName("service.local")) + testutils.SetGlobalServiceName(t, "service.global") + assertServiceName(t, mt, "service.local", WithService("service.local")) }) } @@ -395,45 +389,6 @@ func TestHaberdash(t *testing.T) { assert.Equal(ext.SpanTypeHTTP, spans[2].Tag(ext.SpanType)) } -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - client, cleanup := startIntegrationTestServer(t, opts...) - defer cleanup() - _, err := client.MakeHat(context.Background(), &example.Size{Inches: 6}) - require.NoError(t, err) - - return mt.FinishedSpans() - }) - assertOpV0 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 3) - assert.Equal(t, "twirp.Haberdasher", spans[0].OperationName()) - assert.Equal(t, "twirp.handler", spans[1].OperationName()) - assert.Equal(t, "twirp.request", spans[2].OperationName()) - } - assertOpV1 := func(t *testing.T, spans []mocktracer.Span) { - require.Len(t, spans, 3) - assert.Equal(t, "twirp.server.request", spans[0].OperationName()) - assert.Equal(t, "twirp.handler", spans[1].OperationName()) - assert.Equal(t, "twirp.client.request", spans[2].OperationName()) - } - ddService := namingschematest.TestDDService - serviceOverride := namingschematest.TestServiceOverride - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"twirp-server", "twirp-server", "twirp-client"}, - WithDDService: []string{ddService, ddService, ddService}, - WithDDServiceAndOverride: []string{serviceOverride, serviceOverride, serviceOverride}, - } - t.Run("ServiceName", namingschematest.NewServiceNameTest(genSpans, wantServiceNameV0)) - t.Run("SpanName", namingschematest.NewSpanNameTest(genSpans, assertOpV0, assertOpV1)) -} - type haberdasher int32 func (h haberdasher) MakeHat(_ context.Context, size *example.Size) (*example.Hat, error) { diff --git a/contrib/uptrace/bun/bun.go b/contrib/uptrace/bun/bun.go index 9384806d65..88f0773a6c 100644 --- a/contrib/uptrace/bun/bun.go +++ b/contrib/uptrace/bun/bun.go @@ -9,23 +9,17 @@ package bun import ( "context" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" ) -const ( - componentName = "uptrace/bun" - defaultServiceName = "bun.db" -) +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/uptrace/bun") + instr = instrumentation.Load(instrumentation.PackageUptraceBun) } // Wrap augments the given DB with tracing. @@ -35,7 +29,7 @@ func Wrap(db *bun.DB, opts ...Option) { for _, opt := range opts { opt(cfg) } - log.Debug("contrib/uptrace/bun: Wrapping Database") + instr.Logger().Debug("contrib/uptrace/bun: Wrapping Database") db.AddQueryHook(&queryHook{cfg: cfg}) } @@ -60,11 +54,11 @@ func (qh *queryHook) BeforeQuery(ctx context.Context, qe *bun.QueryEvent) contex } var ( query = qe.Query - opts = []ddtrace.StartSpanOption{ + opts = []tracer.StartSpanOption{ tracer.SpanType(ext.SpanTypeSQL), tracer.ResourceName(string(query)), tracer.ServiceName(qh.cfg.serviceName), - tracer.Tag(ext.Component, componentName), + tracer.Tag(ext.Component, instrumentation.PackageUptraceBun), tracer.Tag(ext.DBSystem, dbSystem), } ) diff --git a/contrib/uptrace/bun/bun_test.go b/contrib/uptrace/bun/bun_test.go index 998aab18f8..c9fd017e01 100644 --- a/contrib/uptrace/bun/bun_test.go +++ b/contrib/uptrace/bun/bun_test.go @@ -12,10 +12,11 @@ import ( "os" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" @@ -112,6 +113,7 @@ func TestSelect(t *testing.T) { assert.Equal("bun.query", spans[0].OperationName()) assert.Equal("http.request", spans[1].OperationName()) assert.Equal("uptrace/bun", spans[0].Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageUptraceBun), spans[0].Integration()) assert.Equal(ext.DBSystemOtherSQL, spans[0].Tag(ext.DBSystem)) mt.Reset() }) @@ -146,14 +148,13 @@ func TestServiceName(t *testing.T) { assert.Equal("bun.db", spans[0].Tag(ext.ServiceName)) assert.Equal("fake-http-server", spans[1].Tag(ext.ServiceName)) assert.Equal("uptrace/bun", spans[0].Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageUptraceBun), spans[0].Integration()) assert.Equal(ext.DBSystemOtherSQL, spans[0].Tag(ext.DBSystem)) assert.Equal(spans[0].ParentID(), spans[1].SpanID()) }) t.Run("global", func(t *testing.T) { - prevName := globalconfig.ServiceName() - defer globalconfig.SetServiceName(prevName) - globalconfig.SetServiceName("global-service") + testutils.SetGlobalServiceName(t, "global-service") assert := assert.New(t) mt := mocktracer.Start() @@ -181,6 +182,7 @@ func TestServiceName(t *testing.T) { assert.Equal("global-service", spans[0].Tag(ext.ServiceName)) assert.Equal("fake-http-server", spans[1].Tag(ext.ServiceName)) assert.Equal("uptrace/bun", spans[0].Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageUptraceBun), spans[0].Integration()) assert.Equal(ext.DBSystemOtherSQL, spans[0].Tag(ext.DBSystem)) }) @@ -211,6 +213,7 @@ func TestServiceName(t *testing.T) { assert.Equal("my-service-name", spans[0].Tag(ext.ServiceName)) assert.Equal("fake-http-server", spans[1].Tag(ext.ServiceName)) assert.Equal("uptrace/bun", spans[0].Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageUptraceBun), spans[0].Integration()) assert.Equal(ext.DBSystemOtherSQL, spans[0].Tag(ext.DBSystem)) }) } diff --git a/contrib/uptrace/bun/example_test.go b/contrib/uptrace/bun/example_test.go index 4c29f6c71b..d08832df3d 100644 --- a/contrib/uptrace/bun/example_test.go +++ b/contrib/uptrace/bun/example_test.go @@ -9,13 +9,17 @@ import ( "context" "database/sql" + buntrace "github.com/DataDog/dd-trace-go/contrib/uptrace/bun/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/sqlitedialect" - buntrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/uptrace/bun" _ "modernc.org/sqlite" ) func Example() { + tracer.Start() + defer tracer.Stop() + sqlite, err := sql.Open("sqlite", "file::memory:?cache=shared") if err != nil { panic(err) diff --git a/contrib/uptrace/bun/go.mod b/contrib/uptrace/bun/go.mod new file mode 100644 index 0000000000..668d595409 --- /dev/null +++ b/contrib/uptrace/bun/go.mod @@ -0,0 +1,122 @@ +module github.com/DataDog/dd-trace-go/contrib/uptrace/bun/v2 + +go 1.24.0 + +godebug x509negativeserial=1 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/go-sql-driver/mysql v1.6.0 + github.com/lib/pq v1.10.2 + github.com/microsoft/go-mssqldb v0.21.0 + github.com/stretchr/testify v1.11.1 + github.com/uptrace/bun v1.1.17 + github.com/uptrace/bun/dialect/sqlitedialect v1.1.17 + modernc.org/sqlite v1.28.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang-sql/sqlexp v0.1.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-sqlite3 v1.14.18 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + lukechampine.com/uint128 v1.3.0 // indirect + modernc.org/cc/v3 v3.41.0 // indirect + modernc.org/ccgo/v3 v3.16.15 // indirect + modernc.org/libc v1.37.6 // indirect + modernc.org/mathutil v1.6.0 // indirect + modernc.org/memory v1.7.2 // indirect + modernc.org/opt v0.1.3 // indirect + modernc.org/strutil v1.2.0 // indirect + modernc.org/token v1.1.0 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/uptrace/bun/go.sum b/contrib/uptrace/bun/go.sum new file mode 100644 index 0000000000..e29f826cb0 --- /dev/null +++ b/contrib/uptrace/bun/go.sum @@ -0,0 +1,421 @@ +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= +github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= +github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= +github.com/uptrace/bun v1.1.17 h1:qxBaEIo0hC/8O3O6GrMDKxqyT+mw5/s0Pn/n6xjyGIk= +github.com/uptrace/bun v1.1.17/go.mod h1:hATAzivtTIRsSJR4B8AXR+uABqnQxr3myKDKEf5iQ9U= +github.com/uptrace/bun/dialect/sqlitedialect v1.1.17 h1:i8NFU9r8YuavNFaYlNqi4ppn+MgoHtqLgpWQDrVTjm0= +github.com/uptrace/bun/dialect/sqlitedialect v1.1.17/go.mod h1:YF0FO4VVnY9GHNH6rM4r3STlVEBxkOc6L88Bm5X5mzA= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= diff --git a/contrib/uptrace/bun/option.go b/contrib/uptrace/bun/option.go index 586778671a..d82137d01c 100644 --- a/contrib/uptrace/bun/option.go +++ b/contrib/uptrace/bun/option.go @@ -5,9 +5,7 @@ package bun -import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" -) +import "github.com/DataDog/dd-trace-go/v2/instrumentation" type config struct { serviceName string @@ -17,11 +15,7 @@ type config struct { type Option func(*config) func defaults(cfg *config) { - service := defaultServiceName - if svc := globalconfig.ServiceName(); svc != "" { - service = svc - } - cfg.serviceName = service + cfg.serviceName = instr.ServiceName(instrumentation.ComponentDefault, nil) } // WithService sets the given service name for the client. diff --git a/contrib/urfave/negroni/example_test.go b/contrib/urfave/negroni/example_test.go index ad2057ecc4..ad2ecf142b 100644 --- a/contrib/urfave/negroni/example_test.go +++ b/contrib/urfave/negroni/example_test.go @@ -7,8 +7,8 @@ package negroni_test import ( "net/http" - negronitrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/urfave/negroni" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + negronitrace "github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/urfave/negroni" ) @@ -47,7 +47,7 @@ func Example_withServiceName() { n := negroni.New() // Use the tracer middleware with your desired service name. - n.Use(negronitrace.Middleware(negronitrace.WithServiceName("negroni-server"))) + n.Use(negronitrace.Middleware(negronitrace.WithService("negroni-server"))) // Set up some endpoints. mux := http.NewServeMux() diff --git a/contrib/urfave/negroni/go.mod b/contrib/urfave/negroni/go.mod new file mode 100644 index 0000000000..e46e36190e --- /dev/null +++ b/contrib/urfave/negroni/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/urfave/negroni v1.0.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/urfave/negroni/go.sum b/contrib/urfave/negroni/go.sum new file mode 100644 index 0000000000..4d49cb7987 --- /dev/null +++ b/contrib/urfave/negroni/go.sum @@ -0,0 +1,311 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/urfave/negroni/negroni.go b/contrib/urfave/negroni/negroni.go index 2659d568f7..72740e5fcb 100644 --- a/contrib/urfave/negroni/negroni.go +++ b/contrib/urfave/negroni/negroni.go @@ -11,21 +11,21 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/httptrace" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" "github.com/urfave/negroni" ) -const componentName = "urfave/negroni" +const component = instrumentation.PackageUrfaveNegroni + +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/urfave/negroni") + instr = instrumentation.Load(instrumentation.PackageUrfaveNegroni) } // DatadogMiddleware returns middleware that will trace incoming requests. @@ -34,7 +34,7 @@ type DatadogMiddleware struct { } func (m *DatadogMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - opts := options.Copy(m.cfg.spanOpts...) // opts must be a copy of m.cfg.spanOpts, locally scoped, to avoid races. + opts := options.Expand(m.cfg.spanOpts, 0, 4) // opts must be a copy of m.cfg.spanOpts, locally scoped, to avoid races. opts = append(opts, tracer.ServiceName(m.cfg.serviceName), tracer.ResourceName(m.cfg.resourceNamer(r)), @@ -42,7 +42,7 @@ func (m *DatadogMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, ne if !math.IsNaN(m.cfg.analyticsRate) { opts = append(opts, tracer.Tag(ext.EventSampleRate, m.cfg.analyticsRate)) } - span, ctx := httptrace.StartRequestSpan(r, opts...) + _, ctx, finishSpans := httptrace.StartRequestSpan(r, opts...) defer func() { // check if the responseWriter is of type negroni.ResponseWriter var ( @@ -56,7 +56,7 @@ func (m *DatadogMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request, ne opts = []tracer.FinishOption{tracer.WithError(fmt.Errorf("%d: %s", status, http.StatusText(status)))} } } - httptrace.FinishRequestSpan(span, status, opts...) + finishSpans(status, m.cfg.isStatusError, opts...) }() next(w, r.WithContext(ctx)) @@ -67,11 +67,11 @@ func Middleware(opts ...Option) *DatadogMiddleware { cfg := new(config) defaults(cfg) for _, fn := range opts { - fn(cfg) + fn.apply(cfg) } - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) + cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, component)) cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - log.Debug("contrib/urgave/negroni: Configuring Middleware: %#v", cfg) + instr.Logger().Debug("contrib/urgave/negroni: Configuring Middleware: %#v", cfg) m := DatadogMiddleware{ cfg: cfg, diff --git a/contrib/urfave/negroni/negroni_test.go b/contrib/urfave/negroni/negroni_test.go index 2fc7c91340..55acf31265 100644 --- a/contrib/urfave/negroni/negroni_test.go +++ b/contrib/urfave/negroni/negroni_test.go @@ -14,15 +14,13 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "github.com/urfave/negroni" ) @@ -49,7 +47,7 @@ func TestChildSpan(t *testing.T) { func TestWithHeaderTags(t *testing.T) { setupReq := func(opts ...Option) *http.Request { mux := http.NewServeMux() - mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/test", func(w http.ResponseWriter, _ *http.Request) { w.Write([]byte("test")) }) router := negroni.New() @@ -67,40 +65,42 @@ func TestWithHeaderTags(t *testing.T) { t.Run("default-off", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - htArgs := []string{"h!e@a-d.e*r", "2header", "3header"} + headerTags := instrumentation.NewHeaderTags([]string{"h!e@a-d.e*r", "2header", "3header", "x-datadog-header"}) setupReq() spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - _, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.NotContains(s.Tags(), tag) - } + }) }) t.Run("integration", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + headerTags := instrumentation.NewHeaderTags(htArgs) + r := setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } + }) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("global", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - header, tag := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(header, tag) + htArgs := []string{"3header"} + testutils.SetGlobalHeaderTags(t, htArgs...) + headerTags := instrumentation.NewHeaderTags(htArgs) r := setupReq() spans := mt.FinishedSpans() @@ -108,28 +108,31 @@ func TestWithHeaderTags(t *testing.T) { assert.Equal(len(spans), 1) s := spans[0] - assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + headerTags.Iter(func(header string, tag string) { + assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) + }) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") }) t.Run("override", func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - globalH, globalT := normalizer.HeaderTag("3header") - globalconfig.SetHeaderTag(globalH, globalT) - + testutils.SetGlobalHeaderTags(t, "3header") htArgs := []string{"h!e@a-d.e*r", "2header:tag"} + headerTags := instrumentation.NewHeaderTags(htArgs) + r := setupReq(WithHeaderTags(htArgs)) spans := mt.FinishedSpans() assert := assert.New(t) assert.Equal(len(spans), 1) s := spans[0] - for _, arg := range htArgs { - header, tag := normalizer.HeaderTag(arg) + headerTags.Iter(func(header string, tag string) { assert.Equal(strings.Join(r.Header.Values(header), ","), s.Tags()[tag]) - } - assert.NotContains(s.Tags(), globalT) + }) + assert.NotContains(s.Tags(), "http.headers.x-datadog-header") + assert.NotContains(s.Tags(), "3header") }) } @@ -156,6 +159,7 @@ func TestTrace200(t *testing.T) { assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal("http://example.com/user", span.Tag(ext.HTTPURL)) assert.Equal("urfave/negroni", span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageUrfaveNegroni), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -168,13 +172,13 @@ func TestTrace200(t *testing.T) { mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") w.WriteHeader(200) w.Write([]byte("hi!")) }) router := negroni.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.UseHandler(mux) assertDoRequest(assert, mt, router, "") }) @@ -188,12 +192,12 @@ func TestTrace200(t *testing.T) { mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") w.WriteHeader(200) }) router := negroni.New() - router.Use(Middleware(WithServiceName("foobar"))) + router.Use(Middleware(WithService("foobar"))) router.UseHandler(mux) assertDoRequest(assert, mt, router, "") }) @@ -206,12 +210,12 @@ func TestTrace200(t *testing.T) { mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "foobar") + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), "foobar") w.WriteHeader(200) }) router := negroni.New() - router.Use(Middleware(WithServiceName("foobar"), WithResourceNamer(func(r *http.Request) string { + router.Use(Middleware(WithService("foobar"), WithResourceNamer(func(r *http.Request) string { return fmt.Sprintf("%s %s", r.Method, r.URL.Path) }))) router.UseHandler(mux) @@ -220,13 +224,10 @@ func TestTrace200(t *testing.T) { } func TestError(t *testing.T) { - assertSpan := func(assert *assert.Assertions, spans []mocktracer.Span, code int) { - assert.Len(spans, 1) - span := spans[0] + assertSpan := func(assert *assert.Assertions, span *mocktracer.Span, code int) { assert.Equal("http.request", span.OperationName()) + assert.Equal("negroni.router", span.Tag(ext.ServiceName)) assert.Equal(strconv.Itoa(code), span.Tag(ext.HTTPCode)) - wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) } t.Run("default", func(t *testing.T) { @@ -242,7 +243,7 @@ func TestError(t *testing.T) { // a handler with an error and make the requests mux := http.NewServeMux() - mux.HandleFunc("/err", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/err", func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) router.UseHandler(mux) @@ -256,7 +257,11 @@ func TestError(t *testing.T) { // verify the errors and status are correct spans := mt.FinishedSpans() - assertSpan(assert, spans, code) + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) }) t.Run("custom", func(t *testing.T) { @@ -274,7 +279,7 @@ func TestError(t *testing.T) { code := 404 // a handler with an error and make the requests mux := http.NewServeMux() - mux.HandleFunc("/err", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/err", func(w http.ResponseWriter, _ *http.Request) { http.Error(w, fmt.Sprintf("%d!", code), code) }) router.UseHandler(mux) @@ -287,7 +292,67 @@ func TestError(t *testing.T) { // verify the errors and status are correct spans := mt.FinishedSpans() - assertSpan(assert, spans, code) + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + }) + + t.Run("integration overrides global", func(t *testing.T) { + assert := assert.New(t) + mt := mocktracer.Start() + defer mt.Stop() + + t.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "500") + + // setup + router := negroni.New() + code := 404 + router.Use(Middleware(WithStatusCheck(func(statusCode int) bool { + return statusCode == 404 + }))) + + // a handler with an error and make the requests + mux := http.NewServeMux() + mux.HandleFunc("/404", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + router.UseHandler(mux) + r := httptest.NewRequest("GET", "/404", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + response := w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, code) + + // verify the errors and status are correct + spans := mt.FinishedSpans() + assert.Len(spans, 1) + span := spans[0] + assertSpan(assert, span, code) + wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) + + mt.Reset() + + code = 500 + mux.HandleFunc("/500", func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, fmt.Sprintf("%d!", code), code) + }) + r = httptest.NewRequest("GET", "/500", nil) + w = httptest.NewRecorder() + router.ServeHTTP(w, r) + response = w.Result() + defer response.Body.Close() + assert.Equal(response.StatusCode, 500) + + // verify that span does not have error tag + spans = mt.FinishedSpans() + assert.Len(spans, 1) + span = spans[0] + assertSpan(assert, span, 500) + assert.Empty(span.Tag(ext.ErrorMsg)) }) } @@ -295,7 +360,7 @@ func TestGetSpanNotInstrumented(t *testing.T) { assert := assert.New(t) mux := http.NewServeMux() - mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/user", func(_ http.ResponseWriter, _ *http.Request) { }) router := negroni.New() @@ -325,7 +390,7 @@ func TestPropagation(t *testing.T) { mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) + assert.Equal(mocktracer.MockSpan(span).ParentID(), mocktracer.MockSpan(pspan).SpanID()) w.WriteHeader(200) }) @@ -341,7 +406,7 @@ func TestAnalyticsSettings(t *testing.T) { router.Use(Middleware(opts...)) mux := http.NewServeMux() - mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/user", func(_ http.ResponseWriter, r *http.Request) { _, ok := tracer.SpanFromContext(r.Context()) assert.True(t, ok) }) @@ -367,10 +432,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.4) }) @@ -390,9 +452,7 @@ func TestAnalyticsSettings(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) + testutils.SetGlobalAnalyticsRate(t, 0.4) assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) }) } @@ -404,7 +464,7 @@ func TestServiceName(t *testing.T) { mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { span, ok := tracer.SpanFromContext(r.Context()) assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), servicename) + assert.Equal(mocktracer.MockSpan(span).Tag(ext.ServiceName), servicename) w.WriteHeader(200) }) @@ -436,8 +496,7 @@ func TestServiceName(t *testing.T) { }) t.Run("global", func(t *testing.T) { - globalconfig.SetServiceName("global-service") - defer globalconfig.SetServiceName("") + testutils.SetGlobalServiceName(t, "global-service") mt := mocktracer.Start() defer mt.Stop() @@ -452,33 +511,7 @@ func TestServiceName(t *testing.T) { defer mt.Stop() router := negroni.New() - router.Use(Middleware(WithServiceName("my-service"))) + router.Use(Middleware(WithService("my-service"))) assertServiceName(t, mt, router, "my-service") }) } - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := http.NewServeMux() - mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte("ok")) - require.NoError(t, err) - }) - router := negroni.New() - router.Use(Middleware(opts...)) - router.UseHandler(mux) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - router.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - namingschematest.NewHTTPServerTest(genSpans, "negroni.router")(t) -} diff --git a/contrib/urfave/negroni/option.go b/contrib/urfave/negroni/option.go index a242515e75..f713f033e1 100644 --- a/contrib/urfave/negroni/option.go +++ b/contrib/urfave/negroni/option.go @@ -10,41 +10,41 @@ import ( "math" "net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const defaultServiceName = "negroni.router" - type config struct { serviceName string - spanOpts []ddtrace.StartSpanOption // additional span options to be applied + spanOpts []tracer.StartSpanOption // additional span options to be applied analyticsRate float64 isStatusError func(statusCode int) bool resourceNamer func(r *http.Request) string - headerTags *internal.LockMap + headerTags instrumentation.HeaderTags +} + +// Option describes options for the Negroni integration. +type Option interface { + apply(*config) } -// Option represents an option that can be passed to NewRouter. -type Option func(*config) +// OptionFn represents options applicable to Middleware. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func defaults(cfg *config) { - cfg.serviceName = namingschema.ServiceName(defaultServiceName) - if internal.BoolEnv("DD_TRACE_NEGRONI_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } - cfg.headerTags = globalconfig.HeaderTagMap() + cfg.serviceName = instr.ServiceName(instrumentation.ComponentServer, nil) + cfg.analyticsRate = instr.AnalyticsRate(true) + cfg.headerTags = instr.HTTPHeadersAsTags() cfg.isStatusError = isServerError cfg.resourceNamer = defaultResourceNamer } -// WithServiceName sets the given service name for the router. -func WithServiceName(name string) Option { +// WithService sets the given service name for the router. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } @@ -52,14 +52,14 @@ func WithServiceName(name string) Option { // WithSpanOptions applies the given set of options to the spans started // by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { return func(cfg *config) { cfg.spanOpts = opts } } // WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { +func WithAnalytics(on bool) OptionFn { return func(cfg *config) { if on { cfg.analyticsRate = 1.0 @@ -71,7 +71,7 @@ func WithAnalytics(on bool) Option { // WithAnalyticsRate sets the sampling rate for Trace Analytics events // correlated to started spans. -func WithAnalyticsRate(rate float64) Option { +func WithAnalyticsRate(rate float64) OptionFn { return func(cfg *config) { if rate >= 0.0 && rate <= 1.0 { cfg.analyticsRate = rate @@ -83,7 +83,7 @@ func WithAnalyticsRate(rate float64) Option { // WithStatusCheck specifies a function fn which reports whether the passed // statusCode should be considered an error. -func WithStatusCheck(fn func(statusCode int) bool) Option { +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { return func(cfg *config) { cfg.isStatusError = fn } @@ -95,7 +95,7 @@ func isServerError(statusCode int) bool { // WithResourceNamer specifies a function which will be used to obtain a resource name for a given // negroni request, using the request's context. -func WithResourceNamer(namer func(r *http.Request) string) Option { +func WithResourceNamer(namer func(r *http.Request) string) OptionFn { return func(cfg *config) { cfg.resourceNamer = namer } @@ -109,9 +109,8 @@ func defaultResourceNamer(_ *http.Request) string { // Warning: // Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. // Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headers []string) Option { - headerTagsMap := normalizer.HeaderTagSlice(headers) +func WithHeaderTags(headers []string) OptionFn { return func(cfg *config) { - cfg.headerTags = internal.NewLockMap(headerTagsMap) + cfg.headerTags = instrumentation.NewHeaderTags(headers) } } diff --git a/contrib/valkey-io/valkey-go/example_test.go b/contrib/valkey-io/valkey-go/example_test.go new file mode 100644 index 0000000000..d2030e382f --- /dev/null +++ b/contrib/valkey-io/valkey-go/example_test.go @@ -0,0 +1,35 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package valkey_test + +import ( + "context" + "log" + + valkeytrace "github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/valkey-io/valkey-go" +) + +// To start tracing Valkey, simply create a new client using the library and continue +// using as you normally would. +func Example() { + tracer.Start() + defer tracer.Stop() + + vk, err := valkeytrace.NewClient(valkey.ClientOption{ + InitAddress: []string{"localhost:6379"}, + }) + if err != nil { + log.Fatal(err) + return + } + + if err := vk.Do(context.Background(), vk.B().Set().Key("key").Value("value").Build()).Error(); err != nil { + log.Fatal(err) + return + } +} diff --git a/contrib/valkey-io/valkey-go/go.mod b/contrib/valkey-io/valkey-go/go.mod new file mode 100644 index 0000000000..a2be82c064 --- /dev/null +++ b/contrib/valkey-io/valkey-go/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/valkey-io/valkey-go v1.0.55 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/valkey-io/valkey-go/go.sum b/contrib/valkey-io/valkey-go/go.sum new file mode 100644 index 0000000000..0b16c7f85d --- /dev/null +++ b/contrib/valkey-io/valkey-go/go.sum @@ -0,0 +1,313 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valkey-io/valkey-go v1.0.55 h1:mvsiXNwHO9YrkBPzumrnFNhDAmVkZxyQsiAm6Y4c/Bg= +github.com/valkey-io/valkey-go v1.0.55/go.mod h1:yYgsDepzuxY1NjAzpmt5QV6BLCvRXyJ/M27NuaznGd4= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/valkey-io/valkey-go/option.go b/contrib/valkey-io/valkey-go/option.go new file mode 100644 index 0000000000..760241fe83 --- /dev/null +++ b/contrib/valkey-io/valkey-go/option.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package valkey + +import ( + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" + "github.com/valkey-io/valkey-go" +) + +type config struct { + rawCommand bool + serviceName string + errCheck func(err error) bool +} + +// Option represents an option that can be used to create or wrap a client. +type Option func(*config) + +func defaultConfig() *config { + return &config{ + // Do not include the raw command by default since it could contain sensitive data. + rawCommand: options.GetBoolEnv("DD_TRACE_VALKEY_RAW_COMMAND", false), + serviceName: instr.ServiceName(instrumentation.ComponentDefault, nil), + errCheck: func(err error) bool { + return err != nil && !valkey.IsValkeyNil(err) + }, + } +} + +// WithRawCommand can be used to set a tag `valkey.raw_command` in the created spans (disabled by default). +// Warning: please note the datadog-agent v7.63.x or below does not support obfuscation for this tag, so use this at your own risk. +func WithRawCommand(rawCommand bool) Option { + return func(cfg *config) { + cfg.rawCommand = rawCommand + } +} + +// WithService sets the given service name for the client. +func WithService(name string) Option { + return func(cfg *config) { + cfg.serviceName = name + } +} + +// WithErrorCheck specifies a function fn which determines whether the passed +// error should be marked as an error. +func WithErrorCheck(fn func(err error) bool) Option { + return func(cfg *config) { + cfg.errCheck = fn + } +} diff --git a/contrib/valkey-io/valkey-go/orchestrion.yml b/contrib/valkey-io/valkey-go/orchestrion.yml new file mode 100644 index 0000000000..249bf2b172 --- /dev/null +++ b/contrib/valkey-io/valkey-go/orchestrion.yml @@ -0,0 +1,20 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 + description: Valkey client for Go. + +aspects: + - id: NewClient + join-point: + function-call: github.com/valkey-io/valkey-go.NewClient + advice: + - wrap-expression: + imports: + valkeytrace: github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 + template: |- + valkeytrace.NewClient({{ index .AST.Args 0 }}) diff --git a/contrib/valkey-io/valkey-go/valkey.go b/contrib/valkey-io/valkey-go/valkey.go new file mode 100644 index 0000000000..02618aee69 --- /dev/null +++ b/contrib/valkey-io/valkey-go/valkey.go @@ -0,0 +1,284 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package valkey provides tracing functions for tracing the valkey-io/valkey-go package (https://github.com/valkey-io/valkey-go). +package valkey + +import ( + "context" + "net" + "strconv" + "strings" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/valkey-io/valkey-go" +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageValkeyIoValkeyGo) +} + +var ( + _ valkey.Client = (*client)(nil) +) + +type client struct { + client valkey.Client + cfg *config + host string + port string + dbIndex string + user string +} + +func (c *client) B() valkey.Builder { + return c.client.B() +} + +func (c *client) Close() { + c.client.Close() +} + +// NewClient returns a new valkey.Client enhanced with tracing. +func NewClient(clientOption valkey.ClientOption, opts ...Option) (valkey.Client, error) { + valkeyClient, err := valkey.NewClient(clientOption) + if err != nil { + return nil, err + } + cfg := defaultConfig() + for _, fn := range opts { + fn(cfg) + } + tClient := &client{ + client: valkeyClient, + cfg: cfg, + dbIndex: strconv.FormatInt(int64(clientOption.SelectDB), 10), + user: clientOption.Username, + } + if len(clientOption.InitAddress) > 0 { + host, port, err := net.SplitHostPort(clientOption.InitAddress[0]) + if err == nil { + tClient.host = host + tClient.port = port + } + } + return tClient, nil +} + +func (c *client) Do(ctx context.Context, cmd valkey.Completed) valkey.ValkeyResult { + span, ctx := c.startSpan(ctx, processCommand(&cmd)) + resp := c.client.Do(ctx, cmd) + setClientCacheTags(span, resp) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) DoMulti(ctx context.Context, multi ...valkey.Completed) []valkey.ValkeyResult { + span, ctx := c.startSpan(ctx, processCommandMulti(multi)) + resp := c.client.DoMulti(ctx, multi...) + c.finishSpan(span, c.firstError(resp)) + return resp +} + +func (c *client) Receive(ctx context.Context, subscribe valkey.Completed, fn func(msg valkey.PubSubMessage)) error { + span, ctx := c.startSpan(ctx, processCommand(&subscribe)) + err := c.client.Receive(ctx, subscribe, fn) + c.finishSpan(span, err) + return err +} + +func (c *client) DoCache(ctx context.Context, cmd valkey.Cacheable, ttl time.Duration) valkey.ValkeyResult { + span, ctx := c.startSpan(ctx, processCommand(&cmd)) + resp := c.client.DoCache(ctx, cmd, ttl) + setClientCacheTags(span, resp) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) DoMultiCache(ctx context.Context, multi ...valkey.CacheableTTL) []valkey.ValkeyResult { + span, ctx := c.startSpan(ctx, processCommandMultiCache(multi)) + resp := c.client.DoMultiCache(ctx, multi...) + c.finishSpan(span, c.firstError(resp)) + return resp +} + +func (c *client) DoStream(ctx context.Context, cmd valkey.Completed) (resp valkey.ValkeyResultStream) { + span, ctx := c.startSpan(ctx, processCommand(&cmd)) + resp = c.client.DoStream(ctx, cmd) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) DoMultiStream(ctx context.Context, multi ...valkey.Completed) valkey.MultiValkeyResultStream { + span, ctx := c.startSpan(ctx, processCommandMulti(multi)) + resp := c.client.DoMultiStream(ctx, multi...) + c.finishSpan(span, resp.Error()) + return resp +} + +func (c *client) Dedicated(fn func(valkey.DedicatedClient) error) error { + return c.client.Dedicated(func(dc valkey.DedicatedClient) error { + return fn(&dedicatedClient{ + client: c, + dedicatedClient: dc, + }) + }) +} + +func (c *client) Dedicate() (client valkey.DedicatedClient, cancel func()) { + dedicated, cancel := c.client.Dedicate() + return &dedicatedClient{ + client: c, + dedicatedClient: dedicated, + }, cancel +} + +func (c *client) Nodes() map[string]valkey.Client { + nodes := c.client.Nodes() + for addr, valkeyClient := range nodes { + host, port, _ := net.SplitHostPort(addr) + nodes[addr] = &client{ + client: valkeyClient, + cfg: c.cfg, + host: host, + port: port, + dbIndex: c.dbIndex, + user: c.user, + } + } + return nodes +} + +func (c *client) Mode() valkey.ClientMode { + return c.client.Mode() +} + +var ( + _ valkey.DedicatedClient = (*dedicatedClient)(nil) +) + +type dedicatedClient struct { + *client + dedicatedClient valkey.DedicatedClient +} + +func (c *dedicatedClient) SetPubSubHooks(hooks valkey.PubSubHooks) <-chan error { + return c.dedicatedClient.SetPubSubHooks(hooks) +} + +type command struct { + statement string + raw string +} + +func (c *client) startSpan(ctx context.Context, cmd command) (*tracer.Span, context.Context) { + opts := []tracer.StartSpanOption{ + tracer.ServiceName(c.cfg.serviceName), + tracer.ResourceName(cmd.statement), + tracer.SpanType(ext.SpanTypeValkey), + tracer.Tag(ext.TargetHost, c.host), + tracer.Tag(ext.TargetPort, c.port), + tracer.Tag(ext.Component, instrumentation.PackageValkeyIoValkeyGo), + tracer.Tag(ext.SpanKind, ext.SpanKindClient), + tracer.Tag(ext.DBSystem, ext.DBSystemValkey), + tracer.Tag(ext.TargetDB, c.dbIndex), + } + if c.cfg.rawCommand { + opts = append(opts, tracer.Tag(ext.ValkeyRawCommand, cmd.raw)) + } + if c.host != "" { + opts = append(opts, tracer.Tag(ext.TargetHost, c.host)) + } + if c.port != "" { + opts = append(opts, tracer.Tag(ext.TargetPort, c.port)) + } + if c.user != "" { + opts = append(opts, tracer.Tag(ext.DBUser, c.user)) + } + return tracer.StartSpanFromContext(ctx, "valkey.command", opts...) +} + +func (c *client) finishSpan(span *tracer.Span, err error) { + var opts []tracer.FinishOption + if c.cfg.errCheck(err) { + opts = append(opts, tracer.WithError(err)) + } + span.Finish(opts...) +} + +func (c *client) firstError(s []valkey.ValkeyResult) error { + for _, result := range s { + if err := result.Error(); c.cfg.errCheck(err) { + return err + } + } + return nil +} + +type commander interface { + Commands() []string +} + +func processCommand(cmd commander) command { + cmds := cmd.Commands() + if len(cmds) == 0 { + return command{} + } + statement := cmds[0] + raw := strings.Join(cmds, " ") + return command{ + statement: statement, + raw: raw, + } +} + +func processCommandMulti(multi []valkey.Completed) command { + var cmds []command + for _, cmd := range multi { + cmds = append(cmds, processCommand(&cmd)) + } + return multiCommand(cmds) +} + +func processCommandMultiCache(multi []valkey.CacheableTTL) command { + var cmds []command + for _, cmd := range multi { + cmds = append(cmds, processCommand(&cmd.Cmd)) + } + return multiCommand(cmds) +} + +func multiCommand(cmds []command) command { + // limit to the 5 first + if len(cmds) > 5 { + cmds = cmds[:5] + } + statement := strings.Builder{} + raw := strings.Builder{} + for i, cmd := range cmds { + statement.WriteString(cmd.statement) + raw.WriteString(cmd.raw) + if i != len(cmds)-1 { + statement.WriteString(" ") + raw.WriteString(" ") + } + } + return command{ + statement: statement.String(), + raw: raw.String(), + } +} + +func setClientCacheTags(s *tracer.Span, result valkey.ValkeyResult) { + s.SetTag(ext.ValkeyClientCacheHit, result.IsCacheHit()) + s.SetTag(ext.ValkeyClientCacheTTL, result.CacheTTL()) + s.SetTag(ext.ValkeyClientCachePTTL, result.CachePTTL()) + s.SetTag(ext.ValkeyClientCachePXAT, result.CachePXAT()) +} diff --git a/contrib/valkey-io/valkey-go/valkey_test.go b/contrib/valkey-io/valkey-go/valkey_test.go new file mode 100644 index 0000000000..00abb7648b --- /dev/null +++ b/contrib/valkey-io/valkey-go/valkey_test.go @@ -0,0 +1,399 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. +package valkey + +import ( + "context" + "errors" + "fmt" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/valkey-io/valkey-go" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" +) + +const ( + // See docker-compose.yaml + valkeyPort = 6380 + valkeyUsername = "default" + valkeyPassword = "password-for-default" +) + +var ( + valkeyAddrs = []string{fmt.Sprintf("127.0.0.1:%d", valkeyPort)} +) + +func TestMain(m *testing.M) { + _, ok := os.LookupEnv("INTEGRATION") + if !ok { + fmt.Println("--- SKIP: to enable integration test, set the INTEGRATION environment variable") + os.Exit(0) + } + os.Exit(m.Run()) +} + +func TestNewClient(t *testing.T) { + testutils.SetGlobalServiceName(t, "global-service") + + tests := []struct { + name string + opts []Option + runTest func(*testing.T, context.Context, valkey.Client) + assertSpans func(*testing.T, []*mocktracer.Span) + wantServiceName string + }{ + { + name: "Test SET command with raw command", + opts: []Option{ + WithRawCommand(true), + WithService("test-service"), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + assert.NoError(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET test_key test_value", span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "test-service", + }, + { + name: "Test SET command without raw command", + opts: nil, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + require.NoError(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Nil(t, span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SET GET multi command", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + resp := client.DoMulti(ctx, client.B().Set().Key("test_key").Value("test_value").Build(), client.B().Get().Key("test_key").Build()) + require.Len(t, resp, 2) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET test_key test_value GET test_key", span.Tag(ext.ValkeyRawCommand)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheHit)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheTTL)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePXAT)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePTTL)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test HMGET command with cache", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + assert.NoError(t, client.DoCache(ctx, client.B().Hmget().Key("mk").Field("1", "2").Cache(), time.Minute).Error()) + resp, err := client.DoCache(ctx, client.B().Hmget().Key("mk").Field("1", "2").Cache(), time.Minute).ToArray() + require.Len(t, resp, 2) + require.NoError(t, err) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + + span := spans[0] + assert.Equal(t, "HMGET", span.Tag(ext.ResourceName)) + assert.Equal(t, "HMGET mk 1 2", span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Greater(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Greater(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Greater(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + + span = spans[1] + assert.Equal(t, "HMGET", span.Tag(ext.ResourceName)) + assert.Equal(t, "HMGET mk 1 2", span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "true", span.Tag(ext.ValkeyClientCacheHit)) + assert.Greater(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Greater(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Greater(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test GET stream command", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + resp := client.DoStream(ctx, client.B().Get().Key("test_key").Build()) + require.NoError(t, resp.Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "GET test_key", span.Tag(ext.ValkeyRawCommand)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheHit)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheTTL)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePXAT)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePTTL)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test multi command should be limited to 5", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(_ *testing.T, ctx context.Context, client valkey.Client) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, time.Nanosecond) + client.DoMulti( + ctxWithTimeout, + client.B().Set().Key("k1").Value("v1").Build(), + client.B().Get().Key("k1").Build(), + client.B().Set().Key("k2").Value("v2").Build(), + client.B().Get().Key("k2").Build(), + client.B().Set().Key("k3").Value("v3").Build(), + client.B().Get().Key("k3").Build(), + ) + cancel() + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET GET SET GET SET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET k1 v1 GET k1 SET k2 v2 GET k2 SET k3 v3", span.Tag(ext.ValkeyRawCommand)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheHit)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheTTL)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePXAT)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePTTL)) + assert.Equal(t, context.DeadlineExceeded.Error(), span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SUBSCRIBE command with timeout", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + ctxWithTimeout, cancel := context.WithTimeout(ctx, time.Millisecond) + require.EqualError(t, + context.DeadlineExceeded, + client.Receive(ctxWithTimeout, client.B().Subscribe().Channel("test_channel").Build(), func(_ valkey.PubSubMessage) {}).Error(), + ) + cancel() + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SUBSCRIBE", span.Tag(ext.ResourceName)) + assert.Equal(t, "SUBSCRIBE test_channel", span.Tag(ext.ValkeyRawCommand)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheHit)) + assert.Nil(t, span.Tag(ext.ValkeyClientCacheTTL)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePXAT)) + assert.Nil(t, span.Tag(ext.ValkeyClientCachePTTL)) + assert.Equal(t, context.DeadlineExceeded.Error(), span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test Dedicated client", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + err := client.Dedicated(func(d valkey.DedicatedClient) error { + return d.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error() + }) + require.NoError(t, err) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Equal(t, "SET test_key test_value", span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.ErrorMsg)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SET command with canceled context and custom error check", + opts: []Option{ + WithErrorCheck(func(err error) bool { + return err != nil && !valkey.IsValkeyNil(err) && !errors.Is(err, context.Canceled) + }), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + ctx, cancel := context.WithCancel(ctx) + cancel() + require.Error(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Nil(t, span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test valkey nil not attached to span", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + require.Error(t, client.Do(ctx, client.B().Get().Key("404").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "GET 404", span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test SET command with canceled context and custom error check", + opts: []Option{ + WithErrorCheck(func(err error) bool { + return err != nil && !valkey.IsValkeyNil(err) && !errors.Is(err, context.Canceled) + }), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + ctx, cancel := context.WithCancel(ctx) + cancel() + require.Error(t, client.Do(ctx, client.B().Set().Key("test_key").Value("test_value").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "SET", span.Tag(ext.ResourceName)) + assert.Nil(t, span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + { + name: "Test valkey nil not attached to span", + opts: []Option{ + WithRawCommand(true), + }, + runTest: func(t *testing.T, ctx context.Context, client valkey.Client) { + require.Error(t, client.Do(ctx, client.B().Get().Key("404").Build()).Error()) + }, + assertSpans: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + + span := spans[0] + assert.Equal(t, "GET", span.Tag(ext.ResourceName)) + assert.Equal(t, "GET 404", span.Tag(ext.ValkeyRawCommand)) + assert.Equal(t, "false", span.Tag(ext.ValkeyClientCacheHit)) + assert.Less(t, span.Tag(ext.ValkeyClientCacheTTL), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePXAT), float64(0)) + assert.Less(t, span.Tag(ext.ValkeyClientCachePTTL), float64(0)) + assert.Nil(t, span.Tag(ext.Error)) + }, + wantServiceName: "global-service", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + valkeyClientOption := valkey.ClientOption{ + InitAddress: valkeyAddrs, + Username: valkeyUsername, + Password: valkeyPassword, + } + client, err := NewClient(valkeyClientOption, tt.opts...) + require.NoError(t, err) + + root, ctx := tracer.StartSpanFromContext(context.Background(), "test.root", tracer.ServiceName("test-service")) + tt.runTest(t, ctx, client) + root.Finish() // test.root exists in the last span. + + spans := mt.FinishedSpans() + tt.assertSpans(t, spans[:len(spans)-1]) + + for _, span := range spans { + if span.OperationName() == "test.root" { + continue + } + + // The following assertions are common to all spans + assert.Equal(t, tt.wantServiceName, span.Tag(ext.ServiceName)) + assert.Equal(t, "127.0.0.1", span.Tag(ext.TargetHost)) + assert.Equal(t, "6380", span.Tag(ext.TargetPort)) + assert.Equal(t, "0", span.Tag(ext.TargetDB)) + assert.Equal(t, "default", span.Tag(ext.DBUser)) + assert.Equal(t, "valkey.command", span.OperationName()) + assert.Equal(t, "client", span.Tag(ext.SpanKind)) + assert.Equal(t, "valkey", span.Tag(ext.SpanType)) + assert.Equal(t, "valkey-io/valkey-go", span.Tag(ext.Component)) + assert.Equal(t, "valkey", span.Tag(ext.DBSystem)) + } + }) + } + +} diff --git a/contrib/valyala/fasthttp.v1/example_test.go b/contrib/valyala/fasthttp/example_test.go similarity index 80% rename from contrib/valyala/fasthttp.v1/example_test.go rename to contrib/valyala/fasthttp/example_test.go index 85bdfd77bc..b7749bc63f 100644 --- a/contrib/valyala/fasthttp.v1/example_test.go +++ b/contrib/valyala/fasthttp/example_test.go @@ -8,8 +8,8 @@ package fasthttp_test import ( "fmt" - fasthttptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/valyala/fasthttp.v1" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + fasthttptrace "github.com/DataDog/dd-trace-go/contrib/valyala/fasthttp/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/valyala/fasthttp" ) @@ -33,5 +33,5 @@ func Example_withServiceName() { defer tracer.Stop() // Start fasthttp server - fasthttp.ListenAndServe(":8081", fasthttptrace.WrapHandler(fastHTTPHandler, fasthttptrace.WithServiceName("fasthttp-server"))) + fasthttp.ListenAndServe(":8081", fasthttptrace.WrapHandler(fastHTTPHandler, fasthttptrace.WithService("fasthttp-server"))) } diff --git a/contrib/valyala/fasthttp.v1/fasthttp.go b/contrib/valyala/fasthttp/fasthttp.go similarity index 60% rename from contrib/valyala/fasthttp.v1/fasthttp.go rename to contrib/valyala/fasthttp/fasthttp.go index 80ba87c4e1..1cea3ac3c2 100644 --- a/contrib/valyala/fasthttp.v1/fasthttp.go +++ b/contrib/valyala/fasthttp/fasthttp.go @@ -4,65 +4,66 @@ // Copyright 2016 Datadog, Inc. // Package fasthttp provides functions to trace the valyala/fasthttp package (https://github.com/valyala/fasthttp) -package fasthttp // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/valyala/fasthttp.v1" +package fasthttp // import "github.com/DataDog/dd-trace-go/contrib/valyala/fasthttp/v2" import ( "fmt" "strconv" "github.com/valyala/fasthttp" - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/fasthttptrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) -const componentName = "valyala/fasthttp.v1" +var instr *instrumentation.Instrumentation func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported(componentName) + instr = instrumentation.Load(instrumentation.PackageValyalaFastHTTP) } // WrapHandler wraps a fasthttp.RequestHandler with tracing middleware func WrapHandler(h fasthttp.RequestHandler, opts ...Option) fasthttp.RequestHandler { cfg := newConfig() for _, fn := range opts { - fn(cfg) - } - log.Debug("contrib/valyala/fasthttp.v1: Configuring Middleware: cfg: %#v", cfg) - spanOpts := []tracer.StartSpanOption{ - tracer.ServiceName(cfg.serviceName), + fn.apply(cfg) } + instr.Logger().Debug("contrib/valyala/fasthttp.v1: Configuring Middleware: cfg: %#v", cfg) return func(fctx *fasthttp.RequestCtx) { if cfg.ignoreRequest(fctx) { h(fctx) return } + spanOpts := []tracer.StartSpanOption{ + tracer.ServiceName(cfg.serviceName), + } spanOpts = append(spanOpts, defaultSpanOptions(fctx)...) - fcc := &fasthttptrace.HTTPHeadersCarrier{ + fcc := &HTTPHeadersCarrier{ ReqHeader: &fctx.Request.Header, } if sctx, err := tracer.Extract(fcc); err == nil { + // If there are span links as a result of context extraction, add them as a StartSpanOption + if sctx != nil && sctx.SpanLinks() != nil { + spanOpts = append(spanOpts, tracer.WithSpanLinks(sctx.SpanLinks())) + } spanOpts = append(spanOpts, tracer.ChildOf(sctx)) } - span := fasthttptrace.StartSpanFromContext(fctx, "http.request", spanOpts...) + span := StartSpanFromContext(fctx, "http.request", spanOpts...) defer span.Finish() h(fctx) span.SetTag(ext.ResourceName, cfg.resourceNamer(fctx)) status := fctx.Response.StatusCode() if cfg.isStatusError(status) { - span.SetTag(ext.Error, fmt.Errorf("%d: %s", status, string(fctx.Response.Body()))) + span.SetTag(ext.ErrorNoStackTrace, fmt.Errorf("%d: %s", status, string(fctx.Response.Body()))) } span.SetTag(ext.HTTPCode, strconv.Itoa(status)) } } func defaultSpanOptions(fctx *fasthttp.RequestCtx) []tracer.StartSpanOption { - opts := []ddtrace.StartSpanOption{ - tracer.Tag(ext.Component, componentName), + opts := []tracer.StartSpanOption{ + tracer.Tag(ext.Component, instrumentation.PackageValyalaFastHTTP), tracer.Tag(ext.SpanKind, ext.SpanKindServer), tracer.SpanType(ext.SpanTypeWeb), tracer.Tag(ext.HTTPMethod, string(fctx.Method())), diff --git a/contrib/valyala/fasthttp.v1/fasthttp_test.go b/contrib/valyala/fasthttp/fasthttp_test.go similarity index 90% rename from contrib/valyala/fasthttp.v1/fasthttp_test.go rename to contrib/valyala/fasthttp/fasthttp_test.go index f6f005e24d..b5698b99fe 100644 --- a/contrib/valyala/fasthttp.v1/fasthttp_test.go +++ b/contrib/valyala/fasthttp/fasthttp_test.go @@ -16,10 +16,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "github.com/valyala/fasthttp" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" ) const errMsg = "This is an error!" @@ -120,7 +122,8 @@ func TestTrace200(t *testing.T) { assert.Equal("200", span.Tag(ext.HTTPCode)) assert.Equal("GET", span.Tag(ext.HTTPMethod)) assert.Equal(addr+"/any", span.Tag(ext.HTTPURL)) - assert.Equal(componentName, span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageValyalaFastHTTP), span.Tag(ext.Component)) + assert.Equal(string(instrumentation.PackageValyalaFastHTTP), span.Integration()) assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) } @@ -142,7 +145,7 @@ func TestStatusError(t *testing.T) { span := spans[0] assert.Equal("500", span.Tag(ext.HTTPCode)) wantErr := fmt.Sprintf("%d: %s", 500, errMsg) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) } // Test that users can customize which HTTP status codes are considered an error @@ -165,9 +168,9 @@ func TestWithStatusCheck(t *testing.T) { require.Len(t, spans, 1) span := spans[0] assert.Equal("600", span.Tag(ext.HTTPCode)) - require.Contains(t, span.Tags(), ext.Error) + require.Contains(t, span.Tags(), ext.ErrorMsg) wantErr := fmt.Sprintf("%d: %s", 600, errMsg) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) + assert.Equal(wantErr, span.Tag(ext.ErrorMsg)) }) t.Run("notError", func(t *testing.T) { addr := startServer(t, WithStatusCheck(customErrChecker)) @@ -184,7 +187,7 @@ func TestWithStatusCheck(t *testing.T) { require.Len(t, spans, 1) span := spans[0] assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.NotContains(span.Tags(), ext.Error) + assert.NotContains(span.Tags(), ext.ErrorMsg) }) } diff --git a/contrib/internal/fasthttptrace/fasthttpheaderscarrier.go b/contrib/valyala/fasthttp/fasthttpheaderscarrier.go similarity index 94% rename from contrib/internal/fasthttptrace/fasthttpheaderscarrier.go rename to contrib/valyala/fasthttp/fasthttpheaderscarrier.go index a277a91aba..6a53433cfc 100644 --- a/contrib/internal/fasthttptrace/fasthttpheaderscarrier.go +++ b/contrib/valyala/fasthttp/fasthttpheaderscarrier.go @@ -3,10 +3,10 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package fasthttptrace +package fasthttp import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/valyala/fasthttp" ) diff --git a/contrib/internal/fasthttptrace/fasthttpheaderscarrier_test.go b/contrib/valyala/fasthttp/fasthttpheaderscarrier_test.go similarity index 89% rename from contrib/internal/fasthttptrace/fasthttpheaderscarrier_test.go rename to contrib/valyala/fasthttp/fasthttpheaderscarrier_test.go index 0447448480..dac197eae6 100644 --- a/contrib/internal/fasthttptrace/fasthttpheaderscarrier_test.go +++ b/contrib/valyala/fasthttp/fasthttpheaderscarrier_test.go @@ -3,14 +3,14 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package fasthttptrace +package fasthttp import ( "context" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -18,17 +18,18 @@ import ( ) func TestHTTPHeadersCarrierSet(t *testing.T) { - assert := assert.New(t) fcc := &HTTPHeadersCarrier{ ReqHeader: new(fasthttp.RequestHeader), } t.Run("key-val", func(t *testing.T) { + assert := assert.New(t) // add one item fcc.Set("k1", "v1") assert.Len(fcc.ReqHeader.PeekAll("k1"), 1) assert.Equal("v1", string(fcc.ReqHeader.Peek("k1"))) }) t.Run("key-multival", func(t *testing.T) { + assert := assert.New(t) // add a second value, ensure the second value overwrites the first fcc.Set("k1", "v1") fcc.Set("k1", "v2") @@ -37,6 +38,7 @@ func TestHTTPHeadersCarrierSet(t *testing.T) { assert.Equal("v2", string(vals[0])) }) t.Run("multi-key", func(t *testing.T) { + assert := assert.New(t) // // add a second key fcc.Set("k1", "v1") fcc.Set("k2", "v21") @@ -44,6 +46,7 @@ func TestHTTPHeadersCarrierSet(t *testing.T) { assert.Equal("v21", string(fcc.ReqHeader.Peek("k2"))) }) t.Run("case insensitive", func(t *testing.T) { + assert := assert.New(t) // new key fcc.Set("K3", "v31") assert.Equal("v31", string(fcc.ReqHeader.Peek("k3"))) @@ -71,7 +74,7 @@ func TestHTTPHeadersCarrierForeachKey(t *testing.T) { fcc := &HTTPHeadersCarrier{ ReqHeader: h, } - err := fcc.ForeachKey(func(k, v string) error { + err := fcc.ForeachKey(func(k, _ string) error { delete(headers, k) return nil }) diff --git a/contrib/internal/fasthttptrace/fasthttptrace.go b/contrib/valyala/fasthttp/fasthttptrace.go similarity index 80% rename from contrib/internal/fasthttptrace/fasthttptrace.go rename to contrib/valyala/fasthttp/fasthttptrace.go index e03b249193..aaa2bfa534 100644 --- a/contrib/internal/fasthttptrace/fasthttptrace.go +++ b/contrib/valyala/fasthttp/fasthttptrace.go @@ -3,11 +3,10 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package fasthttptrace +package fasthttp import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/valyala/fasthttp" ) @@ -17,8 +16,8 @@ import ( // The resulting span is then set on the given `fctx`. // This function is similar to tracer.StartSpanFromContext, but it modifies the given fasthttp context directly. // If the ChildOf option is passed, it will only be used as the parent if there is no span found in `fctx`. -func StartSpanFromContext(fctx *fasthttp.RequestCtx, operationName string, opts ...tracer.StartSpanOption) tracer.Span { +func StartSpanFromContext(fctx *fasthttp.RequestCtx, operationName string, opts ...tracer.StartSpanOption) *tracer.Span { s, _ := tracer.StartSpanFromContext(fctx, operationName, opts...) - fctx.SetUserValue(internal.ActiveSpanKey, s) + fctx.SetUserValue(instr.ActiveSpanKey(), s) return s } diff --git a/contrib/internal/fasthttptrace/fasthttptrace_test.go b/contrib/valyala/fasthttp/fasthttptrace_test.go similarity index 76% rename from contrib/internal/fasthttptrace/fasthttptrace_test.go rename to contrib/valyala/fasthttp/fasthttptrace_test.go index 9c5b474915..f00b4e0f7b 100644 --- a/contrib/internal/fasthttptrace/fasthttptrace_test.go +++ b/contrib/valyala/fasthttp/fasthttptrace_test.go @@ -3,13 +3,12 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package fasthttptrace +package fasthttp import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" "github.com/stretchr/testify/assert" "github.com/valyala/fasthttp" @@ -21,6 +20,6 @@ func TestStartSpanFromContext(t *testing.T) { defer mt.Stop() fctx := &fasthttp.RequestCtx{} activeSpan := StartSpanFromContext(fctx, "myOp") - keySpan := fctx.UserValue(internal.ActiveSpanKey) + keySpan := fctx.UserValue(instr.ActiveSpanKey()) assert.Equal(activeSpan, keySpan) } diff --git a/contrib/valyala/fasthttp/go.mod b/contrib/valyala/fasthttp/go.mod new file mode 100644 index 0000000000..ea04cdbffb --- /dev/null +++ b/contrib/valyala/fasthttp/go.mod @@ -0,0 +1,98 @@ +module github.com/DataDog/dd-trace-go/contrib/valyala/fasthttp/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/stretchr/testify v1.11.1 + github.com/valyala/fasthttp v1.51.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/contrib/valyala/fasthttp/go.sum b/contrib/valyala/fasthttp/go.sum new file mode 100644 index 0000000000..39a7558c3c --- /dev/null +++ b/contrib/valyala/fasthttp/go.sum @@ -0,0 +1,315 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/valyala/fasthttp.v1/option.go b/contrib/valyala/fasthttp/option.go similarity index 69% rename from contrib/valyala/fasthttp.v1/option.go rename to contrib/valyala/fasthttp/option.go index 339301098f..57c2f0a1f5 100644 --- a/contrib/valyala/fasthttp.v1/option.go +++ b/contrib/valyala/fasthttp/option.go @@ -7,35 +7,44 @@ package fasthttp import ( "github.com/valyala/fasthttp" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) -const defaultServiceName = "fasthttp" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) type config struct { serviceName string spanName string - spanOpts []ddtrace.StartSpanOption + spanOpts []tracer.StartSpanOption isStatusError func(int) bool resourceNamer func(*fasthttp.RequestCtx) string ignoreRequest func(*fasthttp.RequestCtx) bool } -type Option func(*config) +// Option describes options for the FastHTTP integration. +type Option interface { + apply(*config) +} + +// OptionFn represents options applicable to WrapHandler. +type OptionFn func(*config) + +func (fn OptionFn) apply(cfg *config) { + fn(cfg) +} func newConfig() *config { return &config{ - serviceName: namingschema.ServiceName(defaultServiceName), - spanName: namingschema.OpName(namingschema.HTTPServer), + serviceName: instr.ServiceName(instrumentation.ComponentServer, nil), + spanName: instr.OperationName(instrumentation.ComponentServer, nil), isStatusError: defaultIsServerError, resourceNamer: defaultResourceNamer, ignoreRequest: defaultIgnoreRequest, } } -// WithServiceName sets the given service name for the router. -func WithServiceName(name string) Option { +// WithService sets the given service name for the router. +func WithService(name string) OptionFn { return func(cfg *config) { cfg.serviceName = name } @@ -43,14 +52,14 @@ func WithServiceName(name string) Option { // WithSpanOptions applies the given set of options to the spans started // by the router. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { +func WithSpanOptions(opts ...tracer.StartSpanOption) OptionFn { return func(cfg *config) { cfg.spanOpts = opts } } // WithStatusCheck allows customization over which status code(s) to consider "error" -func WithStatusCheck(fn func(statusCode int) bool) Option { +func WithStatusCheck(fn func(statusCode int) bool) OptionFn { return func(cfg *config) { cfg.isStatusError = fn } @@ -58,7 +67,7 @@ func WithStatusCheck(fn func(statusCode int) bool) Option { // WithResourceNamer specifies a function which will be used to // obtain the resource name for a given request -func WithResourceNamer(fn func(fctx *fasthttp.RequestCtx) string) Option { +func WithResourceNamer(fn func(fctx *fasthttp.RequestCtx) string) OptionFn { return func(cfg *config) { cfg.resourceNamer = fn } @@ -66,7 +75,7 @@ func WithResourceNamer(fn func(fctx *fasthttp.RequestCtx) string) Option { // WithIgnoreRequest specifies a function to use for determining if the // incoming HTTP request tracing should be skipped. -func WithIgnoreRequest(f func(fctx *fasthttp.RequestCtx) bool) Option { +func WithIgnoreRequest(f func(fctx *fasthttp.RequestCtx) bool) OptionFn { return func(cfg *config) { cfg.ignoreRequest = f } diff --git a/contrib/zenazn/goji.v1/web/example_test.go b/contrib/zenazn/goji.v1/web/example_test.go deleted file mode 100644 index ec7051c4f0..0000000000 --- a/contrib/zenazn/goji.v1/web/example_test.go +++ /dev/null @@ -1,28 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package web_test - -import ( - "fmt" - "net/http" - - webtrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/zenazn/goji.v1/web" - - "github.com/zenazn/goji" - "github.com/zenazn/goji/web" -) - -func ExampleMiddleware() { - // Using the Router middleware lets the tracer determine routes for - // use in a trace's resource name ("GET /user/:id") - // Otherwise the resource is only the method ("GET", "POST", etc.) - goji.Use(goji.DefaultMux.Router) - goji.Use(webtrace.Middleware()) - goji.Get("/hello", func(c web.C, w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Why hello there!") - }) - goji.Serve() -} diff --git a/contrib/zenazn/goji.v1/web/goji.go b/contrib/zenazn/goji.v1/web/goji.go deleted file mode 100644 index 7efe46d8aa..0000000000 --- a/contrib/zenazn/goji.v1/web/goji.go +++ /dev/null @@ -1,73 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package web provides functions to trace the zenazn/goji/web package (https://github.com/zenazn/goji). -package web // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/zenazn/goji.v1/web" - -import ( - "fmt" - "math" - "net/http" - "sync" - - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "github.com/zenazn/goji/web" -) - -const componentName = "zenazn/goji.v1/web" - -func init() { - telemetry.LoadIntegration(componentName) - tracer.MarkIntegrationImported("github.com/zenazn/goji") -} - -// Middleware returns a goji middleware function that will trace incoming requests. -// If goji's Router middleware is also installed, the tracer will be able to determine -// the original route name (e.g. "/user/:id"), and include it as part of the traces' resource -// names. -func Middleware(opts ...Option) func(*web.C, http.Handler) http.Handler { - var ( - cfg config - warnonce sync.Once - ) - defaults(&cfg) - for _, fn := range opts { - fn(&cfg) - } - if !math.IsNaN(cfg.analyticsRate) { - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.EventSampleRate, cfg.analyticsRate)) - } - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.Component, componentName)) - cfg.spanOpts = append(cfg.spanOpts, tracer.Tag(ext.SpanKind, ext.SpanKindServer)) - - log.Debug("contrib/zenazn/goji.v1/web: Configuring Middleware: %#v", cfg) - return func(c *web.C, h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - resource := r.Method - p := web.GetMatch(*c).RawPattern() - route := "" - if p != nil { - route = fmt.Sprintf("%s", p) - resource = resource + " " + route - } else { - warnonce.Do(func() { - log.Warn("contrib/zenazn/goji.v1/web: routes are unavailable. To enable them add the goji Router middleware before the tracer middleware.") - }) - } - httptrace.TraceAndServe(h, w, r, &httptrace.ServeConfig{ - Service: cfg.serviceName, - Resource: resource, - FinishOpts: cfg.finishOpts, - SpanOpts: cfg.spanOpts, - Route: route, - }) - }) - } -} diff --git a/contrib/zenazn/goji.v1/web/goji_test.go b/contrib/zenazn/goji.v1/web/goji_test.go deleted file mode 100644 index d9f9d924f0..0000000000 --- a/contrib/zenazn/goji.v1/web/goji_test.go +++ /dev/null @@ -1,271 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package web - -import ( - "fmt" - "net/http" - "net/http/httptest" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/namingschematest" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/zenazn/goji/web" -) - -func TestNoRouter(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - m := web.New() - m.Use(Middleware(WithServiceName("my-router"))) - m.Get("/user/:id", func(c web.C, w http.ResponseWriter, r *http.Request) { - w.Write([]byte("OK")) - }) - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - m.ServeHTTP(w, r) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - if len(spans) < 1 { - t.Fatalf("no spans") - } - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Equal("my-router", span.Tag(ext.ServiceName)) - assert.Equal("GET", span.Tag(ext.ResourceName)) - assert.Equal("200", span.Tag(ext.HTTPCode)) - assert.Equal("GET", span.Tag(ext.HTTPMethod)) - assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) - assert.Equal("zenazn/goji.v1/web", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - assert.NotContains(span.Tags(), ext.HTTPRoute) -} - -func TestTraceWithRouter(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - m := web.New() - m.Use(m.Router) - m.Use(Middleware(WithServiceName("my-router"))) - m.Get("/user/:id", func(c web.C, w http.ResponseWriter, r *http.Request) { - span, ok := tracer.SpanFromContext(r.Context()) - assert.True(ok) - assert.Equal(span.(mocktracer.Span).Tag(ext.ServiceName), "my-router") - id := c.URLParams["id"] - w.Write([]byte(id)) - }) - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - m.ServeHTTP(w, r) - response := w.Result() - defer response.Body.Close() - assert.Equal(response.StatusCode, 200) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - if len(spans) < 1 { - t.Fatalf("no spans") - } - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal(ext.SpanTypeWeb, span.Tag(ext.SpanType)) - assert.Equal("my-router", span.Tag(ext.ServiceName)) - assert.Equal("GET /user/:id", span.Tag(ext.ResourceName)) - assert.Equal("200", span.Tag(ext.HTTPCode)) - assert.Equal("GET", span.Tag(ext.HTTPMethod)) - assert.Equal("http://example.com/user/123", span.Tag(ext.HTTPURL)) - assert.Equal("zenazn/goji.v1/web", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) - assert.Equal("/user/:id", span.Tag(ext.HTTPRoute)) -} - -func TestError(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - m := web.New() - m.Use(Middleware(WithServiceName("my-router"))) - code := 500 - wantErr := fmt.Sprintf("%d: %s", code, http.StatusText(code)) - m.Get("/err", func(w http.ResponseWriter, r *http.Request) { - http.Error(w, fmt.Sprintf("%d!", code), code) - }) - r := httptest.NewRequest("GET", "/err", nil) - w := httptest.NewRecorder() - m.ServeHTTP(w, r) - response := w.Result() - defer response.Body.Close() - assert.Equal(response.StatusCode, 500) - - spans := mt.FinishedSpans() - assert.Len(spans, 1) - if len(spans) < 1 { - t.Fatalf("no spans") - } - span := spans[0] - assert.Equal("http.request", span.OperationName()) - assert.Equal("my-router", span.Tag(ext.ServiceName)) - assert.Equal("500", span.Tag(ext.HTTPCode)) - assert.Equal(wantErr, span.Tag(ext.Error).(error).Error()) - assert.Equal("zenazn/goji.v1/web", span.Tag(ext.Component)) - assert.Equal(ext.SpanKindServer, span.Tag(ext.SpanKind)) -} - -func TestPropagation(t *testing.T) { - assert := assert.New(t) - mt := mocktracer.Start() - defer mt.Stop() - - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - pspan := tracer.StartSpan("test") - tracer.Inject(pspan.Context(), tracer.HTTPHeadersCarrier(r.Header)) - m := web.New() - m.Use(Middleware(WithServiceName("my-router"))) - m.Get("/user/:id", func(w http.ResponseWriter, r *http.Request) { - span, ok := tracer.SpanFromContext(r.Context()) - assert.True(ok) - assert.Equal(span.(mocktracer.Span).ParentID(), pspan.(mocktracer.Span).SpanID()) - }) - - m.ServeHTTP(w, r) - resp := w.Result() - defer resp.Body.Close() - assert.Equal(200, resp.StatusCode) -} - -func TestOptions(t *testing.T) { - assertRate := func(t *testing.T, mt mocktracer.Tracer, rate interface{}, opts ...Option) { - m := web.New() - m.Use(Middleware(opts...)) - m.Get("/user/:id", func(w http.ResponseWriter, r *http.Request) { - _, ok := tracer.SpanFromContext(r.Context()) - assert.True(t, ok) - }) - - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - - m.ServeHTTP(w, r) - spans := mt.FinishedSpans() - assert.Len(t, spans, 1) - s := spans[0] - assert.Equal(t, rate, s.Tag(ext.EventSampleRate)) - } - - t.Run("defaults", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil) - }) - - t.Run("global", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.4) - }) - - t.Run("enabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, 1.0, WithAnalytics(true)) - }) - - t.Run("disabled", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - assertRate(t, mt, nil, WithAnalytics(false)) - }) - - t.Run("override", func(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - rate := globalconfig.AnalyticsRate() - defer globalconfig.SetAnalyticsRate(rate) - globalconfig.SetAnalyticsRate(0.4) - - assertRate(t, mt, 0.23, WithAnalyticsRate(0.23)) - }) -} - -func TestNoDebugStack(t *testing.T) { - mt := mocktracer.Start() - defer mt.Stop() - - m := web.New() - m.Use(Middleware(NoDebugStack())) - m.Get("/user/:id", func(w http.ResponseWriter, r *http.Request) { - http.Error(w, "failed", http.StatusInternalServerError) - }) - - r := httptest.NewRequest("GET", "/user/123", nil) - w := httptest.NewRecorder() - - m.ServeHTTP(w, r) - spans := mt.FinishedSpans() - assert.Len(t, spans, 1) - s := spans[0] - assert.EqualError(t, s.Tags()[ext.Error].(error), "500: Internal Server Error") - assert.Equal(t, "", spans[0].Tags()[ext.ErrorStack]) - assert.Equal(t, "zenazn/goji.v1/web", spans[0].Tag(ext.Component)) - assert.Equal(t, ext.SpanKindServer, spans[0].Tag(ext.SpanKind)) -} - -func TestNamingSchema(t *testing.T) { - genSpans := namingschematest.GenSpansFn(func(t *testing.T, serviceOverride string) []mocktracer.Span { - var opts []Option - if serviceOverride != "" { - opts = append(opts, WithServiceName(serviceOverride)) - } - mt := mocktracer.Start() - defer mt.Stop() - - mux := web.New() - mux.Use(Middleware(opts...)) - mux.Get("/200", func(w http.ResponseWriter, r *http.Request) { - _, err := w.Write([]byte("ok")) - require.NoError(t, err) - }) - r := httptest.NewRequest("GET", "/200", nil) - w := httptest.NewRecorder() - mux.ServeHTTP(w, r) - - return mt.FinishedSpans() - }) - wantServiceNameV0 := namingschematest.ServiceNameAssertions{ - WithDefaults: []string{"http.router"}, - WithDDService: []string{"http.router"}, - WithDDServiceAndOverride: []string{namingschematest.TestServiceOverride}, - } - namingschematest.NewHTTPServerTest( - genSpans, - "http.router", - namingschematest.WithServiceNameAssertions(namingschema.SchemaV0, wantServiceNameV0), - )(t) -} diff --git a/contrib/zenazn/goji.v1/web/option.go b/contrib/zenazn/goji.v1/web/option.go deleted file mode 100644 index c932f1af23..0000000000 --- a/contrib/zenazn/goji.v1/web/option.go +++ /dev/null @@ -1,83 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package web - -import ( - "math" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" -) - -const defaultServiceName = "http.router" - -type config struct { - serviceName string - spanOpts []ddtrace.StartSpanOption - finishOpts []ddtrace.FinishOption - analyticsRate float64 -} - -// Option represents an option that can be passed to New. -type Option func(*config) - -func defaults(cfg *config) { - if internal.BoolEnv("DD_TRACE_GOJI_ANALYTICS_ENABLED", false) { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = globalconfig.AnalyticsRate() - } - cfg.serviceName = namingschema.ServiceNameOverrideV0(defaultServiceName, defaultServiceName) -} - -// WithServiceName sets the given service name for the returned mux. -func WithServiceName(name string) Option { - return func(cfg *config) { - cfg.serviceName = name - } -} - -// WithSpanOptions applies the given set of options to the span started by the mux. -func WithSpanOptions(opts ...ddtrace.StartSpanOption) Option { - return func(cfg *config) { - cfg.spanOpts = opts - } -} - -// NoDebugStack prevents stack traces from being attached to spans finishing -// with an error. This is useful in situations where errors are frequent and -// performance is critical. -func NoDebugStack() Option { - return func(cfg *config) { - cfg.finishOpts = append(cfg.finishOpts, tracer.NoDebugStack()) - } -} - -// WithAnalytics enables Trace Analytics for all started spans. -func WithAnalytics(on bool) Option { - return func(cfg *config) { - if on { - cfg.analyticsRate = 1.0 - } else { - cfg.analyticsRate = math.NaN() - } - } -} - -// WithAnalyticsRate sets the sampling rate for Trace Analytics events -// correlated to started spans. -func WithAnalyticsRate(rate float64) Option { - return func(cfg *config) { - if rate >= 0.0 && rate <= 1.0 { - cfg.analyticsRate = rate - } else { - cfg.analyticsRate = math.NaN() - } - } -} diff --git a/datastreams/options/options.go b/datastreams/options/options.go index 7b2d626ce1..066477f726 100644 --- a/datastreams/options/options.go +++ b/datastreams/options/options.go @@ -6,5 +6,6 @@ package options type CheckpointParams struct { - PayloadSize int64 + PayloadSize int64 + ServiceOverride string } diff --git a/datastreams/pathway.go b/datastreams/pathway.go index 233fd6cad4..828e843445 100644 --- a/datastreams/pathway.go +++ b/datastreams/pathway.go @@ -8,7 +8,7 @@ package datastreams import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" ) type Pathway interface { diff --git a/datastreams/propagation.go b/datastreams/propagation.go index ca657b9d80..9229048b08 100644 --- a/datastreams/propagation.go +++ b/datastreams/propagation.go @@ -8,7 +8,7 @@ package datastreams import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" ) // MergeContexts returns the first context which includes the pathway resulting from merging the pathways diff --git a/datastreams/propagation_test.go b/datastreams/propagation_test.go index f29960cdeb..0209f72d24 100644 --- a/datastreams/propagation_test.go +++ b/datastreams/propagation_test.go @@ -9,9 +9,9 @@ import ( "context" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" "github.com/stretchr/testify/assert" ) diff --git a/ddtrace/baggage/baggage.go b/ddtrace/baggage/baggage.go new file mode 100644 index 0000000000..a3a97889f2 --- /dev/null +++ b/ddtrace/baggage/baggage.go @@ -0,0 +1,83 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package baggage + +import ( + "context" + "maps" +) + +// baggageKey is an unexported type used as a context key. It is used to store baggage in the context. +// We use a struct{} so it won't conflict with keys from other packages. +type baggageKey struct{} + +// baggageMap returns the baggage map from the given context and a bool indicating +// whether the baggage exists or not. If the bool is false, the returned map is nil. +func baggageMap(ctx context.Context) (map[string]string, bool) { + val := ctx.Value(baggageKey{}) + bm, ok := val.(map[string]string) + if !ok { + // val was nil or not a map[string]string + return nil, false + } + return bm, true +} + +// withBaggage returns a new context with the given baggage map set. +func withBaggage(ctx context.Context, baggage map[string]string) context.Context { + return context.WithValue(ctx, baggageKey{}, baggage) +} + +// Set sets or updates a single baggage key/value pair in the context. +// If the key already exists, this function overwrites the existing value. +func Set(ctx context.Context, key, value string) context.Context { + bm, ok := baggageMap(ctx) + if !ok || bm == nil { + // If there's no baggage map yet, or it's nil, create one + bm = make(map[string]string) + } else { + bm = maps.Clone(bm) + } + bm[key] = value + return withBaggage(ctx, bm) +} + +// Get retrieves the value associated with a baggage key. +// If the key isn't found, it returns an empty string. +func Get(ctx context.Context, key string) (string, bool) { + bm, ok := baggageMap(ctx) + if !ok { + return "", false + } + value, ok := bm[key] + return value, ok +} + +// Remove removes the specified key from the baggage (if present). +func Remove(ctx context.Context, key string) context.Context { + bm, ok := baggageMap(ctx) + if !ok || bm == nil { + // nothing to remove + return ctx + } + bmCopy := maps.Clone(bm) + delete(bmCopy, key) + return withBaggage(ctx, bmCopy) +} + +// All returns a **copy** of all baggage items in the context, +func All(ctx context.Context) map[string]string { + bm, ok := baggageMap(ctx) + if !ok { + return nil + } + return maps.Clone(bm) +} + +// Clear completely removes all baggage items from the context. +func Clear(ctx context.Context) context.Context { + return withBaggage(ctx, nil) +} diff --git a/ddtrace/baggage/baggage_test.go b/ddtrace/baggage/baggage_test.go new file mode 100644 index 0000000000..d85571bd3f --- /dev/null +++ b/ddtrace/baggage/baggage_test.go @@ -0,0 +1,230 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package baggage + +import ( + "context" + "fmt" + "runtime" + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBaggageFunctions(t *testing.T) { + t.Run("Set and Get", func(t *testing.T) { + ctx := context.Background() + + // Set a key/value in the baggage + ctx = Set(ctx, "foo", "bar") + + // Retrieve that value + got, ok := Get(ctx, "foo") + if !ok { + t.Error("Expected key \"foo\" to be found in baggage, got ok=false") + } + if got != "bar" { + t.Errorf("Baggage(ctx, \"foo\") = %q; want \"bar\"", got) + } + + // Ensure retrieving a non-existent key returns an empty string and false + got, ok = Get(ctx, "missingKey") + if ok { + t.Error("Expected key \"missingKey\" to not be found, got ok=true") + } + if got != "" { + t.Errorf("Baggage(ctx, \"missingKey\") = %q; want \"\"", got) + } + }) + + t.Run("All", func(t *testing.T) { + ctx := context.Background() + + // Set multiple baggage entries + ctx = Set(ctx, "key1", "value1") + ctx = Set(ctx, "key2", "value2") + + // Retrieve all baggage entries + all := All(ctx) + if len(all) != 2 { + t.Fatalf("Expected 2 items in baggage; got %d", len(all)) + } + + // Check each entry + if all["key1"] != "value1" { + t.Errorf("all[\"key1\"] = %q; want \"value1\"", all["key1"]) + } + if all["key2"] != "value2" { + t.Errorf("all[\"key2\"] = %q; want \"value2\"", all["key2"]) + } + + // Confirm returned map is a copy, not the original + all["key1"] = "modified" + val, _ := Get(ctx, "key1") + if val == "modified" { + t.Error("AllBaggage returned a map that mutates the original baggage!") + } + }) + + t.Run("Remove", func(t *testing.T) { + ctx := context.Background() + + // Add baggage to remove + ctx = Set(ctx, "deleteMe", "toBeRemoved") + + // Remove it + ctx = Remove(ctx, "deleteMe") + + // Verify removal + got, ok := Get(ctx, "deleteMe") + if ok { + t.Error("Expected key \"deleteMe\" to be removed, got ok=true") + } + if got != "" { + t.Errorf("Expected empty string for removed key; got %q", got) + } + }) + + t.Run("Clear", func(t *testing.T) { + ctx := context.Background() + + // Add multiple items + ctx = Set(ctx, "k1", "v1") + ctx = Set(ctx, "k2", "v2") + + // Clear all baggage + ctx = Clear(ctx) + + // Check that everything is gone + all := All(ctx) + if len(all) != 0 { + t.Errorf("Expected no items after clearing baggage; got %d", len(all)) + } + }) + + t.Run("withBaggage", func(t *testing.T) { + ctx := context.Background() + + // Create a map and insert into context directly + initialMap := map[string]string{"customKey": "customValue"} + ctx = withBaggage(ctx, initialMap) + + // Verify + got, _ := Get(ctx, "customKey") + if got != "customValue" { + t.Errorf("Baggage(ctx, \"customKey\") = %q; want \"customValue\"", got) + } + }) + + t.Run("explicitOkCheck", func(t *testing.T) { + ctx := context.Background() + + // Check an unset key + val, ok := Get(ctx, "unsetKey") + if ok { + t.Errorf("Expected unset key to return ok=false, got ok=true with val=%q", val) + } + + ctx = Set(ctx, "testKey", "testVal") + val, ok = Get(ctx, "testKey") + if !ok { + t.Error("Expected key \"testKey\" to be present, got ok=false") + } + if val != "testVal" { + t.Errorf("Expected \"testVal\"; got %q", val) + } + }) +} + +func TestBaggageMapAccessorsMakeCopies(t *testing.T) { + t.Run("Set", func(t *testing.T) { + firstMap := map[string]string{"key": "value"} + ctx := withBaggage(context.Background(), firstMap) + ctx = Set(ctx, "key2", "value2") + + // Verify that the new map is a copy of the original + nextMap, ok := baggageMap(ctx) + assert.True(t, ok) + assert.False(t, &firstMap == &nextMap, "Set should create a new map, not reuse the original") + + // Mutate the new map and ensure the original is unchanged + nextMap["key"] = "changed" + assert.Equal(t, "value", firstMap["key"], "Original map should not be affected by changes to the new map") + + // Check that both keys are present in the new map + assert.Equal(t, "changed", nextMap["key"], "New map should have the new key") + assert.Equal(t, "value2", nextMap["key2"], "New map should have the new key") + }) + t.Run("Remove", func(t *testing.T) { + firstMap := map[string]string{"key": "value"} + ctx := withBaggage(context.Background(), firstMap) + ctx = Remove(ctx, "key") + + // Verify that the new map is a copy of the original + nextMap, ok := baggageMap(ctx) + assert.True(t, ok) + assert.False(t, &firstMap == &nextMap, "Remove should create a new map, not reuse the original") + + // Mutate the new map and ensure the original is unchanged + nextMap["key"] = "changed" + assert.Equal(t, "value", firstMap["key"], "Original map should not be affected by changes to the new map") + }) + t.Run("All", func(t *testing.T) { + firstMap := map[string]string{"key": "value"} + ctx := withBaggage(context.Background(), firstMap) + all := All(ctx) + assert.False(t, &firstMap == &all, "All should return a new map, not the original map instance") + + // Mutate the new map and ensure the original is unchanged + all["key"] = "changed" + assert.Equal(t, "value", firstMap["key"], "Original map should not be affected by changes to the new map") + }) +} + +// guarantees we also test the Clear→Set path +func TestConcurrentAccessAndClear(t *testing.T) { + base := Set(context.Background(), "init", "val") + want := All(base) + const readers = 4 + const writers = 4 + const iters = 100 + var wg sync.WaitGroup + wg.Add(readers + writers) + errCh := make(chan string, readers) + // Readers – must ALWAYS observe the original baggage + for r := 0; r < readers; r++ { + go func(c context.Context) { + defer wg.Done() + for i := 0; i < iters; i++ { + if !assert.Equal(t, want, All(c), "baggage mutated") { + errCh <- fmt.Sprintf("baggage mutated: want %v, got %v", want, All(c)) + return + } + runtime.Gosched() + } + }(base) + } + // Writers – they fork their own context chains, never sharing variables + for w := 0; w < writers; w++ { + go func(c context.Context) { + defer wg.Done() + local := c + for i := 0; i < iters; i++ { + // alternates Set / Clear / Set to hit the nil‑map path + local = Set(local, "k", "v") + local = Clear(local) + local = Set(local, "k2", "v2") + runtime.Gosched() + } + }(base) + } + wg.Wait() + close(errCh) + if err, ok := <-errCh; ok { + t.Fatalf("%s", err) + } +} diff --git a/ddtrace/ddtrace.go b/ddtrace/ddtrace.go index e311b5ff25..50995204f2 100644 --- a/ddtrace/ddtrace.go +++ b/ddtrace/ddtrace.go @@ -5,77 +5,12 @@ // Package ddtrace contains the interfaces that specify the implementations of Datadog's // tracing library, as well as a set of sub-packages containing various implementations: -// our native implementation ("tracer"), a wrapper that can be used with Opentracing -// ("opentracer") and a mock tracer to be used for testing ("mocktracer"). Additionally, -// package "ext" provides a set of tag names and values specific to Datadog's APM product. +// our native implementation ("tracer") and a mock tracer to be used for testing ("mocktracer"). +// Additionally, package "ext" provides a set of tag names and values specific to Datadog's APM product. // // To get started, visit the documentation for any of the packages you'd like to begin -// with by accessing the subdirectories of this package: https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/ddtrace#pkg-subdirectories. -package ddtrace // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - -import ( - "context" - "time" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" -) - -// SpanContextW3C represents a SpanContext with an additional method to allow -// access of the 128-bit trace id of the span, if present. -type SpanContextW3C interface { - SpanContext - - // TraceID128 returns the hex-encoded 128-bit trace ID that this context is carrying. - // The string will be exactly 32 bytes and may include leading zeroes. - TraceID128() string - - // TraceID128 returns the raw bytes of the 128-bit trace ID that this context is carrying. - TraceID128Bytes() [16]byte -} - -// Tracer specifies an implementation of the Datadog tracer which allows starting -// and propagating spans. The official implementation if exposed as functions -// within the "tracer" package. -type Tracer interface { - // StartSpan starts a span with the given operation name and options. - StartSpan(operationName string, opts ...StartSpanOption) Span - - // Extract extracts a span context from a given carrier. Note that baggage item - // keys will always be lower-cased to maintain consistency. It is impossible to - // maintain the original casing due to MIME header canonicalization standards. - Extract(carrier interface{}) (SpanContext, error) - - // Inject injects a span context into the given carrier. - Inject(context SpanContext, carrier interface{}) error - - // Stop stops the tracer. Calls to Stop should be idempotent. - Stop() -} - -// Span represents a chunk of computation time. Spans have names, durations, -// timestamps and other metadata. A Tracer is used to create hierarchies of -// spans in a request, buffer and submit them to the server. -type Span interface { - // SetTag sets a key/value pair as metadata on the span. - SetTag(key string, value interface{}) - - // SetOperationName sets the operation name for this span. An operation name should be - // a representative name for a group of spans (e.g. "grpc.server" or "http.request"). - SetOperationName(operationName string) - - // BaggageItem returns the baggage item held by the given key. - BaggageItem(key string) string - - // SetBaggageItem sets a new baggage item at the given key. The baggage - // item should propagate to all descendant spans, both in- and cross-process. - SetBaggageItem(key, val string) - - // Finish finishes the current span with the given options. Finish calls should be idempotent. - Finish(opts ...FinishOption) - - // Context returns the SpanContext of this Span. - Context() SpanContext -} +// with by accessing the subdirectories of this package: https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/ddtrace#pkg-subdirectories. +package ddtrace // import "github.com/DataDog/dd-trace-go/v2/ddtrace" // SpanContext represents a span state that can propagate to descendant spans // and across process boundaries. It contains all the information needed to @@ -86,95 +21,16 @@ type SpanContext interface { SpanID() uint64 // TraceID returns the trace ID that this context is carrying. - TraceID() uint64 + TraceID() string + + // TraceID128 returns the raw bytes of the 128-bit trace ID that this context is carrying. + TraceIDBytes() [16]byte + + // TraceIDLower returns the lower part of the trace ID that this context is carrying. + TraceIDLower() uint64 // ForeachBaggageItem provides an iterator over the key/value pairs set as // baggage within this context. Iteration stops when the handler returns // false. ForeachBaggageItem(handler func(k, v string) bool) } - -// SpanLink represents a reference to a span that exists outside of the trace. -// -//go:generate msgp -unexported -marshal=false -o=span_link_msgp.go -tests=false - -type SpanLink struct { - // TraceID represents the low 64 bits of the linked span's trace id. This field is required. - TraceID uint64 `msg:"trace_id" json:"trace_id"` - // TraceIDHigh represents the high 64 bits of the linked span's trace id. This field is only set if the linked span's trace id is 128 bits. - TraceIDHigh uint64 `msg:"trace_id_high,omitempty" json:"trace_id_high"` - // SpanID represents the linked span's span id. - SpanID uint64 `msg:"span_id" json:"span_id"` - // Attributes is a mapping of keys to string values. These values are used to add additional context to the span link. - Attributes map[string]string `msg:"attributes,omitempty" json:"attributes"` - // Tracestate is the tracestate of the linked span. This field is optional. - Tracestate string `msg:"tracestate,omitempty" json:"tracestate"` - // Flags represents the W3C trace flags of the linked span. This field is optional. - Flags uint32 `msg:"flags,omitempty" json:"flags"` -} - -// StartSpanOption is a configuration option that can be used with a Tracer's StartSpan method. -type StartSpanOption func(cfg *StartSpanConfig) - -// FinishOption is a configuration option that can be used with a Span's Finish method. -type FinishOption func(cfg *FinishConfig) - -// FinishConfig holds the configuration for finishing a span. It is usually passed around by -// reference to one or more FinishOption functions which shape it into its final form. -type FinishConfig struct { - // FinishTime represents the time that should be set as finishing time for the - // span. Implementations should use the current time when FinishTime.IsZero(). - FinishTime time.Time - - // Error holds an optional error that should be set on the span before - // finishing. - Error error - - // NoDebugStack will prevent any set errors from generating an attached stack trace tag. - NoDebugStack bool - - // StackFrames specifies the number of stack frames to be attached in spans that finish with errors. - StackFrames uint - - // SkipStackFrames specifies the offset at which to start reporting stack frames from the stack. - SkipStackFrames uint -} - -// StartSpanConfig holds the configuration for starting a new span. It is usually passed -// around by reference to one or more StartSpanOption functions which shape it into its -// final form. -type StartSpanConfig struct { - // Parent holds the SpanContext that should be used as a parent for the - // new span. If nil, implementations should return a root span. - Parent SpanContext - - // StartTime holds the time that should be used as the start time of the span. - // Implementations should use the current time when StartTime.IsZero(). - StartTime time.Time - - // Tags holds a set of key/value pairs that should be set as metadata on the - // new span. - Tags map[string]interface{} - - // SpanID will be the SpanID of the Span, overriding the random number that would - // be generated. If no Parent SpanContext is present, then this will also set the - // TraceID to the same value. - SpanID uint64 - - // Context is the parent context where the span should be stored. - Context context.Context - - // SpanLink represents a causal relationship between two spans. A span can have multiple links. - SpanLinks []SpanLink -} - -// Logger implementations are able to log given messages that the tracer or profiler might output. -type Logger interface { - // Log prints the given message. - Log(msg string) -} - -// UseLogger sets l as the logger for all tracer and profiler logs. -func UseLogger(l Logger) { - log.UseLogger(l) -} diff --git a/ddtrace/example_test.go b/ddtrace/example_test.go index 29217082ce..5c8dd41bdb 100644 --- a/ddtrace/example_test.go +++ b/ddtrace/example_test.go @@ -9,14 +9,12 @@ import ( "fmt" "log" "os" + "os/signal" + "syscall" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - opentracing "github.com/opentracing/opentracing-go" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) // The below example illustrates a simple use case using the "tracer" package, @@ -27,20 +25,24 @@ func Example_datadog() { tracer.Start(tracer.WithAgentAddr("host:port")) defer tracer.Stop() + // If you expect your application to be shutdown via SIGTERM (e.g. a container in k8s) + // You likely want to listen for that signal and stop the tracer to ensure no data is lost + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGTERM) + go func() { + <-sigChan + tracer.Stop() + }() + // Start a root span. span := tracer.StartSpan("get.data") defer span.Finish() // Create a child of it, computing the time needed to read a file. - child := tracer.StartSpan("read.file", tracer.ChildOf(span.Context())) + child := span.StartChild("read.file") child.SetTag(ext.ResourceName, "test.json") - // If you are using 128 bit trace ids and want to generate the high - // order bits, cast the span's context to ddtrace.SpanContextW3C. - // See Issue #1677 - if w3Cctx, ok := child.Context().(ddtrace.SpanContextW3C); ok { - fmt.Printf("128 bit trace id = %s\n", w3Cctx.TraceID128()) - } + fmt.Printf("128 bit trace id = %s\n", child.Context().TraceID()) // Perform an operation. _, err := os.ReadFile("~/test.json") @@ -53,19 +55,6 @@ func Example_datadog() { } } -// The below example illustrates how to set up an opentracing.Tracer using Datadog's -// tracer. -func Example_opentracing() { - // Start a Datadog tracer, optionally providing a set of options, - // returning an opentracing.Tracer which wraps it. - t := opentracer.New(tracer.WithAgentAddr("host:port")) - defer tracer.Stop() // important for data integrity (flushes any leftovers) - - // Use it with the Opentracing API. The (already started) Datadog tracer - // may be used in parallel with the Opentracing API if desired. - opentracing.SetGlobalTracer(t) -} - // The code below illustrates a scenario of how one could use a mock tracer in tests // to assert that spans are created correctly. func Example_mocking() { diff --git a/ddtrace/ext/app_types.go b/ddtrace/ext/app_types.go index eb6ded8f60..5561b63e33 100644 --- a/ddtrace/ext/app_types.go +++ b/ddtrace/ext/app_types.go @@ -3,16 +3,11 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package ext // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" +package ext // import "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" // App types determine how to categorize a trace in the Datadog application. // For more fine-grained behaviour, use the SpanType* constants. const ( - // DEPRECATED: Use SpanTypeWeb - // AppTypeWeb specifies the Web span type and can be used as a tag value - // for a span's SpanType tag. - AppTypeWeb = "web" - // AppTypeDB specifies the DB span type and can be used as a tag value // for a span's SpanType tag. If possible, use one of the SpanType* // constants for a more accurate indication. @@ -51,6 +46,9 @@ const ( // also have a "redis.raw_command" tag. SpanTypeRedis = "redis" + // SpanTypeRedis marks a span as a Valkey operation. + SpanTypeValkey = "valkey" + // SpanTypeMemcached marks a span as a memcached operation. SpanTypeMemcached = "memcached" @@ -76,6 +74,9 @@ const ( // SpanTypeConsul marks a span as a Consul operation. SpanTypeConsul = "consul" - // SpanTypeGraphql marks a span as a graphql operation. + // SpanTypeGraphQL marks a span as a graphql operation. SpanTypeGraphQL = "graphql" + + // SpanTypeLLM marks a span as an LLM operation. + SpanTypeLLM = "llm" ) diff --git a/contrib/aws/internal/tags/tags.go b/ddtrace/ext/aws.go similarity index 71% rename from contrib/aws/internal/tags/tags.go rename to ddtrace/ext/aws.go index 2631158736..c328512557 100644 --- a/contrib/aws/internal/tags/tags.go +++ b/ddtrace/ext/aws.go @@ -1,20 +1,20 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. +// Copyright 2016 Datadog, Inc. -package tags +package ext +// Tags specific to AWS. const ( - // OldAWSService is a duplicate tag that will be phased out in favor of AWSService. - OldAWSService = "aws.service" - // OldAWSRegion is a duplicate tag that will be phased out in favor of AWSRegion. - OldAWSRegion = "aws.region" + AWSServiceLegacy = "aws.service" + AWSRegionLegacy = "aws.region" AWSAgent = "aws.agent" AWSService = "aws_service" AWSOperation = "aws.operation" AWSRegion = "region" + AWSPartition = "aws.partition" AWSRequestID = "aws.request_id" AWSRetryCount = "aws.retry_count" diff --git a/ddtrace/ext/db.go b/ddtrace/ext/db.go index c9a046f86d..e4c442a482 100644 --- a/ddtrace/ext/db.go +++ b/ddtrace/ext/db.go @@ -32,6 +32,7 @@ const ( DBSystemOtherSQL = "other_sql" DBSystemElasticsearch = "elasticsearch" DBSystemRedis = "redis" + DBSystemValkey = "valkey" DBSystemMongoDB = "mongodb" DBSystemCassandra = "cassandra" DBSystemConsulKV = "consul" @@ -55,19 +56,44 @@ const ( const ( // RedisDatabaseIndex indicates the Redis database index connected to. RedisDatabaseIndex = "db.redis.database_index" + + // RedisRawCommand allows to set the raw command for tags. + RedisRawCommand = "redis.raw_command" + + // RedisClientCacheHit is the remaining TTL in seconds of client side cache. + RedisClientCacheHit = "db.redis.client.cache.hit" + + // RedisClientCacheTTL captures the Time-To-Live (TTL) of a cached entry in the client. + RedisClientCacheTTL = "db.redis.client.cache.ttl" + + // RedisClientCachePTTL is the remaining PTTL in seconds of client side cache. + RedisClientCachePTTL = "db.redis.client.cache.pttl" + + // RedisClientCachePXAT is the remaining PXAT in seconds of client side cache. + RedisClientCachePXAT = "db.redis.client.cache.pxat" ) -// Cassandra tags. +// Valkey tags. const ( - // CassandraQuery is the tag name used for cassandra queries. - // Deprecated: this value is no longer used internally and will be removed in future versions. - CassandraQuery = "cassandra.query" + // ValkeyRawCommand allows to set the raw command for tags. + ValkeyRawCommand = "valkey.raw_command" - // CassandraBatch is the tag name used for cassandra batches. - // Deprecated: this value is no longer used internally and will be removed in future versions. - CassandraBatch = "cassandra.batch" + // ValkeyClientCacheHit is the remaining TTL in seconds of client side cache. + ValkeyClientCacheHit = "db.valkey.client.cache.hit" - // CassandraConsistencyLevel is the tag name to set for consitency level. + // ValkeyClientCacheTTL captures the Time-To-Live (TTL) of a cached entry in the client. + ValkeyClientCacheTTL = "db.valkey.client.cache.ttl" + + // ValkeyClientCachePTTL is the remaining PTTL in seconds of client side cache. + ValkeyClientCachePTTL = "db.valkey.client.cache.pttl" + + // ValkeyClientCachePXAT is the remaining PXAT in seconds of client side cache. + ValkeyClientCachePXAT = "db.valkey.client.cache.pxat" +) + +// Cassandra tags. +const ( + // CassandraConsistencyLevel is the tag name to set for consistency level. CassandraConsistencyLevel = "cassandra.consistency_level" // CassandraCluster specifies the tag name that is used to set the cluster. diff --git a/ddtrace/ext/ext_test.go b/ddtrace/ext/ext_test.go index edeb63a635..c14a79c2bb 100644 --- a/ddtrace/ext/ext_test.go +++ b/ddtrace/ext/ext_test.go @@ -15,7 +15,6 @@ func TestSpec(t *testing.T) { // changing any of these should be considered a breaking change and // should require a major version release. tests := []string{ - AppTypeWeb, "web", AppTypeDB, "db", AppTypeCache, "cache", AppTypeRPC, "rpc", diff --git a/ddtrace/ext/graphql.go b/ddtrace/ext/graphql.go new file mode 100644 index 0000000000..df03bd89cf --- /dev/null +++ b/ddtrace/ext/graphql.go @@ -0,0 +1,10 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package ext + +const ( + GraphqlQueryErrorEvent = "dd.graphql.query.error" +) diff --git a/ddtrace/ext/messaging.go b/ddtrace/ext/messaging.go index 553cfaa696..31af602df5 100644 --- a/ddtrace/ext/messaging.go +++ b/ddtrace/ext/messaging.go @@ -8,12 +8,15 @@ package ext const ( // MessagingSystem identifies which messaging system created this span (kafka, rabbitmq, amazonsqs, googlepubsub...) MessagingSystem = "messaging.system" + // MessagingDestinationName identifies message destination name + MessagingDestinationName = "messaging.destination.name" ) // Available values for messaging.system. const ( MessagingSystemGCPPubsub = "googlepubsub" MessagingSystemKafka = "kafka" + MessagingSystemSQS = "amazonsqs" ) // Kafka tags. diff --git a/ddtrace/ext/peer.go b/ddtrace/ext/peer.go index f9909cb8b2..3bca040baa 100644 --- a/ddtrace/ext/peer.go +++ b/ddtrace/ext/peer.go @@ -13,7 +13,8 @@ const ( // PeerService records the service name of the peer service. PeerService = "peer.service" // PeerHostname records the host name of the peer. - // Deprecated: Use NetworkDestinationName instead for hostname and NetworkDestinationIP for IP addresses + // Legacy: Kept for backwards compatability. Use NetworkDestinationName for hostname + // and NetworkDestinationIP for IP addresses PeerHostname = "peer.hostname" // PeerPort records the port number of the peer. PeerPort = "peer.port" diff --git a/ddtrace/ext/tags.go b/ddtrace/ext/tags.go index 375d7df7b5..e0c662f072 100644 --- a/ddtrace/ext/tags.go +++ b/ddtrace/ext/tags.go @@ -9,7 +9,8 @@ package ext const ( // TargetHost sets the target host address. - // Deprecated: Use NetworkDestinationName instead for hostname and NetworkDestinationIP for IP addresses + // Legacy: Kept for backwards compatibility. Use NetworkDestinationName for hostname + // and NetworkDestinationIP for IP addresses TargetHost = "out.host" // NetworkDestinationName is the remote hostname or similar where the outbound connection is being made to. @@ -18,17 +19,19 @@ const ( // NetworkDestinationIP is the remote address where the outbound connection is being made to. NetworkDestinationIP = "network.destination.ip" + // NetworkClientIP is the client IP address. + NetworkClientIP = "network.client.ip" + // TargetPort sets the target host port. - // Deprecated: Use NetworkDestinationPort instead. + // Legacy: Kept for backwards compatability. Use NetworkDestinationPort instead. TargetPort = "out.port" + // TargetDB sets the target db. + TargetDB = "out.db" + // NetworkDestinationPort is the remote port number of the outbound connection. NetworkDestinationPort = "network.destination.port" - // SamplingPriority is the tag that marks the sampling priority of a span. - // Deprecated in favor of ManualKeep and ManualDrop. - SamplingPriority = "sampling.priority" - // SQLType sets the sql type tag. SQLType = "sql" @@ -58,6 +61,9 @@ const ( // See https://docs.datadoghq.com/tracing/trace_collection/tracing_naming_convention/#http-requests HTTPRequestHeaders = "http.request.headers" + // HTTPEndpoint sets the HTTP endpoint tag. + HTTPEndpoint = "http.endpoint" + // SpanName is a pseudo-key for setting a span's operation name by means of // a tag. It is mostly here to facilitate vendor-agnostic frameworks like Opentracing // and OpenCensus. @@ -84,12 +90,19 @@ const ( // ErrorType specifies the error type. ErrorType = "error.type" - // ErrorStack specifies the stack dump. + // ErrorStack specifies the stack dump when the error is thrown. ErrorStack = "error.stack" + // ErrorHandlingStack specifies the stack dump when the error is captured. + ErrorHandlingStack = "error.handling_stack" + // ErrorDetails holds details about an error which implements a formatter. + // Deprecated: Use ErrorStack instead. This tag is not supported by Error Tracking. ErrorDetails = "error.details" + // ErrorNoStackTrace is a tag that specifies that the error stack trace should not be captured. + ErrorNoStackTrace = "error.no_stack_trace" + // Environment specifies the environment to use with a trace. Environment = "env" @@ -117,4 +130,28 @@ const ( // SpanKind defines the kind of span based on Otel requirements (client, server, producer, consumer). SpanKind = "span.kind" + + // MapSpanStart is used by Span.AsMap to store the span start. + MapSpanStart = "_ddtrace.span_start" + + // MapSpanDuration is used by Span.AsMap to store the span duration. + MapSpanDuration = "_ddtrace.span_duration" + + // MapSpanSpanID is used by Span.AsMap to store the span id. + MapSpanID = "_ddtrace.span_id" + + // MapSpanTraceID is used by Span.AsMap to store the span trace id. + MapSpanTraceID = "_ddtrace.span_traceid" + + // MapSpanParentID is used by Span.AsMap to store the span parent id. + MapSpanParentID = "_ddtrace.span_parentid" + + // MapSpanError is used by Span.AsMap to store the span error value. + MapSpanError = "_ddtrace.span_error" + + // MapSpanEvents is used by Span.AsMap to store the spanEvents value. + MapSpanEvents = "_ddtrace.span_events" + + // CloudResourceID is the cloud provider resource identifier. + CloudResourceID = "cloud.resource_id" ) diff --git a/ddtrace/internal/globaltracer.go b/ddtrace/internal/globaltracer.go index 363d1f9983..cb8c1cc19d 100644 --- a/ddtrace/internal/globaltracer.go +++ b/ddtrace/internal/globaltracer.go @@ -1,104 +1,64 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. +// Copyright 2025 Datadog, Inc. -package internal // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" +package internal -import ( - "sync/atomic" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" -) +import "sync/atomic" var ( - // globalTracer stores the current tracer as *ddtrace.Tracer (pointer to interface). The - // atomic.Value type requires types to be consistent, which requires using *ddtrace.Tracer. + // globalTracer stores the current tracer as *ddtrace/tracer.Tracer (pointer to interface). The + // atomic.Value type requires types to be consistent, which requires using the same type for the + // stored value. globalTracer atomic.Value ) -func init() { - var tracer ddtrace.Tracer = &NoopTracer{} - globalTracer.Store(&tracer) +// tracerLike is an interface to restrict the types that can be stored in `globalTracer`. +// This interface doesn't leak to the users. We are leveraging the type system to generate +// the functions below for `tracer.Tracer` without creating an import cycle. +type tracerLike interface { + Flush() + Stop() } // SetGlobalTracer sets the global tracer to t. -func SetGlobalTracer(t ddtrace.Tracer) { - old := *globalTracer.Swap(&t).(*ddtrace.Tracer) - if !Testing { - old.Stop() +// It is the responsibility of the caller to ensure that the value is `tracer.Tracer`. +func SetGlobalTracer[T tracerLike](t T) { + if (tracerLike)(t) == nil { + panic("ddtrace/internal: SetGlobalTracer called with nil") + } + old := globalTracer.Swap(&t) + if old == nil { + return } + oldTracer := *old.(*T) + oldTracer.Stop() } -// GetGlobalTracer returns the currently active tracer. -func GetGlobalTracer() ddtrace.Tracer { - return *globalTracer.Load().(*ddtrace.Tracer) +// GetGlobalTracer returns the current global tracer. +// It is the responsability of the caller to ensure that calling code uses `tracer.Tracer` +// as generic type. +func GetGlobalTracer[T tracerLike]() T { + return *globalTracer.Load().(*T) } -// Testing is set to true when the mock tracer is active. It usually signifies that we are in a test -// environment. This value is used by tracer.Start to prevent overriding the GlobalTracer in tests. -var Testing = false - -var _ ddtrace.Tracer = (*NoopTracer)(nil) - -// NoopTracer is an implementation of ddtrace.Tracer that is a no-op. -type NoopTracer struct{} - -// StartSpan implements ddtrace.Tracer. -func (NoopTracer) StartSpan(_ string, _ ...ddtrace.StartSpanOption) ddtrace.Span { - return NoopSpan{} +// mockTracerLike is an interface to restrict the types that can be stored in `globalTracer`. +// This represents the mock tracer type used in tests. And prevent calling the StoreGlobalTracer +// function with a normal tracer.Tracer. +type mockTracerLike interface { + tracerLike + Reset() } -// SetServiceInfo implements ddtrace.Tracer. -func (NoopTracer) SetServiceInfo(_, _, _ string) {} - -// Extract implements ddtrace.Tracer. -func (NoopTracer) Extract(_ interface{}) (ddtrace.SpanContext, error) { - return NoopSpanContext{}, nil +// StoreGlobalTracer is a helper function to set the global tracer internally without stopping the old one. +// WARNING: this is used by the civisibilitymocktracer working as a wrapper around the global tracer, hence we don't stop the tracer. +// DO NOT USE THIS FUNCTION ON NORMAL tracer.Tracer. +func StoreGlobalTracer[M mockTracerLike, T tracerLike](m M) { + if (mockTracerLike)(m) == nil { + panic("ddtrace/internal: StoreGlobalTracer called with nil") + } + // convert the mock tracer like to the actual tracer like type (avoid panic on storing different types in the atomic.Value) + t := (tracerLike)(m).(T) + globalTracer.Store(&t) } - -// Inject implements ddtrace.Tracer. -func (NoopTracer) Inject(_ ddtrace.SpanContext, _ interface{}) error { return nil } - -// Stop implements ddtrace.Tracer. -func (NoopTracer) Stop() {} - -var _ ddtrace.Span = (*NoopSpan)(nil) - -// NoopSpan is an implementation of ddtrace.Span that is a no-op. -type NoopSpan struct{} - -// SetTag implements ddtrace.Span. -func (NoopSpan) SetTag(_ string, _ interface{}) {} - -// SetOperationName implements ddtrace.Span. -func (NoopSpan) SetOperationName(_ string) {} - -// BaggageItem implements ddtrace.Span. -func (NoopSpan) BaggageItem(_ string) string { return "" } - -// SetBaggageItem implements ddtrace.Span. -func (NoopSpan) SetBaggageItem(_, _ string) {} - -// Finish implements ddtrace.Span. -func (NoopSpan) Finish(_ ...ddtrace.FinishOption) {} - -// Tracer implements ddtrace.Span. -func (NoopSpan) Tracer() ddtrace.Tracer { return NoopTracer{} } - -// Context implements ddtrace.Span. -func (NoopSpan) Context() ddtrace.SpanContext { return NoopSpanContext{} } - -var _ ddtrace.SpanContext = (*NoopSpanContext)(nil) - -// NoopSpanContext is an implementation of ddtrace.SpanContext that is a no-op. -type NoopSpanContext struct{} - -// SpanID implements ddtrace.SpanContext. -func (NoopSpanContext) SpanID() uint64 { return 0 } - -// TraceID implements ddtrace.SpanContext. -func (NoopSpanContext) TraceID() uint64 { return 0 } - -// ForeachBaggageItem implements ddtrace.SpanContext. -func (NoopSpanContext) ForeachBaggageItem(_ func(k, v string) bool) {} diff --git a/ddtrace/internal/tracerstats/stats.go b/ddtrace/internal/tracerstats/stats.go new file mode 100644 index 0000000000..8b5d8402ea --- /dev/null +++ b/ddtrace/internal/tracerstats/stats.go @@ -0,0 +1,91 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracerstats + +import "sync/atomic" + +// Events are things that happen in the tracer such as a trace being dropped or +// a span being started. These are counted and submitted as metrics. +type Event int + +const ( + SpanStarted Event = iota + SpansFinished + TracesDropped + DroppedP0Traces + DroppedP0Spans + PartialTraces + + // Read-only. We duplicate some of the stats so that we can send them to the + // agent in headers as well as counting them with statsd. + AgentDroppedP0Traces + AgentDroppedP0Spans +) + +// These integers track metrics about spans and traces as they are started, +// finished, and dropped +var spansStarted, spansFinished, tracesDropped uint32 + +// Records the number of dropped P0 traces and spans. +var droppedP0Traces, droppedP0Spans uint32 + +// partialTrace the number of partially dropped traces. +var partialTraces uint32 + +// Copies of the stats to be sent to the agent. +var agentDroppedP0Traces, agentDroppedP0Spans uint32 + +func Signal(e Event, count uint32) { + switch e { + case SpanStarted: + atomic.AddUint32(&spansStarted, count) + case SpansFinished: + atomic.AddUint32(&spansFinished, count) + case TracesDropped: + atomic.AddUint32(&tracesDropped, count) + case DroppedP0Traces: + atomic.AddUint32(&droppedP0Traces, count) + atomic.AddUint32(&agentDroppedP0Traces, count) + case DroppedP0Spans: + atomic.AddUint32(&droppedP0Spans, count) + atomic.AddUint32(&agentDroppedP0Spans, count) + case PartialTraces: + atomic.AddUint32(&partialTraces, count) + } +} + +func Count(e Event) uint32 { + switch e { + case SpanStarted: + return atomic.SwapUint32(&spansStarted, 0) + case SpansFinished: + return atomic.SwapUint32(&spansFinished, 0) + case TracesDropped: + return atomic.SwapUint32(&tracesDropped, 0) + case DroppedP0Traces: + return atomic.SwapUint32(&droppedP0Traces, 0) + case DroppedP0Spans: + return atomic.SwapUint32(&droppedP0Spans, 0) + case PartialTraces: + return atomic.SwapUint32(&partialTraces, 0) + case AgentDroppedP0Traces: + return atomic.SwapUint32(&agentDroppedP0Traces, 0) + case AgentDroppedP0Spans: + return atomic.SwapUint32(&agentDroppedP0Spans, 0) + } + return 0 +} + +func Reset() { + atomic.StoreUint32(&spansStarted, 0) + atomic.StoreUint32(&spansFinished, 0) + atomic.StoreUint32(&tracesDropped, 0) + atomic.StoreUint32(&droppedP0Traces, 0) + atomic.StoreUint32(&droppedP0Spans, 0) + atomic.StoreUint32(&partialTraces, 0) + atomic.StoreUint32(&agentDroppedP0Traces, 0) + atomic.StoreUint32(&agentDroppedP0Spans, 0) +} diff --git a/ddtrace/mocktracer/civisibilitymocktracer.go b/ddtrace/mocktracer/civisibilitymocktracer.go new file mode 100644 index 0000000000..ded077abc9 --- /dev/null +++ b/ddtrace/mocktracer/civisibilitymocktracer.go @@ -0,0 +1,174 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mocktracer + +import ( + "sync" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" +) + +type civisibilitymocktracer struct { + mock *mocktracer // mock tracer + real tracer.Tracer // real tracer (for the testotimization/civisibility spans) + isnoop atomic.Bool +} + +var ( + _ tracer.Tracer = (*civisibilitymocktracer)(nil) + _ Tracer = (*civisibilitymocktracer)(nil) + + realSpans = make(map[*tracer.Span]bool) + realSpansMutex sync.Mutex +) + +// Creates a new CIVisibilityMockTracer that uses the mock tracer for all spans except the CIVisibility spans. +func newCIVisibilityMockTracer() *civisibilitymocktracer { + currentTracer := getGlobalTracer() + // let's check if the current tracer is already a civisibilitymocktracer + // if so, we need to get the real tracer from it + if currentCIVisibilityMockTracer, ok := currentTracer.(*civisibilitymocktracer); ok && currentCIVisibilityMockTracer != nil { + currentTracer = currentCIVisibilityMockTracer.real + } + return &civisibilitymocktracer{ + mock: newMockTracer(), + real: currentTracer, + } +} + +// SentDSMBacklogs returns the Data Streams Monitoring backlogs that have been sent by the mock tracer. +// If the tracer is in noop mode, it returns nil. Otherwise, it flushes the processor and returns +// all captured backlogs from the mock transport. +func (t *civisibilitymocktracer) SentDSMBacklogs() []datastreams.Backlog { + if t.isnoop.Load() { + return nil + } + t.mock.dsmProcessor.Flush() + return t.mock.dsmTransport.backlogs +} + +// Stop deactivates the CIVisibility mock tracer by setting it to noop mode and stopping +// the Data Streams Monitoring processor. This should be called when testing has finished. +func (t *civisibilitymocktracer) Stop() { + t.isnoop.Store(true) + t.mock.dsmProcessor.Stop() + if civisibility.GetState() == civisibility.StateExiting { + t.real.Stop() + t.real = &tracer.NoopTracer{} + } +} + +// StartSpan creates a new span with the given operation name and options. If the span type +// indicates it's a CI Visibility span (like a test session, module, suite, or individual test), +// it uses the real tracer to create the span. For all other spans, it uses the mock tracer. +// If the tracer is in noop mode, it returns nil. +func (t *civisibilitymocktracer) StartSpan(operationName string, opts ...tracer.StartSpanOption) *tracer.Span { + if t.real != nil { + var cfg tracer.StartSpanConfig + for _, fn := range opts { + fn(&cfg) + } + + if spanType, ok := cfg.Tags[ext.SpanType]; ok && + (spanType == constants.SpanTypeTestSession || spanType == constants.SpanTypeTestModule || + spanType == constants.SpanTypeTestSuite || spanType == constants.SpanTypeTest) { + // If the span is a civisibility span, use the real tracer to create it. + realSpan := t.real.StartSpan(operationName, opts...) + realSpansMutex.Lock() + defer realSpansMutex.Unlock() + realSpans[realSpan] = true + return realSpan + } + } + + if t.isnoop.Load() { + return nil + } + + // Otherwise, use the mock tracer to create it. + return t.mock.StartSpan(operationName, opts...) +} + +// FinishSpan marks the given span as finished in the mock tracer. This is called by spans +// when they finish, adding them to the list of finished spans for later inspection. +func (t *civisibilitymocktracer) FinishSpan(s *tracer.Span) { + realSpansMutex.Lock() + defer realSpansMutex.Unlock() + // Check if the span is a real span (i.e., created by the real tracer). + if _, isRealSpan := realSpans[s]; isRealSpan { + delete(realSpans, s) + return + } + if t.isnoop.Load() { + return + } + t.mock.FinishSpan(s) +} + +// GetDataStreamsProcessor returns the Data Streams Monitoring processor used by the mock tracer. +// If the tracer is in noop mode, it returns nil. This processor is used to monitor +// and record data stream metrics. +func (t *civisibilitymocktracer) GetDataStreamsProcessor() *datastreams.Processor { + if t.isnoop.Load() { + return nil + } + return t.mock.dsmProcessor +} + +// OpenSpans returns the set of started spans that have not been finished yet. +// This is useful for verifying spans are properly finished in tests. +func (t *civisibilitymocktracer) OpenSpans() []*Span { + return t.mock.OpenSpans() +} + +// FinishedSpans returns the set of spans that have been finished. +// This allows inspection of spans after they've completed for testing and verification. +func (t *civisibilitymocktracer) FinishedSpans() []*Span { + return t.mock.FinishedSpans() +} + +// Reset clears all spans (both open and finished) from the mock tracer. +// This is especially useful when running tests in a loop, where a clean state +// is desired between test iterations. +func (t *civisibilitymocktracer) Reset() { + t.mock.Reset() +} + +// Extract retrieves a SpanContext from the carrier using the mock tracer's propagator. +// If the tracer is in noop mode, it returns nil. This is used for distributed tracing +// to continue traces across process boundaries. +func (t *civisibilitymocktracer) Extract(carrier interface{}) (*tracer.SpanContext, error) { + if t.isnoop.Load() { + return nil, nil + } + return t.mock.Extract(carrier) +} + +// Inject injects the SpanContext into the carrier using the mock tracer's propagator. +// If the tracer is in noop mode, it returns nil. This is used for distributed tracing +// to propagate trace information across process boundaries. +func (t *civisibilitymocktracer) Inject(context *tracer.SpanContext, carrier interface{}) error { + if t.isnoop.Load() { + return nil + } + return t.mock.Inject(context, carrier) +} + +func (t *civisibilitymocktracer) TracerConf() tracer.TracerConf { + return t.real.TracerConf() +} + +// Flush forces a flush of both the mock tracer and the real tracer. +// This ensures that all buffered spans are processed and ready for inspection. +func (t *civisibilitymocktracer) Flush() { + t.mock.Flush() + t.real.Flush() +} diff --git a/ddtrace/mocktracer/civisibilitymocktracer_test.go b/ddtrace/mocktracer/civisibilitymocktracer_test.go new file mode 100644 index 0000000000..d0677fa94a --- /dev/null +++ b/ddtrace/mocktracer/civisibilitymocktracer_test.go @@ -0,0 +1,177 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mocktracer + +import ( + "net/http" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestCIVisibilityMockTracer_StartSpan_Routing verifies that spans are routed +// correctly based on their SpanType tag. CI Visibility spans should go to the +// real tracer, others to the mock tracer. +func TestCIVisibilityMockTracer_StartSpan_Routing(t *testing.T) { + // Note: The 'real' tracer here will be the default global tracer. + // If mocktracer.Start() was called *before* this, 'real' would also be a mock. + // We rely on the fact that CI spans won't appear in the *internal* mock tracer (`cmt.mock`). + cmt := newCIVisibilityMockTracer() + internal.StoreGlobalTracer[Tracer, tracer.Tracer](cmt) + defer internal.SetGlobalTracer(cmt.real) + + // 1. Regular span (should go to internal mock) + regSpan := cmt.StartSpan("regular.op") + require.NotNil(t, regSpan) + regSpan.Finish() + + // 2. CI Visibility span (should go to real tracer) + ciSpan := cmt.StartSpan("ci.test.op", tracer.SpanType(constants.SpanTypeTest)) + // We might not have a real tracer configured to actually *do* anything, + // but the key is it *shouldn't* be handled by cmt.mock. + // If ciSpan is nil, it means the real tracer is likely a NoopTracer, which is fine for this test. + if ciSpan != nil { + ciSpan.Finish() // Finish it if we got one + } + + // Verification + mockedSpans := cmt.mock.FinishedSpans() // Access internal mock directly for verification + assert.Len(t, mockedSpans, 1, "Only the regular span should be in the internal mock tracer") + if len(mockedSpans) == 1 { + assert.Equal(t, "regular.op", mockedSpans[0].OperationName()) + assert.NotEqual(t, "ci.test.op", mockedSpans[0].OperationName()) + } + + // Check the public FinishedSpans() method also reflects the internal mock + publicFinished := cmt.FinishedSpans() + assert.Len(t, publicFinished, 1, "Public FinishedSpans should match internal mock") + if len(publicFinished) == 1 { + assert.Equal(t, "regular.op", publicFinished[0].OperationName()) + } + + // Check OpenSpans - should be empty now + assert.Empty(t, cmt.OpenSpans(), "OpenSpans should be empty after finishing") +} + +// TestCIVisibilityMockTracer_Delegation verifies basic delegation methods. +func TestCIVisibilityMockTracer_Delegation(t *testing.T) { + cmt := newCIVisibilityMockTracer() + internal.StoreGlobalTracer[Tracer, tracer.Tracer](cmt) + defer internal.SetGlobalTracer(cmt.real) + + // Test Reset + span1 := cmt.StartSpan("op1") + span1.Finish() + assert.Len(t, cmt.FinishedSpans(), 1) + cmt.Reset() + assert.Empty(t, cmt.FinishedSpans(), "FinishedSpans should be empty after Reset") + assert.Empty(t, cmt.OpenSpans(), "OpenSpans should be empty after Reset") + + // Test Open/Finished Spans sequence + span2 := cmt.StartSpan("op2") + assert.Len(t, cmt.OpenSpans(), 1, "Should have 1 open span") + assert.Equal(t, "op2", cmt.OpenSpans()[0].OperationName()) + assert.Empty(t, cmt.FinishedSpans(), "FinishedSpans should be empty while span is open") + + span2.Finish() + assert.Empty(t, cmt.OpenSpans(), "OpenSpans should be empty after finish") + assert.Len(t, cmt.FinishedSpans(), 1, "Should have 1 finished span") + assert.Equal(t, "op2", cmt.FinishedSpans()[0].OperationName()) +} + +// TestCIVisibilityMockTracer_Stop verifies that the tracer becomes no-op after Stop. +func TestCIVisibilityMockTracer_Stop(t *testing.T) { + cmt := newCIVisibilityMockTracer() + internal.StoreGlobalTracer[Tracer, tracer.Tracer](cmt) + defer internal.SetGlobalTracer(cmt.real) + + cmt.Stop() // Stop the tracer + + // Verify isnoop is set (internal check, not strictly necessary but good for understanding) + assert.True(t, cmt.isnoop.Load(), "isnoop flag should be true after Stop") + + // Verify methods become no-op + assert.Nil(t, cmt.StartSpan("op.after.stop"), "StartSpan should return nil after Stop") + + ctx, err := cmt.Extract(http.Header{}) + assert.Nil(t, ctx, "Extract should return nil context after Stop") + assert.NoError(t, err, "Extract should return no error after Stop") + + err = cmt.Inject(nil, http.Header{}) + assert.NoError(t, err, "Inject should return no error after Stop") + + assert.Nil(t, cmt.GetDataStreamsProcessor(), "GetDataStreamsProcessor should return nil after Stop") + assert.Nil(t, cmt.SentDSMBacklogs(), "SentDSMBacklogs should return nil after Stop") + + // Check span lists are not affected (though Reset would clear them) + assert.Empty(t, cmt.FinishedSpans(), "FinishedSpans should remain empty") + assert.Empty(t, cmt.OpenSpans(), "OpenSpans should remain empty") +} + +// TestCIVisibilityMockTracer_Flush verifies that Flush moves open spans to finished. +func TestCIVisibilityMockTracer_Flush(t *testing.T) { + cmt := newCIVisibilityMockTracer() + internal.StoreGlobalTracer[Tracer, tracer.Tracer](cmt) + defer internal.SetGlobalTracer(cmt.real) + + // Start a regular span (handled by internal mock) but don't finish it + s := cmt.StartSpan("span.to.flush") + require.NotNil(t, s) + + // Verify it's in OpenSpans + open := cmt.OpenSpans() + require.Len(t, open, 1) + assert.Equal(t, s.Context().SpanID(), open[0].Context().SpanID()) + assert.Empty(t, cmt.FinishedSpans()) + + // Call Flush + cmt.Flush() // Should flush both mock and real (though we only check mock here) + + // Verify the span moved from Open to Finished in the mock tracer + assert.Empty(t, cmt.OpenSpans(), "OpenSpans should be empty after Flush") + finished := cmt.FinishedSpans() + require.Len(t, finished, 1) + assert.Equal(t, s.Context().SpanID(), finished[0].Context().SpanID()) + assert.Equal(t, "span.to.flush", finished[0].OperationName()) +} + +// TestCIVisibilityMockTracer_TracerConf verifies TracerConf delegates correctly. +func TestCIVisibilityMockTracer_TracerConf(t *testing.T) { + cmt := newCIVisibilityMockTracer() + defer cmt.Stop() + + conf := cmt.TracerConf() + // The default mock tracer has an empty config, so we check that + assert.Equal(t, tracer.TracerConf{}, conf) +} + +// TestCIVisibilityMockTracer_SentDSMBacklogs tests DSM backlog retrieval. +func TestCIVisibilityMockTracer_SentDSMBacklogs(t *testing.T) { + cmt := newCIVisibilityMockTracer() + defer cmt.Stop() + + // Initially, no backlogs + backlogs := cmt.SentDSMBacklogs() + assert.Empty(t, backlogs) + + // Simulate some DSM activity (indirectly, as direct simulation is complex) + // For now, we know the mockDSMTransport starts empty, and flushing doesn't add + // without pathway activity, so this test mainly ensures the method doesn't panic + // and returns the expected (empty) list from the internal mock transport. + cmt.Flush() // Flush includes DSM flush + + backlogs = cmt.SentDSMBacklogs() // Flushes again internally + assert.Empty(t, backlogs) // Still expect empty unless DSM was used + + // Test after stop + cmt.Stop() + assert.Nil(t, cmt.SentDSMBacklogs(), "Should return nil after stop") +} diff --git a/ddtrace/mocktracer/data_streams.go b/ddtrace/mocktracer/data_streams.go index dcb7191e79..100cc2b2a7 100644 --- a/ddtrace/mocktracer/data_streams.go +++ b/ddtrace/mocktracer/data_streams.go @@ -11,7 +11,7 @@ import ( "github.com/tinylib/msgp/msgp" - "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" ) type mockDSMTransport struct { diff --git a/ddtrace/mocktracer/example_test.go b/ddtrace/mocktracer/example_test.go index c7a0c0822f..8a0a206414 100644 --- a/ddtrace/mocktracer/example_test.go +++ b/ddtrace/mocktracer/example_test.go @@ -6,7 +6,7 @@ package mocktracer_test import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" ) func Example() { diff --git a/ddtrace/mocktracer/main_test.go b/ddtrace/mocktracer/main_test.go index d584962bf7..32dc4a16d6 100644 --- a/ddtrace/mocktracer/main_test.go +++ b/ddtrace/mocktracer/main_test.go @@ -6,10 +6,12 @@ package mocktracer import ( - "go.uber.org/goleak" "testing" + + "go.uber.org/goleak" ) func TestMain(m *testing.M) { - goleak.VerifyTestMain(m) + // TODO: seelog (indirect dependency) has a known goroutine leak where it leaks a single goroutine on init (https://github.com/cihub/seelog/issues/182) + goleak.VerifyTestMain(m, goleak.IgnoreAnyFunction("github.com/cihub/seelog.(*asyncLoopLogger).processQueue")) } diff --git a/ddtrace/mocktracer/mockspan.go b/ddtrace/mocktracer/mockspan.go index 4701d96c7f..07b532a03c 100644 --- a/ddtrace/mocktracer/mockspan.go +++ b/ddtrace/mocktracer/mockspan.go @@ -3,245 +3,149 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package mocktracer // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" +package mocktracer // import "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" import ( + "encoding/json" "fmt" - "sync" + "testing" "time" + _ "unsafe" // Needed for go:linkname directive. - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" -) - -var _ ddtrace.Span = (*mockspan)(nil) -var _ Span = (*mockspan)(nil) - -// Span is an interface that allows querying a span returned by the mock tracer. -type Span interface { - // SpanID returns the span's ID. - SpanID() uint64 - - // TraceID returns the span's trace ID. - TraceID() uint64 - - // ParentID returns the span's parent ID. - ParentID() uint64 - - // StartTime returns the time when the span has started. - StartTime() time.Time + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" - // FinishTime returns the time when the span has finished. - FinishTime() time.Time - - // OperationName returns the operation name held by this span. - OperationName() string - - // Tag returns the value of the tag at key k. - Tag(k string) interface{} + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) - // Tags returns a copy of all the tags in this span. - Tags() map[string]interface{} +//go:linkname spanStart github.com/DataDog/dd-trace-go/v2/ddtrace/tracer.spanStart +func spanStart(operationName string, options ...tracer.StartSpanOption) *tracer.Span - // Context returns the span's SpanContext. - Context() ddtrace.SpanContext +func newSpan(operationName string, cfg *tracer.StartSpanConfig) *tracer.Span { + return spanStart(operationName, func(c *tracer.StartSpanConfig) { + *c = *cfg + }) +} - // Stringer allows pretty-printing the span's fields for debugging. - fmt.Stringer +type Span struct { + sp *tracer.Span + m map[string]interface{} + links []tracer.SpanLink } -func newSpan(t *mocktracer, operationName string, cfg *ddtrace.StartSpanConfig) *mockspan { - if cfg.Tags == nil { - cfg.Tags = make(map[string]interface{}) - } - if cfg.Tags[ext.ResourceName] == nil { - cfg.Tags[ext.ResourceName] = operationName +func MockSpan(s *tracer.Span) *Span { + if s == nil { + return nil } - s := &mockspan{ - name: operationName, - tracer: t, - } - if cfg.StartTime.IsZero() { - s.startTime = time.Now() - } else { - s.startTime = cfg.StartTime - } - id := cfg.SpanID - if id == 0 { - id = nextID() - } - s.context = &spanContext{spanID: id, traceID: id, span: s} - if ctx, ok := cfg.Parent.(*spanContext); ok { - if ctx.span != nil && s.tags[ext.ServiceName] == nil { - // if we have a local parent and no service, inherit the parent's - s.SetTag(ext.ServiceName, ctx.span.Tag(ext.ServiceName)) - } - if ctx.hasSamplingPriority() { - s.SetTag(ext.SamplingPriority, ctx.samplingPriority()) - } - s.parentID = ctx.spanID - s.context.priority = ctx.samplingPriority() - s.context.hasPriority = ctx.hasSamplingPriority() - s.context.traceID = ctx.traceID - s.context.baggage = make(map[string]string, len(ctx.baggage)) - ctx.ForeachBaggageItem(func(k, v string) bool { - s.context.baggage[k] = v - return true - }) - } - for k, v := range cfg.Tags { - s.SetTag(k, v) - } - return s + return &Span{sp: s, m: s.AsMap()} } -type mockspan struct { - sync.RWMutex // guards below fields - name string - tags map[string]interface{} - finishTime time.Time - finished bool - - startTime time.Time - parentID uint64 - context *spanContext - tracer *mocktracer - links []ddtrace.SpanLink +func (s *Span) OperationName() string { + if s == nil { + return "" + } + return s.m[ext.SpanName].(string) } -// SetTag sets a given tag on the span. -func (s *mockspan) SetTag(key string, value interface{}) { - s.Lock() - defer s.Unlock() - if s.finished { +func (s *Span) SetTag(k string, v interface{}) { + if s == nil { return } - if s.tags == nil { - s.tags = make(map[string]interface{}, 1) - } - if key == ext.SamplingPriority { - switch p := value.(type) { - case int: - s.context.setSamplingPriority(p) - case float64: - s.context.setSamplingPriority(int(p)) - } - } - s.tags[key] = value -} - -func (s *mockspan) FinishTime() time.Time { - s.RLock() - defer s.RUnlock() - return s.finishTime -} - -func (s *mockspan) StartTime() time.Time { return s.startTime } - -func (s *mockspan) Tag(k string) interface{} { - s.RLock() - defer s.RUnlock() - return s.tags[k] + s.m[k] = v + s.sp.SetTag(k, v) } -func (s *mockspan) Tags() map[string]interface{} { - s.RLock() - defer s.RUnlock() - // copy - cp := make(map[string]interface{}, len(s.tags)) - for k, v := range s.tags { - cp[k] = v +func (s *Span) Tag(k string) interface{} { + if s == nil { + return nil } - return cp -} - -func (s *mockspan) TraceID() uint64 { return s.context.traceID } - -func (s *mockspan) SpanID() uint64 { return s.context.spanID } - -func (s *mockspan) ParentID() uint64 { return s.parentID } - -func (s *mockspan) OperationName() string { - s.RLock() - defer s.RUnlock() - return s.name -} - -// SetOperationName resets the original operation name to the given one. -func (s *mockspan) SetOperationName(operationName string) { - s.Lock() - defer s.Unlock() - s.name = operationName - return + // It's possible that a tag wasn't set through mocktracer.Span.SetTag, + // in which case we need to retrieve it from the underlying tracer.Span. + v := s.sp.AsMap()[k] + if v != nil { + return v + } + v, ok := s.m[k] + if ok { + return v + } + return nil } -// BaggageItem returns the baggage item with the given key. -func (s *mockspan) BaggageItem(key string) string { - return s.context.baggageItem(key) +func (s *Span) Tags() map[string]interface{} { + if s == nil { + return make(map[string]interface{}) + } + tm := s.sp.AsMap() + m := make(map[string]interface{}, len(s.m)+len(tm)) + extractTags(s.m, m) + extractTags(tm, m) + return m } -// SetBaggageItem sets a new baggage item at the given key. The baggage -// item should propagate to all descendant spans, both in- and cross-process. -func (s *mockspan) SetBaggageItem(key, val string) { - s.context.setBaggageItem(key, val) - return +func extractTags(src, m map[string]interface{}) { + for k, v := range src { + switch k { + case ext.MapSpanStart: + continue + case ext.MapSpanDuration: + continue + case ext.MapSpanID: + continue + case ext.MapSpanTraceID: + continue + case ext.MapSpanParentID: + continue + case ext.MapSpanError: + continue + case ext.MapSpanEvents: + continue + } + m[k] = v + } } -// Finish finishes the current span with the given options. -func (s *mockspan) Finish(opts ...ddtrace.FinishOption) { - var cfg ddtrace.FinishConfig - for _, fn := range opts { - fn(&cfg) +func (s *Span) String() string { + if s == nil { + return "" } - var t time.Time - if cfg.FinishTime.IsZero() { - t = time.Now() - } else { - t = cfg.FinishTime - } - if cfg.Error != nil { - s.SetTag(ext.Error, cfg.Error) - } - if cfg.NoDebugStack { - s.SetTag(ext.ErrorStack, "") - } - s.Lock() - defer s.Unlock() - if s.finished { - return - } - s.finished = true - s.finishTime = t - s.tracer.addFinishedSpan(s) -} + sc := s.sp.Context() + baggage := make(map[string]string) + sc.ForeachBaggageItem(func(k, v string) bool { + baggage[k] = v + return true + }) -// String implements fmt.Stringer. -func (s *mockspan) String() string { - s.RLock() - defer s.RUnlock() - sc := s.context return fmt.Sprintf(` name: %s tags: %#v start: %s -finish: %s +duration: %s id: %d parent: %d -trace: %d +trace: %v baggage: %#v -`, s.name, s.tags, s.startTime, s.finishTime, sc.spanID, s.parentID, sc.traceID, sc.baggage) +`, s.OperationName(), s.Tags(), s.StartTime(), s.Duration(), sc.SpanID(), s.ParentID(), sc.TraceID(), baggage) +} + +func (s *Span) ParentID() uint64 { + if s == nil { + return 0 + } + return s.m[ext.MapSpanParentID].(uint64) } // Context returns the SpanContext of this Span. -func (s *mockspan) Context() ddtrace.SpanContext { return s.context } +func (s *Span) Context() *tracer.SpanContext { return s.sp.Context() } // SetUser associates user information to the current trace which the // provided span belongs to. The options can be used to tune which user // bit of information gets monitored. This mockup only sets the user // information as span tags of the root span of the current trace. -func (s *mockspan) SetUser(id string, opts ...tracer.UserMonitoringOption) { - root := s.Root() +func (s *Span) SetUser(id string, opts ...tracer.UserMonitoringOption) { + root := s.sp.Root() if root == nil { return } @@ -254,6 +158,8 @@ func (s *mockspan) SetUser(id string, opts ...tracer.UserMonitoringOption) { } root.SetTag("usr.id", id) + root.SetTag("usr.login", cfg.Login) + root.SetTag("usr.org", cfg.Org) root.SetTag("usr.email", cfg.Email) root.SetTag("usr.name", cfg.Name) root.SetTag("usr.role", cfg.Role) @@ -265,22 +171,99 @@ func (s *mockspan) SetUser(id string, opts ...tracer.UserMonitoringOption) { } } -// Root walks the span up to the root parent span and returns it. -// This method is required by some internal packages such as appsec. -func (s *mockspan) Root() tracer.Span { - openSpans := s.tracer.openSpans - var current Span = s - for { - pid := current.ParentID() - if pid == 0 { - break - } - parent, ok := openSpans[pid] - if !ok { - break - } - current = parent +func (s *Span) SpanID() uint64 { + if s == nil { + return 0 } - root, _ := current.(*mockspan) - return root + return s.m[ext.MapSpanID].(uint64) +} + +func (s *Span) TraceID() uint64 { + if s == nil { + return 0 + } + return s.m[ext.MapSpanTraceID].(uint64) +} + +func (s *Span) StartTime() time.Time { + if s == nil { + return time.Unix(0, 0) + } + return time.Unix(0, s.m[ext.MapSpanStart].(int64)) +} + +func (s *Span) Duration() time.Duration { + if s == nil { + return time.Duration(0) + } + return time.Duration(s.m[ext.MapSpanDuration].(int64)) +} + +func (s *Span) FinishTime() time.Time { + if s == nil { + return time.Unix(0, 0) + } + return s.StartTime().Add(s.Duration()) +} + +func (s *Span) Unwrap() *tracer.Span { + if s == nil { + return nil + } + return s.sp +} + +// Links returns the span's span links. +func (s *Span) Links() []tracer.SpanLink { + payload := s.Tag("_dd.span_links") + if payload == nil { + return nil + } + // Unmarshal the JSON payload into the SpanLink slice. + var links []tracer.SpanLink + json.Unmarshal([]byte(payload.(string)), &links) + return links +} + +// SpanEvent represents a span event from a mockspan. +type SpanEvent struct { + Name string `json:"name"` + TimeUnixNano uint64 `json:"time_unix_nano"` + Attributes map[string]any `json:"attributes"` +} + +// AssertAttributes compares the given attributes with the current event ones. +// The comparison is made against the JSON representation of both, since the data comes from +// the span.AsMap() function which provides the JSON representation of the events, and some types +// could have changed (e.g. 1 could be transformed to 1.0 after marshal/unmarshal). +func (s SpanEvent) AssertAttributes(t *testing.T, wantAttrs map[string]any) { + t.Helper() + want, err := json.Marshal(wantAttrs) + require.NoError(t, err) + got, err := json.Marshal(s.Attributes) + require.NoError(t, err) + assert.Equal(t, string(want), string(got)) +} + +// Events returns the current span events. +func (s *Span) Events() []SpanEvent { + if s == nil { + return nil + } + eventsJSON, ok := s.m[ext.MapSpanEvents].(string) + if !ok { + return nil + } + + var events []SpanEvent + if err := json.Unmarshal([]byte(eventsJSON), &events); err != nil { + log.Error("mocktracer: failed to unmarshal span events: %s", err.Error()) + return nil + } + return events +} + +// Integration returns the component from which the mockspan was created. +func (s *Span) Integration() string { + return s.Tag(ext.Component).(string) } diff --git a/ddtrace/mocktracer/mockspan_test.go b/ddtrace/mocktracer/mockspan_test.go deleted file mode 100644 index 9d849ac82e..0000000000 --- a/ddtrace/mocktracer/mockspan_test.go +++ /dev/null @@ -1,272 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package mocktracer - -import ( - "errors" - "testing" - "time" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -// basicSpan returns a span with no configuration, having the set operation name. -func basicSpan(operationName string) *mockspan { - return newSpan(&mocktracer{}, operationName, &ddtrace.StartSpanConfig{}) -} - -func TestNewSpan(t *testing.T) { - t.Run("basic", func(t *testing.T) { - s := basicSpan("http.request") - - assert := assert.New(t) - assert.Equal("http.request", s.name) - assert.False(s.startTime.IsZero()) - assert.Zero(s.parentID) - assert.NotNil(s.context) - assert.NotZero(s.context.spanID) - assert.Equal(s.context.spanID, s.context.traceID) - }) - - t.Run("options", func(t *testing.T) { - tr := new(mocktracer) - startTime := time.Now() - tags := map[string]interface{}{"k": "v", "k1": "v1"} - opts := &ddtrace.StartSpanConfig{ - StartTime: startTime, - Tags: tags, - } - s := newSpan(tr, "http.request", opts) - - assert := assert.New(t) - assert.Equal(tr, s.tracer) - assert.Equal("http.request", s.name) - assert.Equal(startTime, s.startTime) - assert.Equal(tags, s.tags) - }) - - t.Run("parent", func(t *testing.T) { - baggage := map[string]string{"A": "B", "C": "D"} - parentctx := &spanContext{spanID: 1, traceID: 2, baggage: baggage} - opts := &ddtrace.StartSpanConfig{Parent: parentctx} - s := newSpan(&mocktracer{}, "http.request", opts) - - assert := assert.New(t) - assert.NotNil(s.context) - assert.Equal(uint64(1), s.parentID) - assert.Equal(uint64(2), s.context.traceID) - assert.Equal(baggage, s.context.baggage) - }) -} - -func TestSpanSetTag(t *testing.T) { - s := basicSpan("http.request") - s.SetTag("a", "b") - s.SetTag("c", "d") - - assert := assert.New(t) - assert.Len(s.Tags(), 3) - assert.Equal("http.request", s.Tag(ext.ResourceName)) - assert.Equal("b", s.Tag("a")) - assert.Equal("d", s.Tag("c")) -} - -func TestSpanSetTagPriority(t *testing.T) { - assert := assert.New(t) - s := basicSpan("http.request") - assert.False(s.context.hasSamplingPriority()) - s.SetTag(ext.SamplingPriority, -1) - assert.True(s.context.hasSamplingPriority()) - assert.Equal(-1, s.context.samplingPriority()) -} - -func TestSpanTagImmutability(t *testing.T) { - s := basicSpan("http.request") - s.SetTag("a", "b") - tags := s.Tags() - tags["a"] = 123 - tags["b"] = 456 - - assert := assert.New(t) - assert.Equal("b", s.tags["a"]) - assert.Zero(s.tags["b"]) -} - -func TestSpanStartTime(t *testing.T) { - startTime := time.Now() - s := newSpan(&mocktracer{}, "http.request", &ddtrace.StartSpanConfig{StartTime: startTime}) - - assert := assert.New(t) - assert.Equal(startTime, s.startTime) - assert.Equal(startTime, s.StartTime()) -} - -func TestSpanFinishTime(t *testing.T) { - s := basicSpan("http.request") - finishTime := time.Now() - s.Finish(tracer.FinishTime(finishTime)) - - assert := assert.New(t) - assert.Equal(finishTime, s.finishTime) - assert.Equal(finishTime, s.FinishTime()) -} - -func TestSpanOperationName(t *testing.T) { - t.Run("default", func(t *testing.T) { - s := basicSpan("http.request") - assert.Equal(t, "http.request", s.name) - assert.Equal(t, "http.request", s.OperationName()) - }) - - t.Run("default", func(t *testing.T) { - s := basicSpan("http.request") - s.SetOperationName("db.query") - assert.Equal(t, "db.query", s.name) - assert.Equal(t, "db.query", s.OperationName()) - }) -} - -func TestSpanBaggageFunctions(t *testing.T) { - t.Run("SetBaggageItem", func(t *testing.T) { - s := basicSpan("http.request") - s.SetBaggageItem("a", "b") - assert.Equal(t, "b", s.context.baggage["a"]) - }) - - t.Run("BaggageItem", func(t *testing.T) { - s := basicSpan("http.request") - s.SetBaggageItem("a", "b") - assert.Equal(t, "b", s.BaggageItem("a")) - }) -} - -func TestSpanContext(t *testing.T) { - t.Run("Context", func(t *testing.T) { - s := basicSpan("http.request") - assert.Equal(t, s.context, s.Context()) - }) - - t.Run("IDs", func(t *testing.T) { - parent := basicSpan("http.request") - child := newSpan(&mocktracer{}, "db.query", &ddtrace.StartSpanConfig{ - Parent: parent.Context(), - }) - - assert := assert.New(t) - assert.Equal(parent.SpanID(), child.ParentID()) - assert.Equal(parent.TraceID(), child.TraceID()) - assert.NotZero(child.SpanID()) - }) -} - -func TestSpanFinish(t *testing.T) { - s := basicSpan("http.request") - want := errors.New("some error") - s.Finish(tracer.WithError(want)) - - assert := assert.New(t) - assert.False(s.FinishTime().IsZero()) - assert.True(s.FinishTime().Before(time.Now().Add(1 * time.Nanosecond))) - assert.Equal(want, s.Tag(ext.Error)) -} - -func TestSpanFinishTwice(t *testing.T) { - s := basicSpan("http.request") - wantError := errors.New("some error") - s.Finish(tracer.WithError(wantError)) - - assert := assert.New(t) - wantTime := s.finishTime - time.Sleep(2 * time.Millisecond) - s.Finish(tracer.WithError(errors.New("new error"))) - assert.Equal(wantTime, s.finishTime) - assert.Equal(wantError, s.Tag(ext.Error)) - assert.Equal(len(s.tracer.finishedSpans), 1) -} - -func TestSpanString(t *testing.T) { - s := basicSpan("http.request") - s.Finish(tracer.WithError(errors.New("some error"))) - - assert := assert.New(t) - assert.NotEmpty(s.String()) -} - -func TestSpanWithID(t *testing.T) { - tr := newMockTracer() - defer tr.Stop() - spanID := uint64(123456789) - span := tr.StartSpan("", tracer.WithSpanID(spanID)) - - assert := assert.New(t) - assert.Equal(spanID, span.Context().SpanID()) -} - -func TestSetUser(t *testing.T) { - const ( - id = "john.doe#12345" - name = "John Doe" - email = "john.doe@hostname.com" - scope = "read:message, write:files" - role = "admin" - sessionID = "session#12345" - ) - expected := []struct{ key, value string }{ - {key: "usr.id", value: id}, - {key: "usr.name", value: name}, - {key: "usr.email", value: email}, - {key: "usr.scope", value: scope}, - {key: "usr.role", value: role}, - {key: "usr.session_id", value: sessionID}, - } - - t.Run("root", func(t *testing.T) { - s := basicSpan("root operation") - tracer.SetUser(s, - id, - tracer.WithUserEmail(email), - tracer.WithUserName(name), - tracer.WithUserScope(scope), - tracer.WithUserRole(role), - tracer.WithUserSessionID(sessionID)) - s.Finish() - for _, pair := range expected { - assert.Equal(t, pair.value, s.Tag(pair.key)) - } - }) - - t.Run("nested", func(t *testing.T) { - tr := newMockTracer() - defer tr.Stop() - - s0 := tr.StartSpan("root operation") - s1 := tr.StartSpan("nested operation", tracer.ChildOf(s0.Context())) - s2 := tr.StartSpan("nested nested operation", tracer.ChildOf(s1.Context())) - tracer.SetUser(s2, - id, - tracer.WithUserEmail(email), - tracer.WithUserName(name), - tracer.WithUserScope(scope), - tracer.WithUserRole(role), - tracer.WithUserSessionID(sessionID)) - s2.Finish() - s1.Finish() - s0.Finish() - finished := tr.FinishedSpans() - require.Len(t, finished, 3) - for _, pair := range expected { - assert.Equal(t, pair.value, finished[2].Tag(pair.key)) - assert.Nil(t, finished[1].Tag(pair.key)) - assert.Nil(t, finished[0].Tag(pair.key)) - } - }) - -} diff --git a/ddtrace/mocktracer/mockspancontext.go b/ddtrace/mocktracer/mockspancontext.go index 738a24cfff..981693e4da 100644 --- a/ddtrace/mocktracer/mockspancontext.go +++ b/ddtrace/mocktracer/mockspancontext.go @@ -6,10 +6,12 @@ package mocktracer import ( + "strconv" "sync" "sync/atomic" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) var _ ddtrace.SpanContext = (*spanContext)(nil) @@ -22,10 +24,14 @@ type spanContext struct { spanID uint64 traceID uint64 - span *mockspan // context owner + span *tracer.Span } -func (sc *spanContext) TraceID() uint64 { return sc.traceID } +func (sc *spanContext) TraceID() string { return strconv.FormatUint(sc.traceID, 10) } + +func (sc *spanContext) TraceIDBytes() [16]byte { return [16]byte{} } + +func (sc *spanContext) TraceIDLower() uint64 { return sc.traceID } func (sc *spanContext) SpanID() uint64 { return sc.spanID } diff --git a/ddtrace/mocktracer/mockspancontext_test.go b/ddtrace/mocktracer/mockspancontext_test.go index 453e979e2b..5793ae7b35 100644 --- a/ddtrace/mocktracer/mockspancontext_test.go +++ b/ddtrace/mocktracer/mockspancontext_test.go @@ -46,7 +46,7 @@ func TestSpanContextIterator(t *testing.T) { t.Run("some", func(t *testing.T) { var seen int - sc.ForeachBaggageItem(func(k, v string) bool { + sc.ForeachBaggageItem(func(_, _ string) bool { seen++ return false }) diff --git a/ddtrace/mocktracer/mocktracer.go b/ddtrace/mocktracer/mocktracer.go index 2a210e07bb..dbbb9dec04 100644 --- a/ddtrace/mocktracer/mocktracer.go +++ b/ddtrace/mocktracer/mocktracer.go @@ -15,29 +15,36 @@ package mocktracer import ( "net/http" "net/url" - "strconv" - "strings" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + utils "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" "github.com/DataDog/datadog-go/v5/statsd" ) -var _ ddtrace.Tracer = (*mocktracer)(nil) +var _ tracer.Tracer = (*mocktracer)(nil) var _ Tracer = (*mocktracer)(nil) +// DSMBacklog is an alias to datastreams.Backlog +type DSMBacklog = datastreams.Backlog + // Tracer exposes an interface for querying the currently running mock tracer. type Tracer interface { + tracer.Tracer + // OpenSpans returns the set of started spans that have not been finished yet. - OpenSpans() []Span + OpenSpans() []*Span + FinishSpan(*tracer.Span) // FinishedSpans returns the set of finished spans. - FinishedSpans() []Span - SentDSMBacklogs() []datastreams.Backlog + FinishedSpans() []*Span + + SentDSMBacklogs() []DSMBacklog // Reset resets the spans and services recorded in the tracer. This is // especially useful when running tests in a loop, where a clean start @@ -54,54 +61,72 @@ type Tracer interface { // to activate the mock tracer. When your test runs, use the returned // interface to query the tracer's state. func Start() Tracer { - t := newMockTracer() + if utils.BoolEnv(constants.CIVisibilityEnabledEnvironmentVariable, false) && !civisibility.IsTestMode() { + // If CI Visibility is enabled (and we are not in a CI Visibility testing mode), we need to use the CIVisibilityMockTracer + // to bypass the CI Visibility spans from the mocktracer. + // This supports the scenario where the mocktracer is used in a test (we need to keep reporting test spans) + t := newCIVisibilityMockTracer() + // Set the global tracer to the mock tracer without stopping the old one (inside the mock tracer) + internal.StoreGlobalTracer[Tracer, tracer.Tracer](t) + return t + } + + var t tracer.Tracer = newMockTracer() internal.SetGlobalTracer(t) - internal.Testing = true - return t + return t.(Tracer) +} + +func getGlobalTracer() tracer.Tracer { + return internal.GetGlobalTracer[tracer.Tracer]() } type mocktracer struct { sync.RWMutex // guards below spans - finishedSpans []Span - openSpans map[uint64]Span + finishedSpans []*Span + openSpans map[uint64]*Span dsmTransport *mockDSMTransport dsmProcessor *datastreams.Processor } -func (t *mocktracer) SentDSMBacklogs() []datastreams.Backlog { +func (t *mocktracer) SentDSMBacklogs() []DSMBacklog { t.dsmProcessor.Flush() return t.dsmTransport.backlogs } func newMockTracer() *mocktracer { var t mocktracer - t.openSpans = make(map[uint64]Span) + t.openSpans = make(map[uint64]*Span) t.dsmTransport = &mockDSMTransport{} client := &http.Client{ Transport: t.dsmTransport, } - t.dsmProcessor = datastreams.NewProcessor(&statsd.NoOpClient{}, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, client) + t.dsmProcessor = datastreams.NewProcessor(&statsd.NoOpClientDirect{}, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, client) t.dsmProcessor.Start() t.dsmProcessor.Flush() return &t } +// This is called by the spans when they finish +func (t *mocktracer) FinishSpan(s *tracer.Span) { + t.addFinishedSpan(s) +} + // Stop deactivates the mock tracer and sets the active tracer to a no-op. func (t *mocktracer) Stop() { - internal.SetGlobalTracer(&internal.NoopTracer{}) - internal.Testing = false + // N.b.: The main reason for this call is to make TestTracerStop pass. + internal.SetGlobalTracer(tracer.Tracer(&tracer.NoopTracer{})) t.dsmProcessor.Stop() } -func (t *mocktracer) StartSpan(operationName string, opts ...ddtrace.StartSpanOption) ddtrace.Span { - var cfg ddtrace.StartSpanConfig +func (t *mocktracer) StartSpan(operationName string, opts ...tracer.StartSpanOption) *tracer.Span { + var cfg tracer.StartSpanConfig for _, fn := range opts { fn(&cfg) } - span := newSpan(t, operationName, &cfg) + span := newSpan(operationName, &cfg) t.Lock() - t.openSpans[span.SpanID()] = span + t.openSpans[span.Context().SpanID()] = MockSpan(span) t.Unlock() return span @@ -111,17 +136,25 @@ func (t *mocktracer) GetDataStreamsProcessor() *datastreams.Processor { return t.dsmProcessor } -func (t *mocktracer) OpenSpans() []Span { +func UnwrapSlice(ss []*Span) []*tracer.Span { + ret := make([]*tracer.Span, len(ss)) + for i, sp := range ss { + ret[i] = sp.Unwrap() + } + return ret +} + +func (t *mocktracer) OpenSpans() []*Span { t.RLock() defer t.RUnlock() - spans := make([]Span, 0, len(t.openSpans)) + spans := make([]*Span, 0, len(t.openSpans)) for _, s := range t.openSpans { spans = append(spans, s) } return spans } -func (t *mocktracer) FinishedSpans() []Span { +func (t *mocktracer) FinishedSpans() []*Span { t.RLock() defer t.RUnlock() return t.finishedSpans @@ -136,14 +169,20 @@ func (t *mocktracer) Reset() { t.finishedSpans = nil } -func (t *mocktracer) addFinishedSpan(s Span) { +func (t *mocktracer) addFinishedSpan(s *tracer.Span) { t.Lock() defer t.Unlock() - delete(t.openSpans, s.SpanID()) + // If the span is not in the open spans, we may be finishing a span that was started + // before the mock tracer was started. In this case, we don't want to add it to the + // finished spans. + if _, ok := t.openSpans[s.Context().SpanID()]; !ok { + return + } + delete(t.openSpans, s.Context().SpanID()) if t.finishedSpans == nil { - t.finishedSpans = make([]Span, 0, 1) + t.finishedSpans = make([]*Span, 0, 1) } - t.finishedSpans = append(t.finishedSpans, s) + t.finishedSpans = append(t.finishedSpans, MockSpan(s)) } const ( @@ -153,67 +192,25 @@ const ( baggagePrefix = tracer.DefaultBaggageHeaderPrefix ) -func (t *mocktracer) Extract(carrier interface{}) (ddtrace.SpanContext, error) { - reader, ok := carrier.(tracer.TextMapReader) - if !ok { - return nil, tracer.ErrInvalidCarrier - } - var sc spanContext - err := reader.ForeachKey(func(key, v string) error { - k := strings.ToLower(key) - if k == traceHeader { - id, err := strconv.ParseUint(v, 10, 64) - if err != nil { - return tracer.ErrSpanContextCorrupted - } - sc.traceID = id - } - if k == spanHeader { - id, err := strconv.ParseUint(v, 10, 64) - if err != nil { - return tracer.ErrSpanContextCorrupted - } - sc.spanID = id - } - if k == priorityHeader { - p, err := strconv.Atoi(v) - if err != nil { - return tracer.ErrSpanContextCorrupted - } - sc.priority = p - sc.hasPriority = true - } - if strings.HasPrefix(k, baggagePrefix) { - sc.setBaggageItem(strings.TrimPrefix(k, baggagePrefix), v) - } - return nil - }) - if err != nil { - return nil, err - } - if sc.traceID == 0 || sc.spanID == 0 { - return nil, tracer.ErrSpanContextNotFound - } - return &sc, err +func (t *mocktracer) Extract(carrier interface{}) (*tracer.SpanContext, error) { + return tracer.NewPropagator(&tracer.PropagatorConfig{ + MaxTagsHeaderLen: 512, + }).Extract(carrier) } -func (t *mocktracer) Inject(context ddtrace.SpanContext, carrier interface{}) error { - writer, ok := carrier.(tracer.TextMapWriter) - if !ok { - return tracer.ErrInvalidCarrier - } - ctx, ok := context.(*spanContext) - if !ok || ctx.traceID == 0 || ctx.spanID == 0 { - return tracer.ErrInvalidSpanContext - } - writer.Set(traceHeader, strconv.FormatUint(ctx.traceID, 10)) - writer.Set(spanHeader, strconv.FormatUint(ctx.spanID, 10)) - if ctx.hasSamplingPriority() { - writer.Set(priorityHeader, strconv.Itoa(ctx.priority)) +func (t *mocktracer) Inject(context *tracer.SpanContext, carrier interface{}) error { + return tracer.NewPropagator(&tracer.PropagatorConfig{ + MaxTagsHeaderLen: 512, + }).Inject(context, carrier) +} + +func (t *mocktracer) TracerConf() tracer.TracerConf { + return tracer.TracerConf{} +} + +func (t *mocktracer) Flush() { + t.dsmProcessor.Flush() + for _, s := range t.OpenSpans() { + t.addFinishedSpan(s.sp) } - ctx.ForeachBaggageItem(func(k, v string) bool { - writer.Set(baggagePrefix+k, v) - return true - }) - return nil } diff --git a/ddtrace/mocktracer/mocktracer_test.go b/ddtrace/mocktracer/mocktracer_test.go index fe2a2c229a..6f43bc6ef9 100644 --- a/ddtrace/mocktracer/mocktracer_test.go +++ b/ddtrace/mocktracer/mocktracer_test.go @@ -6,20 +6,19 @@ package mocktracer import ( + "fmt" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/stretchr/testify/assert" ) func TestStart(t *testing.T) { trc := Start() - if tt, ok := internal.GetGlobalTracer().(Tracer); !ok || tt != trc { + if tt, ok := getGlobalTracer().(Tracer); !ok || tt != trc { t.Fail() } // If the tracer isn't stopped it leaks goroutines, and breaks other tests. @@ -28,59 +27,65 @@ func TestStart(t *testing.T) { func TestTracerStop(t *testing.T) { Start().Stop() - if _, ok := internal.GetGlobalTracer().(*internal.NoopTracer); !ok { - t.Fail() + tr := getGlobalTracer() + if _, ok := tr.(*tracer.NoopTracer); !ok { + t.Errorf("tracer is not a NoopTracer: %T", tr) } } func TestTracerStartSpan(t *testing.T) { - parentTags := map[string]interface{}{ext.ServiceName: "root-service", ext.SamplingPriority: -1} - startTime := time.Now() + parentTags := map[string]interface{}{ext.ServiceName: "root-service", ext.ManualDrop: true} + // Need to round the monotonic clock so parsed UnixNano values are equal. + // See time.Time documentation for details: + // https://pkg.go.dev/time#Time + startTime := time.Now().Round(0) t.Run("with-service", func(t *testing.T) { mt := newMockTracer() defer mt.Stop() - - parent := newSpan(mt, "http.request", &ddtrace.StartSpanConfig{Tags: parentTags}) - s, ok := mt.StartSpan( + parent := MockSpan(newSpan("http.request", &tracer.StartSpanConfig{Tags: parentTags})) + s := MockSpan(mt.StartSpan( "db.query", tracer.ServiceName("my-service"), tracer.StartTime(startTime), tracer.ChildOf(parent.Context()), - ).(*mockspan) + )) assert := assert.New(t) - assert.True(ok) + assert.NotNil(s) assert.Equal("db.query", s.OperationName()) assert.Equal(startTime, s.StartTime()) assert.Equal("my-service", s.Tag(ext.ServiceName)) assert.Equal(parent.SpanID(), s.ParentID()) assert.Equal(parent.TraceID(), s.TraceID()) - assert.True(parent.context.hasSamplingPriority()) - assert.Equal(-1, parent.context.samplingPriority()) + sp, ok := parent.Context().SamplingPriority() + assert.True(ok) + assert.Equal(-1, sp) }) t.Run("inherit", func(t *testing.T) { mt := newMockTracer() defer mt.Stop() - - parent := newSpan(mt, "http.request", &ddtrace.StartSpanConfig{Tags: parentTags}) - s, ok := mt.StartSpan("db.query", tracer.ChildOf(parent.Context())).(*mockspan) + parent := MockSpan(newSpan("http.request", &tracer.StartSpanConfig{Tags: parentTags})) + s := MockSpan(mt.StartSpan("db.query", tracer.ChildOf(parent.Context()))) assert := assert.New(t) - assert.True(ok) + assert.NotNil(s) assert.Equal("db.query", s.OperationName()) assert.Equal("root-service", s.Tag(ext.ServiceName)) assert.Equal(parent.SpanID(), s.ParentID()) assert.Equal(parent.TraceID(), s.TraceID()) - assert.True(s.context.hasSamplingPriority()) - assert.Equal(-1, s.context.samplingPriority()) + sp, ok := parent.Context().SamplingPriority() + assert.True(ok) + assert.Equal(-1, sp) }) } func TestTracerFinishedSpans(t *testing.T) { - mt := newMockTracer() - defer mt.Stop() + mt := Start() + t.Cleanup(func() { + mt.Stop() + }) assert.Empty(t, mt.FinishedSpans()) parent := mt.StartSpan("http.request") @@ -92,10 +97,10 @@ func TestTracerFinishedSpans(t *testing.T) { for _, s := range mt.FinishedSpans() { switch s.OperationName() { case "http.request": - assert.Equal(t, parent, s) + assert.Equal(t, parent, s.Unwrap()) found++ case "db.query": - assert.Equal(t, child, s) + assert.Equal(t, child, s.Unwrap()) found++ } } @@ -103,16 +108,18 @@ func TestTracerFinishedSpans(t *testing.T) { } func TestTracerOpenSpans(t *testing.T) { - mt := newMockTracer() - defer mt.Stop() + mt := Start() + t.Cleanup(func() { + mt.Stop() + }) assert.Empty(t, mt.OpenSpans()) parent := mt.StartSpan("http.request") child := mt.StartSpan("db.query", tracer.ChildOf(parent.Context())) assert.Len(t, mt.OpenSpans(), 2) - assert.Contains(t, mt.OpenSpans(), parent) - assert.Contains(t, mt.OpenSpans(), child) + assert.Contains(t, UnwrapSlice(mt.OpenSpans()), parent) + assert.Contains(t, UnwrapSlice(mt.OpenSpans()), child) child.Finish() assert.Len(t, mt.OpenSpans(), 1) @@ -123,9 +130,8 @@ func TestTracerOpenSpans(t *testing.T) { } func TestTracerSetUser(t *testing.T) { - mt := newMockTracer() - defer mt.Stop() - + mt := Start() + defer mt.Stop() // TODO (hannahkm): confirm this is correct span := mt.StartSpan("http.request") tracer.SetUser(span, "test-user", tracer.WithUserEmail("email"), @@ -150,8 +156,10 @@ func TestTracerSetUser(t *testing.T) { func TestTracerReset(t *testing.T) { assert := assert.New(t) - mt := newMockTracer() - defer mt.Stop() + mt := Start().(*mocktracer) + t.Cleanup(func() { + mt.Stop() + }) span := mt.StartSpan("parent") _ = mt.StartSpan("child", tracer.ChildOf(span.Context())) @@ -174,33 +182,32 @@ func TestTracerInject(t *testing.T) { assert := assert.New(t) - err := mt.Inject(&spanContext{}, 2) + err := mt.Inject(&tracer.SpanContext{}, 2) assert.Equal(tracer.ErrInvalidCarrier, err) // 2 is not a carrier - err = mt.Inject(&spanContext{}, tracer.TextMapCarrier(map[string]string{})) + err = mt.Inject(&tracer.SpanContext{}, tracer.TextMapCarrier(map[string]string{})) assert.Equal(tracer.ErrInvalidSpanContext, err) // no traceID and spanID - err = mt.Inject(&spanContext{traceID: 2}, tracer.TextMapCarrier(map[string]string{})) - assert.Equal(tracer.ErrInvalidSpanContext, err) // no spanID + sp := mt.StartSpan("op") - err = mt.Inject(&spanContext{traceID: 2, spanID: 1}, tracer.TextMapCarrier(map[string]string{})) + err = mt.Inject(sp.Context(), tracer.TextMapCarrier(map[string]string{})) assert.Nil(err) // ok }) t.Run("ok", func(t *testing.T) { - sctx := &spanContext{ - traceID: 1, - spanID: 2, - priority: -1, - hasPriority: true, - baggage: map[string]string{"A": "B", "C": "D"}, - } + mt := newMockTracer() + defer mt.Stop() + assert := assert.New(t) + + sp := mt.StartSpan("op", tracer.WithSpanID(2)) + sp.SetTag(ext.ManualDrop, true) + sp.SetBaggageItem("A", "B") + sp.SetBaggageItem("C", "D") carrier := make(map[string]string) - err := (&mocktracer{}).Inject(sctx, tracer.TextMapCarrier(carrier)) + err := (&mocktracer{}).Inject(sp.Context(), tracer.TextMapCarrier(carrier)) - assert := assert.New(t) assert.Nil(err) - assert.Equal("1", carrier[traceHeader]) + assert.Equal(fmt.Sprintf("%d", sp.Context().TraceIDLower()), carrier[traceHeader]) assert.Equal("2", carrier[spanHeader]) assert.Equal("-1", carrier[priorityHeader]) assert.Equal("B", carrier[baggagePrefix+"A"]) @@ -269,40 +276,54 @@ func TestTracerExtract(t *testing.T) { ctx, err := mt.Extract(carry(traceHeader, "1", spanHeader, "2")) assert.Nil(err) - sc, ok := ctx.(*spanContext) - assert.True(ok) - assert.Equal(uint64(1), sc.traceID) - assert.Equal(uint64(2), sc.spanID) + assert.Equal(uint64(1), ctx.TraceIDLower()) + assert.Equal(uint64(2), ctx.SpanID()) ctx, err = mt.Extract(carry(traceHeader, "1", spanHeader, "2", baggagePrefix+"A", "B", baggagePrefix+"C", "D")) assert.Nil(err) - sc, ok = ctx.(*spanContext) - assert.True(ok) - assert.Equal("B", sc.baggageItem("a")) - assert.Equal("D", sc.baggageItem("c")) + ctx.ForeachBaggageItem(func(k string, v string) bool { + if k == "a" { + assert.Equal("B", v) + } + if k == "c" { + assert.Equal("D", v) + } + return true + }) ctx, err = mt.Extract(carry(traceHeader, "1", spanHeader, "2", priorityHeader, "-1")) assert.Nil(err) - sc, ok = ctx.(*spanContext) + sp, ok := ctx.SamplingPriority() assert.True(ok) - assert.True(sc.hasSamplingPriority()) - assert.Equal(-1, sc.samplingPriority()) + assert.Equal(-1, sp) }) t.Run("consistency", func(t *testing.T) { assert := assert.New(t) - want := &spanContext{traceID: 1, spanID: 2, baggage: map[string]string{"a": "B", "C": "D"}} + + mt := newMockTracer() + defer mt.Stop() + sp := mt.StartSpan("op", tracer.WithSpanID(2)) + sp.SetTag(ext.ManualDrop, true) + sp.SetBaggageItem("a", "B") + sp.SetBaggageItem("C", "D") + mc := tracer.TextMapCarrier(make(map[string]string)) - err := mt.Inject(want, mc) + err := mt.Inject(sp.Context(), mc) assert.Nil(err) sc, err := mt.Extract(mc) assert.Nil(err) - got, ok := sc.(*spanContext) - assert.True(ok) - assert.Equal(uint64(1), got.traceID) - assert.Equal(uint64(2), got.spanID) - assert.Equal("D", got.baggageItem("c")) - assert.Equal("B", got.baggageItem("a")) + assert.Equal(sp.Context().TraceID(), sc.TraceID()) + assert.Equal(uint64(2), sc.SpanID()) + sc.ForeachBaggageItem(func(k string, v string) bool { + if k == "a" { + assert.Equal("B", v) + } + if k == "C" { + assert.Equal("D", v) + } + return true + }) }) } diff --git a/ddtrace/opentelemetry/example_test.go b/ddtrace/opentelemetry/example_test.go index 70eebbf5f1..ec5d10db4a 100644 --- a/ddtrace/opentelemetry/example_test.go +++ b/ddtrace/opentelemetry/example_test.go @@ -10,9 +10,9 @@ import ( "log" "os" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - ddotel "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentelemetry" - ddtracer "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + ddotel "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry" + ddtracer "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" diff --git a/ddtrace/opentelemetry/options.go b/ddtrace/opentelemetry/options.go index a00024b90d..ffe6c275cc 100644 --- a/ddtrace/opentelemetry/options.go +++ b/ddtrace/opentelemetry/options.go @@ -8,7 +8,7 @@ package opentelemetry import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) type contextOptionsKey struct{} diff --git a/ddtrace/opentelemetry/otel_test.go b/ddtrace/opentelemetry/otel_test.go index 5b76673025..11be1aea8d 100644 --- a/ddtrace/opentelemetry/otel_test.go +++ b/ddtrace/opentelemetry/otel_test.go @@ -11,10 +11,13 @@ import ( "net/http/httptest" "testing" + ddbaggage "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/Masterminds/semver/v3" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel" + otelbaggage "go.opentelemetry.io/otel/baggage" "go.opentelemetry.io/otel/propagation" oteltrace "go.opentelemetry.io/otel/trace" ) @@ -29,7 +32,7 @@ func TestHttpDistributedTrace(t *testing.T) { sctx, rootSpan := tr.Start(context.Background(), "testRootSpan") - w := otelhttp.NewHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w := otelhttp.NewHandler(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { receivedSpan := oteltrace.SpanFromContext(r.Context()) assert.Equal(rootSpan.SpanContext().TraceID(), receivedSpan.SpanContext().TraceID()) }), "testOperation") @@ -45,10 +48,87 @@ func TestHttpDistributedTrace(t *testing.T) { p := <-payloads assert.Len(p, 2) - assert.Equal("server.request", p[0][0]["name"]) - assert.Equal("internal", p[1][0]["name"]) - assert.Equal("client.request", p[1][1]["name"]) + expected := expectedSpanNames() + assert.Equal(expected[0], p[0][0]["name"]) + assert.Equal(expected[1], p[1][0]["name"]) + assert.Equal(expected[2], p[1][1]["name"]) assert.Equal("testOperation", p[0][0]["resource"]) assert.Equal("testRootSpan", p[1][0]["resource"]) assert.Equal("HTTP GET", p[1][1]["resource"]) } + +func expectedSpanNames() []string { + v := semver.MustParse(otelhttp.Version()) + if v.Compare(semver.MustParse("0.60.0")) <= 0 { + return []string{"server.request", "internal", "client.request"} + } + return []string{"http.server.request", "internal", "http.client.request"} +} + +// setupBaggageContext creates a context with both OpenTelemetry and Datadog baggage +func setupBaggageContext(t *testing.T) (context.Context, oteltrace.Span) { + assert := assert.New(t) + tp, _, cleanup := mockTracerProvider(t) + t.Cleanup(cleanup) + otel.SetTracerProvider(tp) + otel.SetTextMapPropagator(propagation.Baggage{}) + tr := tp.Tracer("") + + ctx := context.Background() + otelMember, err := otelbaggage.NewMember("otel-key", "otel-value") + assert.NoError(err) + otelBag, err := otelbaggage.New(otelMember) + assert.NoError(err) + ctx = otelbaggage.ContextWithBaggage(ctx, otelBag) + ctx = ddbaggage.Set(ctx, "dd-key", "dd-value") + + sctx, rootSpan := tr.Start(ctx, "testRootSpan") + return sctx, rootSpan +} + +// setupTestServer creates a test HTTP server that captures baggage headers +func setupTestServer(t *testing.T) (*httptest.Server, *string) { + var extractedBaggage string + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + extractedBaggage = r.Header.Get("baggage") + w.WriteHeader(http.StatusOK) + }) + wrappedHandler := otelhttp.NewHandler(handler, "testOperation") + testServer := httptest.NewServer(wrappedHandler) + t.Cleanup(testServer.Close) + return testServer, &extractedBaggage +} + +func TestHttpDistributedTraceWithBaggage(t *testing.T) { + assert := assert.New(t) + req := require.New(t) + + // Setup context with baggage + sctx, rootSpan := setupBaggageContext(t) + defer rootSpan.End() + + // Setup test server + testServer, extractedBaggage := setupTestServer(t) + + // Make HTTP request with baggage context + client := http.Client{Transport: otelhttp.NewTransport(nil)} + httpReq, err := http.NewRequestWithContext(sctx, http.MethodGet, testServer.URL, nil) + req.NoError(err) + resp, err := client.Do(httpReq) + req.NoError(err) + req.NoError(resp.Body.Close()) + + // Verify baggage propagation + carrier := propagation.MapCarrier{} + otel.GetTextMapPropagator().Inject(sctx, carrier) + + // Check that the injected "baggage" header includes both baggage items + injectedBaggage, ok := carrier["baggage"] + req.True(ok, "baggage header must be present in the injected carrier") + assert.Contains(injectedBaggage, "otel-key=otel-value") + assert.Contains(injectedBaggage, "dd-key=dd-value") + + // Verify that the HTTP server received the merged baggage header + assert.Contains(*extractedBaggage, "otel-key=otel-value") + assert.Contains(*extractedBaggage, "dd-key=dd-value") +} diff --git a/ddtrace/opentelemetry/span.go b/ddtrace/opentelemetry/span.go index 91abe11a78..7656a6b6dd 100644 --- a/ddtrace/opentelemetry/span.go +++ b/ddtrace/opentelemetry/span.go @@ -7,17 +7,15 @@ package opentelemetry import ( "encoding/binary" - "encoding/json" "errors" - "fmt" "strconv" "strings" "sync" + "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/log" "go.opentelemetry.io/otel/attribute" otelcodes "go.opentelemetry.io/otel/codes" @@ -30,7 +28,7 @@ var _ oteltrace.Span = (*span)(nil) type span struct { noop.Span // https://pkg.go.dev/go.opentelemetry.io/otel/trace#hdr-API_Implementations mu sync.RWMutex `msg:"-"` // all fields are protected by this RWMutex - DD tracer.Span + DD *tracer.Span finished bool attributes map[string]interface{} spanKind oteltrace.SpanKind @@ -50,9 +48,8 @@ func (s *span) SetName(name string) { // spanEvent holds information about span events type spanEvent struct { - Name string `json:"name"` - TimeUnixNano int64 `json:"time_unix_nano"` - Attributes map[string]interface{} `json:"attributes,omitempty"` + name string + options []tracer.SpanEventOption } func (s *span) End(options ...oteltrace.SpanEndOption) { @@ -80,13 +77,8 @@ func (s *span) End(options ...oteltrace.SpanEndOption) { for k, v := range s.attributes { s.DD.SetTag(k, v) } - if s.events != nil { - b, err := json.Marshal(s.events) - if err == nil { - s.DD.SetTag("events", string(b)) - } else { - log.Debug(fmt.Sprintf("Issue marshaling span events; events dropped from span meta\n%v", err)) - } + for _, evt := range s.events { + s.DD.AddEvent(evt.name, evt.options...) } var finishCfg = oteltrace.NewSpanEndConfig(options...) var opts []tracer.FinishOption @@ -94,15 +86,27 @@ func (s *span) End(options ...oteltrace.SpanEndOption) { s.DD.SetTag(ext.ErrorMsg, s.statusInfo.description) opts = append(opts, tracer.WithError(errors.New(s.statusInfo.description))) } - if t := finishCfg.Timestamp(); !t.IsZero() { - opts = append(opts, tracer.FinishTime(t)) - } if len(s.finishOpts) != 0 { opts = append(opts, s.finishOpts...) } + // If finishOpts has been appended, the following option will be a no-op. + // This is because finishOpts may contain a FinishTime option, which will be + // used to set the finish time of the span. + if t := finishCfg.Timestamp(); !t.IsZero() { + opts = append(opts, finishTime(t)) + } s.DD.Finish(opts...) } +func finishTime(t time.Time) tracer.FinishOption { + return func(cfg *tracer.FinishConfig) { + if !cfg.FinishTime.IsZero() { + return + } + cfg.FinishTime = t + } +} + // EndOptions sets tracer.FinishOption on a given span to be executed when span is finished. func EndOptions(sp oteltrace.Span, options ...tracer.FinishOption) { s, ok := sp.(*span) @@ -117,12 +121,7 @@ func (s *span) SpanContext() oteltrace.SpanContext { ctx := s.DD.Context() var traceID oteltrace.TraceID var spanID oteltrace.SpanID - if w3cCtx, ok := ctx.(ddtrace.SpanContextW3C); ok { - traceID = w3cCtx.TraceID128Bytes() - } else { - log.Debug("Non-W3C context found in span, unable to get full 128 bit trace id") - uint64ToByte(ctx.TraceID(), traceID[:]) - } + traceID = ctx.TraceIDBytes() uint64ToByte(ctx.SpanID(), spanID[:]) config := oteltrace.SpanContextConfig{ TraceID: traceID, @@ -139,7 +138,7 @@ func (s *span) extractTraceData(c *oteltrace.SpanContextConfig) { } state, err := oteltrace.ParseTraceState(headers["tracestate"]) if err != nil { - log.Debug("Couldn't parse tracestate: %v", err) + log.Debug("Couldn't parse tracestate: %s", err.Error()) return } c.TraceState = state @@ -150,7 +149,7 @@ func (s *span) extractTraceData(c *oteltrace.SpanContextConfig) { // where flags represents the propagated flags in the format of 2 hex-encoded digits at the end of the traceparent. otelFlagLen := 2 if f, err := strconv.ParseUint(parent[len(parent)-otelFlagLen:], 16, 8); err != nil { - log.Debug("Couldn't parse traceparent: %v", err) + log.Debug("Couldn't parse traceparent: %s", err.Error()) } else { c.TraceFlags = oteltrace.TraceFlags(f) } @@ -198,9 +197,11 @@ func (s *span) AddEvent(name string, opts ...oteltrace.EventOption) { attrs[string(a.Key)] = a.Value.AsInterface() } e := spanEvent{ - Name: name, - TimeUnixNano: c.Timestamp().UnixNano(), - Attributes: attrs, + name: name, + options: []tracer.SpanEventOption{ + tracer.WithSpanEventTimestamp(c.Timestamp()), + tracer.WithSpanEventAttributes(attrs), + }, } s.events = append(s.events, e) } diff --git a/ddtrace/opentelemetry/span_test.go b/ddtrace/opentelemetry/span_test.go index ff66da8c91..9c4ef56ea3 100644 --- a/ddtrace/opentelemetry/span_test.go +++ b/ddtrace/opentelemetry/span_test.go @@ -17,10 +17,9 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/httpmem" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httpmem" "github.com/stretchr/testify/assert" "github.com/tinylib/msgp/msgp" @@ -104,7 +103,7 @@ func TestSpanResourceNameDefault(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("internal", p[0]["name"]) @@ -127,7 +126,7 @@ func TestSpanSetName(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal(strings.ToLower("NewName"), p[0]["name"]) @@ -165,13 +164,14 @@ func TestSpanLink(t *testing.T) { tracer.Flush() payload, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } assert.NotNil(payload) assert.Len(payload, 1) // only one trace assert.Len(payload[0], 1) // only one span - var spanLinks []ddtrace.SpanLink + // Convert the span_links field from type []map[string]interface{} to a struct + var spanLinks []tracer.SpanLink spanLinkBytes, _ := json.Marshal(payload[0][0]["span_links"]) json.Unmarshal(spanLinkBytes, &spanLinks) assert.Len(spanLinks, 1) // only one span link @@ -222,7 +222,7 @@ func TestSpanEnd(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] @@ -285,7 +285,7 @@ func TestSpanSetStatus(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] // An error description is set IFF the span has an error @@ -313,12 +313,12 @@ func TestSpanSetStatus(t *testing.T) { } func TestSpanAddEvent(t *testing.T) { - assert := assert.New(t) _, _, cleanup := mockTracerProvider(t) tr := otel.Tracer("") defer cleanup() t.Run("event with attributes", func(t *testing.T) { + assert := assert.New(t) _, sp := tr.Start(context.Background(), "span_event") // When no timestamp option is provided, otel will generate a timestamp for the event // We can't know the exact time that the event is added, but we can create start and end "bounds" and assert @@ -338,11 +338,16 @@ func TestSpanAddEvent(t *testing.T) { // Assert event exists under span events assert.Len(dd.events, 1) e := dd.events[0] - assert.Equal(e.Name, "My event!") + assert.Equal(e.name, "My event!") + + cfg := tracer.SpanEventConfig{} + for _, opt := range e.options { + opt(&cfg) + } // assert event timestamp is [around] the expected time - assert.True((e.TimeUnixNano) >= timeStartBound && e.TimeUnixNano <= timeEndBound) + assert.True((cfg.Time.UnixNano()) >= timeStartBound && cfg.Time.UnixNano() <= timeEndBound) // Assert both attributes exist on the event - assert.Len(e.Attributes, 3) + assert.Len(cfg.Attributes, 3) // Assert attribute key-value fields // note that attribute.Int("pid", 4328) created an attribute with value int64(4328), hence why the `want` is in int64 format wantAttrs := map[string]interface{}{ @@ -351,10 +356,11 @@ func TestSpanAddEvent(t *testing.T) { "condition": false, } for k, v := range wantAttrs { - assert.True(attributesContains(e.Attributes, k, v)) + assert.True(attributesContains(cfg.Attributes, k, v)) } }) t.Run("event with timestamp", func(t *testing.T) { + assert := assert.New(t) _, sp := tr.Start(context.Background(), "span_event") // generate micro and nano second timestamps now := time.Now() @@ -366,10 +372,16 @@ func TestSpanAddEvent(t *testing.T) { dd := sp.(*span) assert.Len(dd.events, 1) e := dd.events[0] + + cfg := tracer.SpanEventConfig{} + for _, opt := range e.options { + opt(&cfg) + } // assert resulting timestamp is in nanoseconds - assert.Equal(timeMicro*1000, e.TimeUnixNano) + assert.Equal(timeMicro*1000, cfg.Time.UnixNano()) }) t.Run("mulitple events", func(t *testing.T) { + assert := assert.New(t) _, sp := tr.Start(context.Background(), "sp") now := time.Now() sp.AddEvent("evt1", oteltrace.WithTimestamp(now)) @@ -425,7 +437,7 @@ func TestSpanContextWithStartOptions(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] t.Logf("%v", p[0]) @@ -463,7 +475,7 @@ func TestSpanContextWithStartOptionsPriorityOrder(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("persisted_srv", p[0]["service"]) @@ -502,7 +514,7 @@ func TestSpanEndOptionsPriorityOrder(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal(float64(duration.Nanoseconds()), p[0]["duration"]) @@ -531,7 +543,7 @@ func TestSpanEndOptions(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("ctx_srv", p[0]["service"]) @@ -579,7 +591,7 @@ func TestSpanSetAttributes(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] meta := fmt.Sprintf("%v", p[0]["meta"]) @@ -620,7 +632,7 @@ func TestSpanSetAttributesWithRemapping(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("graphql.server.request", p[0]["name"]) @@ -638,7 +650,7 @@ func TestTracerStartOptions(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("test_serv", p[0]["service"]) @@ -661,7 +673,7 @@ func TestOperationNameRemapping(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("graphql.server.request", p[0]["name"]) @@ -788,7 +800,7 @@ func TestRemapName(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal(test.out, p[0]["name"]) @@ -818,7 +830,7 @@ func TestRemapWithMultipleSetAttributes(t *testing.T) { tracer.Flush() traces, err := waitForPayload(payloads) if err != nil { - t.Fatalf(err.Error()) + t.Fatal(err.Error()) } p := traces[0] assert.Equal("overriden.name", p[0]["name"]) diff --git a/ddtrace/opentelemetry/telemetry_test.go b/ddtrace/opentelemetry/telemetry_test.go index 573d6ea699..faf70957c5 100644 --- a/ddtrace/opentelemetry/telemetry_test.go +++ b/ddtrace/opentelemetry/telemetry_test.go @@ -9,8 +9,8 @@ import ( "fmt" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" "github.com/stretchr/testify/assert" ) @@ -22,22 +22,22 @@ func TestTelemetry(t *testing.T) { expectedExtract string }{ { - // if nothing is set, DD_TRACE_PROPAGATION_STYLE will be set to datadog,tracecontext - expectedInject: "datadog,tracecontext", - expectedExtract: "datadog,tracecontext", + // if nothing is set, DD_TRACE_PROPAGATION_STYLE will be set to datadog,tracecontext,baggage + expectedInject: "datadog,tracecontext,baggage", + expectedExtract: "datadog,tracecontext,baggage", }, { env: map[string]string{ "DD_TRACE_PROPAGATION_STYLE_EXTRACT": "datadog", }, - expectedInject: "datadog,tracecontext", + expectedInject: "datadog,tracecontext,baggage", expectedExtract: "datadog", }, { env: map[string]string{ "DD_TRACE_PROPAGATION_STYLE_EXTRACT": "none", }, - expectedInject: "datadog,tracecontext", + expectedInject: "datadog,tracecontext,baggage", expectedExtract: "", }, { @@ -54,8 +54,8 @@ func TestTelemetry(t *testing.T) { "DD_PROPAGATION_STYLE_INJECT": "tracecontext", "DD_TRACE_PROPAGATION_STYLE_EXTRACT": "", }, - expectedInject: "tracecontext", - expectedExtract: "datadog,tracecontext", + expectedInject: "datadog,tracecontext,baggage", // default value + expectedExtract: "datadog,tracecontext,baggage", }, { env: map[string]string{ @@ -63,7 +63,7 @@ func TestTelemetry(t *testing.T) { "DD_PROPAGATION_STYLE_INJECT": "datadog,tracecontext", "DD_TRACE_PROPAGATION_STYLE_EXTRACT": "b3", }, - expectedInject: "datadog,tracecontext", + expectedInject: "datadog,tracecontext,baggage", // default value expectedExtract: "b3", }, } @@ -73,16 +73,15 @@ func TestTelemetry(t *testing.T) { for k, v := range test.env { t.Setenv(k, v) } - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() p := NewTracerProvider() p.Tracer("") defer p.Shutdown() - assert.True(t, telemetryClient.Started) - telemetry.Check(t, telemetryClient.Configuration, "trace_propagation_style_inject", test.expectedInject) - telemetry.Check(t, telemetryClient.Configuration, "trace_propagation_style_extract", test.expectedExtract) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_propagation_style_inject", Value: test.expectedInject}) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_propagation_style_extract", Value: test.expectedExtract}) }) } diff --git a/ddtrace/opentelemetry/tracer.go b/ddtrace/opentelemetry/tracer.go index 42df8e2b6f..a8caaf039e 100644 --- a/ddtrace/opentelemetry/tracer.go +++ b/ddtrace/opentelemetry/tracer.go @@ -9,12 +9,15 @@ import ( "context" "encoding/binary" "encoding/hex" + "log/slog" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + otelbaggage "go.opentelemetry.io/otel/baggage" oteltrace "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" ) @@ -26,13 +29,13 @@ var telemetryTags = []string{"integration_name:otel"} type oteltracer struct { noop.Tracer // https://pkg.go.dev/go.opentelemetry.io/otel/trace#hdr-API_Implementations provider *TracerProvider - DD ddtrace.Tracer + DD tracer.Tracer } func (t *oteltracer) Start(ctx context.Context, spanName string, opts ...oteltrace.SpanStartOption) (context.Context, oteltrace.Span) { var ssConfig = oteltrace.NewSpanStartConfig(opts...) // OTel name is akin to resource name in Datadog - var ddopts = []ddtrace.StartSpanOption{tracer.ResourceName(spanName)} + var ddopts = []tracer.StartSpanOption{tracer.ResourceName(spanName)} if !ssConfig.NewRoot() { if s, ok := tracer.SpanFromContext(ctx); ok { // if the span originates from the Datadog tracer, @@ -41,7 +44,7 @@ func (t *oteltracer) Start(ctx context.Context, spanName string, opts ...oteltra } else if sctx := oteltrace.SpanFromContext(ctx).SpanContext(); sctx.IsValid() { // if the span doesn't originate from the Datadog tracer, // use SpanContextW3C implementation struct to pass span context information - ddopts = append(ddopts, tracer.ChildOf(&otelCtxToDDCtx{sctx})) + ddopts = append(ddopts, tracer.ChildOf(tracer.FromGenericCtx(&otelCtxToDDCtx{sctx}))) } } if t := ssConfig.Timestamp(); !t.IsZero() { @@ -50,29 +53,33 @@ func (t *oteltracer) Start(ctx context.Context, spanName string, opts ...oteltra if k := ssConfig.SpanKind(); k != 0 { ddopts = append(ddopts, tracer.Tag(ext.SpanKind, k.String())) } - telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "spans_created", 1.0, telemetryTags, true) - var cfg ddtrace.StartSpanConfig + telemetry.Count(telemetry.NamespaceTracers, "spans_created", telemetryTags).Submit(1.0) + var cfg tracer.StartSpanConfig cfg.Tags = make(map[string]interface{}) - for _, attr := range ssConfig.Attributes() { - cfg.Tags[string(attr.Key)] = attr.Value.AsInterface() - } if opts, ok := spanOptionsFromContext(ctx); ok { ddopts = append(ddopts, opts...) for _, o := range opts { o(&cfg) } } + for _, attr := range ssConfig.Attributes() { + k := string(attr.Key) + if _, ok := cfg.Tags[k]; ok { + continue + } + cfg.Tags[k] = attr.Value.AsInterface() + } // Add provide OTel Span Links to the underlying Datadog span. if len(ssConfig.Links()) > 0 { - links := make([]ddtrace.SpanLink, 0, len(ssConfig.Links())) + links := make([]tracer.SpanLink, 0, len(ssConfig.Links())) for _, link := range ssConfig.Links() { ctx := otelCtxToDDCtx{link.SpanContext} attrs := make(map[string]string, len(link.Attributes)) for _, attr := range link.Attributes { attrs[string(attr.Key)] = attr.Value.Emit() } - links = append(links, ddtrace.SpanLink{ - TraceID: ctx.TraceID(), + links = append(links, tracer.SpanLink{ + TraceID: ctx.TraceIDLower(), TraceIDHigh: ctx.TraceIDUpper(), SpanID: ctx.SpanID(), Tracestate: link.SpanContext.TraceState().String(), @@ -89,6 +96,14 @@ func (t *oteltracer) Start(ctx context.Context, spanName string, opts ...oteltra // we have to record the attributes locally. // The span operation name will be calculated when it's ended. s := tracer.StartSpan(spanName, ddopts...) + + // Merge baggage from otel and dd, update Datadog baggage, and update the context. + mergedBag := mergeBaggageFromContext(ctx) + for _, m := range mergedBag.Members() { + ctx = baggage.Set(ctx, m.Key(), m.Value()) + } + ctx = otelbaggage.ContextWithBaggage(ctx, mergedBag) + os := oteltrace.Span(&span{ DD: s, oteltracer: t, @@ -102,13 +117,33 @@ func (t *oteltracer) Start(ctx context.Context, spanName string, opts ...oteltra return ctx, os } +// mergeBaggageFromContext merges Datadog baggage found on the context into the OpenTelemetry baggage found on the context. +// adding key-value pairs only if the key doesn't already exist in the OpenTelemetry baggage. It ensures no existing values are overwritten. +func mergeBaggageFromContext(ctx context.Context) otelbaggage.Baggage { + otelBag := otelbaggage.FromContext(ctx) + for key, value := range baggage.All(ctx) { + if otelBag.Member(key).Value() == "" { + member, err := otelbaggage.NewMemberRaw(key, value) + if err == nil { + b, err := otelBag.SetMember(member) + if err == nil { + otelBag = b + } else { + telemetrylog.Debug("Error adding baggage member; dropping", slog.String("key", key)) + } + } + } + } + return otelBag +} + type otelCtxToDDCtx struct { oc oteltrace.SpanContext } -func (c *otelCtxToDDCtx) TraceID() uint64 { +func (c *otelCtxToDDCtx) TraceID() string { id := c.oc.TraceID() - return binary.BigEndian.Uint64(id[8:]) + return hex.EncodeToString(id[:]) } func (c *otelCtxToDDCtx) TraceIDUpper() uint64 { @@ -116,18 +151,18 @@ func (c *otelCtxToDDCtx) TraceIDUpper() uint64 { return binary.BigEndian.Uint64(id[:8]) } +func (c *otelCtxToDDCtx) TraceIDBytes() [16]byte { + return c.oc.TraceID() +} + +func (c *otelCtxToDDCtx) TraceIDLower() uint64 { + tid := c.oc.TraceID() + return binary.BigEndian.Uint64(tid[8:]) +} + func (c *otelCtxToDDCtx) SpanID() uint64 { id := c.oc.SpanID() return binary.BigEndian.Uint64(id[:]) } func (c *otelCtxToDDCtx) ForeachBaggageItem(_ func(k, v string) bool) {} - -func (c *otelCtxToDDCtx) TraceID128() string { - id := c.oc.TraceID() - return hex.EncodeToString(id[:]) -} - -func (c *otelCtxToDDCtx) TraceID128Bytes() [16]byte { - return c.oc.TraceID() -} diff --git a/ddtrace/opentelemetry/tracer_provider.go b/ddtrace/opentelemetry/tracer_provider.go index f27d158853..9506dfdf41 100644 --- a/ddtrace/opentelemetry/tracer_provider.go +++ b/ddtrace/opentelemetry/tracer_provider.go @@ -33,9 +33,9 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/log" oteltrace "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" @@ -62,7 +62,7 @@ func NewTracerProvider(opts ...tracer.StartOption) *TracerProvider { tracer.Start(opts...) p := &TracerProvider{} t := &oteltracer{ - DD: internal.GetGlobalTracer(), + DD: internal.GetGlobalTracer[tracer.Tracer](), provider: p, } p.tracer = t diff --git a/ddtrace/opentelemetry/tracer_test.go b/ddtrace/opentelemetry/tracer_test.go index 9099fc132e..98de1eb5f2 100644 --- a/ddtrace/opentelemetry/tracer_test.go +++ b/ddtrace/opentelemetry/tracer_test.go @@ -7,21 +7,22 @@ package opentelemetry import ( "context" + "encoding/hex" "fmt" "sync" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" "github.com/stretchr/testify/assert" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" + otelbaggage "go.opentelemetry.io/otel/baggage" oteltrace "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/noop" ) @@ -30,10 +31,9 @@ func TestGetTracer(t *testing.T) { assert := assert.New(t) tp := NewTracerProvider() tr := tp.Tracer("ot") - dd := internal.GetGlobalTracer() ott, ok := tr.(*oteltracer) assert.True(ok) - assert.Equal(ott.DD, dd) + assert.NotNil(ott.DD) } func TestGetTracerMultiple(t *testing.T) { @@ -69,8 +69,10 @@ func TestSpanWithNewRoot(t *testing.T) { assert.True(ok) assert.Equal(got, child.(*span).DD) - var parentBytes oteltrace.TraceID - uint64ToByte(noopParent.Context().TraceID(), parentBytes[:]) + // Convert string TraceID to bytes for comparison + parentTraceID := noopParent.Context().TraceID() + parentBytes := make([]byte, 16) + hex.Decode(parentBytes, []byte(parentTraceID)) assert.NotEqual(parentBytes, child.SpanContext().TraceID()) } @@ -81,8 +83,7 @@ func TestSpanWithoutNewRoot(t *testing.T) { parent, ddCtx := tracer.StartSpanFromContext(context.Background(), "otel.child") _, child := tr.Start(ddCtx, "otel.child") - parentCtxW3C := parent.Context().(ddtrace.SpanContextW3C) - assert.Equal(parentCtxW3C.TraceID128Bytes(), [16]byte(child.SpanContext().TraceID())) + assert.Equal(parent.Context().TraceID(), child.SpanContext().TraceID().String()) } func TestTracerOptions(t *testing.T) { @@ -121,7 +122,6 @@ func TestSpanContext(t *testing.T) { } func TestForceFlush(t *testing.T) { - assert := assert.New(t) const ( UNSET = iota ERROR @@ -139,6 +139,7 @@ func TestForceFlush(t *testing.T) { } for _, tc := range testData { t.Run(fmt.Sprintf("Flush success: %t", tc.flushed), func(t *testing.T) { + assert := assert.New(t) tp, payloads, cleanup := mockTracerProvider(t) defer cleanup() @@ -166,13 +167,14 @@ func TestForceFlush(t *testing.T) { } t.Run("Flush after shutdown", func(t *testing.T) { + assert := assert.New(t) tp := NewTracerProvider() otel.SetTracerProvider(tp) testLog := new(log.RecordLogger) defer log.UseLogger(testLog)() tp.stopped = 1 - tp.ForceFlush(time.Second, func(ok bool) {}) + tp.ForceFlush(time.Second, func(_ bool) {}) logs := testLog.Logs() assert.Contains(logs[len(logs)-1], "Cannot perform (*TracerProvider).Flush since the tracer is already stopped") @@ -195,14 +197,13 @@ func TestShutdownOnce(t *testing.T) { } func TestSpanTelemetry(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() tp := NewTracerProvider() otel.SetTracerProvider(tp) tr := otel.Tracer("") _, _ = tr.Start(context.Background(), "otel.span") - telemetryClient.AssertCalled(t, "Count", telemetry.NamespaceTracers, "spans_created", 1.0, telemetryTags, true) - telemetryClient.AssertNumberOfCalls(t, "Count", 1) + assert.NotZero(t, telemetryClient.Count(telemetry.NamespaceTracers, "spans_created", telemetryTags).Get()) } func TestConcurrentSetAttributes(_ *testing.T) { @@ -217,7 +218,7 @@ func TestConcurrentSetAttributes(_ *testing.T) { for i := 0; i < 100; i++ { wg.Add(1) i := i - go func(val int) { + go func(_ int) { defer wg.Done() span.SetAttributes(attribute.Float64("workerID", float64(i))) }(i) @@ -313,3 +314,87 @@ func BenchmarkOTelConcurrentTracing(b *testing.B) { } } } + +func TestMergeOtelDDBaggage(t *testing.T) { + t.Run("otelBag and ddBag contain members", func(t *testing.T) { + assert := assert.New(t) + + // Set up Datadog baggage first + ctx := context.Background() + ctx = baggage.Set(ctx, "testKey1", "ddValue1") + ctx = baggage.Set(ctx, "testKey2", "ddValue2") + + // Set up OpenTelemetry baggage with one key that duplicated dd baggage, and one unique key + m1, err := otelbaggage.NewMember("testKey1", "otelValue1") + assert.NoError(err) + m2, err := otelbaggage.NewMember("testKey3", "otelValue3") + assert.NoError(err) + bag, err := otelbaggage.New(m1, m2) + assert.NoError(err) + ctx = otelbaggage.ContextWithBaggage(ctx, bag) + + // Create tracer and start span + tp := NewTracerProvider() + otel.SetTracerProvider(tp) + tr := otel.Tracer("baggage.test") + ctx, span := tr.Start(ctx, "baggage.span") + defer span.End() + + // Check DD Baggage API + value, ok := baggage.Get(ctx, "testKey1") + assert.True(ok) + assert.Equal("otelValue1", value) // Otel takes precedence on key conflict + value, ok = baggage.Get(ctx, "testKey2") + assert.True(ok) + assert.Equal("ddValue2", value) + value, ok = baggage.Get(ctx, "testKey3") + assert.True(ok) + assert.Equal("otelValue3", value) + + otelBag := otelbaggage.FromContext(ctx) + assert.Equal("otelValue1", otelBag.Member("testKey1").Value()) + assert.Equal("ddValue2", otelBag.Member("testKey2").Value()) + assert.Equal("otelValue3", otelBag.Member("testKey3").Value()) + }) + t.Run("otelBag empty", func(t *testing.T) { + assert := assert.New(t) + + // Set up Datadog baggage + ctx := context.Background() + ctx = baggage.Set(ctx, "testKey", "ddValue") + + // Create tracer and start span + tp := NewTracerProvider() + otel.SetTracerProvider(tp) + tr := otel.Tracer("baggage.test") + ctx, span := tr.Start(ctx, "baggage.span") + defer span.End() + + // Assert dd key is retrievable via otel baggage API + otelBag := otelbaggage.FromContext(ctx) + assert.Equal("ddValue", otelBag.Member("testKey").Value()) + }) + t.Run("ddBag empty", func(t *testing.T) { + assert := assert.New(t) + + // Set up OpenTelemetry baggage + ctx := context.Background() + m, err := otelbaggage.NewMember("testKey", "otelValue") + assert.NoError(err) + bag, err := otelbaggage.New(m) + assert.NoError(err) + ctx = otelbaggage.ContextWithBaggage(ctx, bag) + + // Create tracer and start span + tp := NewTracerProvider() + otel.SetTracerProvider(tp) + tr := otel.Tracer("baggage.test") + ctx, span := tr.Start(ctx, "baggage.span") + defer span.End() + + // Assert otel key is retrievable via dd baggage API + value, ok := baggage.Get(ctx, "testKey") + assert.True(ok) + assert.Equal("otelValue", value) + }) +} diff --git a/ddtrace/opentracer/example_test.go b/ddtrace/opentracer/example_test.go deleted file mode 100644 index ac0fe71fe5..0000000000 --- a/ddtrace/opentracer/example_test.go +++ /dev/null @@ -1,23 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package opentracer_test - -import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - opentracing "github.com/opentracing/opentracing-go" -) - -func Example() { - // Start a Datadog tracer, optionally providing a set of options, - // returning an opentracing.Tracer which wraps it. - t := opentracer.New(tracer.WithAgentAddr("host:port")) - - // Use it with the Opentracing API. The (already started) Datadog tracer - // may be used in parallel with the Opentracing API if desired. - opentracing.SetGlobalTracer(t) -} diff --git a/ddtrace/opentracer/option.go b/ddtrace/opentracer/option.go deleted file mode 100644 index 735426b58c..0000000000 --- a/ddtrace/opentracer/option.go +++ /dev/null @@ -1,34 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package opentracer // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentracer" - -import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - - opentracing "github.com/opentracing/opentracing-go" -) - -// ServiceName can be used with opentracing.StartSpan to set the -// service name of a span. -func ServiceName(name string) opentracing.StartSpanOption { - return opentracing.Tag{Key: ext.ServiceName, Value: name} -} - -// ResourceName can be used with opentracing.StartSpan to set the -// resource name of a span. -func ResourceName(name string) opentracing.StartSpanOption { - return opentracing.Tag{Key: ext.ResourceName, Value: name} -} - -// SpanName sets the Datadog operation name for the span. -func SpanName(name string) opentracing.StartSpanOption { - return opentracing.Tag{Key: ext.SpanName, Value: name} -} - -// SpanType can be used with opentracing.StartSpan to set the type of a span. -func SpanType(name string) opentracing.StartSpanOption { - return opentracing.Tag{Key: ext.SpanType, Value: name} -} diff --git a/ddtrace/opentracer/span.go b/ddtrace/opentracer/span.go deleted file mode 100644 index 82439f8021..0000000000 --- a/ddtrace/opentracer/span.go +++ /dev/null @@ -1,87 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package opentracer - -import ( - "fmt" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - - opentracing "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/log" -) - -var _ opentracing.Span = (*span)(nil) - -// span implements opentracing.Span on top of ddtrace.Span. -type span struct { - ddtrace.Span - *opentracer -} - -func (s *span) Context() opentracing.SpanContext { return s.Span.Context() } -func (s *span) Finish() { s.Span.Finish() } -func (s *span) Tracer() opentracing.Tracer { return s.opentracer } -func (s *span) LogEvent(_ string) { /* deprecated */ } -func (s *span) LogEventWithPayload(_ string, _ interface{}) { /* deprecated */ } -func (s *span) Log(_ opentracing.LogData) { /* deprecated */ } - -func (s *span) FinishWithOptions(opts opentracing.FinishOptions) { - for _, lr := range opts.LogRecords { - if len(lr.Fields) > 0 { - s.LogFields(lr.Fields...) - } - } - s.Span.Finish(tracer.FinishTime(opts.FinishTime)) -} - -func (s *span) LogFields(fields ...log.Field) { - // catch standard opentracing keys and adjust to internal ones as per spec: - // https://github.com/opentracing/specification/blob/master/semantic_conventions.md#log-fields-table - for _, f := range fields { - switch f.Key() { - case "event": - if v, ok := f.Value().(string); ok && v == "error" { - s.SetTag("error", true) - } - case "error", "error.object": - if err, ok := f.Value().(error); ok { - s.SetTag("error", err) - } - case "message": - s.SetTag(ext.ErrorMsg, fmt.Sprint(f.Value())) - case "stack": - s.SetTag(ext.ErrorStack, fmt.Sprint(f.Value())) - default: - // not implemented - } - } -} - -func (s *span) LogKV(keyVals ...interface{}) { - fields, err := log.InterleavedKVToFields(keyVals...) - if err != nil { - return - } - s.LogFields(fields...) -} - -func (s *span) SetBaggageItem(key, val string) opentracing.Span { - s.Span.SetBaggageItem(key, val) - return s -} - -func (s *span) SetOperationName(operationName string) opentracing.Span { - s.Span.SetOperationName(operationName) - return s -} - -func (s *span) SetTag(key string, value interface{}) opentracing.Span { - s.Span.SetTag(key, value) - return s -} diff --git a/ddtrace/opentracer/tracer.go b/ddtrace/opentracer/tracer.go deleted file mode 100644 index d91191ebe0..0000000000 --- a/ddtrace/opentracer/tracer.go +++ /dev/null @@ -1,126 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package opentracer is in "Maintenance" mode and limited support is offered. Please consider -// using OpenTelemetry or ddtrace/tracer directly. For additional details, please see our Support -// Policy: https://github.com/DataDog/dd-trace-go#support-policy -// -// Package opentracer provides a wrapper on top of the Datadog tracer that can be used with Opentracing. -// It also provides a set of opentracing.StartSpanOption that are specific to Datadog's APM product. -// To use it, simply call "New". -// -// Note that there are currently some small incompatibilities between the Opentracing spec and the Datadog -// APM product, which we are in the process of addressing on the long term. When using Datadog, the -// Opentracing operation name is what is called resource in Datadog's terms and the Opentracing "component" -// tag is Datadog's operation name. Meaning that in order to define (in Opentracing terms) a span that -// has the operation name "/user/profile" and the component "http.request", one would do: -// -// opentracing.StartSpan("http.request", opentracer.ResourceName("/user/profile")) -// -// Some libraries and frameworks are supported out-of-the-box by using our integrations. You can see a list -// of supported integrations here: https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/contrib. They are fully -// compatible with the Opentracing implementation. -package opentracer - -import ( - "context" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - opentracing "github.com/opentracing/opentracing-go" -) - -// New creates, instantiates and returns an Opentracing compatible version of the -// Datadog tracer using the provided set of options. -func New(opts ...tracer.StartOption) opentracing.Tracer { - tracer.Start(opts...) - return &opentracer{internal.GetGlobalTracer()} -} - -var _ opentracing.Tracer = (*opentracer)(nil) - -var telemetryTags = []string{"integration_name:opentracing"} - -// opentracer implements opentracing.Tracer on top of ddtrace.Tracer. -type opentracer struct{ ddtrace.Tracer } - -// StartSpan implements opentracing.Tracer. -func (t *opentracer) StartSpan(operationName string, options ...opentracing.StartSpanOption) opentracing.Span { - var sso opentracing.StartSpanOptions - for _, o := range options { - o.Apply(&sso) - } - opts := []ddtrace.StartSpanOption{tracer.StartTime(sso.StartTime)} - for _, ref := range sso.References { - if v, ok := ref.ReferencedContext.(ddtrace.SpanContext); ok { - // opentracing.ChildOfRef and opentracing.FollowsFromRef will both be represented as - // children because Datadog APM does not have a concept of FollowsFrom references. - opts = append(opts, tracer.ChildOf(v)) - break // can only have one parent - } - } - for k, v := range sso.Tags { - opts = append(opts, tracer.Tag(k, v)) - } - telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "spans_created", 1.0, telemetryTags, true) - return &span{ - Span: t.Tracer.StartSpan(operationName, opts...), - opentracer: t, - } -} - -// Inject implements opentracing.Tracer. -func (t *opentracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error { - sctx, ok := ctx.(ddtrace.SpanContext) - if !ok { - return opentracing.ErrUnsupportedFormat - } - switch format { - case opentracing.TextMap, opentracing.HTTPHeaders: - return translateError(t.Tracer.Inject(sctx, carrier)) - default: - return opentracing.ErrUnsupportedFormat - } -} - -// Extract implements opentracing.Tracer. -func (t *opentracer) Extract(format interface{}, carrier interface{}) (opentracing.SpanContext, error) { - switch format { - case opentracing.TextMap, opentracing.HTTPHeaders: - sctx, err := t.Tracer.Extract(carrier) - return sctx, translateError(err) - default: - return nil, opentracing.ErrUnsupportedFormat - } -} - -var _ opentracing.TracerContextWithSpanExtension = (*opentracer)(nil) - -// ContextWithSpan implements opentracing.TracerContextWithSpanExtension. -func (t *opentracer) ContextWithSpanHook(ctx context.Context, openSpan opentracing.Span) context.Context { - ddSpan, ok := openSpan.(*span) - if !ok { - return ctx - } - return tracer.ContextWithSpan(ctx, ddSpan.Span) -} - -func translateError(err error) error { - switch err { - case tracer.ErrSpanContextNotFound: - return opentracing.ErrSpanContextNotFound - case tracer.ErrInvalidCarrier: - return opentracing.ErrInvalidCarrier - case tracer.ErrInvalidSpanContext: - return opentracing.ErrInvalidSpanContext - case tracer.ErrSpanContextCorrupted: - return opentracing.ErrSpanContextCorrupted - default: - return err - } -} diff --git a/ddtrace/opentracer/tracer_test.go b/ddtrace/opentracer/tracer_test.go deleted file mode 100644 index 6a57d9a6d3..0000000000 --- a/ddtrace/opentracer/tracer_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package opentracer - -import ( - "context" - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" - - "github.com/opentracing/opentracing-go" - "github.com/stretchr/testify/assert" -) - -func TestStart(t *testing.T) { - assert := assert.New(t) - ot := New() - dd, ok := internal.GetGlobalTracer().(ddtrace.Tracer) - assert.True(ok) - ott, ok := ot.(*opentracer) - assert.True(ok) - assert.Equal(ott.Tracer, dd) -} - -func TestSpanWithContext(t *testing.T) { - assert := assert.New(t) - ot, ok := New().(*opentracer) - assert.True(ok) - opentracing.SetGlobalTracer(ot) - want, ctx := opentracing.StartSpanFromContext(context.Background(), "test.operation") - got, ok := tracer.SpanFromContext(ctx) - assert.True(ok) - assert.Equal(got, want.(*span).Span) -} - -func TestInjectError(t *testing.T) { - ot := New() - - for name, tt := range map[string]struct { - spanContext opentracing.SpanContext - format interface{} - carrier interface{} - want error - }{ - "ErrInvalidSpanContext": { - spanContext: internal.NoopSpanContext{}, - format: opentracing.TextMap, - carrier: opentracing.TextMapCarrier(map[string]string{}), - want: opentracing.ErrInvalidSpanContext, - }, - "ErrInvalidCarrier": { - spanContext: ot.StartSpan("test.operation").Context(), - format: opentracing.TextMap, - carrier: "invalid-carrier", - want: opentracing.ErrInvalidCarrier, - }, - "ErrUnsupportedFormat": { - format: "unsupported-format", - want: opentracing.ErrUnsupportedFormat, - }, - } { - t.Run(name, func(t *testing.T) { - got := ot.Inject(tt.spanContext, tt.format, tt.carrier) - assert.Equal(t, tt.want, got) - }) - } -} - -func TestExtractError(t *testing.T) { - ot := New() - - for name, tt := range map[string]struct { - format interface{} - carrier interface{} - want error - }{ - "ErrSpanContextNotFound": { - format: opentracing.TextMap, - carrier: opentracing.TextMapCarrier(nil), - want: opentracing.ErrSpanContextNotFound, - }, - "ErrInvalidCarrier": { - format: opentracing.TextMap, - carrier: "invalid-carrier", - want: opentracing.ErrInvalidCarrier, - }, - "ErrSpanContextCorrupted": { - format: opentracing.TextMap, - carrier: opentracing.TextMapCarrier( - map[string]string{ - tracer.DefaultTraceIDHeader: "-1", - tracer.DefaultParentIDHeader: "-1", - tracer.DefaultPriorityHeader: "not-a-number", - }, - ), - want: opentracing.ErrSpanContextCorrupted, - }, - "ErrUnsupportedFormat": { - format: "unsupported-format", - want: opentracing.ErrUnsupportedFormat, - }, - } { - t.Run(name, func(t *testing.T) { - _, got := ot.Extract(tt.format, tt.carrier) - assert.Equal(t, tt.want, got) - }) - } -} - -func TestSpanTelemetry(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() - opentracing.SetGlobalTracer(New()) - _ = opentracing.StartSpan("opentracing.span") - telemetryClient.AssertCalled(t, "Count", telemetry.NamespaceTracers, "spans_created", 1.0, telemetryTags, true) - telemetryClient.AssertNumberOfCalls(t, "Count", 1) -} diff --git a/ddtrace/tracer/README.md b/ddtrace/tracer/README.md new file mode 100644 index 0000000000..1530306018 --- /dev/null +++ b/ddtrace/tracer/README.md @@ -0,0 +1,33 @@ +# Datadog Tracer for Go + +This package provides the Datadog APM tracer for Go. + +## API Stability + +The public API of this package is tracked in `api.txt`. This file is automatically generated and checked in CI to ensure API stability. If you make changes to the public API, you must update this file by running: + +```bash +go run ./scripts/apiextractor/api_extractor.go ./ddtrace/tracer > ./ddtrace/tracer/api.txt +``` + +The CI will fail if you make changes to the public API without updating `api.txt`. This helps us: + +1. Track API changes explicitly +2. Maintain backward compatibility +3. Make intentional API changes with clear visibility + +### What constitutes an API change? + +- Adding or removing exported functions, types, methods, or fields +- Changing function signatures +- Changing type definitions +- Changing interface definitions + +### Checking API changes locally + +You can check if your changes affect the public API by running: + +```bash +go run ./scripts/apiextractor/api_extractor.go ./ddtrace/tracer > current_api.txt +diff -u ./ddtrace/tracer/api.txt current_api.txt +``` diff --git a/ddtrace/tracer/abandonedspans.go b/ddtrace/tracer/abandonedspans.go index defad41831..7acb5c9941 100644 --- a/ddtrace/tracer/abandonedspans.go +++ b/ddtrace/tracer/abandonedspans.go @@ -14,7 +14,8 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) var ( @@ -46,16 +47,17 @@ func (b *bucket[K, T]) add(k K, v T) { b.index[k] = e } -func (b *bucket[K, T]) get(k K) (T, bool) { - e, ok := b.index[k] - if !ok { - // Compiler trick to return any zero value in generic code. - // https://stackoverflow.com/a/70589302 - var zero T - return zero, ok - } - return e.Value.(T), ok -} +// This function is currently not used. We can add it back if it is needed +// func (b *bucket[K, T]) get(k K) (T, bool) { +// e, ok := b.index[k] +// if !ok { +// // Compiler trick to return any zero value in generic code. +// // https://stackoverflow.com/a/70589302 +// var zero T +// return zero, ok +// } +// return e.Value.(T), ok +// } func (b *bucket[K, T]) remove(k K) { e, ok := b.index[k] @@ -77,27 +79,36 @@ type abandonedSpanCandidate struct { TraceID, SpanID uint64 Start int64 Finished bool + Integration string } -func newAbandonedSpanCandidate(s *span, finished bool) *abandonedSpanCandidate { +func newAbandonedSpanCandidate(s *Span, finished bool) *abandonedSpanCandidate { + var component string + if v, ok := s.meta[ext.Component]; ok { + component = v + } else { + component = "manual" + } // finished is explicit instead of implicit as s.finished may be not set // at the moment of calling this method. // Also, locking is not required as it's called while the span is already locked or it's // being initialized. - return &abandonedSpanCandidate{ - Name: s.Name, - TraceID: s.TraceID, - SpanID: s.SpanID, - Start: s.Start, - Finished: finished, + c := &abandonedSpanCandidate{ + Name: s.name, + TraceID: s.traceID, + SpanID: s.spanID, + Start: s.start, + Finished: finished, + Integration: component, } + return c } // String takes a span and returns a human-readable string representing that span. func (s *abandonedSpanCandidate) String() string { age := now() - s.Start a := fmt.Sprintf("%d sec", age/1e9) - return fmt.Sprintf("[name: %s, span_id: %d, trace_id: %d, age: %s],", s.Name, s.SpanID, s.TraceID, a) + return fmt.Sprintf("[name: %s, integration: %s, span_id: %d, trace_id: %d, age: %s],", s.Name, s.Integration, s.SpanID, s.TraceID, a) } type abandonedSpansDebugger struct { @@ -273,7 +284,7 @@ func (d *abandonedSpansDebugger) log(interval *time.Duration) { log.Warn("Too many abandoned spans. Truncating message.") sb.WriteString("...") } - log.Warn(sb.String()) + log.Warn("%s", sb.String()) } // formatAbandonedSpans takes a bucket and returns a human-readable string representing @@ -292,6 +303,9 @@ func formatAbandonedSpans(b *bucket[uint64, *abandonedSpanCandidate], interval * if interval != nil && curTime-s.Start < interval.Nanoseconds() { continue } + if t, ok := getGlobalTracer().(*tracer); ok { + t.statsd.Incr("datadog.tracer.abandoned_spans", []string{"name:" + s.Name, "integration:" + s.Integration}, 1) + } spanCount++ msg := s.String() sb.WriteString(msg) diff --git a/ddtrace/tracer/abandonedspans_test.go b/ddtrace/tracer/abandonedspans_test.go index 745f03f222..4bbdf4ef6f 100644 --- a/ddtrace/tracer/abandonedspans_test.go +++ b/ddtrace/tracer/abandonedspans_test.go @@ -12,19 +12,21 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/stretchr/testify/assert" ) var warnPrefix = fmt.Sprintf("Datadog Tracer %v WARN: ", version.Tag) -var spanStart = time.Date(2023, time.August, 18, 0, 0, 0, 0, time.UTC) +var spanStartTime = time.Date(2023, time.August, 18, 0, 0, 0, 0, time.UTC) // setTestTime() sets the current time, which will be used to calculate the // duration of abandoned spans. func setTestTime() func() { - current := spanStart.UnixNano() + 10*time.Minute.Nanoseconds() // use a fixed time instead of now + current := spanStartTime.UnixNano() + 10*time.Minute.Nanoseconds() // use a fixed time instead of now now = func() int64 { return current } return func() { @@ -34,17 +36,17 @@ func setTestTime() func() { // spanAge takes in a span and returns the current test duration of the // span in seconds as a string -func spanAge(s *span) string { - return fmt.Sprintf("%d sec", (now()-s.Start)/int64(time.Second)) +func spanAge(s *Span) string { + return fmt.Sprintf("%d sec", (now()-s.start)/int64(time.Second)) } -func assertProcessedSpans(assert *assert.Assertions, t *tracer, startedSpans, finishedSpans int) { +func assertProcessedSpans(assert *assert.Assertions, t *tracer, startedSpans, finishedSpans int, ticker time.Duration) { d := t.abandonedSpansDebugger cond := func() bool { return atomic.LoadUint32(&d.addedSpans) >= uint32(startedSpans) && atomic.LoadUint32(&d.removedSpans) >= uint32(finishedSpans) } - assert.Eventually(cond, 1*time.Second, 75*time.Millisecond) + assert.Eventually(cond, 1*time.Second, ticker) // We expect logs to be generated when startedSpans and finishedSpans are different. // At least there should be 3 lines: 1. debugger activation, 2. detected spans warn, and 3. the details. if startedSpans == finishedSpans { @@ -53,63 +55,130 @@ func assertProcessedSpans(assert *assert.Assertions, t *tracer, startedSpans, fi cond = func() bool { return len(t.config.logger.(*log.RecordLogger).Logs()) > 2 } - assert.Eventually(cond, 1*time.Second, 75*time.Millisecond) + assert.Eventually(cond, 1*time.Second, ticker) } -func formatSpanString(s *span) string { - s.Lock() - msg := fmt.Sprintf("[name: %s, span_id: %d, trace_id: %d, age: %s],", s.Name, s.SpanID, s.TraceID, spanAge(s)) - s.Unlock() +func formatSpanString(s *Span) string { + s.mu.Lock() + var integration string + if v, ok := s.meta[ext.Component]; ok { + integration = v + } else { + integration = "manual" + } + msg := fmt.Sprintf("[name: %s, integration: %s, span_id: %d, trace_id: %d, age: %s],", s.name, integration, s.spanID, s.traceID, spanAge(s)) + s.mu.Unlock() return msg } -func TestReportAbandonedSpans(t *testing.T) { - assert := assert.New(t) +func TestAbandonedSpansMetric(t *testing.T) { + var tg statsdtest.TestStatsdClient tp := new(log.RecordLogger) + tickerInterval = 100 * time.Millisecond + t.Run("finished", func(t *testing.T) { + assert := assert.New(t) + tp.Reset() + tg.Reset() + defer setTestTime()() + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond), withStatsdClient(&tg)) + assert.NoError(err) + defer stop() + s := tracer.StartSpan("operation", StartTime(spanStartTime)) + s.Finish() + assertProcessedSpans(assert, tracer, 1, 1, tickerInterval/10) + assert.Empty(tg.GetCallsByName("datadog.tracer.abandoned_spans")) + }) + t.Run("open", func(t *testing.T) { + assert := assert.New(t) + tp.Reset() + tg.Reset() + defer setTestTime()() + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond), withStatsdClient(&tg)) + assert.NoError(err) + defer stop() + tracer.StartSpan("operation", StartTime(spanStartTime), Tag(ext.Component, "some_integration_name")) + assertProcessedSpans(assert, tracer, 1, 0, tickerInterval/10) + calls := tg.GetCallsByName("datadog.tracer.abandoned_spans") + assert.Len(calls, 1) + call := calls[0] + assert.Equal([]string{"name:operation", "integration:some_integration_name"}, call.Tags()) + }) + t.Run("both", func(t *testing.T) { + assert := assert.New(t) + tp.Reset() + tg.Reset() + defer setTestTime()() + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond), withStatsdClient(&tg)) + assert.NoError(err) + defer stop() + sf := tracer.StartSpan("op", StartTime(spanStartTime)) + sf.Finish() + s := tracer.StartSpan("op2", StartTime(spanStartTime)) + assertProcessedSpans(assert, tracer, 2, 1, tickerInterval/10) + calls := tg.GetCallsByName("datadog.tracer.abandoned_spans") + assert.Len(calls, 1) + s.Finish() + }) +} + +func TestReportAbandonedSpans(t *testing.T) { + tp := new(log.RecordLogger) tickerInterval = 100 * time.Millisecond t.Run("on", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(100*time.Millisecond)) + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(100*time.Millisecond)) + assert.Nil(err) defer stop() assert.True(tracer.config.debugAbandonedSpans) assert.Equal(tracer.config.spanTimeout, 100*time.Millisecond) }) t.Run("finished", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + assert.Nil(err) defer stop() - s := tracer.StartSpan("operation", StartTime(spanStart)).(*span) + s := tracer.StartSpan("operation", StartTime(spanStartTime)) s.Finish() - assertProcessedSpans(assert, tracer, 1, 1) + assertProcessedSpans(assert, tracer, 1, 1, tickerInterval/10) expected := fmt.Sprintf("%s%s", warnPrefix, formatSpanString(s)) assert.NotContains(tp.Logs(), expected) }) t.Run("open", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + assert.Nil(err) defer stop() - s := tracer.StartSpan("operation", StartTime(spanStart)).(*span) - assertProcessedSpans(assert, tracer, 1, 0) - assert.Contains(tp.Logs(), fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 1)) - assert.Contains(tp.Logs(), fmt.Sprintf("%s%s", warnPrefix, formatSpanString(s))) + s := tracer.StartSpan("operation", StartTime(spanStartTime)) + assertProcessedSpans(assert, tracer, 1, 0, tickerInterval/10) + expectedCount := fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 1) + expectedSpan := fmt.Sprintf("%s%s", warnPrefix, formatSpanString(s)) + assert.Eventually(func() bool { + logs := tp.Logs() + return assert.Contains(logs, expectedCount) && assert.Contains(logs, expectedSpan) + }, 2*time.Second, tickerInterval/10) }) t.Run("both", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + assert.Nil(err) defer stop() - sf := tracer.StartSpan("op", StartTime(spanStart)).(*span) + sf := tracer.StartSpan("op", StartTime(spanStartTime)) sf.Finish() - s := tracer.StartSpan("op2", StartTime(spanStart)).(*span) + s := tracer.StartSpan("op2", StartTime(spanStartTime)) notExpected := fmt.Sprintf("%s%s,%s,", warnPrefix, formatSpanString(sf), formatSpanString(s)) expected := fmt.Sprintf("%s%s", warnPrefix, formatSpanString(s)) - assertProcessedSpans(assert, tracer, 2, 1) + assertProcessedSpans(assert, tracer, 2, 1, tickerInterval/10) assert.Contains(tp.Logs(), fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 1)) assert.NotContains(tp.Logs(), notExpected) assert.Contains(tp.Logs(), expected) @@ -117,16 +186,18 @@ func TestReportAbandonedSpans(t *testing.T) { }) t.Run("timeout", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(3*time.Minute)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(3*time.Minute)) + assert.Nil(err) defer stop() - s1 := tracer.StartSpan("op", StartTime(spanStart)).(*span) - delayedStart := spanStart.Add(8 * time.Minute) - s2 := tracer.StartSpan("op2", StartTime(delayedStart)).(*span) + s1 := tracer.StartSpan("op", StartTime(spanStartTime)) + delayedStart := spanStartTime.Add(8 * time.Minute) + s2 := tracer.StartSpan("op2", StartTime(delayedStart)) notExpected := fmt.Sprintf("%s%s,%s,", warnPrefix, formatSpanString(s1), formatSpanString(s2)) expected := fmt.Sprintf("%s%s", warnPrefix, formatSpanString(s1)) - assertProcessedSpans(assert, tracer, 2, 0) + assertProcessedSpans(assert, tracer, 2, 0, tickerInterval/10) assert.Contains(tp.Logs(), fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 1)) assert.NotContains(tp.Logs(), notExpected) assert.Contains(tp.Logs(), expected) @@ -135,107 +206,123 @@ func TestReportAbandonedSpans(t *testing.T) { // This test ensures that the debug mode works as expected and returns invalid information // given invalid inputs. t.Run("invalid", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(10*time.Minute)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(10*time.Minute)) + assert.Nil(err) defer stop() - delayedStart := spanStart.Add(1 * time.Minute) - s1 := tracer.StartSpan("op", StartTime(delayedStart)).(*span) - s2 := tracer.StartSpan("op2", StartTime(spanStart)).(*span) + delayedStart := spanStartTime.Add(1 * time.Minute) + s1 := tracer.StartSpan("op", StartTime(delayedStart)) + s2 := tracer.StartSpan("op2", StartTime(spanStartTime)) notExpected := fmt.Sprintf("%s%s,%s,", warnPrefix, formatSpanString(s1), formatSpanString(s2)) notExpected2 := fmt.Sprintf("%s%s,%s,", warnPrefix, formatSpanString(s1), formatSpanString(s2)) - assertProcessedSpans(assert, tracer, 2, 0) + assertProcessedSpans(assert, tracer, 2, 0, tickerInterval/10) assert.NotContains(tp.Logs(), notExpected) assert.NotContains(tp.Logs(), notExpected2) }) t.Run("many", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + assert.Nil(err) defer stop() var sb strings.Builder sb.WriteString(warnPrefix) for i := 0; i < 10; i++ { - s := tracer.StartSpan(fmt.Sprintf("operation%d", i), StartTime(spanStart)).(*span) + s := tracer.StartSpan(fmt.Sprintf("operation%d", i), StartTime(spanStartTime)) if i%2 == 0 { s.Finish() } else { sb.WriteString(formatSpanString(s)) } } - assertProcessedSpans(assert, tracer, 10, 5) + assertProcessedSpans(assert, tracer, 10, 5, tickerInterval/10) b := sb.String() assert.Contains(tp.Logs(), b) }) t.Run("many buckets", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(100*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(100*time.Millisecond)) + assert.Nil(err) defer stop() var sb strings.Builder sb.WriteString(warnPrefix) for i := 0; i < 5; i++ { - s := tracer.StartSpan(fmt.Sprintf("operation%d", i), StartTime(spanStart)) + s := tracer.StartSpan(fmt.Sprintf("operation%d", i), StartTime(spanStartTime)) s.Finish() time.Sleep(15 * time.Millisecond) } for i := 0; i < 5; i++ { - s := tracer.StartSpan(fmt.Sprintf("operation2-%d", i), StartTime(spanStart)).(*span) + s := tracer.StartSpan(fmt.Sprintf("operation2-%d", i), StartTime(spanStartTime)) sb.WriteString(formatSpanString(s)) time.Sleep(15 * time.Millisecond) } - assertProcessedSpans(assert, tracer, 10, 5) - assert.Contains(tp.Logs(), fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 5)) - assert.Contains(tp.Logs(), sb.String()) + assertProcessedSpans(assert, tracer, 10, 5, tickerInterval/2) + // Wait for the ticker to fire and log the abandoned spans + time.Sleep(tickerInterval + 10*time.Millisecond) + assert.Eventually(func() bool { + logs := tp.Logs() + return assert.Contains(logs, fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 5)) && assert.Contains(logs, sb.String()) + }, 2*time.Second, tickerInterval/10) }) t.Run("stop", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(100*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(100*time.Millisecond)) + assert.Nil(err) var sb strings.Builder sb.WriteString(warnPrefix) for i := 0; i < 5; i++ { - s := tracer.StartSpan(fmt.Sprintf("operation%d", i), StartTime(spanStart)).(*span) + s := tracer.StartSpan(fmt.Sprintf("operation%d", i), StartTime(spanStartTime)) sb.WriteString(formatSpanString(s)) } - assertProcessedSpans(assert, tracer, 5, 0) + assertProcessedSpans(assert, tracer, 5, 0, tickerInterval/10) stop() assert.Contains(tp.Logs(), fmt.Sprintf("%s%d abandoned spans:", warnPrefix, 5)) assert.Contains(tp.Logs(), sb.String()) }) t.Run("wait", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + assert.Nil(err) defer stop() - s := tracer.StartSpan("operation", StartTime(spanStart)).(*span) + s := tracer.StartSpan("operation", StartTime(spanStartTime)) expected := fmt.Sprintf("%s%s", warnPrefix, formatSpanString(s)) assert.NotContains(tp.Logs(), expected) - assertProcessedSpans(assert, tracer, 1, 0) + assertProcessedSpans(assert, tracer, 1, 0, tickerInterval/10) assert.Contains(tp.Logs(), expected) s.Finish() }) t.Run("truncate", func(t *testing.T) { + assert := assert.New(t) tp.Reset() defer setTestTime()() - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugSpansMode(500*time.Millisecond)) + assert.Nil(err) // Forget to revert this global variable will lead to broken tests if run multiples times through `-count`. logSize = 10 defer func() { logSize = 9000 }() - s := tracer.StartSpan("operation", StartTime(spanStart)).(*span) + s := tracer.StartSpan("operation", StartTime(spanStartTime)) msg := formatSpanString(s) - assertProcessedSpans(assert, tracer, 1, 0) + assertProcessedSpans(assert, tracer, 1, 0, tickerInterval/10) stop() assert.NotContains(tp.Logs(), msg) assert.Contains(tp.Logs(), fmt.Sprintf("%sToo many abandoned spans. Truncating message.", warnPrefix)) @@ -243,16 +330,17 @@ func TestReportAbandonedSpans(t *testing.T) { } func TestDebugAbandonedSpansOff(t *testing.T) { - assert := assert.New(t) tp := new(log.RecordLogger) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp)) + assert.Nil(t, err) defer stop() t.Run("default", func(t *testing.T) { + assert := assert.New(t) assert.False(tracer.config.debugAbandonedSpans) assert.Equal(time.Duration(0), tracer.config.spanTimeout) expected := "Abandoned spans logs enabled." - s := tracer.StartSpan("operation", StartTime(spanStart)) + s := tracer.StartSpan("operation", StartTime(spanStartTime)) time.Sleep(100 * time.Millisecond) assert.NotContains(tp.Logs(), expected) s.Finish() diff --git a/ddtrace/tracer/api.txt b/ddtrace/tracer/api.txt new file mode 100644 index 0000000000..d388901917 --- /dev/null +++ b/ddtrace/tracer/api.txt @@ -0,0 +1,384 @@ +// API Stability Report +// Package: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer +// Module: github.com/DataDog/dd-trace-go/v2 + +// File: context.go + +// Package Functions +func ContextWithSpan(context.Context, *Span) (context.Context) +func SpanFromContext(context.Context) (*Span, bool) +func StartSpanFromContext(context.Context, string, ...StartSpanOption) (*Span, context.Context) + +// File: data_streams.go + +// Package Functions +func SetDataStreamsCheckpoint(context.Context, ...string) (context.Context, bool) +func SetDataStreamsCheckpointWithParams(context.Context, options.CheckpointParams, ...string) (context.Context, bool) +func TrackKafkaCommitOffset(string, int32, int64) +func TrackKafkaHighWatermarkOffset(string, string, int32, int64) +func TrackKafkaProduceOffset(string, int32, int64) + +// File: logger.go + +// Package Functions +func AdaptLogger(func(LogLevel, string, ...any)()) (Logger) +func UseLogger(Logger) + +// Types +type LogLevel log.Level + +type Logger interface { + func Log(string) +} + +// File: noop.go + +// Types +type NoopTracer struct {} + +func (NoopTracer) Extract(interface{}) (*SpanContext, error) +func (NoopTracer) Flush() +func (NoopTracer) Inject(*SpanContext, interface{}) (error) +func (NoopTracer) SetServiceInfo(string) +func (NoopTracer) StartSpan(string, ...StartSpanOption) (*Span) +func (NoopTracer) Stop() +func (NoopTracer) TracerConf() (TracerConf) + +// File: option.go + +// Package Functions +func AnalyticsRate(float64) (StartSpanOption) +func ChildOf(*SpanContext) (StartSpanOption) +func MarkIntegrationImported(string) (bool) +func Measured() (StartSpanOption) +func ResourceName(string) (StartSpanOption) +func ServiceName(string) (StartSpanOption) +func SpanType(string) (StartSpanOption) +func StartTime(time.Time) (StartSpanOption) +func Tag(string, interface{}) (StartSpanOption) +func WithAgentAddr(string) (StartOption) +func WithAgentTimeout(int) (StartOption) +func WithAgentURL(string) (StartOption) +func WithAnalytics(bool) (StartOption) +func WithAnalyticsRate(float64) (StartOption) +func WithAppSecEnabled(bool) (StartOption) +func WithDebugMode(bool) (StartOption) +func WithDebugSpansMode(time.Duration) (StartOption) +func WithDebugStack(bool) (StartOption) +func WithDogstatsdAddr(string) (StartOption) +func WithEnv(string) (StartOption) +func WithFeatureFlags(...string) (StartOption) +func WithGlobalServiceName(bool) (StartOption) +func WithGlobalTag(string, interface{}) (StartOption) +func WithHTTPClient(*http.Client) (StartOption) +func WithHeaderTags([]string) (StartOption) +func WithHostname(string) (StartOption) +func WithLLMObsAgentlessEnabled(bool) (StartOption) +func WithLLMObsEnabled(bool) (StartOption) +func WithLLMObsMLApp(string) (StartOption) +func WithLLMObsProjectName(string) (StartOption) +func WithLambdaMode(bool) (StartOption) +func WithLogStartup(bool) (StartOption) +func WithLogger(Logger) (StartOption) +func WithPartialFlushing(int) (StartOption) +func WithPeerServiceDefaults(bool) (StartOption) +func WithPeerServiceMapping(string) (StartOption) +func WithProfilerCodeHotspots(bool) (StartOption) +func WithProfilerEndpoints(bool) (StartOption) +func WithPropagation() (UserMonitoringOption) +func WithPropagator(Propagator) (StartOption) +func WithRetryInterval(int) (StartOption) +func WithRuntimeMetrics() (StartOption) +func WithSampler(Sampler) (StartOption) +func WithSamplerRate(float64) (StartOption) +func WithSamplingRules([]SamplingRule) (StartOption) +func WithSendRetries(int) (StartOption) +func WithService(string) (StartOption) +func WithServiceMapping(string) (StartOption) +func WithServiceVersion(string) (StartOption) +func WithSpanID(uint64) (StartSpanOption) +func WithSpanLinks([]SpanLink) (StartSpanOption) +func WithStartSpanConfig(*StartSpanConfig) (StartSpanOption) +func WithStatsComputation(bool) (StartOption) +func WithTestDefaults(any) (StartOption) +func WithTraceEnabled(bool) (StartOption) +func WithUDS(string) (StartOption) +func WithUniversalVersion(string) (StartOption) +func WithUserEmail(string) (UserMonitoringOption) +func WithUserLogin(string) (UserMonitoringOption) +func WithUserMetadata(string) (UserMonitoringOption) +func WithUserName(string) (UserMonitoringOption) +func WithUserOrg(string) (UserMonitoringOption) +func WithUserRole(string) (UserMonitoringOption) +func WithUserScope(string) (UserMonitoringOption) +func WithUserSessionID(string) (UserMonitoringOption) + +// Types +type StartOption func(*config)() + +type UserMonitoringConfig struct { + Email string + Login string + Metadata map[string]string + Name string + Org string + PropagateID bool + Role string + Scope string + SessionID string +} + +type UserMonitoringOption func(*UserMonitoringConfig)() + +// File: propagator.go + +// Types +type Propagator interface { + func Extract(interface{}) (*SpanContext, error) + func Inject(*SpanContext, interface{}) (error) +} + +type TextMapReader interface { + func ForeachKey(func(string)(error)) (error) +} + +type TextMapWriter interface { + func Set(string) +} + +// File: rules_sampler.go + +// Package Functions +func EqualsFalseNegative([]SamplingRule) (bool) +func SpanSamplingRules(...Rule) ([]SamplingRule) +func TraceSamplingRules(...Rule) ([]SamplingRule) + +// Types +type Rule struct { + MaxPerSecond float64 + NameGlob string + Rate float64 + ResourceGlob string + ServiceGlob string + Tags map[string]string +} + +type SamplingRule struct { + MaxPerSecond float64 + Name *regexp.Regexp + Provenance provenance + Rate float64 + Resource *regexp.Regexp + Service *regexp.Regexp + Tags map[string]*regexp.Regexp +} + +func (*SamplingRule) EqualsFalseNegative(*SamplingRule) (bool) +func (SamplingRule) MarshalJSON() ([]byte, error) +func (SamplingRule) String() (string) +func (*SamplingRule) UnmarshalJSON([]byte) (error) + +type SamplingRuleType int + +// File: sampler.go + +// Package Functions +func NewAllSampler() (RateSampler) +func NewRateSampler(float64) (RateSampler) + +// Types +type RateSampler interface { + func Rate() (float64) + func SetRate(float64) +} + +type Sampler interface { + func Sample(*Span) (bool) +} + +// File: span.go + +// Types +type Span struct {} + +func (*Span) AddEvent(string, ...SpanEventOption) +func (*Span) AddLink(SpanLink) +func (*Span) AsMap() (map[string]interface{}) +func (*Span) BaggageItem(string) (string) +func (*Span) Context() (*SpanContext) +func (*Span) Finish(...FinishOption) +func (*Span) Format(fmt.State, rune) +func (*Span) Root() (*Span) +func (*Span) SetBaggageItem(string) +func (*Span) SetOperationName(string) +func (*Span) SetTag(string, interface{}) +func (*Span) SetUser(string, ...UserMonitoringOption) +func (*Span) StartChild(string, ...StartSpanOption) (*Span) +func (*Span) String() (string) + +// File: span_config.go + +// Package Functions +func FinishTime(time.Time) (FinishOption) +func NewFinishConfig(...FinishOption) (*FinishConfig) +func NewStartSpanConfig(...StartSpanOption) (*StartSpanConfig) +func NoDebugStack() (FinishOption) +func StackFrames(uint) (FinishOption) +func WithError(error) (FinishOption) +func WithFinishConfig(*FinishConfig) (FinishOption) + +// Types +type FinishConfig struct { + Error error + FinishTime time.Time + NoDebugStack bool + SkipStackFrames uint + StackFrames uint +} + +type FinishOption func(*FinishConfig)() + +type StartSpanConfig struct { + Context context.Context + Parent *SpanContext + SpanID uint64 + SpanLinks []SpanLink + StartTime time.Time + Tags map[string]interface{} +} + +type StartSpanOption func(*StartSpanConfig)() + +// File: span_event_config.go + +// Package Functions +func WithSpanEventAttributes(map[string]any) (SpanEventOption) +func WithSpanEventTimestamp(time.Time) (SpanEventOption) + +// Types +type SpanEventConfig struct { + Attributes map[string]any + Time time.Time +} + +type SpanEventOption func(*SpanEventConfig)() + +// File: spancontext.go + +// Package Functions +func FromGenericCtx(ddtrace.SpanContext) (*SpanContext) + +// Types +type SpanContext struct {} + +func (*SpanContext) ForeachBaggageItem(func(string)(bool)) +func (*SpanContext) SamplingPriority() (int, bool) +func (*SpanContext) SpanID() (uint64) +func (*SpanContext) SpanLinks() ([]SpanLink) +func (*SpanContext) TraceID() (string) +func (*SpanContext) TraceIDBytes() ([16]byte) +func (*SpanContext) TraceIDLower() (uint64) +func (*SpanContext) TraceIDUpper() (uint64) + +// File: spanlink.go + +// Types +type SpanLink struct { + Attributes map[string]string + Flags uint32 + SpanID uint64 + TraceID uint64 + TraceIDHigh uint64 + Tracestate string +} + +// File: sqlcomment.go + +// Types +type DBMPropagationMode string + +type SQLCommentCarrier struct { + DBServiceName string + Mode DBMPropagationMode + PeerDBHostname string + PeerDBName string + PeerService string + Query string + SpanID uint64 +} + +func (*SQLCommentCarrier) Extract() (*SpanContext, error) +func (*SQLCommentCarrier) Inject(*SpanContext) (error) + +// File: textmap.go + +// Package Functions +func NewPropagator(*PropagatorConfig, ...Propagator) (Propagator) + +// Types +type HTTPHeadersCarrier http.Header + +type PropagatorConfig struct { + B3 bool + BaggageHeader string + BaggagePrefix string + MaxTagsHeaderLen int + ParentHeader string + PriorityHeader string + TraceHeader string +} + +type TextMapCarrier map[string]string + +// File: tracer.go + +// Package Functions +func Extract(interface{}) (*SpanContext, error) +func Flush() +func Inject(*SpanContext, interface{}) (error) +func SetUser(*Span, string, ...UserMonitoringOption) +func Start(...StartOption) (error) +func StartSpan(string, ...StartSpanOption) (*Span) +func Stop() + +// Types +type Tracer interface { + func Extract(interface{}) (*SpanContext, error) + func Flush() + func Inject(*SpanContext, interface{}) (error) + func StartSpan(string, ...StartSpanOption) (*Span) + func Stop() + func TracerConf() (TracerConf) +} + +type TracerConf struct { + CanComputeStats bool + CanDropP0s bool + DebugAbandonedSpans bool + Disabled bool + EnvTag string + PartialFlush bool + PartialFlushMinSpans int + PeerServiceDefaults bool + PeerServiceMappings map[string]string + ServiceTag string + TracingAsTransport bool + VersionTag string +} + +// File: tracer_metadata.go + +// Types +type Metadata struct { + ContainerID string + Hostname string + Language string + ProcessTags string + RuntimeID string + SchemaVersion uint8 + ServiceEnvironment string + ServiceName string + ServiceVersion string + Version string +} + diff --git a/ddtrace/tracer/civisibility_payload.go b/ddtrace/tracer/civisibility_payload.go index ce8cc0c2f9..b04ee29a5e 100644 --- a/ddtrace/tracer/civisibility_payload.go +++ b/ddtrace/tracer/civisibility_payload.go @@ -7,20 +7,23 @@ package tracer import ( "bytes" - "sync/atomic" + "time" "github.com/tinylib/msgp/msgp" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) // ciVisibilityPayload represents a payload specifically designed for CI Visibility events. -// It embeds the generic payload structure and adds methods to handle CI Visibility specific data. +// It uses the generic payload interface and adds methods to handle CI Visibility specific data. type ciVisibilityPayload struct { - *payload + payload payload + serializationTime time.Duration } // push adds a new CI Visibility event to the payload buffer. @@ -33,14 +36,17 @@ type ciVisibilityPayload struct { // Returns: // // An error if encoding the event fails. -func (p *ciVisibilityPayload) push(event *ciVisibilityEvent) error { - p.buf.Grow(event.Msgsize()) - if err := msgp.Encode(&p.buf, event); err != nil { - return err +func (p *ciVisibilityPayload) push(event *ciVisibilityEvent) (size int, err error) { + p.payload.grow(event.Msgsize()) + startTime := time.Now() + defer func() { + p.serializationTime += time.Since(startTime) + }() + if err := msgp.Encode(p.payload, event); err != nil { + return 0, err } - atomic.AddUint32(&p.count, 1) - p.updateHeader() - return nil + p.payload.recordItem() // This already calls updateHeader() internally. + return p.size(), nil } // newCiVisibilityPayload creates a new instance of civisibilitypayload. @@ -50,7 +56,7 @@ func (p *ciVisibilityPayload) push(event *ciVisibilityEvent) error { // A pointer to a newly initialized civisibilitypayload instance. func newCiVisibilityPayload() *ciVisibilityPayload { log.Debug("ciVisibilityPayload: creating payload instance") - return &ciVisibilityPayload{newPayload()} + return &ciVisibilityPayload{payload: newPayload(traceProtocolV04), serializationTime: 0} } // getBuffer retrieves the complete body of the CI Visibility payload, including metadata. @@ -65,7 +71,8 @@ func newCiVisibilityPayload() *ciVisibilityPayload { // A pointer to a bytes.Buffer containing the encoded CI Visibility payload. // An error if reading from the buffer or encoding the payload fails. func (p *ciVisibilityPayload) getBuffer(config *config) (*bytes.Buffer, error) { - log.Debug("ciVisibilityPayload: .getBuffer (count: %v)", p.itemCount()) + startTime := time.Now() + log.Debug("ciVisibilityPayload: .getBuffer (count: %d)", p.payload.stats().itemCount) // Create a buffer to read the current payload payloadBuf := new(bytes.Buffer) @@ -82,6 +89,9 @@ func (p *ciVisibilityPayload) getBuffer(config *config) (*bytes.Buffer, error) { return nil, err } + telemetry.EndpointPayloadEventsCount(telemetry.TestCycleEndpointType, float64(p.payload.stats().itemCount)) + telemetry.EndpointPayloadBytes(telemetry.TestCycleEndpointType, float64(encodedBuf.Len())) + telemetry.EndpointEventsSerializationMs(telemetry.TestCycleEndpointType, float64((p.serializationTime + time.Since(startTime)).Milliseconds())) return encodedBuf, nil } @@ -139,3 +149,43 @@ func (p *ciVisibilityPayload) writeEnvelope(env string, events []byte) *ciTestCy return visibilityPayload } + +// stats returns the current stats of the payload. +func (p *ciVisibilityPayload) stats() payloadStats { + return p.payload.stats() +} + +// size returns the payload size in bytes (for backward compatibility). +func (p *ciVisibilityPayload) size() int { + return p.payload.size() +} + +// itemCount returns the number of items available in the stream (for backward compatibility). +func (p *ciVisibilityPayload) itemCount() int { + return p.payload.itemCount() +} + +// protocol returns the protocol version of the payload. +func (p *ciVisibilityPayload) protocol() float64 { + return p.payload.protocol() +} + +// clear empties the payload buffers. +func (p *ciVisibilityPayload) clear() { + p.payload.clear() +} + +// reset sets up the payload to be read a second time. +func (p *ciVisibilityPayload) reset() { + p.payload.reset() +} + +// Read implements io.Reader by reading from the underlying payload. +func (p *ciVisibilityPayload) Read(b []byte) (n int, err error) { + return p.payload.Read(b) +} + +// Close implements io.Closer by closing the underlying payload. +func (p *ciVisibilityPayload) Close() error { + return p.payload.Close() +} diff --git a/ddtrace/tracer/civisibility_payload_test.go b/ddtrace/tracer/civisibility_payload_test.go index b1a32f8110..5be19bed0d 100644 --- a/ddtrace/tracer/civisibility_payload_test.go +++ b/ddtrace/tracer/civisibility_payload_test.go @@ -11,22 +11,21 @@ import ( "io" "strconv" "strings" - "sync/atomic" "testing" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/stretchr/testify/assert" "github.com/tinylib/msgp/msgp" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" ) func newCiVisibilityEventsList(n int) []*ciVisibilityEvent { list := make([]*ciVisibilityEvent, n) for i := 0; i < n; i++ { s := newBasicSpan("span.list." + strconv.Itoa(i%5+1)) - s.Start = fixedTime + s.start = fixedTime list[i] = getCiVisibilityEvent(s) } @@ -55,8 +54,9 @@ func TestCiVisibilityPayloadIntegrity(t *testing.T) { want.Reset() err := msgp.Encode(want, allEvents) assert.NoError(err) - assert.Equal(want.Len(), p.size()) - assert.Equal(p.itemCount(), len(allEvents)) + stats := p.stats() + assert.Equal(want.Len(), stats.size) + assert.Equal(len(allEvents), stats.itemCount) got, err := io.ReadAll(p) assert.NoError(err) @@ -68,9 +68,9 @@ func TestCiVisibilityPayloadIntegrity(t *testing.T) { // TestCiVisibilityPayloadDecode ensures that whatever we push into the payload can // be decoded by the codec. func TestCiVisibilityPayloadDecode(t *testing.T) { - assert := assert.New(t) for _, n := range []int{10, 1 << 10} { t.Run(strconv.Itoa(n), func(t *testing.T) { + assert := assert.New(t) p := newCiVisibilityPayload() for i := 0; i < n; i++ { list := newCiVisibilityEventsList(i%5 + 1) @@ -142,7 +142,7 @@ func benchmarkCiVisibilityPayloadThroughput(count int) func(*testing.B) { return func(b *testing.B) { p := newCiVisibilityPayload() s := newBasicSpan("X") - s.Meta["key"] = strings.Repeat("X", 10*1024) + s.meta["key"] = strings.Repeat("X", 10*1024) e := getCiVisibilityEvent(s) events := make(ciVisibilityEvents, count) for i := 0; i < count; i++ { @@ -152,15 +152,12 @@ func benchmarkCiVisibilityPayloadThroughput(count int) func(*testing.B) { b.ReportAllocs() b.ResetTimer() reset := func() { - p.header = make([]byte, 8) - p.off = 8 - atomic.StoreUint32(&p.count, 0) - p.buf.Reset() + p = newCiVisibilityPayload() } for i := 0; i < b.N; i++ { reset() for _, event := range events { - for p.size() < payloadMaxLimit { + for p.stats().size < payloadMaxLimit { p.push(event) } } diff --git a/ddtrace/tracer/civisibility_transport.go b/ddtrace/tracer/civisibility_transport.go index 0731332022..ff438b7118 100644 --- a/ddtrace/tracer/civisibility_transport.go +++ b/ddtrace/tracer/civisibility_transport.go @@ -11,15 +11,19 @@ import ( "fmt" "io" "net/http" - "os" "runtime" - "strconv" "strings" + "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/urlsanitizer" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) // Constants for CI Visibility API paths and subdomains. @@ -74,7 +78,7 @@ func newCiVisibilityTransport(config *config) *ciVisibilityTransport { testCycleURL := "" if agentlessEnabled { // Agentless mode is enabled. - APIKeyValue := os.Getenv(constants.APIKeyEnvironmentVariable) + APIKeyValue := env.Get(constants.APIKeyEnvironmentVariable) if APIKeyValue == "" { log.Error("An API key is required for agentless mode. Use the DD_API_KEY env variable to set it") } @@ -83,14 +87,14 @@ func newCiVisibilityTransport(config *config) *ciVisibilityTransport { // Check for a custom agentless URL. agentlessURL := "" - if v := os.Getenv(constants.CIVisibilityAgentlessURLEnvironmentVariable); v != "" { + if v := env.Get(constants.CIVisibilityAgentlessURLEnvironmentVariable); v != "" { agentlessURL = v } if agentlessURL == "" { // Use the standard agentless URL format. site := "datadoghq.com" - if v := os.Getenv("DD_SITE"); v != "" { + if v := env.Get("DD_SITE"); v != "" { site = v } @@ -104,8 +108,7 @@ func newCiVisibilityTransport(config *config) *ciVisibilityTransport { defaultHeaders["X-Datadog-EVP-Subdomain"] = TestCycleSubdomain testCycleURL = fmt.Sprintf("%s/%s/%s", config.agentURL.String(), EvpProxyPath, TestCyclePath) } - - log.Debug("ciVisibilityTransport: creating transport instance [agentless: %v, testcycleurl: %v]", agentlessEnabled, testCycleURL) + log.Debug("ciVisibilityTransport: creating transport instance [agentless: %t, testcycleurl: %s]", agentlessEnabled, urlsanitizer.SanitizeURL(testCycleURL)) return &ciVisibilityTransport{ config: config, @@ -125,8 +128,8 @@ func newCiVisibilityTransport(config *config) *ciVisibilityTransport { // Returns: // // An io.ReadCloser for reading the response body, and an error if the operation fails. -func (t *ciVisibilityTransport) send(p *payload) (body io.ReadCloser, err error) { - ciVisibilityPayload := &ciVisibilityPayload{p} +func (t *ciVisibilityTransport) send(p payload) (body io.ReadCloser, err error) { + ciVisibilityPayload := &ciVisibilityPayload{payload: p, serializationTime: 0} buffer, bufferErr := ciVisibilityPayload.getBuffer(t.config) if bufferErr != nil { return nil, fmt.Errorf("cannot create buffer payload: %v", bufferErr) @@ -138,29 +141,31 @@ func (t *ciVisibilityTransport) send(p *payload) (body io.ReadCloser, err error) gzipWriter := gzip.NewWriter(&gzipBuffer) _, err = io.Copy(gzipWriter, buffer) if err != nil { - return nil, fmt.Errorf("cannot compress request body: %v", err) + return nil, fmt.Errorf("cannot compress request body: %s", err.Error()) } err = gzipWriter.Close() if err != nil { - return nil, fmt.Errorf("cannot compress request body: %v", err) + return nil, fmt.Errorf("cannot compress request body: %s", err.Error()) } buffer = &gzipBuffer } req, err := http.NewRequest("POST", t.testCycleURLPath, buffer) if err != nil { - return nil, fmt.Errorf("cannot create http request: %v", err) + return nil, fmt.Errorf("cannot create http request: %s", err.Error()) } + req.ContentLength = int64(buffer.Len()) for header, value := range t.headers { req.Header.Set(header, value) } - req.Header.Set("Content-Length", strconv.Itoa(buffer.Len())) if t.agentless { req.Header.Set("Content-Encoding", "gzip") } + log.Debug("ciVisibilityTransport: sending transport request: %d bytes", buffer.Len()) - log.Debug("ciVisibilityTransport: sending transport request: %v bytes", buffer.Len()) + startTime := time.Now() response, err := t.config.httpClient.Do(req) + telemetry.EndpointPayloadRequestsMs(telemetry.TestCycleEndpointType, float64(time.Since(startTime).Milliseconds())) if err != nil { return nil, err } @@ -171,6 +176,7 @@ func (t *ciVisibilityTransport) send(p *payload) (body io.ReadCloser, err error) n, _ := response.Body.Read(msg) _ = response.Body.Close() txt := http.StatusText(code) + telemetry.EndpointPayloadRequestsErrors(telemetry.TestCycleEndpointType, telemetry.GetErrorTypeFromStatusCode(code)) if n > 0 { return nil, fmt.Errorf("%s (Status: %s)", msg[:n], txt) } @@ -188,7 +194,7 @@ func (t *ciVisibilityTransport) send(p *payload) (body io.ReadCloser, err error) // Returns: // // An error indicating that stats are not supported. -func (t *ciVisibilityTransport) sendStats(*statsPayload) error { +func (t *ciVisibilityTransport) sendStats(*pb.ClientStatsPayload, int) error { // Stats are not supported by CI Visibility agentless / EVP proxy. return nil } diff --git a/ddtrace/tracer/civisibility_transport_test.go b/ddtrace/tracer/civisibility_transport_test.go index 72240f2c7e..89e8f83d80 100644 --- a/ddtrace/tracer/civisibility_transport_test.go +++ b/ddtrace/tracer/civisibility_transport_test.go @@ -11,12 +11,16 @@ import ( "net/http" "net/http/httptest" "net/url" + "os" "strings" "testing" + "github.com/DataDog/dd-trace-go/v2/internal" "github.com/stretchr/testify/assert" "github.com/tinylib/msgp/msgp" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/urlsanitizer" ) func TestCiVisibilityTransport(t *testing.T) { @@ -29,7 +33,7 @@ func runTransportTest(t *testing.T, agentless, shouldSetAPIKey bool) { assert := assert.New(t) testCases := []struct { - payload [][]*span + payload [][]*Span }{ {getTestTrace(1, 1)}, {getTestTrace(10, 1)}, @@ -38,7 +42,7 @@ func runTransportTest(t *testing.T, agentless, shouldSetAPIKey bool) { remainingEvents := 1000 + 10 + 1 var hits int - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { hits++ metaLang := r.Header.Get("Datadog-Meta-Lang") assert.NotNil(metaLang) @@ -80,7 +84,7 @@ func runTransportTest(t *testing.T, agentless, shouldSetAPIKey bool) { parsedURL, _ := url.Parse(srv.URL) c := config{ ciVisibilityEnabled: true, - httpClient: defaultHTTPClient(0), + httpClient: internal.DefaultHTTPClient(defaultHTTPTimeout, false), agentURL: parsedURL, } @@ -99,7 +103,7 @@ func runTransportTest(t *testing.T, agentless, shouldSetAPIKey bool) { p := newCiVisibilityPayload() for _, t := range tc.payload { for _, span := range t { - err := p.push(getCiVisibilityEvent(span)) + _, err := p.push(getCiVisibilityEvent(span)) assert.NoError(err) } } @@ -110,3 +114,44 @@ func runTransportTest(t *testing.T, agentless, shouldSetAPIKey bool) { assert.Equal(hits, len(testCases)) assert.Equal(remainingEvents, 0) } + +func TestCIVisibilityTransportSecureLogging(t *testing.T) { + t.Run("agentless_mode_with_credentials_in_url", func(t *testing.T) { + // Set environment variables with sensitive data + os.Setenv(constants.CIVisibilityAgentlessEnabledEnvironmentVariable, "true") + os.Setenv(constants.APIKeyEnvironmentVariable, "test-api-key") + os.Setenv(constants.CIVisibilityAgentlessURLEnvironmentVariable, "https://user:secret@example.com/path") + defer func() { + os.Unsetenv(constants.CIVisibilityAgentlessEnabledEnvironmentVariable) + os.Unsetenv(constants.APIKeyEnvironmentVariable) + os.Unsetenv(constants.CIVisibilityAgentlessURLEnvironmentVariable) + }() + + cfg := &config{} + transport := newCiVisibilityTransport(cfg) + assert.NotNil(t, transport) + + // Verify URL still contains credentials (stored for actual use) + assert.Contains(t, transport.testCycleURLPath, "https://user:secret@example.com/path/api/v2/citestcycle") + }) + + t.Run("sanitize_url_function", func(t *testing.T) { + // Test the sanitizeURL function directly + tests := []struct { + input string + expected string + }{ + {"https://user:password@example.com/path", "https://user:xxxxx@example.com/path"}, + {"http://token@example.com/", "http://token@example.com/"}, // no password, so username preserved + {"https://user:pass@example.com:8080/path", "https://user:xxxxx@example.com:8080/path"}, + {"https://example.com/path", "https://example.com/path"}, + {"", ""}, + {"://invalid", "://invalid"}, // unparseable but no credentials, returned as-is + } + + for _, test := range tests { + result := urlsanitizer.SanitizeURL(test.input) + assert.Equal(t, test.expected, result, "Failed for input: %s", test.input) + } + }) +} diff --git a/ddtrace/tracer/civisibility_tslv.go b/ddtrace/tracer/civisibility_tslv.go index ef6614d48f..22b10877ff 100644 --- a/ddtrace/tracer/civisibility_tslv.go +++ b/ddtrace/tracer/civisibility_tslv.go @@ -3,16 +3,16 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2024 Datadog, Inc. -//go:generate msgp -unexported -marshal=false -o=civisibility_tslv_msgp.go -tests=false +//go:generate go run github.com/tinylib/msgp -unexported -marshal=false -o=civisibility_tslv_msgp.go -tests=false package tracer import ( "strconv" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" "github.com/tinylib/msgp/msgp" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" ) type ( @@ -26,7 +26,6 @@ type ( // Ensure that ciVisibilityEvent and related types implement necessary interfaces. var ( - _ ddtrace.Span = (*ciVisibilityEvent)(nil) _ msgp.Encodable = (*ciVisibilityEvent)(nil) _ msgp.Decodable = (*ciVisibilityEvent)(nil) @@ -45,7 +44,6 @@ type ciTestCyclePayload struct { } // ciVisibilityEvent represents a CI visibility event, including type, version, and content. -// It implements the ddtrace.Span interface. // According to the CI Visibility event specification it has the following format for tests: // // { @@ -152,7 +150,7 @@ type ciVisibilityEvent struct { Version int32 `msg:"version"` // Version of the event type Content tslvSpan `msg:"content"` // Content of the event - span *span `msg:"-"` // Associated span (not marshaled) + span *Span `msg:"-"` // Associated span (not marshaled) } // SetTag sets a tag on the event's span and updates the content metadata and metrics. @@ -163,8 +161,8 @@ type ciVisibilityEvent struct { // value - The tag value. func (e *ciVisibilityEvent) SetTag(key string, value interface{}) { e.span.SetTag(key, value) - e.Content.Meta = e.span.Meta - e.Content.Metrics = e.span.Metrics + e.Content.Meta = e.span.meta + e.Content.Metrics = e.span.metrics } // SetOperationName sets the operation name of the event's span and updates the content name. @@ -174,7 +172,7 @@ func (e *ciVisibilityEvent) SetTag(key string, value interface{}) { // operationName - The new operation name. func (e *ciVisibilityEvent) SetOperationName(operationName string) { e.span.SetOperationName(operationName) - e.Content.Name = e.span.Name + e.Content.Name = e.span.name } // BaggageItem retrieves the baggage item associated with the given key from the event's span. @@ -205,7 +203,7 @@ func (e *ciVisibilityEvent) SetBaggageItem(key, val string) { // Parameters: // // opts - Optional finish options. -func (e *ciVisibilityEvent) Finish(opts ...ddtrace.FinishOption) { +func (e *ciVisibilityEvent) Finish(opts ...FinishOption) { e.span.Finish(opts...) } @@ -247,8 +245,8 @@ type tslvSpan struct { // Returns: // // A pointer to the created ciVisibilityEvent. -func getCiVisibilityEvent(span *span) *ciVisibilityEvent { - switch span.Type { +func getCiVisibilityEvent(span *Span) *ciVisibilityEvent { + switch span.spanType { case constants.SpanTypeTest: return createTestEventFromSpan(span) case constants.SpanTypeTestSuite: @@ -271,15 +269,15 @@ func getCiVisibilityEvent(span *span) *ciVisibilityEvent { // Returns: // // A pointer to the created ciVisibilityEvent. -func createTestEventFromSpan(span *span) *ciVisibilityEvent { +func createTestEventFromSpan(span *Span) *ciVisibilityEvent { tSpan := createTslvSpan(span) tSpan.ParentID = 0 tSpan.SessionID = getAndRemoveMetaToUInt64(span, constants.TestSessionIDTag) tSpan.ModuleID = getAndRemoveMetaToUInt64(span, constants.TestModuleIDTag) tSpan.SuiteID = getAndRemoveMetaToUInt64(span, constants.TestSuiteIDTag) tSpan.CorrelationID = getAndRemoveMeta(span, constants.ItrCorrelationIDTag) - tSpan.SpanID = span.SpanID - tSpan.TraceID = span.TraceID + tSpan.SpanID = span.spanID + tSpan.TraceID = span.traceID return &ciVisibilityEvent{ span: span, Type: constants.SpanTypeTest, @@ -297,7 +295,7 @@ func createTestEventFromSpan(span *span) *ciVisibilityEvent { // Returns: // // A pointer to the created ciVisibilityEvent. -func createTestSuiteEventFromSpan(span *span) *ciVisibilityEvent { +func createTestSuiteEventFromSpan(span *Span) *ciVisibilityEvent { tSpan := createTslvSpan(span) tSpan.ParentID = 0 tSpan.SessionID = getAndRemoveMetaToUInt64(span, constants.TestSessionIDTag) @@ -320,7 +318,7 @@ func createTestSuiteEventFromSpan(span *span) *ciVisibilityEvent { // Returns: // // A pointer to the created ciVisibilityEvent. -func createTestModuleEventFromSpan(span *span) *ciVisibilityEvent { +func createTestModuleEventFromSpan(span *Span) *ciVisibilityEvent { tSpan := createTslvSpan(span) tSpan.ParentID = 0 tSpan.SessionID = getAndRemoveMetaToUInt64(span, constants.TestSessionIDTag) @@ -342,7 +340,7 @@ func createTestModuleEventFromSpan(span *span) *ciVisibilityEvent { // Returns: // // A pointer to the created ciVisibilityEvent. -func createTestSessionEventFromSpan(span *span) *ciVisibilityEvent { +func createTestSessionEventFromSpan(span *Span) *ciVisibilityEvent { tSpan := createTslvSpan(span) tSpan.ParentID = 0 tSpan.SessionID = getAndRemoveMetaToUInt64(span, constants.TestSessionIDTag) @@ -363,10 +361,10 @@ func createTestSessionEventFromSpan(span *span) *ciVisibilityEvent { // Returns: // // A pointer to the created ciVisibilityEvent. -func createSpanEventFromSpan(span *span) *ciVisibilityEvent { +func createSpanEventFromSpan(span *Span) *ciVisibilityEvent { tSpan := createTslvSpan(span) - tSpan.SpanID = span.SpanID - tSpan.TraceID = span.TraceID + tSpan.SpanID = span.spanID + tSpan.TraceID = span.traceID return &ciVisibilityEvent{ span: span, Type: constants.SpanTypeSpan, @@ -384,18 +382,18 @@ func createSpanEventFromSpan(span *span) *ciVisibilityEvent { // Returns: // // The created tslvSpan. -func createTslvSpan(span *span) tslvSpan { +func createTslvSpan(span *Span) tslvSpan { return tslvSpan{ - Name: span.Name, - Service: span.Service, - Resource: span.Resource, - Type: span.Type, - Start: span.Start, - Duration: span.Duration, - ParentID: span.ParentID, - Error: span.Error, - Meta: span.Meta, - Metrics: span.Metrics, + Name: span.name, + Service: span.service, + Resource: span.resource, + Type: span.spanType, + Start: span.start, + Duration: span.duration, + ParentID: span.parentID, + Error: span.error, + Meta: span.meta, + Metrics: span.metrics, } } @@ -409,16 +407,16 @@ func createTslvSpan(span *span) tslvSpan { // Returns: // // The retrieved metadata value. -func getAndRemoveMeta(span *span, key string) string { - span.Lock() - defer span.Unlock() - if span.Meta == nil { - span.Meta = make(map[string]string, 1) +func getAndRemoveMeta(span *Span, key string) string { + span.mu.Lock() + defer span.mu.Unlock() + if span.meta == nil { + span.meta = make(map[string]string, 1) } - if v, ok := span.Meta[key]; ok { - delete(span.Meta, key) - delete(span.Metrics, key) + if v, ok := span.meta[key]; ok { + delete(span.meta, key) + delete(span.metrics, key) return v } @@ -435,7 +433,7 @@ func getAndRemoveMeta(span *span, key string) string { // Returns: // // The retrieved and converted metadata value as a uint64. -func getAndRemoveMetaToUInt64(span *span, key string) uint64 { +func getAndRemoveMetaToUInt64(span *Span, key string) uint64 { strValue := getAndRemoveMeta(span, key) i, err := strconv.ParseUint(strValue, 10, 64) if err != nil { diff --git a/ddtrace/tracer/civisibility_tslv_msgp.go b/ddtrace/tracer/civisibility_tslv_msgp.go index 63fa4b8499..0757fd1165 100644 --- a/ddtrace/tracer/civisibility_tslv_msgp.go +++ b/ddtrace/tracer/civisibility_tslv_msgp.go @@ -1,7 +1,7 @@ -package tracer - // Code generated by github.com/tinylib/msgp DO NOT EDIT. +package tracer + import ( "github.com/tinylib/msgp/msgp" ) @@ -40,19 +40,17 @@ func (z *ciTestCyclePayload) DecodeMsg(dc *msgp.Reader) (err error) { if z.Metadata == nil { z.Metadata = make(map[string]map[string]string, zb0002) } else if len(z.Metadata) > 0 { - for key := range z.Metadata { - delete(z.Metadata, key) - } + clear(z.Metadata) } for zb0002 > 0 { zb0002-- var za0001 string - var za0002 map[string]string za0001, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Metadata") return } + var za0002 map[string]string var zb0003 uint32 zb0003, err = dc.ReadMapHeader() if err != nil { @@ -62,19 +60,17 @@ func (z *ciTestCyclePayload) DecodeMsg(dc *msgp.Reader) (err error) { if za0002 == nil { za0002 = make(map[string]string, zb0003) } else if len(za0002) > 0 { - for key := range za0002 { - delete(za0002, key) - } + clear(za0002) } for zb0003 > 0 { zb0003-- var za0003 string - var za0004 string za0003, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Metadata", za0001) return } + var za0004 string za0004, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Metadata", za0001, za0003) @@ -497,25 +493,25 @@ func (z *tslvSpan) DecodeMsg(dc *msgp.Reader) (err error) { case "test_session_id": z.SessionID, err = dc.ReadUint64() if err != nil { - err = msgp.WrapError(err, "SessionId") + err = msgp.WrapError(err, "SessionID") return } case "test_module_id": z.ModuleID, err = dc.ReadUint64() if err != nil { - err = msgp.WrapError(err, "ModuleId") + err = msgp.WrapError(err, "ModuleID") return } case "test_suite_id": z.SuiteID, err = dc.ReadUint64() if err != nil { - err = msgp.WrapError(err, "SuiteId") + err = msgp.WrapError(err, "SuiteID") return } case "itr_correlation_id": z.CorrelationID, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "CorrelationId") + err = msgp.WrapError(err, "CorrelationID") return } case "name": @@ -588,19 +584,17 @@ func (z *tslvSpan) DecodeMsg(dc *msgp.Reader) (err error) { if z.Meta == nil { z.Meta = make(map[string]string, zb0002) } else if len(z.Meta) > 0 { - for key := range z.Meta { - delete(z.Meta, key) - } + clear(z.Meta) } for zb0002 > 0 { zb0002-- var za0001 string - var za0002 string za0001, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Meta") return } + var za0002 string za0002, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Meta", za0001) @@ -618,19 +612,17 @@ func (z *tslvSpan) DecodeMsg(dc *msgp.Reader) (err error) { if z.Metrics == nil { z.Metrics = make(map[string]float64, zb0003) } else if len(z.Metrics) > 0 { - for key := range z.Metrics { - delete(z.Metrics, key) - } + clear(z.Metrics) } for zb0003 > 0 { zb0003-- var za0003 string - var za0004 float64 za0003, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Metrics") return } + var za0004 float64 za0004, err = dc.ReadFloat64() if err != nil { err = msgp.WrapError(err, "Metrics", za0003) @@ -651,7 +643,7 @@ func (z *tslvSpan) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *tslvSpan) EncodeMsg(en *msgp.Writer) (err error) { - // omitempty: check for empty values + // check for omitted fields zb0001Len := uint32(16) var zb0001Mask uint16 /* 16 bits */ _ = zb0001Mask @@ -696,209 +688,210 @@ func (z *tslvSpan) EncodeMsg(en *msgp.Writer) (err error) { if err != nil { return } - if zb0001Len == 0 { - return - } - if (zb0001Mask & 0x1) == 0 { // if not empty - // write "test_session_id" - err = en.Append(0xaf, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64) - if err != nil { - return + + // skip if no fields are to be emitted + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not omitted + // write "test_session_id" + err = en.Append(0xaf, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.SessionID) + if err != nil { + err = msgp.WrapError(err, "SessionID") + return + } } - err = en.WriteUint64(z.SessionID) - if err != nil { - err = msgp.WrapError(err, "SessionID") - return + if (zb0001Mask & 0x2) == 0 { // if not omitted + // write "test_module_id" + err = en.Append(0xae, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.ModuleID) + if err != nil { + err = msgp.WrapError(err, "ModuleID") + return + } } - } - if (zb0001Mask & 0x2) == 0 { // if not empty - // write "test_module_id" - err = en.Append(0xae, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64) - if err != nil { - return + if (zb0001Mask & 0x4) == 0 { // if not omitted + // write "test_suite_id" + err = en.Append(0xad, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.SuiteID) + if err != nil { + err = msgp.WrapError(err, "SuiteID") + return + } } - err = en.WriteUint64(z.ModuleID) - if err != nil { - err = msgp.WrapError(err, "ModuleID") - return + if (zb0001Mask & 0x8) == 0 { // if not omitted + // write "itr_correlation_id" + err = en.Append(0xb2, 0x69, 0x74, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteString(z.CorrelationID) + if err != nil { + err = msgp.WrapError(err, "CorrelationID") + return + } } - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // write "test_suite_id" - err = en.Append(0xad, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64) + // write "name" + err = en.Append(0xa4, 0x6e, 0x61, 0x6d, 0x65) if err != nil { return } - err = en.WriteUint64(z.SuiteID) + err = en.WriteString(z.Name) if err != nil { - err = msgp.WrapError(err, "SuiteID") + err = msgp.WrapError(err, "Name") return } - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // write "itr_correlation_id" - err = en.Append(0xb2, 0x69, 0x74, 0x72, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64) + // write "service" + err = en.Append(0xa7, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65) if err != nil { return } - err = en.WriteString(z.CorrelationID) + err = en.WriteString(z.Service) if err != nil { - err = msgp.WrapError(err, "CorrelationID") + err = msgp.WrapError(err, "Service") return } - } - // write "name" - err = en.Append(0xa4, 0x6e, 0x61, 0x6d, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Name) - if err != nil { - err = msgp.WrapError(err, "Name") - return - } - // write "service" - err = en.Append(0xa7, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Service) - if err != nil { - err = msgp.WrapError(err, "Service") - return - } - // write "resource" - err = en.Append(0xa8, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Resource) - if err != nil { - err = msgp.WrapError(err, "Resource") - return - } - // write "type" - err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Type) - if err != nil { - err = msgp.WrapError(err, "Type") - return - } - // write "start" - err = en.Append(0xa5, 0x73, 0x74, 0x61, 0x72, 0x74) - if err != nil { - return - } - err = en.WriteInt64(z.Start) - if err != nil { - err = msgp.WrapError(err, "Start") - return - } - // write "duration" - err = en.Append(0xa8, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e) - if err != nil { - return - } - err = en.WriteInt64(z.Duration) - if err != nil { - err = msgp.WrapError(err, "Duration") - return - } - if (zb0001Mask & 0x400) == 0 { // if not empty - // write "span_id" - err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) + // write "resource" + err = en.Append(0xa8, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65) if err != nil { return } - err = en.WriteUint64(z.SpanID) + err = en.WriteString(z.Resource) if err != nil { - err = msgp.WrapError(err, "SpanID") + err = msgp.WrapError(err, "Resource") return } - } - if (zb0001Mask & 0x800) == 0 { // if not empty - // write "trace_id" - err = en.Append(0xa8, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64) + // write "type" + err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) if err != nil { return } - err = en.WriteUint64(z.TraceID) + err = en.WriteString(z.Type) if err != nil { - err = msgp.WrapError(err, "TraceID") + err = msgp.WrapError(err, "Type") return } - } - if (zb0001Mask & 0x1000) == 0 { // if not empty - // write "parent_id" - err = en.Append(0xa9, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64) + // write "start" + err = en.Append(0xa5, 0x73, 0x74, 0x61, 0x72, 0x74) if err != nil { return } - err = en.WriteUint64(z.ParentID) + err = en.WriteInt64(z.Start) if err != nil { - err = msgp.WrapError(err, "ParentID") + err = msgp.WrapError(err, "Start") return } - } - // write "error" - err = en.Append(0xa5, 0x65, 0x72, 0x72, 0x6f, 0x72) - if err != nil { - return - } - err = en.WriteInt32(z.Error) - if err != nil { - err = msgp.WrapError(err, "Error") - return - } - if (zb0001Mask & 0x4000) == 0 { // if not empty - // write "meta" - err = en.Append(0xa4, 0x6d, 0x65, 0x74, 0x61) + // write "duration" + err = en.Append(0xa8, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e) if err != nil { return } - err = en.WriteMapHeader(uint32(len(z.Meta))) + err = en.WriteInt64(z.Duration) if err != nil { - err = msgp.WrapError(err, "Meta") + err = msgp.WrapError(err, "Duration") return } - for za0001, za0002 := range z.Meta { - err = en.WriteString(za0001) + if (zb0001Mask & 0x400) == 0 { // if not omitted + // write "span_id" + err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) if err != nil { - err = msgp.WrapError(err, "Meta") return } - err = en.WriteString(za0002) + err = en.WriteUint64(z.SpanID) if err != nil { - err = msgp.WrapError(err, "Meta", za0001) + err = msgp.WrapError(err, "SpanID") return } } - } - if (zb0001Mask & 0x8000) == 0 { // if not empty - // write "metrics" - err = en.Append(0xa7, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73) + if (zb0001Mask & 0x800) == 0 { // if not omitted + // write "trace_id" + err = en.Append(0xa8, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.TraceID) + if err != nil { + err = msgp.WrapError(err, "TraceID") + return + } + } + if (zb0001Mask & 0x1000) == 0 { // if not omitted + // write "parent_id" + err = en.Append(0xa9, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.ParentID) + if err != nil { + err = msgp.WrapError(err, "ParentID") + return + } + } + // write "error" + err = en.Append(0xa5, 0x65, 0x72, 0x72, 0x6f, 0x72) if err != nil { return } - err = en.WriteMapHeader(uint32(len(z.Metrics))) + err = en.WriteInt32(z.Error) if err != nil { - err = msgp.WrapError(err, "Metrics") + err = msgp.WrapError(err, "Error") return } - for za0003, za0004 := range z.Metrics { - err = en.WriteString(za0003) + if (zb0001Mask & 0x4000) == 0 { // if not omitted + // write "meta" + err = en.Append(0xa4, 0x6d, 0x65, 0x74, 0x61) + if err != nil { + return + } + err = en.WriteMapHeader(uint32(len(z.Meta))) + if err != nil { + err = msgp.WrapError(err, "Meta") + return + } + for za0001, za0002 := range z.Meta { + err = en.WriteString(za0001) + if err != nil { + err = msgp.WrapError(err, "Meta") + return + } + err = en.WriteString(za0002) + if err != nil { + err = msgp.WrapError(err, "Meta", za0001) + return + } + } + } + if (zb0001Mask & 0x8000) == 0 { // if not omitted + // write "metrics" + err = en.Append(0xa7, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73) if err != nil { - err = msgp.WrapError(err, "Metrics") return } - err = en.WriteFloat64(za0004) + err = en.WriteMapHeader(uint32(len(z.Metrics))) if err != nil { - err = msgp.WrapError(err, "Metrics", za0003) + err = msgp.WrapError(err, "Metrics") return } + for za0003, za0004 := range z.Metrics { + err = en.WriteString(za0003) + if err != nil { + err = msgp.WrapError(err, "Metrics") + return + } + err = en.WriteFloat64(za0004) + if err != nil { + err = msgp.WrapError(err, "Metrics", za0003) + return + } + } } } return diff --git a/ddtrace/tracer/civisibility_writer.go b/ddtrace/tracer/civisibility_writer.go index 969b5edea6..038e8e6089 100644 --- a/ddtrace/tracer/civisibility_writer.go +++ b/ddtrace/tracer/civisibility_writer.go @@ -9,7 +9,8 @@ import ( "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // Constants defining the payload size limits for agentless mode. @@ -59,13 +60,15 @@ func newCiVisibilityTraceWriter(c *config) *ciVisibilityTraceWriter { // Parameters: // // trace - A slice of spans representing the trace to be added. -func (w *ciVisibilityTraceWriter) add(trace []*span) { +func (w *ciVisibilityTraceWriter) add(trace []*Span) { + telemetry.EventsEnqueueForSerialization() for _, s := range trace { cvEvent := getCiVisibilityEvent(s) - if err := w.payload.push(cvEvent); err != nil { - log.Error("ciVisibilityTraceWriter: Error encoding msgpack: %v", err) + size, err := w.payload.push(cvEvent) + if err != nil { + log.Error("ciVisibilityTraceWriter: Error encoding msgpack: %s", err.Error()) } - if w.payload.size() > agentlessPayloadSizeLimit { + if size > agentlessPayloadSizeLimit { w.flush() } } @@ -80,7 +83,7 @@ func (w *ciVisibilityTraceWriter) stop() { // flush sends the current payload to the transport. It ensures that the payload is reset // and the resources are freed after the flush operation is completed. func (w *ciVisibilityTraceWriter) flush() { - if w.payload.itemCount() == 0 { + if w.payload.stats().itemCount == 0 { return } @@ -90,7 +93,7 @@ func (w *ciVisibilityTraceWriter) flush() { w.payload = newCiVisibilityPayload() go func(p *ciVisibilityPayload) { - defer func(start time.Time) { + defer func(_ time.Time) { // Once the payload has been used, clear the buffer for garbage // collection to avoid a memory leak when references to this object // may still be kept by faulty transport implementations or the @@ -103,18 +106,27 @@ func (w *ciVisibilityTraceWriter) flush() { var count, size int var err error + + requestCompressedType := telemetry.UncompressedRequestCompressedType + if ciTransport, ok := w.config.transport.(*ciVisibilityTransport); ok && ciTransport.agentless { + requestCompressedType = telemetry.CompressedRequestCompressedType + } + telemetry.EndpointPayloadRequests(telemetry.TestCycleEndpointType, requestCompressedType) + for attempt := 0; attempt <= w.config.sendRetries; attempt++ { - size, count = p.size(), p.itemCount() + stats := p.stats() + size, count = stats.size, stats.itemCount log.Debug("ciVisibilityTraceWriter: sending payload: size: %d events: %d\n", size, count) _, err = w.config.transport.send(p.payload) if err == nil { log.Debug("ciVisibilityTraceWriter: sent events after %d attempts", attempt+1) return } - log.Error("ciVisibilityTraceWriter: failure sending events (attempt %d), will retry: %v", attempt+1, err) + log.Error("ciVisibilityTraceWriter: failure sending events (attempt %d of %d): %v", attempt+1, w.config.sendRetries+1, err.Error()) p.reset() - time.Sleep(time.Millisecond) + time.Sleep(w.config.retryInterval) } - log.Error("ciVisibilityTraceWriter: lost %d events: %v", count, err) + log.Error("ciVisibilityTraceWriter: lost %d events: %v", count, err.Error()) + telemetry.EndpointPayloadDropped(telemetry.TestCycleEndpointType) }(oldp) } diff --git a/ddtrace/tracer/civisibility_writer_test.go b/ddtrace/tracer/civisibility_writer_test.go index 0757ec05bb..113f6bd5ca 100644 --- a/ddtrace/tracer/civisibility_writer_test.go +++ b/ddtrace/tracer/civisibility_writer_test.go @@ -11,6 +11,7 @@ import ( "io" "strings" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/tinylib/msgp/msgp" @@ -29,10 +30,10 @@ type failingCiVisibilityTransport struct { assert *assert.Assertions } -func (t *failingCiVisibilityTransport) send(p *payload) (io.ReadCloser, error) { +func (t *failingCiVisibilityTransport) send(p payload) (io.ReadCloser, error) { t.sendAttempts++ - ciVisibilityPayload := &ciVisibilityPayload{p} + ciVisibilityPayload := &ciVisibilityPayload{payload: p, serializationTime: 0} var events ciVisibilityEvents err := msgp.Decode(ciVisibilityPayload, &events) @@ -57,24 +58,28 @@ func (t *failingCiVisibilityTransport) send(p *payload) (io.ReadCloser, error) { func TestCiVisibilityTraceWriterFlushRetries(t *testing.T) { testcases := []struct { configRetries int + retryInterval time.Duration failCount int tracesSent bool expAttempts int }{ - {configRetries: 0, failCount: 0, tracesSent: true, expAttempts: 1}, - {configRetries: 0, failCount: 1, tracesSent: false, expAttempts: 1}, + {configRetries: 0, retryInterval: time.Millisecond, failCount: 0, tracesSent: true, expAttempts: 1}, + {configRetries: 0, retryInterval: time.Millisecond, failCount: 1, tracesSent: false, expAttempts: 1}, - {configRetries: 1, failCount: 0, tracesSent: true, expAttempts: 1}, - {configRetries: 1, failCount: 1, tracesSent: true, expAttempts: 2}, - {configRetries: 1, failCount: 2, tracesSent: false, expAttempts: 2}, + {configRetries: 1, retryInterval: time.Millisecond, failCount: 0, tracesSent: true, expAttempts: 1}, + {configRetries: 1, retryInterval: time.Millisecond, failCount: 1, tracesSent: true, expAttempts: 2}, + {configRetries: 1, retryInterval: time.Millisecond, failCount: 2, tracesSent: false, expAttempts: 2}, - {configRetries: 2, failCount: 0, tracesSent: true, expAttempts: 1}, - {configRetries: 2, failCount: 1, tracesSent: true, expAttempts: 2}, - {configRetries: 2, failCount: 2, tracesSent: true, expAttempts: 3}, - {configRetries: 2, failCount: 3, tracesSent: false, expAttempts: 3}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 0, tracesSent: true, expAttempts: 1}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 1, tracesSent: true, expAttempts: 2}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 2, tracesSent: true, expAttempts: 3}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 3, tracesSent: false, expAttempts: 3}, + + {configRetries: 1, retryInterval: 2 * time.Millisecond, failCount: 1, tracesSent: true, expAttempts: 2}, + {configRetries: 2, retryInterval: 2 * time.Millisecond, failCount: 2, tracesSent: true, expAttempts: 3}, } - ss := []*span{makeSpan(0)} + ss := []*Span{makeSpan(0)} for _, test := range testcases { name := fmt.Sprintf("%d-%d-%t-%d", test.configRetries, test.failCount, test.tracesSent, test.expAttempts) t.Run(name, func(t *testing.T) { @@ -83,19 +88,27 @@ func TestCiVisibilityTraceWriterFlushRetries(t *testing.T) { failCount: test.failCount, assert: assert, } - c := newConfig(func(c *config) { + c, err := newTestConfig(func(c *config) { c.transport = p c.sendRetries = test.configRetries + c.retryInterval = test.retryInterval }) + assert.NoError(err) h := newCiVisibilityTraceWriter(c) h.add(ss) + start := time.Now() h.flush() h.wg.Wait() + elapsed := time.Since(start) assert.Equal(test.expAttempts, p.sendAttempts) assert.Equal(test.tracesSent, p.tracesSent) + + if test.configRetries > 0 && test.failCount > 1 { + assert.GreaterOrEqual(elapsed, test.retryInterval*time.Duration(minInts(test.configRetries+1, test.failCount))) + } }) } } diff --git a/ddtrace/tracer/context.go b/ddtrace/tracer/context.go index ee29dca37d..4fad8bfc5d 100644 --- a/ddtrace/tracer/context.go +++ b/ddtrace/tracer/context.go @@ -8,40 +8,78 @@ package tracer import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - traceinternal "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" + "github.com/DataDog/dd-trace-go/v2/internal" + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" ) // ContextWithSpan returns a copy of the given context which includes the span s. -func ContextWithSpan(ctx context.Context, s Span) context.Context { - return orchestrion.CtxWithValue(ctx, internal.ActiveSpanKey, s) +func ContextWithSpan(ctx context.Context, s *Span) context.Context { + newCtx := orchestrion.CtxWithValue(ctx, internal.ActiveSpanKey, s) + return contextWithPropagatedLLMSpan(newCtx, s) +} + +func contextWithPropagatedLLMSpan(ctx context.Context, s *Span) context.Context { + if s == nil { + return ctx + } + // if there is a propagated llm span already just skip + if _, ok := illmobs.PropagatedLLMSpanFromContext(ctx); ok { + return ctx + } + newCtx := ctx + + propagatedLLMObs := propagatedLLMSpanFromTags(s) + if propagatedLLMObs.SpanID == "" || propagatedLLMObs.TraceID == "" { + return newCtx + } + return illmobs.ContextWithPropagatedLLMSpan(newCtx, propagatedLLMObs) +} + +// propagatedLLMSpanFromTags extracts LLMObs propagation information from the trace propagating tags. +// This is used during distributed tracing to set the correct parent span for the current span. +func propagatedLLMSpanFromTags(s *Span) *illmobs.PropagatedLLMSpan { + propagatedLLMObs := &illmobs.PropagatedLLMSpan{} + if s.context == nil || s.context.trace == nil { + return propagatedLLMObs + } + if parentID := s.context.trace.propagatingTag(keyPropagatedLLMObsParentID); parentID != "" { + propagatedLLMObs.SpanID = parentID + } + if mlApp := s.context.trace.propagatingTag(keyPropagatedLLMObsMLAPP); mlApp != "" { + propagatedLLMObs.MLApp = mlApp + } + if trID := s.context.trace.propagatingTag(keyPropagatedLLMObsTraceID); trID != "" { + propagatedLLMObs.TraceID = trID + } + return propagatedLLMObs } // SpanFromContext returns the span contained in the given context. A second return // value indicates if a span was found in the context. If no span is found, a no-op // span is returned. -func SpanFromContext(ctx context.Context) (Span, bool) { +func SpanFromContext(ctx context.Context) (*Span, bool) { if ctx == nil { - return &traceinternal.NoopSpan{}, false + return nil, false } v := orchestrion.WrapContext(ctx).Value(internal.ActiveSpanKey) - if s, ok := v.(ddtrace.Span); ok { - return s, true + if s, ok := v.(*Span); ok { + // We may have a nil *Span wrapped in an interface in the GLS context stack, + // in which case we need to act a if there was nothing (for else we'll + // forcefully un-do a [ChildOf] option if one was passed). + return s, s != nil } - return &traceinternal.NoopSpan{}, false + return nil, false } // StartSpanFromContext returns a new span with the given operation name and options. If a span // is found in the context, it will be used as the parent of the resulting span. If the ChildOf // option is passed, it will only be used as the parent if there is no span found in `ctx`. -func StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (Span, context.Context) { +func StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (*Span, context.Context) { // copy opts in case the caller reuses the slice in parallel // we will add at least 1, at most 2 items - optsLocal := make([]StartSpanOption, len(opts), len(opts)+2) - copy(optsLocal, opts) - + optsLocal := options.Expand(opts, 0, 2) if ctx == nil { // default to context.Background() to avoid panics on Go >= 1.15 ctx = context.Background() @@ -50,11 +88,8 @@ func StartSpanFromContext(ctx context.Context, operationName string, opts ...Sta } optsLocal = append(optsLocal, withContext(ctx)) s := StartSpan(operationName, optsLocal...) - if span, ok := s.(*span); ok && span.pprofCtxActive != nil { - // If pprof labels were applied for this span, use the derived ctx that - // includes them. Otherwise a child of this span wouldn't be able to - // correctly restore the labels of its parent when it finishes. - ctx = span.pprofCtxActive + if s != nil && s.pprofCtxActive != nil { + ctx = s.pprofCtxActive } return s, ContextWithSpan(ctx, s) } diff --git a/ddtrace/tracer/context_test.go b/ddtrace/tracer/context_test.go index 2ed39e9d2a..9ab7b3eb43 100644 --- a/ddtrace/tracer/context_test.go +++ b/ddtrace/tracer/context_test.go @@ -11,26 +11,23 @@ import ( "encoding/hex" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - traceinternal "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/v2/internal" "github.com/stretchr/testify/assert" ) func TestContextWithSpan(t *testing.T) { - want := &span{SpanID: 123} + want := &Span{spanID: 123} ctx := ContextWithSpan(context.Background(), want) - got, ok := ctx.Value(internal.ActiveSpanKey).(*span) + got := ctx.Value(internal.ActiveSpanKey) assert := assert.New(t) - assert.True(ok) assert.Equal(got, want) } func TestSpanFromContext(t *testing.T) { t.Run("regular", func(t *testing.T) { assert := assert.New(t) - want := &span{SpanID: 123} + want := &Span{spanID: 123} ctx := ContextWithSpan(context.Background(), want) got, ok := SpanFromContext(ctx) assert.True(ok) @@ -40,21 +37,21 @@ func TestSpanFromContext(t *testing.T) { assert := assert.New(t) span, ok := SpanFromContext(context.Background()) assert.False(ok) - _, ok = span.(*traceinternal.NoopSpan) - assert.True(ok) + assert.Nil(span) span, ok = SpanFromContext(context.TODO()) assert.False(ok) - _, ok = span.(*traceinternal.NoopSpan) - assert.True(ok) + assert.Nil(span) }) } func TestStartSpanFromContext(t *testing.T) { - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) + defer stop() - parent := &span{context: &spanContext{spanID: 123, traceID: traceIDFrom64Bits(456)}} - parent2 := &span{context: &spanContext{spanID: 789, traceID: traceIDFrom64Bits(456)}} + parent := &Span{context: &SpanContext{spanID: 123, traceID: traceIDFrom64Bits(456)}} + parent2 := &Span{context: &SpanContext{spanID: 789, traceID: traceIDFrom64Bits(456)}} pctx := ContextWithSpan(context.Background(), parent) child, ctx := StartSpanFromContext( pctx, @@ -65,31 +62,68 @@ func TestStartSpanFromContext(t *testing.T) { ) assert := assert.New(t) - got, ok := child.(*span) - assert.True(ok) + got := child + assert.NotNil(child) gotctx, ok := SpanFromContext(ctx) assert.True(ok) assert.Equal(gotctx, got) - _, ok = gotctx.(*traceinternal.NoopSpan) - assert.False(ok) - - assert.Equal(uint64(456), got.TraceID) - assert.Equal(uint64(123), got.ParentID) - assert.Equal("http.request", got.Name) - assert.Equal("gin", got.Service) - assert.Equal("/", got.Resource) + assert.Equal(uint64(456), got.traceID) + assert.Equal(uint64(123), got.parentID) + assert.Equal("http.request", got.name) + assert.Equal("gin", got.service) + assert.Equal("/", got.resource) +} + +func TestStartSpanFromContextDefault(t *testing.T) { + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) + defer stop() + + assert := assert.New(t) + root, ctx := StartSpanFromContext(context.TODO(), "http.request") + assert.NotNil(root) + assert.Equal("http.request", root.name) + span, _ := StartSpanFromContext(ctx, "db.query") + assert.NotNil(span) + assert.Equal("db.query", span.name) + assert.Equal(span.traceID, root.traceID) + assert.NotEqual(span.spanID, root.spanID) +} + +func TestStartSpanWithSpanLinks(t *testing.T) { + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) + defer stop() + spanLink := SpanLink{TraceID: 789, TraceIDHigh: 0, SpanID: 789, Attributes: map[string]string{"reason": "terminated_context", "context_headers": "datadog"}, Flags: 0} + ctx := &SpanContext{spanLinks: []SpanLink{spanLink}, spanID: 789, traceID: traceIDFrom64Bits(789)} + + t.Run("create span from spancontext with links", func(t *testing.T) { + var s *Span + s, _ = StartSpanFromContext( + context.Background(), + "http.request", + WithSpanLinks([]SpanLink{spanLink}), + ChildOf(ctx), + ) + + assert.Equal(t, 1, len(s.spanLinks)) + assert.Equal(t, spanLink, s.spanLinks[0]) + + assert.Equal(t, 0, len(s.context.spanLinks)) // ensure that the span links are not added to the parent context + }) } func TestStartSpanFromContextRace(t *testing.T) { - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() // Start 100 goroutines that create child spans with StartSpanFromContext in parallel, // with a shared options slice. The child spans should get parented to the correct spans const numContexts = 100 options := make([]StartSpanOption, 0, 3) - outputValues := make(chan uint64, numContexts) - var expectedTraceIDs []uint64 + outputValues := make(chan string, numContexts) + var expectedTraceIDs []string for i := 0; i < numContexts; i++ { parent, childCtx := StartSpanFromContext(context.Background(), "parent") expectedTraceIDs = append(expectedTraceIDs, parent.Context().TraceID()) @@ -102,7 +136,7 @@ func TestStartSpanFromContextRace(t *testing.T) { } // collect the outputs - var outputs []uint64 + var outputs []string for i := 0; i < numContexts; i++ { outputs = append(outputs, <-outputValues) } @@ -111,45 +145,42 @@ func TestStartSpanFromContextRace(t *testing.T) { } func Test128(t *testing.T) { - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() t.Run("disable 128 bit trace ids", func(t *testing.T) { t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") span, _ := StartSpanFromContext(context.Background(), "http.request") assert.NotZero(t, span.Context().TraceID()) - w3cCtx, ok := span.Context().(ddtrace.SpanContextW3C) - if !ok { - assert.Fail(t, "couldn't cast to ddtrace.SpanContextW3C") - } - id128 := w3cCtx.TraceID128() + w3cCtx := span.Context() + id128 := w3cCtx.TraceID() assert.Len(t, id128, 32) // ensure there are enough leading zeros idBytes, err := hex.DecodeString(id128) assert.NoError(t, err) assert.Equal(t, uint64(0), binary.BigEndian.Uint64(idBytes[:8])) // high 64 bits should be 0 - assert.Equal(t, span.Context().TraceID(), binary.BigEndian.Uint64(idBytes[8:])) + tid := span.Context().TraceIDBytes() + assert.Equal(t, tid[:], idBytes) }) t.Run("enable 128 bit trace ids", func(t *testing.T) { // DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is true by default span128, _ := StartSpanFromContext(context.Background(), "http.request") assert.NotZero(t, span128.Context().TraceID()) - w3cCtx, ok := span128.Context().(ddtrace.SpanContextW3C) - if !ok { - assert.Fail(t, "couldn't cast to ddtrace.SpanContextW3C") - } - id128bit := w3cCtx.TraceID128() + w3cCtx := span128.Context() + id128bit := w3cCtx.TraceID() assert.NotEmpty(t, id128bit) assert.Len(t, id128bit, 32) // Ensure that the lower order bits match the span's 64-bit trace id b, err := hex.DecodeString(id128bit) assert.NoError(t, err) - assert.Equal(t, span128.Context().TraceID(), binary.BigEndian.Uint64(b[8:])) + assert.Equal(t, span128.Context().TraceIDLower(), binary.BigEndian.Uint64(b[8:])) }) } func TestStartSpanFromNilContext(t *testing.T) { - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() child, ctx := StartSpanFromContext(context.TODO(), "http.request") @@ -157,9 +188,8 @@ func TestStartSpanFromNilContext(t *testing.T) { // ensure the returned context works assert.Nil(ctx.Value("not_found_key")) - internalSpan, ok := child.(*span) - assert.True(ok) - assert.Equal("http.request", internalSpan.Name) + internalSpan := child + assert.Equal("http.request", internalSpan.name) // the returned context includes the span ctxSpan, ok := SpanFromContext(ctx) diff --git a/ddtrace/tracer/data_streams.go b/ddtrace/tracer/data_streams.go index 92f59f1c4f..c79f309168 100644 --- a/ddtrace/tracer/data_streams.go +++ b/ddtrace/tracer/data_streams.go @@ -8,9 +8,8 @@ package tracer import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - idatastreams "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + idatastreams "github.com/DataDog/dd-trace-go/v2/internal/datastreams" ) // dataStreamsContainer is an object that contains a data streams processor. @@ -34,7 +33,7 @@ func SetDataStreamsCheckpoint(ctx context.Context, edgeTags ...string) (outCtx c // This enables tracking data flow & end to end latency. // To learn more about the data streams product, see: https://docs.datadoghq.com/data_streams/go/ func SetDataStreamsCheckpointWithParams(ctx context.Context, params options.CheckpointParams, edgeTags ...string) (outCtx context.Context, ok bool) { - if t, ok := internal.GetGlobalTracer().(dataStreamsContainer); ok { + if t, ok := getGlobalTracer().(dataStreamsContainer); ok { if processor := t.GetDataStreamsProcessor(); processor != nil { outCtx = processor.SetCheckpointWithParams(ctx, params, edgeTags...) return outCtx, true @@ -46,7 +45,7 @@ func SetDataStreamsCheckpointWithParams(ctx context.Context, params options.Chec // TrackKafkaCommitOffset should be used in the consumer, to track when it acks offset. // if used together with TrackKafkaProduceOffset it can generate a Kafka lag in seconds metric. func TrackKafkaCommitOffset(group, topic string, partition int32, offset int64) { - if t, ok := internal.GetGlobalTracer().(dataStreamsContainer); ok { + if t, ok := getGlobalTracer().(dataStreamsContainer); ok { if p := t.GetDataStreamsProcessor(); p != nil { p.TrackKafkaCommitOffset(group, topic, partition, offset) } @@ -56,7 +55,7 @@ func TrackKafkaCommitOffset(group, topic string, partition int32, offset int64) // TrackKafkaProduceOffset should be used in the producer, to track when it produces a message. // if used together with TrackKafkaCommitOffset it can generate a Kafka lag in seconds metric. func TrackKafkaProduceOffset(topic string, partition int32, offset int64) { - if t, ok := internal.GetGlobalTracer().(dataStreamsContainer); ok { + if t, ok := getGlobalTracer().(dataStreamsContainer); ok { if p := t.GetDataStreamsProcessor(); p != nil { p.TrackKafkaProduceOffset(topic, partition, offset) } @@ -66,7 +65,7 @@ func TrackKafkaProduceOffset(topic string, partition int32, offset int64) { // TrackKafkaHighWatermarkOffset should be used in the producer, to track when it produces a message. // if used together with TrackKafkaCommitOffset it can generate a Kafka lag in seconds metric. func TrackKafkaHighWatermarkOffset(cluster string, topic string, partition int32, offset int64) { - if t, ok := internal.GetGlobalTracer().(dataStreamsContainer); ok { + if t, ok := getGlobalTracer().(dataStreamsContainer); ok { if p := t.GetDataStreamsProcessor(); p != nil { p.TrackKafkaHighWatermarkOffset(cluster, topic, partition, offset) } diff --git a/ddtrace/tracer/doc.go b/ddtrace/tracer/doc.go index cf9b4edc53..6b68d7f498 100644 --- a/ddtrace/tracer/doc.go +++ b/ddtrace/tracer/doc.go @@ -67,7 +67,7 @@ // not approach this limit as traces of this size are not useful and impossible to // visualize. // -// See the contrib package ( https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib ) +// See the contrib package ( https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/contrib ) // for integrating datadog with various libraries, frameworks and clients. // // All spans created by the tracer contain a context hereby referred to as the span @@ -86,7 +86,7 @@ // interfaces. An example alternate implementation is the MDCarrier in our gRPC integration. // // As an example, injecting a span's context into an HTTP request would look like this. -// (See the net/http contrib package for more examples https://pkg.go.dev/gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http): +// (See the net/http contrib package for more examples https://pkg.go.dev/github.com/DataDog/dd-trace-go/contrib/net/http/v2): // // req, err := http.NewRequest("GET", "http://example.com/", nil) // // ... @@ -106,5 +106,5 @@ // // Some libraries and frameworks are supported out-of-the-box by using one // of our integrations. You can see a list of supported integrations here: -// https://godoc.org/gopkg.in/DataDog/dd-trace-go.v1/contrib -package tracer // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +// https://pkg.go.dev/github.com/DataDog/dd-trace-go/v2/contrib +package tracer // import "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" diff --git a/ddtrace/tracer/dynamic_config.go b/ddtrace/tracer/dynamic_config.go index db48be5a73..c2b679258e 100644 --- a/ddtrace/tracer/dynamic_config.go +++ b/ddtrace/tracer/dynamic_config.go @@ -8,7 +8,7 @@ package tracer import ( "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) // dynamicConfig is a thread-safe generic data structure to represent configuration fields. @@ -26,11 +26,12 @@ type dynamicConfig[T any] struct { func newDynamicConfig[T any](name string, val T, apply func(T) bool, equal func(x, y T) bool) dynamicConfig[T] { return dynamicConfig[T]{ - cfgName: name, - current: val, - startup: val, - apply: apply, - equal: equal, + cfgName: name, + current: val, + startup: val, + cfgOrigin: telemetry.OriginDefault, + apply: apply, + equal: equal, } } @@ -79,11 +80,11 @@ func (dc *dynamicConfig[T]) handleRC(val *T) bool { func (dc *dynamicConfig[T]) toTelemetry() telemetry.Configuration { dc.RLock() defer dc.RUnlock() - return telemetry.Sanitize(telemetry.Configuration{ + return telemetry.Configuration{ Name: dc.cfgName, Value: dc.current, Origin: dc.cfgOrigin, - }) + } } func equal[T comparable](x, y T) bool { diff --git a/ddtrace/tracer/example_test.go b/ddtrace/tracer/example_test.go index ae7ce0883a..8869f83920 100644 --- a/ddtrace/tracer/example_test.go +++ b/ddtrace/tracer/example_test.go @@ -10,8 +10,8 @@ import ( "fmt" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) // A basic example demonstrating how to start the tracer, as well as how diff --git a/ddtrace/tracer/globaltracer.go b/ddtrace/tracer/globaltracer.go new file mode 100644 index 0000000000..8e2d954b25 --- /dev/null +++ b/ddtrace/tracer/globaltracer.go @@ -0,0 +1,23 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +import "github.com/DataDog/dd-trace-go/v2/ddtrace/internal" + +func init() { + var tracer Tracer = &NoopTracer{} + internal.SetGlobalTracer(tracer) +} + +// setGlobalTracer sets the global tracer to t. +func setGlobalTracer(t Tracer) { + internal.SetGlobalTracer(t) +} + +// getGlobalTracer returns the currently active tracer. +func getGlobalTracer() Tracer { + return internal.GetGlobalTracer[Tracer]() +} diff --git a/ddtrace/internal/globaltracer_test.go b/ddtrace/tracer/globaltracer_test.go similarity index 62% rename from ddtrace/internal/globaltracer_test.go rename to ddtrace/tracer/globaltracer_test.go index 09a0bd5422..1b5cf16f84 100644 --- a/ddtrace/internal/globaltracer_test.go +++ b/ddtrace/tracer/globaltracer_test.go @@ -3,41 +3,45 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package internal // import "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" +package tracer import ( "sync" "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" ) type raceTestTracer struct { stopped bool } -func (*raceTestTracer) StartSpan(_ string, _ ...ddtrace.StartSpanOption) ddtrace.Span { - return NoopSpan{} +func (*raceTestTracer) StartSpan(_ string, _ ...StartSpanOption) *Span { + return nil } func (*raceTestTracer) SetServiceInfo(_, _, _ string) {} -func (*raceTestTracer) Extract(_ interface{}) (ddtrace.SpanContext, error) { - return NoopSpanContext{}, nil +func (*raceTestTracer) Extract(_ interface{}) (*SpanContext, error) { + return nil, nil } -func (*raceTestTracer) Inject(_ ddtrace.SpanContext, _ interface{}) error { return nil } +func (*raceTestTracer) Inject(_ *SpanContext, _ interface{}) error { return nil } func (r *raceTestTracer) Stop() { r.stopped = true } +func (*raceTestTracer) TracerConf() TracerConf { + return TracerConf{} +} + +func (*raceTestTracer) Flush() {} + func TestGlobalTracer(t *testing.T) { // at module initialization, the tracer must be seet - if GetGlobalTracer() == nil { - t.Fatal("GetGlobalTracer() must never return nil") + if getGlobalTracer() == nil { + t.Fatal("getGlobalTracer() must never return nil") } - SetGlobalTracer(&raceTestTracer{}) - SetGlobalTracer(&NoopTracer{}) + setGlobalTracer(&raceTestTracer{}) + setGlobalTracer(&NoopTracer{}) // ensure the test resets the global tracer back to nothing - defer SetGlobalTracer(&raceTestTracer{}) + defer setGlobalTracer(&raceTestTracer{}) const numGoroutines = 10 @@ -51,19 +55,19 @@ func TestGlobalTracer(t *testing.T) { for i := 0; i < numGoroutines; i++ { go func(index int) { defer wg.Done() - var tracer ddtrace.Tracer = tracers[index] - SetGlobalTracer(tracer) + var tracer Tracer = tracers[index] + setGlobalTracer(tracer) // get the global tracer: it must be any raceTestTracer - tracer = GetGlobalTracer() + tracer = getGlobalTracer() if _, ok := tracer.(*raceTestTracer); !ok { - t.Errorf("GetGlobalTracer() expected to return a *rateTestTracer was %T", tracer) + t.Errorf("getGlobalTracer() expected to return a *rateTestTracer was %T", tracer) } }(i) } wg.Wait() - SetGlobalTracer(&raceTestTracer{}) + setGlobalTracer(&raceTestTracer{}) // all tracers must be stopped for i, tracer := range tracers { @@ -75,7 +79,7 @@ func TestGlobalTracer(t *testing.T) { func BenchmarkGetGlobalTracerSerial(b *testing.B) { for i := 0; i < b.N; i++ { - tracer := GetGlobalTracer() + tracer := getGlobalTracer() if tracer == nil { b.Fatal("BUG: tracer must not be nil") } @@ -85,7 +89,7 @@ func BenchmarkGetGlobalTracerSerial(b *testing.B) { func BenchmarkGetGlobalTracerParallel(b *testing.B) { b.RunParallel(func(pb *testing.PB) { for pb.Next() { - tracer := GetGlobalTracer() + tracer := getGlobalTracer() if tracer == nil { b.Fatal("BUG: tracer must not be nil") } diff --git a/ddtrace/tracer/llmobs.go b/ddtrace/tracer/llmobs.go new file mode 100644 index 0000000000..79205bcbf8 --- /dev/null +++ b/ddtrace/tracer/llmobs.go @@ -0,0 +1,74 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import ( + "context" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/internal/llmobs" +) + +var ( + _ llmobs.Tracer = (*llmobsTracerAdapter)(nil) + _ llmobs.APMSpan = (*llmobsSpanAdapter)(nil) +) + +// llmobsTracerAdapter adapts the public ddtrace/tracer API to the internal/llmobs.Tracer interface. +// This allows the internal llmobs package to start APM spans without directly depending +// on the tracer package, avoiding circular dependencies. +type llmobsTracerAdapter struct{} + +func (l *llmobsTracerAdapter) StartSpan(ctx context.Context, name string, cfg llmobs.StartAPMSpanConfig) (llmobs.APMSpan, context.Context) { + opts := make([]StartSpanOption, 0) + if !cfg.StartTime.IsZero() { + opts = append(opts, StartTime(cfg.StartTime)) + } + if cfg.SpanType != "" { + opts = append(opts, SpanType(cfg.SpanType)) + } + span, ctx := StartSpanFromContext(ctx, name, opts...) + return &llmobsSpanAdapter{span}, ctx +} + +// llmobsSpanAdapter adapts a public ddtrace/tracer.Span to the internal/llmobs.APMSpan interface. +type llmobsSpanAdapter struct { + span *Span +} + +func (l *llmobsSpanAdapter) Finish(cfg llmobs.FinishAPMSpanConfig) { + opts := make([]FinishOption, 0) + if !cfg.FinishTime.IsZero() { + opts = append(opts, FinishTime(cfg.FinishTime)) + } + if cfg.Error != nil { + opts = append(opts, WithError(cfg.Error)) + } + l.span.Finish(opts...) +} + +func (l *llmobsSpanAdapter) AddLink(link llmobs.SpanLink) { + l.span.AddLink(SpanLink{ + TraceID: link.TraceID, + TraceIDHigh: link.TraceIDHigh, + SpanID: link.SpanID, + Attributes: link.Attributes, + Tracestate: link.Tracestate, + Flags: link.Flags, + }) +} + +func (l *llmobsSpanAdapter) SpanID() string { + return strconv.FormatUint(l.span.Context().SpanID(), 10) +} + +func (l *llmobsSpanAdapter) TraceID() string { + return l.span.Context().TraceID() +} + +func (l *llmobsSpanAdapter) SetBaggageItem(key string, value string) { + l.span.SetBaggageItem(key, value) +} diff --git a/ddtrace/tracer/log.go b/ddtrace/tracer/log.go index b88d477c97..9e4148b7f3 100644 --- a/ddtrace/tracer/log.go +++ b/ddtrace/tracer/log.go @@ -9,16 +9,18 @@ import ( "bytes" "encoding/json" "fmt" + "log/slog" "math" "net/http" "runtime" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/osinfo" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) // startupInfo contains various information about the status of the tracer on startup. @@ -43,7 +45,7 @@ type startupInfo struct { ServiceMappings map[string]string `json:"service_mappings"` // Service Mappings Tags map[string]string `json:"tags"` // Global tags RuntimeMetricsEnabled bool `json:"runtime_metrics_enabled"` // Whether runtime metrics are enabled - HealthMetricsEnabled bool `json:"health_metrics_enabled"` // Whether health metrics are enabled + RuntimeMetricsV2Enabled bool `json:"runtime_metrics_v2_enabled"` // Whether runtime metrics v2 are enabled ProfilerCodeHotspotsEnabled bool `json:"profiler_code_hotspots_enabled"` // Whether profiler code hotspots are enabled ProfilerEndpointsEnabled bool `json:"profiler_endpoints_enabled"` // Whether profiler endpoints are enabled ApplicationVersion string `json:"dd_version"` // Version of the user's application @@ -59,15 +61,22 @@ type startupInfo struct { FeatureFlags []string `json:"feature_flags"` PropagationStyleInject string `json:"propagation_style_inject"` // Propagation style for inject PropagationStyleExtract string `json:"propagation_style_extract"` // Propagation style for extract + TracingAsTransport bool `json:"tracing_as_transport"` // Whether the tracer is disabled and other products are using it as a transport + DogstatsdAddr string `json:"dogstatsd_address"` // Destination of statsd payloads + DataStreamsEnabled bool `json:"data_streams_enabled"` // Whether Data Streams is enabled } // checkEndpoint tries to connect to the URL specified by endpoint. // If the endpoint is not reachable, checkEndpoint returns an error // explaining why. -func checkEndpoint(c *http.Client, endpoint string) error { - req, err := http.NewRequest("POST", endpoint, bytes.NewReader([]byte{0x90})) +func checkEndpoint(c *http.Client, endpoint string, protocol float64) error { + b := []byte{0x90} // empty array + if protocol == traceProtocolV1 { + b = []byte{0x80} // empty map + } + req, err := http.NewRequest("POST", endpoint, bytes.NewReader(b)) if err != nil { - return fmt.Errorf("cannot create http request: %v", err) + return fmt.Errorf("cannot create http request: %s", err) } req.Header.Set(traceCountHeader, "0") req.Header.Set("Content-Type", "application/msgpack") @@ -104,7 +113,13 @@ func logStartup(t *tracer) { injectorNames = "custom" extractorNames = "custom" } - + // Determine the agent URL to use in the logs + var agentURL string + if t.config.originalAgentURL != nil && t.config.originalAgentURL.Scheme == "unix" { + agentURL = t.config.originalAgentURL.String() + } else { + agentURL = t.config.transport.endpoint() + } info := startupInfo{ Date: time.Now().Format(time.RFC3339), OSName: osinfo.OSName(), @@ -114,7 +129,7 @@ func logStartup(t *tracer) { LangVersion: runtime.Version(), Env: t.config.env, Service: t.config.serviceName, - AgentURL: t.config.transport.endpoint(), + AgentURL: agentURL, Debug: t.config.debug, AnalyticsEnabled: !math.IsNaN(globalconfig.AnalyticsRate()), SampleRate: fmt.Sprintf("%f", t.rulesSampling.traces.globalRate), @@ -124,7 +139,7 @@ func logStartup(t *tracer) { ServiceMappings: t.config.serviceMappings, Tags: tags, RuntimeMetricsEnabled: t.config.runtimeMetrics, - HealthMetricsEnabled: t.config.runtimeMetrics, + RuntimeMetricsV2Enabled: t.config.runtimeMetricsV2, ApplicationVersion: t.config.version, ProfilerCodeHotspotsEnabled: t.config.profilerHotspots, ProfilerEndpointsEnabled: t.config.profilerEndpoints, @@ -140,23 +155,28 @@ func logStartup(t *tracer) { FeatureFlags: featureFlags, PropagationStyleInject: injectorNames, PropagationStyleExtract: extractorNames, + TracingAsTransport: t.config.tracingAsTransport, + DogstatsdAddr: t.config.dogstatsdAddr, + DataStreamsEnabled: t.config.dataStreamsMonitoringEnabled, } if _, _, err := samplingRulesFromEnv(); err != nil { - info.SamplingRulesError = fmt.Sprintf("%s", err) + info.SamplingRulesError = err.Error() } if limit, ok := t.rulesSampling.TraceRateLimit(); ok { info.SampleRateLimit = fmt.Sprintf("%v", limit) } if !t.config.logToStdout { - if err := checkEndpoint(t.config.httpClient, t.config.transport.endpoint()); err != nil { - info.AgentError = fmt.Sprintf("%s", err) - log.Warn("DIAGNOSTICS Unable to reach agent intake: %s", err) + if err := checkEndpoint(t.config.httpClient, t.config.transport.endpoint(), t.config.traceProtocol); err != nil { + info.AgentError = fmt.Sprintf("%s", err.Error()) + log.Warn("DIAGNOSTICS Unable to reach agent intake: %s", err.Error()) } } bs, err := json.Marshal(info) if err != nil { + //nolint:gocritic // Diagnostic logging needs full struct representation log.Warn("DIAGNOSTICS Failed to serialize json for startup log (%v) %#v\n", err, info) return } log.Info("DATADOG TRACER CONFIGURATION %s\n", string(bs)) + telemetrylog.Debug("DATADOG TRACER CONFIGURATION", slog.String("config", string(bs))) } diff --git a/ddtrace/tracer/log_test.go b/ddtrace/tracer/log_test.go index 27d31eb089..de51ef3b66 100644 --- a/ddtrace/tracer/log_test.go +++ b/ddtrace/tracer/log_test.go @@ -8,31 +8,35 @@ package tracer import ( "fmt" "math" + "regexp" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -const logPrefixRegexp = `Datadog Tracer v[0-9]+\.[0-9]+\.[0-9]+(-(rc\.[0-9]+|dev))?` +const logPrefixRegexp = `Datadog Tracer v[0-9]+\.[0-9]+\.[0-9]+(-((rc|beta)\.[0-9]+|dev(\.\d+)?))?` + +// commonLogIgnore is a list of strings that are commonly ignored by tests +// involving the output of the logger. +var commonLogIgnore = []string{"appsec: ", "telemetry", "Runtime metrics v2 enabled"} func TestStartupLog(t *testing.T) { t.Run("basic", func(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp)) + require.NoError(t, err) defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) require.Len(t, tp.Logs(), 2) - assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"","service":"tracer\.test(\.exe)?","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"disabled","trace_sampling_rules":null,"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":null,"tags":{"runtime-id":"[^"]*"},"runtime_metrics_enabled":false,"health_metrics_enabled":false,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"","architecture":"[^"]*","global_service":"","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":((true)|(false)),"Stats":((true)|(false)),"StatsdPort":0},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext","propagation_style_extract":"datadog,tracecontext"}`, tp.Logs()[1]) + assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"","service":"tracer\.test(\.exe)?","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"disabled","trace_sampling_rules":null,"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":null,"tags":{"runtime-id":"[^"]*"},"runtime_metrics_enabled":false,"runtime_metrics_v2_enabled":true,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"","architecture":"[^"]*","global_service":"","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":true,"Stats":true,"StatsdPort":(0|8125)},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext,baggage","propagation_style_extract":"datadog,tracecontext,baggage","tracing_as_transport":false,"dogstatsd_address":"localhost:8125","data_streams_enabled":false}`, tp.Logs()[1]) }) t.Run("configured", func(t *testing.T) { @@ -40,7 +44,7 @@ func TestStartupLog(t *testing.T) { tp := new(log.RecordLogger) t.Setenv("DD_TRACE_SAMPLE_RATE", "0.123") - tracer, _, _, stop := startTestTracer(t, + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithService("configured.service"), WithAgentAddr("test.host:1234"), @@ -51,20 +55,20 @@ func TestStartupLog(t *testing.T) { WithRuntimeMetrics(), WithAnalyticsRate(1.0), WithServiceVersion("2.3.4"), - WithSamplingRules([]SamplingRule{ServiceRule("mysql", 0.75)}), + WithSamplingRules(TraceSamplingRules(Rule{ServiceGlob: "mysql", Rate: 0.75})), WithDebugMode(true), - WithOrchestrion(map[string]string{"version": "v1"}), WithFeatureFlags("discovery"), ) + require.NoError(t, err) defer globalconfig.SetAnalyticsRate(math.NaN()) defer globalconfig.SetServiceName("") defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) require.Len(t, tp.Logs(), 2) - assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"configuredEnv","service":"configured.service","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":true,"analytics_enabled":true,"sample_rate":"0\.123000","sample_rate_limit":"100","trace_sampling_rules":\[{"service":"mysql","sample_rate":0\.75}\],"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":{"initial_service":"new_service"},"tags":{"runtime-id":"[^"]*","tag":"value","tag2":"NaN"},"runtime_metrics_enabled":true,"health_metrics_enabled":true,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"2.3.4","architecture":"[^"]*","global_service":"configured.service","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":false,"Stats":false,"StatsdPort":0},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":true,"metadata":{"version":"v1"}},"feature_flags":\["discovery"\],"propagation_style_inject":"datadog,tracecontext","propagation_style_extract":"datadog,tracecontext"}`, tp.Logs()[1]) + assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"configuredEnv","service":"configured.service","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":true,"analytics_enabled":true,"sample_rate":"0\.123000","sample_rate_limit":"100","trace_sampling_rules":\[{"service":"mysql","sample_rate":0\.75}\],"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":{"initial_service":"new_service"},"tags":{"runtime-id":"[^"]*","tag":"value","tag2":"NaN"},"runtime_metrics_enabled":true,"runtime_metrics_v2_enabled":true,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"2.3.4","architecture":"[^"]*","global_service":"configured.service","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":true,"Stats":true,"StatsdPort":(0|8125)},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":(false|true,"metadata":{"version":"v\d+.\d+.\d+(-[^"]+)?"})},"feature_flags":\["discovery"\],"propagation_style_inject":"datadog,tracecontext,baggage","propagation_style_extract":"datadog,tracecontext,baggage","tracing_as_transport":false,"dogstatsd_address":"localhost:8125","data_streams_enabled":false}`, tp.Logs()[1]) }) t.Run("limit", func(t *testing.T) { @@ -72,7 +76,7 @@ func TestStartupLog(t *testing.T) { tp := new(log.RecordLogger) t.Setenv("DD_TRACE_SAMPLE_RATE", "0.123") t.Setenv("DD_TRACE_RATE_LIMIT", "1000.001") - tracer, _, _, stop := startTestTracer(t, + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithService("configured.service"), WithAgentAddr("test.host:1234"), @@ -83,54 +87,51 @@ func TestStartupLog(t *testing.T) { WithRuntimeMetrics(), WithAnalyticsRate(1.0), WithServiceVersion("2.3.4"), - WithSamplingRules([]SamplingRule{ServiceRule("mysql", 0.75)}), + WithSamplingRules(TraceSamplingRules(Rule{ServiceGlob: "mysql", Rate: 0.75})), WithDebugMode(true), ) + require.NoError(t, err) defer globalconfig.SetAnalyticsRate(math.NaN()) defer globalconfig.SetServiceName("") defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) require.Len(t, tp.Logs(), 2) - assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"configuredEnv","service":"configured.service","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":true,"analytics_enabled":true,"sample_rate":"0\.123000","sample_rate_limit":"1000.001","trace_sampling_rules":\[{"service":"mysql","sample_rate":0\.75}\],"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":{"initial_service":"new_service"},"tags":{"runtime-id":"[^"]*","tag":"value","tag2":"NaN"},"runtime_metrics_enabled":true,"health_metrics_enabled":true,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"2.3.4","architecture":"[^"]*","global_service":"configured.service","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":false,"Stats":false,"StatsdPort":0},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext","propagation_style_extract":"datadog,tracecontext"}`, tp.Logs()[1]) + assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"configuredEnv","service":"configured.service","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":true,"analytics_enabled":true,"sample_rate":"0\.123000","sample_rate_limit":"1000.001","trace_sampling_rules":\[{"service":"mysql","sample_rate":0\.75}\],"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":{"initial_service":"new_service"},"tags":{"runtime-id":"[^"]*","tag":"value","tag2":"NaN"},"runtime_metrics_enabled":true,"runtime_metrics_v2_enabled":true,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"2.3.4","architecture":"[^"]*","global_service":"configured.service","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":true,"Stats":true,"StatsdPort":(0|8125)},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext,baggage","propagation_style_extract":"datadog,tracecontext,baggage","tracing_as_transport":false,"dogstatsd_address":"localhost:8125","data_streams_enabled":false}`, tp.Logs()[1]) }) t.Run("errors", func(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"service": "some.service","sample_rate": 0.234}, {"service": "other.service","sample_rate": 2}]`) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp)) - defer stop() - - tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) - logStartup(tracer) - require.Len(t, tp.Logs(), 2) - assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"","service":"tracer\.test(\.exe)?","agent_url":"http://localhost:9/v0.4/traces","agent_error":"Post .*","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"100","trace_sampling_rules":\[{"service":"some\.service","sample_rate":0\.234}\],"span_sampling_rules":null,"sampling_rules_error":"\\n\\tat index 1: ignoring rule {Service:other.service Rate:2}: rate is out of \[0\.0, 1\.0] range","service_mappings":null,"tags":{"runtime-id":"[^"]*"},"runtime_metrics_enabled":false,"health_metrics_enabled":false,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"","architecture":"[^"]*","global_service":"","lambda_mode":"false","appsec":((true)|(false)),"agent_features":{"DropP0s":((true)|(false)),"Stats":((true)|(false)),"StatsdPort":0},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext","propagation_style_extract":"datadog,tracecontext"}`, tp.Logs()[1]) + _, _, _, _, err := startTestTracer(t, WithLogger(tp)) + assert.Equal("found errors when parsing sampling rules: \n\tat index 1: ignoring rule {Service:other.service Rate:2}: rate is out of [0.0, 1.0] range", err.Error()) }) t.Run("lambda", func(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithLambdaMode(true)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithLambdaMode(true)) + require.NoError(t, err) defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) assert.Len(tp.Logs(), 1) - assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"","service":"tracer\.test(\.exe)?","agent_url":"http://localhost:9/v0.4/traces","agent_error":"","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"disabled","trace_sampling_rules":null,"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":null,"tags":{"runtime-id":"[^"]*"},"runtime_metrics_enabled":false,"health_metrics_enabled":false,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"","architecture":"[^"]*","global_service":"","lambda_mode":"true","appsec":((true)|(false)),"agent_features":{"DropP0s":false,"Stats":false,"StatsdPort":0},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext","propagation_style_extract":"datadog,tracecontext"}`, tp.Logs()[0]) + assert.Regexp(logPrefixRegexp+` INFO: DATADOG TRACER CONFIGURATION {"date":"[^"]*","os_name":"[^"]*","os_version":"[^"]*","version":"[^"]*","lang":"Go","lang_version":"[^"]*","env":"","service":"tracer\.test(\.exe)?","agent_url":"http://localhost:9/v0.4/traces","agent_error":"","debug":false,"analytics_enabled":false,"sample_rate":"NaN","sample_rate_limit":"disabled","trace_sampling_rules":null,"span_sampling_rules":null,"sampling_rules_error":"","service_mappings":null,"tags":{"runtime-id":"[^"]*"},"runtime_metrics_enabled":false,"runtime_metrics_v2_enabled":true,"profiler_code_hotspots_enabled":((false)|(true)),"profiler_endpoints_enabled":((false)|(true)),"dd_version":"","architecture":"[^"]*","global_service":"","lambda_mode":"true","appsec":((true)|(false)),"agent_features":{"DropP0s":true,"Stats":true,"StatsdPort":(0|8125)},"integrations":{.*},"partial_flush_enabled":false,"partial_flush_min_spans":1000,"orchestrion":{"enabled":false},"feature_flags":\[\],"propagation_style_inject":"datadog,tracecontext,baggage","propagation_style_extract":"datadog,tracecontext,baggage","tracing_as_transport":false,"dogstatsd_address":"localhost:8125","data_streams_enabled":false}`, tp.Logs()[0]) }) t.Run("integrations", func(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp)) + require.NoError(t, err) defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) require.Len(t, tp.Logs(), 2) @@ -144,22 +145,23 @@ func TestStartupLog(t *testing.T) { func TestLogSamplingRules(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"service": "some.service", "sample_rate": 0.234}, {"service": "other.service"}, {"service": "last.service", "sample_rate": 0.56}, {"odd": "pairs"}, {"sample_rate": 9.10}]`) - _, _, _, stop := startTestTracer(t, WithLogger(tp)) - defer stop() + _, _, _, _, err := startTestTracer(t, WithLogger(tp), WithEnv("test")) + assert.Error(err) assert.Len(tp.Logs(), 1) - assert.Regexp(logPrefixRegexp+` WARN: DIAGNOSTICS Error\(s\) parsing sampling rules: found errors:\n\tat index 4: ignoring rule {Rate:9\.10}: rate is out of \[0\.0, 1\.0] range$`, tp.Logs()[0]) + assert.Regexp(logPrefixRegexp+` WARN: DIAGNOSTICS Error\(s\) parsing sampling rules: found errors: \n\s*\tat index 4: ignoring rule \{Rate:9\.10\}: rate is out of \[0\.0, 1\.0\] range$`, tp.Logs()[0]) } func TestLogDefaultSampleRate(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) log.UseLogger(tp) t.Setenv("DD_TRACE_SAMPLE_RATE", ``) - _, _, _, stop := startTestTracer(t, WithLogger(tp)) + _, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithEnv("test")) + require.NoError(t, err) defer stop() assert.Len(tp.Logs(), 0) @@ -168,10 +170,11 @@ func TestLogDefaultSampleRate(t *testing.T) { func TestLogAgentReachable(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp)) + require.NoError(t, err) defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) require.Len(t, tp.Logs(), 2) assert.Regexp(logPrefixRegexp+` WARN: DIAGNOSTICS Unable to reach agent intake: Post`, tp.Logs()[0]) @@ -180,19 +183,21 @@ func TestLogAgentReachable(t *testing.T) { func TestLogFormat(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tracer := newTracer(WithLogger(tp), WithRuntimeMetrics(), WithDebugMode(true)) - defer tracer.Stop() + + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithRuntimeMetrics(), WithDebugMode(true)) + require.NoError(t, err) + defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) - tracer.StartSpan("test", ServiceName("test-service"), ResourceName("/"), WithSpanID(12345)) + tp.Ignore(commonLogIgnore...) + span := tracer.StartSpan("test", ServiceName("test-service"), ResourceName("/"), WithSpanID(12345)) assert.Len(tp.Logs(), 1) - assert.Regexp(logPrefixRegexp+` DEBUG: Started Span: dd.trace_id="12345" dd.span_id="12345" dd.parent_id="0", Operation: test, Resource: /, Tags: map.*, map.*`, tp.Logs()[0]) + assert.Regexp(logPrefixRegexp+` DEBUG: Started Span: dd.trace_id="`+span.Context().TraceID()+`" dd.span_id="12345" dd.parent_id="0", Operation: test, Resource: /, Tags: map.*, map.*`, tp.Logs()[0]) } func TestLogPropagators(t *testing.T) { t.Run("default", func(t *testing.T) { assert := assert.New(t) - substring := `"propagation_style_inject":"datadog,tracecontext","propagation_style_extract":"datadog,tracecontext"` + substring := `"propagation_style_inject":"datadog,tracecontext,baggage","propagation_style_extract":"datadog,tracecontext,baggage"` log := setup(t, nil) assert.Regexp(substring, log) }) @@ -236,10 +241,10 @@ func TestLogPropagators(t *testing.T) { type prop struct{} -func (p *prop) Inject(context ddtrace.SpanContext, carrier interface{}) (e error) { +func (p *prop) Inject(_ *SpanContext, _ interface{}) (e error) { return } -func (p *prop) Extract(carrier interface{}) (sctx ddtrace.SpanContext, e error) { +func (p *prop) Extract(_ interface{}) (sctx *SpanContext, e error) { return } @@ -247,15 +252,96 @@ func setup(t *testing.T, customProp Propagator) string { tp := new(log.RecordLogger) var tracer *tracer var stop func() + var err error if customProp != nil { - tracer, _, _, stop = startTestTracer(t, WithLogger(tp), WithPropagator(customProp)) + tracer, _, _, stop, err = startTestTracer(t, WithLogger(tp), WithPropagator(customProp)) + assert.NoError(t, err) } else { - tracer, _, _, stop = startTestTracer(t, WithLogger(tp)) + tracer, _, _, stop, err = startTestTracer(t, WithLogger(tp)) + assert.NoError(t, err) } defer stop() tp.Reset() - tp.Ignore("appsec: ", telemetry.LogPrefix) + tp.Ignore(commonLogIgnore...) logStartup(tracer) require.Len(t, tp.Logs(), 2) return tp.Logs()[1] } + +func findLogEntry(logs []string, pattern string) (string, bool) { + for _, log := range logs { + if matched, _ := regexp.MatchString(pattern, log); matched { + return log, true + } + } + return "", false +} + +func TestAgentURL(t *testing.T) { + assert := assert.New(t) + tp := new(log.RecordLogger) + tracer, err := newTracer(WithLogger(tp), WithUDS("var/run/datadog/apm.socket")) + assert.Nil(err) + defer tracer.Stop() + tp.Reset() + tp.Ignore(commonLogIgnore...) + logStartup(tracer) + logEntry, found := findLogEntry(tp.Logs(), `"agent_url":"unix://var/run/datadog/apm.socket"`) + if !found { + t.Fatal("Expected to find log entry") + } + assert.Regexp(`"agent_url":"unix://var/run/datadog/apm.socket"`, logEntry) +} + +func TestAgentURLFromEnv(t *testing.T) { + assert := assert.New(t) + t.Setenv("DD_TRACE_AGENT_URL", "unix://var/run/datadog/apm.socket") + tp := new(log.RecordLogger) + tracer, err := newTracer(WithLogger(tp)) + assert.Nil(err) + defer tracer.Stop() + tp.Reset() + tp.Ignore(commonLogIgnore...) + logStartup(tracer) + logEntry, found := findLogEntry(tp.Logs(), `"agent_url":"unix://var/run/datadog/apm.socket"`) + if !found { + t.Fatal("Expected to find log entry") + } + assert.Regexp(`"agent_url":"unix://var/run/datadog/apm.socket"`, logEntry) +} + +func TestInvalidAgentURL(t *testing.T) { + assert := assert.New(t) + // invalid socket URL + t.Setenv("DD_TRACE_AGENT_URL", "var/run/datadog/apm.socket") + tp := new(log.RecordLogger) + tracer, err := newTracer(WithLogger(tp)) + assert.Nil(err) + defer tracer.Stop() + tp.Reset() + tp.Ignore(commonLogIgnore...) + logStartup(tracer) + logEntry, found := findLogEntry(tp.Logs(), `"agent_url":"http://localhost:8126/v0.4/traces"`) + if !found { + t.Fatal("Expected to find log entry") + } + // assert that it is the default URL + assert.Regexp(`"agent_url":"http://localhost:8126/v0.4/traces"`, logEntry) +} + +func TestAgentURLConflict(t *testing.T) { + assert := assert.New(t) + t.Setenv("DD_TRACE_AGENT_URL", "unix://var/run/datadog/apm.socket") + tp := new(log.RecordLogger) + tracer, err := newTracer(WithLogger(tp), WithUDS("var/run/datadog/apm.socket"), WithAgentAddr("localhost:8126")) + assert.Nil(err) + defer tracer.Stop() + tp.Reset() + tp.Ignore(commonLogIgnore...) + logStartup(tracer) + logEntry, found := findLogEntry(tp.Logs(), `"agent_url":"http://localhost:8126/v0.4/traces"`) + if !found { + t.Fatal("Expected to find log entry") + } + assert.Regexp(`"agent_url":"http://localhost:8126/v0.4/traces"`, logEntry) +} diff --git a/ddtrace/tracer/logger.go b/ddtrace/tracer/logger.go new file mode 100644 index 0000000000..6663fe62b2 --- /dev/null +++ b/ddtrace/tracer/logger.go @@ -0,0 +1,42 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +import "github.com/DataDog/dd-trace-go/v2/internal/log" + +// Logger implementations are able to log given messages that the tracer or profiler might output. +type Logger interface { + // Log prints the given message. + Log(msg string) +} + +// UseLogger sets l as the logger for all tracer and profiler logs. +func UseLogger(l Logger) { + log.UseLogger(l) +} + +// LogLevel represents the logging level that the log package prints at. +type LogLevel = log.Level + +type loggerAdapter struct { + fn func(lvl LogLevel, msg string, a ...any) +} + +func (l loggerAdapter) Log(msg string) { + l.LogL(log.DefaultLevel(), msg) +} + +func (l loggerAdapter) LogL(lvl LogLevel, msg string) { + l.fn(lvl, msg) +} + +// AdaptLogger adapts a function to the Logger interface to adapt any logger +// to the Logger interface. +func AdaptLogger(fn func(lvl LogLevel, msg string, a ...any)) Logger { + return loggerAdapter{ + fn: fn, + } +} diff --git a/ddtrace/tracer/logger_test.go b/ddtrace/tracer/logger_test.go new file mode 100644 index 0000000000..58d1326089 --- /dev/null +++ b/ddtrace/tracer/logger_test.go @@ -0,0 +1,41 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer_test + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/log" + + "github.com/stretchr/testify/assert" +) + +type logRecord struct { + level tracer.LogLevel + msg string +} + +func TestAdaptLogger(t *testing.T) { + recorder := make([]logRecord, 0) + l := tracer.AdaptLogger(func(lvl tracer.LogLevel, msg string, _ ...any) { + recorder = append(recorder, logRecord{ + level: lvl, + msg: msg, + }) + }) + defer log.UseLogger(l)() + + log.Warn("warning\n") + log.Info("info\n") + + assertions := assert.New(t) + assertions.Equal(2, len(recorder)) + assertions.Equal(log.LevelWarn, recorder[0].level) + assertions.Contains(recorder[0].msg, "WARN: warning") + assertions.Equal(log.LevelInfo, recorder[1].level) + assertions.Contains(recorder[1].msg, "INFO: info") +} diff --git a/ddtrace/tracer/metrics.go b/ddtrace/tracer/metrics.go index 409d8a439a..f6cf9f3b55 100644 --- a/ddtrace/tracer/metrics.go +++ b/ddtrace/tracer/metrics.go @@ -8,10 +8,10 @@ package tracer import ( "runtime" "runtime/debug" - "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal/tracerstats" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // defaultMetricsReportInterval specifies the interval at which runtime metrics will @@ -85,15 +85,32 @@ func (t *tracer) reportRuntimeMetrics(interval time.Duration) { } } -func (t *tracer) reportHealthMetrics(interval time.Duration) { +// reportHealthMetricsAtInterval reports noisy health metrics at the specified interval. +// The periodic reporting ensures metrics are delivered without overwhelming the system or logs. +func (t *tracer) reportHealthMetricsAtInterval(interval time.Duration) { ticker := time.NewTicker(interval) defer ticker.Stop() for { select { case <-ticker.C: - t.statsd.Count("datadog.tracer.spans_started", int64(atomic.SwapUint32(&t.spansStarted, 0)), nil, 1) - t.statsd.Count("datadog.tracer.spans_finished", int64(atomic.SwapUint32(&t.spansFinished, 0)), nil, 1) - t.statsd.Count("datadog.tracer.traces_dropped", int64(atomic.SwapUint32(&t.tracesDropped, 0)), []string{"reason:trace_too_large"}, 1) + // if there are started spans, report the number of spans with their integration, then + // reset the count + // the Count() function reports the total number of event occurrences in one time interval. We reset + // our count to 0 regardless of if Count succeeded to cleanup before the next interval. + + for k, v := range t.spansStarted.GetAndReset() { + t.statsd.Count("datadog.tracer.spans_started", v, []string{"integration:" + k}, 1) + } + + // if there are finished spans, report the number of spans with their integration, then + // reset the count + // the Count() function reports the total number of event occurrences in one time interval. We reset + // our count to 0 regardless of if Count succeeded to cleanup before the next interval. + for k, v := range t.spansFinished.GetAndReset() { + t.statsd.Count("datadog.tracer.spans_finished", v, []string{"integration:" + k}, 1) + } + + t.statsd.Count("datadog.tracer.traces_dropped", int64(tracerstats.Count(tracerstats.TracesDropped)), []string{"reason:trace_too_large"}, 1) case <-t.stop: return } diff --git a/ddtrace/tracer/metrics_test.go b/ddtrace/tracer/metrics_test.go index 4aad5e373c..363031e238 100644 --- a/ddtrace/tracer/metrics_test.go +++ b/ddtrace/tracer/metrics_test.go @@ -6,14 +6,17 @@ package tracer import ( + "sync" + "sync/atomic" "testing" "time" - globalinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/internal/statsdtest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + globalinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" ) func withStatsdClient(s globalinternal.StatsdClient) StartOption { @@ -24,7 +27,8 @@ func withStatsdClient(s globalinternal.StatsdClient) StartOption { func TestReportRuntimeMetrics(t *testing.T) { var tg statsdtest.TestStatsdClient - trc := newUnstartedTracer(withStatsdClient(&tg)) + trc, err := newUnstartedTracer(withStatsdClient(&tg)) + assert.NoError(t, err) defer trc.statsd.Close() trc.wg.Add(1) @@ -33,8 +37,8 @@ func TestReportRuntimeMetrics(t *testing.T) { trc.reportRuntimeMetrics(time.Millisecond) }() assert := assert.New(t) - err := tg.Wait(assert, 35, 1*time.Second) - close(trc.stop) + err = tg.Wait(assert, 35, 1*time.Second) + trc.Stop() assert.NoError(err) calls := tg.CallNames() assert.True(len(calls) > 30) @@ -43,34 +47,246 @@ func TestReportRuntimeMetrics(t *testing.T) { assert.Contains(calls, "runtime.go.gc_stats.pause_quantiles.75p") } -func TestReportHealthMetrics(t *testing.T) { +func TestReportHealthMetricsAtInterval(t *testing.T) { assert := assert.New(t) var tg statsdtest.TestStatsdClient defer func(old time.Duration) { statsInterval = old }(statsInterval) - statsInterval = time.Nanosecond + statsInterval = time.Millisecond - tracer, _, flush, stop := startTestTracer(t, withStatsdClient(&tg)) + tracer, _, flush, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) defer stop() tracer.StartSpan("operation").Finish() flush(1) - tg.Wait(assert, 3, 10*time.Second) + tg.Wait(assert, 4, 10*time.Second) + + assert.Eventually(func() bool { + counts := tg.Counts() + return counts["datadog.tracer.spans_started"] == 1 && + counts["datadog.tracer.spans_finished"] == 1 && + counts["datadog.tracer.traces_dropped"] == 0 && + counts["datadog.tracer.queue.enqueued.traces"] == 1 + }, 5*time.Second, 10*time.Millisecond) +} + +func TestEnqueuedTracesHealthMetric(t *testing.T) { + assert := assert.New(t) + var tg statsdtest.TestStatsdClient + + defer func(old time.Duration) { statsInterval = old }(statsInterval) + statsInterval = time.Nanosecond + + tracer, _, flush, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + for i := 0; i < 3; i++ { + tracer.StartSpan("operation").Finish() + } + flush(3) + + assert.Eventually(func() bool { + return tg.Counts()["datadog.tracer.queue.enqueued.traces"] == int64(3) + }, 5*time.Second, 10*time.Millisecond) + + w := tracer.traceWriter.(*agentTraceWriter) + assert.Equal(uint32(0), atomic.LoadUint32(&w.tracesQueued)) +} + +func TestSpansStartedTags(t *testing.T) { + var tg statsdtest.TestStatsdClient + + defer func(old time.Duration) { statsInterval = old }(statsInterval) + statsInterval = time.Millisecond + + t.Run("default", func(t *testing.T) { + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + tracer.StartSpan("operation").Finish() + assert.Eventually(func() bool { + return tg.Counts()["datadog.tracer.spans_started"] == 1 + }, 1*time.Second, 10*time.Millisecond) + assertSpanMetricCountsAreZero(t, tracer.spansStarted) + + counts := tg.Counts() + assert.Equal(counts["datadog.tracer.spans_started"], int64(1)) + for _, c := range statsdtest.FilterCallsByName(tg.CountCalls(), "datadog.tracer.spans_started") { + assert.Equal([]string{"integration:manual"}, c.Tags()) + } + }) + + t.Run("custom_integration", func(t *testing.T) { + tg.Reset() + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + sp := tracer.StartSpan("operation", Tag(ext.Component, "contrib")) + defer sp.Finish() + + assert.Eventually(func() bool { + return tg.Counts()["datadog.tracer.spans_started"] == 1 + }, 1*time.Second, 10*time.Millisecond) + assertSpanMetricCountsAreZero(t, tracer.spansStarted) + + counts := tg.Counts() + assert.Equal(counts["datadog.tracer.spans_started"], int64(1)) + for _, c := range statsdtest.FilterCallsByName(tg.CountCalls(), "datadog.tracer.spans_started") { + assert.Equal([]string{"integration:contrib"}, c.Tags()) + } + }) +} + +func TestSpansFinishedTags(t *testing.T) { + var tg statsdtest.TestStatsdClient + + defer func(old time.Duration) { statsInterval = old }(statsInterval) + statsInterval = time.Millisecond + + t.Run("default", func(t *testing.T) { + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + tracer.StartSpan("operation").Finish() + assert.Eventually(func() bool { + return tg.Counts()["datadog.tracer.spans_finished"] == 1 + }, 1*time.Second, 10*time.Millisecond) + assertSpanMetricCountsAreZero(t, tracer.spansFinished) + + counts := tg.Counts() + assert.Equal(counts["datadog.tracer.spans_finished"], int64(1)) + for _, c := range statsdtest.FilterCallsByName(tg.CountCalls(), "datadog.tracer.spans_finished") { + assert.Equal([]string{"integration:manual"}, c.Tags()) + } + }) + + t.Run("custom_integration", func(t *testing.T) { + tg.Reset() + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + tracer.StartSpan("operation", Tag(ext.Component, "contrib")).Finish() + + assert.Eventually(func() bool { + return tg.Counts()["datadog.tracer.spans_finished"] == 1 + }, 1*time.Second, 10*time.Millisecond) + assertSpanMetricCountsAreZero(t, tracer.spansFinished) + + counts := tg.Counts() + assert.Equal(counts["datadog.tracer.spans_finished"], int64(1)) + for _, c := range statsdtest.FilterCallsByName(tg.CountCalls(), "datadog.tracer.spans_finished") { + assert.Equal([]string{"integration:contrib"}, c.Tags()) + } + }) +} + +func TestMultipleSpanIntegrationTags(t *testing.T) { + var tg statsdtest.TestStatsdClient + tg.Reset() + + defer func(old time.Duration) { statsInterval = old }(statsInterval) + statsInterval = time.Millisecond + + assert := assert.New(t) + tracer, _, flush, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + // integration:manual + for range 5 { + tracer.StartSpan("operation").Finish() + } + + // integration:net/http + for range 3 { + tracer.StartSpan("operation", Tag(ext.Component, "net/http")).Finish() + } + + // integration:contrib + for range 2 { + tracer.StartSpan("operation", Tag(ext.Component, "contrib")).Finish() + } + flush(10) + assert.Eventually(func() bool { + counts := tg.Counts() + return counts["datadog.tracer.spans_started"] == 10 && counts["datadog.tracer.spans_finished"] == 10 + }, 1*time.Second, 10*time.Millisecond) + + require.Eventually(t, func() bool { + counts := tg.Counts() + return counts["datadog.tracer.spans_started"] == 10 && + counts["datadog.tracer.spans_finished"] == 10 + }, 5*time.Minute, 100*time.Millisecond) + + assertSpanMetricCountsAreZero(t, tracer.spansStarted) + assertSpanMetricCountsAreZero(t, tracer.spansFinished) + + startCalls := statsdtest.FilterCallsByName(tg.CountCalls(), "datadog.tracer.spans_started") + assert.Equal(int64(5), tg.CountCallsByTag(startCalls, "integration:manual")) + assert.Equal(int64(3), tg.CountCallsByTag(startCalls, "integration:net/http")) + assert.Equal(int64(2), tg.CountCallsByTag(startCalls, "integration:contrib")) + + finishedCalls := statsdtest.FilterCallsByName(tg.CountCalls(), "datadog.tracer.spans_finished") + assert.Equal(int64(5), tg.CountCallsByTag(finishedCalls, "integration:manual")) + assert.Equal(int64(3), tg.CountCallsByTag(finishedCalls, "integration:net/http")) + assert.Equal(int64(2), tg.CountCallsByTag(finishedCalls, "integration:contrib")) - counts := tg.Counts() - assert.Equal(int64(1), counts["datadog.tracer.spans_started"]) - assert.Equal(int64(1), counts["datadog.tracer.spans_finished"]) - assert.Equal(int64(0), counts["datadog.tracer.traces_dropped"]) +} + +func TestHealthMetricsRaceCondition(t *testing.T) { + assert := assert.New(t) + + defer func(old time.Duration) { statsInterval = old }(statsInterval) + statsInterval = time.Millisecond + + var tg statsdtest.TestStatsdClient + tracer, _, flush, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) + defer stop() + + wg := sync.WaitGroup{} + for range 5 { + wg.Add(1) + go func() { + defer wg.Done() + sp := tracer.StartSpan("operation") + sp.Finish() + }() + } + wg.Wait() + flush(5) + + cond := func() bool { + counts := tg.Counts() + return counts["datadog.tracer.spans_started"] == 5 && counts["datadog.tracer.spans_finished"] == 5 + } + assert.Eventually(cond, 5*time.Second, time.Millisecond) + time.Sleep(10 * time.Millisecond) + assert.True(cond()) + + assertSpanMetricCountsAreZero(t, tracer.spansStarted) + assertSpanMetricCountsAreZero(t, tracer.spansFinished) } func TestTracerMetrics(t *testing.T) { assert := assert.New(t) var tg statsdtest.TestStatsdClient - tracer, _, flush, stop := startTestTracer(t, withStatsdClient(&tg)) + tracer, _, flush, stop, err := startTestTracer(t, withStatsdClient(&tg)) + assert.Nil(err) tracer.StartSpan("operation").Finish() flush(1) - tg.Wait(assert, 5, 100*time.Millisecond) + tg.Wait(assert, 5, 500*time.Millisecond) calls := tg.CallsByName() counts := tg.Counts() @@ -88,3 +304,24 @@ func TestTracerMetrics(t *testing.T) { assert.Equal(1, calls["datadog.tracer.stopped"]) assert.True(tg.Closed()) } + +func BenchmarkSpansMetrics(b *testing.B) { + defer func(old time.Duration) { statsInterval = old }(statsInterval) + statsInterval = time.Millisecond + + var tg statsdtest.TestStatsdClient + tracer, _, _, stop, err := startTestTracer(b, withStatsdClient(&tg)) + assert.Nil(b, err) + defer stop() + for n := 0; n < b.N; n++ { + for range n { + go tracer.StartSpan("operation").Finish() + } + } +} + +func assertSpanMetricCountsAreZero(t *testing.T, metric globalinternal.XSyncMapCounterMap) { + for _, v := range metric.GetAndReset() { + assert.Equal(t, int64(0), v) + } +} diff --git a/ddtrace/tracer/noop.go b/ddtrace/tracer/noop.go new file mode 100644 index 0000000000..6401bc51a6 --- /dev/null +++ b/ddtrace/tracer/noop.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +import "github.com/DataDog/dd-trace-go/v2/internal/log" + +var _ Tracer = (*NoopTracer)(nil) + +// NoopTracer is an implementation of Tracer that is a no-op. +type NoopTracer struct{} + +// StartSpan implements Tracer. +func (NoopTracer) StartSpan(_ string, _ ...StartSpanOption) *Span { + log.Debug("Tracer must be started before starting a span; Review the docs for more information: https://docs.datadoghq.com/tracing/trace_collection/library_config/go/") + return nil +} + +// SetServiceInfo implements Tracer. +func (NoopTracer) SetServiceInfo(_, _, _ string) {} + +// Extract implements Tracer. +func (NoopTracer) Extract(_ interface{}) (*SpanContext, error) { + return nil, nil +} + +// Inject implements Tracer. +func (NoopTracer) Inject(_ *SpanContext, _ interface{}) error { return nil } + +// Stop implements Tracer. +func (NoopTracer) Stop() {} + +func (NoopTracer) TracerConf() TracerConf { + return TracerConf{} +} + +func (NoopTracer) Flush() {} diff --git a/ddtrace/tracer/option.go b/ddtrace/tracer/option.go index a9419b227b..13c899ffd0 100644 --- a/ddtrace/tracer/option.go +++ b/ddtrace/tracer/option.go @@ -6,9 +6,12 @@ package tracer import ( + "cmp" "context" "encoding/json" + "errors" "fmt" + "io" "math" "net" "net/http" @@ -19,25 +22,40 @@ import ( "runtime/debug" "strconv" "strings" + "sync" "time" "golang.org/x/mod/semver" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/normalizer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + "github.com/tinylib/msgp/msgp" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal" + appsecconfig "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + llmobsconfig "github.com/DataDog/dd-trace-go/v2/internal/llmobs/config" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/DataDog/datadog-go/v5/statsd" ) +const ( + envLLMObsEnabled = "DD_LLMOBS_ENABLED" + envLLMObsMlApp = "DD_LLMOBS_ML_APP" + envLLMObsAgentlessEnabled = "DD_LLMOBS_AGENTLESS_ENABLED" + envLLMObsProjectName = "DD_LLMOBS_PROJECT_NAME" +) + var contribIntegrations = map[string]struct { name string // user readable name for startup logs imported bool // true if the user has imported the integration @@ -47,14 +65,13 @@ var contribIntegrations = map[string]struct { "github.com/aws/aws-sdk-go-v2": {"AWS SDK v2", false}, "github.com/bradfitz/gomemcache": {"Memcache", false}, "cloud.google.com/go/pubsub.v1": {"Pub/Sub", false}, + "cloud.google.com/go/pubsub/v2": {"Pub/Sub v2", false}, "github.com/confluentinc/confluent-kafka-go": {"Kafka (confluent)", false}, "github.com/confluentinc/confluent-kafka-go/v2": {"Kafka (confluent) v2", false}, "database/sql": {"SQL", false}, "github.com/dimfeld/httptreemux/v5": {"HTTP Treemux", false}, "github.com/elastic/go-elasticsearch/v6": {"Elasticsearch v6", false}, - "github.com/emicklei/go-restful": {"go-restful", false}, "github.com/emicklei/go-restful/v3": {"go-restful v3", false}, - "github.com/garyburd/redigo": {"Redigo (dep)", false}, "github.com/gin-gonic/gin": {"Gin", false}, "github.com/globalsign/mgo": {"MongoDB (mgo)", false}, "github.com/go-chi/chi": {"chi", false}, @@ -69,23 +86,23 @@ var contribIntegrations = map[string]struct { "github.com/gomodule/redigo": {"Redigo", false}, "google.golang.org/api": {"Google API", false}, "google.golang.org/grpc": {"gRPC", false}, - "gopkg.in/jinzhu/gorm.v1": {"Gorm (gopkg)", false}, "github.com/gorilla/mux": {"Gorilla Mux", false}, "gorm.io/gorm.v1": {"Gorm v1", false}, - "github.com/graph-gophers/graphql-go": {"GraphQL", false}, + "github.com/graph-gophers/graphql-go": {"Graph Gophers GraphQL", false}, + "github.com/graphql-go/graphql": {"GraphQL-Go GraphQL", false}, "github.com/hashicorp/consul/api": {"Consul", false}, "github.com/hashicorp/vault/api": {"Vault", false}, - "github.com/jinzhu/gorm": {"Gorm", false}, + "github.com/jackc/pgx/v5": {"PGX", false}, "github.com/jmoiron/sqlx": {"SQLx", false}, "github.com/julienschmidt/httprouter": {"HTTP Router", false}, "k8s.io/client-go/kubernetes": {"Kubernetes", false}, - "github.com/labstack/echo": {"echo", false}, "github.com/labstack/echo/v4": {"echo v4", false}, + "log/slog": {"log/slog", false}, "github.com/miekg/dns": {"miekg/dns", false}, "net/http": {"HTTP", false}, "gopkg.in/olivere/elastic.v5": {"Elasticsearch v5", false}, - "gopkg.in/olivere/elastic.v3": {"Elasticsearch v3", false}, "github.com/redis/go-redis/v9": {"Redis v9", false}, + "github.com/redis/rueidis": {"Rueidis", false}, "github.com/segmentio/kafka-go": {"Kafka v0", false}, "github.com/IBM/sarama": {"IBM sarama", false}, "github.com/Shopify/sarama": {"Shopify sarama", false}, @@ -93,11 +110,10 @@ var contribIntegrations = map[string]struct { "github.com/syndtr/goleveldb": {"LevelDB", false}, "github.com/tidwall/buntdb": {"BuntDB", false}, "github.com/twitchtv/twirp": {"Twirp", false}, + "github.com/uptrace/bun": {"Bun", false}, "github.com/urfave/negroni": {"Negroni", false}, "github.com/valyala/fasthttp": {"FastHTTP", false}, - "github.com/zenazn/goji": {"Goji", false}, - "log/slog": {"log/slog", false}, - "github.com/uptrace/bun": {"Bun", false}, + "github.com/valkey-io/valkey-go": {"Valkey", false}, } var ( @@ -105,8 +121,20 @@ var ( // Replaced in tests defaultSocketDSD = "/var/run/datadog/dsd.socket" + // defaultStatsdPort specifies the default port to use for connecting to the statsd server. + defaultStatsdPort = "8125" + // defaultMaxTagsHeaderLen specifies the default maximum length of the X-Datadog-Tags header value. - defaultMaxTagsHeaderLen = 128 + defaultMaxTagsHeaderLen = 512 + + // defaultRateLimit specifies the default trace rate limit used when DD_TRACE_RATE_LIMIT is not set. + defaultRateLimit = 100.0 +) + +// Supported trace protocols. +const ( + traceProtocolV04 = 0.4 // v0.4 (default) + traceProtocolV1 = 1.0 // v1.0 ) // config holds the tracer configuration. @@ -114,6 +142,9 @@ type config struct { // debug, when true, writes details to logs. debug bool + // appsecStartOptions controls the options used when starting appsec features. + appsecStartOptions []appsecconfig.StartOption + // agent holds the capabilities of the agent and determines some // of the behaviour of the tracer. agent agentFeatures @@ -129,10 +160,13 @@ type config struct { // output instead of using the agent. This is used in Lambda environments. logToStdout bool - // sendRetries is the number of times a trace payload send is retried upon + // sendRetries is the number of times a trace or CI Visibility payload send is retried upon // failure. sendRetries int + // retryInterval is the interval between agent connection retries. It has no effect if sendRetries is not set + retryInterval time.Duration + // logStartup, when true, causes various startup info to be written // when the tracer starts. logStartup bool @@ -151,11 +185,14 @@ type config struct { env string // sampler specifies the sampler that will be used for sampling traces. - sampler Sampler + sampler RateSampler // agentURL is the agent URL that receives traces from the tracer. agentURL *url.URL + // originalAgentURL is the agent URL that receives traces from the tracer and does not get changed. + originalAgentURL *url.URL + // serviceMappings holds a set of service mappings to dynamically rename services serviceMappings map[string]string @@ -181,11 +218,14 @@ type config struct { // logger specifies the logger to use when printing errors. If not specified, the "log" package // will be used. - logger ddtrace.Logger + logger Logger // runtimeMetrics specifies whether collection of runtime metrics is enabled. runtimeMetrics bool + // runtimeMetricsV2 specifies whether collection of runtime metrics v2 is enabled. + runtimeMetricsV2 bool + // dogstatsdAddr specifies the address to connect for sending metrics to the // Datadog Agent. If not set, it defaults to "localhost:8125" or to the // combination of the environment variables DD_AGENT_HOST and DD_DOGSTATSD_PORT. @@ -277,18 +317,43 @@ type config struct { // ciVisibilityEnabled controls if the tracer is loaded with CI Visibility mode. default false ciVisibilityEnabled bool + // ciVisibilityAgentless controls if the tracer is loaded with CI Visibility agentless mode. default false + ciVisibilityAgentless bool + // logDirectory is directory for tracer logs specified by user-setting DD_TRACE_LOG_DIRECTORY. default empty/unused logDirectory string + + // tracingAsTransport specifies whether the tracer is running in transport-only mode, where traces are only sent when other products request it. + tracingAsTransport bool + + // traceRateLimitPerSecond specifies the rate limit for traces. + traceRateLimitPerSecond float64 + + // traceProtocol specifies the trace protocol to use. + traceProtocol float64 + + // llmobs contains the LLM Observability config + llmobs llmobsconfig.Config + + // isLambdaFunction, if true, indicates we are in a lambda function + // It is set by checking for a nonempty LAMBDA_FUNCTION_NAME env var. + isLambdaFunction bool } // orchestrionConfig contains Orchestrion configuration. -type orchestrionConfig struct { - // Enabled indicates whether this tracer was instanciated via Orchestrion. - Enabled bool `json:"enabled"` +type ( + orchestrionConfig struct { + // Enabled indicates whether this tracer was instanciated via Orchestrion. + Enabled bool `json:"enabled"` - // Metadata holds Orchestrion specific metadata (e.g orchestrion version, mode (toolexec or manual) etc..) - Metadata map[string]string `json:"metadata,omitempty"` -} + // Metadata holds Orchestrion specific metadata (e.g orchestrion version, mode (toolexec or manual) etc..) + Metadata *orchestrionMetadata `json:"metadata,omitempty"` + } + orchestrionMetadata struct { + // Version is the version of the orchestrion tool that was used to instrument the application. + Version string `json:"version,omitempty"` + } +) // HasFeature reports whether feature f is enabled. func (c *config) HasFeature(f string) bool { @@ -307,15 +372,24 @@ const partialFlushMinSpansDefault = 1000 // newConfig renders the tracer configuration based on defaults, environment variables // and passed user opts. -func newConfig(opts ...StartOption) *config { +func newConfig(opts ...StartOption) (*config, error) { c := new(config) + + // If this was built with a recent-enough version of Orchestrion, force the orchestrion config to + // the baked-in values. We do this early so that opts can be used to override the baked-in values, + // which is necessary for some tests to work properly. + c.orchestrionCfg.Enabled = orchestrion.Enabled() + if orchestrion.Version != "" { + c.orchestrionCfg.Metadata = &orchestrionMetadata{Version: orchestrion.Version} + } + c.sampler = NewAllSampler() sampleRate := math.NaN() if r := getDDorOtelConfig("sampleRate"); r != "" { var err error sampleRate, err = strconv.ParseFloat(r, 64) if err != nil { - log.Warn("ignoring DD_TRACE_SAMPLE_RATE, error: %v", err) + log.Warn("ignoring DD_TRACE_SAMPLE_RATE, error: %s", err.Error()) sampleRate = math.NaN() } else if sampleRate < 0.0 || sampleRate > 1.0 { log.Warn("ignoring DD_TRACE_SAMPLE_RATE: out of range %f", sampleRate) @@ -325,26 +399,43 @@ func newConfig(opts ...StartOption) *config { c.globalSampleRate = sampleRate c.httpClientTimeout = time.Second * 10 // 10 seconds - if v := os.Getenv("OTEL_LOGS_EXPORTER"); v != "" { + c.traceRateLimitPerSecond = defaultRateLimit + origin := telemetry.OriginDefault + if v, ok := env.Lookup("DD_TRACE_RATE_LIMIT"); ok { + l, err := strconv.ParseFloat(v, 64) + if err != nil { + log.Warn("DD_TRACE_RATE_LIMIT invalid, using default value %f: %v", defaultRateLimit, err.Error()) + } else if l < 0.0 { + log.Warn("DD_TRACE_RATE_LIMIT negative, using default value %f", defaultRateLimit) + } else { + c.traceRateLimitPerSecond = l + origin = telemetry.OriginEnvVar + } + } + + reportTelemetryOnAppStarted(telemetry.Configuration{Name: "trace_rate_limit", Value: c.traceRateLimitPerSecond, Origin: origin}) + + if v := env.Get("OTEL_LOGS_EXPORTER"); v != "" { log.Warn("OTEL_LOGS_EXPORTER is not supported") } if internal.BoolEnv("DD_TRACE_ANALYTICS_ENABLED", false) { globalconfig.SetAnalyticsRate(1.0) } - if os.Getenv("DD_TRACE_REPORT_HOSTNAME") == "true" { + if env.Get("DD_TRACE_REPORT_HOSTNAME") == "true" { var err error c.hostname, err = os.Hostname() if err != nil { - log.Warn("unable to look up hostname: %v", err) + log.Warn("unable to look up hostname: %s", err.Error()) + return c, fmt.Errorf("unable to look up hostnamet: %s", err.Error()) } } - if v := os.Getenv("DD_TRACE_SOURCE_HOSTNAME"); v != "" { + if v := env.Get("DD_TRACE_SOURCE_HOSTNAME"); v != "" { c.hostname = v } - if v := os.Getenv("DD_ENV"); v != "" { + if v := env.Get("DD_ENV"); v != "" { c.env = v } - if v := os.Getenv("DD_TRACE_FEATURES"); v != "" { + if v := env.Get("DD_TRACE_FEATURES"); v != "" { WithFeatureFlags(strings.FieldsFunc(v, func(r rune) bool { return r == ',' || r == ' ' })...)(c) @@ -353,14 +444,14 @@ func newConfig(opts ...StartOption) *config { c.serviceName = v globalconfig.SetServiceName(v) } - if ver := os.Getenv("DD_VERSION"); ver != "" { + if ver := env.Get("DD_VERSION"); ver != "" { c.version = ver } - if v := os.Getenv("DD_SERVICE_MAPPING"); v != "" { + if v := env.Get("DD_SERVICE_MAPPING"); v != "" { internal.ForEachStringTag(v, internal.DDTagsDelimiter, func(key, val string) { WithServiceMapping(key, val)(c) }) } c.headerAsTags = newDynamicConfig("trace_header_tags", nil, setHeaderTags, equalSlice[string]) - if v := os.Getenv("DD_TRACE_HEADER_TAGS"); v != "" { + if v := env.Get("DD_TRACE_HEADER_TAGS"); v != "" { c.headerAsTags.update(strings.Split(v, ","), telemetry.OriginEnvVar) // Required to ensure that the startup header tags are set on reset. c.headerAsTags.startup = c.headerAsTags.current @@ -374,22 +465,26 @@ func newConfig(opts ...StartOption) *config { // TODO: should we track the origin of these tags individually? c.globalTags.cfgOrigin = telemetry.OriginEnvVar } - if _, ok := os.LookupEnv("AWS_LAMBDA_FUNCTION_NAME"); ok { + if v, ok := env.Lookup("AWS_LAMBDA_FUNCTION_NAME"); ok { // AWS_LAMBDA_FUNCTION_NAME being set indicates that we're running in an AWS Lambda environment. // See: https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html c.logToStdout = true + if v != "" { + c.isLambdaFunction = true + } } c.logStartup = internal.BoolEnv("DD_TRACE_STARTUP_LOGS", true) c.runtimeMetrics = internal.BoolVal(getDDorOtelConfig("metrics"), false) + c.runtimeMetricsV2 = internal.BoolEnv("DD_RUNTIME_METRICS_V2_ENABLED", true) c.debug = internal.BoolVal(getDDorOtelConfig("debugMode"), false) - c.logDirectory = os.Getenv("DD_TRACE_LOG_DIRECTORY") - c.enabled = newDynamicConfig("tracing_enabled", internal.BoolVal(getDDorOtelConfig("enabled"), true), func(b bool) bool { return true }, equal[bool]) - if _, ok := os.LookupEnv("DD_TRACE_ENABLED"); ok { + c.logDirectory = env.Get("DD_TRACE_LOG_DIRECTORY") + c.enabled = newDynamicConfig("tracing_enabled", internal.BoolVal(getDDorOtelConfig("enabled"), true), func(_ bool) bool { return true }, equal[bool]) + if _, ok := env.Lookup("DD_TRACE_ENABLED"); ok { c.enabled.cfgOrigin = telemetry.OriginEnvVar } c.profilerEndpoints = internal.BoolEnv(traceprof.EndpointEnvVar, true) c.profilerHotspots = internal.BoolEnv(traceprof.CodeHotspotsEnvVar, true) - if compatMode := os.Getenv("DD_TRACE_CLIENT_HOSTNAME_COMPAT"); compatMode != "" { + if compatMode := env.Get("DD_TRACE_CLIENT_HOSTNAME_COMPAT"); compatMode != "" { if semver.IsValid(compatMode) { c.enableHostnameDetection = semver.Compare(semver.MajorMinor(compatMode), "v1.66") <= 0 } else { @@ -400,8 +495,8 @@ func newConfig(opts ...StartOption) *config { if c.debugAbandonedSpans { c.spanTimeout = internal.DurationEnv("DD_TRACE_ABANDONED_SPAN_TIMEOUT", 10*time.Minute) } - c.statsComputationEnabled = internal.BoolEnv("DD_TRACE_STATS_COMPUTATION_ENABLED", false) - c.dataStreamsMonitoringEnabled = internal.BoolEnv("DD_DATA_STREAMS_ENABLED", false) + c.statsComputationEnabled = internal.BoolEnv("DD_TRACE_STATS_COMPUTATION_ENABLED", true) + c.dataStreamsMonitoringEnabled, _, _ = stableconfig.Bool("DD_DATA_STREAMS_ENABLED", false) c.partialFlushEnabled = internal.BoolEnv("DD_TRACE_PARTIAL_FLUSH_ENABLED", false) c.partialFlushMinSpans = internal.IntEnv("DD_TRACE_PARTIAL_FLUSH_MIN_SPANS", partialFlushMinSpansDefault) if c.partialFlushMinSpans <= 0 { @@ -415,20 +510,10 @@ func newConfig(opts ...StartOption) *config { // is set, but DD_TRACE_PARTIAL_FLUSH_ENABLED is not true. Or just assume it should be enabled // if it's explicitly set, and don't require both variables to be configured. - c.dynamicInstrumentationEnabled = internal.BoolEnv("DD_DYNAMIC_INSTRUMENTATION_ENABLED", false) + c.dynamicInstrumentationEnabled, _, _ = stableconfig.Bool("DD_DYNAMIC_INSTRUMENTATION_ENABLED", false) - schemaVersionStr := os.Getenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA") - if v, ok := namingschema.ParseVersion(schemaVersionStr); ok { - namingschema.SetVersion(v) - c.spanAttributeSchemaVersion = int(v) - } else { - v := namingschema.SetDefaultVersion() - c.spanAttributeSchemaVersion = int(v) - log.Warn("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA=%s is not a valid value, setting to default of v%d", schemaVersionStr, v) - } - // Allow DD_TRACE_SPAN_ATTRIBUTE_SCHEMA=v0 users to disable default integration (contrib AKA v0) service names. - // These default service names are always disabled for v1 onwards. - namingschema.SetUseGlobalServiceName(internal.BoolEnv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", false)) + namingschema.LoadFromEnv() + c.spanAttributeSchemaVersion = int(namingschema.GetVersion()) // peer.service tag default calculation is enabled by default if using attribute schema >= 1 c.peerServiceDefaultsEnabled = true @@ -436,26 +521,42 @@ func newConfig(opts ...StartOption) *config { c.peerServiceDefaultsEnabled = internal.BoolEnv("DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED", false) } c.peerServiceMappings = make(map[string]string) - if v := os.Getenv("DD_TRACE_PEER_SERVICE_MAPPING"); v != "" { + if v := env.Get("DD_TRACE_PEER_SERVICE_MAPPING"); v != "" { internal.ForEachStringTag(v, internal.DDTagsDelimiter, func(key, val string) { c.peerServiceMappings[key] = val }) } + c.retryInterval = time.Millisecond + // LLM Observability config + c.llmobs = llmobsconfig.Config{ + Enabled: internal.BoolEnv(envLLMObsEnabled, false), + MLApp: env.Get(envLLMObsMlApp), + AgentlessEnabled: llmobsAgentlessEnabledFromEnv(), + ProjectName: env.Get(envLLMObsProjectName), + } for _, fn := range opts { + if fn == nil { + continue + } fn(c) } if c.agentURL == nil { c.agentURL = internal.AgentURLFromEnv() } - if c.agentURL.Scheme == "unix" { - // If we're connecting over UDS we can just rely on the agent to provide the hostname - log.Debug("connecting to agent over unix, do not set hostname on any traces") - c.httpClient = udsClient(c.agentURL.Path, c.httpClientTimeout) - c.agentURL = &url.URL{ - Scheme: "http", - Host: fmt.Sprintf("UDS_%s", strings.NewReplacer(":", "_", "/", "_", `\`, "_").Replace(c.agentURL.Path)), + c.originalAgentURL = c.agentURL // Preserve the original agent URL for logging + if c.httpClient == nil || orchestrion.Enabled() { + if orchestrion.Enabled() && c.httpClient != nil { + // Make sure we don't create http client traces from inside the tracer by using our http client + // TODO(eliott.bouhana): remove once dd:no-span is implemented + log.Debug("Orchestrion is enabled, but a custom HTTP client was provided to tracer.Start. This is not supported and will be ignored.") + } + if c.agentURL.Scheme == "unix" { + // If we're connecting over UDS we can just rely on the agent to provide the hostname + log.Debug("connecting to agent over unix, do not set hostname on any traces") + c.httpClient = internal.UDSClient(c.agentURL.Path, cmp.Or(c.httpClientTimeout, defaultHTTPTimeout)) + c.agentURL = internal.UnixDataSocketURL(c.agentURL.Path) + } else { + c.httpClient = internal.DefaultHTTPClient(c.httpClientTimeout, false) } - } else if c.httpClient == nil { - c.httpClient = defaultHTTPClient(c.httpClientTimeout) } WithGlobalTag(ext.RuntimeID, globalconfig.RuntimeID())(c) globalTags := c.globalTags.get() @@ -490,17 +591,17 @@ func newConfig(opts ...StartOption) *config { } if c.propagator == nil { envKey := "DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH" - max := internal.IntEnv(envKey, defaultMaxTagsHeaderLen) - if max < 0 { - log.Warn("Invalid value %d for %s. Setting to 0.", max, envKey) - max = 0 + maxLen := internal.IntEnv(envKey, defaultMaxTagsHeaderLen) + if maxLen < 0 { + log.Warn("Invalid value %d for %s. Setting to 0.", maxLen, envKey) + maxLen = 0 } - if max > maxPropagatedTagsLength { - log.Warn("Invalid value %d for %s. Maximum allowed is %d. Setting to %d.", max, envKey, maxPropagatedTagsLength, maxPropagatedTagsLength) - max = maxPropagatedTagsLength + if maxLen > maxPropagatedTagsLength { + log.Warn("Invalid value %d for %s. Maximum allowed is %d. Setting to %d.", maxLen, envKey, maxPropagatedTagsLength, maxPropagatedTagsLength) + maxLen = maxPropagatedTagsLength } c.propagator = NewPropagator(&PropagatorConfig{ - MaxTagsHeaderLen: max, + MaxTagsHeaderLen: maxLen, }) } if c.logger != nil { @@ -509,9 +610,29 @@ func newConfig(opts ...StartOption) *config { if c.debug { log.SetLevel(log.LevelDebug) } - // if using stdout or traces are disabled, agent is disabled - agentDisabled := c.logToStdout || !c.enabled.current + + // Check if CI Visibility mode is enabled + if internal.BoolEnv(constants.CIVisibilityEnabledEnvironmentVariable, false) { + c.ciVisibilityEnabled = true // Enable CI Visibility mode + c.httpClientTimeout = time.Second * 45 // Increase timeout up to 45 seconds (same as other tracers in CIVis mode) + c.logStartup = false // If we are in CI Visibility mode we don't want to log the startup to stdout to avoid polluting the output + ciTransport := newCiVisibilityTransport(c) // Create a default CI Visibility Transport + c.transport = ciTransport // Replace the default transport with the CI Visibility transport + c.ciVisibilityAgentless = ciTransport.agentless + } + + // if using stdout or traces are disabled or we are in ci visibility agentless mode, agent is disabled + agentDisabled := c.logToStdout || !c.enabled.current || c.ciVisibilityAgentless c.agent = loadAgentFeatures(agentDisabled, c.agentURL, c.httpClient) + if c.agent.v1ProtocolAvailable { + c.traceProtocol = traceProtocolV1 + if t, ok := c.transport.(*httpTransport); ok { + t.traceURL = fmt.Sprintf("%s%s", c.agentURL.String(), tracesAPIPathV1) + } + } else { + c.traceProtocol = traceProtocolV04 + } + info, ok := debug.ReadBuildInfo() if !ok { c.loadContribIntegrations([]*debug.Module{}) @@ -520,24 +641,7 @@ func newConfig(opts ...StartOption) *config { } if c.statsdClient == nil { // configure statsd client - addr := c.dogstatsdAddr - if addr == "" { - // no config defined address; use defaults - addr = defaultDogstatsdAddr() - } - if agentport := c.agent.StatsdPort; agentport > 0 { - // the agent reported a non-standard port - host, _, err := net.SplitHostPort(addr) - if err == nil { - // we have a valid host:port address; replace the port because - // the agent knows better - if host == "" { - host = defaultHostname - } - addr = net.JoinHostPort(host, strconv.Itoa(agentport)) - } - // not a valid TCP address, leave it as it is (could be a socket connection) - } + addr := resolveDogstatsdAddr(c) globalconfig.SetDogstatsdAddr(addr) c.dogstatsdAddr = addr } @@ -545,16 +649,87 @@ func newConfig(opts ...StartOption) *config { // This allows persisting the initial value of globalTags for future resets and updates. globalTagsOrigin := c.globalTags.cfgOrigin c.initGlobalTags(c.globalTags.get(), globalTagsOrigin) - - // Check if CI Visibility mode is enabled - if internal.BoolEnv(constants.CIVisibilityEnabledEnvironmentVariable, false) { - c.ciVisibilityEnabled = true // Enable CI Visibility mode - c.httpClientTimeout = time.Second * 45 // Increase timeout up to 45 seconds (same as other tracers in CIVis mode) - c.logStartup = false // If we are in CI Visibility mode we don't want to log the startup to stdout to avoid polluting the output - c.transport = newCiVisibilityTransport(c) // Replace the default transport with the CI Visibility transport + if tracingEnabled, _, _ := stableconfig.Bool("DD_APM_TRACING_ENABLED", true); !tracingEnabled { + apmTracingDisabled(c) } + // Update the llmobs config with stuff needed from the tracer. + c.llmobs.TracerConfig = llmobsconfig.TracerConfig{ + DDTags: c.globalTags.get(), + Env: c.env, + Service: c.serviceName, + Version: c.version, + AgentURL: c.agentURL, + APIKey: env.Get("DD_API_KEY"), + APPKey: env.Get("DD_APP_KEY"), + HTTPClient: c.httpClient, + Site: env.Get("DD_SITE"), + } + c.llmobs.AgentFeatures = llmobsconfig.AgentFeatures{ + EVPProxyV2: c.agent.evpProxyV2, + } + + return c, nil +} - return c +func llmobsAgentlessEnabledFromEnv() *bool { + v, ok := internal.BoolEnvNoDefault(envLLMObsAgentlessEnabled) + if !ok { + return nil + } + return &v +} + +func apmTracingDisabled(c *config) { + // Enable tracing as transport layer mode + // This means to stop sending trace metrics, send one trace per minute and those force-kept by other products + // using the tracer as transport layer for their data. And finally adding the _dd.apm.enabled=0 tag to all traces + // to let the backend know that it needs to keep APM UI disabled. + c.globalSampleRate = 1.0 + c.traceRateLimitPerSecond = 1.0 / 60 + c.tracingAsTransport = true + WithGlobalTag("_dd.apm.enabled", 0)(c) + // Disable runtime metrics. In `tracingAsTransport` mode, we'll still + // tell the agent we computed them, so it doesn't do it either. + c.runtimeMetrics = false + c.runtimeMetricsV2 = false +} + +// resolveDogstatsdAddr resolves the Dogstatsd address to use, based on the user-defined +// address and the agent-reported port. If the agent reports a port, it will be used +// instead of the user-defined address' port. UDS paths are honored regardless of the +// agent-reported port. +func resolveDogstatsdAddr(c *config) string { + addr := c.dogstatsdAddr + if addr == "" { + // no config defined address; use host and port from env vars + // or default to localhost:8125 if not set + addr = defaultDogstatsdAddr() + } + agentport := c.agent.StatsdPort + if agentport == 0 { + // the agent didn't report a port; use the already resolved address as + // features are loaded from the trace-agent, which might be not running + return addr + } + // the agent reported a port + host, _, err := net.SplitHostPort(addr) + if err != nil { + // parsing the address failed; use the already resolved address as is + return addr + } + if host == "unix" { + // no need to change the address because it's a UDS connection + // and these don't have ports + return addr + } + if host == "" { + // no host was provided; use the default hostname + host = defaultHostname + } + // use agent-reported address if it differs from the user-defined TCP-based protocol URI + // we have a valid host:port address; replace the port because the agent knows better + addr = net.JoinHostPort(host, strconv.Itoa(agentport)) + return addr } func newStatsdClient(c *config) (internal.StatsdClient, error) { @@ -564,37 +739,17 @@ func newStatsdClient(c *config) (internal.StatsdClient, error) { return internal.NewStatsdClient(c.dogstatsdAddr, statsTags(c)) } -// udsClient returns a new http.Client which connects using the given UDS socket path. -func udsClient(socketPath string, timeout time.Duration) *http.Client { - if timeout == 0 { - timeout = defaultHTTPTimeout - } - return &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: func(ctx context.Context, network, address string) (net.Conn, error) { - return defaultDialer.DialContext(ctx, "unix", (&net.UnixAddr{ - Name: socketPath, - Net: "unix", - }).String()) - }, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - }, - Timeout: timeout, - } -} - // defaultDogstatsdAddr returns the default connection address for Dogstatsd. func defaultDogstatsdAddr() string { - envHost, envPort := os.Getenv("DD_AGENT_HOST"), os.Getenv("DD_DOGSTATSD_PORT") + envHost, envPort := env.Get("DD_DOGSTATSD_HOST"), env.Get("DD_DOGSTATSD_PORT") + if envHost == "" { + envHost = env.Get("DD_AGENT_HOST") + } if _, err := os.Stat(defaultSocketDSD); err == nil && envHost == "" && envPort == "" { // socket exists and user didn't specify otherwise via env vars return "unix://" + defaultSocketDSD } - host, port := defaultHostname, "8125" + host, port := defaultHostname, defaultStatsdPort if envHost != "" { host = envHost } @@ -628,6 +783,27 @@ type agentFeatures struct { // featureFlags specifies all the feature flags reported by the trace-agent. featureFlags map[string]struct{} + + // peerTags specifies precursor tags to aggregate stats on when client stats is enabled + peerTags []string + + // defaultEnv is the trace-agent's default env, used for stats calculation if no env override is present + defaultEnv string + + // metaStructAvailable reports whether the trace-agent can receive spans with the `meta_struct` field. + metaStructAvailable bool + + // obfuscationVersion reports the trace-agent's version of obfuscation logic. A value of 0 means this field wasn't present. + obfuscationVersion int + + // spanEvents reports whether the trace-agent can receive spans with the `span_events` field. + spanEventsAvailable bool + + // evpProxyV2 reports if the trace-agent can receive payloads on the /evp_proxy/v2 endpoint. + evpProxyV2 bool + + // v1ProtocolAvailable reports whether the trace-agent and tracer are configured to use the v1 protocol. + v1ProtocolAvailable bool } // HasFlag reports whether the agent has set the feat feature flag. @@ -645,7 +821,7 @@ func loadAgentFeatures(agentDisabled bool, agentURL *url.URL, httpClient *http.C } resp, err := httpClient.Get(fmt.Sprintf("%s/info", agentURL)) if err != nil { - log.Error("Loading features: %v", err) + log.Error("Loading features: %s", err.Error()) return } if resp.StatusCode == http.StatusNotFound { @@ -654,22 +830,43 @@ func loadAgentFeatures(agentDisabled bool, agentURL *url.URL, httpClient *http.C } defer resp.Body.Close() type infoResponse struct { - Endpoints []string `json:"endpoints"` - ClientDropP0s bool `json:"client_drop_p0s"` - StatsdPort int `json:"statsd_port"` - FeatureFlags []string `json:"feature_flags"` + Endpoints []string `json:"endpoints"` + ClientDropP0s bool `json:"client_drop_p0s"` + FeatureFlags []string `json:"feature_flags"` + PeerTags []string `json:"peer_tags"` + SpanMetaStruct bool `json:"span_meta_structs"` + ObfuscationVersion int `json:"obfuscation_version"` + SpanEvents bool `json:"span_events"` + Config struct { + StatsdPort int `json:"statsd_port"` + DefaultEnv string `json:"default_env"` + } `json:"config"` } + var info infoResponse if err := json.NewDecoder(resp.Body).Decode(&info); err != nil { - log.Error("Decoding features: %v", err) + log.Error("Decoding features: %s", err.Error()) return } + features.DropP0s = info.ClientDropP0s - features.StatsdPort = info.StatsdPort + features.StatsdPort = info.Config.StatsdPort + features.defaultEnv = info.Config.DefaultEnv + features.metaStructAvailable = info.SpanMetaStruct + features.peerTags = info.PeerTags + features.obfuscationVersion = info.ObfuscationVersion + features.spanEventsAvailable = info.SpanEvents for _, endpoint := range info.Endpoints { switch endpoint { case "/v0.6/stats": features.Stats = true + case "/evp_proxy/v2/": + features.evpProxyV2 = true + case "/v1.0/traces": + // Set the trace protocol to use. + if internal.BoolEnv("DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED", false) { + features.v1ProtocolAvailable = true + } } } features.featureFlags = make(map[string]struct{}, len(info.FeatureFlags)) @@ -746,7 +943,26 @@ func statsTags(c *config) []string { // withNoopStats is used for testing to disable statsd client func withNoopStats() StartOption { return func(c *config) { - c.statsdClient = &statsd.NoOpClient{} + c.statsdClient = &statsd.NoOpClientDirect{} + } +} + +// WithAppSecEnabled specifies whether AppSec features should be activated +// or not. +// +// By default, AppSec features are enabled if `DD_APPSEC_ENABLED` is set to a +// truthy value; and may be enabled by remote configuration if +// `DD_APPSEC_ENABLED` is not set at all. +// +// Using this option to explicitly disable appsec also prevents it from being +// remote activated. +func WithAppSecEnabled(enabled bool) StartOption { + mode := appsecconfig.ForcedOff + if enabled { + mode = appsecconfig.ForcedOn + } + return func(c *config) { + c.appsecStartOptions = append(c.appsecStartOptions, appsecconfig.WithEnablementMode(mode)) } } @@ -761,7 +977,7 @@ func WithFeatureFlags(feats ...string) StartOption { for _, f := range feats { c.featureFlags[strings.TrimSpace(f)] = struct{}{} } - log.Info("FEATURES enabled: %v", feats) + log.Info("FEATURES enabled: %s", feats) } } @@ -769,23 +985,12 @@ func WithFeatureFlags(feats ...string) StartOption { // Diagnostic and startup tracer logs are prefixed to simplify the search within logs. // If JSON logging format is required, it's possible to wrap tracer logs using an existing JSON logger with this // function. To learn more about this possibility, please visit: https://github.com/DataDog/dd-trace-go/issues/2152#issuecomment-1790586933 -func WithLogger(logger ddtrace.Logger) StartOption { +func WithLogger(logger Logger) StartOption { return func(c *config) { c.logger = logger } } -// WithPrioritySampling is deprecated, and priority sampling is enabled by default. -// When using distributed tracing, the priority sampling value is propagated in order to -// get all the parts of a distributed trace sampled. -// To learn more about priority sampling, please visit: -// https://docs.datadoghq.com/tracing/getting_further/trace_sampling_and_storage/#priority-sampling-for-distributed-tracing -func WithPrioritySampling() StartOption { - return func(c *config) { - // This is now enabled by default. - } -} - // WithDebugStack can be used to globally enable or disable the collection of stack traces when // spans finish with errors. It is enabled by default. This is a global version of the NoDebugStack // FinishOption. @@ -798,6 +1003,7 @@ func WithDebugStack(enabled bool) StartOption { // WithDebugMode enables debug mode on the tracer, resulting in more verbose logging. func WithDebugMode(enabled bool) StartOption { return func(c *config) { + telemetry.RegisterAppConfig("trace_debug_enabled", enabled, telemetry.OriginCode) c.debug = enabled } } @@ -820,25 +1026,17 @@ func WithSendRetries(retries int) StartOption { } } -// WithPropagator sets an alternative propagator to be used by the tracer. -func WithPropagator(p Propagator) StartOption { +// WithRetryInterval sets the interval, in seconds, for retrying submitting payloads to the agent. +func WithRetryInterval(interval int) StartOption { return func(c *config) { - c.propagator = p + c.retryInterval = time.Duration(interval) * time.Second } } -// WithServiceName is deprecated. Please use WithService. -// If you are using an older version and you are upgrading from WithServiceName -// to WithService, please note that WithService will determine the service name of -// server and framework integrations. -func WithServiceName(name string) StartOption { +// WithPropagator sets an alternative propagator to be used by the tracer. +func WithPropagator(p Propagator) StartOption { return func(c *config) { - c.serviceName = name - if globalconfig.ServiceName() != "" { - log.Warn("ddtrace/tracer: deprecated config WithServiceName should not be used " + - "with `WithService` or `DD_SERVICE`; integration service name will not be set.") - } - globalconfig.SetServiceName("") + c.propagator = p } } @@ -854,7 +1052,7 @@ func WithService(name string) StartOption { // This is synonymous with `DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED`. func WithGlobalServiceName(enabled bool) StartOption { return func(_ *config) { - namingschema.SetUseGlobalServiceName(enabled) + namingschema.SetRemoveIntegrationServiceNames(enabled) } } @@ -869,6 +1067,39 @@ func WithAgentAddr(addr string) StartOption { } } +// WithAgentURL sets the full trace agent URL +func WithAgentURL(agentURL string) StartOption { + return func(c *config) { + u, err := url.Parse(agentURL) + if err != nil { + var urlErr *url.Error + if errors.As(err, &urlErr) { + u, _ = url.Parse(urlErr.URL) + if u != nil { + urlErr.URL = u.Redacted() + log.Warn("Fail to parse Agent URL: %s", urlErr.Err) + return + } + log.Warn("Fail to parse Agent URL: %s", err.Error()) + return + } + log.Warn("Fail to parse Agent URL") + return + } + switch u.Scheme { + case "http", "https": + c.agentURL = &url.URL{ + Scheme: u.Scheme, + Host: u.Host, + } + case "unix": + c.agentURL = internal.UnixDataSocketURL(u.Path) + default: + log.Warn("Unsupported protocol %q in Agent URL %q. Must be one of: http, https, unix.", u.Scheme, agentURL) + } + } +} + // WithAgentTimeout sets the timeout for the agent connection. Timeout is in seconds. func WithAgentTimeout(timeout int) StartOption { return func(c *config) { @@ -939,19 +1170,19 @@ func (c *config) initGlobalTags(init map[string]interface{}, origin telemetry.Or // WithSampler sets the given sampler to be used with the tracer. By default // an all-permissive sampler is used. +// Deprecated: Use WithSamplerRate instead. Custom sampling will be phased out in a future release. func WithSampler(s Sampler) StartOption { return func(c *config) { - c.sampler = s + c.sampler = &customSampler{s: s} } } -// WithHTTPRoundTripper is deprecated. Please consider using WithHTTPClient instead. -// The function allows customizing the underlying HTTP transport for emitting spans. -func WithHTTPRoundTripper(r http.RoundTripper) StartOption { - return WithHTTPClient(&http.Client{ - Transport: r, - Timeout: defaultHTTPTimeout, - }) +// WithSamplerRate sets the given sampler rate to be used with the tracer. +// The rate must be between 0 and 1. By default an all-permissive sampler rate (1) is used. +func WithSamplerRate(rate float64) StartOption { + return func(c *config) { + c.sampler = NewRateSampler(rate) + } } // WithHTTPClient specifies the HTTP client to use when emitting spans to the agent. @@ -974,7 +1205,7 @@ func WithUDS(socketPath string) StartOption { // WithAnalytics allows specifying whether Trace Search & Analytics should be enabled // for integrations. func WithAnalytics(on bool) StartOption { - return func(cfg *config) { + return func(_ *config) { if on { globalconfig.SetAnalyticsRate(1.0) } else { @@ -997,11 +1228,12 @@ func WithAnalyticsRate(rate float64) StartOption { // WithRuntimeMetrics enables automatic collection of runtime metrics every 10 seconds. func WithRuntimeMetrics() StartOption { return func(cfg *config) { + telemetry.RegisterAppConfig("runtime_metrics_enabled", true, telemetry.OriginCode) cfg.runtimeMetrics = true } } -// WithDogstatsdAddress specifies the address to connect to for sending metrics to the Datadog +// WithDogstatsdAddr specifies the address to connect to for sending metrics to the Datadog // Agent. It should be a "host:port" string, or the path to a unix domain socket.If not set, it // attempts to determine the address of the statsd service according to the following rules: // 1. Look for /var/run/datadog/dsd.socket and use it if present. IF NOT, continue to #2. @@ -1009,7 +1241,7 @@ func WithRuntimeMetrics() StartOption { // 3. The port is retrieved from the agent. If not present, it is determined by DD_DOGSTATSD_PORT, and defaults to 8125 // // This option is in effect when WithRuntimeMetrics is enabled. -func WithDogstatsdAddress(addr string) StartOption { +func WithDogstatsdAddr(addr string) StartOption { return func(cfg *config) { cfg.dogstatsdAddr = addr globalconfig.SetDogstatsdAddr(addr) @@ -1060,7 +1292,8 @@ func WithHostname(name string) StartOption { // WithTraceEnabled allows specifying whether tracing will be enabled func WithTraceEnabled(enabled bool) StartOption { return func(c *config) { - c.enabled = newDynamicConfig("tracing_enabled", enabled, func(b bool) bool { return true }, equal[bool]) + telemetry.RegisterAppConfig("trace_enabled", enabled, telemetry.OriginCode) + c.enabled = newDynamicConfig("tracing_enabled", enabled, func(_ bool) bool { return true }, equal[bool]) } } @@ -1136,23 +1369,9 @@ func WithStatsComputation(enabled bool) StartOption { } } -// WithOrchestrion configures Orchestrion's auto-instrumentation metadata. -// This option is only intended to be used by Orchestrion https://github.com/DataDog/orchestrion -func WithOrchestrion(metadata map[string]string) StartOption { - return func(c *config) { - c.orchestrionCfg.Enabled = true - c.orchestrionCfg.Metadata = metadata - } -} - -// StartSpanOption is a configuration option for StartSpan. It is aliased in order -// to help godoc group all the functions returning it together. It is considered -// more correct to refer to it as the type as the origin, ddtrace.StartSpanOption. -type StartSpanOption = ddtrace.StartSpanOption - // Tag sets the given key/value pair as a tag on the started Span. func Tag(k string, v interface{}) StartSpanOption { - return func(cfg *ddtrace.StartSpanConfig) { + return func(cfg *StartSpanConfig) { if cfg.Tags == nil { cfg.Tags = map[string]interface{}{} } @@ -1178,8 +1397,8 @@ func SpanType(name string) StartSpanOption { } // WithSpanLinks sets span links on the started span. -func WithSpanLinks(links []ddtrace.SpanLink) StartSpanOption { - return func(cfg *ddtrace.StartSpanConfig) { +func WithSpanLinks(links []SpanLink) StartSpanOption { + return func(cfg *StartSpanConfig) { cfg.SpanLinks = append(cfg.SpanLinks, links...) } } @@ -1196,22 +1415,23 @@ func Measured() StartSpanOption { // If there is no parent Span (eg from ChildOf), then the TraceID will also be set to the // value given here. func WithSpanID(id uint64) StartSpanOption { - return func(cfg *ddtrace.StartSpanConfig) { + return func(cfg *StartSpanConfig) { cfg.SpanID = id } } -// ChildOf tells StartSpan to use the given span context as a parent for the -// created span. -func ChildOf(ctx ddtrace.SpanContext) StartSpanOption { - return func(cfg *ddtrace.StartSpanConfig) { +// ChildOf tells StartSpan to use the given span context as a parent for the created span. +// +// Deprecated: Use [Span.StartChild] instead. +func ChildOf(ctx *SpanContext) StartSpanOption { + return func(cfg *StartSpanConfig) { cfg.Parent = ctx } } // withContext associates the ctx with the span. func withContext(ctx context.Context) StartSpanOption { - return func(cfg *ddtrace.StartSpanConfig) { + return func(cfg *StartSpanConfig) { cfg.Context = ctx } } @@ -1219,7 +1439,7 @@ func withContext(ctx context.Context) StartSpanOption { // StartTime sets a custom time as the start time for the created span. By // default a span is started using the creation time. func StartTime(t time.Time) StartSpanOption { - return func(cfg *ddtrace.StartSpanConfig) { + return func(cfg *StartSpanConfig) { cfg.StartTime = t } } @@ -1229,62 +1449,177 @@ func StartTime(t time.Time) StartSpanOption { // float64 between 0 and 1 where 0.5 would represent 50% of events. func AnalyticsRate(rate float64) StartSpanOption { if math.IsNaN(rate) { - return func(cfg *ddtrace.StartSpanConfig) {} + return func(_ *StartSpanConfig) {} } return Tag(ext.EventSampleRate, rate) } -// FinishOption is a configuration option for FinishSpan. It is aliased in order -// to help godoc group all the functions returning it together. It is considered -// more correct to refer to it as the type as the origin, ddtrace.FinishOption. -type FinishOption = ddtrace.FinishOption +// WithStartSpanConfig merges the given StartSpanConfig into the one used to start the span. +// It is useful when you want to set a common base config, reducing the number of function calls in hot loops. +func WithStartSpanConfig(cfg *StartSpanConfig) StartSpanOption { + return func(c *StartSpanConfig) { + // copy cfg into c only if cfg fields are not zero values + // c fields have precedence, as they may have been set up before running this option + if c.SpanID == 0 { + c.SpanID = cfg.SpanID + } + if c.Parent == nil { + c.Parent = cfg.Parent + } + if c.Context == nil { + c.Context = cfg.Context + } + if c.SpanLinks == nil { + c.SpanLinks = cfg.SpanLinks + } + if c.StartTime.IsZero() { + c.StartTime = cfg.StartTime + } + // tags are a special case, as we need to merge them + if c.Tags == nil { + // if cfg.Tags is nil, this is a no-op + c.Tags = cfg.Tags + } else if cfg.Tags != nil { + for k, v := range cfg.Tags { + c.Tags[k] = v + } + } + } +} -// FinishTime sets the given time as the finishing time for the span. By default, -// the current time is used. -func FinishTime(t time.Time) FinishOption { - return func(cfg *ddtrace.FinishConfig) { - cfg.FinishTime = t +// WithHeaderTags enables the integration to attach HTTP request headers as span tags. +// Warning: +// Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. +// Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. +func WithHeaderTags(headerAsTags []string) StartOption { + return func(c *config) { + c.headerAsTags = newDynamicConfig("trace_header_tags", headerAsTags, setHeaderTags, equalSlice[string]) + setHeaderTags(headerAsTags) } } -// WithError marks the span as having had an error. It uses the information from -// err to set tags such as the error message, error type and stack trace. It has -// no effect if the error is nil. -func WithError(err error) FinishOption { - return func(cfg *ddtrace.FinishConfig) { - cfg.Error = err +// WithTestDefaults configures the tracer to not send spans to the agent, and to not collect metrics. +// Warning: +// This option should only be used in tests, as it will prevent the tracer from sending spans to the agent. +func WithTestDefaults(statsdClient any) StartOption { + return func(c *config) { + if statsdClient == nil { + statsdClient = &statsd.NoOpClientDirect{} + } + c.statsdClient = statsdClient.(internal.StatsdClient) + c.transport = newDummyTransport() } } -// NoDebugStack prevents any error presented using the WithError finishing option -// from generating a stack trace. This is useful in situations where errors are frequent -// and performance is critical. -func NoDebugStack() FinishOption { - return func(cfg *ddtrace.FinishConfig) { - cfg.NoDebugStack = true +// WithLLMObsEnabled allows to enable LLM Observability (it is disabled by default). +// This is equivalent to the DD_LLMOBS_ENABLED environment variable. +func WithLLMObsEnabled(enabled bool) StartOption { + return func(c *config) { + c.llmobs.Enabled = enabled } } -// StackFrames limits the number of stack frames included into erroneous spans to n, starting from skip. -func StackFrames(n, skip uint) FinishOption { - if n == 0 { - return NoDebugStack() +// WithLLMObsMLApp allows to configure the default ML App for LLM Observability. +// It is required to have this configured to use any LLM Observability features. +// This is equivalent to the DD_LLMOBS_ML_APP environment variable. +func WithLLMObsMLApp(mlApp string) StartOption { + return func(c *config) { + c.llmobs.MLApp = mlApp } - return func(cfg *ddtrace.FinishConfig) { - cfg.StackFrames = n - cfg.SkipStackFrames = skip +} + +// WithLLMObsProjectName allows to configure the default LLM Observability project to use. +// It is required when using the Experiments and Datasets feature. +// This is equivalent to the DD_LLMOBS_PROJECT_NAME environment variable. +func WithLLMObsProjectName(projectName string) StartOption { + return func(c *config) { + c.llmobs.ProjectName = projectName } } -// WithHeaderTags enables the integration to attach HTTP request headers as span tags. -// Warning: -// Using this feature can risk exposing sensitive data such as authorization tokens to Datadog. -// Special headers can not be sub-selected. E.g., an entire Cookie header would be transmitted, without the ability to choose specific Cookies. -func WithHeaderTags(headerAsTags []string) StartOption { +// WithLLMObsAgentlessEnabled allows to configure LLM Observability to work in agent/agentless mode. +// The default is using the agent if it is available and supports it, otherwise it will default to agentless mode. +// Please note when using agentless mode, a valid DD_API_KEY must also be set. +// This is equivalent to the DD_LLMOBS_AGENTLESS_ENABLED environment variable. +func WithLLMObsAgentlessEnabled(agentlessEnabled bool) StartOption { return func(c *config) { - c.headerAsTags = newDynamicConfig("trace_header_tags", headerAsTags, setHeaderTags, equalSlice[string]) - setHeaderTags(headerAsTags) + c.llmobs.AgentlessEnabled = &agentlessEnabled + } +} + +// Mock Transport with a real Encoder +type dummyTransport struct { + sync.RWMutex + traces spanLists + stats []*pb.ClientStatsPayload + obfVersion int +} + +func newDummyTransport() *dummyTransport { + return &dummyTransport{traces: spanLists{}, obfVersion: -1} +} + +func (t *dummyTransport) Len() int { + t.RLock() + defer t.RUnlock() + return len(t.traces) +} + +func (t *dummyTransport) sendStats(p *pb.ClientStatsPayload, obfVersion int) error { + t.Lock() + t.stats = append(t.stats, p) + t.obfVersion = obfVersion + t.Unlock() + return nil +} + +func (t *dummyTransport) Stats() []*pb.ClientStatsPayload { + t.RLock() + defer t.RUnlock() + return t.stats +} + +func (t *dummyTransport) ObfuscationVersion() int { + t.RLock() + defer t.RUnlock() + return t.obfVersion +} + +func (t *dummyTransport) send(p payload) (io.ReadCloser, error) { + traces, err := decode(p) + if err != nil { + return nil, err } + t.Lock() + t.traces = append(t.traces, traces...) + t.Unlock() + ok := io.NopCloser(strings.NewReader("OK")) + return ok, nil +} + +func (t *dummyTransport) endpoint() string { + return "http://localhost:9/v0.4/traces" +} + +func decode(p payloadReader) (spanLists, error) { + var traces spanLists + err := msgp.Decode(p, &traces) + return traces, err +} + +func (t *dummyTransport) Reset() { + t.Lock() + t.traces = t.traces[:0] + t.Unlock() +} + +func (t *dummyTransport) Traces() spanLists { + t.Lock() + defer t.Unlock() + + traces := t.traces + t.traces = spanLists{} + return traces } // setHeaderTags sets the global header tags. @@ -1294,7 +1629,7 @@ func setHeaderTags(headerAsTags []string) bool { for _, h := range headerAsTags { header, tag := normalizer.HeaderTag(h) if len(header) == 0 || len(tag) == 0 { - log.Debug("Header-tag input is in unsupported format; dropping input value %v", h) + log.Debug("Header-tag input is in unsupported format; dropping input value %q", h) continue } globalconfig.SetHeaderTag(header, tag) @@ -1306,6 +1641,8 @@ func setHeaderTags(headerAsTags []string) bool { // This configuration can be set by combining one or several UserMonitoringOption with a call to SetUser(). type UserMonitoringConfig struct { PropagateID bool + Login string + Org string Email string Name string Role string @@ -1325,6 +1662,20 @@ func WithUserMetadata(key, value string) UserMonitoringOption { } } +// WithUserLogin returns the option setting the login of the authenticated user. +func WithUserLogin(login string) UserMonitoringOption { + return func(cfg *UserMonitoringConfig) { + cfg.Login = login + } +} + +// WithUserOrg returns the option setting the organization of the authenticated user. +func WithUserOrg(org string) UserMonitoringOption { + return func(cfg *UserMonitoringConfig) { + cfg.Org = org + } +} + // WithUserEmail returns the option setting the email of the authenticated user. func WithUserEmail(email string) UserMonitoringOption { return func(cfg *UserMonitoringConfig) { diff --git a/ddtrace/tracer/option_test.go b/ddtrace/tracer/option_test.go index 34ebc0a846..3fa9c94dd4 100644 --- a/ddtrace/tracer/option_test.go +++ b/ddtrace/tracer/option_test.go @@ -6,17 +6,16 @@ package tracer import ( - "encoding/json" + "context" + "errors" "fmt" "io" - "io/ioutil" "math" "net" "net/http" "net/http/httptest" "net/url" "os" - "os/exec" "path/filepath" "reflect" "runtime" @@ -25,15 +24,13 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -66,8 +63,15 @@ func testStatsd(t *testing.T, cfg *config, addr string) { func TestStatsdUDPConnect(t *testing.T) { t.Setenv("DD_DOGSTATSD_PORT", "8111") - testStatsd(t, newConfig(), net.JoinHostPort(defaultHostname, "8111")) - cfg := newConfig() + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + // We simulate the agent not being able to provide the statsd port + w.WriteHeader(http.StatusInternalServerError) + })) + defer srv.Close() + + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://"))) + require.NoError(t, err) + testStatsd(t, cfg, net.JoinHostPort(defaultHostname, "8111")) addr := net.JoinHostPort(defaultHostname, "8111") client, err := newStatsdClient(cfg) @@ -102,7 +106,10 @@ func TestStatsdUDPConnect(t *testing.T) { func TestAutoDetectStatsd(t *testing.T) { t.Run("default", func(t *testing.T) { - testStatsd(t, newConfig(WithAgentTimeout(2)), net.JoinHostPort(defaultHostname, "8125")) + cfg, err := newTestConfig(WithAgentTimeout(2)) + require.NoError(t, err) + + testStatsd(t, cfg, net.JoinHostPort(defaultHostname, "8125")) }) t.Run("socket", func(t *testing.T) { @@ -112,7 +119,7 @@ func TestAutoDetectStatsd(t *testing.T) { if testing.Short() { return } - dir, err := ioutil.TempDir("", "socket") + dir, err := os.MkdirTemp("", "socket") if err != nil { t.Fatal(err) } @@ -132,7 +139,8 @@ func TestAutoDetectStatsd(t *testing.T) { defer conn.Close() conn.SetDeadline(time.Now().Add(5 * time.Second)) - cfg := newConfig(WithAgentTimeout(2)) + cfg, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() @@ -140,6 +148,7 @@ func TestAutoDetectStatsd(t *testing.T) { // Ensure globalconfig also gets the auto-detected UDS address require.Equal(t, "unix://"+addr, globalconfig.DogstatsdAddr()) statsd.Count("name", 1, []string{"tag"}, 1) + statsd.Flush() buf := make([]byte, 17) n, err := conn.Read(buf) @@ -151,25 +160,35 @@ func TestAutoDetectStatsd(t *testing.T) { t.Run("env", func(t *testing.T) { t.Setenv("DD_DOGSTATSD_PORT", "8111") - testStatsd(t, newConfig(), net.JoinHostPort(defaultHostname, "8111")) + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + // We simulate the agent not being able to provide the statsd port + w.WriteHeader(http.StatusInternalServerError) + })) + defer srv.Close() + + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://"))) + assert.NoError(t, err) + testStatsd(t, cfg, net.JoinHostPort(defaultHostname, "8111")) }) t.Run("agent", func(t *testing.T) { t.Run("default", func(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.Write([]byte(`{"statsd_port":0}`)) + w.Write([]byte(`{"endpoints": [], "config": {"statsd_port":0}}`)) })) defer srv.Close() - cfg := newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + assert.NoError(t, err) testStatsd(t, cfg, net.JoinHostPort(defaultHostname, "8125")) }) t.Run("port", func(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.Write([]byte(`{"statsd_port":8999}`)) + w.Write([]byte(`{"endpoints": [], "config": {"statsd_port":8999}}`)) })) defer srv.Close() - cfg := newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://"))) + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://"))) + assert.NoError(t, err) testStatsd(t, cfg, net.JoinHostPort(defaultHostname, "8999")) }) }) @@ -178,18 +197,15 @@ func TestAutoDetectStatsd(t *testing.T) { func TestLoadAgentFeatures(t *testing.T) { t.Run("zero", func(t *testing.T) { t.Run("disabled", func(t *testing.T) { - assert.Zero(t, newConfig(WithLambdaMode(true), WithAgentTimeout(2)).agent) + cfg, err := newTestConfig(WithLambdaMode(true), WithAgentTimeout(2)) + assert.NoError(t, err) + assert.Zero(t, cfg.agent) }) t.Run("unreachable", func(t *testing.T) { - if testing.Short() { - return - } - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.WriteHeader(http.StatusInternalServerError) - })) - defer srv.Close() - assert.Zero(t, newConfig(WithAgentAddr("127.9.9.9:8181"), WithAgentTimeout(2)).agent) + cfg, err := newTestConfig(WithAgentAddr("127.0.0.1:0")) + assert.NoError(t, err) + assert.Zero(t, cfg.agent) }) t.Run("StatusNotFound", func(t *testing.T) { @@ -197,7 +213,9 @@ func TestLoadAgentFeatures(t *testing.T) { w.WriteHeader(http.StatusNotFound) })) defer srv.Close() - assert.Zero(t, newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)).agent) + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + require.NoError(t, err) + assert.Zero(t, cfg.agent) }) t.Run("error", func(t *testing.T) { @@ -205,16 +223,19 @@ func TestLoadAgentFeatures(t *testing.T) { w.Write([]byte("Not JSON")) })) defer srv.Close() - assert.Zero(t, newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)).agent) + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + require.NoError(t, err) + assert.Zero(t, cfg.agent) }) }) t.Run("OK", func(t *testing.T) { srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.Write([]byte(`{"endpoints":["/v0.6/stats"],"feature_flags":["a","b"],"client_drop_p0s":true,"statsd_port":8999}`)) + w.Write([]byte(`{"endpoints":["/v0.6/stats"],"feature_flags":["a","b"],"client_drop_p0s":true,"obfuscation_version":2,"peer_tags":["peer.hostname"],"config": {"statsd_port":8999}}`)) })) defer srv.Close() - cfg := newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + assert.NoError(t, err) assert.True(t, cfg.agent.DropP0s) assert.Equal(t, cfg.agent.StatsdPort, 8999) assert.EqualValues(t, cfg.agent.featureFlags, map[string]struct{}{ @@ -224,15 +245,28 @@ func TestLoadAgentFeatures(t *testing.T) { assert.True(t, cfg.agent.Stats) assert.True(t, cfg.agent.HasFlag("a")) assert.True(t, cfg.agent.HasFlag("b")) + assert.EqualValues(t, cfg.agent.peerTags, []string{"peer.hostname"}) + assert.Equal(t, 2, cfg.agent.obfuscationVersion) + }) + + t.Run("default_env", func(t *testing.T) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Write([]byte(`{"endpoints":["/v0.6/stats"],"client_drop_p0s":true,"config": {"statsd_port":8125,"default_env":"prod"}}`)) + })) + defer srv.Close() + cfg, err := newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + assert.NoError(t, err) + assert.Equal(t, "prod", cfg.agent.defaultEnv) }) t.Run("discovery", func(t *testing.T) { t.Setenv("DD_TRACE_FEATURES", "discovery") srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { - w.Write([]byte(`{"endpoints":["/v0.6/stats"],"client_drop_p0s":true,"statsd_port":8999}`)) + w.Write([]byte(`{"endpoints":["/v0.6/stats"],"client_drop_p0s":true,"config":{"statsd_port":8999}}`)) })) defer srv.Close() - cfg := newConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + cfg, err := newTestConfig(WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), WithAgentTimeout(2)) + assert.NoError(t, err) assert.True(t, cfg.agent.DropP0s) assert.True(t, cfg.agent.Stats) assert.Equal(t, 8999, cfg.agent.StatsdPort) @@ -254,11 +288,12 @@ func TestAgentIntegration(t *testing.T) { // this test is run before configuring integrations and after: ensures we clean up global state defaultUninstrumentedTest := func(t *testing.T) { - cfg := newConfig() + cfg, err := newTestConfig() + assert.Nil(t, err) defer clearIntegrationsForTests() cfg.loadContribIntegrations(nil) - assert.Equal(t, 56, len(cfg.integrations)) + assert.Equal(t, 54, len(cfg.integrations)) for integrationName, v := range cfg.integrations { assert.False(t, v.Instrumented, "integrationName=%s", integrationName) } @@ -266,7 +301,8 @@ func TestAgentIntegration(t *testing.T) { t.Run("default_before", defaultUninstrumentedTest) t.Run("OK import", func(t *testing.T) { - cfg := newConfig() + cfg, err := newTestConfig() + assert.Nil(t, err) defer clearIntegrationsForTests() ok := MarkIntegrationImported("github.com/go-chi/chi") @@ -276,7 +312,8 @@ func TestAgentIntegration(t *testing.T) { }) t.Run("available", func(t *testing.T) { - cfg := newConfig() + cfg, err := newTestConfig() + assert.Nil(t, err) defer clearIntegrationsForTests() d := debug.Module{ @@ -291,7 +328,8 @@ func TestAgentIntegration(t *testing.T) { }) t.Run("grpc", func(t *testing.T) { - cfg := newConfig() + cfg, err := newTestConfig() + assert.Nil(t, err) defer clearIntegrationsForTests() d := debug.Module{ @@ -309,43 +347,13 @@ func TestAgentIntegration(t *testing.T) { t.Run("default_after", defaultUninstrumentedTest) } -type contribPkg struct { - Dir string - Root string - ImportPath string - Name string -} - -func TestIntegrationEnabled(t *testing.T) { - body, err := exec.Command("go", "list", "-json", "../../contrib/...").Output() - require.NoError(t, err, "go list command failed") - var packages []contribPkg - stream := json.NewDecoder(strings.NewReader(string(body))) - for stream.More() { - var out contribPkg - err := stream.Decode(&out) - if err != nil { - t.Fatalf(err.Error()) - } - packages = append(packages, out) - } - for _, pkg := range packages { - if strings.Contains(pkg.ImportPath, "/test") || strings.Contains(pkg.ImportPath, "/internal") { - continue - } - p := strings.Replace(pkg.Dir, pkg.Root, "../..", 1) - body, err := exec.Command("grep", "-rl", "MarkIntegrationImported", p).Output() - require.NoError(t, err, "grep command failed") - assert.NotEqual(t, len(body), 0, "expected %s to call MarkIntegrationImported", pkg.Name) - } -} - func compareHTTPClients(t *testing.T, x, y http.Client) { assert.Equal(t, x.Transport.(*http.Transport).MaxIdleConns, y.Transport.(*http.Transport).MaxIdleConns) assert.Equal(t, x.Transport.(*http.Transport).IdleConnTimeout, y.Transport.(*http.Transport).IdleConnTimeout) assert.Equal(t, x.Transport.(*http.Transport).TLSHandshakeTimeout, y.Transport.(*http.Transport).TLSHandshakeTimeout) assert.Equal(t, x.Transport.(*http.Transport).ExpectContinueTimeout, y.Transport.(*http.Transport).ExpectContinueTimeout) } + func getFuncName(f any) string { return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name() } @@ -353,27 +361,29 @@ func getFuncName(f any) string { func TestTracerOptionsDefaults(t *testing.T) { t.Run("defaults", func(t *testing.T) { assert := assert.New(t) - c := newConfig() - assert.Equal(float64(1), c.sampler.(RateSampler).Rate()) + c, err := newTestConfig() + assert.NoError(err) + assert.Equal(float64(1), c.sampler.Rate()) assert.Regexp(`tracer\.test(\.exe)?`, c.serviceName) assert.Equal(&url.URL{Scheme: "http", Host: "localhost:8126"}, c.agentURL) assert.Equal("localhost:8125", c.dogstatsdAddr) assert.Nil(nil, c.httpClient) x := *c.httpClient - y := *defaultHTTPClient(0) + y := *internal.DefaultHTTPClient(defaultHTTPTimeout, false) assert.Equal(10*time.Second, x.Timeout) assert.Equal(x.Timeout, y.Timeout) compareHTTPClients(t, x, y) - assert.True(getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(defaultDialer.DialContext)) + assert.True(getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(internal.DefaultDialer(30*time.Second).DialContext)) assert.False(c.debug) }) t.Run("http-client", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) x := *c.httpClient - y := *defaultHTTPClient(2 * time.Second) + y := *internal.DefaultHTTPClient(2*time.Second, false) compareHTTPClients(t, x, y) - assert.True(t, getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(defaultDialer.DialContext)) + assert.True(t, getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(internal.DefaultDialer(30*time.Second).DialContext)) client := &http.Client{} WithHTTPClient(client)(c) assert.Equal(t, client, c.httpClient) @@ -384,124 +394,204 @@ func TestTracerOptionsDefaults(t *testing.T) { defer globalconfig.SetAnalyticsRate(math.NaN()) assert := assert.New(t) assert.True(math.IsNaN(globalconfig.AnalyticsRate())) - tracer := newTracer(WithAnalyticsRate(0.5)) + tracer, err := newTracer(WithAnalyticsRate(0.5)) defer tracer.Stop() + assert.NoError(err) assert.Equal(0.5, globalconfig.AnalyticsRate()) - tracer = newTracer(WithAnalytics(false)) + tracer, err = newTracer(WithAnalytics(false)) + assert.NoError(err) defer tracer.Stop() assert.True(math.IsNaN(globalconfig.AnalyticsRate())) - tracer = newTracer(WithAnalytics(true)) + tracer, err = newTracer(WithAnalytics(true)) defer tracer.Stop() + assert.NoError(err) assert.Equal(1., globalconfig.AnalyticsRate()) }) t.Run("env/on", func(t *testing.T) { t.Setenv("DD_TRACE_ANALYTICS_ENABLED", "true") defer globalconfig.SetAnalyticsRate(math.NaN()) - newConfig() + newTestConfig() assert.Equal(t, 1.0, globalconfig.AnalyticsRate()) }) t.Run("env/off", func(t *testing.T) { t.Setenv("DD_TRACE_ANALYTICS_ENABLED", "kj12") defer globalconfig.SetAnalyticsRate(math.NaN()) - newConfig() + newTestConfig() assert.True(t, math.IsNaN(globalconfig.AnalyticsRate())) }) }) t.Run("debug", func(t *testing.T) { t.Run("option", func(t *testing.T) { - tracer := newTracer(WithDebugMode(true)) + tracer, err := newTracer(WithDebugMode(true)) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config assert.True(t, c.debug) }) t.Run("env", func(t *testing.T) { t.Setenv("DD_TRACE_DEBUG", "true") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.debug) }) t.Run("otel-env-debug", func(t *testing.T) { t.Setenv("OTEL_LOG_LEVEL", "debug") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.debug) }) t.Run("otel-env-notdebug", func(t *testing.T) { // any value other than debug, does nothing t.Setenv("OTEL_LOG_LEVEL", "notdebug") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.False(t, c.debug) }) t.Run("override-chain", func(t *testing.T) { assert := assert.New(t) // option override otel t.Setenv("OTEL_LOG_LEVEL", "debug") - c := newConfig(WithDebugMode(false)) + c, err := newTestConfig(WithDebugMode(false)) + assert.NoError(err) assert.False(c.debug) // env override otel t.Setenv("DD_TRACE_DEBUG", "false") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.False(c.debug) // option override env - c = newConfig(WithDebugMode(true)) + c, err = newTestConfig(WithDebugMode(true)) + assert.NoError(err) assert.True(c.debug) }) }) t.Run("dogstatsd", func(t *testing.T) { + // Simulate the agent (assuming no concurrency at all) + var fail bool + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + if fail { + w.WriteHeader(http.StatusInternalServerError) + return + } + w.Write([]byte(`{"endpoints":["/v0.6/stats"],"feature_flags":["a","b"],"client_drop_p0s":true,"config": {"statsd_port":8125}}`)) + })) + defer srv.Close() + + opts := []StartOption{ + WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), + } + t.Run("default", func(t *testing.T) { - tracer := newTracer(WithAgentTimeout(2)) + tracer, err := newTracer(opts...) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, c.dogstatsdAddr, "localhost:8125") - assert.Equal(t, globalconfig.DogstatsdAddr(), "localhost:8125") + assert.Equal(t, "localhost:8125", c.dogstatsdAddr) + assert.Equal(t, "localhost:8125", globalconfig.DogstatsdAddr()) }) - t.Run("env-host", func(t *testing.T) { - t.Setenv("DD_AGENT_HOST", "my-host") - tracer := newTracer(WithAgentTimeout(2)) + t.Run("env-agent_host", func(t *testing.T) { + t.Setenv("DD_AGENT_HOST", "localhost") + tracer, err := newTracer(opts...) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, c.dogstatsdAddr, "my-host:8125") - assert.Equal(t, globalconfig.DogstatsdAddr(), "my-host:8125") + assert.Equal(t, "localhost:8125", c.dogstatsdAddr) + assert.Equal(t, "localhost:8125", globalconfig.DogstatsdAddr()) + }) + + t.Run("env-dogstatsd_host", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_HOST", "localhost") + tracer, err := newTracer(opts...) + assert.NoError(t, err) + defer tracer.Stop() + c := tracer.config + assert.Equal(t, "localhost:8125", c.dogstatsdAddr) + assert.Equal(t, "localhost:8125", globalconfig.DogstatsdAddr()) }) t.Run("env-port", func(t *testing.T) { t.Setenv("DD_DOGSTATSD_PORT", "123") - tracer := newTracer(WithAgentTimeout(2)) + tracer, err := newTracer(opts...) + defer tracer.Stop() + assert.NoError(t, err) + c := tracer.config + assert.Equal(t, "localhost:8125", c.dogstatsdAddr) + assert.Equal(t, "localhost:8125", globalconfig.DogstatsdAddr()) + }) + + t.Run("env-port: agent not available", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_PORT", "123") + fail = true + tracer, err := newTracer(opts...) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, c.dogstatsdAddr, "localhost:123") - assert.Equal(t, globalconfig.DogstatsdAddr(), "localhost:123") + assert.Equal(t, "localhost:123", c.dogstatsdAddr) + assert.Equal(t, "localhost:123", globalconfig.DogstatsdAddr()) + fail = false }) - t.Run("env-both", func(t *testing.T) { - t.Setenv("DD_AGENT_HOST", "my-host") + t.Run("env-all", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_HOST", "localhost") t.Setenv("DD_DOGSTATSD_PORT", "123") - tracer := newTracer(WithAgentTimeout(2)) + t.Setenv("DD_AGENT_HOST", "other-host") + tracer, err := newTracer(opts...) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, c.dogstatsdAddr, "my-host:123") - assert.Equal(t, globalconfig.DogstatsdAddr(), "my-host:123") + assert.Equal(t, "localhost:8125", c.dogstatsdAddr) + assert.Equal(t, "localhost:8125", globalconfig.DogstatsdAddr()) }) - t.Run("env-env", func(t *testing.T) { - t.Setenv("DD_ENV", "testEnv") - tracer := newTracer(WithAgentTimeout(2)) + t.Run("env-all: agent not available", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_HOST", "localhost") + t.Setenv("DD_DOGSTATSD_PORT", "123") + t.Setenv("DD_AGENT_HOST", "other-host") + fail = true + tracer, err := newTracer(opts...) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, "testEnv", c.env) + assert.Equal(t, "localhost:123", c.dogstatsdAddr) + assert.Equal(t, "localhost:123", globalconfig.DogstatsdAddr()) + fail = false }) t.Run("option", func(t *testing.T) { - tracer := newTracer(WithDogstatsdAddress("10.1.0.12:4002")) + o := make([]StartOption, len(opts)) + copy(o, opts) + o = append(o, WithDogstatsdAddr("10.1.0.12:4002")) + tracer, err := newTracer(o...) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, c.dogstatsdAddr, "10.1.0.12:4002") - assert.Equal(t, globalconfig.DogstatsdAddr(), "10.1.0.12:4002") + assert.Equal(t, "10.1.0.12:8125", c.dogstatsdAddr) + assert.Equal(t, "10.1.0.12:8125", globalconfig.DogstatsdAddr()) }) + + t.Run("option: agent not available", func(t *testing.T) { + o := make([]StartOption, len(opts)) + copy(o, opts) + fail = true + o = append(o, WithDogstatsdAddr("10.1.0.12:4002")) + tracer, err := newTracer(o...) + assert.NoError(t, err) + defer tracer.Stop() + c := tracer.config + assert.Equal(t, "10.1.0.12:4002", c.dogstatsdAddr) + assert.Equal(t, "10.1.0.12:4002", globalconfig.DogstatsdAddr()) + fail = false + }) + t.Run("uds", func(t *testing.T) { + if strings.HasPrefix(runtime.GOOS, "windows") { + t.Skip("Unix only") + } assert := assert.New(t) dir, err := os.MkdirTemp("", "socket") if err != nil { @@ -509,7 +599,8 @@ func TestTracerOptionsDefaults(t *testing.T) { } addr := filepath.Join(dir, "dsd.socket") defer os.RemoveAll(addr) - tracer := newTracer(WithDogstatsdAddress("unix://" + addr)) + tracer, err := newTracer(WithDogstatsdAddr("unix://" + addr)) + assert.NoError(err) defer tracer.Stop() c := tracer.config assert.Equal("unix://"+addr, c.dogstatsdAddr) @@ -517,39 +608,85 @@ func TestTracerOptionsDefaults(t *testing.T) { }) }) + t.Run("env-env", func(t *testing.T) { + t.Setenv("DD_ENV", "testEnv") + tracer, err := newTracer(WithAgentTimeout(2)) + assert.NoError(t, err) + defer tracer.Stop() + c := tracer.config + assert.Equal(t, "testEnv", c.env) + }) + t.Run("env-agentAddr", func(t *testing.T) { - t.Setenv("DD_AGENT_HOST", "trace-agent") - tracer := newTracer(WithAgentTimeout(2)) + t.Setenv("DD_AGENT_HOST", "localhost") + tracer, err := newTracer(WithAgentTimeout(2)) + assert.NoError(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, &url.URL{Scheme: "http", Host: "trace-agent:8126"}, c.agentURL) + assert.Equal(t, &url.URL{Scheme: "http", Host: "localhost:8126"}, c.agentURL) }) t.Run("env-agentURL", func(t *testing.T) { t.Run("env", func(t *testing.T) { - t.Setenv("DD_TRACE_AGENT_URL", "https://custom:1234/") - tracer := newTracer(WithAgentTimeout(2)) + t.Setenv("DD_TRACE_AGENT_URL", "https://127.0.0.1:1234/") + tracer, err := newTracer(WithAgentTimeout(2)) defer tracer.Stop() + assert.NoError(t, err) c := tracer.config - assert.Equal(t, &url.URL{Scheme: "https", Host: "custom:1234"}, c.agentURL) + assert.Equal(t, &url.URL{Scheme: "https", Host: "127.0.0.1:1234"}, c.agentURL) }) t.Run("override-env", func(t *testing.T) { - t.Setenv("DD_AGENT_HOST", "testhost") + t.Setenv("DD_AGENT_HOST", "localhost") t.Setenv("DD_TRACE_AGENT_PORT", "3333") - t.Setenv("DD_TRACE_AGENT_URL", "https://custom:1234/") - tracer := newTracer(WithAgentTimeout(2)) + t.Setenv("DD_TRACE_AGENT_URL", "https://127.0.0.1:1234/") + tracer, err := newTracer(WithAgentTimeout(2)) defer tracer.Stop() + assert.NoError(t, err) c := tracer.config - assert.Equal(t, &url.URL{Scheme: "https", Host: "custom:1234"}, c.agentURL) + assert.Equal(t, &url.URL{Scheme: "https", Host: "127.0.0.1:1234"}, c.agentURL) }) t.Run("code-override", func(t *testing.T) { - t.Setenv("DD_TRACE_AGENT_URL", "https://custom:1234/") - tracer := newTracer(WithAgentAddr("testhost:3333")) + t.Setenv("DD_TRACE_AGENT_URL", "https://127.0.0.1:1234/") + tracer, err := newTracer(WithAgentAddr("localhost:3333")) + defer tracer.Stop() + assert.NoError(t, err) + c := tracer.config + assert.Equal(t, &url.URL{Scheme: "http", Host: "localhost:3333"}, c.agentURL) + }) + + t.Run("code-override-full-URL", func(t *testing.T) { + t.Setenv("DD_TRACE_AGENT_URL", "https://127.0.0.1:1234/") + tracer, err := newTracer(WithAgentURL("http://localhost:3333/")) + assert.Nil(t, err) defer tracer.Stop() c := tracer.config - assert.Equal(t, &url.URL{Scheme: "http", Host: "testhost:3333"}, c.agentURL) + assert.Equal(t, &url.URL{Scheme: "http", Host: "localhost:3333"}, c.agentURL) + }) + + t.Run("code-full-UDS", func(t *testing.T) { + tracer, err := newTracer(WithAgentURL("unix:///var/run/datadog/apm.socket")) + assert.Nil(t, err) + defer tracer.Stop() + c := tracer.config + assert.Equal(t, &url.URL{Scheme: "http", Host: "UDS__var_run_datadog_apm.socket"}, c.agentURL) + }) + + t.Run("code-override-full-URL-error", func(t *testing.T) { + tp := new(log.RecordLogger) + // Have to use UseLogger directly before tracer logger is set + defer log.UseLogger(tp)() + t.Setenv("DD_TRACE_AGENT_URL", "https://localhost:1234/") + tracer, err := newTracer(WithAgentURL("go://127.0.0.1:3333")) + assert.Nil(t, err) + defer tracer.Stop() + c := tracer.config + assert.Equal(t, &url.URL{Scheme: "https", Host: "localhost:1234"}, c.agentURL) + cond := func() bool { + return strings.Contains(strings.Join(tp.Logs(), ""), "Unsupported protocol") + } + assert.Eventually(t, cond, 1*time.Second, 75*time.Millisecond) }) }) @@ -557,16 +694,18 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Setenv("DD_ENV", "dev") assert := assert.New(t) env := "production" - tracer := newTracer(WithEnv(env)) + tracer, err := newTracer(WithEnv(env)) defer tracer.Stop() + assert.NoError(err) c := tracer.config assert.Equal(env, c.env) }) t.Run("trace_enabled", func(t *testing.T) { t.Run("default", func(t *testing.T) { - tracer := newTracer(WithAgentTimeout(2)) + tracer, err := newTracer(WithAgentTimeout(2)) defer tracer.Stop() + assert.NoError(t, err) c := tracer.config assert.True(t, c.enabled.current) assert.Equal(t, c.enabled.cfgOrigin, telemetry.OriginDefault) @@ -574,8 +713,9 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("override", func(t *testing.T) { t.Setenv("DD_TRACE_ENABLED", "false") - tracer := newTracer(WithAgentTimeout(2)) + tracer, err := newTracer(WithAgentTimeout(2)) defer tracer.Stop() + assert.NoError(t, err) c := tracer.config assert.False(t, c.enabled.current) assert.Equal(t, c.enabled.cfgOrigin, telemetry.OriginEnvVar) @@ -584,17 +724,18 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("other", func(t *testing.T) { assert := assert.New(t) - tracer := newTracer( - WithSampler(NewRateSampler(0.5)), - WithAgentAddr("ddagent.consul.local:58126"), + tracer, err := newTracer( + WithSamplerRate(0.5), + WithAgentAddr("127.0.0.1:58126"), WithGlobalTag("k", "v"), WithDebugMode(true), WithEnv("testEnv"), ) defer tracer.Stop() + assert.NoError(err) c := tracer.config - assert.Equal(float64(0.5), c.sampler.(RateSampler).Rate()) - assert.Equal(&url.URL{Scheme: "http", Host: "ddagent.consul.local:58126"}, c.agentURL) + assert.Equal(float64(0.5), c.sampler.Rate()) + assert.Equal(&url.URL{Scheme: "http", Host: "127.0.0.1:58126"}, c.agentURL) assert.NotNil(c.globalTags.get()) assert.Equal("v", c.globalTags.get()["k"]) assert.Equal("testEnv", c.env) @@ -605,8 +746,8 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Setenv("DD_TAGS", "env:test, aKey:aVal,bKey:bVal, cKey:") assert := assert.New(t) - c := newConfig(WithAgentTimeout(2)) - + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(err) globalTags := c.globalTags.get() assert.Equal("test", globalTags["env"]) assert.Equal("aVal", globalTags["aKey"]) @@ -620,26 +761,30 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("profiler-endpoints", func(t *testing.T) { t.Run("default", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.True(t, c.profilerEndpoints) }) t.Run("override", func(t *testing.T) { t.Setenv(traceprof.EndpointEnvVar, "false") - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.False(t, c.profilerEndpoints) }) }) t.Run("profiler-hotspots", func(t *testing.T) { t.Run("default", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.True(t, c.profilerHotspots) }) t.Run("override", func(t *testing.T) { t.Setenv(traceprof.CodeHotspotsEnvVar, "false") - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.False(t, c.profilerHotspots) }) }) @@ -648,8 +793,9 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Setenv("DD_SERVICE_MAPPING", "tracer.test:test2, svc:Newsvc,http.router:myRouter, noval:") assert := assert.New(t) - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(err) assert.Equal("test2", c.serviceMappings["tracer.test"]) assert.Equal("Newsvc", c.serviceMappings["svc"]) assert.Equal("myRouter", c.serviceMappings["http.router"]) @@ -660,22 +806,25 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("can-set-value", func(t *testing.T) { t.Setenv("DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH", "200") assert := assert.New(t) - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(err) p := c.propagator.(*chainedPropagator).injectors[0].(*propagator) assert.Equal(200, p.cfg.MaxTagsHeaderLen) }) t.Run("default", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(err) p := c.propagator.(*chainedPropagator).injectors[0].(*propagator) - assert.Equal(128, p.cfg.MaxTagsHeaderLen) + assert.Equal(512, p.cfg.MaxTagsHeaderLen) }) t.Run("clamped-to-zero", func(t *testing.T) { t.Setenv("DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH", "-520") assert := assert.New(t) - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(err) p := c.propagator.(*chainedPropagator).injectors[0].(*propagator) assert.Equal(0, p.cfg.MaxTagsHeaderLen) }) @@ -683,52 +832,25 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("upper-clamp", func(t *testing.T) { t.Setenv("DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH", "1000") assert := assert.New(t) - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(err) p := c.propagator.(*chainedPropagator).injectors[0].(*propagator) assert.Equal(512, p.cfg.MaxTagsHeaderLen) }) }) - t.Run("attribute-schema", func(t *testing.T) { - t.Run("defaults", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) - assert.Equal(t, 0, c.spanAttributeSchemaVersion) - assert.Equal(t, false, namingschema.UseGlobalServiceName()) - }) - - t.Run("env-vars", func(t *testing.T) { - t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") - t.Setenv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", "true") - - prev := namingschema.UseGlobalServiceName() - defer namingschema.SetUseGlobalServiceName(prev) - - c := newConfig(WithAgentTimeout(2)) - assert.Equal(t, 1, c.spanAttributeSchemaVersion) - assert.Equal(t, true, namingschema.UseGlobalServiceName()) - }) - - t.Run("options", func(t *testing.T) { - prev := namingschema.UseGlobalServiceName() - defer namingschema.SetUseGlobalServiceName(prev) - - c := newConfig(WithAgentTimeout(2)) - WithGlobalServiceName(true)(c) - - assert.Equal(t, true, namingschema.UseGlobalServiceName()) - }) - }) - t.Run("peer-service", func(t *testing.T) { t.Run("defaults", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.Equal(t, c.peerServiceDefaultsEnabled, false) assert.Empty(t, c.peerServiceMappings) }) t.Run("defaults-with-schema-v1", func(t *testing.T) { t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.Equal(t, c.peerServiceDefaultsEnabled, true) assert.Empty(t, c.peerServiceMappings) }) @@ -736,13 +858,15 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("env-vars", func(t *testing.T) { t.Setenv("DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED", "true") t.Setenv("DD_TRACE_PEER_SERVICE_MAPPING", "old:new,old2:new2") - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.Equal(t, c.peerServiceDefaultsEnabled, true) assert.Equal(t, c.peerServiceMappings, map[string]string{"old": "new", "old2": "new2"}) }) t.Run("options", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) WithPeerServiceDefaults(true)(c) WithPeerServiceMapping("old", "new")(c) WithPeerServiceMapping("old2", "new2")(c) @@ -753,14 +877,16 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("debug-open-spans", func(t *testing.T) { t.Run("defaults", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.Equal(t, false, c.debugAbandonedSpans) assert.Equal(t, time.Duration(0), c.spanTimeout) }) t.Run("debug-on", func(t *testing.T) { t.Setenv("DD_TRACE_DEBUG_ABANDONED_SPANS", "true") - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.Equal(t, true, c.debugAbandonedSpans) assert.Equal(t, 10*time.Minute, c.spanTimeout) }) @@ -768,13 +894,15 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("timeout-set", func(t *testing.T) { t.Setenv("DD_TRACE_DEBUG_ABANDONED_SPANS", "true") t.Setenv("DD_TRACE_ABANDONED_SPAN_TIMEOUT", fmt.Sprint(time.Minute)) - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) assert.Equal(t, true, c.debugAbandonedSpans) assert.Equal(t, time.Minute, c.spanTimeout) }) t.Run("with-function", func(t *testing.T) { - c := newConfig(WithAgentTimeout(2)) + c, err := newTestConfig(WithAgentTimeout(2)) + assert.NoError(t, err) WithDebugSpansMode(time.Second)(c) assert.Equal(t, true, c.debugAbandonedSpans) assert.Equal(t, time.Second, c.spanTimeout) @@ -783,19 +911,40 @@ func TestTracerOptionsDefaults(t *testing.T) { t.Run("agent-timeout", func(t *testing.T) { t.Run("defaults", func(t *testing.T) { - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.Equal(t, time.Duration(10*time.Second), c.httpClient.Timeout) }) }) + + t.Run("trace-retries", func(t *testing.T) { + c, err := newTestConfig() + assert.NoError(t, err) + assert.Equal(t, 0, c.sendRetries) + assert.Equal(t, time.Millisecond, c.retryInterval) + }) +} + +func TestTraceRetry(t *testing.T) { + t.Run("sendRetries", func(t *testing.T) { + c, err := newTestConfig(WithSendRetries(10)) + assert.NoError(t, err) + assert.Equal(t, 10, c.sendRetries) + }) + t.Run("retryInterval", func(t *testing.T) { + c, err := newTestConfig(WithRetryInterval(10)) + assert.NoError(t, err) + assert.Equal(t, 10*time.Second, c.retryInterval) + }) } func TestDefaultHTTPClient(t *testing.T) { defTracerClient := func(timeout int) *http.Client { if _, err := os.Stat(internal.DefaultTraceAgentUDSPath); err == nil { // we have the UDS socket file, use it - return udsClient(internal.DefaultTraceAgentUDSPath, 0) + return internal.UDSClient(internal.DefaultTraceAgentUDSPath, 0) } - return defaultHTTPClient(time.Second * time.Duration(timeout)) + return internal.DefaultHTTPClient(time.Second*time.Duration(timeout), false) } t.Run("no-socket", func(t *testing.T) { // We care that whether clients are different, but doing a deep @@ -803,13 +952,13 @@ func TestDefaultHTTPClient(t *testing.T) { // just compare the pointers. x := *defTracerClient(2) - y := *defaultHTTPClient(2) + y := *internal.DefaultHTTPClient(2, false) compareHTTPClients(t, x, y) - assert.True(t, getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(defaultDialer.DialContext)) + assert.True(t, getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(internal.DefaultDialer(30*time.Second).DialContext)) }) t.Run("socket", func(t *testing.T) { - f, err := ioutil.TempFile("", "apm.socket") + f, err := os.CreateTemp("", "apm.socket") if err != nil { t.Fatal(err) } @@ -820,9 +969,9 @@ func TestDefaultHTTPClient(t *testing.T) { defer func(old string) { internal.DefaultTraceAgentUDSPath = old }(internal.DefaultTraceAgentUDSPath) internal.DefaultTraceAgentUDSPath = f.Name() x := *defTracerClient(2) - y := *defaultHTTPClient(2) + y := *internal.DefaultHTTPClient(2, false) compareHTTPClients(t, x, y) - assert.False(t, getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(defaultDialer.DialContext)) + assert.False(t, getFuncName(x.Transport.(*http.Transport).DialContext) == getFuncName(internal.DefaultDialer(30*time.Second).DialContext)) }) } @@ -832,15 +981,46 @@ func TestDefaultDogstatsdAddr(t *testing.T) { assert.Equal(t, defaultDogstatsdAddr(), "localhost:8125") }) - t.Run("env", func(t *testing.T) { + t.Run("host-env", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_HOST", "111.111.1.1") + t.Setenv("DD_AGENT_HOST", "222.222.2.2") + assert.Equal(t, "111.111.1.1:8125", defaultDogstatsdAddr()) + }) + + t.Run("port-env", func(t *testing.T) { t.Setenv("DD_DOGSTATSD_PORT", "8111") assert.Equal(t, defaultDogstatsdAddr(), "localhost:8111") + t.Setenv("DD_AGENT_HOST", "222.222.2.2") + assert.Equal(t, defaultDogstatsdAddr(), "222.222.2.2:8111") + }) + + t.Run("host-env+port-env", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_HOST", "111.111.1.1") + t.Setenv("DD_DOGSTATSD_PORT", "8888") + t.Setenv("DD_AGENT_HOST", "222.222.2.2") + assert.Equal(t, "111.111.1.1:8888", defaultDogstatsdAddr()) }) - t.Run("env+socket", func(t *testing.T) { + t.Run("host-env+socket", func(t *testing.T) { + t.Setenv("DD_DOGSTATSD_HOST", "111.111.1.1") + assert.Equal(t, "111.111.1.1:8125", defaultDogstatsdAddr()) + f, err := os.CreateTemp("", "dsd.socket") + if err != nil { + t.Fatal(err) + } + if err := f.Close(); err != nil { + t.Fatal(err) + } + defer os.RemoveAll(f.Name()) + defer func(old string) { defaultSocketDSD = old }(defaultSocketDSD) + defaultSocketDSD = f.Name() + assert.Equal(t, "111.111.1.1:8125", defaultDogstatsdAddr()) + }) + + t.Run("port-env+socket", func(t *testing.T) { t.Setenv("DD_DOGSTATSD_PORT", "8111") assert.Equal(t, defaultDogstatsdAddr(), "localhost:8111") - f, err := ioutil.TempFile("", "dsd.socket") + f, err := os.CreateTemp("", "dsd.socket") if err != nil { t.Fatal(err) } @@ -858,7 +1038,7 @@ func TestDefaultDogstatsdAddr(t *testing.T) { defer func(old string) { os.Setenv("DD_DOGSTATSD_PORT", old) }(os.Getenv("DD_DOGSTATSD_PORT")) os.Unsetenv("DD_AGENT_HOST") os.Unsetenv("DD_DOGSTATSD_PORT") - f, err := ioutil.TempFile("", "dsd.socket") + f, err := os.CreateTemp("", "dsd.socket") if err != nil { t.Fatal(err) } @@ -873,23 +1053,13 @@ func TestDefaultDogstatsdAddr(t *testing.T) { } func TestServiceName(t *testing.T) { - t.Run("WithServiceName", func(t *testing.T) { - defer globalconfig.SetServiceName("") - assert := assert.New(t) - c := newConfig( - WithServiceName("api-intake"), - ) - - assert.Equal("api-intake", c.serviceName) - assert.Equal("", globalconfig.ServiceName()) - }) - t.Run("WithService", func(t *testing.T) { defer globalconfig.SetServiceName("") assert := assert.New(t) - c := newConfig( + c, err := newTestConfig( WithService("api-intake"), ) + assert.NoError(err) assert.Equal("api-intake", c.serviceName) assert.Equal("api-intake", globalconfig.ServiceName()) }) @@ -898,8 +1068,9 @@ func TestServiceName(t *testing.T) { defer globalconfig.SetServiceName("") t.Setenv("DD_SERVICE", "api-intake") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("api-intake", c.serviceName) assert.Equal("api-intake", globalconfig.ServiceName()) }) @@ -910,7 +1081,8 @@ func TestServiceName(t *testing.T) { }() t.Setenv("OTEL_SERVICE_NAME", "api-intake") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("api-intake", c.serviceName) assert.Equal("api-intake", globalconfig.ServiceName()) @@ -919,7 +1091,8 @@ func TestServiceName(t *testing.T) { t.Run("WithGlobalTag", func(t *testing.T) { defer globalconfig.SetServiceName("") assert := assert.New(t) - c := newConfig(WithGlobalTag("service", "api-intake")) + c, err := newTestConfig(WithGlobalTag("service", "api-intake")) + assert.NoError(err) assert.Equal("api-intake", c.serviceName) assert.Equal("api-intake", globalconfig.ServiceName()) }) @@ -930,7 +1103,8 @@ func TestServiceName(t *testing.T) { }() t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "service.name=api-intake") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("api-intake", c.serviceName) assert.Equal("api-intake", globalconfig.ServiceName()) @@ -940,7 +1114,8 @@ func TestServiceName(t *testing.T) { defer globalconfig.SetServiceName("") t.Setenv("DD_TAGS", "service:api-intake") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("api-intake", c.serviceName) assert.Equal("api-intake", globalconfig.ServiceName()) @@ -952,41 +1127,48 @@ func TestServiceName(t *testing.T) { }() assert := assert.New(t) globalconfig.SetServiceName("") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal(c.serviceName, filepath.Base(os.Args[0])) assert.Equal("", globalconfig.ServiceName()) t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "service.name=testService6") globalconfig.SetServiceName("") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.Equal(c.serviceName, "testService6") assert.Equal("testService6", globalconfig.ServiceName()) t.Setenv("DD_TAGS", "service:testService") globalconfig.SetServiceName("") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.Equal(c.serviceName, "testService") assert.Equal("testService", globalconfig.ServiceName()) globalconfig.SetServiceName("") - c = newConfig(WithGlobalTag("service", "testService2")) + c, err = newTestConfig(WithGlobalTag("service", "testService2")) + assert.NoError(err) assert.Equal(c.serviceName, "testService2") assert.Equal("testService2", globalconfig.ServiceName()) t.Setenv("OTEL_SERVICE_NAME", "testService3") globalconfig.SetServiceName("") - c = newConfig(WithGlobalTag("service", "testService2")) + c, err = newTestConfig(WithGlobalTag("service", "testService2")) + assert.NoError(err) assert.Equal(c.serviceName, "testService3") assert.Equal("testService3", globalconfig.ServiceName()) t.Setenv("DD_SERVICE", "testService4") globalconfig.SetServiceName("") - c = newConfig(WithGlobalTag("service", "testService2")) + c, err = newTestConfig(WithGlobalTag("service", "testService2"), WithService("testService4")) + assert.NoError(err) assert.Equal(c.serviceName, "testService4") assert.Equal("testService4", globalconfig.ServiceName()) globalconfig.SetServiceName("") - c = newConfig(WithGlobalTag("service", "testService2"), WithService("testService5")) + c, err = newTestConfig(WithGlobalTag("service", "testService2"), WithService("testService5")) + assert.NoError(err) assert.Equal(c.serviceName, "testService5") assert.Equal("testService5", globalconfig.ServiceName()) }) @@ -995,21 +1177,25 @@ func TestServiceName(t *testing.T) { func TestStartWithLink(t *testing.T) { assert := assert.New(t) - links := []ddtrace.SpanLink{{TraceID: 1, SpanID: 2}, {TraceID: 3, SpanID: 4}} - span := newTracer().StartSpan("test.request", WithSpanLinks(links)).(*span) - - assert.Len(span.SpanLinks, 2) - assert.Equal(span.SpanLinks[0].TraceID, uint64(1)) - assert.Equal(span.SpanLinks[0].SpanID, uint64(2)) - assert.Equal(span.SpanLinks[1].TraceID, uint64(3)) - assert.Equal(span.SpanLinks[1].SpanID, uint64(4)) + links := []SpanLink{{TraceID: 1, SpanID: 2}, {TraceID: 3, SpanID: 4}} + tracer, err := newTracer() + assert.NoError(err) + defer tracer.Stop() + + span := tracer.StartSpan("test.request", WithSpanLinks(links)) + assert.Len(span.spanLinks, 2) + assert.Equal(span.spanLinks[0].TraceID, uint64(1)) + assert.Equal(span.spanLinks[0].SpanID, uint64(2)) + assert.Equal(span.spanLinks[1].TraceID, uint64(3)) + assert.Equal(span.spanLinks[1].SpanID, uint64(4)) } func TestOtelResourceAtttributes(t *testing.T) { t.Run("max 10", func(t *testing.T) { assert := assert.New(t) t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "tag1=val1,tag2=val2,tag3=val3,tag4=val4,tag5=val5,tag6=val6,tag7=val7,tag8=val8,tag9=val9,tag10=val10,tag11=val11,tag12=val12") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) globalTags := c.globalTags.get() // runtime-id tag is added automatically, so we expect runtime-id + our first 10 tags assert.Len(globalTags, 11) @@ -1101,7 +1287,8 @@ func TestTagSeparators(t *testing.T) { } { t.Run("", func(t *testing.T) { t.Setenv("DD_TAGS", tag.in) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) globalTags := c.globalTags.get() for key, expected := range tag.out { got, ok := globalTags[key] @@ -1115,30 +1302,34 @@ func TestTagSeparators(t *testing.T) { func TestVersionConfig(t *testing.T) { t.Run("WithServiceVersion", func(t *testing.T) { assert := assert.New(t) - c := newConfig( + c, err := newTestConfig( WithServiceVersion("1.2.3"), ) + assert.NoError(err) assert.Equal("1.2.3", c.version) }) t.Run("env", func(t *testing.T) { t.Setenv("DD_VERSION", "1.2.3") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("1.2.3", c.version) }) t.Run("WithGlobalTag", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithGlobalTag("version", "1.2.3")) + c, err := newTestConfig(WithGlobalTag("version", "1.2.3")) + assert.NoError(err) assert.Equal("1.2.3", c.version) }) t.Run("OTEL_RESOURCE_ATTRIBUTES", func(t *testing.T) { t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "service.version=1.2.3") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("1.2.3", c.version) }) @@ -1146,32 +1337,39 @@ func TestVersionConfig(t *testing.T) { t.Run("DD_TAGS", func(t *testing.T) { t.Setenv("DD_TAGS", "version:1.2.3") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("1.2.3", c.version) }) t.Run("override-chain", func(t *testing.T) { assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal(c.version, "") t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "service.version=1.1.0") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.Equal("1.1.0", c.version) t.Setenv("DD_TAGS", "version:1.1.1") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.Equal("1.1.1", c.version) - c = newConfig(WithGlobalTag("version", "1.1.2")) + c, err = newTestConfig(WithGlobalTag("version", "1.1.2")) + assert.NoError(err) assert.Equal("1.1.2", c.version) t.Setenv("DD_VERSION", "1.1.3") - c = newConfig(WithGlobalTag("version", "1.1.2")) + c, err = newTestConfig(WithGlobalTag("version", "1.1.2")) + assert.NoError(err) assert.Equal("1.1.3", c.version) - c = newConfig(WithGlobalTag("version", "1.1.2"), WithServiceVersion("1.1.4")) + c, err = newTestConfig(WithGlobalTag("version", "1.1.2"), WithServiceVersion("1.1.4")) + assert.NoError(err) assert.Equal("1.1.4", c.version) }) } @@ -1179,30 +1377,34 @@ func TestVersionConfig(t *testing.T) { func TestEnvConfig(t *testing.T) { t.Run("WithEnv", func(t *testing.T) { assert := assert.New(t) - c := newConfig( + c, err := newTestConfig( WithEnv("testing"), ) + assert.NoError(err) assert.Equal("testing", c.env) }) t.Run("env", func(t *testing.T) { t.Setenv("DD_ENV", "testing") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("testing", c.env) }) t.Run("WithGlobalTag", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithGlobalTag("env", "testing")) + c, err := newTestConfig(WithGlobalTag("env", "testing")) + assert.NoError(err) assert.Equal("testing", c.env) }) t.Run("OTEL_RESOURCE_ATTRIBUTES", func(t *testing.T) { t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "deployment.environment=testing") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("testing", c.env) }) @@ -1210,39 +1412,47 @@ func TestEnvConfig(t *testing.T) { t.Run("DD_TAGS", func(t *testing.T) { t.Setenv("DD_TAGS", "env:testing") assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("testing", c.env) }) t.Run("override-chain", func(t *testing.T) { assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal(c.env, "") t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "deployment.environment=testing0") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.Equal("testing0", c.env) t.Setenv("DD_TAGS", "env:testing1") - c = newConfig() + c, err = newTestConfig() + assert.NoError(err) assert.Equal("testing1", c.env) - c = newConfig(WithGlobalTag("env", "testing2")) + c, err = newTestConfig(WithGlobalTag("env", "testing2")) + assert.NoError(err) assert.Equal("testing2", c.env) t.Setenv("DD_ENV", "testing3") - c = newConfig(WithGlobalTag("env", "testing2")) + c, err = newTestConfig(WithGlobalTag("env", "testing2")) + assert.NoError(err) assert.Equal("testing3", c.env) - c = newConfig(WithGlobalTag("env", "testing2"), WithEnv("testing4")) + c, err = newTestConfig(WithGlobalTag("env", "testing2"), WithEnv("testing4")) + assert.NoError(err) assert.Equal("testing4", c.env) }) } func TestStatsTags(t *testing.T) { assert := assert.New(t) - c := newConfig(WithService("serviceName"), WithEnv("envName")) + c, err := newTestConfig(WithService("serviceName"), WithEnv("envName")) + assert.NoError(err) defer globalconfig.SetServiceName("") c.hostname = "hostName" tags := statsTags(c) @@ -1272,14 +1482,16 @@ func TestGlobalTag(t *testing.T) { func TestWithHostname(t *testing.T) { t.Run("WithHostname", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithHostname("hostname")) + c, err := newTestConfig(WithHostname("hostname")) + assert.NoError(err) assert.Equal("hostname", c.hostname) }) t.Run("env", func(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_SOURCE_HOSTNAME", "hostname-env") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.Equal("hostname-env", c.hostname) }) @@ -1287,7 +1499,8 @@ func TestWithHostname(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_SOURCE_HOSTNAME", "hostname-env") - c := newConfig(WithHostname("hostname-middleware")) + c, err := newTestConfig(WithHostname("hostname-middleware")) + assert.NoError(err) assert.Equal("hostname-middleware", c.hostname) }) } @@ -1295,21 +1508,24 @@ func TestWithHostname(t *testing.T) { func TestWithTraceEnabled(t *testing.T) { t.Run("WithTraceEnabled", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithTraceEnabled(false)) + c, err := newTestConfig(WithTraceEnabled(false)) + assert.NoError(err) assert.False(c.enabled.current) }) t.Run("otel-env", func(t *testing.T) { assert := assert.New(t) t.Setenv("OTEL_TRACES_EXPORTER", "none") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.False(c.enabled.current) }) t.Run("dd-env", func(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_ENABLED", "false") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.False(c.enabled.current) }) @@ -1318,16 +1534,19 @@ func TestWithTraceEnabled(t *testing.T) { // dd env overrides otel env t.Setenv("OTEL_TRACES_EXPORTER", "none") t.Setenv("DD_TRACE_ENABLED", "true") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.True(c.enabled.current) // tracer option overrides dd env - c = newConfig(WithTraceEnabled(false)) + c, err = newTestConfig(WithTraceEnabled(false)) + assert.NoError(err) assert.False(c.enabled.current) }) } func TestWithLogStartup(t *testing.T) { - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.logStartup) WithLogStartup(false)(c) assert.False(t, c.logStartup) @@ -1339,7 +1558,7 @@ func TestWithHeaderTags(t *testing.T) { t.Run("default-off", func(t *testing.T) { defer globalconfig.ClearHeaderTags() assert := assert.New(t) - newConfig() + newTestConfig() assert.Equal(0, globalconfig.HeaderTagsLen()) }) @@ -1347,7 +1566,7 @@ func TestWithHeaderTags(t *testing.T) { defer globalconfig.ClearHeaderTags() assert := assert.New(t) header := "Header" - newConfig(WithHeaderTags([]string{header})) + newTestConfig(WithHeaderTags([]string{header})) assert.Equal("http.request.headers.header", globalconfig.HeaderTag(header)) }) @@ -1356,14 +1575,14 @@ func TestWithHeaderTags(t *testing.T) { assert := assert.New(t) header := "Header" tag := "tag" - newConfig(WithHeaderTags([]string{header + ":" + tag})) + newTestConfig(WithHeaderTags([]string{header + ":" + tag})) assert.Equal("tag", globalconfig.HeaderTag(header)) }) t.Run("multi-header", func(t *testing.T) { defer globalconfig.ClearHeaderTags() assert := assert.New(t) - newConfig(WithHeaderTags([]string{"1header:1tag", "2header", "3header:3tag"})) + newTestConfig(WithHeaderTags([]string{"1header:1tag", "2header", "3header:3tag"})) assert.Equal("1tag", globalconfig.HeaderTag("1header")) assert.Equal("http.request.headers.2header", globalconfig.HeaderTag("2header")) assert.Equal("3tag", globalconfig.HeaderTag("3header")) @@ -1372,7 +1591,7 @@ func TestWithHeaderTags(t *testing.T) { t.Run("normalization", func(t *testing.T) { defer globalconfig.ClearHeaderTags() assert := assert.New(t) - newConfig(WithHeaderTags([]string{" h!e@a-d.e*r ", " 2header:t!a@g. "})) + newTestConfig(WithHeaderTags([]string{" h!e@a-d.e*r ", " 2header:t!a@g. "})) assert.Equal(ext.HTTPRequestHeaders+".h_e_a-d_e_r", globalconfig.HeaderTag("h!e@a-d.e*r")) assert.Equal("t!a@g.", globalconfig.HeaderTag("2header")) }) @@ -1382,7 +1601,7 @@ func TestWithHeaderTags(t *testing.T) { t.Setenv("DD_TRACE_HEADER_TAGS", " 1header:1tag,2.h.e.a.d.e.r ") assert := assert.New(t) - newConfig() + newTestConfig() assert.Equal("1tag", globalconfig.HeaderTag("1header")) assert.Equal(ext.HTTPRequestHeaders+".2_h_e_a_d_e_r", globalconfig.HeaderTag("2.h.e.a.d.e.r")) @@ -1393,7 +1612,7 @@ func TestWithHeaderTags(t *testing.T) { t.Setenv("DD_TRACE_HEADER_TAGS", "header1:") assert := assert.New(t) - newConfig() + newTestConfig() assert.Equal(0, globalconfig.HeaderTagsLen()) }) @@ -1403,10 +1622,9 @@ func TestWithHeaderTags(t *testing.T) { t.Setenv("DD_TRACE_HEADER_TAGS", "header1,header2:") assert := assert.New(t) - newConfig() + newTestConfig() assert.Equal(1, globalconfig.HeaderTagsLen()) - fmt.Println(globalconfig.HeaderTagMap()) assert.Equal(ext.HTTPRequestHeaders+".header1", globalconfig.HeaderTag("Header1")) }) @@ -1414,7 +1632,7 @@ func TestWithHeaderTags(t *testing.T) { defer globalconfig.ClearHeaderTags() assert := assert.New(t) t.Setenv("DD_TRACE_HEADER_TAGS", "unexpected") - newConfig(WithHeaderTags([]string{"expected"})) + newTestConfig(WithHeaderTags([]string{"expected"})) assert.Equal(ext.HTTPRequestHeaders+".expected", globalconfig.HeaderTag("Expected")) assert.Equal(1, globalconfig.HeaderTagsLen()) }) @@ -1425,56 +1643,65 @@ func TestWithHeaderTags(t *testing.T) { func TestHostnameDisabled(t *testing.T) { t.Run("Default", func(t *testing.T) { - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.False(t, c.enableHostnameDetection) }) t.Run("EnableViaEnv", func(t *testing.T) { t.Setenv("DD_TRACE_CLIENT_HOSTNAME_COMPAT", "v1.66") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.enableHostnameDetection) }) } func TestPartialFlushing(t *testing.T) { t.Run("None", func(t *testing.T) { - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.False(t, c.partialFlushEnabled) assert.Equal(t, partialFlushMinSpansDefault, c.partialFlushMinSpans) }) t.Run("Disabled-DefaultMinSpans", func(t *testing.T) { t.Setenv("DD_TRACE_PARTIAL_FLUSH_ENABLED", "false") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.False(t, c.partialFlushEnabled) assert.Equal(t, partialFlushMinSpansDefault, c.partialFlushMinSpans) }) t.Run("Default-SetMinSpans", func(t *testing.T) { t.Setenv("DD_TRACE_PARTIAL_FLUSH_MIN_SPANS", "10") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.False(t, c.partialFlushEnabled) assert.Equal(t, 10, c.partialFlushMinSpans) }) t.Run("Enabled-DefaultMinSpans", func(t *testing.T) { t.Setenv("DD_TRACE_PARTIAL_FLUSH_ENABLED", "true") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.partialFlushEnabled) assert.Equal(t, partialFlushMinSpansDefault, c.partialFlushMinSpans) }) t.Run("Enabled-SetMinSpans", func(t *testing.T) { t.Setenv("DD_TRACE_PARTIAL_FLUSH_ENABLED", "true") t.Setenv("DD_TRACE_PARTIAL_FLUSH_MIN_SPANS", "10") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.partialFlushEnabled) assert.Equal(t, 10, c.partialFlushMinSpans) }) t.Run("Enabled-SetMinSpansNegative", func(t *testing.T) { t.Setenv("DD_TRACE_PARTIAL_FLUSH_ENABLED", "true") t.Setenv("DD_TRACE_PARTIAL_FLUSH_MIN_SPANS", "-1") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.partialFlushEnabled) assert.Equal(t, partialFlushMinSpansDefault, c.partialFlushMinSpans) }) t.Run("WithPartialFlushOption", func(t *testing.T) { - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) WithPartialFlushing(20)(c) assert.True(t, c.partialFlushEnabled) assert.Equal(t, 20, c.partialFlushMinSpans) @@ -1484,29 +1711,200 @@ func TestPartialFlushing(t *testing.T) { func TestWithStatsComputation(t *testing.T) { t.Run("default", func(t *testing.T) { assert := assert.New(t) - c := newConfig() - assert.False(c.statsComputationEnabled) + c, err := newTestConfig() + assert.NoError(err) + assert.True(c.statsComputationEnabled) }) t.Run("enabled-via-option", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithStatsComputation(true)) + c, err := newTestConfig(WithStatsComputation(true)) + assert.NoError(err) assert.True(c.statsComputationEnabled) }) t.Run("disabled-via-option", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithStatsComputation(false)) + c, err := newTestConfig(WithStatsComputation(false)) + assert.NoError(err) assert.False(c.statsComputationEnabled) }) t.Run("enabled-via-env", func(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_STATS_COMPUTATION_ENABLED", "true") - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) assert.True(c.statsComputationEnabled) }) t.Run("env-override", func(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_STATS_COMPUTATION_ENABLED", "false") - c := newConfig(WithStatsComputation(true)) + c, err := newTestConfig(WithStatsComputation(true)) + assert.NoError(err) assert.True(c.statsComputationEnabled) }) } + +func TestWithStartSpanConfig(t *testing.T) { + var ( + assert = assert.New(t) + service = "service" + parent = newSpan("", service, "", 0, 1, 2) + spanID = uint64(123) + tm, _ = time.Parse(time.RFC3339, "2019-01-01T00:00:00Z") + ) + cfg := NewStartSpanConfig( + ChildOf(parent.Context()), + Measured(), + ResourceName("resource"), + ServiceName(service), + SpanType(ext.SpanTypeWeb), + StartTime(tm), + Tag("key", "value"), + WithSpanID(spanID), + withContext(context.Background()), + ) + // It's difficult to test the context was used to initialize the span + // in a meaningful way, so we just check it was set in the SpanConfig. + assert.Equal(cfg.Context, cfg.Context) + + tracer, err := newTracer() + defer tracer.Stop() + assert.NoError(err) + + s := tracer.StartSpan("test", WithStartSpanConfig(cfg)) + defer s.Finish() + assert.Equal(float64(1), s.metrics[keyMeasured]) + assert.Equal("value", s.meta["key"]) + assert.Equal(parent.Context().SpanID(), s.parentID) + assert.Equal(parent.Context().TraceID(), s.Context().TraceID()) + assert.Equal("resource", s.resource) + assert.Equal(service, s.service) + assert.Equal(spanID, s.spanID) + assert.Equal(ext.SpanTypeWeb, s.spanType) + assert.Equal(tm.UnixNano(), s.start) +} + +func TestNewFinishConfig(t *testing.T) { + var ( + assert = assert.New(t) + now = time.Now() + err = errors.New("error") + ) + cfg := NewFinishConfig( + FinishTime(now), + WithError(err), + StackFrames(10, 0), + NoDebugStack(), + ) + assert.True(cfg.NoDebugStack) + assert.Equal(now, cfg.FinishTime) + assert.Equal(err, cfg.Error) + assert.Equal(uint(10), cfg.StackFrames) + assert.Equal(uint(0), cfg.SkipStackFrames) +} + +func TestWithStartSpanConfigNonEmptyTags(t *testing.T) { + var ( + assert = assert.New(t) + ) + cfg := NewStartSpanConfig( + Tag("key", "value"), + Tag("k2", "should_override"), + ) + + tracer, err := newTracer() + defer tracer.Stop() + assert.NoError(err) + + s := tracer.StartSpan( + "test", + Tag("k2", "v2"), + WithStartSpanConfig(cfg), + Tag("key", "after_start_span_config"), + ) + defer s.Finish() + assert.Equal("should_override", s.meta["k2"]) + assert.Equal("after_start_span_config", s.meta["key"]) +} + +func optsTestConsumer(opts ...StartSpanOption) { + var cfg StartSpanConfig + for _, o := range opts { + o(&cfg) + } +} + +func BenchmarkConfig(b *testing.B) { + b.Run("scenario_none", func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + optsTestConsumer( + ServiceName("SomeService"), + ResourceName("SomeResource"), + Tag(ext.HTTPRoute, "/some/route/?"), + ) + } + }) + b.Run("scenario_WithStartSpanConfig", func(b *testing.B) { + b.ReportAllocs() + cfg := NewStartSpanConfig( + ServiceName("SomeService"), + ResourceName("SomeResource"), + ) + b.ResetTimer() + for i := 0; i < b.N; i++ { + optsTestConsumer( + WithStartSpanConfig(cfg), + Tag(ext.HTTPRoute, "/some/route/?"), + ) + } + }) +} + +func BenchmarkStartSpanConfig(b *testing.B) { + b.Run("scenario_none", func(b *testing.B) { + tracer, err := newTracer() + defer tracer.Stop() + assert.NoError(b, err) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tracer.StartSpan("test", + ServiceName("SomeService"), + ResourceName("SomeResource"), + Tag(ext.HTTPRoute, "/some/route/?"), + ) + + } + }) + b.Run("scenario_WithStartSpanConfig", func(b *testing.B) { + tracer, err := newTracer() + defer tracer.Stop() + assert.NoError(b, err) + b.ReportAllocs() + cfg := NewStartSpanConfig( + ServiceName("SomeService"), + ResourceName("SomeResource"), + ) + b.ResetTimer() + for i := 0; i < b.N; i++ { + tracer.StartSpan("test", + WithStartSpanConfig(cfg), + Tag(ext.HTTPRoute, "/some/route/?"), + ) + } + }) +} + +func TestNoHTTPClientOverride(t *testing.T) { + t.Run("default", func(t *testing.T) { + assert := assert.New(t) + client := http.DefaultClient + client.Timeout = 30 * time.Second // Default is 10s + c, err := newTestConfig( + WithHTTPClient(client), + WithUDS("/tmp/agent.sock"), + ) + assert.Nil(err) + assert.Equal(30*time.Second, c.httpClient.Timeout) + }) +} diff --git a/ddtrace/tracer/orchestrion.yml b/ddtrace/tracer/orchestrion.yml new file mode 100644 index 0000000000..42e9f6ee47 --- /dev/null +++ b/ddtrace/tracer/orchestrion.yml @@ -0,0 +1,120 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + description: |- + Automatically starts the github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + at the start of the application, and closes it at exit of the main function. + + Adding the `//dd:span` directive on functions creates custom spans + representing every call to that function. The default operation (span) name + is the name of the function, and this can be overridden using a "span.name" + argument to the directive: + + ```go + //dd:span span.name:custom-operation-name other:tag + func myFunction() { + // The default operation name would have been "myFunction" + } + ``` + + Function literal expressions don't have a function name, and their default operation name is the value of the very + first directive argument (if there is one). If there are no directive arguments, the operation name will remain + blank. + + ```go + //dd:span other:tag span.name:custom-operation-name + myOp := func() { + // The default operation name would have been "tag" + } + ``` + +extends: + - ../../internal/orchestrion/gls.orchestrion.yml + +aspects: + # Automatically manage the tracer lifecycle + - id: func main() + join-point: + all-of: + - package-name: main + - test-main: false + - function-body: + function: + - name: main + - signature: {} + advice: + - inject-declarations: + imports: + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + # Note: it is valid to have multiple func init() in a single compile unit (e.g, `.go` file), in which case + # they get executed in declaration order. This means it's okay for us to add a new init function if there is + # already one in the file, but as it currently is appended AFTER all other declarations in the file, it means + # that it will be executed last (tracing contents of previous init functions will not be possible). + template: func init() { tracer.Start() } + # We need to stop the tracer at the end of `main` to ensure all spans are properly flushed. + - prepend-statements: + imports: + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + template: |- + defer tracer.Stop() + + # Create spans for each function annotated with the //dd:span directive. + - id: '//dd:span' + join-point: + function-body: + directive: 'dd:span' + advice: + - prepend-statements: + imports: + context: context + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + template: |- + {{- $ctx := .Function.ArgumentOfType "context.Context" -}} + {{- $req := .Function.ArgumentOfType "*net/http.Request" -}} + {{- if (eq $ctx "") -}} + {{- $ctx = "ctx" -}} + ctx := {{- with $req -}} + {{ $req }}.Context() + {{- else -}} + context.TODO() + {{- end }} + {{ end -}} + + {{ $functionName := .Function.Name -}} + {{- $opName := $functionName -}} + {{- range .DirectiveArgs "dd:span" -}} + {{- if eq $opName "" -}} + {{ $opName = .Value }} + {{- end -}} + {{- if eq .Key "span.name" -}} + {{- $opName = .Value -}} + {{- break -}} + {{- end -}} + {{- end -}} + + var span *tracer.Span + span, {{ $ctx }} = tracer.StartSpanFromContext({{ $ctx }}, {{ printf "%q" $opName }}, + {{- with $functionName }} + tracer.Tag("function-name", {{ printf "%q" $functionName }}), + {{ end -}} + {{- range .DirectiveArgs "dd:span" }} + {{ if eq .Key "span.name" -}}{{- continue -}}{{- end -}} + tracer.Tag({{ printf "%q" .Key }}, {{ printf "%q" .Value }}), + {{- end }} + ) + {{- with $req }} + {{ $req }} = {{ $req }}.WithContext({{ $ctx }}) + {{- end }} + + {{ with .Function.ResultOfType "error" -}} + defer func(){ + span.Finish(tracer.WithError({{ . }})) + }() + {{ else -}} + defer span.Finish() + {{- end -}} diff --git a/ddtrace/tracer/otel_dd_mappings.go b/ddtrace/tracer/otel_dd_mappings.go index 1b17d86560..9d4e5c5a00 100644 --- a/ddtrace/tracer/otel_dd_mappings.go +++ b/ddtrace/tracer/otel_dd_mappings.go @@ -6,12 +6,13 @@ package tracer import ( "fmt" - "os" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) // otelDDEnv contains env vars from both dd (DD) and ot (OTEL) that map to the same tracer configuration @@ -20,6 +21,7 @@ type otelDDEnv struct { dd string ot string remapper func(string) (string, error) + handsOff bool // if true, check for configuration set in application_monitoring.yaml file } var otelDDConfigs = map[string]*otelDDEnv{ @@ -27,36 +29,43 @@ var otelDDConfigs = map[string]*otelDDEnv{ dd: "DD_SERVICE", ot: "OTEL_SERVICE_NAME", remapper: mapService, + handsOff: false, }, "metrics": { dd: "DD_RUNTIME_METRICS_ENABLED", ot: "OTEL_METRICS_EXPORTER", remapper: mapMetrics, + handsOff: true, }, "debugMode": { dd: "DD_TRACE_DEBUG", ot: "OTEL_LOG_LEVEL", remapper: mapLogLevel, + handsOff: true, }, "enabled": { dd: "DD_TRACE_ENABLED", ot: "OTEL_TRACES_EXPORTER", remapper: mapEnabled, + handsOff: false, }, "sampleRate": { dd: "DD_TRACE_SAMPLE_RATE", ot: "OTEL_TRACES_SAMPLER", remapper: mapSampleRate, + handsOff: false, }, "propagationStyle": { dd: "DD_TRACE_PROPAGATION_STYLE", ot: "OTEL_PROPAGATORS", remapper: mapPropagationStyle, + handsOff: false, }, "resourceAttributes": { dd: "DD_TAGS", ot: "OTEL_RESOURCE_ATTRIBUTES", remapper: mapDDTags, + handsOff: false, }, } @@ -87,25 +96,50 @@ func getDDorOtelConfig(configName string) string { panic(fmt.Sprintf("Programming Error: %v not found in supported configurations", configName)) } - val := os.Getenv(config.dd) - if otVal := os.Getenv(config.ot); otVal != "" { + // 1. Check managed stable config if handsOff + if config.handsOff { + if v := stableconfig.ManagedConfig.Get(config.dd); v != "" { + telemetry.RegisterAppConfigs(telemetry.Configuration{Name: telemetry.EnvToTelemetryName(config.dd), Value: v, Origin: telemetry.OriginManagedStableConfig, ID: stableconfig.ManagedConfig.GetID()}) + return v + } + } + + // 2. Check environment variables (DD or OT) + val := env.Get(config.dd) + key := config.dd // Store the environment variable that will be used to set the config + if otVal := env.Get(config.ot); otVal != "" { ddPrefix := "config_datadog:" otelPrefix := "config_opentelemetry:" if val != "" { - log.Warn("Both %v and %v are set, using %v=%v", config.ot, config.dd, config.dd, val) + log.Warn("Both %q and %q are set, using %s=%s", config.ot, config.dd, config.dd, val) telemetryTags := []string{ddPrefix + strings.ToLower(config.dd), otelPrefix + strings.ToLower(config.ot)} - telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "otel.env.hiding", 1.0, telemetryTags, true) + telemetry.Count(telemetry.NamespaceTracers, "otel.env.hiding", telemetryTags).Submit(1) } else { v, err := config.remapper(otVal) if err != nil { - log.Warn(err.Error()) + log.Warn("%s", err.Error()) telemetryTags := []string{ddPrefix + strings.ToLower(config.dd), otelPrefix + strings.ToLower(config.ot)} - telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "otel.env.invalid", 1.0, telemetryTags, true) + telemetry.Count(telemetry.NamespaceTracers, "otel.env.invalid", telemetryTags).Submit(1) } + key = config.ot val = v } } - return val + if val != "" { + telemetry.RegisterAppConfig(telemetry.EnvToTelemetryName(key), val, telemetry.OriginEnvVar) + return val + } + + // 3. If handsOff, check local stable config + if config.handsOff { + if v := stableconfig.LocalConfig.Get(config.dd); v != "" { + telemetry.RegisterAppConfigs(telemetry.Configuration{Name: telemetry.EnvToTelemetryName(config.dd), Value: v, Origin: telemetry.OriginLocalStableConfig, ID: stableconfig.LocalConfig.GetID()}) + return v + } + } + + // 4. Not found, return empty string + return "" } // mapDDTags maps OTEL_RESOURCE_ATTRIBUTES to DD_TAGS @@ -122,7 +156,7 @@ func mapDDTags(ot string) (string, error) { }) if len(ddTags) > 10 { - log.Warn("The following resource attributes have been dropped: %v. Only the first 10 resource attributes will be applied: %v", ddTags[10:], ddTags[:10]) + log.Warn("The following resource attributes have been dropped: %v. Only the first 10 resource attributes will be applied: %s", ddTags[10:], ddTags[:10]) //nolint:gocritic // Slice logging for debugging ddTags = ddTags[:10] } @@ -140,7 +174,7 @@ func mapMetrics(ot string) (string, error) { if ot == "none" { return "false", nil } - return "", fmt.Errorf("The following configuration is not supported: OTEL_METRICS_EXPORTER=%v", ot) + return "", fmt.Errorf("the following configuration is not supported: OTEL_METRICS_EXPORTER=%v", ot) } // mapLogLevel maps OTEL_LOG_LEVEL to DD_TRACE_DEBUG @@ -148,7 +182,7 @@ func mapLogLevel(ot string) (string, error) { if strings.TrimSpace(strings.ToLower(ot)) == "debug" { return "true", nil } - return "", fmt.Errorf("The following configuration is not supported: OTEL_LOG_LEVEL=%v", ot) + return "", fmt.Errorf("the following configuration is not supported: OTEL_LOG_LEVEL=%v", ot) } // mapEnabled maps OTEL_TRACES_EXPORTER to DD_TRACE_ENABLED @@ -156,12 +190,12 @@ func mapEnabled(ot string) (string, error) { if strings.TrimSpace(strings.ToLower(ot)) == "none" { return "false", nil } - return "", fmt.Errorf("The following configuration is not supported: OTEL_METRICS_EXPORTER=%v", ot) + return "", fmt.Errorf("the following configuration is not supported: OTEL_METRICS_EXPORTER=%v", ot) } // mapSampleRate maps OTEL_TRACES_SAMPLER to DD_TRACE_SAMPLE_RATE func otelTraceIDRatio() string { - if v := os.Getenv("OTEL_TRACES_SAMPLER_ARG"); v != "" { + if v := env.Get("OTEL_TRACES_SAMPLER_ARG"); v != "" { return v } return "1.0" @@ -171,7 +205,7 @@ func otelTraceIDRatio() string { func mapSampleRate(ot string) (string, error) { ot = strings.TrimSpace(strings.ToLower(ot)) if v, ok := unsupportedSamplerMapping[ot]; ok { - log.Warn("The following configuration is not supported: OTEL_TRACES_SAMPLER=%v. %v will be used", ot, v) + log.Warn("The following configuration is not supported: OTEL_TRACES_SAMPLER=%s. %s will be used", ot, v) ot = v } @@ -195,7 +229,7 @@ func mapPropagationStyle(ot string) (string, error) { if _, ok := propagationMapping[otStyle]; ok { supportedStyles = append(supportedStyles, propagationMapping[otStyle]) } else { - log.Warn("Invalid configuration: %v is not supported. This propagation style will be ignored.", otStyle) + log.Warn("Invalid configuration: %q is not supported. This propagation style will be ignored.", otStyle) } } return strings.Join(supportedStyles, ","), nil diff --git a/ddtrace/tracer/otel_dd_mappings_test.go b/ddtrace/tracer/otel_dd_mappings_test.go index 3f85dffa50..f03381e05d 100644 --- a/ddtrace/tracer/otel_dd_mappings_test.go +++ b/ddtrace/tracer/otel_dd_mappings_test.go @@ -9,8 +9,9 @@ import ( "testing" "github.com/stretchr/testify/assert" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" ) func TestAssessSource(t *testing.T) { @@ -29,21 +30,21 @@ func TestAssessSource(t *testing.T) { assert.Equal(t, "abc", v) }) t.Run("both", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() // DD_SERVICE prevails t.Setenv("DD_SERVICE", "abc") t.Setenv("OTEL_SERVICE_NAME", "123") v := getDDorOtelConfig("service") assert.Equal(t, "abc", v) - telemetryClient.AssertCalled(t, "Count", telemetry.NamespaceTracers, "otel.env.hiding", 1.0, []string{"config_datadog:dd_service", "config_opentelemetry:otel_service_name"}, true) + assert.NotZero(t, telemetryClient.Count(telemetry.NamespaceTracers, "otel.env.hiding", []string{"config_datadog:dd_service", "config_opentelemetry:otel_service_name"}).Get()) }) t.Run("invalid-ot", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("OTEL_LOG_LEVEL", "nonesense") v := getDDorOtelConfig("debugMode") assert.Equal(t, "", v) - telemetryClient.AssertCalled(t, "Count", telemetry.NamespaceTracers, "otel.env.invalid", 1.0, []string{"config_datadog:dd_trace_debug", "config_opentelemetry:otel_log_level"}, true) + assert.NotZero(t, telemetryClient.Count(telemetry.NamespaceTracers, "otel.env.invalid", []string{"config_datadog:dd_trace_debug", "config_opentelemetry:otel_log_level"}).Get()) }) } diff --git a/ddtrace/tracer/payload.go b/ddtrace/tracer/payload.go index 8b08e8a713..8491189dc4 100644 --- a/ddtrace/tracer/payload.go +++ b/ddtrace/tracer/payload.go @@ -6,149 +6,156 @@ package tracer import ( - "bytes" - "encoding/binary" "io" - "sync/atomic" - - "github.com/tinylib/msgp/msgp" + "sync" ) -// payload is a wrapper on top of the msgpack encoder which allows constructing an -// encoded array by pushing its entries sequentially, one at a time. It basically -// allows us to encode as we would with a stream, except that the contents of the stream -// can be read as a slice by the msgpack decoder at any time. It follows the guidelines -// from the msgpack array spec: -// https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family -// -// payload implements io.Reader and can be used with the decoder directly. To create -// a new payload use the newPayload method. -// -// payload is not safe for concurrent use. -// -// payload is meant to be used only once and eventually dismissed with the -// single exception of retrying failed flush attempts. -// -// ⚠️ Warning! -// -// The payload should not be reused for multiple sets of traces. Resetting the -// payload for re-use requires the transport to wait for the HTTP package to -// Close the request body before attempting to re-use it again! This requires -// additional logic to be in place. See: -// -// • https://github.com/golang/go/blob/go1.16/src/net/http/client.go#L136-L138 -// • https://github.com/DataDog/dd-trace-go/pull/475 -// • https://github.com/DataDog/dd-trace-go/pull/549 -// • https://github.com/DataDog/dd-trace-go/pull/976 -type payload struct { - // header specifies the first few bytes in the msgpack stream - // indicating the type of array (fixarray, array16 or array32) - // and the number of items contained in the stream. - header []byte - - // off specifies the current read position on the header. - off int - - // count specifies the number of items in the stream. - count uint32 - - // buf holds the sequence of msgpack-encoded items. - buf bytes.Buffer - - // reader is used for reading the contents of buf. - reader *bytes.Reader -} - -var _ io.Reader = (*payload)(nil) - -// newPayload returns a ready to use payload. -func newPayload() *payload { - p := &payload{ - header: make([]byte, 8), - off: 8, - } - return p +// payloadStats contains the statistics of a payload. +type payloadStats struct { + size int // size in bytes + itemCount int // number of items (traces) } -// push pushes a new item into the stream. -func (p *payload) push(t spanList) error { - p.buf.Grow(t.Msgsize()) - if err := msgp.Encode(&p.buf, t); err != nil { - return err - } - atomic.AddUint32(&p.count, 1) - p.updateHeader() - return nil -} +// payloadWriter defines the interface for writing data to a payload. +type payloadWriter interface { + io.Writer + + push(t spanList) (stats payloadStats, err error) + grow(n int) + reset() + clear() -// itemCount returns the number of items available in the srteam. -func (p *payload) itemCount() int { - return int(atomic.LoadUint32(&p.count)) + // recordItem records that an item was added and updates the header + recordItem() } -// size returns the payload size in bytes. After the first read the value becomes -// inaccurate by up to 8 bytes. -func (p *payload) size() int { - return p.buf.Len() + len(p.header) - p.off +// payloadReader defines the interface for reading data from a payload. +type payloadReader interface { + io.Reader + io.Closer + + stats() payloadStats + size() int + itemCount() int + protocol() float64 } -// reset sets up the payload to be read a second time. It maintains the -// underlying byte contents of the buffer. reset should not be used in order to -// reuse the payload for another set of traces. -func (p *payload) reset() { - p.updateHeader() - if p.reader != nil { - p.reader.Seek(0, 0) - } +// payload combines both reading and writing operations for a payload. +type payload interface { + payloadWriter + payloadReader } -// clear empties the payload buffers. -func (p *payload) clear() { - p.buf = bytes.Buffer{} - p.reader = nil +// newPayload returns a ready to use payload. +func newPayload(protocol float64) payload { + if protocol == traceProtocolV1 { + return &safePayload{ + p: newPayloadV1(), + } + } + return &safePayload{ + p: newPayloadV04(), + } } // https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family const ( + // arrays msgpackArrayFix byte = 144 // up to 15 items - msgpackArray16 = 0xdc // up to 2^16-1 items, followed by size in 2 bytes - msgpackArray32 = 0xdd // up to 2^32-1 items, followed by size in 4 bytes + msgpackArray16 byte = 0xdc // up to 2^16-1 items, followed by size in 2 bytes + msgpackArray32 byte = 0xdd // up to 2^32-1 items, followed by size in 4 bytes + + // maps + msgpackMapFix byte = 0x80 // up to 15 items + msgpackMap16 byte = 0xde // up to 2^16-1 items, followed by size in 2 bytes + msgpackMap32 byte = 0xdf // up to 2^32-1 items, followed by size in 4 bytes ) -// updateHeader updates the payload header based on the number of items currently -// present in the stream. -func (p *payload) updateHeader() { - n := uint64(atomic.LoadUint32(&p.count)) - switch { - case n <= 15: - p.header[7] = msgpackArrayFix + byte(n) - p.off = 7 - case n <= 1<<16-1: - binary.BigEndian.PutUint64(p.header, n) // writes 2 bytes - p.header[5] = msgpackArray16 - p.off = 5 - default: // n <= 1<<32-1 - binary.BigEndian.PutUint64(p.header, n) // writes 4 bytes - p.header[3] = msgpackArray32 - p.off = 3 - } +// safePayload provides a thread-safe wrapper around payload. +type safePayload struct { + mu sync.RWMutex + p payload } -// Close implements io.Closer -func (p *payload) Close() error { - return nil +// push pushes a new item into the stream in a thread-safe manner. +func (sp *safePayload) push(t spanList) (stats payloadStats, err error) { + sp.mu.Lock() + defer sp.mu.Unlock() + return sp.p.push(t) } -// Read implements io.Reader. It reads from the msgpack-encoded stream. -func (p *payload) Read(b []byte) (n int, err error) { - if p.off < len(p.header) { - // reading header - n = copy(b, p.header[p.off:]) - p.off += n - return n, nil - } - if p.reader == nil { - p.reader = bytes.NewReader(p.buf.Bytes()) - } - return p.reader.Read(b) +// itemCount returns the number of items available in the stream in a thread-safe manner. +// This method is not thread-safe, but the underlying payload.itemCount() must be. +func (sp *safePayload) itemCount() int { + return sp.p.itemCount() +} + +// size returns the payload size in bytes in a thread-safe manner. +func (sp *safePayload) size() int { + sp.mu.RLock() + defer sp.mu.RUnlock() + return sp.p.size() +} + +// reset sets up the payload to be read a second time in a thread-safe manner. +func (sp *safePayload) reset() { + sp.mu.Lock() + defer sp.mu.Unlock() + sp.p.reset() +} + +// clear empties the payload buffers in a thread-safe manner. +func (sp *safePayload) clear() { + sp.mu.Lock() + defer sp.mu.Unlock() + sp.p.clear() +} + +// Read implements io.Reader in a thread-safe manner. +func (sp *safePayload) Read(b []byte) (n int, err error) { + // Note: Read modifies internal state (off, reader), so we need full lock + sp.mu.Lock() + defer sp.mu.Unlock() + return sp.p.Read(b) +} + +// Close implements io.Closer in a thread-safe manner. +func (sp *safePayload) Close() error { + sp.mu.Lock() + defer sp.mu.Unlock() + return sp.p.Close() +} + +// Write implements io.Writer in a thread-safe manner. +func (sp *safePayload) Write(data []byte) (n int, err error) { + sp.mu.Lock() + defer sp.mu.Unlock() + return sp.p.Write(data) +} + +// grow grows the buffer to ensure it can accommodate n more bytes in a thread-safe manner. +func (sp *safePayload) grow(n int) { + sp.mu.Lock() + defer sp.mu.Unlock() + sp.p.grow(n) +} + +// recordItem records that an item was added and updates the header in a thread-safe manner. +func (sp *safePayload) recordItem() { + sp.mu.Lock() + defer sp.mu.Unlock() + sp.p.recordItem() +} + +// stats returns the current stats of the payload in a thread-safe manner. +func (sp *safePayload) stats() payloadStats { + sp.mu.RLock() + defer sp.mu.RUnlock() + return sp.p.stats() +} + +// protocol returns the protocol version of the payload in a thread-safe manner. +func (sp *safePayload) protocol() float64 { + // Protocol is immutable after creation - no lock needed + return sp.p.protocol() } diff --git a/ddtrace/tracer/payload_test.go b/ddtrace/tracer/payload_test.go index 17e1dd91b1..3dad5dd2fa 100644 --- a/ddtrace/tracer/payload_test.go +++ b/ddtrace/tracer/payload_test.go @@ -7,24 +7,49 @@ package tracer import ( "bytes" + "fmt" "io" + "math" "strconv" "strings" + "sync" "sync/atomic" "testing" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "github.com/tinylib/msgp/msgp" ) var fixedTime = now() +// creates a simple span list with n spans func newSpanList(n int) spanList { itoa := map[int]string{0: "0", 1: "1", 2: "2", 3: "3", 4: "4", 5: "5"} - list := make([]*span, n) + list := make([]*Span, n) for i := 0; i < n; i++ { list[i] = newBasicSpan("span.list." + itoa[i%5+1]) - list[i].Start = fixedTime + list[i].start = fixedTime + } + return list +} + +// creates a list of n spans, populated with SpanLinks, SpanEvents, and other fields +func newDetailedSpanList(n int) spanList { + itoa := map[int]string{0: "0", 1: "1", 2: "2", 3: "3", 4: "4", 5: "5"} + list := make([]*Span, n) + for i := 0; i < n; i++ { + list[i] = newBasicSpan("span.list." + itoa[i%5+1]) + list[i].start = fixedTime + list[i].service = "golden" + list[i].resource = "resource." + itoa[i%5+1] + list[i].error = int32(i % 2) + list[i].SetTag("tag."+itoa[i%5+1], "value."+itoa[i%5+1]) + list[i].spanLinks = []SpanLink{{TraceID: 1, SpanID: 1}, {TraceID: 2, SpanID: 2}} + list[i].spanEvents = []spanEvent{{Name: "span.event." + itoa[i%5+1]}} } return list } @@ -37,18 +62,19 @@ func TestPayloadIntegrity(t *testing.T) { for _, n := range []int{10, 1 << 10, 1 << 17} { t.Run(strconv.Itoa(n), func(t *testing.T) { assert := assert.New(t) - p := newPayload() + p := newPayload(traceProtocolV04) lists := make(spanLists, n) for i := 0; i < n; i++ { list := newSpanList(i%5 + 1) lists[i] = list - p.push(list) + _, _ = p.push(list) } want.Reset() err := msgp.Encode(want, lists) assert.NoError(err) - assert.Equal(want.Len(), p.size()) - assert.Equal(p.itemCount(), n) + stats := p.stats() + assert.Equal(want.Len(), stats.size) + assert.Equal(n, stats.itemCount) got, err := io.ReadAll(p) assert.NoError(err) @@ -57,23 +83,180 @@ func TestPayloadIntegrity(t *testing.T) { } } -// TestPayloadDecode ensures that whatever we push into the payload can +// TestPayloadV04Decode ensures that whatever we push into a v0.4 payload can // be decoded by the codec. -func TestPayloadDecode(t *testing.T) { - assert := assert.New(t) +func TestPayloadV04Decode(t *testing.T) { for _, n := range []int{10, 1 << 10} { t.Run(strconv.Itoa(n), func(t *testing.T) { - p := newPayload() + assert := assert.New(t) + p := newPayload(traceProtocolV04) for i := 0; i < n; i++ { - p.push(newSpanList(i%5 + 1)) + _, _ = p.push(newSpanList(i%5 + 1)) } var got spanLists err := msgp.Decode(p, &got) assert.NoError(err) + assertProcessTags(t, got) }) } } +// TestPayloadV1Decode ensures that whatever we push into a v1 payload can +// be decoded by the codec, and that it matches the original payload. +func TestPayloadV1Decode(t *testing.T) { + for _, n := range []int{10, 1 << 10} { + t.Run("simple"+strconv.Itoa(n), func(t *testing.T) { + var ( + assert = assert.New(t) + p = newPayloadV1() + ) + p.SetContainerID("containerID") + p.SetLanguageName("go") + p.SetLanguageVersion("1.25") + p.SetTracerVersion(version.Tag) + p.SetRuntimeID(globalconfig.RuntimeID()) + p.SetEnv("test") + p.SetHostname("hostname") + p.SetAppVersion("appVersion") + + for i := 0; i < n; i++ { + _, _ = p.push(newSpanList(i%5 + 1)) + } + + encoded, err := io.ReadAll(p) + assert.NoError(err) + + got := newPayloadV1() + buf := bytes.NewBuffer(encoded) + _, err = buf.WriteTo(got) + assert.NoError(err) + + o, err := got.decodeBuffer() + assert.NoError(err) + assert.Empty(o) + assert.Equal(p.fields, got.fields) + assert.Equal(p.containerID, got.containerID) + assert.Equal(p.languageName, got.languageName) + assert.Equal(p.languageVersion, got.languageVersion) + assert.Equal(p.tracerVersion, got.tracerVersion) + assert.Equal(p.runtimeID, got.runtimeID) + assert.Equal(p.env, got.env) + assert.Equal(p.hostname, got.hostname) + assert.Equal(p.appVersion, got.appVersion) + assert.Equal(p.fields, got.fields) + }) + + t.Run("detailed"+strconv.Itoa(n), func(t *testing.T) { + var ( + assert = assert.New(t) + p = newPayloadV1() + ) + + for i := 0; i < n; i++ { + _, _ = p.push(newDetailedSpanList(i%5 + 1)) + } + encoded, err := io.ReadAll(p) + assert.NoError(err) + + got := newPayloadV1() + buf := bytes.NewBuffer(encoded) + _, err = buf.WriteTo(got) + assert.NoError(err) + + o, err := got.decodeBuffer() + assert.NoError(err) + assert.Empty(o) + assert.NotEmpty(got.attributes) + assert.Equal(p.attributes, got.attributes) + assert.Equal(got.attributes[keyProcessTags].value, processtags.GlobalTags().String()) + assert.Greater(len(got.chunks), 0) + assert.Equal(p.chunks[0].traceID, got.chunks[0].traceID) + assert.Equal(p.chunks[0].spans[0].spanID, got.chunks[0].spans[0].spanID) + assert.Equal(got.chunks[0].attributes["service"].value, "golden") + }) + } +} + +// TestPayloadV1EmbeddedStreamingStringTable tests that string values on the payload +// can be encoded and decoded correctly after using the string table. +// Tests repeated string values. +func TestPayloadV1EmbeddedStreamingStringTable(t *testing.T) { + p := newPayloadV1() + p.SetHostname("production") + p.SetEnv("production") + p.SetLanguageName("go") + + assert := assert.New(t) + encoded, err := io.ReadAll(p) + assert.NoError(err) + + got := newPayloadV1() + buf := bytes.NewBuffer(encoded) + _, err = buf.WriteTo(got) + assert.NoError(err) + + o, err := got.decodeBuffer() + assert.NoError(err) + assert.Empty(o) + assert.Equal(p.languageName, got.languageName) + assert.Equal(p.hostname, got.hostname) + assert.Equal(p.env, got.env) +} + +// TestPayloadV1UpdateHeader tests that the header of the payload is updated and grown correctly. +func TestPayloadV1UpdateHeader(t *testing.T) { + testCases := []uint32{ // Number of items + 0, + 15, + math.MaxUint16, + math.MaxUint32, + } + for _, tc := range testCases { + t.Run(fmt.Sprintf("n=%d", tc), func(t *testing.T) { + var ( + p = payloadV1{ + fields: tc, + header: make([]byte, 8), + } + expected []byte + ) + expected = msgp.AppendMapHeader(expected, tc) + p.updateHeader() + if got := p.header[p.readOff:]; !bytes.Equal(expected, got) { + t.Fatalf("expected %+v, got %+v", expected, got) + } + }) + } +} + +// TestEmptyPayloadV1 tests that an empty payload can be encoded and decoded correctly. +// Notably, it should send an empty map. +func TestEmptyPayloadV1(t *testing.T) { + p := newPayloadV1() + assert := assert.New(t) + encoded, err := io.ReadAll(p) + assert.NoError(err) + length, o, err := msgp.ReadMapHeaderBytes(encoded) + assert.NoError(err) + assert.Equal(uint32(0), length) + assert.Empty(o) +} + +func assertProcessTags(t *testing.T, payload spanLists) { + assert := assert.New(t) + for i, spanList := range payload { + for j, span := range spanList { + processTags, ok := span.meta[keyProcessTags] + if i+j == 0 { + assert.True(ok, "process tags should be present on the first span of each chunk only") + assert.Contains(processTags, "entrypoint.name", "process tags should have entrypoint.name") + break + } + require.False(t, ok, "process tags should be present on the first span of each chunk only (chunk: %d span: %d)", i, j) + } + } +} + func BenchmarkPayloadThroughput(b *testing.B) { b.Run("10K", benchmarkPayloadThroughput(1)) b.Run("100K", benchmarkPayloadThroughput(10)) @@ -85,9 +268,9 @@ func BenchmarkPayloadThroughput(b *testing.B) { // payload is filled. func benchmarkPayloadThroughput(count int) func(*testing.B) { return func(b *testing.B) { - p := newPayload() + p := newPayloadV04() s := newBasicSpan("X") - s.Meta["key"] = strings.Repeat("X", 10*1024) + s.meta["key"] = strings.Repeat("X", 10*1024) trace := make(spanList, count) for i := 0; i < count; i++ { trace[i] = s @@ -102,9 +285,241 @@ func benchmarkPayloadThroughput(count int) func(*testing.B) { } for i := 0; i < b.N; i++ { reset() - for p.size() < payloadMaxLimit { - p.push(trace) + for p.stats().size < payloadMaxLimit { + _, _ = p.push(trace) } } } } + +// TestPayloadConcurrentAccess tests that payload operations are safe for concurrent use +func TestPayloadConcurrentAccess(t *testing.T) { + p := newPayload(traceProtocolV04) + + // Create some test spans + spans := make(spanList, 10) + for i := 0; i < 10; i++ { + spans[i] = newBasicSpan("test-span") + } + + var wg sync.WaitGroup + + // Start multiple goroutines that perform concurrent operations + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + // Push some spans + for j := 0; j < 5; j++ { + _, _ = p.push(spans) + } + + // Read size and item count concurrently + for j := 0; j < 10; j++ { + stats := p.stats() + _ = stats.size + _ = stats.itemCount + } + }() + } + + // Also perform operations from the main goroutine + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < 20; i++ { + _ = p.stats().size + } + }() + + wg.Wait() + + // Verify the payload is in a consistent state + if p.stats().itemCount == 0 { + t.Error("Expected payload to have items after concurrent operations") + } + + if p.stats().size <= 0 { + t.Error("Expected payload size to be positive after concurrent operations") + } +} + +// TestPayloadConcurrentReadWrite tests concurrent read and write operations +func TestPayloadConcurrentReadWrite(t *testing.T) { + p := newPayload(traceProtocolV04) + + // Add some initial data + span := newBasicSpan("test") + spans := spanList{span} + _, _ = p.push(spans) + + var wg sync.WaitGroup + + // Concurrent writers + for i := 0; i < 5; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < 10; j++ { + _, _ = p.push(spans) + } + }() + } + + // Concurrent readers + for i := 0; i < 5; i++ { + wg.Add(1) + go func() { + defer wg.Done() + buf := make([]byte, 1024) + for j := 0; j < 10; j++ { + p.reset() + _, _ = p.Read(buf) + } + }() + } + + // Concurrent size/count checkers + for i := 0; i < 3; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < 20; j++ { + stats := p.stats() + _ = stats.size + _ = stats.itemCount + } + }() + } + + wg.Wait() + + // Verify final state + if p.stats().itemCount == 0 { + t.Error("Expected payload to have items") + } +} + +func BenchmarkPayloadPush(b *testing.B) { + sizes := []struct { + name string + numSpans int + spanSize int + }{ + {"1span_1KB", 1, 1}, + {"5span_1KB", 5, 1}, + {"10span_1KB", 10, 1}, + {"1span_10KB", 1, 10}, + {"5span_10KB", 5, 10}, + {"10span_50KB", 10, 50}, + } + + for _, size := range sizes { + b.Run(size.name, func(b *testing.B) { + spans := make(spanList, size.numSpans) + for i := 0; i < size.numSpans; i++ { + span := newBasicSpan("benchmark-span") + span.meta["data"] = strings.Repeat("x", size.spanSize*1024) + spans[i] = span + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + p := newPayloadV04() + _, _ = p.push(spans) + } + }) + } +} + +func BenchmarkPayloadStats(b *testing.B) { + tests := []struct { + name string + numTraces int + spansPer int + }{ + {"empty", 0, 0}, + {"small_1trace_1span", 1, 1}, + {"medium_10trace_5span", 10, 5}, + {"large_100trace_10span", 100, 10}, + } + + for _, test := range tests { + b.Run(test.name, func(b *testing.B) { + p := newPayload(traceProtocolV04) + + for i := 0; i < test.numTraces; i++ { + spans := make(spanList, test.spansPer) + for j := 0; j < test.spansPer; j++ { + spans[j] = newBasicSpan("test-span") + } + _, _ = p.push(spans) + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + stats := p.stats() + _ = stats.size + _ = stats.itemCount + } + }) + } +} + +func BenchmarkPayloadConcurrentAccess(b *testing.B) { + concurrencyLevels := []int{1, 2, 4, 8} + + for _, concurrency := range concurrencyLevels { + b.Run(fmt.Sprintf("concurrency_%d", concurrency), func(b *testing.B) { + p := newPayload(traceProtocolV04) + span := newBasicSpan("concurrent-test") + spans := spanList{span} + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + var wg sync.WaitGroup + + for j := 0; j < concurrency; j++ { + wg.Add(1) + go func() { + defer wg.Done() + _, _ = p.push(spans) + }() + } + + for j := 0; j < concurrency; j++ { + wg.Add(1) + go func() { + defer wg.Done() + _ = p.stats() + }() + } + + wg.Wait() + p.clear() + } + }) + } +} + +func TestMsgsizeAnalysis(t *testing.T) { + sizes := []int{1, 5, 10} + for _, numSpans := range sizes { + spans := make(spanList, numSpans) + for i := 0; i < numSpans; i++ { + span := newBasicSpan("test") + span.meta["data"] = strings.Repeat("x", 1024) + spans[i] = span + } + + msgsize := spans.Msgsize() + t.Logf("%d spans with 1KB each: msgsize=%d bytes", numSpans, msgsize) + } +} diff --git a/ddtrace/tracer/payload_v04.go b/ddtrace/tracer/payload_v04.go new file mode 100644 index 0000000000..90b59a8d7c --- /dev/null +++ b/ddtrace/tracer/payload_v04.go @@ -0,0 +1,192 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import ( + "bytes" + "encoding/binary" + "io" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/tinylib/msgp/msgp" +) + +// payloadV04 is a wrapper on top of the msgpack encoder which allows constructing an +// encoded array by pushing its entries sequentially, one at a time. It basically +// allows us to encode as we would with a stream, except that the contents of the stream +// can be read as a slice by the msgpack decoder at any time. It follows the guidelines +// from the msgpack array spec: +// https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family +// +// payloadV04 implements unsafePayload and can be used with the decoder directly. To create +// a new payload use the newPayloadV04 method. +// +// payloadV04 is not safe for concurrent use. +// +// payloadV04 is meant to be used only once and eventually dismissed with the +// single exception of retrying failed flush attempts. +// +// ⚠️ Warning! +// +// The payloadV04 should not be reused for multiple sets of traces. Resetting the +// payloadV04 for re-use requires the transport to wait for the HTTP package to +// Close the request body before attempting to re-use it again! This requires +// additional logic to be in place. See: +// +// • https://github.com/golang/go/blob/go1.16/src/net/http/client.go#L136-L138 +// • https://github.com/DataDog/dd-trace-go/pull/475 +// • https://github.com/DataDog/dd-trace-go/pull/549 +// • https://github.com/DataDog/dd-trace-go/pull/976 +type payloadV04 struct { + // header specifies the first few bytes in the msgpack stream + // indicating the type of array (fixarray, array16 or array32) + // and the number of items contained in the stream. + header []byte + + // off specifies the current read position on the header. + off int + + // count specifies the number of items in the stream. + count uint32 + + // buf holds the sequence of msgpack-encoded items. + buf bytes.Buffer + + // reader is used for reading the contents of buf. + reader *bytes.Reader +} + +var _ io.Reader = (*payloadV04)(nil) + +// newPayloadV04 returns a ready to use payload. +func newPayloadV04() *payloadV04 { + p := &payloadV04{ + header: make([]byte, 8), + off: 8, + } + return p +} + +// push pushes a new item into the stream. +func (p *payloadV04) push(t spanList) (stats payloadStats, err error) { + p.setTracerTags(t) + p.buf.Grow(t.Msgsize()) + if err := msgp.Encode(&p.buf, t); err != nil { + return payloadStats{}, err + } + p.recordItem() + return p.stats(), nil +} + +func (p *payloadV04) setTracerTags(t spanList) { + // set on first chunk + if atomic.LoadUint32(&p.count) != 0 { + return + } + if len(t) == 0 { + return + } + pTags := processtags.GlobalTags().String() + if pTags == "" { + return + } + t[0].setProcessTags(pTags) +} + +// itemCount returns the number of items available in the stream. +func (p *payloadV04) itemCount() int { + return int(atomic.LoadUint32(&p.count)) +} + +// size returns the payload size in bytes. After the first read the value becomes +// inaccurate by up to 8 bytes. +func (p *payloadV04) size() int { + return p.buf.Len() + len(p.header) - p.off +} + +// reset sets up the payload to be read a second time. It maintains the +// underlying byte contents of the buffer. reset should not be used in order to +// reuse the payload for another set of traces. +func (p *payloadV04) reset() { + p.updateHeader() + if p.reader != nil { + p.reader.Seek(0, 0) + } +} + +// clear empties the payload buffers. +func (p *payloadV04) clear() { + p.buf = bytes.Buffer{} + p.reader = nil +} + +// grow grows the buffer to ensure it can accommodate n more bytes. +func (p *payloadV04) grow(n int) { + p.buf.Grow(n) +} + +// recordItem records that an item was added and updates the header. +func (p *payloadV04) recordItem() { + atomic.AddUint32(&p.count, 1) + p.updateHeader() +} + +// stats returns the current stats of the payload. +func (p *payloadV04) stats() payloadStats { + return payloadStats{ + size: p.size(), + itemCount: int(atomic.LoadUint32(&p.count)), + } +} + +// protocol returns the protocol version of the payload. +func (p *payloadV04) protocol() float64 { + return traceProtocolV04 +} + +// updateHeader updates the payload header based on the number of items currently +// present in the stream. +func (p *payloadV04) updateHeader() { + n := uint64(atomic.LoadUint32(&p.count)) + switch { + case n <= 15: + p.header[7] = msgpackArrayFix + byte(n) + p.off = 7 + case n <= 1<<16-1: + binary.BigEndian.PutUint64(p.header, n) // writes 2 bytes + p.header[5] = msgpackArray16 + p.off = 5 + default: // n <= 1<<32-1 + binary.BigEndian.PutUint64(p.header, n) // writes 4 bytes + p.header[3] = msgpackArray32 + p.off = 3 + } +} + +// Close implements io.Closer +func (p *payloadV04) Close() error { + return nil +} + +// Write implements io.Writer. It writes data directly to the buffer. +func (p *payloadV04) Write(data []byte) (n int, err error) { + return p.buf.Write(data) +} + +// Read implements io.Reader. It reads from the msgpack-encoded stream. +func (p *payloadV04) Read(b []byte) (n int, err error) { + if p.off < len(p.header) { + // reading header + n = copy(b, p.header[p.off:]) + p.off += n + return n, nil + } + if p.reader == nil { + p.reader = bytes.NewReader(p.buf.Bytes()) + } + return p.reader.Read(b) +} diff --git a/ddtrace/tracer/payload_v1.go b/ddtrace/tracer/payload_v1.go new file mode 100644 index 0000000000..06decad29b --- /dev/null +++ b/ddtrace/tracer/payload_v1.go @@ -0,0 +1,1424 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "strconv" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/tinylib/msgp/msgp" +) + +// payloadV1 is a new version of a msgp payload that can be sent to the agent. +// Be aware that payloadV1 follows the same rules and constraints as payloadV04. That is: +// +// payloadV1 is not safe for concurrent use +// +// payloadV1 is meant to be used only once and eventually dismissed with the +// single exception of retrying failed flush attempts. +// +// ⚠️ Warning! +// +// The payloadV1 should not be reused for multiple sets of traces. Resetting the +// payloadV1 for re-use requires the transport to wait for the HTTP package +// Close the request body before attempting to re-use it again! +type payloadV1 struct { + // bm keeps track of which fields have been set in the payload + // bits 1-11 are used for field IDs 1-11. Bit 0 is unused. + bm bitmap + + // the string ID of the container where the tracer is running + containerID string // 2 + + // the string language name of the tracer + languageName string // 3 + + // the string language version of the tracer + languageVersion string // 4 + + // the string version of the tracer + tracerVersion string // 5 + + // the V4 string UUID representation of a tracer session + runtimeID string // 6 + + // the optional `env` string tag that set with the tracer + env string // 7 + + // the optional string hostname of where the tracer is running + hostname string // 8 + + // the optional string `version` tag for the application set in the tracer + appVersion string // 9 + + // a collection of key to value pairs common in all `chunks` + attributes map[string]anyValue // 10 + + // a list of trace `chunks` + chunks []traceChunk // 11 + + // header specifies the first few bytes in the msgpack stream + // indicating the type of map (fixmap, map16 or map32) + // and the number of items contained in the stream. + header []byte + + // readOff specifies the current read position on the header. + readOff int + + // writeOff specifies the current read position on the header. + writeOff int + + // count specifies the number of items (traceChunks) in the stream. + count uint32 + + // fields specifies the number of fields in the payload. + fields uint32 + + // buf holds the sequence of msgpack-encoded items. + buf []byte + + // reader is used for reading the contents of buf. + reader *bytes.Reader +} + +// newPayloadV1 returns a ready to use payloadV1. +func newPayloadV1() *payloadV1 { + return &payloadV1{ + attributes: make(map[string]anyValue), + chunks: make([]traceChunk, 0), + readOff: 0, + writeOff: 0, + } +} + +// push pushes a new item (a traceChunk)into the payload. +func (p *payloadV1) push(t spanList) (stats payloadStats, err error) { + // We need to hydrate the payload with everything we get from the spans. + // Conceptually, our `t spanList` corresponds to one `traceChunk`. + if !p.bm.contains(11) && len(t) > 0 { + p.bm.set(11) + atomic.AddUint32(&p.fields, 1) + } + + // For now, we blindly set the origin, priority, and attributes values for the chunk + // In the future, attributes should hold values that are shared across all chunks in the payload + origin, priority, sm, traceID := "", 0, uint32(0), [16]byte{} + attr := make(map[string]anyValue) + for _, span := range t { + if span == nil { + continue + } + // If we haven't seen the service yet, we set it blindly assuming that all the spans created by + // a service must share the same value. + if _, ok := attr["service"]; !ok { + attr["service"] = anyValue{valueType: StringValueType, value: span.Root().service} + } + binary.BigEndian.PutUint64(traceID[:8], span.Context().traceID.Upper()) + binary.BigEndian.PutUint64(traceID[8:], span.Context().traceID.Lower()) + + if prio, ok := span.Context().SamplingPriority(); ok { + origin = span.Context().origin // TODO(darccio): are we sure that origin will be shared across all the spans in the chunk? + priority = prio // TODO(darccio): the same goes for priority. + dm := span.context.trace.propagatingTag(keyDecisionMaker) + if v, err := strconv.ParseInt(dm, 10, 32); err == nil { + if v < 0 { + v = -v + } + sm = uint32(v) + } else { + log.Error("failed to convert decision maker to uint32: %s", err.Error()) + } + } + } + tc := traceChunk{ + spans: t, + priority: int32(priority), + origin: origin, + traceID: traceID[:], + samplingMechanism: uint32(sm), + attributes: attr, + } + + // Append process tags to the payload attributes + // if there are attributes available, set them in our bitmap and increment + // the number of fields. + p.setProcessTags() + if !p.bm.contains(10) && len(p.attributes) > 0 { + p.bm.set(10) + atomic.AddUint32(&p.fields, 1) + } + + p.chunks = append(p.chunks, tc) + p.recordItem() + return p.stats(), err +} + +// grows the buffer to fit n more bytes. Follows the internal Go standard +// for growing slices (https://github.com/golang/go/blob/master/src/runtime/slice.go#L289) +func (p *payloadV1) grow(n int) { + cap := cap(p.buf) + newLen := len(p.buf) + n + threshold := 256 + for { + cap += (cap + 3*threshold) >> 2 + if cap >= newLen { + break + } + } + newBuffer := make([]byte, cap) + copy(newBuffer, p.buf) + p.buf = newBuffer +} + +func (p *payloadV1) reset() { + p.updateHeader() + if p.reader != nil { + p.reader.Seek(0, 0) + } +} + +func (p *payloadV1) clear() { + p.bm = 0 + p.buf = p.buf[:0] + p.reader = nil + p.header = nil + p.readOff = 0 + atomic.StoreUint32(&p.fields, 0) + p.count = 0 +} + +// recordItem records that a new chunk was added to the payload. +func (p *payloadV1) recordItem() { + atomic.AddUint32(&p.count, 1) +} + +func (p *payloadV1) stats() payloadStats { + return payloadStats{ + size: p.size(), + itemCount: p.itemCount(), + } +} + +func (p *payloadV1) size() int { + return len(p.buf) + len(p.header) - p.readOff +} + +func (p *payloadV1) itemCount() int { + return int(atomic.LoadUint32(&p.count)) +} + +func (p *payloadV1) protocol() float64 { + return traceProtocolV1 +} + +func (p *payloadV1) updateHeader() { + if len(p.header) == 0 { + p.header = make([]byte, 8) + } + n := atomic.LoadUint32(&p.fields) + switch { + case n <= 15: + p.header[7] = msgpackMapFix + byte(n) + p.readOff = 7 + case n <= 1<<16-1: + binary.BigEndian.PutUint64(p.header, uint64(n)) // writes 2 bytes + p.header[5] = msgpackMap16 + p.readOff = 5 + default: // n <= 1<<32-1 + binary.BigEndian.PutUint64(p.header, uint64(n)) // writes 4 bytes + p.header[3] = msgpackMap32 + p.readOff = 3 + } +} + +// Set process tags onto the payload attributes +func (p *payloadV1) setProcessTags() { + if atomic.LoadUint32(&p.count) != 0 { + return + } + pTags := processtags.GlobalTags().String() + if pTags == "" { + return + } + p.attributes[keyProcessTags] = anyValue{ + valueType: StringValueType, + value: pTags, + } +} + +func (p *payloadV1) Close() error { + p.clear() + return nil +} + +func (p *payloadV1) Write(b []byte) (int, error) { + p.buf = append(p.buf, b...) + return len(b), nil +} + +// Read implements io.Reader. It reads from the msgpack-encoded stream. +func (p *payloadV1) Read(b []byte) (n int, err error) { + if len(p.header) == 0 { + p.header = make([]byte, 8) + p.updateHeader() + } + if p.readOff < len(p.header) { + // reading header + n = copy(b, p.header[p.readOff:]) + p.readOff += n + return n, nil + } + if len(p.buf) == 0 { + p.encode() + } + if p.reader == nil { + p.reader = bytes.NewReader(p.buf) + } + return p.reader.Read(b) +} + +// encode writes existing payload fields into the buffer in msgp format. +func (p *payloadV1) encode() { + st := newStringTable() + p.buf = encodeField(p.buf, p.bm, 2, p.containerID, st) + p.buf = encodeField(p.buf, p.bm, 3, p.languageName, st) + p.buf = encodeField(p.buf, p.bm, 4, p.languageVersion, st) + p.buf = encodeField(p.buf, p.bm, 5, p.tracerVersion, st) + p.buf = encodeField(p.buf, p.bm, 6, p.runtimeID, st) + p.buf = encodeField(p.buf, p.bm, 7, p.env, st) + p.buf = encodeField(p.buf, p.bm, 8, p.hostname, st) + p.buf = encodeField(p.buf, p.bm, 9, p.appVersion, st) + + p.encodeAttributes(p.bm, 10, p.attributes, st) + + p.encodeTraceChunks(p.bm, 11, p.chunks, st) +} + +type fieldValue interface { + bool | []byte | int32 | int64 | uint32 | uint64 | string +} + +// encodeField takes a field of any fieldValue and encodes it into the given buffer +// in msgp format. +func encodeField[F fieldValue](buf []byte, bm bitmap, fieldID uint32, a F, st *stringTable) []byte { + if !bm.contains(fieldID) { + return buf + } + buf = msgp.AppendUint32(buf, uint32(fieldID)) // msgp key + switch value := any(a).(type) { + case string: + // encode msgp value, either by pulling from string table or writing it directly + buf = st.serialize(value, buf) + case bool: + buf = msgp.AppendBool(buf, value) + case float64: + buf = msgp.AppendFloat64(buf, value) + case int32, int64: + buf = msgp.AppendInt64(buf, handleIntValue(value)) + case uint32: + buf = msgp.AppendUint32(buf, value) + case uint64: + buf = msgp.AppendUint64(buf, value) + case []byte: + buf = msgp.AppendBytes(buf, value) + case arrayValue: + buf = msgp.AppendArrayHeader(buf, uint32(len(value))) + for _, v := range value { + buf = v.encode(buf, st) + } + } + return buf +} + +// encodeAttributes encodes an array associated with fieldID into the buffer in msgp format. +// Each attribute is encoded as three values: the key, value type, and value. +func (p *payloadV1) encodeAttributes(bm bitmap, fieldID int, kv map[string]anyValue, st *stringTable) (bool, error) { + if !bm.contains(uint32(fieldID)) { + return false, nil + } + + p.buf = msgp.AppendUint32(p.buf, uint32(fieldID)) // msgp key + p.buf = msgp.AppendArrayHeader(p.buf, uint32(len(kv)*3)) // number of item pairs in array + + for k, v := range kv { + // encode msgp key + p.buf = st.serialize(k, p.buf) + + // encode value + p.buf = v.encode(p.buf, st) + } + return true, nil +} + +// encodeTraceChunks encodes a list of trace chunks associated with fieldID into p.buf in msgp format. +func (p *payloadV1) encodeTraceChunks(bm bitmap, fieldID int, tc []traceChunk, st *stringTable) (bool, error) { + if len(tc) == 0 || !bm.contains(uint32(fieldID)) { + return false, nil + } + + p.buf = msgp.AppendUint32(p.buf, uint32(fieldID)) // msgp key + p.buf = msgp.AppendArrayHeader(p.buf, uint32(len(tc))) // number of chunks + for _, chunk := range tc { + p.buf = msgp.AppendMapHeader(p.buf, 7) // number of fields in chunk + + // priority + p.buf = encodeField(p.buf, fullSetBitmap, 1, chunk.priority, st) + + // origin + p.buf = encodeField(p.buf, fullSetBitmap, 2, chunk.origin, st) + + // attributes + p.encodeAttributes(fullSetBitmap, 3, chunk.attributes, st) + + // spans + p.encodeSpans(fullSetBitmap, 4, chunk.spans, st) + + // droppedTrace + p.buf = encodeField(p.buf, fullSetBitmap, 5, chunk.droppedTrace, st) + + // traceID + p.buf = encodeField(p.buf, fullSetBitmap, 6, chunk.traceID, st) + + // samplingMechanism + p.buf = encodeField(p.buf, fullSetBitmap, 7, chunk.samplingMechanism, st) + } + + return true, nil +} + +// encodeSpans encodes a list of spans associated with fieldID into p.buf in msgp format. +func (p *payloadV1) encodeSpans(bm bitmap, fieldID int, spans spanList, st *stringTable) (bool, error) { + if len(spans) == 0 || !bm.contains(uint32(fieldID)) { + return false, nil + } + + p.buf = msgp.AppendUint32(p.buf, uint32(fieldID)) // msgp key + p.buf = msgp.AppendArrayHeader(p.buf, uint32(len(spans))) // number of spans + + for _, span := range spans { + if span == nil { + continue + } + p.buf = msgp.AppendMapHeader(p.buf, 16) // number of fields in span + + p.buf = encodeField(p.buf, fullSetBitmap, 1, span.service, st) + p.buf = encodeField(p.buf, fullSetBitmap, 2, span.name, st) + p.buf = encodeField(p.buf, fullSetBitmap, 3, span.resource, st) + p.buf = encodeField(p.buf, fullSetBitmap, 4, span.spanID, st) + p.buf = encodeField(p.buf, fullSetBitmap, 5, span.parentID, st) + p.buf = encodeField(p.buf, fullSetBitmap, 6, span.start, st) + p.buf = encodeField(p.buf, fullSetBitmap, 7, span.duration, st) + p.buf = encodeField(p.buf, fullSetBitmap, 8, span.error != 0, st) + + // span attributes combine the meta (tags), metrics and meta_struct + attr := map[string]anyValue{} + for k, v := range span.meta { + attr[k] = anyValue{ + valueType: StringValueType, + value: v, + } + } + for k, v := range span.metrics { + attr[k] = anyValue{ + valueType: FloatValueType, + value: v, + } + } + for k, v := range span.metaStruct { + av := buildAnyValue(v) + if av != nil { + attr[k] = *av + } + } + p.encodeAttributes(fullSetBitmap, 9, attr, st) + + p.buf = encodeField(p.buf, fullSetBitmap, 10, span.spanType, st) + p.encodeSpanLinks(fullSetBitmap, 11, span.spanLinks, st) + p.encodeSpanEvents(fullSetBitmap, 12, span.spanEvents, st) + + env := span.meta[ext.Environment] + p.buf = encodeField(p.buf, fullSetBitmap, 13, env, st) + + version := span.meta[ext.Version] + p.buf = encodeField(p.buf, fullSetBitmap, 14, version, st) + + component := span.meta[ext.Component] + p.buf = encodeField(p.buf, fullSetBitmap, 15, component, st) + + spanKind := span.meta[ext.SpanKind] + p.buf = encodeField(p.buf, fullSetBitmap, 16, getSpanKindValue(spanKind), st) + } + return true, nil +} + +// translate a span kind string to its uint32 value +func getSpanKindValue(sk string) uint32 { + switch sk { + case ext.SpanKindInternal: + return 1 + case ext.SpanKindServer: + return 2 + case ext.SpanKindClient: + return 3 + case ext.SpanKindProducer: + return 4 + case ext.SpanKindConsumer: + return 5 + default: + return 1 // default to internal + } +} + +// translate a span kind uint32 value to its string value +func getSpanKindString(sk uint32) string { + switch sk { + case 1: + return ext.SpanKindInternal + case 2: + return ext.SpanKindServer + case 3: + return ext.SpanKindClient + case 4: + return ext.SpanKindProducer + case 5: + return ext.SpanKindConsumer + default: + return ext.SpanKindInternal + } +} + +// encodeSpanLinks encodes a list of span links associated with fieldID into p.buf in msgp format. +func (p *payloadV1) encodeSpanLinks(bm bitmap, fieldID int, spanLinks []SpanLink, st *stringTable) (bool, error) { + if !bm.contains(uint32(fieldID)) { + return false, nil + } + p.buf = msgp.AppendUint32(p.buf, uint32(fieldID)) // msgp key + p.buf = msgp.AppendArrayHeader(p.buf, uint32(len(spanLinks))) // number of span links + + for _, link := range spanLinks { + p.buf = msgp.AppendMapHeader(p.buf, 5) // number of fields in span link + + p.buf = encodeField(p.buf, fullSetBitmap, 1, link.TraceID, st) + p.buf = encodeField(p.buf, fullSetBitmap, 2, link.SpanID, st) + + attr := map[string]anyValue{} + for k, v := range link.Attributes { + attr[k] = anyValue{ + valueType: StringValueType, + value: v, + } + } + p.encodeAttributes(fullSetBitmap, 3, attr, st) + + p.buf = encodeField(p.buf, fullSetBitmap, 4, link.Tracestate, st) + p.buf = encodeField(p.buf, fullSetBitmap, 5, link.Flags, st) + } + return true, nil +} + +// encodeSpanEvents encodes a list of span events associated with fieldID into p.buf in msgp format. +func (p *payloadV1) encodeSpanEvents(bm bitmap, fieldID int, spanEvents []spanEvent, st *stringTable) (bool, error) { + if !bm.contains(uint32(fieldID)) { + return false, nil + } + p.buf = msgp.AppendUint32(p.buf, uint32(fieldID)) // msgp key + p.buf = msgp.AppendArrayHeader(p.buf, uint32(len(spanEvents))) // number of span events + + for _, event := range spanEvents { + p.buf = msgp.AppendMapHeader(p.buf, 3) // number of fields in span event + + p.buf = encodeField(p.buf, fullSetBitmap, 1, event.TimeUnixNano, st) + p.buf = encodeField(p.buf, fullSetBitmap, 2, event.Name, st) + + attr := map[string]anyValue{} + for k, v := range event.Attributes { + switch v.Type { + case spanEventAttributeTypeString: + attr[k] = anyValue{ + valueType: StringValueType, + value: v.StringValue, + } + case spanEventAttributeTypeInt: + attr[k] = anyValue{ + valueType: IntValueType, + value: handleIntValue(v.IntValue), + } + case spanEventAttributeTypeDouble: + attr[k] = anyValue{ + valueType: FloatValueType, + value: v.DoubleValue, + } + case spanEventAttributeTypeBool: + attr[k] = anyValue{ + valueType: BoolValueType, + value: v.BoolValue, + } + case spanEventAttributeTypeArray: + attr[k] = anyValue{ + valueType: ArrayValueType, + value: v.ArrayValue, + } + default: + log.Warn("dropped unsupported span event attribute type %d", v.Type) + } + } + p.encodeAttributes(fullSetBitmap, 3, attr, st) + } + return true, nil +} + +// Getters for payloadV1 fields +func (p *payloadV1) GetContainerID() string { return p.containerID } +func (p *payloadV1) GetLanguageName() string { return p.languageName } +func (p *payloadV1) GetLanguageVersion() string { return p.languageVersion } +func (p *payloadV1) GetTracerVersion() string { return p.tracerVersion } +func (p *payloadV1) GetRuntimeID() string { return p.runtimeID } +func (p *payloadV1) GetEnv() string { return p.env } +func (p *payloadV1) GetHostname() string { return p.hostname } +func (p *payloadV1) GetAppVersion() string { return p.appVersion } +func (p *payloadV1) GetAttributes() map[string]anyValue { return p.attributes } + +func (p *payloadV1) SetContainerID(v string) { + p.containerID = v + p.bm.set(2) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetLanguageName(v string) { + p.languageName = v + p.bm.set(3) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetLanguageVersion(v string) { + p.languageVersion = v + p.bm.set(4) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetTracerVersion(v string) { + p.tracerVersion = v + p.bm.set(5) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetRuntimeID(v string) { + p.runtimeID = v + p.bm.set(6) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetEnv(v string) { + p.env = v + p.bm.set(7) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetHostname(v string) { + p.hostname = v + p.bm.set(8) + atomic.AddUint32(&p.fields, 1) +} + +func (p *payloadV1) SetAppVersion(v string) { + p.appVersion = v + p.bm.set(9) + atomic.AddUint32(&p.fields, 1) +} + +// decodeBuffer takes the buffer from the payload, decodes it, and populates the fields +// according to the msgpack-encoded byte stream. +func (p *payloadV1) decodeBuffer() ([]byte, error) { + numFields, o, err := msgp.ReadMapHeaderBytes(p.buf) + if err != nil { + return p.buf, err + } + p.buf = o + atomic.StoreUint32(&p.fields, numFields) + p.header = make([]byte, 8) + p.updateHeader() + + st := newStringTable() + fieldCount := 1 + for { + if len(o) == 0 || err != nil { + break + } + // read msgp field ID + var idx uint32 + idx, o, err = msgp.ReadUint32Bytes(o) + if err != nil { + break + } + + // handle attributes + if idx == 10 { + p.attributes, o, err = decodeAttributes(o, st) + if err != nil { + break + } + continue + } + + // handle trace chunks + if idx == 11 { + p.chunks, o, err = decodeTraceChunks(o, st) + if err != nil { + break + } + continue + } + + // read msgp string value + var value string + var ok bool + value, o, ok = st.read(o) + if !ok { + err = errUnableDecodeString + break + } + + switch idx { + case 2: + p.containerID = value + case 3: + p.languageName = value + case 4: + p.languageVersion = value + case 5: + p.tracerVersion = value + case 6: + p.runtimeID = value + case 7: + p.env = value + case 8: + p.hostname = value + case 9: + p.appVersion = value + default: + err = fmt.Errorf("unexpected field ID %d", idx) + } + fieldCount++ + } + return o, err +} + +// AnyValue is a representation of the `any` value. It can take the following types: +// - uint32 +// - bool +// - float64 +// - int64 +// - uint8 +// intValue(5) - 0x405 (4 indicates this is an int AnyType, then 5 is encoded using positive fixed int format) +// stringValue(“a”) - 0x1a161 (1 indicates this is a string, then “a” is encoded using fixstr 0xa161) +// stringValue(2) - 0x102 (1 indicates this is a string, then a positive fixed int of 2 refers the 2nd index of the string table) +type anyValue struct { + valueType int + value interface{} +} + +const ( + StringValueType = iota + 1 // string or uint -- 1 + BoolValueType // boolean -- 2 + FloatValueType // float64 -- 3 + IntValueType // int64 -- 4 + BytesValueType // []uint8 -- 5 + ArrayValueType // []AnyValue -- 6 + keyValueListType // []keyValue -- 7 +) + +// buildAnyValue builds an anyValue from a given any type. +func buildAnyValue(v any) *anyValue { + switch v := v.(type) { + case string: + return &anyValue{valueType: StringValueType, value: v} + case bool: + return &anyValue{valueType: BoolValueType, value: v} + case float64: + return &anyValue{valueType: FloatValueType, value: v} + case int32, int64: + return &anyValue{valueType: IntValueType, value: handleIntValue(v)} + case []byte: + return &anyValue{valueType: BytesValueType, value: v} + case arrayValue: + return &anyValue{valueType: ArrayValueType, value: v} + default: + return nil + } +} + +func (a anyValue) encode(buf []byte, st *stringTable) []byte { + buf = msgp.AppendInt32(buf, int32(a.valueType)) + switch a.valueType { + case StringValueType: + s := a.value.(string) + buf = st.serialize(s, buf) + case BoolValueType: + buf = msgp.AppendBool(buf, a.value.(bool)) + case FloatValueType: + buf = msgp.AppendFloat64(buf, a.value.(float64)) + case IntValueType: + buf = msgp.AppendInt64(buf, a.value.(int64)) + case BytesValueType: + buf = msgp.AppendBytes(buf, a.value.([]byte)) + case ArrayValueType: + buf = msgp.AppendArrayHeader(buf, uint32(len(a.value.(arrayValue)))) + for _, v := range a.value.(arrayValue) { + buf = v.encode(buf, st) + } + } + return buf +} + +// translate any int value to int64 +func handleIntValue(a any) int64 { + switch v := a.(type) { + case int64: + return v + case int32: + return int64(v) + default: + // Fallback for other integer types + return v.(int64) + } +} + +type arrayValue []anyValue + +// keeps track of which fields have been set in the payload, with a +// 1 for represented fields and 0 for unset fields. +type bitmap int32 + +// fullSetBitmap is a bitmap that represents all fields that have been set in the payload. +var fullSetBitmap bitmap = -1 + +func (b *bitmap) set(bit uint32) { + if bit >= 32 { + return + } + *b |= 1 << bit +} + +func (b bitmap) contains(bit uint32) bool { + if bit >= 32 { + return false + } + return b&(1< 0 { log.Debug("Reporting %d configuration changes to telemetry", len(telemConfigs)) - telemetry.GlobalClient.ConfigChange(telemConfigs) + telemetry.RegisterAppConfigs(telemConfigs...) } return statuses } @@ -196,24 +198,10 @@ func (t *tracer) onRemoteConfigUpdate(u remoteconfig.ProductUpdate) map[string]s log.Debug("Processing config from RC. Path: %s. Raw: %s", path, raw) var c configData if err := json.Unmarshal(raw, &c); err != nil { - log.Debug("Error while unmarshalling payload for %s: %v. Configuration won't be applied.", path, err) + log.Debug("Error while unmarshalling payload for %q: %v. Configuration won't be applied.", path, err.Error()) statuses[path] = state.ApplyStatus{State: state.ApplyStateError, Error: err.Error()} continue } - if c.ServiceTarget.Service != t.config.serviceName { - log.Debug( - "Skipping config for service %s. Current service is %s", - c.ServiceTarget.Service, - t.config.serviceName, - ) - statuses[path] = state.ApplyStatus{State: state.ApplyStateError, Error: "service mismatch"} - continue - } - if c.ServiceTarget.Env != t.config.env { - log.Debug("Skipping config for env %s. Current env is %s", c.ServiceTarget.Env, t.config.env) - statuses[path] = state.ApplyStatus{State: state.ApplyStateError, Error: "env mismatch"} - continue - } statuses[path] = state.ApplyStatus{State: state.ApplyStateAcknowledged} updated := t.config.traceSampleRate.handleRC(c.LibConfig.SamplingRate) if updated { @@ -232,24 +220,23 @@ func (t *tracer) onRemoteConfigUpdate(u remoteconfig.ProductUpdate) map[string]s telemConfigs = append(telemConfigs, t.config.globalTags.toTelemetry()) } if c.LibConfig.Enabled != nil { - if t.config.enabled.current == true && *c.LibConfig.Enabled == false { + if t.config.enabled.current && !*c.LibConfig.Enabled { log.Debug("Disabled APM Tracing through RC. Restart the service to enable it.") t.config.enabled.handleRC(c.LibConfig.Enabled) telemConfigs = append(telemConfigs, t.config.enabled.toTelemetry()) - } else if t.config.enabled.current == false && *c.LibConfig.Enabled == true { + } else if !t.config.enabled.current && *c.LibConfig.Enabled { log.Debug("APM Tracing is disabled. Restart the service to enable it.") } } } if len(telemConfigs) > 0 { log.Debug("Reporting %d configuration changes to telemetry", len(telemConfigs)) - telemetry.GlobalClient.ConfigChange(telemConfigs) + telemetry.RegisterAppConfigs(telemConfigs...) } return statuses } type dynamicInstrumentationRCProbeConfig struct { - runtimeID string configPath string configContent string } @@ -257,6 +244,19 @@ type dynamicInstrumentationRCProbeConfig struct { type dynamicInstrumentationRCState struct { sync.Mutex state map[string]dynamicInstrumentationRCProbeConfig + + // symdbExport is a flag that indicates that this tracer is resposible + // for uploading symbols to the symbol database. The tracer will learn + // about this fact through the callbacks like the other dynamic + // instrumentation RC callbacks. + // + // The system is designed such that only a single tracer at a time is + // responsible for uploading symbols to the symbol database. This is + // communicated through a single RC key with a constant value. In order to + // simplify the internal state of the tracer an avoid risks of excess memory + // usage, we use a single boolean flag to track this state as opposed to + // tracking the actual RC key and value. + symdbExport bool } var ( @@ -265,29 +265,83 @@ var ( ) func (t *tracer) dynamicInstrumentationRCUpdate(u remoteconfig.ProductUpdate) map[string]state.ApplyStatus { - applyStatus := map[string]state.ApplyStatus{} + applyStatus := make(map[string]state.ApplyStatus, len(u)) diRCState.Lock() + defer diRCState.Unlock() for k, v := range u { log.Debug("Received dynamic instrumentation RC configuration for %s\n", k) - applyStatus[k] = state.ApplyStatus{State: state.ApplyStateUnknown} - diRCState.state[k] = dynamicInstrumentationRCProbeConfig{ - runtimeID: globalconfig.RuntimeID(), - configPath: k, - configContent: string(v), + if len(v) == 0 { + delete(diRCState.state, k) + applyStatus[k] = state.ApplyStatus{State: state.ApplyStateAcknowledged} + } else { + diRCState.state[k] = dynamicInstrumentationRCProbeConfig{ + configPath: k, + configContent: string(v), + } + applyStatus[k] = state.ApplyStatus{State: state.ApplyStateUnknown} } } - diRCState.Unlock() return applyStatus } -// passProbeConfiguration is used as a stable interface to find the configuration in via bpf. Go-DI attaches -// a bpf program to this function and extracts the raw bytes accordingly. +func (t *tracer) dynamicInstrumentationSymDBRCUpdate( + u remoteconfig.ProductUpdate, +) map[string]state.ApplyStatus { + applyStatus := make(map[string]state.ApplyStatus, len(u)) + diRCState.Lock() + defer diRCState.Unlock() + symDBEnabled := false + for k, v := range u { + if len(v) == 0 { + applyStatus[k] = state.ApplyStatus{State: state.ApplyStateAcknowledged} + } else { + applyStatus[k] = state.ApplyStatus{State: state.ApplyStateUnknown} + symDBEnabled = true + } + } + diRCState.symdbExport = symDBEnabled + return applyStatus +} + +// passProbeConfiguration is used as a stable interface to find the +// configuration in via bpf. Go-DI attaches a bpf program to this function and +// extracts the raw bytes accordingly. // //nolint:all //go:noinline func passProbeConfiguration(runtimeID, configPath, configContent string) {} +// passAllProbeConfigurationsComplete is used to signal to the bpf program that +// all probe configurations have been passed. +// +//nolint:all +//go:noinline +func passAllProbeConfigurationsComplete(runtimeID string) {} + +// passSymDBState is used as a stable interface to find the symbol database +// state via bpf. Go-DI attaches a bpf program to this function and extracts +// the arguments accordingly. +// +//nolint:all +//go:noinline +func passSymDBState(runtimeID string, enabled bool) {} + +// passAllProbeConfigurations is used to pass all probe configurations to the +// bpf program. +// +//go:noinline +func passAllProbeConfigurations(runtimeID string) { + defer passAllProbeConfigurationsComplete(runtimeID) + diRCState.Lock() + defer diRCState.Unlock() + for _, v := range diRCState.state { + accessStringsToMitigatePageFault(runtimeID, v.configPath, v.configContent) + passProbeConfiguration(runtimeID, v.configPath, v.configContent) + } + passSymDBState(runtimeID, diRCState.symdbExport) +} + func initalizeDynamicInstrumentationRemoteConfigState() { diRCState = dynamicInstrumentationRCState{ state: map[string]dynamicInstrumentationRCProbeConfig{}, @@ -296,18 +350,32 @@ func initalizeDynamicInstrumentationRemoteConfigState() { go func() { for { time.Sleep(time.Second * 5) - diRCState.Lock() - for _, v := range diRCState.state { - passProbeConfiguration(v.runtimeID, v.configPath, v.configContent) - } - diRCState.Unlock() + passAllProbeConfigurations(globalconfig.RuntimeID()) } }() } -// startRemoteConfig starts the remote config client. -// It registers the APM_TRACING product with a callback, -// and the LIVE_DEBUGGING product without a callback. +// accessStringsToMitigatePageFault iterates over each string to trigger a page fault, +// ensuring it is loaded into RAM or listed in the translation lookaside buffer. +// This is done by writing the string to io.Discard. +// +// This function addresses an issue with the bpf program that hooks the +// `passProbeConfiguration()` function from system-probe. The bpf program fails +// to read strings if a page fault occurs because the `bpf_probe_read()` helper +// disables paging (uprobe bpf programs can't sleep). Consequently, page faults +// cause `bpf_probe_read()` to return an error and not read any data. +// By preloading the strings, we mitigate this issue, enhancing the reliability +// of the Go Dynamic Instrumentation product. +func accessStringsToMitigatePageFault(strs ...string) { + for i := range strs { + io.WriteString(io.Discard, strs[i]) + } +} + +// startRemoteConfig starts the remote config client. It registers the +// APM_TRACING product unconditionally and it registers the LIVE_DEBUGGING and +// LIVE_DEBUGGING_SYMBOL_DB with their respective callbacks if the tracer is +// configured to use the dynamic instrumentation product. func (t *tracer) startRemoteConfig(rcConfig remoteconfig.ClientConfig) error { err := remoteconfig.Start(rcConfig) if err != nil { @@ -317,7 +385,22 @@ func (t *tracer) startRemoteConfig(rcConfig remoteconfig.ClientConfig) error { var dynamicInstrumentationError, apmTracingError error if t.config.dynamicInstrumentationEnabled { - dynamicInstrumentationError = remoteconfig.Subscribe("LIVE_DEBUGGING", t.dynamicInstrumentationRCUpdate) + liveDebuggingError := remoteconfig.Subscribe( + "LIVE_DEBUGGING", t.dynamicInstrumentationRCUpdate, + ) + liveDebuggingSymDBError := remoteconfig.Subscribe( + "LIVE_DEBUGGING_SYMBOL_DB", t.dynamicInstrumentationSymDBRCUpdate, + ) + if liveDebuggingError != nil && liveDebuggingSymDBError != nil { + dynamicInstrumentationError = errors.Join( + liveDebuggingError, + liveDebuggingSymDBError, + ) + } else if liveDebuggingError != nil { + dynamicInstrumentationError = liveDebuggingError + } else if liveDebuggingSymDBError != nil { + dynamicInstrumentationError = liveDebuggingSymDBError + } } initalizeRC.Do(initalizeDynamicInstrumentationRemoteConfigState) @@ -333,8 +416,11 @@ func (t *tracer) startRemoteConfig(rcConfig remoteconfig.ClientConfig) error { ) if apmTracingError != nil || dynamicInstrumentationError != nil { - return fmt.Errorf("could not subscribe to at least one remote config product: %s; %s", - apmTracingError, dynamicInstrumentationError) + return fmt.Errorf( + "could not subscribe to at least one remote config product: %w; %w", + apmTracingError, + dynamicInstrumentationError, + ) } return nil diff --git a/ddtrace/tracer/remote_config_test.go b/ddtrace/tracer/remote_config_test.go index d64c2666fe..f57ea6d147 100644 --- a/ddtrace/tracer/remote_config_test.go +++ b/ddtrace/tracer/remote_config_test.go @@ -6,28 +6,37 @@ package tracer import ( + "context" + "maps" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +func assertCalled(t *testing.T, client *telemetrytest.RecordClient, cfgs []telemetry.Configuration) { + t.Helper() + + for _, cfg := range cfgs { + assert.Contains(t, client.Configuration, cfg) + } +} + func TestOnRemoteConfigUpdate(t *testing.T) { t.Run("RC sampling rate = 0.5 is applied and can be reverted", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) @@ -40,19 +49,15 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s := tracer.StartSpan("web.request").(*span) + s := tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.5, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ := getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.5, rate) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled( - t, - "ConfigChange", - []telemetry.Configuration{{Name: "trace_sample_rate", Value: 0.5, Origin: telemetry.OriginRemoteConfig}}, - ) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_sample_rate", Value: 0.5, Origin: telemetry.OriginRemoteConfig}) - //Apply RC with sampling rules. Assert _dd.rule_psr shows the corresponding rule matched rate. + // Apply RC with sampling rules. Assert _dd.rule_psr shows the corresponding rule matched rate. input = remoteconfig.ProductUpdate{ "path": []byte(`{"lib_config": {"tracing_sampling_rate": 0.5, "tracing_sampling_rules":[{ @@ -66,14 +71,16 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus = tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) + s = tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 1.0, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 1.0, rate) require.Equal(t, samplerToDM(samplernames.RemoteUserRule), s.context.trace.propagatingTags[keyDecisionMaker]) // Spans not matching the rule still gets the global rate - s = tracer.StartSpan("not.web.request").(*span) + s = tracer.StartSpan("not.web.request") s.Finish() - require.Equal(t, 0.5, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.5, rate) if p, ok := s.context.trace.samplingPriority(); ok && p > 0 { require.Equal(t, samplerToDM(samplernames.RuleRate), s.context.trace.propagatingTags[keyDecisionMaker]) } @@ -84,22 +91,21 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus = tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) + s = tracer.StartSpan("web.request") s.Finish() - require.NotContains(t, keyRulesSamplerAppliedRate, s.Metrics) + require.NotContains(t, keyRulesSamplerAppliedRate, s.metrics) - // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 3) - // Not calling AssertCalled because the configuration contains a math.NaN() - // as value which cannot be asserted see https://github.com/stretchr/testify/issues/624 + // assert telemetry config contains trace_sample_rate with Nan (marshalled as nil) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_sample_rate", Value: nil, Origin: telemetry.OriginDefault}) }) t.Run("DD_TRACE_SAMPLE_RATE=0.1 and RC sampling rate = 0.2", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TRACE_SAMPLE_RATE", "0.1") - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginEnvVar, tracer.config.traceSampleRate.cfgOrigin) @@ -112,17 +118,12 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s := tracer.StartSpan("web.request").(*span) + s := tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.2, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ := getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.2, rate) - // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled( - t, - "ConfigChange", - []telemetry.Configuration{{Name: "trace_sample_rate", Value: 0.2, Origin: telemetry.OriginRemoteConfig}}, - ) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_sample_rate", Value: 0.2, Origin: telemetry.OriginRemoteConfig}) // Unset RC. Assert _dd.rule_psr shows the previous sampling rate (0.1) is applied input = remoteconfig.ProductUpdate{ @@ -130,22 +131,17 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus = tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) + s = tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.1, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.1, rate) - // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled( - t, - "ConfigChange", - []telemetry.Configuration{{Name: "trace_sample_rate", Value: 0.1, Origin: telemetry.OriginDefault}}, - ) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_sample_rate", Value: 0.1, Origin: telemetry.OriginDefault}) }) t.Run("DD_TRACE_SAMPLING_RULES rate=0.1 and RC trace sampling rules rate = 1.0", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TRACE_SAMPLING_RULES", `[{ "service": "my-service", @@ -153,14 +149,16 @@ func TestOnRemoteConfigUpdate(t *testing.T) { "resource": "*", "sample_rate": 0.1 }]`) - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) - s := tracer.StartSpan("web.request").(*span) + s := tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.1, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ := getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.1, rate) if p, ok := s.context.trace.samplingPriority(); ok && p > 0 { require.Equal(t, samplerToDM(samplernames.RuleRate), s.context.trace.propagatingTags[keyDecisionMaker]) } @@ -178,34 +176,33 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) - s.Resource = "abc" + s = tracer.StartSpan("web.request") + s.resource = "abc" s.Finish() - require.Equal(t, 1.0, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 1.0, rate) require.Equal(t, samplerToDM(samplernames.RemoteUserRule), s.context.trace.propagatingTags[keyDecisionMaker]) // Spans not matching the rule gets the global rate, but not the local rule, which is no longer in effect - s = tracer.StartSpan("web.request").(*span) - s.Resource = "not_abc" + s = tracer.StartSpan("web.request") + s.resource = "not_abc" s.Finish() - require.Equal(t, 0.5, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.5, rate) if p, ok := s.context.trace.samplingPriority(); ok && p > 0 { require.Equal(t, samplerToDM(samplernames.RuleRate), s.context.trace.propagatingTags[keyDecisionMaker]) } - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled(t, "ConfigChange", []telemetry.Configuration{ - {Name: "trace_sample_rate", Value: 0.5, Origin: telemetry.OriginRemoteConfig}, - { - Name: "trace_sample_rules", - Value: `[{"service":"my-service","name":"web.request","resource":"abc","sample_rate":1,"provenance":"customer"}]`, - Origin: telemetry.OriginRemoteConfig, - }, + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "trace_sample_rate", Value: 0.5, Origin: telemetry.OriginRemoteConfig}) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{ + Name: "trace_sample_rules", + Value: `[{"service":"my-service","name":"web.request","resource":"abc","sample_rate":1,"provenance":"customer"}]`, + Origin: telemetry.OriginRemoteConfig, }) }) t.Run("DD_TRACE_SAMPLING_RULES=0.1 and RC rule rate=1.0 and revert", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TRACE_SAMPLING_RULES", `[{ "service": "my-service", @@ -213,12 +210,18 @@ func TestOnRemoteConfigUpdate(t *testing.T) { "resource": "*", "sample_rate": 0.1 }]`) - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) defer stop() - s := tracer.StartSpan("web.request").(*span) + require.NoError(t, err) + + s := tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.1, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ := getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.1, rate) + if p, ok := s.context.trace.samplingPriority(); ok && p > 0 { + require.Equal(t, samplerToDM(samplernames.RuleRate), s.context.trace.propagatingTags[keyDecisionMaker]) + } input := remoteconfig.ProductUpdate{ "path": []byte(`{"lib_config": {"tracing_sampling_rate": 0.5, @@ -240,17 +243,18 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - - s = tracer.StartSpan("web.request").(*span) - s.Resource = "abc" + s = tracer.StartSpan("web.request") + s.resource = "abc" s.Finish() - require.Equal(t, 1.0, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 1.0, rate) require.Equal(t, samplerToDM(samplernames.RemoteUserRule), s.context.trace.propagatingTags[keyDecisionMaker]) // Spans not matching the rule gets the global rate, but not the local rule, which is no longer in effect - s = tracer.StartSpan("web.request").(*span) - s.Resource = "not_abc" + s = tracer.StartSpan("web.request") + s.resource = "not_abc" s.Finish() - require.Equal(t, 0.3, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.3, rate) if p, ok := s.context.trace.samplingPriority(); ok && p > 0 { require.Equal( t, @@ -263,20 +267,21 @@ func TestOnRemoteConfigUpdate(t *testing.T) { input = remoteconfig.ProductUpdate{"path": nil} applyStatus = tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) - s.Resource = "not_abc" + s = tracer.StartSpan("web.request") + s.resource = "not_abc" s.Finish() - require.Equal(t, 0.1, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.1, rate) if p, ok := s.context.trace.samplingPriority(); ok && p > 0 { require.Equal(t, samplerToDM(samplernames.RuleRate), s.context.trace.propagatingTags[keyDecisionMaker]) } - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled(t, "ConfigChange", []telemetry.Configuration{ + + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_sample_rate", Value: 0.5, Origin: telemetry.OriginRemoteConfig}, {Name: "trace_sample_rules", Value: `[{"service":"my-service","name":"web.request","resource":"abc","sample_rate":1,"provenance":"customer"} {"service":"my-service","name":"web.request","resource":"*","sample_rate":0.3,"provenance":"dynamic"}]`, Origin: telemetry.OriginRemoteConfig}, }) - telemetryClient.AssertCalled(t, "ConfigChange", []telemetry.Configuration{ + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_sample_rate", Value: nil, Origin: telemetry.OriginDefault}, { Name: "trace_sample_rules", @@ -287,9 +292,10 @@ func TestOnRemoteConfigUpdate(t *testing.T) { }) t.Run("RC rule with tags", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() input := remoteconfig.ProductUpdate{ @@ -301,27 +307,28 @@ func TestOnRemoteConfigUpdate(t *testing.T) { "provenance": "customer", "sample_rate": 1.0, "tags": [{"key": "tag-a", "value_glob": "tv-a??"}] - }]}, + }]}, "service_target": {"service": "my-service", "env": "my-env"}}`), } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) // A span with matching tags gets the RC rule rate - s := tracer.StartSpan("web.request").(*span) + s := tracer.StartSpan("web.request") s.SetTag("tag-a", "tv-a11") s.Finish() - require.Equal(t, 1.0, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ := getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 1.0, rate) require.Equal(t, samplerToDM(samplernames.RemoteUserRule), s.context.trace.propagatingTags[keyDecisionMaker]) // A span with non-matching tags gets the global rate - s = tracer.StartSpan("web.request").(*span) + s = tracer.StartSpan("web.request") s.SetTag("tag-a", "not-matching") s.Finish() - require.Equal(t, 0.5, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.5, rate) - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled(t, "ConfigChange", []telemetry.Configuration{ + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_sample_rate", Value: 0.5, Origin: telemetry.OriginRemoteConfig}, { Name: "trace_sample_rules", @@ -333,10 +340,11 @@ func TestOnRemoteConfigUpdate(t *testing.T) { t.Run("RC header tags = X-Test-Header:my-tag-name is applied and can be reverted", func(t *testing.T) { defer globalconfig.ClearHeaderTags() - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) @@ -352,14 +360,9 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.Equal(t, 1, globalconfig.HeaderTagsLen()) require.Equal(t, "my-tag-name", globalconfig.HeaderTag("X-Test-Header")) - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled( - t, - "ConfigChange", - []telemetry.Configuration{ - {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-name", Origin: telemetry.OriginRemoteConfig}, - }, - ) + assertCalled(t, telemetryClient, []telemetry.Configuration{ + {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-name", Origin: telemetry.OriginRemoteConfig}, + }) // Unset RC. Assert header tags are not set input = remoteconfig.ProductUpdate{ @@ -370,19 +373,17 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.Equal(t, 0, globalconfig.HeaderTagsLen()) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled( - t, - "ConfigChange", + assertCalled(t, telemetryClient, []telemetry.Configuration{{Name: "trace_header_tags", Value: "", Origin: telemetry.OriginDefault}}, ) }) t.Run("RC tracing_enabled = false is applied", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tr, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tr, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tr.config.traceSampleRate.cfgOrigin) @@ -393,6 +394,8 @@ func TestOnRemoteConfigUpdate(t *testing.T) { ), } + tr, ok := getGlobalTracer().(*tracer) + require.Equal(t, true, ok) applyStatus := tr.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) require.Equal(t, false, tr.config.enabled.current) @@ -403,14 +406,14 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } sctx, err := tr.Extract(headers) require.NoError(t, err) - require.Equal(t, internal.NoopSpanContext{}, sctx) - err = tr.Inject(internal.NoopSpanContext{}, TextMapCarrier{}) + require.Equal(t, (*SpanContext)(nil), sctx) + err = tr.Inject(nil, TextMapCarrier{}) require.NoError(t, err) - require.Equal(t, internal.NoopSpan{}, tr.StartSpan("noop")) + require.Equal(t, (*Span)(nil), tr.StartSpan("noop")) // all subsequent spans are of type internal.NoopSpan // no further remoteConfig changes are applied - s := StartSpan("web.request").(internal.NoopSpan) + s := StartSpan("web.request") s.Finish() // turning tracing back through reset should have no effect @@ -428,19 +431,18 @@ func TestOnRemoteConfigUpdate(t *testing.T) { applyStatus = tr.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) require.Equal(t, false, tr.config.enabled.current) - - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) }) t.Run( "DD_TRACE_HEADER_TAGS=X-Test-Header:my-tag-name-from-env and RC header tags = X-Test-Header:my-tag-name-from-rc", func(t *testing.T) { defer globalconfig.ClearHeaderTags() - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TRACE_HEADER_TAGS", "X-Test-Header:my-tag-name-from-env") - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() // Apply RC. Assert global config shows the RC header tag is applied @@ -455,10 +457,7 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.Equal(t, "my-tag-name-from-rc", globalconfig.HeaderTag("X-Test-Header")) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled( - t, - "ConfigChange", + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-name-from-rc", Origin: telemetry.OriginRemoteConfig}, }, @@ -474,10 +473,7 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.Equal(t, "my-tag-name-from-env", globalconfig.HeaderTag("X-Test-Header")) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled( - t, - "ConfigChange", + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-name-from-env", Origin: telemetry.OriginDefault}, }, @@ -489,15 +485,16 @@ func TestOnRemoteConfigUpdate(t *testing.T) { "In code header tags = X-Test-Header:my-tag-name-in-code and RC header tags = X-Test-Header:my-tag-name-from-rc", func(t *testing.T) { defer globalconfig.ClearHeaderTags() - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tracer, _, _, stop := startTestTracer( + tracer, _, _, stop, err := startTestTracer( t, WithService("my-service"), WithEnv("my-env"), WithHeaderTags([]string{"X-Test-Header:my-tag-name-in-code"}), ) + require.Nil(t, err) defer stop() // Apply RC. Assert global config shows the RC header tag is applied @@ -512,10 +509,7 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.Equal(t, "my-tag-name-from-rc", globalconfig.HeaderTag("X-Test-Header")) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled( - t, - "ConfigChange", + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-name-from-rc", Origin: telemetry.OriginRemoteConfig}, }, @@ -531,10 +525,7 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.Equal(t, "my-tag-name-in-code", globalconfig.HeaderTag("X-Test-Header")) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled( - t, - "ConfigChange", + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-name-in-code", Origin: telemetry.OriginDefault}, }, @@ -543,10 +534,11 @@ func TestOnRemoteConfigUpdate(t *testing.T) { ) t.Run("Invalid payload", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) @@ -561,14 +553,17 @@ func TestOnRemoteConfigUpdate(t *testing.T) { require.NotEmpty(t, applyStatus["path"].Error) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 0) + for _, cfg := range telemetryClient.Configuration { + assert.NotEqual(t, "trace_sample_rate", cfg.Name) + } }) t.Run("Service mismatch", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tracer, _, _, stop := startTestTracer(t, WithServiceName("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) @@ -577,18 +572,21 @@ func TestOnRemoteConfigUpdate(t *testing.T) { "path": []byte(`{"lib_config": {}, "service_target": {"service": "other-service", "env": "my-env"}}`), } applyStatus := tracer.onRemoteConfigUpdate(input) - require.Equal(t, state.ApplyStateError, applyStatus["path"].State) - require.Equal(t, "service mismatch", applyStatus["path"].Error) + require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) + require.Empty(t, applyStatus["path"].Error) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 0) + for _, cfg := range telemetryClient.Configuration { + assert.NotEqual(t, "trace_sample_rate", cfg.Name) + } }) t.Run("Env mismatch", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - tracer, _, _, stop := startTestTracer(t, WithServiceName("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) @@ -597,24 +595,27 @@ func TestOnRemoteConfigUpdate(t *testing.T) { "path": []byte(`{"lib_config": {}, "service_target": {"service": "my-service", "env": "other-env"}}`), } applyStatus := tracer.onRemoteConfigUpdate(input) - require.Equal(t, state.ApplyStateError, applyStatus["path"].State) - require.Equal(t, "env mismatch", applyStatus["path"].Error) + require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) + require.Empty(t, applyStatus["path"].Error) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 0) + for _, cfg := range telemetryClient.Configuration { + assert.NotEqual(t, "trace_sample_rate", cfg.Name) + } }) t.Run("DD_TAGS=key0:val0,key1:val1, WithGlobalTag=key2:val2 and RC tags = key3:val3,key4:val4", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TAGS", "key0:val0,key1:val1") - tracer, _, _, stop := startTestTracer( + tracer, _, _, stop, err := startTestTracer( t, WithService("my-service"), WithEnv("my-env"), WithGlobalTag("key2", "val2"), ) + require.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginDefault, tracer.config.traceSampleRate.cfgOrigin) @@ -628,24 +629,26 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s := tracer.StartSpan("web.request").(*span) + s := tracer.StartSpan("web.request") s.Finish() - require.NotContains(t, "key0", s.Meta) - require.NotContains(t, "key1", s.Meta) - require.NotContains(t, "key2", s.Meta) - require.Equal(t, "val3", s.Meta["key3"]) - require.Equal(t, "val4", s.Meta["key4"]) - require.Equal(t, globalconfig.RuntimeID(), s.Meta[ext.RuntimeID]) + _, ok := getMeta(s, "key0") + require.False(t, ok) + _, ok = getMeta(s, "key1") + require.False(t, ok) + _, ok = getMeta(s, "key2") + require.False(t, ok) + val3, _ := getMeta(s, "key3") + val4, _ := getMeta(s, "key4") + require.Equal(t, "val3", val3) + require.Equal(t, "val4", val4) + runtimeID, _ := getMeta(s, ext.RuntimeID) + require.Equal(t, globalconfig.RuntimeID(), runtimeID) runtimeIDTag := ext.RuntimeID + ":" + globalconfig.RuntimeID() // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled( - t, - "ConfigChange", - []telemetry.Configuration{ - {Name: "trace_tags", Value: "key3:val3,key4:val4," + runtimeIDTag, Origin: telemetry.OriginRemoteConfig}, - }, + assertCalled(t, telemetryClient, []telemetry.Configuration{ + {Name: "trace_tags", Value: "key3:val3,key4:val4," + runtimeIDTag, Origin: telemetry.OriginRemoteConfig}, + }, ) // Unset RC. Assert config shows the original DD_TAGS + WithGlobalTag + runtime ID @@ -654,35 +657,38 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus = tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) + s = tracer.StartSpan("web.request") s.Finish() - require.Equal(t, "val0", s.Meta["key0"]) - require.Equal(t, "val1", s.Meta["key1"]) - require.Equal(t, "val2", s.Meta["key2"]) - require.NotContains(t, "key3", s.Meta) - require.NotContains(t, "key4", s.Meta) - require.Equal(t, globalconfig.RuntimeID(), s.Meta[ext.RuntimeID]) + val0, _ := getMeta(s, "key0") + val1, _ := getMeta(s, "key1") + val2, _ := getMeta(s, "key2") + require.Equal(t, "val0", val0) + require.Equal(t, "val1", val1) + require.Equal(t, "val2", val2) + _, ok = getMeta(s, "key3") + require.False(t, ok) + _, ok = getMeta(s, "key4") + require.False(t, ok) + runtimeID, _ = getMeta(s, ext.RuntimeID) + require.Equal(t, globalconfig.RuntimeID(), runtimeID) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled( - t, - "ConfigChange", - []telemetry.Configuration{ - {Name: "trace_tags", Value: "key0:val0,key1:val1,key2:val2," + runtimeIDTag, Origin: telemetry.OriginDefault}, - }, + assertCalled(t, telemetryClient, []telemetry.Configuration{ + {Name: "trace_tags", Value: "key0:val0,key1:val1,key2:val2," + runtimeIDTag, Origin: telemetry.OriginDefault}, + }, ) }) t.Run("Deleted config", func(t *testing.T) { defer globalconfig.ClearHeaderTags() - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TRACE_SAMPLE_RATE", "0.1") t.Setenv("DD_TRACE_HEADER_TAGS", "X-Test-Header:my-tag-from-env") t.Setenv("DD_TAGS", "ddtag:from-env") - tracer, _, _, stop := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + assert.Nil(t, err) defer stop() require.Equal(t, telemetry.OriginEnvVar, tracer.config.traceSampleRate.cfgOrigin) @@ -695,15 +701,16 @@ func TestOnRemoteConfigUpdate(t *testing.T) { } applyStatus := tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s := tracer.StartSpan("web.request").(*span) + s := tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.2, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ := getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.2, rate) require.Equal(t, "my-tag-from-rc", globalconfig.HeaderTag("X-Test-Header")) - require.Equal(t, "from-rc", s.Meta["ddtag"]) + ddTag, _ := getMeta(s, "ddtag") + require.Equal(t, "from-rc", ddTag) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 1) - telemetryClient.AssertCalled(t, "ConfigChange", []telemetry.Configuration{ + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_sample_rate", Value: 0.2, Origin: telemetry.OriginRemoteConfig}, {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-from-rc", Origin: telemetry.OriginRemoteConfig}, { @@ -717,15 +724,16 @@ func TestOnRemoteConfigUpdate(t *testing.T) { input = remoteconfig.ProductUpdate{"path": nil} applyStatus = tracer.onRemoteConfigUpdate(input) require.Equal(t, state.ApplyStateAcknowledged, applyStatus["path"].State) - s = tracer.StartSpan("web.request").(*span) + s = tracer.StartSpan("web.request") s.Finish() - require.Equal(t, 0.1, s.Metrics[keyRulesSamplerAppliedRate]) + rate, _ = getMetric(s, keyRulesSamplerAppliedRate) + require.Equal(t, 0.1, rate) require.Equal(t, "my-tag-from-env", globalconfig.HeaderTag("X-Test-Header")) - require.Equal(t, "from-env", s.Meta["ddtag"]) + ddTag, _ = getMeta(s, "ddtag") + require.Equal(t, "from-env", ddTag) // Telemetry - telemetryClient.AssertNumberOfCalls(t, "ConfigChange", 2) - telemetryClient.AssertCalled(t, "ConfigChange", []telemetry.Configuration{ + assertCalled(t, telemetryClient, []telemetry.Configuration{ {Name: "trace_sample_rate", Value: 0.1, Origin: telemetry.OriginDefault}, {Name: "trace_header_tags", Value: "X-Test-Header:my-tag-from-env", Origin: telemetry.OriginDefault}, {Name: "trace_tags", Value: "ddtag:from-env," + ext.RuntimeID + ":" + globalconfig.RuntimeID(), Origin: telemetry.OriginDefault}, @@ -735,11 +743,119 @@ func TestOnRemoteConfigUpdate(t *testing.T) { assert.Equal(t, 0, globalconfig.HeaderTagsLen()) } +func TestDynamicInstrumentationRC(t *testing.T) { + getDiRCState := func() map[string]dynamicInstrumentationRCProbeConfig { + diRCState.Lock() + defer diRCState.Unlock() + return maps.Clone(diRCState.state) + } + getDiSymDBEnabled := func() bool { + diRCState.Lock() + defer diRCState.Unlock() + return diRCState.symdbExport + } + resetDiRCState := func() { + diRCState.Lock() + defer diRCState.Unlock() + diRCState.state = map[string]dynamicInstrumentationRCProbeConfig{} + diRCState.symdbExport = false + } + + startTracer := func(t *testing.T) *tracer { + telemetryClient := new(telemetrytest.RecordClient) + t.Cleanup(telemetry.MockClient(telemetryClient)) + tracer, _, _, stop, err := startTestTracer(t, WithService("my-service"), WithEnv("my-env")) + require.Nil(t, err) + t.Cleanup(resetDiRCState) + t.Cleanup(stop) + return tracer + } + + startRemoteConfig := func(t *testing.T, tracer *tracer) { + t.Cleanup(remoteconfig.Reset) + t.Cleanup(remoteconfig.Stop) + err := tracer.startRemoteConfig(remoteconfig.DefaultClientConfig()) + require.NoError(t, err) + } + + checkRemoteConfigProductState := func(t *testing.T, product string, enabled bool) { + found, err := remoteconfig.HasProduct(product) + require.NoError(t, err) + require.Equal(t, enabled, found) + } + + t.Run("Subscribes to LIVE_DEBUGGING product when enabled", func(t *testing.T) { + t.Setenv("DD_DYNAMIC_INSTRUMENTATION_ENABLED", "true") + tracer := startTracer(t) + startRemoteConfig(t, tracer) + checkRemoteConfigProductState(t, state.ProductLiveDebugging, true) + checkRemoteConfigProductState(t, "LIVE_DEBUGGING_SYMBOL_DB", true) + }) + + t.Run("Does not subscribe to LIVE_DEBUGGING product when disabled", func(t *testing.T) { + tracer := startTracer(t) + startRemoteConfig(t, tracer) + checkRemoteConfigProductState(t, state.ProductLiveDebugging, false) + checkRemoteConfigProductState(t, "LIVE_DEBUGGING_SYMBOL_DB", false) + }) + + t.Run("Deleted config removes from map", func(t *testing.T) { + t.Setenv("DD_DYNAMIC_INSTRUMENTATION_ENABLED", "true") + tracer := startTracer(t) + startRemoteConfig(t, tracer) + + require.Empty(t, getDiRCState()) + status := tracer.dynamicInstrumentationRCUpdate(remoteconfig.ProductUpdate{ + "key": []byte(`"value"`), + }) + require.Equal(t, map[string]state.ApplyStatus{ + "key": {State: state.ApplyStateUnknown}, + }, status) + require.Equal(t, map[string]dynamicInstrumentationRCProbeConfig{ + "key": { + configPath: "key", + configContent: `"value"`, + }, + }, getDiRCState()) + status = tracer.dynamicInstrumentationRCUpdate(remoteconfig.ProductUpdate{ + "key": nil, + }) + require.Equal(t, map[string]state.ApplyStatus{ + "key": {State: state.ApplyStateAcknowledged}, + }, status) + require.Empty(t, getDiRCState()) + }) + + t.Run("symdb updates", func(t *testing.T) { + t.Setenv("DD_DYNAMIC_INSTRUMENTATION_ENABLED", "true") + tracer := startTracer(t) + startRemoteConfig(t, tracer) + status := tracer.dynamicInstrumentationSymDBRCUpdate(remoteconfig.ProductUpdate{ + "key": []byte(`"value"`), + }) + require.Equal(t, map[string]state.ApplyStatus{ + "key": {State: state.ApplyStateUnknown}, + }, status) + require.Equal(t, true, getDiSymDBEnabled()) + status = tracer.dynamicInstrumentationSymDBRCUpdate(remoteconfig.ProductUpdate{ + "key": nil, + }) + require.Equal(t, map[string]state.ApplyStatus{ + "key": {State: state.ApplyStateAcknowledged}, + }, status) + require.Equal(t, false, getDiSymDBEnabled()) + }) +} + func TestStartRemoteConfig(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + require.Nil(t, err) defer stop() tracer.startRemoteConfig(remoteconfig.DefaultClientConfig()) + defer remoteconfig.Reset() + defer remoteconfig.Stop() + found, err := remoteconfig.HasProduct(state.ProductAPMTracing) require.NoError(t, err) require.True(t, found) @@ -764,3 +880,26 @@ func TestStartRemoteConfig(t *testing.T) { require.NoError(t, err) require.True(t, found) } + +func TestDeadLockIssue3541(t *testing.T) { + t.Setenv("DD_REMOTE_CONFIGURATION_ENABLED", "false") + + ctx, cancel := context.WithCancel(context.TODO()) + + // It's not possible to use startTestTracer to reproduce the issue, + // because it doesn't start the remote config client. + Start(WithRuntimeMetrics(), WithTestDefaults(nil)) + defer Stop() + + go func() { + span := StartSpan("test") + + // close the context + cancel() + span.Finish() + }() + + // wait for the goroutine to finish + <-ctx.Done() + assert.Equal(t, context.Canceled, ctx.Err()) +} diff --git a/ddtrace/tracer/rules_sampler.go b/ddtrace/tracer/rules_sampler.go index 037e393642..65f7f1a187 100644 --- a/ddtrace/tracer/rules_sampler.go +++ b/ddtrace/tracer/rules_sampler.go @@ -16,12 +16,12 @@ import ( "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "golang.org/x/time/rate" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" ) // rulesSampler holds instances of trace sampler and single span sampler, that are configured with the given set of rules. @@ -38,18 +38,33 @@ type rulesSampler struct { // Rules are split between trace and single span sampling rules according to their type. // Such rules are user-defined through environment variable or WithSamplingRules option. // Invalid rules or environment variable values are tolerated, by logging warnings and then ignoring them. -func newRulesSampler(traceRules, spanRules []SamplingRule, traceSampleRate float64) *rulesSampler { +func newRulesSampler(traceRules, spanRules []SamplingRule, traceSampleRate, rateLimitPerSecond float64) *rulesSampler { return &rulesSampler{ - traces: newTraceRulesSampler(traceRules, traceSampleRate), + traces: newTraceRulesSampler(traceRules, traceSampleRate, rateLimitPerSecond), spans: newSingleSpanRulesSampler(spanRules), } } -func (r *rulesSampler) SampleTrace(s *span) bool { return r.traces.sampleRules(s) } +func (r *rulesSampler) SampleTrace(s *Span) bool { + if s == nil { + return false + } + return r.traces.sampleRules(s) +} -func (r *rulesSampler) SampleTraceGlobalRate(s *span) bool { return r.traces.sampleGlobalRate(s) } +func (r *rulesSampler) SampleTraceGlobalRate(s *Span) bool { + if s == nil { + return false + } + return r.traces.sampleGlobalRate(s) +} -func (r *rulesSampler) SampleSpan(s *span) bool { return r.spans.apply(s) } +func (r *rulesSampler) SampleSpan(s *Span) bool { + if s == nil { + return false + } + return r.spans.apply(s) +} func (r *rulesSampler) HasSpanRules() bool { return r.spans.enabled() } @@ -100,7 +115,7 @@ func parseProvenance(p string) (provenance, error) { return v, nil } } - return Customer, fmt.Errorf("Invalid Provenance: \"%v\"", p) + return Customer, fmt.Errorf("invalid provenance: \"%v\"", p) } // SamplingRule is used for applying sampling rates to spans that match @@ -172,31 +187,31 @@ func (sr *SamplingRule) EqualsFalseNegative(other *SamplingRule) bool { } // match returns true when the span's details match all the expected values in the rule. -func (sr *SamplingRule) match(s *span) bool { - if sr.Service != nil && !sr.Service.MatchString(s.Service) { +func (sr *SamplingRule) match(s *Span) bool { + if sr.Service != nil && !sr.Service.MatchString(s.service) { return false } - if sr.Name != nil && !sr.Name.MatchString(s.Name) { + if sr.Name != nil && !sr.Name.MatchString(s.name) { return false } - if sr.Resource != nil && !sr.Resource.MatchString(s.Resource) { + if sr.Resource != nil && !sr.Resource.MatchString(s.resource) { return false } - s.Lock() - defer s.Unlock() + s.mu.Lock() + defer s.mu.Unlock() if sr.Tags != nil { for k, regex := range sr.Tags { if regex == nil { continue } - if s.Meta != nil { - v, ok := s.Meta[k] + if s.meta != nil { + v, ok := s.meta[k] if ok && regex.MatchString(v) { continue } } - if s.Metrics != nil { - v, ok := s.Metrics[k] + if s.metrics != nil { + v, ok := s.metrics[k] // sampling on numbers with floating point is not supported, // thus 'math.Floor(v) != v' if !ok || math.Floor(v) != v || !regex.MatchString(strconv.FormatFloat(v, 'g', -1, 64)) { @@ -238,116 +253,84 @@ func (sr SamplingRuleType) String() string { } } -// ServiceRule returns a SamplingRule that applies the provided sampling rate -// to spans that match the service name provided. -func ServiceRule(service string, rate float64) SamplingRule { - return SamplingRule{ - Service: globMatch(service), - ruleType: SamplingRuleTrace, - Rate: rate, - globRule: &jsonRule{Service: service}, - } -} - -// NameRule returns a SamplingRule that applies the provided sampling rate -// to spans that match the operation name provided. -func NameRule(name string, rate float64) SamplingRule { - return SamplingRule{ - Name: globMatch(name), - ruleType: SamplingRuleTrace, - Rate: rate, - globRule: &jsonRule{Name: name}, - } -} - -// NameServiceRule returns a SamplingRule that applies the provided sampling rate -// to spans matching both the operation and service names provided. -func NameServiceRule(name string, service string, rate float64) SamplingRule { - return SamplingRule{ - Service: globMatch(service), - Name: globMatch(name), - ruleType: SamplingRuleTrace, - globRule: &jsonRule{Name: name, Service: service}, - Rate: rate, - } -} - -// RateRule returns a SamplingRule that applies the provided sampling rate to all spans. -func RateRule(rate float64) SamplingRule { - return SamplingRule{ - Rate: rate, - ruleType: SamplingRuleTrace, - } +// Rule is used to create a sampling rule. +type Rule struct { + ServiceGlob string + NameGlob string + ResourceGlob string + Tags map[string]string // map of string to glob pattern + Rate float64 + MaxPerSecond float64 } -// TagsResourceRule returns a SamplingRule that applies the provided sampling rate to traces with spans that match -// resource, name, service and tags provided. -func TagsResourceRule(tags map[string]string, resource, name, service string, rate float64) SamplingRule { - globTags := make(map[string]*regexp.Regexp, len(tags)) - for k, v := range tags { - if g := globMatch(v); g != nil { - globTags[k] = g +// TraceSamplingRules creates a sampling rule that applies to the entire trace if any spans satisfy the criteria. +func TraceSamplingRules(rules ...Rule) []SamplingRule { + var samplingRules []SamplingRule + var typ SamplingRuleType = SamplingRuleTrace + for _, r := range rules { + sr := SamplingRule{ + Service: globMatch(r.ServiceGlob), + Name: globMatch(r.NameGlob), + Resource: globMatch(r.ResourceGlob), + Rate: r.Rate, + ruleType: SamplingRuleTrace, + globRule: &jsonRule{ + Service: r.ServiceGlob, + Name: r.NameGlob, + Rate: json.Number(strconv.FormatFloat(r.Rate, 'f', -1, 64)), + MaxPerSecond: r.MaxPerSecond, + Resource: r.ResourceGlob, + Tags: r.Tags, + Type: &typ, + }, } - } - return SamplingRule{ - Service: globMatch(service), - Name: globMatch(name), - Resource: globMatch(resource), - Rate: rate, - Tags: globTags, - globRule: &jsonRule{Name: name, Service: service, Resource: resource, Tags: tags}, - ruleType: SamplingRuleTrace, - } -} - -// SpanTagsResourceRule returns a SamplingRule that applies the provided sampling rate to spans that match -// resource, name, service and tags provided. Values of the tags map are expected to be in glob format. -func SpanTagsResourceRule(tags map[string]string, resource, name, service string, rate float64) SamplingRule { - globTags := make(map[string]*regexp.Regexp, len(tags)) - for k, v := range tags { - if g := globMatch(v); g != nil { - globTags[k] = g + if len(r.Tags) != 0 { + sr.Tags = make(map[string]*regexp.Regexp, len(r.Tags)) + for k, v := range r.Tags { + if g := globMatch(v); g != nil { + sr.Tags[k] = g + } + } } + samplingRules = append(samplingRules, sr) + } + return samplingRules +} + +// SpanSamplingRules creates a sampling rule that applies to a single span without affecting the entire trace. +func SpanSamplingRules(rules ...Rule) []SamplingRule { + var samplingRules []SamplingRule + var typ SamplingRuleType = SamplingRuleSpan + for _, r := range rules { + sr := SamplingRule{ + Service: globMatch(r.ServiceGlob), + Name: globMatch(r.NameGlob), + Resource: globMatch(r.ResourceGlob), + Rate: r.Rate, + ruleType: SamplingRuleSpan, + MaxPerSecond: r.MaxPerSecond, + limiter: newSingleSpanRateLimiter(r.MaxPerSecond), + globRule: &jsonRule{ + Service: r.ServiceGlob, + Name: r.NameGlob, + Rate: json.Number(strconv.FormatFloat(r.Rate, 'f', -1, 64)), + MaxPerSecond: r.MaxPerSecond, + Resource: r.ResourceGlob, + Tags: r.Tags, + Type: &typ, + }, + } + if len(r.Tags) != 0 { + sr.Tags = make(map[string]*regexp.Regexp, len(r.Tags)) + for k, v := range r.Tags { + if g := globMatch(v); g != nil { + sr.Tags[k] = g + } + } + } + samplingRules = append(samplingRules, sr) } - return SamplingRule{ - Service: globMatch(service), - Name: globMatch(name), - Resource: globMatch(resource), - Rate: rate, - Tags: globTags, - ruleType: SamplingRuleSpan, - globRule: &jsonRule{Name: name, Service: service, Resource: resource, Tags: tags}, - } -} - -// SpanNameServiceRule returns a SamplingRule of type SamplingRuleSpan that applies -// the provided sampling rate to all spans matching the operation and service name glob patterns provided. -// Operation and service fields must be valid glob patterns. -func SpanNameServiceRule(name, service string, rate float64) SamplingRule { - return SamplingRule{ - Service: globMatch(service), - Name: globMatch(name), - Rate: rate, - ruleType: SamplingRuleSpan, - limiter: newSingleSpanRateLimiter(0), - globRule: &jsonRule{Name: name, Service: service}, - } -} - -// SpanNameServiceMPSRule returns a SamplingRule of type SamplingRuleSpan that applies -// the provided sampling rate to all spans matching the operation and service name glob patterns -// up to the max number of spans per second that can be sampled. -// Operation and service fields must be valid glob patterns. -func SpanNameServiceMPSRule(name, service string, rate, limit float64) SamplingRule { - return SamplingRule{ - Service: globMatch(service), - Name: globMatch(name), - MaxPerSecond: limit, - Rate: rate, - ruleType: SamplingRuleSpan, - limiter: newSingleSpanRateLimiter(limit), - globRule: &jsonRule{Name: name, Service: service}, - } + return samplingRules } // traceRulesSampler allows a user-defined list of rules to apply to traces. @@ -373,11 +356,11 @@ type traceRulesSampler struct { // newTraceRulesSampler configures a *traceRulesSampler instance using the given set of rules. // Invalid rules or environment variable values are tolerated, by logging warnings and then ignoring them. -func newTraceRulesSampler(rules []SamplingRule, traceSampleRate float64) *traceRulesSampler { +func newTraceRulesSampler(rules []SamplingRule, traceSampleRate, rateLimitPerSecond float64) *traceRulesSampler { return &traceRulesSampler{ rules: rules, globalRate: traceSampleRate, - limiter: newRateLimiter(), + limiter: newRateLimiter(rateLimitPerSecond), } } @@ -387,7 +370,7 @@ func (rs *traceRulesSampler) enabled() bool { return len(rs.rules) > 0 || !math.IsNaN(rs.globalRate) } -// Tests whether two sets of the rules are the same. +// EqualsFalseNegative tests whether two sets of the rules are the same. // This returns result that can be false negative. If the result is true, then the two sets of rules // are guaranteed to be the same. // On the other hand, false can be returned while the two rulesets are logically the same. @@ -438,7 +421,7 @@ func (rs *traceRulesSampler) setTraceSampleRules(rules []SamplingRule) bool { // sampleGlobalRate applies the global trace sampling rate to the span. If the rate is Nan, // the function return false, then it returns false and the span is not // modified. -func (rs *traceRulesSampler) sampleGlobalRate(span *span) bool { +func (rs *traceRulesSampler) sampleGlobalRate(span *Span) bool { if !rs.enabled() { // short path when disabled return false @@ -465,7 +448,7 @@ func (rs *traceRulesSampler) sampleGlobalRate(span *span) bool { // sampleRules uses the sampling rules to determine the sampling rate for the // provided span. If the rules don't match, then it returns false and the span is not // modified. -func (rs *traceRulesSampler) sampleRules(span *span) bool { +func (rs *traceRulesSampler) sampleRules(span *Span) bool { if !rs.enabled() { // short path when disabled return false @@ -480,9 +463,10 @@ func (rs *traceRulesSampler) sampleRules(span *span) bool { if rule.match(span) { matched = true rate = rule.Rate - if rule.Provenance == Customer { + switch rule.Provenance { + case Customer: sampler = samplernames.RemoteUserRule - } else if rule.Provenance == Dynamic { + case Dynamic: sampler = samplernames.RemoteDynamicRule } break @@ -498,13 +482,22 @@ func (rs *traceRulesSampler) sampleRules(span *span) bool { return true } -func (rs *traceRulesSampler) applyRate(span *span, rate float64, now time.Time, sampler samplernames.SamplerName) { - span.Lock() - defer span.Unlock() +func (rs *traceRulesSampler) applyRate(span *Span, rate float64, now time.Time, sampler samplernames.SamplerName) { + span.mu.Lock() + defer span.mu.Unlock() + + // We don't lock spans when flushing, so we could have a data race when + // modifying a span as it's being flushed. This protects us against that + // race, since spans are marked `finished` before we flush them. + if span.finished { + return + } span.setMetric(keyRulesSamplerAppliedRate, rate) - delete(span.Metrics, keySamplingPriorityRate) - if !sampledByRate(span.TraceID, rate) { + delete(span.metrics, keySamplingPriorityRate) + // Set the Knuth sampling rate tag when trace sampling rules are applied + span.setMeta(keyKnuthSamplingRate, formatKnuthSamplingRate(rate)) + if !sampledByRate(span.traceID, rate) { span.setSamplingPriorityLocked(ext.PriorityUserReject, sampler) return } @@ -527,30 +520,11 @@ func (rs *traceRulesSampler) limit() (float64, bool) { return math.NaN(), false } -// defaultRateLimit specifies the default trace rate limit used when DD_TRACE_RATE_LIMIT is not set. -const defaultRateLimit = 100.0 - // newRateLimiter returns a rate limiter which restricts the number of traces sampled per second. // The limit is DD_TRACE_RATE_LIMIT if set, `defaultRateLimit` otherwise. -func newRateLimiter() *rateLimiter { - limit := defaultRateLimit - origin := telemetry.OriginDefault - v := os.Getenv("DD_TRACE_RATE_LIMIT") - if v != "" { - l, err := strconv.ParseFloat(v, 64) - if err != nil { - log.Warn("DD_TRACE_RATE_LIMIT invalid, using default value %f: %v", limit, err) - } else if l < 0.0 { - log.Warn("DD_TRACE_RATE_LIMIT negative, using default value %f", limit) - } else { - // override the default limit - origin = telemetry.OriginEnvVar - limit = l - } - } - reportTelemetryOnAppStarted(telemetry.Configuration{Name: "trace_rate_limit", Value: limit, Origin: origin}) +func newRateLimiter(ratePerSecond float64) *rateLimiter { return &rateLimiter{ - limiter: rate.NewLimiter(rate.Limit(limit), int(math.Ceil(limit))), + limiter: rate.NewLimiter(rate.Limit(ratePerSecond), int(math.Ceil(ratePerSecond))), prevTime: time.Now(), } } @@ -587,12 +561,11 @@ func (rs *singleSpanRulesSampler) enabled() bool { // apply uses the sampling rules to determine the sampling rate for the // provided span. If the rules don't match, then it returns false and the span is not // modified. -func (rs *singleSpanRulesSampler) apply(span *span) bool { +func (rs *singleSpanRulesSampler) apply(span *Span) bool { for _, rule := range rs.rules { if rule.match(span) { rate := rule.Rate - span.setMetric(keyRulesSamplerAppliedRate, rate) - if !sampledByRate(span.SpanID, rate) { + if !sampledByRate(span.spanID, rate) { return false } var sampled bool @@ -602,7 +575,7 @@ func (rs *singleSpanRulesSampler) apply(span *span) bool { return false } } - delete(span.Metrics, keySamplingPriorityRate) + delete(span.metrics, keySamplingPriorityRate) span.setMetric(keySpanSamplingMechanism, float64(samplernames.SingleSpan)) span.setMetric(keySingleSpanSamplingRuleRate, rate) if rule.MaxPerSecond != 0 { @@ -699,16 +672,16 @@ func samplingRulesFromEnv() (trace, span []SamplingRule, err error) { }() rulesByType := func(spanType SamplingRuleType) (rules []SamplingRule, errs []string) { - env := fmt.Sprintf("DD_%s_SAMPLING_RULES", strings.ToUpper(spanType.String())) - rulesEnv := os.Getenv(fmt.Sprintf("DD_%s_SAMPLING_RULES", strings.ToUpper(spanType.String()))) + envKey := fmt.Sprintf("DD_%s_SAMPLING_RULES", strings.ToUpper(spanType.String())) + rulesEnv := env.Get(envKey) rules, err := unmarshalSamplingRules([]byte(rulesEnv), spanType) if err != nil { errs = append(errs, err.Error()) } - rulesFile := os.Getenv(env + "_FILE") + rulesFile := env.Get(envKey + "_FILE") if len(rules) != 0 { if rulesFile != "" { - log.Warn("DIAGNOSTICS Error(s): %s is available and will take precedence over %s_FILE", env, env) + log.Warn("DIAGNOSTICS Error(s): %s is available and will take precedence over %s_FILE", envKey, envKey) } return rules, errs } @@ -717,7 +690,7 @@ func samplingRulesFromEnv() (trace, span []SamplingRule, err error) { } rulesFromEnvFile, err := os.ReadFile(rulesFile) if err != nil { - errs = append(errs, fmt.Sprintf("Couldn't read file from %s_FILE: %v", env, err)) + errs = append(errs, fmt.Sprintf("Couldn't read file from %s_FILE: %v", envKey, err)) } rules, err = unmarshalSamplingRules(rulesFromEnvFile, spanType) if err != nil { @@ -803,7 +776,7 @@ func unmarshalSamplingRules(b []byte, spanType SamplingRuleType) ([]SamplingRule // if the JSON is an array, unmarshal it as an array of rules err := json.Unmarshal(b, &jsonRules) if err != nil { - return nil, fmt.Errorf("error unmarshalling JSON: %v", err) + return nil, fmt.Errorf("error unmarshalling JSON: %s", err.Error()) } return validateRules(jsonRules, spanType) } @@ -899,7 +872,7 @@ func (sr SamplingRule) MarshalJSON() ([]byte, error) { func (sr SamplingRule) String() string { s, err := sr.MarshalJSON() if err != nil { - log.Error("Error marshalling SamplingRule to json: %v", err) + log.Error("Error marshalling SamplingRule to json: %s", err.Error()) } return string(s) } diff --git a/ddtrace/tracer/sampler.go b/ddtrace/tracer/sampler.go index 2c95caf26f..9252f3b47c 100644 --- a/ddtrace/tracer/sampler.go +++ b/ddtrace/tracer/sampler.go @@ -9,17 +9,17 @@ import ( "encoding/json" "io" "math" + "strconv" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" ) -// Sampler is the generic interface of any sampler. It must be safe for concurrent use. +// Sampler is an interface for sampling traces. type Sampler interface { // Sample returns true if the given span should be sampled. - Sample(span Span) bool + Sample(span *Span) bool } // RateSampler is a sampler implementation which randomly selects spans using a @@ -35,6 +35,24 @@ type RateSampler interface { SetRate(rate float64) } +type customSampler struct { + s Sampler +} + +// Rate implements RateSampler. +func (*customSampler) Rate() float64 { + return 1.0 +} + +// SetRate implements RateSampler. +func (*customSampler) SetRate(_ float64) { + // noop +} + +func (s *customSampler) Sample(span *Span) bool { + return s.s.Sample(span) +} + // rateSampler samples from a sample rate. type rateSampler struct { sync.RWMutex @@ -46,6 +64,12 @@ func NewAllSampler() RateSampler { return NewRateSampler(1) } // NewRateSampler returns an initialized RateSampler with a given sample rate. func NewRateSampler(rate float64) RateSampler { + if rate > 1.0 { + rate = 1.0 + } + if rate < 0.0 { + rate = 0.0 + } return &rateSampler{rate: rate} } @@ -67,27 +91,35 @@ func (r *rateSampler) SetRate(rate float64) { const knuthFactor = uint64(1111111111111111111) // Sample returns true if the given span should be sampled. -func (r *rateSampler) Sample(spn ddtrace.Span) bool { +func (r *rateSampler) Sample(s *Span) bool { if r.rate == 1 { // fast path return true } - s, ok := spn.(*span) - if !ok { + if r.rate == 0 || s == nil { return false } r.RLock() defer r.RUnlock() - return sampledByRate(s.TraceID, r.rate) + return sampledByRate(s.traceID, r.rate) } // sampledByRate verifies if the number n should be sampled at the specified // rate. func sampledByRate(n uint64, rate float64) bool { - if rate < 1 { - return n*knuthFactor < uint64(rate*math.MaxUint64) + if rate == 1 { + return true + } + if rate == 0 { + return false } - return true + + return n*knuthFactor <= uint64(rate*math.MaxUint64) +} + +// formatKnuthSamplingRate formats a sampling rate as a string with up to 6 decimal digits +func formatKnuthSamplingRate(rate float64) string { + return strconv.FormatFloat(rate, 'g', 6, 64) } // prioritySampler holds a set of per-service sampling rates and applies @@ -127,8 +159,8 @@ func (ps *prioritySampler) readRatesJSON(rc io.ReadCloser) error { // getRate returns the sampling rate to be used for the given span. Callers must // guard the span. -func (ps *prioritySampler) getRate(spn *span) float64 { - key := "service:" + spn.Service + ",env:" + spn.Meta[ext.Environment] +func (ps *prioritySampler) getRate(spn *Span) float64 { + key := "service:" + spn.service + ",env:" + spn.meta[ext.Environment] ps.mu.RLock() defer ps.mu.RUnlock() if rate, ok := ps.rates[key]; ok { @@ -139,12 +171,14 @@ func (ps *prioritySampler) getRate(spn *span) float64 { // apply applies sampling priority to the given span. Caller must ensure it is safe // to modify the span. -func (ps *prioritySampler) apply(spn *span) { +func (ps *prioritySampler) apply(spn *Span) { rate := ps.getRate(spn) - if sampledByRate(spn.TraceID, rate) { + if sampledByRate(spn.traceID, rate) { spn.setSamplingPriority(ext.PriorityAutoKeep, samplernames.AgentRate) } else { spn.setSamplingPriority(ext.PriorityAutoReject, samplernames.AgentRate) } spn.SetTag(keySamplingPriorityRate, rate) + // Set the Knuth sampling rate tag when sampled by agent rate + spn.SetTag(keyKnuthSamplingRate, formatKnuthSamplingRate(rate)) } diff --git a/ddtrace/tracer/sampler_test.go b/ddtrace/tracer/sampler_test.go index 117518b533..8fc9894623 100644 --- a/ddtrace/tracer/sampler_test.go +++ b/ddtrace/tracer/sampler_test.go @@ -10,15 +10,15 @@ import ( "fmt" "io" "math" + "net/http" "regexp" "strings" "sync" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" "github.com/stretchr/testify/assert" "golang.org/x/time/rate" @@ -26,10 +26,10 @@ import ( func TestPrioritySampler(t *testing.T) { // create a new span with given service/env - mkSpan := func(svc, env string) *span { - s := &span{Service: svc, Meta: map[string]string{}} + mkSpan := func(svc, env string) *Span { + s := &Span{service: svc, meta: map[string]string{}} if env != "" { - s.Meta["env"] = env + s.meta["env"] = env } return s } @@ -37,12 +37,12 @@ func TestPrioritySampler(t *testing.T) { t.Run("mkspan", func(t *testing.T) { assert := assert.New(t) s := mkSpan("my-service", "my-env") - assert.Equal("my-service", s.Service) - assert.Equal("my-env", s.Meta[ext.Environment]) + assert.Equal("my-service", s.service) + assert.Equal("my-env", s.meta[ext.Environment]) s = mkSpan("my-service2", "") - assert.Equal("my-service2", s.Service) - _, ok := s.Meta[ext.Environment] + assert.Equal("my-service2", s.service) + _, ok := s.meta[ext.Environment] assert.False(ok) }) @@ -151,22 +151,28 @@ func TestPrioritySampler(t *testing.T) { )) testSpan1 := newBasicSpan("http.request") - testSpan1.Service = "obfuscate.http" - testSpan1.TraceID = math.MaxUint64 - (math.MaxUint64 / 4) + testSpan1.service = "obfuscate.http" + testSpan1.traceID = math.MaxUint64 - (math.MaxUint64 / 4) ps.apply(testSpan1) - assert.EqualValues(ext.PriorityAutoKeep, testSpan1.Metrics[keySamplingPriority]) - assert.EqualValues(0.5, testSpan1.Metrics[keySamplingPriorityRate]) + priority, _ := getMetric(testSpan1, keySamplingPriority) + rate, _ := getMetric(testSpan1, keySamplingPriorityRate) + assert.EqualValues(ext.PriorityAutoKeep, priority) + assert.EqualValues(0.5, rate) - testSpan1.TraceID = math.MaxUint64 - (math.MaxUint64 / 3) + testSpan1.traceID = math.MaxUint64 - (math.MaxUint64 / 3) ps.apply(testSpan1) - assert.EqualValues(ext.PriorityAutoReject, testSpan1.Metrics[keySamplingPriority]) - assert.EqualValues(0.5, testSpan1.Metrics[keySamplingPriorityRate]) - - testSpan1.Service = "other-service" - testSpan1.TraceID = 1 - assert.EqualValues(ext.PriorityAutoReject, testSpan1.Metrics[keySamplingPriority]) - assert.EqualValues(0.5, testSpan1.Metrics[keySamplingPriorityRate]) + priority, _ = getMetric(testSpan1, keySamplingPriority) + rate, _ = getMetric(testSpan1, keySamplingPriorityRate) + assert.EqualValues(ext.PriorityAutoReject, priority) + assert.EqualValues(0.5, rate) + + testSpan1.service = "other-service" + testSpan1.traceID = 1 + priority, _ = getMetric(testSpan1, keySamplingPriority) + rate, _ = getMetric(testSpan1, keySamplingPriorityRate) + assert.EqualValues(ext.PriorityAutoReject, priority) + assert.EqualValues(0.5, rate) }) } @@ -175,7 +181,21 @@ func TestRateSampler(t *testing.T) { assert.True(NewRateSampler(1).Sample(newBasicSpan("test"))) assert.False(NewRateSampler(0).Sample(newBasicSpan("test"))) assert.False(NewRateSampler(0).Sample(newBasicSpan("test"))) - assert.False(NewRateSampler(0.99).Sample(internal.NoopSpan{})) + assert.False(NewRateSampler(0.99).Sample(nil)) + assert.False(NewRateSampler(0.5).Sample(newSpan("test", "test", "test", 0, 12078589664685934330, 0))) + assert.True(NewRateSampler(0.5).Sample(newSpan("test", "test", "test", 0, 13794769880582338323, 0))) + // traceID 9223372036854775808 * knuthFactor = 9223372036854775808 (leveraging the overflow logic) + // which is 0.5 * MaxUint64 + assert.True(NewRateSampler(0.5).Sample(newSpan("test", "test", "test", 0, 9223372036854775808, 0))) +} + +func TestSamplerRates(t *testing.T) { + assert := assert.New(t) + assert.Equal(1.0, NewRateSampler(1).Rate()) + assert.Equal(0.0, NewRateSampler(0).Rate()) + assert.Equal(0.5, NewRateSampler(0.5).Rate()) + assert.Equal(0.0, NewRateSampler(-1).Rate()) // out of bounds + assert.Equal(1.0, NewRateSampler(2).Rate()) // out of bounds } func TestRateSamplerSetting(t *testing.T) { @@ -201,7 +221,9 @@ func TestRuleEnvVars(t *testing.T) { {in: "1point0", out: math.NaN()}, // default if invalid value } { t.Setenv("DD_TRACE_SAMPLE_RATE", tt.in) - res := newConfig().globalSampleRate + c, err := newTestConfig() + assert.NoError(err) + res := c.globalSampleRate if math.IsNaN(tt.out) { assert.True(math.IsNaN(res)) } else { @@ -226,7 +248,10 @@ func TestRuleEnvVars(t *testing.T) { assert := assert.New(t) t.Setenv("OTEL_TRACES_SAMPLER", tt.config) t.Setenv("OTEL_TRACES_SAMPLER_ARG", fmt.Sprintf("%f", tt.rate)) - assert.Equal(tt.rate, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + res := c.globalSampleRate + assert.Equal(tt.rate, res) }) } }) @@ -246,7 +271,9 @@ func TestRuleEnvVars(t *testing.T) { {in: "1point0", out: rate.NewLimiter(100.0, 100)}, // default if invalid value } { t.Setenv("DD_TRACE_RATE_LIMIT", tt.in) - res := newRateLimiter() + c, err := newTestConfig() + assert.NoError(err) + res := newRateLimiter(c.traceRateLimitPerSecond) assert.Equal(tt.out, res.limiter) } }) @@ -462,12 +489,12 @@ func TestRuleEnvVars(t *testing.T) { } func TestRulesSampler(t *testing.T) { - makeSpan := func(op string, svc string) *span { + makeSpan := func(op string, svc string) *Span { s := newSpan(op, svc, "res-10", randUint64(), randUint64(), 0) s.setMeta("hostname", "hn-30") return s } - makeFinishedSpan := func(op, svc, resource string, tags map[string]interface{}) *span { + makeFinishedSpan := func(op, svc, resource string, tags map[string]interface{}) *Span { s := newSpan(op, svc, resource, randUint64(), randUint64(), 0) for k, v := range tags { s.SetTag(k, v) @@ -477,7 +504,9 @@ func TestRulesSampler(t *testing.T) { } t.Run("no-rules", func(t *testing.T) { assert := assert.New(t) - rs := newRulesSampler(nil, nil, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(nil, nil, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeSpan("http.request", "test-service") result := rs.SampleTrace(span) @@ -542,7 +571,9 @@ func TestRulesSampler(t *testing.T) { assert.Nil(t, err) assert := assert.New(t) - rs := newRulesSampler(rules, nil, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(rules, nil, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeFinishedSpan(tt.spanName, tt.spanSrv, tt.spanRsc, tt.spanTags) @@ -554,45 +585,51 @@ func TestRulesSampler(t *testing.T) { t.Run("matching", func(t *testing.T) { traceRules := [][]SamplingRule{ - {ServiceRule("test-service", 1.0)}, - {NameRule("http.request", 1.0)}, - {NameServiceRule("http.request", "test-service", 1.0)}, - {NameServiceRule("http.*", "test-*", 1.0)}, - {ServiceRule("other-service-1", 0.0), ServiceRule("other-service-2", 0.0), ServiceRule("test-service", 1.0)}, - {TagsResourceRule(map[string]string{"hostname": "hn-*"}, "", "", "", 1.0)}, - {TagsResourceRule(map[string]string{"hostname": "hn-3*"}, "res-1*", "", "", 1.0)}, - {TagsResourceRule(map[string]string{"hostname": "hn-*"}, "", "", "", 1.0)}, + SpanSamplingRules(Rule{ServiceGlob: "test-service", Rate: 1.}), + SpanSamplingRules(Rule{NameGlob: "http.request", Rate: 1.}), + SpanSamplingRules(Rule{ServiceGlob: "test-service", NameGlob: "http.request", Rate: 1.}), + SpanSamplingRules(Rule{ServiceGlob: "test-*", NameGlob: "http.*", Rate: 1.}), + SpanSamplingRules(Rule{ServiceGlob: "other-service-1", Rate: 0.0}, Rule{ServiceGlob: "other-service-2", Rate: 0.0}, Rule{ServiceGlob: "test-service", Rate: 1.0}), + SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-??"}, Rate: 1.0}), + SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-3*"}, ResourceGlob: "res-1*", Rate: 1.0}), + SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-?0"}, Rate: 1.0}), } for _, v := range traceRules { t.Run("", func(t *testing.T) { assert := assert.New(t) - rs := newRulesSampler(v, nil, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(v, nil, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeSpan("http.request", "test-service") result := rs.SampleTrace(span) assert.True(result) - assert.Equal(1.0, span.Metrics[keyRulesSamplerAppliedRate]) - assert.Equal(1.0, span.Metrics[keyRulesSamplerLimiterRate]) + samplerRate, _ := getMetric(span, keyRulesSamplerAppliedRate) + assert.Equal(1.0, samplerRate) + ruleRate, _ := getMetric(span, keyRulesSamplerLimiterRate) + assert.Equal(1.0, ruleRate) }) } }) t.Run("not-matching", func(t *testing.T) { traceRules := [][]SamplingRule{ - {ServiceRule("toast-service", 1.0)}, - {NameRule("grpc.request", 1.0)}, - {NameServiceRule("http.request", "toast-service", 1.0)}, - {NameServiceRule("http.*", "toast-", 1.0)}, - {NameServiceRule("grpc.*", "test*", 1.0)}, - {ServiceRule("other-service-1", 0.0), ServiceRule("other-service-2", 0.0), ServiceRule("toast-service", 1.0)}, - {TagsResourceRule(map[string]string{"hostname": "hn--1"}, "", "", "", 1.0)}, - {TagsResourceRule(map[string]string{"host": "hn-1"}, "", "", "", 1.0)}, - {TagsResourceRule(nil, "res", "", "", 1.0)}, + SpanSamplingRules(Rule{ServiceGlob: "toast-service", Rate: 1.}), + SpanSamplingRules(Rule{NameGlob: "grpc.request", Rate: 1.}), + SpanSamplingRules(Rule{NameGlob: "grpc.request", ServiceGlob: "toast-service", Rate: 1.}), + SpanSamplingRules(Rule{NameGlob: "http\\..*", ServiceGlob: "toast-", Rate: 1.}), + SpanSamplingRules(Rule{NameGlob: "grpc\\..*", ServiceGlob: "test-", Rate: 1.}), + SpanSamplingRules(Rule{ServiceGlob: "other-service-1", Rate: 0}, Rule{ServiceGlob: "other-service-2", Rate: 0}, Rule{ServiceGlob: "toast-service", Rate: 1.}), + SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn--1"}, Rate: 1.0}), + SpanSamplingRules(Rule{Tags: map[string]string{"host": "hn-1"}, Rate: 1.0}), + SpanSamplingRules(Rule{ResourceGlob: "res", Rate: 1.0}), } for _, v := range traceRules { t.Run("", func(t *testing.T) { assert := assert.New(t) - rs := newRulesSampler(v, nil, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(v, nil, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeSpan("http.request", "test-service") result := rs.SampleTrace(span) @@ -638,15 +675,17 @@ func TestRulesSampler(t *testing.T) { _, rules, err := samplingRulesFromEnv() assert.Nil(t, err) assert := assert.New(t) - rs := newRulesSampler(nil, rules, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(nil, rules, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30"}) result := rs.SampleSpan(span) assert.True(result) - assert.Contains(span.Metrics, keySpanSamplingMechanism) - assert.Contains(span.Metrics, keySingleSpanSamplingRuleRate) - assert.Contains(span.Metrics, keySingleSpanSamplingMPS) + assert.Contains(span.metrics, keySpanSamplingMechanism) + assert.Contains(span.metrics, keySingleSpanSamplingRuleRate) + assert.Contains(span.metrics, keySingleSpanSamplingMPS) }) } }) @@ -659,109 +698,110 @@ func TestRulesSampler(t *testing.T) { hasMPS bool }{ { - rules: []SamplingRule{SpanNameServiceMPSRule("abcd?", "", 1.0, 100)}, + rules: SpanSamplingRules(Rule{NameGlob: "abcd?", Rate: 1, MaxPerSecond: 100}), spanSrv: "test-service", spanName: "abcde", hasMPS: true, }, { - rules: []SamplingRule{SpanNameServiceRule("abcd?", "", 1.0)}, + rules: SpanSamplingRules(Rule{NameGlob: "abcd?", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanNameServiceMPSRule("", "*abcd", 1.0, 100)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "*abcd", Rate: 1, MaxPerSecond: 100}), spanSrv: "xyzabcd", spanName: "abcde", hasMPS: true, }, { - rules: []SamplingRule{SpanNameServiceRule("", "*abcd", 1.0)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "*abcd", Rate: 1.0}), spanSrv: "xyzabcd", spanName: "abcde", }, { - rules: []SamplingRule{SpanNameServiceMPSRule("abcd?", "*service", 1.0, 100)}, + rules: SpanSamplingRules(Rule{NameGlob: "abcd?", ServiceGlob: "*service", Rate: 1.0, MaxPerSecond: 100}), spanSrv: "test-service", spanName: "abcde", hasMPS: true, }, { - rules: []SamplingRule{SpanNameServiceRule("abcd?", "*service", 1.0)}, + rules: SpanSamplingRules(Rule{NameGlob: "abcd?", ServiceGlob: "*service", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanNameServiceMPSRule("", "?*", 1.0, 100)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "?*", Rate: 1, MaxPerSecond: 100}), spanSrv: "test-service", spanName: "abcde", hasMPS: true, }, { - rules: []SamplingRule{SpanNameServiceRule("", "?*", 1.0)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "?*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "res*", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, ResourceGlob: "res*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "abc*", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, NameGlob: "abc*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tier": "20?"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*", "tier": "20?"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tier": "2*"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*", "tier": "2*"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tier": "*"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*", "tier": "*"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tag": "*"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*", "tag": "*"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanNameServiceRule("", "web*", 1.0)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "web*", Rate: 1.0}), spanSrv: "wEbServer", spanName: "web.reqUEst", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"shall-pass": "true"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"shall-pass": "true"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, } { t.Run(fmt.Sprintf("%v", i), func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithSamplingRules(tt.rules)) - rs := newRulesSampler(nil, c.spanRules, newConfig().globalSampleRate) + c, err := newTestConfig(WithSamplingRules(tt.rules)) + assert.NoError(err) + rs := newRulesSampler(nil, c.spanRules, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30", "tag": 20.1, @@ -770,10 +810,10 @@ func TestRulesSampler(t *testing.T) { }) result := rs.SampleSpan(span) assert.True(result) - assert.Contains(span.Metrics, keySpanSamplingMechanism) - assert.Contains(span.Metrics, keySingleSpanSamplingRuleRate) + assert.Contains(span.metrics, keySpanSamplingMechanism) + assert.Contains(span.metrics, keySingleSpanSamplingRuleRate) if tt.hasMPS { - assert.Contains(span.Metrics, keySingleSpanSamplingMPS) + assert.Contains(span.metrics, keySingleSpanSamplingMPS) } }) } @@ -787,7 +827,7 @@ func TestRulesSampler(t *testing.T) { resName string }{ { - //first matching rule takes precedence + // first matching rule takes precedence rules: `[{"name": "abcd?", "sample_rate": 0.0},{"name": "abcd?", "sample_rate": 1.0}]`, spanSrv: "test-service", spanName: "abcdef", @@ -829,15 +869,16 @@ func TestRulesSampler(t *testing.T) { _, rules, _ := samplingRulesFromEnv() assert := assert.New(t) - sampleRate := newConfig().globalSampleRate - rs := newRulesSampler(nil, rules, sampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(nil, rules, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeFinishedSpan(tt.spanName, tt.spanSrv, tt.resName, map[string]interface{}{"hostname": "hn-30"}) result := rs.SampleSpan(span) assert.False(result) - assert.NotContains(span.Metrics, keySpanSamplingMechanism) - assert.NotContains(span.Metrics, keySingleSpanSamplingRuleRate) - assert.NotContains(span.Metrics, keySingleSpanSamplingMPS) + assert.NotContains(span.metrics, keySpanSamplingMechanism) + assert.NotContains(span.metrics, keySingleSpanSamplingRuleRate) + assert.NotContains(span.metrics, keySingleSpanSamplingMPS) }) } }) @@ -849,107 +890,106 @@ func TestRulesSampler(t *testing.T) { rules []SamplingRule }{ { - rules: []SamplingRule{SpanNameServiceRule("[a-z]+\\d+", "^test-[a-z]+", 1.)}, + rules: SpanSamplingRules(Rule{NameGlob: "[a-z]+\\d+", ServiceGlob: "^test-[a-z]+", Rate: 1.}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanNameServiceRule("[a-z]+\\d+", "^test-\\w+", 1.0)}, + rules: SpanSamplingRules(Rule{NameGlob: "[a-z]+\\d+", ServiceGlob: "^test-\\w+", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanNameServiceRule("[a-z]+\\d+", "\\w+", 1.0)}, + rules: SpanSamplingRules(Rule{NameGlob: "[a-z]+\\d+", ServiceGlob: "\\w+", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanNameServiceRule(``, "\\w+", 1.0)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "\\w+", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"host": "hn-1"}, "", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"host": "hn-1"}, Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn-100"}, "res-1*", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-100"}, ResourceGlob: "res-1*", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanTagsResourceRule( - map[string]string{"hostname": "hn-10"}, - "res-100", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-10"}, ResourceGlob: "res-100", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanNameServiceRule(``, "\\w+", 1.0)}, + rules: SpanSamplingRules(Rule{ServiceGlob: "\\w+", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde123", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "incorrect*"}, "", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "incorrect*"}, Rate: 1.0}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "resnope*", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, ResourceGlob: "resnope*", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "abcno", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, NameGlob: "abcno", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "", "test234", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, ServiceGlob: "test234", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*"}, "", "abc234", "testno", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*"}, NameGlob: "abc234", ServiceGlob: "testno", Rate: 1.0}), spanSrv: "test-service", spanName: "abcde", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"tag": "20"}, "", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"tag": "20"}, Rate: 1}), spanSrv: "wEbServer", spanName: "web.reqUEst", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"tag": "2*"}, "", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"tag": "2*"}, Rate: 1}), spanSrv: "wEbServer", spanName: "web.reqUEst", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"tag": "2?"}, "", "", "", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"tag": "2?"}, Rate: 1}), spanSrv: "wEbServer", spanName: "web.reqUEst", }, { - rules: []SamplingRule{SpanTagsResourceRule(map[string]string{"hostname": "hn*", "tag": "2*"}, "", "abc*", "test*", 1.0)}, + rules: SpanSamplingRules(Rule{Tags: map[string]string{"hostname": "hn*", "tag": "2*"}, NameGlob: "abc*", ServiceGlob: "test*", Rate: 1}), spanSrv: "test-service", spanName: "abcde", }, } { t.Run("", func(t *testing.T) { assert := assert.New(t) - c := newConfig(WithSamplingRules(tt.rules)) - rs := newRulesSampler(nil, c.spanRules, newConfig().globalSampleRate) + c, err := newTestConfig(WithSamplingRules(tt.rules)) + assert.NoError(err) + rs := newRulesSampler(nil, c.spanRules, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeFinishedSpan(tt.spanName, tt.spanSrv, "res-10", map[string]interface{}{"hostname": "hn-30", "tag": 20.1, }) result := rs.SampleSpan(span) assert.False(result) - assert.NotContains(span.Metrics, keySpanSamplingMechanism) - assert.NotContains(span.Metrics, keySingleSpanSamplingRuleRate) - assert.NotContains(span.Metrics, keySingleSpanSamplingMPS) + assert.NotContains(span.metrics, keySpanSamplingMechanism) + assert.NotContains(span.metrics, keySingleSpanSamplingRuleRate) + assert.NotContains(span.metrics, keySingleSpanSamplingMPS) }) } }) @@ -957,7 +997,7 @@ func TestRulesSampler(t *testing.T) { t.Run("default-rate", func(t *testing.T) { ruleSets := [][]SamplingRule{ {}, - {ServiceRule("other-service", 0.0)}, + TraceSamplingRules(Rule{ServiceGlob: "other-service"}), } for _, rules := range ruleSets { sampleRates := []float64{ @@ -969,16 +1009,21 @@ func TestRulesSampler(t *testing.T) { t.Run("", func(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_SAMPLE_RATE", fmt.Sprint(rate)) - rs := newRulesSampler(nil, rules, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(nil, rules, c.globalSampleRate, c.traceRateLimitPerSecond) span := makeSpan("http.request", "test-service") result := rs.SampleTrace(span) assert.False(result) result = rs.SampleTraceGlobalRate(span) assert.True(result) - assert.Equal(rate, span.Metrics[keyRulesSamplerAppliedRate]) - if rate > 0.0 && (span.Metrics[keySamplingPriority] != ext.PriorityUserReject) { - assert.Equal(1.0, span.Metrics[keyRulesSamplerLimiterRate]) + ruleRate, _ := getMetric(span, keyRulesSamplerAppliedRate) + assert.Equal(rate, ruleRate) + priority, _ := getMetric(span, keySamplingPriority) + if rate > 0.0 && (priority != ext.PriorityUserReject) { + rateLimiter, _ := getMetric(span, keyRulesSamplerLimiterRate) + assert.Equal(1.0, rateLimiter) } }) } @@ -1025,7 +1070,8 @@ func TestRulesSampler(t *testing.T) { t.Run("", func(t *testing.T) { t.Setenv("DD_TRACE_SAMPLING_RULES", test.rules) t.Setenv("DD_TRACE_SAMPLE_RATE", test.generalRate) - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) defer stop() s, _ := StartSpanFromContext(context.Background(), "web.request", @@ -1034,8 +1080,10 @@ func TestRulesSampler(t *testing.T) { s.SetTag("tag2", "val2") s.Finish() - assert.EqualValues(t, s.(*span).Metrics[keySamplingPriority], test.samplingPriority) - assert.EqualValues(t, s.(*span).Metrics[keyRulesSamplerAppliedRate], test.appliedRate) + priority, _ := getMetric(s, keySamplingPriority) + assert.EqualValues(t, priority, test.samplingPriority) + ruleRate, _ := getMetric(s, keyRulesSamplerAppliedRate) + assert.EqualValues(t, test.appliedRate, ruleRate) }) } }) @@ -1044,7 +1092,8 @@ func TestRulesSampler(t *testing.T) { t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"tags": {"tag2": "val2"}, "sample_rate": 0},{"tags": {"tag1": "val1"}, "sample_rate": 1},{"tags": {"tag0": "val*"}, "sample_rate": 0}]`) t.Setenv("DD_TRACE_SAMPLE_RATE", "0") - tr, _, _, stop := startTestTracer(t) + tr, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) defer stop() originSpan, _ := StartSpanFromContext(context.Background(), "web.request", @@ -1052,20 +1101,27 @@ func TestRulesSampler(t *testing.T) { originSpan.SetTag("tag1", "val1") // based on the Tag("tag0", "val0") start span option, span sampling would be 'drop', // and setting the second pair of tags doesn't invoke sampling func - assert.EqualValues(t, -1, originSpan.(*span).Metrics[keySamplingPriority]) - assert.EqualValues(t, 0, originSpan.(*span).Metrics[keyRulesSamplerAppliedRate]) + priority, _ := getMetric(originSpan, keySamplingPriority) + assert.EqualValues(t, -1, priority) + ruleRate, _ := getMetric(originSpan, keyRulesSamplerAppliedRate) + assert.EqualValues(t, 0, ruleRate) headers := TextMapCarrier(map[string]string{}) // inject invokes resampling, since span satisfies rule #2, sampling will be 'keep' - tr.Inject(originSpan.Context(), headers) - assert.EqualValues(t, 2, originSpan.(*span).Metrics[keySamplingPriority]) - assert.EqualValues(t, 1, originSpan.(*span).Metrics[keyRulesSamplerAppliedRate]) + err = tr.Inject(originSpan.Context(), headers) + assert.NoError(t, err) + priority, _ = getMetric(originSpan, keySamplingPriority) + ruleRate, _ = getMetric(originSpan, keyRulesSamplerAppliedRate) + assert.EqualValues(t, 2, priority) + assert.EqualValues(t, 1, ruleRate) // context already injected / propagated, and the sampling decision can no longer be changed originSpan.SetTag("tag2", "val2") originSpan.Finish() - assert.EqualValues(t, 2, originSpan.(*span).Metrics[keySamplingPriority]) - assert.EqualValues(t, 1, originSpan.(*span).Metrics[keyRulesSamplerAppliedRate]) + priority, _ = getMetric(originSpan, keySamplingPriority) + ruleRate, _ = getMetric(originSpan, keyRulesSamplerAppliedRate) + assert.EqualValues(t, 2, priority) + assert.EqualValues(t, 1, ruleRate) w3cCtx, err := tr.Extract(headers) assert.Nil(t, err) @@ -1073,32 +1129,35 @@ func TestRulesSampler(t *testing.T) { w3cSpan, _ := StartSpanFromContext(context.Background(), "web.request", ChildOf(w3cCtx)) w3cSpan.Finish() - assert.EqualValues(t, 2, w3cSpan.(*span).Metrics[keySamplingPriority]) + priority, _ = getMetric(w3cSpan, keySamplingPriority) + assert.EqualValues(t, 2, priority) }) t.Run("manual keep priority", func(t *testing.T) { t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"resource": "keep_me", "sample_rate": 0}]`) - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) defer stop() s, _ := StartSpanFromContext(context.Background(), "whatever") s.SetTag(ext.ManualKeep, true) s.SetTag(ext.ResourceName, "keep_me") s.Finish() - assert.EqualValues(t, s.(*span).Metrics[keySamplingPriority], 2) + priority, _ := getMetric(s, keySamplingPriority) + assert.EqualValues(t, 2, priority) }) t.Run("no-agent_psr-with-rules-sampling", func(t *testing.T) { t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"resource": "keep_me", "sample_rate": 0}]`) - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) defer stop() - s, _ := StartSpanFromContext(context.Background(), "whatever") - s.SetTag(ext.ResourceName, "keep_me") - s.Finish() - span := s.(*span) - assert.NotContains(t, span.Metrics, keySamplingPriorityRate) - assert.Contains(t, span.Metrics, keyRulesSamplerAppliedRate) + span, _ := StartSpanFromContext(context.Background(), "whatever") + span.SetTag(ext.ResourceName, "keep_me") + span.Finish() + assert.NotContains(t, span.metrics, keySamplingPriorityRate) + assert.Contains(t, span.metrics, keyRulesSamplerAppliedRate) }) } @@ -1208,13 +1267,139 @@ func TestSamplingRuleUnmarshal(t *testing.T) { } -func TestRulesSamplerConcurrency(_ *testing.T) { - rules := []SamplingRule{ - ServiceRule("test-service", 1.0), - NameServiceRule("db.query", "postgres.db", 1.0), - NameRule("notweb.request", 1.0), +func TestIncident41436(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE_EXTRACT", "datadog") + + extractAndStartChild := func(h http.Header) *Span { + ctx, err := Extract(HTTPHeadersCarrier(h)) + assert.NoError(t, err) + return StartSpan("web.request", ChildOf(ctx)) } - tracer := newTracer(WithSamplingRules(rules)) + + t.Run("rules-to-keep", func(t *testing.T) { + t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"name": "web.request", "sample_rate": 1.0}]`) + t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"name": "web.request", "sample_rate": 1.0}]`) + + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) + defer stop() + + s1 := extractAndStartChild(http.Header{ + "x-datadog-trace-id": {"12345678901"}, + "x-datadog-parent-id": {"98765432101"}, + "x-datadog-sampling-priority": {"1"}, + "x-datadog-origin": {"rum"}, + }) + s1.Finish() + + s2 := extractAndStartChild(http.Header{ + "x-datadog-trace-id": {"12345678902"}, + "x-datadog-parent-id": {"98765432102"}, + "x-datadog-sampling-priority": {"0"}, + "x-datadog-origin": {"rum"}, + }) + s2.Finish() + + stop() + + origin, _ := getMeta(s1, keyOrigin) + assert.Equal(t, "rum", origin) + priority, _ := getMetric(s1, keySamplingPriority) + assert.Equal(t, float64(1), priority) + + _, hasKeyDecisionMaker := getMetric(s1, keyDecisionMaker) + _, hasKeyRulesSamplerAppliedRate := getMetric(s1, keyRulesSamplerAppliedRate) + _, hasKeySpanSamplingMechanism := getMetric(s1, keySpanSamplingMechanism) + _, hasKeySingleSpanSamplingRuleRate := getMetric(s1, keySingleSpanSamplingRuleRate) + _, hasKeySingleSpanSamplingMPS := getMetric(s1, keySingleSpanSamplingMPS) + assert.False(t, hasKeyDecisionMaker) + assert.False(t, hasKeyRulesSamplerAppliedRate) + assert.False(t, hasKeySpanSamplingMechanism) + assert.False(t, hasKeySingleSpanSamplingRuleRate) + assert.False(t, hasKeySingleSpanSamplingMPS) + + origin, _ = getMeta(s2, keyOrigin) + assert.Equal(t, "rum", origin) + priority, _ = getMetric(s2, keySamplingPriority) + assert.Equal(t, float64(0), priority) + + _, hasKeyDecisionMaker = getMetric(s2, keyDecisionMaker) + _, hasKeyRulesSamplerAppliedRate = getMetric(s2, keyRulesSamplerAppliedRate) + metric, _ := getMetric(s2, keySpanSamplingMechanism) + metricRuleRate, _ := getMetric(s2, keySingleSpanSamplingRuleRate) + assert.False(t, hasKeyDecisionMaker) + assert.False(t, hasKeyRulesSamplerAppliedRate) + assert.Equal(t, float64(8), metric) + assert.Equal(t, float64(1), metricRuleRate) + }) + + t.Run("rules-to-drop", func(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE_EXTRACT", "datadog") + t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"name": "web.request", "sample_rate": 0.0}]`) + t.Setenv("DD_TRACE_SAMPLING_RULES", `[{"name": "web.request", "sample_rate": 0.0}]`) + + _, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) + defer stop() + + s1 := extractAndStartChild(http.Header{ + "x-datadog-trace-id": {"12345678901"}, + "x-datadog-parent-id": {"98765432101"}, + "x-datadog-sampling-priority": {"1"}, + "x-datadog-origin": {"rum"}, + }) + s1.Finish() + + s2 := extractAndStartChild(http.Header{ + "x-datadog-trace-id": {"12345678902"}, + "x-datadog-parent-id": {"98765432102"}, + "x-datadog-sampling-priority": {"0"}, + "x-datadog-origin": {"rum"}, + }) + s2.Finish() + + stop() + + origin, _ := getMeta(s1, keyOrigin) + assert.Equal(t, "rum", origin) + priority, _ := getMetric(s1, keySamplingPriority) + assert.Equal(t, float64(1), priority) + _, hasKeyDecisionMaker := getMetric(s1, keyDecisionMaker) + _, hasKeyRulesSamplerAppliedRate := getMetric(s1, keyRulesSamplerAppliedRate) + _, hasKeySpanSamplingMechanism := getMetric(s1, keySpanSamplingMechanism) + _, hasKeySingleSpanSamplingRuleRate := getMetric(s1, keySingleSpanSamplingRuleRate) + _, hasKeySingleSpanSamplingMPS := getMetric(s1, keySingleSpanSamplingMPS) + assert.False(t, hasKeyDecisionMaker) + assert.False(t, hasKeyRulesSamplerAppliedRate) + assert.False(t, hasKeySpanSamplingMechanism) + assert.False(t, hasKeySingleSpanSamplingRuleRate) + assert.False(t, hasKeySingleSpanSamplingMPS) + + origin, _ = getMeta(s2, keyOrigin) + assert.Equal(t, "rum", origin) + priority, _ = getMetric(s2, keySamplingPriority) + assert.Equal(t, float64(0), priority) + _, hasKeyDecisionMaker = getMetric(s2, keyDecisionMaker) + _, hasKeyRulesSamplerAppliedRate = getMetric(s2, keyRulesSamplerAppliedRate) + _, hasKeySpanSamplingMechanism = getMetric(s2, keySpanSamplingMechanism) + _, hasKeySingleSpanSamplingRuleRate = getMetric(s2, keySingleSpanSamplingRuleRate) + _, hasKeySingleSpanSamplingMPS = getMetric(s2, keySingleSpanSamplingMPS) + assert.False(t, hasKeyDecisionMaker) + assert.False(t, hasKeyRulesSamplerAppliedRate) + assert.False(t, hasKeySpanSamplingMechanism) + assert.False(t, hasKeySingleSpanSamplingRuleRate) + assert.False(t, hasKeySingleSpanSamplingMPS) + }) +} + +func TestRulesSamplerConcurrency(t *testing.T) { + rules := TraceSamplingRules( + Rule{ServiceGlob: "test-service", Rate: 1.0}, + Rule{NameGlob: "db.query", ServiceGlob: "postgres.db", Rate: 1.0}, + Rule{NameGlob: "notweb.request", Rate: 1.0}, + ) + tracer, err := newTracer(WithSamplingRules(rules)) + assert.NoError(t, err) defer tracer.Stop() span := func(wg *sync.WaitGroup) { defer wg.Done() @@ -1230,9 +1415,9 @@ func TestRulesSamplerConcurrency(_ *testing.T) { } func TestRulesSamplerInternals(t *testing.T) { - makeSpanAt := func(op string, svc string, ts time.Time) *span { + makeSpanAt := func(op string, svc string, ts time.Time) *Span { s := newSpan(op, svc, "", 0, 0, 0) - s.Start = ts.UnixNano() + s.start = ts.UnixNano() return s } @@ -1242,15 +1427,18 @@ func TestRulesSamplerInternals(t *testing.T) { rs := &rulesSampler{} span := makeSpanAt("http.request", "test-service", now) rs.traces.applyRate(span, 0.0, now, samplernames.RuleRate) - assert.Equal(0.0, span.Metrics[keyRulesSamplerAppliedRate]) - _, ok := span.Metrics[keyRulesSamplerLimiterRate] + rate, _ := getMetric(span, keyRulesSamplerAppliedRate) + assert.Equal(float64(0), rate) + _, ok := getMetric(span, keyRulesSamplerLimiterRate) assert.False(ok) }) t.Run("full-rate", func(t *testing.T) { assert := assert.New(t) now := time.Now() - rs := newRulesSampler(nil, nil, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(nil, nil, c.globalSampleRate, c.traceRateLimitPerSecond) // set samplingLimiter to specific state rs.traces.limiter.prevTime = now.Add(-1 * time.Second) rs.traces.limiter.allowed = 1 @@ -1258,14 +1446,18 @@ func TestRulesSamplerInternals(t *testing.T) { span := makeSpanAt("http.request", "test-service", now) rs.traces.applyRate(span, 1.0, now, samplernames.RuleRate) - assert.Equal(1.0, span.Metrics[keyRulesSamplerAppliedRate]) - assert.Equal(1.0, span.Metrics[keyRulesSamplerLimiterRate]) + rate, _ := getMetric(span, keyRulesSamplerAppliedRate) + limiterRate, _ := getMetric(span, keyRulesSamplerLimiterRate) + assert.Equal(1.0, rate) + assert.Equal(1.0, limiterRate) }) t.Run("limited-rate", func(t *testing.T) { assert := assert.New(t) now := time.Now() - rs := newRulesSampler(nil, nil, newConfig().globalSampleRate) + c, err := newTestConfig() + assert.NoError(err) + rs := newRulesSampler(nil, nil, c.globalSampleRate, c.traceRateLimitPerSecond) // force sampling limiter to 1.0 spans/sec rs.traces.limiter.limiter = rate.NewLimiter(rate.Limit(1.0), 1) rs.traces.limiter.prevTime = now.Add(-1 * time.Second) @@ -1274,21 +1466,27 @@ func TestRulesSamplerInternals(t *testing.T) { // first span kept, second dropped span := makeSpanAt("http.request", "test-service", now) rs.traces.applyRate(span, 1.0, now, samplernames.RuleRate) - assert.EqualValues(ext.PriorityUserKeep, span.Metrics[keySamplingPriority]) - assert.Equal(1.0, span.Metrics[keyRulesSamplerAppliedRate]) - assert.Equal(1.0, span.Metrics[keyRulesSamplerLimiterRate]) + priority, _ := getMetric(span, keySamplingPriority) + assert.EqualValues(ext.PriorityUserKeep, priority) + rate, _ := getMetric(span, keyRulesSamplerAppliedRate) + limiterRate, _ := getMetric(span, keyRulesSamplerLimiterRate) + assert.Equal(1.0, rate) + assert.Equal(1.0, limiterRate) span = makeSpanAt("http.request", "test-service", now) rs.traces.applyRate(span, 1.0, now, samplernames.RuleRate) - assert.EqualValues(ext.PriorityUserReject, span.Metrics[keySamplingPriority]) - assert.Equal(1.0, span.Metrics[keyRulesSamplerAppliedRate]) - assert.Equal(0.75, span.Metrics[keyRulesSamplerLimiterRate]) + priority, _ = getMetric(span, keySamplingPriority) + assert.EqualValues(ext.PriorityUserReject, priority) + rate, _ = getMetric(span, keyRulesSamplerAppliedRate) + limiterRate, _ = getMetric(span, keyRulesSamplerLimiterRate) + assert.Equal(1.0, rate) + assert.Equal(0.75, limiterRate) }) } func TestSamplingLimiter(t *testing.T) { t.Run("resets-every-second", func(t *testing.T) { assert := assert.New(t) - sl := newRateLimiter() + sl := newRateLimiter(defaultRateLimit) sl.prevSeen = 100 sl.prevAllowed = 99 sl.allowed = 42 @@ -1307,7 +1505,7 @@ func TestSamplingLimiter(t *testing.T) { t.Run("averages-rates", func(t *testing.T) { assert := assert.New(t) - sl := newRateLimiter() + sl := newRateLimiter(defaultRateLimit) sl.prevSeen = 100 sl.prevAllowed = 42 sl.allowed = 41 @@ -1325,7 +1523,7 @@ func TestSamplingLimiter(t *testing.T) { t.Run("discards-rate", func(t *testing.T) { assert := assert.New(t) - sl := newRateLimiter() + sl := newRateLimiter(defaultRateLimit) sl.prevSeen = 100 sl.prevAllowed = 42 sl.allowed = 42 @@ -1347,9 +1545,9 @@ func BenchmarkRulesSampler(b *testing.B) { const batchSize = 500 benchmarkStartSpan := func(b *testing.B, t *tracer) { - internal.SetGlobalTracer(t) + setGlobalTracer(t) defer func() { - internal.SetGlobalTracer(&internal.NoopTracer{}) + setGlobalTracer(&NoopTracer{}) }() t.prioritySampling.readRatesJSON(io.NopCloser(strings.NewReader( `{ @@ -1360,7 +1558,7 @@ func BenchmarkRulesSampler(b *testing.B) { }`, )), ) - spans := make([]Span, batchSize) + spans := make([]*Span, batchSize) b.StopTimer() b.ResetTimer() for i := 0; i < b.N; i += batchSize { @@ -1385,57 +1583,61 @@ func BenchmarkRulesSampler(b *testing.B) { } b.Run("no-rules", func(b *testing.B) { - tracer := newUnstartedTracer() + tracer, err := newUnstartedTracer() + assert.NoError(b, err) benchmarkStartSpan(b, tracer) }) b.Run("unmatching-rules", func(b *testing.B) { - rules := []SamplingRule{ - ServiceRule("test-service", 1.0), - NameServiceRule("db.query", "postgres.db", 1.0), - NameRule("notweb.request", 1.0), - } - tracer := newUnstartedTracer(WithSamplingRules(rules)) + rules := TraceSamplingRules( + Rule{ServiceGlob: "test-service", Rate: 1.0}, + Rule{NameGlob: "db.query", ServiceGlob: "postgres.db", Rate: 1.0}, + Rule{NameGlob: "notweb.request", Rate: 1.0}) + tracer, err := newUnstartedTracer(WithSamplingRules(rules)) + assert.NoError(b, err) benchmarkStartSpan(b, tracer) }) b.Run("matching-rules", func(b *testing.B) { - rules := []SamplingRule{ - ServiceRule("test-service", 1.0), - NameServiceRule("db.query", "postgres.db", 1.0), - NameRule("web.request", 1.0), - } - tracer := newUnstartedTracer(WithSamplingRules(rules)) + rules := TraceSamplingRules( + Rule{ServiceGlob: "test-service", Rate: 1.0}, + Rule{NameGlob: "db.query", ServiceGlob: "postgres.db", Rate: 1.0}, + Rule{NameGlob: "web.request", Rate: 1.0}) + tracer, err := newUnstartedTracer(WithSamplingRules(rules)) + assert.NoError(b, err) benchmarkStartSpan(b, tracer) }) b.Run("mega-rules", func(b *testing.B) { - rules := []SamplingRule{ - ServiceRule("test-service", 1.0), - NameServiceRule("db.query", "postgres.db", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("notweb.request", 1.0), - NameRule("web.request", 1.0), - } - tracer := newUnstartedTracer(WithSamplingRules(rules)) + rules := TraceSamplingRules([]Rule{ + {ServiceGlob: "test-service", Rate: 1.0}, + {ServiceGlob: "postgres.db", NameGlob: "db.query", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "notweb.request", Rate: 1.0}, + {NameGlob: "web.request", Rate: 1.0}, + }...) + + tracer, err := newUnstartedTracer(WithSamplingRules(rules)) + assert.NoError(b, err) benchmarkStartSpan(b, tracer) }) } @@ -1502,20 +1704,28 @@ func TestGlobMatch(t *testing.T) { func TestSamplingRuleMarshall(t *testing.T) { for i, tt := range []struct { - in SamplingRule - out string + in Rule + ruleType SamplingRuleType + out string }{ - {ServiceRule("srv.*", 0), `{"service":"srv.*","sample_rate":0}`}, - {NameServiceRule("ops.*", "srv.*", 0), `{"service":"srv.*","name":"ops.*","sample_rate":0}`}, - {NameServiceRule("ops.*", "srv.*", 0.55), `{"service":"srv.*","name":"ops.*","sample_rate":0.55}`}, - {TagsResourceRule(nil, "http_get", "", "", 0.55), `{"resource":"http_get","sample_rate":0.55}`}, - {TagsResourceRule(map[string]string{"host": "hn-*"}, "http_get", "", "", 0.35), `{"resource":"http_get","sample_rate":0.35,"tags":{"host":"hn-*"}}`}, - {SpanNameServiceRule("ops.*", "srv.*", 0.55), `{"service":"srv.*","name":"ops.*","sample_rate":0.55}`}, - {SpanNameServiceMPSRule("ops.*", "srv.*", 0.55, 1000), `{"service":"srv.*","name":"ops.*","sample_rate":0.55,"max_per_second":1000}`}, - {TagsResourceRule(nil, "//bar", "", "", 1), `{"resource":"//bar","sample_rate":1}`}, - {TagsResourceRule(map[string]string{"tag_key": "tag_value.*"}, "//bar", "", "", 1), `{"resource":"//bar","sample_rate":1,"tags":{"tag_key":"tag_value.*"}}`}, + {Rule{ServiceGlob: "srv.*"}, SamplingRuleTrace, `{"service":"srv.*","sample_rate":0}`}, + {Rule{NameGlob: "ops.*", ServiceGlob: "srv.*"}, SamplingRuleTrace, `{"service":"srv.*","name":"ops.*","sample_rate":0}`}, + {Rule{NameGlob: "ops.*", ServiceGlob: "srv.*", Rate: 0.55}, SamplingRuleTrace, `{"service":"srv.*","name":"ops.*","sample_rate":0.55}`}, + {Rule{Tags: nil, ResourceGlob: "http_get", Rate: 0.55}, SamplingRuleTrace, `{"resource":"http_get","sample_rate":0.55}`}, + {Rule{Tags: map[string]string{"host": "hn-*"}, ResourceGlob: "http_get", Rate: 0.35}, SamplingRuleTrace, `{"resource":"http_get","sample_rate":0.35,"tags":{"host":"hn-*"}}`}, + {Rule{NameGlob: "ops.*", ServiceGlob: "srv.*", Rate: 0.55}, SamplingRuleSpan, `{"service":"srv.*","name":"ops.*","sample_rate":0.55}`}, + {Rule{NameGlob: "ops.*", ServiceGlob: "srv.*", Rate: 0.55, MaxPerSecond: 1000}, SamplingRuleSpan, `{"service":"srv.*","name":"ops.*","sample_rate":0.55,"max_per_second":1000}`}, + {Rule{Tags: nil, ResourceGlob: "//bar", Rate: 1}, SamplingRuleTrace, `{"resource":"//bar","sample_rate":1}`}, + {Rule{Tags: map[string]string{"tag_key": "tag_value.*"}, ResourceGlob: "//bar", Rate: 1}, SamplingRuleTrace, `{"resource":"//bar","sample_rate":1,"tags":{"tag_key":"tag_value.*"}}`}, } { - m, err := tt.in.MarshalJSON() + var sr SamplingRule + switch tt.ruleType { + case SamplingRuleTrace: + sr = TraceSamplingRules(tt.in)[0] + case SamplingRuleSpan: + sr = SpanSamplingRules(tt.in)[0] + } + m, err := sr.MarshalJSON() assert.Nil(t, err) assert.Equal(t, tt.out, string(m), "at %d index", i) } @@ -1566,7 +1776,7 @@ func TestSamplingRuleMarshallGlob(t *testing.T) { } func BenchmarkGlobMatchSpan(b *testing.B) { - var spans []*span + var spans []*Span for i := 0; i < 1000; i++ { spans = append(spans, newSpan("name.ops.date", "srv.name.ops.date", "", 0, 0, 0)) } @@ -1614,7 +1824,7 @@ func BenchmarkGlobMatchSpan(b *testing.B) { } func TestSetGlobalSampleRate(t *testing.T) { - rs := newTraceRulesSampler(nil, math.NaN()) + rs := newTraceRulesSampler(nil, math.NaN(), defaultRateLimit) assert.True(t, math.IsNaN(rs.globalRate)) // Comparing NaN values @@ -1639,14 +1849,14 @@ func TestSetGlobalSampleRate(t *testing.T) { } func TestSampleTagsRootOnly(t *testing.T) { - assert := assert.New(t) t.Run("no-ctx-propagation", func(t *testing.T) { - Start(WithSamplingRules([]SamplingRule{ - TagsResourceRule(map[string]string{"tag": "20"}, "", "", "", 1), - TagsResourceRule(nil, "root", "", "", 0), - })) - tr := internal.GetGlobalTracer() + assert := assert.New(t) + Start(WithSamplingRules(TraceSamplingRules( + Rule{Tags: map[string]string{"tag": "20"}, Rate: 1}, + Rule{ResourceGlob: "root"}, + ))) + tr := getGlobalTracer() defer tr.Stop() root := tr.StartSpan("mysql.root", ResourceName("root")) @@ -1655,14 +1865,17 @@ func TestSampleTagsRootOnly(t *testing.T) { // root span should be sampled with the second rule // sampling decision is 0, thus "_dd.limit_psr" is not present - assert.Contains(root.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.Equal(0., root.(*span).Metrics[keyRulesSamplerAppliedRate]) - assert.NotContains(root.(*span).Metrics, keyRulesSamplerLimiterRate) + assert.Contains(root.metrics, keyRulesSamplerAppliedRate) + assert.Equal(0., root.metrics[keyRulesSamplerAppliedRate]) + assert.NotContains(root.metrics, keyRulesSamplerLimiterRate) + // Knuth sampling rate tag should be set even when rate is 0 + assert.Contains(root.meta, keyKnuthSamplingRate) + assert.Equal("0", root.meta[keyKnuthSamplingRate]) // neither"_dd.limit_psr", nor "_dd.rule_psr" should be present // on the child span - assert.NotContains(child.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.NotContains(child.(*span).Metrics, keyRulesSamplerLimiterRate) + assert.NotContains(child.metrics, keyRulesSamplerAppliedRate) + assert.NotContains(child.metrics, keyRulesSamplerLimiterRate) // setting this tag would change the result of sampling, // which will occur after the span is finished @@ -1672,21 +1885,31 @@ func TestSampleTagsRootOnly(t *testing.T) { // first sampling rule is applied, the sampling decision is 1 // and the "_dd.limit_psr" is present root.Finish() - assert.Equal(1., root.(*span).Metrics[keyRulesSamplerAppliedRate]) - assert.Contains(root.(*span).Metrics, keyRulesSamplerLimiterRate) + ruleRate, _ := getMetric(root, keyRulesSamplerAppliedRate) + assert.Equal(1., ruleRate) + _, hasLimiterRate := getMetric(root, keyRulesSamplerLimiterRate) + assert.True(hasLimiterRate) + // Knuth sampling rate tag should be set with rate 1.0 + rate, ok := getMeta(root, keyKnuthSamplingRate) + assert.True(ok) + assert.Equal("1", rate) // neither"_dd.limit_psr", nor "_dd.rule_psr" should be present // on the child span - assert.NotContains(child.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.NotContains(child.(*span).Metrics, keyRulesSamplerLimiterRate) + assert.NotContains(child.metrics, keyRulesSamplerAppliedRate) + assert.NotContains(child.metrics, keyRulesSamplerLimiterRate) + // child span should not have Knuth sampling rate tag + _, ok = getMeta(child, keyKnuthSamplingRate) + assert.False(ok) }) t.Run("with-ctx-propagation", func(t *testing.T) { - Start(WithSamplingRules([]SamplingRule{ - TagsResourceRule(map[string]string{"tag": "20"}, "", "", "", 1), - TagsResourceRule(nil, "root", "", "", 0), - })) - tr := internal.GetGlobalTracer() + assert := assert.New(t) + Start(WithSamplingRules(TraceSamplingRules( + Rule{Tags: map[string]string{"tag": "20"}, Rate: 1}, + Rule{Tags: nil, ResourceGlob: "root"}, + ))) + tr := getGlobalTracer() defer tr.Stop() root := tr.StartSpan("mysql.root", ResourceName("root")) @@ -1695,14 +1918,19 @@ func TestSampleTagsRootOnly(t *testing.T) { // root span should be sampled with the second rule // sampling decision is 0, thus "_dd.limit_psr" is not present - assert.Equal(0., root.(*span).Metrics[keyRulesSamplerAppliedRate]) - assert.Contains(root.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.NotContains(root.(*span).Metrics, keyRulesSamplerLimiterRate) + assert.Equal(0., root.metrics[keyRulesSamplerAppliedRate]) + assert.Contains(root.metrics, keyRulesSamplerAppliedRate) + assert.NotContains(root.metrics, keyRulesSamplerLimiterRate) + // Knuth sampling rate tag should be set even when rate is 0 + assert.Contains(root.meta, keyKnuthSamplingRate) + assert.Equal("0", root.meta[keyKnuthSamplingRate]) // neither"_dd.limit_psr", nor "_dd.rule_psr" should be present // on the child span - assert.NotContains(child.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.NotContains(child.(*span).Metrics, keyRulesSamplerLimiterRate) + assert.NotContains(child.metrics, keyRulesSamplerAppliedRate) + assert.NotContains(child.metrics, keyRulesSamplerLimiterRate) + // child span should not have Knuth sampling rate tag + assert.NotContains(child.meta, keyKnuthSamplingRate) // context propagation locks the span, so no re-sampling should occur tr.Inject(root.Context(), TextMapCarrier(map[string]string{})) @@ -1712,12 +1940,70 @@ func TestSampleTagsRootOnly(t *testing.T) { // re-sampling should not occur root.Finish() - assert.NotContains(child.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.NotContains(root.(*span).Metrics, keyRulesSamplerLimiterRate) + + _, hasRulesRate := getMetric(child, keyRulesSamplerAppliedRate) + assert.False(hasRulesRate) + _, hasLimiterRate := getMetric(root, keyRulesSamplerLimiterRate) + assert.False(hasLimiterRate) + // Knuth sampling rate tag should still be "0" since no re-sampling occurred + rate, ok := getMeta(root, keyKnuthSamplingRate) + assert.True(ok) + assert.Equal("0", rate) // neither"_dd.limit_psr", nor "_dd.rule_psr" should be present // on the child span - assert.NotContains(child.(*span).Metrics, keyRulesSamplerAppliedRate) - assert.NotContains(child.(*span).Metrics, keyRulesSamplerLimiterRate) + _, hasRulesRate = getMetric(child, keyRulesSamplerAppliedRate) + assert.False(hasRulesRate) + _, hasLimiterRate = getMetric(child, keyRulesSamplerLimiterRate) + assert.False(hasLimiterRate) + // child span should not have Knuth sampling rate tag + _, ok = getMeta(child, keyKnuthSamplingRate) + assert.False(ok) }) } + +func TestKnuthSamplingRateWithFloatRules(t *testing.T) { + assert := assert.New(t) + + testCases := []struct { + name string + rate float64 + expected string + }{ + {"half", 0.5, "0.5"}, + {"precision_six_digits", 0.7654321, "0.765432"}, + {"six_decimals", 0.123456, "0.123456"}, + {"seven_decimals_rounded", 0.1234567, "0.123457"}, + {"trailing_zeros", 0.100000, "0.1"}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + Start(WithSamplingRules(TraceSamplingRules( + Rule{ServiceGlob: "test-service-" + tc.name, Rate: tc.rate}, + ))) + tr := getGlobalTracer() + defer tr.Stop() + + root := tr.StartSpan("test.operation", ServiceName("test-service-"+tc.name)) + child := tr.StartSpan("child.operation", ChildOf(root.Context())) + child.Finish() + root.Finish() + + // Root span should have the sampling rule applied + rate, ok := getMetric(root, keyRulesSamplerAppliedRate) + assert.True(ok) + assert.Equal(tc.rate, rate) + + // Root span should have the Knuth sampling rate tag with correctly formatted value + knuthRate, ok := getMeta(root, keyKnuthSamplingRate) + assert.True(ok) + assert.Equal(tc.expected, knuthRate) + + // Child span should not have sampling tags + assert.NotContains(child.metrics, keyRulesSamplerAppliedRate) + _, ok = getMeta(child, keyKnuthSamplingRate) + assert.False(ok) + }) + } +} diff --git a/ddtrace/tracer/seelog_leak_workaround.go b/ddtrace/tracer/seelog_leak_workaround.go new file mode 100644 index 0000000000..73422712af --- /dev/null +++ b/ddtrace/tracer/seelog_leak_workaround.go @@ -0,0 +1,54 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/cihub/seelog" +) + +// This workaround fixes goroutine leaks caused by seelog. +// See https://github.com/DataDog/dd-trace-go/issues/2987. +// +// TODO(felixge): Remove this once a proper fix lands in the agent or after we +// drop the agent dependency that causes this [1]. +// +// [1] github.com/DataDog/datadog-agent/pkg/util/log +func init() { + if env.Get("DD_TRACE_DEBUG_SEELOG_WORKAROUND") == "false" { + return + } + + // Close the seelog loggers to fix the goroutine leaks. + seelog.Default.Close() + seelog.Disabled.Close() + + // Setup a new seelog logger that doesn't leak goroutines. + constraints, err := seelog.NewMinMaxConstraints(seelog.TraceLvl, seelog.CriticalLvl) + if err != nil { + log.Error("failed to create seelog constraints: %v", err.Error()) + return + } + console, err := seelog.NewConsoleWriter() + if err != nil { + log.Error("failed to create seelog console writer: %v", err.Error()) + return + } + dispatcher, err := seelog.NewSplitDispatcher(seelog.DefaultFormatter, []any{console}) + if err != nil { + log.Error("failed to create seelog dispatcher: %v", err.Error()) + return + } + seelog.Default = seelog.NewSyncLogger( + seelog.NewLoggerConfig( + constraints, + []*seelog.LogLevelException{}, + dispatcher, + ), + ) + seelog.Current = seelog.Default +} diff --git a/ddtrace/tracer/slog.go b/ddtrace/tracer/slog.go new file mode 100644 index 0000000000..9737c54ef4 --- /dev/null +++ b/ddtrace/tracer/slog.go @@ -0,0 +1,100 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package tracer + +import ( + "context" + "log/slog" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// groupOrAttrs holds either a group name or a list of slog.Attrs. +type groupOrAttrs struct { + group string // group name if non-empty + attrs []slog.Attr // attrs if non-empty +} + +// slogHandler implements the slog.Handler interface to dispatch messages to our +// internal logger. +type slogHandler struct { + goas []groupOrAttrs +} + +func (h slogHandler) Enabled(_ context.Context, lvl slog.Level) bool { + if lvl <= slog.LevelDebug { + return log.DebugEnabled() + } + // TODO(fg): Implement generic log level checking in the internal logger. + // But we're we're not concerned with slog perf, so this is okay for now. + return true +} + +func (h slogHandler) Handle(_ context.Context, r slog.Record) error { + goas := h.goas + + if r.NumAttrs() == 0 { + // If the record has no Attrs, remove groups at the end of the list; they are empty. + for len(goas) > 0 && goas[len(goas)-1].group != "" { + goas = goas[:len(goas)-1] + } + } + + parts := make([]string, 0, len(goas)+r.NumAttrs()) + formatGroup := "" + + for _, goa := range goas { + if goa.group != "" { + formatGroup += goa.group + "." + } else { + for _, a := range goa.attrs { + parts = append(parts, formatGroup+a.String()) + } + } + } + + r.Attrs(func(a slog.Attr) bool { + parts = append(parts, formatGroup+a.String()) + return true + }) + + extra := strings.Join(parts, " ") + switch r.Level { + case slog.LevelDebug: + log.Debug("%s %s", r.Message, extra) + case slog.LevelInfo: + log.Info("%s %s", r.Message, extra) + case slog.LevelWarn: + log.Warn("%s %s", r.Message, extra) + case slog.LevelError: + log.Error("%s %s", r.Message, extra) + } + return nil +} + +func (h slogHandler) withGroupOrAttrs(goa groupOrAttrs) slogHandler { + h.goas = append(h.goas, goa) + return h +} + +// WithGroup returns a new Handler whose group consist of +// both the receiver's groups and the arguments. +func (h slogHandler) WithGroup(name string) slog.Handler { + if name == "" { + return h + } + return h.withGroupOrAttrs(groupOrAttrs{group: name}) +} + +// WithAttrs returns a new Handler whose attributes consist of +// both the receiver's attributes and the arguments. +func (h slogHandler) WithAttrs(attrs []slog.Attr) slog.Handler { + if len(attrs) == 0 { + return h + } + return h.withGroupOrAttrs(groupOrAttrs{attrs: attrs}) +} diff --git a/ddtrace/tracer/slog_test.go b/ddtrace/tracer/slog_test.go new file mode 100644 index 0000000000..409cb2c08b --- /dev/null +++ b/ddtrace/tracer/slog_test.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package tracer + +import ( + "log/slog" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/stretchr/testify/require" +) + +func Test_slogHandler(t *testing.T) { + // Create a record logger to capture the logs and restore the original + // logger at the end. + rl := &log.RecordLogger{} + defer log.UseLogger(rl)() + + // Ensure the logger is set to the default level. This may not be the case + // when previous tests pollute the global state. We leave the logger in the + // state we found it to not contribute to this pollution ourselves. + oldLevel := log.GetLevel() + log.SetLevel(log.LevelWarn) + defer log.SetLevel(oldLevel) + + // Log a few messages at different levels. The debug message gets discarded + // because the internal logger does not have debug enabled by default. + l := slog.New(slogHandler{}) + l = l.With("foo", "bar") + l = l.WithGroup("a").WithGroup("b") + l.Debug("debug test", "n", 0) + l.Info("info test", "n", 1) + l.Warn("warn test", "n", 2) + l.Error("error test", "n", 3) + log.Flush() // needed to get the error log flushed + + // Check that chaining works as expected. + l = l.With("baz", "qux") + l = l.WithGroup("c").WithGroup("d") + l.Info("info test", "n", 1) + + log.Flush() + + // Check that the logs were written correctly. + require.Len(t, rl.Logs(), 4) + require.Contains(t, rl.Logs()[0], "info test foo=bar a.b.n=1") + require.Contains(t, rl.Logs()[1], "warn test foo=bar a.b.n=2") + require.Contains(t, rl.Logs()[2], "error test foo=bar a.b.n=3") + require.Contains(t, rl.Logs()[3], "info test foo=bar a.b.baz=qux a.b.c.d.n=1") +} diff --git a/ddtrace/tracer/span.go b/ddtrace/tracer/span.go index c37af7d5c4..3c6206c6d7 100644 --- a/ddtrace/tracer/span.go +++ b/ddtrace/tracer/span.go @@ -3,16 +3,15 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -//go:generate msgp -unexported -marshal=false -o=span_msgp.go -tests=false +//go:generate go run github.com/tinylib/msgp -unexported -marshal=false -o=span_msgp.go -tests=false package tracer import ( "context" "encoding/base64" + "encoding/json" "fmt" - "math" - "os" "reflect" "runtime" "runtime/pprof" @@ -20,27 +19,30 @@ import ( "strconv" "strings" "sync" - "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - sharedinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/errortrace" + sharedinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" - "github.com/DataDog/datadog-agent/pkg/obfuscate" "github.com/tinylib/msgp/msgp" + "golang.org/x/xerrors" + + "github.com/DataDog/datadog-agent/pkg/obfuscate" ) type ( // spanList implements msgp.Encodable on top of a slice of spans. - spanList []*span + spanList []*Span // spanLists implements msgp.Decodable on top of a slice of spanList. // This type is only used in tests. @@ -48,7 +50,6 @@ type ( ) var ( - _ ddtrace.Span = (*span)(nil) _ msgp.Encodable = (*spanList)(nil) _ msgp.Decodable = (*spanLists)(nil) ) @@ -60,30 +61,84 @@ type errorConfig struct { stackSkip uint } -// span represents a computation. Callers must call Finish when a span is +// AsMap places tags and span properties into a map and returns it. +// +// Note that this is not performant, nor are spans guaranteed to have all of their +// properties set at any time during normal operation! This is used for testing only, +// and should not be used in non-test code, or you may run into performance or other +// issues. +func (s *Span) AsMap() map[string]interface{} { + m := make(map[string]interface{}) + if s == nil { + return m + } + m[ext.SpanName] = s.name + m[ext.ServiceName] = s.service + m[ext.ResourceName] = s.resource + m[ext.SpanType] = s.spanType + m[ext.MapSpanStart] = s.start + m[ext.MapSpanDuration] = s.duration + for k, v := range s.meta { + m[k] = v + } + for k, v := range s.metrics { + m[k] = v + } + for k, v := range s.metaStruct { + m[k] = v + } + m[ext.MapSpanID] = s.spanID + m[ext.MapSpanTraceID] = s.traceID + m[ext.MapSpanParentID] = s.parentID + m[ext.MapSpanError] = s.error + if events := s.spanEventsAsJSONString(); events != "" { + m[ext.MapSpanEvents] = events + } + return m +} + +func (s *Span) spanEventsAsJSONString() string { + if !s.supportsEvents { + return s.meta["events"] + } + if s.spanEvents == nil { + return "" + } + events, err := json.Marshal(s.spanEvents) + if err != nil { + log.Error("failed to marshal span events: %s", err.Error()) + return "" + } + return string(events) +} + +// Span represents a computation. Callers must call Finish when a Span is // complete to ensure it's submitted. -type span struct { - sync.RWMutex `msg:"-"` // all fields are protected by this RWMutex - - Name string `msg:"name"` // operation name - Service string `msg:"service"` // service name (i.e. "grpc.server", "http.request") - Resource string `msg:"resource"` // resource name (i.e. "/user?id=123", "SELECT * FROM users") - Type string `msg:"type"` // protocol associated with the span (i.e. "web", "db", "cache") - Start int64 `msg:"start"` // span start time expressed in nanoseconds since epoch - Duration int64 `msg:"duration"` // duration of the span expressed in nanoseconds - Meta map[string]string `msg:"meta,omitempty"` // arbitrary map of metadata - MetaStruct metaStructMap `msg:"meta_struct,omitempty"` // arbitrary map of metadata with structured values - Metrics map[string]float64 `msg:"metrics,omitempty"` // arbitrary map of numeric metrics - SpanID uint64 `msg:"span_id"` // identifier of this span - TraceID uint64 `msg:"trace_id"` // lower 64-bits of the root span identifier - ParentID uint64 `msg:"parent_id"` // identifier of the span's direct parent - Error int32 `msg:"error"` // error status of the span; 0 means no errors - SpanLinks []ddtrace.SpanLink `msg:"span_links"` // links to other spans - - goExecTraced bool `msg:"-"` - noDebugStack bool `msg:"-"` // disables debug stack traces - finished bool `msg:"-"` // true if the span has been submitted to a tracer. Can only be read/modified if the trace is locked. - context *spanContext `msg:"-"` // span propagation context +type Span struct { + mu sync.RWMutex `msg:"-"` // all fields are protected by this RWMutex + + name string `msg:"name"` // operation name + service string `msg:"service"` // service name (i.e. "grpc.server", "http.request") + resource string `msg:"resource"` // resource name (i.e. "/user?id=123", "SELECT * FROM users") + spanType string `msg:"type"` // protocol associated with the span (i.e. "web", "db", "cache") + start int64 `msg:"start"` // span start time expressed in nanoseconds since epoch + duration int64 `msg:"duration"` // duration of the span expressed in nanoseconds + meta map[string]string `msg:"meta,omitempty"` // arbitrary map of metadata + metaStruct metaStructMap `msg:"meta_struct,omitempty"` // arbitrary map of metadata with structured values + metrics map[string]float64 `msg:"metrics,omitempty"` // arbitrary map of numeric metrics + spanID uint64 `msg:"span_id"` // identifier of this span + traceID uint64 `msg:"trace_id"` // lower 64-bits of the root span identifier + parentID uint64 `msg:"parent_id"` // identifier of the span's direct parent + error int32 `msg:"error"` // error status of the span; 0 means no errors + spanLinks []SpanLink `msg:"span_links,omitempty"` // links to other spans + spanEvents []spanEvent `msg:"span_events,omitempty"` // events produced related to this span + + goExecTraced bool `msg:"-"` + noDebugStack bool `msg:"-"` // disables debug stack traces + finished bool `msg:"-"` // true if the span has been submitted to a tracer. Can only be read/modified if the trace is locked. + context *SpanContext `msg:"-"` // span propagation context + integration string `msg:"-"` // where the span was started from, such as a specific contrib or "manual" + supportsEvents bool `msg:"-"` // whether the span supports native span events or not pprofCtxActive context.Context `msg:"-"` // contains pprof.WithLabel labels to tell the profiler more about this span pprofCtxRestore context.Context `msg:"-"` // contains pprof.WithLabel labels of the parent span (if any) that need to be restored when this span finishes @@ -94,28 +149,43 @@ type span struct { // Context yields the SpanContext for this Span. Note that the return // value of Context() is still valid after a call to Finish(). This is // called the span context and it is different from Go's context. -func (s *span) Context() ddtrace.SpanContext { return s.context } +func (s *Span) Context() *SpanContext { + if s == nil { + return nil + } + return s.context +} // SetBaggageItem sets a key/value pair as baggage on the span. Baggage items // are propagated down to descendant spans and injected cross-process. Use with // care as it adds extra load onto your tracing layer. -func (s *span) SetBaggageItem(key, val string) { +func (s *Span) SetBaggageItem(key, val string) { + if s == nil { + return + } s.context.setBaggageItem(key, val) } // BaggageItem gets the value for a baggage item given its key. Returns the // empty string if the value isn't found in this Span. -func (s *span) BaggageItem(key string) string { +func (s *Span) BaggageItem(key string) string { + if s == nil { + return "" + } return s.context.baggageItem(key) } // SetTag adds a set of key/value metadata to the span. -func (s *span) SetTag(key string, value interface{}) { +func (s *Span) SetTag(key string, value interface{}) { + if s == nil { + return + } // To avoid dumping the memory address in case value is a pointer, we dereference it. // Any pointer value that is a pointer to a pointer will be dumped as a string. value = dereference(value) - s.Lock() - defer s.Unlock() + s.mu.Lock() + defer s.mu.Unlock() + // We don't lock spans when flushing, so we could have a data race when // modifying a span as it's being flushed. This protects us against that // race, since spans are marked `finished` before we flush them. @@ -128,6 +198,16 @@ func (s *span) SetTag(key string, value interface{}) { noDebugStack: s.noDebugStack, }) return + case ext.ErrorNoStackTrace: + s.setTagError(value, errorConfig{ + noDebugStack: true, + }) + return + case ext.Component: + integration, ok := value.(string) + if ok { + s.integration = integration + } } if v, ok := value.(bool); ok { s.setTagBool(key, v) @@ -147,7 +227,7 @@ func (s *span) SetTag(key string, value interface{}) { s.setMeta(key, v) return } - if v, ok := toFloat64(value); ok { + if v, ok := sharedinternal.ToFloat64(value); ok { s.setMetric(key, v) return } @@ -168,6 +248,11 @@ func (s *span) SetTag(key string, value interface{}) { return } + if v, ok := value.([]byte); ok { + s.setMeta(key, string(v)) + return + } + if value != nil { // Arrays will be translated to dot notation. e.g. // {"myarr.0": "foo", "myarr.1": "bar"} @@ -178,7 +263,7 @@ func (s *span) SetTag(key string, value interface{}) { for i := 0; i < slice.Len(); i++ { key := fmt.Sprintf("%s.%d", key, i) v := slice.Index(i) - if num, ok := toFloat64(v.Interface()); ok { + if num, ok := sharedinternal.ToFloat64(v.Interface()); ok { s.setMetric(key, num) } else { s.setMeta(key, fmt.Sprintf("%v", v)) @@ -193,32 +278,44 @@ func (s *span) SetTag(key string, value interface{}) { s.setMetaStruct(key, v.Value) return } + + // Support for v1 shim meta struct values (only _dd.stack uses this) + if key == "_dd.stack" { + s.setMetaStruct(key, value) + return + } + + // Add this trace source tag to propagating tags and to span tags + // reserved for internal use only + if v, ok := value.(sharedinternal.TraceSourceTagValue); ok { + s.context.trace.setTraceSourcePropagatingTag(key, v.Value) + } } // not numeric, not a string, not a fmt.Stringer, not a bool, and not an error s.setMeta(key, fmt.Sprint(value)) } -// setSamplingPriority locks then span, then updates the sampling priority. +// setSamplingPriority locks the span, then updates the sampling priority. // It also updates the trace's sampling priority. -func (s *span) setSamplingPriority(priority int, sampler samplernames.SamplerName) { - s.Lock() - defer s.Unlock() +func (s *Span) setSamplingPriority(priority int, sampler samplernames.SamplerName) { + if s == nil { + return + } + s.mu.Lock() + defer s.mu.Unlock() s.setSamplingPriorityLocked(priority, sampler) } -// Root returns the root span of the span's trace. The return value shouldn't be -// nil as long as the root span is valid and not finished. -func (s *span) Root() Span { - return s.root() +func (s *Span) setProcessTags(pTags string) { + s.mu.Lock() + defer s.mu.Unlock() + s.setMeta(keyProcessTags, pTags) } // root returns the root span of the span's trace. The return value shouldn't be // nil as long as the root span is valid and not finished. -// As opposed to the public Root method, this one returns the actual span type -// when internal usage requires it (to avoid type assertions from Root's return -// value). -func (s *span) root() *span { +func (s *Span) Root() *Span { if s == nil || s.context == nil { return nil } @@ -233,17 +330,21 @@ func (s *span) root() *span { // bit of information gets monitored. In case of distributed traces, // the user id can be propagated across traces using the WithPropagation() option. // See https://docs.datadoghq.com/security_platform/application_security/setup_and_configure/?tab=set_user#add-user-information-to-traces -func (s *span) SetUser(id string, opts ...UserMonitoringOption) { +func (s *Span) SetUser(id string, opts ...UserMonitoringOption) { + if s == nil { + return + } cfg := UserMonitoringConfig{ Metadata: make(map[string]string), } for _, fn := range opts { fn(&cfg) } - root := s.root() + root := s.Root() trace := root.context.trace - root.Lock() - defer root.Unlock() + root.mu.Lock() + defer root.mu.Unlock() + // We don't lock spans when flushing, so we could have a data race when // modifying a span as it's being flushed. This protects us against that // race, since spans are marked `finished` before we flush them. @@ -252,7 +353,7 @@ func (s *span) SetUser(id string, opts ...UserMonitoringOption) { } if cfg.PropagateID { // Delete usr.id from the tags since _dd.p.usr.id takes precedence - delete(root.Meta, keyUserID) + delete(root.meta, keyUserID) idenc := base64.StdEncoding.EncodeToString([]byte(id)) trace.setPropagatingTag(keyPropagatedUserID, idenc) s.context.updated = true @@ -262,11 +363,12 @@ func (s *span) SetUser(id string, opts ...UserMonitoringOption) { trace.unsetPropagatingTag(keyPropagatedUserID) s.context.updated = true } - delete(root.Meta, keyPropagatedUserID) + delete(root.meta, keyPropagatedUserID) } usrData := map[string]string{ keyUserID: id, + keyUserLogin: cfg.Login, keyUserEmail: cfg.Email, keyUserName: cfg.Name, keyUserScope: cfg.Scope, @@ -284,9 +386,18 @@ func (s *span) SetUser(id string, opts ...UserMonitoringOption) { } } +// StartChild starts a new child span with the given operation name and options. +func (s *Span) StartChild(operationName string, opts ...StartSpanOption) *Span { + if s == nil { + return nil + } + opts = append(opts, ChildOf(s.Context())) + return getGlobalTracer().StartSpan(operationName, opts...) +} + // setSamplingPriorityLocked updates the sampling priority. // It also updates the trace's sampling priority. -func (s *span) setSamplingPriorityLocked(priority int, sampler samplernames.SamplerName) { +func (s *Span) setSamplingPriorityLocked(priority int, sampler samplernames.SamplerName) { // We don't lock spans when flushing, so we could have a data race when // modifying a span as it's being flushed. This protects us against that // race, since spans are marked `finished` before we flush them. @@ -297,24 +408,42 @@ func (s *span) setSamplingPriorityLocked(priority int, sampler samplernames.Samp s.context.setSamplingPriority(priority, sampler) } +// forceSetSamplingPriorityLocked updates the sampling priority. +// If the trace is locked, the sampling priority is forced to the given value. +// +// This function is should only be used when applying a manual keep or drop decision. +func (s *Span) forceSetSamplingPriorityLocked(priority int, sampler samplernames.SamplerName) { + // We don't lock spans when flushing, so we could have a data race when + // modifying a span as it's being flushed. This protects us against that + // race, since spans are marked `finished` before we flush them. + if s.finished { + return + } + s.setMetric(keySamplingPriority, float64(priority)) + s.context.forceSetSamplingPriority(priority, sampler) +} + // setTagError sets the error tag. It accounts for various valid scenarios. // This method is not safe for concurrent use. -func (s *span) setTagError(value interface{}, cfg errorConfig) { +func (s *Span) setTagError(value interface{}, cfg errorConfig) { setError := func(yes bool) { if yes { - if s.Error == 0 { + if s.error == 0 { // new error - atomic.AddInt32(&s.context.errors, 1) + s.context.errors.Add(1) } - s.Error = 1 + s.error = 1 } else { - if s.Error > 0 { + if s.error > 0 { // flip from active to inactive - atomic.AddInt32(&s.context.errors, -1) + s.context.errors.Add(-1) } - s.Error = 0 + s.error = 0 } } + // We don't lock spans when flushing, so we could have a data race when + // modifying a span as it's being flushed. This protects us against that + // race, since spans are marked `finished` before we flush them. if s.finished { return } @@ -325,19 +454,27 @@ func (s *span) setTagError(value interface{}, cfg errorConfig) { case error: // if anyone sets an error value as the tag, be nice here // and provide all the benefits. + // TODO: once Error Tracking fix is resolved, update relevant tags here. See #4095 setError(true) s.setMeta(ext.ErrorMsg, v.Error()) s.setMeta(ext.ErrorType, reflect.TypeOf(v).String()) - if !cfg.noDebugStack { - s.setMeta(ext.ErrorStack, takeStacktrace(cfg.stackFrames, cfg.stackSkip)) + if cfg.noDebugStack { + return } - switch v.(type) { + switch err := v.(type) { case xerrors.Formatter: s.setMeta(ext.ErrorDetails, fmt.Sprintf("%+v", v)) case fmt.Formatter: // pkg/errors approach s.setMeta(ext.ErrorDetails, fmt.Sprintf("%+v", v)) + case *errortrace.TracerError: + // instrumentation/errortrace approach + s.setMeta(ext.ErrorStack, fmt.Sprintf("%+v", v)) + s.setMeta(ext.ErrorHandlingStack, err.Format()) + return } + stack := takeStacktrace(cfg.stackFrames, cfg.stackSkip) + s.setMeta(ext.ErrorStack, stack) case nil: // no error setError(false) @@ -354,6 +491,12 @@ const defaultStackLength = 32 // takeStacktrace takes a stack trace of maximum n entries, skipping the first skip entries. // If n is 0, up to 20 entries are retrieved. func takeStacktrace(n, skip uint) string { + telemetry.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:takeStacktrace"}).Submit(1) + now := time.Now() + defer func() { + dur := float64(time.Since(now)) + telemetry.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:takeStacktrace"}).Submit(dur) + }() if n == 0 { n = defaultStackLength } @@ -385,34 +528,34 @@ func takeStacktrace(n, skip uint) string { } // setMeta sets a string tag. This method is not safe for concurrent use. -func (s *span) setMeta(key, v string) { - if s.Meta == nil { - s.Meta = make(map[string]string, 1) +func (s *Span) setMeta(key, v string) { + if s.meta == nil { + s.meta = make(map[string]string, 1) } - delete(s.Metrics, key) + delete(s.metrics, key) switch key { case ext.SpanName: - s.Name = v + s.name = v case ext.ServiceName: - s.Service = v + s.service = v case ext.ResourceName: - s.Resource = v + s.resource = v case ext.SpanType: - s.Type = v + s.spanType = v default: - s.Meta[key] = v + s.meta[key] = v } } -func (s *span) setMetaStruct(key string, v any) { - if s.MetaStruct == nil { - s.MetaStruct = make(metaStructMap, 1) +func (s *Span) setMetaStruct(key string, v any) { + if s.metaStruct == nil { + s.metaStruct = make(metaStructMap, 1) } - s.MetaStruct[key] = v + s.metaStruct[key] = v } // setTagBool sets a boolean tag on the span. -func (s *span) setTagBool(key string, v bool) { +func (s *Span) setTagBool(key string, v bool) { switch key { case ext.AnalyticsEvent: if v { @@ -422,11 +565,11 @@ func (s *span) setTagBool(key string, v bool) { } case ext.ManualDrop: if v { - s.setSamplingPriorityLocked(ext.PriorityUserReject, samplernames.Manual) + s.forceSetSamplingPriorityLocked(ext.PriorityUserReject, samplernames.Manual) } case ext.ManualKeep: if v { - s.setSamplingPriorityLocked(ext.PriorityUserKeep, samplernames.Manual) + s.forceSetSamplingPriorityLocked(ext.PriorityUserKeep, samplernames.Manual) } default: if v { @@ -439,47 +582,109 @@ func (s *span) setTagBool(key string, v bool) { // setMetric sets a numeric tag, in our case called a metric. This method // is not safe for concurrent use. -func (s *span) setMetric(key string, v float64) { - if s.Metrics == nil { - s.Metrics = make(map[string]float64, 1) +func (s *Span) setMetric(key string, v float64) { + if s.metrics == nil { + s.metrics = make(map[string]float64, 1) } - delete(s.Meta, key) + delete(s.meta, key) switch key { case ext.ManualKeep: if v == float64(samplernames.AppSec) { s.setSamplingPriorityLocked(ext.PriorityUserKeep, samplernames.AppSec) } - case ext.SamplingPriority: - // ext.SamplingPriority is deprecated in favor of ext.ManualKeep and ext.ManualDrop. - // We have it here for backward compatibility. + case "_sampling_priority_v1shim": + // We have this for backward compatibility with the v1 shim. s.setSamplingPriorityLocked(int(v), samplernames.Manual) default: - s.Metrics[key] = v + s.metrics[key] = v } } +// AddLink appends the given link to the span's span links. +func (s *Span) AddLink(link SpanLink) { + if s == nil { + return + } + s.mu.Lock() + defer s.mu.Unlock() + + // We don't lock spans when flushing, so we could have a data race when + // modifying a span as it's being flushed. This protects us against that + // race, since spans are marked `finished` before we flush them. + if s.finished { + // already finished + return + } + s.spanLinks = append(s.spanLinks, link) +} + +// serializeSpanLinksInMeta saves span links as a JSON string under `Span[meta][_dd.span_links]`. +func (s *Span) serializeSpanLinksInMeta() { + if len(s.spanLinks) == 0 { + return + } + spanLinkBytes, err := json.Marshal(s.spanLinks) + if err != nil { + log.Debug("Unable to marshal span links. Not adding span links to span meta.") + return + } + if s.meta == nil { + s.meta = make(map[string]string) + } + s.meta["_dd.span_links"] = string(spanLinkBytes) +} + +// serializeSpanEvents sets the span events from the current span in the correct transport, depending on whether the +// agent supports the native method or not. +func (s *Span) serializeSpanEvents() { + if len(s.spanEvents) == 0 { + return + } + // if span events are natively supported by the agent, there's nothing to do + // as the events will be already included when the span is serialized. + if s.supportsEvents { + return + } + // otherwise, we need to serialize them as a string tag and remove them from the struct + // so they are not sent twice. + b, err := json.Marshal(s.spanEvents) + s.spanEvents = nil + if err != nil { + log.Debug("Unable to marshal span events; events dropped from span meta\n%s", err.Error()) + return + } + s.meta["events"] = string(b) +} + // Finish closes this Span (but not its children) providing the duration // of its part of the tracing session. -func (s *span) Finish(opts ...ddtrace.FinishOption) { +func (s *Span) Finish(opts ...FinishOption) { + if s == nil { + return + } + t := now() if len(opts) > 0 { - cfg := ddtrace.FinishConfig{ + cfg := FinishConfig{ NoDebugStack: s.noDebugStack, } for _, fn := range opts { + if fn == nil { + continue + } fn(&cfg) } if !cfg.FinishTime.IsZero() { t = cfg.FinishTime.UnixNano() } if cfg.Error != nil { - s.Lock() + s.mu.Lock() s.setTagError(cfg.Error, errorConfig{ noDebugStack: cfg.NoDebugStack, stackFrames: cfg.StackFrames, stackSkip: cfg.SkipStackFrames, }) - s.Unlock() + s.mu.Unlock() } } @@ -500,8 +705,8 @@ func (s *span) Finish(opts ...ddtrace.FinishOption) { s.SetTag("go_execution_traced", "partial") } - if s.root() == s { - if tr, ok := internal.GetGlobalTracer().(*tracer); ok && tr.rulesSampling.traces.enabled() { + if s.Root() == s { + if tr, ok := getGlobalTracer().(*tracer); ok && tr.rulesSampling.traces.enabled() { if !s.context.trace.isLocked() && s.context.trace.propagatingTag(keyDecisionMaker) != "-4" { tr.rulesSampling.SampleTrace(s) } @@ -513,9 +718,13 @@ func (s *span) Finish(opts ...ddtrace.FinishOption) { } // SetOperationName sets or changes the operation name. -func (s *span) SetOperationName(operationName string) { - s.Lock() - defer s.Unlock() +func (s *Span) SetOperationName(operationName string) { + if s == nil { + return + } + s.mu.Lock() + defer s.mu.Unlock() + // We don't lock spans when flushing, so we could have a data race when // modifying a span as it's being flushed. This protects us against that // race, since spans are marked `finished` before we flush them. @@ -523,12 +732,13 @@ func (s *span) SetOperationName(operationName string) { // already finished return } - s.Name = operationName + s.name = operationName } -func (s *span) finish(finishTime int64) { - s.Lock() - defer s.Unlock() +func (s *Span) finish(finishTime int64) { + s.mu.Lock() + defer s.mu.Unlock() + // We don't lock spans when flushing, so we could have a data race when // modifying a span as it's being flushed. This protects us against that // race, since spans are marked `finished` before we flush them. @@ -536,44 +746,35 @@ func (s *span) finish(finishTime int64) { // already finished return } - if s.Duration == 0 { - s.Duration = finishTime - s.Start + + s.serializeSpanLinksInMeta() + s.serializeSpanEvents() + + if s.duration == 0 { + s.duration = finishTime - s.start } - if s.Duration < 0 { - s.Duration = 0 + if s.duration < 0 { + s.duration = 0 } if s.taskEnd != nil { s.taskEnd() } keep := true - if t, ok := internal.GetGlobalTracer().(*tracer); ok { - if !t.config.enabled.current { + tracer, hasTracer := getGlobalTracer().(*tracer) + if hasTracer { + if !tracer.config.enabled.current { return } - // we have an active tracer - if t.config.canComputeStats() && shouldComputeStats(s) { - // the agent supports computed stats - select { - case t.stats.In <- newAggregableSpan(s, t.obfuscator): - // ok - default: - log.Error("Stats channel full, disregarding span.") - } - } - if t.config.canDropP0s() { + if tracer.config.canDropP0s() { // the agent supports dropping p0's in the client keep = shouldKeep(s) } - if t.config.debugAbandonedSpans { + if tracer.config.debugAbandonedSpans { // the tracer supports debugging abandoned spans - select { - case t.abandonedSpansDebugger.In <- newAbandonedSpanCandidate(s, true): - // ok - default: - log.Error("Abandoned spans channel full, disregarding span.") - } + tracer.submitAbandonedSpan(s, true) } + tracer.spansFinished.Inc(s.integration) } if keep { // a single kept span keeps the whole trace. @@ -581,11 +782,16 @@ func (s *span) finish(finishTime int64) { } if log.DebugEnabled() { // avoid allocating the ...interface{} argument if debug logging is disabled - log.Debug("Finished Span: %v, Operation: %s, Resource: %s, Tags: %v, %v", - s, s.Name, s.Resource, s.Meta, s.Metrics) + log.Debug("Finished Span: %v, Operation: %s, Resource: %s, Tags: %v, %v", //nolint:gocritic // Debug logging needs full span representation + s, s.name, s.resource, s.meta, s.metrics) } s.context.finish() + // compute stats after finishing the span. This ensures any normalization or tag propagation has been applied + if hasTracer { + tracer.submit(s) + } + if s.pprofCtxRestore != nil { // Restore the labels of the parent span so any CPU samples after this // point are attributed correctly. @@ -593,40 +799,6 @@ func (s *span) finish(finishTime int64) { } } -// newAggregableSpan creates a new summary for the span s, within an application -// version version. -func newAggregableSpan(s *span, obfuscator *obfuscate.Obfuscator) *aggregableSpan { - var statusCode uint32 - if sc, ok := s.Meta["http.status_code"]; ok && sc != "" { - if c, err := strconv.Atoi(sc); err == nil && c > 0 && c <= math.MaxInt32 { - statusCode = uint32(c) - } - } - var isTraceRoot trilean - if s.ParentID == 0 { - isTraceRoot = trileanTrue - } else { - isTraceRoot = trileanFalse - } - - key := aggregation{ - Name: s.Name, - Resource: obfuscatedResource(obfuscator, s.Type, s.Resource), - Service: s.Service, - Type: s.Type, - Synthetics: strings.HasPrefix(s.Meta[keyOrigin], "synthetics"), - StatusCode: statusCode, - IsTraceRoot: isTraceRoot, - } - return &aggregableSpan{ - key: key, - Start: s.Start, - Duration: s.Duration, - TopLevel: s.Metrics[keyTopLevel] == 1, - Error: s.Error, - } -} - // textNonParsable specifies the text that will be assigned to resources for which the resource // can not be parsed due to an obfuscation error. const textNonParsable = "Non-parsable SQL query" @@ -641,7 +813,7 @@ func obfuscatedResource(o *obfuscate.Obfuscator, typ, resource string) string { case "sql", "cassandra": oq, err := o.ObfuscateSQLString(resource) if err != nil { - log.Error("Error obfuscating stats group resource %q: %v", resource, err) + log.Error("Error obfuscating stats group resource %q: %v", resource, err.Error()) return textNonParsable } return oq.Query @@ -654,28 +826,28 @@ func obfuscatedResource(o *obfuscate.Obfuscator, typ, resource string) string { // shouldKeep reports whether the trace should be kept. // a single span being kept implies the whole trace being kept. -func shouldKeep(s *span) bool { +func shouldKeep(s *Span) bool { if p, ok := s.context.SamplingPriority(); ok && p > 0 { // positive sampling priorities stay return true } - if atomic.LoadInt32(&s.context.errors) > 0 { + if s.context.errors.Load() > 0 { // traces with any span containing an error get kept return true } - if v, ok := s.Metrics[ext.EventSampleRate]; ok { - return sampledByRate(s.TraceID, v) + if v, ok := s.metrics[ext.EventSampleRate]; ok { + return sampledByRate(s.traceID, v) } return false } // shouldComputeStats mentions whether this span needs to have stats computed for. // Warning: callers must guard! -func shouldComputeStats(s *span) bool { - if v, ok := s.Metrics[keyMeasured]; ok && v == 1 { +func shouldComputeStats(s *Span) bool { + if v, ok := s.metrics[keyMeasured]; ok && v == 1 { return true } - if v, ok := s.Metrics[keyTopLevel]; ok && v == 1 { + if v, ok := s.metrics[keyTopLevel]; ok && v == 1 { return true } return false @@ -683,34 +855,40 @@ func shouldComputeStats(s *span) bool { // String returns a human readable representation of the span. Not for // production, just debugging. -func (s *span) String() string { - s.RLock() - defer s.RUnlock() +func (s *Span) String() string { + if s == nil { + return "" + } + s.mu.RLock() + defer s.mu.RUnlock() lines := []string{ - fmt.Sprintf("Name: %s", s.Name), - fmt.Sprintf("Service: %s", s.Service), - fmt.Sprintf("Resource: %s", s.Resource), - fmt.Sprintf("TraceID: %d", s.TraceID), - fmt.Sprintf("TraceID128: %s", s.context.TraceID128()), - fmt.Sprintf("SpanID: %d", s.SpanID), - fmt.Sprintf("ParentID: %d", s.ParentID), - fmt.Sprintf("Start: %s", time.Unix(0, s.Start)), - fmt.Sprintf("Duration: %s", time.Duration(s.Duration)), - fmt.Sprintf("Error: %d", s.Error), - fmt.Sprintf("Type: %s", s.Type), + fmt.Sprintf("Name: %s", s.name), + fmt.Sprintf("Service: %s", s.service), + fmt.Sprintf("Resource: %s", s.resource), + fmt.Sprintf("TraceID: %d", s.traceID), + fmt.Sprintf("TraceID128: %s", s.context.TraceID()), + fmt.Sprintf("SpanID: %d", s.spanID), + fmt.Sprintf("ParentID: %d", s.parentID), + fmt.Sprintf("Start: %s", time.Unix(0, s.start)), + fmt.Sprintf("Duration: %s", time.Duration(s.duration)), + fmt.Sprintf("Error: %d", s.error), + fmt.Sprintf("Type: %s", s.spanType), "Tags:", } - for key, val := range s.Meta { + for key, val := range s.meta { lines = append(lines, fmt.Sprintf("\t%s:%s", key, val)) } - for key, val := range s.Metrics { + for key, val := range s.metrics { lines = append(lines, fmt.Sprintf("\t%s:%f", key, val)) } return strings.Join(lines, "\n") } // Format implements fmt.Formatter. -func (s *span) Format(f fmt.State, c rune) { +func (s *Span) Format(f fmt.State, c rune) { + if s == nil { + fmt.Fprintf(f, "") + } switch c { case 's': fmt.Fprint(f, s.String()) @@ -718,43 +896,99 @@ func (s *span) Format(f fmt.State, c rune) { if svc := globalconfig.ServiceName(); svc != "" { fmt.Fprintf(f, "dd.service=%s ", svc) } - if tr, ok := internal.GetGlobalTracer().(*tracer); ok { - if tr.config.env != "" { - fmt.Fprintf(f, "dd.env=%s ", tr.config.env) - } - if tr.config.version != "" { - fmt.Fprintf(f, "dd.version=%s ", tr.config.version) - } - } else { - if env := os.Getenv("DD_ENV"); env != "" { + if tr := getGlobalTracer(); tr != nil { + tc := tr.TracerConf() + if tc.EnvTag != "" { + fmt.Fprintf(f, "dd.env=%s ", tc.EnvTag) + } else if env := env.Get("DD_ENV"); env != "" { fmt.Fprintf(f, "dd.env=%s ", env) } - if v := os.Getenv("DD_VERSION"); v != "" { + if tc.VersionTag != "" { + fmt.Fprintf(f, "dd.version=%s ", tc.VersionTag) + } else if v := env.Get("DD_VERSION"); v != "" { fmt.Fprintf(f, "dd.version=%s ", v) } } var traceID string - if sharedinternal.BoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", false) && s.context.traceID.HasUpper() { - traceID = s.context.TraceID128() + if sharedinternal.BoolEnv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", true) && s.context.traceID.HasUpper() { + traceID = s.context.TraceID() } else { - traceID = fmt.Sprintf("%d", s.TraceID) + traceID = fmt.Sprintf("%d", s.traceID) } fmt.Fprintf(f, `dd.trace_id=%q `, traceID) - fmt.Fprintf(f, `dd.span_id="%d" `, s.SpanID) - fmt.Fprintf(f, `dd.parent_id="%d"`, s.ParentID) + fmt.Fprintf(f, `dd.span_id="%d" `, s.spanID) + fmt.Fprintf(f, `dd.parent_id="%d"`, s.parentID) default: - fmt.Fprintf(f, "%%!%c(ddtrace.Span=%v)", c, s) + fmt.Fprintf(f, "%%!%c(tracer.Span=%v)", c, s) + } +} + +// AddEvent attaches a new event to the current span. +func (s *Span) AddEvent(name string, opts ...SpanEventOption) { + if s == nil { + return + } + s.mu.Lock() + defer s.mu.Unlock() + + // We don't lock spans when flushing, so we could have a data race when + // modifying a span as it's being flushed. This protects us against that + // race, since spans are marked `finished` before we flush them. + if s.finished { + return + } + cfg := SpanEventConfig{} + for _, opt := range opts { + opt(&cfg) + } + if cfg.Time.IsZero() { + cfg.Time = time.Now() + } + event := spanEvent{ + Name: name, + TimeUnixNano: uint64(cfg.Time.UnixNano()), + } + if s.supportsEvents { + event.Attributes = toSpanEventAttributeMsg(cfg.Attributes) + } else { + event.RawAttributes = cfg.Attributes + } + s.spanEvents = append(s.spanEvents, event) +} + +func setLLMObsPropagatingTags(ctx context.Context, spanCtx *SpanContext) { + llmSpan, ok := illmobs.ActiveLLMSpanFromContext(ctx) + if !ok { + return } + spanCtx.trace.setPropagatingTag(keyPropagatedLLMObsParentID, llmSpan.SpanID()) + spanCtx.trace.setPropagatingTag(keyPropagatedLLMObsTraceID, llmSpan.TraceID()) + spanCtx.trace.setPropagatingTag(keyPropagatedLLMObsMLAPP, llmSpan.MLApp()) +} + +// used in internal/civisibility/integrations/manual_api_common.go using linkname +func getMeta(s *Span, key string) (string, bool) { + s.mu.RLock() + defer s.mu.RUnlock() + val, ok := s.meta[key] + return val, ok +} + +// used in internal/civisibility/integrations/manual_api_common.go using linkname +func getMetric(s *Span, key string) (float64, bool) { + s.mu.RLock() + defer s.mu.RUnlock() + val, ok := s.metrics[key] + return val, ok } const ( keySamplingPriority = "_sampling_priority_v1" keySamplingPriorityRate = "_dd.agent_psr" keyDecisionMaker = "_dd.p.dm" - keyServiceHash = "_dd.dm.service_hash" keyOrigin = "_dd.origin" keyReparentID = "_dd.parent_id" - // keyHostname can be used to override the agent's hostname detection when using `WithHostname`. Not to be confused with keyTracerHostname + // keyHostname can be used to override the agent's hostname detection when using `WithHostname`. // which is set via auto-detection. keyHostname = "_dd.hostname" keyRulesSamplerAppliedRate = "_dd.rule_psr" @@ -774,8 +1008,9 @@ const ( keySingleSpanSamplingMPS = "_dd.span_sampling.max_per_second" // keyPropagatedUserID holds the propagated user identifier, if user id propagation is enabled. keyPropagatedUserID = "_dd.p.usr.id" - //keyTracerHostname holds the tracer detected hostname, only present when not connected over UDS to agent. - keyTracerHostname = "_dd.tracer_hostname" + // keyPropagatedTraceSource holds a 2 character hexadecimal string representation of the product responsible + // for the span creation. + keyPropagatedTraceSource = "_dd.p.ts" // keyTraceID128 is the lowercase, hex encoded upper 64 bits of a 128-bit trace id, if present. keyTraceID128 = "_dd.p.tid" // keySpanAttributeSchemaVersion holds the selected DD_TRACE_SPAN_ATTRIBUTE_SCHEMA version. @@ -786,11 +1021,23 @@ const ( keyPeerServiceRemappedFrom = "_dd.peer.service.remapped_from" // keyBaseService contains the globally configured tracer service name. It is only set for spans that override it. keyBaseService = "_dd.base_service" + // keyProcessTags contains a list of process tags to identify the service. + keyProcessTags = "_dd.tags.process" + // keyKnuthSamplingRate holds the propagated Knuth-based sampling rate applied by agent or trace sampling rules. + // Value is a string with up to 6 decimal digits and is forwarded unchanged. + keyKnuthSamplingRate = "_dd.p.ksr" + // keyPropagatedLLMObsParentID contains the propagated llmobs span ID. + keyPropagatedLLMObsParentID = "_dd.p.llmobs_parent_id" + // keyPropagatedLLMObsMLAPP contains the propagated ML App. + keyPropagatedLLMObsMLAPP = "_dd.p.llmobs_ml_app" + // keyPropagatedLLMObsTraceID contains the propagated llmobs trace ID. + keyPropagatedLLMObsTraceID = "_dd.p.llmobs_trace_id" ) // The following set of tags is used for user monitoring and set through calls to span.SetUser(). const ( keyUserID = "usr.id" + keyUserLogin = "usr.login" keyUserEmail = "usr.email" keyUserName = "usr.name" keyUserRole = "usr.role" diff --git a/ddtrace/tracer/span_config.go b/ddtrace/tracer/span_config.go new file mode 100644 index 0000000000..bd87f6bb99 --- /dev/null +++ b/ddtrace/tracer/span_config.go @@ -0,0 +1,143 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +import ( + "context" + "time" +) + +// StartSpanOption is a configuration option that can be used with a Tracer's StartSpan method. +type StartSpanOption func(cfg *StartSpanConfig) + +// StartSpanConfig holds the configuration for starting a new span. It is usually passed +// around by reference to one or more StartSpanOption functions which shape it into its +// final form. +type StartSpanConfig struct { + // Parent holds the SpanContext that should be used as a parent for the + // new span. If nil, implementations should return a root span. + Parent *SpanContext + + // StartTime holds the time that should be used as the start time of the span. + // Implementations should use the current time when StartTime.IsZero(). + StartTime time.Time + + // Tags holds a set of key/value pairs that should be set as metadata on the + // new span. + Tags map[string]interface{} + + // SpanID will be the SpanID of the Span, overriding the random number that would + // be generated. If no Parent SpanContext is present, then this will also set the + // TraceID to the same value. + SpanID uint64 + + // Context is the parent context where the span should be stored. + Context context.Context + + // SpanLink represents a causal relationship between two spans. A span can have multiple links. + SpanLinks []SpanLink +} + +// NewStartSpanConfig allows to build a base config struct. It accepts the same options as StartSpan. +// It's useful to reduce the number of operations in any hot path and update it for request/operation specifics. +func NewStartSpanConfig(opts ...StartSpanOption) *StartSpanConfig { + cfg := new(StartSpanConfig) + for _, fn := range opts { + fn(cfg) + } + return cfg +} + +// FinishOption is a configuration option that can be used with a Span's Finish method. +type FinishOption func(cfg *FinishConfig) + +// FinishConfig holds the configuration for finishing a span. It is usually passed around by +// reference to one or more FinishOption functions which shape it into its final form. +type FinishConfig struct { + // FinishTime represents the time that should be set as finishing time for the + // span. Implementations should use the current time when FinishTime.IsZero(). + FinishTime time.Time + + // Error holds an optional error that should be set on the span before + // finishing. + Error error + + // NoDebugStack will prevent any set errors from generating an attached stack trace tag. + NoDebugStack bool + + // StackFrames specifies the number of stack frames to be attached in spans that finish with errors. + StackFrames uint + + // SkipStackFrames specifies the offset at which to start reporting stack frames from the stack. + SkipStackFrames uint +} + +// NewFinishConfig allows building a base finish config struct. It accepts the same options as Finish. +// It's useful to reduce the number of operations in any hot path and update it for request/operation specifics. +func NewFinishConfig(opts ...FinishOption) *FinishConfig { + cfg := new(FinishConfig) + for _, fn := range opts { + fn(cfg) + } + return cfg +} + +// FinishTime sets the given time as the finishing time for the span. By default, +// the current time is used. +func FinishTime(t time.Time) FinishOption { + return func(cfg *FinishConfig) { + cfg.FinishTime = t + } +} + +// WithError marks the span as having had an error. It uses the information from +// err to set tags such as the error message, error type and stack trace. It has +// no effect if the error is nil. +func WithError(err error) FinishOption { + return func(cfg *FinishConfig) { + cfg.Error = err + } +} + +// NoDebugStack prevents any error presented using the WithError finishing option +// from generating a stack trace. This is useful in situations where errors are frequent +// and performance is critical. +func NoDebugStack() FinishOption { + return func(cfg *FinishConfig) { + cfg.NoDebugStack = true + } +} + +// StackFrames limits the number of stack frames included into erroneous spans to n, starting from skip. +func StackFrames(n, skip uint) FinishOption { + if n == 0 { + return NoDebugStack() + } + return func(cfg *FinishConfig) { + cfg.StackFrames = n + cfg.SkipStackFrames = skip + } +} + +// WithFinishConfig merges the given FinishConfig into the one used to finish the span. +// It is useful when you want to set a common base finish config, reducing the number of function calls in hot loops. +func WithFinishConfig(cfg *FinishConfig) FinishOption { + return func(fc *FinishConfig) { + fc.Error = cfg.Error + if fc.FinishTime.IsZero() { + fc.FinishTime = cfg.FinishTime + } + if !fc.NoDebugStack { + fc.NoDebugStack = cfg.NoDebugStack + } + if fc.SkipStackFrames == 0 { + fc.SkipStackFrames = cfg.SkipStackFrames + } + if fc.StackFrames == 0 { + fc.StackFrames = cfg.StackFrames + } + } +} diff --git a/ddtrace/tracer/span_event.go b/ddtrace/tracer/span_event.go new file mode 100644 index 0000000000..71ce7fd104 --- /dev/null +++ b/ddtrace/tracer/span_event.go @@ -0,0 +1,243 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import ( + "golang.org/x/exp/constraints" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +//go:generate go run github.com/tinylib/msgp -unexported -marshal=false -o=span_event_msgp.go -tests=false + +// SpanEvent represent an event at an instant in time related to this span, but not necessarily during the span. +type spanEvent struct { + // Name is the name of event. + Name string `msg:"name" json:"name"` + + // TimeUnixNano is the number of nanoseconds between the Unix epoch and this event. + TimeUnixNano uint64 `msg:"time_unix_nano" json:"time_unix_nano"` + + // Attributes is a map of string to attribute. + Attributes map[string]*spanEventAttribute `msg:"attributes" json:"-"` + + // RawAttributes is used when native span event serialization is not supported by the agent. + RawAttributes map[string]any `msg:"-" json:"attributes,omitempty"` +} + +type spanEventAttribute struct { + Type spanEventAttributeType `msg:"type" json:"type"` + StringValue string `msg:"string_value,omitempty"` + BoolValue bool `msg:"bool_value,omitempty" ` + IntValue int64 `msg:"int_value,omitempty" ` + DoubleValue float64 `msg:"double_value,omitempty"` + ArrayValue *spanEventArrayAttribute `msg:"array_value,omitempty"` +} + +type spanEventAttributeType int32 + +const ( + spanEventAttributeTypeString spanEventAttributeType = 0 + spanEventAttributeTypeBool spanEventAttributeType = 1 + spanEventAttributeTypeInt spanEventAttributeType = 2 + spanEventAttributeTypeDouble spanEventAttributeType = 3 + spanEventAttributeTypeArray spanEventAttributeType = 4 +) + +type spanEventArrayAttribute struct { + Values []*spanEventArrayAttributeValue `msg:"values" json:"values"` +} + +type spanEventArrayAttributeValue struct { + Type spanEventArrayAttributeValueType `msg:"type"` + StringValue string `msg:"string_value,omitempty"` + BoolValue bool `msg:"bool_value,omitempty"` + IntValue int64 `msg:"int_value,omitempty"` + DoubleValue float64 `msg:"double_value,omitempty"` +} + +type spanEventArrayAttributeValueType int32 + +const ( + spanEventArrayAttributeValueTypeString spanEventArrayAttributeValueType = 0 + spanEventArrayAttributeValueTypeBool spanEventArrayAttributeValueType = 1 + spanEventArrayAttributeValueTypeInt spanEventArrayAttributeValueType = 2 + spanEventArrayAttributeValueTypeDouble spanEventArrayAttributeValueType = 3 +) + +func toSpanEventAttributeMsg(attrs map[string]any) map[string]*spanEventAttribute { + if attrs == nil { + return nil + } + res := make(map[string]*spanEventAttribute, len(attrs)) + for key, val := range attrs { + if msgVal := toSpanEventAttributeValueMsg(val); msgVal != nil { + res[key] = msgVal + } else { + log.Warn("dropped unsupported span event attribute %s (unsupported type: %T)", key, val) + } + } + return res +} + +func toSpanEventAttributeValueMsg(v any) *spanEventAttribute { + switch v := v.(type) { + // string + case string: + return &spanEventAttribute{ + Type: spanEventAttributeTypeString, + StringValue: v, + } + // bool + case bool: + return &spanEventAttribute{ + Type: spanEventAttributeTypeBool, + BoolValue: v, + } + // int types + case int: + return intValue(v) + case uint: + return intValue(v) + case int64: + return intValue(v) + case uint64: + return intValue(v) + case uint8: + return intValue(v) + case uint16: + return intValue(v) + case uint32: + return intValue(v) + case uintptr: + return intValue(v) + case int8: + return intValue(v) + case int16: + return intValue(v) + case int32: + return intValue(v) + // float types + case float64: + return floatValue(v) + case float32: + return floatValue(v) + // string slice + case []string: + return stringSliceValue(v) + // bool slice + case []bool: + return boolSliceValue(v) + // int slice + case []int: + return intSliceValue(v) + case []uint: + return intSliceValue(v) + case []int64: + return intSliceValue(v) + case []uint64: + return intSliceValue(v) + case []uint8: + return intSliceValue(v) + case []uint16: + return intSliceValue(v) + case []uint32: + return intSliceValue(v) + case []uintptr: + return intSliceValue(v) + case []int8: + return intSliceValue(v) + case []int16: + return intSliceValue(v) + case []int32: + return intSliceValue(v) + // float slice + case []float64: + return floatSliceValue(v) + case []float32: + return floatSliceValue(v) + default: + return nil + } +} + +func intValue[T constraints.Integer](v T) *spanEventAttribute { + return &spanEventAttribute{ + Type: spanEventAttributeTypeInt, + IntValue: int64(v), + } +} + +func floatValue[T constraints.Float](v T) *spanEventAttribute { + return &spanEventAttribute{ + Type: spanEventAttributeTypeDouble, + DoubleValue: float64(v), + } +} + +func stringSliceValue(values []string) *spanEventAttribute { + arrayVal := make([]*spanEventArrayAttributeValue, 0, len(values)) + for _, v := range values { + arrayVal = append(arrayVal, &spanEventArrayAttributeValue{ + Type: spanEventArrayAttributeValueTypeString, + StringValue: v, + }) + } + return &spanEventAttribute{ + Type: spanEventAttributeTypeArray, + ArrayValue: &spanEventArrayAttribute{ + Values: arrayVal, + }, + } +} + +func boolSliceValue(values []bool) *spanEventAttribute { + arrayVal := make([]*spanEventArrayAttributeValue, 0, len(values)) + for _, v := range values { + arrayVal = append(arrayVal, &spanEventArrayAttributeValue{ + Type: spanEventArrayAttributeValueTypeBool, + BoolValue: v, + }) + } + return &spanEventAttribute{ + Type: spanEventAttributeTypeArray, + ArrayValue: &spanEventArrayAttribute{ + Values: arrayVal, + }, + } +} + +func intSliceValue[T constraints.Integer](values []T) *spanEventAttribute { + arrayVal := make([]*spanEventArrayAttributeValue, 0, len(values)) + for _, v := range values { + arrayVal = append(arrayVal, &spanEventArrayAttributeValue{ + Type: spanEventArrayAttributeValueTypeInt, + IntValue: int64(v), + }) + } + return &spanEventAttribute{ + Type: spanEventAttributeTypeArray, + ArrayValue: &spanEventArrayAttribute{ + Values: arrayVal, + }, + } +} + +func floatSliceValue[T constraints.Float](values []T) *spanEventAttribute { + arrayVal := make([]*spanEventArrayAttributeValue, 0, len(values)) + for _, v := range values { + arrayVal = append(arrayVal, &spanEventArrayAttributeValue{ + Type: spanEventArrayAttributeValueTypeDouble, + DoubleValue: float64(v), + }) + } + return &spanEventAttribute{ + Type: spanEventAttributeTypeArray, + ArrayValue: &spanEventArrayAttribute{ + Values: arrayVal, + }, + } +} diff --git a/ddtrace/tracer/span_event_config.go b/ddtrace/tracer/span_event_config.go new file mode 100644 index 0000000000..e30404d700 --- /dev/null +++ b/ddtrace/tracer/span_event_config.go @@ -0,0 +1,36 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import "time" + +// SpanEventConfig represent the configuration of a span event. +type SpanEventConfig struct { + // Time is the time when the event happened. + Time time.Time + + // Attributes is a map of string to attribute. + // Only the following types are supported: + // string, integer (any), boolean, float (any), []string, []integer (any), []boolean, []float (any) + Attributes map[string]any +} + +// SpanEventOption can be used to customize an event created with NewSpanEvent. +type SpanEventOption func(cfg *SpanEventConfig) + +// WithSpanEventTimestamp sets the time when the span event occurred. +func WithSpanEventTimestamp(tStamp time.Time) SpanEventOption { + return func(cfg *SpanEventConfig) { + cfg.Time = tStamp + } +} + +// WithSpanEventAttributes sets the given attributes for the span event. +func WithSpanEventAttributes(attributes map[string]any) SpanEventOption { + return func(cfg *SpanEventConfig) { + cfg.Attributes = attributes + } +} diff --git a/ddtrace/tracer/span_event_msgp.go b/ddtrace/tracer/span_event_msgp.go new file mode 100644 index 0000000000..b6d2b962b1 --- /dev/null +++ b/ddtrace/tracer/span_event_msgp.go @@ -0,0 +1,766 @@ +// Code generated by github.com/tinylib/msgp DO NOT EDIT. + +package tracer + +import ( + "github.com/tinylib/msgp/msgp" +) + +// DecodeMsg implements msgp.Decodable +func (z *spanEvent) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "name": + z.Name, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "Name") + return + } + case "time_unix_nano": + z.TimeUnixNano, err = dc.ReadUint64() + if err != nil { + err = msgp.WrapError(err, "TimeUnixNano") + return + } + case "attributes": + var zb0002 uint32 + zb0002, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err, "Attributes") + return + } + if z.Attributes == nil { + z.Attributes = make(map[string]*spanEventAttribute, zb0002) + } else if len(z.Attributes) > 0 { + clear(z.Attributes) + } + for zb0002 > 0 { + zb0002-- + var za0001 string + za0001, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "Attributes") + return + } + var za0002 *spanEventAttribute + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, "Attributes", za0001) + return + } + za0002 = nil + } else { + if za0002 == nil { + za0002 = new(spanEventAttribute) + } + err = za0002.DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, "Attributes", za0001) + return + } + } + z.Attributes[za0001] = za0002 + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *spanEvent) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 3 + // write "name" + err = en.Append(0x83, 0xa4, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Name) + if err != nil { + err = msgp.WrapError(err, "Name") + return + } + // write "time_unix_nano" + err = en.Append(0xae, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x6e, 0x61, 0x6e, 0x6f) + if err != nil { + return + } + err = en.WriteUint64(z.TimeUnixNano) + if err != nil { + err = msgp.WrapError(err, "TimeUnixNano") + return + } + // write "attributes" + err = en.Append(0xaa, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73) + if err != nil { + return + } + err = en.WriteMapHeader(uint32(len(z.Attributes))) + if err != nil { + err = msgp.WrapError(err, "Attributes") + return + } + for za0001, za0002 := range z.Attributes { + err = en.WriteString(za0001) + if err != nil { + err = msgp.WrapError(err, "Attributes") + return + } + if za0002 == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + err = za0002.EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "Attributes", za0001) + return + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *spanEvent) Msgsize() (s int) { + s = 1 + 5 + msgp.StringPrefixSize + len(z.Name) + 15 + msgp.Uint64Size + 11 + msgp.MapHeaderSize + if z.Attributes != nil { + for za0001, za0002 := range z.Attributes { + _ = za0002 + s += msgp.StringPrefixSize + len(za0001) + if za0002 == nil { + s += msgp.NilSize + } else { + s += za0002.Msgsize() + } + } + } + return +} + +// DecodeMsg implements msgp.Decodable +func (z *spanEventArrayAttribute) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "values": + var zb0002 uint32 + zb0002, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err, "Values") + return + } + if cap(z.Values) >= int(zb0002) { + z.Values = (z.Values)[:zb0002] + } else { + z.Values = make([]*spanEventArrayAttributeValue, zb0002) + } + for za0001 := range z.Values { + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, "Values", za0001) + return + } + z.Values[za0001] = nil + } else { + if z.Values[za0001] == nil { + z.Values[za0001] = new(spanEventArrayAttributeValue) + } + err = z.Values[za0001].DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, "Values", za0001) + return + } + } + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *spanEventArrayAttribute) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 1 + // write "values" + err = en.Append(0x81, 0xa6, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73) + if err != nil { + return + } + err = en.WriteArrayHeader(uint32(len(z.Values))) + if err != nil { + err = msgp.WrapError(err, "Values") + return + } + for za0001 := range z.Values { + if z.Values[za0001] == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + err = z.Values[za0001].EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "Values", za0001) + return + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *spanEventArrayAttribute) Msgsize() (s int) { + s = 1 + 7 + msgp.ArrayHeaderSize + for za0001 := range z.Values { + if z.Values[za0001] == nil { + s += msgp.NilSize + } else { + s += z.Values[za0001].Msgsize() + } + } + return +} + +// DecodeMsg implements msgp.Decodable +func (z *spanEventArrayAttributeValue) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "type": + { + var zb0002 int32 + zb0002, err = dc.ReadInt32() + if err != nil { + err = msgp.WrapError(err, "Type") + return + } + z.Type = spanEventArrayAttributeValueType(zb0002) + } + case "string_value": + z.StringValue, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "StringValue") + return + } + case "bool_value": + z.BoolValue, err = dc.ReadBool() + if err != nil { + err = msgp.WrapError(err, "BoolValue") + return + } + case "int_value": + z.IntValue, err = dc.ReadInt64() + if err != nil { + err = msgp.WrapError(err, "IntValue") + return + } + case "double_value": + z.DoubleValue, err = dc.ReadFloat64() + if err != nil { + err = msgp.WrapError(err, "DoubleValue") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *spanEventArrayAttributeValue) EncodeMsg(en *msgp.Writer) (err error) { + // check for omitted fields + zb0001Len := uint32(5) + var zb0001Mask uint8 /* 5 bits */ + _ = zb0001Mask + if z.StringValue == "" { + zb0001Len-- + zb0001Mask |= 0x2 + } + if z.BoolValue == false { + zb0001Len-- + zb0001Mask |= 0x4 + } + if z.IntValue == 0 { + zb0001Len-- + zb0001Mask |= 0x8 + } + if z.DoubleValue == 0 { + zb0001Len-- + zb0001Mask |= 0x10 + } + // variable map header, size zb0001Len + err = en.Append(0x80 | uint8(zb0001Len)) + if err != nil { + return + } + + // skip if no fields are to be emitted + if zb0001Len != 0 { + // write "type" + err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) + if err != nil { + return + } + err = en.WriteInt32(int32(z.Type)) + if err != nil { + err = msgp.WrapError(err, "Type") + return + } + if (zb0001Mask & 0x2) == 0 { // if not omitted + // write "string_value" + err = en.Append(0xac, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteString(z.StringValue) + if err != nil { + err = msgp.WrapError(err, "StringValue") + return + } + } + if (zb0001Mask & 0x4) == 0 { // if not omitted + // write "bool_value" + err = en.Append(0xaa, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteBool(z.BoolValue) + if err != nil { + err = msgp.WrapError(err, "BoolValue") + return + } + } + if (zb0001Mask & 0x8) == 0 { // if not omitted + // write "int_value" + err = en.Append(0xa9, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteInt64(z.IntValue) + if err != nil { + err = msgp.WrapError(err, "IntValue") + return + } + } + if (zb0001Mask & 0x10) == 0 { // if not omitted + // write "double_value" + err = en.Append(0xac, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteFloat64(z.DoubleValue) + if err != nil { + err = msgp.WrapError(err, "DoubleValue") + return + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *spanEventArrayAttributeValue) Msgsize() (s int) { + s = 1 + 5 + msgp.Int32Size + 13 + msgp.StringPrefixSize + len(z.StringValue) + 11 + msgp.BoolSize + 10 + msgp.Int64Size + 13 + msgp.Float64Size + return +} + +// DecodeMsg implements msgp.Decodable +func (z *spanEventArrayAttributeValueType) DecodeMsg(dc *msgp.Reader) (err error) { + { + var zb0001 int32 + zb0001, err = dc.ReadInt32() + if err != nil { + err = msgp.WrapError(err) + return + } + (*z) = spanEventArrayAttributeValueType(zb0001) + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z spanEventArrayAttributeValueType) EncodeMsg(en *msgp.Writer) (err error) { + err = en.WriteInt32(int32(z)) + if err != nil { + err = msgp.WrapError(err) + return + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z spanEventArrayAttributeValueType) Msgsize() (s int) { + s = msgp.Int32Size + return +} + +// DecodeMsg implements msgp.Decodable +func (z *spanEventAttribute) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "type": + { + var zb0002 int32 + zb0002, err = dc.ReadInt32() + if err != nil { + err = msgp.WrapError(err, "Type") + return + } + z.Type = spanEventAttributeType(zb0002) + } + case "string_value": + z.StringValue, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "StringValue") + return + } + case "bool_value": + z.BoolValue, err = dc.ReadBool() + if err != nil { + err = msgp.WrapError(err, "BoolValue") + return + } + case "int_value": + z.IntValue, err = dc.ReadInt64() + if err != nil { + err = msgp.WrapError(err, "IntValue") + return + } + case "double_value": + z.DoubleValue, err = dc.ReadFloat64() + if err != nil { + err = msgp.WrapError(err, "DoubleValue") + return + } + case "array_value": + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, "ArrayValue") + return + } + z.ArrayValue = nil + } else { + if z.ArrayValue == nil { + z.ArrayValue = new(spanEventArrayAttribute) + } + var zb0003 uint32 + zb0003, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err, "ArrayValue") + return + } + for zb0003 > 0 { + zb0003-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err, "ArrayValue") + return + } + switch msgp.UnsafeString(field) { + case "values": + var zb0004 uint32 + zb0004, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err, "ArrayValue", "Values") + return + } + if cap(z.ArrayValue.Values) >= int(zb0004) { + z.ArrayValue.Values = (z.ArrayValue.Values)[:zb0004] + } else { + z.ArrayValue.Values = make([]*spanEventArrayAttributeValue, zb0004) + } + for za0001 := range z.ArrayValue.Values { + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, "ArrayValue", "Values", za0001) + return + } + z.ArrayValue.Values[za0001] = nil + } else { + if z.ArrayValue.Values[za0001] == nil { + z.ArrayValue.Values[za0001] = new(spanEventArrayAttributeValue) + } + err = z.ArrayValue.Values[za0001].DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, "ArrayValue", "Values", za0001) + return + } + } + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err, "ArrayValue") + return + } + } + } + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *spanEventAttribute) EncodeMsg(en *msgp.Writer) (err error) { + // check for omitted fields + zb0001Len := uint32(6) + var zb0001Mask uint8 /* 6 bits */ + _ = zb0001Mask + if z.StringValue == "" { + zb0001Len-- + zb0001Mask |= 0x2 + } + if z.BoolValue == false { + zb0001Len-- + zb0001Mask |= 0x4 + } + if z.IntValue == 0 { + zb0001Len-- + zb0001Mask |= 0x8 + } + if z.DoubleValue == 0 { + zb0001Len-- + zb0001Mask |= 0x10 + } + if z.ArrayValue == nil { + zb0001Len-- + zb0001Mask |= 0x20 + } + // variable map header, size zb0001Len + err = en.Append(0x80 | uint8(zb0001Len)) + if err != nil { + return + } + + // skip if no fields are to be emitted + if zb0001Len != 0 { + // write "type" + err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) + if err != nil { + return + } + err = en.WriteInt32(int32(z.Type)) + if err != nil { + err = msgp.WrapError(err, "Type") + return + } + if (zb0001Mask & 0x2) == 0 { // if not omitted + // write "string_value" + err = en.Append(0xac, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteString(z.StringValue) + if err != nil { + err = msgp.WrapError(err, "StringValue") + return + } + } + if (zb0001Mask & 0x4) == 0 { // if not omitted + // write "bool_value" + err = en.Append(0xaa, 0x62, 0x6f, 0x6f, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteBool(z.BoolValue) + if err != nil { + err = msgp.WrapError(err, "BoolValue") + return + } + } + if (zb0001Mask & 0x8) == 0 { // if not omitted + // write "int_value" + err = en.Append(0xa9, 0x69, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteInt64(z.IntValue) + if err != nil { + err = msgp.WrapError(err, "IntValue") + return + } + } + if (zb0001Mask & 0x10) == 0 { // if not omitted + // write "double_value" + err = en.Append(0xac, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + err = en.WriteFloat64(z.DoubleValue) + if err != nil { + err = msgp.WrapError(err, "DoubleValue") + return + } + } + if (zb0001Mask & 0x20) == 0 { // if not omitted + // write "array_value" + err = en.Append(0xab, 0x61, 0x72, 0x72, 0x61, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65) + if err != nil { + return + } + if z.ArrayValue == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + // map header, size 1 + // write "values" + err = en.Append(0x81, 0xa6, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73) + if err != nil { + return + } + err = en.WriteArrayHeader(uint32(len(z.ArrayValue.Values))) + if err != nil { + err = msgp.WrapError(err, "ArrayValue", "Values") + return + } + for za0001 := range z.ArrayValue.Values { + if z.ArrayValue.Values[za0001] == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + err = z.ArrayValue.Values[za0001].EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "ArrayValue", "Values", za0001) + return + } + } + } + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *spanEventAttribute) Msgsize() (s int) { + s = 1 + 5 + msgp.Int32Size + 13 + msgp.StringPrefixSize + len(z.StringValue) + 11 + msgp.BoolSize + 10 + msgp.Int64Size + 13 + msgp.Float64Size + 12 + if z.ArrayValue == nil { + s += msgp.NilSize + } else { + s += 1 + 7 + msgp.ArrayHeaderSize + for za0001 := range z.ArrayValue.Values { + if z.ArrayValue.Values[za0001] == nil { + s += msgp.NilSize + } else { + s += z.ArrayValue.Values[za0001].Msgsize() + } + } + } + return +} + +// DecodeMsg implements msgp.Decodable +func (z *spanEventAttributeType) DecodeMsg(dc *msgp.Reader) (err error) { + { + var zb0001 int32 + zb0001, err = dc.ReadInt32() + if err != nil { + err = msgp.WrapError(err) + return + } + (*z) = spanEventAttributeType(zb0001) + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z spanEventAttributeType) EncodeMsg(en *msgp.Writer) (err error) { + err = en.WriteInt32(int32(z)) + if err != nil { + err = msgp.WrapError(err) + return + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z spanEventAttributeType) Msgsize() (s int) { + s = msgp.Int32Size + return +} diff --git a/ddtrace/tracer/span_event_test.go b/ddtrace/tracer/span_event_test.go new file mode 100644 index 0000000000..c3c8d0ad9c --- /dev/null +++ b/ddtrace/tracer/span_event_test.go @@ -0,0 +1,165 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package tracer + +import ( + "encoding/json" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_spanAddEvent(t *testing.T) { + type customType struct { + Field1 string `json:"field_1"` + Field2 int `json:"field_2"` + } + attrs := map[string]any{ + "key1": "val1", + "key2": 123, + "key3": int64(123), + "key4": uintptr(123), + "key5": []int64{1, 2, 3}, + "key6": []uintptr{1, 2, 3}, + "key7": []bool{true, false, true}, + "key8": []string{"1", "2", "3"}, + "key9": []float64{1.1, 2.2, 3.3}, + "key10": float32(123), + // not supported + "key11": map[string]string{ + "hello": "world", + }, + "key12": customType{ + Field1: "field1", + Field2: 2, + }, + } + ts := time.Date(2025, 2, 12, 9, 0, 0, 0, time.UTC) + + wantAttrs := map[string]*spanEventAttribute{ + "key1": {Type: spanEventAttributeTypeString, StringValue: "val1"}, + "key2": {Type: spanEventAttributeTypeInt, IntValue: 123}, + "key3": {Type: spanEventAttributeTypeInt, IntValue: 123}, + "key4": {Type: spanEventAttributeTypeInt, IntValue: 123}, + "key5": {Type: spanEventAttributeTypeArray, ArrayValue: &spanEventArrayAttribute{ + Values: []*spanEventArrayAttributeValue{ + {Type: spanEventArrayAttributeValueTypeInt, IntValue: 1}, + {Type: spanEventArrayAttributeValueTypeInt, IntValue: 2}, + {Type: spanEventArrayAttributeValueTypeInt, IntValue: 3}, + }, + }}, + "key6": {Type: spanEventAttributeTypeArray, ArrayValue: &spanEventArrayAttribute{ + Values: []*spanEventArrayAttributeValue{ + {Type: spanEventArrayAttributeValueTypeInt, IntValue: 1}, + {Type: spanEventArrayAttributeValueTypeInt, IntValue: 2}, + {Type: spanEventArrayAttributeValueTypeInt, IntValue: 3}, + }, + }}, + "key7": {Type: spanEventAttributeTypeArray, ArrayValue: &spanEventArrayAttribute{ + Values: []*spanEventArrayAttributeValue{ + {Type: spanEventArrayAttributeValueTypeBool, BoolValue: true}, + {Type: spanEventArrayAttributeValueTypeBool, BoolValue: false}, + {Type: spanEventArrayAttributeValueTypeBool, BoolValue: true}, + }, + }}, + "key8": {Type: spanEventAttributeTypeArray, ArrayValue: &spanEventArrayAttribute{ + Values: []*spanEventArrayAttributeValue{ + {Type: spanEventArrayAttributeValueTypeString, StringValue: "1"}, + {Type: spanEventArrayAttributeValueTypeString, StringValue: "2"}, + {Type: spanEventArrayAttributeValueTypeString, StringValue: "3"}, + }, + }}, + "key9": {Type: spanEventAttributeTypeArray, ArrayValue: &spanEventArrayAttribute{ + Values: []*spanEventArrayAttributeValue{ + {Type: spanEventArrayAttributeValueTypeDouble, DoubleValue: 1.1}, + {Type: spanEventArrayAttributeValueTypeDouble, DoubleValue: 2.2}, + {Type: spanEventArrayAttributeValueTypeDouble, DoubleValue: 3.3}, + }, + }}, + "key10": {Type: spanEventAttributeTypeDouble, DoubleValue: 123}, + } + assertAttrsJSON := func(t *testing.T, attrs map[string]any) { + wantJSON := `{"key1":"val1","key10":123,"key11":{"hello":"world"},"key12":{"field_1":"field1","field_2":2},"key2":123,"key3":123,"key4":123,"key5":[1,2,3],"key6":[1,2,3],"key7":[true,false,true],"key8":["1","2","3"],"key9":[1.1,2.2,3.3]}` + b, err := json.Marshal(attrs) + require.NoError(t, err) + assert.Equal(t, wantJSON, string(b)) + } + + t.Run("nil span should be a noop", func(t *testing.T) { + var s *Span + + require.NotPanics(t, func() { + s.AddEvent("test-event-1", WithSpanEventTimestamp(ts), WithSpanEventAttributes(attrs)) + s.AddEvent("test-event-2", WithSpanEventAttributes(attrs)) + s.AddEvent("test-event-3") + }) + }) + + t.Run("with native events support", func(t *testing.T) { + s := newBasicSpan("test") + s.supportsEvents = true + s.AddEvent("test-event-1", WithSpanEventTimestamp(ts), WithSpanEventAttributes(attrs)) + s.AddEvent("test-event-2", WithSpanEventAttributes(attrs)) + s.AddEvent("test-event-3") + s.Finish() + + require.Len(t, s.spanEvents, 3) + evt := s.spanEvents[0] + assert.Equal(t, "test-event-1", evt.Name) + assert.EqualValues(t, ts.UnixNano(), evt.TimeUnixNano) + assert.Equal(t, wantAttrs, evt.Attributes) + assert.Nil(t, evt.RawAttributes) + + evt = s.spanEvents[1] + assert.Equal(t, "test-event-2", evt.Name) + assert.Greater(t, int64(evt.TimeUnixNano), ts.UnixNano()) + assert.Equal(t, wantAttrs, evt.Attributes) + assert.Nil(t, evt.RawAttributes) + + evt = s.spanEvents[2] + assert.Equal(t, "test-event-3", evt.Name) + assert.Greater(t, int64(evt.TimeUnixNano), ts.UnixNano()) + assert.Nil(t, evt.Attributes) + assert.Nil(t, evt.RawAttributes) + }) + + t.Run("without native events support", func(t *testing.T) { + s := newBasicSpan("test") + s.supportsEvents = false + s.AddEvent("test-event-1", WithSpanEventTimestamp(ts), WithSpanEventAttributes(attrs)) + s.AddEvent("test-event-2", WithSpanEventAttributes(attrs)) + s.AddEvent("test-event-3") + s.Finish() + + require.Empty(t, s.spanEvents) + assert.NotEmpty(t, s.meta["events"]) + + var spanEvents []spanEvent + err := json.Unmarshal([]byte(s.meta["events"]), &spanEvents) + require.NoError(t, err) + + require.Len(t, spanEvents, 3) + evt := spanEvents[0] + assert.Equal(t, "test-event-1", evt.Name) + assert.EqualValues(t, ts.UnixNano(), evt.TimeUnixNano) + assert.Nil(t, evt.Attributes) + assertAttrsJSON(t, evt.RawAttributes) + + evt = spanEvents[1] + assert.Equal(t, "test-event-2", evt.Name) + assert.Greater(t, int64(evt.TimeUnixNano), ts.UnixNano()) + assert.Nil(t, evt.Attributes) + assertAttrsJSON(t, evt.RawAttributes) + + evt = spanEvents[2] + assert.Equal(t, "test-event-3", evt.Name) + assert.Greater(t, int64(evt.TimeUnixNano), ts.UnixNano()) + assert.Nil(t, evt.Attributes) + assert.Nil(t, evt.RawAttributes) + }) +} diff --git a/ddtrace/span_link_msgp.go b/ddtrace/tracer/span_link_msgp.go similarity index 63% rename from ddtrace/span_link_msgp.go rename to ddtrace/tracer/span_link_msgp.go index c2b90ec516..00997b65e5 100644 --- a/ddtrace/span_link_msgp.go +++ b/ddtrace/tracer/span_link_msgp.go @@ -1,7 +1,7 @@ -package ddtrace - // Code generated by github.com/tinylib/msgp DO NOT EDIT. +package tracer + import ( "github.com/tinylib/msgp/msgp" ) @@ -52,19 +52,17 @@ func (z *SpanLink) DecodeMsg(dc *msgp.Reader) (err error) { if z.Attributes == nil { z.Attributes = make(map[string]string, zb0002) } else if len(z.Attributes) > 0 { - for key := range z.Attributes { - delete(z.Attributes, key) - } + clear(z.Attributes) } for zb0002 > 0 { zb0002-- var za0001 string - var za0002 string za0001, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Attributes") return } + var za0002 string za0002, err = dc.ReadString() if err != nil { err = msgp.WrapError(err, "Attributes", za0001) @@ -97,9 +95,10 @@ func (z *SpanLink) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *SpanLink) EncodeMsg(en *msgp.Writer) (err error) { - // omitempty: check for empty values + // check for omitted fields zb0001Len := uint32(6) var zb0001Mask uint8 /* 6 bits */ + _ = zb0001Mask if z.TraceIDHigh == 0 { zb0001Len-- zb0001Mask |= 0x2 @@ -121,87 +120,88 @@ func (z *SpanLink) EncodeMsg(en *msgp.Writer) (err error) { if err != nil { return } - if zb0001Len == 0 { - return - } - // write "trace_id" - err = en.Append(0xa8, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64) - if err != nil { - return - } - err = en.WriteUint64(z.TraceID) - if err != nil { - err = msgp.WrapError(err, "TraceID") - return - } - if (zb0001Mask & 0x2) == 0 { // if not empty - // write "trace_id_high" - err = en.Append(0xad, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68) - if err != nil { - return - } - err = en.WriteUint64(z.TraceIDHigh) - if err != nil { - err = msgp.WrapError(err, "TraceIDHigh") - return - } - } - // write "span_id" - err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) - if err != nil { - return - } - err = en.WriteUint64(z.SpanID) - if err != nil { - err = msgp.WrapError(err, "SpanID") - return - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // write "attributes" - err = en.Append(0xaa, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73) + + // skip if no fields are to be emitted + if zb0001Len != 0 { + // write "trace_id" + err = en.Append(0xa8, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64) if err != nil { return } - err = en.WriteMapHeader(uint32(len(z.Attributes))) + err = en.WriteUint64(z.TraceID) if err != nil { - err = msgp.WrapError(err, "Attributes") + err = msgp.WrapError(err, "TraceID") return } - for za0001, za0002 := range z.Attributes { - err = en.WriteString(za0001) + if (zb0001Mask & 0x2) == 0 { // if not omitted + // write "trace_id_high" + err = en.Append(0xad, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x5f, 0x68, 0x69, 0x67, 0x68) if err != nil { - err = msgp.WrapError(err, "Attributes") return } - err = en.WriteString(za0002) + err = en.WriteUint64(z.TraceIDHigh) if err != nil { - err = msgp.WrapError(err, "Attributes", za0001) + err = msgp.WrapError(err, "TraceIDHigh") return } } - } - if (zb0001Mask & 0x10) == 0 { // if not empty - // write "tracestate" - err = en.Append(0xaa, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x74, 0x61, 0x74, 0x65) + // write "span_id" + err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) if err != nil { return } - err = en.WriteString(z.Tracestate) + err = en.WriteUint64(z.SpanID) if err != nil { - err = msgp.WrapError(err, "Tracestate") + err = msgp.WrapError(err, "SpanID") return } - } - if (zb0001Mask & 0x20) == 0 { // if not empty - // write "flags" - err = en.Append(0xa5, 0x66, 0x6c, 0x61, 0x67, 0x73) - if err != nil { - return + if (zb0001Mask & 0x8) == 0 { // if not omitted + // write "attributes" + err = en.Append(0xaa, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73) + if err != nil { + return + } + err = en.WriteMapHeader(uint32(len(z.Attributes))) + if err != nil { + err = msgp.WrapError(err, "Attributes") + return + } + for za0001, za0002 := range z.Attributes { + err = en.WriteString(za0001) + if err != nil { + err = msgp.WrapError(err, "Attributes") + return + } + err = en.WriteString(za0002) + if err != nil { + err = msgp.WrapError(err, "Attributes", za0001) + return + } + } } - err = en.WriteUint32(z.Flags) - if err != nil { - err = msgp.WrapError(err, "Flags") - return + if (zb0001Mask & 0x10) == 0 { // if not omitted + // write "tracestate" + err = en.Append(0xaa, 0x74, 0x72, 0x61, 0x63, 0x65, 0x73, 0x74, 0x61, 0x74, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Tracestate) + if err != nil { + err = msgp.WrapError(err, "Tracestate") + return + } + } + if (zb0001Mask & 0x20) == 0 { // if not omitted + // write "flags" + err = en.Append(0xa5, 0x66, 0x6c, 0x61, 0x67, 0x73) + if err != nil { + return + } + err = en.WriteUint32(z.Flags) + if err != nil { + err = msgp.WrapError(err, "Flags") + return + } } } return diff --git a/ddtrace/tracer/span_msgp.go b/ddtrace/tracer/span_msgp.go index c6cb8274a7..ef694e64d4 100644 --- a/ddtrace/tracer/span_msgp.go +++ b/ddtrace/tracer/span_msgp.go @@ -1,104 +1,13 @@ -package tracer - // Code generated by github.com/tinylib/msgp DO NOT EDIT. +package tracer + import ( "github.com/tinylib/msgp/msgp" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" ) // DecodeMsg implements msgp.Decodable -func (z *errorConfig) DecodeMsg(dc *msgp.Reader) (err error) { - var field []byte - _ = field - var zb0001 uint32 - zb0001, err = dc.ReadMapHeader() - if err != nil { - err = msgp.WrapError(err) - return - } - for zb0001 > 0 { - zb0001-- - field, err = dc.ReadMapKeyPtr() - if err != nil { - err = msgp.WrapError(err) - return - } - switch msgp.UnsafeString(field) { - case "noDebugStack": - z.noDebugStack, err = dc.ReadBool() - if err != nil { - err = msgp.WrapError(err, "noDebugStack") - return - } - case "stackFrames": - z.stackFrames, err = dc.ReadUint() - if err != nil { - err = msgp.WrapError(err, "stackFrames") - return - } - case "stackSkip": - z.stackSkip, err = dc.ReadUint() - if err != nil { - err = msgp.WrapError(err, "stackSkip") - return - } - default: - err = dc.Skip() - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - return -} - -// EncodeMsg implements msgp.Encodable -func (z errorConfig) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 3 - // write "noDebugStack" - err = en.Append(0x83, 0xac, 0x6e, 0x6f, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x63, 0x6b) - if err != nil { - return - } - err = en.WriteBool(z.noDebugStack) - if err != nil { - err = msgp.WrapError(err, "noDebugStack") - return - } - // write "stackFrames" - err = en.Append(0xab, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73) - if err != nil { - return - } - err = en.WriteUint(z.stackFrames) - if err != nil { - err = msgp.WrapError(err, "stackFrames") - return - } - // write "stackSkip" - err = en.Append(0xa9, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x6b, 0x69, 0x70) - if err != nil { - return - } - err = en.WriteUint(z.stackSkip) - if err != nil { - err = msgp.WrapError(err, "stackSkip") - return - } - return -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z errorConfig) Msgsize() (s int) { - s = 1 + 13 + msgp.BoolSize + 12 + msgp.UintSize + 10 + msgp.UintSize - return -} - -// DecodeMsg implements msgp.Decodable -func (z *span) DecodeMsg(dc *msgp.Reader) (err error) { +func (z *Span) DecodeMsg(dc *msgp.Reader) (err error) { var field []byte _ = field var zb0001 uint32 @@ -116,147 +25,162 @@ func (z *span) DecodeMsg(dc *msgp.Reader) (err error) { } switch msgp.UnsafeString(field) { case "name": - z.Name, err = dc.ReadString() + z.name, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Name") + err = msgp.WrapError(err, "name") return } case "service": - z.Service, err = dc.ReadString() + z.service, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Service") + err = msgp.WrapError(err, "service") return } case "resource": - z.Resource, err = dc.ReadString() + z.resource, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Resource") + err = msgp.WrapError(err, "resource") return } case "type": - z.Type, err = dc.ReadString() + z.spanType, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Type") + err = msgp.WrapError(err, "spanType") return } case "start": - z.Start, err = dc.ReadInt64() + z.start, err = dc.ReadInt64() if err != nil { - err = msgp.WrapError(err, "Start") + err = msgp.WrapError(err, "start") return } case "duration": - z.Duration, err = dc.ReadInt64() + z.duration, err = dc.ReadInt64() if err != nil { - err = msgp.WrapError(err, "Duration") + err = msgp.WrapError(err, "duration") return } case "meta": var zb0002 uint32 zb0002, err = dc.ReadMapHeader() if err != nil { - err = msgp.WrapError(err, "Meta") + err = msgp.WrapError(err, "meta") return } - if z.Meta == nil { - z.Meta = make(map[string]string, zb0002) - } else if len(z.Meta) > 0 { - for key := range z.Meta { - delete(z.Meta, key) - } + if z.meta == nil { + z.meta = make(map[string]string, zb0002) + } else if len(z.meta) > 0 { + clear(z.meta) } for zb0002 > 0 { zb0002-- var za0001 string - var za0002 string za0001, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Meta") + err = msgp.WrapError(err, "meta") return } + var za0002 string za0002, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Meta", za0001) + err = msgp.WrapError(err, "meta", za0001) return } - z.Meta[za0001] = za0002 + z.meta[za0001] = za0002 } case "meta_struct": - err = z.MetaStruct.DecodeMsg(dc) + err = z.metaStruct.DecodeMsg(dc) if err != nil { - err = msgp.WrapError(err, "MetaStruct") + err = msgp.WrapError(err, "metaStruct") return } case "metrics": var zb0003 uint32 zb0003, err = dc.ReadMapHeader() if err != nil { - err = msgp.WrapError(err, "Metrics") + err = msgp.WrapError(err, "metrics") return } - if z.Metrics == nil { - z.Metrics = make(map[string]float64, zb0003) - } else if len(z.Metrics) > 0 { - for key := range z.Metrics { - delete(z.Metrics, key) - } + if z.metrics == nil { + z.metrics = make(map[string]float64, zb0003) + } else if len(z.metrics) > 0 { + clear(z.metrics) } for zb0003 > 0 { zb0003-- var za0003 string - var za0004 float64 za0003, err = dc.ReadString() if err != nil { - err = msgp.WrapError(err, "Metrics") + err = msgp.WrapError(err, "metrics") return } + var za0004 float64 za0004, err = dc.ReadFloat64() if err != nil { - err = msgp.WrapError(err, "Metrics", za0003) + err = msgp.WrapError(err, "metrics", za0003) return } - z.Metrics[za0003] = za0004 + z.metrics[za0003] = za0004 } case "span_id": - z.SpanID, err = dc.ReadUint64() + z.spanID, err = dc.ReadUint64() if err != nil { - err = msgp.WrapError(err, "SpanID") + err = msgp.WrapError(err, "spanID") return } case "trace_id": - z.TraceID, err = dc.ReadUint64() + z.traceID, err = dc.ReadUint64() if err != nil { - err = msgp.WrapError(err, "TraceID") + err = msgp.WrapError(err, "traceID") return } case "parent_id": - z.ParentID, err = dc.ReadUint64() + z.parentID, err = dc.ReadUint64() if err != nil { - err = msgp.WrapError(err, "ParentID") + err = msgp.WrapError(err, "parentID") return } case "error": - z.Error, err = dc.ReadInt32() + z.error, err = dc.ReadInt32() if err != nil { - err = msgp.WrapError(err, "Error") + err = msgp.WrapError(err, "error") return } case "span_links": var zb0004 uint32 zb0004, err = dc.ReadArrayHeader() if err != nil { - err = msgp.WrapError(err, "SpanLinks") + err = msgp.WrapError(err, "spanLinks") + return + } + if cap(z.spanLinks) >= int(zb0004) { + z.spanLinks = (z.spanLinks)[:zb0004] + } else { + z.spanLinks = make([]SpanLink, zb0004) + } + for za0005 := range z.spanLinks { + err = z.spanLinks[za0005].DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, "spanLinks", za0005) + return + } + } + case "span_events": + var zb0005 uint32 + zb0005, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err, "spanEvents") return } - if cap(z.SpanLinks) >= int(zb0004) { - z.SpanLinks = (z.SpanLinks)[:zb0004] + if cap(z.spanEvents) >= int(zb0005) { + z.spanEvents = (z.spanEvents)[:zb0005] } else { - z.SpanLinks = make([]ddtrace.SpanLink, zb0004) + z.spanEvents = make([]spanEvent, zb0005) } - for za0005 := range z.SpanLinks { - err = z.SpanLinks[za0005].DecodeMsg(dc) + for za0006 := range z.spanEvents { + err = z.spanEvents[za0006].DecodeMsg(dc) if err != nil { - err = msgp.WrapError(err, "SpanLinks", za0005) + err = msgp.WrapError(err, "spanEvents", za0006) return } } @@ -272,225 +196,348 @@ func (z *span) DecodeMsg(dc *msgp.Reader) (err error) { } // EncodeMsg implements msgp.Encodable -func (z *span) EncodeMsg(en *msgp.Writer) (err error) { - // omitempty: check for empty values - zb0001Len := uint32(14) - var zb0001Mask uint16 /* 14 bits */ +func (z *Span) EncodeMsg(en *msgp.Writer) (err error) { + // check for omitted fields + zb0001Len := uint32(15) + var zb0001Mask uint16 /* 15 bits */ _ = zb0001Mask - if z.Meta == nil { + if z.meta == nil { zb0001Len-- zb0001Mask |= 0x40 } - if z.Metrics == nil { + if z.metrics == nil { zb0001Len-- zb0001Mask |= 0x100 } - // variable map header, size zb0001Len - err = en.Append(0x80 | uint8(zb0001Len)) - if err != nil { - return - } - if zb0001Len == 0 { - return - } - // write "name" - err = en.Append(0xa4, 0x6e, 0x61, 0x6d, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Name) - if err != nil { - err = msgp.WrapError(err, "Name") - return - } - // write "service" - err = en.Append(0xa7, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Service) - if err != nil { - err = msgp.WrapError(err, "Service") - return - } - // write "resource" - err = en.Append(0xa8, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Resource) - if err != nil { - err = msgp.WrapError(err, "Resource") - return - } - // write "type" - err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Type) - if err != nil { - err = msgp.WrapError(err, "Type") - return - } - // write "start" - err = en.Append(0xa5, 0x73, 0x74, 0x61, 0x72, 0x74) - if err != nil { - return - } - err = en.WriteInt64(z.Start) - if err != nil { - err = msgp.WrapError(err, "Start") - return + if z.spanLinks == nil { + zb0001Len-- + zb0001Mask |= 0x2000 } - // write "duration" - err = en.Append(0xa8, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e) - if err != nil { - return + if z.spanEvents == nil { + zb0001Len-- + zb0001Mask |= 0x4000 } - err = en.WriteInt64(z.Duration) + // variable map header, size zb0001Len + err = en.Append(0x80 | uint8(zb0001Len)) if err != nil { - err = msgp.WrapError(err, "Duration") return } - if (zb0001Mask & 0x40) == 0 { // if not empty - // write "meta" - err = en.Append(0xa4, 0x6d, 0x65, 0x74, 0x61) + + // skip if no fields are to be emitted + if zb0001Len != 0 { + // write "name" + err = en.Append(0xa4, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.name) + if err != nil { + err = msgp.WrapError(err, "name") + return + } + // write "service" + err = en.Append(0xa7, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65) + if err != nil { + return + } + err = en.WriteString(z.service) + if err != nil { + err = msgp.WrapError(err, "service") + return + } + // write "resource" + err = en.Append(0xa8, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65) + if err != nil { + return + } + err = en.WriteString(z.resource) + if err != nil { + err = msgp.WrapError(err, "resource") + return + } + // write "type" + err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) + if err != nil { + return + } + err = en.WriteString(z.spanType) if err != nil { + err = msgp.WrapError(err, "spanType") return } - err = en.WriteMapHeader(uint32(len(z.Meta))) + // write "start" + err = en.Append(0xa5, 0x73, 0x74, 0x61, 0x72, 0x74) if err != nil { - err = msgp.WrapError(err, "Meta") return } - for za0001, za0002 := range z.Meta { - err = en.WriteString(za0001) + err = en.WriteInt64(z.start) + if err != nil { + err = msgp.WrapError(err, "start") + return + } + // write "duration" + err = en.Append(0xa8, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteInt64(z.duration) + if err != nil { + err = msgp.WrapError(err, "duration") + return + } + if (zb0001Mask & 0x40) == 0 { // if not omitted + // write "meta" + err = en.Append(0xa4, 0x6d, 0x65, 0x74, 0x61) if err != nil { - err = msgp.WrapError(err, "Meta") return } - err = en.WriteString(za0002) + err = en.WriteMapHeader(uint32(len(z.meta))) if err != nil { - err = msgp.WrapError(err, "Meta", za0001) + err = msgp.WrapError(err, "meta") return } + for za0001, za0002 := range z.meta { + err = en.WriteString(za0001) + if err != nil { + err = msgp.WrapError(err, "meta") + return + } + err = en.WriteString(za0002) + if err != nil { + err = msgp.WrapError(err, "meta", za0001) + return + } + } } - } - // write "meta_struct" - err = en.Append(0xab, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74) - if err != nil { - return - } - err = z.MetaStruct.EncodeMsg(en) - if err != nil { - err = msgp.WrapError(err, "MetaStruct") - return - } - if (zb0001Mask & 0x100) == 0 { // if not empty - // write "metrics" - err = en.Append(0xa7, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73) + // write "meta_struct" + err = en.Append(0xab, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74) + if err != nil { + return + } + err = z.metaStruct.EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "metaStruct") + return + } + if (zb0001Mask & 0x100) == 0 { // if not omitted + // write "metrics" + err = en.Append(0xa7, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73) + if err != nil { + return + } + err = en.WriteMapHeader(uint32(len(z.metrics))) + if err != nil { + err = msgp.WrapError(err, "metrics") + return + } + for za0003, za0004 := range z.metrics { + err = en.WriteString(za0003) + if err != nil { + err = msgp.WrapError(err, "metrics") + return + } + err = en.WriteFloat64(za0004) + if err != nil { + err = msgp.WrapError(err, "metrics", za0003) + return + } + } + } + // write "span_id" + err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) if err != nil { return } - err = en.WriteMapHeader(uint32(len(z.Metrics))) + err = en.WriteUint64(z.spanID) if err != nil { - err = msgp.WrapError(err, "Metrics") + err = msgp.WrapError(err, "spanID") return } - for za0003, za0004 := range z.Metrics { - err = en.WriteString(za0003) + // write "trace_id" + err = en.Append(0xa8, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.traceID) + if err != nil { + err = msgp.WrapError(err, "traceID") + return + } + // write "parent_id" + err = en.Append(0xa9, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.parentID) + if err != nil { + err = msgp.WrapError(err, "parentID") + return + } + // write "error" + err = en.Append(0xa5, 0x65, 0x72, 0x72, 0x6f, 0x72) + if err != nil { + return + } + err = en.WriteInt32(z.error) + if err != nil { + err = msgp.WrapError(err, "error") + return + } + if (zb0001Mask & 0x2000) == 0 { // if not omitted + // write "span_links" + err = en.Append(0xaa, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x73) if err != nil { - err = msgp.WrapError(err, "Metrics") return } - err = en.WriteFloat64(za0004) + err = en.WriteArrayHeader(uint32(len(z.spanLinks))) if err != nil { - err = msgp.WrapError(err, "Metrics", za0003) + err = msgp.WrapError(err, "spanLinks") return } + for za0005 := range z.spanLinks { + err = z.spanLinks[za0005].EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "spanLinks", za0005) + return + } + } + } + if (zb0001Mask & 0x4000) == 0 { // if not omitted + // write "span_events" + err = en.Append(0xab, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73) + if err != nil { + return + } + err = en.WriteArrayHeader(uint32(len(z.spanEvents))) + if err != nil { + err = msgp.WrapError(err, "spanEvents") + return + } + for za0006 := range z.spanEvents { + err = z.spanEvents[za0006].EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "spanEvents", za0006) + return + } + } } } - // write "span_id" - err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) - if err != nil { - return + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Span) Msgsize() (s int) { + s = 1 + 5 + msgp.StringPrefixSize + len(z.name) + 8 + msgp.StringPrefixSize + len(z.service) + 9 + msgp.StringPrefixSize + len(z.resource) + 5 + msgp.StringPrefixSize + len(z.spanType) + 6 + msgp.Int64Size + 9 + msgp.Int64Size + 5 + msgp.MapHeaderSize + if z.meta != nil { + for za0001, za0002 := range z.meta { + _ = za0002 + s += msgp.StringPrefixSize + len(za0001) + msgp.StringPrefixSize + len(za0002) + } } - err = en.WriteUint64(z.SpanID) - if err != nil { - err = msgp.WrapError(err, "SpanID") - return + s += 12 + z.metaStruct.Msgsize() + 8 + msgp.MapHeaderSize + if z.metrics != nil { + for za0003, za0004 := range z.metrics { + _ = za0004 + s += msgp.StringPrefixSize + len(za0003) + msgp.Float64Size + } } - // write "trace_id" - err = en.Append(0xa8, 0x74, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64) - if err != nil { - return + s += 8 + msgp.Uint64Size + 9 + msgp.Uint64Size + 10 + msgp.Uint64Size + 6 + msgp.Int32Size + 11 + msgp.ArrayHeaderSize + for za0005 := range z.spanLinks { + s += z.spanLinks[za0005].Msgsize() + } + s += 12 + msgp.ArrayHeaderSize + for za0006 := range z.spanEvents { + s += z.spanEvents[za0006].Msgsize() } - err = en.WriteUint64(z.TraceID) + return +} + +// DecodeMsg implements msgp.Decodable +func (z *errorConfig) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() if err != nil { - err = msgp.WrapError(err, "TraceID") + err = msgp.WrapError(err) return } - // write "parent_id" - err = en.Append(0xa9, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64) + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "noDebugStack": + z.noDebugStack, err = dc.ReadBool() + if err != nil { + err = msgp.WrapError(err, "noDebugStack") + return + } + case "stackFrames": + z.stackFrames, err = dc.ReadUint() + if err != nil { + err = msgp.WrapError(err, "stackFrames") + return + } + case "stackSkip": + z.stackSkip, err = dc.ReadUint() + if err != nil { + err = msgp.WrapError(err, "stackSkip") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z errorConfig) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 3 + // write "noDebugStack" + err = en.Append(0x83, 0xac, 0x6e, 0x6f, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x63, 0x6b) if err != nil { return } - err = en.WriteUint64(z.ParentID) + err = en.WriteBool(z.noDebugStack) if err != nil { - err = msgp.WrapError(err, "ParentID") + err = msgp.WrapError(err, "noDebugStack") return } - // write "error" - err = en.Append(0xa5, 0x65, 0x72, 0x72, 0x6f, 0x72) + // write "stackFrames" + err = en.Append(0xab, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73) if err != nil { return } - err = en.WriteInt32(z.Error) + err = en.WriteUint(z.stackFrames) if err != nil { - err = msgp.WrapError(err, "Error") + err = msgp.WrapError(err, "stackFrames") return } - // write "span_links" - err = en.Append(0xaa, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x6c, 0x69, 0x6e, 0x6b, 0x73) + // write "stackSkip" + err = en.Append(0xa9, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x53, 0x6b, 0x69, 0x70) if err != nil { return } - err = en.WriteArrayHeader(uint32(len(z.SpanLinks))) + err = en.WriteUint(z.stackSkip) if err != nil { - err = msgp.WrapError(err, "SpanLinks") + err = msgp.WrapError(err, "stackSkip") return } - for za0005 := range z.SpanLinks { - err = z.SpanLinks[za0005].EncodeMsg(en) - if err != nil { - err = msgp.WrapError(err, "SpanLinks", za0005) - return - } - } return } // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *span) Msgsize() (s int) { - s = 1 + 5 + msgp.StringPrefixSize + len(z.Name) + 8 + msgp.StringPrefixSize + len(z.Service) + 9 + msgp.StringPrefixSize + len(z.Resource) + 5 + msgp.StringPrefixSize + len(z.Type) + 6 + msgp.Int64Size + 9 + msgp.Int64Size + 5 + msgp.MapHeaderSize - if z.Meta != nil { - for za0001, za0002 := range z.Meta { - _ = za0002 - s += msgp.StringPrefixSize + len(za0001) + msgp.StringPrefixSize + len(za0002) - } - } - s += 12 + z.MetaStruct.Msgsize() + 8 + msgp.MapHeaderSize - if z.Metrics != nil { - for za0003, za0004 := range z.Metrics { - _ = za0004 - s += msgp.StringPrefixSize + len(za0003) + msgp.Float64Size - } - } - s += 8 + msgp.Uint64Size + 9 + msgp.Uint64Size + 10 + msgp.Uint64Size + 6 + msgp.Int32Size + 11 + msgp.ArrayHeaderSize - for za0005 := range z.SpanLinks { - s += z.SpanLinks[za0005].Msgsize() - } +func (z errorConfig) Msgsize() (s int) { + s = 1 + 13 + msgp.BoolSize + 12 + msgp.UintSize + 10 + msgp.UintSize return } @@ -517,7 +564,7 @@ func (z *spanList) DecodeMsg(dc *msgp.Reader) (err error) { (*z)[zb0001] = nil } else { if (*z)[zb0001] == nil { - (*z)[zb0001] = new(span) + (*z)[zb0001] = new(Span) } err = (*z)[zb0001].DecodeMsg(dc) if err != nil { @@ -601,7 +648,7 @@ func (z *spanLists) DecodeMsg(dc *msgp.Reader) (err error) { (*z)[zb0001][zb0002] = nil } else { if (*z)[zb0001][zb0002] == nil { - (*z)[zb0001][zb0002] = new(span) + (*z)[zb0001][zb0002] = new(Span) } err = (*z)[zb0001][zb0002].DecodeMsg(dc) if err != nil { diff --git a/ddtrace/tracer/span_test.go b/ddtrace/tracer/span_test.go index a294b09af0..d9652b3e78 100644 --- a/ddtrace/tracer/span_test.go +++ b/ddtrace/tracer/span_test.go @@ -6,50 +6,107 @@ package tracer import ( + "encoding/json" "errors" "fmt" "runtime" "strings" "sync" - "sync/atomic" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - sharedinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - - "github.com/DataDog/datadog-agent/pkg/obfuscate" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/errortrace" + sharedinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + + "github.com/DataDog/datadog-go/v5/statsd" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // newSpan creates a new span. This is a low-level function, required for testing and advanced usage. // Most of the time one should prefer the Tracer NewRootSpan or NewChildSpan methods. -func newSpan(name, service, resource string, spanID, traceID, parentID uint64) *span { - span := &span{ - Name: name, - Service: service, - Resource: resource, - Meta: map[string]string{}, - Metrics: map[string]float64{}, - SpanID: spanID, - TraceID: traceID, - ParentID: parentID, - Start: now(), +func newSpan(name, service, resource string, spanID, traceID, parentID uint64) *Span { + span := &Span{ + name: name, + service: service, + resource: resource, + meta: map[string]string{}, + metrics: map[string]float64{}, + spanID: spanID, + traceID: traceID, + parentID: parentID, + start: now(), } span.context = newSpanContext(span, nil) return span } // newBasicSpan is the OpenTracing Span constructor -func newBasicSpan(operationName string) *span { +func newBasicSpan(operationName string) *Span { return newSpan(operationName, "", "", 0, 0, 0) } +func TestSpanAsMap(t *testing.T) { + assertions := assert.New(t) + for _, tt := range []struct { + name string + span *Span + want any + }{ + { + name: "basic", + span: newBasicSpan("my.op"), + want: "my.op", + }, + { + name: "nil span", + span: nil, + want: nil, + }, + } { + t.Run(tt.name, func(_ *testing.T) { + assertions.Equal(tt.want, tt.span.AsMap()[ext.SpanName]) + }) + } +} + +func TestNilSpan(t *testing.T) { + assertions := assert.New(t) + var ( + span *Span + ctx = span.Context() + ) + // nil span should return a nil context + assertions.Nil(ctx) + assertions.Equal(TraceIDZero, ctx.TraceID()) + assertions.Equal([16]byte(emptyTraceID), ctx.TraceIDBytes()) + assertions.Equal(uint64(0), ctx.TraceIDLower()) + assertions.Equal(uint64(0), ctx.SpanID()) + sp, ok := ctx.SamplingPriority() + assertions.Equal(0, sp) + assertions.Equal(false, ok) + // calls on nil span should be no-op + assertions.Nil(span.Root()) + span.SetBaggageItem("key", "value") + if v := span.BaggageItem("key"); v != "" { + t.Errorf("expected empty string, got %s", v) + } + span.SetTag("key", "value") + if v := span.AsMap()["key"]; v != nil { + t.Errorf("expected nil, got %s", v) + } + span.SetUser("user") + assertions.Nil(span.StartChild("child")) + span.Finish() +} + func TestSpanBaggage(t *testing.T) { assert := assert.New(t) @@ -65,12 +122,29 @@ func TestSpanContext(t *testing.T) { assert.NotNil(span.Context()) } +func BenchmarkAddLink(b *testing.B) { + rootSpan := newSpan("root", "service", "res", 123, 456, 0) + spanContext := newSpanContext(rootSpan, nil) + attrs := map[string]string{"key1": "val1"} + link := SpanLink{ + TraceID: spanContext.TraceIDLower(), + TraceIDHigh: spanContext.TraceIDUpper(), + SpanID: spanContext.SpanID(), + Attributes: attrs, + } + + b.ResetTimer() + for n := 0; n < b.N; n++ { + rootSpan.AddLink(link) + } +} + func TestSpanOperationName(t *testing.T) { assert := assert.New(t) span := newBasicSpan("web.request") span.SetOperationName("http.request") - assert.Equal("http.request", span.Name) + assert.Equal("http.request", span.name) } func TestSpanFinish(t *testing.T) { @@ -80,14 +154,15 @@ func TestSpanFinish(t *testing.T) { assert := assert.New(t) wait := time.Millisecond * 2 - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.NoError(err) span := tracer.newRootSpan("pylons.request", "pylons", "/") // the finish should set finished and the duration time.Sleep(wait) span.Finish() - assert.Greater(span.Duration, int64(wait)) + assert.Greater(span.duration, int64(wait)) assert.True(span.finished) } @@ -95,10 +170,11 @@ func TestSpanFinishTwice(t *testing.T) { assert := assert.New(t) wait := time.Millisecond * 2 - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() - assert.Equal(tracer.traceWriter.(*agentTraceWriter).payload.itemCount(), 0) + assert.Equal(tracer.traceWriter.(*agentTraceWriter).payload.stats().itemCount, 0) // the finish must be idempotent span := tracer.newRootSpan("pylons.request", "pylons", "/") @@ -106,11 +182,84 @@ func TestSpanFinishTwice(t *testing.T) { span.Finish() tracer.awaitPayload(t, 1) - previousDuration := span.Duration + // check that the span does not have any span links serialized + // spans don't have span links by default and they are serialized in the meta map + // as part of the Finish call + _, spanLinksStr := getMeta(span, "_dd.span_links") + assert.Zero(spanLinksStr) + + // manipulate the span + span.AddLink(SpanLink{ + TraceID: span.traceID, + SpanID: span.spanID, + Attributes: map[string]string{ + "manual.keep": "true", + }, + }) + + previousDuration := span.duration time.Sleep(wait) span.Finish() - assert.Equal(previousDuration, span.Duration) - tracer.awaitPayload(t, 1) + + assert.Equal(previousDuration, span.duration) + _, spanLinksStr = getMeta(span, "_dd.span_links") + assert.Zero(spanLinksStr) + + tracer.awaitPayload(t, 1) // this checks that no other span was seen by the tracerWriter +} + +func TestSpanFinishNilOption(t *testing.T) { + assert := assert.New(t) + tracer, err := newTracer(withTransport(newDefaultTransport())) + defer tracer.Stop() + assert.NoError(err) + + tc := []struct { + name string + wantErr bool + options []FinishOption + }{ + { + name: "all nil options", + options: []FinishOption{nil, nil, nil}, + wantErr: false, + }, + { + name: "nil options at end", + options: []FinishOption{WithError(errors.New("test error")), nil, nil}, + wantErr: true, + }, + { + name: "nil options at beginning and end", + options: []FinishOption{nil, WithError(errors.New("test error")), nil}, + wantErr: true, + }, + { + name: "nil options at beginning", + options: []FinishOption{nil, nil, WithError(errors.New("test error"))}, + wantErr: true, + }, + } + + for _, tc := range tc { + t.Run(tc.name, func(_ *testing.T) { + span := tracer.newRootSpan("pylons.request", "pylons", "/") + span.Finish(tc.options...) + if tc.wantErr { + assert.Equal(tc.wantErr, span.error != 0) + errMsg, _ := getMeta(span, ext.ErrorMsg) + errType, _ := getMeta(span, ext.ErrorType) + assert.Equal("test error", errMsg) + assert.Equal("*errors.errorString", errType) + } else { + assert.Equal(span.error, int32(0)) + _, ok := getMeta(span, ext.ErrorMsg) + assert.False(ok) + _, ok = getMeta(span, ext.ErrorType) + assert.False(ok) + } + }) + } } func TestShouldDrop(t *testing.T) { @@ -130,9 +279,9 @@ func TestShouldDrop(t *testing.T) { } { t.Run("", func(t *testing.T) { s := newSpan("", "", "", 1, 1, 0) - s.SetTag(ext.SamplingPriority, tt.prio) + s.setSamplingPriority(tt.prio, samplernames.Default) s.SetTag(ext.EventSampleRate, tt.rate) - atomic.StoreInt32(&s.context.errors, tt.errors) + s.context.errors.Store(tt.errors) assert.Equal(t, shouldKeep(s), tt.want) }) } @@ -160,46 +309,11 @@ func TestShouldComputeStats(t *testing.T) { {map[string]float64{}, false}, } { t.Run("", func(t *testing.T) { - assert.Equal(t, shouldComputeStats(&span{Metrics: tt.metrics}), tt.want) + assert.Equal(t, shouldComputeStats(&Span{metrics: tt.metrics}), tt.want) }) } } -func TestNewAggregableSpan(t *testing.T) { - t.Run("obfuscating", func(t *testing.T) { - o := obfuscate.NewObfuscator(obfuscate.Config{}) - aggspan := newAggregableSpan(&span{ - Name: "name", - Resource: "SELECT * FROM table WHERE password='secret'", - Service: "service", - Type: "sql", - }, o) - assert.Equal(t, aggregation{ - Name: "name", - Type: "sql", - Resource: "SELECT * FROM table WHERE password = ?", - Service: "service", - IsTraceRoot: 1, - }, aggspan.key) - }) - - t.Run("nil-obfuscator", func(t *testing.T) { - aggspan := newAggregableSpan(&span{ - Name: "name", - Resource: "SELECT * FROM table WHERE password='secret'", - Service: "service", - Type: "sql", - }, nil) - assert.Equal(t, aggregation{ - Name: "name", - Type: "sql", - Resource: "SELECT * FROM table WHERE password='secret'", - Service: "service", - IsTraceRoot: 1, - }, aggspan.key) - }) -} - func TestSpanFinishWithTime(t *testing.T) { assert := assert.New(t) @@ -207,8 +321,8 @@ func TestSpanFinishWithTime(t *testing.T) { span := newBasicSpan("web.request") span.Finish(FinishTime(finishTime)) - duration := finishTime.UnixNano() - span.Start - assert.Equal(duration, span.Duration) + duration := finishTime.UnixNano() - span.start + assert.Equal(duration, span.duration) } func TestSpanFinishWithNegativeDuration(t *testing.T) { @@ -216,9 +330,9 @@ func TestSpanFinishWithNegativeDuration(t *testing.T) { startTime := time.Now() finishTime := startTime.Add(-10 * time.Second) span := newBasicSpan("web.request") - span.Start = startTime.UnixNano() + span.start = startTime.UnixNano() span.Finish(FinishTime(finishTime)) - assert.Equal(int64(0), span.Duration) + assert.Equal(int64(0), span.duration) } func TestSpanFinishWithError(t *testing.T) { @@ -228,10 +342,13 @@ func TestSpanFinishWithError(t *testing.T) { span := newBasicSpan("web.request") span.Finish(WithError(err)) - assert.Equal(int32(1), span.Error) - assert.Equal("test error", span.Meta[ext.ErrorMsg]) - assert.Equal("*errors.errorString", span.Meta[ext.ErrorType]) - assert.NotEmpty(span.Meta[ext.ErrorStack]) + assert.Equal(int32(1), span.error) + errMsg, _ := getMeta(span, ext.ErrorMsg) + errType, _ := getMeta(span, ext.ErrorType) + errStack, _ := getMeta(span, ext.ErrorStack) + assert.Equal("test error", errMsg) + assert.Equal("*errors.errorString", errType) + assert.NotEmpty(errStack) } func TestSpanFinishWithErrorNoDebugStack(t *testing.T) { @@ -241,10 +358,13 @@ func TestSpanFinishWithErrorNoDebugStack(t *testing.T) { span := newBasicSpan("web.request") span.Finish(WithError(err), NoDebugStack()) - assert.Equal(int32(1), span.Error) - assert.Equal("test error", span.Meta[ext.ErrorMsg]) - assert.Equal("*errors.errorString", span.Meta[ext.ErrorType]) - assert.Empty(span.Meta[ext.ErrorStack]) + errMsg, _ := getMeta(span, ext.ErrorMsg) + errType, _ := getMeta(span, ext.ErrorType) + _, hasErrStack := getMeta(span, ext.ErrorStack) + assert.Equal(int32(1), span.error) + assert.Equal("test error", errMsg) + assert.Equal("*errors.errorString", errType) + assert.False(hasErrStack) } func TestSpanFinishWithErrorStackFrames(t *testing.T) { @@ -254,12 +374,16 @@ func TestSpanFinishWithErrorStackFrames(t *testing.T) { span := newBasicSpan("web.request") span.Finish(WithError(err), StackFrames(2, 1)) - assert.Equal(int32(1), span.Error) - assert.Equal("test error", span.Meta[ext.ErrorMsg]) - assert.Equal("*errors.errorString", span.Meta[ext.ErrorType]) - assert.Contains(span.Meta[ext.ErrorStack], "tracer.TestSpanFinishWithErrorStackFrames") - assert.Contains(span.Meta[ext.ErrorStack], "tracer.(*span).Finish") - assert.Equal(strings.Count(span.Meta[ext.ErrorStack], "\n\t"), 2) + errMsg, _ := getMeta(span, ext.ErrorMsg) + errType, _ := getMeta(span, ext.ErrorType) + errStack, _ := getMeta(span, ext.ErrorStack) + + assert.Equal(int32(1), span.error) + assert.Equal("test error", errMsg) + assert.Equal("*errors.errorString", errType) + assert.Contains(errStack, "tracer.TestSpanFinishWithErrorStackFrames") + assert.Contains(errStack, "tracer.(*Span).Finish") + assert.Equal(strings.Count(errStack, "\n\t"), 2) } // nilStringer is used to test nil detection when setting tags. @@ -283,106 +407,119 @@ func (p *panicStringer) String() string { func TestSpanSetTag(t *testing.T) { assert := assert.New(t) - span := newBasicSpan("web.request") + assert.Equal("web.request", span.name) + span.SetTag("component", "tracer") - assert.Equal("tracer", span.Meta["component"]) + assert.Equal("tracer", span.meta["component"]) span.SetTag("tagInt", 1234) - assert.Equal(float64(1234), span.Metrics["tagInt"]) + assert.Equal(float64(1234), span.metrics["tagInt"]) span.SetTag("tagStruct", struct{ A, B int }{1, 2}) - assert.Equal("{1 2}", span.Meta["tagStruct"]) + assert.Equal("{1 2}", span.meta["tagStruct"]) span.SetTag(ext.Error, true) - assert.Equal(int32(1), span.Error) + assert.Equal(int32(1), span.error) span.SetTag(ext.Error, nil) - assert.Equal(int32(0), span.Error) + assert.Equal(int32(0), span.error) span.SetTag(ext.Error, errors.New("abc")) - assert.Equal(int32(1), span.Error) - assert.Equal("abc", span.Meta[ext.ErrorMsg]) - assert.Equal("*errors.errorString", span.Meta[ext.ErrorType]) - assert.NotEmpty(span.Meta[ext.ErrorStack]) + assert.Equal(int32(1), span.error) + assert.Equal("abc", span.meta[ext.ErrorMsg]) + assert.Equal("*errors.errorString", span.meta[ext.ErrorType]) + assert.NotEmpty(span.meta[ext.ErrorStack]) span.SetTag(ext.Error, "something else") - assert.Equal(int32(1), span.Error) + assert.Equal(int32(1), span.error) span.SetTag(ext.Error, false) - assert.Equal(int32(0), span.Error) - - span.SetTag(ext.SamplingPriority, 2) - assert.Equal(float64(2), span.Metrics[keySamplingPriority]) - - span.SetTag(ext.AnalyticsEvent, true) - assert.Equal(1.0, span.Metrics[ext.EventSampleRate]) - - span.SetTag(ext.AnalyticsEvent, false) - assert.Equal(0.0, span.Metrics[ext.EventSampleRate]) - - span.SetTag(ext.ManualDrop, true) - assert.Equal(-1., span.Metrics[keySamplingPriority]) - - span.SetTag(ext.ManualKeep, true) - assert.Equal(2., span.Metrics[keySamplingPriority]) + assert.Equal(int32(0), span.error) span.SetTag("some.bool", true) - assert.Equal("true", span.Meta["some.bool"]) + assert.Equal("true", span.meta["some.bool"]) span.SetTag("some.other.bool", false) - assert.Equal("false", span.Meta["some.other.bool"]) + assert.Equal("false", span.meta["some.other.bool"]) span.SetTag("time", (*time.Time)(nil)) - assert.Equal("", span.Meta["time"]) + assert.Equal("", span.meta["time"]) span.SetTag("nilStringer", (*nilStringer)(nil)) - assert.Equal("", span.Meta["nilStringer"]) + assert.Equal("", span.meta["nilStringer"]) span.SetTag("somestrings", []string{"foo", "bar"}) - assert.Equal("foo", span.Meta["somestrings.0"]) - assert.Equal("bar", span.Meta["somestrings.1"]) + assert.Equal("foo", span.meta["somestrings.0"]) + assert.Equal("bar", span.meta["somestrings.1"]) span.SetTag("somebools", []bool{true, false}) - assert.Equal("true", span.Meta["somebools.0"]) - assert.Equal("false", span.Meta["somebools.1"]) + assert.Equal("true", span.meta["somebools.0"]) + assert.Equal("false", span.meta["somebools.1"]) span.SetTag("somenums", []int{-1, 5, 2}) - assert.Equal(-1., span.Metrics["somenums.0"]) - assert.Equal(5., span.Metrics["somenums.1"]) - assert.Equal(2., span.Metrics["somenums.2"]) + assert.Equal(-1., span.metrics["somenums.0"]) + assert.Equal(5., span.metrics["somenums.1"]) + assert.Equal(2., span.metrics["somenums.2"]) span.SetTag("someslices", [][]string{{"a, b, c"}, {"d"}, nil, {"e, f"}}) - assert.Equal("[a, b, c]", span.Meta["someslices.0"]) - assert.Equal("[d]", span.Meta["someslices.1"]) - assert.Equal("[]", span.Meta["someslices.2"]) - assert.Equal("[e, f]", span.Meta["someslices.3"]) + assert.Equal("[a, b, c]", span.meta["someslices.0"]) + assert.Equal("[d]", span.meta["someslices.1"]) + assert.Equal("[]", span.meta["someslices.2"]) + assert.Equal("[e, f]", span.meta["someslices.3"]) mapStrStr := map[string]string{"b": "c"} span.SetTag("map", sharedinternal.MetaStructValue{Value: map[string]string{"b": "c"}}) - assert.Equal(mapStrStr, span.MetaStruct["map"]) + assert.Equal(mapStrStr, span.metaStruct["map"]) mapOfMap := map[string]map[string]any{"a": {"b": "c"}} span.SetTag("mapOfMap", sharedinternal.MetaStructValue{Value: mapOfMap}) - assert.Equal(mapOfMap, span.MetaStruct["mapOfMap"]) + assert.Equal(mapOfMap, span.metaStruct["mapOfMap"]) // testMsgpStruct is a struct that implements the msgp.Marshaler interface testValue := &testMsgpStruct{A: "test"} span.SetTag("struct", sharedinternal.MetaStructValue{Value: testValue}) - require.Equal(t, testValue, span.MetaStruct["struct"]) + require.Equal(t, testValue, span.metaStruct["struct"]) + + mapStrStr = map[string]string{"b": "c"} + span.SetTag("map", sharedinternal.MetaStructValue{Value: map[string]string{"b": "c"}}) + assert.Equal(mapStrStr, span.metaStruct["map"]) + + mapOfMap = map[string]map[string]any{"a": {"b": "c"}} + span.SetTag("mapOfMap", sharedinternal.MetaStructValue{Value: mapOfMap}) + assert.Equal(mapOfMap, span.metaStruct["mapOfMap"]) + + // testMsgpStruct is a struct that implements the msgp.Marshaler interface + testValue = &testMsgpStruct{A: "test"} + span.SetTag("struct", sharedinternal.MetaStructValue{Value: testValue}) + require.Equal(t, testValue, span.metaStruct["struct"]) s := "string" span.SetTag("str_ptr", &s) - assert.Equal(s, span.Meta["str_ptr"]) + assert.Equal(s, span.meta["str_ptr"]) span.SetTag("nil_str_ptr", (*string)(nil)) - assert.Equal("", span.Meta["nil_str_ptr"]) + assert.Equal("", span.meta["nil_str_ptr"]) assert.Panics(func() { span.SetTag("panicStringer", &panicStringer{}) }) } +func TestSpanTagsStartSpan(t *testing.T) { + assert := assert.New(t) + tr, _, _, stop, err := startTestTracer(t) + assert.NoError(err) + defer stop() + + span := tr.StartSpan("operation-name", ServiceName("service"), Tag("tag", "value")) + + tags := span.AsMap() + assert.Equal("value", tags["tag"]) + assert.Equal("service", tags[ext.ServiceName]) + assert.Equal("operation-name", tags[ext.SpanName]) +} + type testMsgpStruct struct { A string } @@ -392,18 +529,17 @@ func (t *testMsgpStruct) MarshalMsg(_ []byte) ([]byte, error) { } func TestSpanSetTagError(t *testing.T) { - assert := assert.New(t) t.Run("off", func(t *testing.T) { span := newBasicSpan("web.request") span.setTagError(errors.New("error value with no trace"), errorConfig{noDebugStack: true}) - assert.Empty(span.Meta[ext.ErrorStack]) + assert.Empty(t, span.meta[ext.ErrorStack]) }) t.Run("on", func(t *testing.T) { span := newBasicSpan("web.request") span.setTagError(errors.New("error value with trace"), errorConfig{noDebugStack: false}) - assert.NotEmpty(span.Meta[ext.ErrorStack]) + assert.NotEmpty(t, span.meta[ext.ErrorStack]) }) } @@ -417,20 +553,68 @@ func TestTraceManualKeepAndManualDrop(t *testing.T) { {ext.ManualDrop, false, 1}, } { t.Run(fmt.Sprintf("%s/local", scenario.tag), func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) span := tracer.newRootSpan("root span", "my service", "my resource") span.SetTag(scenario.tag, true) assert.Equal(t, scenario.keep, shouldKeep(span)) }) t.Run(fmt.Sprintf("%s/non-local", scenario.tag), func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - spanCtx := &spanContext{traceID: traceIDFrom64Bits(42), spanID: 42} + assert.NoError(t, err) + spanCtx := &SpanContext{traceID: traceIDFrom64Bits(42), spanID: 42} spanCtx.setSamplingPriority(scenario.p, samplernames.RemoteRate) - span := tracer.StartSpan("non-local root span", ChildOf(spanCtx)).(*span) + span := tracer.StartSpan("non-local root span", ChildOf(spanCtx)) + span.SetTag(scenario.tag, true) + assert.Equal(t, scenario.keep, shouldKeep(span)) + }) + t.Run(fmt.Sprintf("%s/upstream-drop-locked", scenario.tag), func(t *testing.T) { + tracer, err := newTracer() + defer tracer.Stop() + assert.NoError(t, err) + + spanCtx := &SpanContext{ + traceID: traceIDFrom64Bits(42), + spanID: 42, + trace: newTrace(), + } + + // Set sampling priority (0 = drop decision from upstream) & lock the trace + // mimicking inheriting a trace from an upstream service with a drop decision. + spanCtx.setSamplingPriority(ext.PriorityAutoReject, samplernames.Unknown) + spanCtx.trace.setLocked(true) + + span := tracer.StartSpan("child span with sampling decision", ChildOf(spanCtx)) span.SetTag(scenario.tag, true) + + // The sampling decision should be applied as manual sampling takes + // precedence over propagated decision + assert.Equal(t, scenario.keep, shouldKeep(span)) + }) + t.Run(fmt.Sprintf("%s/upstream-keep-locked", scenario.tag), func(t *testing.T) { + tracer, err := newTracer() + defer tracer.Stop() + assert.NoError(t, err) + + spanCtx := &SpanContext{ + traceID: traceIDFrom64Bits(42), + spanID: 42, + trace: newTrace(), + } + + // Set sampling priority (1 = keep decision from upstream) & lock the trace + // mimicking inheriting a trace from an upstream service with a keep decision. + spanCtx.setSamplingPriority(ext.PriorityAutoKeep, samplernames.Unknown) + spanCtx.trace.setLocked(true) + + span := tracer.StartSpan("child span with sampling decision", ChildOf(spanCtx)) + span.SetTag(scenario.tag, true) + + // The sampling decision should be applied as manual sampling takes + // precedence over propagated decision assert.Equal(t, scenario.keep, shouldKeep(span)) }) } @@ -441,8 +625,9 @@ func TestTraceManualKeepRace(t *testing.T) { const numGoroutines = 100 t.Run("SetTag", func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) rootSpan := tracer.newRootSpan("root span", "my service", "my resource") defer rootSpan.Finish() @@ -460,9 +645,10 @@ func TestTraceManualKeepRace(t *testing.T) { }) // setting the tag using a StartSpan option has the same race - t.Run("StartSpanOption", func(t *testing.T) { - tracer := newTracer() + t.Run("StartSpanOption", func(_ *testing.T) { + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) rootSpan := tracer.newRootSpan("root span", "my service", "my resource") defer rootSpan.Finish() @@ -491,25 +677,72 @@ func TestSpanSetDatadogTags(t *testing.T) { span.SetTag(ext.ServiceName, "db-cluster") span.SetTag(ext.ResourceName, "SELECT * FROM users;") - assert.Equal("http", span.Type) - assert.Equal("db-cluster", span.Service) - assert.Equal("SELECT * FROM users;", span.Resource) + assert.Equal("http", span.spanType) + assert.Equal("db-cluster", span.service) + assert.Equal("SELECT * FROM users;", span.resource) } func TestSpanStart(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.NoError(err) span := tracer.newRootSpan("pylons.request", "pylons", "/") // a new span sets the Start after the initialization - assert.NotEqual(int64(0), span.Start) + assert.NotEqual(int64(0), span.start) +} + +func TestSpanStartNilOption(t *testing.T) { + assert := assert.New(t) + tracer, err := newTracer(withTransport(newDefaultTransport())) + defer tracer.Stop() + assert.NoError(err) + + tc := []struct { + name string + wantTag bool + options []StartSpanOption + }{ + { + name: "all nil options", + options: []StartSpanOption{nil, nil, nil}, + wantTag: false, + }, + { + name: "nil options at end", + options: []StartSpanOption{Tag("tag", "value"), nil, nil}, + wantTag: true, + }, + { + name: "nil options at beginning and end", + options: []StartSpanOption{nil, Tag("tag", "value"), nil}, + wantTag: true, + }, + { + name: "nil options at beginning", + options: []StartSpanOption{nil, nil, Tag("tag", "value")}, + wantTag: true, + }, + } + + for _, tc := range tc { + t.Run(tc.name, func(_ *testing.T) { + span := tracer.StartSpan("pylons.request", tc.options...) + if tc.wantTag { + assert.Equal(tc.wantTag, span.meta["tag"] == "value") + } else { + assert.Empty(span.meta["tag"]) + } + }) + } } func TestSpanString(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) - internal.SetGlobalTracer(tracer) + tracer, err := newTracer(withTransport(newDefaultTransport())) + assert.NoError(err) + setGlobalTracer(tracer) defer tracer.Stop() span := tracer.newRootSpan("pylons.request", "pylons", "/") // don't bother checking the contents, just make sure it works. @@ -524,52 +757,53 @@ const ( ) func TestSpanSetMetric(t *testing.T) { - for name, tt := range map[string]func(assert *assert.Assertions, span *span){ - "init": func(assert *assert.Assertions, span *span) { - assert.Equal(6, len(span.Metrics)) - _, ok := span.Metrics[keySamplingPriority] + for name, tt := range map[string]func(assert *assert.Assertions, span *Span){ + "init": func(assert *assert.Assertions, span *Span) { + assert.Equal(6, len(span.metrics)) + _, ok := span.metrics[keySamplingPriority] assert.True(ok) - _, ok = span.Metrics[keySamplingPriorityRate] + _, ok = span.metrics[keySamplingPriorityRate] assert.True(ok) }, - "float": func(assert *assert.Assertions, span *span) { + "float": func(assert *assert.Assertions, span *Span) { span.SetTag("temp", 72.42) - assert.Equal(72.42, span.Metrics["temp"]) + assert.Equal(72.42, span.metrics["temp"]) }, - "int": func(assert *assert.Assertions, span *span) { + "int": func(assert *assert.Assertions, span *Span) { span.SetTag("bytes", 1024) - assert.Equal(1024.0, span.Metrics["bytes"]) + assert.Equal(1024.0, span.metrics["bytes"]) }, - "max": func(assert *assert.Assertions, span *span) { + "max": func(assert *assert.Assertions, span *Span) { span.SetTag("bytes", intUpperLimit-1) - assert.Equal(float64(intUpperLimit-1), span.Metrics["bytes"]) + assert.Equal(float64(intUpperLimit-1), span.metrics["bytes"]) }, - "min": func(assert *assert.Assertions, span *span) { + "min": func(assert *assert.Assertions, span *Span) { span.SetTag("bytes", intLowerLimit+1) - assert.Equal(float64(intLowerLimit+1), span.Metrics["bytes"]) + assert.Equal(float64(intLowerLimit+1), span.metrics["bytes"]) }, - "toobig": func(assert *assert.Assertions, span *span) { + "toobig": func(assert *assert.Assertions, span *Span) { span.SetTag("bytes", intUpperLimit) - assert.Equal(0.0, span.Metrics["bytes"]) - assert.Equal(fmt.Sprint(intUpperLimit), span.Meta["bytes"]) + assert.Equal(0.0, span.metrics["bytes"]) + assert.Equal(fmt.Sprint(intUpperLimit), span.meta["bytes"]) }, - "toosmall": func(assert *assert.Assertions, span *span) { + "toosmall": func(assert *assert.Assertions, span *Span) { span.SetTag("bytes", intLowerLimit) - assert.Equal(0.0, span.Metrics["bytes"]) - assert.Equal(fmt.Sprint(intLowerLimit), span.Meta["bytes"]) + assert.Equal(0.0, span.metrics["bytes"]) + assert.Equal(fmt.Sprint(intLowerLimit), span.meta["bytes"]) }, - "finished": func(assert *assert.Assertions, span *span) { + "finished": func(assert *assert.Assertions, span *Span) { span.Finish() span.SetTag("finished.test", 1337) - assert.Equal(6, len(span.Metrics)) - _, ok := span.Metrics["finished.test"] + assert.Equal(6, len(span.metrics)) + _, ok := span.metrics["finished.test"] assert.False(ok) }, } { t.Run(name, func(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.NoError(err) span := tracer.newRootSpan("http.request", "mux.router", "/") tt(assert, span) }) @@ -577,8 +811,9 @@ func TestSpanSetMetric(t *testing.T) { } func TestSpanProfilingTags(t *testing.T) { - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.NoError(t, err) for _, profilerEnabled := range []bool{false, true} { name := fmt.Sprintf("profilerEnabled=%t", profilerEnabled) @@ -587,75 +822,255 @@ func TestSpanProfilingTags(t *testing.T) { defer func() { traceprof.SetProfilerEnabled(oldVal) }() span := tracer.newRootSpan("pylons.request", "pylons", "/") - val, ok := span.Metrics["_dd.profiling.enabled"] + val, ok := span.metrics["_dd.profiling.enabled"] require.Equal(t, true, ok) require.Equal(t, profilerEnabled, val != 0) childSpan := tracer.newChildSpan("my.child", span) - _, ok = childSpan.Metrics["_dd.profiling.enabled"] + _, ok = childSpan.metrics["_dd.profiling.enabled"] require.Equal(t, false, ok) }) } } +func createErrorTrace() error { + return errortrace.New("Something wrong") +} + +func createTestError() error { + return errors.New("Something wrong") +} + +func TestErrorStack(t *testing.T) { + t.Run("with errortrace", func(t *testing.T) { + assert := assert.New(t) + tracer, err := newTracer() + assert.NoError(err) + defer tracer.Stop() + span := tracer.StartSpan("test") + + err = createErrorTrace() + span.SetTag(ext.Error, err) + assert.Equal(int32(1), span.error) + assert.Equal("Something wrong", span.meta[ext.ErrorMsg]) + assert.Equal("*errortrace.TracerError", span.meta[ext.ErrorType]) + + stack := span.meta[ext.ErrorHandlingStack] + assert.NotEqual("", stack) + assert.Contains(stack, "tracer.TestErrorStack") + assert.Contains(stack, "tracer.createErrorTrace") + + span.Finish() + }) + + t.Run("with standard error", func(t *testing.T) { + assert := assert.New(t) + tracer, err := newTracer() + assert.NoError(err) + defer tracer.Stop() + span := tracer.StartSpan("test") + + err = createTestError() + span.SetTag(ext.Error, err) + assert.Equal(int32(1), span.error) + assert.Equal("Something wrong", span.meta[ext.ErrorMsg]) + assert.Equal("*errors.errorString", span.meta[ext.ErrorType]) + + stack := span.meta[ext.ErrorStack] + assert.NotEqual("", stack) + assert.Contains(stack, "tracer.TestErrorStack") + assert.NotContains(stack, "tracer.createTestError") + + span.Finish() + }) +} + func TestSpanError(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) - internal.SetGlobalTracer(tracer) + tracer, err := newTracer(withTransport(newDefaultTransport())) + assert.NoError(err) + setGlobalTracer(tracer) defer tracer.Stop() span := tracer.newRootSpan("pylons.request", "pylons", "/") // check the error is set in the default meta - err := errors.New("Something wrong") + err = errors.New("Something wrong") span.SetTag(ext.Error, err) - assert.Equal(int32(1), span.Error) - assert.Equal("Something wrong", span.Meta[ext.ErrorMsg]) - assert.Equal("*errors.errorString", span.Meta[ext.ErrorType]) - assert.NotEqual("", span.Meta[ext.ErrorStack]) + assert.Equal(int32(1), span.error) + assert.Equal("Something wrong", span.meta[ext.ErrorMsg]) + assert.Equal("*errors.errorString", span.meta[ext.ErrorType]) + assert.NotEqual("", span.meta[ext.ErrorStack]) span.Finish() // operating on a finished span is a no-op span = tracer.newRootSpan("flask.request", "flask", "/") - nMeta := len(span.Meta) + nMeta := len(span.meta) span.Finish() span.SetTag(ext.Error, err) - assert.Equal(int32(0), span.Error) + assert.Equal(int32(0), span.error) // '+3' is `_dd.p.dm` + `_dd.base_service`, `_dd.p.tid` - t.Logf("%q\n", span.Meta) - assert.Equal(nMeta+3, len(span.Meta)) - assert.Equal("", span.Meta[ext.ErrorMsg]) - assert.Equal("", span.Meta[ext.ErrorType]) - assert.Equal("", span.Meta[ext.ErrorStack]) + span.mu.RLock() + defer span.mu.RUnlock() + t.Logf("%q\n", span.meta) + assert.Equal(nMeta+3, len(span.meta)) + assert.Equal("", span.meta[ext.ErrorMsg]) + assert.Equal("", span.meta[ext.ErrorType]) + assert.Equal("", span.meta[ext.ErrorStack]) } func TestSpanError_Typed(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.NoError(err) span := tracer.newRootSpan("pylons.request", "pylons", "/") // check the error is set in the default meta - err := &boomError{} + err = &boomError{} span.SetTag(ext.Error, err) - assert.Equal(int32(1), span.Error) - assert.Equal("boom", span.Meta[ext.ErrorMsg]) - assert.Equal("*tracer.boomError", span.Meta[ext.ErrorType]) - assert.NotEqual("", span.Meta[ext.ErrorStack]) + assert.Equal(int32(1), span.error) + assert.Equal("boom", span.meta[ext.ErrorMsg]) + assert.Equal("*tracer.boomError", span.meta[ext.ErrorType]) + assert.NotEqual("", span.meta[ext.ErrorStack]) } func TestSpanErrorNil(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) - internal.SetGlobalTracer(tracer) + tracer, err := newTracer(withTransport(newDefaultTransport())) + assert.NoError(err) + setGlobalTracer(tracer) defer tracer.Stop() span := tracer.newRootSpan("pylons.request", "pylons", "/") // don't set the error if it's nil - nMeta := len(span.Meta) + nMeta := len(span.meta) span.SetTag(ext.Error, nil) - assert.Equal(int32(0), span.Error) - assert.Equal(nMeta, len(span.Meta)) + assert.Equal(int32(0), span.error) + assert.Equal(nMeta, len(span.meta)) +} + +func TestSpanErrorStackMetrics(t *testing.T) { + // this test is flaky on Windows due to differences in time.Duration + // In order to test as much as we can, we only want to skip over checks for + // time and/or duration. + windows := false + if runtime.GOOS == "windows" { + windows = true + } + + t.Run("debug stack disabled", func(t *testing.T) { + assert := assert.New(t) + var tg statsdtest.TestStatsdClient + + telemetryClient := new(telemetrytest.RecordClient) + telemetryClient.ProductStarted(telemetry.NamespaceTracers) + defer telemetry.MockClient(telemetryClient)() + + tracer, _, _, stop, err := startTestTracer(t, withStatsdClient(&tg), WithDebugStack(false)) + assert.Nil(err) + defer stop() + + tracer.StartSpan("operation").Finish(WithError(errors.New("test"))) + + assert.Equal(0.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:takeStacktrace"}).Get()) + assert.Equal(0.0, telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:takeStacktrace"}).Get()) + + assert.Equal(0.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:TracerError"}).Get()) + assert.Equal(0.0, telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:TracerError"}).Get()) + }) + + t.Run("error:with debugstack", func(t *testing.T) { + assert := assert.New(t) + + telemetryClient := new(telemetrytest.RecordClient) + telemetryClient.ProductStarted(telemetry.NamespaceTracers) + defer telemetry.MockClient(telemetryClient)() + + tracer, _, _, stop, err := startTestTracer(t, WithDebugStack(true)) + assert.Nil(err) + defer stop() + + tracer.StartSpan("operation").Finish(WithError(errors.New("test"))) + + assert.Equal(1.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:takeStacktrace"}).Get()) + if !windows { + assert.Greater(telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:takeStacktrace"}).Get(), 0.0) + } + + assert.Equal(0.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:TracerError"}).Get()) + assert.Equal(0.0, telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:TracerError"}).Get()) + }) + + t.Run("error:multiple spans", func(t *testing.T) { + assert := assert.New(t) + numSpans := 5 + + telemetryClient := new(telemetrytest.RecordClient) + telemetryClient.ProductStarted(telemetry.NamespaceTracers) + defer telemetry.MockClient(telemetryClient)() + + tracer, _, _, stop, err := startTestTracer(t, WithDebugStack(true)) + assert.Nil(err) + defer stop() + + for range numSpans { + tracer.StartSpan("operation").Finish(WithError(errors.New("test"))) + } + + assert.Equal(5.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:takeStacktrace"}).Get()) + if !windows { + assert.Greater(telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:takeStacktrace"}).Get(), 0.0) + } + + assert.Equal(0.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:TracerError"}).Get()) + assert.Equal(0.0, telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:TracerError"}).Get()) + }) + + t.Run("errortrace", func(t *testing.T) { + assert := assert.New(t) + numSpans := 5 + + telemetryClient := new(telemetrytest.RecordClient) + telemetryClient.ProductStarted(telemetry.NamespaceTracers) + defer telemetry.MockClient(telemetryClient)() + + tracer, _, _, stop, err := startTestTracer(t, WithDebugStack(true)) + assert.Nil(err) + defer stop() + + for range numSpans { + tracer.StartSpan("operation").Finish(WithError(errortrace.New("test"))) + } + + assert.Equal(0.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:takeStacktrace"}).Get()) + + assert.Equal(5.0, telemetryClient.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:TracerError"}).Get()) + if !windows { + assert.Greater(telemetryClient.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:TracerError"}).Get(), 0.0) + } + }) +} + +func TestSpanErrorNoStackTrace(t *testing.T) { + t.Run("default", func(t *testing.T) { + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, WithDebugStack(true)) + assert.Nil(err) + defer stop() + + span := tracer.StartSpan("operation") + span.SetTag(ext.ErrorNoStackTrace, errors.New("test")) + span.Finish() + + errStack, _ := getMeta(span, ext.ErrorStack) + errMsg, _ := getMeta(span, ext.ErrorMsg) + errType, _ := getMeta(span, ext.ErrorType) + assert.Equal(int32(1), span.error) + assert.Equal("", errStack) + assert.Equal("test", errMsg) + assert.Equal("*errors.errorString", errType) + }) } func TestUniqueTagKeys(t *testing.T) { @@ -666,20 +1081,21 @@ func TestUniqueTagKeys(t *testing.T) { span.SetTag("foo.bar", 12) span.SetTag("foo.bar", "val") - assert.NotContains(span.Metrics, "foo.bar") - assert.Equal("val", span.Meta["foo.bar"]) + assert.NotContains(span.metrics, "foo.bar") + assert.Equal("val", span.meta["foo.bar"]) // check to see if setMetric correctly wipes out a meta tag span.SetTag("foo.bar", "val") span.SetTag("foo.bar", 12) - assert.Equal(12.0, span.Metrics["foo.bar"]) - assert.NotContains(span.Meta, "foo.bar") + assert.Equal(12.0, span.metrics["foo.bar"]) + assert.NotContains(span.meta, "foo.bar") } // Prior to a bug fix, this failed when running `go test -race` func TestSpanModifyWhileFlushing(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() done := make(chan struct{}) @@ -710,13 +1126,14 @@ func TestSpanModifyWhileFlushing(t *testing.T) { func TestSpanSamplingPriority(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.NoError(err) span := tracer.newRootSpan("my.name", "my.service", "my.resource") - _, ok := span.Metrics[keySamplingPriority] + _, ok := span.metrics[keySamplingPriority] assert.True(ok) - _, ok = span.Metrics[keySamplingPriorityRate] + _, ok = span.metrics[keySamplingPriorityRate] assert.True(ok) for _, priority := range []int{ @@ -726,15 +1143,15 @@ func TestSpanSamplingPriority(t *testing.T) { ext.PriorityUserKeep, 999, // not used, but we should allow it } { - span.SetTag(ext.SamplingPriority, priority) - v, ok := span.Metrics[keySamplingPriority] + span.setSamplingPriority(priority, samplernames.Default) + v, ok := span.metrics[keySamplingPriority] assert.True(ok) assert.EqualValues(priority, v) assert.EqualValues(*span.context.trace.priority, v) childSpan := tracer.newChildSpan("my.child", span) - v0, ok0 := span.Metrics[keySamplingPriority] - v1, ok1 := childSpan.Metrics[keySamplingPriority] + v0, ok0 := span.metrics[keySamplingPriority] + v1, ok1 := childSpan.metrics[keySamplingPriority] assert.Equal(ok0, ok1) assert.Equal(v0, v1) assert.EqualValues(*childSpan.context.trace.priority, v0) @@ -745,47 +1162,52 @@ func TestSpanLog(t *testing.T) { // this test is executed multiple times to ensure we clean up global state correctly noServiceTest := func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) } t.Run("noservice_first", noServiceTest) t.Run("default", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`dd.service=tracer.test dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) t.Run("env", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) t.Run("version", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) t.Run("full", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -794,10 +1216,11 @@ func TestSpanLog(t *testing.T) { t.Run("subservice", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request", ServiceName("subservice name")).(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request", ServiceName("subservice name")) + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -806,29 +1229,32 @@ func TestSpanLog(t *testing.T) { t.Setenv("DD_VERSION", "1.2.3") t.Setenv("DD_ENV", "testenv") assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) t.Run("badformat", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - expect := fmt.Sprintf(`%%!b(ddtrace.Span=dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0")`, span.TraceID, span.SpanID) + span := tracer.StartSpan("test.request") + expect := fmt.Sprintf(`%%!b(tracer.Span=dd.service=tracer.test dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0")`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%b", span)) }) t.Run("notracer/options", func(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) - span := tracer.StartSpan("test.request").(*span) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithServiceVersion("1.2.3"), WithEnv("testenv")) + assert.Nil(err) + span := tracer.StartSpan("test.request") stop() // no service, env, or version after the tracer is stopped - expect := fmt.Sprintf(`dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + expect := fmt.Sprintf(`dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) @@ -837,42 +1263,40 @@ func TestSpanLog(t *testing.T) { t.Setenv("DD_VERSION", "1.2.3") t.Setenv("DD_ENV", "testenv") assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t) - span := tracer.StartSpan("test.request").(*span) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) + span := tracer.StartSpan("test.request") stop() // service is not included: it is cleared when we stop the tracer // env, version are included: it reads the environment variable when there is no tracer - expect := fmt.Sprintf(`dd.env=testenv dd.version=1.2.3 dd.trace_id="%d" dd.span_id="%d" dd.parent_id="0"`, span.TraceID, span.SpanID) + expect := fmt.Sprintf(`dd.env=testenv dd.version=1.2.3 dd.trace_id="%s" dd.span_id="%d" dd.parent_id="0"`, span.context.TraceID(), span.spanID) assert.Equal(expect, fmt.Sprintf("%v", span)) }) - t.Run("128-bit-generation-only", func(t *testing.T) { - // Generate 128 bit trace ids, but don't log them. So only the lower - // 64 bits should be logged in decimal form. - // DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is true by default - // DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED is false by default + t.Run("128-bit-logging-default", func(t *testing.T) { + // Generate and log 128 bit trace ids by default assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - span.TraceID = 12345678 - span.SpanID = 87654321 + span := tracer.StartSpan("test.request") + span.spanID = 87654321 span.Finish() - expect := `dd.service=tracer.test dd.env=testenv dd.trace_id="12345678" dd.span_id="87654321" dd.parent_id="0"` + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id=%q dd.span_id="87654321" dd.parent_id="0"`, span.context.TraceID()) assert.Equal(expect, fmt.Sprintf("%v", span)) }) t.Run("128-bit-logging-only", func(t *testing.T) { - // Logging 128-bit trace ids is enabled, but it's not present in + // Logging 128-bit trace ids is enabled, but 128bit format is not present in // the span. So only the lower 64 bits should be logged in decimal form. t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - span.TraceID = 12345678 - span.SpanID = 87654321 + span := tracer.StartSpan("test.request") + span.traceID = 12345678 + span.spanID = 87654321 span.Finish() expect := `dd.service=tracer.test dd.env=testenv dd.trace_id="12345678" dd.span_id="87654321" dd.parent_id="0"` assert.Equal(expect, fmt.Sprintf("%v", span)) @@ -884,69 +1308,87 @@ func TestSpanLog(t *testing.T) { t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "true") t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request").(*span) - span.SpanID = 87654321 + span := tracer.StartSpan("test.request") + span.spanID = 87654321 span.Finish() - expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id=%q dd.span_id="87654321" dd.parent_id="0"`, span.context.TraceID128()) + expect := fmt.Sprintf(`dd.service=tracer.test dd.env=testenv dd.trace_id=%q dd.span_id="87654321" dd.parent_id="0"`, span.context.TraceID()) assert.Equal(expect, fmt.Sprintf("%v", span)) - v, _ := span.context.meta(keyTraceID128) + v, _ := getMeta(span, keyTraceID128) assert.NotEmpty(v) }) t.Run("128-bit-logging-with-small-upper-bits", func(t *testing.T) { // Logging 128-bit trace ids is enabled, and a 128-bit trace id, so // a quoted 32 byte hex string should be printed for the dd.trace_id. - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request", WithSpanID(87654321)).(*span) + span := tracer.StartSpan("test.request", WithSpanID(87654321)) span.context.traceID.SetUpper(1) span.Finish() assert.Equal(`dd.service=tracer.test dd.env=testenv dd.trace_id="00000000000000010000000005397fb1" dd.span_id="87654321" dd.parent_id="0"`, fmt.Sprintf("%v", span)) - v, _ := span.context.meta(keyTraceID128) + v, _ := getMeta(span, keyTraceID128) assert.Equal("0000000000000001", v) }) t.Run("128-bit-logging-with-empty-upper-bits", func(t *testing.T) { - // Logging 128-bit trace ids is enabled, and but the upper 64 bits + // Logging 128-bit trace ids is enabled, but the upper 64 bits // are empty, so the dd.trace_id should be printed as raw digits (not hex). - t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "true") t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + assert.Nil(err) defer stop() - span := tracer.StartSpan("test.request", WithSpanID(87654321)).(*span) + span := tracer.StartSpan("test.request", WithSpanID(87654321)) span.Finish() assert.False(span.context.traceID.HasUpper()) // it should not have generated upper bits assert.Equal(`dd.service=tracer.test dd.env=testenv dd.trace_id="87654321" dd.span_id="87654321" dd.parent_id="0"`, fmt.Sprintf("%v", span)) - v, _ := span.context.meta(keyTraceID128) + v, _ := getMeta(span, keyTraceID128) assert.Equal("", v) }) + + t.Run("128-bit-logging-disabled", func(t *testing.T) { + // Only the lower 64 bits should be logged in decimal form. + // DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED is true by default + t.Setenv("DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED", "false") + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t, WithService("tracer.test"), WithEnv("testenv")) + defer stop() + assert.Nil(err) + span := tracer.StartSpan("test.request") + span.traceID = 12345678 + span.spanID = 87654321 + span.Finish() + expect := `dd.service=tracer.test dd.env=testenv dd.trace_id="12345678" dd.span_id="87654321" dd.parent_id="0"` + assert.Equal(expect, fmt.Sprintf("%v", span)) + }) } func TestRootSpanAccessor(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() t.Run("nil-span", func(t *testing.T) { - var s *span + var s *Span require.Nil(t, s.Root()) }) t.Run("single-span", func(t *testing.T) { sp := tracer.StartSpan("root") - require.Equal(t, sp, sp.(*span).Root()) + require.Equal(t, sp, sp.Root()) sp.Finish() }) t.Run("single-span-finished", func(t *testing.T) { sp := tracer.StartSpan("root") sp.Finish() - require.Equal(t, sp, sp.(*span).Root()) + require.Equal(t, sp, sp.Root()) }) t.Run("root-with-children", func(t *testing.T) { @@ -961,11 +1403,11 @@ func TestRootSpanAccessor(t *testing.T) { child211 := tracer.StartSpan("child2.1.1", ChildOf(child21.Context())) defer child211.Finish() - require.Equal(t, root, root.(*span).Root()) - require.Equal(t, root, child1.(*span).Root()) - require.Equal(t, root, child2.(*span).Root()) - require.Equal(t, root, child21.(*span).Root()) - require.Equal(t, root, child211.(*span).Root()) + require.Equal(t, root, root.Root()) + require.Equal(t, root, child1.Root()) + require.Equal(t, root, child2.Root()) + require.Equal(t, root, child21.Root()) + require.Equal(t, root, child211.Root()) }) t.Run("root-finished-with-children", func(t *testing.T) { @@ -980,17 +1422,18 @@ func TestRootSpanAccessor(t *testing.T) { child211 := tracer.StartSpan("child2.1.1", ChildOf(child21.Context())) defer child211.Finish() - require.Equal(t, root, root.(*span).Root()) - require.Equal(t, root, child1.(*span).Root()) - require.Equal(t, root, child2.(*span).Root()) - require.Equal(t, root, child21.(*span).Root()) - require.Equal(t, root, child211.(*span).Root()) + require.Equal(t, root, root.Root()) + require.Equal(t, root, child1.Root()) + require.Equal(t, root, child2.Root()) + require.Equal(t, root, child21.Root()) + require.Equal(t, root, child211.Root()) }) } func TestSpanStartAndFinishLogs(t *testing.T) { tp := new(log.RecordLogger) - tracer, _, _, stop := startTestTracer(t, WithLogger(tp), WithDebugMode(true)) + tracer, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithDebugMode(true)) + assert.Nil(t, err) defer stop() span := tracer.StartSpan("op") @@ -1013,22 +1456,64 @@ func TestSpanStartAndFinishLogs(t *testing.T) { } func TestSetUserPropagatedUserID(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() // Service 1, create span with propagated user s := tracer.StartSpan("op") - s.(*span).SetUser("userino", WithPropagation()) + s.SetUser("userino", WithPropagation()) m := make(map[string]string) - err := tracer.Inject(s.Context(), TextMapCarrier(m)) + err = tracer.Inject(s.Context(), TextMapCarrier(m)) require.NoError(t, err) // Service 2, extract user c, err := tracer.Extract(TextMapCarrier(m)) require.NoError(t, err) s = tracer.StartSpan("op", ChildOf(c)) - s.(*span).SetUser("userino") - assert.True(t, s.(*span).context.updated) + s.SetUser("userino") + assert.True(t, s.context.updated) +} + +func TestStartChild(t *testing.T) { + t.Run("own-service", func(t *testing.T) { + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) + defer stop() + root := tracer.StartSpan("web.request", ServiceName("root-service")) + child := root.StartChild("db.query", ServiceName("child-service"), WithSpanID(1337)) + + assert.NotEqual(uint64(0), child.traceID) + assert.NotEqual(uint64(0), child.spanID) + assert.Equal(root.spanID, child.parentID) + assert.Equal(root.traceID, child.parentID) + assert.Equal(root.traceID, child.traceID) + assert.Equal(uint64(1337), child.spanID) + assert.Equal("child-service", child.service) + + // the root and child are both marked as "top level" + assert.Equal(1.0, root.metrics[keyTopLevel]) + assert.Equal(1.0, child.metrics[keyTopLevel]) + }) + + t.Run("inherit-service", func(t *testing.T) { + assert := assert.New(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) + defer stop() + root := tracer.StartSpan("web.request", ServiceName("root-service")) + child := root.StartChild("db.query") + + assert.NotEqual(uint64(0), child.traceID) + assert.NotEqual(uint64(0), child.spanID) + assert.Equal(root.spanID, child.parentID) + + assert.Equal("root-service", child.service) + // the root is marked as "top level", but the child is not + assert.Equal(1.0, root.metrics[keyTopLevel]) + assert.NotContains(child.metrics, keyTopLevel) + }) } func BenchmarkSetTagMetric(b *testing.B) { @@ -1087,6 +1572,27 @@ func BenchmarkSetTagField(b *testing.B) { } } +func BenchmarkSerializeSpanLinksInMeta(b *testing.B) { + span := newBasicSpan("bench.span") + + span.AddLink(SpanLink{SpanID: 123, TraceID: 456}) + span.AddLink(SpanLink{SpanID: 789, TraceID: 101}) + + // Sample span pointer + attributes := map[string]string{ + "link.kind": "span-pointer", + "ptr.dir": "d", + "ptr.hash": "eb29cb7d923f904f02bd8b3d85e228ed", + "ptr.kind": "aws.s3.object", + } + span.AddLink(SpanLink{TraceID: 0, SpanID: 0, Attributes: attributes}) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + span.serializeSpanLinksInMeta() + } +} + type boomError struct{} func (e *boomError) Error() string { return "boom" } @@ -1107,7 +1613,8 @@ func TestConcurrentSpanSetTag(t *testing.T) { } func testConcurrentSpanSetTag(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithSamplingRules([]SamplingRule{NameRule("root", 1.0)})) + tracer, _, _, stop, err := startTestTracer(t, WithSamplingRules(SpanSamplingRules(Rule{NameGlob: "root", Rate: 1.0}))) + assert.NoError(t, err) defer stop() span := tracer.StartSpan("root") @@ -1128,3 +1635,137 @@ func testConcurrentSpanSetTag(t *testing.T) { } wg.Wait() } + +func TestSpanLinksInMeta(t *testing.T) { + t.Run("no_links", func(t *testing.T) { + tracer, err := newTracer() + require.NoError(t, err) + defer tracer.Stop() + + sp := tracer.StartSpan("test-no-links") + sp.Finish() + + internalSpan := sp + _, ok := internalSpan.meta["_dd.span_links"] + assert.False(t, ok, "Expected no _dd.span_links in Meta.") + }) + + t.Run("with_links", func(t *testing.T) { + tracer, err := newTracer() + require.NoError(t, err) + defer tracer.Stop() + + sp := tracer.StartSpan("test-with-links") + + sp.AddLink(SpanLink{SpanID: 123, TraceID: 456}) + sp.AddLink(SpanLink{SpanID: 789, TraceID: 012}) + sp.Finish() + + internalSpan := sp + raw, ok := internalSpan.meta["_dd.span_links"] + require.True(t, ok, "Expected _dd.span_links in Meta after adding links.") + + var links []SpanLink + err = json.Unmarshal([]byte(raw), &links) + require.NoError(t, err, "Failed to unmarshal links JSON") + require.Len(t, links, 2, "Expected 2 links in _dd.span_links JSON") + + assert.Equal(t, uint64(123), links[0].SpanID) + assert.Equal(t, uint64(456), links[0].TraceID) + assert.Equal(t, uint64(789), links[1].SpanID) + assert.Equal(t, uint64(012), links[1].TraceID) + }) +} + +func TestStatsAfterFinish(t *testing.T) { + t.Run("peerServiceDefaults-enabled", func(t *testing.T) { + tracer, err := newTracer( + WithPeerServiceDefaults(true), + WithStatsComputation(true), + ) + assert.NoError(t, err) + defer tracer.Stop() + setGlobalTracer(tracer) + + transport := newDummyTransport() + tracer.config.transport = transport + tracer.config.agent.Stats = true + tracer.config.agent.DropP0s = true + tracer.config.agent.peerTags = []string{"peer.service"} + + c := newConcentrator(tracer.config, (10 * time.Second).Nanoseconds(), &statsd.NoOpClientDirect{}) + assert.Len(t, transport.Stats(), 0) + c.Start() + tracer.stats.Stop() + tracer.stats = c + + sp := tracer.StartSpan("sp1") + sp.SetTag("span.kind", "client") + sp.SetTag("messaging.system", "kafka") + sp.SetTag("messaging.kafka.bootstrap.servers", "kafka-cluster") + sp.SetTag(keyMeasured, 1) + sp.Finish() + + peerService, _ := getMeta(sp, "peer.service") + assert.Equal(t, "kafka-cluster", peerService) + + // peer.service has been added on the span.Finish() call. Ensure the StatSpan is also accessing this. + c.Stop() + stats := transport.Stats() + assert.Equal(t, 1, len(stats)) + peerTags := stats[0].Stats[0].Stats[0].PeerTags + assert.Contains(t, peerTags, "peer.service:kafka-cluster") + }) + t.Run("peerServiceDefaults-disabled", func(t *testing.T) { + tracer, err := newTracer( + WithPeerServiceDefaults(false), + WithStatsComputation(true), + ) + assert.NoError(t, err) + defer tracer.Stop() + setGlobalTracer(tracer) + + transport := newDummyTransport() + tracer.config.transport = transport + tracer.config.agent.Stats = true + tracer.config.agent.DropP0s = true + tracer.config.agent.peerTags = []string{"peer.service"} + + c := newConcentrator(tracer.config, (10 * time.Second).Nanoseconds(), &statsd.NoOpClientDirect{}) + assert.Len(t, transport.Stats(), 0) + c.Start() + tracer.stats.Stop() + tracer.stats = c + + sp := tracer.StartSpan("sp1") + sp.SetTag("span.kind", "client") + sp.SetTag("messaging.system", "kafka") + sp.SetTag("messaging.kafka.bootstrap.servers", "kafka-cluster") + sp.SetTag(keyMeasured, 1) + sp.Finish() + + _, ok := getMeta(sp, "peer.service") + assert.False(t, ok) + + c.Stop() + stats := transport.Stats() + assert.Equal(t, 1, len(stats)) + peerTags := stats[0].Stats[0].Stats[0].PeerTags + assert.Empty(t, peerTags) + }) +} + +func TestSpanErrorStackNoDebugStackInteraction(t *testing.T) { + tracer, err := newTracer() + require.NoError(t, err) + defer tracer.Stop() + + sp := tracer.StartSpan("test-error-stack") + sp.SetTag("error.stack", "boom") + sp.Finish( + WithError(errors.New("test error")), + NoDebugStack(), + ) + errorStack, _ := getMeta(sp, "error.stack") + assert.Equal(t, "boom", errorStack) +} diff --git a/ddtrace/tracer/spancontext.go b/ddtrace/tracer/spancontext.go index 29da1b80b1..aeee388b1f 100644 --- a/ddtrace/tracer/spancontext.go +++ b/ddtrace/tracer/spancontext.go @@ -15,17 +15,18 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - ginternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - sharedinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal/tracerstats" + sharedinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) -var _ ddtrace.SpanContext = (*spanContext)(nil) +const TraceIDZero string = "00000000000000000000000000000000" + +var _ ddtrace.SpanContext = (*SpanContext)(nil) type traceID [16]byte // traceID in big endian, i.e. @@ -65,7 +66,6 @@ func (t *traceID) Empty() bool { } func (t *traceID) HasUpper() bool { - //TODO: in go 1.20 we can simplify this for _, b := range t[:8] { if b != 0 { return true @@ -82,14 +82,14 @@ func (t *traceID) UpperHex() string { // and across process boundaries. It contains all the information needed to // spawn a direct descendant of the span that it belongs to. It can be used // to create distributed tracing by propagating it using the provided interfaces. -type spanContext struct { +type SpanContext struct { updated bool // updated is tracking changes for priority / origin / x-datadog-tags // the below group should propagate only locally - trace *trace // reference to the trace that this span belongs too - span *span // reference to the span that hosts this context - errors int32 // number of spans with errors in this trace + trace *trace // reference to the trace that this span belongs too + span *Span // reference to the span that hosts this context + errors atomic.Int32 // number of spans with errors in this trace // The 16-character hex string of the last seen Datadog Span ID // this value will be added as the _dd.parent_id tag to spans @@ -111,6 +111,43 @@ type spanContext struct { baggage map[string]string hasBaggage uint32 // atomic int for quick checking presence of baggage. 0 indicates no baggage, otherwise baggage exists. origin string // e.g. "synthetics" + + spanLinks []SpanLink // links to related spans in separate|external|disconnected traces + baggageOnly bool // when true, indicates this context only propagates baggage items and should not be used for distributed tracing fields +} + +// Private interface for converting v1 span contexts to v2 ones. +type spanContextV1Adapter interface { + SamplingDecision() uint32 + Origin() string + Priority() *float64 + PropagatingTags() map[string]string + Tags() map[string]string +} + +// FromGenericCtx converts a ddtrace.SpanContext to a *SpanContext, which can be used +// to start child spans. +func FromGenericCtx(c ddtrace.SpanContext) *SpanContext { + var sc SpanContext + sc.traceID = c.TraceIDBytes() + sc.spanID = c.SpanID() + sc.baggage = make(map[string]string) + c.ForeachBaggageItem(func(k, v string) bool { + sc.hasBaggage = 1 + sc.baggage[k] = v + return true + }) + ctx, ok := c.(spanContextV1Adapter) + if !ok { + return &sc + } + sc.origin = ctx.Origin() + sc.trace = newTrace() + sc.trace.priority = ctx.Priority() + sc.trace.samplingDecision = samplingDecision(ctx.SamplingDecision()) + sc.trace.tags = ctx.Tags() + sc.trace.propagatingTags = ctx.PropagatingTags() + return &sc } // newSpanContext creates a new SpanContext to serve as context for the given @@ -118,18 +155,20 @@ type spanContext struct { // baggage and other values from it. This method also pushes the span into the // new context's trace and as a result, it should not be called multiple times // for the same span. -func newSpanContext(span *span, parent *spanContext) *spanContext { - context := &spanContext{ - spanID: span.SpanID, +func newSpanContext(span *Span, parent *SpanContext) *SpanContext { + context := &SpanContext{ + spanID: span.spanID, span: span, } - context.traceID.SetLower(span.TraceID) + context.traceID.SetLower(span.traceID) if parent != nil { - context.traceID.SetUpper(parent.traceID.Upper()) - context.trace = parent.trace - context.origin = parent.origin - context.errors = parent.errors + if !parent.baggageOnly { + context.traceID.SetUpper(parent.traceID.Upper()) + context.trace = parent.trace + context.origin = parent.origin + context.errors.Store(parent.errors.Load()) + } parent.ForeachBaggageItem(func(k, v string) bool { context.setBaggageItem(k, v) return true @@ -137,7 +176,7 @@ func newSpanContext(span *span, parent *spanContext) *spanContext { } else if sharedinternal.BoolEnv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", true) { // add 128 bit trace id, if enabled, formatted as big-endian: // <32-bit unix seconds> <32 bits of zero> <64 random bits> - id128 := time.Duration(span.Start) / time.Second + id128 := time.Duration(span.start) / time.Second // casting from int64 -> uint32 should be safe since the start time won't be // negative, and the seconds should fit within 32-bits for the foreseeable future. // (We only want 32 bits of time, then the rest is zero) @@ -161,26 +200,57 @@ func newSpanContext(span *span, parent *spanContext) *spanContext { } // SpanID implements ddtrace.SpanContext. -func (c *spanContext) SpanID() uint64 { return c.spanID } +func (c *SpanContext) SpanID() uint64 { + if c == nil { + return 0 + } + return c.spanID +} // TraceID implements ddtrace.SpanContext. -func (c *spanContext) TraceID() uint64 { return c.traceID.Lower() } - -// TraceID128 implements ddtrace.SpanContextW3C. -func (c *spanContext) TraceID128() string { +func (c *SpanContext) TraceID() string { if c == nil { - return "" + return TraceIDZero } return c.traceID.HexEncoded() } -// TraceID128Bytes implements ddtrace.SpanContextW3C. -func (c *spanContext) TraceID128Bytes() [16]byte { +// TraceIDBytes implements ddtrace.SpanContext. +func (c *SpanContext) TraceIDBytes() [16]byte { + if c == nil { + return emptyTraceID + } return c.traceID } +// TraceIDLower implements ddtrace.SpanContext. +func (c *SpanContext) TraceIDLower() uint64 { + if c == nil { + return 0 + } + return c.traceID.Lower() +} + +// TraceIDUpper implements ddtrace.SpanContext. +func (c *SpanContext) TraceIDUpper() uint64 { + if c == nil { + return 0 + } + return c.traceID.Upper() +} + +// SpanLinks implements ddtrace.SpanContext +func (c *SpanContext) SpanLinks() []SpanLink { + cp := make([]SpanLink, len(c.spanLinks)) + copy(cp, c.spanLinks) + return cp +} + // ForeachBaggageItem implements ddtrace.SpanContext. -func (c *spanContext) ForeachBaggageItem(handler func(k, v string) bool) { +func (c *SpanContext) ForeachBaggageItem(handler func(k, v string) bool) { + if c == nil { + return + } if atomic.LoadUint32(&c.hasBaggage) == 0 { return } @@ -194,7 +264,7 @@ func (c *spanContext) ForeachBaggageItem(handler func(k, v string) bool) { } // sets the sampling priority and decision maker (based on `sampler`). -func (c *spanContext) setSamplingPriority(p int, sampler samplernames.SamplerName) { +func (c *SpanContext) setSamplingPriority(p int, sampler samplernames.SamplerName) { if c.trace == nil { c.trace = newTrace() } @@ -204,14 +274,25 @@ func (c *spanContext) setSamplingPriority(p int, sampler samplernames.SamplerNam } } -func (c *spanContext) SamplingPriority() (p int, ok bool) { +// forceSetSamplingPriority sets (and forces if the trace is locked) the sampling priority and decision maker (based on `sampler`). +func (c *SpanContext) forceSetSamplingPriority(p int, sampler samplernames.SamplerName) { if c.trace == nil { + c.trace = newTrace() + } + if c.trace.forceSetSamplingPriority(p, sampler) { + // the trace's sampling priority or sampler was updated: mark this as updated + c.updated = true + } +} + +func (c *SpanContext) SamplingPriority() (p int, ok bool) { + if c == nil || c.trace == nil { return 0, false } return c.trace.samplingPriority() } -func (c *spanContext) setBaggageItem(key, val string) { +func (c *SpanContext) setBaggageItem(key, val string) { c.mu.Lock() defer c.mu.Unlock() if c.baggage == nil { @@ -221,7 +302,7 @@ func (c *spanContext) setBaggageItem(key, val string) { c.baggage[key] = val } -func (c *spanContext) baggageItem(key string) string { +func (c *SpanContext) baggageItem(key string) string { if atomic.LoadUint32(&c.hasBaggage) == 0 { return "" } @@ -230,15 +311,27 @@ func (c *spanContext) baggageItem(key string) string { return c.baggage[key] } -func (c *spanContext) meta(key string) (val string, ok bool) { - c.span.RLock() - defer c.span.RUnlock() - val, ok = c.span.Meta[key] - return val, ok -} - // finish marks this span as finished in the trace. -func (c *spanContext) finish() { c.trace.finishedOne(c.span) } +func (c *SpanContext) finish() { c.trace.finishedOne(c.span) } + +// safeDebugString returns a safe string representation of the SpanContext for debug logging. +// It excludes potentially sensitive data like baggage contents while preserving useful debugging information. +func (c *SpanContext) safeDebugString() string { + if c == nil { + return "" + } + + hasBaggage := atomic.LoadUint32(&c.hasBaggage) != 0 + var baggageCount int + if hasBaggage { + c.mu.RLock() + baggageCount = len(c.baggage) + c.mu.RUnlock() + } + + return fmt.Sprintf("SpanContext{traceID=%s, spanID=%d, hasBaggage=%t, baggageCount=%d, origin=%q, updated=%t, isRemote=%t, baggageOnly=%t}", + c.TraceID(), c.SpanID(), hasBaggage, baggageCount, c.origin, c.updated, c.isRemote, c.baggageOnly) +} // samplingDecision is the decision to send a trace to the agent or not. type samplingDecision uint32 @@ -258,7 +351,7 @@ const ( // trace, if these exist. type trace struct { mu sync.RWMutex // guards below fields - spans []*span // all the spans that are part of this trace + spans []*Span // all the spans that are part of this trace tags map[string]string // trace level tags propagatingTags map[string]string // trace level tags that will be propagated across service boundaries finished int // the number of finished spans @@ -270,7 +363,7 @@ type trace struct { // root specifies the root of the trace, if known; it is nil when a span // context is extracted from a carrier, at which point there are no spans in // the trace yet. - root *span + root *Span } var ( @@ -290,7 +383,7 @@ var ( // newTrace creates a new trace using the given callback which will be called // upon completion of the trace. func newTrace() *trace { - return &trace{spans: make([]*span, 0, traceStartSize)} + return &trace{spans: make([]*Span, 0, traceStartSize)} } func (t *trace) samplingPriorityLocked() (p int, ok bool) { @@ -314,6 +407,14 @@ func (t *trace) setSamplingPriority(p int, sampler samplernames.SamplerName) boo return t.setSamplingPriorityLocked(p, sampler) } +// forceSetSamplingPriority forces the sampling priority and the decision maker +// and returns true if it was modified. +func (t *trace) forceSetSamplingPriority(p int, sampler samplernames.SamplerName) bool { + t.mu.Lock() + defer t.mu.Unlock() + return t.setSamplingPriorityLockedWithForce(p, sampler, true) +} + func (t *trace) keep() { atomic.CompareAndSwapUint32((*uint32)(&t.samplingDecision), uint32(decisionNone), uint32(decisionKeep)) } @@ -339,8 +440,13 @@ func samplerToDM(sampler samplernames.SamplerName) string { return "-" + strconv.Itoa(int(sampler)) } -func (t *trace) setSamplingPriorityLocked(p int, sampler samplernames.SamplerName) bool { - if t.locked { +// setSamplingPriority sets the sampling priority and the decision maker +// and returns true if it was modified. +// +// The force parameter is used to bypass the locked sampling decision check +// when setting the sampling priority. This is used to apply a manual keep or drop decision. +func (t *trace) setSamplingPriorityLockedWithForce(p int, sampler samplernames.SamplerName, force bool) bool { + if t.locked && !force { return false } @@ -373,6 +479,10 @@ func (t *trace) setSamplingPriorityLocked(p int, sampler samplernames.SamplerNam return updatedPriority } +func (t *trace) setSamplingPriorityLocked(p int, sampler samplernames.SamplerName) bool { + return t.setSamplingPriorityLockedWithForce(p, sampler, false) +} + func (t *trace) isLocked() bool { t.mu.RLock() defer t.mu.RUnlock() @@ -387,50 +497,47 @@ func (t *trace) setLocked(locked bool) { // push pushes a new span into the trace. If the buffer is full, it returns // a errBufferFull error. -func (t *trace) push(sp *span) { +func (t *trace) push(sp *Span) { t.mu.Lock() defer t.mu.Unlock() if t.full { return } - tr, haveTracer := internal.GetGlobalTracer().(*tracer) + tr := getGlobalTracer() if len(t.spans) >= traceMaxSize { // capacity is reached, we will not be able to complete this trace. t.full = true - t.spans = nil // GC - log.Error("trace buffer full (%d), dropping trace", traceMaxSize) - if haveTracer { - atomic.AddUint32(&tr.tracesDropped, 1) + t.spans = nil // allow our spans to be collected by GC. + log.Error("trace buffer full (%d spans), dropping trace", traceMaxSize) + if tr != nil { + tracerstats.Signal(tracerstats.TracesDropped, 1) } return } - if v, ok := sp.Metrics[keySamplingPriority]; ok { + if v, ok := sp.metrics[keySamplingPriority]; ok { t.setSamplingPriorityLocked(int(v), samplernames.Unknown) } t.spans = append(t.spans, sp) - if haveTracer { - atomic.AddUint32(&tr.spansStarted, 1) + if tr != nil { + tracerstats.Signal(tracerstats.SpanStarted, 1) } } // setTraceTags sets all "trace level" tags on the provided span // t must already be locked. -func (t *trace) setTraceTags(s *span, tr *tracer) { +func (t *trace) setTraceTags(s *Span) { for k, v := range t.tags { s.setMeta(k, v) } for k, v := range t.propagatingTags { s.setMeta(k, v) } - for k, v := range ginternal.GetTracerGitMetadataTags() { + for k, v := range sharedinternal.GetTracerGitMetadataTags() { s.setMeta(k, v) } if s.context != nil && s.context.traceID.HasUpper() { s.setMeta(keyTraceID128, s.context.traceID.UpperHex()) } - if hn := tr.hostname(); hn != "" { - s.setMeta(keyTracerHostname, hn) - } } // finishedOne acknowledges that another span in the trace has finished, and checks @@ -438,7 +545,7 @@ func (t *trace) setTraceTags(s *span, tr *tracer) { // the given priority, if non-nil, to mark the root span. This also will trigger a partial flush // if enabled and the total number of finished spans is greater than or equal to the partial flush limit. // The provided span must be locked. -func (t *trace) finishedOne(s *span) { +func (t *trace) finishedOne(s *Span) { t.mu.Lock() defer t.mu.Unlock() s.finished = true @@ -452,16 +559,17 @@ func (t *trace) finishedOne(s *span) { return } t.finished++ - tr, ok := internal.GetGlobalTracer().(*tracer) - if !ok { + tr := getGlobalTracer() + if tr == nil { return } - setPeerService(s, tr.config) + tc := tr.TracerConf() + setPeerService(s, tc) // attach the _dd.base_service tag only when the globally configured service name is different from the // span service name. - if s.Service != "" && !strings.EqualFold(s.Service, tr.config.serviceName) { - s.Meta[keyBaseService] = tr.config.serviceName + if s.service != "" && !strings.EqualFold(s.service, tc.ServiceTag) { + s.meta[keyBaseService] = tc.ServiceTag } if s == t.root && t.priority != nil { // after the root has finished we lock down the priority; @@ -476,26 +584,34 @@ func (t *trace) finishedOne(s *span) { // TODO(barbayar): make sure this doesn't happen in vain when switching to // the new wire format. We won't need to set the tags on the first span // in the chunk there. - t.setTraceTags(s, tr) + t.setTraceTags(s) + } + + // This is here to support the mocktracer. It would be nice to be able to not do this. + // We need to track when any single span is finished. + if mtr, ok := tr.(interface{ FinishSpan(*Span) }); ok { + mtr.FinishSpan(s) } if len(t.spans) == t.finished { // perform a full flush of all spans - t.finishChunk(tr, &chunk{ - spans: t.spans, - willSend: decisionKeep == samplingDecision(atomic.LoadUint32((*uint32)(&t.samplingDecision))), - }) + if tr, ok := tr.(*tracer); ok { + t.finishChunk(tr, &chunk{ + spans: t.spans, + willSend: decisionKeep == samplingDecision(atomic.LoadUint32((*uint32)(&t.samplingDecision))), + }) + } t.spans = nil return } - doPartialFlush := tr.config.partialFlushEnabled && t.finished >= tr.config.partialFlushMinSpans + doPartialFlush := tc.PartialFlush && t.finished >= tc.PartialFlushMinSpans if !doPartialFlush { return // The trace hasn't completed and partial flushing will not occur } log.Debug("Partial flush triggered with %d finished spans", t.finished) - telemetry.GlobalClient.Count(telemetry.NamespaceTracers, "trace_partial_flush.count", 1, []string{"reason:large_trace"}, true) - finishedSpans := make([]*span, 0, t.finished) - leftoverSpans := make([]*span, 0, len(t.spans)-t.finished) + telemetry.Count(telemetry.NamespaceTracers, "trace_partial_flush.count", []string{"reason:large_trace"}).Submit(1) + finishedSpans := make([]*Span, 0, t.finished) + leftoverSpans := make([]*Span, 0, len(t.spans)-t.finished) for _, s2 := range t.spans { if s2.finished { finishedSpans = append(finishedSpans, s2) @@ -503,60 +619,118 @@ func (t *trace) finishedOne(s *span) { leftoverSpans = append(leftoverSpans, s2) } } - // TODO: (Support MetricKindDist) Re-enable these when we actually support `MetricKindDist` - //telemetry.GlobalClient.Record(telemetry.NamespaceTracers, telemetry.MetricKindDist, "trace_partial_flush.spans_closed", float64(len(finishedSpans)), nil, true) - //telemetry.GlobalClient.Record(telemetry.NamespaceTracers, telemetry.MetricKindDist, "trace_partial_flush.spans_remaining", float64(len(leftoverSpans)), nil, true) + telemetry.Distribution(telemetry.NamespaceTracers, "trace_partial_flush.spans_closed", nil).Submit(float64(len(finishedSpans))) + telemetry.Distribution(telemetry.NamespaceTracers, "trace_partial_flush.spans_remaining", nil).Submit(float64(len(leftoverSpans))) finishedSpans[0].setMetric(keySamplingPriority, *t.priority) if s != t.spans[0] { // Make sure the first span in the chunk has the trace-level tags - t.setTraceTags(finishedSpans[0], tr) + t.setTraceTags(finishedSpans[0]) + } + if tr, ok := tr.(*tracer); ok { + t.finishChunk(tr, &chunk{ + spans: finishedSpans, + willSend: decisionKeep == samplingDecision(atomic.LoadUint32((*uint32)(&t.samplingDecision))), + }) } - t.finishChunk(tr, &chunk{ - spans: finishedSpans, - willSend: decisionKeep == samplingDecision(atomic.LoadUint32((*uint32)(&t.samplingDecision))), - }) t.spans = leftoverSpans } func (t *trace) finishChunk(tr *tracer, ch *chunk) { - atomic.AddUint32(&tr.spansFinished, uint32(len(ch.spans))) - tr.pushChunk(ch) + tr.submitChunk(ch) t.finished = 0 // important, because a buffer can be used for several flushes } // setPeerService sets the peer.service, _dd.peer.service.source, and _dd.peer.service.remapped_from // tags as applicable for the given span. -func setPeerService(s *span, cfg *config) { - if _, ok := s.Meta[ext.PeerService]; ok { // peer.service already set on the span +func setPeerService(s *Span, tc TracerConf) { + spanKind := s.meta[ext.SpanKind] + isOutboundRequest := spanKind == ext.SpanKindClient || spanKind == ext.SpanKindProducer + + if _, ok := s.meta[ext.PeerService]; ok { // peer.service already set on the span s.setMeta(keyPeerServiceSource, ext.PeerService) + } else if isServerless(tc) { + // Set peerService only in outbound Lambda requests + if isOutboundRequest { + if ps := deriveAWSPeerService(s.meta); ps != "" { + s.setMeta(ext.PeerService, ps) + s.setMeta(keyPeerServiceSource, ext.PeerService) + } else { + log.Debug("Unable to set peer.service tag for serverless span %q", s.name) + } + } } else { // no peer.service currently set - spanKind := s.Meta[ext.SpanKind] - isOutboundRequest := spanKind == ext.SpanKindClient || spanKind == ext.SpanKindProducer - shouldSetDefaultPeerService := isOutboundRequest && cfg.peerServiceDefaultsEnabled + shouldSetDefaultPeerService := isOutboundRequest && tc.PeerServiceDefaults if !shouldSetDefaultPeerService { return } source := setPeerServiceFromSource(s) if source == "" { - log.Debug("No source tag value could be found for span %q, peer.service not set", s.Name) + log.Debug("No source tag value could be found for span %q, peer.service not set", s.name) return } s.setMeta(keyPeerServiceSource, source) } // Overwrite existing peer.service value if remapped by the user - ps := s.Meta[ext.PeerService] - if to, ok := cfg.peerServiceMappings[ps]; ok { + ps := s.meta[ext.PeerService] + if to, ok := tc.PeerServiceMappings[ps]; ok { s.setMeta(keyPeerServiceRemappedFrom, ps) s.setMeta(ext.PeerService, to) } } +/* +checks if we are in a serverless environment + +TODO add checks for Azure functions and other serverless environments +*/ +func isServerless(tc TracerConf) bool { + return tc.isLambdaFunction +} + +/* +deriveAWSPeerService returns the host name of the +outbound aws service call based on the span metadata, +or an empty string if it cannot be determined. + +The mapping is as follows: + - eventbridge: events..amazonaws.com + - sqs: sqs..amazonaws.com + - sns: sns..amazonaws.com + - kinesis: kinesis..amazonaws.com + - dynamodb: dynamodb..amazonaws.com + - s3: .s3..amazonaws.com (if Bucket param present) + s3..amazonaws.com (otherwise) +*/ +func deriveAWSPeerService(sm map[string]string) string { + service, region := sm[ext.AWSService], sm[ext.AWSRegion] + if service == "" || region == "" { + return "" + } + + s := strings.ToLower(service) + switch s { + + case "s3": + if bucket := sm[ext.S3BucketName]; bucket != "" { + return bucket + ".s3." + region + ".amazonaws.com" + } + return "s3." + region + ".amazonaws.com" + + case "eventbridge": + return "events." + region + ".amazonaws.com" + + case "sqs", "sns", "dynamodb", "kinesis": + return s + "." + region + ".amazonaws.com" + } + return "" +} + // setPeerServiceFromSource sets peer.service from the sources determined // by the tags on the span. It returns the source tag name that it used for // the peer.service value, or the empty string if no valid source tag was available. -func setPeerServiceFromSource(s *span) string { +func setPeerServiceFromSource(s *Span) string { has := func(tag string) bool { - _, ok := s.Meta[tag] + _, ok := s.meta[tag] return ok } var sources []string @@ -571,7 +745,7 @@ func setPeerServiceFromSource(s *span) string { "tablename", "bucketname", } - case s.Meta[ext.DBSystem] == ext.DBSystemCassandra: + case s.meta[ext.DBSystem] == ext.DBSystemCassandra: sources = []string{ ext.CassandraContactPoints, } @@ -599,7 +773,7 @@ func setPeerServiceFromSource(s *span) string { }...) } for _, source := range sources { - if val, ok := s.Meta[source]; ok { + if val, ok := s.meta[source]; ok { s.setMeta(ext.PeerService, val) return source } diff --git a/ddtrace/tracer/spancontext_test.go b/ddtrace/tracer/spancontext_test.go index 6799fee022..9d0ce3a991 100644 --- a/ddtrace/tracer/spancontext_test.go +++ b/ddtrace/tracer/spancontext_test.go @@ -7,40 +7,50 @@ package tracer import ( "context" + "errors" "fmt" "math" + "strconv" + "strings" "sync" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func setupteardown(start, max int) func() { +func setupteardown(startSize, maxSize int) func() { oldStartSize := traceStartSize oldMaxSize := traceMaxSize - traceStartSize = start - traceMaxSize = max + traceStartSize = startSize + traceMaxSize = maxSize return func() { traceStartSize = oldStartSize traceMaxSize = oldMaxSize } } +func TestTraceIDZero(t *testing.T) { + c := SpanContext{} + assert.Equal(t, c.TraceID(), TraceIDZero) +} + func TestNewSpanContextPushError(t *testing.T) { defer setupteardown(2, 2)() tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) - _, _, _, stop := startTestTracer(t, WithLogger(tp), WithLambdaMode(true)) + tp.Ignore(commonLogIgnore...) + _, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithLambdaMode(true), WithEnv("testEnv")) + assert.Nil(t, err) defer stop() parent := newBasicSpan("test1") // 1st span in trace parent.context.trace.push(newBasicSpan("test2")) // 2nd span in trace @@ -51,7 +61,99 @@ func TestNewSpanContextPushError(t *testing.T) { child.context = newSpanContext(child, parent.context) log.Flush() - assert.Contains(t, tp.Logs()[0], "ERROR: trace buffer full (2)") + assert.Contains(t, tp.Logs()[0], "ERROR: trace buffer full (2 spans)") +} + +/* +This test is an attempt to reproduce one of the panics from incident 37240 [1]. +Run the test with -count 100, and you should get a crash like the one shown +below. + +[1] https://dd.slack.com/archives/C08NGNZR0C8/p1744390495200339 + + fatal error: concurrent map iteration and map write + + goroutine 354 [running]: + internal/runtime/maps.fatal({0x102db4b48?, 0x14000101d98?}) + /Users/felix.geisendoerfer/.local/share/mise/installs/go/1.24.2/src/runtime/panic.go:1058 +0x20 + internal/runtime/maps.(*Iter).Next(0x1400009dca0?) + /Users/felix.geisendoerfer/.local/share/mise/installs/go/1.24.2/src/internal/runtime/maps/table.go:683 +0x94 + gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.(*span).EncodeMsg(0x14000140140, 0x14000c1c000) + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/span_msgp.go:392 +0x2e8 + gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.spanList.EncodeMsg({0x140003e0320, 0x1, 0x18?}, 0x14000c1c000) + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/span_msgp.go:596 +0x80 + github.com/tinylib/msgp/msgp.Encode({0x1031ebd00?, 0x14000294d48?}, {0x1031ec060?, 0x1400000e090?}) + /Users/felix.geisendoerfer/go/pkg/mod/github.com/tinylib/msgp@v1.2.5/msgp/write.go:156 +0x60 + gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.(*payload).push(0x14000294d20, {0x140003e0320, 0x1, 0xa}) + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/payload.go:76 +0x98 + gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.(*agentTraceWriter).add(0x140003e0000, {0x140003e0320?, 0x0?, 0x0?}) + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/writer.go:69 +0x28 + gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.(*tracer).worker(0x140000c40d0, 0x1400012b2d0) + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/tracer.go:457 +0x154 + gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.newTracer.func2() + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/tracer.go:412 +0xa8 + created by gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.newTracer in goroutine 326 + /Users/felix.geisendoerfer/go/src/github.com/DataDog/dd-trace-go/ddtrace/tracer/tracer.go:404 +0x2b4 +*/ +func TestIncident37240DoubleFinish(t *testing.T) { + t.Run("with link", func(_ *testing.T) { + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) + defer stop() + + root, _ := StartSpanFromContext(context.Background(), "root", Tag(ext.ManualKeep, true)) + // My theory is that contrib/aws/internal/span_pointers/span_pointers.go + // adds a span link which is causes `serializeSpanLinksInMeta` to write to + // `s.Meta` without holding the lock. This crashes when the span flushing + // code tries to read `s.Meta` without holding the lock. + root.AddLink(SpanLink{TraceID: 1, SpanID: 2}) + for i := 0; i < 1000; i++ { + root.Finish() + } + }) + + t.Run("with NoDebugStack", func(_ *testing.T) { + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) + defer stop() + + root, _ := StartSpanFromContext(context.Background(), "root", Tag(ext.ManualKeep, true)) + for i := 0; i < 1000; i++ { + root.Finish(NoDebugStack()) + } + }) + + t.Run("with error", func(_ *testing.T) { + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) + defer stop() + + root, _ := StartSpanFromContext(context.Background(), "root", Tag(ext.ManualKeep, true)) + err = errors.New("test error") + for i := 0; i < 1000; i++ { + root.Finish(WithError(err)) + } + }) + + t.Run("with rules sampler", func(t *testing.T) { + _, _, _, stop, err := startTestTracer(t, + WithService("svc"), + WithSamplingRules(TraceSamplingRules(Rule{ServiceGlob: "svc", Rate: 1.0})), + ) + assert.Nil(t, err) + defer stop() + + root, _ := StartSpanFromContext(context.Background(), "root") + for i := 0; i < 1000; i++ { + root.Finish(WithError(err)) + rateRule, _ := getMetric(root, keyRulesSamplerLimiterRate) + priority, _ := getMetric(root, keySamplingPriority) + assert.Equal(t, 1.0, rateRule) + assert.Equal(t, 2.0, priority) + _, hasPrioRate := getMetric(root, keySamplingPriorityRate) + assert.False(t, hasPrioRate) + } + }) } func TestAsyncSpanRace(t *testing.T) { @@ -65,24 +167,50 @@ func TestAsyncSpanRacePartialFlush(t *testing.T) { } func testAsyncSpanRace(t *testing.T) { + // disabling process tags as it causes map writes on span.meta and span.metrics (due to key deletion) + // defeating the purpose of testAsyncSpanRace and trigerring systematically a read/write race + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "false") + processtags.Reload() + defer func() { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "true") + // reloading as this is a shared var process and can impact other tests + processtags.Reload() + }() // This tests a regression where asynchronously finishing spans would // modify a flushing root's sampling priority. - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() for i := 0; i < 100; i++ { // The test has 100 iterations because it is not easy to reproduce the race. - t.Run("", func(t *testing.T) { - root, ctx := StartSpanFromContext(context.Background(), "root", Tag(ext.SamplingPriority, ext.PriorityUserKeep)) - var wg sync.WaitGroup - done := make(chan struct{}) + t.Run("", func(_ *testing.T) { + var ( + wg, finishes sync.WaitGroup + done = make(chan struct{}) + ) + root, ctx := StartSpanFromContext(context.Background(), "root", Tag(ext.ManualKeep, true)) + finishes.Add(2) wg.Add(1) go func() { defer wg.Done() - <-done - root.Finish() for i := 0; i < 500; i++ { - for range root.(*span).Metrics { + // Spamming Finish to emulate concurrent Finish calls. + root.Finish() + } + + // Syncing the finishes to ensure the rest of the test is executed after the Finish calls. + finishes.Done() + finishes.Wait() + + // Closing will attempt trigger the goroutines at approximately the same time. + // Closing it in the test function will cause a data race that doesn't happen in the wild. + // Here it's simulating the real Finish flow, as the meta/metrics iteration happen after + // the span is pushed to the tracer's t.out channel. + close(done) + + for i := 0; i < 500; i++ { + for range root.metrics { // this range simulates iterating over the metrics map // as we do when encoding msgpack upon flushing. continue @@ -92,10 +220,16 @@ func testAsyncSpanRace(t *testing.T) { wg.Add(1) go func() { defer wg.Done() - <-done - root.Finish() for i := 0; i < 500; i++ { - for range root.(*span).Meta { + // Spamming Finish to emulate concurrent Finish calls. + root.Finish() + } + + finishes.Done() + finishes.Wait() + + for i := 0; i < 500; i++ { + for range root.meta { // this range simulates iterating over the meta map // as we do when encoding msgpack upon flushing. continue @@ -109,12 +243,10 @@ func testAsyncSpanRace(t *testing.T) { for i := 0; i < 50; i++ { // to trigger the bug, the child should be created after the root was finished, // as its being flushed - child, _ := StartSpanFromContext(ctx, "child", Tag(ext.SamplingPriority, ext.PriorityUserKeep)) + child, _ := StartSpanFromContext(ctx, "child", Tag(ext.ManualKeep, true)) child.Finish() } }() - // closing will attempt trigger the two goroutines at approximately the same time. - close(done) wg.Wait() }) } @@ -127,11 +259,11 @@ func TestSpanTracePushOne(t *testing.T) { assert := assert.New(t) - _, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() - traceID := randUint64() - root := newSpan("name1", "a-service", "a-resource", traceID, traceID, 0) + root := tracer.newRootSpan("name1", "a-service", "a-resource") trace := root.context.trace assert.Len(trace.spans, 1) @@ -152,15 +284,16 @@ func TestSpanTracePushOne(t *testing.T) { // and the associated trace is counted as dropped. func TestTraceFinishChunk(t *testing.T) { assert := assert.New(t) - tracer := newUnstartedTracer() - defer tracer.statsd.Close() + tracer, err := newUnstartedTracer() + assert.Nil(err) + defer tracer.Stop() root := newSpan("name", "service", "resource", 0, 0, 0) trace := root.context.trace for i := 0; i < payloadQueueSize+1; i++ { trace.mu.Lock() - c := chunk{spans: make([]*span, 1)} + c := chunk{spans: make([]*Span, 1)} trace.finishChunk(tracer, &c) trace.mu.Unlock() } @@ -171,18 +304,19 @@ func TestPartialFlush(t *testing.T) { t.Setenv("DD_TRACE_PARTIAL_FLUSH_ENABLED", "true") t.Setenv("DD_TRACE_PARTIAL_FLUSH_MIN_SPANS", "2") t.Run("WithFlush", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - telemetryClient.ProductChange(telemetry.NamespaceTracers, true, nil) - defer telemetry.MockGlobalClient(telemetryClient)() - tracer, transport, flush, stop := startTestTracer(t) + telemetryClient := new(telemetrytest.RecordClient) + telemetryClient.ProductStarted(telemetry.NamespaceTracers) + defer telemetry.MockClient(telemetryClient)() + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() root := tracer.StartSpan("root") - root.(*span).context.trace.setTag("someTraceTag", "someValue") - var children []*span + root.context.trace.setTag("someTraceTag", "someValue") + var children []*Span for i := 0; i < 3; i++ { // create 3 child spans child := tracer.StartSpan(fmt.Sprintf("child%d", i), ChildOf(root.Context())) - children = append(children, child.(*span)) + children = append(children, child) child.Finish() } flush(1) @@ -190,45 +324,40 @@ func TestPartialFlush(t *testing.T) { ts := transport.Traces() require.Len(t, ts, 1) require.Len(t, ts[0], 2) - assert.Equal(t, "someValue", ts[0][0].Meta["someTraceTag"]) - assert.Equal(t, 1.0, ts[0][0].Metrics[keySamplingPriority]) - assert.Empty(t, ts[0][1].Meta["someTraceTag"]) // the tag should only be on the first span in the chunk - assert.Equal(t, 1.0, ts[0][1].Metrics[keySamplingPriority]) // the tag should only be on the first span in the chunk + assert.Equal(t, "someValue", ts[0][0].meta["someTraceTag"]) + assert.Equal(t, 1.0, ts[0][0].metrics[keySamplingPriority]) + assert.Empty(t, ts[0][1].meta["someTraceTag"]) // the tag should only be on the first span in the chunk + assert.Equal(t, 1.0, ts[0][1].metrics[keySamplingPriority]) // the tag should only be on the first span in the chunk comparePayloadSpans(t, children[0], ts[0][0]) comparePayloadSpans(t, children[1], ts[0][1]) - telemetryClient.AssertCalled(t, "Count", telemetry.NamespaceTracers, "trace_partial_flush.count", 1.0, []string{"reason:large_trace"}, true) - // TODO: (Support MetricKindDist) Re-enable these when we actually support `MetricKindDist` - //telemetryClient.AssertCalled(t, "Record", telemetry.NamespaceTracers, "trace_partial_flush.spans_closed", 2.0, []string(nil), true) // Typed-nil here to not break usage of reflection in `mock` library. - //telemetryClient.AssertCalled(t, "Record", telemetry.NamespaceTracers, "trace_partial_flush.spans_remaining", 1.0, []string(nil), true) + assert.Equal(t, 1.0, telemetryClient.Count(telemetry.NamespaceTracers, "trace_partial_flush.count", []string{"reason:large_trace"}).Get()) + assert.Equal(t, 2.0, telemetryClient.Distribution(telemetry.NamespaceTracers, "trace_partial_flush.spans_closed", nil).Get()) + assert.Equal(t, 1.0, telemetryClient.Distribution(telemetry.NamespaceTracers, "trace_partial_flush.spans_remaining", nil).Get()) root.Finish() flush(1) tsRoot := transport.Traces() require.Len(t, tsRoot, 1) require.Len(t, tsRoot[0], 2) - assert.Equal(t, "someValue", ts[0][0].Meta["someTraceTag"]) - assert.Equal(t, 1.0, ts[0][0].Metrics[keySamplingPriority]) - assert.Empty(t, ts[0][1].Meta["someTraceTag"]) // the tag should only be on the first span in the chunk - assert.Equal(t, 1.0, ts[0][1].Metrics[keySamplingPriority]) // the tag should only be on the first span in the chunk - comparePayloadSpans(t, root.(*span), tsRoot[0][0]) + assert.Equal(t, "someValue", ts[0][0].meta["someTraceTag"]) + assert.Equal(t, 1.0, ts[0][0].metrics[keySamplingPriority]) + assert.Empty(t, ts[0][1].meta["someTraceTag"]) // the tag should only be on the first span in the chunk + assert.Equal(t, 1.0, ts[0][1].metrics[keySamplingPriority]) // the tag should only be on the first span in the chunk + comparePayloadSpans(t, root, tsRoot[0][0]) comparePayloadSpans(t, children[2], tsRoot[0][1]) - telemetryClient.AssertNumberOfCalls(t, "Count", 1) - // TODO: (Support MetricKindDist) Re-enable this when we actually support `MetricKindDist` - // telemetryClient.AssertNumberOfCalls(t, "Record", 2) }) // This test covers an issue where partial flushing + a rate sampler would panic t.Run("WithRateSamplerNoPanic", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithSampler(NewRateSampler(0.000001))) + tracer, _, _, stop, err := startTestTracer(t, WithSamplerRate(0.000001)) + assert.Nil(t, err) defer stop() root := tracer.StartSpan("root") - root.(*span).context.trace.setTag("someTraceTag", "someValue") - var children []*span + root.context.trace.setTag("someTraceTag", "someValue") for i := 0; i < 10; i++ { // create 10 child spans to ensure some aren't sampled child := tracer.StartSpan(fmt.Sprintf("child%d", i), ChildOf(root.Context())) - children = append(children, child.(*span)) child.Finish() } }) @@ -241,8 +370,9 @@ func TestSpanTracePushNoFinish(t *testing.T) { assert := assert.New(t) tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) - _, _, _, stop := startTestTracer(t, WithLogger(tp), WithLambdaMode(true)) + tp.Ignore(commonLogIgnore...) + _, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithLambdaMode(true), WithEnv("testEnv")) + assert.NoError(err) defer stop() buffer := newTrace() @@ -268,7 +398,8 @@ func TestSpanTracePushSeveral(t *testing.T) { assert := assert.New(t) - trc, transport, flush, stop := startTestTracer(t) + trc, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() buffer := newTrace() assert.NotNil(buffer) @@ -280,7 +411,7 @@ func TestSpanTracePushSeveral(t *testing.T) { span3 := trc.StartSpan("name3", ChildOf(root.Context())) span3a := trc.StartSpan("name3", ChildOf(span3.Context())) - trace := []*span{root.(*span), span2.(*span), span3.(*span), span3a.(*span)} + trace := []*Span{root, span2, span3, span3a} for i, span := range trace { span.context.trace = buffer @@ -307,17 +438,18 @@ func TestSpanTracePushSeveral(t *testing.T) { // priority metric set by inheriting it from a child. func TestSpanFinishPriority(t *testing.T) { assert := assert.New(t) - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() root := tracer.StartSpan( "root", - Tag(ext.SamplingPriority, 1), ) + root.setSamplingPriority(ext.PriorityAutoKeep, samplernames.Manual) child := tracer.StartSpan( "child", ChildOf(root.Context()), - Tag(ext.SamplingPriority, 2), + Tag(ext.ManualKeep, true), ) child.Finish() root.Finish() @@ -329,9 +461,9 @@ func TestSpanFinishPriority(t *testing.T) { trace := traces[0] assert.Len(trace, 2) for _, span := range trace { - if span.Name == "root" { + if span.name == "root" { // root should have inherited child's sampling priority - assert.Equal(span.Metrics[keySamplingPriority], 2.) + assert.Equal(span.metrics[keySamplingPriority], 2.) return } } @@ -398,6 +530,160 @@ func TestSpanPeerService(t *testing.T) { wantPeerServiceSource: "bucketname", wantPeerServiceRemappedFrom: "", }, + { + name: "AWS-No-Service", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("region", "us-east-2"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "", + wantPeerServiceSource: "", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-No-Region", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "S3"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "", + wantPeerServiceSource: "", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-Nonexistent-Service-And-Region", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "notarealservice"), + Tag("region", "notarealregion"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "", + wantPeerServiceSource: "", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-No-Outbound-Request", + spanOpts: []StartSpanOption{ + Tag("aws_service", "S3"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "", + wantPeerServiceSource: "", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-S3", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "S3"), + Tag("region", "us-east-2"), + Tag("bucketname", "some-bucket"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "some-bucket.s3.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-S3-No-Bucket", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "S3"), + Tag("region", "us-east-2"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "s3.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-DynamoDB", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "DynamoDB"), + Tag("region", "us-east-2"), + Tag("db.system", "db-system"), + Tag("db.name", "db-name"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "dynamodb.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-Kinesis", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "Kinesis"), + Tag("region", "us-east-2"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "kinesis.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-SNS", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "SNS"), + Tag("region", "us-east-2"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "sns.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-SQS", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "SQS"), + Tag("region", "us-east-2"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "sqs.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, + { + name: "AWS-Events", + spanOpts: []StartSpanOption{ + Tag("span.kind", "client"), + Tag("aws_service", "EventBridge"), + Tag("region", "us-east-2"), + }, + peerServiceDefaultsEnabled: true, + peerServiceMappings: nil, + wantPeerService: "events.us-east-2.amazonaws.com", + wantPeerServiceSource: "peer.service", + wantPeerServiceRemappedFrom: "", + }, { name: "DBClient", spanOpts: []StartSpanOption{ @@ -509,25 +795,30 @@ func TestSpanPeerService(t *testing.T) { }, } for _, tc := range testCases { - assertSpan := func(t *testing.T, s *span) { + assertSpan := func(t *testing.T, s *Span) { if tc.wantPeerService == "" { - assert.NotContains(t, s.Meta, "peer.service") + assert.NotContains(t, s.meta, "peer.service") } else { - assert.Equal(t, tc.wantPeerService, s.Meta["peer.service"]) + assert.Equal(t, tc.wantPeerService, s.meta["peer.service"]) } if tc.wantPeerServiceSource == "" { - assert.NotContains(t, s.Meta, "_dd.peer.service.source") + assert.NotContains(t, s.meta, "_dd.peer.service.source") } else { - assert.Equal(t, tc.wantPeerServiceSource, s.Meta["_dd.peer.service.source"]) + assert.Equal(t, tc.wantPeerServiceSource, s.meta["_dd.peer.service.source"]) } if tc.wantPeerServiceRemappedFrom == "" { - assert.NotContains(t, s.Meta, "_dd.peer.service.remapped_from") + assert.NotContains(t, s.meta, "_dd.peer.service.remapped_from") } else { - assert.Equal(t, tc.wantPeerServiceRemappedFrom, s.Meta["_dd.peer.service.remapped_from"]) + assert.Equal(t, tc.wantPeerServiceRemappedFrom, s.meta["_dd.peer.service.remapped_from"]) } } t.Run(tc.name, func(t *testing.T) { - tracer, transport, flush, stop := startTestTracer(t) + if strings.Contains(tc.name, "AWS-") { + t.Setenv("AWS_LAMBDA_FUNCTION_NAME", "test_name") + } + + tracer, transport, flush, stop, err := startTestTracer(t, WithLambdaMode(false)) + assert.Nil(t, err) defer stop() tracer.config.peerServiceDefaultsEnabled = tc.peerServiceDefaultsEnabled @@ -555,11 +846,12 @@ func TestSpanPeerService(t *testing.T) { } func TestSpanDDBaseService(t *testing.T) { - run := func(t *testing.T, tracerOpts []StartOption, spanOpts []StartSpanOption) []*span { + run := func(t *testing.T, tracerOpts []StartOption, spanOpts []StartSpanOption) []*Span { prevSvc := globalconfig.ServiceName() t.Cleanup(func() { globalconfig.SetServiceName(prevSvc) }) - tracer, transport, flush, stop := startTestTracer(t, tracerOpts...) + tracer, transport, flush, stop, err := startTestTracer(t, tracerOpts...) + assert.Nil(t, err) t.Cleanup(stop) p := tracer.StartSpan("parent-span", spanOpts...) @@ -584,8 +876,8 @@ func TestSpanDDBaseService(t *testing.T) { } spans := run(t, tracerOpts, spanOpts) for _, s := range spans { - assert.Equal(t, "span-service", s.Service) - assert.Equal(t, "global-service", s.Meta["_dd.base_service"]) + assert.Equal(t, "span-service", s.service) + assert.Equal(t, "global-service", s.meta["_dd.base_service"]) } }) t.Run("span-service-equal-global-service", func(t *testing.T) { @@ -597,8 +889,8 @@ func TestSpanDDBaseService(t *testing.T) { } spans := run(t, tracerOpts, spanOpts) for _, s := range spans { - assert.Equal(t, "global-service", s.Service) - assert.NotContains(t, s.Meta, "_dd.base_service") + assert.Equal(t, "global-service", s.service) + assert.NotContains(t, s.meta, "_dd.base_service") } }) t.Run("span-service-equal-different-case", func(t *testing.T) { @@ -610,8 +902,8 @@ func TestSpanDDBaseService(t *testing.T) { } spans := run(t, tracerOpts, spanOpts) for _, s := range spans { - assert.Equal(t, "GLOBAL-service", s.Service) - assert.NotContains(t, s.Meta, "_dd.base_service") + assert.Equal(t, "GLOBAL-service", s.service) + assert.NotContains(t, s.meta, "_dd.base_service") } }) t.Run("global-service-not-set", func(t *testing.T) { @@ -620,10 +912,10 @@ func TestSpanDDBaseService(t *testing.T) { } spans := run(t, nil, spanOpts) for _, s := range spans { - assert.Equal(t, "span-service", s.Service) + assert.Equal(t, "span-service", s.service) // in this case we don't assert to a concrete value because the default tracer service name is calculated // based on the process name and might change depending on how tests are run. - assert.NotEmpty(t, s.Meta["_dd.base_service"]) + assert.NotEmpty(t, s.meta["_dd.base_service"]) } }) t.Run("using-tag-option", func(t *testing.T) { @@ -635,23 +927,23 @@ func TestSpanDDBaseService(t *testing.T) { } spans := run(t, tracerOpts, spanOpts) for _, s := range spans { - assert.Equal(t, "span-service", s.Service) - assert.Equal(t, "global-service", s.Meta["_dd.base_service"]) + assert.Equal(t, "span-service", s.service) + assert.Equal(t, "global-service", s.meta["_dd.base_service"]) } }) } func TestNewSpanContext(t *testing.T) { t.Run("basic", func(t *testing.T) { - span := &span{ - TraceID: 1, - SpanID: 2, - ParentID: 3, + span := &Span{ + traceID: 1, + spanID: 2, + parentID: 3, } ctx := newSpanContext(span, nil) assert := assert.New(t) - assert.Equal(ctx.traceID.Lower(), span.TraceID) - assert.Equal(ctx.spanID, span.SpanID) + assert.Equal(ctx.traceID.Lower(), span.traceID) + assert.Equal(ctx.spanID, span.spanID) assert.NotNil(ctx.trace) assert.Nil(ctx.trace.priority) assert.Equal(ctx.trace.root, span) @@ -659,18 +951,17 @@ func TestNewSpanContext(t *testing.T) { }) t.Run("priority", func(t *testing.T) { - span := &span{ - TraceID: 1, - SpanID: 2, - ParentID: 3, - Metrics: map[string]float64{keySamplingPriority: 1}, + span := &Span{ + traceID: 1, + spanID: 2, + parentID: 3, + metrics: map[string]float64{keySamplingPriority: 1}, } ctx := newSpanContext(span, nil) assert := assert.New(t) - assert.Equal(ctx.traceID.Lower(), span.TraceID) - assert.Equal(ctx.spanID, span.SpanID) - assert.Equal(ctx.TraceID(), span.TraceID) - assert.Equal(ctx.SpanID(), span.SpanID) + assert.Equal(ctx.traceID.Lower(), span.traceID) + assert.Equal(ctx.spanID, span.spanID) + assert.Equal(ctx.SpanID(), span.spanID) assert.Equal(*ctx.trace.priority, 1.) assert.Equal(ctx.trace.root, span) assert.Contains(ctx.trace.spans, span) @@ -678,7 +969,8 @@ func TestNewSpanContext(t *testing.T) { t.Run("root", func(t *testing.T) { t.Setenv(headerPropagationStyleExtract, "datadog") - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() assert := assert.New(t) ctx, err := NewPropagator(nil).Extract(TextMapCarrier(map[string]string{ @@ -687,23 +979,21 @@ func TestNewSpanContext(t *testing.T) { DefaultPriorityHeader: "3", })) assert.Nil(err) - sctx, ok := ctx.(*spanContext) - assert.True(ok) span := StartSpan("some-span", ChildOf(ctx)) - assert.EqualValues(uint64(1), sctx.traceID.Lower()) - assert.EqualValues(2, sctx.spanID) - assert.EqualValues(3, *sctx.trace.priority) - assert.Equal(sctx.trace.root, span) + assert.EqualValues(uint64(1), ctx.traceID.Lower()) + assert.EqualValues(2, ctx.spanID) + assert.EqualValues(3, *ctx.trace.priority) + assert.Equal(ctx.trace.root, span) }) } func TestSpanContextParent(t *testing.T) { - s := &span{ - TraceID: 1, - SpanID: 2, - ParentID: 3, + s := &Span{ + traceID: 1, + spanID: 2, + parentID: 3, } - for name, parentCtx := range map[string]*spanContext{ + for name, parentCtx := range map[string]*SpanContext{ "basic": { baggage: map[string]string{"A": "A", "B": "B"}, hasBaggage: 1, @@ -714,7 +1004,7 @@ func TestSpanContextParent(t *testing.T) { baggage: map[string]string{"A": "A", "B": "B"}, hasBaggage: 1, trace: &trace{ - spans: []*span{newBasicSpan("abc")}, + spans: []*Span{newBasicSpan("abc")}, priority: func() *float64 { v := new(float64); *v = 2; return v }(), }, }, @@ -722,20 +1012,20 @@ func TestSpanContextParent(t *testing.T) { baggage: map[string]string{"A": "A", "B": "B"}, hasBaggage: 1, trace: &trace{ - spans: []*span{newBasicSpan("abc")}, + spans: []*Span{newBasicSpan("abc")}, samplingDecision: decisionKeep, }, }, "origin": { - trace: &trace{spans: []*span{newBasicSpan("abc")}}, + trace: &trace{spans: []*Span{newBasicSpan("abc")}}, origin: "synthetics", }, } { t.Run(name, func(t *testing.T) { ctx := newSpanContext(s, parentCtx) assert := assert.New(t) - assert.Equal(ctx.traceID.Lower(), s.TraceID) - assert.Equal(ctx.spanID, s.SpanID) + assert.Equal(ctx.traceID.Lower(), s.traceID) + assert.Equal(ctx.spanID, s.spanID) if parentCtx.trace != nil { assert.Equal(len(ctx.trace.spans), len(parentCtx.trace.spans)) } @@ -755,8 +1045,9 @@ func TestSpanContextPushFull(t *testing.T) { defer func(old int) { traceMaxSize = old }(traceMaxSize) traceMaxSize = 2 tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) - _, _, _, stop := startTestTracer(t, WithLogger(tp), WithLambdaMode(true)) + tp.Ignore(commonLogIgnore...) + _, _, _, stop, err := startTestTracer(t, WithLogger(tp), WithLambdaMode(true), WithEnv("testEnv")) + assert.Nil(t, err) defer stop() span1 := newBasicSpan("span1") @@ -773,13 +1064,13 @@ func TestSpanContextPushFull(t *testing.T) { assert.Len(tp.Logs(), 0) buffer.push(span3) log.Flush() - assert.Contains(tp.Logs()[0], "ERROR: trace buffer full (2)") + assert.Contains(tp.Logs()[0], "ERROR: trace buffer full (2 spans)") } func TestSpanContextBaggage(t *testing.T) { assert := assert.New(t) - var ctx spanContext + var ctx SpanContext ctx.setBaggageItem("key", "value") assert.Equal("value", ctx.baggage["key"]) } @@ -788,7 +1079,7 @@ func TestSpanContextIterator(t *testing.T) { assert := assert.New(t) got := make(map[string]string) - ctx := spanContext{baggage: map[string]string{"key": "value"}, hasBaggage: 1} + ctx := SpanContext{baggage: map[string]string{"key": "value"}, hasBaggage: 1} ctx.ForeachBaggageItem(func(k, v string) bool { got[k] = v return true @@ -798,10 +1089,21 @@ func TestSpanContextIterator(t *testing.T) { assert.Equal("value", got["key"]) } -func TestSpanContextIteratorBreak(t *testing.T) { +func TestNilSpanContextIterator(t *testing.T) { got := make(map[string]string) - ctx := spanContext{baggage: map[string]string{"key": "value"}} + var ctx *SpanContext ctx.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + + assert.Len(t, got, 0) +} + +func TestSpanContextIteratorBreak(t *testing.T) { + got := make(map[string]string) + ctx := SpanContext{baggage: map[string]string{"key": "value"}} + ctx.ForeachBaggageItem(func(_, _ string) bool { return false }) @@ -809,18 +1111,18 @@ func TestSpanContextIteratorBreak(t *testing.T) { } func BenchmarkBaggageItemPresent(b *testing.B) { - ctx := spanContext{baggage: map[string]string{"key": "value"}, hasBaggage: 1} + ctx := SpanContext{baggage: map[string]string{"key": "value"}, hasBaggage: 1} for n := 0; n < b.N; n++ { - ctx.ForeachBaggageItem(func(k, v string) bool { + ctx.ForeachBaggageItem(func(_, _ string) bool { return true }) } } func BenchmarkBaggageItemEmpty(b *testing.B) { - ctx := spanContext{} + ctx := SpanContext{} for n := 0; n < b.N; n++ { - ctx.ForeachBaggageItem(func(k, v string) bool { + ctx.ForeachBaggageItem(func(_, _ string) bool { return true }) } @@ -831,35 +1133,35 @@ func TestSetSamplingPriorityLocked(t *testing.T) { tr := trace{ propagatingTags: map[string]string{}, } - tr.setSamplingPriorityLocked(0, samplernames.RemoteRate) + tr.setSamplingPriorityLocked(ext.PriorityAutoReject, samplernames.RemoteRate) assert.Empty(t, tr.propagatingTags[keyDecisionMaker]) }) t.Run("UnknownSamplerIsIgnored", func(t *testing.T) { tr := trace{ propagatingTags: map[string]string{}, } - tr.setSamplingPriorityLocked(0, samplernames.Unknown) + tr.setSamplingPriorityLocked(ext.PriorityAutoReject, samplernames.Unknown) assert.Empty(t, tr.propagatingTags[keyDecisionMaker]) }) t.Run("NoPriorAndP1IsAccepted", func(t *testing.T) { tr := trace{ propagatingTags: map[string]string{}, } - tr.setSamplingPriorityLocked(1, samplernames.RemoteRate) + tr.setSamplingPriorityLocked(ext.PriorityAutoKeep, samplernames.RemoteRate) assert.Equal(t, "-2", tr.propagatingTags[keyDecisionMaker]) }) t.Run("PriorAndP1AndSameDMIsIgnored", func(t *testing.T) { tr := trace{ propagatingTags: map[string]string{keyDecisionMaker: "-1"}, } - tr.setSamplingPriorityLocked(1, samplernames.AgentRate) + tr.setSamplingPriorityLocked(ext.PriorityAutoKeep, samplernames.AgentRate) assert.Equal(t, "-1", tr.propagatingTags[keyDecisionMaker]) }) t.Run("PriorAndP1DifferentDMAccepted", func(t *testing.T) { tr := trace{ propagatingTags: map[string]string{keyDecisionMaker: "-1"}, } - tr.setSamplingPriorityLocked(1, samplernames.RemoteRate) + tr.setSamplingPriorityLocked(ext.PriorityAutoKeep, samplernames.RemoteRate) assert.Equal(t, "-2", tr.propagatingTags[keyDecisionMaker]) }) } @@ -895,6 +1197,59 @@ func TestSpanIDHexEncoded(t *testing.T) { assert.Equal(t, spanIDHexEncoded(math.MaxUint64, 16), sid) } +func TestSpanProcessTags(t *testing.T) { + testCases := []struct { + name string + enabled bool + }{ + { + name: "disabled", + enabled: false, + }, + { + name: "enabled", + enabled: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", strconv.FormatBool(tc.enabled)) + processtags.Reload() + tracer, transport, flush, stop, err := startTestTracer(t) + assert.NoError(t, err) + t.Cleanup(stop) + + p := tracer.StartSpan("p") + c1 := p.StartChild("c1") + c2 := p.StartChild("c2") + c11 := c1.StartChild("c1-1") + + c11.Finish() + c2.Finish() + c1.Finish() + p.Finish() + + flush(1) + traces := transport.Traces() + require.Len(t, traces, 1) + require.Len(t, traces[0], 4) + + root := traces[0][0] + assert.Equal(t, "p", root.name) + if tc.enabled { + assert.NotEmpty(t, root.meta["_dd.tags.process"]) + } else { + assert.NotContains(t, root.meta, "_dd.tags.process") + } + + for _, s := range traces[0][1:] { + assert.NotContains(t, s.meta, "_dd.tags.process") + } + }) + } +} + func BenchmarkSpanIDHexEncoded(b *testing.B) { for n := 0; n < b.N; n++ { _ = spanIDHexEncoded(32, 16) diff --git a/ddtrace/tracer/spanlink.go b/ddtrace/tracer/spanlink.go new file mode 100644 index 0000000000..764a8d7df9 --- /dev/null +++ b/ddtrace/tracer/spanlink.go @@ -0,0 +1,25 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +// SpanLink represents a reference to a span that exists outside of the trace. +// +//go:generate go run github.com/tinylib/msgp -unexported -marshal=false -o=span_link_msgp.go -tests=false + +type SpanLink struct { + // TraceID represents the low 64 bits of the linked span's trace id. This field is required. + TraceID uint64 `msg:"trace_id" json:"trace_id"` + // TraceIDHigh represents the high 64 bits of the linked span's trace id. This field is only set if the linked span's trace id is 128 bits. + TraceIDHigh uint64 `msg:"trace_id_high,omitempty" json:"trace_id_high"` + // SpanID represents the linked span's span id. + SpanID uint64 `msg:"span_id" json:"span_id"` + // Attributes is a mapping of keys to string values. These values are used to add additional context to the span link. + Attributes map[string]string `msg:"attributes,omitempty" json:"attributes"` + // Tracestate is the tracestate of the linked span. This field is optional. + Tracestate string `msg:"tracestate,omitempty" json:"tracestate"` + // Flags represents the W3C trace flags of the linked span. This field is optional. + Flags uint32 `msg:"flags,omitempty" json:"flags"` +} diff --git a/ddtrace/tracer/sqlcomment.go b/ddtrace/tracer/sqlcomment.go index 99232e269a..3a949035e6 100644 --- a/ddtrace/tracer/sqlcomment.go +++ b/ddtrace/tracer/sqlcomment.go @@ -9,27 +9,10 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" -) - -// SQLCommentInjectionMode represents the mode of SQL comment injection. -// -// Deprecated: Use DBMPropagationMode instead. -type SQLCommentInjectionMode DBMPropagationMode - -const ( - // SQLInjectionUndefined represents the comment injection mode is not set. This is the same as SQLInjectionDisabled. - SQLInjectionUndefined SQLCommentInjectionMode = SQLCommentInjectionMode(DBMPropagationModeUndefined) - // SQLInjectionDisabled represents the comment injection mode where all injection is disabled. - SQLInjectionDisabled SQLCommentInjectionMode = SQLCommentInjectionMode(DBMPropagationModeDisabled) - // SQLInjectionModeService represents the comment injection mode where only service tags (name, env, version) are injected. - SQLInjectionModeService SQLCommentInjectionMode = SQLCommentInjectionMode(DBMPropagationModeService) - // SQLInjectionModeFull represents the comment injection mode where both service tags and tracing tags. Tracing tags include span id, trace id and sampling priority. - SQLInjectionModeFull SQLCommentInjectionMode = SQLCommentInjectionMode(DBMPropagationModeFull) + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" ) // DBMPropagationMode represents the mode of dbm propagation. @@ -82,7 +65,7 @@ type SQLCommentCarrier struct { } // Inject injects a span context in the carrier's Query field as a comment. -func (c *SQLCommentCarrier) Inject(spanCtx ddtrace.SpanContext) error { +func (c *SQLCommentCarrier) Inject(ctx *SpanContext) error { c.SpanID = generateSpanID(now()) tags := make(map[string]string) switch c.Mode { @@ -91,41 +74,37 @@ func (c *SQLCommentCarrier) Inject(spanCtx ddtrace.SpanContext) error { case DBMPropagationModeDisabled: return nil case DBMPropagationModeFull: - var ( - sampled int64 - traceID uint64 - ) - if ctx, ok := spanCtx.(*spanContext); ok { + var sampled int64 + traceID := c.SpanID + if ctx != nil { if sp, ok := ctx.SamplingPriority(); ok && sp > 0 { sampled = 1 } - traceID = ctx.TraceID() - } - if traceID == 0 { // check if this is a root span - traceID = c.SpanID + traceID = ctx.traceID.Lower() } tags[sqlCommentTraceParent] = encodeTraceParent(traceID, c.SpanID, sampled) fallthrough case DBMPropagationModeService: - if ctx, ok := spanCtx.(*spanContext); ok { - if e, ok := ctx.meta(ext.Environment); ok && e != "" { + if ctx != nil && ctx.span != nil { + if e, ok := getMeta(ctx.span, ext.Environment); ok && e != "" { tags[sqlCommentEnv] = e } - if v, ok := ctx.meta(ext.Version); ok && v != "" { + if v, ok := getMeta(ctx.span, ext.Version); ok && v != "" { tags[sqlCommentParentVersion] = v } - if c.PeerDBName != "" { - tags[sqlCommentPeerDBName] = c.PeerDBName - } - if c.PeerDBHostname != "" { - tags[sqlCommentPeerHostname] = c.PeerDBHostname - } - if v, ok := ctx.meta(ext.PeerService); ok && v != "" { + if v, ok := getMeta(ctx.span, ext.PeerService); ok && v != "" { tags[sqlCommentPeerService] = v - } else if c.PeerService != "" { - tags[sqlCommentPeerService] = c.PeerService } } + if c.PeerDBName != "" { + tags[sqlCommentPeerDBName] = c.PeerDBName + } + if c.PeerDBHostname != "" { + tags[sqlCommentPeerHostname] = c.PeerDBHostname + } + if tags[sqlCommentPeerService] == "" && c.PeerService != "" { + tags[sqlCommentPeerService] = c.PeerService + } if globalconfig.ServiceName() != "" { tags[sqlCommentParentService] = globalconfig.ServiceName() } @@ -210,8 +189,8 @@ func commentQuery(query string, tags map[string]string) string { } // Extract parses for key value attributes in a sql query injected with trace information in order to build a span context -func (c *SQLCommentCarrier) Extract() (ddtrace.SpanContext, error) { - var ctx *spanContext +func (c *SQLCommentCarrier) Extract() (*SpanContext, error) { + var ctx *SpanContext // There may be multiple comments within the sql query, so we must identify which one contains trace information. // We look at each comment until we find one that contains a traceparent if traceComment, found := findTraceComment(c.Query); found { @@ -230,8 +209,8 @@ func (c *SQLCommentCarrier) Extract() (ddtrace.SpanContext, error) { // spanContextFromTraceComment looks for specific kv pairs in a comment containing trace information. // It returns a span context with the appropriate attributes -func spanContextFromTraceComment(c string) (*spanContext, error) { - var ctx spanContext +func spanContextFromTraceComment(c string) (*SpanContext, error) { + var ctx SpanContext kvs := strings.Split(c, ",") for _, unparsedKV := range kvs { splitKV := strings.Split(unparsedKV, "=") diff --git a/ddtrace/tracer/sqlcomment_test.go b/ddtrace/tracer/sqlcomment_test.go index 633f7a68b4..eea8329d41 100644 --- a/ddtrace/tracer/sqlcomment_test.go +++ b/ddtrace/tracer/sqlcomment_test.go @@ -11,9 +11,9 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -171,25 +171,25 @@ func TestSQLCommentCarrier(t *testing.T) { t.Run(tc.name, func(t *testing.T) { // the test service name includes all RFC3986 reserved characters to make sure all of them are url encoded // as per the sqlcommenter spec - tracer := newTracer(WithService("whiskey-service !#$%&'()*+,/:;=?@[]"), WithEnv("test-env"), WithServiceVersion("1.0.0")) + tracer, err := newTracer(WithService("whiskey-service !#$%&'()*+,/:;=?@[]"), WithEnv("test-env"), WithServiceVersion("1.0.0")) defer globalconfig.SetServiceName("") defer tracer.Stop() + assert.NoError(t, err) - var spanCtx ddtrace.SpanContext + var spanCtx *SpanContext var traceID uint64 if tc.injectSpan { traceID = uint64(10) - root := tracer.StartSpan("service.calling.db", WithSpanID(traceID)).(*span) - root.SetTag(ext.SamplingPriority, tc.samplingPriority) + root := tracer.StartSpan("service.calling.db", WithSpanID(traceID)) + root.setSamplingPriority(tc.samplingPriority, samplernames.Default) spanCtx = root.Context() } carrier := SQLCommentCarrier{Query: tc.query, Mode: tc.mode, DBServiceName: "whiskey-db", PeerDBHostname: tc.peerDBHostname, PeerDBName: tc.peerDBName, PeerService: tc.peerServiceName} - err := carrier.Inject(spanCtx) + err = carrier.Inject(spanCtx) require.NoError(t, err) expected := strings.ReplaceAll(tc.expectedQuery, "", fmt.Sprintf("%016s", strconv.FormatUint(carrier.SpanID, 16))) assert.Equal(t, expected, carrier.Query) - if !tc.injectSpan { traceID = carrier.SpanID } @@ -199,13 +199,10 @@ func TestSQLCommentCarrier(t *testing.T) { assert.Equal(t, tc.expectedExtractErr, err) if tc.expectedExtractErr == nil { - xctx, ok := sctx.(*spanContext) - require.True(t, ok) - - assert.Equal(t, carrier.SpanID, xctx.spanID) - assert.Equal(t, traceID, xctx.traceID.Lower()) + assert.Equal(t, carrier.SpanID, sctx.spanID) + assert.Equal(t, traceID, sctx.traceID.Lower()) - p, ok := xctx.SamplingPriority() + p, ok := sctx.SamplingPriority() assert.True(t, ok) assert.Equal(t, tc.samplingPriority, p) } @@ -213,6 +210,36 @@ func TestSQLCommentCarrier(t *testing.T) { } } +// https://github.com/DataDog/dd-trace-go/issues/2837 +func TestSQLCommentCarrierInjectNilSpan(t *testing.T) { + tracer, err := newTracer() + require.NoError(t, err) + defer tracer.Stop() + + headers := TextMapCarrier(map[string]string{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + originHeader: "synthetics", + b3TraceIDHeader: "0021dc1807524785", + traceparentHeader: "00-00000000000000000000000000000004-2222222222222222-01", + tracestateHeader: "dd=s:2;o:rum;p:0000000000000001;t.tid:1230000000000000~~,othervendor=t61rcWkgMzE", + }) + + spanCtx, err := tracer.Extract(headers) + require.NoError(t, err) + + carrier := SQLCommentCarrier{ + Query: "SELECT * from FOO", + Mode: DBMPropagationModeFull, + DBServiceName: "whiskey-db", + PeerDBHostname: "", + PeerDBName: "", + PeerService: "", + } + err = carrier.Inject(spanCtx) + require.NoError(t, err) +} + func TestExtractOpenTelemetryTraceInformation(t *testing.T) { // open-telemetry supports 128 bit trace ids traceID := "5bd66ef5095369c7b0d1f8f4bd33716a" @@ -231,14 +258,12 @@ func TestExtractOpenTelemetryTraceInformation(t *testing.T) { carrier := SQLCommentCarrier{Query: q} sctx, err := carrier.Extract() require.NoError(t, err) - xctx, ok := sctx.(*spanContext) - assert.True(t, ok) - assert.Equal(t, spanID, xctx.spanID) - assert.Equal(t, lower, xctx.traceID.Lower()) - assert.Equal(t, upper, xctx.traceID.Upper()) + assert.Equal(t, spanID, sctx.spanID) + assert.Equal(t, lower, sctx.traceID.Lower()) + assert.Equal(t, upper, sctx.traceID.Upper()) - p, ok := xctx.SamplingPriority() + p, ok := sctx.SamplingPriority() assert.True(t, ok) assert.Equal(t, priority, p) } @@ -257,7 +282,7 @@ func FuzzExtract(f *testing.F) { for _, tc := range testCases { f.Add(tc.query) } - f.Fuzz(func(t *testing.T, q string) { + f.Fuzz(func(_ *testing.T, q string) { carrier := SQLCommentCarrier{Query: q} carrier.Extract() // make sure it doesn't panic }) @@ -349,10 +374,10 @@ func BenchmarkSQLCommentExtraction(b *testing.B) { } } -func setupBenchmark() (*tracer, ddtrace.SpanContext, SQLCommentCarrier) { - tracer := newTracer(WithService("whiskey-service !#$%&'()*+,/:;=?@[]"), WithEnv("test-env"), WithServiceVersion("1.0.0")) - root := tracer.StartSpan("service.calling.db", WithSpanID(10)).(*span) - root.SetTag(ext.SamplingPriority, 2) +func setupBenchmark() (*tracer, *SpanContext, SQLCommentCarrier) { + tracer, _ := newTracer(WithService("whiskey-service !#$%&'()*+,/:;=?@[]"), WithEnv("test-env"), WithServiceVersion("1.0.0")) + root := tracer.StartSpan("service.calling.db", WithSpanID(10)) + root.SetTag(ext.ManualKeep, true) spanCtx := root.Context() carrier := SQLCommentCarrier{Query: "SELECT 1 FROM dual", Mode: DBMPropagationModeFull, DBServiceName: "whiskey-db"} return tracer, spanCtx, carrier diff --git a/ddtrace/tracer/stats.go b/ddtrace/tracer/stats.go index 8ad5da46ef..f6fb104b55 100644 --- a/ddtrace/tracer/stats.go +++ b/ddtrace/tracer/stats.go @@ -3,8 +3,6 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -//go:generate msgp -unexported -marshal=false -o=stats_msgp.go -tests=false - package tracer import ( @@ -12,25 +10,21 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/datadog-agent/pkg/obfuscate" + "github.com/DataDog/datadog-agent/pkg/trace/stats" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" "github.com/DataDog/datadog-go/v5/statsd" - "github.com/DataDog/sketches-go/ddsketch" - "google.golang.org/protobuf/proto" ) -// aggregableSpan holds necessary information about a span that can be used to -// aggregate statistics in a bucket. -type aggregableSpan struct { - // key specifies the aggregation key under which this span can be placed into - // grouped inside a bucket. - key aggregation - - Start, Duration int64 - Error int32 - TopLevel bool -} +// tracerObfuscationVersion indicates which version of stats obfuscation logic we implement +// In the future this can be pulled directly from our obfuscation import. +var tracerObfuscationVersion = 1 // defaultStatsBucketSize specifies the default span of time that will be // covered in one stats bucket. @@ -43,18 +37,15 @@ type concentrator struct { // In specifies the channel to be used for feeding data to the concentrator. // In order for In to have a consumer, the concentrator must be started using // a call to Start. - In chan *aggregableSpan - - // mu guards below fields - mu sync.Mutex - - // buckets maintains a set of buckets, where the map key represents - // the starting point in time of that bucket, in nanoseconds. - buckets map[int64]*rawBucket + In chan *tracerStatSpan // stopped reports whether the concentrator is stopped (when non-zero) stopped uint32 + spanConcentrator *stats.SpanConcentrator + + aggregationKey stats.PayloadAggregationKey + wg sync.WaitGroup // waits for any active goroutines bucketSize int64 // the size of a bucket in nanoseconds stop chan struct{} // closing this channel triggers shutdown @@ -62,15 +53,51 @@ type concentrator struct { statsdClient internal.StatsdClient // statsd client for sending metrics. } +type tracerStatSpan struct { + statSpan *stats.StatSpan + origin string +} + // newConcentrator creates a new concentrator using the given tracer // configuration c. It creates buckets of bucketSize nanoseconds duration. -func newConcentrator(c *config, bucketSize int64) *concentrator { +func newConcentrator(c *config, bucketSize int64, statsdClient internal.StatsdClient) *concentrator { + sCfg := &stats.SpanConcentratorConfig{ + ComputeStatsBySpanKind: true, + BucketInterval: defaultStatsBucketSize, + } + env := c.agent.defaultEnv + if c.env != "" { + env = c.env + } + if env == "" { + // We do this to avoid a panic in the stats calculation logic when env is empty + // This should never actually happen as the agent MUST have an env configured to start-up + // That panic will be removed in a future release at which point we can remove this + env = "unknown-env" + log.Debug("No DD Env found, normally the agent should have one") + } + gitCommitSha := "" + if c.ciVisibilityEnabled { + // We only have this data if we're in CI Visibility + gitCommitSha = utils.GetCITags()[constants.GitCommitSHA] + } + aggKey := stats.PayloadAggregationKey{ + Hostname: c.hostname, + Env: env, + Version: c.version, + ContainerID: "", // This intentionally left empty as the Agent will attach the container ID only in certain situations. + GitCommitSha: gitCommitSha, + ImageTag: "", + } + spanConcentrator := stats.NewSpanConcentrator(sCfg, time.Now()) return &concentrator{ - In: make(chan *aggregableSpan, 10000), - bucketSize: bucketSize, - stopped: 1, - buckets: make(map[int64]*rawBucket), - cfg: c, + In: make(chan *tracerStatSpan, 10000), + bucketSize: bucketSize, + stopped: 1, + cfg: c, + aggregationKey: aggKey, + spanConcentrator: spanConcentrator, + statsdClient: statsdClient, } } @@ -116,7 +143,7 @@ func (c *concentrator) runFlusher(tick <-chan time.Time) { // statsd returns any tracer configured statsd client, or a no-op. func (c *concentrator) statsd() internal.StatsdClient { if c.statsdClient == nil { - return &statsd.NoOpClient{} + return &statsd.NoOpClientDirect{} } return c.statsdClient } @@ -135,18 +162,48 @@ func (c *concentrator) runIngester() { } } -// add adds s into the concentrator's internal stats buckets. -func (c *concentrator) add(s *aggregableSpan) { - c.mu.Lock() - defer c.mu.Unlock() +func (c *concentrator) newTracerStatSpan(s *Span, obfuscator *obfuscate.Obfuscator) (*tracerStatSpan, bool) { + resource := s.resource + if c.shouldObfuscate() { + resource = obfuscatedResource(obfuscator, s.spanType, s.resource) + } - btime := alignTs(s.Start+s.Duration, c.bucketSize) - b, ok := c.buckets[btime] + httpMethod := s.meta[ext.HTTPMethod] + httpEndpoint := s.meta[ext.HTTPEndpoint] + + statSpan, ok := c.spanConcentrator.NewStatSpanWithConfig(stats.StatSpanConfig{ + Service: s.service, + Resource: resource, + Name: s.name, + Type: s.spanType, + ParentID: s.parentID, + Start: s.start, + Duration: s.duration, + Error: s.error, + Meta: s.meta, + Metrics: s.metrics, + PeerTags: c.cfg.agent.peerTags, + HTTPMethod: httpMethod, + HTTPEndpoint: httpEndpoint, + }) if !ok { - b = newRawBucket(uint64(btime), c.bucketSize) - c.buckets[btime] = b + return nil, false } - b.handleSpan(s) + origin := s.meta[keyOrigin] + return &tracerStatSpan{ + statSpan: statSpan, + origin: origin, + }, true +} + +func (c *concentrator) shouldObfuscate() bool { + // Obfuscate if agent reports an obfuscation version AND our version is at least as new + return c.cfg.agent.obfuscationVersion > 0 && c.cfg.agent.obfuscationVersion <= tracerObfuscationVersion +} + +// add s into the concentrator's internal stats buckets. +func (c *concentrator) add(s *tracerStatSpan) { + c.spanConcentrator.AddSpan(s.statSpan, c.aggregationKey, "", nil, s.origin) } // Stop stops the concentrator and blocks until the operation completes. @@ -177,186 +234,30 @@ const ( // flushAndSend flushes all the stats buckets with the given timestamp and sends them using the transport specified in // the concentrator config. The current bucket is only included if includeCurrent is true, such as during shutdown. func (c *concentrator) flushAndSend(timenow time.Time, includeCurrent bool) { - sp := func() statsPayload { - c.mu.Lock() - defer c.mu.Unlock() - now := timenow.UnixNano() - sp := statsPayload{ - Hostname: c.cfg.hostname, - Env: c.cfg.env, - Version: c.cfg.version, - Stats: make([]statsBucket, 0, len(c.buckets)), - } - for ts, srb := range c.buckets { - if !includeCurrent && ts > now-c.bucketSize { - // do not flush the current bucket - continue - } - log.Debug("Flushing bucket %d", ts) - sp.Stats = append(sp.Stats, srb.Export()) - delete(c.buckets, ts) - } - return sp - }() - - if len(sp.Stats) == 0 { - // nothing to flush - return - } - c.statsd().Incr("datadog.tracer.stats.flush_payloads", nil, 1) - c.statsd().Incr("datadog.tracer.stats.flush_buckets", nil, float64(len(sp.Stats))) - if err := c.cfg.transport.sendStats(&sp); err != nil { - c.statsd().Incr("datadog.tracer.stats.flush_errors", nil, 1) - log.Error("Error sending stats payload: %v", err) - } -} - -// aggregation specifies a uniquely identifiable key under which a certain set -// of stats are grouped inside a bucket. -type aggregation struct { - Name string - Type string - Resource string - Service string - StatusCode uint32 - Synthetics bool - IsTraceRoot trilean -} + csps := c.spanConcentrator.Flush(timenow.UnixNano(), includeCurrent) -type rawBucket struct { - start, duration uint64 - data map[aggregation]*rawGroupedStats -} - -func newRawBucket(btime uint64, bsize int64) *rawBucket { - return &rawBucket{ - start: btime, - duration: uint64(bsize), - data: make(map[aggregation]*rawGroupedStats), - } -} - -func (sb *rawBucket) handleSpan(s *aggregableSpan) { - gs, ok := sb.data[s.key] - if !ok { - gs = newRawGroupedStats() - sb.data[s.key] = gs - } - if s.TopLevel { - gs.topLevelHits++ - } - gs.hits++ - if s.Error != 0 { - gs.errors++ - } - gs.duration += uint64(s.Duration) - // alter resolution of duration distro - trundur := nsTimestampToFloat(s.Duration) - if s.Error != 0 { - gs.errDistribution.Add(trundur) + obfVersion := 0 + if c.shouldObfuscate() { + obfVersion = tracerObfuscationVersion } else { - gs.okDistribution.Add(trundur) + log.Debug("Stats Obfuscation was skipped, agent will obfuscate (tracer %d, agent %d)", tracerObfuscationVersion, c.cfg.agent.obfuscationVersion) } -} -// Export transforms a RawBucket into a statsBucket, typically used -// before communicating data to the API, as RawBucket is the internal -// type while statsBucket is the public, shared one. -func (sb *rawBucket) Export() statsBucket { - csb := statsBucket{ - Start: sb.start, - Duration: sb.duration, - Stats: make([]groupedStats, len(sb.data)), + if len(csps) == 0 { + // nothing to flush + return } - for k, v := range sb.data { - b, err := v.export(k) - if err != nil { - log.Error("Could not export stats bucket: %v.", err) - continue + c.statsd().Incr("datadog.tracer.stats.flush_payloads", nil, float64(len(csps))) + flushedBuckets := 0 + // Given we use a constant PayloadAggregationKey there should only ever be 1 of these, but to be forward + // compatible in case this ever changes we can just iterate through all of them. + for _, csp := range csps { + csp.ProcessTags = processtags.GlobalTags().String() + flushedBuckets += len(csp.Stats) + if err := c.cfg.transport.sendStats(csp, obfVersion); err != nil { + c.statsd().Incr("datadog.tracer.stats.flush_errors", nil, 1) + log.Error("Error sending stats payload: %s", err.Error()) } - csb.Stats = append(csb.Stats, b) - } - return csb -} - -type trilean int32 - -const ( - trileanNotSet trilean = iota - trileanTrue - trileanFalse -) - -type rawGroupedStats struct { - hits uint64 - topLevelHits uint64 - errors uint64 - duration uint64 - okDistribution *ddsketch.DDSketch - errDistribution *ddsketch.DDSketch - IsTraceRoot trilean -} - -func newRawGroupedStats() *rawGroupedStats { - const ( - // relativeAccuracy is the value accuracy we have on the percentiles. For example, we can - // say that p99 is 100ms +- 1ms - relativeAccuracy = 0.01 - // maxNumBins is the maximum number of bins of the ddSketch we use to store percentiles. - // It can affect relative accuracy, but in practice, 2048 bins is enough to have 1% relative accuracy from - // 80 micro second to 1 year: http://www.vldb.org/pvldb/vol12/p2195-masson.pdf - maxNumBins = 2048 - ) - okSketch, err := ddsketch.LogCollapsingLowestDenseDDSketch(relativeAccuracy, maxNumBins) - if err != nil { - log.Error("Error when creating ddsketch: %v", err) - } - errSketch, err := ddsketch.LogCollapsingLowestDenseDDSketch(relativeAccuracy, maxNumBins) - if err != nil { - log.Error("Error when creating ddsketch: %v", err) - } - return &rawGroupedStats{ - okDistribution: okSketch, - errDistribution: errSketch, - } -} - -func (s *rawGroupedStats) export(k aggregation) (groupedStats, error) { - msg := s.okDistribution.ToProto() - okSummary, err := proto.Marshal(msg) - if err != nil { - return groupedStats{}, err - } - msg = s.errDistribution.ToProto() - errSummary, err := proto.Marshal(msg) - if err != nil { - return groupedStats{}, err - } - return groupedStats{ - Service: k.Service, - Name: k.Name, - Resource: k.Resource, - HTTPStatusCode: k.StatusCode, - Type: k.Type, - Hits: s.hits, - Errors: s.errors, - Duration: s.duration, - TopLevelHits: s.topLevelHits, - OkSummary: okSummary, - ErrorSummary: errSummary, - Synthetics: k.Synthetics, - IsTraceRoot: int32(k.IsTraceRoot), - }, nil -} - -// nsTimestampToFloat converts a nanosec timestamp into a float nanosecond timestamp truncated to a fixed precision -func nsTimestampToFloat(ns int64) float64 { - // 10 bits precision (any value will be +/- 1/1024) - const roundMask int64 = 1 << 10 - var shift uint - for ns > roundMask { - ns = ns >> 1 - shift++ } - return float64(ns << shift) + c.statsd().Incr("datadog.tracer.stats.flush_buckets", nil, float64(flushedBuckets)) } diff --git a/ddtrace/tracer/stats_payload.go b/ddtrace/tracer/stats_payload.go deleted file mode 100644 index 3b77128b7a..0000000000 --- a/ddtrace/tracer/stats_payload.go +++ /dev/null @@ -1,57 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -//go:generate msgp -unexported -marshal=false -o=stats_payload_msgp.go -tests=false - -package tracer - -// statsPayload specifies information about client computed stats and is encoded -// to be sent to the agent. -type statsPayload struct { - // Hostname specifies the hostname of the application. - Hostname string - - // Env specifies the env. of the application, as defined by the user. - Env string - - // Version specifies the application version. - Version string - - // Stats holds all stats buckets computed within this payload. - Stats []statsBucket -} - -// statsBucket specifies a set of stats computed over a duration. -type statsBucket struct { - // Start specifies the beginning of this bucket. - Start uint64 - - // Duration specifies the duration of this bucket. - Duration uint64 - - // Stats contains a set of statistics computed for the duration of this bucket. - Stats []groupedStats -} - -// groupedStats contains a set of statistics grouped under various aggregation keys. -type groupedStats struct { - // These fields indicate the properties under which the stats were aggregated. - Service string `json:"service,omitempty"` - Name string `json:"name,omitempty"` - Resource string `json:"resource,omitempty"` - HTTPStatusCode uint32 `json:"HTTP_status_code,omitempty"` - Type string `json:"type,omitempty"` - DBType string `json:"DB_type,omitempty"` - - // These fields specify the stats for the above aggregation. - Hits uint64 `json:"hits,omitempty"` - Errors uint64 `json:"errors,omitempty"` - Duration uint64 `json:"duration,omitempty"` - OkSummary []byte `json:"okSummary,omitempty"` - ErrorSummary []byte `json:"errorSummary,omitempty"` - Synthetics bool `json:"synthetics,omitempty"` - TopLevelHits uint64 `json:"topLevelHits,omitempty"` - IsTraceRoot int32 `json:"isTraceRoot,omitempty"` -} diff --git a/ddtrace/tracer/stats_payload_msgp.go b/ddtrace/tracer/stats_payload_msgp.go deleted file mode 100644 index 70a3a0b4c4..0000000000 --- a/ddtrace/tracer/stats_payload_msgp.go +++ /dev/null @@ -1,516 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. -package tracer - -// Code generated by github.com/tinylib/msgp DO NOT EDIT. - -import ( - "github.com/tinylib/msgp/msgp" -) - -// DecodeMsg implements msgp.Decodable -func (z *groupedStats) DecodeMsg(dc *msgp.Reader) (err error) { - var field []byte - _ = field - var zb0001 uint32 - zb0001, err = dc.ReadMapHeader() - if err != nil { - err = msgp.WrapError(err) - return - } - for zb0001 > 0 { - zb0001-- - field, err = dc.ReadMapKeyPtr() - if err != nil { - err = msgp.WrapError(err) - return - } - switch msgp.UnsafeString(field) { - case "Service": - z.Service, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Service") - return - } - case "Name": - z.Name, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Name") - return - } - case "Resource": - z.Resource, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Resource") - return - } - case "HTTPStatusCode": - z.HTTPStatusCode, err = dc.ReadUint32() - if err != nil { - err = msgp.WrapError(err, "HTTPStatusCode") - return - } - case "Type": - z.Type, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Type") - return - } - case "DBType": - z.DBType, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "DBType") - return - } - case "Hits": - z.Hits, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "Hits") - return - } - case "Errors": - z.Errors, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "Errors") - return - } - case "Duration": - z.Duration, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "Duration") - return - } - case "OkSummary": - z.OkSummary, err = dc.ReadBytes(z.OkSummary) - if err != nil { - err = msgp.WrapError(err, "OkSummary") - return - } - case "ErrorSummary": - z.ErrorSummary, err = dc.ReadBytes(z.ErrorSummary) - if err != nil { - err = msgp.WrapError(err, "ErrorSummary") - return - } - case "Synthetics": - z.Synthetics, err = dc.ReadBool() - if err != nil { - err = msgp.WrapError(err, "Synthetics") - return - } - case "TopLevelHits": - z.TopLevelHits, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "TopLevelHits") - return - } - case "IsTraceRoot": - z.IsTraceRoot, err = dc.ReadInt32() - if err != nil { - err = msgp.WrapError(err, "IsTraceRoot") - return - } - default: - err = dc.Skip() - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - return -} - -// EncodeMsg implements msgp.Encodable -func (z *groupedStats) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 14 - // write "Service" - err = en.Append(0x8e, 0xa7, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Service) - if err != nil { - err = msgp.WrapError(err, "Service") - return - } - // write "Name" - err = en.Append(0xa4, 0x4e, 0x61, 0x6d, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Name) - if err != nil { - err = msgp.WrapError(err, "Name") - return - } - // write "Resource" - err = en.Append(0xa8, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Resource) - if err != nil { - err = msgp.WrapError(err, "Resource") - return - } - // write "HTTPStatusCode" - err = en.Append(0xae, 0x48, 0x54, 0x54, 0x50, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65) - if err != nil { - return - } - err = en.WriteUint32(z.HTTPStatusCode) - if err != nil { - err = msgp.WrapError(err, "HTTPStatusCode") - return - } - // write "Type" - err = en.Append(0xa4, 0x54, 0x79, 0x70, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Type) - if err != nil { - err = msgp.WrapError(err, "Type") - return - } - // write "DBType" - err = en.Append(0xa6, 0x44, 0x42, 0x54, 0x79, 0x70, 0x65) - if err != nil { - return - } - err = en.WriteString(z.DBType) - if err != nil { - err = msgp.WrapError(err, "DBType") - return - } - // write "Hits" - err = en.Append(0xa4, 0x48, 0x69, 0x74, 0x73) - if err != nil { - return - } - err = en.WriteUint64(z.Hits) - if err != nil { - err = msgp.WrapError(err, "Hits") - return - } - // write "Errors" - err = en.Append(0xa6, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73) - if err != nil { - return - } - err = en.WriteUint64(z.Errors) - if err != nil { - err = msgp.WrapError(err, "Errors") - return - } - // write "Duration" - err = en.Append(0xa8, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e) - if err != nil { - return - } - err = en.WriteUint64(z.Duration) - if err != nil { - err = msgp.WrapError(err, "Duration") - return - } - // write "OkSummary" - err = en.Append(0xa9, 0x4f, 0x6b, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79) - if err != nil { - return - } - err = en.WriteBytes(z.OkSummary) - if err != nil { - err = msgp.WrapError(err, "OkSummary") - return - } - // write "ErrorSummary" - err = en.Append(0xac, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79) - if err != nil { - return - } - err = en.WriteBytes(z.ErrorSummary) - if err != nil { - err = msgp.WrapError(err, "ErrorSummary") - return - } - // write "Synthetics" - err = en.Append(0xaa, 0x53, 0x79, 0x6e, 0x74, 0x68, 0x65, 0x74, 0x69, 0x63, 0x73) - if err != nil { - return - } - err = en.WriteBool(z.Synthetics) - if err != nil { - err = msgp.WrapError(err, "Synthetics") - return - } - // write "TopLevelHits" - err = en.Append(0xac, 0x54, 0x6f, 0x70, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x48, 0x69, 0x74, 0x73) - if err != nil { - return - } - err = en.WriteUint64(z.TopLevelHits) - if err != nil { - err = msgp.WrapError(err, "TopLevelHits") - return - } - // write "IsTraceRoot" - err = en.Append(0xab, 0x49, 0x73, 0x54, 0x72, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x6f, 0x74) - if err != nil { - return - } - err = en.WriteInt32(z.IsTraceRoot) - if err != nil { - err = msgp.WrapError(err, "IsTraceRoot") - return - } - return -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *groupedStats) Msgsize() (s int) { - s = 1 + 8 + msgp.StringPrefixSize + len(z.Service) + 5 + msgp.StringPrefixSize + len(z.Name) + 9 + msgp.StringPrefixSize + len(z.Resource) + 15 + msgp.Uint32Size + 5 + msgp.StringPrefixSize + len(z.Type) + 7 + msgp.StringPrefixSize + len(z.DBType) + 5 + msgp.Uint64Size + 7 + msgp.Uint64Size + 9 + msgp.Uint64Size + 10 + msgp.BytesPrefixSize + len(z.OkSummary) + 13 + msgp.BytesPrefixSize + len(z.ErrorSummary) + 11 + msgp.BoolSize + 13 + msgp.Uint64Size + 12 + msgp.Int32Size - return -} - -// DecodeMsg implements msgp.Decodable -func (z *statsBucket) DecodeMsg(dc *msgp.Reader) (err error) { - var field []byte - _ = field - var zb0001 uint32 - zb0001, err = dc.ReadMapHeader() - if err != nil { - err = msgp.WrapError(err) - return - } - for zb0001 > 0 { - zb0001-- - field, err = dc.ReadMapKeyPtr() - if err != nil { - err = msgp.WrapError(err) - return - } - switch msgp.UnsafeString(field) { - case "Start": - z.Start, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "Start") - return - } - case "Duration": - z.Duration, err = dc.ReadUint64() - if err != nil { - err = msgp.WrapError(err, "Duration") - return - } - case "Stats": - var zb0002 uint32 - zb0002, err = dc.ReadArrayHeader() - if err != nil { - err = msgp.WrapError(err, "Stats") - return - } - if cap(z.Stats) >= int(zb0002) { - z.Stats = (z.Stats)[:zb0002] - } else { - z.Stats = make([]groupedStats, zb0002) - } - for za0001 := range z.Stats { - err = z.Stats[za0001].DecodeMsg(dc) - if err != nil { - err = msgp.WrapError(err, "Stats", za0001) - return - } - } - default: - err = dc.Skip() - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - return -} - -// EncodeMsg implements msgp.Encodable -func (z *statsBucket) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 3 - // write "Start" - err = en.Append(0x83, 0xa5, 0x53, 0x74, 0x61, 0x72, 0x74) - if err != nil { - return - } - err = en.WriteUint64(z.Start) - if err != nil { - err = msgp.WrapError(err, "Start") - return - } - // write "Duration" - err = en.Append(0xa8, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e) - if err != nil { - return - } - err = en.WriteUint64(z.Duration) - if err != nil { - err = msgp.WrapError(err, "Duration") - return - } - // write "Stats" - err = en.Append(0xa5, 0x53, 0x74, 0x61, 0x74, 0x73) - if err != nil { - return - } - err = en.WriteArrayHeader(uint32(len(z.Stats))) - if err != nil { - err = msgp.WrapError(err, "Stats") - return - } - for za0001 := range z.Stats { - err = z.Stats[za0001].EncodeMsg(en) - if err != nil { - err = msgp.WrapError(err, "Stats", za0001) - return - } - } - return -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *statsBucket) Msgsize() (s int) { - s = 1 + 6 + msgp.Uint64Size + 9 + msgp.Uint64Size + 6 + msgp.ArrayHeaderSize - for za0001 := range z.Stats { - s += z.Stats[za0001].Msgsize() - } - return -} - -// DecodeMsg implements msgp.Decodable -func (z *statsPayload) DecodeMsg(dc *msgp.Reader) (err error) { - var field []byte - _ = field - var zb0001 uint32 - zb0001, err = dc.ReadMapHeader() - if err != nil { - err = msgp.WrapError(err) - return - } - for zb0001 > 0 { - zb0001-- - field, err = dc.ReadMapKeyPtr() - if err != nil { - err = msgp.WrapError(err) - return - } - switch msgp.UnsafeString(field) { - case "Hostname": - z.Hostname, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Hostname") - return - } - case "Env": - z.Env, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Env") - return - } - case "Version": - z.Version, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - case "Stats": - var zb0002 uint32 - zb0002, err = dc.ReadArrayHeader() - if err != nil { - err = msgp.WrapError(err, "Stats") - return - } - if cap(z.Stats) >= int(zb0002) { - z.Stats = (z.Stats)[:zb0002] - } else { - z.Stats = make([]statsBucket, zb0002) - } - for za0001 := range z.Stats { - err = z.Stats[za0001].DecodeMsg(dc) - if err != nil { - err = msgp.WrapError(err, "Stats", za0001) - return - } - } - default: - err = dc.Skip() - if err != nil { - err = msgp.WrapError(err) - return - } - } - } - return -} - -// EncodeMsg implements msgp.Encodable -func (z *statsPayload) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 4 - // write "Hostname" - err = en.Append(0x84, 0xa8, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Hostname) - if err != nil { - err = msgp.WrapError(err, "Hostname") - return - } - // write "Env" - err = en.Append(0xa3, 0x45, 0x6e, 0x76) - if err != nil { - return - } - err = en.WriteString(z.Env) - if err != nil { - err = msgp.WrapError(err, "Env") - return - } - // write "Version" - err = en.Append(0xa7, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) - if err != nil { - return - } - err = en.WriteString(z.Version) - if err != nil { - err = msgp.WrapError(err, "Version") - return - } - // write "Stats" - err = en.Append(0xa5, 0x53, 0x74, 0x61, 0x74, 0x73) - if err != nil { - return - } - err = en.WriteArrayHeader(uint32(len(z.Stats))) - if err != nil { - err = msgp.WrapError(err, "Stats") - return - } - for za0001 := range z.Stats { - err = z.Stats[za0001].EncodeMsg(en) - if err != nil { - err = msgp.WrapError(err, "Stats", za0001) - return - } - } - return -} - -// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message -func (z *statsPayload) Msgsize() (s int) { - s = 1 + 9 + msgp.StringPrefixSize + len(z.Hostname) + 4 + msgp.StringPrefixSize + len(z.Env) + 8 + msgp.StringPrefixSize + len(z.Version) + 6 + msgp.ArrayHeaderSize - for za0001 := range z.Stats { - s += z.Stats[za0001].Msgsize() - } - return -} diff --git a/ddtrace/tracer/stats_test.go b/ddtrace/tracer/stats_test.go index 56e3eb029d..c760d3836f 100644 --- a/ddtrace/tracer/stats_test.go +++ b/ddtrace/tracer/stats_test.go @@ -11,22 +11,16 @@ import ( "time" "github.com/stretchr/testify/assert" -) + "github.com/stretchr/testify/require" -// waitForBuckets reports whether concentrator c contains n buckets within a 5ms -// period. -func waitForBuckets(c *concentrator, n int) bool { - for i := 0; i < 5; i++ { - time.Sleep(time.Millisecond * timeMultiplicator) - c.mu.Lock() - if len(c.buckets) == n { - c.mu.Unlock() - return true - } - c.mu.Unlock() - } - return false -} + "github.com/DataDog/datadog-agent/pkg/obfuscate" + "github.com/DataDog/datadog-go/v5/statsd" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" +) func TestAlignTs(t *testing.T) { now := time.Now().UnixNano() @@ -36,37 +30,22 @@ func TestAlignTs(t *testing.T) { } func TestConcentrator(t *testing.T) { - key1 := aggregation{ - Name: "http.request", + bucketSize := int64(500_000) + s1 := Span{ + name: "http.request", + start: time.Now().UnixNano() + 3*bucketSize, + duration: 1, + metrics: map[string]float64{keyMeasured: 1}, } - ss1 := &aggregableSpan{ - key: key1, - Start: time.Now().UnixNano() + 2*defaultStatsBucketSize, - Duration: (2 * time.Second).Nanoseconds(), + s2 := Span{ + name: "sql.query", + start: time.Now().UnixNano() + 4*bucketSize, + duration: 1, + metrics: map[string]float64{keyMeasured: 1}, } - key2 := aggregation{ - Name: "sql.query", - } - ss2 := &aggregableSpan{ - key: key2, - Start: time.Now().UnixNano() + 3*defaultStatsBucketSize, - Duration: (3 * time.Second).Nanoseconds(), - } - - t.Run("new", func(t *testing.T) { - assert := assert.New(t) - cfg := &config{version: "1.2.3"} - c := newConcentrator(cfg, defaultStatsBucketSize) - assert.Equal(cap(c.In), 10000) - assert.Nil(c.stop) - assert.NotNil(c.buckets) - assert.Equal(c.cfg, cfg) - assert.EqualValues(atomic.LoadUint32(&c.stopped), 1) - }) - t.Run("start-stop", func(t *testing.T) { assert := assert.New(t) - c := newConcentrator(&config{}, defaultStatsBucketSize) + c := newConcentrator(&config{}, bucketSize, &statsd.NoOpClientDirect{}) assert.EqualValues(atomic.LoadUint32(&c.stopped), 1) c.Start() assert.EqualValues(atomic.LoadUint32(&c.stopped), 0) @@ -82,98 +61,252 @@ func TestConcentrator(t *testing.T) { c.Stop() assert.EqualValues(atomic.LoadUint32(&c.stopped), 1) }) - - t.Run("valid", func(t *testing.T) { - c := newConcentrator(&config{}, defaultStatsBucketSize) - btime := alignTs(ss1.Start+ss1.Duration, defaultStatsBucketSize) - c.add(ss1) - assert.Len(t, c.buckets, 1) - b, ok := c.buckets[btime] - assert.True(t, ok) - assert.Equal(t, b.start, uint64(btime)) - assert.Equal(t, b.duration, uint64(defaultStatsBucketSize)) - }) - - t.Run("grouping", func(t *testing.T) { - c := newConcentrator(&config{}, defaultStatsBucketSize) - c.add(ss1) - c.add(ss1) - assert.Len(t, c.buckets, 1) - _, ok := c.buckets[alignTs(ss1.Start+ss1.Duration, defaultStatsBucketSize)] - assert.True(t, ok) - c.add(ss2) - assert.Len(t, c.buckets, 2) - _, ok = c.buckets[alignTs(ss2.Start+ss2.Duration, defaultStatsBucketSize)] - assert.True(t, ok) - }) - - t.Run("ingester", func(t *testing.T) { - transport := newDummyTransport() - c := newConcentrator(&config{transport: transport}, defaultStatsBucketSize) - c.Start() - assert.Len(t, c.buckets, 0) - c.In <- ss1 - if !waitForBuckets(c, 1) { - t.Fatal("sending to channel did not work") - } - c.Stop() - }) - t.Run("flusher", func(t *testing.T) { t.Run("old", func(t *testing.T) { transport := newDummyTransport() - c := newConcentrator(&config{transport: transport}, 500000) + c := newConcentrator(&config{transport: transport, env: "someEnv"}, 500_000, &statsd.NoOpClientDirect{}) assert.Len(t, transport.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) c.Start() - c.In <- &aggregableSpan{ - key: key2, - // Start must be older than latest bucket to get flushed - Start: time.Now().UnixNano() - 3*500000, - Duration: 1, - } - c.In <- &aggregableSpan{ - key: key2, - // Start must be older than latest bucket to get flushed - Start: time.Now().UnixNano() - 4*500000, - Duration: 1, - } + c.In <- ss1 time.Sleep(2 * time.Millisecond * timeMultiplicator) c.Stop() - assert.NotZero(t, transport.Stats()) + actualStats := transport.Stats() + assert.Len(t, actualStats, 1) + assert.Len(t, actualStats[0].Stats, 1) + assert.Len(t, actualStats[0].Stats[0].Stats, 1) + assert.Equal(t, "http.request", actualStats[0].Stats[0].Stats[0].Name) }) - t.Run("recent", func(t *testing.T) { + t.Run("recent+stats", func(t *testing.T) { transport := newDummyTransport() - c := newConcentrator(&config{transport: transport}, 500000) + testStats := &statsdtest.TestStatsdClient{} + c := newConcentrator(&config{transport: transport, env: "someEnv"}, (10 * time.Second).Nanoseconds(), testStats) assert.Len(t, transport.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) + ss2, ok := c.newTracerStatSpan(&s2, nil) + assert.True(t, ok) c.Start() - c.In <- &aggregableSpan{ - key: key2, - Start: time.Now().UnixNano() + 5*500000, - Duration: 1, - } - c.In <- &aggregableSpan{ - key: key1, - Start: time.Now().UnixNano() + 6*500000, - Duration: 1, + c.In <- ss1 + c.In <- ss2 + c.Stop() + actualStats := transport.Stats() + assert.Len(t, actualStats, 1) + assert.Len(t, actualStats[0].Stats, 1) + assert.Len(t, actualStats[0].Stats[0].Stats, 2) + names := map[string]struct{}{} + for _, stat := range actualStats[0].Stats[0].Stats { + names[stat.Name] = struct{}{} } + assert.Len(t, names, 2) + assert.NotNil(t, names["http.request"]) + assert.NotNil(t, names["potato"]) + assert.Contains(t, testStats.CallNames(), "datadog.tracer.stats.spans_in") + }) + + t.Run("ciGitSha", func(t *testing.T) { + utils.AddCITags(constants.GitCommitSHA, "DEADBEEF") + transport := newDummyTransport() + c := newConcentrator(&config{transport: transport, env: "someEnv", ciVisibilityEnabled: true}, (10 * time.Second).Nanoseconds(), &statsd.NoOpClientDirect{}) + assert.Len(t, transport.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) + c.Start() + c.In <- ss1 c.Stop() - assert.NotEmpty(t, transport.Stats()) + actualStats := transport.Stats() + assert.Equal(t, "DEADBEEF", actualStats[0].GitCommitSha) }) // stats should be sent if the concentrator is stopped t.Run("stop", func(t *testing.T) { transport := newDummyTransport() - c := newConcentrator(&config{transport: transport}, 500000) + c := newConcentrator(&config{transport: transport}, 500_000, &statsd.NoOpClientDirect{}) assert.Len(t, transport.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) c.Start() - c.In <- &aggregableSpan{ - key: key1, - Start: time.Now().UnixNano(), - Duration: 1, - } + c.In <- ss1 c.Stop() assert.NotEmpty(t, transport.Stats()) }) + + t.Run("processTagsEnabled", func(t *testing.T) { + processtags.Reload() + + transport := newDummyTransport() + c := newConcentrator(&config{transport: transport}, 500_000, &statsd.NoOpClientDirect{}) + assert.Len(t, transport.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) + c.Start() + c.In <- ss1 + c.Stop() + + gotStats := transport.Stats() + require.Len(t, gotStats, 1) + assert.NotEmpty(t, gotStats[0].ProcessTags) + }) + t.Run("processTagsDisabled", func(t *testing.T) { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "false") + processtags.Reload() + + transport := newDummyTransport() + c := newConcentrator(&config{transport: transport}, 500_000, &statsd.NoOpClientDirect{}) + assert.Len(t, transport.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) + c.Start() + c.In <- ss1 + c.Stop() + + gotStats := transport.Stats() + require.Len(t, gotStats, 1) + assert.Empty(t, gotStats[0].ProcessTags) + }) }) } + +func TestShouldObfuscate(t *testing.T) { + bucketSize := int64(500_000) + tsp := newDummyTransport() + for _, params := range []struct { + name string + tracerVersion int + agentVersion int + expectedShouldObfuscate bool + }{ + {name: "version equal", tracerVersion: 2, agentVersion: 2, expectedShouldObfuscate: true}, + {name: "agent version missing", tracerVersion: 2, agentVersion: 0, expectedShouldObfuscate: false}, + {name: "agent version older", tracerVersion: 2, agentVersion: 1, expectedShouldObfuscate: true}, + {name: "agent version newer", tracerVersion: 2, agentVersion: 3, expectedShouldObfuscate: false}, + } { + t.Run(params.name, func(t *testing.T) { + c := newConcentrator(&config{transport: tsp, env: "someEnv", agent: agentFeatures{obfuscationVersion: params.agentVersion}}, bucketSize, &statsd.NoOpClientDirect{}) + defer func(oldVersion int) { tracerObfuscationVersion = oldVersion }(tracerObfuscationVersion) + tracerObfuscationVersion = params.tracerVersion + assert.Equal(t, params.expectedShouldObfuscate, c.shouldObfuscate()) + }) + } +} + +func TestObfuscation(t *testing.T) { + bucketSize := int64(500_000) + s1 := Span{ + name: "redis-query", + start: time.Now().UnixNano() + 3*bucketSize, + duration: 1, + metrics: map[string]float64{keyMeasured: 1}, + spanType: "redis", + resource: "GET somekey", + } + tsp := newDummyTransport() + c := newConcentrator(&config{transport: tsp, env: "someEnv", agent: agentFeatures{obfuscationVersion: 2}}, bucketSize, &statsd.NoOpClientDirect{}) + defer func(oldVersion int) { tracerObfuscationVersion = oldVersion }(tracerObfuscationVersion) + tracerObfuscationVersion = 2 + + assert.Len(t, tsp.Stats(), 0) + ss1, ok := c.newTracerStatSpan(&s1, obfuscate.NewObfuscator(obfuscate.Config{})) + assert.True(t, ok) + c.Start() + c.In <- ss1 + c.Stop() + actualStats := tsp.Stats() + assert.Len(t, actualStats, 1) + assert.Len(t, actualStats[0].Stats, 1) + assert.Len(t, actualStats[0].Stats[0].Stats, 1) + assert.Equal(t, 2, tsp.obfVersion) + assert.Equal(t, "GET", actualStats[0].Stats[0].Stats[0].Resource) +} + +func TestStatsByKind(t *testing.T) { + s1 := Span{ + name: "http.request", + start: time.Now().UnixNano(), + duration: 1, + metrics: map[string]float64{keyMeasured: 0}, + } + s2 := Span{ + name: "sql.query", + start: time.Now().UnixNano(), + duration: 1, + metrics: map[string]float64{keyMeasured: 0}, + } + s1.SetTag("span.kind", "client") + s2.SetTag("span.kind", "invalid") + + c := newConcentrator(&config{transport: newDummyTransport(), env: "someEnv"}, 100, &statsd.NoOpClientDirect{}) + _, ok := c.newTracerStatSpan(&s1, nil) + assert.True(t, ok) + + _, ok = c.newTracerStatSpan(&s2, nil) + assert.False(t, ok) +} + +func TestConcentratorDefaultEnv(t *testing.T) { + assert := assert.New(t) + + t.Run("uses-agent-default-env-when-no-tracer-env", func(t *testing.T) { + cfg := &config{ + transport: newDummyTransport(), + agent: agentFeatures{defaultEnv: "agent-prod"}, + } + c := newConcentrator(cfg, 100, &statsd.NoOpClientDirect{}) + assert.Equal("agent-prod", c.aggregationKey.Env) + }) + + t.Run("prefers-tracer-env-over-agent-default", func(t *testing.T) { + cfg := &config{ + transport: newDummyTransport(), + env: "tracer-staging", + agent: agentFeatures{defaultEnv: "agent-prod"}, + } + c := newConcentrator(cfg, 100, &statsd.NoOpClientDirect{}) + assert.Equal("tracer-staging", c.aggregationKey.Env) + }) + + t.Run("falls-back-to-unknown-env-when-both-empty", func(t *testing.T) { + cfg := &config{ + transport: newDummyTransport(), + agent: agentFeatures{}, + } + c := newConcentrator(cfg, 100, &statsd.NoOpClientDirect{}) + assert.Equal("unknown-env", c.aggregationKey.Env) + }) +} + +func TestStatsIncludeHTTPMethodAndEndpoint(t *testing.T) { + uniqueMethod := "POST" + uniqueEndpoint := "/__unique_endpoint__" + + bucketSize := int64(500_000) + s := Span{ + name: "http.request", + start: time.Now().UnixNano(), + duration: int64(time.Millisecond), + metrics: map[string]float64{keyMeasured: 1}, + meta: map[string]string{ + ext.HTTPMethod: uniqueMethod, + ext.HTTPEndpoint: uniqueEndpoint, + }, + } + transport := newDummyTransport() + c := newConcentrator(&config{transport: transport, env: "someEnv"}, bucketSize, &statsd.NoOpClientDirect{}) + ss, ok := c.newTracerStatSpan(&s, nil) + require.True(t, ok) + c.Start() + c.In <- ss + c.Stop() + + actualStats := transport.Stats() + require.NotEmpty(t, actualStats) + + // Assert via typed fields in the aggregation key + require.Len(t, actualStats[0].Stats, 1) + require.NotEmpty(t, actualStats[0].Stats[0].Stats) + group := actualStats[0].Stats[0].Stats[0] + assert.Equal(t, uniqueMethod, group.GetHTTPMethod()) + assert.Equal(t, uniqueEndpoint, group.GetHTTPEndpoint()) +} diff --git a/ddtrace/tracer/telemetry.go b/ddtrace/tracer/telemetry.go index fe4615916c..4704efd773 100644 --- a/ddtrace/tracer/telemetry.go +++ b/ddtrace/tracer/telemetry.go @@ -9,7 +9,9 @@ import ( "fmt" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) var additionalConfigs []telemetry.Configuration @@ -26,26 +28,20 @@ func reportTelemetryOnAppStarted(c telemetry.Configuration) { // event is sent with tracer config data. // Note that the tracer is not considered as a standalone product by telemetry so we cannot send // an app-product-change event for the tracer. -func startTelemetry(c *config) { +func startTelemetry(c *config) telemetry.Client { if telemetry.Disabled() { // Do not do extra work populating config data if instrumentation telemetry is disabled. - return + return nil } - telemetry.GlobalClient.ApplyOps( - telemetry.WithService(c.serviceName), - telemetry.WithEnv(c.env), - telemetry.WithHTTPClient(c.httpClient), - // c.logToStdout is true if serverless is turned on - telemetry.WithURL(c.logToStdout, c.agentURL.String()), - telemetry.WithVersion(c.version), - ) + + telemetry.ProductStarted(telemetry.NamespaceTracers) telemetryConfigs := []telemetry.Configuration{ - {Name: "trace_debug_enabled", Value: c.debug}, {Name: "agent_feature_drop_p0s", Value: c.agent.DropP0s}, {Name: "stats_computation_enabled", Value: c.canComputeStats()}, {Name: "dogstatsd_port", Value: c.agent.StatsdPort}, {Name: "lambda_mode", Value: c.logToStdout}, {Name: "send_retries", Value: c.sendRetries}, + {Name: "retry_interval", Value: c.retryInterval}, {Name: "trace_startup_logs_enabled", Value: c.logStartup}, {Name: "service", Value: c.serviceName}, {Name: "universal_version", Value: c.universalVersion}, @@ -53,21 +49,21 @@ func startTelemetry(c *config) { {Name: "version", Value: c.version}, {Name: "trace_agent_url", Value: c.agentURL.String()}, {Name: "agent_hostname", Value: c.hostname}, - {Name: "runtime_metrics_enabled", Value: c.runtimeMetrics}, + {Name: "runtime_metrics_v2_enabled", Value: c.runtimeMetricsV2}, {Name: "dogstatsd_addr", Value: c.dogstatsdAddr}, {Name: "debug_stack_enabled", Value: !c.noDebugStack}, {Name: "profiling_hotspots_enabled", Value: c.profilerHotspots}, {Name: "profiling_endpoints_enabled", Value: c.profilerEndpoints}, {Name: "trace_span_attribute_schema", Value: c.spanAttributeSchemaVersion}, {Name: "trace_peer_service_defaults_enabled", Value: c.peerServiceDefaultsEnabled}, - {Name: "orchestrion_enabled", Value: c.orchestrionCfg.Enabled}, + {Name: "orchestrion_enabled", Value: c.orchestrionCfg.Enabled, Origin: telemetry.OriginCode}, {Name: "trace_enabled", Value: c.enabled.current, Origin: c.enabled.cfgOrigin}, {Name: "trace_log_directory", Value: c.logDirectory}, c.traceSampleRate.toTelemetry(), c.headerAsTags.toTelemetry(), c.globalTags.toTelemetry(), c.traceSampleRules.toTelemetry(), - telemetry.Sanitize(telemetry.Configuration{Name: "span_sample_rules", Value: c.spanRules}), + {Name: "span_sample_rules", Value: c.spanRules}, } var peerServiceMapping []string for key, value := range c.peerServiceMappings { @@ -106,10 +102,29 @@ func startTelemetry(c *config) { Value: fmt.Sprintf("rate:%f_maxPerSecond:%f", rule.Rate, rule.MaxPerSecond)}) } if c.orchestrionCfg.Enabled { - for k, v := range c.orchestrionCfg.Metadata { - telemetryConfigs = append(telemetryConfigs, telemetry.Configuration{Name: "orchestrion_" + k, Value: v}) - } + telemetryConfigs = append(telemetryConfigs, telemetry.Configuration{Name: "orchestrion_version", Value: c.orchestrionCfg.Metadata.Version, Origin: telemetry.OriginCode}) } telemetryConfigs = append(telemetryConfigs, additionalConfigs...) - telemetry.GlobalClient.ProductChange(telemetry.NamespaceTracers, true, telemetryConfigs) + telemetry.RegisterAppConfigs(telemetryConfigs...) + cfg := telemetry.ClientConfig{ + HTTPClient: c.httpClient, + AgentURL: c.agentURL.String(), + } + if c.logToStdout || c.ciVisibilityAgentless { + cfg.APIKey = env.Get("DD_API_KEY") + } + client, err := telemetry.NewClient(c.serviceName, c.env, c.version, cfg) + if err != nil { + log.Debug("tracer: failed to create telemetry client: %s", err.Error()) + return nil + } + + if c.orchestrionCfg.Enabled { + // If orchestrion is enabled, report it to the back-end via a telemetry metric on every flush. + handle := client.Gauge(telemetry.NamespaceTracers, "orchestrion.enabled", []string{"version:" + c.orchestrionCfg.Metadata.Version}) + client.AddFlushTicker(func(_ telemetry.Client) { handle.Submit(1) }) + } + + telemetry.StartApp(client) + return client } diff --git a/ddtrace/tracer/telemetry_test.go b/ddtrace/tracer/telemetry_test.go index 6dee152e14..6857ca08ce 100644 --- a/ddtrace/tracer/telemetry_test.go +++ b/ddtrace/tracer/telemetry_test.go @@ -7,22 +7,42 @@ package tracer import ( "fmt" + "net/http" + "net/http/httptest" + "net/url" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" - "gopkg.in/DataDog/dd-trace-go.v1/profiler" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/profiler" "github.com/stretchr/testify/assert" ) func TestTelemetryEnabled(t *testing.T) { t.Run("tracer start", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() + + // Create mock agent server with /info endpoint + // stats_computation_enabled depends on the trace-agent exposing this endpoint + mockAgent := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/info" { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"endpoints": ["/v0.4/traces", "/v0.6/stats"]}`)) + return + } + w.WriteHeader(http.StatusOK) + })) + defer mockAgent.Close() + + agentURL, err := url.Parse(mockAgent.URL) + assert.NoError(t, err) Start( + WithStatsComputation(true), WithDebugMode(true), WithService("test-serv"), WithEnv("test-env"), @@ -31,46 +51,50 @@ func TestTelemetryEnabled(t *testing.T) { WithPeerServiceDefaults(true), WithDebugStack(false), WithHeaderTags([]string{"key:val", "key2:val2"}), + WithAgentAddr(agentURL.Host), WithSamplingRules( - []SamplingRule{TagsResourceRule( - map[string]string{"tag-a": "tv-a??"}, - "resource-*", "op-name", "test-serv", 0.1), - }, + TraceSamplingRules( + Rule{ + Tags: map[string]string{"tag-a": "tv-a??"}, + ResourceGlob: "resource-*", + NameGlob: "op-name", + ServiceGlob: "test-serv", + Rate: 0.1, + }, + ), ), ) defer globalconfig.SetServiceName("") defer Stop() - assert.True(t, telemetryClient.Started) - telemetryClient.AssertNumberOfCalls(t, "ApplyOps", 1) - telemetry.Check(t, telemetryClient.Configuration, "trace_debug_enabled", true) - telemetry.Check(t, telemetryClient.Configuration, "service", "test-serv") - telemetry.Check(t, telemetryClient.Configuration, "env", "test-env") - telemetry.Check(t, telemetryClient.Configuration, "runtime_metrics_enabled", true) - telemetry.Check(t, telemetryClient.Configuration, "stats_computation_enabled", false) - telemetry.Check(t, telemetryClient.Configuration, "trace_enabled", true) - telemetry.Check(t, telemetryClient.Configuration, "trace_span_attribute_schema", 0) - telemetry.Check(t, telemetryClient.Configuration, "trace_peer_service_defaults_enabled", true) - telemetry.Check(t, telemetryClient.Configuration, "trace_peer_service_mapping", "key:val") - telemetry.Check(t, telemetryClient.Configuration, "debug_stack_enabled", false) - telemetry.Check(t, telemetryClient.Configuration, "orchestrion_enabled", false) - telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rate", nil) // default value is NaN which is sanitized to nil - telemetry.Check(t, telemetryClient.Configuration, "trace_header_tags", "key:val,key2:val2") - telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rules", + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_debug_enabled", true) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "service", "test-serv") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "env", "test-env") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "runtime_metrics_enabled", true) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "stats_computation_enabled", true) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_enabled", true) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_span_attribute_schema", 0) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_peer_service_defaults_enabled", true) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_peer_service_mapping", "key:val") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "debug_stack_enabled", false) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "orchestrion_enabled", false) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_sample_rate", nil) // default value is NaN which is sanitized to nil + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_header_tags", "key:val,key2:val2") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_sample_rules", `[{"service":"test-serv","name":"op-name","resource":"resource-*","sample_rate":0.1,"tags":{"tag-a":"tv-a??"}}]`) - telemetry.Check(t, telemetryClient.Configuration, "span_sample_rules", "[]") - if metrics, ok := telemetryClient.Metrics[telemetry.NamespaceGeneral]; ok { - if initTime, ok := metrics["init_time"]; ok { - assert.True(t, initTime > 0) - return - } - t.Fatalf("could not find general init time in telemetry client metrics") - } - t.Fatalf("could not find tracer namespace in telemetry client metrics") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "span_sample_rules", "[]") + + assert.NotZero(t, telemetryClient.Distribution(telemetry.NamespaceGeneral, "init_time", nil).Get()) }) t.Run("telemetry customer or dynamic rules", func(t *testing.T) { - rule := TagsResourceRule(map[string]string{"tag-a": "tv-a??"}, "resource-*", "op-name", "test-serv", 0.1) + rule := TraceSamplingRules(Rule{ + Tags: map[string]string{"tag-a": "tv-a??"}, + ResourceGlob: "resource-*", + NameGlob: "op-name", + ServiceGlob: "test-serv", + Rate: 0.1, + })[0] for _, prov := range provenances { if prov == Local { @@ -78,49 +102,49 @@ func TestTelemetryEnabled(t *testing.T) { } rule.Provenance = prov - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() Start(WithService("test-serv"), WithSamplingRules([]SamplingRule{rule}), ) defer globalconfig.SetServiceName("") defer Stop() - assert.True(t, telemetryClient.Started) - telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rules", + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_sample_rules", fmt.Sprintf(`[{"service":"test-serv","name":"op-name","resource":"resource-*","sample_rate":0.1,"tags":{"tag-a":"tv-a??"},"provenance":"%s"}]`, prov.String())) } }) t.Run("telemetry local rules", func(t *testing.T) { - rules := []SamplingRule{ - TagsResourceRule(map[string]string{"tag-a": "tv-a??"}, "resource-*", "op-name", "test-serv", 0.1), + rules := TraceSamplingRules( + Rule{Tags: map[string]string{"tag-a": "tv-a??"}, ResourceGlob: "resource-*", NameGlob: "op-name", ServiceGlob: "test-serv", Rate: 0.1}, + ) + rules = append(rules, SpanSamplingRules( // Span rules can have only local provenance for now. - SpanNameServiceRule("op-name", "test-serv", 0.1), - } + Rule{NameGlob: "op-name", ServiceGlob: "test-serv", Rate: 0.1}, + )...) for i := range rules { rules[i].Provenance = Local } - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() Start(WithService("test-serv"), WithSamplingRules(rules), ) defer globalconfig.SetServiceName("") defer Stop() - assert.True(t, telemetryClient.Started) - telemetry.Check(t, telemetryClient.Configuration, "trace_sample_rules", + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_sample_rules", `[{"service":"test-serv","name":"op-name","resource":"resource-*","sample_rate":0.1,"tags":{"tag-a":"tv-a??"}}]`) - telemetry.Check(t, telemetryClient.Configuration, "span_sample_rules", + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "span_sample_rules", `[{"service":"test-serv","name":"op-name","sample_rate":0.1}]`) }) t.Run("tracer start with empty rules", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() t.Setenv("DD_TRACE_SAMPLING_RULES", "") t.Setenv("DD_SPAN_SAMPLING_RULES", "") @@ -128,18 +152,13 @@ func TestTelemetryEnabled(t *testing.T) { defer globalconfig.SetServiceName("") defer Stop() - assert.True(t, telemetryClient.Started) - var cfgs []telemetry.Configuration - for _, c := range telemetryClient.Configuration { - cfgs = append(cfgs, telemetry.Sanitize(c)) - } - telemetry.Check(t, cfgs, "trace_sample_rules", "[]") - telemetry.Check(t, cfgs, "span_sample_rules", "[]") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "trace_sample_rules", "[]") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "span_sample_rules", "[]") }) t.Run("profiler start, tracer start", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() profiler.Start() defer profiler.Stop() Start( @@ -147,18 +166,21 @@ func TestTelemetryEnabled(t *testing.T) { ) defer globalconfig.SetServiceName("") defer Stop() - telemetry.Check(t, telemetryClient.Configuration, "service", "test-serv") - telemetryClient.AssertNumberOfCalls(t, "ApplyOps", 2) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "service", "test-serv") }) t.Run("orchestrion telemetry", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() - Start(WithOrchestrion(map[string]string{"k1": "v1", "k2": "v2"})) + Start(func(c *config) { + c.orchestrionCfg = orchestrionConfig{ + Enabled: true, + Metadata: &orchestrionMetadata{Version: "v1337.42.0-phony"}, + } + }) defer Stop() - telemetry.Check(t, telemetryClient.Configuration, "orchestrion_enabled", true) - telemetry.Check(t, telemetryClient.Configuration, "orchestrion_k1", "v1") - telemetry.Check(t, telemetryClient.Configuration, "orchestrion_k2", "v2") + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "orchestrion_enabled", true) + telemetrytest.CheckConfig(t, telemetryClient.Configuration, "orchestrion_version", "v1337.42.0-phony") }) } diff --git a/ddtrace/tracer/textmap.go b/ddtrace/tracer/textmap.go index 1fee0ba689..3bb4992d11 100644 --- a/ddtrace/tracer/textmap.go +++ b/ddtrace/tracer/textmap.go @@ -8,15 +8,18 @@ package tracer import ( "fmt" "net/http" - "os" + "net/url" "strconv" "strings" + "sync/atomic" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" + "maps" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" ) // HTTPHeadersCarrier wraps an http.Header as a TextMapWriter and TextMapReader, allowing @@ -69,9 +72,6 @@ const ( headerPropagationStyleInject = "DD_TRACE_PROPAGATION_STYLE_INJECT" headerPropagationStyleExtract = "DD_TRACE_PROPAGATION_STYLE_EXTRACT" headerPropagationStyle = "DD_TRACE_PROPAGATION_STYLE" - - headerPropagationStyleInjectDeprecated = "DD_PROPAGATION_STYLE_INJECT" // deprecated - headerPropagationStyleExtractDeprecated = "DD_PROPAGATION_STYLE_EXTRACT" // deprecated ) const ( @@ -90,6 +90,10 @@ const ( // DefaultPriorityHeader specifies the key that will be used in HTTP headers // or text maps to store the sampling priority value. DefaultPriorityHeader = "x-datadog-sampling-priority" + + // DefaultBaggageHeader specifies the key that will be used in HTTP headers + // or text maps to store the baggage value. + DefaultBaggageHeader = "baggage" ) // originHeader specifies the name of the header indicating the origin of the trace. @@ -127,6 +131,10 @@ type PropagatorConfig struct { // B3 specifies if B3 headers should be added for trace propagation. // See https://github.com/openzipkin/b3-propagation B3 bool + + // BaggageHeader specifies the map key that will be used to store the baggage key-value pairs. + // It defaults to DefaultBaggageHeader. + BaggageHeader string } // NewPropagator returns a new propagator which uses TextMap to inject @@ -136,9 +144,8 @@ type PropagatorConfig struct { // The inject and extract propagators are determined using environment variables // with the following order of precedence: // 1. DD_TRACE_PROPAGATION_STYLE_INJECT -// 2. DD_PROPAGATION_STYLE_INJECT (deprecated) -// 3. DD_TRACE_PROPAGATION_STYLE (applies to both inject and extract) -// 4. If none of the above, use default values +// 2. DD_TRACE_PROPAGATION_STYLE (applies to both inject and extract) +// 3. If none of the above, use default values func NewPropagator(cfg *PropagatorConfig, propagators ...Propagator) Propagator { if cfg == nil { cfg = new(PropagatorConfig) @@ -155,6 +162,9 @@ func NewPropagator(cfg *PropagatorConfig, propagators ...Propagator) Propagator if cfg.PriorityHeader == "" { cfg.PriorityHeader = DefaultPriorityHeader } + if cfg.BaggageHeader == "" { + cfg.BaggageHeader = DefaultBaggageHeader + } cp := new(chainedPropagator) cp.onlyExtractFirst = internal.BoolEnv("DD_TRACE_PROPAGATION_EXTRACT_FIRST", false) if len(propagators) > 0 { @@ -162,18 +172,8 @@ func NewPropagator(cfg *PropagatorConfig, propagators ...Propagator) Propagator cp.extractors = propagators return cp } - injectorsPs := os.Getenv(headerPropagationStyleInject) - if injectorsPs == "" { - if injectorsPs = os.Getenv(headerPropagationStyleInjectDeprecated); injectorsPs != "" { - log.Warn("%v is deprecated. Please use %v or %v instead.\n", headerPropagationStyleInjectDeprecated, headerPropagationStyleInject, headerPropagationStyle) - } - } - extractorsPs := os.Getenv(headerPropagationStyleExtract) - if extractorsPs == "" { - if extractorsPs = os.Getenv(headerPropagationStyleExtractDeprecated); extractorsPs != "" { - log.Warn("%v is deprecated. Please use %v or %v instead.\n", headerPropagationStyleExtractDeprecated, headerPropagationStyleExtract, headerPropagationStyle) - } - } + injectorsPs := env.Get(headerPropagationStyleInject) + extractorsPs := env.Get(headerPropagationStyleExtract) cp.injectors, cp.injectorNames = getPropagators(cfg, injectorsPs) cp.extractors, cp.extractorsNames = getPropagators(cfg, extractorsPs) return cp @@ -196,8 +196,8 @@ type chainedPropagator struct { // a warning and be ignored. func getPropagators(cfg *PropagatorConfig, ps string) ([]Propagator, string) { dd := &propagator{cfg} - defaultPs := []Propagator{dd, &propagatorW3c{}} - defaultPsName := "datadog,tracecontext" + defaultPs := []Propagator{dd, &propagatorW3c{}, &propagatorBaggage{}} + defaultPsName := "datadog,tracecontext,baggage" if cfg.B3 { defaultPs = append(defaultPs, &propagatorB3{}) defaultPsName += ",b3" @@ -227,6 +227,9 @@ func getPropagators(cfg *PropagatorConfig, ps string) ([]Propagator, string) { case "tracecontext": list = append(list, &propagatorW3c{}) listNames = append(listNames, v) + case "baggage": + list = append(list, &propagatorBaggage{}) + listNames = append(listNames, v) case "b3", "b3multi": if !cfg.B3 { // propagatorB3 hasn't already been added, add a new one. @@ -252,7 +255,10 @@ func getPropagators(cfg *PropagatorConfig, ps string) ([]Propagator, string) { // Inject defines the Propagator to propagate SpanContext data // out of the current process. The implementation propagates the // TraceID and the current active SpanID, as well as the Span baggage. -func (p *chainedPropagator) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) error { +func (p *chainedPropagator) Inject(spanCtx *SpanContext, carrier interface{}) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } for _, v := range p.injectors { err := v.Inject(spanCtx, carrier) if err != nil { @@ -262,62 +268,141 @@ func (p *chainedPropagator) Inject(spanCtx ddtrace.SpanContext, carrier interfac return nil } -// Extract implements Propagator. This method will attempt to extract the context +// Extract implements Propagator. This method will attempt to extract a span context // based on the precedence order of the propagators. Generally, the first valid -// trace context that could be extracted will be returned, and other extractors will -// be ignored. However, the W3C tracestate header value will always be extracted and -// stored in the local trace context even if a previous propagator has already succeeded -// so long as the trace-ids match. -func (p *chainedPropagator) Extract(carrier interface{}) (ddtrace.SpanContext, error) { - var ctx ddtrace.SpanContext +// trace context that could be extracted will be returned. However, the W3C tracestate +// header value will always be extracted and stored in the local trace context even if +// a previous propagator has succeeded so long as the trace-ids match. +// Furthermore, if we have already successfully extracted a trace context and a +// subsequent trace context has conflicting trace information, such information will +// be relayed in the returned SpanContext with a SpanLink. +func (p *chainedPropagator) Extract(carrier interface{}) (*SpanContext, error) { + var ctx *SpanContext + var links []SpanLink + pendingBaggage := make(map[string]string) // used to store baggage items temporarily + for _, v := range p.extractors { - if ctx != nil { - // A local trace context has already been extracted. - pw3c, isW3C := v.(*propagatorW3c) - if !isW3C { - continue // Ignore other propagators. - } - w3cCtx, err := pw3c.Extract(carrier) - if err == nil && w3cCtx.(*spanContext).TraceID128() == ctx.(*spanContext).TraceID128() { - pw3c.propagateTracestate(ctx.(*spanContext), w3cCtx.(*spanContext)) - if w3cCtx.SpanID() != ctx.SpanID() { - var ddCtx *spanContext - if ddp := getDatadogPropagator(p); ddp != nil { - if ddSpanCtx, err := ddp.Extract(carrier); err == nil { - ddCtx, _ = ddSpanCtx.(*spanContext) - } - } - overrideDatadogParentID(ctx.(*spanContext), w3cCtx.(*spanContext), ddCtx) + firstExtract := (ctx == nil) // ctx stores the most recently extracted ctx across iterations; if it's nil, no extractor has run yet + extractedCtx, err := v.Extract(carrier) + + // If this is the baggage propagator, just stash its items into pendingBaggage + if _, isBaggage := v.(*propagatorBaggage); isBaggage { + if extractedCtx != nil && len(extractedCtx.baggage) > 0 { + for k, v := range extractedCtx.baggage { + pendingBaggage[k] = v } } - break + continue } - var err error - ctx, err = v.Extract(carrier) - if ctx != nil { + + if firstExtract { + if err != nil { + if p.onlyExtractFirst { // Every error is relevant when we are relying on the first extractor + return nil, err + } + if err != ErrSpanContextNotFound { // We don't care about ErrSpanContextNotFound because we could find a span context in a subsequent extractor + return nil, err + } + } if p.onlyExtractFirst { - // Return early if the customer configured that only the first successful - // extraction should occur. - return ctx, nil + return extractedCtx, nil + } + ctx = extractedCtx + } else { // A local trace context has already been extracted + extractedCtx2 := extractedCtx + ctx2 := ctx + + // If we can't cast to spanContext, we can't propgate tracestate or create span links + if extractedCtx2.TraceID() == ctx2.TraceID() { + if pW3C, ok := v.(*propagatorW3c); ok { + pW3C.propagateTracestate(ctx2, extractedCtx2) + // If trace IDs match but span IDs do not, use spanID from `*propagatorW3c` extractedCtx for parenting + if extractedCtx2.SpanID() != ctx2.SpanID() { + var ddCtx *SpanContext + // Grab the datadog-propagated spancontext again + if ddp := getDatadogPropagator(p); ddp != nil { + if ddSpanCtx, err := ddp.Extract(carrier); err == nil { + ddCtx = ddSpanCtx + } + } + overrideDatadogParentID(ctx2, extractedCtx2, ddCtx) + } + } + } else if extractedCtx2 != nil { // Trace IDs do not match - create span links + link := SpanLink{TraceID: extractedCtx2.TraceIDLower(), SpanID: extractedCtx2.SpanID(), TraceIDHigh: extractedCtx2.TraceIDUpper(), Attributes: map[string]string{"reason": "terminated_context", "context_headers": getPropagatorName(v)}} + if trace := extractedCtx2.trace; trace != nil { + if flags := uint32(*trace.priority); flags > 0 { // Set the flags based on the sampling priority + link.Flags = 1 + } else { + link.Flags = 0 + } + link.Tracestate = extractedCtx2.trace.propagatingTag(tracestateHeader) + } + links = append(links, link) } - } else if err != ErrSpanContextNotFound { - return nil, err } } + if ctx == nil { + if len(pendingBaggage) > 0 { + ctx := &SpanContext{ + baggage: make(map[string]string, len(pendingBaggage)), + baggageOnly: true, + } + maps.Copy(ctx.baggage, pendingBaggage) + atomic.StoreUint32(&ctx.hasBaggage, 1) + return ctx, nil + } + // 0 successful extractions return nil, ErrSpanContextNotFound } - log.Debug("Extracted span context: %#v", ctx) + if len(pendingBaggage) > 0 { + if ctx.baggage == nil { + ctx.baggage = make(map[string]string, len(pendingBaggage)) + } + for k, v := range pendingBaggage { + ctx.baggage[k] = v + } + atomic.StoreUint32(&ctx.hasBaggage, 1) + } + + if len(links) > 0 { + ctx.spanLinks = links + } + log.Debug("Extracted span context: %s", ctx.safeDebugString()) return ctx, nil } +func getPropagatorName(p Propagator) string { + switch p.(type) { + case *propagator: + return "datadog" + case *propagatorB3: + return "b3multi" + case *propagatorB3SingleHeader: + return "b3" + case *propagatorW3c: + return "tracecontext" + case *propagatorBaggage: + return "baggage" + default: + return "" + } +} + // propagateTracestate will add the tracestate propagating tag to the given // *spanContext. The W3C trace context will be extracted from the provided // carrier. The trace id of this W3C trace context must match the trace id // provided by the given *spanContext. If it matches, then the tracestate // will be re-composed based on the composition of the given *spanContext, // but will include the non-DD vendors in the W3C trace context's tracestate. -func (p *propagatorW3c) propagateTracestate(ctx *spanContext, w3cCtx *spanContext) { +func (p *propagatorW3c) propagateTracestate(ctx *SpanContext, w3cCtx *SpanContext) { + if w3cCtx == nil { + return // It's not valid, so ignore it. + } + if ctx.TraceID() != w3cCtx.TraceID() { + return // The trace-ids must match. + } if w3cCtx.trace == nil { return // this shouldn't happen, since it should have a propagating tag already } @@ -340,7 +425,10 @@ type propagator struct { cfg *PropagatorConfig } -func (p *propagator) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) error { +func (p *propagator) Inject(spanCtx *SpanContext, carrier interface{}) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } switch c := carrier.(type) { case TextMapWriter: return p.injectTextMap(spanCtx, c) @@ -349,9 +437,9 @@ func (p *propagator) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) er } } -func (p *propagator) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapWriter) error { - ctx, ok := spanCtx.(*spanContext) - if !ok || ctx.traceID.Empty() || ctx.spanID == 0 { +func (p *propagator) injectTextMap(spanCtx *SpanContext, writer TextMapWriter) error { + ctx := spanCtx + if ctx.traceID.Empty() || ctx.spanID == 0 { return ErrInvalidSpanContext } // propagate the TraceID and the current active SpanID @@ -383,7 +471,7 @@ func (p *propagator) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapWr } // marshalPropagatingTags marshals all propagating tags included in ctx to a comma separated string -func (p *propagator) marshalPropagatingTags(ctx *spanContext) string { +func (p *propagator) marshalPropagatingTags(ctx *SpanContext) string { var sb strings.Builder if ctx.trace == nil { return "" @@ -395,13 +483,13 @@ func (p *propagator) marshalPropagatingTags(ctx *spanContext) string { return true // don't propagate W3C headers with the DD propagator } if err := isValidPropagatableTag(k, v); err != nil { - log.Warn("Won't propagate tag '%s': %v", k, err.Error()) + log.Warn("Won't propagate tag %q: %s", k, err.Error()) properr = "encoding_error" return true } if tagLen := sb.Len() + len(k) + len(v); tagLen > p.cfg.MaxTagsHeaderLen { sb.Reset() - log.Warn("Won't propagate tag: length is (%d) which exceeds the maximum len of (%d).", tagLen, p.cfg.MaxTagsHeaderLen) + log.Warn("Won't propagate tag %q: %q length is (%d) which exceeds the maximum len of (%d).", k, v, tagLen, p.cfg.MaxTagsHeaderLen) properr = "inject_max_size" return false } @@ -419,7 +507,7 @@ func (p *propagator) marshalPropagatingTags(ctx *spanContext) string { return sb.String() } -func (p *propagator) Extract(carrier interface{}) (ddtrace.SpanContext, error) { +func (p *propagator) Extract(carrier interface{}) (*SpanContext, error) { switch c := carrier.(type) { case TextMapReader: return p.extractTextMap(c) @@ -428,8 +516,8 @@ func (p *propagator) Extract(carrier interface{}) (ddtrace.SpanContext, error) { } } -func (p *propagator) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, error) { - var ctx spanContext +func (p *propagator) extractTextMap(reader TextMapReader) (*SpanContext, error) { + var ctx SpanContext err := reader.ForeachKey(func(k, v string) error { var err error key := strings.ToLower(k) @@ -469,10 +557,10 @@ func (p *propagator) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, if ctx.trace != nil { tid := ctx.trace.propagatingTag(keyTraceID128) if err := validateTID(tid); err != nil { - log.Debug("Invalid hex traceID: %s", err) + log.Debug("Invalid hex traceID: %s", err.Error()) ctx.trace.unsetPropagatingTag(keyTraceID128) } else if err := ctx.traceID.SetUpperFromHex(tid); err != nil { - log.Debug("Attempted to set an invalid hex traceID: %s", err) + log.Debug("Attempted to set an invalid hex traceID: %s", err.Error()) ctx.trace.unsetPropagatingTag(keyTraceID128) } } @@ -503,20 +591,24 @@ func getDatadogPropagator(cp *chainedPropagator) *propagator { return nil } -// overrideDatadogParentID overrides the span ID of a context with the ID extracted from tracecontext headers -// if the reparenting ID is not set on the context, the span ID from datadog headers is used. -func overrideDatadogParentID(ctx, w3cCtx, ddCtx *spanContext) { +// overrideDatadogParentID overrides the span ID of a context with the ID extracted from tracecontext headers. +// If the reparenting ID is not set on the context, the span ID from datadog headers is used. +// spanContexts are passed by reference to avoid copying lock value in spanContext type +func overrideDatadogParentID(ctx, w3cCtx, ddCtx *SpanContext) { + if ctx == nil || w3cCtx == nil || ddCtx == nil { + return + } ctx.spanID = w3cCtx.spanID if w3cCtx.reparentID != "" { ctx.reparentID = w3cCtx.reparentID - } else if ddCtx != nil { + } else { // NIT: could be done without using fmt.Sprintf? Is it worth it? ctx.reparentID = fmt.Sprintf("%016x", ddCtx.SpanID()) } } // unmarshalPropagatingTags unmarshals tags from v into ctx -func unmarshalPropagatingTags(ctx *spanContext, v string) { +func unmarshalPropagatingTags(ctx *SpanContext, v string) { if ctx.trace == nil { ctx.trace = newTrace() } @@ -527,7 +619,7 @@ func unmarshalPropagatingTags(ctx *spanContext, v string) { } tags, err := parsePropagatableTraceTags(v) if err != nil { - log.Warn("Did not extract %s: %v. Incoming tags will not be propagated further.", traceTagsHeader, err.Error()) + log.Warn("Did not extract %q: %s. Incoming tags will not be propagated further.", traceTagsHeader, err.Error()) ctx.trace.setTag(keyPropagationError, "decoding_error") } ctx.trace.replacePropagatingTags(tags) @@ -535,7 +627,7 @@ func unmarshalPropagatingTags(ctx *spanContext, v string) { // setPropagatingTag adds the key value pair to the map of propagating tags on the trace, // creating the map if one is not initialized. -func setPropagatingTag(ctx *spanContext, k, v string) { +func setPropagatingTag(ctx *SpanContext, k, v string) { if ctx.trace == nil { // extractors initialize a new spanContext, so the trace might be nil ctx.trace = newTrace() @@ -554,7 +646,10 @@ const ( // using B3 headers. Only TextMap carriers are supported. type propagatorB3 struct{} -func (p *propagatorB3) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) error { +func (p *propagatorB3) Inject(spanCtx *SpanContext, carrier interface{}) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } switch c := carrier.(type) { case TextMapWriter: return p.injectTextMap(spanCtx, c) @@ -563,19 +658,18 @@ func (p *propagatorB3) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) } } -func (*propagatorB3) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapWriter) error { - ctx, ok := spanCtx.(*spanContext) - if !ok || ctx.traceID.Empty() || ctx.spanID == 0 { +func (*propagatorB3) injectTextMap(spanCtx *SpanContext, writer TextMapWriter) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } + ctx := spanCtx + if ctx.traceID.Empty() || ctx.spanID == 0 { return ErrInvalidSpanContext } if !ctx.traceID.HasUpper() { // 64-bit trace id writer.Set(b3TraceIDHeader, fmt.Sprintf("%016x", ctx.traceID.Lower())) } else { // 128-bit trace id - var w3Cctx ddtrace.SpanContextW3C - if w3Cctx, ok = spanCtx.(ddtrace.SpanContextW3C); !ok { - return ErrInvalidSpanContext - } - writer.Set(b3TraceIDHeader, w3Cctx.TraceID128()) + writer.Set(b3TraceIDHeader, ctx.TraceID()) } writer.Set(b3SpanIDHeader, fmt.Sprintf("%016x", ctx.spanID)) if p, ok := ctx.SamplingPriority(); ok { @@ -588,7 +682,7 @@ func (*propagatorB3) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapWr return nil } -func (p *propagatorB3) Extract(carrier interface{}) (ddtrace.SpanContext, error) { +func (p *propagatorB3) Extract(carrier interface{}) (*SpanContext, error) { switch c := carrier.(type) { case TextMapReader: return p.extractTextMap(c) @@ -597,8 +691,8 @@ func (p *propagatorB3) Extract(carrier interface{}) (ddtrace.SpanContext, error) } } -func (*propagatorB3) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, error) { - var ctx spanContext +func (*propagatorB3) extractTextMap(reader TextMapReader) (*SpanContext, error) { + var ctx SpanContext err := reader.ForeachKey(func(k, v string) error { var err error key := strings.ToLower(k) @@ -635,7 +729,10 @@ func (*propagatorB3) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, // using B3 headers. Only TextMap carriers are supported. type propagatorB3SingleHeader struct{} -func (p *propagatorB3SingleHeader) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) error { +func (p *propagatorB3SingleHeader) Inject(spanCtx *SpanContext, carrier interface{}) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } switch c := carrier.(type) { case TextMapWriter: return p.injectTextMap(spanCtx, c) @@ -644,9 +741,12 @@ func (p *propagatorB3SingleHeader) Inject(spanCtx ddtrace.SpanContext, carrier i } } -func (*propagatorB3SingleHeader) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapWriter) error { - ctx, ok := spanCtx.(*spanContext) - if !ok || ctx.traceID.Empty() || ctx.spanID == 0 { +func (*propagatorB3SingleHeader) injectTextMap(spanCtx *SpanContext, writer TextMapWriter) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } + ctx := spanCtx + if ctx.traceID.Empty() || ctx.spanID == 0 { return ErrInvalidSpanContext } sb := strings.Builder{} @@ -654,11 +754,7 @@ func (*propagatorB3SingleHeader) injectTextMap(spanCtx ddtrace.SpanContext, writ if !ctx.traceID.HasUpper() { // 64-bit trace id traceID = fmt.Sprintf("%016x", ctx.traceID.Lower()) } else { // 128-bit trace id - var w3Cctx ddtrace.SpanContextW3C - if w3Cctx, ok = spanCtx.(ddtrace.SpanContextW3C); !ok { - return ErrInvalidSpanContext - } - traceID = w3Cctx.TraceID128() + traceID = ctx.TraceID() } sb.WriteString(fmt.Sprintf("%s-%016x", traceID, ctx.spanID)) if p, ok := ctx.SamplingPriority(); ok { @@ -672,7 +768,7 @@ func (*propagatorB3SingleHeader) injectTextMap(spanCtx ddtrace.SpanContext, writ return nil } -func (p *propagatorB3SingleHeader) Extract(carrier interface{}) (ddtrace.SpanContext, error) { +func (p *propagatorB3SingleHeader) Extract(carrier interface{}) (*SpanContext, error) { switch c := carrier.(type) { case TextMapReader: return p.extractTextMap(c) @@ -681,8 +777,8 @@ func (p *propagatorB3SingleHeader) Extract(carrier interface{}) (ddtrace.SpanCon } } -func (*propagatorB3SingleHeader) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, error) { - var ctx spanContext +func (*propagatorB3SingleHeader) extractTextMap(reader TextMapReader) (*SpanContext, error) { + var ctx SpanContext err := reader.ForeachKey(func(k, v string) error { var err error key := strings.ToLower(k) @@ -702,9 +798,9 @@ func (*propagatorB3SingleHeader) extractTextMap(reader TextMapReader) (ddtrace.S case "": break case "1", "d": // Treat 'debug' traces as priority 1 - ctx.setSamplingPriority(1, samplernames.Unknown) + ctx.setSamplingPriority(ext.PriorityAutoKeep, samplernames.Unknown) case "0": - ctx.setSamplingPriority(0, samplernames.Unknown) + ctx.setSamplingPriority(ext.PriorityAutoReject, samplernames.Unknown) default: return ErrSpanContextCorrupted } @@ -734,7 +830,10 @@ const ( // using W3C tracecontext/traceparent headers. Only TextMap carriers are supported. type propagatorW3c struct{} -func (p *propagatorW3c) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) error { +func (p *propagatorW3c) Inject(spanCtx *SpanContext, carrier interface{}) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } switch c := carrier.(type) { case TextMapWriter: return p.injectTextMap(spanCtx, c) @@ -751,9 +850,12 @@ func (p *propagatorW3c) Inject(spanCtx ddtrace.SpanContext, carrier interface{}) // which is equal to 00000001 when no other flag is present. // tracestateHeader is a comma-separated list of list-members with a = format, // where each list-member is managed by a vendor or instrumentation library. -func (*propagatorW3c) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapWriter) error { - ctx, ok := spanCtx.(*spanContext) - if !ok || ctx.traceID.Empty() || ctx.spanID == 0 { +func (*propagatorW3c) injectTextMap(spanCtx *SpanContext, writer TextMapWriter) error { + if spanCtx == nil { + return ErrInvalidSpanContext + } + ctx := spanCtx + if ctx.traceID.Empty() || ctx.spanID == 0 { return ErrInvalidSpanContext } flags := "" @@ -767,9 +869,7 @@ func (*propagatorW3c) injectTextMap(spanCtx ddtrace.SpanContext, writer TextMapW var traceID string if ctx.traceID.HasUpper() { setPropagatingTag(ctx, keyTraceID128, ctx.traceID.UpperHex()) - if w3Cctx, ok := spanCtx.(ddtrace.SpanContextW3C); ok { - traceID = w3Cctx.TraceID128() - } + traceID = ctx.TraceID() } else { traceID = fmt.Sprintf("%032x", ctx.traceID) if ctx.trace != nil { @@ -942,7 +1042,7 @@ func isValidID(id string) bool { // which holds the values of the sampling decision(`s:`), origin(`o:`), // the last parent ID of a Datadog span (`p:`), // and propagated tags prefixed with `t.`(e.g. _dd.p.usr.id:usr_id tag will become `t.usr.id:usr_id`). -func composeTracestate(ctx *spanContext, priority int, oldState string) string { +func composeTracestate(ctx *SpanContext, priority int, oldState string) string { var ( b strings.Builder sm = &stringMutator{} @@ -1009,7 +1109,7 @@ func composeTracestate(ctx *spanContext, priority int, oldState string) string { return b.String() } -func (p *propagatorW3c) Extract(carrier interface{}) (ddtrace.SpanContext, error) { +func (p *propagatorW3c) Extract(carrier interface{}) (*SpanContext, error) { switch c := carrier.(type) { case TextMapReader: return p.extractTextMap(c) @@ -1018,10 +1118,10 @@ func (p *propagatorW3c) Extract(carrier interface{}) (ddtrace.SpanContext, error } } -func (*propagatorW3c) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, error) { +func (*propagatorW3c) extractTextMap(reader TextMapReader) (*SpanContext, error) { var parentHeader string var stateHeader string - var ctx spanContext + var ctx SpanContext ctx.isRemote = true // to avoid parsing tracestate header(s) if traceparent is invalid if err := reader.ForeachKey(func(k, v string) error { @@ -1061,9 +1161,9 @@ func (*propagatorW3c) extractTextMap(reader TextMapReader) (ddtrace.SpanContext, // - flags - represents the propagated flags in the format of 2 hex-encoded digits, and supports 8 unique flags. // Example value of HTTP `traceparent` header: `00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01`, // Currently, Go tracer doesn't support 128-bit traceIDs, so the full traceID (32 hex-encoded digits) must be -// stored into a field that is accessible from the span’s context. TraceId will be parsed from the least significant 16 +// stored into a field that is accessible from the span's context. TraceId will be parsed from the least significant 16 // hex-encoded digits into a 64-bit number. -func parseTraceparent(ctx *spanContext, header string) error { +func parseTraceparent(ctx *SpanContext, header string) error { nonWordCutset := "_-\t \n" header = strings.ToLower(strings.Trim(header, "\t -")) headerLen := len(header) @@ -1135,12 +1235,12 @@ func parseTraceparent(ctx *spanContext, header string) error { // with up to 32 comma-separated (,) list-members. // An example value would be: `vendorname1=opaqueValue1,vendorname2=opaqueValue2,dd=s:1;o:synthetics`, // Where `dd` list contains values that would be in x-datadog-tags as well as those needed for propagation information. -// The keys to the “dd“ values have been shortened as follows to save space: +// The keys to the "dd" values have been shortened as follows to save space: // `sampling_priority` = `s` // `origin` = `o` // `last parent` = `p` // `_dd.p.` prefix = `t.` -func parseTracestate(ctx *spanContext, header string) { +func parseTracestate(ctx *SpanContext, header string) { if header == "" { // The W3C spec says tracestate can be empty but should avoid sending it. // https://www.w3.org/TR/trace-context-1/#tracestate-header-field-values @@ -1182,11 +1282,11 @@ func parseTracestate(ctx *spanContext, header string) { } if parentP == 1 && stateP <= 0 { // Auto keep (1) and set the decision maker to default - ctx.setSamplingPriority(1, samplernames.Default) + ctx.setSamplingPriority(ext.PriorityAutoKeep, samplernames.Default) } if parentP == 0 && stateP > 0 { // Auto drop (0) and drop the decision maker - ctx.setSamplingPriority(0, samplernames.Unknown) + ctx.setSamplingPriority(ext.PriorityAutoReject, samplernames.Unknown) dropDM = true } } else if key == "p" { @@ -1208,7 +1308,7 @@ func parseTracestate(ctx *spanContext, header string) { // extractTraceID128 extracts the trace id from v and populates the traceID // field, and the traceID128 field (if applicable) of the provided ctx, // returning an error if v is invalid. -func extractTraceID128(ctx *spanContext, v string) error { +func extractTraceID128(ctx *SpanContext, v string) error { if len(v) > 32 { v = v[len(v)-32:] } @@ -1230,3 +1330,143 @@ func extractTraceID128(ctx *spanContext, v string) error { } return nil } + +const ( + baggageMaxItems = 64 + baggageMaxBytes = 8192 + safeCharactersKey = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&'*+-.^_`|~" + safeCharactersValue = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!#$%&'()*+-./:<>?@[]^_`{|}~" +) + +// encodeKey encodes a key with the specified safe characters +func encodeKey(key string) string { + return urlEncode(strings.TrimSpace(key), safeCharactersKey) +} + +// encodeValue encodes a value with the specified safe characters +func encodeValue(value string) string { + return urlEncode(strings.TrimSpace(value), safeCharactersValue) +} + +// urlEncode performs percent-encoding while respecting the safe characters +func urlEncode(input string, safeCharacters string) string { + var encoded strings.Builder + for _, c := range input { + if strings.ContainsRune(safeCharacters, c) { + encoded.WriteRune(c) + } else { + encoded.WriteString(url.QueryEscape(string(c))) + } + } + return encoded.String() +} + +// propagatorBaggage implements Propagator and injects/extracts span contexts +// using baggage headers. +type propagatorBaggage struct{} + +func (p *propagatorBaggage) Inject(spanCtx *SpanContext, carrier interface{}) error { + switch c := carrier.(type) { + case TextMapWriter: + return p.injectTextMap(spanCtx, c) + default: + return ErrInvalidCarrier + } +} + +// injectTextMap propagates baggage items from the span context into the writer, +// in the format of a single HTTP "baggage" header. Baggage consists of key=value pairs, +// separated by commas. This function enforces a maximum number of baggage items and a maximum overall size. +// If either limit is exceeded, excess items or bytes are dropped, and a warning is logged. +// +// Example of a single "baggage" header: +// baggage: foo=bar,baz=qux +// +// Each key and value pair is encoded and added to the existing baggage header in = format, +// joined together by commas, +func (*propagatorBaggage) injectTextMap(ctx *SpanContext, writer TextMapWriter) error { + if ctx == nil { + return nil + } + + ctr := 0 + var baggageBuilder strings.Builder + ctx.ForeachBaggageItem(func(k, v string) bool { + if ctr >= baggageMaxItems { + return false + } + + var itemBuilder strings.Builder + if ctr > 0 { + itemBuilder.WriteRune(',') + } + + itemBuilder.WriteString(encodeKey(k)) + itemBuilder.WriteRune('=') + itemBuilder.WriteString(encodeValue(v)) + if itemBuilder.Len()+baggageBuilder.Len() > baggageMaxBytes { + return false + } + baggageBuilder.WriteString(itemBuilder.String()) + ctr++ + return true + }) + if baggageBuilder.Len() > 0 { + writer.Set("baggage", baggageBuilder.String()) + } + return nil +} + +func (p *propagatorBaggage) Extract(carrier interface{}) (*SpanContext, error) { + switch c := carrier.(type) { + case TextMapReader: + return p.extractTextMap(c) + default: + return nil, ErrInvalidCarrier + } +} + +func (*propagatorBaggage) extractTextMap(reader TextMapReader) (*SpanContext, error) { + var baggageHeader string + var ctx SpanContext + err := reader.ForeachKey(func(k, v string) error { + if strings.ToLower(k) == "baggage" { + // Expect only one baggage header, return early + baggageHeader = v + return nil + } + return nil + }) + if err != nil { + return nil, err + } + + if baggageHeader == "" { + return &ctx, nil + } + + parts := strings.Split(baggageHeader, ",") + + // 1) validation & single-trim pass + for i, kv := range parts { + k, v, ok := strings.Cut(kv, "=") + trimmedK := strings.TrimSpace(k) + trimmedV := strings.TrimSpace(v) + if !ok || trimmedK == "" || trimmedV == "" { + log.Warn("invalid baggage item: %q, dropping entire header", kv) + return &ctx, nil + } + // store back the trimmed pair so we don't re-trim below + parts[i] = trimmedK + "=" + trimmedV + } + + // 2) safe to URL-decode & apply + for _, kv := range parts { + rawK, rawV, _ := strings.Cut(kv, "=") + key, _ := url.QueryUnescape(rawK) + val, _ := url.QueryUnescape(rawV) + ctx.setBaggageItem(key, val) + } + + return &ctx, nil +} diff --git a/ddtrace/tracer/textmap_test.go b/ddtrace/tracer/textmap_test.go index 9575ac226d..09ef06a31f 100644 --- a/ddtrace/tracer/textmap_test.go +++ b/ddtrace/tracer/textmap_test.go @@ -16,13 +16,10 @@ import ( "sync" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/httpmem" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httpmem" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" "github.com/DataDog/datadog-go/v5/statsd" "github.com/stretchr/testify/assert" @@ -71,7 +68,7 @@ func TestHTTPHeadersCarrierForeachKeyError(t *testing.T) { h := http.Header{} h.Add("A", "x") h.Add("B", "y") - got := HTTPHeadersCarrier(h).ForeachKey(func(k, v string) error { + got := HTTPHeadersCarrier(h).ForeachKey(func(k, _ string) error { if k == "B" { return want } @@ -102,7 +99,7 @@ func TestTextMapCarrierForeachKey(t *testing.T) { func TestTextMapCarrierForeachKeyError(t *testing.T) { m := map[string]string{"A": "x", "B": "y"} want := errors.New("random error") - got := TextMapCarrier(m).ForeachKey(func(k, v string) error { + got := TextMapCarrier(m).ForeachKey(func(_, _ string) error { return want }) assert.Equal(t, got, want) @@ -194,8 +191,10 @@ func TestTextMapExtractTracestatePropagation(t *testing.T) { if tc.onlyExtractFirst { t.Setenv("DD_TRACE_PROPAGATION_EXTRACT_FIRST", "true") } - tracer := newTracer() + tracer, err := newTracer() + defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) headers := TextMapCarrier(map[string]string{ DefaultTraceIDHeader: "4", DefaultParentIDHeader: "1", @@ -205,10 +204,8 @@ func TestTextMapExtractTracestatePropagation(t *testing.T) { tracestateHeader: "dd=s:2;o:rum;p:0000000000000001;t.tid:1230000000000000~~,othervendor=t61rcWkgMzE", }) - ctx, err := tracer.Extract(headers) + sctx, err := tracer.Extract(headers) assert.Nil(err) - sctx, ok := ctx.(*spanContext) - assert.True(ok) assert.Equal("00000000000000000000000000000004", sctx.traceID.HexEncoded()) if tc.conflictingParentID == true { // tracecontext span id should be used @@ -233,13 +230,13 @@ func TestTextMapPropagatorErrors(t *testing.T) { propagator := NewPropagator(nil) assert := assert.New(t) - err := propagator.Inject(&spanContext{}, 2) + err := propagator.Inject(&SpanContext{}, 2) assert.Equal(ErrInvalidCarrier, err) - err = propagator.Inject(internal.NoopSpanContext{}, TextMapCarrier(map[string]string{})) + err = propagator.Inject(nil, TextMapCarrier(map[string]string{})) assert.Equal(ErrInvalidSpanContext, err) - err = propagator.Inject(&spanContext{}, TextMapCarrier(map[string]string{})) + err = propagator.Inject(&SpanContext{}, TextMapCarrier(map[string]string{})) assert.Equal(ErrInvalidSpanContext, err) // no traceID and spanID - err = propagator.Inject(&spanContext{traceID: traceIDFrom64Bits(1)}, TextMapCarrier(map[string]string{})) + err = propagator.Inject(&SpanContext{traceID: traceIDFrom64Bits(1)}, TextMapCarrier(map[string]string{})) assert.Equal(ErrInvalidSpanContext, err) // no spanID _, err = propagator.Extract(2) @@ -278,21 +275,22 @@ func TestTextMapPropagatorInjectHeader(t *testing.T) { TraceHeader: "tid", ParentHeader: "pid", }) - tracer := newTracer(WithPropagator(propagator)) + tracer, err := newTracer(WithPropagator(propagator)) defer tracer.Stop() + assert.NoError(err) - root := tracer.StartSpan("web.request").(*span) + root := tracer.StartSpan("web.request") root.SetBaggageItem("item", "x") - root.SetTag(ext.SamplingPriority, 0) + root.setSamplingPriority(ext.PriorityAutoReject, samplernames.Default) ctx := root.Context() headers := http.Header{} carrier := HTTPHeadersCarrier(headers) - err := tracer.Inject(ctx, carrier) + err = tracer.Inject(ctx, carrier) assert.Nil(err) - tid := strconv.FormatUint(root.TraceID, 10) - pid := strconv.FormatUint(root.SpanID, 10) + tid := strconv.FormatUint(root.traceID, 10) + pid := strconv.FormatUint(root.spanID, 10) assert.Equal(headers.Get("tid"), tid) assert.Equal(headers.Get("pid"), pid) @@ -308,18 +306,15 @@ func TestTextMapPropagatorOrigin(t *testing.T) { DefaultTraceIDHeader: "1", DefaultParentIDHeader: "1", }) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) ctx, err := tracer.Extract(src) if err != nil { t.Fatal(err) } - sctx, ok := ctx.(*spanContext) - if !ok { - t.Fatal("not a *spanContext") - } - if sctx.origin != "synthetics" { - t.Fatalf("didn't propagate origin, got: %q", sctx.origin) + if ctx.origin != "synthetics" { + t.Fatalf("didn't propagate origin, got: %q", ctx.origin) } dst := map[string]string{} if err := tracer.Inject(ctx, TextMapCarrier(dst)); err != nil { @@ -339,18 +334,17 @@ func TestTextMapPropagatorTraceTagsWithPriority(t *testing.T) { DefaultParentIDHeader: "1", traceTagsHeader: "hello=world=,_dd.p.dm=934086a6-4", }) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) ctx, err := tracer.Extract(src) assert.Nil(t, err) - sctx, ok := ctx.(*spanContext) - assert.True(t, ok) - child := tracer.StartSpan("test", ChildOf(sctx)) - childSpanID := child.Context().(*spanContext).spanID + child := tracer.StartSpan("test", ChildOf(ctx)) + childSpanID := child.Context().spanID assert.Equal(t, map[string]string{ "hello": "world=", "_dd.p.dm": "934086a6-4", - }, sctx.trace.propagatingTags) + }, ctx.trace.propagatingTags) dst := map[string]string{} err = tracer.Inject(child.Context(), TextMapCarrier(dst)) assert.Nil(t, err) @@ -369,19 +363,17 @@ func TestTextMapPropagatorTraceTagsWithoutPriority(t *testing.T) { DefaultParentIDHeader: "1", traceTagsHeader: "hello=world,_dd.p.dm=934086a6-4", }) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) ctx, err := tracer.Extract(src) assert.Nil(t, err) - sctx, ok := ctx.(*spanContext) - assert.True(t, ok) - child := tracer.StartSpan("test", ChildOf(sctx)) - childSpanID := child.Context().(*spanContext).spanID - // PrioritySampler applied AgentRate + child := tracer.StartSpan("test", ChildOf(ctx)) + childSpanID := child.Context().spanID assert.Equal(t, map[string]string{ "hello": "world", "_dd.p.dm": "-1", - }, sctx.trace.propagatingTags) + }, ctx.trace.propagatingTags) dst := map[string]string{} err = tracer.Inject(child.Context(), TextMapCarrier(dst)) assert.Nil(t, err) @@ -399,30 +391,28 @@ func TestExtractOriginSynthetics(t *testing.T) { DefaultTraceIDHeader: "3", DefaultParentIDHeader: "0", }) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) ctx, err := tracer.Extract(src) if err != nil { t.Fatal(err) } - sctx, ok := ctx.(*spanContext) - if !ok { - t.Fatal("not a *spanContext") - } - assert.Equal(t, sctx.spanID, uint64(0)) - assert.Equal(t, sctx.traceID.Lower(), uint64(3)) - assert.Equal(t, sctx.origin, "synthetics") + assert.Equal(t, ctx.spanID, uint64(0)) + assert.Equal(t, ctx.traceID.Lower(), uint64(3)) + assert.Equal(t, ctx.origin, "synthetics") } func Test257CharacterDDTracestateLengh(t *testing.T) { t.Setenv(headerPropagationStyle, "tracecontext") - tracer := newTracer() + tracer, err := newTracer() + require.NoError(t, err) defer tracer.Stop() assert := assert.New(t) - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, ext.PriorityUserKeep) - ctx, ok := root.Context().(*spanContext) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualKeep, true) + ctx := root.Context() ctx.origin = "rum" ctx.traceID = traceIDFrom64Bits(1) ctx.spanID = 2 @@ -448,15 +438,13 @@ func Test257CharacterDDTracestateLengh(t *testing.T) { ctx.trace.propagatingTags[fmt.Sprintf("_dd.p.%s", longKey)] = "0" headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) - - assert.True(ok) + err = tracer.Inject(ctx, headers) assert.Nil(err) assert.Contains(headers[tracestateHeader], "valid_vendor=a:1") // iterating through propagatingTags map doesn't guarantee order in tracestate header ddTag := strings.SplitN(headers[tracestateHeader], ",", 2)[0] assert.Contains(ddTag, "s:2") - assert.Regexp(regexp.MustCompile("dd=[\\w:,]+"), ddTag) + assert.Regexp(regexp.MustCompile(`dd=[\w:,]+`), ddTag) assert.LessOrEqual(len(ddTag), 256) // one of the propagated tags will not be propagated } @@ -507,16 +495,17 @@ func TestTextMapPropagator(t *testing.T) { for _, tc := range tests { t.Run("Inject-"+tc.name, func(t *testing.T) { t.Setenv(headerPropagationStyleInject, tc.injectStyle) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - internal.SetGlobalTracer(tracer) + assert.NoError(t, err) + setGlobalTracer(tracer) child := tracer.StartSpan("test") for k, v := range tc.tags { - child.Context().(*spanContext).trace.setPropagatingTag(k, v) + child.Context().trace.setPropagatingTag(k, v) } - childSpanID := child.Context().(*spanContext).spanID + childSpanID := child.Context().spanID dst := map[string]string{} - err := tracer.Inject(child.Context(), TextMapCarrier(dst)) + err = tracer.Inject(child.Context(), TextMapCarrier(dst)) assert.Nil(t, err) ddHeadersLen := 3 // x-datadog-parent-id, x-datadog-trace-id, x-datadog-sampling-priority if tc.xDatadogTagsHeader != "" { @@ -530,7 +519,7 @@ func TestTextMapPropagator(t *testing.T) { assert.Equal(t, strconv.Itoa(int(childSpanID)), dst["x-datadog-trace-id"]) assert.Equal(t, "1", dst["x-datadog-sampling-priority"]) if tc.xDatadogTagsHeader != "" { - tc.xDatadogTagsHeader += fmt.Sprintf(",_dd.p.tid=%s", child.Context().(ddtrace.SpanContextW3C).TraceID128()[:16]) + tc.xDatadogTagsHeader += fmt.Sprintf(",_dd.p.tid=%s", child.Context().TraceID()[:16]) } assertTraceTags(t, tc.xDatadogTagsHeader, dst["x-datadog-tags"]) if strings.Contains(tc.injectStyle, "tracecontext") { @@ -538,7 +527,7 @@ func TestTextMapPropagator(t *testing.T) { assert.NotEmpty(t, dst[tracestateHeader]) assert.NotEmpty(t, dst[traceparentHeader]) } - assert.Equal(t, tc.errStr, child.Context().(*spanContext).trace.tags["_dd.propagation_error"]) + assert.Equal(t, tc.errStr, child.Context().trace.tags["_dd.propagation_error"]) }) } t.Run("Extract-InvalidTraceTagsHeader", func(t *testing.T) { @@ -548,13 +537,12 @@ func TestTextMapPropagator(t *testing.T) { DefaultParentIDHeader: "1", traceTagsHeader: "hello=world,=", // invalid value }) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) ctx, err := tracer.Extract(src) assert.Nil(t, err) - sctx, ok := ctx.(*spanContext) - assert.True(t, ok) - assert.Equal(t, "decoding_error", sctx.trace.tags["_dd.propagation_error"]) + assert.Equal(t, "decoding_error", ctx.trace.tags["_dd.propagation_error"]) }) t.Run("Extract-TooManyTags", func(t *testing.T) { @@ -564,13 +552,12 @@ func TestTextMapPropagator(t *testing.T) { DefaultParentIDHeader: "1", traceTagsHeader: fmt.Sprintf("%s", bigMap), }) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) ctx, err := tracer.Extract(src) assert.Nil(t, err) - sctx, ok := ctx.(*spanContext) - assert.True(t, ok) - assert.Equal(t, "extract_max_size", sctx.trace.tags["_dd.propagation_error"]) + assert.Equal(t, "extract_max_size", ctx.trace.tags["_dd.propagation_error"]) }) t.Run("InjectExtract", func(t *testing.T) { @@ -583,23 +570,21 @@ func TestTextMapPropagator(t *testing.T) { ParentHeader: "pid", MaxTagsHeaderLen: defaultMaxTagsHeaderLen, }) - tracer := newTracer(WithPropagator(propagator)) + tracer, err := newTracer(WithPropagator(propagator)) defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + assert.NoError(t, err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx := root.Context().(*spanContext) + ctx := root.Context() headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) assert.Nil(err) - sctx, err := tracer.Extract(headers) + xctx, err := tracer.Extract(headers) assert.Nil(err) - - xctx, ok := sctx.(*spanContext) - assert.True(ok) assert.Equal(xctx.traceID.HexEncoded(), ctx.traceID.HexEncoded()) assert.Equal(xctx.spanID, ctx.spanID) assert.Equal(xctx.baggage, ctx.baggage) @@ -610,7 +595,7 @@ func TestTextMapPropagator(t *testing.T) { func TestEnvVars(t *testing.T) { var testEnvs []map[string]string - s, c := httpmem.ServerAndClient(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + s, c := httpmem.ServerAndClient(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(404) })) defer s.Close() @@ -618,10 +603,8 @@ func TestEnvVars(t *testing.T) { t.Run("b3/b3multi inject", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleInject: "b3"}, - {headerPropagationStyleInjectDeprecated: "b3,none" /* none should have no affect */}, {headerPropagationStyle: "b3"}, {otelHeaderPropagationStyle: "b3multi"}, - {headerPropagationStyleInject: "b3multi", headerPropagationStyleInjectDeprecated: "none" /* none should have no affect */}, {headerPropagationStyleInject: "b3multi", headerPropagationStyle: "none" /* none should have no affect */}, } for _, testEnv := range testEnvs { @@ -668,17 +651,17 @@ func TestEnvVars(t *testing.T) { } for _, test := range tests { t.Run(fmt.Sprintf("inject with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - ctx, ok := root.Context().(*spanContext) + assert.NoError(t, err) + root := tracer.StartSpan("web.request") + ctx := root.Context() ctx.traceID = test.tid ctx.spanID = test.spanID headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Equal(test.out[b3TraceIDHeader], headers[b3TraceIDHeader]) assert.Equal(test.out[b3SpanIDHeader], headers[b3SpanIDHeader]) @@ -690,10 +673,8 @@ func TestEnvVars(t *testing.T) { t.Run("b3/b3multi extract", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "b3"}, - {headerPropagationStyleExtractDeprecated: "b3"}, {headerPropagationStyle: "b3,none" /* none should have no affect */}, {otelHeaderPropagationStyle: "b3multi"}, - {headerPropagationStyleExtract: "b3multi", headerPropagationStyleExtractDeprecated: "none" /* none should have no affect */}, {headerPropagationStyleExtract: "b3multi", headerPropagationStyle: "none" /* none should have no affect */}, } for _, testEnv := range testEnvs { @@ -740,15 +721,14 @@ func TestEnvVars(t *testing.T) { } for _, test := range tests { t.Run(fmt.Sprintf("extract with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(test.in) assert.Nil(err) - sctx, ok := ctx.(*spanContext) - assert.True(ok) - assert.Equal(test.tid, sctx.traceID) - assert.Equal(test.sid, sctx.spanID) + assert.Equal(test.tid, ctx.traceID) + assert.Equal(test.sid, ctx.spanID) }) } } @@ -757,10 +737,8 @@ func TestEnvVars(t *testing.T) { t.Run("b3/b3multi extract invalid", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "b3"}, - {headerPropagationStyleExtractDeprecated: "b3"}, {headerPropagationStyle: "b3,none" /* none should have no affect */}, {otelHeaderPropagationStyle: "b3multi"}, - {headerPropagationStyleExtract: "b3multi", headerPropagationStyleExtractDeprecated: "none" /* none should have no affect */}, {headerPropagationStyleExtract: "b3multi", headerPropagationStyle: "none" /* none should have no affect */}, } for _, testEnv := range testEnvs { @@ -779,10 +757,11 @@ func TestEnvVars(t *testing.T) { } for _, tc := range tests { t.Run(fmt.Sprintf("extract with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) - _, err := tracer.Extract(tc.in) + assert.NoError(err) + _, err = tracer.Extract(tc.in) assert.NotNil(err) }) } @@ -792,7 +771,6 @@ func TestEnvVars(t *testing.T) { t.Run("b3 single header extract", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "B3 single header"}, - {headerPropagationStyleExtractDeprecated: "B3 single header"}, {headerPropagationStyle: "B3 single header,none" /* none should have no affect */}, {otelHeaderPropagationStyle: "b3"}, } @@ -836,20 +814,19 @@ func TestEnvVars(t *testing.T) { } for _, tc := range tests { t.Run(fmt.Sprintf("extract with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(tc.in) require.Nil(t, err) - sctx, ok := ctx.(*spanContext) - assert.True(ok) - assert.Equal(tc.out[0], sctx.traceID.Lower()) - assert.Equal(tc.out[1], sctx.spanID) - // assert.Equal(test.traceID128, id128FromSpan(assert, ctx)) // add when 128-bit trace id support is enabled + assert.Equal(tc.out[0], ctx.traceID.Lower()) + assert.Equal(tc.out[1], ctx.spanID) + // assert.Equal(tc.traceID128, id128FromSpan(assert, ctx)) // add when 128-bit trace id support is enabled if len(tc.out) > 2 { - require.NotNil(t, sctx.trace) - assert.Equal(float64(tc.out[2]), *sctx.trace.priority) + require.NotNil(t, ctx.trace) + assert.Equal(float64(tc.out[2]), *ctx.trace.priority) } }) } @@ -873,16 +850,16 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("b3 single header inject #%d", i), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() - root := tracer.StartSpan("myrequest").(*span) - ctx, ok := root.Context().(*spanContext) - require.True(t, ok) + assert.NoError(t, err) + root := tracer.StartSpan("myrequest") + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(tc.in[0]) ctx.spanID = tc.in[1] ctx.setSamplingPriority(int(tc.in[2]), samplernames.Unknown) headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) require.Nil(t, err) assert.Equal(t, tc.out, headers[b3SingleHeader]) }) @@ -892,10 +869,8 @@ func TestEnvVars(t *testing.T) { t.Run("datadog inject", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleInject: "datadog"}, - {headerPropagationStyleInjectDeprecated: "datadog,none" /* none should have no affect */}, {headerPropagationStyle: "datadog"}, {otelHeaderPropagationStyle: "datadog"}, - {headerPropagationStyleInject: "datadog", headerPropagationStyleInjectDeprecated: "none" /* none should have no affect */}, {headerPropagationStyleInject: "datadog", headerPropagationStyle: "none" /* none should have no affect */}, } @@ -931,17 +906,17 @@ func TestEnvVars(t *testing.T) { } for _, tc := range tests { t.Run(fmt.Sprintf("inject with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithPropagator(NewPropagator(&PropagatorConfig{B3: true})), WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithPropagator(NewPropagator(&PropagatorConfig{B3: true})), WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) + assert.NoError(t, err) defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - ctx, ok := root.Context().(*spanContext) + root := tracer.StartSpan("web.request") + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(tc.in[0]) ctx.spanID = tc.in[1] headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Equal(tc.out[b3TraceIDHeader], headers[b3TraceIDHeader]) assert.Equal(tc.out[b3SpanIDHeader], headers[b3SpanIDHeader]) @@ -953,7 +928,6 @@ func TestEnvVars(t *testing.T) { t.Run("datadog/b3 extract", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "Datadog,b3"}, - {headerPropagationStyleExtractDeprecated: "Datadog,b3multi"}, {headerPropagationStyle: "Datadog,b3"}, {headerPropagationStyle: "none,Datadog,b3" /* none should have no affect */}, {otelHeaderPropagationStyle: "Datadog,b3multi"}, @@ -1006,19 +980,18 @@ func TestEnvVars(t *testing.T) { } for _, tc := range tests { t.Run(fmt.Sprintf("extract with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(tc.in) assert.Nil(err) - sctx, ok := ctx.(*spanContext) - assert.True(ok) - // assert.Equal(test.traceID128Full, id128FromSpan(assert, ctx)) // add when 128-bit trace id support is enabled - assert.Equal(tc.out[0], sctx.traceID.Lower()) - assert.Equal(tc.out[1], sctx.spanID) - p, ok := sctx.SamplingPriority() + // assert.Equal(tc.traceID128Full, id128FromSpan(assert, ctx)) // add when 128-bit trace id support is enabled + assert.Equal(tc.out[0], ctx.traceID.Lower()) + assert.Equal(tc.out[1], ctx.spanID) + p, ok := ctx.SamplingPriority() assert.True(ok) assert.Equal(int(tc.out[2]), p) }) @@ -1029,7 +1002,6 @@ func TestEnvVars(t *testing.T) { t.Run("datadog inject/extract", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleInject: "datadog", headerPropagationStyleExtract: "datadog"}, - {headerPropagationStyleInjectDeprecated: "datadog", headerPropagationStyleExtractDeprecated: "datadog"}, {headerPropagationStyleInject: "datadog", headerPropagationStyle: "datadog"}, {headerPropagationStyle: "datadog"}, {otelHeaderPropagationStyle: "datadog"}, @@ -1066,26 +1038,24 @@ func TestEnvVars(t *testing.T) { } for _, tc := range tests { t.Run(fmt.Sprintf("inject and extract with env=%q", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + assert.NoError(t, err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx, ok := root.Context().(*spanContext) + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(tc.in[0]) ctx.spanID = tc.in[1] headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) - sctx, err := tracer.Extract(headers) + xctx, err := tracer.Extract(headers) require.Nil(t, err) - xctx, ok := sctx.(*spanContext) - assert.True(ok) assert.Equal(ctx.traceID, xctx.traceID) assert.Equal(ctx.spanID, xctx.spanID) assert.Equal(ctx.baggage, xctx.baggage) @@ -1098,10 +1068,8 @@ func TestEnvVars(t *testing.T) { t.Run("w3c extract", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "traceContext"}, - {headerPropagationStyleExtractDeprecated: "traceContext,none" /* none should have no affect */}, {headerPropagationStyle: "traceContext"}, {otelHeaderPropagationStyle: "traceContext"}, - {headerPropagationStyleExtract: "traceContext", headerPropagationStyleExtractDeprecated: "none" /* none should have no affect */}, {headerPropagationStyleExtract: "traceContext", headerPropagationStyle: "none" /* none should have no affect */}, } for _, testEnv := range testEnvs { @@ -1278,24 +1246,23 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("#%v extract/valid with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(tc.in) if err != nil { t.Fatal(err) } - sctx, ok := ctx.(*spanContext) - assert.True(ok) - assert.Equal(tc.tid, sctx.traceID) - assert.Equal(tc.out[0], sctx.spanID) - assert.Equal(tc.origin, sctx.origin) - p, ok := sctx.SamplingPriority() + assert.Equal(tc.tid, ctx.traceID) + assert.Equal(tc.out[0], ctx.spanID) + assert.Equal(tc.origin, ctx.origin) + p, ok := ctx.SamplingPriority() assert.True(ok) assert.Equal(int(tc.out[1]), p) - assert.Equal(tc.propagatingTags, sctx.trace.propagatingTags) + assert.Equal(tc.propagatingTags, ctx.trace.propagatingTags) }) } } @@ -1334,9 +1301,10 @@ func TestEnvVars(t *testing.T) { for i, tc := range tests { t.Run(fmt.Sprintf("#%v extract/invalid with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(tc) assert.NotNil(err) assert.Nil(ctx) @@ -1348,7 +1316,6 @@ func TestEnvVars(t *testing.T) { t.Run("w3c extract / w3c,datadog inject", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "traceContext"}, - {headerPropagationStyleExtractDeprecated: "traceContext,none" /* none should have no affect */}, {headerPropagationStyle: "traceContext"}, {otelHeaderPropagationStyle: "traceContext"}, } @@ -1386,27 +1353,26 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("#%v extract/valid with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) + assert.NoError(t, err) defer tracer.Stop() assert := assert.New(t) ctx, err := tracer.Extract(tc.inHeaders) if err != nil { t.Fatal(err) } - root := tracer.StartSpan("web.request", ChildOf(ctx)).(*span) + root := tracer.StartSpan("web.request", ChildOf(ctx)) defer root.Finish() - sctx, ok := ctx.(*spanContext) - sctx.origin = tc.origin - assert.True(ok) + ctx.origin = tc.origin - assert.Equal(tc.tid, sctx.traceID) - assert.Equal(tc.sid, sctx.spanID) - p, ok := sctx.SamplingPriority() + assert.Equal(tc.tid, ctx.traceID) + assert.Equal(tc.sid, ctx.spanID) + p, ok := ctx.SamplingPriority() assert.True(ok) assert.Equal(tc.priority, p) headers := TextMapCarrier(map[string]string{}) - err = tracer.Inject(sctx, headers) + err = tracer.Inject(ctx, headers) assert.True(ok) assert.Nil(err) @@ -1423,7 +1389,6 @@ func TestEnvVars(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleInject: "tracecontext", headerPropagationStyleExtract: "tracecontext"}, {headerPropagationStyleInject: "datadog,tracecontext", headerPropagationStyleExtract: "datadog,tracecontext"}, - {headerPropagationStyleInjectDeprecated: "tracecontext", headerPropagationStyleExtractDeprecated: "tracecontext"}, {headerPropagationStyleInject: "datadog,tracecontext", headerPropagationStyle: "datadog,tracecontext"}, {headerPropagationStyle: "datadog,tracecontext"}, {otelHeaderPropagationStyle: "datadog,traceContext"}, @@ -1588,21 +1553,21 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("#%d w3c inject with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, tc.priority) - ctx, ok := root.Context().(*spanContext) + assert.Nil(err) + root := tracer.StartSpan("web.request") + root.setSamplingPriority(tc.priority, samplernames.Default) + ctx := root.Context() ctx.origin = tc.origin ctx.traceID = tc.tid ctx.spanID = tc.sid ctx.trace.propagatingTags = tc.propagatingTags ctx.reparentID = "0123456789abcdef" headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) - assert.True(ok) assert.Nil(err) checkSameElements(assert, tc.out[traceparentHeader], headers[traceparentHeader]) if strings.HasSuffix(tc.out[tracestateHeader], ",othervendor=t61rcWkgMzE") { @@ -1618,12 +1583,13 @@ func TestEnvVars(t *testing.T) { }) t.Run(fmt.Sprintf("w3c inject with env=%q / testing tag list-member limit", testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, ext.PriorityUserKeep) - ctx, ok := root.Context().(*spanContext) + assert.Nil(err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualKeep, true) + ctx := root.Context() ctx.origin = "old_tracestate" ctx.traceID = traceIDFrom64Bits(1229782938247303442) ctx.spanID = 2459565876494606882 @@ -1635,9 +1601,8 @@ func TestEnvVars(t *testing.T) { ctx.trace.propagatingTags[fmt.Sprintf("_dd.p.a%v", i)] = "i" } headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) - assert.True(ok) assert.Nil(err) assert.Equal("00-00000000000000001111111111111112-2222222222222222-01", headers[traceparentHeader]) assert.Contains(headers[tracestateHeader], "valid_vendor=a:1") @@ -1686,25 +1651,24 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("#%d", i), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(tc.inHeaders) assert.Nil(err) - root := tracer.StartSpan("web.request", ChildOf(ctx)).(*span) + root := tracer.StartSpan("web.request", ChildOf(ctx)) defer root.Finish() - sctx, ok := ctx.(*spanContext) headers := TextMapCarrier(map[string]string{}) - err = tracer.Inject(sctx, headers) + err = tracer.Inject(ctx, headers) - assert.True(ok) assert.Nil(err) checkSameElements(assert, tc.outHeaders[traceparentHeader], headers[traceparentHeader]) checkSameElements(assert, tc.outHeaders[tracestateHeader], headers[tracestateHeader]) // NOTE: this will be set for phase 3 - assert.Empty(root.Meta["_dd.parent_id"], "extraction happened from DD headers, so _dd.parent_id mustn't be set") + assert.Empty(root.meta["_dd.parent_id"], "extraction happened from DD headers, so _dd.parent_id mustn't be set") ddTag := strings.SplitN(headers[tracestateHeader], ",", 2)[0] // -3 as we don't count dd= as part of the "value" length limit @@ -1717,7 +1681,6 @@ func TestEnvVars(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleInject: "tracecontext", headerPropagationStyleExtract: "tracecontext"}, {headerPropagationStyleInject: "datadog,tracecontext", headerPropagationStyleExtract: "datadog,tracecontext"}, - {headerPropagationStyleInjectDeprecated: "tracecontext", headerPropagationStyleExtractDeprecated: "tracecontext"}, } for _, testEnv := range testEnvs { for k, v := range testEnv { @@ -1761,20 +1724,19 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("#%d w3c inject/extract with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) ctx, err := tracer.Extract(tc.in) if err != nil { t.FailNow() } - sctx, ok := ctx.(*spanContext) - assert.True(ok) - assert.Equal(tc.out[0], sctx.traceID.Lower()) - assert.Equal(tc.out[1], sctx.spanID) - assert.Equal(tc.origin, sctx.origin) - assert.Equal(tc.priority, *sctx.trace.priority) + assert.Equal(tc.out[0], ctx.traceID.Lower()) + assert.Equal(tc.out[1], ctx.spanID) + assert.Equal(tc.origin, ctx.origin) + assert.Equal(tc.priority, *ctx.trace.priority) headers := TextMapCarrier(map[string]string{}) err = tracer.Inject(ctx, headers) @@ -1789,11 +1751,10 @@ func TestEnvVars(t *testing.T) { } }) - t.Run("w3c extract,update span, inject", func(t *testing.T) { + t.Run("w3c extract,update span with UserID, inject", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleInject: "tracecontext", headerPropagationStyleExtract: "tracecontext"}, {headerPropagationStyleInject: "datadog,tracecontext", headerPropagationStyleExtract: "datadog,tracecontext"}, - {headerPropagationStyleInjectDeprecated: "tracecontext", headerPropagationStyleExtractDeprecated: "tracecontext"}, } for _, testEnv := range testEnvs { for k, v := range testEnv { @@ -1804,9 +1765,9 @@ func TestEnvVars(t *testing.T) { outMap TextMapCarrier out []uint64 // contains [, ] tid traceID - priority float64 origin string lastParent string + userID string }{ { in: TextMapCarrier{ @@ -1815,48 +1776,58 @@ func TestEnvVars(t *testing.T) { }, outMap: TextMapCarrier{ traceparentHeader: "00-12345678901234567890123456789012-0000000000000001-01", - tracestateHeader: "dd=s:1;o:rum;p:0000000000000001;t.usr.id:baz64~~;t.tid:1234567890123456", + // Note: tracestate will be recomposed due to updated=true from SetUserID + tracestateHeader: "dd=s:2;o:rum;p:0000000000000001;t.usr.id:dGVzdDEyMw__,", // base64 of "test123" }, out: []uint64{1311768467284833366, 1}, tid: traceIDFrom128Bits(1311768467284833366, 8687463697196027922), - priority: 1, + origin: "rum", lastParent: "0123456789abcdef", + userID: "test123", }, } for i, tc := range tests { - t.Run(fmt.Sprintf("#%d w3c inject/extract with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) + t.Run(fmt.Sprintf("#%d w3c extract,set userID,inject with env=%q", i, testEnv), func(t *testing.T) { + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) defer tracer.Stop() assert := assert.New(t) + assert.NoError(err) pCtx, err := tracer.Extract(tc.in) if err != nil { t.FailNow() } + + // Verify the extracted trace is locked + assert.True(pCtx.trace.isLocked()) + s := tracer.StartSpan("op", ChildOf(pCtx), WithSpanID(1)) - sctx, ok := s.Context().(*spanContext) - assert.True(ok) + sctx := s.Context() + + // Initially, the child span context should not be marked as updated + assert.False(sctx.updated) - if tc.priority != 0 { - sctx.setSamplingPriority(int(tc.priority), samplernames.Unknown) + // Setting User modifies propagating tags, so updated=true + if tc.userID != "" { + s.SetUser(tc.userID, WithPropagation()) + assert.True(sctx.updated) } if tc.lastParent == "" { - assert.Empty(s.(*span).Meta["_dd.parent_id"]) + assert.Empty(s.meta["_dd.parent_id"]) } else { - assert.Equal(s.(*span).Meta["_dd.parent_id"], tc.lastParent) + assert.Equal(s.meta["_dd.parent_id"], tc.lastParent) } - assert.Equal(true, sctx.updated) - headers := TextMapCarrier(map[string]string{}) err = tracer.Inject(s.Context(), headers) assert.NoError(err) assert.Equal(tc.tid, sctx.traceID) - assert.Equal(tc.out[0], sctx.span.ParentID) + assert.Equal(tc.out[0], sctx.span.parentID) assert.Equal(tc.out[1], sctx.spanID) checkSameElements(assert, tc.outMap[traceparentHeader], headers[traceparentHeader]) - checkSameElements(assert, tc.outMap[tracestateHeader], headers[tracestateHeader]) + // The tracestate should be recomposed because updated=true + assert.Contains(headers[tracestateHeader], "dd=") ddTag := strings.SplitN(headers[tracestateHeader], ",", 2)[0] // -3 as we don't count dd= as part of the "value" length limit assert.LessOrEqual(len(ddTag)-3, 256) @@ -1864,7 +1835,6 @@ func TestEnvVars(t *testing.T) { } } }) - t.Run("datadog extract precedence", func(t *testing.T) { testEnvs = []map[string]string{ {headerPropagationStyleExtract: "datadog,tracecontext"}, @@ -1908,19 +1878,18 @@ func TestEnvVars(t *testing.T) { } for i, tc := range tests { t.Run(fmt.Sprintf("#%v extract with env=%q", i, testEnv), func(t *testing.T) { - tracer := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClient{})) - defer tracer.Stop() assert := assert.New(t) + tracer, err := newTracer(WithHTTPClient(c), withStatsdClient(&statsd.NoOpClientDirect{})) + assert.NoError(err) + defer tracer.Stop() ctx, err := tracer.Extract(tc.in) if err != nil { t.Fatal(err) } - sctx, ok := ctx.(*spanContext) - assert.True(ok) - assert.Equal(tc.tid, sctx.traceID) - assert.Equal(tc.out[0], sctx.spanID) - p, ok := sctx.SamplingPriority() + assert.Equal(tc.tid, ctx.traceID) + assert.Equal(tc.out[0], ctx.spanID) + p, ok := ctx.SamplingPriority() assert.True(ok) assert.Equal(int(tc.out[1]), p) }) @@ -1937,9 +1906,10 @@ func checkSameElements(assert *assert.Assertions, want, got string) { func TestTraceContextPrecedence(t *testing.T) { t.Setenv(headerPropagationStyleExtract, "datadog,b3,tracecontext") - tracer := newTracer() + tracer, err := newTracer() + assert.NoError(t, err) defer tracer.Stop() - ctx, err := tracer.Extract(TextMapCarrier{ + sctx, err := tracer.Extract(TextMapCarrier{ traceparentHeader: "00-00000000000000000000000000000001-0000000000000001-01", DefaultTraceIDHeader: "1", DefaultParentIDHeader: "22", @@ -1948,7 +1918,6 @@ func TestTraceContextPrecedence(t *testing.T) { }) assert.NoError(t, err) - sctx, _ := ctx.(*spanContext) assert := assert.New(t) assert.Equal(traceIDFrom64Bits(1), sctx.traceID) assert.Equal(uint64(0x1), sctx.spanID) @@ -1956,9 +1925,97 @@ func TestTraceContextPrecedence(t *testing.T) { assert.Equal(2, p) } +// Assert that span links are generated only when trace headers contain divergent trace IDs +func TestSpanLinks(t *testing.T) { + s, c := httpmem.ServerAndClient(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(404) + })) + defer s.Close() + t.Run("Links on divergent trace IDs", func(t *testing.T) { + carrier := TextMapCarrier{ + DefaultTraceIDHeader: "1", + DefaultParentIDHeader: "1", + DefaultPriorityHeader: "3", + traceparentHeader: "00-00000000000000000000000000000002-0000000000000002-01", + tracestateHeader: "dd=s:1;o:rum;t.usr.id:baz64~~", + b3TraceIDHeader: "3", + b3SpanIDHeader: "3", + } + w3cLink := SpanLink{TraceID: 2, TraceIDHigh: 0, SpanID: 2, Tracestate: "dd=s:1;o:rum;t.usr.id:baz64~~", Flags: 1, Attributes: map[string]string{"reason": "terminated_context", "context_headers": "tracecontext"}} + ddLink := SpanLink{TraceID: 1, TraceIDHigh: 0, SpanID: 1, Flags: 1, Attributes: map[string]string{"reason": "terminated_context", "context_headers": "datadog"}} + b3Link := SpanLink{TraceID: 3, TraceIDHigh: 0, SpanID: 3, Tracestate: "", Flags: 0, Attributes: map[string]string{"reason": "terminated_context", "context_headers": "b3multi"}} + tests := []struct { + name string + envVal string + out []SpanLink + tid traceID + }{ + { + name: "datadog first", + envVal: "datadog,tracecontext,b3", + out: []SpanLink{w3cLink, b3Link}, + tid: traceIDFrom64Bits(1), + }, + { + name: "tracecontext first", + envVal: "tracecontext,datadog,b3", + out: []SpanLink{ddLink, b3Link}, + tid: traceIDFrom64Bits(2), + }, + { + name: "b3 first", + envVal: "b3,tracecontext,datadog", + out: []SpanLink{w3cLink, ddLink}, + tid: traceIDFrom64Bits(3), + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.envVal != "" { + t.Setenv(headerPropagationStyleExtract, tt.envVal) + } + tracer, err := newTracer(WithHTTPClient(c)) + assert.NoError(t, err) + defer tracer.Stop() + assert := assert.New(t) + sctx, err := tracer.Extract(carrier) + if err != nil { + t.Fatal(err) + } + + assert.Equal(tt.tid, sctx.traceID) + assert.Len(sctx.spanLinks, 2) + assert.Contains(sctx.spanLinks, tt.out[0]) + assert.Contains(sctx.spanLinks, tt.out[1]) + }) + } + }) + t.Run("No links on equal trace IDs", func(t *testing.T) { + carrier := TextMapCarrier{ + DefaultTraceIDHeader: "1", + DefaultParentIDHeader: "1", + DefaultPriorityHeader: "3", + traceparentHeader: "00-00000000000000000000000000000001-0000000000000002-01", + tracestateHeader: "dd=s:1;o:rum;t.usr.id:baz64~~", + } + tracer, err := newTracer(WithHTTPClient(c)) + assert.NoError(t, err) + defer tracer.Stop() + assert := assert.New(t) + sctx, err := tracer.Extract(carrier) + if err != nil { + t.Fatal(err) + } + + assert.Equal(traceIDFrom64Bits(1), sctx.traceID) + assert.Len(sctx.spanLinks, 0) + }) +} + func TestW3CExtractsBaggage(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) headers := TextMapCarrier{ traceparentHeader: "00-12345678901234567890123456789012-1234567890123456-01", tracestateHeader: "dd=s:2;o:rum;t.usr.id:baz64~~", @@ -1967,7 +2024,7 @@ func TestW3CExtractsBaggage(t *testing.T) { s, err := tracer.Extract(headers) assert.NoError(t, err) found := false - s.ForeachBaggageItem(func(k, v string) bool { + s.ForeachBaggageItem(func(k, _ string) bool { if k == "something" { found = true return false @@ -1980,19 +2037,19 @@ func TestW3CExtractsBaggage(t *testing.T) { func TestNonePropagator(t *testing.T) { t.Run("inject/none", func(t *testing.T) { t.Setenv(headerPropagationStyleInject, "none") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + assert.NoError(t, err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx, ok := root.Context().(*spanContext) + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(1) ctx.spanID = 1 headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Len(headers, 0) }) @@ -2000,22 +2057,23 @@ func TestNonePropagator(t *testing.T) { t.Run("inject/none,b3", func(t *testing.T) { t.Setenv(headerPropagationStyleInject, "none,b3") tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) - tracer := newTracer(WithLogger(tp)) + tp.Ignore(commonLogIgnore...) + tracer, err := newTracer(WithLogger(tp), WithEnv("test")) + assert.Nil(t, err) defer tracer.Stop() + assert.NoError(t, err) // reinitializing to capture log output, since propagators are parsed before logger is set tracer.config.propagator = NewPropagator(&PropagatorConfig{}) - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx, ok := root.Context().(*spanContext) + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(1) ctx.spanID = 1 headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Equal("0000000000000001", headers[b3TraceIDHeader]) assert.Equal("0000000000000001", headers[b3SpanIDHeader]) @@ -2026,14 +2084,15 @@ func TestNonePropagator(t *testing.T) { t.Run("extract/none", func(t *testing.T) { t.Setenv(headerPropagationStyleExtract, "none") assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + assert.NoError(err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") headers := TextMapCarrier(map[string]string{}) - _, err := tracer.Extract(headers) + _, err = tracer.Extract(headers) assert.Equal(err, ErrSpanContextNotFound) assert.Len(headers, 0) @@ -2042,19 +2101,19 @@ func TestNonePropagator(t *testing.T) { t.Run("inject,extract/none", func(t *testing.T) { t.Run("", func(t *testing.T) { t.Setenv(headerPropagationStyle, "NoNe") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + assert.NoError(t, err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx, ok := root.Context().(*spanContext) + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(1) ctx.spanID = 1 headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Len(headers, 0) @@ -2063,19 +2122,19 @@ func TestNonePropagator(t *testing.T) { }) t.Run("", func(t *testing.T) { t.Setenv(otelHeaderPropagationStyle, "NoNe") - tracer := newTracer() + tracer, err := newTracer() + assert.NoError(t, err) defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx, ok := root.Context().(*spanContext) + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(1) ctx.spanID = 1 headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Len(headers, 0) @@ -2083,23 +2142,21 @@ func TestNonePropagator(t *testing.T) { assert.Equal(err, ErrSpanContextNotFound) }) t.Run("", func(t *testing.T) { - //"DD_TRACE_PROPAGATION_STYLE_EXTRACT": "NoNe", - // "DD_TRACE_PROPAGATION_STYLE_INJECT": "none", t.Setenv(headerPropagationStyleExtract, "NoNe") t.Setenv(headerPropagationStyleInject, "NoNe") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) - root.SetTag(ext.SamplingPriority, -1) + assert.NoError(t, err) + root := tracer.StartSpan("web.request") + root.SetTag(ext.ManualDrop, true) root.SetBaggageItem("item", "x") - ctx, ok := root.Context().(*spanContext) + ctx := root.Context() ctx.traceID = traceIDFrom64Bits(1) ctx.spanID = 1 headers := TextMapCarrier(map[string]string{}) - err := tracer.Inject(ctx, headers) + err = tracer.Inject(ctx, headers) assert := assert.New(t) - assert.True(ok) assert.Nil(err) assert.Len(headers, 0) @@ -2132,18 +2189,19 @@ func TestOtelPropagator(t *testing.T) { }, { env: "nonesense", - result: "datadog,tracecontext", + result: "datadog,tracecontext,baggage", }, { env: "jaegar", - result: "datadog,tracecontext", + result: "datadog,tracecontext,baggage", }, } for _, test := range tests { t.Setenv(otelHeaderPropagationStyle, test.env) t.Run(fmt.Sprintf("inject with %v=%v", otelHeaderPropagationStyle, test.env), func(t *testing.T) { assert := assert.New(t) - c := newConfig() + c, err := newTestConfig() + assert.NoError(err) cp, ok := c.propagator.(*chainedPropagator) assert.True(ok) assert.Equal(test.result, cp.injectorNames) @@ -2152,14 +2210,59 @@ func TestOtelPropagator(t *testing.T) { } } +// Assert that extraction returns a ErrSpanContextNotFound error when no trace context headers are found +func TestExtractNoHeaders(t *testing.T) { + tests := []struct { + name string + extractEnv string + extractFirst bool + }{ + { + name: "single header", + extractEnv: "datadog", + extractFirst: false, + }, + { + name: "single header - extractFirst", + extractEnv: "datadog", + extractFirst: true, + }, + { + name: "multi header", + extractEnv: "datadog,tracecontext", + extractFirst: false, + }, + { + name: "multi header - extractFirst", + extractEnv: "datadog,tracecontext", + extractFirst: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + t.Setenv(headerPropagationStyleExtract, tt.extractEnv) + if tt.extractFirst { + t.Setenv("DD_TRACE_PROPAGATION_EXTRACT_FIRST", "true") + } + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + ctx, err := tracer.Extract(TextMapCarrier{}) + assert.Equal(t, ErrSpanContextNotFound, err) + assert.Nil(t, ctx) + }) + } +} + func BenchmarkInjectDatadog(b *testing.B) { b.Setenv(headerPropagationStyleInject, "datadog") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(b, err) root := tracer.StartSpan("test") defer root.Finish() for i := 0; i < 20; i++ { - setPropagatingTag(root.Context().(*spanContext), fmt.Sprintf("%d", i), fmt.Sprintf("%d", i)) + setPropagatingTag(root.Context(), fmt.Sprintf("%d", i), fmt.Sprintf("%d", i)) } dst := map[string]string{} b.ResetTimer() @@ -2170,12 +2273,13 @@ func BenchmarkInjectDatadog(b *testing.B) { func BenchmarkInjectW3C(b *testing.B) { b.Setenv(headerPropagationStyleInject, "tracecontext") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(b, err) root := tracer.StartSpan("test") defer root.Finish() - ctx := root.Context().(*spanContext) + ctx := root.Context() setPropagatingTag(ctx, tracestateHeader, "othervendor=t61rcWkgMzE,dd=s:2;o:rum;t.dm:-4;t.usr.id:baz64~~") @@ -2218,6 +2322,7 @@ func BenchmarkExtractW3C(b *testing.B) { tracestateHeader: "dd=s:2;o:rum;t.dm:-4;t.usr.id:baz64~~,othervendor=t61rcWkgMzE", }) b.ResetTimer() + log.SetLevel(log.LevelError) for i := 0; i < b.N; i++ { propagator.Extract(carrier) } @@ -2228,9 +2333,9 @@ func FuzzMarshalPropagatingTags(f *testing.F) { f.Fuzz(func(t *testing.T, key1 string, val1 string, key2 string, val2 string, key3 string, val3 string) { - sendCtx := new(spanContext) + sendCtx := new(SpanContext) sendCtx.trace = newTrace() - recvCtx := new(spanContext) + recvCtx := new(SpanContext) recvCtx.trace = newTrace() pConfig := PropagatorConfig{MaxTagsHeaderLen: 128} @@ -2269,9 +2374,9 @@ func FuzzComposeTracestate(f *testing.F) { f.Fuzz(func(t *testing.T, priority int, key1 string, val1 string, key2 string, val2 string, key3 string, val3 string, oldState string) { - sendCtx := new(spanContext) + sendCtx := new(SpanContext) sendCtx.trace = newTrace() - recvCtx := new(spanContext) + recvCtx := new(SpanContext) recvCtx.trace = newTrace() sm := &stringMutator{} @@ -2286,7 +2391,7 @@ func FuzzComposeTracestate(f *testing.F) { if strings.HasSuffix(v, " ") { t.Skipf("Skipping invalid tags") } - totalLen += (len(k) + len(v)) + totalLen += len(k) + len(v) if totalLen > 128 { break } @@ -2323,7 +2428,7 @@ func FuzzParseTraceparent(f *testing.F) { f.Fuzz(func(t *testing.T, version string, traceID string, spanID string, flags string) { - ctx := new(spanContext) + ctx := new(SpanContext) ctx.trace = newTrace() header := strings.Join([]string{version, traceID, spanID, flags}, "-") @@ -2343,7 +2448,7 @@ func FuzzParseTraceparent(f *testing.F) { if err != nil { t.Skipf("Error parsing flag") } - if gotTraceID := ctx.TraceID128(); gotTraceID != strings.ToLower(traceID) { + if gotTraceID := ctx.TraceID(); gotTraceID != strings.ToLower(traceID) { t.Fatalf(`Inconsistent trace id parsing: got: %s wanted: %s @@ -2365,17 +2470,18 @@ func FuzzParseTraceparent(f *testing.F) { } func FuzzExtractTraceID128(f *testing.F) { - f.Fuzz(func(t *testing.T, v string) { - ctx := new(spanContext) + f.Fuzz(func(_ *testing.T, v string) { + ctx := new(SpanContext) extractTraceID128(ctx, v) // make sure it doesn't panic }) } // Regression test for https://github.com/DataDog/dd-trace-go/issues/1944 -func TestPropagatingTagsConcurrency(_ *testing.T) { +func TestPropagatingTagsConcurrency(t *testing.T) { // This test ensures Injection can be done concurrently. - trc := newTracer() + trc, err := newTracer() defer trc.Stop() + assert.NoError(t, err) var wg sync.WaitGroup for i := 0; i < 1_000; i++ { @@ -2392,53 +2498,55 @@ func TestPropagatingTagsConcurrency(_ *testing.T) { } func TestMalformedTID(t *testing.T) { - tracer := newTracer() - internal.SetGlobalTracer(tracer) + assert := assert.New(t) + tracer, err := newTracer() + assert.Nil(err) + setGlobalTracer(tracer) defer tracer.Stop() - defer internal.SetGlobalTracer(&internal.NoopTracer{}) + defer setGlobalTracer(&NoopTracer{}) - t.Run("datadog, short tid", func(t *testing.T) { + t.Run("datadog, short tid", func(_ *testing.T) { headers := TextMapCarrier(map[string]string{ DefaultTraceIDHeader: "1234567890123456789", DefaultParentIDHeader: "987654321", traceTagsHeader: "_dd.p.tid=1234567890abcde", }) sctx, err := tracer.Extract(headers) - assert.Nil(t, err) - root := tracer.StartSpan("web.request", ChildOf(sctx)).(*span) + assert.Nil(err) + root := tracer.StartSpan("web.request", ChildOf(sctx)) root.Finish() - assert.NotContains(t, root.Meta, keyTraceID128) + assert.NotContains(root.meta, keyTraceID128) }) - t.Run("datadog, malformed tid", func(t *testing.T) { + t.Run("datadog, malformed tid", func(_ *testing.T) { headers := TextMapCarrier(map[string]string{ DefaultTraceIDHeader: "1234567890123456789", DefaultParentIDHeader: "987654321", traceTagsHeader: "_dd.p.tid=XXXXXXXXXXXXXXXX", }) sctx, err := tracer.Extract(headers) - assert.Nil(t, err) - root := tracer.StartSpan("web.request", ChildOf(sctx)).(*span) + assert.Nil(err) + root := tracer.StartSpan("web.request", ChildOf(sctx)) root.Finish() - assert.NotContains(t, root.Meta, keyTraceID128) + assert.NotContains(root.meta, keyTraceID128) }) - t.Run("datadog, valid tid", func(t *testing.T) { + t.Run("datadog, valid tid", func(_ *testing.T) { headers := TextMapCarrier(map[string]string{ DefaultTraceIDHeader: "1234567890123456789", DefaultParentIDHeader: "987654321", traceTagsHeader: "_dd.p.tid=640cfd8d00000000", }) sctx, err := tracer.Extract(headers) - assert.Nil(t, err) - root := tracer.StartSpan("web.request", ChildOf(sctx)).(*span) + assert.Nil(err) + root := tracer.StartSpan("web.request", ChildOf(sctx)) root.Finish() - assert.Equal(t, "640cfd8d00000000", root.Meta[keyTraceID128]) + assert.Equal("640cfd8d00000000", root.meta[keyTraceID128]) }) } func BenchmarkComposeTracestate(b *testing.B) { - ctx := new(spanContext) + ctx := new(SpanContext) ctx.trace = newTrace() ctx.origin = "synthetics" ctx.trace.setPropagatingTag("_dd.p.keyOne", "json") @@ -2453,7 +2561,7 @@ func BenchmarkComposeTracestate(b *testing.B) { func TestStringMutator(t *testing.T) { sm := &stringMutator{} - rx := regexp.MustCompile(",|~|;|[^\\x21-\\x7E]+") + rx := regexp.MustCompile(`,|~|;|[^\x21-\x7E]+`) tc := []struct { name string input string @@ -2490,7 +2598,7 @@ func TestStringMutator(t *testing.T) { } func FuzzStringMutator(f *testing.F) { - rx := regexp.MustCompile(",|~|;|[^\\x21-\\x7E]+") + rx := regexp.MustCompile(`,|~|;|[^\x21-\x7E]+`) f.Add("a,b;c~~~~d;") f.Add("a,b👍👍👍;c~d👍;") f.Add("=") @@ -2503,3 +2611,404 @@ func FuzzStringMutator(f *testing.F) { } }) } + +func TestInjectBaggagePropagator(t *testing.T) { + + assert := assert.New(t) + + propagator := NewPropagator(&PropagatorConfig{ + BaggageHeader: "baggage", + TraceHeader: "tid", + ParentHeader: "pid", + }) + tracer, err := newTracer(WithPropagator(propagator)) + assert.NoError(err) + defer tracer.Stop() + + root := tracer.StartSpan("web.request") + root.SetBaggageItem("foo", "bar") + ctx := root.Context() + headers := http.Header{} + + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(ctx, carrier) + assert.Nil(err) + + assert.Equal(headers.Get("baggage"), "foo=bar") +} + +func TestExtractBaggagePropagator(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "foo=bar", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 1) + assert.Equal(t, "bar", got["foo"]) +} + +func TestInjectBaggagePropagatorEncoding(t *testing.T) { + assert := assert.New(t) + + propagator := NewPropagator(&PropagatorConfig{ + BaggageHeader: "baggage", + TraceHeader: "tid", + ParentHeader: "pid", + }) + tracer, err := newTracer(WithPropagator(propagator)) + assert.NoError(err) + defer tracer.Stop() + + root := tracer.StartSpan("web.request") + root.SetBaggageItem("userId", "Amélie") + root.SetBaggageItem("serverNode", "DF 28") + headers := http.Header{} + + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(root.Context(), carrier) + assert.Nil(err) + actualBaggage := headers.Get("baggage") + // Instead of checking equality of the whole string, assert that both key/value pairs are present. + assert.Contains(actualBaggage, "userId=Am%C3%A9lie") + assert.Contains(actualBaggage, "serverNode=DF+28") +} + +func TestInjectBaggagePropagatorEncodingSpecialCharacters(t *testing.T) { + assert := assert.New(t) + + propagator := NewPropagator(&PropagatorConfig{ + BaggageHeader: "baggage", + TraceHeader: "tid", + ParentHeader: "pid", + }) + tracer, err := newTracer(WithPropagator(propagator)) + assert.NoError(err) + defer tracer.Stop() + + root := tracer.StartSpan("web.request") + ctx := root.Context() + root.SetBaggageItem(",;\\()/:<=>?@[]{}", ",;\\") + headers := http.Header{} + + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(ctx, carrier) + assert.Nil(err) + + assert.Equal(headers.Get("baggage"), "%2C%3B%5C%28%29%2F%3A%3C%3D%3E%3F%40%5B%5D%7B%7D=%2C%3B%5C") +} + +func TestExtractBaggagePropagatorDecoding(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "userId=Am%C3%A9lie,serverNode=DF+28", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 2) + assert.Equal(t, "Amélie", got["userId"]) + assert.Equal(t, "DF 28", got["serverNode"]) +} + +func TestInjectBaggageMaxItems(t *testing.T) { + assert := assert.New(t) + + propagator := NewPropagator(&PropagatorConfig{ + BaggageHeader: "baggage", + }) + tracer, err := newTracer(WithPropagator(propagator)) + assert.NoError(err) + defer tracer.Stop() + + root := tracer.StartSpan("web.request") + ctx := root.Context() + + for i := 0; i < baggageMaxItems+2; i++ { + iString := strconv.Itoa(i) + ctx.setBaggageItem("key"+iString, "val"+iString) + } + + headers := http.Header{} + + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(ctx, carrier) + assert.Nil(err) + + headerValue := headers.Get("baggage") + items := strings.Split(headerValue, ",") + assert.Equal(baggageMaxItems, len(items)) +} + +func TestInjectBaggageMaxBytes(t *testing.T) { + assert := assert.New(t) + + propagator := NewPropagator(&PropagatorConfig{ + BaggageHeader: "baggage", + }) + tracer, err := newTracer(WithPropagator(propagator)) + assert.NoError(err) + defer tracer.Stop() + + root := tracer.StartSpan("web.request") + ctx := root.Context() + + baggageItems := map[string]string{ + "key0": "o", + "key1": strings.Repeat("a", baggageMaxBytes/3), + "key2": strings.Repeat("b", baggageMaxBytes/3), + "key3": strings.Repeat("c", baggageMaxBytes/3), + } + + ctx.baggage = baggageItems + headers := http.Header{} + + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(ctx, carrier) + assert.Nil(err) + + headerValue := headers.Get("baggage") + headerSize := len([]byte(headerValue)) + assert.LessOrEqual(headerSize, baggageMaxBytes) +} + +func TestExtractBaggagePropagatorMalformedHeader(t *testing.T) { + t.Run("missing equal sign", func(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "key1,key2=value2", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + // since the header is malformed, we should not have any baggage items + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 0) + }) + t.Run("missing value", func(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "key1=value1,key2=", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + // since the header is malformed, we should not have any baggage items + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 0) + }) + t.Run("missing key", func(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "key1=value1,=value2", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + // since the header is malformed, we should not have any baggage items + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 0) + }) + t.Run("missing key and value", func(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "=,key1=value1", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + // since the header is malformed, we should not have any baggage items + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 0) + }) + t.Run("missing key-value pair", func(t *testing.T) { + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + headers := TextMapCarrier{ + DefaultTraceIDHeader: "4", + DefaultParentIDHeader: "1", + DefaultBaggageHeader: "key1=value1,", + } + s, err := tracer.Extract(headers) + assert.NoError(t, err) + // since the header is malformed, we should not have any baggage items + got := make(map[string]string) + s.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 0) + }) +} + +func TestExtractOnlyBaggage(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE", "baggage") + headers := TextMapCarrier(map[string]string{ + "baggage": "foo=bar,baz=qux", + }) + + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + + ctx, err := tracer.Extract(headers) + assert.Nil(t, err) + + got := make(map[string]string) + ctx.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 2) + assert.Equal(t, "bar", got["foo"]) + assert.Equal(t, "qux", got["baz"]) +} + +// TestExtractBaggageFirstThenDatadog verifies that when both baggage and trace headers are present, +// the trace context (trace ID, parent ID, etc.) is extracted from trace headers, and the baggage items are properly inherited, +// specifically when baggage has a higher precedence than trace headers in the propagation style. +func TestExtractBaggageFirstThenDatadog(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE", "baggage,datadog") + + // Set up headers with both baggage and Datadog trace context + headers := TextMapCarrier(map[string]string{ + "baggage": "item=xyz", + DefaultTraceIDHeader: "12345", + DefaultParentIDHeader: "67890", + DefaultPriorityHeader: "1", + }) + + tracer, err := newTracer() + assert.NoError(t, err) + defer tracer.Stop() + + ctx, err := tracer.Extract(headers) + assert.NoError(t, err) + + // Verify that trace context is taken from Datadog headers, despite baggage being listed first in propagation style + expectedTraceID := traceIDFrom64Bits(12345) + assert.Equal(t, expectedTraceID, ctx.traceID) + assert.Equal(t, uint64(67890), ctx.spanID) + + got := make(map[string]string) + ctx.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 1) + assert.Equal(t, "xyz", got["item"]) +} + +// TestSpanContextDebugLoggingSecurity verifies that debug logging of span context +// does not expose sensitive data from baggage or other fields. +func TestSpanContextDebugLoggingSecurity(t *testing.T) { + // Set up a record logger to capture debug output + tp := new(log.RecordLogger) + + // Enable debug mode to trigger the debug logging + tracer, err := newTracer(WithLogger(tp), WithDebugMode(true)) + assert.NoError(t, err) + defer tracer.Stop() + + // Create headers with sensitive data in baggage + headers := TextMapCarrier(map[string]string{ + "baggage": "api_key=secret123,password=sensitive_password,token=bearer_token_abc", + DefaultTraceIDHeader: "12345", + DefaultParentIDHeader: "67890", + DefaultPriorityHeader: "1", + }) + + // Clear any existing logs before extraction + tp.Reset() + + // Extract span context - this should trigger the debug log + ctx, err := tracer.Extract(headers) + assert.NoError(t, err) + assert.NotNil(t, ctx) + + // Verify that baggage was extracted + got := make(map[string]string) + ctx.ForeachBaggageItem(func(k, v string) bool { + got[k] = v + return true + }) + assert.Len(t, got, 3) + assert.Equal(t, "secret123", got["api_key"]) + assert.Equal(t, "sensitive_password", got["password"]) + assert.Equal(t, "bearer_token_abc", got["token"]) + + // Check the debug logs - they should NOT contain sensitive data + logs := tp.Logs() + + // Find the span context debug log + var contextLog string + for _, logEntry := range logs { + if strings.Contains(logEntry, "Extracted span context:") { + contextLog = logEntry + break + } + } + + // The log should exist + assert.NotEmpty(t, contextLog, "Expected to find span context debug log") + + // The log should NOT contain sensitive baggage values + assert.NotContains(t, contextLog, "secret123", "Debug log should not expose API key") + assert.NotContains(t, contextLog, "sensitive_password", "Debug log should not expose password") + assert.NotContains(t, contextLog, "bearer_token_abc", "Debug log should not expose token") + + // The log should still contain useful debug information (trace ID, span ID) + assert.Contains(t, contextLog, "67890", "Debug log should contain span ID") + assert.Contains(t, contextLog, "traceID=", "Debug log should contain trace ID field") + assert.Contains(t, contextLog, "hasBaggage=true", "Debug log should indicate baggage presence") + assert.Contains(t, contextLog, "baggageCount=3", "Debug log should show baggage count") + + // This test ensures that the SafeDebugString() method is used instead of %#v + // to prevent sensitive baggage data from being exposed in debug logs. +} diff --git a/ddtrace/tracer/time_windows.go b/ddtrace/tracer/time_windows.go index f1ecd4f903..a4993c9686 100644 --- a/ddtrace/tracer/time_windows.go +++ b/ddtrace/tracer/time_windows.go @@ -10,7 +10,7 @@ import ( "golang.org/x/sys/windows" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // This method is more precise than the go1.8 time.Now on Windows @@ -31,7 +31,7 @@ func lowPrecisionNow() int64 { // nil dereference panic. var now func() int64 = func() func() int64 { if err := windows.LoadGetSystemTimePreciseAsFileTime(); err != nil { - log.Warn("Unable to load high precison timer, defaulting to time.Now()") + log.Warn("Unable to load high precision timer, defaulting to time.Now()") return lowPrecisionNow } else { return highPrecisionNow @@ -40,7 +40,7 @@ var now func() int64 = func() func() int64 { var nowTime func() time.Time = func() func() time.Time { if err := windows.LoadGetSystemTimePreciseAsFileTime(); err != nil { - log.Warn("Unable to load high precison timer, defaulting to time.Now()") + log.Warn("Unable to load high precision timer, defaulting to time.Now()") return func() time.Time { return time.Unix(0, lowPrecisionNow()) } } else { return func() time.Time { return time.Unix(0, highPrecisionNow()) } diff --git a/ddtrace/tracer/tracer.go b/ddtrace/tracer/tracer.go index 104e31eb1c..dd06d845ab 100644 --- a/ddtrace/tracer/tracer.go +++ b/ddtrace/tracer/tracer.go @@ -8,6 +8,8 @@ package tracer import ( gocontext "context" "encoding/binary" + "fmt" + "log/slog" "math" "os" "runtime/pprof" @@ -17,24 +19,72 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - globalinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - appsecConfig "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/datastreams" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal/tracerstats" + globalinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + appsecConfig "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/datastreams" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/internal/version" + "github.com/google/uuid" "github.com/DataDog/datadog-agent/pkg/obfuscate" + "github.com/DataDog/go-runtime-metrics-internal/pkg/runtimemetrics" ) -var _ ddtrace.Tracer = (*tracer)(nil) +type TracerConf struct { //nolint:revive + CanComputeStats bool + CanDropP0s bool + DebugAbandonedSpans bool + Disabled bool + PartialFlush bool + PartialFlushMinSpans int + PeerServiceDefaults bool + PeerServiceMappings map[string]string + EnvTag string + VersionTag string + ServiceTag string + TracingAsTransport bool + isLambdaFunction bool +} + +// Tracer specifies an implementation of the Datadog tracer which allows starting +// and propagating spans. The official implementation if exposed as functions +// within the "tracer" package. +type Tracer interface { + // StartSpan starts a span with the given operation name and options. + StartSpan(operationName string, opts ...StartSpanOption) *Span + + // Extract extracts a span context from a given carrier. Note that baggage item + // keys will always be lower-cased to maintain consistency. It is impossible to + // maintain the original casing due to MIME header canonicalization standards. + Extract(carrier interface{}) (*SpanContext, error) + + // Inject injects a span context into the given carrier. + Inject(context *SpanContext, carrier interface{}) error + + // TracerConf returns a snapshot of the current configuration of the tracer. + TracerConf() TracerConf + + // Flush flushes any buffered traces. Flush is in effect only if a tracer + // is started. Users do not have to call Flush in order to ensure that + // traces reach Datadog. It is a convenience method dedicated to specific + // use cases. + Flush() + + // Stop stops the tracer. Calls to Stop should be idempotent. + Stop() +} + +var _ Tracer = (*tracer)(nil) // tracer creates, buffers and submits Spans which are used to time blocks of // computation. They are accumulated and streamed into an internal payload, @@ -71,26 +121,20 @@ type tracer struct { // wg waits for all goroutines to exit when stopping. wg sync.WaitGroup - // prioritySampling holds an instance of the priority sampler. - prioritySampling *prioritySampler - - // pid of the process - pid int - - // These integers track metrics about spans and traces as they are started, - // finished, and dropped - spansStarted, spansFinished, tracesDropped uint32 + // These maps count the spans started and finished from + // each component, including contribs and "manual" spans. + spansStarted, spansFinished globalinternal.XSyncMapCounterMap // Keeps track of the total number of traces dropped for accurate logging. totalTracesDropped uint32 logDroppedTraces *time.Ticker - // Records the number of dropped P0 traces and spans. - droppedP0Traces, droppedP0Spans uint32 + // prioritySampling holds an instance of the priority sampler. + prioritySampling *prioritySampler - // partialTrace the number of partially dropped traces. - partialTraces uint32 + // pid of the process + pid int // rulesSampling holds an instance of the rules sampler used to apply either trace sampling, // or single span sampling rules on spans. These are user-defined @@ -116,6 +160,12 @@ type tracer struct { // logFile is closed when tracer stops // by default, tracer logs to stderr and this setting is unused logFile *log.ManagedFile + + // runtimeMetrics is submitting runtime metrics to the agent using statsd. + runtimeMetrics *runtimemetrics.Emitter + + // telemetry is the telemetry client for the tracer. + telemetry telemetry.Client } const ( @@ -140,29 +190,60 @@ const ( // statsd client; replaced in tests. var statsInterval = 10 * time.Second +// startStopMu ensures that calling Start and Stop concurrently doesn't leak +// goroutines. In particular, without this lock TestTracerCleanStop will leak +// goroutines from the internal telemetry client. +// +// TODO: The entire Start/Stop code should be refactored, it's pretty gnarly. +var startStopMu sync.Mutex + // Start starts the tracer with the given set of options. It will stop and replace // any running tracer, meaning that calling it several times will result in a restart // of the tracer by replacing the current instance with a new one. -func Start(opts ...StartOption) { - if internal.Testing { - return // mock tracer active +func Start(opts ...StartOption) error { + startStopMu.Lock() + defer startStopMu.Unlock() + + defer func(now time.Time) { + telemetry.Distribution(telemetry.NamespaceGeneral, "init_time", nil).Submit(float64(time.Since(now).Milliseconds())) + }(time.Now()) + t, err := newTracer(opts...) + if err != nil { + return err } - defer telemetry.Time(telemetry.NamespaceGeneral, "init_time", nil, true)() - t := newTracer(opts...) if !t.config.enabled.current { // TODO: instrumentation telemetry client won't get started // if tracing is disabled, but we still want to capture this // telemetry information. Will be fixed when the tracer and profiler // share control of the global telemetry client. - return - } - internal.SetGlobalTracer(t) - if t.config.logStartup { - logStartup(t) + t.Stop() + return nil } + setGlobalTracer(t) if t.dataStreams != nil { t.dataStreams.Start() } + if t.config.ciVisibilityAgentless { + // CI Visibility agentless mode doesn't require remote configuration. + + // start instrumentation telemetry unless it is disabled through the + // DD_INSTRUMENTATION_TELEMETRY_ENABLED env var + t.telemetry = startTelemetry(t.config) + + globalinternal.SetTracerInitialized(true) + return nil + } + + if t.config.runtimeMetricsV2 { + l := slog.New(slogHandler{}) + opts := &runtimemetrics.Options{Logger: l} + if t.runtimeMetrics, err = runtimemetrics.NewEmitter(t.statsd, opts); err == nil { + l.Debug("Runtime metrics v2 enabled.") + } else { + l.Error("Failed to enable runtime metrics v2", "err", err.Error()) + } + } + // Start AppSec with remote configuration cfg := remoteconfig.DefaultClientConfig() cfg.AgentURL = t.config.agentURL.String() @@ -171,49 +252,93 @@ func Start(opts ...StartOption) { cfg.HTTP = t.config.httpClient cfg.ServiceName = t.config.serviceName if err := t.startRemoteConfig(cfg); err != nil { - log.Warn("Remote config startup error: %s", err) + log.Warn("Remote config startup error: %s", err.Error()) } - // start instrumentation telemetry unless it is disabled through the - // DD_INSTRUMENTATION_TELEMETRY_ENABLED env var - startTelemetry(t.config) - // appsec.Start() may use the telemetry client to report activation, so it is // important this happens _AFTER_ startTelemetry() has been called, so the // client is appropriately configured. - appsec.Start(appsecConfig.WithRCConfig(cfg)) - _ = t.hostname() // Prime the hostname cache + appsecopts := make([]appsecConfig.StartOption, 0, len(t.config.appsecStartOptions)+1) + appsecopts = append(appsecopts, t.config.appsecStartOptions...) + appsecopts = append(appsecopts, appsecConfig.WithRCConfig(cfg), appsecConfig.WithMetaStructAvailable(t.config.agent.metaStructAvailable)) + + appsec.Start(appsecopts...) + + if t.config.llmobs.Enabled { + if err := llmobs.Start(t.config.llmobs, &llmobsTracerAdapter{}); err != nil { + return fmt.Errorf("failed to start llmobs: %w", err) + } + } + if t.config.logStartup { + logStartup(t) + } + + // start instrumentation telemetry unless it is disabled through the + // DD_INSTRUMENTATION_TELEMETRY_ENABLED env var + t.telemetry = startTelemetry(t.config) + + // store the configuration in an in-memory file, allowing it to be read to + // determine if the process is instrumented with a tracer and to retrive + // relevant tracing information. + storeConfig(t.config) + + globalinternal.SetTracerInitialized(true) + return nil +} + +func storeConfig(c *config) { + uuid, _ := uuid.NewRandom() + name := fmt.Sprintf("datadog-tracer-info-%s", uuid.String()[0:8]) + + metadata := Metadata{ + SchemaVersion: 2, + RuntimeID: globalconfig.RuntimeID(), + Language: "go", + Version: version.Tag, + Hostname: c.hostname, + ServiceName: c.serviceName, + ServiceEnvironment: c.env, + ServiceVersion: c.version, + ProcessTags: processtags.GlobalTags().String(), + ContainerID: globalinternal.ContainerID(), + } + + data, _ := metadata.MarshalMsg(nil) + _, err := globalinternal.CreateMemfd(name, data) + if err != nil { + log.Error("failed to store the configuration: %s", err.Error()) + } } // Stop stops the started tracer. Subsequent calls are valid but become no-op. func Stop() { - internal.SetGlobalTracer(&internal.NoopTracer{}) + startStopMu.Lock() + defer startStopMu.Unlock() + + llmobs.Stop() + setGlobalTracer(&NoopTracer{}) + globalinternal.SetTracerInitialized(false) log.Flush() } -// Span is an alias for ddtrace.Span. It is here to allow godoc to group methods returning -// ddtrace.Span. It is recommended and is considered more correct to refer to this type as -// ddtrace.Span instead. -type Span = ddtrace.Span - // StartSpan starts a new span with the given operation name and set of options. // If the tracer is not started, calling this function is a no-op. -func StartSpan(operationName string, opts ...StartSpanOption) Span { - return internal.GetGlobalTracer().StartSpan(operationName, opts...) +func StartSpan(operationName string, opts ...StartSpanOption) *Span { + return getGlobalTracer().StartSpan(operationName, opts...) } // Extract extracts a SpanContext from the carrier. The carrier is expected // to implement TextMapReader, otherwise an error is returned. // If the tracer is not started, calling this function is a no-op. -func Extract(carrier interface{}) (ddtrace.SpanContext, error) { - return internal.GetGlobalTracer().Extract(carrier) +func Extract(carrier interface{}) (*SpanContext, error) { + return getGlobalTracer().Extract(carrier) } // Inject injects the given SpanContext into the carrier. The carrier is // expected to implement TextMapWriter, otherwise an error is returned. // If the tracer is not started, calling this function is a no-op. -func Inject(ctx ddtrace.SpanContext, carrier interface{}) error { - return internal.GetGlobalTracer().Inject(ctx, carrier) +func Inject(ctx *SpanContext, carrier interface{}) error { + return getGlobalTracer().Inject(ctx, carrier) } // SetUser associates user information to the current trace which the @@ -221,29 +346,33 @@ func Inject(ctx ddtrace.SpanContext, carrier interface{}) error { // bit of information gets monitored. In case of distributed traces, // the user id can be propagated across traces using the WithPropagation() option. // See https://docs.datadoghq.com/security_platform/application_security/setup_and_configure/?tab=set_user#add-user-information-to-traces -func SetUser(s Span, id string, opts ...UserMonitoringOption) { +func SetUser(s *Span, id string, opts ...UserMonitoringOption) { if s == nil { return } - sp, ok := s.(interface { - SetUser(string, ...UserMonitoringOption) - }) - if !ok { - return - } - sp.SetUser(id, opts...) + s.SetUser(id, opts...) } // payloadQueueSize is the buffer size of the trace channel. const payloadQueueSize = 1000 -func newUnstartedTracer(opts ...StartOption) *tracer { - c := newConfig(opts...) +func newUnstartedTracer(opts ...StartOption) (t *tracer, err error) { + c, err := newConfig(opts...) + if err != nil { + return nil, err + } sampler := newPrioritySampler() statsd, err := newStatsdClient(c) if err != nil { - log.Warn("Runtime and health metrics disabled: %v", err) + log.Error("Runtime and health metrics disabled: %s", err.Error()) + // We are not failing here because the error could be cause by + // a transitory issue. } + defer func() { + if err != nil { + statsd.Close() + } + }() var writer traceWriter if c.ciVisibilityEnabled { writer = newCiVisibilityTraceWriter(c) @@ -254,7 +383,8 @@ func newUnstartedTracer(opts ...StartOption) *tracer { } traces, spans, err := samplingRulesFromEnv() if err != nil { - log.Warn("DIAGNOSTICS Error(s) parsing sampling rules: found errors:%s", err) + log.Warn("DIAGNOSTICS Error(s) parsing sampling rules: found errors: %s", err.Error()) + return nil, fmt.Errorf("found errors when parsing sampling rules: %w", err) } if traces != nil { c.traceRules = traces @@ -262,7 +392,8 @@ func newUnstartedTracer(opts ...StartOption) *tracer { if spans != nil { c.spanRules = spans } - rulesSampler := newRulesSampler(c.traceRules, c.spanRules, c.globalSampleRate) + + rulesSampler := newRulesSampler(c.traceRules, c.spanRules, c.globalSampleRate, c.traceRateLimitPerSecond) c.traceSampleRate = newDynamicConfig("trace_sample_rate", c.globalSampleRate, rulesSampler.traces.setGlobalSampleRate, equal[float64]) // If globalSampleRate returns NaN, it means the environment variable was not set or valid. // We could always set the origin to "env_var" inconditionally, but then it wouldn't be possible @@ -281,11 +412,11 @@ func newUnstartedTracer(opts ...StartOption) *tracer { if v := c.logDirectory; v != "" { logFile, err = log.OpenFileAtPath(v) if err != nil { - log.Warn("%v", err) + log.Warn("%s", err.Error()) c.logDirectory = "" } } - t := &tracer{ + t = &tracer{ config: c, traceWriter: writer, out: make(chan *chunk, payloadQueueSize), @@ -295,30 +426,34 @@ func newUnstartedTracer(opts ...StartOption) *tracer { prioritySampling: sampler, pid: os.Getpid(), logDroppedTraces: time.NewTicker(1 * time.Second), - stats: newConcentrator(c, defaultStatsBucketSize), + stats: newConcentrator(c, defaultStatsBucketSize, statsd), + spansStarted: *globalinternal.NewXSyncMapCounterMap(), + spansFinished: *globalinternal.NewXSyncMapCounterMap(), obfuscator: obfuscate.NewObfuscator(obfuscate.Config{ SQL: obfuscate.SQLConfig{ TableNames: c.agent.HasFlag("table_names"), ReplaceDigits: c.agent.HasFlag("quantize_sql_tables") || c.agent.HasFlag("replace_sql_digits"), KeepSQLAlias: c.agent.HasFlag("keep_sql_alias"), DollarQuotedFunc: c.agent.HasFlag("dollar_quoted_func"), - Cache: c.agent.HasFlag("sql_cache"), }, }), statsd: statsd, dataStreams: dataStreamsProcessor, logFile: logFile, } - return t + return t, nil } -// newTracer creates a new no-op tracer for testing. +// newTracer creates a new tracer and starts it. // NOTE: This function does NOT set the global tracer, which is required for // most finish span/flushing operations to work as expected. If you are calling // span.Finish and/or expecting flushing to work, you must call -// internal.SetGlobalTracer(...) with the tracer provided by this function. -func newTracer(opts ...StartOption) *tracer { - t := newUnstartedTracer(opts...) +// setGlobalTracer(...) with the tracer provided by this function. +func newTracer(opts ...StartOption) (*tracer, error) { + t, err := newUnstartedTracer(opts...) + if err != nil { + return nil, err + } c := t.config t.statsd.Incr("datadog.tracer.started", nil, 1) if c.runtimeMetrics { @@ -348,10 +483,10 @@ func newTracer(opts ...StartOption) *tracer { t.wg.Add(1) go func() { defer t.wg.Done() - t.reportHealthMetrics(statsInterval) + t.reportHealthMetricsAtInterval(statsInterval) }() t.stats.Start() - return t + return t, nil } // Flush flushes any buffered traces. Flush is in effect only if a tracer @@ -365,19 +500,20 @@ func newTracer(opts ...StartOption) *tracer { // whereas the invocation can make use of Flush to ensure any created spans // reach the agent. func Flush() { - if t, ok := internal.GetGlobalTracer().(*tracer); ok { - t.flushSync() - if t.dataStreams != nil { - t.dataStreams.Flush() - } + if t := getGlobalTracer(); t != nil { + t.Flush() } + llmobs.Flush() } -// flushSync triggers a flush and waits for it to complete. -func (t *tracer) flushSync() { +// Flush triggers a flush and waits for it to complete. +func (t *tracer) Flush() { done := make(chan struct{}) t.flush <- done <-done + if t.dataStreams != nil { + t.dataStreams.Flush() + } } // worker receives finished traces to be added into the payload, as well @@ -387,7 +523,7 @@ func (t *tracer) worker(tick <-chan time.Time) { select { case trace := <-t.out: t.sampleChunk(trace) - if len(trace.spans) != 0 { + if len(trace.spans) > 0 { t.traceWriter.add(trace.spans) } case <-tick: @@ -398,7 +534,9 @@ func (t *tracer) worker(tick <-chan time.Time) { t.statsd.Incr("datadog.tracer.flush_triggered", []string{"reason:invoked"}, 1) t.traceWriter.flush() t.statsd.Flush() - t.stats.flushAndSend(time.Now(), withCurrentBucket) + if !t.config.tracingAsTransport { + t.stats.flushAndSend(time.Now(), withCurrentBucket) + } // TODO(x): In reality, the traceWriter.flush() call is not synchronous // when using the agent traceWriter. However, this functionality is used // in Lambda so for that purpose this mechanism should suffice. @@ -412,7 +550,7 @@ func (t *tracer) worker(tick <-chan time.Time) { select { case trace := <-t.out: t.sampleChunk(trace) - if len(trace.spans) != 0 { + if len(trace.spans) > 0 { t.traceWriter.add(trace.spans) } default: @@ -427,8 +565,10 @@ func (t *tracer) worker(tick <-chan time.Time) { // chunk holds information about a trace chunk to be flushed, including its spans. // The chunk may be a fully finished local trace chunk, or only a portion of the local trace chunk in the case of // partial flushing. +// +// It's exported for supporting `mocktracer`. type chunk struct { - spans []*span + spans []*Span willSend bool // willSend indicates whether the trace will be sent to the agent. } @@ -440,7 +580,7 @@ func (t *tracer) sampleChunk(c *chunk) { return } } - var kept []*span + var kept []*Span if t.rulesSampling.HasSpanRules() { // Apply sampling rules to individual spans in the trace. for _, span := range c.spans { @@ -450,19 +590,20 @@ func (t *tracer) sampleChunk(c *chunk) { } if len(kept) > 0 && len(kept) < len(c.spans) { // Some spans in the trace were kept, so a partial trace will be sent. - atomic.AddUint32(&t.partialTraces, 1) + tracerstats.Signal(tracerstats.PartialTraces, 1) } } - atomic.AddUint32(&t.droppedP0Spans, uint32(len(c.spans)-len(kept))) + tracerstats.Signal(tracerstats.DroppedP0Spans, uint32(len(c.spans)-len(kept))) if !c.willSend { if len(kept) == 0 { - atomic.AddUint32(&t.droppedP0Traces, 1) + tracerstats.Signal(tracerstats.DroppedP0Traces, 1) } c.spans = kept } } func (t *tracer) pushChunk(trace *chunk) { + tracerstats.Signal(tracerstats.SpansFinished, uint32(len(trace.spans))) select { case <-t.stop: return @@ -483,13 +624,12 @@ func (t *tracer) pushChunk(trace *chunk) { } } -// StartSpan creates, starts, and returns a new Span with the given `operationName`. -func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOption) ddtrace.Span { - if !t.config.enabled.current { - return internal.NoopSpan{} - } - var opts ddtrace.StartSpanConfig +func spanStart(operationName string, options ...StartSpanOption) *Span { + var opts StartSpanConfig for _, fn := range options { + if fn == nil { + continue + } fn(&opts) } var startTime int64 @@ -498,24 +638,19 @@ func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOpt } else { startTime = opts.StartTime.UnixNano() } - var context *spanContext + var context *SpanContext // The default pprof context is taken from the start options and is // not nil when using StartSpanFromContext() pprofContext := opts.Context if opts.Parent != nil { - if ctx, ok := opts.Parent.(*spanContext); ok { - context = ctx - if pprofContext == nil && ctx.span != nil { - // Inherit the context.Context from parent span if it was propagated - // using ChildOf() rather than StartSpanFromContext(), see - // applyPPROFLabels() below. - pprofContext = ctx.span.pprofCtxActive - } - } else if p, ok := opts.Parent.(ddtrace.SpanContextW3C); ok { - context = &spanContext{ - traceID: p.TraceID128Bytes(), - spanID: p.SpanID(), - } + context = opts.Parent + if pprofContext == nil && context.span != nil { + // Inherit the context.Context from parent span if it was propagated + // using ChildOf() rather than StartSpanFromContext(), see + // applyPPROFLabels() below. + context.span.mu.RLock() + pprofContext = context.span.pprofCtxActive + context.span.mu.RUnlock() } } if pprofContext == nil { @@ -533,33 +668,30 @@ func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOpt id = generateSpanID(startTime) } // span defaults - span := &span{ - Name: operationName, - Service: t.config.serviceName, - Resource: operationName, - SpanID: id, - TraceID: id, - Start: startTime, - noDebugStack: t.config.noDebugStack, + span := &Span{ + name: operationName, + service: "", + resource: operationName, + spanID: id, + traceID: id, + start: startTime, + integration: "manual", } - span.SpanLinks = append(span.SpanLinks, opts.SpanLinks...) + span.spanLinks = append(span.spanLinks, opts.SpanLinks...) - if t.config.hostname != "" { - span.setMeta(keyHostname, t.config.hostname) - } - if context != nil { + if context != nil && !context.baggageOnly { // this is a child span - span.TraceID = context.traceID.Lower() - span.ParentID = context.spanID + span.traceID = context.traceID.Lower() + span.parentID = context.spanID if p, ok := context.SamplingPriority(); ok { span.setMetric(keySamplingPriority, float64(p)) } if context.span != nil { // local parent, inherit service - context.span.RLock() - span.Service = context.span.Service - context.span.RUnlock() + context.span.mu.RLock() + span.service = context.span.service + context.span.mu.RUnlock() } else { // remote parent if context.origin != "" { @@ -574,34 +706,55 @@ func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOpt } span.context = newSpanContext(span, context) - span.setMetric(ext.Pid, float64(t.pid)) + if pprofContext != nil { + setLLMObsPropagatingTags(pprofContext, span.context) + } span.setMeta("language", "go") - // add tags from options for k, v := range opts.Tags { span.SetTag(k, v) } - // add global tags - for k, v := range t.config.globalTags.get() { - span.SetTag(k, v) - } - if t.config.serviceMappings != nil { - if newSvc, ok := t.config.serviceMappings[span.Service]; ok { - span.Service = newSvc - } - } isRootSpan := context == nil || context.span == nil if isRootSpan { traceprof.SetProfilerRootTags(span) - span.setMetric(keySpanAttributeSchemaVersion, float64(t.config.spanAttributeSchemaVersion)) } - if isRootSpan || context.span.Service != span.Service { + if isRootSpan || context.span.service != span.service { + // The span is the local root span. span.setMetric(keyTopLevel, 1) // all top level spans are measured. So the measured tag is redundant. - delete(span.Metrics, keyMeasured) + delete(span.metrics, keyMeasured) + } + pprofContext, span.taskEnd = startExecutionTracerTask(pprofContext, span) + span.pprofCtxRestore = pprofContext + return span +} + +// StartSpan creates, starts, and returns a new Span with the given `operationName`. +func (t *tracer) StartSpan(operationName string, options ...StartSpanOption) *Span { + if !t.config.enabled.current { + return nil + } + span := spanStart(operationName, options...) + if span.service == "" { + span.service = t.config.serviceName + } + span.noDebugStack = t.config.noDebugStack + if t.config.hostname != "" { + span.setMeta(keyHostname, t.config.hostname) + } + span.supportsEvents = t.config.agent.spanEventsAvailable + + // add global tags + for k, v := range t.config.globalTags.get() { + span.SetTag(k, v) + } + if t.config.serviceMappings != nil { + if newSvc, ok := t.config.serviceMappings[span.service]; ok { + span.service = newSvc + } } if t.config.version != "" { - if t.config.universalVersion || (!t.config.universalVersion && span.Service == t.config.serviceName) { + if t.config.universalVersion || (!t.config.universalVersion && span.service == t.config.serviceName) { span.setMeta(ext.Version, t.config.version) } } @@ -612,19 +765,20 @@ func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOpt // if not already sampled or a brand new trace, sample it t.sample(span) } - pprofContext, span.taskEnd = startExecutionTracerTask(pprofContext, span) - if t.config.profilerHotspots || t.config.profilerEndpoints { - t.applyPPROFLabels(pprofContext, span) - } if t.config.serviceMappings != nil { - if newSvc, ok := t.config.serviceMappings[span.Service]; ok { - span.Service = newSvc + if newSvc, ok := t.config.serviceMappings[span.service]; ok { + span.service = newSvc } } if log.DebugEnabled() { // avoid allocating the ...interface{} argument if debug logging is disabled - log.Debug("Started Span: %v, Operation: %s, Resource: %s, Tags: %v, %v", - span, span.Name, span.Resource, span.Meta, span.Metrics) + log.Debug("Started Span: %v, Operation: %s, Resource: %s, Tags: %v, %v", //nolint:gocritic // Debug logging needs full span representation + span, span.name, span.resource, span.meta, span.metrics) + } + if t.config.profilerHotspots || t.config.profilerEndpoints { + t.applyPPROFLabels(span.pprofCtxRestore, span) + } else { + span.pprofCtxRestore = nil } if t.config.debugAbandonedSpans { select { @@ -634,6 +788,13 @@ func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOpt log.Error("Abandoned spans channel full, disregarding span.") } } + if span.metrics[keyTopLevel] == 1 { + // The span is the local root span. + span.setMetric(keySpanAttributeSchemaVersion, float64(t.config.spanAttributeSchemaVersion)) + } + span.setMetric(ext.Pid, float64(t.pid)) + t.spansStarted.Inc(span.integration) + return span } @@ -641,27 +802,33 @@ func (t *tracer) StartSpan(operationName string, options ...ddtrace.StartSpanOpt // endpoint filtering feature to span. When span finishes, any pprof labels // found in ctx are restored. Additionally, this func informs the profiler how // many times each endpoint is called. -func (t *tracer) applyPPROFLabels(ctx gocontext.Context, span *span) { - var labels []string +func (t *tracer) applyPPROFLabels(ctx gocontext.Context, span *Span) { + // Important: The label keys are ordered alphabetically to take advantage of + // an upstream optimization that landed in go1.24. This results in ~10% + // better performance on BenchmarkStartSpan. See + // https://go-review.googlesource.com/c/go/+/574516 for more information. + labels := make([]string, 0, 3*2 /* 3 key value pairs */) + localRootSpan := span.Root() + if t.config.profilerHotspots && localRootSpan != nil { + localRootSpan.mu.RLock() + labels = append(labels, traceprof.LocalRootSpanID, strconv.FormatUint(localRootSpan.spanID, 10)) + localRootSpan.mu.RUnlock() + } if t.config.profilerHotspots { - // allocate the max-length slice to avoid growing it later - labels = make([]string, 0, 6) - labels = append(labels, traceprof.SpanID, strconv.FormatUint(span.SpanID, 10)) - } - // nil checks might not be needed, but better be safe than sorry - if localRootSpan := span.root(); localRootSpan != nil { - if t.config.profilerHotspots { - labels = append(labels, traceprof.LocalRootSpanID, strconv.FormatUint(localRootSpan.SpanID, 10)) - } - if t.config.profilerEndpoints && spanResourcePIISafe(localRootSpan) { - labels = append(labels, traceprof.TraceEndpoint, localRootSpan.Resource) + labels = append(labels, traceprof.SpanID, strconv.FormatUint(span.spanID, 10)) + } + if t.config.profilerEndpoints && localRootSpan != nil { + localRootSpan.mu.RLock() + if spanResourcePIISafe(localRootSpan) { + labels = append(labels, traceprof.TraceEndpoint, localRootSpan.resource) if span == localRootSpan { // Inform the profiler of endpoint hits. This is used for the unit of // work feature. We can't use APM stats for this since the stats don't // have enough cardinality (e.g. runtime-id tags are missing). - traceprof.GlobalEndpointCounter().Inc(localRootSpan.Resource) + traceprof.GlobalEndpointCounter().Inc(localRootSpan.resource) } } + localRootSpan.mu.RUnlock() } if len(labels) > 0 { span.pprofCtxRestore = ctx @@ -670,11 +837,11 @@ func (t *tracer) applyPPROFLabels(ctx gocontext.Context, span *span) { } } -// spanResourcePIISafe returns true if s.Resource can be considered to not +// spanResourcePIISafe returns true if s.resource can be considered to not // include PII with reasonable confidence. E.g. SQL queries may contain PII, -// but http, rpc or custom (s.Type == "") span resource names generally do not. -func spanResourcePIISafe(s *span) bool { - return s.Type == ext.SpanTypeWeb || s.Type == ext.AppTypeRPC || s.Type == "" +// but http, rpc or custom (s.spanType == "") span resource names generally do not. +func spanResourcePIISafe(s *Span) bool { + return s.spanType == ext.SpanTypeWeb || s.spanType == ext.AppTypeRPC || s.spanType == "" } // Stop stops the tracer. @@ -687,6 +854,9 @@ func (t *tracer) Stop() { t.stats.Stop() t.wg.Wait() t.traceWriter.stop() + if t.runtimeMetrics != nil { + t.runtimeMetrics.Stop() + } t.statsd.Close() if t.dataStreams != nil { t.dataStreams.Stop() @@ -697,60 +867,138 @@ func (t *tracer) Stop() { if t.logFile != nil { t.logFile.Close() } + if t.telemetry != nil { + t.telemetry.Close() + } + t.config.httpClient.CloseIdleConnections() } // Inject uses the configured or default TextMap Propagator. -func (t *tracer) Inject(ctx ddtrace.SpanContext, carrier interface{}) error { +func (t *tracer) Inject(ctx *SpanContext, carrier interface{}) error { if !t.config.enabled.current { return nil } + + if t.config.tracingAsTransport { + // in tracing as transport mode, only propagate when there is an upstream appsec event + if ctx.trace != nil && + !globalinternal.VerifyTraceSourceEnabled(ctx.trace.propagatingTag(keyPropagatedTraceSource), globalinternal.ASMTraceSource) { + return nil + } + } + t.updateSampling(ctx) return t.config.propagator.Inject(ctx, carrier) } // updateSampling runs trace sampling rules on the context, since properties like resource / tags // could change and impact the result of sampling. This must be done once before context is propagated. -func (t *tracer) updateSampling(ctx ddtrace.SpanContext) { - sctx, ok := ctx.(*spanContext) - if sctx == nil || !ok { +func (t *tracer) updateSampling(ctx *SpanContext) { + if ctx == nil { return } // without this check some mock spans tests fail - if t.rulesSampling == nil || sctx.trace == nil || sctx.trace.root == nil { + if t.rulesSampling == nil || ctx.trace == nil || ctx.trace.root == nil { return } // want to avoid locking the entire trace from a span for long. // if SampleTrace successfully samples the trace, // it will lock the span and the trace mutexes in span.setSamplingPriorityLocked // and trace.setSamplingPriority respectively, so we can't rely on those mutexes. - if sctx.trace.isLocked() { + if ctx.trace.isLocked() { // trace sampling decision already taken and locked, no re-sampling shall occur return } // the span was sampled with ManualKeep rules shouldn't override - if sctx.trace.propagatingTag(keyDecisionMaker) == "-4" { + if ctx.trace.propagatingTag(keyDecisionMaker) == "-4" { return } // if sampling was successful, need to lock the trace to prevent further re-sampling - if t.rulesSampling.SampleTrace(sctx.trace.root) { - sctx.trace.setLocked(true) + if t.rulesSampling.SampleTrace(ctx.trace.root) { + ctx.trace.setLocked(true) } } // Extract uses the configured or default TextMap Propagator. -func (t *tracer) Extract(carrier interface{}) (ddtrace.SpanContext, error) { +func (t *tracer) Extract(carrier interface{}) (*SpanContext, error) { if !t.config.enabled.current { - return internal.NoopSpanContext{}, nil + return nil, nil + } + ctx, err := t.config.propagator.Extract(carrier) + if t.config.tracingAsTransport && ctx != nil { + // in tracing as transport mode, reset upstream sampling decision to make sure we keep 1 trace/minute + if ctx.trace != nil && + !globalinternal.VerifyTraceSourceEnabled(ctx.trace.propagatingTag(keyPropagatedTraceSource), globalinternal.ASMTraceSource) { + ctx.trace.priority = nil + } + } + if ctx != nil && ctx.trace != nil { + if _, ok := ctx.trace.samplingPriority(); ok { + // ensure that the trace isn't resampled + ctx.trace.setLocked(true) + } } - return t.config.propagator.Extract(carrier) + return ctx, err +} + +func (t *tracer) TracerConf() TracerConf { + return TracerConf{ + CanComputeStats: t.config.canComputeStats(), + CanDropP0s: t.config.canDropP0s(), + DebugAbandonedSpans: t.config.debugAbandonedSpans, + Disabled: !t.config.enabled.current, + PartialFlush: t.config.partialFlushEnabled, + PartialFlushMinSpans: t.config.partialFlushMinSpans, + PeerServiceDefaults: t.config.peerServiceDefaultsEnabled, + PeerServiceMappings: t.config.peerServiceMappings, + EnvTag: t.config.env, + VersionTag: t.config.version, + ServiceTag: t.config.serviceName, + TracingAsTransport: t.config.tracingAsTransport, + isLambdaFunction: t.config.isLambdaFunction, + } +} + +func (t *tracer) submit(s *Span) { + if !t.config.enabled.current { + return + } + // we have an active tracer + if !t.config.canDropP0s() { + return + } + statSpan, shouldCalc := t.stats.newTracerStatSpan(s, t.obfuscator) + if !shouldCalc { + return + } + // the agent supports computed stats + select { + case t.stats.In <- statSpan: + // ok + default: + log.Error("Stats channel full, disregarding span.") + } +} + +func (t *tracer) submitAbandonedSpan(s *Span, finished bool) { + select { + case t.abandonedSpansDebugger.In <- newAbandonedSpanCandidate(s, finished): + // ok + default: + log.Error("Abandoned spans channel full, disregarding span.") + } +} + +func (t *tracer) submitChunk(c *chunk) { + t.pushChunk(c) } // sampleRateMetricKey is the metric key holding the applied sample rate. Has to be the same as the Agent. const sampleRateMetricKey = "_sample_rate" // Sample samples a span with the internal sampler. -func (t *tracer) sample(span *span) { +func (t *tracer) sample(span *Span) { if _, ok := span.context.SamplingPriority(); ok { // sampling decision was already made return @@ -761,32 +1009,38 @@ func (t *tracer) sample(span *span) { span.context.trace.setSamplingPriority(ext.PriorityAutoReject, samplernames.RuleRate) return } - if rs, ok := sampler.(RateSampler); ok && rs.Rate() < 1 { - span.setMetric(sampleRateMetricKey, rs.Rate()) + if sampler.Rate() < 1 { + span.setMetric(sampleRateMetricKey, sampler.Rate()) } - if t.rulesSampling.SampleTraceGlobalRate(span) { + if t.rulesSampling.SampleTrace(span) { return } - if t.rulesSampling.SampleTrace(span) { + if t.rulesSampling.SampleTraceGlobalRate(span) { return } t.prioritySampling.apply(span) } -func startExecutionTracerTask(ctx gocontext.Context, span *span) (gocontext.Context, func()) { +func startExecutionTracerTask(ctx gocontext.Context, span *Span) (gocontext.Context, func()) { if !rt.IsEnabled() { return ctx, func() {} } span.goExecTraced = true // Task name is the resource (operationName) of the span, e.g. // "POST /foo/bar" (http) or "/foo/pkg.Method" (grpc). - taskName := span.Resource + taskName := span.resource // If the resource could contain PII (e.g. SQL query that's not using bind // arguments), play it safe and just use the span type as the taskName, // e.g. "sql". if !spanResourcePIISafe(span) { - taskName = span.Type - } + taskName = span.spanType + } + // The task name is an arbitrary string from the user. If it's too + // large, like a big SQL query, the execution tracer can crash when we + // create the task. Cap it at an arbirary length. For "normal" task + // names this should be plenty that we can still have the task names for + // debugging. + taskName = taskName[:min(128, len(taskName))] end := noopTaskEnd if !globalinternal.IsExecutionTraced(ctx) { var task *rt.Task @@ -801,7 +1055,7 @@ func startExecutionTracerTask(ctx gocontext.Context, span *span) (gocontext.Cont ctx = globalinternal.WithExecutionNotTraced(ctx) } var b [8]byte - binary.LittleEndian.PutUint64(b[:], span.SpanID) + binary.LittleEndian.PutUint64(b[:], span.spanID) // TODO: can we make string(b[:]) not allocate? e.g. with unsafe // shenanigans? rt.Log won't retain the message string, though perhaps // we can't assume that will always be the case. @@ -810,10 +1064,3 @@ func startExecutionTracerTask(ctx gocontext.Context, span *span) (gocontext.Cont } func noopTaskEnd() {} - -func (t *tracer) hostname() string { - if !t.config.enableHostnameDetection { - return "" - } - return hostname.Get() -} diff --git a/ddtrace/tracer/tracer_metadata.go b/ddtrace/tracer/tracer_metadata.go new file mode 100644 index 0000000000..80070558ba --- /dev/null +++ b/ddtrace/tracer/tracer_metadata.go @@ -0,0 +1,31 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. +package tracer + +// Metadata represents the configuration of the tracer. +// +//go:generate go run github.com/tinylib/msgp -unexported -marshal=true -o=tracer_metadata_msgp.go -tests=false +type Metadata struct { + // Version of the schema. + SchemaVersion uint8 `msg:"schema_version"` + // Runtime UUID. + RuntimeID string `msg:"runtime_id"` + // Programming language of the tracer. + Language string `msg:"tracer_language"` + // Version of the tracer + Version string `msg:"tracer_version"` + // Identfier of the machine running the process. + Hostname string `msg:"hostname"` + // Name of the service being instrumented. + ServiceName string `msg:"service_name"` + // Environment of the service being instrumented. + ServiceEnvironment string `msg:"service_env"` + // Version of the service being instrumented. + ServiceVersion string `msg:"service_version"` + // ProcessTags describe the process + ProcessTags string `msg:"process_tags"` + // ContainerID identified by the process. + ContainerID string `msg:"container_id"` +} diff --git a/ddtrace/tracer/tracer_metadata_msgp.go b/ddtrace/tracer/tracer_metadata_msgp.go new file mode 100644 index 0000000000..958dd53ee7 --- /dev/null +++ b/ddtrace/tracer/tracer_metadata_msgp.go @@ -0,0 +1,335 @@ +// Code generated by github.com/tinylib/msgp DO NOT EDIT. + +package tracer + +import ( + "github.com/tinylib/msgp/msgp" +) + +// DecodeMsg implements msgp.Decodable +func (z *Metadata) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "schema_version": + z.SchemaVersion, err = dc.ReadUint8() + if err != nil { + err = msgp.WrapError(err, "SchemaVersion") + return + } + case "runtime_id": + z.RuntimeID, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "RuntimeID") + return + } + case "tracer_language": + z.Language, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "Language") + return + } + case "tracer_version": + z.Version, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "Version") + return + } + case "hostname": + z.Hostname, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "Hostname") + return + } + case "service_name": + z.ServiceName, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "ServiceName") + return + } + case "service_env": + z.ServiceEnvironment, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "ServiceEnvironment") + return + } + case "service_version": + z.ServiceVersion, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "ServiceVersion") + return + } + case "process_tags": + z.ProcessTags, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "ProcessTags") + return + } + case "container_id": + z.ContainerID, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "ContainerID") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *Metadata) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 10 + // write "schema_version" + err = en.Append(0x8a, 0xae, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteUint8(z.SchemaVersion) + if err != nil { + err = msgp.WrapError(err, "SchemaVersion") + return + } + // write "runtime_id" + err = en.Append(0xaa, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteString(z.RuntimeID) + if err != nil { + err = msgp.WrapError(err, "RuntimeID") + return + } + // write "tracer_language" + err = en.Append(0xaf, 0x74, 0x72, 0x61, 0x63, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Language) + if err != nil { + err = msgp.WrapError(err, "Language") + return + } + // write "tracer_version" + err = en.Append(0xae, 0x74, 0x72, 0x61, 0x63, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteString(z.Version) + if err != nil { + err = msgp.WrapError(err, "Version") + return + } + // write "hostname" + err = en.Append(0xa8, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Hostname) + if err != nil { + err = msgp.WrapError(err, "Hostname") + return + } + // write "service_name" + err = en.Append(0xac, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.ServiceName) + if err != nil { + err = msgp.WrapError(err, "ServiceName") + return + } + // write "service_env" + err = en.Append(0xab, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x76) + if err != nil { + return + } + err = en.WriteString(z.ServiceEnvironment) + if err != nil { + err = msgp.WrapError(err, "ServiceEnvironment") + return + } + // write "service_version" + err = en.Append(0xaf, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteString(z.ServiceVersion) + if err != nil { + err = msgp.WrapError(err, "ServiceVersion") + return + } + // write "process_tags" + err = en.Append(0xac, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x61, 0x67, 0x73) + if err != nil { + return + } + err = en.WriteString(z.ProcessTags) + if err != nil { + err = msgp.WrapError(err, "ProcessTags") + return + } + // write "container_id" + err = en.Append(0xac, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteString(z.ContainerID) + if err != nil { + err = msgp.WrapError(err, "ContainerID") + return + } + return +} + +// MarshalMsg implements msgp.Marshaler +func (z *Metadata) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // map header, size 10 + // string "schema_version" + o = append(o, 0x8a, 0xae, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + o = msgp.AppendUint8(o, z.SchemaVersion) + // string "runtime_id" + o = append(o, 0xaa, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x64) + o = msgp.AppendString(o, z.RuntimeID) + // string "tracer_language" + o = append(o, 0xaf, 0x74, 0x72, 0x61, 0x63, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65) + o = msgp.AppendString(o, z.Language) + // string "tracer_version" + o = append(o, 0xae, 0x74, 0x72, 0x61, 0x63, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + o = msgp.AppendString(o, z.Version) + // string "hostname" + o = append(o, 0xa8, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65) + o = msgp.AppendString(o, z.Hostname) + // string "service_name" + o = append(o, 0xac, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65) + o = msgp.AppendString(o, z.ServiceName) + // string "service_env" + o = append(o, 0xab, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6e, 0x76) + o = msgp.AppendString(o, z.ServiceEnvironment) + // string "service_version" + o = append(o, 0xaf, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + o = msgp.AppendString(o, z.ServiceVersion) + // string "process_tags" + o = append(o, 0xac, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x61, 0x67, 0x73) + o = msgp.AppendString(o, z.ProcessTags) + // string "container_id" + o = append(o, 0xac, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x69, 0x64) + o = msgp.AppendString(o, z.ContainerID) + return +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *Metadata) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, bts, err = msgp.ReadMapHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "schema_version": + z.SchemaVersion, bts, err = msgp.ReadUint8Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "SchemaVersion") + return + } + case "runtime_id": + z.RuntimeID, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "RuntimeID") + return + } + case "tracer_language": + z.Language, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Language") + return + } + case "tracer_version": + z.Version, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Version") + return + } + case "hostname": + z.Hostname, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "Hostname") + return + } + case "service_name": + z.ServiceName, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "ServiceName") + return + } + case "service_env": + z.ServiceEnvironment, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "ServiceEnvironment") + return + } + case "service_version": + z.ServiceVersion, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "ServiceVersion") + return + } + case "process_tags": + z.ProcessTags, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "ProcessTags") + return + } + case "container_id": + z.ContainerID, bts, err = msgp.ReadStringBytes(bts) + if err != nil { + err = msgp.WrapError(err, "ContainerID") + return + } + default: + bts, err = msgp.Skip(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + o = bts + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *Metadata) Msgsize() (s int) { + s = 1 + 15 + msgp.Uint8Size + 11 + msgp.StringPrefixSize + len(z.RuntimeID) + 16 + msgp.StringPrefixSize + len(z.Language) + 15 + msgp.StringPrefixSize + len(z.Version) + 9 + msgp.StringPrefixSize + len(z.Hostname) + 13 + msgp.StringPrefixSize + len(z.ServiceName) + 12 + msgp.StringPrefixSize + len(z.ServiceEnvironment) + 16 + msgp.StringPrefixSize + len(z.ServiceVersion) + 13 + msgp.StringPrefixSize + len(z.ProcessTags) + 13 + msgp.StringPrefixSize + len(z.ContainerID) + return +} diff --git a/ddtrace/tracer/tracer_test.go b/ddtrace/tracer/tracer_test.go index 2c57d08b4d..16476851a4 100644 --- a/ddtrace/tracer/tracer_test.go +++ b/ddtrace/tracer/tracer_test.go @@ -6,6 +6,7 @@ package tracer import ( + "bytes" "context" "encoding/base64" "encoding/binary" @@ -13,10 +14,12 @@ import ( "errors" "fmt" "io" + llog "log" "net/http" "net/http/httptest" "os" "runtime" + "runtime/pprof" rt "runtime/trace" "strconv" "strings" @@ -24,41 +27,37 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - maininternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/statsdtest" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/ddtrace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal/tracerstats" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" + "go.uber.org/goleak" + "github.com/DataDog/datadog-go/v5/statsd" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/tinylib/msgp/msgp" ) -func (t *tracer) newEnvSpan(service, env string) *span { - return t.StartSpan("test.op", SpanType("test"), ServiceName(service), ResourceName("/"), Tag(ext.Environment, env)).(*span) +func (t *tracer) newEnvSpan(service, env string) *Span { + return t.StartSpan("test.op", SpanType("test"), ServiceName(service), ResourceName("/"), Tag(ext.Environment, env)) } -func (t *tracer) newRootSpan(name, service, resource string) *span { - return t.StartSpan(name, SpanType("test"), ServiceName(service), ResourceName(resource)).(*span) +func (t *tracer) newRootSpan(name, service, resource string) *Span { + return t.StartSpan(name, SpanType("test"), ServiceName(service), ResourceName(resource)) } -func (t *tracer) newChildSpan(name string, parent *span) *span { +func (t *tracer) newChildSpan(name string, parent *Span) *Span { if parent == nil { - return t.StartSpan(name).(*span) + return t.StartSpan(name) } - return t.StartSpan(name, ChildOf(parent.Context())).(*span) + return t.StartSpan(name, ChildOf(parent.Context())) } func id128FromSpan(assert *assert.Assertions, ctx ddtrace.SpanContext) string { - var w3Cctx ddtrace.SpanContextW3C - var ok bool - w3Cctx, ok = ctx.(ddtrace.SpanContextW3C) - assert.True(ok) - id := w3Cctx.TraceID128() + id := ctx.TraceID() assert.Len(id, 32) return id } @@ -74,12 +73,29 @@ var ( ) func TestMain(m *testing.M) { - if maininternal.BoolEnv("DD_APPSEC_ENABLED", false) { + if internal.BoolEnv("DD_APPSEC_ENABLED", false) { // things are slower with AppSec; double wait times timeMultiplicator = time.Duration(2) } _, integration = os.LookupEnv("INTEGRATION") - os.Exit(m.Run()) + + // Run the tests and exit on failure + if code := m.Run(); code != 0 { + os.Exit(code) + } + + // If the tests pass, check for goroutine leaks: + // + // TODO(felixge): We should try to get rid of all the ignored functions + // below. And we should definitely try to not add any new ones here! + opts := []goleak.Option{ + goleak.IgnoreAnyFunction("github.com/DataDog/dd-trace-go/v2/ddtrace/tracer.initalizeDynamicInstrumentationRemoteConfigState.func1"), + } + if err := goleak.Find(opts...); err != nil { + fmt.Fprintf(os.Stderr, "goleak: Errors on successful test run: %v\n\n", err) + fmt.Fprintf(os.Stderr, "See Goroutine Leak section in CONTRIBUTING.md for more information on how to fix this.\n") + os.Exit(1) + } } func (t *tracer) awaitPayload(tst *testing.T, n int) { @@ -90,7 +106,7 @@ loop: case <-timeout: tst.Fatalf("timed out waiting for payload to contain %d", n) default: - if t.traceWriter.(*agentTraceWriter).payload.itemCount() == n { + if t.traceWriter.(*agentTraceWriter).payload.stats().itemCount == n { break loop } time.Sleep(10 * time.Millisecond) @@ -116,7 +132,7 @@ func TestTracerCleanStop(t *testing.T) { t.Skip("This test causes windows CI to fail due to out-of-memory issues") } // avoid CI timeouts due to AppSec and telemetry slowing down this test - t.Setenv("DD_APPSEC_ENABLED", "") + t.Setenv("DD_APPSEC_ENABLED", "false") t.Setenv("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "false") t.Setenv("DD_TRACE_STARTUP_LOGS", "0") @@ -148,8 +164,8 @@ func TestTracerCleanStop(t *testing.T) { // Lambda mode is used to avoid the startup cost associated with agent discovery. Start(withTransport(transport), WithLambdaMode(true), withNoopStats()) time.Sleep(time.Millisecond) - Start(withTransport(transport), WithLambdaMode(true), WithSampler(NewRateSampler(0.99)), withNoopStats()) - Start(withTransport(transport), WithLambdaMode(true), WithSampler(NewRateSampler(0.99)), withNoopStats()) + Start(withTransport(transport), WithLambdaMode(true), WithSamplerRate(0.99), withNoopStats()) + Start(withTransport(transport), WithLambdaMode(true), WithSamplerRate(0.99), withNoopStats()) } }() @@ -168,38 +184,26 @@ func TestTracerCleanStop(t *testing.T) { }() wg.Wait() + Stop() } func TestTracerStart(t *testing.T) { t.Run("normal", func(t *testing.T) { Start() defer Stop() - if _, ok := internal.GetGlobalTracer().(*tracer); !ok { - t.Fail() - } - }) - - t.Run("testing", func(t *testing.T) { - internal.Testing = true - Start() - defer Stop() - if _, ok := internal.GetGlobalTracer().(*tracer); ok { - t.Fail() - } - if _, ok := internal.GetGlobalTracer().(*internal.NoopTracer); !ok { + if _, ok := getGlobalTracer().(*tracer); !ok { t.Fail() } - internal.Testing = false }) t.Run("dd_tracing_not_enabled", func(t *testing.T) { t.Setenv("DD_TRACE_ENABLED", "false") Start() defer Stop() - if _, ok := internal.GetGlobalTracer().(*tracer); ok { + if _, ok := getGlobalTracer().(*tracer); ok { t.Fail() } - if _, ok := internal.GetGlobalTracer().(*internal.NoopTracer); !ok { + if _, ok := getGlobalTracer().(*NoopTracer); !ok { t.Fail() } }) @@ -208,15 +212,15 @@ func TestTracerStart(t *testing.T) { t.Setenv("OTEL_TRACES_EXPORTER", "none") Start() defer Stop() - if _, ok := internal.GetGlobalTracer().(*tracer); ok { + if _, ok := getGlobalTracer().(*tracer); ok { t.Fail() } - if _, ok := internal.GetGlobalTracer().(*internal.NoopTracer); !ok { + if _, ok := getGlobalTracer().(*NoopTracer); !ok { t.Fail() } }) - t.Run("deadlock/api", func(t *testing.T) { + t.Run("deadlock/api", func(_ *testing.T) { Stop() Stop() @@ -225,7 +229,7 @@ func TestTracerStart(t *testing.T) { Start() // ensure at least one worker started and handles requests - internal.GetGlobalTracer().(*tracer).pushChunk(&chunk{spans: []*span{}}) + getGlobalTracer().(*tracer).pushChunk(&chunk{spans: []*Span{}}) Stop() Stop() @@ -234,9 +238,10 @@ func TestTracerStart(t *testing.T) { }) t.Run("deadlock/direct", func(t *testing.T) { - tr, _, _, stop := startTestTracer(t) + tr, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() - tr.pushChunk(&chunk{spans: []*span{}}) // blocks until worker is started + tr.pushChunk(&chunk{spans: []*Span{}}) // blocks until worker is started select { case <-tr.stop: t.Fatal("stopped channel should be open") @@ -262,15 +267,18 @@ func TestTracerLogFile(t *testing.T) { t.Fatalf("Failure to make temp dir: %v", err) } t.Setenv("DD_TRACE_LOG_DIRECTORY", dir) - tracer := newTracer() + tracer, err := newTracer() + defer tracer.Stop() + assert.Nil(t, err) assert.Equal(t, dir, tracer.config.logDirectory) assert.NotNil(t, tracer.logFile) assert.Equal(t, dir+"/"+log.LoggerFile, tracer.logFile.Name()) }) t.Run("invalid", func(t *testing.T) { t.Setenv("DD_TRACE_LOG_DIRECTORY", "some/nonexistent/path") - tracer := newTracer() - defer Stop() + tracer, err := newTracer() + assert.Nil(t, err) + defer tracer.Stop() assert.Empty(t, tracer.config.logDirectory) assert.Nil(t, tracer.logFile) }) @@ -278,193 +286,201 @@ func TestTracerLogFile(t *testing.T) { func TestTracerStartSpan(t *testing.T) { t.Run("generic", func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - span := tracer.StartSpan("web.request").(*span) + assert.NoError(t, err) + span := tracer.StartSpan("web.request") assert := assert.New(t) - assert.NotEqual(uint64(0), span.TraceID) - assert.NotEqual(uint64(0), span.SpanID) - assert.Equal(uint64(0), span.ParentID) - assert.Equal("web.request", span.Name) - assert.Regexp(`tracer\.test(\.exe)?`, span.Service) + assert.NotEqual(uint64(0), span.traceID) + assert.NotEqual(uint64(0), span.spanID) + assert.Equal(uint64(0), span.parentID) + assert.Equal("web.request", span.name) + assert.Regexp(`tracer\.test(\.exe)?`, span.service) assert.Contains([]float64{ ext.PriorityAutoReject, ext.PriorityAutoKeep, - }, span.Metrics[keySamplingPriority]) + }, span.metrics[keySamplingPriority]) assert.Equal("-1", span.context.trace.propagatingTags[keyDecisionMaker]) // A span is not measured unless made so specifically - _, ok := span.Meta[keyMeasured] + _, ok := span.meta[keyMeasured] assert.False(ok) - assert.Equal(globalconfig.RuntimeID(), span.Meta[ext.RuntimeID]) - assert.NotEqual("", span.Meta[ext.RuntimeID]) + assert.Equal(globalconfig.RuntimeID(), span.meta[ext.RuntimeID]) + assert.NotEqual("", span.meta[ext.RuntimeID]) }) t.Run("priority", func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - span := tracer.StartSpan("web.request", Tag(ext.SamplingPriority, ext.PriorityUserKeep)).(*span) - assert.Equal(t, float64(ext.PriorityUserKeep), span.Metrics[keySamplingPriority]) + assert.NoError(t, err) + span := tracer.StartSpan("web.request", Tag(ext.ManualKeep, true)) + assert.Equal(t, float64(ext.PriorityUserKeep), span.metrics[keySamplingPriority]) assert.Equal(t, "-4", span.context.trace.propagatingTags[keyDecisionMaker]) }) t.Run("name", func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - span := tracer.StartSpan("/home/user", Tag(ext.SpanName, "db.query")).(*span) - assert.Equal(t, "db.query", span.Name) - assert.Equal(t, "/home/user", span.Resource) + assert.NoError(t, err) + span := tracer.StartSpan("/home/user", Tag(ext.SpanName, "db.query")) + assert.Equal(t, "db.query", span.name) + assert.Equal(t, "/home/user", span.resource) }) t.Run("measured_top_level", func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - span := tracer.StartSpan("/home/user", Measured()).(*span) - _, ok := span.Metrics[keyMeasured] + assert.NoError(t, err) + span := tracer.StartSpan("/home/user", Measured()) + _, ok := span.metrics[keyMeasured] assert.False(t, ok) - assert.Equal(t, 1.0, span.Metrics[keyTopLevel]) + assert.Equal(t, 1.0, span.metrics[keyTopLevel]) }) t.Run("measured_non_top_level", func(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - parent := tracer.StartSpan("/home/user").(*span) - child := tracer.StartSpan("home/user", Measured(), ChildOf(parent.context)).(*span) - assert.Equal(t, 1.0, child.Metrics[keyMeasured]) + assert.NoError(t, err) + parent := tracer.StartSpan("/home/user") + child := tracer.StartSpan("home/user", Measured(), ChildOf(parent.context)) + assert.Equal(t, 1.0, child.metrics[keyMeasured]) }) t.Run("attribute_schema_is_set_v0", func(t *testing.T) { t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - parent := tracer.StartSpan("/home/user").(*span) - child := tracer.StartSpan("home/user", ChildOf(parent.context)).(*span) - assert.Contains(t, parent.Metrics, "_dd.trace_span_attribute_schema") - assert.Equal(t, 0.0, parent.Metrics["_dd.trace_span_attribute_schema"]) - assert.NotContains(t, child.Metrics, "_dd.trace_span_attribute_schema") + assert.NoError(t, err) + parent := tracer.StartSpan("/home/user") + child := tracer.StartSpan("home/user", ChildOf(parent.context)) + assert.Contains(t, parent.metrics, "_dd.trace_span_attribute_schema") + assert.Equal(t, 0.0, parent.metrics["_dd.trace_span_attribute_schema"]) + assert.NotContains(t, child.metrics, "_dd.trace_span_attribute_schema") }) t.Run("attribute_schema_is_set_v1", func(t *testing.T) { t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - parent := tracer.StartSpan("/home/user").(*span) - child := tracer.StartSpan("home/user", ChildOf(parent.context)).(*span) - assert.Contains(t, parent.Metrics, "_dd.trace_span_attribute_schema") - assert.Equal(t, 1.0, parent.Metrics["_dd.trace_span_attribute_schema"]) - assert.NotContains(t, child.Metrics, "_dd.trace_span_attribute_schema") + assert.NoError(t, err) + parent := tracer.StartSpan("/home/user") + child := tracer.StartSpan("home/user", ChildOf(parent.context)) + assert.Contains(t, parent.metrics, "_dd.trace_span_attribute_schema") + assert.Equal(t, 1.0, parent.metrics["_dd.trace_span_attribute_schema"]) + assert.NotContains(t, child.metrics, "_dd.trace_span_attribute_schema") }) t.Run("attribute_schema_is_set_wrong_value", func(t *testing.T) { t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "bad-version") - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - parent := tracer.StartSpan("/home/user").(*span) - child := tracer.StartSpan("home/user", ChildOf(parent.context)).(*span) - assert.Contains(t, parent.Metrics, "_dd.trace_span_attribute_schema") - assert.Equal(t, 0.0, parent.Metrics["_dd.trace_span_attribute_schema"]) - assert.NotContains(t, child.Metrics, "_dd.trace_span_attribute_schema") + assert.NoError(t, err) + parent := tracer.StartSpan("/home/user") + child := tracer.StartSpan("home/user", ChildOf(parent.context)) + assert.Contains(t, parent.metrics, "_dd.trace_span_attribute_schema") + assert.Equal(t, 0.0, parent.metrics["_dd.trace_span_attribute_schema"]) + assert.NotContains(t, child.metrics, "_dd.trace_span_attribute_schema") }) } func TestSamplingDecision(t *testing.T) { t.Run("sampled", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(0), tracer.droppedP0Traces) - assert.Equal(t, uint32(2), tracer.droppedP0Spans) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() - tracer.prioritySampling.defaultRate = 0 + tracer.prioritySampling.defaultRate = 1 tracer.config.serviceName = "test_service" - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") child := tracer.StartSpan("name_2", ChildOf(span.context)) child.Finish() span.Finish() - assert.Equal(t, float64(ext.PriorityAutoReject), span.Metrics[keySamplingPriority]) - assert.Equal(t, "", span.context.trace.propagatingTags[keyDecisionMaker]) + assert.Equal(t, float64(ext.PriorityAutoKeep), span.metrics[keySamplingPriority]) + assert.Equal(t, "-1", span.context.trace.propagatingTags[keyDecisionMaker]) assert.Equal(t, decisionKeep, span.context.trace.samplingDecision) }) t.Run("dropped_sent", func(t *testing.T) { // Even if DropP0s is enabled, spans should always be kept unless // client-side stats are also enabled. - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t, WithStatsComputation(false)) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(0), tracer.droppedP0Traces) - assert.Equal(t, uint32(2), tracer.droppedP0Spans) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(2), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() - tracer.config.agent.DropP0s = true tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") child := tracer.StartSpan("name_2", ChildOf(span.context)) child.Finish() span.Finish() - assert.Equal(t, float64(ext.PriorityAutoReject), span.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), span.metrics[keySamplingPriority]) assert.Equal(t, "", span.context.trace.propagatingTags[keyDecisionMaker]) assert.Equal(t, decisionKeep, span.context.trace.samplingDecision) }) t.Run("dropped_stats", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(1), tracer.droppedP0Traces) - assert.Equal(t, uint32(2), tracer.droppedP0Spans) + assert.Equal(t, uint32(1), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(2), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() tracer.config.featureFlags = make(map[string]struct{}) - tracer.config.featureFlags["discovery"] = struct{}{} - tracer.config.agent.DropP0s = true - tracer.config.agent.Stats = true tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") child := tracer.StartSpan("name_2", ChildOf(span.context)) child.Finish() span.Finish() - assert.Equal(t, float64(ext.PriorityAutoReject), span.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), span.metrics[keySamplingPriority]) assert.Equal(t, "", span.context.trace.propagatingTags[keyDecisionMaker]) assert.Equal(t, decisionNone, span.context.trace.samplingDecision) }) t.Run("events_sampled", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(0), tracer.droppedP0Traces) - assert.Equal(t, uint32(2), tracer.droppedP0Spans) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(2), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() - tracer.config.agent.DropP0s = true tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") child := tracer.StartSpan("name_2", ChildOf(span.context)) child.SetTag(ext.EventSampleRate, 1) child.Finish() span.Finish() - assert.Equal(t, float64(ext.PriorityAutoReject), span.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), span.metrics[keySamplingPriority]) assert.Equal(t, "", span.context.trace.tags[keyDecisionMaker]) assert.Equal(t, decisionKeep, span.context.trace.samplingDecision) }) t.Run("client_dropped", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(1), tracer.droppedP0Traces) - assert.Equal(t, uint32(2), tracer.droppedP0Spans) + assert.Equal(t, uint32(1), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(2), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() tracer.config.sampler = NewRateSampler(0) tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") child := tracer.StartSpan("name_2", ChildOf(span.context)) child.SetTag(ext.EventSampleRate, 1) p, ok := span.context.SamplingPriority() @@ -472,7 +488,7 @@ func TestSamplingDecision(t *testing.T) { assert.Equal(t, ext.PriorityAutoReject, p) child.Finish() span.Finish() - assert.Equal(t, float64(ext.PriorityAutoReject), span.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), span.metrics[keySamplingPriority]) // this trace won't be sent to the agent, // therefore not necessary to populate keyDecisionMaker assert.Equal(t, "", span.context.trace.propagatingTags[keyDecisionMaker]) @@ -483,119 +499,121 @@ func TestSamplingDecision(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"*_1", "sample_rate": 1.0, "max_per_second": 15.0}]`) // Stats are enabled, rules are available. Trace sample rate equals 0. // Span sample rate equals 1. The trace should be dropped. One single span is extracted. - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(0), tracer.droppedP0Traces) - assert.Equal(t, uint32(1), tracer.droppedP0Spans) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(1), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() - tracer.config.agent.DropP0s = true tracer.config.featureFlags = make(map[string]struct{}) - tracer.config.featureFlags["discovery"] = struct{}{} tracer.config.sampler = NewRateSampler(0) tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - parent := tracer.StartSpan("name_1").(*span) - child := tracer.StartSpan("name_2", ChildOf(parent.context)).(*span) + parent := tracer.StartSpan("name_1") + child := tracer.StartSpan("name_2", ChildOf(parent.context)) child.Finish() parent.Finish() tracer.Stop() - assert.Equal(t, float64(ext.PriorityAutoReject), parent.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), parent.metrics[keySamplingPriority]) assert.Equal(t, decisionDrop, parent.context.trace.samplingDecision) - assert.Equal(t, 8.0, parent.Metrics[keySpanSamplingMechanism]) - assert.Equal(t, 1.0, parent.Metrics[keySingleSpanSamplingRuleRate]) - assert.Equal(t, 15.0, parent.Metrics[keySingleSpanSamplingMPS]) + assert.Equal(t, 8.0, parent.metrics[keySpanSamplingMechanism]) + assert.Equal(t, 1.0, parent.metrics[keySingleSpanSamplingRuleRate]) + assert.Equal(t, 15.0, parent.metrics[keySingleSpanSamplingMPS]) }) t.Run("client_dropped_with_single_spans:stats_disabled", func(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"*_1", "sample_rate": 1.0, "max_per_second": 15.0}]`) // Stats are disabled, rules are available. Trace sample rate equals 0. // Span sample rate equals 1. The trace should be dropped. One span has single span tags set. - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(0), tracer.droppedP0Traces) - assert.Equal(t, uint32(1), tracer.droppedP0Spans) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(1), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() tracer.config.featureFlags = make(map[string]struct{}) tracer.config.sampler = NewRateSampler(0) tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - parent := tracer.StartSpan("name_1").(*span) - child := tracer.StartSpan("name_2", ChildOf(parent.context)).(*span) + parent := tracer.StartSpan("name_1") + child := tracer.StartSpan("name_2", ChildOf(parent.context)) child.Finish() parent.Finish() tracer.Stop() - assert.Equal(t, float64(ext.PriorityAutoReject), parent.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), parent.metrics[keySamplingPriority]) assert.Equal(t, decisionDrop, parent.context.trace.samplingDecision) - assert.Equal(t, 8.0, parent.Metrics[keySpanSamplingMechanism]) - assert.Equal(t, 1.0, parent.Metrics[keySingleSpanSamplingRuleRate]) - assert.Equal(t, 15.0, parent.Metrics[keySingleSpanSamplingMPS]) + assert.Equal(t, 8.0, parent.metrics[keySpanSamplingMechanism]) + assert.Equal(t, 1.0, parent.metrics[keySingleSpanSamplingRuleRate]) + assert.Equal(t, 15.0, parent.metrics[keySingleSpanSamplingMPS]) }) t.Run("client_dropped_with_single_span_rules", func(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "match","name":"nothing", "sample_rate": 1.0, "max_per_second": 15.0}]`) // Rules are available, but match nothing. Trace sample rate equals 0. // The trace should be dropped. No single spans extracted. - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(1), tracer.droppedP0Traces) - assert.Equal(t, uint32(2), tracer.droppedP0Spans) + assert.Equal(t, uint32(1), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(2), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() tracer.config.featureFlags = make(map[string]struct{}) tracer.config.sampler = NewRateSampler(0) tracer.prioritySampling.defaultRate = 0 tracer.config.serviceName = "test_service" - parent := tracer.StartSpan("name_1").(*span) - child := tracer.StartSpan("name_2", ChildOf(parent.context)).(*span) + parent := tracer.StartSpan("name_1") + child := tracer.StartSpan("name_2", ChildOf(parent.context)) child.Finish() parent.Finish() tracer.Stop() - assert.Equal(t, float64(ext.PriorityAutoReject), parent.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoReject), parent.metrics[keySamplingPriority]) assert.Equal(t, decisionDrop, parent.context.trace.samplingDecision) - assert.NotContains(t, parent.Metrics, keySpanSamplingMechanism) - assert.NotContains(t, parent.Metrics, keySingleSpanSamplingRuleRate) - assert.NotContains(t, parent.Metrics, keySingleSpanSamplingMPS) + assert.NotContains(t, parent.metrics, keySpanSamplingMechanism) + assert.NotContains(t, parent.metrics, keySingleSpanSamplingRuleRate) + assert.NotContains(t, parent.metrics, keySingleSpanSamplingMPS) }) t.Run("client_kept_with_single_spans", func(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"*", "sample_rate": 1.0}]`) // Rules are available. Trace sample rate equals 1. Span sample rate equals 1. // The trace should be kept. No single spans extracted. - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer func() { // Must check these after tracer is stopped to avoid flakiness - assert.Equal(t, uint32(0), tracer.droppedP0Traces) - assert.Equal(t, uint32(0), tracer.droppedP0Spans) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Spans)) }() defer stop() - tracer.config.agent.DropP0s = true tracer.config.featureFlags = make(map[string]struct{}) tracer.config.sampler = NewRateSampler(1) tracer.prioritySampling.defaultRate = 1 tracer.config.serviceName = "test_service" - parent := tracer.StartSpan("name_1").(*span) - child := tracer.StartSpan("name_2", ChildOf(parent.context)).(*span) + parent := tracer.StartSpan("name_1") + child := tracer.StartSpan("name_2", ChildOf(parent.context)) child.Finish() parent.Finish() tracer.Stop() // single span sampling should only run on dropped traces - assert.Equal(t, float64(ext.PriorityAutoKeep), parent.Metrics[keySamplingPriority]) + assert.Equal(t, float64(ext.PriorityAutoKeep), parent.metrics[keySamplingPriority]) assert.Equal(t, decisionKeep, parent.context.trace.samplingDecision) - assert.NotContains(t, parent.Metrics, keySpanSamplingMechanism) - assert.NotContains(t, parent.Metrics, keySingleSpanSamplingRuleRate) - assert.NotContains(t, parent.Metrics, keySingleSpanSamplingMPS) + assert.NotContains(t, parent.metrics, keySpanSamplingMechanism) + assert.NotContains(t, parent.metrics, keySingleSpanSamplingRuleRate) + assert.NotContains(t, parent.metrics, keySingleSpanSamplingMPS) }) t.Run("single_spans_with_max_per_second:rate_1.0", func(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"name_*", "sample_rate": 1.0,"max_per_second":50}]`) t.Setenv("DD_TRACE_SAMPLE_RATE", "0.8") - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) // Don't allow the rate limiter to reset while the test is running. current := time.Now() nowTime = func() time.Time { return current } @@ -605,9 +623,9 @@ func TestSamplingDecision(t *testing.T) { defer stop() tracer.config.featureFlags = make(map[string]struct{}) tracer.config.serviceName = "test_service" - var spans []*span + var spans []*Span for i := 0; i < 100; i++ { - s := tracer.StartSpan(fmt.Sprintf("name_%d", i)).(*span) + s := tracer.StartSpan(fmt.Sprintf("name_%d", i)) for j := 0; j < 9; j++ { child := tracer.newChildSpan(fmt.Sprintf("name_%d_%d", i, j), s) child.Finish() @@ -618,36 +636,40 @@ func TestSamplingDecision(t *testing.T) { } tracer.Stop() + keptTraces := map[uint64]struct{}{} var singleSpans, keptSpans int for _, s := range spans { - if _, ok := s.Metrics[keySpanSamplingMechanism]; ok { + if _, ok := s.metrics[keySpanSamplingMechanism]; ok { singleSpans++ - assert.Equal(t, 1.0, s.Metrics[keySingleSpanSamplingRuleRate]) - assert.Equal(t, 50.0, s.Metrics[keySingleSpanSamplingMPS]) + keptTraces[s.traceID] = struct{}{} + assert.Equal(t, 1.0, s.metrics[keySingleSpanSamplingRuleRate]) + assert.Equal(t, 50.0, s.metrics[keySingleSpanSamplingMPS]) } - if s.Metrics[keySamplingPriority] == ext.PriorityUserKeep { + if s.metrics[keySamplingPriority] == ext.PriorityUserKeep { keptSpans++ + keptTraces[s.traceID] = struct{}{} } } assert.Equal(t, 50, singleSpans) assert.InDelta(t, 0.8, float64(keptSpans)/float64(len(spans)), 0.19) - assert.Equal(t, uint32(0), tracer.droppedP0Traces) + assert.Equal(t, uint32(100-len(keptTraces)), tracerstats.Count(tracerstats.DroppedP0Traces)) }) t.Run("single_spans_without_max_per_second:rate_1.0", func(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"name_*", "sample_rate": 1.0}]`) t.Setenv("DD_TRACE_SAMPLE_RATE", "0.8") - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() tracer.config.featureFlags = make(map[string]struct{}) tracer.config.serviceName = "test_service" - spans := []*span{} + spans := []*Span{} for i := 0; i < 100; i++ { - s := tracer.StartSpan("name_1").(*span) + s := tracer.StartSpan("name_1") for i := 0; i < 9; i++ { child := tracer.StartSpan("name_2", ChildOf(s.context)) child.Finish() - spans = append(spans, child.(*span)) + spans = append(spans, child) } spans = append(spans, s) s.Finish() @@ -656,78 +678,99 @@ func TestSamplingDecision(t *testing.T) { singleSpans, keptSpans := 0, 0 for _, s := range spans { - if _, ok := s.Metrics[keySpanSamplingMechanism]; ok { + if _, ok := s.metrics[keySpanSamplingMechanism]; ok { singleSpans++ continue } - if s.Metrics[keySamplingPriority] == ext.PriorityUserKeep { + if s.metrics[keySamplingPriority] == ext.PriorityUserKeep { keptSpans++ } } assert.Equal(t, 1000, keptSpans+singleSpans) assert.InDelta(t, 0.8, float64(keptSpans)/float64(1000), 0.15) - assert.Equal(t, uint32(0), tracer.droppedP0Traces) + assert.Equal(t, uint32(0), tracerstats.Count(tracerstats.DroppedP0Traces)) }) t.Run("single_spans_without_max_per_second:rate_0.5", func(t *testing.T) { t.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"name_2", "sample_rate": 0.5}]`) t.Setenv("DD_TRACE_SAMPLE_RATE", "0.8") - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() tracer.config.featureFlags = make(map[string]struct{}) tracer.config.serviceName = "test_service" - spans := []*span{} + spans := []*Span{} for i := 0; i < 100; i++ { - s := tracer.StartSpan("name_1").(*span) + s := tracer.StartSpan("name_1") for i := 0; i < 9; i++ { child := tracer.StartSpan("name_2", ChildOf(s.context)) child.Finish() - spans = append(spans, child.(*span)) + spans = append(spans, child) } spans = append(spans, s) s.Finish() } tracer.Stop() + keptTraces := map[uint64]struct{}{} singleSpans, keptTotal, keptChildren := 0, 0, 0 for _, s := range spans { - if _, ok := s.Metrics[keySpanSamplingMechanism]; ok { + if _, ok := s.metrics[keySpanSamplingMechanism]; ok { singleSpans++ + keptTraces[s.traceID] = struct{}{} continue } - if s.Metrics[keySamplingPriority] == ext.PriorityUserKeep { + if s.metrics[keySamplingPriority] == ext.PriorityUserKeep { keptTotal++ - if s.context.trace.root.SpanID != s.SpanID { + keptTraces[s.traceID] = struct{}{} + if s.context.trace.root.spanID != s.spanID { keptChildren++ } } } assert.InDelta(t, 0.5, float64(singleSpans)/(float64(900-keptChildren)), 0.15) assert.InDelta(t, 0.8, float64(keptTotal)/1000, 0.15) - assert.Equal(t, uint32(0), tracer.droppedP0Traces) + assert.Equal(t, uint32(100-len(keptTraces)), tracerstats.Count(tracerstats.DroppedP0Traces)) }) } func TestTracerRuntimeMetrics(t *testing.T) { t.Run("on", func(t *testing.T) { tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) - tracer := newTracer(WithRuntimeMetrics(), WithLogger(tp), WithDebugMode(true)) + tp.Ignore(commonLogIgnore...) + tracer, err := newTracer(WithRuntimeMetrics(), WithLogger(tp), WithDebugMode(true), WithEnv("test")) defer tracer.Stop() - assert.Contains(t, tp.Logs()[0], "DEBUG: Runtime metrics enabled") + assert.NoError(t, err) + found := false + for _, log := range tp.Logs() { + if strings.Contains(log, "DEBUG: Runtime metrics enabled") { + found = true + break + } + } + assert.True(t, found) }) t.Run("dd-env", func(t *testing.T) { t.Setenv("DD_RUNTIME_METRICS_ENABLED", "true") tp := new(log.RecordLogger) - tp.Ignore("appsec: ", telemetry.LogPrefix) - tracer := newTracer(WithLogger(tp), WithDebugMode(true)) + tp.Ignore(commonLogIgnore...) + tracer, err := newTracer(WithLogger(tp), WithDebugMode(true), WithEnv("test")) defer tracer.Stop() - assert.Contains(t, tp.Logs()[0], "DEBUG: Runtime metrics enabled") + assert.NoError(t, err) + found := false + for _, log := range tp.Logs() { + if strings.Contains(log, "DEBUG: Runtime metrics enabled") { + found = true + break + } + } + assert.True(t, found) }) t.Run("otel-env", func(t *testing.T) { t.Setenv("OTEL_METRICS_EXPORTER", "none") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.False(t, c.runtimeMetrics) }) @@ -735,18 +778,21 @@ func TestTracerRuntimeMetrics(t *testing.T) { // dd env overrides otel env t.Setenv("OTEL_METRICS_EXPORTER", "none") t.Setenv("DD_RUNTIME_METRICS_ENABLED", "true") - c := newConfig() + c, err := newTestConfig() + assert.NoError(t, err) assert.True(t, c.runtimeMetrics) // tracer option overrides dd env t.Setenv("DD_RUNTIME_METRICS_ENABLED", "false") - c = newConfig(WithRuntimeMetrics()) + c, err = newTestConfig(WithRuntimeMetrics()) + assert.NoError(t, err) assert.True(t, c.runtimeMetrics) }) } func TestTracerStartSpanOptions(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) now := time.Now() opts := []StartSpanOption{ SpanType("test"), @@ -755,37 +801,39 @@ func TestTracerStartSpanOptions(t *testing.T) { StartTime(now), WithSpanID(420), } - span := tracer.StartSpan("web.request", opts...).(*span) + span := tracer.StartSpan("web.request", opts...) assert := assert.New(t) - assert.Equal("test", span.Type) - assert.Equal("test.service", span.Service) - assert.Equal("test.resource", span.Resource) - assert.Equal(now.UnixNano(), span.Start) - assert.Equal(uint64(420), span.SpanID) - assert.Equal(uint64(420), span.TraceID) - assert.Equal(1.0, span.Metrics[keyTopLevel]) + assert.Equal("test", span.spanType) + assert.Equal("test.service", span.service) + assert.Equal("test.resource", span.resource) + assert.Equal(now.UnixNano(), span.start) + assert.Equal(uint64(420), span.spanID) + assert.Equal(uint64(420), span.traceID) + assert.Equal(1.0, span.metrics[keyTopLevel]) } func TestTracerStartSpanOptions128(t *testing.T) { - tracer := newTracer() - internal.SetGlobalTracer(tracer) + tracer, err := newTracer() + assert.NoError(t, err) + setGlobalTracer(tracer) defer tracer.Stop() - defer internal.SetGlobalTracer(&internal.NoopTracer{}) + defer setGlobalTracer(&NoopTracer{}) t.Run("64-bit-trace-id", func(t *testing.T) { assert := assert.New(t) t.Setenv("DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED", "false") opts := []StartSpanOption{ WithSpanID(987654), } - s := tracer.StartSpan("web.request", opts...).(*span) - assert.Equal(uint64(987654), s.SpanID) - assert.Equal(uint64(987654), s.TraceID) + s := tracer.StartSpan("web.request", opts...) + assert.Equal(uint64(987654), s.spanID) + assert.Equal(uint64(987654), s.traceID) id := id128FromSpan(assert, s.Context()) - assert.Empty(s.Meta[keyTraceID128]) + assert.Empty(s.meta[keyTraceID128]) idBytes, err := hex.DecodeString(id) assert.NoError(err) assert.Equal(uint64(0), binary.BigEndian.Uint64(idBytes[:8])) // high 64 bits should be 0 - assert.Equal(s.Context().TraceID(), binary.BigEndian.Uint64(idBytes[8:])) + tid := s.Context().TraceIDBytes() + assert.Equal(tid[:], idBytes) }) t.Run("128-bit-trace-id", func(t *testing.T) { assert := assert.New(t) @@ -794,64 +842,67 @@ func TestTracerStartSpanOptions128(t *testing.T) { WithSpanID(987654), StartTime(time.Unix(123456, 0)), } - s := tracer.StartSpan("web.request", opts128...).(*span) - assert.Equal(uint64(987654), s.SpanID) - assert.Equal(uint64(987654), s.TraceID) + s := tracer.StartSpan("web.request", opts128...) + assert.Equal(uint64(987654), s.spanID) + assert.Equal(uint64(987654), s.traceID) id := id128FromSpan(assert, s.Context()) // hex_encoded(<32-bit unix seconds> <32 bits of zero> <64 random bits>) // 0001e240 (123456) + 00000000 (zeros) + 00000000000f1206 (987654) assert.Equal("0001e2400000000000000000000f1206", id) s.Finish() - assert.Equal(id[:16], s.Meta[keyTraceID128]) + assert.Equal(id[:16], s.meta[keyTraceID128]) }) } func TestTracerStartChildSpan(t *testing.T) { t.Run("own-service", func(t *testing.T) { assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request", ServiceName("root-service")).(*span) + assert.NoError(err) + root := tracer.StartSpan("web.request", ServiceName("root-service")) child := tracer.StartSpan("db.query", ChildOf(root.Context()), ServiceName("child-service"), - WithSpanID(69)).(*span) + WithSpanID(69)) - assert.NotEqual(uint64(0), child.TraceID) - assert.NotEqual(uint64(0), child.SpanID) - assert.Equal(root.SpanID, child.ParentID) - assert.Equal(root.TraceID, child.ParentID) - assert.Equal(root.TraceID, child.TraceID) - assert.Equal(uint64(69), child.SpanID) - assert.Equal("child-service", child.Service) + assert.NotEqual(uint64(0), child.traceID) + assert.NotEqual(uint64(0), child.spanID) + assert.Equal(root.spanID, child.parentID) + assert.Equal(root.traceID, child.parentID) + assert.Equal(root.traceID, child.traceID) + assert.Equal(uint64(69), child.spanID) + assert.Equal("child-service", child.service) // the root and child are both marked as "top level" - assert.Equal(1.0, root.Metrics[keyTopLevel]) - assert.Equal(1.0, child.Metrics[keyTopLevel]) + assert.Equal(1.0, root.metrics[keyTopLevel]) + assert.Equal(1.0, child.metrics[keyTopLevel]) }) t.Run("inherit-service", func(t *testing.T) { assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request", ServiceName("root-service")).(*span) - child := tracer.StartSpan("db.query", ChildOf(root.Context())).(*span) + assert.NoError(err) + root := tracer.StartSpan("web.request", ServiceName("root-service")) + child := tracer.StartSpan("db.query", ChildOf(root.Context())) - assert.Equal("root-service", child.Service) + assert.Equal("root-service", child.service) // the root is marked as "top level", but the child is not - assert.Equal(1.0, root.Metrics[keyTopLevel]) - assert.NotContains(child.Metrics, keyTopLevel) + assert.Equal(1.0, root.metrics[keyTopLevel]) + assert.NotContains(child.metrics, keyTopLevel) }) } func TestTracerBaggagePropagation(t *testing.T) { assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) + assert.Nil(err) + root := tracer.StartSpan("web.request") root.SetBaggageItem("key", "value") - child := tracer.StartSpan("db.query", ChildOf(root.Context())).(*span) - context := child.Context().(*spanContext) + child := tracer.StartSpan("db.query", ChildOf(root.Context())) + context := child.Context() assert.Equal("value", context.baggage["key"]) } @@ -861,8 +912,9 @@ func TestStartSpanOrigin(t *testing.T) { t.Setenv(headerPropagationStyleInject, "datadog") assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.Nil(err) carrier := TextMapCarrier(map[string]string{ DefaultTraceIDHeader: "1", @@ -874,11 +926,11 @@ func TestStartSpanOrigin(t *testing.T) { // first child contains tag child := tracer.StartSpan("child", ChildOf(ctx)) - assert.Equal("synthetics", child.(*span).Meta[keyOrigin]) + assert.Equal("synthetics", child.meta[keyOrigin]) // secondary child doesn't child2 := tracer.StartSpan("child2", ChildOf(child.Context())) - assert.Empty(child2.(*span).Meta[keyOrigin]) + assert.Empty(child2.meta[keyOrigin]) // but injecting its context marks origin carrier2 := TextMapCarrier(map[string]string{}) @@ -892,21 +944,22 @@ func TestPropagationDefaults(t *testing.T) { t.Setenv(headerPropagationStyleInject, "datadog") assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) + assert.Nil(err) + root := tracer.StartSpan("web.request") root.SetBaggageItem("x", "y") - root.SetTag(ext.SamplingPriority, -1) - ctx := root.Context().(*spanContext) + root.SetTag(ext.ManualDrop, true) + ctx := root.Context() headers := http.Header{} // inject the spanContext carrier := HTTPHeadersCarrier(headers) - err := tracer.Inject(ctx, carrier) + err = tracer.Inject(ctx, carrier) assert.Nil(err) - tid := strconv.FormatUint(root.TraceID, 10) - pid := strconv.FormatUint(root.SpanID, 10) + tid := strconv.FormatUint(root.traceID, 10) + pid := strconv.FormatUint(root.spanID, 10) assert.Equal(headers.Get(DefaultTraceIDHeader), tid) assert.Equal(headers.Get(DefaultParentIDHeader), pid) @@ -916,7 +969,7 @@ func TestPropagationDefaults(t *testing.T) { // retrieve the spanContext propagated, err := tracer.Extract(carrier) assert.Nil(err) - pctx := propagated.(*spanContext) + pctx := propagated // compare if there is a Context match assert.Equal(ctx.traceID, pctx.traceID) @@ -925,55 +978,130 @@ func TestPropagationDefaults(t *testing.T) { assert.Equal(*ctx.trace.priority, -1.) // ensure a child can be created - child := tracer.StartSpan("db.query", ChildOf(propagated)).(*span) + child := tracer.StartSpan("db.query", ChildOf(propagated)) + + assert.NotEqual(uint64(0), child.traceID) + assert.NotEqual(uint64(0), child.spanID) + assert.Equal(root.spanID, child.parentID) + assert.Equal(root.traceID, child.parentID) + assert.Equal(*child.context.trace.priority, -1.) +} + +func TestPropagationDefaultIncludesBaggage(t *testing.T) { + assert := assert.New(t) + + tracer, err := newTracer() + assert.NoError(err) + defer tracer.Stop() + root := tracer.StartSpan("web.request") + root.SetBaggageItem("foo", "bar") + root.SetTag(ext.ManualDrop, true) + ctx := root.Context() + headers := http.Header{} + + // inject the spanContext + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(ctx, carrier) + assert.Nil(err) + + tid := strconv.FormatUint(root.traceID, 10) + pid := strconv.FormatUint(root.spanID, 10) + + assert.Equal(headers.Get(DefaultTraceIDHeader), tid) + assert.Equal(headers.Get(DefaultParentIDHeader), pid) + assert.Equal(headers.Get(DefaultPriorityHeader), "-1") + assert.Equal(headers.Get(DefaultBaggageHeader), "foo=bar") + + // retrieve the spanContext + propagated, err := tracer.Extract(carrier) + assert.Nil(err) + + // compare if there is a Context match + assert.Equal(ctx.traceID, propagated.traceID) + assert.Equal(ctx.spanID, propagated.spanID) + assert.Equal(*ctx.trace.priority, -1.) + assert.Equal(ctx.baggage, propagated.baggage) + + // ensure a child can be created + child := tracer.StartSpan("db.query", ChildOf(propagated)) - assert.NotEqual(uint64(0), child.TraceID) - assert.NotEqual(uint64(0), child.SpanID) - assert.Equal(root.SpanID, child.ParentID) - assert.Equal(root.TraceID, child.ParentID) + assert.NotEqual(uint64(0), child.traceID) + assert.NotEqual(uint64(0), child.spanID) + assert.Equal(root.spanID, child.parentID) + assert.Equal(root.traceID, child.parentID) assert.Equal(*child.context.trace.priority, -1.) } +func TestPropagationStyleOnlyBaggage(t *testing.T) { + t.Setenv(headerPropagationStyle, "baggage") + assert := assert.New(t) + + tracer, err := newTracer() + assert.NoError(err) + defer tracer.Stop() + root := tracer.StartSpan("web.request") + root.SetBaggageItem("foo", "bar") + ctx := root.Context() + headers := http.Header{} + + // inject the spanContext + carrier := HTTPHeadersCarrier(headers) + err = tracer.Inject(ctx, carrier) + assert.Nil(err) + + assert.Equal(headers.Get(DefaultBaggageHeader), "foo=bar") + + // retrieve the spanContext + propagated, err := tracer.Extract(carrier) + assert.Nil(err) + + // compare if there is a Context match + assert.Equal(ctx.baggage, propagated.baggage) +} + func TestTracerSamplingPriorityPropagation(t *testing.T) { assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request", Tag(ext.SamplingPriority, 2)).(*span) - child := tracer.StartSpan("db.query", ChildOf(root.Context())).(*span) - assert.EqualValues(2, root.Metrics[keySamplingPriority]) + assert.Nil(err) + root := tracer.StartSpan("web.request", Tag(ext.ManualKeep, true)) + child := tracer.StartSpan("db.query", ChildOf(root.Context())) + assert.EqualValues(2, root.metrics[keySamplingPriority]) assert.Equal("-4", root.context.trace.propagatingTags[keyDecisionMaker]) - assert.EqualValues(2, child.Metrics[keySamplingPriority]) + assert.EqualValues(2, child.metrics[keySamplingPriority]) assert.EqualValues(2., *root.context.trace.priority) assert.EqualValues(2., *child.context.trace.priority) } func TestTracerSamplingPriorityEmptySpanCtx(t *testing.T) { assert := assert.New(t) - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() root := newBasicSpan("web.request") - spanCtx := &spanContext{ - traceID: traceIDFrom64Bits(root.context.TraceID()), + spanCtx := &SpanContext{ + traceID: root.context.TraceIDBytes(), spanID: root.context.SpanID(), trace: &trace{}, } - child := tracer.StartSpan("db.query", ChildOf(spanCtx)).(*span) - assert.EqualValues(1, child.Metrics[keySamplingPriority]) + child := tracer.StartSpan("db.query", ChildOf(spanCtx)) + assert.EqualValues(1, child.metrics[keySamplingPriority]) assert.Equal("-1", child.context.trace.propagatingTags[keyDecisionMaker]) } func TestTracerDDUpstreamServicesManualKeep(t *testing.T) { assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.Nil(err) root := newBasicSpan("web.request") - spanCtx := &spanContext{ - traceID: traceIDFrom64Bits(root.context.TraceID()), + spanCtx := &SpanContext{ + traceID: root.context.TraceIDBytes(), spanID: root.context.SpanID(), trace: &trace{}, } - child := tracer.StartSpan("db.query", ChildOf(spanCtx)).(*span) - grandChild := tracer.StartSpan("db.query", ChildOf(child.Context())).(*span) + child := tracer.StartSpan("db.query", ChildOf(spanCtx)) + grandChild := tracer.StartSpan("db.query", ChildOf(child.Context())) grandChild.SetTag(ext.ManualDrop, true) grandChild.SetTag(ext.ManualKeep, true) assert.Equal("-4", grandChild.context.trace.propagatingTags[keyDecisionMaker]) @@ -981,20 +1109,22 @@ func TestTracerDDUpstreamServicesManualKeep(t *testing.T) { func TestTracerBaggageImmutability(t *testing.T) { assert := assert.New(t) - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() - root := tracer.StartSpan("web.request").(*span) + assert.Nil(err) + root := tracer.StartSpan("web.request") root.SetBaggageItem("key", "value") - child := tracer.StartSpan("db.query", ChildOf(root.Context())).(*span) + child := tracer.StartSpan("db.query", ChildOf(root.Context())) child.SetBaggageItem("key", "changed!") - parentContext := root.Context().(*spanContext) - childContext := child.Context().(*spanContext) + parentContext := root.Context() + childContext := child.Context() assert.Equal("value", parentContext.baggage["key"]) assert.Equal("changed!", childContext.baggage["key"]) } func TestTracerInjectConcurrency(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) defer stop() span, _ := StartSpanFromContext(context.Background(), "main") defer span.Finish() @@ -1016,105 +1146,113 @@ func TestTracerInjectConcurrency(t *testing.T) { } func TestTracerSpanTags(t *testing.T) { - tracer := newTracer() + tracer, err := newTracer() defer tracer.Stop() + assert.NoError(t, err) tag := Tag("key", "value") - span := tracer.StartSpan("web.request", tag).(*span) + span := tracer.StartSpan("web.request", tag) assert := assert.New(t) - assert.Equal("value", span.Meta["key"]) + assert.Equal("value", span.meta["key"]) } func TestTracerSpanGlobalTags(t *testing.T) { assert := assert.New(t) - tracer := newTracer(WithGlobalTag("key", "value")) + tracer, err := newTracer(WithGlobalTag("key", "value")) defer tracer.Stop() - s := tracer.StartSpan("web.request").(*span) - assert.Equal("value", s.Meta["key"]) - child := tracer.StartSpan("db.query", ChildOf(s.Context())).(*span) - assert.Equal("value", child.Meta["key"]) + assert.Nil(err) + s := tracer.StartSpan("web.request") + assert.Equal("value", s.meta["key"]) + child := tracer.StartSpan("db.query", ChildOf(s.Context())) + assert.Equal("value", child.meta["key"]) } func TestTracerSpanServiceMappings(t *testing.T) { - assert := assert.New(t) t.Run("WithServiceMapping", func(t *testing.T) { - tracer := newTracer(WithServiceName("initial_service"), WithServiceMapping("initial_service", "new_service")) + tracer, err := newTracer(WithService("initial_service"), WithServiceMapping("initial_service", "new_service")) defer tracer.Stop() - s := tracer.StartSpan("web.request").(*span) - assert.Equal("new_service", s.Service) + assert.Nil(t, err) + s := tracer.StartSpan("web.request") + assert.Equal(t, "new_service", s.service) }) t.Run("child", func(t *testing.T) { - tracer := newTracer(WithServiceMapping("initial_service", "new_service")) + tracer, err := newTracer(WithServiceMapping("initial_service", "new_service")) defer tracer.Stop() - s := tracer.StartSpan("web.request", ServiceName("initial_service")).(*span) - child := tracer.StartSpan("db.query", ChildOf(s.Context())).(*span) - assert.Equal("new_service", child.Service) + assert.Nil(t, err) + s := tracer.StartSpan("web.request", ServiceName("initial_service")) + child := tracer.StartSpan("db.query", ChildOf(s.Context())) + assert.Equal(t, "new_service", child.service) }) t.Run("StartSpanOption", func(t *testing.T) { - tracer := newTracer(WithServiceMapping("initial_service", "new_service")) + tracer, err := newTracer(WithServiceMapping("initial_service", "new_service")) defer tracer.Stop() - s := tracer.StartSpan("web.request", ServiceName("initial_service")).(*span) - assert.Equal("new_service", s.Service) + assert.Nil(t, err) + s := tracer.StartSpan("web.request", ServiceName("initial_service")) + assert.Equal(t, "new_service", s.service) }) t.Run("tag", func(t *testing.T) { - tracer := newTracer(WithServiceMapping("initial_service", "new_service")) + tracer, err := newTracer(WithServiceMapping("initial_service", "new_service")) defer tracer.Stop() - s := tracer.StartSpan("web.request", Tag("service.name", "initial_service")).(*span) - assert.Equal("new_service", s.Service) + assert.Nil(t, err) + s := tracer.StartSpan("web.request", Tag("service.name", "initial_service")) + assert.Equal(t, "new_service", s.service) }) t.Run("globalTags", func(t *testing.T) { - tracer := newTracer(WithGlobalTag("service.name", "initial_service"), WithServiceMapping("initial_service", "new_service")) + tracer, err := newTracer(WithGlobalTag("service.name", "initial_service"), WithServiceMapping("initial_service", "new_service")) defer tracer.Stop() - s := tracer.StartSpan("web.request").(*span) - assert.Equal("new_service", s.Service) + assert.Nil(t, err) + s := tracer.StartSpan("web.request") + assert.Equal(t, "new_service", s.service) }) } func TestTracerNoDebugStack(t *testing.T) { - assert := assert.New(t) t.Run("Finish", func(t *testing.T) { - tracer := newTracer(WithDebugStack(false)) + tracer, err := newTracer(WithDebugStack(false)) defer tracer.Stop() - s := tracer.StartSpan("web.request").(*span) - err := errors.New("test error") + assert.Nil(t, err) + s := tracer.StartSpan("web.request") + err = errors.New("test error") s.Finish(WithError(err)) - assert.Empty(s.Meta[ext.ErrorStack]) + assert.Empty(t, s.meta[ext.ErrorStack]) }) t.Run("SetTag", func(t *testing.T) { - tracer := newTracer(WithDebugStack(false)) + tracer, err := newTracer(WithDebugStack(false)) defer tracer.Stop() - s := tracer.StartSpan("web.request").(*span) - err := errors.New("error value with no trace") + assert.Nil(t, err) + s := tracer.StartSpan("web.request") + err = errors.New("error value with no trace") s.SetTag(ext.Error, err) - assert.Empty(s.Meta[ext.ErrorStack]) + assert.Empty(t, s.meta[ext.ErrorStack]) }) } // newDefaultTransport return a default transport for this tracing client func newDefaultTransport() transport { - return newHTTPTransport(defaultURL, defaultHTTPClient(0)) + return newHTTPTransport(defaultURL, internal.DefaultHTTPClient(defaultHTTPTimeout, true)) } func TestNewSpan(t *testing.T) { assert := assert.New(t) // the tracer must create root spans - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.Nil(err) span := tracer.newRootSpan("pylons.request", "pylons", "/") - assert.Equal(uint64(0), span.ParentID) - assert.Equal("pylons", span.Service) - assert.Equal("pylons.request", span.Name) - assert.Equal("/", span.Resource) + assert.Equal(uint64(0), span.parentID) + assert.Equal("pylons", span.service) + assert.Equal("pylons.request", span.name) + assert.Equal("/", span.resource) } func TestNewSpanChild(t *testing.T) { @@ -1130,29 +1268,30 @@ func testNewSpanChild(t *testing.T, is128 bool) { assert := assert.New(t) // the tracer must create child spans - tracer := newTracer(withTransport(newDefaultTransport())) - internal.SetGlobalTracer(tracer) + tracer, err := newTracer(withTransport(newDefaultTransport())) + setGlobalTracer(tracer) defer tracer.Stop() + assert.Nil(err) parent := tracer.newRootSpan("pylons.request", "pylons", "/") child := tracer.newChildSpan("redis.command", parent) // ids and services are inherited - assert.Equal(parent.SpanID, child.ParentID) - assert.Equal(parent.TraceID, child.TraceID) + assert.Equal(parent.spanID, child.parentID) + assert.Equal(parent.traceID, child.traceID) id := id128FromSpan(assert, child.Context()) assert.Equal(id128FromSpan(assert, parent.Context()), id) - assert.Equal(parent.Service, child.Service) + assert.Equal(parent.service, child.service) // the resource is not inherited and defaults to the name - assert.Equal("redis.command", child.Resource) + assert.Equal("redis.command", child.resource) // Meta[keyTraceID128] gets set upon Finish parent.Finish() child.Finish() if is128 { - assert.Equal(id[:16], parent.Meta[keyTraceID128]) - assert.Empty(child.Meta[keyTraceID128]) + assert.Equal(id[:16], parent.meta[keyTraceID128]) + assert.Empty(child.meta[keyTraceID128]) } else { - assert.Empty(child.Meta[keyTraceID128]) - assert.Empty(parent.Meta[keyTraceID128]) + assert.Empty(child.meta[keyTraceID128]) + assert.Empty(parent.meta[keyTraceID128]) } }) } @@ -1160,33 +1299,36 @@ func testNewSpanChild(t *testing.T, is128 bool) { func TestNewRootSpanHasPid(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.Nil(err) root := tracer.newRootSpan("pylons.request", "pylons", "/") - assert.Equal(float64(os.Getpid()), root.Metrics[ext.Pid]) + assert.Equal(float64(os.Getpid()), root.metrics[ext.Pid]) } func TestNewChildHasNoPid(t *testing.T) { assert := assert.New(t) - tracer := newTracer(withTransport(newDefaultTransport())) + tracer, err := newTracer(withTransport(newDefaultTransport())) defer tracer.Stop() + assert.Nil(err) root := tracer.newRootSpan("pylons.request", "pylons", "/") child := tracer.newChildSpan("redis.command", root) - assert.Equal("", child.Meta[ext.Pid]) + assert.Equal("", child.meta[ext.Pid]) } func TestTracerSampler(t *testing.T) { assert := assert.New(t) sampler := NewRateSampler(0.9999) // high probability of sampling - tracer := newTracer( + tracer, err := newTracer( withTransport(newDefaultTransport()), - WithSampler(sampler), ) + tracer.config.sampler = sampler defer tracer.Stop() + assert.NoError(err) span := tracer.newRootSpan("pylons.request", "pylons", "/") @@ -1194,13 +1336,13 @@ func TestTracerSampler(t *testing.T) { t.Skip("wasn't sampled") // no flaky tests } // only run test if span was sampled to avoid flaky tests - _, ok := span.Metrics[sampleRateMetricKey] + _, ok := span.metrics[sampleRateMetricKey] assert.True(ok) } func TestTracerPrioritySampler(t *testing.T) { assert := assert.New(t) - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) w.Write([]byte(`{ "rate_by_service":{ @@ -1211,21 +1353,23 @@ func TestTracerPrioritySampler(t *testing.T) { } }`)) })) + defer srv.Close() url := "http://" + srv.Listener.Addr().String() - tr, _, flush, stop := startTestTracer(t, - withTransport(newHTTPTransport(url, defaultHTTPClient(0))), + tr, _, flush, stop, err := startTestTracer(t, + withTransport(newHTTPTransport(url, internal.DefaultHTTPClient(defaultHTTPTimeout, false))), ) + assert.Nil(err) defer stop() // default rates (1.0) s := tr.newEnvSpan("pylons", "") - assert.Equal(1., s.Metrics[keySamplingPriorityRate]) - assert.Equal(1., s.Metrics[keySamplingPriority]) + assert.Equal(1., s.metrics[keySamplingPriorityRate]) + assert.Equal(1., s.metrics[keySamplingPriority]) assert.Equal("-1", s.context.trace.propagatingTags[keyDecisionMaker]) p, ok := s.context.SamplingPriority() assert.True(ok) - assert.EqualValues(p, s.Metrics[keySamplingPriority]) + assert.EqualValues(p, s.metrics[keySamplingPriority]) s.Finish() tr.awaitPayload(t, 1) @@ -1256,8 +1400,8 @@ func TestTracerPrioritySampler(t *testing.T) { }, } { s := tr.newEnvSpan(tt.service, tt.env) - assert.Equal(tt.rate, s.Metrics[keySamplingPriorityRate], strconv.Itoa(i)) - prio, ok := s.Metrics[keySamplingPriority] + assert.Equal(tt.rate, s.metrics[keySamplingPriorityRate], strconv.Itoa(i)) + prio, ok := s.metrics[keySamplingPriority] if prio > 0 { assert.Equal("-1", s.context.trace.propagatingTags[keyDecisionMaker]) } else { @@ -1280,16 +1424,18 @@ func TestTracerEdgeSampler(t *testing.T) { assert := assert.New(t) // a sample rate of 0 should sample nothing - tracer0, _, _, stop := startTestTracer(t, + tracer0, _, _, stop, err := startTestTracer(t, withTransport(newDefaultTransport()), - WithSampler(NewRateSampler(0)), + WithSamplerRate(0), ) + assert.Nil(err) defer stop() // a sample rate of 1 should sample everything - tracer1, _, _, stop := startTestTracer(t, + tracer1, _, _, stop, err := startTestTracer(t, withTransport(newDefaultTransport()), - WithSampler(NewRateSampler(1)), + WithSamplerRate(1), ) + assert.Nil(err) defer stop() count := payloadQueueSize / 3 @@ -1301,13 +1447,14 @@ func TestTracerEdgeSampler(t *testing.T) { span1.Finish() } - assert.Equal(tracer0.traceWriter.(*agentTraceWriter).payload.itemCount(), 0) + assert.Equal(tracer0.traceWriter.(*agentTraceWriter).payload.stats().itemCount, 0) tracer1.awaitPayload(t, count) } func TestTracerConcurrent(t *testing.T) { assert := assert.New(t) - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() // Wait for three different goroutines that should create @@ -1338,7 +1485,8 @@ func TestTracerConcurrent(t *testing.T) { func TestTracerParentFinishBeforeChild(t *testing.T) { assert := assert.New(t) - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() // Testing an edge case: a child refers to a parent that is already closed. @@ -1361,12 +1509,13 @@ func TestTracerParentFinishBeforeChild(t *testing.T) { assert.Len(traces, 1) assert.Len(traces[0], 1) comparePayloadSpans(t, child, traces[0][0]) - assert.Equal(parent.SpanID, traces[0][0].ParentID, "child should refer to parent, even if they have been flushed separately") + assert.Equal(parent.spanID, traces[0][0].parentID, "child should refer to parent, even if they have been flushed separately") } func TestTracerConcurrentMultipleSpans(t *testing.T) { assert := assert.New(t) - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() // Wait for two different goroutines that should create @@ -1398,7 +1547,8 @@ func TestTracerConcurrentMultipleSpans(t *testing.T) { func TestTracerAtomicFlush(t *testing.T) { assert := assert.New(t) - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() // Make sure we don't flush partial bits of traces @@ -1433,7 +1583,8 @@ func TestTracerAtomicFlush(t *testing.T) { // Changing these spans at the moment of flush would (and did) cause a race // condition. func TestTracerTraceMaxSize(t *testing.T) { - _, _, _, stop := startTestTracer(t) + _, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() otss, otms := traceStartSize, traceMaxSize @@ -1442,7 +1593,7 @@ func TestTracerTraceMaxSize(t *testing.T) { traceStartSize, traceMaxSize = otss, otms }() - spans := make([]ddtrace.Span, 5) + spans := make([]*Span, 5) spans[0] = StartSpan("span0") spans[1] = StartSpan("span1", ChildOf(spans[0].Context())) spans[2] = StartSpan("span2", ChildOf(spans[0].Context())) @@ -1473,7 +1624,8 @@ func TestTracerTraceMaxSize(t *testing.T) { func TestTracerRace(t *testing.T) { assert := assert.New(t) - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(err) defer stop() total := payloadQueueSize / 3 @@ -1484,7 +1636,7 @@ func TestTracerRace(t *testing.T) { // different orders, and modifying spans after creation. for n := 0; n < total; n++ { i := n // keep local copy - odd := ((i % 2) != 0) + odd := (i % 2) != 0 go func() { if i%11 == 0 { time.Sleep(time.Microsecond) @@ -1514,11 +1666,11 @@ func TestTracerRace(t *testing.T) { } if odd { - child.Resource = "HGETALL" + child.resource = "HGETALL" child.SetTag("odd", "false") child.SetTag("oddity", 0) } else { - parent.Resource = "/" + strconv.Itoa(i) + ".html" + parent.resource = "/" + strconv.Itoa(i) + ".html" parent.SetTag("odd", "true") parent.SetTag("oddity", 1) } @@ -1544,9 +1696,9 @@ func TestTracerRace(t *testing.T) { assert.Len(traces, total, "we should have exactly as many traces as expected") for _, trace := range traces { assert.Len(trace, 3, "each trace should have exactly 3 spans") - var parent, child, redis *span + var parent, child, redis *Span for _, span := range trace { - switch span.Name { + switch span.name { case "pylons.request": parent = span case "async.service": @@ -1561,14 +1713,14 @@ func TestTracerRace(t *testing.T) { assert.NotNil(child) assert.NotNil(redis) - assert.Equal(uint64(0), parent.ParentID) - assert.Equal(parent.TraceID, parent.SpanID) + assert.Equal(uint64(0), parent.parentID) + assert.Equal(parent.traceID, parent.spanID) - assert.Equal(parent.TraceID, redis.TraceID) - assert.Equal(parent.TraceID, child.TraceID) + assert.Equal(parent.traceID, redis.traceID) + assert.Equal(parent.traceID, child.traceID) - assert.Equal(parent.TraceID, redis.ParentID) - assert.Equal(parent.TraceID, child.ParentID) + assert.Equal(parent.traceID, redis.parentID) + assert.Equal(parent.traceID, child.parentID) } } @@ -1577,7 +1729,8 @@ func TestTracerRace(t *testing.T) { // be using forceFlush() to make sure things are really sent to transport. // Here, we just wait until things show up, as we would do with a real program. func TestWorker(t *testing.T) { - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() n := payloadQueueSize * 10 // put more traces than the chan size, on purpose @@ -1605,38 +1758,44 @@ loop: } func TestPushPayload(t *testing.T) { - tracer, _, flush, stop := startTestTracer(t) + tracer, _, flush, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() s := newBasicSpan("3MB") - s.Meta["key"] = strings.Repeat("X", payloadSizeLimit/2+10) + s.meta["key"] = strings.Repeat("X", payloadSizeLimit/2+10) // half payload size reached - tracer.pushChunk(&chunk{[]*span{s}, true}) + tracer.pushChunk(&chunk{[]*Span{s}, true}) tracer.awaitPayload(t, 1) // payload size exceeded - tracer.pushChunk(&chunk{[]*span{s}, true}) + tracer.pushChunk(&chunk{[]*Span{s}, true}) flush(2) } func TestPushTrace(t *testing.T) { assert := assert.New(t) + oldLvl := log.GetLevel() + defer func() { log.SetLevel(oldLvl) }() + log.SetLevel(log.LevelDebug) + tp := new(log.RecordLogger) log.UseLogger(tp) - tracer := newUnstartedTracer() - defer tracer.statsd.Close() - trace := []*span{ + tracer, err := newUnstartedTracer() + assert.Nil(err) + defer tracer.Stop() + trace := []*Span{ { - Name: "pylons.request", - Service: "pylons", - Resource: "/", + name: "pylons.request", + service: "pylons", + resource: "/", }, { - Name: "pylons.request", - Service: "pylons", - Resource: "/foo", + name: "pylons.request", + service: "pylons", + resource: "/foo", }, } tracer.pushChunk(&chunk{spans: trace}) @@ -1646,9 +1805,9 @@ func TestPushTrace(t *testing.T) { t0 := <-tracer.out assert.Equal(&chunk{spans: trace}, t0) - many := payloadQueueSize + 2 + many := payloadQueueSize * 2 for i := 0; i < many; i++ { - tracer.pushChunk(&chunk{spans: make([]*span, i)}) + tracer.pushChunk(&chunk{spans: make([]*Span, i)}) } assert.Len(tracer.out, payloadQueueSize) log.Flush() @@ -1657,7 +1816,8 @@ func TestPushTrace(t *testing.T) { func TestTracerFlush(t *testing.T) { // https://github.com/DataDog/dd-trace-go/issues/377 - tracer, transport, flush, stop := startTestTracer(t) + tracer, transport, flush, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() t.Run("direct", func(t *testing.T) { @@ -1671,7 +1831,7 @@ func TestTracerFlush(t *testing.T) { list := transport.Traces() assert.Len(list, 1) assert.Len(list[0], 2) - assert.Equal("child.direct", list[0][1].Name) + assert.Equal("child.direct", list[0][1].name) }) t.Run("extracted", func(t *testing.T) { @@ -1691,7 +1851,7 @@ func TestTracerFlush(t *testing.T) { list := transport.Traces() assert.Len(list, 1) assert.Len(list[0], 1) - assert.Equal("child.extracted", list[0][0].Name) + assert.Equal("child.extracted", list[0][0].name) }) } @@ -1703,21 +1863,22 @@ func TestTracerReportsHostname(t *testing.T) { t.Setenv("DD_TRACE_REPORT_HOSTNAME", "true") t.Setenv("DD_TRACE_COMPUTE_STATS", fmt.Sprintf("%t", withComputeStats)) - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() - root := tracer.StartSpan("root").(*span) - child := tracer.StartSpan("child", ChildOf(root.Context())).(*span) + root := tracer.StartSpan("root") + child := tracer.StartSpan("child", ChildOf(root.Context())) child.Finish() root.Finish() assert := assert.New(t) - name, ok := root.Meta[keyHostname] + name, ok := root.meta[keyHostname] assert.True(ok) assert.Equal(name, tracer.config.hostname) - name, ok = child.Meta[keyHostname] + name, ok = child.meta[keyHostname] assert.True(ok) assert.Equal(name, tracer.config.hostname) }) @@ -1728,19 +1889,20 @@ func TestTracerReportsHostname(t *testing.T) { testReportHostnameDisabled := func(t *testing.T, name string, withComputeStats bool) { t.Run(name, func(t *testing.T) { t.Setenv("DD_TRACE_COMPUTE_STATS", fmt.Sprintf("%t", withComputeStats)) - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() - root := tracer.StartSpan("root").(*span) - child := tracer.StartSpan("child", ChildOf(root.Context())).(*span) + root := tracer.StartSpan("root") + child := tracer.StartSpan("child", ChildOf(root.Context())) child.Finish() root.Finish() assert := assert.New(t) - _, ok := root.Meta[keyHostname] + _, ok := root.meta[keyHostname] assert.False(ok) - _, ok = child.Meta[keyHostname] + _, ok = child.meta[keyHostname] assert.False(ok) }) } @@ -1748,21 +1910,22 @@ func TestTracerReportsHostname(t *testing.T) { testReportHostnameDisabled(t, "DD_TRACE_REPORT_HOSTNAME/unset,DD_TRACE_COMPUTE_STATS/false", false) t.Run("WithHostname", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithHostname(hostname)) + tracer, _, _, stop, err := startTestTracer(t, WithHostname(hostname)) + assert.Nil(t, err) defer stop() - root := tracer.StartSpan("root").(*span) - child := tracer.StartSpan("child", ChildOf(root.Context())).(*span) + root := tracer.StartSpan("root") + child := tracer.StartSpan("child", ChildOf(root.Context())) child.Finish() root.Finish() assert := assert.New(t) - got, ok := root.Meta[keyHostname] + got, ok := root.meta[keyHostname] assert.True(ok) assert.Equal(got, hostname) - got, ok = child.Meta[keyHostname] + got, ok = child.meta[keyHostname] assert.True(ok) assert.Equal(got, hostname) }) @@ -1770,226 +1933,242 @@ func TestTracerReportsHostname(t *testing.T) { t.Run("DD_TRACE_SOURCE_HOSTNAME/set", func(t *testing.T) { t.Setenv("DD_TRACE_SOURCE_HOSTNAME", "hostname-test") - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() - root := tracer.StartSpan("root").(*span) - child := tracer.StartSpan("child", ChildOf(root.Context())).(*span) + root := tracer.StartSpan("root") + child := tracer.StartSpan("child", ChildOf(root.Context())) child.Finish() root.Finish() assert := assert.New(t) - got, ok := root.Meta[keyHostname] + got, ok := root.meta[keyHostname] assert.True(ok) assert.Equal(got, hostname) - got, ok = child.Meta[keyHostname] + got, ok = child.meta[keyHostname] assert.True(ok) assert.Equal(got, hostname) }) t.Run("DD_TRACE_SOURCE_HOSTNAME/unset", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() - root := tracer.StartSpan("root").(*span) - child := tracer.StartSpan("child", ChildOf(root.Context())).(*span) + root := tracer.StartSpan("root") + child := tracer.StartSpan("child", ChildOf(root.Context())) child.Finish() root.Finish() assert := assert.New(t) - _, ok := root.Meta[keyHostname] + _, ok := root.meta[keyHostname] assert.False(ok) - _, ok = child.Meta[keyHostname] + _, ok = child.meta[keyHostname] assert.False(ok) }) } func TestVersion(t *testing.T) { t.Run("normal", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithServiceVersion("4.5.6")) + tracer, _, _, stop, err := startTestTracer(t, WithServiceVersion("4.5.6")) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) - v := sp.Meta[ext.Version] + sp := tracer.StartSpan("http.request") + v := sp.meta[ext.Version] assert.Equal("4.5.6", v) }) t.Run("service", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithServiceVersion("4.5.6"), + tracer, _, _, stop, err := startTestTracer(t, WithServiceVersion("4.5.6"), WithService("servenv")) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request", ServiceName("otherservenv")).(*span) - _, ok := sp.Meta[ext.Version] + sp := tracer.StartSpan("http.request", ServiceName("otherservenv")) + _, ok := sp.meta[ext.Version] assert.False(ok) }) t.Run("universal", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithService("servenv"), WithUniversalVersion("4.5.6")) + tracer, _, _, stop, err := startTestTracer(t, WithService("servenv"), WithUniversalVersion("4.5.6")) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request", ServiceName("otherservenv")).(*span) - v, ok := sp.Meta[ext.Version] + sp := tracer.StartSpan("http.request", ServiceName("otherservenv")) + v, ok := sp.meta[ext.Version] assert.True(ok) assert.Equal("4.5.6", v) }) t.Run("service/universal", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithServiceVersion("4.5.6"), + tracer, _, _, stop, err := startTestTracer(t, WithServiceVersion("4.5.6"), WithService("servenv"), WithUniversalVersion("1.2.3")) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request", ServiceName("otherservenv")).(*span) - v, ok := sp.Meta[ext.Version] + sp := tracer.StartSpan("http.request", ServiceName("otherservenv")) + v, ok := sp.meta[ext.Version] assert.True(ok) assert.Equal("1.2.3", v) }) t.Run("universal/service", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithUniversalVersion("1.2.3"), + tracer, _, _, stop, err := startTestTracer(t, WithUniversalVersion("1.2.3"), WithServiceVersion("4.5.6"), WithService("servenv")) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request", ServiceName("otherservenv")).(*span) - _, ok := sp.Meta[ext.Version] + sp := tracer.StartSpan("http.request", ServiceName("otherservenv")) + _, ok := sp.meta[ext.Version] assert.False(ok) }) } func TestEnvironment(t *testing.T) { t.Run("normal", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t, WithEnv("test")) + tracer, _, _, stop, err := startTestTracer(t, WithEnv("test")) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) - v := sp.Meta[ext.Environment] + sp := tracer.StartSpan("http.request") + v := sp.meta[ext.Environment] assert.Equal("test", v) }) t.Run("unset", func(t *testing.T) { - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) - _, ok := sp.Meta[ext.Environment] + sp := tracer.StartSpan("http.request") + _, ok := sp.meta[ext.Environment] assert.False(ok) }) } func TestGitMetadata(t *testing.T) { t.Run("git-metadata-from-dd-tags", func(t *testing.T) { - t.Setenv(maininternal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:github.com/user/repo go_path:somepath") - maininternal.RefreshGitMetadataTags() + t.Setenv(internal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:github.com/user/repo go_path:somepath") + internal.RefreshGitMetadataTags() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) + sp := tracer.StartSpan("http.request") sp.context.finish() - assert.Equal("123456789ABCD", sp.Meta[maininternal.TraceTagCommitSha]) - assert.Equal("github.com/user/repo", sp.Meta[maininternal.TraceTagRepositoryURL]) - assert.Equal("somepath", sp.Meta[maininternal.TraceTagGoPath]) + assert.Equal("123456789ABCD", sp.meta[internal.TraceTagCommitSha]) + assert.Equal("github.com/user/repo", sp.meta[internal.TraceTagRepositoryURL]) + assert.Equal("somepath", sp.meta[internal.TraceTagGoPath]) }) t.Run("git-metadata-from-dd-tags-with-credentials", func(t *testing.T) { - t.Setenv(maininternal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:https://user:passwd@github.com/user/repo go_path:somepath") - maininternal.RefreshGitMetadataTags() + t.Setenv(internal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:https://user:passwd@github.com/user/repo go_path:somepath") + internal.RefreshGitMetadataTags() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + require.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) + sp := tracer.StartSpan("http.request") sp.context.finish() - assert.Equal("123456789ABCD", sp.Meta[maininternal.TraceTagCommitSha]) - assert.Equal("https://github.com/user/repo", sp.Meta[maininternal.TraceTagRepositoryURL]) - assert.Equal("somepath", sp.Meta[maininternal.TraceTagGoPath]) + assert.Equal("123456789ABCD", sp.meta[internal.TraceTagCommitSha]) + assert.Equal("https://github.com/user/repo", sp.meta[internal.TraceTagRepositoryURL]) + assert.Equal("somepath", sp.meta[internal.TraceTagGoPath]) }) t.Run("git-metadata-from-env", func(t *testing.T) { - t.Setenv(maininternal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:github.com/user/repo") + t.Setenv(internal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:github.com/user/repo") // git metadata env has priority over DD_TAGS - t.Setenv(maininternal.EnvGitRepositoryURL, "github.com/user/repo_new") - t.Setenv(maininternal.EnvGitCommitSha, "123456789ABCDE") - maininternal.RefreshGitMetadataTags() + t.Setenv(internal.EnvGitRepositoryURL, "github.com/user/repo_new") + t.Setenv(internal.EnvGitCommitSha, "123456789ABCDE") + internal.RefreshGitMetadataTags() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) + sp := tracer.StartSpan("http.request") sp.context.finish() - assert.Equal("123456789ABCDE", sp.Meta[maininternal.TraceTagCommitSha]) - assert.Equal("github.com/user/repo_new", sp.Meta[maininternal.TraceTagRepositoryURL]) + assert.Equal("123456789ABCDE", sp.meta[internal.TraceTagCommitSha]) + assert.Equal("github.com/user/repo_new", sp.meta[internal.TraceTagRepositoryURL]) }) t.Run("git-metadata-from-env-with-credentials", func(t *testing.T) { - t.Setenv(maininternal.EnvGitRepositoryURL, "https://u:t@github.com/user/repo_new") - t.Setenv(maininternal.EnvGitCommitSha, "123456789ABCDE") - maininternal.RefreshGitMetadataTags() + t.Setenv(internal.EnvGitRepositoryURL, "https://u:t@github.com/user/repo_new") + t.Setenv(internal.EnvGitCommitSha, "123456789ABCDE") + internal.RefreshGitMetadataTags() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + require.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) + sp := tracer.StartSpan("http.request") sp.context.finish() - assert.Equal("123456789ABCDE", sp.Meta[maininternal.TraceTagCommitSha]) - assert.Equal("https://github.com/user/repo_new", sp.Meta[maininternal.TraceTagRepositoryURL]) + assert.Equal("123456789ABCDE", sp.meta[internal.TraceTagCommitSha]) + assert.Equal("https://github.com/user/repo_new", sp.meta[internal.TraceTagRepositoryURL]) }) t.Run("git-metadata-from-env-and-tags", func(t *testing.T) { - t.Setenv(maininternal.EnvDDTags, "git.commit.sha:123456789ABCD") - t.Setenv(maininternal.EnvGitRepositoryURL, "github.com/user/repo") - maininternal.RefreshGitMetadataTags() + t.Setenv(internal.EnvDDTags, "git.commit.sha:123456789ABCD") + t.Setenv(internal.EnvGitRepositoryURL, "github.com/user/repo") + internal.RefreshGitMetadataTags() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) + sp := tracer.StartSpan("http.request") sp.context.finish() - assert.Equal("123456789ABCD", sp.Meta[maininternal.TraceTagCommitSha]) - assert.Equal("github.com/user/repo", sp.Meta[maininternal.TraceTagRepositoryURL]) + assert.Equal("123456789ABCD", sp.meta[internal.TraceTagCommitSha]) + assert.Equal("github.com/user/repo", sp.meta[internal.TraceTagRepositoryURL]) }) t.Run("git-metadata-disabled", func(t *testing.T) { - t.Setenv(maininternal.EnvGitMetadataEnabledFlag, "false") + t.Setenv(internal.EnvGitMetadataEnabledFlag, "false") - t.Setenv(maininternal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:github.com/user/repo") - t.Setenv(maininternal.EnvGitRepositoryURL, "github.com/user/repo_new") - t.Setenv(maininternal.EnvGitCommitSha, "123456789ABCDE") - maininternal.RefreshGitMetadataTags() + t.Setenv(internal.EnvDDTags, "git.commit.sha:123456789ABCD git.repository_url:github.com/user/repo") + t.Setenv(internal.EnvGitRepositoryURL, "github.com/user/repo_new") + t.Setenv(internal.EnvGitCommitSha, "123456789ABCDE") + internal.RefreshGitMetadataTags() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() assert := assert.New(t) - sp := tracer.StartSpan("http.request").(*span) + sp := tracer.StartSpan("http.request") sp.context.finish() - assert.Equal("", sp.Meta[maininternal.TraceTagCommitSha]) - assert.Equal("", sp.Meta[maininternal.TraceTagRepositoryURL]) + assert.Equal("", sp.meta[internal.TraceTagCommitSha]) + assert.Equal("", sp.meta[internal.TraceTagRepositoryURL]) }) } // BenchmarkConcurrentTracing tests the performance of spawning a lot of // goroutines where each one creates a trace with a parent and a child. func BenchmarkConcurrentTracing(b *testing.B) { - tracer, _, _, stop := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSampler(NewRateSampler(0))) + tracer, _, _, stop, err := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSamplerRate(0)) + assert.Nil(b, err) defer stop() b.ResetTimer() @@ -2032,7 +2211,8 @@ func BenchmarkBigTraces(b *testing.B) { } func genBigTraces(b *testing.B) { - tracer, transport, flush, stop := startTestTracer(b, WithLogger(log.DiscardLogger{})) + tracer, transport, flush, stop, err := startTestTracer(b, WithLogger(log.DiscardLogger{})) + assert.Nil(b, err) defer stop() ctx, cancel := context.WithCancel(context.Background()) @@ -2067,8 +2247,20 @@ func genBigTraces(b *testing.B) { sp.Finish() } parent.Finish() - go flush(-1) // act like a ticker - go transport.Reset() // pretend we sent any payloads + // TODO(fg): This test has historically not waited for the two + // goroutines below to finish. This was causing test failures when + // goroutine leak checks were added to TestMain. However, looking at + // the code, perhaps these goroutines should be required to finish + // before b.StopTimer() is called? + wg.Add(2) + go func() { + flush(-1) // act like a ticker + wg.Done() + }() + go func() { + transport.Reset() // pretend we sent any payloads + wg.Done() + }() } } b.StopTimer() @@ -2080,7 +2272,8 @@ func genBigTraces(b *testing.B) { // BenchmarkTracerAddSpans tests the performance of creating and finishing a root // span. It should include the encoding overhead. func BenchmarkTracerAddSpans(b *testing.B) { - tracer, _, _, stop := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSampler(NewRateSampler(0))) + tracer, _, _, stop, err := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSamplerRate(0)) + assert.Nil(b, err) defer stop() b.ResetTimer() @@ -2091,7 +2284,8 @@ func BenchmarkTracerAddSpans(b *testing.B) { } func BenchmarkStartSpan(b *testing.B) { - tracer, _, _, stop := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSampler(NewRateSampler(0))) + tracer, _, _, stop, err := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSamplerRate(0)) + assert.Nil(b, err) defer stop() root := tracer.StartSpan("pylons.request", ServiceName("pylons"), ResourceName("/")) @@ -2108,7 +2302,8 @@ func BenchmarkStartSpan(b *testing.B) { } func BenchmarkStartSpanConcurrent(b *testing.B) { - tracer, _, _, stop := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSampler(NewRateSampler(0))) + tracer, _, _, stop, err := startTestTracer(b, WithLogger(log.DiscardLogger{}), WithSampler(NewRateSampler(0))) + assert.NoError(b, err) defer stop() var wg sync.WaitGroup @@ -2126,7 +2321,8 @@ func BenchmarkStartSpanConcurrent(b *testing.B) { for n := 0; n < b.N; n++ { s, ok := SpanFromContext(ctx) if !ok { - b.Fatal("no span") + b.Error("no span") + return } StartSpan("op", ChildOf(s.Context())) } @@ -2146,15 +2342,24 @@ func BenchmarkGenSpanID(b *testing.B) { } // startTestTracer returns a Tracer with a DummyTransport -func startTestTracer(t testing.TB, opts ...StartOption) (trc *tracer, transport *dummyTransport, flush func(n int), stop func()) { +func startTestTracer(t testing.TB, opts ...StartOption) (trc *tracer, transport *dummyTransport, flush func(n int), stop func(), err error) { + tracerstats.Reset() transport = newDummyTransport() tick := make(chan time.Time) o := append([]StartOption{ withTransport(transport), withTickChan(tick), + // disable keep-alives to avoid goroutine leaks between tests + WithHTTPClient(internal.DefaultHTTPClient(defaultHTTPTimeout, true)), }, opts...) - tracer := newTracer(o...) - internal.SetGlobalTracer(tracer) + tracer, err := newTracer(o...) + if err != nil { + return tracer, transport, nil, nil, err + } + // These settings are always enabled on the trace-agent. + tracer.config.agent.Stats = true + tracer.config.agent.DropP0s = true + setGlobalTracer(tracer) flushFunc := func(n int) { if n < 0 { tick <- time.Now() @@ -2177,135 +2382,66 @@ func startTestTracer(t testing.TB, opts ...StartOption) (trc *tracer, transport } } return tracer, transport, flushFunc, func() { - internal.SetGlobalTracer(&internal.NoopTracer{}) + setGlobalTracer(&NoopTracer{}) tracer.Stop() // clear any service name that was set: we want the state to be the same as startup globalconfig.SetServiceName("") - } -} - -// Mock Transport with a real Encoder -type dummyTransport struct { - sync.RWMutex - traces spanLists - stats []*statsPayload -} - -func newDummyTransport() *dummyTransport { - return &dummyTransport{traces: spanLists{}} -} - -func (t *dummyTransport) Len() int { - t.RLock() - defer t.RUnlock() - return len(t.traces) + }, nil } -func (t *dummyTransport) sendStats(p *statsPayload) error { - t.Lock() - t.stats = append(t.stats, p) - t.Unlock() - return nil -} - -func (t *dummyTransport) Stats() []*statsPayload { - t.RLock() - defer t.RUnlock() - return t.stats -} - -func (t *dummyTransport) send(p *payload) (io.ReadCloser, error) { - traces, err := decode(p) - if err != nil { - return nil, err - } - t.Lock() - t.traces = append(t.traces, traces...) - t.Unlock() - ok := io.NopCloser(strings.NewReader("OK")) - return ok, nil -} - -func (t *dummyTransport) endpoint() string { - return "http://localhost:9/v0.4/traces" -} - -func decode(p *payload) (spanLists, error) { - var traces spanLists - err := msgp.Decode(p, &traces) - return traces, err -} - -func encode(traces [][]*span) (*payload, error) { - p := newPayload() - for _, t := range traces { - if err := p.push(t); err != nil { - return p, err - } - } - return p, nil -} - -func (t *dummyTransport) Reset() { - t.Lock() - t.traces = t.traces[:0] - t.Unlock() -} - -func (t *dummyTransport) Traces() spanLists { - t.Lock() - defer t.Unlock() - - traces := t.traces - t.traces = spanLists{} - return traces +// newTestConfig wraps newConfig to set a default HTTP client with keep-alives +// disabled. This is necessary to avoid goroutine leaks between tests, see +// TestMain. +func newTestConfig(opts ...StartOption) (*config, error) { + opts = append([]StartOption{WithHTTPClient(internal.DefaultHTTPClient(defaultHTTPTimeout, true))}, opts...) + return newConfig(opts...) } // comparePayloadSpans allows comparing two spans which might have been // read from the msgpack payload. In that case the private fields will // not be available and the maps (meta & metrics will be nil for lengths // of 0). This function covers for those cases and correctly compares. -func comparePayloadSpans(t *testing.T, a, b *span) { +func comparePayloadSpans(t *testing.T, a, b *Span) { assert.Equal(t, cpspan(a), cpspan(b)) } -func cpspan(s *span) *span { - if len(s.Metrics) == 0 { - s.Metrics = nil +func cpspan(s *Span) *Span { + if len(s.metrics) == 0 { + s.metrics = nil } - if len(s.Meta) == 0 { - s.Meta = nil + if len(s.meta) == 0 { + s.meta = nil } - return &span{ - Name: s.Name, - Service: s.Service, - Resource: s.Resource, - Type: s.Type, - Start: s.Start, - Duration: s.Duration, - Meta: s.Meta, - Metrics: s.Metrics, - SpanID: s.SpanID, - TraceID: s.TraceID, - ParentID: s.ParentID, - Error: s.Error, + return &Span{ + name: s.name, + service: s.service, + resource: s.resource, + spanType: s.spanType, + start: s.start, + duration: s.duration, + meta: s.meta, + metrics: s.metrics, + spanID: s.spanID, + traceID: s.traceID, + parentID: s.parentID, + error: s.error, } } type testTraceWriter struct { mu sync.RWMutex - buf []*span - flushed []*span + buf []*Span + flushed []*Span } func newTestTraceWriter() *testTraceWriter { return &testTraceWriter{ - buf: []*span{}, - flushed: []*span{}, + buf: []*Span{}, + flushed: []*Span{}, } } -func (w *testTraceWriter) add(spans []*span) { +func (w *testTraceWriter) add(spans []*Span) { w.mu.Lock() w.buf = append(w.buf, spans...) w.mu.Unlock() @@ -2321,31 +2457,34 @@ func (w *testTraceWriter) flush() { func (w *testTraceWriter) stop() {} // Buffered returns the spans buffered by the writer. -func (w *testTraceWriter) Buffered() []*span { +func (w *testTraceWriter) Buffered() []*Span { w.mu.RLock() defer w.mu.RUnlock() return w.buf } // Flushed returns the spans flushed by the writer. -func (w *testTraceWriter) Flushed() []*span { +func (w *testTraceWriter) Flushed() []*Span { w.mu.RLock() defer w.mu.RUnlock() return w.flushed } func TestFlush(t *testing.T) { - tr, _, _, stop := startTestTracer(t) + tr, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() tw := newTestTraceWriter() tr.traceWriter = tw ts := &statsdtest.TestStatsdClient{} + tr.statsd.Close() tr.statsd = ts transport := newDummyTransport() - c := newConcentrator(&config{transport: transport}, defaultStatsBucketSize) + c := newConcentrator(&config{transport: transport, env: "someEnv"}, defaultStatsBucketSize, &statsd.NoOpClientDirect{}) + tr.stats.Stop() tr.stats = c c.Start() defer c.Stop() @@ -2365,20 +2504,21 @@ loop: time.Sleep(time.Millisecond) } } - as := &aggregableSpan{ - key: aggregation{ - Name: "http.request", - }, + s := &Span{ + name: "http.request", // Start must be older than latest bucket to get flushed - Start: time.Now().UnixNano() - 3*defaultStatsBucketSize, - Duration: 1, + start: time.Now().UnixNano() - 3*defaultStatsBucketSize, + duration: 1, + metrics: map[string]float64{keyMeasured: 1}, } - c.add(as) + statSpan, ok := c.newTracerStatSpan(s, tr.obfuscator) + assert.True(t, ok) + c.add(statSpan) assert.Len(t, tw.Flushed(), 0) assert.Zero(t, ts.Flushed()) assert.Len(t, transport.Stats(), 0) - tr.flushSync() + tr.Flush() assert.Len(t, tw.Flushed(), 1) assert.Equal(t, 1, ts.Flushed()) assert.Len(t, transport.Stats(), 1) @@ -2429,10 +2569,11 @@ func TestUserMonitoring(t *testing.T) { {key: keyUserRole, value: role}, {key: keyUserSessionID, value: sessionID}, } - tr := newTracer() + tr, err := newTracer() defer tr.Stop() - internal.SetGlobalTracer(tr) - defer internal.SetGlobalTracer(&internal.NoopTracer{}) + assert.NoError(t, err) + setGlobalTracer(tr) + defer setGlobalTracer(&NoopTracer{}) t.Run("root", func(t *testing.T) { s := tr.newRootSpan("root", "test", "test") @@ -2440,7 +2581,7 @@ func TestUserMonitoring(t *testing.T) { WithUserRole(role), WithUserSessionID(sessionID)) s.Finish() for _, pair := range expected { - assert.Equal(t, pair.value, s.Meta[pair.key]) + assert.Equal(t, pair.value, s.meta[pair.key]) } }) @@ -2452,7 +2593,7 @@ func TestUserMonitoring(t *testing.T) { child.Finish() root.Finish() for _, pair := range expected { - assert.Equal(t, pair.value, root.Meta[pair.key]) + assert.Equal(t, pair.value, root.meta[pair.key]) } }) @@ -2460,19 +2601,19 @@ func TestUserMonitoring(t *testing.T) { s := tr.newRootSpan("root", "test", "test") SetUser(s, id, WithPropagation()) s.Finish() - assert.Equal(t, id, s.Meta[keyUserID]) + assert.Equal(t, id, s.meta[keyUserID]) encoded := base64.StdEncoding.EncodeToString([]byte(id)) assert.Equal(t, encoded, s.context.trace.propagatingTags[keyPropagatedUserID]) - assert.Equal(t, encoded, s.Meta[keyPropagatedUserID]) + assert.Equal(t, encoded, s.meta[keyPropagatedUserID]) }) t.Run("no-propagation", func(t *testing.T) { s := tr.newRootSpan("root", "test", "test") SetUser(s, id) s.Finish() - _, ok := s.Meta[keyUserID] + _, ok := s.meta[keyUserID] assert.True(t, ok) - _, ok = s.Meta[keyPropagatedUserID] + _, ok = s.meta[keyPropagatedUserID] assert.False(t, ok) _, ok = s.context.trace.propagatingTags[keyPropagatedUserID] assert.False(t, ok) @@ -2480,7 +2621,7 @@ func TestUserMonitoring(t *testing.T) { // This tests data races for trace.propagatingTags reads/writes through public API. // The Go data race detector should not complain when running the test with '-race'. - t.Run("data-race", func(t *testing.T) { + t.Run("data-race", func(_ *testing.T) { wg := &sync.WaitGroup{} wg.Add(2) @@ -2506,7 +2647,8 @@ func TestUserMonitoring(t *testing.T) { // BenchmarkTracerStackFrames tests the performance of taking stack trace. func BenchmarkTracerStackFrames(b *testing.B) { - tracer, _, _, stop := startTestTracer(b, WithSampler(NewRateSampler(0))) + tracer, _, _, stop, err := startTestTracer(b, WithSamplerRate(0)) + assert.Nil(b, err) defer stop() for n := 0; n < b.N; n++ { @@ -2517,9 +2659,9 @@ func BenchmarkTracerStackFrames(b *testing.B) { func BenchmarkSingleSpanRetention(b *testing.B) { b.Run("no-rules", func(b *testing.B) { - tracer, _, _, stop := startTestTracer(b) + tracer, _, _, stop, err := startTestTracer(b) + assert.Nil(b, err) defer stop() - tracer.config.agent.DropP0s = true tracer.config.featureFlags = make(map[string]struct{}) tracer.config.featureFlags["discovery"] = struct{}{} tracer.config.sampler = NewRateSampler(0) @@ -2527,7 +2669,7 @@ func BenchmarkSingleSpanRetention(b *testing.B) { tracer.config.serviceName = "test_service" b.ResetTimer() for i := 0; i < b.N; i++ { - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") for i := 0; i < 100; i++ { child := tracer.StartSpan("name_2", ChildOf(span.context)) child.Finish() @@ -2538,9 +2680,9 @@ func BenchmarkSingleSpanRetention(b *testing.B) { b.Run("with-rules/match-half", func(b *testing.B) { b.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"*_1", "sample_rate": 1.0, "max_per_second": 15.0}]`) - tracer, _, _, stop := startTestTracer(b) + tracer, _, _, stop, err := startTestTracer(b) + assert.Nil(b, err) defer stop() - tracer.config.agent.DropP0s = true tracer.config.featureFlags = make(map[string]struct{}) tracer.config.featureFlags["discovery"] = struct{}{} tracer.config.sampler = NewRateSampler(0) @@ -2548,7 +2690,7 @@ func BenchmarkSingleSpanRetention(b *testing.B) { tracer.config.serviceName = "test_service" b.ResetTimer() for i := 0; i < b.N; i++ { - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") for i := 0; i < 50; i++ { child := tracer.StartSpan("name_2", ChildOf(span.context)) child.Finish() @@ -2563,9 +2705,9 @@ func BenchmarkSingleSpanRetention(b *testing.B) { b.Run("with-rules/match-all", func(b *testing.B) { b.Setenv("DD_SPAN_SAMPLING_RULES", `[{"service": "test_*","name":"*_1", "sample_rate": 1.0, "max_per_second": 15.0}]`) - tracer, _, _, stop := startTestTracer(b) + tracer, _, _, stop, err := startTestTracer(b) + assert.Nil(b, err) defer stop() - tracer.config.agent.DropP0s = true tracer.config.featureFlags = make(map[string]struct{}) tracer.config.featureFlags["discovery"] = struct{}{} tracer.config.sampler = NewRateSampler(0) @@ -2573,7 +2715,7 @@ func BenchmarkSingleSpanRetention(b *testing.B) { tracer.config.serviceName = "test_service" b.ResetTimer() for i := 0; i < b.N; i++ { - span := tracer.StartSpan("name_1").(*span) + span := tracer.StartSpan("name_1") for i := 0; i < 100; i++ { child := tracer.StartSpan("name_2", ChildOf(span.context)) child.Finish() @@ -2595,22 +2737,206 @@ func TestExecutionTraceSpanTagged(t *testing.T) { // multiple times. defer rt.Stop() - tracer, _, _, stop := startTestTracer(t) + tracer, _, _, stop, err := startTestTracer(t) + assert.Nil(t, err) defer stop() - tracedSpan := tracer.StartSpan("traced").(*span) + tracedSpan := tracer.StartSpan("traced") tracedSpan.Finish() - partialSpan := tracer.StartSpan("partial").(*span) + partialSpan := tracer.StartSpan("partial") rt.Stop() partialSpan.Finish() - untracedSpan := tracer.StartSpan("untraced").(*span) + untracedSpan := tracer.StartSpan("untraced") untracedSpan.Finish() - assert.Equal(t, tracedSpan.Meta["go_execution_traced"], "yes") - assert.Equal(t, partialSpan.Meta["go_execution_traced"], "partial") - assert.NotContains(t, untracedSpan.Meta, "go_execution_traced") + assert.Equal(t, tracedSpan.meta["go_execution_traced"], "yes") + assert.Equal(t, partialSpan.meta["go_execution_traced"], "partial") + assert.NotContains(t, untracedSpan.meta, "go_execution_traced") +} + +func wasteA(d time.Duration) { + start := time.Now() + i := 0 + for start.Add(d).Before(time.Now()) { + _ = fmt.Sprintf("waste %d", i) + } +} + +func wasteB(d time.Duration) { + start := time.Now() + i := 0 + for start.Add(d).Before(time.Now()) { + _ = fmt.Sprintf("waste %d", i) + } +} + +func wasteC(d time.Duration) { + start := time.Now() + i := 0 + for start.Add(d).Before(time.Now()) { + _ = fmt.Sprintf("waste %d", i) + } +} + +func TestPprofLabels(t *testing.T) { + if err := Start( + WithProfilerCodeHotspots(false), + WithProfilerEndpoints(false), + ); err != nil { + t.Fatal(err) + } + defer Stop() + pprof.Do(context.Background(), pprof.Labels("foo", "bar"), func(ctx context.Context) { + wasteA(time.Second) + var span *Span + pprof.Do(ctx, pprof.Labels("foo", "baz"), func(ctx context.Context) { + span, _ = StartSpanFromContext(ctx, "myoperation") + wasteB(time.Second) + }) + span.Finish() + wasteC(time.Second) + }) +} + +func TestNoopTracerStartSpan(t *testing.T) { + r, w, err := os.Pipe() + if err != nil { + t.Fatalf("Failed to create pipe: %v", err) + } + + undo := log.UseLogger(customLogger{l: llog.New(w, "", llog.LstdFlags)}) + defer undo() + + log.SetLevel(log.LevelDebug) + defer log.SetLevel(log.LevelWarn) + + StartSpan("abcd") + + w.Close() + var buf bytes.Buffer + buf.ReadFrom(r) + + log := buf.String() + expected := "Tracer must be started before starting a span" + assert.Contains(t, log, expected) +} + +type customLogger struct{ l *llog.Logger } + +func (c customLogger) Log(msg string) { + c.l.Print(msg) +} + +// TestEmptyChunksNotSent verifies that empty trace chunks are not +// sent to the trace writer when P0 dropping and stats computation are enabled. +func TestEmptyChunksNotSent(t *testing.T) { + assert := assert.New(t) + + // Use the same setup as the working "dropped_stats" test but add stats computation + tracer, transport, _, stop, err := startTestTracer(t, WithStatsComputation(true)) + assert.NoError(err) + defer stop() + + tracer.config.statsComputationEnabled = true + tracer.prioritySampling.defaultRate = 0 + tracer.config.serviceName = "test_service" + + span := tracer.StartSpan("name_1") + child := tracer.StartSpan("name_2", ChildOf(span.Context())) + child.Finish() + span.Finish() + + tracer.Flush() + + traces := transport.Traces() + assert.Empty(traces, "No traces should be sent when all spans are dropped") + + assert.Equal(decisionNone, span.context.trace.samplingDecision) +} + +func TestPPROFLabelRootSpanRace(t *testing.T) { + tracer, _, _, stop, err := startTestTracer(t) + assert.NoError(t, err) + defer stop() + parent := tracer.StartSpan("parent") + var wg sync.WaitGroup + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < 1000; i++ { + tracer.StartSpan("child", ChildOf(parent.Context())) + } + }() + wg.Add(1) + go func() { + defer wg.Done() + for i := 0; i < 1000; i++ { + parent.SetTag(ext.ResourceName, "x") + } + }() + wg.Wait() +} + +func TestExecTraceLargeTaskNameRegression(t *testing.T) { + if rt.IsEnabled() { + t.Skip("execution tracing is already enabled") + } + rt.Start(io.Discard) + defer rt.Stop() + + Start() + defer Stop() + + // Create a string big enough that in practice the execution tracer will + // crash if we try to use it as a task name + var b strings.Builder + for range 160000 { + b.WriteByte('a') + } + + s := StartSpan("test", ResourceName(b.String())) + s.Finish() +} + +// Test a v2 regression where the global service name is removed if the tracer is started more than once. +func TestTracerStartMultipleTimesGlobalService(t *testing.T) { + prev := globalconfig.ServiceName() + t.Cleanup(func() { + globalconfig.SetServiceName(prev) + }) + + err := Start() + require.NoError(t, err) + defer Stop() + + err = Start(WithService("global_service")) + require.NoError(t, err) + + assert.Equal(t, "global_service", globalconfig.ServiceName()) +} + +func TestNewUnstartedTracerDDAgentHostNotFound(t *testing.T) { + t.Setenv("DD_AGENT_HOST", "ddapm-test-agent-c07208") + _, err := newUnstartedTracer() + assert.NoError(t, err) +} + +func TestTracerTwiceStartRuntimeMetrics(t *testing.T) { + // This checks that starting the tracer twice properly shuts down the + // previous tracer, specifically the runtime metrics emitter. + tp := new(log.RecordLogger) + err := Start(WithLogger(tp)) + require.NoError(t, err) + err = Start(WithLogger(tp)) + require.NoError(t, err) + Stop() + + // Check that runtime metrics emitters lifetimes did not overlap. + for _, logMsg := range tp.Logs() { + assert.NotContains(t, logMsg, "runtimemetrics has already been started") + } } diff --git a/ddtrace/tracer/transport.go b/ddtrace/tracer/transport.go index c6a900c055..52e743dbd7 100644 --- a/ddtrace/tracer/transport.go +++ b/ddtrace/tracer/transport.go @@ -9,17 +9,17 @@ import ( "bytes" "fmt" "io" - "net" "net/http" "runtime" "strconv" "strings" - "sync/atomic" "time" - traceinternal "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/internal/tracerstats" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/tinylib/msgp/msgp" ) @@ -30,45 +30,28 @@ const ( headerComputedTopLevel = "Datadog-Client-Computed-Top-Level" ) -var defaultDialer = &net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, -} - -func defaultHTTPClient(timeout time.Duration) *http.Client { - if timeout == 0 { - timeout = defaultHTTPTimeout - } - return &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: defaultDialer.DialContext, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - }, - Timeout: timeout, - } -} - const ( - defaultHostname = "localhost" - defaultPort = "8126" - defaultAddress = defaultHostname + ":" + defaultPort - defaultURL = "http://" + defaultAddress - defaultHTTPTimeout = 10 * time.Second // defines the current timeout before giving up with the send process - traceCountHeader = "X-Datadog-Trace-Count" // header containing the number of traces in the payload + defaultHostname = "localhost" + defaultPort = "8126" + defaultAddress = defaultHostname + ":" + defaultPort + defaultURL = "http://" + defaultAddress + defaultHTTPTimeout = 10 * time.Second // defines the current timeout before giving up with the send process + traceCountHeader = "X-Datadog-Trace-Count" // header containing the number of traces in the payload + obfuscationVersionHeader = "Datadog-Obfuscation-Version" // header containing the version of obfuscation used, if any + + tracesAPIPath = "/v0.4/traces" + tracesAPIPathV1 = "/v1.0/traces" + statsAPIPath = "/v0.6/stats" ) // transport is an interface for communicating data to the agent. type transport interface { // send sends the payload p to the agent using the transport set up. // It returns a non-nil response body when no error occurred. - send(p *payload) (body io.ReadCloser, err error) + send(p payload) (body io.ReadCloser, err error) // sendStats sends the given stats payload to the agent. - sendStats(s *statsPayload) error + // tracerObfuscationVersion is the version of obfuscation applied (0 if none was applied) + sendStats(s *pb.ClientStatsPayload, tracerObfuscationVersion int) error // endpoint returns the URL to which the transport will send traces. endpoint() string } @@ -102,15 +85,18 @@ func newHTTPTransport(url string, client *http.Client) *httpTransport { if eid := internal.EntityID(); eid != "" { defaultHeaders["Datadog-Entity-ID"] = eid } + if extEnv := internal.ExternalEnvironment(); extEnv != "" { + defaultHeaders["Datadog-External-Env"] = extEnv + } return &httpTransport{ - traceURL: fmt.Sprintf("%s/v0.4/traces", url), - statsURL: fmt.Sprintf("%s/v0.6/stats", url), + traceURL: fmt.Sprintf("%s%s", url, tracesAPIPath), + statsURL: fmt.Sprintf("%s%s", url, statsAPIPath), client: client, headers: defaultHeaders, } } -func (t *httpTransport) sendStats(p *statsPayload) error { +func (t *httpTransport) sendStats(p *pb.ClientStatsPayload, tracerObfuscationVersion int) error { var buf bytes.Buffer if err := msgp.Encode(&buf, p); err != nil { return err @@ -119,11 +105,20 @@ func (t *httpTransport) sendStats(p *statsPayload) error { if err != nil { return err } + for header, value := range t.headers { + req.Header.Set(header, value) + } + if tracerObfuscationVersion > 0 { + req.Header.Set(obfuscationVersionHeader, strconv.Itoa(tracerObfuscationVersion)) + } resp, err := t.client.Do(req) if err != nil { + reportAPIErrorsMetric(resp, err, statsAPIPath) return err } + defer resp.Body.Close() if code := resp.StatusCode; code >= 400 { + reportAPIErrorsMetric(resp, err, statsAPIPath) // error, check the body for context information and // return a nice error. msg := make([]byte, 1000) @@ -138,37 +133,45 @@ func (t *httpTransport) sendStats(p *statsPayload) error { return nil } -func (t *httpTransport) send(p *payload) (body io.ReadCloser, err error) { +func (t *httpTransport) send(p payload) (body io.ReadCloser, err error) { req, err := http.NewRequest("POST", t.traceURL, p) if err != nil { - return nil, fmt.Errorf("cannot create http request: %v", err) + return nil, fmt.Errorf("cannot create http request: %s", err) } + stats := p.stats() + req.ContentLength = int64(stats.size) for header, value := range t.headers { req.Header.Set(header, value) } - req.Header.Set(traceCountHeader, strconv.Itoa(p.itemCount())) - req.Header.Set("Content-Length", strconv.Itoa(p.size())) + req.Header.Set(traceCountHeader, strconv.Itoa(stats.itemCount)) req.Header.Set(headerComputedTopLevel, "yes") - if t, ok := traceinternal.GetGlobalTracer().(*tracer); ok { - if t.config.canComputeStats() { + if t := getGlobalTracer(); t != nil { + tc := t.TracerConf() + if tc.TracingAsTransport || tc.CanComputeStats { + // tracingAsTransport uses this header to disable the trace agent's stats computation + // while making canComputeStats() always false to also disable client stats computation. req.Header.Set("Datadog-Client-Computed-Stats", "yes") } - droppedTraces := int(atomic.SwapUint32(&t.droppedP0Traces, 0)) - partialTraces := int(atomic.SwapUint32(&t.partialTraces, 0)) - droppedSpans := int(atomic.SwapUint32(&t.droppedP0Spans, 0)) - if stats := t.statsd; stats != nil { - stats.Count("datadog.tracer.dropped_p0_traces", int64(droppedTraces), - []string{fmt.Sprintf("partial:%s", strconv.FormatBool(partialTraces > 0))}, 1) - stats.Count("datadog.tracer.dropped_p0_spans", int64(droppedSpans), nil, 1) + droppedTraces := int(tracerstats.Count(tracerstats.AgentDroppedP0Traces)) + partialTraces := int(tracerstats.Count(tracerstats.PartialTraces)) + droppedSpans := int(tracerstats.Count(tracerstats.AgentDroppedP0Spans)) + if tt, ok := t.(*tracer); ok { + if stats := tt.statsd; stats != nil { + stats.Count("datadog.tracer.dropped_p0_traces", int64(droppedTraces), + []string{fmt.Sprintf("partial:%s", strconv.FormatBool(partialTraces > 0))}, 1) + stats.Count("datadog.tracer.dropped_p0_spans", int64(droppedSpans), nil, 1) + } } req.Header.Set("Datadog-Client-Dropped-P0-Traces", strconv.Itoa(droppedTraces)) req.Header.Set("Datadog-Client-Dropped-P0-Spans", strconv.Itoa(droppedSpans)) } response, err := t.client.Do(req) if err != nil { + reportAPIErrorsMetric(response, err, tracesAPIPath) return nil, err } if code := response.StatusCode; code >= 400 { + reportAPIErrorsMetric(response, err, tracesAPIPath) // error, check the body for context information and // return a nice error. msg := make([]byte, 1000) @@ -183,6 +186,22 @@ func (t *httpTransport) send(p *payload) (body io.ReadCloser, err error) { return response.Body, nil } +func reportAPIErrorsMetric(response *http.Response, err error, endpoint string) { + if t, ok := getGlobalTracer().(*tracer); ok { + var reason string + if err != nil { + reason = "network_failure" + } + if response != nil { + reason = fmt.Sprintf("server_response_%d", response.StatusCode) + } + tags := []string{"reason:" + reason, "endpoint:" + endpoint} + t.statsd.Incr("datadog.tracer.api.errors", tags, 1) + } else { + return + } +} + func (t *httpTransport) endpoint() string { return t.traceURL } diff --git a/ddtrace/tracer/transport_bench_test.go b/ddtrace/tracer/transport_bench_test.go new file mode 100644 index 0000000000..97d6ec2108 --- /dev/null +++ b/ddtrace/tracer/transport_bench_test.go @@ -0,0 +1,103 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +import ( + "fmt" + "net/http" + "net/http/httptest" + "strings" + "sync" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal" +) + +func BenchmarkHTTPTransportSend(b *testing.B) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"rate_by_service":{}}`)) + })) + defer server.Close() + + transport := newHTTPTransport(server.URL, internal.DefaultHTTPClient(5*time.Second, false)) + + payloadSizes := []struct { + name string + numSpans int + spanSize int + }{ + {"small_1span", 1, 1}, + {"medium_10spans", 10, 1}, + {"large_100spans", 100, 1}, + {"xlarge_1000spans", 1000, 1}, + } + + for _, size := range payloadSizes { + b.Run(size.name, func(b *testing.B) { + payload := newPayload(traceProtocolV04) + spans := make([]*Span, size.numSpans) + for i := 0; i < size.numSpans; i++ { + span := newBasicSpan("transport-test") + span.meta["data"] = strings.Repeat("x", size.spanSize*1024) + spans[i] = span + } + _, _ = payload.push(spans) + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + payload.reset() + rc, err := transport.send(payload) + if err == nil { + rc.Close() + } + } + }) + } +} + +func BenchmarkTransportSendConcurrent(b *testing.B) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"rate_by_service":{}}`)) + })) + defer server.Close() + + transport := newHTTPTransport(server.URL, internal.DefaultHTTPClient(5*time.Second, false)) + concurrencyLevels := []int{1, 2, 4, 8} + + for _, concurrency := range concurrencyLevels { + b.Run(fmt.Sprintf("concurrency_%d", concurrency), func(b *testing.B) { + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + var wg sync.WaitGroup + + for j := 0; j < concurrency; j++ { + wg.Add(1) + go func() { + defer wg.Done() + + payload := newPayload(traceProtocolV04) + spans := []*Span{newBasicSpan("concurrent-transport-test")} + _, _ = payload.push(spans) + + rc, err := transport.send(payload) + if err == nil { + rc.Close() + } + }() + } + + wg.Wait() + } + }) + } +} diff --git a/ddtrace/tracer/transport_test.go b/ddtrace/tracer/transport_test.go index aaaddbbacf..bcba363997 100644 --- a/ddtrace/tracer/transport_test.go +++ b/ddtrace/tracer/transport_test.go @@ -18,36 +18,39 @@ import ( "strings" "testing" + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gopkg.in/DataDog/dd-trace-go.v1/internal" ) // getTestSpan returns a Span with different fields set -func getTestSpan() *span { - return &span{ - TraceID: 42, - SpanID: 52, - ParentID: 42, - Type: "web", - Service: "high.throughput", - Name: "sending.events", - Resource: "SEND /data", - Start: 1481215590883401105, - Duration: 1000000000, - Meta: map[string]string{"http.host": "192.168.0.1"}, - MetaStruct: map[string]any{"_dd.appsec.json": map[string]any{"triggers": []any{map[string]any{"id": "1"}}}}, - Metrics: map[string]float64{"http.monitor": 41.99}, +func getTestSpan() *Span { + return &Span{ + traceID: 42, + spanID: 52, + parentID: 42, + spanType: "web", + service: "high.throughput", + name: "sending.events", + resource: "SEND /data", + start: 1481215590883401105, + duration: 1000000000, + meta: map[string]string{"http.host": "192.168.0.1"}, + metaStruct: map[string]any{"_dd.appsec.json": map[string]any{"triggers": []any{map[string]any{"id": "1"}}}}, + metrics: map[string]float64{"http.monitor": 41.99}, } } // getTestTrace returns a list of traces that is composed by “traceN“ number // of traces, each one composed by “size“ number of spans. -func getTestTrace(traceN, size int) [][]*span { - var traces [][]*span +func getTestTrace(traceN, size int) [][]*Span { + var traces [][]*Span for i := 0; i < traceN; i++ { - trace := []*span{} + trace := []*Span{} for j := 0; j < size; j++ { trace = append(trace, getTestSpan()) } @@ -56,6 +59,16 @@ func getTestTrace(traceN, size int) [][]*span { return traces } +func encode(traces [][]*Span) (payload, error) { + p := newPayload(traceProtocolV04) + for _, t := range traces { + if _, err := p.push(t); err != nil { + return p, err + } + } + return p, nil +} + func TestTracesAgentIntegration(t *testing.T) { if !integration { t.Skip("to enable integration test, set the INTEGRATION environment variable") @@ -63,7 +76,7 @@ func TestTracesAgentIntegration(t *testing.T) { assert := assert.New(t) testCases := []struct { - payload [][]*span + payload [][]*Span }{ {getTestTrace(1, 1)}, {getTestTrace(10, 1)}, @@ -72,11 +85,12 @@ func TestTracesAgentIntegration(t *testing.T) { } for _, tc := range testCases { - transport := newHTTPTransport(defaultURL, defaultHTTPClient(0)) + transport := newHTTPTransport(defaultURL, internal.DefaultHTTPClient(defaultHTTPTimeout, false)) p, err := encode(tc.payload) assert.NoError(err) - _, err = transport.send(p) + body, err := transport.send(p) assert.NoError(err) + defer body.Close() } } @@ -140,16 +154,13 @@ func TestTransportResponse(t *testing.T) { } { t.Run(name, func(t *testing.T) { assert := assert.New(t) - ln, err := net.Listen("tcp4", "localhost:0") - assert.Nil(err) - go http.Serve(ln, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(tt.status) w.Write([]byte(tt.body)) })) - defer ln.Close() - url := "http://" + ln.Addr().String() - transport := newHTTPTransport(url, defaultHTTPClient(0)) - rc, err := transport.send(newPayload()) + defer srv.Close() + transport := newHTTPTransport(srv.URL, internal.DefaultHTTPClient(defaultHTTPTimeout, false)) + rc, err := transport.send(newPayload(traceProtocolV04)) if tt.err != "" { assert.Equal(tt.err, err.Error()) return @@ -167,7 +178,7 @@ func TestTraceCountHeader(t *testing.T) { assert := assert.New(t) testCases := []struct { - payload [][]*span + payload [][]*Span }{ {getTestTrace(1, 1)}, {getTestTrace(10, 1)}, @@ -175,7 +186,7 @@ func TestTraceCountHeader(t *testing.T) { } var hits int - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { hits++ if r.URL.Path == "/info" { return @@ -188,7 +199,7 @@ func TestTraceCountHeader(t *testing.T) { })) defer srv.Close() for _, tc := range testCases { - transport := newHTTPTransport(srv.URL, defaultHTTPClient(0)) + transport := newHTTPTransport(srv.URL, internal.DefaultHTTPClient(defaultHTTPTimeout, false)) p, err := encode(tc.payload) assert.NoError(err) _, err = transport.send(p) @@ -223,7 +234,7 @@ func TestCustomTransport(t *testing.T) { assert := assert.New(t) var hits int - srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { hits++ })) defer srv.Close() @@ -241,6 +252,130 @@ func TestCustomTransport(t *testing.T) { assert.Equal(hits, 1) } +type ErrTransport struct{} + +func (t *ErrTransport) RoundTrip(_ *http.Request) (*http.Response, error) { + return nil, fmt.Errorf("error in RoundTripper") +} + +type ErrResponseTransport struct{} + +func (t *ErrResponseTransport) RoundTrip(_ *http.Request) (*http.Response, error) { + return &http.Response{StatusCode: 400}, nil +} + +type OkTransport struct{} + +func (t *OkTransport) RoundTrip(_ *http.Request) (*http.Response, error) { + return &http.Response{StatusCode: 200}, nil +} + +func TestApiErrorsMetric(t *testing.T) { + t.Run("traces error", func(t *testing.T) { + assert := assert.New(t) + c := &http.Client{ + Transport: &ErrTransport{}, + } + var tg statsdtest.TestStatsdClient + trc, err := newTracer(WithHTTPClient(c), withStatsdClient(&tg)) + assert.NoError(err) + setGlobalTracer(trc) + defer trc.Stop() + + p, err := encode(getTestTrace(1, 1)) + assert.NoError(err) + + // We're expecting an error + _, err = trc.config.transport.send(p) + assert.Error(err) + calls := statsdtest.FilterCallsByName(tg.IncrCalls(), "datadog.tracer.api.errors") + assert.Len(calls, 1) + call := calls[0] + assert.Equal([]string{"reason:network_failure", "endpoint:" + tracesAPIPath}, call.Tags()) + + }) + t.Run("traces response with err code", func(t *testing.T) { + assert := assert.New(t) + c := &http.Client{ + Transport: &ErrResponseTransport{}, + } + var tg statsdtest.TestStatsdClient + trc, err := newTracer(WithHTTPClient(c), withStatsdClient(&tg)) + assert.NoError(err) + setGlobalTracer(trc) + defer trc.Stop() + + p, err := encode(getTestTrace(1, 1)) + assert.NoError(err) + + _, err = trc.config.transport.send(p) + assert.Error(err) + + calls := statsdtest.FilterCallsByName(tg.IncrCalls(), "datadog.tracer.api.errors") + assert.Len(calls, 1) + call := calls[0] + assert.Equal([]string{"reason:server_response_400", "endpoint:" + tracesAPIPath}, call.Tags()) + }) + t.Run("stats error", func(t *testing.T) { + assert := assert.New(t) + c := &http.Client{ + Transport: &ErrTransport{}, + } + var tg statsdtest.TestStatsdClient + trc, err := newTracer(WithHTTPClient(c), withStatsdClient(&tg)) + assert.NoError(err) + setGlobalTracer(trc) + defer trc.Stop() + + // We're expecting an error + err = trc.config.transport.sendStats(&pb.ClientStatsPayload{}, 1) + assert.Error(err) + calls := statsdtest.FilterCallsByName(tg.IncrCalls(), "datadog.tracer.api.errors") + assert.Len(calls, 1) + call := calls[0] + assert.Equal([]string{"reason:network_failure", "endpoint:" + statsAPIPath}, call.Tags()) + }) + t.Run("stats response with err code", func(t *testing.T) { + assert := assert.New(t) + c := &http.Client{ + Transport: &ErrResponseTransport{}, + } + var tg statsdtest.TestStatsdClient + trc, err := newTracer(WithHTTPClient(c), withStatsdClient(&tg)) + assert.NoError(err) + setGlobalTracer(trc) + defer trc.Stop() + + err = trc.config.transport.sendStats(&pb.ClientStatsPayload{}, 1) + assert.Error(err) + + calls := statsdtest.FilterCallsByName(tg.IncrCalls(), "datadog.tracer.api.errors") + assert.Len(calls, 1) + call := calls[0] + assert.Equal([]string{"reason:server_response_400", "endpoint:" + statsAPIPath}, call.Tags()) + }) + t.Run("successful send - no metric", func(t *testing.T) { + assert := assert.New(t) + var tg statsdtest.TestStatsdClient + c := &http.Client{ + Transport: &OkTransport{}, + } + trc, err := newTracer(WithHTTPClient(c), withStatsdClient(&tg)) + assert.NoError(err) + setGlobalTracer(trc) + defer trc.Stop() + + p, err := encode(getTestTrace(1, 1)) + assert.NoError(err) + + _, err = trc.config.transport.send(p) + assert.NoError(err) + + calls := statsdtest.FilterCallsByName(tg.IncrCalls(), "datadog.tracer.api.errors") + assert.Len(calls, 0) + }) +} + func TestWithHTTPClient(t *testing.T) { // disable instrumentation telemetry to prevent flaky number of requests t.Setenv("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "false") @@ -249,6 +384,11 @@ func TestWithHTTPClient(t *testing.T) { var hits int srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { hits++ + if r.Method == http.MethodGet { + return + } + cl := r.Header.Get("Content-Length") + assert.NotZero(cl) })) defer srv.Close() @@ -256,8 +396,9 @@ func TestWithHTTPClient(t *testing.T) { assert.NoError(err) c := &http.Client{} rt := wrapRecordingRoundTripper(c) - trc := newTracer(WithAgentTimeout(2), WithAgentAddr(u.Host), WithHTTPClient(c)) + trc, err := newTracer(WithAgentTimeout(2), WithAgentAddr(u.Host), WithHTTPClient(c)) defer trc.Stop() + assert.NoError(err) p, err := encode(getTestTrace(1, 1)) assert.NoError(err) @@ -266,6 +407,7 @@ func TestWithHTTPClient(t *testing.T) { assert.Len(rt.reqs, 2) assert.Contains(rt.reqs[0].URL.Path, "/info") assert.Contains(rt.reqs[1].URL.Path, "/traces") + assert.NotZero(rt.reqs[1].ContentLength) assert.Equal(hits, 2) } @@ -285,23 +427,85 @@ func TestWithUDS(t *testing.T) { t.Fatal(err) } var hits int - srv := http.Server{Handler: http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + srv := http.Server{Handler: http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { hits++ })} go srv.Serve(unixListener) defer srv.Close() - trc := newTracer(WithUDS(udsPath)) + trc, err := newTracer(WithUDS(udsPath)) rt := wrapRecordingRoundTripper(trc.config.httpClient) defer trc.Stop() + assert.NoError(err) p, err := encode(getTestTrace(1, 1)) assert.NoError(err) - _, err = trc.config.transport.send(p) + body, err := trc.config.transport.send(p) assert.NoError(err) + defer body.Close() // There are 2 requests, but one happens on tracer startup before we wrap the round tripper. // This is OK for this test, since we just want to check that WithUDS allows communication // between a server and client over UDS. hits tells us that there were 2 requests received. assert.Len(rt.reqs, 1) assert.Equal(hits, 2) } + +func TestExternalEnvironment(t *testing.T) { + t.Setenv("DD_EXTERNAL_ENV", "it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759") + assert := assert.New(t) + found := false + srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + extEnv := r.Header.Get("Datadog-External-Env") + if extEnv == "" { + return + } + assert.Equal("it-false,cn-nginx-webserver,pu-75a2b6d5-3949-4afb-ad0d-92ff0674e759", extEnv) + found = true + })) + defer srv.Close() + + u, err := url.Parse(srv.URL) + assert.NoError(err) + c := &http.Client{} + trc, err := newTracer(WithAgentTimeout(2), WithAgentAddr(u.Host), WithHTTPClient(c)) + assert.NoError(err) + defer trc.Stop() + + p, err := encode(getTestTrace(1, 1)) + assert.NoError(err) + _, err = trc.config.transport.send(p) + assert.NoError(err) + assert.True(found) +} + +func TestDefaultHeaders(t *testing.T) { + assert := assert.New(t) + srv := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + if r.URL.Path == "/info" { + return + } + assert.Equal(r.Header.Get("Datadog-Meta-Lang"), "go") + assert.NotEqual(r.Header.Get("Datadog-Meta-Lang-Version"), "") + assert.NotEqual(r.Header.Get("Datadog-Meta-Lang-Interpreter"), "") + assert.NotEqual(r.Header.Get("Datadog-Meta-Tracer-Version"), "") + assert.Equal(r.Header.Get("Content-Type"), "application/msgpack") + })) + defer srv.Close() + + u, err := url.Parse(srv.URL) + assert.NoError(err) + c := &http.Client{} + trc, err := newTracer(WithAgentTimeout(2), WithAgentAddr(u.Host), WithHTTPClient(c)) + assert.NoError(err) + defer trc.Stop() + + // Test traces endpoint + p, err := encode(getTestTrace(1, 1)) + assert.NoError(err) + _, err = trc.config.transport.send(p) + assert.NoError(err) + + // Now stats endpoint + err = trc.config.transport.sendStats(&pb.ClientStatsPayload{}, 1) + assert.NoError(err) +} diff --git a/ddtrace/tracer/util.go b/ddtrace/tracer/util.go index bd3c03a845..ac8402b7d3 100644 --- a/ddtrace/tracer/util.go +++ b/ddtrace/tracer/util.go @@ -10,56 +10,9 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" ) -// toFloat64 attempts to convert value into a float64. If the value is an integer -// greater or equal to 2^53 or less than or equal to -2^53, it will not be converted -// into a float64 to avoid losing precision. If it succeeds in converting, toFloat64 -// returns the value and true, otherwise 0 and false. -func toFloat64(value interface{}) (f float64, ok bool) { - const max = (int64(1) << 53) - 1 - const min = -max - // If any other type is added here, remember to add it to the type switch in - // the `span.SetTag` function to handle pointers to these supported types. - switch i := value.(type) { - case byte: - return float64(i), true - case float32: - return float64(i), true - case float64: - return i, true - case int: - return float64(i), true - case int8: - return float64(i), true - case int16: - return float64(i), true - case int32: - return float64(i), true - case int64: - if i > max || i < min { - return 0, false - } - return float64(i), true - case uint: - return float64(i), true - case uint16: - return float64(i), true - case uint32: - return float64(i), true - case uint64: - if i > uint64(max) { - return 0, false - } - return float64(i), true - case samplernames.SamplerName: - return float64(i), true - default: - return 0, false - } -} - // parseUint64 parses a uint64 from either an unsigned 64 bit base-10 string // or a signed 64 bit base-10 string representing an unsigned integer func parseUint64(str string) (uint64, error) { @@ -128,38 +81,37 @@ func parsePropagatableTraceTags(s string) (map[string]string, error) { func dereference(value any) any { // Falling into one of the cases will dereference the pointer and return the // value of the pointer. It adds one allocation due to casting. - switch value.(type) { + switch v := value.(type) { case *bool: - return dereferenceGeneric(value.(*bool)) + return dereferenceGeneric(v) case *string: - return dereferenceGeneric(value.(*string)) + return dereferenceGeneric(v) // Supported type by toFloat64 case *byte: - return dereferenceGeneric(value.(*byte)) + return dereferenceGeneric(v) case *float32: - return dereferenceGeneric(value.(*float32)) + return dereferenceGeneric(v) case *float64: - return dereferenceGeneric(value.(*float64)) + return dereferenceGeneric(v) case *int: - return dereferenceGeneric(value.(*int)) + return dereferenceGeneric(v) case *int8: - return dereferenceGeneric(value.(*int8)) + return dereferenceGeneric(v) case *int16: - return dereferenceGeneric(value.(*int16)) + return dereferenceGeneric(v) case *int32: - return dereferenceGeneric(value.(*int32)) + return dereferenceGeneric(v) case *int64: - return dereferenceGeneric(value.(*int64)) + return dereferenceGeneric(v) case *uint: - return dereferenceGeneric(value.(*uint)) + return dereferenceGeneric(v) case *uint16: - return dereferenceGeneric(value.(*uint16)) + return dereferenceGeneric(v) case *uint32: - return dereferenceGeneric(value.(*uint32)) + return dereferenceGeneric(v) case *uint64: - return dereferenceGeneric(value.(*uint64)) + return dereferenceGeneric(v) case *samplernames.SamplerName: - v := value.(*samplernames.SamplerName) if v == nil { return samplernames.Unknown } diff --git a/ddtrace/tracer/util_test.go b/ddtrace/tracer/util_test.go index 9690430ff2..b48bfdd236 100644 --- a/ddtrace/tracer/util_test.go +++ b/ddtrace/tracer/util_test.go @@ -10,49 +10,10 @@ import ( "math" "testing" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" "github.com/stretchr/testify/assert" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" ) -func TestToFloat64(t *testing.T) { - for i, tt := range [...]struct { - value interface{} - f float64 - ok bool - }{ - 0: {1, 1, true}, - 1: {byte(1), 1, true}, - 2: {int(1), 1, true}, - 3: {int16(1), 1, true}, - 4: {int32(1), 1, true}, - 5: {int64(1), 1, true}, - 6: {uint(1), 1, true}, - 7: {uint16(1), 1, true}, - 8: {uint32(1), 1, true}, - 9: {uint64(1), 1, true}, - 10: {"a", 0, false}, - 11: {float32(1.25), 1.25, true}, - 12: {float64(1.25), 1.25, true}, - 13: {intUpperLimit, 0, false}, - 14: {intUpperLimit + 1, 0, false}, - 15: {intUpperLimit - 1, float64(intUpperLimit - 1), true}, - 16: {intLowerLimit, 0, false}, - 17: {intLowerLimit - 1, 0, false}, - 18: {intLowerLimit + 1, float64(intLowerLimit + 1), true}, - 19: {-1024, -1024.0, true}, - } { - t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { - f, ok := toFloat64(tt.value) - if ok != tt.ok { - t.Fatalf("expected ok: %t", tt.ok) - } - if f != tt.f { - t.Fatalf("expected: %#v, got: %#v", tt.f, f) - } - }) - } -} - func TestParseUint64(t *testing.T) { t.Run("negative", func(t *testing.T) { id, err := parseUint64("-8809075535603237910") diff --git a/ddtrace/tracer/writer.go b/ddtrace/tracer/writer.go index 04d9c25d98..ea5c1c55b6 100644 --- a/ddtrace/tracer/writer.go +++ b/ddtrace/tracer/writer.go @@ -14,15 +14,16 @@ import ( "os" "strconv" "sync" + "sync/atomic" "time" - globalinternal "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + globalinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) type traceWriter interface { // add adds traces to be sent by the writer. - add([]*span) + add([]*Span) // flush causes the writer to send any buffered traces. flush() @@ -35,8 +36,11 @@ type agentTraceWriter struct { // config holds the tracer configuration config *config + // mu synchronizes access to payload operations + mu sync.Mutex + // payload encodes and buffers traces in msgpack format - payload *payload + payload payload // climit limits the number of concurrent outgoing connections climit chan struct{} @@ -50,24 +54,37 @@ type agentTraceWriter struct { // statsd is used to send metrics statsd globalinternal.StatsdClient + + tracesQueued uint32 } func newAgentTraceWriter(c *config, s *prioritySampler, statsdClient globalinternal.StatsdClient) *agentTraceWriter { - return &agentTraceWriter{ + tw := &agentTraceWriter{ config: c, - payload: newPayload(), climit: make(chan struct{}, concurrentConnectionLimit), prioritySampling: s, statsd: statsdClient, } + tw.payload = tw.newPayload() + return tw } -func (h *agentTraceWriter) add(trace []*span) { - if err := h.payload.push(trace); err != nil { +func (h *agentTraceWriter) add(trace []*Span) { + h.mu.Lock() + stats, err := h.payload.push(trace) + if err != nil { + h.mu.Unlock() h.statsd.Incr("datadog.tracer.traces_dropped", []string{"reason:encoding_error"}, 1) - log.Error("Error encoding msgpack: %v", err) + log.Error("Error encoding msgpack: %s", err.Error()) + return } - if h.payload.size() > payloadSizeLimit { + // TODO: This does not differentiate between complete traces and partial chunks + atomic.AddUint32(&h.tracesQueued, 1) + + needsFlush := stats.size > payloadSizeLimit + h.mu.Unlock() + + if needsFlush { h.statsd.Incr("datadog.tracer.flush_triggered", []string{"reason:size"}, 1) h.flush() } @@ -79,21 +96,32 @@ func (h *agentTraceWriter) stop() { h.wg.Wait() } +// newPayload returns a new payload based on the trace protocol. +func (h *agentTraceWriter) newPayload() payload { + return newPayload(h.config.traceProtocol) +} + // flush will push any currently buffered traces to the server. func (h *agentTraceWriter) flush() { - if h.payload.itemCount() == 0 { + h.mu.Lock() + oldp := h.payload + // Check after acquiring lock + if oldp.itemCount() == 0 { + h.mu.Unlock() return } - h.wg.Add(1) + h.payload = h.newPayload() + h.mu.Unlock() + h.climit <- struct{}{} - oldp := h.payload - h.payload = newPayload() - go func(p *payload) { + h.wg.Add(1) + go func(p payload) { defer func(start time.Time) { // Once the payload has been used, clear the buffer for garbage // collection to avoid a memory leak when references to this object // may still be kept by faulty transport implementations or the // standard library. See dd-trace-go#976 + h.statsd.Count("datadog.tracer.queue.enqueued.traces", int64(atomic.SwapUint32(&h.tracesQueued, 0)), nil, 1) p.clear() <-h.climit @@ -101,28 +129,30 @@ func (h *agentTraceWriter) flush() { h.wg.Done() }(time.Now()) - var count, size int + stats := p.stats() var err error for attempt := 0; attempt <= h.config.sendRetries; attempt++ { - size, count = p.size(), p.itemCount() - log.Debug("Sending payload: size: %d traces: %d\n", size, count) + log.Debug("Attempt to send payload: size: %d traces: %d\n", stats.size, stats.itemCount) var rc io.ReadCloser rc, err = h.config.transport.send(p) if err == nil { log.Debug("sent traces after %d attempts", attempt+1) - h.statsd.Count("datadog.tracer.flush_bytes", int64(size), nil, 1) - h.statsd.Count("datadog.tracer.flush_traces", int64(count), nil, 1) + h.statsd.Count("datadog.tracer.flush_bytes", int64(stats.size), nil, 1) + h.statsd.Count("datadog.tracer.flush_traces", int64(stats.itemCount), nil, 1) if err := h.prioritySampling.readRatesJSON(rc); err != nil { h.statsd.Incr("datadog.tracer.decode_error", nil, 1) } return } - log.Error("failure sending traces (attempt %d), will retry: %v", attempt+1, err) + + if attempt+1%5 == 0 { + log.Error("failure sending traces (attempt %d of %d): %v", attempt+1, h.config.sendRetries+1, err.Error()) + } p.reset() - time.Sleep(time.Millisecond) + time.Sleep(h.config.retryInterval) } - h.statsd.Count("datadog.tracer.traces_dropped", int64(count), []string{"reason:send_failed"}, 1) - log.Error("lost %d traces: %v", count, err) + h.statsd.Count("datadog.tracer.traces_dropped", int64(stats.itemCount), []string{"reason:send_failed"}, 1) + log.Error("lost %d traces: %v", stats.itemCount, err.Error()) }(oldp) } @@ -193,23 +223,23 @@ func encodeFloat(p []byte, f float64) []byte { return p } -func (h *logTraceWriter) encodeSpan(s *span) { +func (h *logTraceWriter) encodeSpan(s *Span) { var scratch [maxFloatLength]byte h.buf.WriteString(`{"trace_id":"`) - h.buf.Write(strconv.AppendUint(scratch[:0], uint64(s.TraceID), 16)) + h.buf.Write(strconv.AppendUint(scratch[:0], uint64(s.traceID), 16)) h.buf.WriteString(`","span_id":"`) - h.buf.Write(strconv.AppendUint(scratch[:0], uint64(s.SpanID), 16)) + h.buf.Write(strconv.AppendUint(scratch[:0], uint64(s.spanID), 16)) h.buf.WriteString(`","parent_id":"`) - h.buf.Write(strconv.AppendUint(scratch[:0], uint64(s.ParentID), 16)) + h.buf.Write(strconv.AppendUint(scratch[:0], uint64(s.parentID), 16)) h.buf.WriteString(`","name":`) - h.marshalString(s.Name) + h.marshalString(s.name) h.buf.WriteString(`,"resource":`) - h.marshalString(s.Resource) + h.marshalString(s.resource) h.buf.WriteString(`,"error":`) - h.buf.Write(strconv.AppendInt(scratch[:0], int64(s.Error), 10)) + h.buf.Write(strconv.AppendInt(scratch[:0], int64(s.error), 10)) h.buf.WriteString(`,"meta":{`) first := true - for k, v := range s.Meta { + for k, v := range s.meta { if first { first = false } else { @@ -220,7 +250,7 @@ func (h *logTraceWriter) encodeSpan(s *span) { h.marshalString(v) } // We cannot pack messagepack into JSON, so we need to marshal the meta struct as JSON, and send them through the `meta` field - for k, v := range s.MetaStruct { + for k, v := range s.metaStruct { if first { first = false } else { @@ -230,14 +260,14 @@ func (h *logTraceWriter) encodeSpan(s *span) { h.buf.WriteString(":") jsonValue, err := json.Marshal(v) if err != nil { - log.Error("Error marshaling value %q: %v", v, err) + log.Error("Error marshaling value %q: %v", v, err.Error()) continue } h.marshalString(string(jsonValue)) } h.buf.WriteString(`},"metrics":{`) first = true - for k, v := range s.Metrics { + for k, v := range s.metrics { if math.IsNaN(v) || math.IsInf(v, 0) { // The trace forwarder does not support infinity or nan, so we do not send metrics with those values. continue @@ -252,11 +282,11 @@ func (h *logTraceWriter) encodeSpan(s *span) { h.buf.Write(encodeFloat(scratch[:0], v)) } h.buf.WriteString(`},"start":`) - h.buf.Write(strconv.AppendInt(scratch[:0], s.Start, 10)) + h.buf.Write(strconv.AppendInt(scratch[:0], s.start, 10)) h.buf.WriteString(`,"duration":`) - h.buf.Write(strconv.AppendInt(scratch[:0], s.Duration, 10)) + h.buf.Write(strconv.AppendInt(scratch[:0], s.duration, 10)) h.buf.WriteString(`,"service":`) - h.marshalString(s.Service) + h.marshalString(s.service) h.buf.WriteString(`}`) } @@ -265,7 +295,7 @@ func (h *logTraceWriter) encodeSpan(s *span) { func (h *logTraceWriter) marshalString(str string) { m, err := json.Marshal(str) if err != nil { - log.Error("Error marshaling value %q: %v", str, err) + log.Error("Error marshaling value %q: %v", str, err.Error()) } else { h.buf.Write(m) } @@ -283,7 +313,7 @@ type encodingError struct { // from the trace can be retried. // An error, if one is returned, indicates that a span in the trace is too large // to fit in one buffer, and the trace cannot be written. -func (h *logTraceWriter) writeTrace(trace []*span) (n int, err *encodingError) { +func (h *logTraceWriter) writeTrace(trace []*Span) (n int, err *encodingError) { startn := h.buf.Len() if !h.hasTraces { h.buf.WriteByte('[') @@ -323,7 +353,7 @@ func (h *logTraceWriter) writeTrace(trace []*span) (n int, err *encodingError) { } // add adds a trace to the writer's buffer. -func (h *logTraceWriter) add(trace []*span) { +func (h *logTraceWriter) add(trace []*Span) { // Try adding traces to the buffer until we flush them all or encounter an error. for len(trace) > 0 { n, err := h.writeTrace(trace) diff --git a/ddtrace/tracer/writer_bench_test.go b/ddtrace/tracer/writer_bench_test.go new file mode 100644 index 0000000000..f8a5f65f28 --- /dev/null +++ b/ddtrace/tracer/writer_bench_test.go @@ -0,0 +1,123 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package tracer + +import ( + "fmt" + "sync" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" + "github.com/stretchr/testify/require" +) + +func BenchmarkAgentTraceWriterAdd(b *testing.B) { + traceSizes := []struct { + name string + numSpans int + }{ + {"1span", 1}, + {"5spans", 5}, + {"10spans", 10}, + {"50spans", 50}, + } + + for _, size := range traceSizes { + b.Run(size.name, func(b *testing.B) { + var statsd statsdtest.TestStatsdClient + cfg, err := newTestConfig() + require.NoError(b, err) + + writer := newAgentTraceWriter(cfg, nil, &statsd) + + trace := make([]*Span, size.numSpans) + for i := 0; i < size.numSpans; i++ { + trace[i] = newBasicSpan("benchmark-span") + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + writer.add(trace) + } + }) + } +} + +func BenchmarkAgentTraceWriterFlush(b *testing.B) { + var statsd statsdtest.TestStatsdClient + cfg, err := newTestConfig() + require.NoError(b, err) + + writer := newAgentTraceWriter(cfg, nil, &statsd) + trace := []*Span{newBasicSpan("flush-test")} + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + writer.add(trace) + writer.flush() + writer.wg.Wait() + } +} + +func BenchmarkAgentTraceWriterConcurrent(b *testing.B) { + concurrencyLevels := []int{1, 2, 4, 8} + + for _, concurrency := range concurrencyLevels { + b.Run(fmt.Sprintf("concurrency_%d", concurrency), func(b *testing.B) { + var statsd statsdtest.TestStatsdClient + cfg, err := newTestConfig() + require.NoError(b, err) + + writer := newAgentTraceWriter(cfg, nil, &statsd) + trace := []*Span{newBasicSpan("concurrent-test")} + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + var wg sync.WaitGroup + + for j := 0; j < concurrency; j++ { + wg.Add(1) + go func() { + defer wg.Done() + writer.add(trace) + }() + } + + wg.Wait() + } + }) + } +} + +func BenchmarkAgentTraceWriterStats(b *testing.B) { + var statsd statsdtest.TestStatsdClient + cfg, err := newTestConfig() + require.NoError(b, err) + + writer := newAgentTraceWriter(cfg, nil, &statsd) + + for i := 0; i < 10; i++ { + trace := []*Span{newBasicSpan("stats-test")} + writer.add(trace) + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + writer.mu.Lock() + stats := writer.payload.stats() + writer.mu.Unlock() + _ = stats.size + _ = stats.itemCount + } +} diff --git a/ddtrace/tracer/writer_test.go b/ddtrace/tracer/writer_test.go index a7717c9917..ec6a5fe5a8 100644 --- a/ddtrace/tracer/writer_test.go +++ b/ddtrace/tracer/writer_test.go @@ -12,11 +12,16 @@ import ( "fmt" "io" "math" + "net/http" + "net/http/httptest" "strings" + "sync" + "sync/atomic" "testing" + "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/statsdtest" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -28,12 +33,12 @@ func TestImplementsTraceWriter(t *testing.T) { } // makeSpan returns a span, adding n entries to meta and metrics each. -func makeSpan(n int) *span { +func makeSpan(n int) *Span { s := newSpan("encodeName", "encodeService", "encodeResource", randUint64(), randUint64(), randUint64()) for i := 0; i < n; i++ { istr := fmt.Sprintf("%0.10d", i) - s.Meta[istr] = istr - s.Metrics[istr] = float64(i) + s.meta[istr] = istr + s.metrics[istr] = float64(i) } return s } @@ -99,7 +104,8 @@ func TestLogWriter(t *testing.T) { t.Run("basic", func(t *testing.T) { assert := assert.New(t) var buf bytes.Buffer - cfg := newConfig() + cfg, err := newTestConfig() + assert.NoError(err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() @@ -107,13 +113,13 @@ func TestLogWriter(t *testing.T) { h.w = &buf s := makeSpan(0) for i := 0; i < 20; i++ { - h.add([]*span{s, s}) + h.add([]*Span{s, s}) } h.flush() v := struct{ Traces [][]map[string]interface{} }{} d := json.NewDecoder(&buf) err = d.Decode(&v) - assert.NoError(err, string(buf.Bytes())) + assert.NoError(err, buf.String()) assert.Len(v.Traces, 20, "Expected 20 traces, but have %d", len(v.Traces)) for _, t := range v.Traces { assert.Len(t, 2, "Expected 2 spans, but have %d", len(t)) @@ -125,17 +131,18 @@ func TestLogWriter(t *testing.T) { t.Run("inf+nan", func(t *testing.T) { assert := assert.New(t) var buf bytes.Buffer - cfg := newConfig() + cfg, err := newTestConfig() + require.NoError(t, err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() h := newLogTraceWriter(cfg, statsd) h.w = &buf s := makeSpan(0) - s.Metrics["nan"] = math.NaN() - s.Metrics["+inf"] = math.Inf(1) - s.Metrics["-inf"] = math.Inf(-1) - h.add([]*span{s}) + s.metrics["nan"] = math.NaN() + s.metrics["+inf"] = math.Inf(1) + s.metrics["-inf"] = math.Inf(-1) + h.add([]*Span{s}) h.flush() json := buf.String() assert.NotContains(json, `"nan":`) @@ -146,7 +153,8 @@ func TestLogWriter(t *testing.T) { t.Run("fullspan", func(t *testing.T) { assert := assert.New(t) var buf bytes.Buffer - cfg := newConfig() + cfg, err := newTestConfig() + require.NoError(t, err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() @@ -169,20 +177,20 @@ func TestLogWriter(t *testing.T) { type jsonPayload struct { Traces [][]jsonSpan `json:"traces"` } - s := &span{ - Name: "basicName", - Service: "basicService", - Resource: "basicResource", - Meta: map[string]string{ + s := &Span{ + name: "basicName", + service: "basicService", + resource: "basicResource", + meta: map[string]string{ "env": "prod", "version": "1.26.0", }, - MetaStruct: map[string]any{ + metaStruct: map[string]any{ "_dd.stack": map[string]string{ "0": "github.com/DataDog/dd-trace-go/v1/internal/tracer.TestLogWriter", }, }, - Metrics: map[string]float64{ + metrics: map[string]float64{ "widgets": 1e26, "zero": 0.0, "big": math.MaxFloat64, @@ -191,12 +199,12 @@ func TestLogWriter(t *testing.T) { "-inf": math.Inf(-1), "+inf": math.Inf(1), }, - SpanID: 10, - TraceID: 11, - ParentID: 12, - Start: 123, - Duration: 456, - Error: 789, + spanID: 10, + traceID: 11, + parentID: 12, + start: 123, + duration: 456, + error: 789, } expected := jsonSpan{ Name: "basicName", @@ -221,7 +229,7 @@ func TestLogWriter(t *testing.T) { Duration: 456, Error: 789, } - h.add([]*span{s}) + h.add([]*Span{s}) h.flush() d := json.NewDecoder(&buf) var payload jsonPayload @@ -233,9 +241,9 @@ func TestLogWriter(t *testing.T) { t.Run("invalid-characters", func(t *testing.T) { assert := assert.New(t) s := newSpan("name\n", "srv\t", `"res"`, 2, 1, 3) - s.Start = 12 - s.Meta["query\n"] = "Select * from \n Where\nvalue" - s.Metrics["version\n"] = 3 + s.start = 12 + s.meta["query\n"] = "Select * from \n Where\nvalue" + s.metrics["version\n"] = 3 var w logTraceWriter w.encodeSpan(s) @@ -253,14 +261,15 @@ func TestLogWriterOverflow(t *testing.T) { assert := assert.New(t) var buf bytes.Buffer var tg statsdtest.TestStatsdClient - cfg := newConfig(withStatsdClient(&tg)) + cfg, err := newTestConfig(withStatsdClient(&tg)) + require.NoError(t, err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() h := newLogTraceWriter(cfg, statsd) h.w = &buf s := makeSpan(10000) - h.add([]*span{s}) + h.add([]*Span{s}) h.flush() v := struct{ Traces [][]map[string]interface{} }{} d := json.NewDecoder(&buf) @@ -273,14 +282,15 @@ func TestLogWriterOverflow(t *testing.T) { assert := assert.New(t) var buf bytes.Buffer var tg statsdtest.TestStatsdClient - cfg := newConfig(withStatsdClient(&tg)) + cfg, err := newTestConfig(withStatsdClient(&tg)) + require.NoError(t, err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() h := newLogTraceWriter(cfg, statsd) h.w = &buf s := makeSpan(10) - var trace []*span + var trace []*Span for i := 0; i < 500; i++ { trace = append(trace, s) } @@ -304,15 +314,16 @@ func TestLogWriterOverflow(t *testing.T) { t.Run("two-large", func(t *testing.T) { assert := assert.New(t) var buf bytes.Buffer - cfg := newConfig() + cfg, err := newTestConfig() + require.NoError(t, err) statsd, err := newStatsdClient(cfg) require.NoError(t, err) defer statsd.Close() h := newLogTraceWriter(cfg, statsd) h.w = &buf s := makeSpan(4000) - h.add([]*span{s}) - h.add([]*span{s}) + h.add([]*Span{s}) + h.add([]*Span{s}) h.flush() v := struct{ Traces [][]map[string]interface{} }{} d := json.NewDecoder(&buf) @@ -338,7 +349,7 @@ type failingTransport struct { assert *assert.Assertions } -func (t *failingTransport) send(p *payload) (io.ReadCloser, error) { +func (t *failingTransport) send(p payload) (io.ReadCloser, error) { t.sendAttempts++ traces, err := decode(p) @@ -363,33 +374,39 @@ func (t *failingTransport) send(p *payload) (io.ReadCloser, error) { func TestTraceWriterFlushRetries(t *testing.T) { testcases := []struct { configRetries int + retryInterval time.Duration failCount int tracesSent bool expAttempts int }{ - {configRetries: 0, failCount: 0, tracesSent: true, expAttempts: 1}, - {configRetries: 0, failCount: 1, tracesSent: false, expAttempts: 1}, + {configRetries: 0, retryInterval: time.Millisecond, failCount: 0, tracesSent: true, expAttempts: 1}, + {configRetries: 0, retryInterval: time.Millisecond, failCount: 1, tracesSent: false, expAttempts: 1}, - {configRetries: 1, failCount: 0, tracesSent: true, expAttempts: 1}, - {configRetries: 1, failCount: 1, tracesSent: true, expAttempts: 2}, - {configRetries: 1, failCount: 2, tracesSent: false, expAttempts: 2}, + {configRetries: 1, retryInterval: time.Millisecond, failCount: 0, tracesSent: true, expAttempts: 1}, + {configRetries: 1, retryInterval: time.Millisecond, failCount: 1, tracesSent: true, expAttempts: 2}, + {configRetries: 1, retryInterval: time.Millisecond, failCount: 2, tracesSent: false, expAttempts: 2}, - {configRetries: 2, failCount: 0, tracesSent: true, expAttempts: 1}, - {configRetries: 2, failCount: 1, tracesSent: true, expAttempts: 2}, - {configRetries: 2, failCount: 2, tracesSent: true, expAttempts: 3}, - {configRetries: 2, failCount: 3, tracesSent: false, expAttempts: 3}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 0, tracesSent: true, expAttempts: 1}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 1, tracesSent: true, expAttempts: 2}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 2, tracesSent: true, expAttempts: 3}, + {configRetries: 2, retryInterval: time.Millisecond, failCount: 3, tracesSent: false, expAttempts: 3}, + + {configRetries: 1, retryInterval: 2 * time.Millisecond, failCount: 1, tracesSent: true, expAttempts: 2}, + {configRetries: 2, retryInterval: 2 * time.Millisecond, failCount: 2, tracesSent: true, expAttempts: 3}, } sentCounts := map[string]int64{ - "datadog.tracer.decode_error": 1, - "datadog.tracer.flush_bytes": 197, - "datadog.tracer.flush_traces": 1, + "datadog.tracer.decode_error": 1, + "datadog.tracer.flush_bytes": 185, + "datadog.tracer.flush_traces": 1, + "datadog.tracer.queue.enqueued.traces": 1, } droppedCounts := map[string]int64{ - "datadog.tracer.traces_dropped": 1, + "datadog.tracer.queue.enqueued.traces": 1, + "datadog.tracer.traces_dropped": 1, } - ss := []*span{makeSpan(0)} + ss := []*Span{makeSpan(0)} for _, test := range testcases { name := fmt.Sprintf("%d-%d-%t-%d", test.configRetries, test.failCount, test.tracesSent, test.expAttempts) t.Run(name, func(t *testing.T) { @@ -398,17 +415,20 @@ func TestTraceWriterFlushRetries(t *testing.T) { failCount: test.failCount, assert: assert, } - c := newConfig(func(c *config) { + c, err := newTestConfig(func(c *config) { c.transport = p c.sendRetries = test.configRetries + c.retryInterval = test.retryInterval }) + assert.Nil(err) var statsd statsdtest.TestStatsdClient - h := newAgentTraceWriter(c, nil, &statsd) + h := newAgentTraceWriter(c, newPrioritySampler(), &statsd) h.add(ss) - + start := time.Now() h.flush() h.wg.Wait() + elapsed := time.Since(start) assert.Equal(test.expAttempts, p.sendAttempts) assert.Equal(test.tracesSent, p.tracesSent) @@ -419,15 +439,78 @@ func TestTraceWriterFlushRetries(t *testing.T) { } else { assert.Equal(droppedCounts, statsd.Counts()) } + if test.configRetries > 0 && test.failCount > 1 { + assert.GreaterOrEqual(elapsed, test.retryInterval*time.Duration(minInts(test.configRetries+1, test.failCount))) + } }) } } +func minInts(a, b int) int { + if a < b { + return a + } + return b +} + +func TestTraceProtocol(t *testing.T) { + assert := assert.New(t) + + t.Run("v1.0, no endpoint", func(t *testing.T) { + t.Setenv("DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED", "true") + cfg, err := newTestConfig() + require.NoError(t, err) + h := newAgentTraceWriter(cfg, nil, nil) + assert.Equal(traceProtocolV04, h.payload.protocol()) + }) + + t.Run("v1.0, with endpoint", func(t *testing.T) { + t.Setenv("DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED", "true") + + // Create a mock agent endpoint to mimic having a v1 trace endpoint + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{"endpoints": ["/v1.0/traces"], "config": {"statsd_port": 8125}}`)) + })) + defer srv.Close() + + cfg, err := newTestConfig( + WithAgentAddr(strings.TrimPrefix(srv.URL, "http://")), + ) + assert.NoError(err) + h := newAgentTraceWriter(cfg, nil, nil) + assert.Equal(traceProtocolV1, h.payload.protocol()) + }) + + t.Run("v0.4", func(t *testing.T) { + t.Setenv("DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED", "false") + cfg, err := newTestConfig() + require.NoError(t, err) + h := newAgentTraceWriter(cfg, nil, nil) + assert.Equal(traceProtocolV04, h.payload.protocol()) + }) + + t.Run("default", func(t *testing.T) { + cfg, err := newTestConfig() + require.NoError(t, err) + h := newAgentTraceWriter(cfg, nil, nil) + assert.Equal(traceProtocolV04, h.payload.protocol()) + }) + + t.Run("invalid", func(t *testing.T) { + t.Setenv("DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED", "invalid") + cfg, err := newTestConfig() + require.NoError(t, err) + h := newAgentTraceWriter(cfg, nil, nil) + assert.Equal(traceProtocolV04, h.payload.protocol()) + }) +} func BenchmarkJsonEncodeSpan(b *testing.B) { s := makeSpan(10) - s.Metrics["nan"] = math.NaN() - s.Metrics["+inf"] = math.Inf(1) - s.Metrics["-inf"] = math.Inf(-1) + s.metrics["nan"] = math.NaN() + s.metrics["+inf"] = math.Inf(1) + s.metrics["-inf"] = math.Inf(-1) h := &logTraceWriter{} b.ResetTimer() for i := 0; i < b.N; i++ { @@ -443,3 +526,148 @@ func BenchmarkJsonEncodeFloat(b *testing.B) { encodeFloat(bs, float64(1e-9)) } } + +func TestAgentWriterRaceCondition(t *testing.T) { + // This test reproduces a race condition between add() and flush() operations + // The race occurs when: + // 1. add() loads payload, flush() replaces it before add() can push to it + // 2. add() increments tracesQueued while flush() goroutine resets it to 0 + // + // Run with: go test -race -run TestAgentWriterRaceCondition + + assert := assert.New(t) + var tg statsdtest.TestStatsdClient + cfg, err := newTestConfig(withStatsdClient(&tg)) + require.NoError(t, err) + statsd, err := newStatsdClient(cfg) + require.NoError(t, err) + defer statsd.Close() + + writer := newAgentTraceWriter(cfg, newPrioritySampler(), &tg) + + const numGoroutines = 50 + const numOperations = 100 + + // Channel to coordinate goroutines + start := make(chan struct{}) + + var wg sync.WaitGroup + + // Spawn goroutines that continuously add traces + for i := 0; i < numGoroutines/2; i++ { + wg.Add(1) + go func() { + defer wg.Done() + <-start // Wait for coordination signal + + for j := 0; j < numOperations; j++ { + spans := []*Span{makeSpan(1)} + writer.add(spans) + } + }() + } + + // Spawn goroutines that continuously flush + for i := 0; i < numGoroutines/2; i++ { + wg.Add(1) + go func() { + defer wg.Done() + <-start // Wait for coordination signal + + for j := 0; j < numOperations; j++ { + writer.flush() + } + }() + } + + // Start all goroutines simultaneously to maximize race condition probability + close(start) + + // Wait for all operations to complete + wg.Wait() + + // Final flush to process any remaining traces + writer.flush() + writer.wg.Wait() + + // The race condition might cause: + // 1. Traces to be lost (added to old payload after it was flushed) + // 2. Incorrect trace counts due to counter races + // 3. Data races detected by Go's race detector + + assert.True(true, "Test completed - check for race conditions with -race flag") +} + +func TestAgentWriterTraceCountAccuracy(t *testing.T) { + // This test validates that trace counting remains accurate under concurrent operations + // It detects both data races and logical errors in trace counting + + assert := assert.New(t) + var tg statsdtest.TestStatsdClient + cfg, err := newTestConfig(withStatsdClient(&tg)) + require.NoError(t, err) + statsd, err := newStatsdClient(cfg) + require.NoError(t, err) + defer statsd.Close() + + writer := newAgentTraceWriter(cfg, newPrioritySampler(), &tg) + + const numAddGoroutines = 20 + const numFlushGoroutines = 10 + const numTracesPerGoroutine = 50 + const expectedTotalTraces = numAddGoroutines * numTracesPerGoroutine + + start := make(chan struct{}) + var wg sync.WaitGroup + + // Track traces added for verification + var tracesAdded int32 + + // Spawn goroutines that add traces + for i := 0; i < numAddGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + <-start + + for j := 0; j < numTracesPerGoroutine; j++ { + spans := []*Span{makeSpan(1)} + writer.add(spans) + atomic.AddInt32(&tracesAdded, 1) + } + }() + } + + // Spawn goroutines that flush occasionally + for i := 0; i < numFlushGoroutines; i++ { + wg.Add(1) + go func() { + defer wg.Done() + <-start + + // Flush periodically while adds are happening + for j := 0; j < 10; j++ { + time.Sleep(time.Microsecond * 100) + writer.flush() + } + }() + } + + // Start all goroutines + close(start) + wg.Wait() + + // Final flush to ensure all traces are processed + writer.flush() + writer.wg.Wait() + + // Verify that the number of traces added matches our expectation + actualTracesAdded := atomic.LoadInt32(&tracesAdded) + assert.Equal(int32(expectedTotalTraces), actualTracesAdded, + "Expected %d traces to be added, but got %d", expectedTotalTraces, actualTracesAdded) + + // The race condition could cause: + // 1. Loss of traces if they're added to an old payload after flush starts + // 2. Incorrect metrics reporting due to counter races + // 3. Data corruption in payload structures +} diff --git a/ddtrace/v1.go b/ddtrace/v1.go new file mode 100644 index 0000000000..225a74c619 --- /dev/null +++ b/ddtrace/v1.go @@ -0,0 +1,28 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package ddtrace + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +func init() { + checkV1NonTransitional() +} + +func checkV1NonTransitional() { + version, transitional, found := version.FindV1Version() + if !found { + // No v1 version detected + return + } + if transitional { + // v1 version is transitional + return + } + log.Warn("Detected %q non-transitional version of dd-trace-go. This version is not compatible with v2 - please upgrade to v1.74.0 or later", version) +} diff --git a/docker-compose.yaml b/docker-compose.yaml index 76680be932..1d03f1fee2 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -1,7 +1,6 @@ -version: "3.3" # optional since v1.27.0 services: cassandra: - image: cassandra:3.11 + image: cassandra:5 environment: JVM_OPTS: "-Xms750m -Xmx750m" CASSANDRA_CLUSTER_NAME: "dd-trace-go-test-cluster" @@ -10,7 +9,7 @@ services: ports: - "9042:9042" mysql: - image: circleci/mysql:5.7 + image: mysql:8 environment: MYSQL_ROOT_PASSWORD: admin MYSQL_PASSWORD: test @@ -19,7 +18,7 @@ services: ports: - "3306:3306" postgres: - image: circleci/postgres:9.5 + image: postgres:16 environment: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres @@ -34,13 +33,19 @@ services: ports: - "1433:1433" consul: - image: consul:1.6.0 + image: consul:1.15 ports: - "8500:8500" redis: - image: redis:3.2 + image: redis:7-alpine ports: - "6379:6379" + valkey: + image: valkey/valkey:8 + environment: + VALKEY_EXTRA_FLAGS: "--port 6380 --requirepass password-for-default" + ports: + - "6380:6380" elasticsearch2: image: elasticsearch:2 environment: @@ -62,7 +67,7 @@ services: soft: 65536 hard: 65536 elasticsearch6: - image: elasticsearch:6.8.13 + image: elasticsearch:6.8.23 environment: http.port: 9202-9300 discovery.type: single-node @@ -74,7 +79,7 @@ services: soft: 65536 hard: 65536 elasticsearch7: - image: elasticsearch:7.14.1 + image: elasticsearch:7.17.28 environment: http.port: 9203-9300 discovery.type: single-node @@ -85,8 +90,21 @@ services: nofile: soft: 65536 hard: 65536 + elasticsearch8: + image: elasticsearch:8.18.1 + environment: + http.port: 9204-9300 + discovery.type: single-node + xpack.security.enabled: "false" + ES_JAVA_OPTS: "-Xms750m -Xmx750m" # https://github.com/10up/wp-local-docker/issues/6 + ports: + - "9204:9204" + ulimits: + nofile: + soft: 65536 + hard: 65536 datadog-agent: - image: datadog/docker-dd-agent + image: gcr.io/datadoghq/agent:latest environment: DD_APM_ENABLED: "true" DD_BIND_HOST: "0.0.0.0" @@ -94,7 +112,7 @@ services: ports: - "8126:8126" testagent: - image: ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.11.0 + image: ghcr.io/datadog/dd-apm-test-agent/ddapm-test-agent:v1.23.1 environment: LOG_LEVEL: DEBUG TRACE_LANGUAGE: golang @@ -105,16 +123,21 @@ services: DD_DISABLE_ERROR_RESPONSES: "true" ports: - "127.0.0.1:9126:9126" + mongodb3: + image: mongo:3 + ports: + - "27018:27017" mongodb: - image: circleci/mongo:latest-ram + image: mongo:8 ports: - "27017:27017" memcached: - image: memcached:1.5.9 + image: memcached:1.6-alpine ports: - "11211:11211" kafka: image: confluentinc/confluent-local:7.5.0 + container_name: kafka environment: KAFKA_LISTENERS: "PLAINTEXT://0.0.0.0:9093,BROKER://0.0.0.0:9092,CONTROLLER://0.0.0.0:9094" KAFKA_ADVERTISED_LISTENERS: "PLAINTEXT://localhost:9093,BROKER://localhost:9092" @@ -133,6 +156,7 @@ services: KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER" ports: - "9092:9092" + - "9093:9093" localstack: image: localstack/localstack:latest ports: diff --git a/go.mod b/go.mod index dd79838aea..4bd3f28968 100644 --- a/go.mod +++ b/go.mod @@ -1,303 +1,110 @@ -module gopkg.in/DataDog/dd-trace-go.v1 +module github.com/DataDog/dd-trace-go/v2 -go 1.22.0 +go 1.24.0 + +godebug x509negativeserial=1 require ( - cloud.google.com/go/pubsub v1.33.0 - github.com/99designs/gqlgen v0.17.36 - github.com/DataDog/appsec-internal-go v1.8.0 - github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 - github.com/DataDog/datadog-go/v5 v5.3.0 - github.com/DataDog/go-libddwaf/v3 v3.4.0 + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 + github.com/DataDog/datadog-go/v5 v5.6.0 + github.com/DataDog/go-libddwaf/v4 v4.6.1 + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 github.com/DataDog/gostackparse v0.7.0 - github.com/DataDog/sketches-go v1.4.5 - github.com/IBM/sarama v1.40.0 - github.com/Shopify/sarama v1.38.1 - github.com/aws/aws-sdk-go v1.44.327 - github.com/aws/aws-sdk-go-v2 v1.20.3 - github.com/aws/aws-sdk-go-v2/config v1.18.21 - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.21.4 - github.com/aws/aws-sdk-go-v2/service/ec2 v1.93.2 - github.com/aws/aws-sdk-go-v2/service/eventbridge v1.20.4 - github.com/aws/aws-sdk-go-v2/service/kinesis v1.18.4 - github.com/aws/aws-sdk-go-v2/service/s3 v1.32.0 - github.com/aws/aws-sdk-go-v2/service/sfn v1.19.4 - github.com/aws/aws-sdk-go-v2/service/sns v1.21.4 - github.com/aws/aws-sdk-go-v2/service/sqs v1.24.4 - github.com/aws/smithy-go v1.14.2 - github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 - github.com/confluentinc/confluent-kafka-go v1.9.2 - github.com/confluentinc/confluent-kafka-go/v2 v2.2.0 - github.com/denisenkom/go-mssqldb v0.11.0 - github.com/dimfeld/httptreemux/v5 v5.5.0 - github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 - github.com/elastic/go-elasticsearch/v6 v6.8.5 - github.com/elastic/go-elasticsearch/v7 v7.17.1 - github.com/elastic/go-elasticsearch/v8 v8.4.0 - github.com/emicklei/go-restful v2.16.0+incompatible - github.com/emicklei/go-restful/v3 v3.11.0 - github.com/garyburd/redigo v1.6.4 - github.com/gin-gonic/gin v1.9.1 - github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 - github.com/go-chi/chi v1.5.4 - github.com/go-chi/chi/v5 v5.0.10 - github.com/go-pg/pg/v10 v10.11.1 - github.com/go-redis/redis v6.15.9+incompatible - github.com/go-redis/redis/v7 v7.4.1 - github.com/go-redis/redis/v8 v8.11.5 - github.com/go-sql-driver/mysql v1.6.0 - github.com/gocql/gocql v1.6.0 - github.com/gofiber/fiber/v2 v2.52.5 - github.com/gomodule/redigo v1.8.9 - github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b - github.com/google/uuid v1.5.0 - github.com/gorilla/mux v1.8.0 - github.com/graph-gophers/graphql-go v1.5.0 - github.com/graphql-go/graphql v0.8.1 - github.com/graphql-go/handler v0.2.3 - github.com/hashicorp/consul/api v1.24.0 - github.com/hashicorp/go-multierror v1.1.1 - github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 - github.com/hashicorp/vault/api v1.9.2 - github.com/hashicorp/vault/sdk v0.9.2 - github.com/jackc/pgx/v5 v5.6.0 - github.com/jinzhu/gorm v1.9.16 - github.com/jmoiron/sqlx v1.3.5 - github.com/julienschmidt/httprouter v1.3.0 - github.com/labstack/echo v3.3.10+incompatible - github.com/labstack/echo/v4 v4.11.1 - github.com/lib/pq v1.10.2 - github.com/mattn/go-sqlite3 v1.14.18 - github.com/microsoft/go-mssqldb v0.21.0 - github.com/miekg/dns v1.1.55 - github.com/mitchellh/mapstructure v1.5.0 - github.com/opentracing/opentracing-go v1.2.0 - github.com/redis/go-redis/v9 v9.1.0 + github.com/DataDog/sketches-go v1.4.7 + github.com/Masterminds/semver/v3 v3.3.1 + github.com/cenkalti/backoff/v5 v5.0.3 + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 + github.com/go-viper/mapstructure/v2 v2.4.0 + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db + github.com/google/uuid v1.6.0 + github.com/json-iterator/go v1.1.12 + github.com/klauspost/compress v1.18.0 + github.com/minio/simdjson-go v0.4.5 + github.com/open-feature/go-sdk v1.17.0 + github.com/puzpuzpuz/xsync/v3 v3.5.1 + github.com/quasilyte/go-ruleguard/dsl v0.3.22 github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 - github.com/segmentio/kafka-go v0.4.42 - github.com/sirupsen/logrus v1.9.3 github.com/spaolacci/murmur3 v1.1.0 - github.com/stretchr/testify v1.9.0 - github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d - github.com/tidwall/buntdb v1.3.0 - github.com/tinylib/msgp v1.2.1 - github.com/twitchtv/twirp v8.1.3+incompatible - github.com/uptrace/bun v1.1.17 - github.com/uptrace/bun/dialect/sqlitedialect v1.1.17 - github.com/urfave/negroni v1.0.0 - github.com/valyala/fasthttp v1.51.0 - github.com/vektah/gqlparser/v2 v2.5.16 - github.com/zenazn/goji v1.0.1 - go.mongodb.org/mongo-driver v1.12.1 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 - go.opentelemetry.io/otel v1.20.0 - go.opentelemetry.io/otel/trace v1.20.0 + github.com/stretchr/testify v1.11.1 + github.com/theckman/httpforwarded v0.4.0 + github.com/tinylib/msgp v1.3.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 + go.opentelemetry.io/otel v1.37.0 + go.opentelemetry.io/otel/trace v1.37.0 go.uber.org/goleak v1.3.0 - golang.org/x/mod v0.18.0 - golang.org/x/oauth2 v0.9.0 - golang.org/x/sys v0.23.0 - golang.org/x/time v0.3.0 + go.yaml.in/yaml/v3 v3.0.4 + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 + golang.org/x/mod v0.29.0 + golang.org/x/sync v0.17.0 + golang.org/x/sys v0.37.0 + golang.org/x/time v0.12.0 + golang.org/x/tools v0.38.0 golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 - google.golang.org/api v0.128.0 - google.golang.org/grpc v1.57.1 - google.golang.org/protobuf v1.33.0 - gopkg.in/jinzhu/gorm.v1 v1.9.2 - gopkg.in/olivere/elastic.v3 v3.0.75 - gopkg.in/olivere/elastic.v5 v5.0.84 - gorm.io/driver/mysql v1.0.1 - gorm.io/driver/postgres v1.4.6 - gorm.io/driver/sqlserver v1.4.2 - gorm.io/gorm v1.25.3 - k8s.io/apimachinery v0.23.17 - k8s.io/client-go v0.23.17 - modernc.org/sqlite v1.28.0 + google.golang.org/grpc v1.75.0 + google.golang.org/protobuf v1.36.7 ) require ( - cloud.google.com/go v0.110.7 // indirect - cloud.google.com/go/compute v1.23.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.2 // indirect - github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/agnivade/levenshtein v1.1.1 // indirect - github.com/andybalholm/brotli v1.0.6 // indirect - github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.13.20 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.40 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.3 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.35 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.34 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 // indirect - github.com/bytedance/sonic v1.10.0 // indirect - github.com/cenkalti/backoff/v3 v3.2.2 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect - github.com/chenzhuoyu/iasm v0.9.0 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/eapache/go-resiliency v1.4.0 // indirect - github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect - github.com/eapache/queue v1.1.0 // indirect - github.com/ebitengine/purego v0.6.0-alpha.5 // indirect - github.com/elastic/elastic-transport-go/v8 v8.1.0 // indirect - github.com/fatih/color v1.16.0 // indirect - github.com/felixge/httpsnoop v1.0.3 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gin-contrib/sse v0.1.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.3 // indirect - github.com/go-logr/logr v1.3.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-pg/zerochecker v0.2.0 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/go-playground/validator/v10 v10.15.1 // indirect - github.com/goccy/go-json v0.10.2 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect - github.com/golang-sql/sqlexp v0.1.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.4 // indirect - github.com/google/go-cmp v0.6.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.5 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.5 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.6.3 // indirect - github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-retryablehttp v0.7.7 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/hashicorp/go-uuid v1.0.3 // indirect - github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/golang-lru/v2 v2.0.3 // indirect - github.com/hashicorp/hcl v1.0.1-vault-5 // indirect - github.com/hashicorp/serf v0.10.1 // indirect - github.com/imdario/mergo v0.3.12 // indirect - github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/puddle/v2 v2.2.1 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.7.6 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect - github.com/jinzhu/inflection v1.0.0 // indirect - github.com/jinzhu/now v1.1.5 // indirect - github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect - github.com/klauspost/compress v1.17.1 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/labstack/gommon v0.4.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.2 // indirect - github.com/montanaflynn/stats v0.6.6 // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/outcaste-io/ristretto v0.2.3 // indirect - github.com/pelletier/go-toml/v2 v2.0.9 // indirect - github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 // indirect - github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/philhofer/fwd v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect github.com/stretchr/objx v0.5.2 // indirect - github.com/tidwall/btree v1.6.0 // indirect - github.com/tidwall/gjson v1.16.0 // indirect - github.com/tidwall/grect v0.1.4 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.1 // indirect - github.com/tidwall/rtred v0.1.2 // indirect - github.com/tidwall/tinyqueue v0.1.1 // indirect - github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - github.com/ugorji/go/codec v1.2.11 // indirect - github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/valyala/tcplisten v1.0.0 // indirect - github.com/vmihailenco/bufpool v0.1.11 // indirect - github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect - github.com/vmihailenco/tagparser v0.1.2 // indirect - github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect - github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.2 // indirect - github.com/xdg-go/stringprep v1.0.4 // indirect - github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel/metric v1.20.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/arch v0.4.0 // indirect - golang.org/x/crypto v0.25.0 // indirect - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/term v0.22.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.22.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect - gopkg.in/inf.v0 v0.9.1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + go.uber.org/mock v0.6.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/text v0.30.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.23.17 // indirect - k8s.io/klog/v2 v2.30.0 // indirect - k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect - k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect - lukechampine.com/uint128 v1.3.0 // indirect - mellium.im/sasl v0.3.1 // indirect - modernc.org/cc/v3 v3.41.0 // indirect - modernc.org/ccgo/v3 v3.16.15 // indirect - modernc.org/libc v1.37.6 // indirect - modernc.org/mathutil v1.6.0 // indirect - modernc.org/memory v1.7.2 // indirect - modernc.org/opt v0.1.3 // indirect - modernc.org/strutil v1.2.0 // indirect - modernc.org/token v1.1.0 // indirect - sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect - sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect - sigs.k8s.io/yaml v1.2.0 // indirect ) -// Retract experimental versions retract ( - v1.999.0-rc.8 - v1.999.0-rc.7 - v1.999.0-rc.6 - v1.999.0-rc.5 - v1.999.0-rc.4 - v1.999.0-rc.3 - v1.999.0-rc.2 - v1.999.0-rc.1 + [v2.0.0-rc.1, v2.0.0-rc.22] + [v2.0.0-beta.1, v2.0.0-beta.11] + v2.0.0-20240516153256-8d6fa2bea61d ) diff --git a/go.sum b/go.sum index 2f810fce66..0b8d8efa2d 100644 --- a/go.sum +++ b/go.sum @@ -1,3202 +1,331 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= -cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= -cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= -cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= -cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= -cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= -cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= -cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go v0.110.7/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= -cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= -cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= -cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= -cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= -cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= -cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= -cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= -cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= -cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= -cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= -cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= -cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= -cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= -cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= -cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= -cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= -cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= -cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= -cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= -cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= -cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= -cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= -cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= -cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= -cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= -cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= -cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= -cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= -cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= -cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= -cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= -cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= -cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= -cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= -cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= -cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= -cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= -cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= -cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= -cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= -cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= -cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= -cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= -cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= -cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= -cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= -cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= -cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= -cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= -cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= -cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= -cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= -cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= -cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= -cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= -cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= -cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= -cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= -cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= -cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= -cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= -cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= -cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= -cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= -cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= -cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= -cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= -cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= -cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= -cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= -cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= -cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= -cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= -cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= -cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= -cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= -cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= -cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= -cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= -cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= -cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= -cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= -cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= -cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= -cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= -cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= -cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= -cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= -cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= -cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= -cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= -cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= -cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= -cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= -cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= -cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= -cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= -cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= -cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= -cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= -cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= -cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= -cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= -cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= -cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= -cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= -cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= -cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= -cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= -cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= -cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= -cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= -cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= -cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= -cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= -cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= -cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= -cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= -cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= -cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= -cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= -cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= -cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= -cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= -cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= -cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= -cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= -cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= -cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= -cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= -cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= -cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= -cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= -cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= -cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= -cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= -cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= -cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= -cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= -cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= -cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= -cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= -cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= -cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= -cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= -cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= -cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= -cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= -cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= -cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= -cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= -cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= -cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= -cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= -cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= -cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= -cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= -cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= -cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= -cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= -cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= -cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= -cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= -cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= -cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= -cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= -cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= -cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= -cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= -cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= -cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= -cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= -cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= -cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= -cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= -cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= -cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= -cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= -cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= -cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= -cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= -cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= -cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= -cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= -cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= -cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= -cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= -cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= -cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= -cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= -cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= -cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= -cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= -cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= -cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= -cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= -cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= -cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= -cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= -cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= -cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= -cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= -cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= -cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= -cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= -cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= -cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= -cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= -cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= -cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= -cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= -cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= -cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= -cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= -cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= -cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= -cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= -cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= -cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= -cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= -cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= -cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= -cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= -cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= -cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= -cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= -cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= -cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= -cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= -cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= -cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= -cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= -cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= -cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= -cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= -cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= -cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= -cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= -cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= -cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= -cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= -cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= -cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= -cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.1.2 h1:gacbrBdWcoVmGLozRuStX45YKvJtzIjJdAolzUs1sm4= -cloud.google.com/go/iam v1.1.2/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= -cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= -cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= -cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= -cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= -cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= -cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= -cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= -cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= -cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= -cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= -cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= -cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= -cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= -cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= -cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= -cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= -cloud.google.com/go/kms v1.11.0 h1:0LPJPKamw3xsVpkel1bDtK0vVJec3EyqdQOLitiD030= -cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= -cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= -cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= -cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= -cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= -cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= -cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= -cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= -cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= -cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= -cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= -cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= -cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= -cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= -cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= -cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= -cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= -cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= -cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= -cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= -cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= -cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= -cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= -cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= -cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= -cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= -cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= -cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= -cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= -cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= -cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= -cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= -cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= -cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= -cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= -cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= -cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= -cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= -cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= -cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= -cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= -cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= -cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= -cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= -cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= -cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= -cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= -cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= -cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= -cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= -cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= -cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= -cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= -cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= -cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= -cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= -cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= -cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= -cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= -cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= -cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= -cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= -cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= -cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= -cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= -cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= -cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= -cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= -cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= -cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= -cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= -cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= -cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= -cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= -cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= -cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= -cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= -cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= -cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= -cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= -cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= -cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= -cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= -cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= -cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= -cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= -cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= -cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= -cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= -cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= -cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= -cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= -cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= -cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= -cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= -cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= -cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= -cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= -cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= -cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= -cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= -cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= -cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= -cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= -cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= -cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= -cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= -cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= -cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= -cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= -cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= -cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= -cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= -cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= -cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= -cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= -cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= -cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= -cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= -cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= -cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= -cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= -cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= -cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= -cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= -cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= -cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= -cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= -cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= -cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= -cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= -cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= -cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= -cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= -cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= -cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= -cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= -cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= -cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= -cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= -cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= -cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= -cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= -cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= -cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= -cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= -cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= -cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= -cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= -cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= -cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= -cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= -cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= -cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= -cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= -cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= -cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= -cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= -cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= -cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= -cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= -cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= -cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= -cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= -cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= -cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= -cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= -cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= -cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= -cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= -cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= -cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= -cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= -cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= -cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= -cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= -cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= -cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= -cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= -cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= -cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= -cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= -cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= -cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= -cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= -cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= -cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= -cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= -cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= -cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= -cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= -cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= -cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= -cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= -cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= -cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= -cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= -cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= -cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= -cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= -cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= -cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= -cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= -cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= -cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= -cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= -cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= -cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= -cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= -cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= -cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= -cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= -cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= -cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= -cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= -cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= -cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= -cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= -cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= -cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= -cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= -cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= -cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= -cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= -cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= -cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= -cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= -cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= -cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= -cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= -cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= -cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= -cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= -cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= -cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= -cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= -cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= -cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= -cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= -cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= -cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= -cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= -cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= -cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= -cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= -cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= -cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= -git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= -github.com/99designs/gqlgen v0.17.36 h1:u/o/rv2SZ9s5280dyUOOrkpIIkr/7kITMXYD3rkJ9go= -github.com/99designs/gqlgen v0.17.36/go.mod h1:6RdyY8puhCoWAQVr2qzF2OMVfudQzc8ACxzpzluoQm4= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.1.0/go.mod h1:bhXu1AjYL+wutSL/kpSq6s7733q2Rb0yuot9Zgfqa/0= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/AzureAD/microsoft-authentication-library-for-go v0.5.1/go.mod h1:Vt9sXTKwMyGcOxSmLDMnGPgqsUg7m8pe215qMLrDXw4= -github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DataDog/appsec-internal-go v1.8.0 h1:1Tfn3LEogntRqZtf88twSApOCAAO3V+NILYhuQIo4J4= -github.com/DataDog/appsec-internal-go v1.8.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 h1:bUMSNsw1iofWiju9yc1f+kBd33E3hMJtq9GuU602Iy8= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= -github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/DataDog/datadog-go/v5 v5.3.0 h1:2q2qjFOb3RwAZNU+ez27ZVDwErJv5/VpbBPprz7Z+s8= -github.com/DataDog/datadog-go/v5 v5.3.0/go.mod h1:XRDJk1pTc00gm+ZDiBKsjh7oOOtJfYfglVCmFb8C2+Q= -github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= -github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= -github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= -github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= -github.com/IBM/sarama v1.40.0 h1:QTVmX+gMKye52mT5x+Ve/Bod2D0Gy7ylE2Wslv+RHtc= -github.com/IBM/sarama v1.40.0/go.mod h1:6pBloAs1WanL/vsq5qFTyTGulJUntZHhMLOUYEIs9mg= -github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim v0.9.4/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= -github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= -github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= -github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= -github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= -github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= -github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= -github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= -github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= -github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= -github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= -github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= -github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= -github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= -github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= -github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= -github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.44.327 h1:ZS8oO4+7MOBLhkdwIhgtVeDzCeWOlTfKJS7EgggbIEY= -github.com/aws/aws-sdk-go v1.44.327/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= -github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.20.3 h1:lgeKmAZhlj1JqN43bogrM75spIvYnRxqTAh1iupu1yE= -github.com/aws/aws-sdk-go-v2 v1.20.3/go.mod h1:/RfNgGmRxI+iFOB1OeJUyxiU+9s88k3pfHvDagGEp0M= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13 h1:OPLEkmhXf6xFPiz0bLeDArZIDx1NNS4oJyG4nv3Gct0= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13/go.mod h1:gpAbvyDGQFozTEmlTFO8XcQKHzubdq0LzRyJpG6MiXM= -github.com/aws/aws-sdk-go-v2/config v1.18.21 h1:ENTXWKwE8b9YXgQCsruGLhvA9bhg+RqAsL9XEMEsa2c= -github.com/aws/aws-sdk-go-v2/config v1.18.21/go.mod h1:+jPQiVPz1diRnjj6VGqWcLK6EzNmQ42l7J3OqGTLsSY= -github.com/aws/aws-sdk-go-v2/credentials v1.13.20 h1:oZCEFcrMppP/CNiS8myzv9JgOzq2s0d3v3MXYil/mxQ= -github.com/aws/aws-sdk-go-v2/credentials v1.13.20/go.mod h1:xtZnXErtbZ8YGXC3+8WfajpMBn5Ga/3ojZdxHq6iI8o= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2 h1:jOzQAesnBFDmz93feqKnsTHsXrlwWORNZMFHMV+WLFU= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.40 h1:CXceCS9BrDInRc74GDCQ8Qyk/Gp9VLdK+Rlve+zELSE= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.40/go.mod h1:5kKmFhLeOVy6pwPDpDNA6/hK/d6URC98pqDDqHgdBx4= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.34 h1:B+nZtd22cbko5+793hg7LEaTeLMiZwlgCLUrN5Y0uzg= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.34/go.mod h1:RZP0scceAyhMIQ9JvFp7HvkpcgqjL4l/4C+7RAeGbuM= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34 h1:gGLG7yKaXG02/jBlg210R7VgQIotiQntNhsCFejawx8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.24/go.mod h1:+fFaIjycTmpV6hjmPTbyU9Kp5MI/lA+bbibcAtmlhYA= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.3 h1:uHhWcrNBgpm9gi3o8NSQcsAqha/U9OFYzi2k4+0UVz8= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.3/go.mod h1:jYLMm3Dh0wbeV3lxth5ryks/O2M/omVXWyYm3YcEVqQ= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.21.4 h1:x3V1JRHq7q9RUbDpaeNpLH7QoipGpCo3fdnMMuSeABU= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.21.4/go.mod h1:aryF4jxgjhbqpdhj8QybUZI3xYrX8MQIKm4WbOv8Whg= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.93.2 h1:c6a19AjfhEXKlEX63cnlWtSQ4nzENihHZOG0I3wH6BE= -github.com/aws/aws-sdk-go-v2/service/ec2 v1.93.2/go.mod h1:VX22JN3HQXDtQ3uS4h4TtM+K11vydq58tpHTlsm8TL8= -github.com/aws/aws-sdk-go-v2/service/eventbridge v1.20.4 h1:G18wotYZxZ0A5tkqKv6FHCjsF86UQrqNHy5LS+T7JWM= -github.com/aws/aws-sdk-go-v2/service/eventbridge v1.20.4/go.mod h1:XlbY5AGZhlipCdhRorT18/HEThKAxo51hMmhixreJoM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14 h1:m0QTSI6pZYJTk5WSKx3fm5cNW/DCicVzULBgU/6IyD0= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14/go.mod h1:dDilntgHy9WnHXsh7dDtUPgHKEfTJIBUTHM8OWm0f/0= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.27/go.mod h1:Zz0kvhcSlu3NX4XJkaGgdjaa+u7a9LYuy8JKxA5v3RM= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.35 h1:oCUrlTzh9GwhlYdyDGNAS6UgqJRzJp5rKoYCJWqLyZI= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.35/go.mod h1:YVHrksq36j0sbXCT6rSuQafpfYkMYqy0QTk7JTCTBIU= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.34 h1:JlxVMFDHivlhNOIxd2O/9z4O0wC2zIC4lRB71lejVHU= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.34/go.mod h1:CDPcT6pljRaqz1yLsOgPUvOPOczFvXuJxOKzDzAbF0c= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.34 h1:JwvXk+1ePAD9xkFHprhHYqwsxLDcbNFsPI1IAT2sPS0= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.34/go.mod h1:ytsF+t+FApY2lFnN51fJKPhH6ICKOPXKEcwwgmJEdWI= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.1/go.mod h1:VXBHSxdN46bsJrkniN68psSwbyBKsazQfU2yX/iSDso= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.3 h1:rPDAISw3FjEhrJoaxmQjuD+GgBfv2p3AVhmAcnyqq3k= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.3/go.mod h1:TXBww3ANB+QRj+/dUoYDvI8d/u4F4WzTxD4mxtDoxrg= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.18.4 h1:UohaQds+Puk9BEbvncXkZduIGYImxohbFpVmSoymXck= -github.com/aws/aws-sdk-go-v2/service/kinesis v1.18.4/go.mod h1:HnjgmL8TNmYtGcrA3N6EeCnDvlX6CteCdUbZ1wV8QWQ= -github.com/aws/aws-sdk-go-v2/service/s3 v1.32.0 h1:NAc8WQsVQ3+kz3rU619mlz8NcbpZI6FVJHQfH33QK0g= -github.com/aws/aws-sdk-go-v2/service/s3 v1.32.0/go.mod h1:aSl9/LJltSz1cVusiR/Mu8tvI4Sv/5w/WWrJmmkNii0= -github.com/aws/aws-sdk-go-v2/service/sfn v1.19.4 h1:yIyFY2kbCOoHvuivf9minqnP2RLYJgmvQRYxakIb2oI= -github.com/aws/aws-sdk-go-v2/service/sfn v1.19.4/go.mod h1:uWCH4ATwNrkRO40j8Dmy7u/Y1/BVWgCM+YjBNYZeOro= -github.com/aws/aws-sdk-go-v2/service/sns v1.21.4 h1:Asj098jPfIZYzAbk4xVFwVBGij5hgMcli0d+5Pe4aZA= -github.com/aws/aws-sdk-go-v2/service/sns v1.21.4/go.mod h1:bbB779DXXOnPXvB7F3dP7AjuV1Eyr7fNyrA058ExuzY= -github.com/aws/aws-sdk-go-v2/service/sqs v1.24.4 h1:bp8KUUx15mnLMe8SSJqO/kYEn0C2kKfWq/M9SRK9i1E= -github.com/aws/aws-sdk-go-v2/service/sqs v1.24.4/go.mod h1:c1AF/ac4k4xz32FprEk6AqqGFH/Fkub9VUPSrASlllA= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.8 h1:5cb3D6xb006bPTqEfCNaEA6PPEfBXxxy4NNeX/44kGk= -github.com/aws/aws-sdk-go-v2/service/sso v1.12.8/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8 h1:NZaj0ngZMzsubWZbrEFSB4rgSQRbFq38Sd6KBxHuOIU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.9 h1:Qf1aWwnsNkyAoqDqmdM3nHwN78XQjec27LjM6b9vyfI= -github.com/aws/aws-sdk-go-v2/service/sts v1.18.9/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= -github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.14.2 h1:MJU9hqBGbvWZdApzpvoF2WAIJDbtjK2NDJSiJP7HblQ= -github.com/aws/smithy-go v1.14.2/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 h1:Dr+ezPI5ivhMn/3WOoB86XzMhie146DNaBbhaQWZHMY= -github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/bsm/ginkgo/v2 v2.9.5 h1:rtVBYPs3+TC5iLUVOis1B9tjLTup7Cj5IfzosKtvTJ0= -github.com/bsm/ginkgo/v2 v2.9.5/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y= -github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= -github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= -github.com/bytedance/sonic v1.10.0 h1:qtNZduETEIWJVIyDl01BeNxur2rW9OwTQ/yBqFRkKEk= -github.com/bytedance/sonic v1.10.0/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= -github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= -github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4= -github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= -github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= -github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= -github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= -github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= -github.com/confluentinc/confluent-kafka-go v1.9.2 h1:gV/GxhMBUb03tFWkN+7kdhg+zf+QUM+wVkI9zwh770Q= -github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pnwWZElUoWxHoV8E43DCrliyo= -github.com/confluentinc/confluent-kafka-go/v2 v2.2.0 h1:qy+SfqDauR/TX2qH2VuZqA1rcEAqApBYtHpI6rcqM0U= -github.com/confluentinc/confluent-kafka-go/v2 v2.2.0/go.mod h1:mfGzHbxQ6LRc25qqaLotDHkhdYmeZQ3ctcKNlPUjDW4= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= -github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= -github.com/containerd/containerd v1.7.0 h1:G/ZQr3gMZs6ZT0qPUZ15znx5QSdQdASW11nXTLTM2Pg= -github.com/containerd/containerd v1.7.0/go.mod h1:QfR7Efgb/6X2BDpTPJRvPTYDE9rsF0FsXX9J8sIs/sc= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= -github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= -github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= -github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= -github.com/dimfeld/httptreemux/v5 v5.5.0 h1:p8jkiMrCuZ0CmhwYLcbNbl7DDo21fozhKHQ2PccwOFQ= -github.com/dimfeld/httptreemux/v5 v5.5.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= -github.com/dnephin/pflag v1.0.7/go.mod h1:uxE91IoWURlOiTUIA8Mq5ZZkAv3dPUfZNaT80Zm7OQE= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= -github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v20.10.17+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v23.0.4+incompatible h1:Kd3Bh9V/rO+XpTP/BLqM+gx8z7+Yb0AA2Ibj+nNo4ek= -github.com/docker/docker v23.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= -github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= -github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 h1:8EXxF+tCLqaVk8AOC29zl2mnhQjwyLxxOTuhUazWRsg= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4/go.mod h1:I5sHm0Y0T1u5YjlyqC5GVArM7aNZRUYtTjmJ8mPJFds= -github.com/ebitengine/purego v0.6.0-alpha.5 h1:EYID3JOAdmQ4SNZYJHu9V6IqOeRQDBYxqKAg9PyoHFY= -github.com/ebitengine/purego v0.6.0-alpha.5/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/elastic/elastic-transport-go/v8 v8.1.0 h1:NeqEz1ty4RQz+TVbUrpSU7pZ48XkzGWQj02k5koahIE= -github.com/elastic/elastic-transport-go/v8 v8.1.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= -github.com/elastic/go-elasticsearch/v6 v6.8.5 h1:U2HtkBseC1FNBmDr0TR2tKltL6FxoY+niDAlj5M8TK8= -github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= -github.com/elastic/go-elasticsearch/v7 v7.17.1 h1:49mHcHx7lpCL8cW1aioEwSEVKQF3s+Igi4Ye/QTWwmk= -github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= -github.com/elastic/go-elasticsearch/v8 v8.4.0 h1:Rn1mcqaIMcNT43hnx2H62cIFZ+B6mjWtzj85BDKrvCE= -github.com/elastic/go-elasticsearch/v8 v8.4.0/go.mod h1:yY52i2Vj0unLz+N3Nwx1gM5LXwoj3h2dgptNGBYkMLA= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= -github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= -github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= -github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk= -github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= -github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= -github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/garyburd/redigo v1.6.4 h1:LFu2R3+ZOPgSMWMOL+saa/zXRjw0ID2G8FepO53BGlg= -github.com/garyburd/redigo v1.6.4/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw= -github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= -github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= -github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= -github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= -github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= -github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= -github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= -github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= -github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= -github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= -github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= -github.com/go-pg/pg/v10 v10.11.1 h1:vYwbFpqoMpTDphnzIPshPPepdy3VpzD8qo29OFKp4vo= -github.com/go-pg/pg/v10 v10.11.1/go.mod h1:ExJWndhDNNftBdw1Ow83xqpSf4WMSJK8urmXD5VXS1I= -github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU= -github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.1 h1:BSe8uhN+xQ4r5guV/ywQI4gO59C2raYcGffYWZEjZzM= -github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= -github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= -github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg= -github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= -github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= -github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= -github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= -github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= -github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= -github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.5 h1:8IYp3w9nysqv3JH+NJgXJzGbDHzLOTj43BmSkp+O7qg= -github.com/google/s2a-go v0.1.5/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= -github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM= -github.com/googleapis/enterprise-certificate-proxy v0.2.5/go.mod h1:RxW0N9901Cko1VOCW3SXCpWP+mlIEkk2tP7jnHy9a3w= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= -github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= -github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= -github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= -github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= -github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= -github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= -github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= -github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= -github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= -github.com/graphql-go/handler v0.2.3 h1:CANh8WPnl5M9uA25c2GBhPqJhE53Fg0Iue/fRNla71E= -github.com/graphql-go/handler v0.2.3/go.mod h1:leLF6RpV5uZMN1CdImAxuiayrYYhOk33bZciaUGaXeU= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= -github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= -github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= -github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= -github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= -github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= -github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= -github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= -github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= -github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= -github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= -github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= -github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE= -github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= -github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= -github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= -github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hashicorp/vault/api v1.9.2 h1:YjkZLJ7K3inKgMZ0wzCU9OHqc+UqMQyXsPXnf3Cl2as= -github.com/hashicorp/vault/api v1.9.2/go.mod h1:jo5Y/ET+hNyz+JnKDt8XLAdKs+AM0G5W0Vp1IrFI8N8= -github.com/hashicorp/vault/sdk v0.9.2 h1:H1kitfl1rG2SHbeGEyvhEqmIjVKE3E6c2q3ViKOs6HA= -github.com/hashicorp/vault/sdk v0.9.2/go.mod h1:gG0lA7P++KefplzvcD3vrfCmgxVAM7Z/SqX5NeOL/98= -github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= -github.com/heetch/avro v0.4.4/go.mod h1:c0whqijPh/C+RwnXzAHFit01tdtf7gMeEHYSbICxJjU= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= -github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= -github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= -github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= -github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= -github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= -github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= -github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= -github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= -github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= -github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= -github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= -github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= -github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jhump/protoreflect v1.14.1/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= -github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= -github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= -github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= -github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= -github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.1 h1:NE3C767s2ak2bweCZo3+rdP4U/HoyVXLv/X9f2gPS5g= -github.com/klauspost/compress v1.17.1/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= -github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= -github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= -github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= -github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8= -github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= -github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= -github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/microsoft/go-mssqldb v0.19.0/go.mod h1:ukJCBnnzLzpVF0qYRT+eg1e+eSwjeQ7IvenUv8QPook= -github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= -github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= -github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= -github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/patternmatcher v0.5.0 h1:YCZgJOeULcxLw1Q+sVR636pmS7sPEn1Qo2iAN6M7DBo= -github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= -github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/sys/mount v0.3.3/go.mod h1:PBaEorSNTLG5t/+4EgukEQVlAvVEc6ZjTySwKdqp5K0= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= -github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= -github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= -github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= -github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= -github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= -github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= -github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= -github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= -github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs= -github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= -github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= -github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.3/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= -github.com/opencontainers/runc v1.1.6 h1:XbhB8IfG/EsnhNvZtNdLB0GBw92GYEFvKlhaJk9jUgA= -github.com/opencontainers/runc v1.1.6/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-feature/go-sdk v1.17.0 h1:/OUBBw5d9D61JaNZZxb2Nnr5/EJrEpjtKCTY3rspJQk= +github.com/open-feature/go-sdk v1.17.0/go.mod h1:lPxPSu1UnZ4E3dCxZi5gV3et2ACi8O8P+zsTGVsDZUw= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= -github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 h1:jYi87L8j62qkXzaYHAQAhEapgukhenIMZRBKTNRLHJ4= -github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= -github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= -github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= -github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= -github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/redis/go-redis/v9 v9.1.0 h1:137FnGdk+EQdCbye1FW+qOEcY5S+SpY9T0NiuqvtfMY= -github.com/redis/go-redis/v9 v9.1.0/go.mod h1:urWj3He21Dj5k4TK1y59xH8Uj6ATueP8AH1cY3lZl4c= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= +github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= -github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= -github.com/santhosh-tekuri/jsonschema/v5 v5.2.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= -github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= -github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= -github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/testcontainers/testcontainers-go v0.14.0 h1:h0D5GaYG9mhOWr2qHdEKDXpkce/VlvaYOCzTRi6UBi8= -github.com/testcontainers/testcontainers-go v0.14.0/go.mod h1:hSRGJ1G8Q5Bw2gXgPulJOLlEBaYJHeBSOkQM5JLG+JQ= -github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= -github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8= -github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= -github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= -github.com/tidwall/buntdb v1.3.0 h1:gdhWO+/YwoB2qZMeAU9JcWWsHSYU3OvcieYgFRS0zwA= -github.com/tidwall/buntdb v1.3.0/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= -github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg= -github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= -github.com/tidwall/grect v0.1.4 h1:dA3oIgNgWdSspFzn1kS4S/RDpZFLrIxAZOdJKjYapOg= -github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q= -github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8= -github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8= -github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= -github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= -github.com/tidwall/rtred v0.1.2 h1:exmoQtOLvDoO8ud++6LwVsAMTu0KPzLTUrMln8u1yu8= -github.com/tidwall/rtred v0.1.2/go.mod h1:hd69WNXQ5RP9vHd7dqekAz+RIdtfBogmglkZSRxCHFQ= -github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaymYE= -github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q096fQP5zMYw= -github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= -github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= -github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= -github.com/twitchtv/twirp v8.1.3+incompatible h1:+F4TdErPgSUbMZMwp13Q/KgDVuI7HJXP61mNV3/7iuU= -github.com/twitchtv/twirp v8.1.3+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A= -github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= -github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/uptrace/bun v1.1.17 h1:qxBaEIo0hC/8O3O6GrMDKxqyT+mw5/s0Pn/n6xjyGIk= -github.com/uptrace/bun v1.1.17/go.mod h1:hATAzivtTIRsSJR4B8AXR+uABqnQxr3myKDKEf5iQ9U= -github.com/uptrace/bun/dialect/sqlitedialect v1.1.17 h1:i8NFU9r8YuavNFaYlNqi4ppn+MgoHtqLgpWQDrVTjm0= -github.com/uptrace/bun/dialect/sqlitedialect v1.1.17/go.mod h1:YF0FO4VVnY9GHNH6rM4r3STlVEBxkOc6L88Bm5X5mzA= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= -github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= -github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/vektah/gqlparser/v2 v2.5.16 h1:1gcmLTvs3JLKXckwCwlUagVn/IlV2bwqle0vJ0vy5p8= -github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94= -github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ= -github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= -github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= -github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= -github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= -github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= -github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= -github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= -github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= -github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= -github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= -go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0 h1:KfYpVmrjI7JuToy5k8XV3nkapjWx48k4E4JOtVstzQI= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc= -go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v1.20.0 h1:ZlrO8Hu9+GAhnepmRGhSU7/VkpjrNowxRN9GyKR4wzA= -go.opentelemetry.io/otel/metric v1.20.0/go.mod h1:90DRw3nfK4D7Sm/75yQ00gTJxtkBxX+wu6YaNymbpVM= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ= -go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= -golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= -golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= -golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= -golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= -golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= -golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= -golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= -golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs= -golang.org/x/oauth2 v0.9.0/go.mod h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220224120231-95c6836cb0e7/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220405210540-1e041c57c461/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= -golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= -gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= -gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= -gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= -google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= -google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= -google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= -google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= -google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= -google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= -google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= -google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= -google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= -google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= -google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= -google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= -google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= -google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= -google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= -google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= -google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= -google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= -google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= -google.golang.org/api v0.128.0 h1:RjPESny5CnQRn9V6siglged+DZCgfu9l6mO9dkX9VOg= -google.golang.org/api v0.128.0/go.mod h1:Y611qgqaE92On/7g65MQgxYul3c0rEB894kniWLY750= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= -google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= -google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= -google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= -google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= -google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= -google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= -google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= -google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= -google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= -google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= -google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= -google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= -google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= -google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= -google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= -google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc h1:8DyZCyvI8mE1IdLy/60bS+52xfymkE72wv1asokgtao= -google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc h1:kVKPf/IiYSBWEWtkIn6wZXwWGCnLKcC8oWfZvXjsGnM= -google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc h1:XSJ8Vk1SWuNr8S18z1NZSziL0CPIXLCCMDOEFtHBOFc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= -google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= -google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/jinzhu/gorm.v1 v1.9.2 h1:sTqyEcgrxG68jdeUXA9syQHNdeRhhfaYZ+vcL3x730I= -gopkg.in/jinzhu/gorm.v1 v1.9.2/go.mod h1:56JJPUzbikvTVnoyP1nppSkbJ2L8sunqTBDY2fDrmFg= -gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olivere/elastic.v3 v3.0.75 h1:u3B8p1VlHF3yNLVOlhIWFT3F1ICcHfM5V6FFJe6pPSo= -gopkg.in/olivere/elastic.v3 v3.0.75/go.mod h1:yDEuSnrM51Pc8dM5ov7U8aI/ToR3PG0llA8aRv2qmw0= -gopkg.in/olivere/elastic.v5 v5.0.84 h1:acF/tRSg5geZpE3rqLglkS79CQMIMzOpWZE7hRXIkjs= -gopkg.in/olivere/elastic.v5 v5.0.84/go.mod h1:LXF6q9XNBxpMqrcgax95C6xyARXWbbCXUrtTxrNrxJI= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= -gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= -gorm.io/driver/postgres v1.4.6 h1:1FPESNXqIKG5JmraaH2bfCVlMQ7paLoCreFxDtqzwdc= -gorm.io/driver/postgres v1.4.6/go.mod h1:UJChCNLFKeBqQRE+HrkFUbKbq9idPXmTOk2u4Wok8S4= -gorm.io/driver/sqlserver v1.4.2 h1:nMtEeKqv2R/vv9FoHUFWfXfP6SskAgRar0TPlZV1stk= -gorm.io/driver/sqlserver v1.4.2/go.mod h1:XHwBuB4Tlh7DqO0x7Ema8dmyWsQW7wi38VQOAFkrbXY= -gorm.io/gorm v1.9.19/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= -gorm.io/gorm v1.24.0/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= -gorm.io/gorm v1.25.3 h1:zi4rHZj1anhZS2EuEODMhDisGy+Daq9jtPrNGgbQYD8= -gorm.io/gorm v1.25.3/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/gotestsum v1.8.2/go.mod h1:6JHCiN6TEjA7Kaz23q1bH0e2Dc3YJjDUZ0DmctFZf+w= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/api v0.23.17 h1:gC11V5AIsNXUUa/xd5RQo7djukvl5O1ZDQKwEYu0H7g= -k8s.io/api v0.23.17/go.mod h1:upM9VIzXUjEyLTmGGi0KnH8kdlPnvgv+fEJ3tggDHfE= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apimachinery v0.23.17 h1:ipJ0SrpI6EzH8zVw0WhCBldgJhzIamiYIumSGTdFExY= -k8s.io/apimachinery v0.23.17/go.mod h1:87v5Wl9qpHbnapX1PSNgln4oO3dlyjAU3NSIwNhT4Lo= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/client-go v0.23.17 h1:MbW05RO5sy+TFw2ds36SDdNSkJbr8DFVaaVrClSA8Vs= -k8s.io/client-go v0.23.17/go.mod h1:X5yz7nbJHS7q8977AKn8BWKgxeAXjl1sFsgstczUsCM= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0 h1:bUO6drIvCIsvZ/XFgfxoGFQU/a4Qkh0iAlvUR7vlHJw= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4= -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE= -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= -mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= -modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= -modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= -modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= -modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= -modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= -modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= -modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= -modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= -modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= -modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= -modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= -modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= -modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= -modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= -modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= -modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= -modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= -modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= -modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= -modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= -modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= -nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s= -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= -sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/go.work b/go.work new file mode 100644 index 0000000000..e57d491015 --- /dev/null +++ b/go.work @@ -0,0 +1,79 @@ +go 1.24.0 // Go version must match the lowest supported version, not the highest, with format X.Y. + +use ( + . + ./.github/workflows/apps + ./contrib/99designs/gqlgen + ./contrib/IBM/sarama + ./contrib/Shopify/sarama + ./contrib/aws/aws-sdk-go + ./contrib/aws/aws-sdk-go-v2 + ./contrib/aws/datadog-lambda-go + ./contrib/bradfitz/gomemcache + ./contrib/cloud.google.com/go/pubsub.v1 + ./contrib/cloud.google.com/go/pubsub.v2 + ./contrib/confluentinc/confluent-kafka-go/kafka + ./contrib/confluentinc/confluent-kafka-go/kafka.v2 + ./contrib/database/sql + ./contrib/dimfeld/httptreemux.v5 + ./contrib/elastic/go-elasticsearch.v6 + ./contrib/emicklei/go-restful.v3 + ./contrib/envoyproxy/go-control-plane + ./contrib/gin-gonic/gin + ./contrib/globalsign/mgo + ./contrib/go-chi/chi + ./contrib/go-chi/chi.v5 + ./contrib/go-pg/pg.v10 + ./contrib/go-redis/redis + ./contrib/go-redis/redis.v7 + ./contrib/go-redis/redis.v8 + ./contrib/go.mongodb.org/mongo-driver + ./contrib/go.mongodb.org/mongo-driver.v2 + ./contrib/gocql/gocql + ./contrib/gofiber/fiber.v2 + ./contrib/gomodule/redigo + ./contrib/google.golang.org/api + ./contrib/google.golang.org/api/internal/gen_endpoints + ./contrib/google.golang.org/grpc + ./contrib/gorilla/mux + ./contrib/gorm.io/gorm.v1 + ./contrib/graph-gophers/graphql-go + ./contrib/graphql-go/graphql + ./contrib/haproxy/stream-processing-offload + ./contrib/hashicorp/consul + ./contrib/hashicorp/vault + ./contrib/jackc/pgx.v5 + ./contrib/jmoiron/sqlx + ./contrib/julienschmidt/httprouter + ./contrib/k8s.io/client-go + ./contrib/k8s.io/gateway-api + ./contrib/labstack/echo.v4 + ./contrib/log/slog + ./contrib/miekg/dns + ./contrib/net/http + ./contrib/olivere/elastic.v5 + ./contrib/redis/go-redis.v9 + ./contrib/redis/rueidis + ./contrib/segmentio/kafka-go + ./contrib/sirupsen/logrus + ./contrib/syndtr/goleveldb + ./contrib/tidwall/buntdb + ./contrib/twitchtv/twirp + ./contrib/uptrace/bun + ./contrib/urfave/negroni + ./contrib/valkey-io/valkey-go + ./contrib/valyala/fasthttp + ./instrumentation/internal/namingschematest + ./instrumentation/internal/validationtest + ./instrumentation/testutils/containers + ./instrumentation/testutils/grpc + ./internal/apps + ./internal/exectracetest + ./internal/orchestrion/_integration + ./internal/setup-smoke-test + ./internal/traceprof/traceproftest + ./orchestrion/all + ./scripts/fixmodules + ./tools/v2fix + ./tools/v2fix/_stage +) diff --git a/go.work.sum b/go.work.sum new file mode 100644 index 0000000000..9836a4e936 --- /dev/null +++ b/go.work.sum @@ -0,0 +1,3335 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898 h1:SC+c6A1qTFstO9qmB86mPV2IpYme/2ZoEQ0hrP+wo+Q= +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cel.dev/expr v0.16.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.19.0 h1:lXuo+nDhpyJSpWxpPVi5cPUwzKb+dsdOiw6IreM5yt0= +cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.23.0 h1:wUb94w6OYQS4uXraxo9U+wUAs9jT47Xvl4iPgAwM2ss= +cel.dev/expr v0.23.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= +cloud.google.com/go v0.121.2/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw= +cloud.google.com/go/accessapproval v1.7.6 h1:fMbP4cJX/926h+kwGtABmcG83PXsjkB+q7nSBzZpJoo= +cloud.google.com/go/accessapproval v1.7.6/go.mod h1:bdDCS3iLSLhlK3pu8lJClaeIVghSpTLGChl1Ihr9Fsc= +cloud.google.com/go/accessapproval v1.8.1 h1:WC6pA5Gyqkrvdc18AHvriShwk8wgMe9EWvBAQSLxTc8= +cloud.google.com/go/accessapproval v1.8.1/go.mod h1:3HAtm2ertsWdwgjSGObyas6fj3ZC/3zwV2WVZXO53sU= +cloud.google.com/go/accessapproval v1.8.6 h1:UkmDPCKvj24bkGVrvgJPcgSDkmIPw/bAmOiDb9avOiE= +cloud.google.com/go/accessapproval v1.8.6/go.mod h1:FfmTs7Emex5UvfnnpMkhuNkRCP85URnBFt5ClLxhZaQ= +cloud.google.com/go/accessapproval v1.8.7 h1:Sc9ZjxFBEM/PoAxNlUwVGDcv8DYyjLYWDxHlzPG0q5I= +cloud.google.com/go/accessapproval v1.8.7/go.mod h1:BFvZOW4GJjJnl6aA/YDEg0TGViFHyusa/bMdcVFmh8A= +cloud.google.com/go/accesscontextmanager v1.8.6 h1:NipmPd3BCzwa/mr40SK8pWRkbzv9Th5Azhi4dBYazlM= +cloud.google.com/go/accesscontextmanager v1.8.6/go.mod h1:rMC0Z8pCe/JR6yQSksprDc6swNKjMEvkfCbaesh+OS0= +cloud.google.com/go/accesscontextmanager v1.9.1 h1:+C7HM05/h80znK+8VNu25wAimueda6/NGNdus+jxaHI= +cloud.google.com/go/accesscontextmanager v1.9.1/go.mod h1:wUVSoz8HmG7m9miQTh6smbyYuNOJrvZukK5g6WxSOp0= +cloud.google.com/go/accesscontextmanager v1.9.6 h1:2LnncRqfYB8NEdh9+FeYxAt9POTW/0zVboktnRlO11w= +cloud.google.com/go/accesscontextmanager v1.9.6/go.mod h1:884XHwy1AQpCX5Cj2VqYse77gfLaq9f8emE2bYriilk= +cloud.google.com/go/aiplatform v1.64.0 h1:4X8As3ZDAg71d8l1f6vI/09MaIalXSMZ0nDrLY1wmbo= +cloud.google.com/go/aiplatform v1.64.0/go.mod h1:JgoDhy2d7FrTU2BlJ4S0j/NXRVCYZvaAXblMC29X/m4= +cloud.google.com/go/aiplatform v1.68.0 h1:EPPqgHDJpBZKRvv+OsB3cr0jYz3EL2pZ+802rBPcG8U= +cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= +cloud.google.com/go/aiplatform v1.84.0 h1:a+zcIqsfQUvGTvR86FxbwmRisPDQ1fU3JFNuD72Mz50= +cloud.google.com/go/aiplatform v1.84.0/go.mod h1:W6FAlM4b8ynKttHNmElWlDmDkd+asSRK+R2gO1wqFEI= +cloud.google.com/go/aiplatform v1.95.0 h1:1BsarntgY5PgnlAtADCK6tBKCr966zCUbxZ48BrZdCo= +cloud.google.com/go/aiplatform v1.95.0/go.mod h1:M5nwhnVdHzhC9dWc0QRjVl88+7inOALb+9V30jnLECk= +cloud.google.com/go/analytics v0.23.1 h1:UH/PWBcPxHKolWxaS3hO+aj+wDTuq7XKvdtpqR3lyOI= +cloud.google.com/go/analytics v0.23.1/go.mod h1:N+piBUJo0RfnVTa/u8E/d31jAxxQaHlnoJfUx0dechM= +cloud.google.com/go/analytics v0.25.1 h1:tMlK9KGTwHYASagAHXXbIPUVCRknA0Yv4jquim5HdRE= +cloud.google.com/go/analytics v0.25.1/go.mod h1:hrAWcN/7tqyYwF/f60Nph1yz5UE3/PxOPzzFsJgtU+Y= +cloud.google.com/go/analytics v0.28.0 h1:Bs17XtOjd+BhJtn+4QsCo8huMt7Zzziqn0umPz8ov2A= +cloud.google.com/go/analytics v0.28.0/go.mod h1:hNT09bdzGB3HsL7DBhZkoPi4t5yzZPZROoFv+JzGR7I= +cloud.google.com/go/analytics v0.29.0 h1:oYiABctb2wxUs1khR6vpC/T4P1EN27yvKI6Fxqzuv8E= +cloud.google.com/go/analytics v0.29.0/go.mod h1:NysnqKYB3101TBxuyEciW+wxmcGn44tmbq/pu9IsHcY= +cloud.google.com/go/apigateway v1.6.6 h1:60GMRN1JFwq9MldvEVMdR3gDJ0vI0C/BwgkImG6bx/M= +cloud.google.com/go/apigateway v1.6.6/go.mod h1:bFH3EwOkeEC+31wVxKNuiadhk2xa7y9gJ3rK4Mctq6o= +cloud.google.com/go/apigateway v1.7.1 h1:BeR+5NtpGxsUoK8wa/IPkanORjqZdlyNmXZ8ke3tOhc= +cloud.google.com/go/apigateway v1.7.1/go.mod h1:5JBcLrl7GHSGRzuDaISd5u0RKV05DNFiq4dRdfrhCP0= +cloud.google.com/go/apigateway v1.7.6 h1:do+u3rjDYuTxD2ypRfv4uwTMoy/VHFLclvaYcb5Mv6I= +cloud.google.com/go/apigateway v1.7.6/go.mod h1:SiBx36VPjShaOCk8Emf63M2t2c1yF+I7mYZaId7OHiA= +cloud.google.com/go/apigateway v1.7.7 h1:ehKUTy+QFsb3n07fEi18S2dpDDjCV4UlRyrbwfZV3Zk= +cloud.google.com/go/apigateway v1.7.7/go.mod h1:j1bCmrUK1BzVHpiIyTApxB7cRyhivKzltqLmp6j6i7U= +cloud.google.com/go/apigeeconnect v1.6.6 h1:ObsKNGtdu0ckkCSUpCN5fVAVg+DmzFg89JlqsW4OAWk= +cloud.google.com/go/apigeeconnect v1.6.6/go.mod h1:j8V/Xj51tEUl/cWnqwlolPvCpHj5OvgKrHEGfmYXG9Y= +cloud.google.com/go/apigeeconnect v1.7.1 h1:yMWIb/lv69K7Qz6Brv63u6gIACefIPKQSiI2aFXnJxo= +cloud.google.com/go/apigeeconnect v1.7.1/go.mod h1:olkn1lOhIA/aorreenFzfEcEXmFN2pyAwkaUFbug9ZY= +cloud.google.com/go/apigeeconnect v1.7.6 h1:ijEJSni5xROOn1YyiHgqcW0B0TWr0di9VgIi2gvyNjY= +cloud.google.com/go/apigeeconnect v1.7.6/go.mod h1:zqDhHY99YSn2li6OeEjFpAlhXYnXKl6DFb/fGu0ye2w= +cloud.google.com/go/apigeeconnect v1.7.7 h1:S6s2zojwMymx0fyZYKm0eK1TdDxrriIBAlNVvRAOzug= +cloud.google.com/go/apigeeconnect v1.7.7/go.mod h1:ftGK3nca0JePiVLl0A6alaMjKdOc5C+sAkFMyH2RH8U= +cloud.google.com/go/apigeeregistry v0.8.4 h1:l8VFHdNMC+9Q4EHKye2eOZBu5IwddXF6ufAXI7D+PB8= +cloud.google.com/go/apigeeregistry v0.8.4/go.mod h1:oA6iN7olOol8Rc28n1qd2q0LSD3ro2pdf/1l/y8SK4E= +cloud.google.com/go/apigeeregistry v0.9.1 h1:AfMllcPbJ+qMgbYK2bC5QDPd8SmE8wQ5msiDILuxVm4= +cloud.google.com/go/apigeeregistry v0.9.1/go.mod h1:XCwK9CS65ehi26z7E8/Vl4PEX5c/JJxpfxlB1QEyrZw= +cloud.google.com/go/apigeeregistry v0.9.6 h1:TgdjAoGoRY81DEc2LYsYvi/OqCFImMzAk/TVKiSRsQw= +cloud.google.com/go/apigeeregistry v0.9.6/go.mod h1:AFEepJBKPtGDfgabG2HWaLH453VVWWFFs3P4W00jbPs= +cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= +cloud.google.com/go/appengine v1.8.6 h1:cM+Lj0A0nCtujM9lqRId5L8hz7bHRfu3q3KdKtpn+38= +cloud.google.com/go/appengine v1.8.6/go.mod h1:J0Vk696gUey9gbmTub3Qe4NYPy6qulXMkfwcQjadFnM= +cloud.google.com/go/appengine v1.9.1 h1:mQMmn1Dv0DDLsDjYxfS+cVwQa8+ue++ymVeD1jkXze0= +cloud.google.com/go/appengine v1.9.1/go.mod h1:jtguveqRWFfjrk3k/7SlJz1FpDBZhu5CWSRu+HBgClk= +cloud.google.com/go/appengine v1.9.6 h1:JJyY8icMmQeWfQ+d36IhkGvd3Guzvw0UAkvxT0wmUx8= +cloud.google.com/go/appengine v1.9.6/go.mod h1:jPp9T7Opvzl97qytaRGPwoH7pFI3GAcLDaui1K8PNjY= +cloud.google.com/go/appengine v1.9.7 h1:IxGz6j5xv0nTJX285wu95Vn6KEi2CeV9vbyRgCSEAoU= +cloud.google.com/go/appengine v1.9.7/go.mod h1:y1XpGVeAhbsNzHida79cHbr3pFRsym0ob8xnC8yphbo= +cloud.google.com/go/area120 v0.8.6 h1:7QJ4ZzqLOwh0pHD3UAa+VwiyWmDI7bdmkYKVkte8/wg= +cloud.google.com/go/area120 v0.8.6/go.mod h1:sjEk+S9QiyDt1fxo75TVut560XZLnuD9lMtps0qQSH0= +cloud.google.com/go/area120 v0.9.1 h1:YfDWbKHRHmhpd8ejTmAeK6eYi3n0qJKvPNEj1ON19PY= +cloud.google.com/go/area120 v0.9.1/go.mod h1:foV1BSrnjVL/KydBnAlUQFSy85kWrMwGSmRfIraC+JU= +cloud.google.com/go/area120 v0.9.6 h1:iJrZ6AleZr4l+q0/fWVANFOhs90KiSB1Ccait5OYyNg= +cloud.google.com/go/area120 v0.9.6/go.mod h1:qKSokqe0iTmwBDA3tbLWonMEnh0pMAH4YxiceiHUed4= +cloud.google.com/go/area120 v0.9.7 h1:BbpzLwaIXVPorrrzTH+ni7P5mLemmPPfSZ7o39k7zQc= +cloud.google.com/go/area120 v0.9.7/go.mod h1:5nJ0yksmjOMfc4Zpk+okWfJ3A1004FvB82rfia+ZLaY= +cloud.google.com/go/artifactregistry v1.14.8 h1:icIyRzJ1Ag6EOafuDuFFJ/AdStcOFRVfSGURn27/7Pk= +cloud.google.com/go/artifactregistry v1.14.8/go.mod h1:1UlSXh6sTXYrIT4kMO21AE1IDlMFemlZuX6QS+JXW7I= +cloud.google.com/go/artifactregistry v1.15.1 h1:ANE2nBEqP2vGGA/5plRRUpatT3E/3ydSK8Z+lXiV69s= +cloud.google.com/go/artifactregistry v1.15.1/go.mod h1:ExJb4VN+IMTQWO5iY+mjcY19Rz9jUxCVGZ1YuyAgPBw= +cloud.google.com/go/artifactregistry v1.17.1 h1:A20kj2S2HO9vlyBVyVFHPxArjxkXvLP5LjcdE7NhaPc= +cloud.google.com/go/artifactregistry v1.17.1/go.mod h1:06gLv5QwQPWtaudI2fWO37gfwwRUHwxm3gA8Fe568Hc= +cloud.google.com/go/asset v1.18.1 h1:+NpxL5L53VY91EoJTHeGGXSWEUllf2hhXpCyTnSrd3Q= +cloud.google.com/go/asset v1.18.1/go.mod h1:QXivw0mVqwrhZyuX6iqFbyfCdzYE9AFCJVG47Eh5dMM= +cloud.google.com/go/asset v1.20.2 h1:wAGSAzAmMC/KEFGZ6Z0zv3jOlz1fjBxuO7SiRX9FMuQ= +cloud.google.com/go/asset v1.20.2/go.mod h1:IM1Kpzzo3wq7R/GEiktitzZyXx2zVpWqs9/5EGYs0GY= +cloud.google.com/go/asset v1.20.6 h1:saCHXPtUh4W/mMQ/PDHabYhIaK2OtMeu3y7HHsTcwBM= +cloud.google.com/go/asset v1.20.6/go.mod h1:+mvmZxLHtpOWiwahrGzoTw3RlVTZK+0ZmEijerNbMF4= +cloud.google.com/go/asset v1.21.1 h1:i55wWC/EwVdHMyJgRfbLp/L6ez4nQuOpZwSxkuqN9ek= +cloud.google.com/go/asset v1.21.1/go.mod h1:7AzY1GCC+s1O73yzLM1IpHFLHz3ws2OigmCpOQHwebk= +cloud.google.com/go/assuredworkloads v1.11.6 h1:3NlUes0xLN2kcSU24qQADFYsOaetCPg0HSA302AyV5s= +cloud.google.com/go/assuredworkloads v1.11.6/go.mod h1:1dlhWKocQorGYkspt+scx11kQCI9qVHOi1Au6Rw9srg= +cloud.google.com/go/assuredworkloads v1.12.1 h1:B+hWc62fYL8NdntPjx0rzJJ67qx99w6dCeIVDpHf7QE= +cloud.google.com/go/assuredworkloads v1.12.1/go.mod h1:nBnkK2GZNSdtjU3ER75oC5fikub5/+QchbolKgnMI/I= +cloud.google.com/go/assuredworkloads v1.12.6 h1:ip/shfJYx6lrHBWYADjrrrubcm7uZzy50TTF5tPG7ek= +cloud.google.com/go/assuredworkloads v1.12.6/go.mod h1:QyZHd7nH08fmZ+G4ElihV1zoZ7H0FQCpgS0YWtwjCKo= +cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= +cloud.google.com/go/auth v0.9.3/go.mod h1:7z6VY+7h3KUdRov5F1i8NDP5ZzWKYmEPO842BgCsmTk= +cloud.google.com/go/auth v0.9.4/go.mod h1:SHia8n6//Ya940F1rLimhJCjjx7KE17t0ctFEci3HkA= +cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= +cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth v0.16.2/go.mod h1:sRBas2Y1fB1vZTdurouM0AzuYQBMZinrUYL8EufhtEA= +cloud.google.com/go/auth/oauth2adapt v0.2.2/go.mod h1:wcYjgpZI9+Yu7LyYBg4pqSiaRkfEK3GQcpb7C/uyF1Q= +cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go/automl v1.13.6 h1:NHBO5cjo2IgwaJ5qlez/iA35XI1db87PPlOB0Kjt5RM= +cloud.google.com/go/automl v1.13.6/go.mod h1:/0VtkKis6KhFJuPzi45e0E+e9AdQE09SNieChjJqU18= +cloud.google.com/go/automl v1.14.1 h1:IrNnM7oClTzfFcf5XgaZCGwicETU2aCmrGzE8U2DlVs= +cloud.google.com/go/automl v1.14.1/go.mod h1:BocG5mhT32cjmf5CXxVsdSM04VXzJW7chVT7CpSL2kk= +cloud.google.com/go/automl v1.14.7 h1:ZLj48Ur2Qcso4M3bgOtjsOmeV5Ee92N14wuOc8OW+L0= +cloud.google.com/go/automl v1.14.7/go.mod h1:8a4XbIH5pdvrReOU72oB+H3pOw2JBxo9XTk39oljObE= +cloud.google.com/go/baremetalsolution v1.2.5 h1:jCR4rnVsG6ocK6ngFr2Z6ugKZfTENmMZkiV6Ma2tEeE= +cloud.google.com/go/baremetalsolution v1.2.5/go.mod h1:CImy7oNMC/7vLV1Ig68Og6cgLWuVaghDrm+sAhYSSxA= +cloud.google.com/go/baremetalsolution v1.3.1 h1:Zbsrhw8vm4Byki+ynVuACZ6jxYiKzi1f8Hac5zXGD8Y= +cloud.google.com/go/baremetalsolution v1.3.1/go.mod h1:D1djGGmBl4M6VlyjOMc1SEzDYlO4EeEG1TCUv5mCPi0= +cloud.google.com/go/baremetalsolution v1.3.6 h1:9bdGlpY1LgLONQjFsDwrkjLzdPTlROpfU+GhA97YpOk= +cloud.google.com/go/baremetalsolution v1.3.6/go.mod h1:7/CS0LzpLccRGO0HL3q2Rofxas2JwjREKut414sE9iM= +cloud.google.com/go/batch v1.8.3 h1:b9fVZDxxp4LWMhXV7uAhyMGmPuzlzPrsZ0uh+RM92h8= +cloud.google.com/go/batch v1.8.3/go.mod h1:mnDskkuz1h+6i/ra8IMhTf8HwG8GOswSRKPJdAOgSbE= +cloud.google.com/go/batch v1.11.1 h1:50TRhaaZv7QDCb60KcZUPkGx1oO46srDp5076wZkgI8= +cloud.google.com/go/batch v1.11.1/go.mod h1:4GbJXfdxU8GH6uuo8G47y5tEFOgTLCL9pMKCUcn7VxE= +cloud.google.com/go/batch v1.12.2 h1:gWQdvdPplptpvrkqF6ibtxZkOsYKLTFbxYawHa/TvCg= +cloud.google.com/go/batch v1.12.2/go.mod h1:tbnuTN/Iw59/n1yjAYKV2aZUjvMM2VJqAgvUgft6UEU= +cloud.google.com/go/beyondcorp v1.0.5 h1:fnil8viEdcAJJiwiJPCT2fl3Grx3XFwXxTq7n9g/8QM= +cloud.google.com/go/beyondcorp v1.0.5/go.mod h1:lFRWb7i/w4QBFW3MbM/P9wX15eLjwri/HYvQnZuk4Fw= +cloud.google.com/go/beyondcorp v1.1.1 h1:owviaab14M9ySEvCj3EZdfzkRLnE+5j4JIkqVaQtEUU= +cloud.google.com/go/beyondcorp v1.1.1/go.mod h1:L09o0gLkgXMxCZs4qojrgpI2/dhWtasMc71zPPiHMn4= +cloud.google.com/go/beyondcorp v1.1.6 h1:4FcR+4QmcNGkhVij6TrYS4AQVNLBo7PBXKxNrKzpclQ= +cloud.google.com/go/beyondcorp v1.1.6/go.mod h1:V1PigSWPGh5L/vRRmyutfnjAbkxLI2aWqJDdxKbwvsQ= +cloud.google.com/go/bigquery v1.59.1 h1:CpT+/njKuKT3CEmswm6IbhNu9u35zt5dO4yPDLW+nG4= +cloud.google.com/go/bigquery v1.59.1/go.mod h1:VP1UJYgevyTwsV7desjzNzDND5p6hZB+Z8gZJN1GQUc= +cloud.google.com/go/bigquery v1.69.0 h1:rZvHnjSUs5sHK3F9awiuFk2PeOaB8suqNuim21GbaTc= +cloud.google.com/go/bigquery v1.69.0/go.mod h1:TdGLquA3h/mGg+McX+GsqG9afAzTAcldMjqhdjHTLew= +cloud.google.com/go/bigtable v1.21.0 h1:BFN4jhkA9ULYYV2Ug7AeOtetVLnN2jKuIq5TcRc5C38= +cloud.google.com/go/bigtable v1.21.0/go.mod h1:V0sYNRtk0dgAKjyRr/MyBpHpSXqh+9P39euf820EZ74= +cloud.google.com/go/bigtable v1.38.0 h1:L/PnUXRtAzFfa7qMULJHt4cXa/O2dqPJEkzYNGA4hfo= +cloud.google.com/go/bigtable v1.38.0/go.mod h1:o/lntJarF3Y5C0XYLMJLjLYwxaRbcrtM0BiV57ymXbI= +cloud.google.com/go/billing v1.18.4 h1:XcYB8aKj97d4/0kh+LQgrxPxOo/0jgPNp5Q1nyzCyvs= +cloud.google.com/go/billing v1.18.4/go.mod h1:hECVHwfls2hhA/wrNVAvZ48GQzMxjWkQRq65peAnxyc= +cloud.google.com/go/billing v1.19.1 h1:BtbMCM9QDWiszfNXEAcq0MB6vgCuc0/yzP3vye2Kz3U= +cloud.google.com/go/billing v1.19.1/go.mod h1:c5l7ORJjOLH/aASJqUqNsEmwrhfjWZYHX+z0fIhuVpo= +cloud.google.com/go/billing v1.20.4 h1:pqM5/c9UGydB9H90IPCxSvfCNLUPazAOSMsZkz5q5P4= +cloud.google.com/go/billing v1.20.4/go.mod h1:hBm7iUmGKGCnBm6Wp439YgEdt+OnefEq/Ib9SlJYxIU= +cloud.google.com/go/binaryauthorization v1.8.2 h1:XiAdW5HAWtk9WEjEA5MXYiRJ28Tjp1xGPPAMRFI5bnc= +cloud.google.com/go/binaryauthorization v1.8.2/go.mod h1:/v3/F2kBR5QmZBnlqqzq9QNwse8OFk+8l1gGNUzjedw= +cloud.google.com/go/binaryauthorization v1.9.1 h1:fVtOG5rVU0eaVh2G2ORdT7nigsnK1R1JpqfGzW861OM= +cloud.google.com/go/binaryauthorization v1.9.1/go.mod h1:jqBzP68bfzjoiMFT6Q1EdZtKJG39zW9ywwzHuv7V8ms= +cloud.google.com/go/binaryauthorization v1.9.5 h1:T0zYEroXT+y0O/x/yZd5SwQdFv4UbUINjvJyJKzDm0Q= +cloud.google.com/go/binaryauthorization v1.9.5/go.mod h1:CV5GkS2eiY461Bzv+OH3r5/AsuB6zny+MruRju3ccB8= +cloud.google.com/go/certificatemanager v1.8.0 h1:oc15T+leZ2Wm5oocvGTbDXwonka0chpJTEiHIVsBiEA= +cloud.google.com/go/certificatemanager v1.8.0/go.mod h1:5qq/D7PPlrMI+q9AJeLrSoFLX3eTkLc9MrcECKrWdIM= +cloud.google.com/go/certificatemanager v1.9.1 h1:fULhIdwsz3SoZfiXw8XaxSJBpRTR0xwsJleO+wEbbKA= +cloud.google.com/go/certificatemanager v1.9.1/go.mod h1:a6bXZULtd6iQTRuSVs1fopcHLMJ/T3zSpIB7aJaq/js= +cloud.google.com/go/certificatemanager v1.9.5 h1:+ZPglfDurCcsv4azizDFpBucD1IkRjWjbnU7zceyjfY= +cloud.google.com/go/certificatemanager v1.9.5/go.mod h1:kn7gxT/80oVGhjL8rurMUYD36AOimgtzSBPadtAeffs= +cloud.google.com/go/channel v1.17.6 h1:rBnTls9G5nC/jOrb9V/tZFHFXt6kBMNlIQKg6DjAlRM= +cloud.google.com/go/channel v1.17.6/go.mod h1:fr0Oidb2mPfA0RNcV+JMSBv5rjpLHjy9zVM5PFq6Fm4= +cloud.google.com/go/channel v1.19.0 h1:YdCa/Y6lhGVeR058gQGhTunEuR9zVuheukKL+pcldgI= +cloud.google.com/go/channel v1.19.0/go.mod h1:8BEvuN5hWL4tT0rmJR4N8xsZHdfGof+KwemjQH6oXsw= +cloud.google.com/go/channel v1.19.5 h1:UI+ZsRkS15hi9DRF+WAvTVLVuSeZiRmvCU8cjkjOwUU= +cloud.google.com/go/channel v1.19.5/go.mod h1:vevu+LK8Oy1Yuf7lcpDbkQQQm5I7oiY5fFTn3uwfQLY= +cloud.google.com/go/channel v1.20.0 h1:EeUa6SnD3+EL9B06G6N9Ud5/p/NtT6PC7lv5kmaUiHs= +cloud.google.com/go/channel v1.20.0/go.mod h1:nBR1Lz+/1TjSA16HTllvW9Y+QULODj3o3jEKrNNeOp4= +cloud.google.com/go/cloudbuild v1.16.0 h1:66hY1gXV2cdn4gquy5TieaJwaZmRzrQ5cK++pVgnCkQ= +cloud.google.com/go/cloudbuild v1.16.0/go.mod h1:CCWnqxLxEdh8kpOK83s3HTNBTpoIFn/U9j8DehlUyyA= +cloud.google.com/go/cloudbuild v1.18.0 h1:82f6g0AzacK1bbO0E5ZqixWc4nRzWu4ichIQ0QKNtAQ= +cloud.google.com/go/cloudbuild v1.18.0/go.mod h1:KCHWGIoS/5fj+By9YmgIQnUiDq8P6YURWOjX3hoc6As= +cloud.google.com/go/cloudbuild v1.22.2 h1:4LlrIFa3IFLgD1mGEXmUE4cm9fYoU71OLwTvjM7Dg3c= +cloud.google.com/go/cloudbuild v1.22.2/go.mod h1:rPyXfINSgMqMZvuTk1DbZcbKYtvbYF/i9IXQ7eeEMIM= +cloud.google.com/go/clouddms v1.7.5 h1:t1nc49kRzEU2vrDxQQIEc5rZ4Hr187YrdOZPMAgMwMI= +cloud.google.com/go/clouddms v1.7.5/go.mod h1:O4GVvxKPxbXlVfxkoUIXi8UAwwIHoszYm32dJ8tgbvE= +cloud.google.com/go/clouddms v1.8.1 h1:vf5R4/FoLHxEP2BBKEafLHfYFWa6Zd9gwrXe/FjrwUg= +cloud.google.com/go/clouddms v1.8.1/go.mod h1:bmW2eDFH1LjuwkHcKKeeppcmuBGS0r6Qz6TXanehKP0= +cloud.google.com/go/clouddms v1.8.7 h1:IWJbQBEECTaNanDRN1XdR7FU53MJ1nylTl3s9T3MuyI= +cloud.google.com/go/clouddms v1.8.7/go.mod h1:DhWLd3nzHP8GoHkA6hOhso0R9Iou+IGggNqlVaq/KZ4= +cloud.google.com/go/cloudsqlconn v1.4.3 h1:/WYFbB1NtMtoMxCbqpzzTFPDkxxlLTPme390KEGaEPc= +cloud.google.com/go/cloudsqlconn v1.4.3/go.mod h1:QL3tuStVOO70txb3rs4G8j5uMfo5ztZii8K3oGD3VYA= +cloud.google.com/go/cloudtasks v1.12.7 h1:Ev+poxwb7pudBhiF0ObwAWT7Dh9BZAcsvAfFTWg0MPc= +cloud.google.com/go/cloudtasks v1.12.7/go.mod h1:I6o/ggPK/RvvokBuUppsbmm4hrGouzFbf6fShIm0Pqc= +cloud.google.com/go/cloudtasks v1.13.1 h1:s1JTLBD+WbzQwxYPAwa2WIxPT3kOiv7MSKyvSEgNQtg= +cloud.google.com/go/cloudtasks v1.13.1/go.mod h1:dyRD7tEEkLMbHLagb7UugkDa77UVJp9d/6O9lm3ModI= +cloud.google.com/go/cloudtasks v1.13.6 h1:Fwan19UiNoFD+3KY0MnNHE5DyixOxNzS1mZ4ChOdpy0= +cloud.google.com/go/cloudtasks v1.13.6/go.mod h1:/IDaQqGKMixD+ayM43CfsvWF2k36GeomEuy9gL4gLmU= +cloud.google.com/go/compute v1.24.0/go.mod h1:kw1/T+h/+tK2LJK0wiPPx1intgdAM3j/g3hFDlscY40= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= +cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= +cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi8o= +cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= +cloud.google.com/go/compute v1.37.0 h1:XxtZlXYkZXub3LNaLu90TTemcFqIU1yZ4E4q9VlR39A= +cloud.google.com/go/compute v1.37.0/go.mod h1:AsK4VqrSyXBo4SMbRtfAO1VfaMjUEjEwv1UB/AwVp5Q= +cloud.google.com/go/compute v1.41.0 h1:S+HvMIzBUAFK/73wxkrA4/GwvM7R9d+egGZvih4kp+M= +cloud.google.com/go/compute v1.41.0/go.mod h1:P1doTJnlwurJDzIQFMp4mgU+vyCe9HU2NWTlqTfq3MY= +cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= +cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/contactcenterinsights v1.13.1 h1:sCDKUmDj9Tfd6Qj7x4XbwC43oYzEBwSDLC1tReQWS/Y= +cloud.google.com/go/contactcenterinsights v1.13.1/go.mod h1:/3Ji8Rr1GS6d+/MOwlXM2gZPSuvTKIFyf8OG+7Pe5r8= +cloud.google.com/go/contactcenterinsights v1.15.0 h1:jHwyL2TQTaLauRRz5Uv7/sL7PNAK1VAMy/UIT9vsFzk= +cloud.google.com/go/contactcenterinsights v1.15.0/go.mod h1:6bJGBQrJsnATv2s6Dh/c6HCRanq2kCZ0kIIjRV1G0mI= +cloud.google.com/go/contactcenterinsights v1.17.3 h1:lenyU3uzHwKDveCwmpfNxHYvLS3uEBWdn+O7+rSxy+Q= +cloud.google.com/go/contactcenterinsights v1.17.3/go.mod h1:7Uu2CpxS3f6XxhRdlEzYAkrChpR5P5QfcdGAFEdHOG8= +cloud.google.com/go/container v1.33.1 h1:0yEtOgltMArvXSI32Ju4mLqsboUeIWjbon5rIRBV8UA= +cloud.google.com/go/container v1.33.1/go.mod h1:YMtexsRfqya2bzydXVIkwRpvFXbgUM/TsESvn/Y1He8= +cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDsRDuI= +cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4= +cloud.google.com/go/container v1.42.4 h1:N8I+GiImhrSMUcKSOYTd8D6wBWyWSgPa4IJkSdlR2jk= +cloud.google.com/go/container v1.42.4/go.mod h1:wf9lKc3ayWVbbV/IxKIDzT7E+1KQgzkzdxEJpj1pebE= +cloud.google.com/go/container v1.44.0 h1:JEHeW535svvNwJrjrlQ/cdjd15LCWrPKnHsulrufd3A= +cloud.google.com/go/container v1.44.0/go.mod h1:tVK2o4UZUTkg9WpBcgj4qRzwGA1dSFdWA3mil3YkLIQ= +cloud.google.com/go/containeranalysis v0.11.5 h1:yzohQ0HDoZq2TtCJkbUBsJs9RIR5WbKZlHrD7ilp2yg= +cloud.google.com/go/containeranalysis v0.11.5/go.mod h1:DlgF5MaxAmGdq6F9wCUEp/JNx9lsr6QaQONFd4mxG8A= +cloud.google.com/go/containeranalysis v0.13.1 h1:opZRo0HEVLm4ylTbbXw/H68M3vQjdkYOSMfUY63+D+0= +cloud.google.com/go/containeranalysis v0.13.1/go.mod h1:bmd9H880BNR4Hc8JspEg8ge9WccSQfO+/N+CYvU3sEA= +cloud.google.com/go/containeranalysis v0.14.1 h1:1SoHlNqL3XrhqcoozB+3eoHif2sRUFtp/JeASQTtGKo= +cloud.google.com/go/containeranalysis v0.14.1/go.mod h1:28e+tlZgauWGHmEbnI5UfIsjMmrkoR1tFN0K2i71jBI= +cloud.google.com/go/datacatalog v1.20.0 h1:BGDsEjqpAo0Ka+b9yDLXnE5k+jU3lXGMh//NsEeDMIg= +cloud.google.com/go/datacatalog v1.20.0/go.mod h1:fSHaKjIroFpmRrYlwz9XBB2gJBpXufpnxyAKaT4w6L0= +cloud.google.com/go/datacatalog v1.22.1 h1:i0DyKb/o7j+0vgaFtimcRFjYsD6wFw1jpnODYUyiYRs= +cloud.google.com/go/datacatalog v1.22.1/go.mod h1:MscnJl9B2lpYlFoxRjicw19kFTwEke8ReKL5Y/6TWg8= +cloud.google.com/go/datacatalog v1.25.2 h1:FxV8ptfAjiF6tUOQ/sfXQydJ3j/CdZjrQI4wez/VLHU= +cloud.google.com/go/datacatalog v1.25.2/go.mod h1:jBw2nzUKY5YRUWtgBRLy87UvjMk6X3FOE4G+maT9rp0= +cloud.google.com/go/datacatalog v1.26.0 h1:eFgygb3DTufTWWUB8ARk+dSuXz+aefNJXTlkWlQcWwE= +cloud.google.com/go/datacatalog v1.26.0/go.mod h1:bLN2HLBAwB3kLTFT5ZKLHVPj/weNz6bR0c7nYp0LE14= +cloud.google.com/go/dataflow v0.9.6 h1:GuZJgkOL64cYySwYEYqQkggdxwoZTk8cvekQW0t3KRM= +cloud.google.com/go/dataflow v0.9.6/go.mod h1:nO0hYepRlPlulvAHCJ+YvRPLnL/bwUswIbhgemAt6eM= +cloud.google.com/go/dataflow v0.10.1 h1:RoVpCZ1BjJBH/5mzaXCgNg+l9FgTIYQ7C9xBRGvhkzo= +cloud.google.com/go/dataflow v0.10.1/go.mod h1:zP4/tNjONFRcS4NcI9R94YDQEkPalimdbPkijVNJt/g= +cloud.google.com/go/dataflow v0.10.6 h1:UKUD8I7So3H646JHZWcrYVgf2nuEB27l015zUErPnow= +cloud.google.com/go/dataflow v0.10.6/go.mod h1:Vi0pTYCVGPnM2hWOQRyErovqTu2xt2sr8Rp4ECACwUI= +cloud.google.com/go/dataflow v0.11.0 h1:AdhB4cAkMOC9NtrHJxpKOVvO/VqBLaIyk0tEEhbGjYM= +cloud.google.com/go/dataflow v0.11.0/go.mod h1:gNHC9fUjlV9miu0hd4oQaXibIuVYTQvZhMdPievKsPk= +cloud.google.com/go/dataform v0.9.3 h1:0EzWf+c2R5V/ujZBb22H/EL5wpzD/bDFYPA2f3czB1g= +cloud.google.com/go/dataform v0.9.3/go.mod h1:c/TBr0tqx5UgBTmg3+5DZvLxX+Uy5hzckYZIngkuU/w= +cloud.google.com/go/dataform v0.10.1 h1:FkOPrxf8sN9J2TMc4CIBhVivhMiO8D0eYN33s5A5Uo4= +cloud.google.com/go/dataform v0.10.1/go.mod h1:c5y0hIOBCfszmBcLJyxnELF30gC1qC/NeHdmkzA7TNQ= +cloud.google.com/go/dataform v0.11.2 h1:poGCMWMvu/t2SooaWDHJAJiUyAtWYzKy+SGDNez2RI0= +cloud.google.com/go/dataform v0.11.2/go.mod h1:IMmueJPEKpptT2ZLWlvIYjw6P/mYHHxA7/SUBiXqZUY= +cloud.google.com/go/dataform v0.12.0 h1:0eCPTPUC/RZ863aVfXTJLkg0tEpdpn62VD6ywSmmzxM= +cloud.google.com/go/dataform v0.12.0/go.mod h1:PuDIEY0lSVuPrZqcFji1fmr5RRvz3DGz4YP/cONc8g4= +cloud.google.com/go/datafusion v1.7.6 h1:zSmMj/qZ0Yk+q/v5Wg40FTJ0WYPCtanYYekRt7cSKJ0= +cloud.google.com/go/datafusion v1.7.6/go.mod h1:cDJfsWRYcaktcM1xfwkBOIccOaWJ5mG3zm95EaLtINA= +cloud.google.com/go/datafusion v1.8.1 h1:QqiQs3mSXl4gfeHGOTbK0v1y+tUOnxWJgXm6YWvoqY0= +cloud.google.com/go/datafusion v1.8.1/go.mod h1:I5+nRt6Lob4g1eCbcxP4ayRNx8hyOZ8kA3PB/vGd9Lo= +cloud.google.com/go/datafusion v1.8.6 h1:GZ6J+CR8CEeWAj8luRCtr8GvImSQRkArIIqGiZOnzBA= +cloud.google.com/go/datafusion v1.8.6/go.mod h1:fCyKJF2zUKC+O3hc2F9ja5EUCAbT4zcH692z8HiFZFw= +cloud.google.com/go/datalabeling v0.8.6 h1:2zz44bPbDMHsPanQ89SybqhHDQBH1EZk8icGotyrvSU= +cloud.google.com/go/datalabeling v0.8.6/go.mod h1:8gVcLufcZg0hzRnyMkf3UvcUen2Edo6abP6Rsz2jS6Q= +cloud.google.com/go/datalabeling v0.9.1 h1:FrnZKagECxQy1bL+GQ1bjgwK9+szi1l7gqw7zp+Raqs= +cloud.google.com/go/datalabeling v0.9.1/go.mod h1:umplHuZX+x5DItNPV5BFBXau5TDsljLNzEj5AB5uRUM= +cloud.google.com/go/datalabeling v0.9.6 h1:VOZ5U+78ttnhNCEID7qdeogqZQzK5N+LPHIQ9Q3YDsc= +cloud.google.com/go/datalabeling v0.9.6/go.mod h1:n7o4x0vtPensZOoFwFa4UfZgkSZm8Qs0Pg/T3kQjXSM= +cloud.google.com/go/dataplex v1.15.0 h1:Ob8NPT1UcB4kDaDx7/UdsRfZ8xUvUggZshXUlGWDahk= +cloud.google.com/go/dataplex v1.15.0/go.mod h1:R5rUQ3X18d6wcMraLOUIOTEULasL/1nvSrNF7C98eyg= +cloud.google.com/go/dataplex v1.19.1 h1:0pgI0DwijXZq8vyLuGnQXSi9JB6eUaVqzpzhN2veUeE= +cloud.google.com/go/dataplex v1.19.1/go.mod h1:WzoQ+vcxrAyM0cjJWmluEDVsg7W88IXXCfuy01BslKE= +cloud.google.com/go/dataplex v1.25.2 h1:jgfG6iqPVJxNPSpVCxH4diHMFb87wNd0F1kDgU3XJCk= +cloud.google.com/go/dataplex v1.25.2/go.mod h1:AH2/a7eCYvFP58scJGR7YlSY9qEhM8jq5IeOA/32IZ0= +cloud.google.com/go/dataplex v1.26.0 h1:nu8/KrLR5v62L1lApGNgm61Oq+xaa2bS9rgc1csjqE0= +cloud.google.com/go/dataplex v1.26.0/go.mod h1:12R9nlLUzxOscbb2HgoYnkGNibmv4sXEVMXxrdw2a90= +cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= +cloud.google.com/go/dataproc/v2 v2.4.1 h1:+cM8p/R6FdTuQYlriJOSUCvAZfMDgBKf0/ph9bMIjaY= +cloud.google.com/go/dataproc/v2 v2.4.1/go.mod h1:HrymsaRUG1FjK2G1sBRQrHMhgj5+ENUIAwRbL130D8o= +cloud.google.com/go/dataproc/v2 v2.9.0 h1:9fSMjWgFKQfmfKu7V10C5foxU/2iDa8bVkiBB8uh1EU= +cloud.google.com/go/dataproc/v2 v2.9.0/go.mod h1:i4365hSwNP6Bx0SAUnzCC6VloeNxChDjJWH6BfVPcbs= +cloud.google.com/go/dataproc/v2 v2.11.2 h1:KhC8wdLILpAs17yeTG6Miwg1v0nOP/OXD+9QNg3w6AQ= +cloud.google.com/go/dataproc/v2 v2.11.2/go.mod h1:xwukBjtfiO4vMEa1VdqyFLqJmcv7t3lo+PbLDcTEw+g= +cloud.google.com/go/dataproc/v2 v2.14.0 h1:oiEM2efaJfiOClBOYcmW1K+tDP5pHdnYsPmfD55tiRw= +cloud.google.com/go/dataproc/v2 v2.14.0/go.mod h1:AqfdObN5w70H7meRXZOEY52WMK4yMrLtiOd9kROahSM= +cloud.google.com/go/dataqna v0.8.6 h1:FI/1q7VnANchQR9ug+nzujfiusLMfC3BHT7/fHi+BVU= +cloud.google.com/go/dataqna v0.8.6/go.mod h1:3u2zPv3VwMUNW06oTRcSWS3+dDuxF/0w5hEWUCsLepw= +cloud.google.com/go/dataqna v0.9.1 h1:ptKKT+CNwp9Q+9Zxr+npUO7qUwKfyq/oF7/nS7CC6sc= +cloud.google.com/go/dataqna v0.9.1/go.mod h1:86DNLE33yEfNDp5F2nrITsmTYubMbsF7zQRzC3CcZrY= +cloud.google.com/go/dataqna v0.9.6 h1:ymqgCzymbsVgBvD4jhdt7HN9cVwg9x60jkozpp/omFQ= +cloud.google.com/go/dataqna v0.9.6/go.mod h1:rjnNwjh8l3ZsvrANy6pWseBJL2/tJpCcBwJV8XCx4kU= +cloud.google.com/go/dataqna v0.9.7 h1:qTRAG/E3T63Xj1orefRlwupfwH9c9ERUAnWSRGp75so= +cloud.google.com/go/dataqna v0.9.7/go.mod h1:4ac3r7zm7Wqm8NAc8sDIDM0v7Dz7d1e/1Ka1yMFanUM= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= +cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastore v1.20.0 h1:NNpXoyEqIJmZFc0ACcwBEaXnmscUpcG4NkKnbCePmiM= +cloud.google.com/go/datastore v1.20.0/go.mod h1:uFo3e+aEpRfHgtp5pp0+6M0o147KoPaYNaPAKpfh8Ew= +cloud.google.com/go/datastream v1.10.5 h1:nHdOKbFmKJ4tPjGtNNIO0//G7QAht6eHTUnREWPn2yI= +cloud.google.com/go/datastream v1.10.5/go.mod h1:BmIPX19K+Pjho3+sR7Jtddmf+vluzLgaG7465xje/wg= +cloud.google.com/go/datastream v1.11.1 h1:YKY2qGKoxPpAvsDMtmJlIwL59SzhEm1DHM2uM4ib0TY= +cloud.google.com/go/datastream v1.11.1/go.mod h1:a4j5tnptIxdZ132XboR6uQM/ZHcuv/hLqA6hH3NJWgk= +cloud.google.com/go/datastream v1.14.1 h1:j+y0lUKm9pbDjJn0YcWxPI/hXNGUQ80GE6yrFuJC/JA= +cloud.google.com/go/datastream v1.14.1/go.mod h1:JqMKXq/e0OMkEgfYe0nP+lDye5G2IhIlmencWxmesMo= +cloud.google.com/go/deploy v1.17.2 h1:UxcxzjwxGPkT7RBdMmoc5a7QxHQVdpZllD6el2VC3JA= +cloud.google.com/go/deploy v1.17.2/go.mod h1:kKSAl1mab0Y27XlWGBrKNA5WOOrKo24KYzx2JRAfBL4= +cloud.google.com/go/deploy v1.23.0 h1:Bmh5UYEeakXtjggRkjVIawXfSBbQsTgDlm96pCw9D3k= +cloud.google.com/go/deploy v1.23.0/go.mod h1:O7qoXcg44Ebfv9YIoFEgYjPmrlPsXD4boYSVEiTqdHY= +cloud.google.com/go/deploy v1.27.1 h1:Rs8v4J68cZ45RfimX0wjraXaF4WZl1SIR+hkmGaK6Ag= +cloud.google.com/go/deploy v1.27.1/go.mod h1:il2gxiMgV3AMlySoQYe54/xpgVDoEh185nj4XjJ+GRk= +cloud.google.com/go/deploy v1.27.2 h1:C0VqBhFyQFp6+xgPHZAD7LeRA4XGy5YLzGmPQ2NhlLk= +cloud.google.com/go/deploy v1.27.2/go.mod h1:4NHWE7ENry2A4O1i/4iAPfXHnJCZ01xckAKpZQwhg1M= +cloud.google.com/go/dialogflow v1.51.0 h1:MGdOD6ZqXkburW/Ij0cUe1ArO9PLHuWLWclw2IHt2go= +cloud.google.com/go/dialogflow v1.51.0/go.mod h1:w1BYfewiLQeYjwUypzvdK2VGGFwC9yVFepisNTvnvDw= +cloud.google.com/go/dialogflow v1.58.0 h1:RTpoVCJHkgNLK8Co/f7F8ipyg3h8fJIaQzdaAbyg788= +cloud.google.com/go/dialogflow v1.58.0/go.mod h1:sWcyFLdUrg+TWBJVq/OtwDyjcyDOfirTF0Gx12uKy7o= +cloud.google.com/go/dialogflow v1.68.2 h1:bXpoqPRf37KKxB79PKr20B/TAU/Z5iA0FnB6C5N2jrA= +cloud.google.com/go/dialogflow v1.68.2/go.mod h1:E0Ocrhf5/nANZzBju8RX8rONf0PuIvz2fVj3XkbAhiY= +cloud.google.com/go/dialogflow v1.69.0 h1:nW3vH/ysZWBdjQJ4rIh3PC5Do/Brz8KEp3OeDy9VW3U= +cloud.google.com/go/dialogflow v1.69.0/go.mod h1:+2drAzrguQ8vltf6qn6foBPHrT/fFa1S3FQ40byV2WU= +cloud.google.com/go/dlp v1.12.1 h1:dTsEN6r1BoplUACz7teOmE6lRG1swREiwXkfkY7bi6c= +cloud.google.com/go/dlp v1.12.1/go.mod h1:RBUw3yjNSVcFoU8L4ECuxAx0lo1MrusfA4y46bp9vLw= +cloud.google.com/go/dlp v1.19.0 h1:AJB26PpDG0gOkf6wxQqbBXs9G+jOVnCjCagOlNiroKM= +cloud.google.com/go/dlp v1.19.0/go.mod h1:cr8dKBq8un5LALiyGkz4ozcwzt3FyTlOwA4/fFzJ64c= +cloud.google.com/go/dlp v1.22.1 h1:aZvDXCSNmPjhawF/thQa/GNIoW16JGNlI5L5N/HNXGU= +cloud.google.com/go/dlp v1.22.1/go.mod h1:Gc7tGo1UJJTBRt4OvNQhm8XEQ0i9VidAiGXBVtsftjM= +cloud.google.com/go/dlp v1.24.0 h1:ThCQO8Qy5TAfFEJQjhq80u5c93UMdM2uqI3pUZVy7Do= +cloud.google.com/go/dlp v1.24.0/go.mod h1:y6EsWNgMDye72NtqjGHYZjN/wUDnO9CUygLV8iuFeW0= +cloud.google.com/go/documentai v1.26.1 h1:UdDy7nDTwr+mN1KiJqsj5AabauoW9SkgH9eY8BuFXJE= +cloud.google.com/go/documentai v1.26.1/go.mod h1:ljZB6yyT/aKZc9tCd0WGtBxIMWu8ZCEO6UiNwirqLU0= +cloud.google.com/go/documentai v1.34.0 h1:gmBmrTLzbpZkllu2xExISZg2Hh/ai0y605SWdheWHvI= +cloud.google.com/go/documentai v1.34.0/go.mod h1:onJlbHi4ZjQTsANSZJvW7fi2M8LZJrrupXkWDcy4gLY= +cloud.google.com/go/documentai v1.36.1 h1:Polrhi6MsbMrqvzavEWZKeMny/1ALRWrrSVRz8URjas= +cloud.google.com/go/documentai v1.36.1/go.mod h1:6+IBOdk6FUZ8c0df91ZPtF2muF+eikAeLBnjIhm8B2A= +cloud.google.com/go/documentai v1.37.0 h1:7fla8GcarupO15eatRTUveXCob6DOSW1Wa+1i63CM3Q= +cloud.google.com/go/documentai v1.37.0/go.mod h1:qAf3ewuIUJgvSHQmmUWvM3Ogsr5A16U2WPHmiJldvLA= +cloud.google.com/go/domains v0.9.6 h1:NHqZk4XzHFlmXM3LMGwDVET4NKr60W2jaNCRGYod5Ic= +cloud.google.com/go/domains v0.9.6/go.mod h1:hYaeMxsDZED5wuUwYHXf89+aXHJvh41+os8skywd8D4= +cloud.google.com/go/domains v0.10.1 h1:HvZOm7Bx1fQY/MHQAbE5f8YwfJlc0NJVOGh0A0eWckc= +cloud.google.com/go/domains v0.10.1/go.mod h1:RjDl3K8iq/ZZHMVqfZzRuBUr5t85gqA6LEXQBeBL5F4= +cloud.google.com/go/domains v0.10.6 h1:TI+Aavwc31KD8huOquJz0ISchCq1zSEWc9M+JcPJyxc= +cloud.google.com/go/domains v0.10.6/go.mod h1:3xzG+hASKsVBA8dOPc4cIaoV3OdBHl1qgUpAvXK7pGY= +cloud.google.com/go/edgecontainer v1.1.6 h1:FUhibxnkl9NFs+nZw3D1+L+vxkV2mbRZCDtexlaZdQw= +cloud.google.com/go/edgecontainer v1.1.6/go.mod h1:bI2foS+2fRbzBmkIQtrxNzeVv3zZZy780PFF96CiVxA= +cloud.google.com/go/edgecontainer v1.3.1 h1:loDGWu/sdqnCP3Xlvj4OWHL7i0wocbcLg8ApQ9BE66E= +cloud.google.com/go/edgecontainer v1.3.1/go.mod h1:qyz5+Nk/UAs6kXp6wiux9I2U4A2R624K15QhHYovKKM= +cloud.google.com/go/edgecontainer v1.4.3 h1:9tfGCicvrki927T+hGMB0yYmwIbRuZY6JR1/awrKiZ0= +cloud.google.com/go/edgecontainer v1.4.3/go.mod h1:q9Ojw2ox0uhAvFisnfPRAXFTB1nfRIOIXVWzdXMZLcE= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= +cloud.google.com/go/errorreporting v0.3.1 h1:E/gLk+rL7u5JZB9oq72iL1bnhVlLrnfslrgcptjJEUE= +cloud.google.com/go/errorreporting v0.3.1/go.mod h1:6xVQXU1UuntfAf+bVkFk6nld41+CPyF2NSPCyXE3Ztk= +cloud.google.com/go/errorreporting v0.3.2 h1:isaoPwWX8kbAOea4qahcmttoS79+gQhvKsfg5L5AgH8= +cloud.google.com/go/errorreporting v0.3.2/go.mod h1:s5kjs5r3l6A8UUyIsgvAhGq6tkqyBCUss0FRpsoVTww= +cloud.google.com/go/essentialcontacts v1.6.7 h1:FDdJGJEXK4RxvT6gdRBqGaCQVpi96RRB7MTyRHUcb20= +cloud.google.com/go/essentialcontacts v1.6.7/go.mod h1:5577lqt2pvnx9n4zP+eJSSWL02KLmQvjJPYknHdAbZg= +cloud.google.com/go/essentialcontacts v1.7.1 h1:qeZAOxqWFfD7sDd1vKYaNhjGh1eckkCkSJyx/OC5egE= +cloud.google.com/go/essentialcontacts v1.7.1/go.mod h1:F/MMWNLRW7b42WwWklOsnx4zrMOWDYWqWykBf1jXKPY= +cloud.google.com/go/essentialcontacts v1.7.6 h1:ysHZ4gr4plW1CL1Ur/AucUUfh20hDjSFbfjxSK0q/sk= +cloud.google.com/go/essentialcontacts v1.7.6/go.mod h1:/Ycn2egr4+XfmAfxpLYsJeJlVf9MVnq9V7OMQr9R4lA= +cloud.google.com/go/eventarc v1.13.5 h1:JMUiLYzxkxr7BqnCPkyJ6Ycgrs6YQlZT44H0rHg7jQY= +cloud.google.com/go/eventarc v1.13.5/go.mod h1:wrZcXnSOZk/AVbBYT5GpOa5QPuQFzSxiXKsKnynoPes= +cloud.google.com/go/eventarc v1.14.1 h1:Tw1DsE1OO9NZ3LZlAtxsi4otVl5qjQ3Y3QD9dCxtAyo= +cloud.google.com/go/eventarc v1.14.1/go.mod h1:NG0YicE+z9MDcmh2u4tlzLDVLRjq5UHZlibyQlPhcxY= +cloud.google.com/go/eventarc v1.15.5 h1:bZW7ZMM+XXNErg6rOZcgxUzAgz4vpReRDP3ZiGf7/sI= +cloud.google.com/go/eventarc v1.15.5/go.mod h1:vDCqGqyY7SRiickhEGt1Zhuj81Ya4F/NtwwL3OZNskg= +cloud.google.com/go/filestore v1.8.2 h1:BpaB7bxICPUTntAV+yVUK9bxAUOv7uHRSEibSKMBJVA= +cloud.google.com/go/filestore v1.8.2/go.mod h1:QU7EKJP/xmCtzIhxNVLfv/k1QBKHXTbbj9512kwUT1I= +cloud.google.com/go/filestore v1.9.1 h1:s8DPPSV80FzIB7rduoMJAgknktms9hZGE3+X9KFUlK8= +cloud.google.com/go/filestore v1.9.1/go.mod h1:g/FNHBABpxjL1M9nNo0nW6vLYIMVlyOKhBKtYGgcKUI= +cloud.google.com/go/filestore v1.10.2 h1:LjoAyp9TvVNBns3sUUzPaNsQiGpR2BReGmTS3bUCuBE= +cloud.google.com/go/filestore v1.10.2/go.mod h1:w0Pr8uQeSRQfCPRsL0sYKW6NKyooRgixCkV9yyLykR4= +cloud.google.com/go/firestore v1.15.0 h1:/k8ppuWOtNuDHt2tsRV42yI21uaGnKDEQnRFeBpbFF8= +cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= +cloud.google.com/go/firestore v1.18.0 h1:cuydCaLS7Vl2SatAeivXyhbhDEIR8BDmtn4egDhIn2s= +cloud.google.com/go/firestore v1.18.0/go.mod h1:5ye0v48PhseZBdcl0qbl3uttu7FIEwEYVaWm0UIEOEU= +cloud.google.com/go/functions v1.16.1 h1:0kcko/2AKwm4USnWcGs/W/k++PAYPA3dYaQw1y5Xg3M= +cloud.google.com/go/functions v1.16.1/go.mod h1:WcQy3bwDw6KblOuj+khLyQbsi8aupUrZUrPEKTtVaSQ= +cloud.google.com/go/functions v1.19.1 h1:eWjTZohtJX/9rckZYXaYVViGi06JkNJRKvm0aO+ce+g= +cloud.google.com/go/functions v1.19.1/go.mod h1:18RszySpwRg6aH5UTTVsRfdCwDooSf/5mvSnU7NAk4A= +cloud.google.com/go/functions v1.19.6 h1:vJgWlvxtJG6p/JrbXAkz83DbgwOyFhZZI1Y32vUddjY= +cloud.google.com/go/functions v1.19.6/go.mod h1:0G0RnIlbM4MJEycfbPZlCzSf2lPOjL7toLDwl+r0ZBw= +cloud.google.com/go/gaming v1.9.0 h1:7vEhFnZmd931Mo7sZ6pJy7uQPDxF7m7v8xtBheG08tc= +cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= +cloud.google.com/go/gkebackup v1.3.6 h1:ZSFtQdDJhOc/6cBfTEDF5yVZMBsbecjoq8jc+oACqKw= +cloud.google.com/go/gkebackup v1.3.6/go.mod h1:Sb5c6C8Peo4qakBFFuu+bRGZpJ8rNREUpGDImpQXCuc= +cloud.google.com/go/gkebackup v1.6.1 h1:bV1go067LF5XaobFXXvgW2rsuvR974ajirDjD9oXFWg= +cloud.google.com/go/gkebackup v1.6.1/go.mod h1:CEnHQCsNBn+cyxcxci0qbAPYe8CkivNEitG/VAZ08ms= +cloud.google.com/go/gkebackup v1.6.5 h1:9SPPfU7qUiHeRL3WWdOzXtQW8k+hOOvS5S6U8xp8rZ8= +cloud.google.com/go/gkebackup v1.6.5/go.mod h1:/jItbFO1LKOq6aZXChYFk1xr626ZCn9D4nFYCJqX3Z8= +cloud.google.com/go/gkebackup v1.8.0 h1:eBqOt61yEChvj7I/GDPBbdCCRdUPudD1qrQYfYWV3Ok= +cloud.google.com/go/gkebackup v1.8.0/go.mod h1:FjsjNldDilC9MWKEHExnK3kKJyTDaSdO1vF0QeWSOPU= +cloud.google.com/go/gkeconnect v0.8.6 h1:7X9P6lGkOF/nJRYZBQBG2XPhunqWbNMacy9AXN7qUcU= +cloud.google.com/go/gkeconnect v0.8.6/go.mod h1:4/o9sXLLsMl2Rw2AyXjtVET0RMk4phdFJuBX45jRRHc= +cloud.google.com/go/gkeconnect v0.11.1 h1:X7UpDP2Qg8JfaQ6vsJeFsTo4NcrGprk9Tg4Pf7MK8Qg= +cloud.google.com/go/gkeconnect v0.11.1/go.mod h1:Vu3UoOI2c0amGyv4dT/EmltzscPH41pzS4AXPqQLej0= +cloud.google.com/go/gkeconnect v0.12.4 h1:67/rnPmF/I1Wmf7jWyKH+z4OWjU8ZUI0Vmzxvmzf3KY= +cloud.google.com/go/gkeconnect v0.12.4/go.mod h1:bvpU9EbBpZnXGo3nqJ1pzbHWIfA9fYqgBMJ1VjxaZdk= +cloud.google.com/go/gkehub v0.14.6 h1:kKreFf+097KfW+Tz/SqZKeXs/eFOjs1NDrsVjRPI18o= +cloud.google.com/go/gkehub v0.14.6/go.mod h1:SD3/ihO+7/vStQEwYA1S/J9mouohy7BfhM/gGjAmJl0= +cloud.google.com/go/gkehub v0.15.1 h1:VMXUz3q9Vfhe+dtSjb/yqmiDmGbcEUTuXDyk0pj2GyU= +cloud.google.com/go/gkehub v0.15.1/go.mod h1:cyUwa9iFQYd/pI7IQYl6A+OF6M8uIbhmJr090v9Z4UU= +cloud.google.com/go/gkehub v0.15.6 h1:9iogrmNNa+drDPf/zkLH/6KGgUf7FuuyokmithoGwMQ= +cloud.google.com/go/gkehub v0.15.6/go.mod h1:sRT0cOPAgI1jUJrS3gzwdYCJ1NEzVVwmnMKEwrS2QaM= +cloud.google.com/go/gkemulticloud v1.1.2 h1:CFBoDcQi9zLOkzM6xqmRzljZhF4A6A47QaQ0WtNd+DA= +cloud.google.com/go/gkemulticloud v1.1.2/go.mod h1:QhdIrilhqieDJJzOyfMPBqcfDVntENYGwqSeX2ZuIDE= +cloud.google.com/go/gkemulticloud v1.4.0 h1:t2HXXYrICui+rZXScietjU1YdrQDLXpfqqrTo7zWSYQ= +cloud.google.com/go/gkemulticloud v1.4.0/go.mod h1:rg8YOQdRKEtMimsiNCzZUP74bOwImhLRv9wQ0FwBUP4= +cloud.google.com/go/gkemulticloud v1.5.3 h1:334aZmOzIt3LVBpguCof8IHaLaftcZlx+L0TGBukYkY= +cloud.google.com/go/gkemulticloud v1.5.3/go.mod h1:KPFf+/RcfvmuScqwS9/2MF5exZAmXSuoSLPuaQ98Xlk= +cloud.google.com/go/grafeas v0.3.4 h1:D4x32R/cHX3MTofKwirz015uEdVk4uAxvZkZCZkOrF4= +cloud.google.com/go/grafeas v0.3.4/go.mod h1:A5m316hcG+AulafjAbPKXBO/+I5itU4LOdKO2R/uDIc= +cloud.google.com/go/grafeas v0.3.10 h1:D9uP/DjVHq9ZzCekVd+aNvQEHb3Hkwp8ki9FDnhRRJ0= +cloud.google.com/go/grafeas v0.3.10/go.mod h1:Mz/AoXmxNhj74VW0fz5Idc3kMN2VZMi4UT5+UPx5Pq0= +cloud.google.com/go/grafeas v0.3.15 h1:lBjwKmhpiqOAFaE0xdqF8CqO74a99s8tUT5mCkBBxPs= +cloud.google.com/go/grafeas v0.3.15/go.mod h1:irwcwIQOBlLBotGdMwme8PipnloOPqILfIvMwlmu8Pk= +cloud.google.com/go/gsuiteaddons v1.6.6 h1:q3x2NE0je/tSVL66MAht5YVbGGHjTV9BxFD2lyDQ0dU= +cloud.google.com/go/gsuiteaddons v1.6.6/go.mod h1:JmAp1/ojGgHtSe5d6ZPkOwJbYP7An7DRBkhSJ1aer8I= +cloud.google.com/go/gsuiteaddons v1.7.1 h1:YLh58kzaK+1Q/CHe8Cjp3hf9ZjNdJkQMavjrJUDgi9o= +cloud.google.com/go/gsuiteaddons v1.7.1/go.mod h1:SxM63xEPFf0p/plgh4dP82mBSKtp2RWskz5DpVo9jh8= +cloud.google.com/go/gsuiteaddons v1.7.7 h1:sk0SxpCGIA7tIO//XdiiG29f2vrF6Pq/dsxxyBGiRBY= +cloud.google.com/go/gsuiteaddons v1.7.7/go.mod h1:zTGmmKG/GEBCONsvMOY2ckDiEsq3FN+lzWGUiXccF9o= +cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/iam v1.2.0/go.mod h1:zITGuWgsLZxd8OwAlX+eMFgZDXzBm7icj1PVTYG766Q= +cloud.google.com/go/iam v1.4.1/go.mod h1:2vUEJpUG3Q9p2UdsyksaKpDzlwOrnMzS30isdReIcLM= +cloud.google.com/go/iam v1.4.2/go.mod h1:REGlrt8vSlh4dfCJfSEcNjLGq75wW75c5aU3FLOYq34= +cloud.google.com/go/iam v1.5.0/go.mod h1:U+DOtKQltF/LxPEtcDLoobcsZMilSRwR7mgNL7knOpo= +cloud.google.com/go/iap v1.9.5 h1:FrLAtgXzWPwe8rNp7AD+2Lgg4LqyhgXvEdiGK+jtd9g= +cloud.google.com/go/iap v1.9.5/go.mod h1:4zaAOm66mId/50vqRF7ZPDeCjvHQJSVAXD/mkUWo4Zk= +cloud.google.com/go/iap v1.10.1 h1:YF4jmMwEWXYrbfZZz024ozBXnWxUxJHzmkM6ccIzM0A= +cloud.google.com/go/iap v1.10.1/go.mod h1:UKetCEzOZ4Zj7l9TSN/wzRNwbgIYzm4VM4bStaQ/tFc= +cloud.google.com/go/iap v1.11.1 h1:RWWGRaPe/icBqNLTk83hfLkBZOh5TPufUTyWDWRldFo= +cloud.google.com/go/iap v1.11.1/go.mod h1:qFipMJ4nOIv4yDHZxn31PiS8QxJJH2FlxgH9aFauejw= +cloud.google.com/go/iap v1.11.2 h1:VIioCrYsyWiRGx7Y8RDNylpI6d4t1Qx5ZgSLUVmWWPo= +cloud.google.com/go/iap v1.11.2/go.mod h1:Bh99DMUpP5CitL9lK0BC8MYgjjYO4b3FbyhgW1VHJvg= +cloud.google.com/go/ids v1.4.6 h1:tNc3NpIp2LUmFJxP2CBlzYw0FTnd68r73mIzg8UlM3Q= +cloud.google.com/go/ids v1.4.6/go.mod h1:EJ1554UwEEs8HCHVnXPGn21WouM0uFvoq8UvEEr2ng4= +cloud.google.com/go/ids v1.5.1 h1:UkHpZnlW46WulDVNtzKN+SEntZoOoHoG/Ob1GtuVCGQ= +cloud.google.com/go/ids v1.5.1/go.mod h1:d/9jTtY506mTxw/nHH3UN4TFo80jhAX+tESwzj42yFo= +cloud.google.com/go/ids v1.5.6 h1:uKGuaWozDcjg3wyf54Gd7tCH2YK8BFeH9qo1xBNiPKE= +cloud.google.com/go/ids v1.5.6/go.mod h1:y3SGLmEf9KiwKsH7OHvYYVNIJAtXybqsD2z8gppsziQ= +cloud.google.com/go/iot v1.7.6 h1:nRV/e1e3lEjsVoD5mW99JERwL8MKohyQyY63+lfBMA4= +cloud.google.com/go/iot v1.7.6/go.mod h1:IMhFVfRGn5OqrDJ9Obu0rC5VIr2+SvSyUxQPHkXYuW0= +cloud.google.com/go/iot v1.8.1 h1:PySjOJ2Nni1IDk0LqcNhUCKOGe0yPP4rM/Nc5yA/cjI= +cloud.google.com/go/iot v1.8.1/go.mod h1:FNceQ9/EGvbE2az7RGoGPY0aqrsyJO3/LqAL0h83fZw= +cloud.google.com/go/iot v1.8.6 h1:A3AhugnIViAZkC3/lHAQDaXBIk2ZOPBZS0XQCyZsjjc= +cloud.google.com/go/iot v1.8.6/go.mod h1:MThnkiihNkMysWNeNje2Hp0GSOpEq2Wkb/DkBCVYa0U= +cloud.google.com/go/kms v1.19.1/go.mod h1:GRbd2v6e9rAVs+IwOIuePa3xcCm7/XpGNyWtBwwOdRc= +cloud.google.com/go/kms v1.21.1/go.mod h1:s0wCyByc9LjTdCjG88toVs70U9W+cc6RKFc8zAqX7nE= +cloud.google.com/go/language v1.12.4 h1:srkreCxnVa5+a5PXUri/K+VWxG50wGvz5+PEYjgaENQ= +cloud.google.com/go/language v1.12.4/go.mod h1:Us0INRv/CEbrk2s8IBZcHaZjSBmK+bRlX4FUYZrD4I8= +cloud.google.com/go/language v1.14.1 h1:lyBks2W2k7bVPvfEECH08eMOP3Vd7zkHCATt/Vy0sLM= +cloud.google.com/go/language v1.14.1/go.mod h1:WaAL5ZdLLBjiorXl/8vqgb6/Fyt2qijl96c1ZP/vdc8= +cloud.google.com/go/language v1.14.5 h1:BVJ/POtlnJ55LElvnQY19UOxpMVtHoHHkFJW2uHJsVU= +cloud.google.com/go/language v1.14.5/go.mod h1:nl2cyAVjcBct1Hk73tzxuKebk0t2eULFCaruhetdZIA= +cloud.google.com/go/lifesciences v0.9.6 h1:8w3edjRiSN6GCxT0uJoXr6Zo2XNYD+6TxPZa7uIIOaU= +cloud.google.com/go/lifesciences v0.9.6/go.mod h1:BkNWYU0tPZbwpy76RE4biZajWFe6NvWwEAaIlNiKXdE= +cloud.google.com/go/lifesciences v0.10.1 h1:sGTR+IW9I85VhP789GMHNYOyCo7dkmvWRYh0uOfmWdo= +cloud.google.com/go/lifesciences v0.10.1/go.mod h1:5D6va5/Gq3gtJPKSsE6vXayAigfOXK2eWLTdFUOTCDs= +cloud.google.com/go/lifesciences v0.10.6 h1:Vu7XF4s5KJ8+mSLIL4eaQM6JTyWXvSB54oqC+CUZH20= +cloud.google.com/go/lifesciences v0.10.6/go.mod h1:1nnZwaZcBThDujs9wXzECnd1S5d+UiDkPuJWAmhRi7Q= +cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= +cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= +cloud.google.com/go/logging v1.11.0/go.mod h1:5LDiJC/RxTt+fHc1LAt20R9TKiUTReDg6RuuFOZ67+A= +cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= +cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= +cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc= +cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA= +cloud.google.com/go/longrunning v0.5.5/go.mod h1:WV2LAxD8/rg5Z1cNW6FJ/ZpX4E4VnDnoTk0yawPBB7s= +cloud.google.com/go/longrunning v0.5.6 h1:xAe8+0YaWoCKr9t1+aWe+OeQgN/iJK1fEgZSXmjuEaE= +cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= +cloud.google.com/go/longrunning v0.6.0/go.mod h1:uHzSZqW89h7/pasCWNYdUpwGz3PcVWhrWupreVPYLts= +cloud.google.com/go/longrunning v0.6.5/go.mod h1:Et04XK+0TTLKa5IPYryKf5DkpwImy6TluQ1QTLwlKmY= +cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= +cloud.google.com/go/managedidentities v1.6.6 h1:7+hGPQSojhnYNZCg3fG2mQIF7XMfvNpCpi2Zg5/Qx1g= +cloud.google.com/go/managedidentities v1.6.6/go.mod h1:0+0qF22qx8o6eeaZ/Ku7HmHv9soBHD1piyNHgAP+c20= +cloud.google.com/go/managedidentities v1.7.1 h1:9hC4E7JnWn/jSUls022Sj9ri+vriGnLzvDXo0cs1zcA= +cloud.google.com/go/managedidentities v1.7.1/go.mod h1:iK4qqIBOOfePt5cJR/Uo3+uol6oAVIbbG7MGy917cYM= +cloud.google.com/go/managedidentities v1.7.6 h1:zrZVWXZJlmHnfpyCrTQIbDBGUBHrcOOvrsjMjoXRxrk= +cloud.google.com/go/managedidentities v1.7.6/go.mod h1:pYCWPaI1AvR8Q027Vtp+SFSM/VOVgbjBF4rxp1/z5p4= +cloud.google.com/go/maps v1.7.1 h1:vcqmqk0wt1NRzQc84Qo6z8HYyol/znqbG7tAS5Qm91g= +cloud.google.com/go/maps v1.7.1/go.mod h1:fri+i4pO41ZUZ/Nrz3U9hNEtXsv5SROMFP2AwAHFSX8= +cloud.google.com/go/maps v1.14.0 h1:bLT2nvuOm4ye6YRgIJQ0L9zbKcbBj+TCg8k2g3c2Qlk= +cloud.google.com/go/maps v1.14.0/go.mod h1:UepOes9un0UP7i8JBiaqgh8jqUaZAHVRXCYjrVlhSC8= +cloud.google.com/go/maps v1.20.3 h1:HOk4ft//5dDxt5h4MLtLrsmjzYY4x8Oj9ile/AL0G0Y= +cloud.google.com/go/maps v1.20.3/go.mod h1:SqUtIvCPe6cDVXta4oXakeFvf+rd80RWv5EC7VBKP2M= +cloud.google.com/go/maps v1.22.0 h1:Rgs6jvqYztt28cKTh9hzk/a2qq/83FrqR92nPM3bb10= +cloud.google.com/go/maps v1.22.0/go.mod h1:TAt/cYHndJQBrir8DN8OHiS0HvKwsBTqDGRfAtLIulU= +cloud.google.com/go/mediatranslation v0.8.6 h1:EVW0wCQ7asoMjw8fm8oUe6pQWBaVQth/iquk7ysidy0= +cloud.google.com/go/mediatranslation v0.8.6/go.mod h1:zI2ZvRRtrGimH572cwYtmq8t1elKbUGVVw4MAXIC4UQ= +cloud.google.com/go/mediatranslation v0.9.1 h1:7X1cA4TWO0+r1RT0JTT0RE+SyO41eoFUmBDw17Oi9T8= +cloud.google.com/go/mediatranslation v0.9.1/go.mod h1:vQH1amULNhSGryBjbjLb37g54rxrOwVxywS8WvUCsIU= +cloud.google.com/go/mediatranslation v0.9.6 h1:SDGatA73TgZ8iCvILVXpk/1qhTK5DJyufUDEWgbmbV8= +cloud.google.com/go/mediatranslation v0.9.6/go.mod h1:WS3QmObhRtr2Xu5laJBQSsjnWFPPthsyetlOyT9fJvE= +cloud.google.com/go/memcache v1.10.6 h1:rqDPCIUfVBvv7ojOGx5PRkPgWeWSKpOht2w6plaxklY= +cloud.google.com/go/memcache v1.10.6/go.mod h1:4elGf6MwGszZCM0Yopp15qmBoo+Y8M7wg7QRpSM8pzA= +cloud.google.com/go/memcache v1.11.1 h1:2FGuyd3WY7buNDAkMBdmeIOheNWA3gwaXrttLrEdabI= +cloud.google.com/go/memcache v1.11.1/go.mod h1:3zF+dEqmEmElHuO4NtHiShekQY5okQtssjPBv7jpmZ8= +cloud.google.com/go/memcache v1.11.6 h1:33IVqQEmFiITsBXwGHeTkUhWz0kLNKr90nV3e22uLPs= +cloud.google.com/go/memcache v1.11.6/go.mod h1:ZM6xr1mw3F8TWO+In7eq9rKlJc3jlX2MDt4+4H+/+cc= +cloud.google.com/go/metastore v1.13.5 h1:K7gyYoqPvQgCc82tiB0CQkXOpg8AZxJtRGMVdN5B83U= +cloud.google.com/go/metastore v1.13.5/go.mod h1:dmsJzIdQcJrpmRGhEaii3EhVq1JuhI0bxSBoy7A8hcQ= +cloud.google.com/go/metastore v1.14.1 h1:kGx+IUSSYCVn8LisCT4fpxCC9rauEVonzi7RlygdqWY= +cloud.google.com/go/metastore v1.14.1/go.mod h1:WDvsAcbQLl9M4xL+eIpbKogH7aEaPWMhO9aRBcFOnJE= +cloud.google.com/go/metastore v1.14.6 h1:X/eWwRv83ACfRPVrXlFM4DfJ7gwXRC1Tziv6w5MGxLU= +cloud.google.com/go/metastore v1.14.6/go.mod h1:iDbuGwlDr552EkWA5E1Y/4hHme3cLv3ZxArKHXjS2OU= +cloud.google.com/go/metastore v1.14.7 h1:dLm59AHHZCorveCylj7c2iWhkQsmMIeWTsV+tG/BXtY= +cloud.google.com/go/metastore v1.14.7/go.mod h1:0dka99KQofeUgdfu+K/Jk1KeT9veWZlxuZdJpZPtuYU= +cloud.google.com/go/monitoring v1.18.1 h1:0yvFXK+xQd95VKo6thndjwnJMno7c7Xw1CwMByg0B+8= +cloud.google.com/go/monitoring v1.18.1/go.mod h1:52hTzJ5XOUMRm7jYi7928aEdVxBEmGwA0EjNJXIBvt8= +cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= +cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM= +cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U= +cloud.google.com/go/networkconnectivity v1.14.5 h1:t67aEKwmO+SXvQC5ncOjm3vTwnsbO/mTzlCWdK0nwqs= +cloud.google.com/go/networkconnectivity v1.14.5/go.mod h1:Wy28mxRApI1uVwA9iHaYYxGNe74cVnSP311bCUJEpBc= +cloud.google.com/go/networkconnectivity v1.15.1 h1:EizN+cFGHzRAyiFTK8jT1PqTo+cSnbc2IGh6OmllS7Y= +cloud.google.com/go/networkconnectivity v1.15.1/go.mod h1:tYAcT4Ahvq+BiePXL/slYipf/8FF0oNJw3MqFhBnSPI= +cloud.google.com/go/networkconnectivity v1.17.1 h1:RQcG1rZNCNV5Dn3tnINs4TYswDXk2hKH+85eh+JvoWU= +cloud.google.com/go/networkconnectivity v1.17.1/go.mod h1:DTZCq8POTkHgAlOAAEDQF3cMEr/B9k1ZbpklqvHEBtg= +cloud.google.com/go/networkconnectivity v1.18.0 h1:dQxh+/LBr8heinPCwjlYHZAr4IU7qCusl5yMK9+9apU= +cloud.google.com/go/networkconnectivity v1.18.0/go.mod h1:8MFjpAsCqTKUO+U5y9C6iGAsq2KkrfpQ43/XbqSbICc= +cloud.google.com/go/networkmanagement v1.11.0 h1:ZWn7dZix5/5KPFZslxjmh44Q6VSOXM16EAUHPf6Py/8= +cloud.google.com/go/networkmanagement v1.11.0/go.mod h1:lNx5rxkxRwY0SaQL3iqWLfkwU9H5A6Bnp/knv2tjQdk= +cloud.google.com/go/networkmanagement v1.14.1 h1:0x3hVI6xbp3N/choffKPHMSxbzaPdHSD92cBElebXEk= +cloud.google.com/go/networkmanagement v1.14.1/go.mod h1:3Ds8FZ3ZHjTVEedsBoZi9ef9haTE14iS6swTSqM39SI= +cloud.google.com/go/networkmanagement v1.19.1 h1:ecukgArkYCVcK5w2h7WDDd+nHgmBAp9Bst7ClmVKz5A= +cloud.google.com/go/networkmanagement v1.19.1/go.mod h1:icgk265dNnilxQzpr6rO9WuAuuCmUOqq9H6WBeM2Af4= +cloud.google.com/go/networksecurity v0.9.6 h1:3ggPKshcFs1oRh5qI+Gq1s2CIU9BL99MKtYSBG4Z8s0= +cloud.google.com/go/networksecurity v0.9.6/go.mod h1:SZB02ji/2uittsqoAXu9PBqGG9nF9PuxPgtezQfihSA= +cloud.google.com/go/networksecurity v0.10.1 h1:dHN1la6xnta3E4QtWGqtc8ZAPKIZH5m8UQceIIuXZIs= +cloud.google.com/go/networksecurity v0.10.1/go.mod h1:tatO1hYJ9nNChLHOFdsjex5FeqZBlPQgKdKOex7REpU= +cloud.google.com/go/networksecurity v0.10.6 h1:6b6fcCG9BFNcmtNO+VuPE04vkZb5TKNX9+7ZhYMgstE= +cloud.google.com/go/networksecurity v0.10.6/go.mod h1:FTZvabFPvK2kR/MRIH3l/OoQ/i53eSix2KA1vhBMJec= +cloud.google.com/go/notebooks v1.11.4 h1:A9jxIdxEccgL9iJLqvU4j5HT3/13YluoF2IbiV+hAN4= +cloud.google.com/go/notebooks v1.11.4/go.mod h1:vtqPiCQMv++HOfQMzyE46f4auCB843rf20KEQW2zZKM= +cloud.google.com/go/notebooks v1.12.1 h1:0g61C2qdWcq2p8OFH3NiLzyneS1LFfsveC5+MnpM4p8= +cloud.google.com/go/notebooks v1.12.1/go.mod h1:RJCyRkLjj8UnvLEKaDl9S6//xUCa+r+d/AsxZnYBl50= +cloud.google.com/go/notebooks v1.12.6 h1:nCfZwVihArMPP2atRoxRrXOXJ/aC9rAgpBQGCc2zpYw= +cloud.google.com/go/notebooks v1.12.6/go.mod h1:3Z4TMEqAKP3pu6DI/U+aEXrNJw9hGZIVbp+l3zw8EuA= +cloud.google.com/go/optimization v1.6.4 h1:T/j8xyIkmHGjU6kxeUjK3UTqiXlbvpZQ2A+F5vnH21Y= +cloud.google.com/go/optimization v1.6.4/go.mod h1:AfXfr2vlBXCF9RPh/Jpj46FhXR5JiWlyHA0rGI5Eu5M= +cloud.google.com/go/optimization v1.7.1 h1:E3/1qRZvGxqQpapaac/EKuzusxUauXLnpirWWXXzP5k= +cloud.google.com/go/optimization v1.7.1/go.mod h1:s2AjwwQEv6uExFmgS4Bf1gidI07w7jCzvvs8exqR1yk= +cloud.google.com/go/optimization v1.7.6 h1:jDvIuSxDsXI2P7l2sYXm6CoX1YBIIT6Khm5m0hq0/KQ= +cloud.google.com/go/optimization v1.7.6/go.mod h1:4MeQslrSJGv+FY4rg0hnZBR/tBX2awJ1gXYp6jZpsYY= +cloud.google.com/go/orchestration v1.9.1 h1:i5iSxsu1Cx1itTQEEY/YvsAo1OO8gosGGXhnOjBjgJA= +cloud.google.com/go/orchestration v1.9.1/go.mod h1:yLPB2q/tdlEheIiZS7DAPKHeXdf4qNTlKAJCp/2EzXA= +cloud.google.com/go/orchestration v1.11.0 h1:yyi0kM47UZaJ3EEFYsBwfrkvqyPmvHwsoc3asxDmLuo= +cloud.google.com/go/orchestration v1.11.0/go.mod h1:s3L89jinQaUHclqgWYw8JhBbzGSidVt5rVBxGrXeheI= +cloud.google.com/go/orchestration v1.11.9 h1:PnlZ/O4R/eiounpxUkhI9ZXRMWbG7vFqxc6L6sR+31k= +cloud.google.com/go/orchestration v1.11.9/go.mod h1:KKXK67ROQaPt7AxUS1V/iK0Gs8yabn3bzJ1cLHw4XBg= +cloud.google.com/go/orgpolicy v1.12.2 h1:x9GttuUZXXeKcJgHSGxYoPn2hOJhhuaN5YYJKfAfmLo= +cloud.google.com/go/orgpolicy v1.12.2/go.mod h1:XycP+uWN8Fev47r1XibYjOgZod8SjXQtZGsO2I8KXX8= +cloud.google.com/go/orgpolicy v1.14.0 h1:UuLmi1+94lIS3tCoeuinuwx4oxdx58nECiAvfwCW0SM= +cloud.google.com/go/orgpolicy v1.14.0/go.mod h1:S6Pveh1JOxpSbs6+2ToJG7h3HwqC6Uf1YQ6JYG7wdM8= +cloud.google.com/go/orgpolicy v1.15.0 h1:uQziDu3UKYk9ZwUgneZAW5aWxZFKgOXXsuVKFKh0z7Y= +cloud.google.com/go/orgpolicy v1.15.0/go.mod h1:NTQLwgS8N5cJtdfK55tAnMGtvPSsy95JJhESwYHaJVs= +cloud.google.com/go/osconfig v1.12.6 h1:wIOhgzklE0hHZsho02rRVXYBHSfsAwYZYIaxFaUBIjs= +cloud.google.com/go/osconfig v1.12.6/go.mod h1:2dcXGl5qNbKo6Hjsnqbt5t6H2GX7UCAaPjF6BwDlFq8= +cloud.google.com/go/osconfig v1.14.1 h1:67ISL0vZVfq0se+1cPRMYgwTjsES2k9vmSmn8ZS0O5g= +cloud.google.com/go/osconfig v1.14.1/go.mod h1:Rk62nyQscgy8x4bICaTn0iWiip5EpwEfG2UCBa2TP/s= +cloud.google.com/go/osconfig v1.14.5 h1:r3enRq2DarWyiE/BhHjZf1Yc/iC2YBsyvqqtEGD+upk= +cloud.google.com/go/osconfig v1.14.5/go.mod h1:XH+NjBVat41I/+xgQzKOJEhuC4xI7lX2INE5SWnVr9U= +cloud.google.com/go/osconfig v1.14.6 h1:4uJrA1obzMBp1I+DF15y/MvsXKIODevuANpq3QhvX30= +cloud.google.com/go/osconfig v1.14.6/go.mod h1:LS39HDBH0IJDFgOUkhSZUHFQzmcWaCpYXLrc3A4CVzI= +cloud.google.com/go/oslogin v1.13.2 h1:v71OrrkKyqr5Mfnt345GqSOURzByv08qfrtvfhOVcnc= +cloud.google.com/go/oslogin v1.13.2/go.mod h1:U8Euw2VeOEhJ/NE/0Q8xpInxi0J1oo2zdRNNVA/ba7U= +cloud.google.com/go/oslogin v1.14.1 h1:HPPg7FWPwt7pKrbl+8VFI9UuJTbVrG2rSMHl4HkDAG4= +cloud.google.com/go/oslogin v1.14.1/go.mod h1:mM/isJYnohyD3EfM12Fhy8uye46gxA1WjHRCwbkmlVw= +cloud.google.com/go/oslogin v1.14.6 h1:BDKVcxo1OO4ZT+PbuFchZjnbrlUGfChilt6+pITY1VI= +cloud.google.com/go/oslogin v1.14.6/go.mod h1:xEvcRZTkMXHfNSKdZ8adxD6wvRzeyAq3cQX3F3kbMRw= +cloud.google.com/go/phishingprotection v0.8.6 h1:DcAre1psFwJM/FBA/MkDj0H6uxZhACE5IW/xF9ssHDQ= +cloud.google.com/go/phishingprotection v0.8.6/go.mod h1:OSnaLSZryNaS80qVzArfi2/EoNWEeTSutTiWA/29xKU= +cloud.google.com/go/phishingprotection v0.9.1 h1:oUEGd4dttG5gIUmICdCh8A1U9iVQiw0TGwvYIGQ2I7U= +cloud.google.com/go/phishingprotection v0.9.1/go.mod h1:LRiflQnCpYKCMhsmhNB3hDbW+AzQIojXYr6q5+5eRQk= +cloud.google.com/go/phishingprotection v0.9.6 h1:yl572bBQbPjflX250SOflN6gwO2uYoddN2uRp36fDTo= +cloud.google.com/go/phishingprotection v0.9.6/go.mod h1:VmuGg03DCI0wRp/FLSvNyjFj+J8V7+uITgHjCD/x4RQ= +cloud.google.com/go/policytroubleshooter v1.10.4 h1:wxBRfNoMy7rnoEeaTOHIEHCUEdUIQIwQGUqfBWH6cyQ= +cloud.google.com/go/policytroubleshooter v1.10.4/go.mod h1:kSp7PKn80ttbKt8SSjQ0Z/pYYug/PFapxSx2Pr7xjf0= +cloud.google.com/go/policytroubleshooter v1.11.1 h1:/b3wruB/KvmCpy9Jfducc8TQmM3bsoPaeCs5z7TRodA= +cloud.google.com/go/policytroubleshooter v1.11.1/go.mod h1:9nJIpgQ2vloJbB8y1JkPL5vxtaSdJnJYPCUvt6PpfRs= +cloud.google.com/go/policytroubleshooter v1.11.6 h1:Z8+tO2z21MY1arBBuJjwrOjbw8fbZb13AZTHXdzkl2U= +cloud.google.com/go/policytroubleshooter v1.11.6/go.mod h1:jdjYGIveoYolk38Dm2JjS5mPkn8IjVqPsDHccTMu3mY= +cloud.google.com/go/privatecatalog v0.9.6 h1:bcIABOUmpnzQip83OVv+Ju/NxXjUTRLUSP+FVLFG6kk= +cloud.google.com/go/privatecatalog v0.9.6/go.mod h1:BTwLqXfNzM6Tn4cTjzYj8avfw9+h/N68soYuTrYXL9I= +cloud.google.com/go/privatecatalog v0.10.1 h1:Ew51FHLLQsUYUDJY57eMB/mVUOoWLIji957MRw4kumw= +cloud.google.com/go/privatecatalog v0.10.1/go.mod h1:mFmn5bjE9J8MEjQuu1fOc4AxOP2MoEwDLMJk04xqQCQ= +cloud.google.com/go/privatecatalog v0.10.7 h1:R951ikhxIanXEijBCu0xnoUAOteS5m/Xplek0YvsNTE= +cloud.google.com/go/privatecatalog v0.10.7/go.mod h1:Fo/PF/B6m4A9vUYt0nEF1xd0U6Kk19/Je3eZGrQ6l60= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= +cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= +cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= +cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.11.1 h1:TI9XcWccMeipi4CFb8tJ9RvFgt9+f4W00t8RUNoXiPk= +cloud.google.com/go/recaptchaenterprise/v2 v2.11.1/go.mod h1:4TohRUt9x4hzECD53xRFER+TJavgbep6riguPnsr4oQ= +cloud.google.com/go/recaptchaenterprise/v2 v2.17.2 h1:tHFLYu+8w0jjjGf63D4qgVEKS9R3lw4XP4Q1P4df2g8= +cloud.google.com/go/recaptchaenterprise/v2 v2.17.2/go.mod h1:iigNZOnUpf++xlm8RdMZJTX/PihYVMrHidRLjHuekec= +cloud.google.com/go/recaptchaenterprise/v2 v2.20.4 h1:P4QMryKcWdi4LIe1Sx0b2ZOAQv5gVfdzPt2peXcN32Y= +cloud.google.com/go/recaptchaenterprise/v2 v2.20.4/go.mod h1:3H8nb8j8N7Ss2eJ+zr+/H7gyorfzcxiDEtVBDvDjwDQ= +cloud.google.com/go/recommendationengine v0.8.6 h1:m0eQtYCToxMSbDKOnpJ2YGdQhyjOPffg4Y8lM2RWzao= +cloud.google.com/go/recommendationengine v0.8.6/go.mod h1:ratALtVdAkofp0vDzpkL87zJcTymiQLc7fQyohRKWoA= +cloud.google.com/go/recommendationengine v0.9.1 h1:TQne3UMow6joFVRtTpd9kDYyYr3Jkpq+o0vJkpQgZYI= +cloud.google.com/go/recommendationengine v0.9.1/go.mod h1:FfWa3OnsnDab4unvTZM2VJmvoeGn1tnntF3n+vmfyzU= +cloud.google.com/go/recommendationengine v0.9.6 h1:slN7h23vswGccW8x3f+xUXCu9Yo18/GNkazH93LJbFk= +cloud.google.com/go/recommendationengine v0.9.6/go.mod h1:nZnjKJu1vvoxbmuRvLB5NwGuh6cDMMQdOLXTnkukUOE= +cloud.google.com/go/recommender v1.12.2 h1:3M6lD39/GlOMYOikeF5wflSa4EP5pGFthoIASbyhIXE= +cloud.google.com/go/recommender v1.12.2/go.mod h1:9YizZzqpUtJelRv0pw2bfl3+3i5bTwL/FuAucj15WJc= +cloud.google.com/go/recommender v1.13.1 h1:aQIUpMynK1pU1Q+EiuL7VJssLLjLwnfhL7px0vgM6xA= +cloud.google.com/go/recommender v1.13.1/go.mod h1:l+n8rNMC6jZacckzLvVG/2LzKawlwAJYNO8Vl2pBlxc= +cloud.google.com/go/recommender v1.13.5 h1:cIsyRKGNw4LpCfY5c8CCQadhlp54jP4fHtP+d5Sy2xE= +cloud.google.com/go/recommender v1.13.5/go.mod h1:v7x/fzk38oC62TsN5Qkdpn0eoMBh610UgArJtDIgH/E= +cloud.google.com/go/redis v1.14.3 h1:zlGxeAsiwcPU+Cta76ALduhdBAVhuYpEjv59V5L/ves= +cloud.google.com/go/redis v1.14.3/go.mod h1:YtYX9QC98d3LEI9GUixwZ339Niw6w5xFcxLRruuFuss= +cloud.google.com/go/redis v1.17.1 h1:E7TeGsvyoFB+m59bqFKrQ5GSH7+uW8cUDk6Y7iqGjJ0= +cloud.google.com/go/redis v1.17.1/go.mod h1:YJHeYfSoW/agIMeCvM5rszxu75mVh5DOhbu3AEZEIQM= +cloud.google.com/go/redis v1.18.2 h1:JlHLceAOILEmbn+NIS7l+vmUKkFuobLToCWTxL7NGcQ= +cloud.google.com/go/redis v1.18.2/go.mod h1:q6mPRhLiR2uLf584Lcl4tsiRn0xiFlu6fnJLwCORMtY= +cloud.google.com/go/resourcemanager v1.9.6 h1:VPfJFbWxrTYQzEXCDbJNpcvSB8eZhTSM0YHH146fIB8= +cloud.google.com/go/resourcemanager v1.9.6/go.mod h1:d+XUOGbxg6Aka3lmC4fDiserslux3d15uX08C6a0MBg= +cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0= +cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE= +cloud.google.com/go/resourcemanager v1.10.6 h1:LIa8kKE8HF71zm976oHMqpWFiaDHVw/H1YMO71lrGmo= +cloud.google.com/go/resourcemanager v1.10.6/go.mod h1:VqMoDQ03W4yZmxzLPrB+RuAoVkHDS5tFUUQUhOtnRTg= +cloud.google.com/go/resourcesettings v1.6.6 h1:l/IbRDDmGJFlR4bRZGtfYvix1Pu0jAKGLr7wgUtixHQ= +cloud.google.com/go/resourcesettings v1.6.6/go.mod h1:t1+N03/gwNuKyOqpnACg/hWNL7ujT8mQYGqOzxOjFVE= +cloud.google.com/go/resourcesettings v1.8.1 h1:whJgmR9I5V9TSZiaoCPVDgbYD1jghYoauHVfBG8TvHI= +cloud.google.com/go/resourcesettings v1.8.1/go.mod h1:6V87tIXUpvJMskim6YUa+TRDTm7v6OH8FxLOIRYosl4= +cloud.google.com/go/resourcesettings v1.8.3 h1:13HOFU7v4cEvIHXSAQbinF4wp2Baybbq7q9FMctg1Ek= +cloud.google.com/go/resourcesettings v1.8.3/go.mod h1:BzgfXFHIWOOmHe6ZV9+r3OWfpHJgnqXy8jqwx4zTMLw= +cloud.google.com/go/retail v1.16.1 h1:AyVdElkdIU3JedWpX/qENbt8iUmKD+kiyj7ZpzguhTg= +cloud.google.com/go/retail v1.16.1/go.mod h1:xzHOcNrzFB5aew1AjWhZAPnHF2oCGqt7hMmTlrzQqAs= +cloud.google.com/go/retail v1.19.0 h1:OrXxtP/asKi7vFReWmQH5kXrMRPZ2R9Zw92x8O93PMA= +cloud.google.com/go/retail v1.19.0/go.mod h1:QMhO+nkvN6Mns1lu6VXmteY0I3mhwPj9bOskn6PK5aY= +cloud.google.com/go/retail v1.19.4 h1:phOKkWrrVgwLRDvdacmy9wUZVl+DgjlTybiC1gUyU+Q= +cloud.google.com/go/retail v1.19.4/go.mod h1:cmn9CzCxfSFjpPQdLHQ3t/mZDHap9W7/Jq/f03Rk6VQ= +cloud.google.com/go/retail v1.23.0 h1:P+3RcCmCgVBOkrhK/w0PxQecB7QLY/vxi0dABv5wjsY= +cloud.google.com/go/retail v1.23.0/go.mod h1:2y+pUklSmsk3yPgJV352VIvBD22OWezLLyrUM0gBd18= +cloud.google.com/go/run v1.3.6 h1:xQND6EJn1LgouCLPSfykkzagyr4gq4FKiRexNxXixV0= +cloud.google.com/go/run v1.3.6/go.mod h1:/ou4d0u5CcK5/44Hbpd3wsBjNFXmn6YAWChu+XAKwSU= +cloud.google.com/go/run v1.6.0 h1:LRJvntufFKJ0Jcwt7BbIHwf/0Ipq4twzyJcH1qSEs84= +cloud.google.com/go/run v1.6.0/go.mod h1:DXkPPa8bZ0jfRGLT+EKIlPbHvosBYBMdxTgo9EBbXZE= +cloud.google.com/go/run v1.9.3 h1:BrB0Y/BlsyWKdHebDp3CpbV9knwcWqqQI4RWYElf1zQ= +cloud.google.com/go/run v1.9.3/go.mod h1:Si9yDIkUGr5vsXE2QVSWFmAjJkv/O8s3tJ1eTxw3p1o= +cloud.google.com/go/run v1.11.0 h1:OUmYkwJz96AIM5lt6gN91+uM3afbAnKBIf8ZQOzKlE0= +cloud.google.com/go/run v1.11.0/go.mod h1:OCGabmueD6ighPLUNCyWiTe5NBYitqOm5MFEuah5A+8= +cloud.google.com/go/scheduler v1.10.7 h1:h1/VZk0XdkSh/jI7dDNp3V0Qi8yTkclOljDVPelXvAw= +cloud.google.com/go/scheduler v1.10.7/go.mod h1:AfKUtlPF0D2xtfWy+k6rQFaltcBeeoSOY7XKQkWs+1s= +cloud.google.com/go/scheduler v1.11.1 h1:uGaM4mRrGkJ0LLBMyxD8qbvIko4y+UlSOwJQqRd/lW8= +cloud.google.com/go/scheduler v1.11.1/go.mod h1:ptS76q0oOS8hCHOH4Fb/y8YunPEN8emaDdtw0D7W1VE= +cloud.google.com/go/scheduler v1.11.7 h1:zkMEJ0UbEJ3O7NwEUlKLIp6eXYv1L7wHjbxyxznajKM= +cloud.google.com/go/scheduler v1.11.7/go.mod h1:gqYs8ndLx2M5D0oMJh48aGS630YYvC432tHCnVWN13s= +cloud.google.com/go/secretmanager v1.12.0 h1:e5pIo/QEgiFiHPVJPxM5jbtUr4O/u5h2zLHYtkFQr24= +cloud.google.com/go/secretmanager v1.12.0/go.mod h1:Y1Gne3Ag+fZ2TDTiJc8ZJCMFbi7k1rYT4Rw30GXfvlk= +cloud.google.com/go/secretmanager v1.14.1 h1:xlWSIg8rtBn5qCr2f3XtQP19+5COyf/ll49SEvi/0vM= +cloud.google.com/go/secretmanager v1.14.1/go.mod h1:L+gO+u2JA9CCyXpSR8gDH0o8EV7i/f0jdBOrUXcIV0U= +cloud.google.com/go/secretmanager v1.14.7 h1:VkscIRzj7GcmZyO4z9y1EH7Xf81PcoiAo7MtlD+0O80= +cloud.google.com/go/secretmanager v1.14.7/go.mod h1:uRuB4F6NTFbg0vLQ6HsT7PSsfbY7FqHbtJP1J94qxGc= +cloud.google.com/go/secretmanager v1.15.0 h1:RtkCMgTpaBMbzozcRUGfZe46jb9a3qh5EdEtVRUATF8= +cloud.google.com/go/secretmanager v1.15.0/go.mod h1:1hQSAhKK7FldiYw//wbR/XPfPc08eQ81oBsnRUHEvUc= +cloud.google.com/go/security v1.15.6 h1:LYMj7ISEEjVQ0ub6E6ygGhjVbNQTH5CawKZz0bbPMVE= +cloud.google.com/go/security v1.15.6/go.mod h1:UMEAGVBMqE6xZvkCR1FvUIeBEmGOCRIDwtwT357xmok= +cloud.google.com/go/security v1.18.1 h1:w7XbMR90Ir0y8NUxKJ3uyRHuHYWPUxVI5Z/sGqbrdAQ= +cloud.google.com/go/security v1.18.1/go.mod h1:5P1q9rqwt0HuVeL9p61pTqQ6Lgio1c64jL2ZMWZV21Y= +cloud.google.com/go/security v1.18.5 h1:6hqzvuwC8za9jyCTxygmEHnp4vZ8hfhwKVArxSCAVCo= +cloud.google.com/go/security v1.18.5/go.mod h1:D1wuUkDwGqTKD0Nv7d4Fn2Dc53POJSmO4tlg1K1iS7s= +cloud.google.com/go/security v1.19.0 h1:GI6kufPbHFINq998M7x60rfV5MVo6yhD+uVrjNzueKw= +cloud.google.com/go/security v1.19.0/go.mod h1:ks6NsA9Q6UODfLLgXr4MrxC/p7Bc5k15zqcfwvqlIlw= +cloud.google.com/go/securitycenter v1.28.0 h1:NpEJeFbm3ad3ibpbpIBKXJS7eQq1cZhtt9nrDTMO/QQ= +cloud.google.com/go/securitycenter v1.28.0/go.mod h1:kmS8vAIwPbCIg7dDuiVKF/OTizYfuWe5f0IIW6NihN8= +cloud.google.com/go/securitycenter v1.35.1 h1:unUyFDeSHv89W7FPBMk10mf3R7+taAJ+1ow+0zpCzGw= +cloud.google.com/go/securitycenter v1.35.1/go.mod h1:UDeknPuHWi15TaxrJCIv3aN1VDTz9nqWVUmW2vGayTo= +cloud.google.com/go/securitycenter v1.36.2 h1:hLA58IBYmWrNiXDIONvuCUQ4sHLVPy8JvDo2j1wSYCw= +cloud.google.com/go/securitycenter v1.36.2/go.mod h1:80ocoXS4SNWxmpqeEPhttYrmlQzCPVGaPzL3wVcoJvE= +cloud.google.com/go/securitycenter v1.37.0 h1:UR8cUgXFYpWxKkKnUNy65hlrAzgwBZBVxZilJ50ESXU= +cloud.google.com/go/securitycenter v1.37.0/go.mod h1:DdQi6OEzw1rmLtPpqtUx6bqnQq8ZdCVuG9eZRYz2QAE= +cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= +cloud.google.com/go/servicedirectory v1.11.5 h1:gkzx9Cd+OTOD+zY4u5vtbdvOx7vrvHYdeDiNdC6vKyw= +cloud.google.com/go/servicedirectory v1.11.5/go.mod h1:hp2Ix2Qko7hIh5jaFWftbdwKXHQhYPijcGPpLgTVZvw= +cloud.google.com/go/servicedirectory v1.12.1 h1:LjbIXEZiyqsIADrj6Y81FnbSlaHPQHJ8UDQQnUegowc= +cloud.google.com/go/servicedirectory v1.12.1/go.mod h1:d2H6joDMjnTQ4cUUCZn6k9NgZFbXjLVJbHETjoJR9k0= +cloud.google.com/go/servicedirectory v1.12.6 h1:pl/KUNvFzlXpxgnPgzQjyTQQcv5WsQ97zCHaPrLQlYA= +cloud.google.com/go/servicedirectory v1.12.6/go.mod h1:OojC1KhOMDYC45oyTn3Mup08FY/S0Kj7I58dxUMMTpg= +cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= +cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= +cloud.google.com/go/shell v1.7.6 h1:/oJf9sboa2FfHWCmHXy+XfTRnZy8lC7O5zFyfE1EA6s= +cloud.google.com/go/shell v1.7.6/go.mod h1:Ax+fG/h5TbwbnlhyzkgMeDK7KPfINYWE0V/tZUuuPXo= +cloud.google.com/go/shell v1.8.1 h1:etoJal+LB7Pn8+5vE2aAh6QcFbBmerIOh5MxNDoXykw= +cloud.google.com/go/shell v1.8.1/go.mod h1:jaU7OHeldDhTwgs3+clM0KYEDYnBAPevUI6wNLf7ycE= +cloud.google.com/go/shell v1.8.6 h1:jLWyztGlNWBx55QXBM4HbWvfv7aiRjPzRKTUkZA8dXk= +cloud.google.com/go/shell v1.8.6/go.mod h1:GNbTWf1QA/eEtYa+kWSr+ef/XTCDkUzRpV3JPw0LqSk= +cloud.google.com/go/spanner v1.60.0 h1:O9kf49dfaDRzPpKJNChHUJ+Bao02WPedZb8ZPyi02lI= +cloud.google.com/go/spanner v1.60.0/go.mod h1:D2bOAeT/dC6zsZhXRIxbdYa5nQEYU3wYM/1KN3eg7Fs= +cloud.google.com/go/spanner v1.83.0 h1:AH3QIoSIa01l3WbeTppkwCEYFNK1AER6drcYhPmwhxY= +cloud.google.com/go/spanner v1.83.0/go.mod h1:QSWcjxszT0WRHNd8zyGI0WctrYA1N7j0yTFsWyol9Yw= +cloud.google.com/go/speech v1.22.1 h1:xo/cmhBtqoqqNg/5I8m0ECXPiqYg2fS2ioOccH+qbKE= +cloud.google.com/go/speech v1.22.1/go.mod h1:s8C9OLTemdGb4FHX3imHIp5AanwKR4IhdSno0Cg1s7k= +cloud.google.com/go/speech v1.25.1 h1:iGZJS3wrdkje/Vqiacx1+r+zVwUZoXVMdklYIVsvfNw= +cloud.google.com/go/speech v1.25.1/go.mod h1:WgQghvghkZ1htG6BhYn98mP7Tg0mti8dBFDLMVXH/vM= +cloud.google.com/go/speech v1.27.1 h1:+OktATNlQc+4WH78OrQadIP4CzXb9mBucdDGCO1NrlI= +cloud.google.com/go/speech v1.27.1/go.mod h1:efCfklHFL4Flxcdt9gpEMEJh9MupaBzw3QiSOVeJ6ck= +cloud.google.com/go/speech v1.28.0 h1:9AuiAxDTmh/aeREtw+/0e7aI27T5QN4fK5lhssc9MxA= +cloud.google.com/go/speech v1.28.0/go.mod h1:hJf6oa+1rzCW/CeDE/qCXedV20B2TXEUje5iaGwW+JI= +cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg= +cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= +cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs= +cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0= +cloud.google.com/go/storage v1.51.0 h1:ZVZ11zCiD7b3k+cH5lQs/qcNaoSz3U9I0jgwVzqDlCw= +cloud.google.com/go/storage v1.51.0/go.mod h1:YEJfu/Ki3i5oHC/7jyTgsGZwdQ8P9hqMqvpi5kRKGgc= +cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0= +cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY= +cloud.google.com/go/storagetransfer v1.10.5 h1:BawJo/u0P21cdxc2gB878qIFDC80COq2i0qWZeNevSw= +cloud.google.com/go/storagetransfer v1.10.5/go.mod h1:086WXPZlWXLfql+/nlmcc8ZzFWvITqfSGUQyMdf5eBk= +cloud.google.com/go/storagetransfer v1.11.1 h1:Hd7H1zXGQGEWyWXxWVXDMuNCGasNQim1y9CIaMZIBX8= +cloud.google.com/go/storagetransfer v1.11.1/go.mod h1:xnJo9pWysRIha8MgZxhrBEwLYbEdvdmEedhNsP5NINM= +cloud.google.com/go/storagetransfer v1.12.4 h1:2gFmZvD6G0qC57IIQ1Uga5TjvRwDyMW8lGLv9a8+tC4= +cloud.google.com/go/storagetransfer v1.12.4/go.mod h1:p1xLKvpt78aQFRJ8lZGYArgFuL4wljFzitPZoYjl/8A= +cloud.google.com/go/storagetransfer v1.13.0 h1:uqKX3OgcYzR1W1YI943ZZ45id0RqA2eXXoCBSPstlbw= +cloud.google.com/go/storagetransfer v1.13.0/go.mod h1:+aov7guRxXBYgR3WCqedkyibbTICdQOiXOdpPcJCKl8= +cloud.google.com/go/talent v1.6.7 h1:4xgDFfOcgcSY0dUzaSc2tQCSRoLDEJ5CfbW5jfcgNJk= +cloud.google.com/go/talent v1.6.7/go.mod h1:OLojlmmygm0wuTqi+UXKO0ZdLHsAedUfDgxDrkIWxTo= +cloud.google.com/go/talent v1.7.1 h1:J3iZU+HPfoD18Lx8JsgIpwe8llQ9Fu/evcQudQCB+pk= +cloud.google.com/go/talent v1.7.1/go.mod h1:X8UKtTgcP+h51MtDO/b+y3X1GxTTc7gPJ2y0aX3X1hM= +cloud.google.com/go/talent v1.8.3 h1:wDP+++O/P1cTJBMkYlSY46k0a6atSoyO+UkBGuU9+Ao= +cloud.google.com/go/talent v1.8.3/go.mod h1:oD3/BilJpJX8/ad8ZUAxlXHCslTg2YBbafFH3ciZSLQ= +cloud.google.com/go/texttospeech v1.7.6 h1:gLEyDoJeFGdoX7jSKbf+nJy7CTgjsSbCZXwzzkXgH9w= +cloud.google.com/go/texttospeech v1.7.6/go.mod h1:nhRJledkoE6/6VvEq/d0CX7nPnDwc/uzfaqePlmiPVE= +cloud.google.com/go/texttospeech v1.8.1 h1:LpX9xKoGObltmT6+RGxqUeSJIq0uqPzo+fcbbOmujbY= +cloud.google.com/go/texttospeech v1.8.1/go.mod h1:WoTykB+4mfSDDYPuk7smrdXNRGoJJS6dXRR6l4XqD9g= +cloud.google.com/go/texttospeech v1.12.1 h1:IdYOIwagXmSjBuACNC86KTB3E/b7vgwyXzYzlLLxDhM= +cloud.google.com/go/texttospeech v1.12.1/go.mod h1:f8vrD3OXAKTRr4eL0TPjZgYQhiN6ti/tKM3i1Uub5X0= +cloud.google.com/go/texttospeech v1.13.0 h1:oWWFQp0yFl4EJOr3opDkKH9304wUsZjgPjrTDS6S1a8= +cloud.google.com/go/texttospeech v1.13.0/go.mod h1:g/tW/m0VJnulGncDrAoad6WdELMTes8eb77Idz+4HCo= +cloud.google.com/go/tpu v1.6.6 h1:Cb1txkZYbKlGIZ4tQr9EjEB9snAOU6qyjvNezGXDunI= +cloud.google.com/go/tpu v1.6.6/go.mod h1:T4gCNpT7SO28mMkCVJTWQ3OXAUY3YlScOqU4+5iX2B8= +cloud.google.com/go/tpu v1.7.1 h1:MP2GYTVEPkg1KlhY3A4CF9Do8eklQOOfgbIYNINcVaE= +cloud.google.com/go/tpu v1.7.1/go.mod h1:kgvyq1Z1yuBJSk5ihUaYxX58YMioCYg1UPuIHSxBX3M= +cloud.google.com/go/tpu v1.8.3 h1:S4Ptq+yFIPNLEzQ/OQwiIYDNzk5I2vYmhf0SmFQOmWo= +cloud.google.com/go/tpu v1.8.3/go.mod h1:Do6Gq+/Jx6Xs3LcY2WhHyGwKDKVw++9jIJp+X+0rxRE= +cloud.google.com/go/trace v1.10.6 h1:XF0Ejdw0NpRfAvuZUeQe3ClAG4R/9w5JYICo7l2weaw= +cloud.google.com/go/trace v1.10.6/go.mod h1:EABXagUjxGuKcZMy4pXyz0fJpE5Ghog3jzTxcEsVJS4= +cloud.google.com/go/trace v1.11.1 h1:UNqdP+HYYtnm6lb91aNA5JQ0X14GnxkABGlfz2PzPew= +cloud.google.com/go/trace v1.11.1/go.mod h1:IQKNQuBzH72EGaXEodKlNJrWykGZxet2zgjtS60OtjA= +cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4= +cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI= +cloud.google.com/go/translate v1.10.2 h1:SXOtKYnT7ZkeMtPwujaBOBt5Ph4kf6LIuMpAgu/WON0= +cloud.google.com/go/translate v1.10.2/go.mod h1:M4xIFGUwTrmuhyMMpJFZrBuSOhaX7Fhj4U1//mfv4BE= +cloud.google.com/go/translate v1.10.3/go.mod h1:GW0vC1qvPtd3pgtypCv4k4U8B7EdgK9/QEF2aJEUovs= +cloud.google.com/go/translate v1.12.1 h1:Vws9BGpVcaOeI6HodyWdvysUzHUBFvk7ymHu1tzFvuM= +cloud.google.com/go/translate v1.12.1/go.mod h1:5f4RvC7/hh76qSl6LYuqOJaKbIzEpR1Sj+CMA6gSgIk= +cloud.google.com/go/translate v1.12.5 h1:QPMNi4WCtHwc2PPfxbyUMwdN/0+cyCGLaKi2tig41J8= +cloud.google.com/go/translate v1.12.5/go.mod h1:o/v+QG/bdtBV1d1edmtau0PwTfActvxPk/gtqdSDBi4= +cloud.google.com/go/translate v1.12.6 h1:QHcszWZvBLEZHM2WJ6IDg2BUTWzEPMiHhbJAd15yKGU= +cloud.google.com/go/translate v1.12.6/go.mod h1:nB3AXuX+iHbV8ZURmElcW85qkEDWZw68sf4kqMT/E5o= +cloud.google.com/go/video v1.20.5 h1:y4jgUqDiWMfX+beJnlrnloBQxEIa9v+KrlkD2QJVpeE= +cloud.google.com/go/video v1.20.5/go.mod h1:tCaG+vfAM6jmkwHvz2M0WU3KhiXpmDbQy3tBryMo8I0= +cloud.google.com/go/video v1.23.1 h1:U+fu5Jwi3q8WDDOh1hr8kcdXVUJGmP3vWsZ13jwkWFA= +cloud.google.com/go/video v1.23.1/go.mod h1:ncFS3D2plMLhXkWkob/bH4bxQkubrpAlln5x7RWluXA= +cloud.google.com/go/video v1.23.5 h1:leLw8LyDCR6K7HZkbIie3d45t0Z75BdJVC3WYP+MWy0= +cloud.google.com/go/video v1.23.5/go.mod h1:ZSpGFCpfTOTmb1IkmHNGC/9yI3TjIa/vkkOKBDo0Vpo= +cloud.google.com/go/video v1.25.0 h1:M/krJJDgUgZszzFgv7qHRltSVMafXgcuYyCETSH1oyA= +cloud.google.com/go/video v1.25.0/go.mod h1:6oXm0hVxVkg/182cx6IVsz6Z2ag5bVdfodrNzuMYFWc= +cloud.google.com/go/videointelligence v1.11.6 h1:P0Sa8+5KOEAVk/fazUNjVPzRCijCheZWJ8wL8xBn9Uk= +cloud.google.com/go/videointelligence v1.11.6/go.mod h1:b6dd26k4jUM+9evzWxLK1QDwVvoOA1piEYiTDv3jF6w= +cloud.google.com/go/videointelligence v1.12.1 h1:4XScHLWL/1Q1FVczlxiZT+kSynUQPUktIUTqpIkOMeU= +cloud.google.com/go/videointelligence v1.12.1/go.mod h1:C9bQom4KOeBl7IFPj+NiOS6WKEm1P6OOkF/ahFfE1Eg= +cloud.google.com/go/videointelligence v1.12.6 h1:heq7jEO39sH5TycBh8TGFJ827XCxK0tIWatmBY/n0jI= +cloud.google.com/go/videointelligence v1.12.6/go.mod h1:/l34WMndN5/bt04lHodxiYchLVuWPQjCU6SaiTswrIw= +cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= +cloud.google.com/go/vision/v2 v2.8.1 h1:kvR1sHcuPYat1wI3BYY7CEX2xLAcUHPYL6dOzV2Xf4Q= +cloud.google.com/go/vision/v2 v2.8.1/go.mod h1:0n3GzR+ZyRVDHTH5koELHFqIw3lXaFdLzlHUvlXNWig= +cloud.google.com/go/vision/v2 v2.9.1 h1:jpK/E7/SJXpbnQVgfr2nGsIIzSQ9GkOsBf2iak1O8nc= +cloud.google.com/go/vision/v2 v2.9.1/go.mod h1:keORalKMowhEZB5hEWi1XSVnGALMjLlRwZbDiCPFuQY= +cloud.google.com/go/vision/v2 v2.9.5 h1:UJZ0H6UlOaYKgCn6lWG2iMAOJIsJZLnseEfzBR8yIqQ= +cloud.google.com/go/vision/v2 v2.9.5/go.mod h1:1SiNZPpypqZDbOzU052ZYRiyKjwOcyqgGgqQCI/nlx8= +cloud.google.com/go/vmmigration v1.7.6 h1:sbaWK76csqtk0TGPGCiJqZi7tfrU0LnrhUjZHI5YVdc= +cloud.google.com/go/vmmigration v1.7.6/go.mod h1:HpLc+cOfjHgW0u6jdwcGlOSbkeemIEwGiWKS+8Mqy1M= +cloud.google.com/go/vmmigration v1.8.1 h1:dyK3bFJVx28FInAkzeLVANpChwWgAmiaUM4GNtEQS/Q= +cloud.google.com/go/vmmigration v1.8.1/go.mod h1:MB7vpxl6Oz2w+CecyITUTDFkhWSMQmRTgREwkBZFyZk= +cloud.google.com/go/vmmigration v1.8.6 h1:68hOQDhs1DOITrCrhritrwr8xy6s8QMdwDyMzMiFleU= +cloud.google.com/go/vmmigration v1.8.6/go.mod h1:uZ6/KXmekwK3JmC8PzBM/cKQmq404TTfWtThF6bbf0U= +cloud.google.com/go/vmwareengine v1.1.2 h1:Mf8abigBstvjfSGq9twhtbMTCONL0Cjds+tGbc2pV0M= +cloud.google.com/go/vmwareengine v1.1.2/go.mod h1:7wZHC+0NM4TnQE8gUpW397KgwccH+fAnc4Lt5zB0T1k= +cloud.google.com/go/vmwareengine v1.3.1 h1:CCdTFQnOatMPbtbMnCja//K4slk5Tjt0u3XEb1T9Qlw= +cloud.google.com/go/vmwareengine v1.3.1/go.mod h1:mSYu3wnGKJqvvhIhs7VA47/A/kLoMiJz3gfQAh7cfaI= +cloud.google.com/go/vmwareengine v1.3.5 h1:OsGd1SB91y9fDuzdzFngMv4UcT4cqmRxjsCsS4Xmcu8= +cloud.google.com/go/vmwareengine v1.3.5/go.mod h1:QuVu2/b/eo8zcIkxBYY5QSwiyEcAy6dInI7N+keI+Jg= +cloud.google.com/go/vpcaccess v1.7.6 h1:wbMTRdZ9P5+3D6oQWWqB/YxDCFR5m5OJ+b+hHwaBBQQ= +cloud.google.com/go/vpcaccess v1.7.6/go.mod h1:BV6tTobbojd2AhrEOBLfywFUJlFU63or5Qgd0XrFsCc= +cloud.google.com/go/vpcaccess v1.8.1 h1:e1wJ1wQGMqOf44Gw44PU9G6NYITKm0f2We4eKzMwyEs= +cloud.google.com/go/vpcaccess v1.8.1/go.mod h1:cWlLCpLOuMH8oaNmobaymgmLesasLd9w1isrKpiGwIc= +cloud.google.com/go/vpcaccess v1.8.6 h1:RYtUB9rQEijX9Tc6lQcGst58ZOzPgaYTkz6+2pyPQTM= +cloud.google.com/go/vpcaccess v1.8.6/go.mod h1:61yymNplV1hAbo8+kBOFO7Vs+4ZHYI244rSFgmsHC6E= +cloud.google.com/go/webrisk v1.9.6 h1:rVhi2WOHcZF72X7spXVTFTmRGeFN4NFeW7/Ku7kgeug= +cloud.google.com/go/webrisk v1.9.6/go.mod h1:YzrDCXBOpnC64+GRRpSXPMQSvR8I4r5YO78y7A/T0Ac= +cloud.google.com/go/webrisk v1.10.1 h1:mYYjXXMILCwIEqtChUDNGamMBgJKnoJXa9Os2e76uzk= +cloud.google.com/go/webrisk v1.10.1/go.mod h1:VzmUIag5P6V71nVAuzc7Hu0VkIDKjDa543K7HOulH/k= +cloud.google.com/go/webrisk v1.11.1 h1:yZKNB7zRxOMriLrhP5WDE+BjxXVl0wJHHZSdaYzbdVU= +cloud.google.com/go/webrisk v1.11.1/go.mod h1:+9SaepGg2lcp1p0pXuHyz3R2Yi2fHKKb4c1Q9y0qbtA= +cloud.google.com/go/websecurityscanner v1.6.6 h1:YAwNB/HjKOVAy9D7W8Bkv8OQ9G2lqIqFOuJbyH5Xo4Q= +cloud.google.com/go/websecurityscanner v1.6.6/go.mod h1:zjsc4h9nV1sUxuSMurR2v3gJwWKYorJ+Nanm+1/w6G0= +cloud.google.com/go/websecurityscanner v1.7.1 h1:VyJObL4Pzd4ypF2814rKlesrVibrf1WpZ2yp4jJvKyw= +cloud.google.com/go/websecurityscanner v1.7.1/go.mod h1:vAZ6hyqECDhgF+gyVRGzfXMrURQN5NH75Y9yW/7sSHU= +cloud.google.com/go/websecurityscanner v1.7.6 h1:cIPKJKZA3l7D8DfL4nxce8HGOWXBw3WAUBF0ymOW9GQ= +cloud.google.com/go/websecurityscanner v1.7.6/go.mod h1:ucaaTO5JESFn5f2pjdX01wGbQ8D6h79KHrmO2uGZeiY= +cloud.google.com/go/workflows v1.12.5 h1:hH511zmS93oE6j64m/eiGWnfgqailh/S8+f3MVNLcE8= +cloud.google.com/go/workflows v1.12.5/go.mod h1:KbK5/Ef28G8MKLXcsvt/laH1Vka4CKeQj0I1/wEiByo= +cloud.google.com/go/workflows v1.13.1 h1:DkxrZ4HyXvjQLZWsYAUOV1w7d2a43XscM9dmkIGmrDc= +cloud.google.com/go/workflows v1.13.1/go.mod h1:xNdYtD6Sjoug+khNCAtBMK/rdh8qkjyL6aBas2XlkNc= +cloud.google.com/go/workflows v1.14.2 h1:phBz5TOAES0YGogxZ6Q7ISSudaf618lRhE3euzBpE9U= +cloud.google.com/go/workflows v1.14.2/go.mod h1:5nqKjMD+MsJs41sJhdVrETgvD5cOK3hUcAs8ygqYvXQ= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= +filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= +github.com/99designs/gqlgen v0.17.37/go.mod h1:eov4+h4V+M6snvxWsGsUZskjv9r0vuIrSE7qjMkJYig= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbxukD1WuWXOiE9fRdu32f2I= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2 h1:lneMk5qtUMulXa/eVxjVd+/bDYMEDIqYpLzLa2/EsNI= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 h1:8kDqDngH+DmVBiCtIjCFTGa7MBnsIOkF9IccInFEbjk= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 h1:T8quHYlUGyb/oqtSTwqlCr1ilJHrDv+ZtpSfo+hm1BU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0 h1:jp0dGvZ7ZK0mgqnTSClMxa5xuRL7NZgHameVYF6BurY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1 h1:eVvIXUKiTgv++6YnWb42DUA1YL7qDugnKP0HljexdnQ= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5 h1:Y3bBUV4rTuxenJJs41HU3qmqsb+auo+a3Lz+PlJPpL0= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8= +github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= +github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 h1:oPdPEZFSbl7oSPEAIPMPBMUmiL+mqgzBJwM/9qYcwNg= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY= +github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/DataDog/appsec-internal-go v1.9.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= +github.com/DataDog/appsec-internal-go v1.13.0 h1:aO6DmHYsAU8BNFuvYJByhMKGgcQT3WAbj9J/sgAJxtA= +github.com/DataDog/appsec-internal-go v1.13.0/go.mod h1:9YppRCpElfGX+emXOKruShFYsdPq7WEPq/Fen4tYYpk= +github.com/DataDog/datadog-agent/comp/core/secrets/def v0.71.0 h1:apuGDXpUSJKPNDd8UfJVjfbeA4Gruaka/52AgebKez8= +github.com/DataDog/datadog-agent/comp/core/secrets/def v0.71.0/go.mod h1:I9vNx3KX4dWuKrAjSrHOa2UBG9T2w8i5ZMn8gCYm97Y= +github.com/DataDog/datadog-agent/comp/core/secrets/def v0.71.2 h1:lnQK1olyfdxdDJ/877hWdqRqJBhuv0nZCcExm8Oc9xY= +github.com/DataDog/datadog-agent/comp/core/secrets/def v0.71.2/go.mod h1:I9vNx3KX4dWuKrAjSrHOa2UBG9T2w8i5ZMn8gCYm97Y= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.66.1/go.mod h1:u/ZS2pzrBQ1LokbEvFULjn1SfX+If31uqtz6MJ7UaFo= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0-rc.2 h1:EyLqpACbI6bTH6kfugSFWubsDr7gqboMxaYO0TPpfX4= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0-rc.2/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.64.2 h1:RKzJe4B8yQLZ5iC4tidfakKWQnFAeMCgoxJYXPsqQbo= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.64.2/go.mod h1:+BnlaBR5kMqTFYwDEc1QW0f6zvLJKnwBAUbeC68HaVs= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.66.0 h1:9thJ4Lsy7S197UV+gz0N93T3X8dUTim7PoWpv86fFlU= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.66.0/go.mod h1:Qu4Bl0erCFLwvSqym/PWo3eLZiSSMdPodjII9JGSwPY= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.66.1 h1:KO8z2vXbchwJdJQwMx0yqxDvS7WfmAjW5xNUpW921YA= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.66.1/go.mod h1:Qu4Bl0erCFLwvSqym/PWo3eLZiSSMdPodjII9JGSwPY= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.67.0 h1:GWSMSu8xQ91w8vIOkdTl2e1Q/qGhPcilYSIUsJWJIqg= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.67.0/go.mod h1:rkn9RaUfhFr64p9zF0HIaiT32e6Or76pjHJJg9fglq0= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.70.2/go.mod h1:ZEftp/HLxOXypl928kaJuXmKVmbviAUlPa3wtfDJjDU= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.71.0-rc.2/go.mod h1:YZChPRJGbiW+jjZ6k3ZiY0WilBzBOQwvYbH+16Pa9H0= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.71.0 h1:4PybL4sEZQ2bq18F7ZWq0MJal/5r87qcoh0OWTruiuA= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.71.0/go.mod h1:YZChPRJGbiW+jjZ6k3ZiY0WilBzBOQwvYbH+16Pa9H0= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.71.2 h1:zRaSlt+aHjFD7WoN883pL52LVYHML7TW7GjnKfVaQ0o= +github.com/DataDog/datadog-agent/comp/trace/compression/def v0.71.2/go.mod h1:YZChPRJGbiW+jjZ6k3ZiY0WilBzBOQwvYbH+16Pa9H0= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.64.2 h1:VC9oiyjcjuBHfxWZcXXc1fwBygLXO33GzfbZeWNPBOY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.64.2/go.mod h1:viv8Bvx5BE2YDnsWwemlGu6dsaT6tjBoK27eMXkvdeY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.66.0 h1:RfxP4lkAbjmc8SUuU25mfvp12c+ETPc5qKg3zopnu5s= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.66.0/go.mod h1:/yHmMqOlDyn6dWqDWMH+EOrSPhx6PIqwXNjl/sxdQz8= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.66.1 h1:2Xyi87u6zzqtlL/6sWJzmvHTiaqLyb58BfinKfAXbdc= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.66.1/go.mod h1:q07TPvUbBOsRWZfVrnh/ivBbUzMczFjWe8u4mWRvHEA= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.67.0 h1:FDBCbHbTtwGpfHL7RI0xl7lnDPVV6e5rz7mxCEJtWHY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.67.0/go.mod h1:zqTLA1qsVGO9u3Ajn0UDeVBCxXPV9Kw6xmqSPMI1rtg= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.70.2/go.mod h1:zEIWJqEpE6VqdvH/fHRBFn5Q6lGbAvQHQKjEWtYYJk8= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.71.0-rc.2/go.mod h1:s1tB29kJ53EEC5ucnOo7gzqnOTe1hF7jgFQOsaOCB+Q= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.71.0 h1:UDyQ4X2t4iYQEWxhQNYeM9kwTED1XxC92nKaD+YGUE0= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.71.0/go.mod h1:wqpWgCXg73YUhT6uMoTpTAH6j8LaEgvy9Iky3wiDmvU= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.71.2 h1:Uj77/whCV541qzwVJzFFRQ+T/mIxu1a8XtAEkaLT+jM= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-gzip v0.71.2/go.mod h1:JL+otP+mzjxlxfl2eEGo4VXlIFagZiM5XK2b0e8BYqs= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.64.2 h1:58UNufA8lcUb/0ggQAj6mzKxcTxuYVf71PQcrx+izHg= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.64.2/go.mod h1:X97j3rl2QnoOXanM23Qw1Esmz+bx+tu2ODnbZPdzzoc= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.66.0 h1:/TN9im/UI/GWKPFC4O13Su9x3JlwtlgU0o8cFFbAeF4= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.66.0/go.mod h1:WUkyVXGsZop8iO3idtyHQl9B7CfgY1ag96sxKsUC72E= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.66.1 h1:mc9KCTjXO8CnfkfpogNfCVl1aBSv5ESpSH73tGbAMzM= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.66.1/go.mod h1:1fFfGLRyekAGyhx0VY3TJ7p2tRSilHm73d8BRevkrTQ= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.67.0 h1:MXSsPb8Iq03LyzqLlYXmQvbO6aOWRz0TZJNzer+m60I= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.67.0/go.mod h1:Ilx3NOvj8xiwknrCjChi3xCtDBSzQl055Hn/7o8Q7Pg= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.70.2/go.mod h1:JRAa3KT9I2Gkjwxkr/DWKuSuKTzhuUJeHLID+dtPQQk= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.71.0-rc.2/go.mod h1:MluMoh6XUI2NE3ZI61OwLJYYZizvJjQe4aubuchD8Tc= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.71.0 h1:PGz7RUFyeKpo8vzgwOmv0gijJxJGTw6taGoXLmdxrTI= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.71.0/go.mod h1:Obi3j7t0xzOJBMezJ5f+jPbnaDqLj+Dc1U06FqTnLeY= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.71.2 h1:ejiklfep3WtsANPksauW17eZSLQY+FPLMDkIZfNerkc= +github.com/DataDog/datadog-agent/comp/trace/compression/impl-zstd v0.71.2/go.mod h1:juEplx2pVebWj6eZa5seBIdG17IlzI/0oyoWuZ11cTA= +github.com/DataDog/datadog-agent/pkg/api v0.70.2/go.mod h1:bDGrKdvc7axktM4HwtWwAGc/rAwTzxDhA8KGtS7x3vI= +github.com/DataDog/datadog-agent/pkg/api v0.71.0-rc.2/go.mod h1:0EnmNaClcYdruA4MN9XV7YOXZxjGd+/UkEdIRg9KMqs= +github.com/DataDog/datadog-agent/pkg/api v0.71.0 h1:Ax1DoIB7fr1dOnTDSNoTAP3b07CudcrgGFb4NwQus+s= +github.com/DataDog/datadog-agent/pkg/api v0.71.0/go.mod h1:k8/tuu1rgOpdLD+A9v1j9wM4eLwP6CrlaAu0n2n5SJc= +github.com/DataDog/datadog-agent/pkg/api v0.71.2 h1:xy0AARmH+EapNFEJjgcAaN6yW2zhpE6C0ZIyCVN83/w= +github.com/DataDog/datadog-agent/pkg/api v0.71.2/go.mod h1:B3s6nEkJTmOxOCdEQUSZxHeLJk4mr/9wbsNsh4+t5cI= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.71.0 h1:w357SDCp/CRuD3fGq+URTNmNY6qWiTp12QyfeEtGYSM= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.71.0/go.mod h1:3q5jo9teRLXJFUQIf3at3MU+SaSGlTHmAWnMa/KHhB4= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.71.2 h1:qEMOWNYsaHN9ip3rkEnP/+djUnlUxPMS7GVJRZ8jwsY= +github.com/DataDog/datadog-agent/pkg/collector/check/defaults v0.71.2/go.mod h1:3q5jo9teRLXJFUQIf3at3MU+SaSGlTHmAWnMa/KHhB4= +github.com/DataDog/datadog-agent/pkg/config/create v0.71.0 h1:7hTvNzXEskgcQe0pkqx9IpKffFNzLHyq8L1XACfAKlE= +github.com/DataDog/datadog-agent/pkg/config/create v0.71.0/go.mod h1:Ee09S7q9LO+Jxqfzl5zEy5Y9fxjla7G5JB87z5OltgM= +github.com/DataDog/datadog-agent/pkg/config/create v0.71.2 h1:je3tG7hL9gAHnKCAGCRc1hqgWb5MbH7W7bJrPlnYPe8= +github.com/DataDog/datadog-agent/pkg/config/create v0.71.2/go.mod h1:eaLfN6ZuySPlC6uPTezMLseFgwWud5SjbvLqbvheH1Y= +github.com/DataDog/datadog-agent/pkg/config/env v0.71.0 h1:dUa2/25kXBUA7c2qFhpMep97I2XK1CYB4vOuJMBeWw8= +github.com/DataDog/datadog-agent/pkg/config/env v0.71.0/go.mod h1:4c46j+zs6XlK6viWXCHAqr1vDhxY3Fvkq8UX6wayInw= +github.com/DataDog/datadog-agent/pkg/config/env v0.71.2 h1:50ZBQAwbVKzsdHMeIOVaoyxG/ok5D3htGBpRQNLPqBk= +github.com/DataDog/datadog-agent/pkg/config/env v0.71.2/go.mod h1:JjuExJ+N1vW014ywT38fVTeYCT5aAyHpQ3lNByggL6U= +github.com/DataDog/datadog-agent/pkg/config/mock v0.71.0 h1:z3UbmDYlnQgIjxvsElWCsCPhgfqGM/7V+s6ZUac73Bo= +github.com/DataDog/datadog-agent/pkg/config/mock v0.71.0/go.mod h1:eAurwbMYpjJnLZrST4PuzPnU37GgGduvZF7flK+MuWU= +github.com/DataDog/datadog-agent/pkg/config/mock v0.71.2 h1:wX4zlZePHkFrXfv+t+EbdHk+LIadBmAkVn0U0oF1PA4= +github.com/DataDog/datadog-agent/pkg/config/mock v0.71.2/go.mod h1:xI3iDyYy/dWKca5xlwqDl+XEyytVuDx4T1Q+DgF2Khw= +github.com/DataDog/datadog-agent/pkg/config/model v0.71.0 h1:hN5T1Lh2UWiu++FUO5jd1tyGShl2XNx6kUUX58CpX5c= +github.com/DataDog/datadog-agent/pkg/config/model v0.71.0/go.mod h1:bt4h1Ylg+C1NYzHr+xu6m3cC9OCoPbfz7qsBK3lJ7Og= +github.com/DataDog/datadog-agent/pkg/config/model v0.71.2 h1:y6aabokxhvd09aIe4PELsQfdi4nAydfyxAE4qVdVLTc= +github.com/DataDog/datadog-agent/pkg/config/model v0.71.2/go.mod h1:bt4h1Ylg+C1NYzHr+xu6m3cC9OCoPbfz7qsBK3lJ7Og= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.71.0 h1:DmkFSJMgHwyK1mCMRibJcn0LD7yQWdwSHlEU/GJyjFc= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.71.0/go.mod h1:QjXHJjtG5U7Ysq+TTYzKb4/mh+shPlKCoYuZGJDW9DY= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.71.2 h1:DedcuLbSqf9+wP+zaKD8g31wiDNIqLXYW8dyFjshELI= +github.com/DataDog/datadog-agent/pkg/config/nodetreemodel v0.71.2/go.mod h1:kFPtFccwUPci4O8RfiRHnOgK7x0jP5f4Z3/BLfDXVnA= +github.com/DataDog/datadog-agent/pkg/config/setup v0.71.0 h1:77nD/YC7j8Caxu9PHAoYT2AAIznCqFIH64RSZnH7BM8= +github.com/DataDog/datadog-agent/pkg/config/setup v0.71.0/go.mod h1:trX4omb8pnKwe+O/A85QxWUhMmD9NOzjoVwJlf5Rwiw= +github.com/DataDog/datadog-agent/pkg/config/setup v0.71.2 h1:XiY7LcrOdwuR60rOBNn/vuMSSJLLP0zOfTt4KgiblZA= +github.com/DataDog/datadog-agent/pkg/config/setup v0.71.2/go.mod h1:HSK/nEPVYvD2TsYqG919sxj1saOME55gRYTXOJBxVCw= +github.com/DataDog/datadog-agent/pkg/config/structure v0.71.0 h1:Mg80T6sTvQeLBRE1IOuA8gGD4RV8gKi4ZNJN3QTpiLM= +github.com/DataDog/datadog-agent/pkg/config/structure v0.71.0/go.mod h1:jbmVODjTjGtHJ5oUciEF6243ogxed3VV9nR5uT4awkM= +github.com/DataDog/datadog-agent/pkg/config/structure v0.71.2 h1:yKk3q552/KxnJu7KFstIU7qUoaikAFJzk004n+QZIlI= +github.com/DataDog/datadog-agent/pkg/config/structure v0.71.2/go.mod h1:3P0JD/h6r9kczhMrBcjy7mM1Yo09qJdOmgxY0PwdeSU= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.71.0 h1:Lv2p6F8PMZlk19CsGjnQDDD6SL8M3Ynp/cW/uZXPBRA= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.71.0/go.mod h1:cySuBqmQwEwA83GIMjTRQlQRRxOLviLvs8qbEc2TN2s= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.71.2 h1:WKJJ6B/u0lZwD4tEHrrRIfl/dAx/W9s/Yfdn4itX2oA= +github.com/DataDog/datadog-agent/pkg/config/teeconfig v0.71.2/go.mod h1:5Ghm5e5TMO8MZ2jnQj7f0/aIsVSUg0WePmcnaIFR+Do= +github.com/DataDog/datadog-agent/pkg/config/utils v0.71.0 h1:8KoSFTD502xGHwlEuD4G/cfz0+2PmBZT4zFzf/l3k8A= +github.com/DataDog/datadog-agent/pkg/config/utils v0.71.0/go.mod h1:c/W8HERSjkG1WTEfX+sJg4Rq001va8gYnncAMlQLN+g= +github.com/DataDog/datadog-agent/pkg/config/utils v0.71.2 h1:i3Fzm7o2y6SyVY8aW0aFJFvgJBYtOfJIwLHw1KJOs2k= +github.com/DataDog/datadog-agent/pkg/config/utils v0.71.2/go.mod h1:7MRDq8AcmkaoCdoVTaBNcWt9GhGos4poRVj+ykzkvEA= +github.com/DataDog/datadog-agent/pkg/config/viperconfig v0.71.0 h1:JSuSBjMb9fs+cqiDupp1YTnkzuK/8OxVPTlQkgpoVTA= +github.com/DataDog/datadog-agent/pkg/config/viperconfig v0.71.0/go.mod h1:m/ja0ZKtJgHKCUWkAVLmEzkDjFjt4NvETwqO9c/vSek= +github.com/DataDog/datadog-agent/pkg/config/viperconfig v0.71.2 h1:owU86ZP24drfxpPY6xQpCW5Rr0Z/Fjm3IMeqsT1vdIY= +github.com/DataDog/datadog-agent/pkg/config/viperconfig v0.71.2/go.mod h1:KlvIogqGbaxWW3QG4CYcyYMPos0jvT0Dm+AEoF5tHy0= +github.com/DataDog/datadog-agent/pkg/fips v0.71.0 h1:kX37wKLJHG1Acm5ncrQZ3+PrQ1UUk/NWCAvOwSmXMBs= +github.com/DataDog/datadog-agent/pkg/fips v0.71.0/go.mod h1:iSqRH2LX8LFeQdf3UR15iuOkP2/I8tkRrO3OdY9rOC4= +github.com/DataDog/datadog-agent/pkg/fips v0.71.2 h1:K9aWyVkgaDuZULNMSj1BT40WBMEICABgrGCG7gxQPHg= +github.com/DataDog/datadog-agent/pkg/fips v0.71.2/go.mod h1:iSqRH2LX8LFeQdf3UR15iuOkP2/I8tkRrO3OdY9rOC4= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.66.1/go.mod h1:NH6IHfS2BEWP3i8JBxr6EIuD4TXprGny8dJZZs5QdwQ= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0-rc.2 h1:YtpjnVO6w1RNTvjaZjhM11OBU+uh5W86uxj26jpTg3w= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0-rc.2/go.mod h1:Kxy2ltI0LdjAncCWS1GdzITfPg28b1/khkxSx+FAYeA= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0-devel.0.20250820180704-be0d2d237646/go.mod h1:iAo6WH4vhQG6ELJAuFVH73xGnOIFInTyAIxaVBJnw0s= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0-rc.2 h1:YhYDocChu6LiOFyFZ6TJHhC+7W1FUW4zoZpCVVYBtZg= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0-rc.2/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.72.0-devel h1:WqM9ELVlsyhBNULBOaJdKctRiO7ZSc7iU2CoVJVQ9js= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.72.0-devel/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.66.1/go.mod h1:W81BWdx7VxgdshvJuyZhDfWWwJAHROEi4yXX25yzX5A= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0-rc.2 h1:mNe91p91rE9loyZZnRT6fYXs3F/mhhlLSdWOT1E8KCY= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0-rc.2/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.66.1/go.mod h1:/AzUUTZn8FZj3xUFJxMh/0/NPqpjsv2z+IMXG/IxRFc= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.71.0-rc.2 h1:hrbJ3funlrf4k+xNydkwqMzi0uIZuQaTQJw/o+DeHC8= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.71.0-rc.2/go.mod h1:cAUt6KWsedHR2k4agAvEfiK8tGxFJDIrCvrWMIGwe/o= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.71.0/go.mod h1:cAUt6KWsedHR2k4agAvEfiK8tGxFJDIrCvrWMIGwe/o= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.71.2/go.mod h1:cAUt6KWsedHR2k4agAvEfiK8tGxFJDIrCvrWMIGwe/o= +github.com/DataDog/datadog-agent/pkg/template v0.66.0 h1:rELsNJybR6oZ9OHj54zbG7M5JYUKeW7j9uFYIGwjvfc= +github.com/DataDog/datadog-agent/pkg/template v0.66.0/go.mod h1:uZEMDpntZpvc2SWQWgZTpwCRM8m9FMfWx471/5zjZBU= +github.com/DataDog/datadog-agent/pkg/template v0.66.1 h1:IY5BDczv1dOSdCsiD9HU84RY7kaIauW4url4gX3/evc= +github.com/DataDog/datadog-agent/pkg/template v0.66.1/go.mod h1:uZEMDpntZpvc2SWQWgZTpwCRM8m9FMfWx471/5zjZBU= +github.com/DataDog/datadog-agent/pkg/template v0.67.0 h1:oeeFkLzU31vNvk/pc1SfA2oYvOAlBzWWRzRrbHFPhwY= +github.com/DataDog/datadog-agent/pkg/template v0.67.0/go.mod h1:uZEMDpntZpvc2SWQWgZTpwCRM8m9FMfWx471/5zjZBU= +github.com/DataDog/datadog-agent/pkg/template v0.70.2/go.mod h1:uZEMDpntZpvc2SWQWgZTpwCRM8m9FMfWx471/5zjZBU= +github.com/DataDog/datadog-agent/pkg/template v0.71.0-rc.2/go.mod h1:mpV3MbF/us0LdM3tvVHDztjApy3VWGeu5RuS/MpGVHQ= +github.com/DataDog/datadog-agent/pkg/template v0.71.0 h1:8Ae4PEzg7pYkEfjBZJQgY/ChEqlgwhL58lFNMAzFQJ4= +github.com/DataDog/datadog-agent/pkg/template v0.71.0/go.mod h1:mpV3MbF/us0LdM3tvVHDztjApy3VWGeu5RuS/MpGVHQ= +github.com/DataDog/datadog-agent/pkg/template v0.71.2 h1:U0USPyBsIdOh1pVc9OVD4rO4SfbsKOrWWEgDsg7dVj8= +github.com/DataDog/datadog-agent/pkg/template v0.71.2/go.mod h1:mpV3MbF/us0LdM3tvVHDztjApy3VWGeu5RuS/MpGVHQ= +github.com/DataDog/datadog-agent/pkg/trace v0.66.1/go.mod h1:S+GWyA8N6JT/DHi08xt63kn957wPZs0Kg5ClaY2FPgc= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0-rc.2 h1:GaNyrvcwSCrMV4Z7+rfM+4BK1pkwItf2Xpgwmp1SKG0= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0-rc.2/go.mod h1:oJrjB8LCrHGhHVpV1EZ4tMsXLY/wXSHUjIrh4gl6iGc= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.64.2 h1:oIXXiS3AECT6JwyJsmbWN9P5ku57fogLkUDeka6uYl4= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.64.2/go.mod h1:ag/+5g879n3WZpcPr8yW7X4Lf83l3yz8qTsoeM1U7Qo= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.66.0 h1:XYfPhu2zbvM00ocogjsGZ6cgYdNyj5v/QmQemRczKeo= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.66.0/go.mod h1:TSn+mGvV04TcOWCbDJmt6gOXoGEAqJKiSVPHxpEavFY= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.66.1 h1:9XTsASaD0IEXCrhIU9C9eeEw/GpC9W52XJtDgnOnHsw= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.66.1/go.mod h1:QpmGPKiB2o2hVyPcaz1aO2Ug1wcgTBNdc9pXMGXLZQA= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.67.0 h1:4zdK63EX8IEumz1G3lWLaAoDcuyc+E26zIHED6HtVS0= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.67.0/go.mod h1:vuQxQRg6890W8LC2lDyRASCTb5sIA3hzwdouhp2LB4E= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.70.2/go.mod h1:icQVku8gHRXhQDXXpNT+tq3vv5Ww4yx+VbiQ6uSJaJs= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.71.0-rc.2/go.mod h1:iZ7e43lSVY0dGhzZZdfPr33cPJQ3hAyZmTXoecP11jw= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.71.0 h1:oIp1lAinDsMZ2A50akawAocH3nbXpHttDMOZ9v3UuEQ= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.71.0/go.mod h1:0aOukuEPgxYjfNapCdk/F1loXGGJ0bUvuHRa/KEXrPY= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.71.2 h1:hiwPmcYz6RbUiQdpMf3snZcip4YUNJJn9N/rQMSGSD8= +github.com/DataDog/datadog-agent/pkg/util/cgroups v0.71.2/go.mod h1:T3+54PHwkFIbTrAcMa7NDMRS//a2wVVgUChRsb/LQNI= +github.com/DataDog/datadog-agent/pkg/util/executable v0.71.0 h1:Vjy5vc+dOaZv61poWxSnrfziSzhkFNd0TehoPdCvL2Y= +github.com/DataDog/datadog-agent/pkg/util/executable v0.71.0/go.mod h1:K9+z+kyEdREAmk2nbfCgIEDqHyK6fmrZFq93Lzr5fjY= +github.com/DataDog/datadog-agent/pkg/util/executable v0.71.2 h1:LFeF1NRRdQNZ5JFCY/9u/fFOEKhSxA/OkB4LuxRU4lM= +github.com/DataDog/datadog-agent/pkg/util/executable v0.71.2/go.mod h1:K9+z+kyEdREAmk2nbfCgIEDqHyK6fmrZFq93Lzr5fjY= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.71.0 h1:QNIpXqmPiIwGWcWWnoWuJod3WAurbrXrLFYieyLKBtM= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.71.0/go.mod h1:xqe73vQbkZF8USjUjtkElM861OxG11Pq9yxEsd3/IDU= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.71.2 h1:KydBB29abEwhw5jRVOVrcfZas+HJObzPrIevntCQFc0= +github.com/DataDog/datadog-agent/pkg/util/filesystem v0.71.2/go.mod h1:tGep83BorYnp9/Ci4QeD29X+pR0hruF42pwGFMmeTz0= +github.com/DataDog/datadog-agent/pkg/util/flavor v0.71.0 h1:nASYqnMeF89fiBO0Dcec1SA77YRd9SgIEHBONd7KSFw= +github.com/DataDog/datadog-agent/pkg/util/flavor v0.71.0/go.mod h1:gsX4L8+Gg0aOjWIHP78CZb45ZKSjXk6S6W4rUm6R94g= +github.com/DataDog/datadog-agent/pkg/util/flavor v0.71.2 h1:6GAdBqu+Fr/DzcyOcPF1B0RRqNuLrrDzKPMK6q/ZuI4= +github.com/DataDog/datadog-agent/pkg/util/flavor v0.71.2/go.mod h1:zaneBpEOUJ1hNNkMae26RncJ1D3rYDEytMfl9EQl/Go= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.71.0 h1:8Rpv0TWnY8hGFMnq5D3noKikU7fGUEbodm5rhJLKZC4= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.71.0/go.mod h1:FM2kyJ1muxTz3UUa4+mCWnDAYmteVFqYj9DJlz130NA= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.71.2 h1:VJmdMnjUr3mliaidWS7DDelShlYZfpAxyw+Wqk5bGLs= +github.com/DataDog/datadog-agent/pkg/util/hostname/validate v0.71.2/go.mod h1:rubj/cas9OWx46DdCANs1zGvn3TrUTvw9K+CGOy3Xok= +github.com/DataDog/datadog-agent/pkg/util/log v0.66.1/go.mod h1:TBGT1NFg9Essf3ypyegWT74PKbIzTuHAHM9V3B+3vXY= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0-rc.2 h1:t8KwYyPktQXgQ933SDQrKZG0QzdgsFjYkZIMAQsGmNI= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0-rc.2/go.mod h1:EPA8cg2eKy53aFLFnhsTZBcP93F5ezLjOnwQbGAJ8I8= +github.com/DataDog/datadog-agent/pkg/util/option v0.71.0 h1:iL+Qwhox86qzqkpNMAaP9Cyxb0jnT58wN9A/ZUENI9I= +github.com/DataDog/datadog-agent/pkg/util/option v0.71.0/go.mod h1:tZXJ+bZn0j0zdwK+y7IM/NaQ6n3wrCEB5HmLqwk9m6k= +github.com/DataDog/datadog-agent/pkg/util/option v0.71.2 h1:kiyH11QimweI2P6pztseYNdKRHJQyhyWlqkWJw8lXck= +github.com/DataDog/datadog-agent/pkg/util/option v0.71.2/go.mod h1:tZXJ+bZn0j0zdwK+y7IM/NaQ6n3wrCEB5HmLqwk9m6k= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.64.2 h1:riYWM572c2zVBK6yMg1i2XfmGhmDtooM9+WXBGNXtHk= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.64.2/go.mod h1:cY4100zn21kBb748mG0hDv9BfswD+tUw3p2M4XdUzAE= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.66.0 h1:8fVvmbjBUL1wZeNvLIaolE1eNg4EVP12w4Whkd6AkT4= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.66.0/go.mod h1:lsv9K9R8nZWSgbJpzduE9+l2XBxzYK13XYqErLrCrdY= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.66.1 h1:POFMxM1hM1fY37LwM9TdWBwF64duZiV5NDLwlIlwCRM= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.66.1/go.mod h1:lsv9K9R8nZWSgbJpzduE9+l2XBxzYK13XYqErLrCrdY= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.67.0 h1:2aze75lrcLQbRPqOJIBrbrDJ9MvWIJ3BJlAzELtbCoE= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.67.0/go.mod h1:Dt8OapdWxeGXEUx4lr+taYw60VRpaONMzikPfRc/qwk= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.70.2/go.mod h1:M8MEp4WqfG5uNZ7ZZC6vY8juV2n9PemF62So5/EBX4M= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.71.0-rc.2/go.mod h1:9nP4HNOKZszsv8YoCe16xQ5XPKgitPaWBjgCJQC0+jk= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.71.0 h1:YL1vonweA1ulziSx8yrESqS3CT056jxNyV0oRd3AyEo= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.71.0/go.mod h1:9nP4HNOKZszsv8YoCe16xQ5XPKgitPaWBjgCJQC0+jk= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.71.2 h1:vKoNH8S/4Y6TmenUiYIT8Jx5isvMlKEm1Q3bDH7NUI8= +github.com/DataDog/datadog-agent/pkg/util/pointer v0.71.2/go.mod h1:9nP4HNOKZszsv8YoCe16xQ5XPKgitPaWBjgCJQC0+jk= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.66.1/go.mod h1:1ebZZr2A/0LnD76aK+m1leTOAjKVkJUjCvaw+wTQEcI= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0-rc.2 h1:UVVBC7nE5NE+mvt+Oje9a+4FhlZEuws4i3rZ0bAYyj4= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0-rc.2/go.mod h1:BUyllFtuqpcN4njMujSQU8dWYWC1v9MbN97uxKyroS4= +github.com/DataDog/datadog-agent/pkg/util/system v0.71.0 h1:YWyCnEdRQiBwwBowG0pt3n7tBjJiJmO58/TOqG8Oymk= +github.com/DataDog/datadog-agent/pkg/util/system v0.71.0/go.mod h1:X5lV4yBAdKek2uBVmmz1jIl5AoRucshCX51PCrftBFQ= +github.com/DataDog/datadog-agent/pkg/util/system v0.71.2 h1:q6twhpBSaiWhP/h4KYe+ynt7X3FXXo88srQgBm1rb20= +github.com/DataDog/datadog-agent/pkg/util/system v0.71.2/go.mod h1:DJevwSEnQOzk/oU6sVzT/Wu3mtZoT378FszA02wWEQA= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.71.0 h1:HVEKzNNIKGyhS60ZHuqtMLKdAFvi7vrGRpGZxoZP7Fw= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.71.0/go.mod h1:e58Rq42J+S1hfEKKYKgbCzLDaU3D5UB6SJwPucFRNNs= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.71.2 h1:Cj2Y4NXsf2d95F7H34iSD8kulBtCUs/e6b7MovkDKUw= +github.com/DataDog/datadog-agent/pkg/util/system/socket v0.71.2/go.mod h1:e58Rq42J+S1hfEKKYKgbCzLDaU3D5UB6SJwPucFRNNs= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.71.0 h1:J27IrQ3ZSMfZ6u7+VyBOp8KL5aHHXHsxd8N07zv/CEY= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.71.0/go.mod h1:7DcXWOeac5dDtPF2pcLpZTPZ+B8DQIEOTYZQ+GlBuSg= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.71.2 h1:QAwcyXtxsEQ6uAml9JN08GQjumYydc3pFavVYgBk2ys= +github.com/DataDog/datadog-agent/pkg/util/winutil v0.71.2/go.mod h1:N2wv/SXh+tzgD+ypC+50BrQh6XMfSs8fQJU1B1rMGis= +github.com/DataDog/datadog-agent/pkg/version v0.66.1/go.mod h1:LXOHXAHH+vqBwmQKcZa5FgBEi4ECKIC2WsV2Jd9VVJ0= +github.com/DataDog/datadog-agent/pkg/version v0.71.0-rc.2 h1:zL3DOi3LLS/kG/vxQao7m4CCdShLqKnN/MAb4NCyctI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0-rc.2/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= +github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2 v2.1.0-dev/go.mod h1:qq7SKlItHcfcpuPzTKVX4K/RrpUL6jcb4kLImOgGQ20= +github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2 v2.1.0-dev/go.mod h1://eoD6NGmeCnokLq0UN/lcqY3drf2DapwJg5FCj+p8o= +github.com/DataDog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2 v2.1.0/go.mod h1:t3n2eXZyFArVeLouqpon8sL8zlooqOAoWXBxwLCQxh8= +github.com/DataDog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2 v2.3.0-rc.2/go.mod h1:y4VBSmaTB7+kQ9smaZ32o1a8NsEMR9NFMXyHAem25wo= +github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2 v2.1.0-dev/go.mod h1:IhOeZqjcEixncgExT0ZB9p8DOtrxH/mDA/84I1ND+sM= +github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2 v2.1.0-dev/go.mod h1:mkIDXvmKl1BunGmChVKrLSPUPwZJ0LHQgdJMw2gGuwg= +github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2 v2.1.0/go.mod h1:2E+032b3LjEOvdMw9WrTP4fYVVkMEvxDrPdC5LJnj0I= +github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2 v2.3.0-rc.2/go.mod h1:VSZpRwrSx9HKVpdHWKf/VVM3WkVCV7i4AmcHqZDgOK8= +github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2 v2.1.0-dev/go.mod h1:e/HqqQZ+Xk7qaAePRlOyokHyag447332wdvxG6fLWUE= +github.com/DataDog/dd-trace-go/contrib/jmoiron/sqlx/v2 v2.1.0/go.mod h1:X1it1aJCMaZAwnnfFPyfLfKLDIyhTAMBgQsOD5WL8AM= +github.com/DataDog/dd-trace-go/contrib/jmoiron/sqlx/v2 v2.3.0-rc.2/go.mod h1:ooY3k46BblS8zFupWJgEkpxpEFrjIz+u6bsf6lSIicA= +github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2 v2.1.0-dev.1/go.mod h1:VFv1QsCKkUQ6gRQz+q3cToeCogJo9CdhU+b6SmSRPfc= +github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2 v2.1.0-dev/go.mod h1:A4ksXI+6CWUMjmMmTodvIEALB6Gd31g1OLlbo26G/0A= +github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2 v2.1.0-dev/go.mod h1:hTu9uFVDO7lRaqG98J25yT/Rj64D6Sb7nqLtj7rMDB8= +github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2 v2.1.0-dev/go.mod h1:Z587VhVGGawpRwKxDoJn9VJiQRMbibqI1QgSusx7L4I= +github.com/DataDog/dd-trace-go/contrib/uptrace/bun/v2 v2.1.0/go.mod h1:Vye9RfXOs+Giw1yboIjW8MwV7rWCvuaQi+I5Ucib/u4= +github.com/DataDog/dd-trace-go/contrib/uptrace/bun/v2 v2.3.0-rc.2/go.mod h1:UYGlbqdZ9B29lW3rOw0ya24ons42CPaUnlz/fNmK424= +github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2 v2.1.0-dev/go.mod h1:uGU/4F6b5DPM0OvGm5o1MdJwewNjUR1NBLkFM8Xd3C0= +github.com/DataDog/dd-trace-go/contrib/valyala/fasthttp/v2 v2.1.0/go.mod h1:EJJKLVEK82+z0R7Q1eZNN2yVckN8xa1gDUtRSDhy3LI= +github.com/DataDog/dd-trace-go/contrib/valyala/fasthttp/v2 v2.3.0-rc.2/go.mod h1:P2iquHh4jA8yL4K4pHt+UQcm28WGBjbSbLvYT4TDVq4= +github.com/DataDog/go-libddwaf/v3 v3.5.3/go.mod h1:HoLUHdj0NybsPBth/UppTcg8/DKA4g+AXuk8cZ6nuoo= +github.com/DataDog/go-libddwaf/v4 v4.1.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-libddwaf/v4 v4.3.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-libddwaf/v4 v4.4.0 h1:jgkg4tPbU3iC8HZpC3NmF9d+93iGVVlGW3JM1/cNhTY= +github.com/DataDog/go-libddwaf/v4 v4.4.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-libddwaf/v4 v4.6.0/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250603194815-7edb7c2ad56a/go.mod h1:quaQJ+wPN41xEC458FCpTwyROZm3MzmTZ8q8XOXQiPs= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250710075948-d3ee4f430e22/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.0/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= +github.com/DataDog/go-sqllexer v0.1.3/go.mod h1:KwkYhpFEVIq+BfobkTC1vfqm4gTi65skV/DpDBXtexc= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.26.0/go.mod h1:mYQmU7mbHH6DrCaS8N6GZcxwPoeNfyuopUoLQltwSzs= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.29.1 h1:RoHver8/fv4qKZtmb11TJ/zcOMd0SqOKT8H9ZQIjjPA= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.29.1/go.mod h1:yN8VBQrExGN/nbIpn8E2jrMJn94e69mnq8a5PDCKY/g= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.33.0 h1:ju98Y0a0mC7tTWJGUSRo9HvWbMR/XHtMhUqI+iPspSw= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.33.0/go.mod h1:KhkezjjbSSfWv0BmHCokcV24Rhdmjw8X4nZD3K38Ts8= +github.com/DataDog/viper v1.7.0 h1:hJvGT/zsNgVPxJLjW+ozl247LzEIRs7DdKakUgSsQzo= +github.com/DataDog/viper v1.7.0/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/DataDog/viper v1.14.1-0.20250612143030-1b15c8822ed4 h1:PwqhnH1ln2EjGm9XZGUF4RTCwLt0Jt4cebbZBTe+BnA= +github.com/DataDog/viper v1.14.1-0.20250612143030-1b15c8822ed4/go.mod h1:wDdUVJ2SHaMaPrCZrlRCObwkubsX8j5sme3LaR/SGTc= +github.com/DataDog/zstd v1.5.6 h1:LbEglqepa/ipmmQJUDnSsfvA8e8IStVcGaFWDuxvGOY= +github.com/DataDog/zstd v1.5.6/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf h1:8F6fjL5iQP6sArGtPuXh0l6hggdcIpAm4ChjVJE4oTs= +github.com/GoogleCloudPlatform/cloudsql-proxy v0.0.0-20190129172621-c8b1d7a94ddf/go.mod h1:aJ4qN3TfrelA6NZ6AXsXRfmEVaYin3EDbSPJrKS8OXo= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 h1:2afWGsMzkIcN8Qm4mgPJKZWyroE5QBszMiDMYEBrnfw= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 h1:3c8yed4lgqTt+oTQ+JNMDo+F4xprBf+O/il4ZC0nRLw= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.2.1/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig/v3 v3.2.1 h1:n6EPaDyLSvCEa3frruQvAiHuNp2dhBlMSmkEr+HuzGc= +github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3 h1:4FA+QBaydEHlwxg0lMN3rhwoDaQy6LKhVWR4qvq4BuA= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= +github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= +github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= +github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= +github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0 h1:E5Dzlk3akC+T2Zj1LBHgfPK1y8YWgLDnNDRmG+tpSKw= +github.com/aclements/go-gg v0.0.0-20170118225347-6dbb4e4fefb0/go.mod h1:55qNq4vcpkIuHowELi5C8e+1yUHtoLoOUR9QU5j7Tes= +github.com/actgardner/gogen-avro/v10 v10.2.1 h1:z3pOGblRjAJCYpkIJ8CmbMJdksi4rAhaygw0dyXZ930= +github.com/actgardner/gogen-avro/v9 v9.1.0 h1:YZ5tCwV5xnDZrG4uRDQYT2VAWZCRAG3eyQH/WYR2T6Q= +github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/ahmetb/gen-crd-api-reference-docs v0.3.0 h1:+XfOU14S4bGuwyvCijJwhhBIjYN+YXS18jrCY2EzJaY= +github.com/ahmetb/gen-crd-api-reference-docs v0.3.0/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= +github.com/akavel/rsrc v0.10.2 h1:Zxm8V5eI1hW4gGaYsJQUhxpjkENuG91ki8B4zCrvEsw= +github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= +github.com/alecthomas/participle/v2 v2.1.0/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= +github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/alexflint/go-filemutex v1.2.0 h1:1v0TJPDtlhgpW4nJ+GvxCLSlUDC3+gW0CQQvlmfDR/s= +github.com/alexflint/go-filemutex v1.2.0/go.mod h1:mYyQSWvw9Tx2/H2n9qXPb52tTYfE0pZAWcBq5mK025c= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= +github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= +github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= +github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/antithesishq/antithesis-sdk-go v0.4.3-default-no-op/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= +github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= +github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= +github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM= +github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= +github.com/apache/arrow/go/v14 v14.0.2 h1:N8OkaJEOfI3mEZt07BIkvo4sC6XDbL+48MBPWO5IONw= +github.com/apache/arrow/go/v14 v14.0.2/go.mod h1:u3fgh3EdgN/YQ8cVQRguVW3R+seMybFg8QBQ5LU+eBY= +github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= +github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= +github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= +github.com/apache/thrift v0.17.0 h1:cMd2aj52n+8VoAtvSvLn4kDC3aZ6IAkBuqWQ2IDu7wo= +github.com/apache/thrift v0.17.0/go.mod h1:OLxhMRJxomX+1I/KUw03qoV3mMz16BwaKI+d4fPBx7Q= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go-v2 v1.17.8/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= +github.com/aws/aws-sdk-go-v2 v1.22.1/go.mod h1:Kd0OJtkW3Q0M0lUWGszapWjEvrXDzRW+D21JNsroB+c= +github.com/aws/aws-sdk-go-v2 v1.25.3/go.mod h1:35hUlJVYd+M++iLI3ALmVwMOyRYMmRqUXpTtRGW+K9I= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.10/go.mod h1:VeTZetY5KRJLuD/7fkQXMU6Mw7H5m/KP2J5Iy9osMno= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.13/go.mod h1:gpAbvyDGQFozTEmlTFO8XcQKHzubdq0LzRyJpG6MiXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.1/go.mod h1:sxpLb+nZk7tIfCWChfd+h4QwHNUR57d8hA1cleTkjJo= +github.com/aws/aws-sdk-go-v2/config v1.18.21/go.mod h1:+jPQiVPz1diRnjj6VGqWcLK6EzNmQ42l7J3OqGTLsSY= +github.com/aws/aws-sdk-go-v2/config v1.22.1/go.mod h1:2eWgw5lps8fKI7LZVTrRTYP6HE6k/uEFUuTSHfXwqP0= +github.com/aws/aws-sdk-go-v2/credentials v1.13.20/go.mod h1:xtZnXErtbZ8YGXC3+8WfajpMBn5Ga/3ojZdxHq6iI8o= +github.com/aws/aws-sdk-go-v2/credentials v1.15.1/go.mod h1:QTcHga3ZbQOneJuxmGBOCxiClxmp+TlvmjFexAnJ790= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.2/go.mod h1:cDh1p6XkSGSwSRIArWRc6+UqAQ7x4alQ0QfpVR6f+co= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.2/go.mod h1:wLyMIo/zPOhQhPXTddpfdkSleyigtFi8iMnC+2m/SK4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.32/go.mod h1:RudqOgadTWdcS3t/erPQo24pcVEoYyqj/kKW5Vya21I= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.40/go.mod h1:5kKmFhLeOVy6pwPDpDNA6/hK/d6URC98pqDDqHgdBx4= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.1/go.mod h1:V5CY8wNurvPUibTi9mwqUqpiFZ5LnioKWIFUDtIzdI8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.3/go.mod h1:oQZXg3c6SNeY6OZrDY+xHcF4VGIEoNotX2B4PrDeoJI= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.26/go.mod h1:vq86l7956VgFr0/FWQ2BWnK07QC3WYsepKzy33qqY5U= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.34/go.mod h1:RZP0scceAyhMIQ9JvFp7HvkpcgqjL4l/4C+7RAeGbuM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.1/go.mod h1:R8aXraabD2e3qv1csxM14/X9WF4wFMIY0kH4YEtYD5M= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.3/go.mod h1:vCKrdLXtybdf/uQd/YfVR2r5pcbNuEYKzMQpcxmeSJw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.33/go.mod h1:zG2FcwjQarWaqXSCGpgcr3RSjZ6dHGguZSppUL0XR7Q= +github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.5.0/go.mod h1:VV/Kbw9Mg1GWJOT9WK+oTL3cWZiXtapnNvDSRqTZLsg= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.24/go.mod h1:+fFaIjycTmpV6hjmPTbyU9Kp5MI/lA+bbibcAtmlhYA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.1.3/go.mod h1:jYLMm3Dh0wbeV3lxth5ryks/O2M/omVXWyYm3YcEVqQ= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.21.4/go.mod h1:aryF4jxgjhbqpdhj8QybUZI3xYrX8MQIKm4WbOv8Whg= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.20.4/go.mod h1:XlbY5AGZhlipCdhRorT18/HEThKAxo51hMmhixreJoM= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.11/go.mod h1:iV4q2hsqtNECrfmlXyord9u4zyuFEJX9eLgLpSPzWA8= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.14/go.mod h1:dDilntgHy9WnHXsh7dDtUPgHKEfTJIBUTHM8OWm0f/0= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.27/go.mod h1:Zz0kvhcSlu3NX4XJkaGgdjaa+u7a9LYuy8JKxA5v3RM= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.35/go.mod h1:YVHrksq36j0sbXCT6rSuQafpfYkMYqy0QTk7JTCTBIU= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.7.34/go.mod h1:CDPcT6pljRaqz1yLsOgPUvOPOczFvXuJxOKzDzAbF0c= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.26/go.mod h1:Bd4C/4PkVGubtNe5iMXu5BNnaBi/9t/UsFspPt4ram8= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.1/go.mod h1:FZB4AdakIqW/yERVdGJA6Z9jraax1beXfhBBnK2wwR8= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.14.1/go.mod h1:VXBHSxdN46bsJrkniN68psSwbyBKsazQfU2yX/iSDso= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.15.3/go.mod h1:TXBww3ANB+QRj+/dUoYDvI8d/u4F4WzTxD4mxtDoxrg= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.18.4/go.mod h1:HnjgmL8TNmYtGcrA3N6EeCnDvlX6CteCdUbZ1wV8QWQ= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.2 h1:71gafPkX0RyJJqq921QJ+JvVmXIByfYONsy2XIN/+zk= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.2/go.mod h1:7w4Wsl8JbRrZmi6YHRa0fxvLyY+VoYSVmC7OpdJP/VQ= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.33.2 h1:t3Ukha929to7c4SZDeCP3aRQBgn01nhwKxggYOVRMR0= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.33.2/go.mod h1:dJngkoVMrq0K7QvRkdRZYM4NUp6cdWa2GBdpm8zoY8U= +github.com/aws/aws-sdk-go-v2/service/route53 v1.6.2 h1:OsggywXCk9iFKdu2Aopg3e1oJITIuyW36hA/B0rqupE= +github.com/aws/aws-sdk-go-v2/service/route53 v1.6.2/go.mod h1:ZnAMilx42P7DgIrdjlWCkNIGSBLzeyk6T31uB8oGTwY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.32.0/go.mod h1:aSl9/LJltSz1cVusiR/Mu8tvI4Sv/5w/WWrJmmkNii0= +github.com/aws/aws-sdk-go-v2/service/sfn v1.19.4/go.mod h1:uWCH4ATwNrkRO40j8Dmy7u/Y1/BVWgCM+YjBNYZeOro= +github.com/aws/aws-sdk-go-v2/service/sns v1.21.4/go.mod h1:bbB779DXXOnPXvB7F3dP7AjuV1Eyr7fNyrA058ExuzY= +github.com/aws/aws-sdk-go-v2/service/sqs v1.24.4/go.mod h1:c1AF/ac4k4xz32FprEk6AqqGFH/Fkub9VUPSrASlllA= +github.com/aws/aws-sdk-go-v2/service/sso v1.12.8/go.mod h1:GNIveDnP+aE3jujyUSH5aZ/rktsTM5EvtKnCqBZawdw= +github.com/aws/aws-sdk-go-v2/service/sso v1.17.0/go.mod h1:H6NCMvDBqA+CvIaXzaSqM6LWtzv9BzZrqBOqz+PzRF8= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.8/go.mod h1:44qFP1g7pfd+U+sQHLPalAPKnyfTZjJsYR4xIwsJy5o= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.19.0/go.mod h1:4wPNCkM22+oRe71oydP66K50ojDUC33XutSMi2pEF/M= +github.com/aws/aws-sdk-go-v2/service/sts v1.18.9/go.mod h1:yyW88BEPXA2fGFyI2KCcZC3dNpiT0CZAHaF+i656/tQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.25.0/go.mod h1:S/LOQUeYDfJeJpFCIJDMjy7dwL4aA33HUdVi+i7uH8k= +github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= +github.com/aws/smithy-go v1.16.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= +github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aymanbagabas/go-udiff v0.2.0 h1:TK0fH4MteXUDspT88n8CKzvK0X9O2xu9yQjWpi6yML8= +github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= +github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= +github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.24.0 h1:H4x4TuulnokZKvHLfzVRTHJfFfnHEeSYJizujEZvmAM= +github.com/bits-and-blooms/bitset v1.24.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1 h1:pgAtgj+A31JBVtEHu2uHuEx0n+2ukqUJnS2vVe5pQNA= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= +github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd h1:rFt+Y/IK1aEZkEHchZRSq9OQbsSzIT/OrI8YFFmRIng= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b h1:otBG+dV+YK+Soembjv71DPz3uX/V/6MMlSyD9JBQ6kQ= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0 h1:nvj0OLI3YqYXer/kZD8Ri1aaunCxIEsOst1BVJswV0o= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/bytedance/sonic v1.11.6/go.mod h1:LysEHSvpvDySVdC2f87zGWf6CIKJcAvqab1ZaiQtds4= +github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v3 v3.2.2 h1:cfUAAO3yvKMYKPrvhDuHSwQnhZNk/RMHKdZqKTxfm6M= +github.com/cenkalti/backoff/v3 v3.2.2/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk= +github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q= +github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a h1:G99klV19u0QnhiizODirwVksQB91TJKV/UaTnACcG30= +github.com/charmbracelet/x/exp/golden v0.0.0-20240806155701-69247e0abc2a/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= +github.com/checkpoint-restore/go-criu/v4 v4.1.0 h1:WW2B2uxx9KWF6bGlHqhm8Okiafwwx7Y2kcpn8lCpjgo= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 h1:qSGYFH7+jGhDF8vLC+iwCD4WpbV1EBDSzWkJODFLams= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= +github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= +github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= +github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= +github.com/cilium/ebpf v0.16.0 h1:+BiEnHL6Z7lXnlGUsXQPPAE7+kenAd4ES8MQ5min0Ok= +github.com/cilium/ebpf v0.16.0/go.mod h1:L7u2Blt2jMM/vLAVgjxluxtBKlz3/GWjB0dMOEngfwE= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= +github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k= +github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= +github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= +github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= +github.com/container-orchestrated-devices/container-device-interface v0.6.1 h1:mz77uJoP8im/4Zins+mPqt677ZMaflhoGaYrRAl5jvA= +github.com/container-orchestrated-devices/container-device-interface v0.6.1/go.mod h1:40T6oW59rFrL/ksiSs7q45GzjGlbvxnA4xaK6cyq+kA= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v1.0.0 h1:2oeJiwX5HstO7shSrPZjrohJZLzK36wvpdmzDRkL/LY= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e h1:chFw/cg0TDyK43qm8DKbblny2WHc4ML+j1KOkdEp9pI= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M= +github.com/containerd/btrfs/v2 v2.0.0/go.mod h1:swkD/7j9HApWpzl8OHfrHNxppPd9l44DFZdF94BUj9k= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.2 h1:f5WFqIVSgo5IZmtTT3qVBo6TzI1ON6sycSBKkymb9L0= +github.com/containerd/cgroups/v3 v3.0.2/go.mod h1:JUgITrzdFqp42uI2ryGA+ge0ap/nxzYgkGmIcetmErE= +github.com/containerd/cgroups/v3 v3.0.5 h1:44na7Ud+VwyE7LIoJ8JTNQOa549a8543BmzaJHo6Bzo= +github.com/containerd/cgroups/v3 v3.0.5/go.mod h1:SA5DLYnXO8pTGYiAHXz94qvLQTKfVM5GEVisn4jpins= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.7.12/go.mod h1:/5OMpE1p0ylxtEUGY8kuCYkDRzJm9NO1TFMWjUpdevk= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.1.9 h1:ORi7P1dYzCwVM6XPN4n3CbkuOx/NZ2DOqy+SHRdo9rU= +github.com/containerd/go-cni v1.1.9/go.mod h1:XYrZJ1d5W6E2VOvjffL3IZq0Dz6bsVlERHbekNK90PM= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v1.0.0 h1:oU+lLv1ULm5taqgV/CJivypVODI4SUz1znWjv3nNYS0= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.8 h1:ZS7TuywcRNLoHpU0g+v4/PsKynl6TYlw5xDVWWoIyFA= +github.com/containerd/imgcrypt v1.1.8/go.mod h1:x6QvFIkMyO2qGIY2zXc88ivEzcbgvLdWjoZyGqDap5U= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.6.1 h1:xSQ6elnQ4Ynidm9u49ARK9wRKHs80HCUI+bkXOxV4mA= +github.com/containerd/nri v0.6.1/go.mod h1:7+sX3wNx+LR7RzhjnJiUkFDhn18P5Bg/0VnJ/uXpRJM= +github.com/containerd/nri v0.8.0 h1:n1S753B9lX8RFrHYeSgwVvS1yaUcHjxbB+f+xzEncRI= +github.com/containerd/nri v0.8.0/go.mod h1:uSkgBrCdEtAiEz4vnrq8gmAC4EnVAM5Klt0OuK5rZYQ= +github.com/containerd/stargz-snapshotter/estargz v0.14.3 h1:OqlDCK3ZVUO6C3B/5FSkDwbkEETK84kQgEeFwDC+62k= +github.com/containerd/stargz-snapshotter/estargz v0.14.3/go.mod h1:KY//uOCIkSuNAHhJogcZtrNHdKrA99/FCCRjE3HD36o= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v1.1.0 h1:n7OZ7jZumLIqNJqXrEc/paBM840mORnmGdJDmAmJZHM= +github.com/containerd/zfs v1.1.0/go.mod h1:oZF9wBnrnQjpWLaPKEinrx3TQ9a+W/RJO7Zb41d8YLE= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v1.1.2 h1:wtRGZVv7olUHMOqouPpn3cXJWpJgM6+EUl31EQbXALQ= +github.com/containernetworking/cni v1.1.2/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v1.2.0 h1:SWgg3dQG1yzUo4d9iD8cwSVh1VqI+bP7mkPDoSfP9VU= +github.com/containernetworking/plugins v1.2.0/go.mod h1:/VjX4uHecW5vVimFa1wkG4s+r/s9qIfPdqlLF4TW8c4= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.10 h1:r7UR6o8+lyhkEywetubUUgcKFjOWOaWz8cEBrCPX0ic= +github.com/containers/ocicrypt v1.1.10/go.mod h1:YfzSSr06PTHQwSTUKqDSjish9BeW1E4HUmreluQcMd8= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= +github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/coreos/go-oidc v2.1.0+incompatible h1:sdJrfw8akMnCuUlaZU3tE/uYXFgfqom8DBE9so9EBsM= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= +github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.15.1 h1:rb/6oHDdvVZKS66hrhpjFQFHjthFSrQBCOI1LwshNTI= +github.com/cucumber/godog v0.15.1/go.mod h1:qju+SQDewOljHuq9NSM66s0xEhogx0q30flfxL4WUk8= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c h1:Xo2rK1pzOm0jO6abTPIQwbAmqBIOj132otexc1mmzFc= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0 h1:suYBsYZIkSlUMEz4TAYCczKf62IA2UWC+O8+KtdOhCo= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5 h1:+CpLbZIeUn94m02LdEKPcgErLJ347NUwxPKs5u8ieiY= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4 h1:itqmmf1PFpC4n5JW+j4BU7X4MTfVurhYRTjODoPb2Y8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1:1iy2qD6JEhHKKhUOA9IWs7mjco7lnw2qx8FsRI2wirE= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba h1:p6poVbjHDkKa+wtC8frBMwQtT3BmqGYBjzMwJ63tuR4= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= +github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.4 h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo= +github.com/dlclark/regexp2 v1.11.4/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ= +github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v26.1.5+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1 h1:ZClxb8laGDf5arXfYcAtECDFgAgHklGI8CxgjHnXKJ4= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 h1:8EXxF+tCLqaVk8AOC29zl2mnhQjwyLxxOTuhUazWRsg= +github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4/go.mod h1:I5sHm0Y0T1u5YjlyqC5GVArM7aNZRUYtTjmJ8mPJFds= +github.com/ebitengine/purego v0.8.3/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/crd-ref-docs v0.1.0/go.mod h1:X83mMBdJt05heJUYiS3T0yJ/JkCuliuhSUNav5Gjo/U= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.16.0+incompatible h1:rgqiKNjTnFQA6kkhFe16D8epTksy9HQ1MyrbDXSdYhM= +github.com/emicklei/go-restful v2.16.0+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.10.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= +github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= +github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI= +github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84= +github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.7.0+incompatible h1:vgGkfT/9f8zE6tvSCe74nfpAVDQ2tG6yudJd8LBksgI= +github.com/evanphx/json-patch v5.7.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww= +github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4= +github.com/evanphx/json-patch/v5 v5.9.0 h1:kcBlZQbplgElYIlo/n1hJbls2z/1awpXxpRi0/FOJfg= +github.com/evanphx/json-patch/v5 v5.9.0/go.mod h1:VNkHZ/282BpEyt/tObQO8s5CMPmYYq14uClGH4abBuQ= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e h1:Ss/B3/5wWRh8+emnK0++g5zQzwDTi30W10pKxKc4JXI= +github.com/flynn/go-docopt v0.0.0-20140912013429-f6dd2ebbb31e/go.mod h1:HyVoz1Mz5Co8TFO8EupIdlcpwShBmY98dkT2xeHkvEI= +github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/gin-gonic/gin v1.10.0/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-asn1-ber/asn1-ber v1.5.1/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA= +github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= +github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= +github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= +github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY= +github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v4 v4.0.1/go.mod h1:WVf9LFMHh/QVrmqrOfqun0C45tMe3RoiKJMPvgWwLfY= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= +github.com/go-kit/kit v0.9.0 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= +github.com/go-ldap/ldap/v3 v3.4.1/go.mod h1:iYS1MdmrmceOJ1QOTnRXrIs7i3kloqtmGQjRvjKpyMg= +github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A= +github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc= +github.com/go-ldap/ldap/v3 v3.4.8 h1:loKJyspcRezt2Q3ZRMq2p/0v8iOurlmeXDPw6fikSvQ= +github.com/go-ldap/ldap/v3 v3.4.8/go.mod h1:qS3Sjlu76eHfHGpUdWkAXQTw4beih+cHsco2jXlIXrk= +github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= +github.com/go-pg/pg/v10 v10.11.1/go.mod h1:ExJWndhDNNftBdw1Ow83xqpSf4WMSJK8urmXD5VXS1I= +github.com/go-playground/validator/v10 v10.15.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= +github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= +github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= +github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA= +github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e h1:BWhy2j3IXJhjCbC68FptL43tDKIq8FladmaTs3Xs7Z8= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= +github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= +github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= +github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= +github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= +github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs= +github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golang/glog v1.2.3 h1:oDTdz9f5VGVVNGu/Q7UXKWYsD0873HXLHdJUNBsSEKM= +github.com/golang/glog v1.2.4 h1:CNNw5U8lSiiBk7druxtSHHTsRWcxKoac6kZKm2peBBc= +github.com/golang/glog v1.2.4/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50= +github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18= +github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82/go.mod h1:PxC8OnwL11+aosOB5+iEPoV3picfs8tUpkVd0pDo+Kg= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029 h1:8jtTdc+Nfj9AR+0soOeia9UZSvYBvETVHZrugUowJ7M= +github.com/gonum/internal v0.0.0-20181124074243-f884aa714029/go.mod h1:Pu4dmpkhSyOzRwuXkOgAvijx4o+4YMUJJo9OvPYMkks= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9 h1:7qnwS9+oeSiOIsiUMajT+0R7HR6hw5NegnKPmn/94oI= +github.com/gonum/lapack v0.0.0-20181123203213-e4cdc5a0bff9/go.mod h1:XA3DeT6rxh2EAE789SSiSJNqxPaC0aE9J8NTOI0Jo/A= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 h1:V2IgdyerlBa/MxaEFRbV5juy/C3MGdj4ePi+g6ePIp4= +github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP0HCqCz+K4ts155PXIlUywf0wqN+GfPZw= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M= +github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= +github.com/google/certificate-transparency-go v1.3.1 h1:akbcTfQg0iZlANZLn0L9xOeWtyCIdeoYhKrqi5iH3Go= +github.com/google/certificate-transparency-go v1.3.1/go.mod h1:gg+UQlx6caKEDQ9EElFOujyxEQEfOiQzAt6782Bvi8k= +github.com/google/flatbuffers v23.5.26+incompatible h1:M9dgRyhJemaM4Sw8+66GHBu8ioaQmyPLg1b8VwK5WJg= +github.com/google/flatbuffers v23.5.26+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/go-attestation v0.4.4-0.20230613144338-a9b6eb1eb888/go.mod h1:xCfWZojUHwedNcs780T8cblW9XHss9XKD2s3U44FVbo= +github.com/google/go-containerregistry v0.14.0 h1:z58vMqHxuwvAsVwvKEkmVBz2TlgBgH5k6koEXBtlYkw= +github.com/google/go-containerregistry v0.14.0/go.mod h1:aiJ2fp/SXvkWgmYHioXnbMdlgB8eXiiYOY55gfN91Wk= +github.com/google/go-pkcs11 v0.3.0 h1:PVRnTgtArZ3QQqTGtbtjtnIkzl2iY2kt24yqbrf7td8= +github.com/google/go-pkcs11 v0.3.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= +github.com/google/go-sev-guest v0.6.1/go.mod h1:UEi9uwoPbLdKGl1QHaq1G8pfCbQ4QP0swWX4J0k6r+Q= +github.com/google/go-tpm-tools v0.3.13-0.20230620182252-4639ecce2aba h1:qJEJcuLzH5KDR0gKc0zcktin6KSAwL7+jWKBYceddTc= +github.com/google/go-tpm-tools v0.3.13-0.20230620182252-4639ecce2aba/go.mod h1:EFYHy8/1y2KfgTAsx7Luu7NGhoxtuVHnNo8jE7FikKc= +github.com/google/go-tspi v0.3.0/go.mod h1:xfMGI3G0PhxCdNVcYr1C4C+EizojDg/TXuX5by8CiHI= +github.com/google/logger v1.1.1/go.mod h1:BkeJZ+1FhQ+/d087r4dzojEg1u2ZX+ZqG1jTUrLM+zQ= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= +github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= +github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20250903194437-c28834ac2320 h1:c7ayAhbRP9HnEl/hg/WQOM9s0snWztfW6feWXZbGHw0= +github.com/google/pprof v0.0.0-20250903194437-c28834ac2320/go.mod h1:I6V7YzU0XDpsHqbsyrghnFZLO1gwK6NPTNvmetQIk9U= +github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/safehtml v0.0.2 h1:ZOt2VXg4x24bW0m2jtzAOkhoXV0iM8vNKc0paByCZqM= +github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU= +github.com/google/tink/go v1.7.0 h1:6Eox8zONGebBFcCBqkVmt60LaWZa6xg1cl/DwAh/J1w= +github.com/google/tink/go v1.7.0/go.mod h1:GAUOd+QE3pgj9q8VKIGTCP33c/B7eb4NhxLcgTJZStM= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/cloud-bigtable-clients-test v0.0.2 h1:S+sCHWAiAc+urcEnvg5JYJUOdlQEm/SEzQ/c/IdAH5M= +github.com/googleapis/cloud-bigtable-clients-test v0.0.2/go.mod h1:mk3CrkrouRgtnhID6UZQDK3DrFFa7cYCAJcEmNsHYrY= +github.com/googleapis/cloud-bigtable-clients-test v0.0.3 h1:afMKTvA/jc6jSTMkeHBZGFDTt8Cc+kb1ATFzqMK85hw= +github.com/googleapis/cloud-bigtable-clients-test v0.0.3/go.mod h1:TWtDzrrAI70C3dNLDY+nZN3gxHtFdZIbpL9rCTFyxE0= +github.com/googleapis/enterprise-certificate-proxy v0.3.3/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= +github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= +github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= +github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33 h1:893HsJqtxp9z1SF76gg6hY70hRY1wVlTSnC/h1yUDCo= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7FsgI= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90= +github.com/hamba/avro v1.5.6 h1:/UBljlJ9hLjkcY7PhpI/bFYb4RMEXHEwHr17gAm/+l8= +github.com/hamba/avro/v2 v2.17.2 h1:6PKpEWzJfNnvBgn7m2/8WYaDOUASxfDU+Jyb4ojDgFY= +github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= +github.com/hashicorp/cap/ldap v0.0.0-20240328153749-fcfe271d0227 h1:R5CMNyBNZqODw2DcGaSa2X96AgtLotXsH7aOa07zTTI= +github.com/hashicorp/cap/ldap v0.0.0-20240328153749-fcfe271d0227/go.mod h1:Ofp5fMLl1ImcwjNGu9FtEwNOdxA0LYoWpcWQE2vltuI= +github.com/hashicorp/cap/ldap v0.0.0-20250106213447-9047b8b3240f h1:iixO0KNqHfSMImUgaHnMHTzmu0FVLwk7VzIZf6++wak= +github.com/hashicorp/cap/ldap v0.0.0-20250106213447-9047b8b3240f/go.mod h1:vGqAhHKOR5gadKWjwhoWp3RKto/tmhVOtH8gcD0c8ss= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-hmac-drbg v0.0.0-20210916214228-a6e5a68489f6 h1:kBoJV4Xl5FLtBfnBjDvBxeNSy2IRITSGs73HQsFUEjY= +github.com/hashicorp/go-hmac-drbg v0.0.0-20210916214228-a6e5a68489f6/go.mod h1:y+HSOcOGB48PkUxNyLAiCiY6rEENu+E+Ss4LG8QHwf4= +github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.0 h1:pSjQfW3vPtrOTcasTUKgCTQT7OGPPTTMVRrOfU6FJD8= +github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.0/go.mod h1:xvb32K2keAc+R8DSFG2IwDcydK9DBQE+fGA5fsw6hSk= +github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.1 h1:KIge4FHZEDb2/xjaWgmBheCTgRL6HV4sgTfDsH876L8= +github.com/hashicorp/go-kms-wrapping/entropy/v2 v2.0.1/go.mod h1:aHO1EoFD0kBYLBedqxXgalfFT8lrWfP7kpuSoaqGjH0= +github.com/hashicorp/go-kms-wrapping/v2 v2.0.8 h1:9Q2lu1YbbmiAgvYZ7Pr31RdlVonUpX+mmDL7Z7qTA2U= +github.com/hashicorp/go-kms-wrapping/v2 v2.0.8/go.mod h1:qTCjxGig/kjuj3hk1z8pOUrzbse/GxB1tGfbrq8tGJg= +github.com/hashicorp/go-kms-wrapping/v2 v2.0.18 h1:DLfC677GfKEpSAFpEWvl1vXsGpEcSHmbhBaPLrdDQHc= +github.com/hashicorp/go-kms-wrapping/v2 v2.0.18/go.mod h1:t/eaR/mi2mw3klfl1WEAuiLKrlZ/Q8cosmsT+RIPLu0= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-plugin v1.4.8/go.mod h1:viDMjcLJuDui6pXb8U4HVfb8AamCWhHGUjr2IrTF67s= +github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= +github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.2 h1:ET4pqyjiGmY09R5y+rSd70J2w45CtbWDNvGqWp/R3Ng= +github.com/hashicorp/go-secure-stdlib/base62 v0.1.2/go.mod h1:EdWO6czbmthiwZ3/PUsDV+UD1D5IRU4ActiaWGwt0Yw= +github.com/hashicorp/go-secure-stdlib/cryptoutil v0.1.1 h1:VaLXp47MqD1Y2K6QVrA9RooQiPyCgAbnfeJg44wKuJk= +github.com/hashicorp/go-secure-stdlib/cryptoutil v0.1.1/go.mod h1:hH8rgXHh9fPSDPerG6WzABHsHF+9ZpLhRI1LPk4JZ8c= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.2 h1:p4AKXPPS24tO8Wc8i1gLvSKdmkiSY5xuju57czJ/IJQ= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.2/go.mod h1:zq93CJChV6L9QTfGKtfBxKqD7BqqXx5O04A/ns2p5+I= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.3 h1:kH3Rhiht36xhAfhuHyWJDgdXXEx9IIZhDGRk24CDhzg= +github.com/hashicorp/go-secure-stdlib/mlock v0.1.3/go.mod h1:ov1Q0oEDjC3+A4BwsG2YdKltrmEw8sf9Pau4V9JQ4Vo= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.6/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= +github.com/hashicorp/go-secure-stdlib/password v0.1.1 h1:6JzmBqXprakgFEHwBgdchsjaA9x3GyjdI568bXKxa60= +github.com/hashicorp/go-secure-stdlib/password v0.1.1/go.mod h1:9hH302QllNwu1o2TGYtSk8I8kTAN0ca1EHpwhm5Mmzo= +github.com/hashicorp/go-secure-stdlib/permitpool v1.0.0 h1:U6y5MXGiDVOOtkWJ6o/tu1TxABnI0yKTQWJr7z6BpNk= +github.com/hashicorp/go-secure-stdlib/permitpool v1.0.0/go.mod h1:ecDb3o+8D4xtP0nTCufJaAVawHavy5M2eZ64Nq/8/LM= +github.com/hashicorp/go-secure-stdlib/plugincontainer v0.4.0 h1:7Yran48kl6X7jfUg3sfYDrFot1gD3LvzdC3oPu5l/qo= +github.com/hashicorp/go-secure-stdlib/plugincontainer v0.4.0/go.mod h1:9WJFu7L3d+Z4ViZmwUf+6/73/Uy7YMY1NXrB9wdElYE= +github.com/hashicorp/go-secure-stdlib/plugincontainer v0.4.1 h1:JY+zGg8gOmslwif1fiCqT5Hu1SikLZQcHkmQhCoA9gY= +github.com/hashicorp/go-secure-stdlib/plugincontainer v0.4.1/go.mod h1:jW3KCTvdPyAdVecOUwiiO2XaYgUJ/isigt++ISkszkY= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= +github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.2/go.mod h1:l8slYwnJA26yBz+ErHpp2IRCLr0vuOMGBORIz4rRiAs= +github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.3 h1:xbrxd0U9XQW8qL1BAz2XrAjAF/P2vcqUTAues9c24B8= +github.com/hashicorp/go-secure-stdlib/tlsutil v0.1.3/go.mod h1:LWq2Sy8UoKKuK4lFuCNWSjJj57MhNNf2zzBWMtkAIX4= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= +github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= +github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= +github.com/hashicorp/vault/api v1.14.0/go.mod h1:pV9YLxBGSz+cItFDd8Ii4G17waWOQ32zVjMWHe/cOqk= +github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= +github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= +github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb h1:PGufWXXDq9yaev6xX1YQauaO1MV90e6Mpoq1I7Lz/VM= +github.com/hectane/go-acl v0.0.0-20230122075934-ca0b05cb1adb/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= +github.com/heetch/avro v0.4.4 h1:5PmgDy1cX/MegMy6btJ4bUFHgT5GLfSYfc5U7+JUQzg= +github.com/heetch/avro v0.4.4/go.mod h1:c0whqijPh/C+RwnXzAHFit01tdtf7gMeEHYSbICxJjU= +github.com/hexops/autogold v0.8.1/go.mod h1:97HLDXyG23akzAoRYJh/2OBs3kd80eHyKPvZw0S5ZBY= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE= +github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/ianlancetaylor/demangle v0.0.0-20250417193237-f615e6bd150b/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/intel/goresctrl v0.3.0 h1:K2D3GOzihV7xSBedGxONSlaw/un1LZgWsc9IfqipN4c= +github.com/intel/goresctrl v0.3.0/go.mod h1:fdz3mD85cmP9sHD8JUlrNWAxvwM86CrbmVXltEKd7zk= +github.com/intel/goresctrl v0.5.0 h1:kcDhjE3ZF/mNrJuRzLS3LY2Hp6atFaF1XVFBT7SVL2g= +github.com/intel/goresctrl v0.5.0/go.mod h1:mIe63ggylWYr0cU/l8n11FAkesqfvuP3oktIsxvu0T0= +github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= +github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56 h1:742eGXur0715JMq73aD95/FU0XpVKXqNuTnEfXsLOYQ= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= +github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= +github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= +github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= +github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= +github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= +github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= +github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= +github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= +github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= +github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= +github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= +github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= +github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= +github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= +github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= +github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= +github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= +github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= +github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= +github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= +github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= +github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.3 h1:h6W9cPuHsRWQFTWUZMAKMgG5jSwQI0Zurzdvlx3Plus= +github.com/jackc/pgtype v1.14.3/go.mod h1:aKeozOde08iifGosdJpz9MBZonJOUJxqNpPBcMJTlVA= +github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= +github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= +github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= +github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v4 v4.18.3 h1:dE2/TrEsGX3RBprb3qryqSV9Y60iZN1C6i8IrmW9/BA= +github.com/jackc/pgx/v4 v4.18.3/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= +github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= +github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= +github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= +github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= +github.com/jhump/protoreflect v1.14.1 h1:N88q7JkxTHWFEqReuTsYH1dPIwXxA0ITNQp7avLY10s= +github.com/jhump/protoreflect v1.14.1/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jimlambrt/gldap v0.1.13 h1:jxmVQn0lfmFbM9jglueoau5LLF/IGRti0SKf0vB753M= +github.com/jimlambrt/gldap v0.1.13/go.mod h1:nlC30c7xVphjImg6etk7vg7ZewHCCvl1dfAhO3ZJzPg= +github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= +github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24 h1:liMMTbpW34dhU4az1GN0pTPADwNmvoRSeoZ6PItiqnY= +github.com/jmespath/go-jmespath v0.4.1-0.20220621161143-b0104c826a24/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josephspurrier/goversioninfo v1.4.0 h1:Puhl12NSHUSALHSuzYwPYQkqa2E1+7SrtAPJorKK0C8= +github.com/josephspurrier/goversioninfo v1.4.0/go.mod h1:JWzv5rKQr+MmW+LvM412ToT/IkYDZjaclF2pKDss8IY= +github.com/josharian/native v1.1.0 h1:uuaP0hAbW7Y4l0ZRQ6C9zfb7Mg1mbFKry/xzDAfmtLA= +github.com/josharian/native v1.1.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= +github.com/joshlf/go-acl v0.0.0-20200411065538-eae00ae38531 h1:hgVxRoDDPtQE68PT4LFvNlPz2nBKd3OMlGKIQ69OmR4= +github.com/joshlf/go-acl v0.0.0-20200411065538-eae00ae38531/go.mod h1:fqTUQpVYBvhCNIsMXGl2GE9q6z94DIP6NtFKXCSTVbg= +github.com/joshlf/testutil v0.0.0-20170608050642-b5d8aa79d93d h1:J8tJzRyiddAFF65YVgxli+TyWBi0f79Sld6rJP6CBcY= +github.com/joshlf/testutil v0.0.0-20170608050642-b5d8aa79d93d/go.mod h1:b+Q3v8Yrg5o15d71PSUraUzYb+jWl6wQMSBXSGS/hv0= +github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jsimonetti/rtnetlink/v2 v2.0.1 h1:xda7qaHDSVOsADNouv7ukSuicKZO7GgVUCXxpaIEIlM= +github.com/jsimonetti/rtnetlink/v2 v2.0.1/go.mod h1:7MoNYNbb3UaDHtF8udiJo/RH6VsTKP1pqKLUTVCvToE= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/qthttptest v0.1.1 h1:JPju5P5CDMCy8jmBJV2wGLjDItUsx2KKL514EfOYueM= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= +github.com/karrick/godirwalk v1.17.0 h1:b4kY7nqDdioR/6qnbHQyDvmA17u5G1cZ6J+CZXwSWoI= +github.com/karrick/godirwalk v1.17.0/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk= +github.com/kevinmbeaulieu/eq-go v1.0.0 h1:AQgYHURDOmnVJ62jnEk0W/7yFKEn+Lv8RHN6t7mB0Zo= +github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= +github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo= +github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= +github.com/knadh/koanf/providers/confmap v1.0.0 h1:mHKLJTE7iXEys6deO5p6olAiZdG5zwp8Aebir+/EaRE= +github.com/knadh/koanf/providers/confmap v1.0.0/go.mod h1:txHYHiI2hAtF0/0sCmcuol4IDcuQbKTybiB1nOcUo1A= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/knadh/koanf/v2 v2.2.0 h1:FZFwd9bUjpb8DyCWARUBy5ovuhDs1lI87dOEn2K8UVU= +github.com/knadh/koanf/v2 v2.2.0/go.mod h1:PSFru3ufQgTsI7IF+95rf9s8XA1+aHxKuO/W+dPoHEY= +github.com/knadh/koanf/v2 v2.2.2 h1:ghbduIkpFui3L587wavneC9e3WIliCgiCgdxYO/wd7A= +github.com/knadh/koanf/v2 v2.2.2/go.mod h1:abWQc0cBXLSF/PSOMCB/SK+T13NXDsPvOksbpi5e/9Q= +github.com/knz/go-libedit v1.10.1 h1:0pHpWtx9vcvC0xGZqEQlQdfSQs7WRlAjuPvk3fOZDCo= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg= +github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= +github.com/leeavital/protoc-gen-gostreamer v0.1.0 h1:YYsSCUeNK4/0F69IkG916qYDAb4BxTH3kg8cC273cu4= +github.com/leeavital/protoc-gen-gostreamer v0.1.0/go.mod h1:sC19nxpNkHy3enGT3ck6LTr5mittUoUXE/elp/mnTS4= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= +github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= +github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= +github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= +github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= +github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= +github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= +github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= +github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= +github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= +github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= +github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/linkedin/goavro v2.1.0+incompatible h1:DV2aUlj2xZiuxQyvag8Dy7zjY69ENjS66bWkSfdpddY= +github.com/linkedin/goavro/v2 v2.11.1 h1:4cuAtbDfqkKnBXp9E+tRkIJGa6W6iAjwonwt8O1f4U0= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3 h1:jUp75lepDg0phMUJBCmvaeFDldD2N3S1lBuPwUTszio= +github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora/v3 v3.0.0 h1:R6zcoZZbvVcGMvDCKo45A9U/lzYyzl5NfYIvznmDfE4= +github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= +github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUpJYn9JA= +github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20240513124658-fba389f38bae/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= +github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= +github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/marstr/guid v1.1.0 h1:/M4H/1G4avsieL6BbUwCOBzulmoeKVP5ux/3mQNnbyI= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matryer/moq v0.2.7 h1:RtpiPUM8L7ZSCbSwK+QcZH/E9tgqAkFjKQxsRs25b4w= +github.com/matryer/moq v0.2.7/go.mod h1:kITsx543GOENm48TUAQyJ9+SAvFSr7iGQXPoth/VUBk= +github.com/matryer/moq v0.5.2 h1:b2bsanSaO6IdraaIvPBzHnqcrkkQmk1/310HdT2nNQs= +github.com/matryer/moq v0.5.2/go.mod h1:W/k5PLfou4f+bzke9VPXTbfJljxoeR1tLHigsmbshmU= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.17/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions v1.0.2/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/mdlayher/netlink v1.7.2 h1:/UtM3ofJap7Vl4QWCPDGXY8d3GIY2UGSDbK+QWmY8/g= +github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU+ZGLfQSw= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/microsoft/go-mssqldb v1.5.0 h1:CgENxkwtOBNj3Jg6T1X209y2blCfTTcwuOlznd2k9fk= +github.com/microsoft/go-mssqldb v1.5.0/go.mod h1:lmWsjHD8XX/Txr0f8ZqgbEZSC+BZjmEQy/Ms+rLrvho= +github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= +github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= +github.com/miekg/dns v1.1.65/go.mod h1:Dzw9769uoKVaLuODMDZz9M6ynFU6Em65csPuoi8G0ck= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= +github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= +github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible h1:aKW/4cBs+yK6gpqU3K/oIwk9Q/XICqd3zOX/UFuvqmk= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mistifyio/go-zfs/v3 v3.0.1 h1:YaoXgBePoMA12+S1u/ddkv+QqxcfiZK4prI6HPnkFiU= +github.com/mistifyio/go-zfs/v3 v3.0.1/go.mod h1:CzVgeB0RvF2EGzQnytKVvVSDwmKJXxkOTUGbNrTja/k= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= +github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= +github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1 h1:TLuKupo69TCn6TQSyGxwI1EblZZEsQ0vMlAFQflz0v0= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f h1:2+myh5ml7lgEU/51gbeLHfKGNfgEQQIWrlbdaOsidbQ= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mndrix/tap-go v0.0.0-20171203230836-629fa407e90b h1:Ga1nclDSe8gOw37MVLMhfu2QKWtD6gvtQ298zsKVh8g= +github.com/mndrix/tap-go v0.0.0-20171203230836-629fa407e90b/go.mod h1:pzzDgJWZ34fGzaAZGFW22KVZDfyrYW+QABMrWnJBnSs= +github.com/moby/patternmatcher v0.5.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20220808134915-39b0c02b01ae/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= +github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= +github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/mrunalp/fileutils v0.5.0 h1:NKzVxiH7eSk+OQ4M+ZYW1K6h27RUV3MI6NUTsHhU6Z4= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= +github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= +github.com/nats-io/nats.go v1.46.1/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/ncw/swift v1.0.47 h1:4DQRPj35Y41WogBxyhOXlrI37nzGlyEcsforeudyYPQ= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/networkplumbing/go-nft v0.2.0 h1:eKapmyVUt/3VGfhYaDos5yeprm+LPt881UeksmKKZHY= +github.com/networkplumbing/go-nft v0.2.0/go.mod h1:HnnM+tYvlGAsMU7yoYwXEVLLiDW9gdMmb5HoGcwpuQs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76 h1:wDbc54qVQ+C5oQZ8Q5VlMbqEt2hrnev2bC/gIGL3Ksk= +github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= +github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5 h1:58+kh9C6jJVXYjt8IE48G2eWl6BjwU5Gj0gqY84fy78= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/onsi/gomega v1.36.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= +github.com/open-policy-agent/opa v0.42.2 h1:qocVAKyjrqMjCqsU02S/gHyLr4AQQ9xMtuV1kKnnyhM= +github.com/open-policy-agent/opa v0.42.2/go.mod h1:MrmoTi/BsKWT58kXlVayBb+rYVeaMwuBm3nYAN3923s= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.120.1 h1:dHSlc8xqs9yL8xlWjjpXaMVbLRg+gFjBsoUzZHy0FQQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.120.1/go.mod h1:6J+HBkvDGCdVPRyJAokSmvmYnXgg90faLS9U3Fb6wmQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.122.0 h1:kaQPsEnToWYLPxGhAm/va8kZo6pUvJ7hRdpeLvbEckg= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.122.0/go.mod h1:LjWgEDQOX+jtr6Lkl5cFTIwddyHNYEl3nq5eDW7mob4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.125.0 h1:keO7zSbJbAElnSvQynRhWXdhHW8C3+UKaOABCL++6Uc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.125.0/go.mod h1:vFwKdT/xhJIRpghoTAmB52iA+y6wMEwYhB+Jy3sBtE4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.133.0 h1:SINpPUbGaH3U43+W+aWvlvA2FVkP8lUNj4i3huAMqE8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.133.0/go.mod h1:CAPf5fLhsxBzWOKklEsjvWTjS3V+Trl8euO2M5TRJUM= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runc v1.1.6 h1:XbhB8IfG/EsnhNvZtNdLB0GBw92GYEFvKlhaJk9jUgA= +github.com/opencontainers/runc v1.1.6/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20220825212826-86290f6a00fb/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0 h1:HHUyrt9mwHUjtasSbXSMvs4cyFxh+Bll4AjJ9odEGpg= +github.com/opencontainers/runtime-spec v1.1.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= +github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.2.1 h1:S4k4ryNgEpxW1dzyqffOmhI1BHYcjzU8lpJfSlR0xww= +github.com/opencontainers/runtime-spec v1.2.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626 h1:DmNGcqH3WDbV5k8OJ+esPWbqUOX5rMLR2PMvziDMJi0= +github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.mod h1:BRHJJd0E+cx42OybVYSgUvZmU0B8P9gZuRXlZUP7TKI= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.9.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5 h1:q2e307iGHPdTGp0hoxKjt1H5pDo6utceo3dQVK3I5XQ= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7 h1:Dx7Ovyv/SFnMFw3fD4oEoeorXc6saIiQ23LrGLth0Gw= +github.com/petermattis/goid v0.0.0-20240813172612-4fcff4a6cae7/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= +github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= +github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= +github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= +github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk= +github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE= +github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= +github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= +github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a h1:3QH7VyOaaiUHNrA9Se4YQIRkDTCw1EJls9xTUCaCeRM= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= +github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= +github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/columnize v2.1.2+incompatible h1:C89EOx/XBWwIXl8wm8OPJBd7kPF25UfsK2X7Ph/zCAk= +github.com/ryanuber/columnize v2.1.2+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/safchain/ethtool v0.2.0 h1:dILxMBqDnQfX192cCAPjZr9v2IgVXeElHPy435Z/IdE= +github.com/safchain/ethtool v0.2.0/go.mod h1:WkKB1DnNtvsMlDmQ50sgwowDJV/hGbJSOvJoEXs1AJQ= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 h1:WCcC4vZDS1tYNxjWlwRJZQy28r8CMoggKnxNzxsVDMQ= +github.com/santhosh-tekuri/jsonschema/v5 v5.2.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY= +github.com/sasha-s/go-deadlock v0.2.0 h1:lMqc+fUb7RrFS3gQLtoQsJ7/6TV/pAIFvBsqX73DK8Y= +github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/sasha-s/go-deadlock v0.3.5 h1:tNCOEEDG6tBqrNDOX35j/7hL5FcFViG6awUGROb2NsU= +github.com/sasha-s/go-deadlock v0.3.5/go.mod h1:bugP6EGbdGYObIlx7pUZtWqlvo8k9H6vCBBsiChJQ5U= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/seccomp/libseccomp-golang v0.9.1 h1:NJjM5DNFOs0s3kYE1WUOr6G8V97sdt46rlXTMfXGWBo= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI= +github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk= +github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU= +github.com/shoenig/test v1.7.0 h1:eWcHtTXa6QLnBvm0jgEabMRN/uJ4DMV3M8xUGgRkZmk= +github.com/shoenig/test v1.7.0/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= +github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= +github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= +github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9 h1:hp2CYQUINdZMHdvTdXtPOY2ainKl4IoMcpAXEf2xj3Q= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a h1:pa8hGb/2YqsZKovtsgrwcDH1RZhVbTKCjLp47XpqCDs= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= +github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= +github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE= +github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M= +github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE= +github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6 h1:pnnLyeX7o/5aX8qUQ69P/mLojDqwda8hFOCBTmP/6hw= +github.com/stefanberger/go-pkcs11uri v0.0.0-20230803200340-78284954bff6/go.mod h1:39R/xuhNgVhi+K0/zst4TLrJrVmbm6LVgl4A0+ZFS5M= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= +github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/stoewer/go-strcase v1.3.1 h1:iS0MdW+kVTxgMoE1LAZyMiYJFKlOzLooE4MxjirtkAs= +github.com/stoewer/go-strcase v1.3.1/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/substrait-io/substrait-go v0.4.2 h1:buDnjsb3qAqTaNbOR7VKmNgXf4lYQxWEcnSGUWBtmN8= +github.com/substrait-io/substrait-go v0.4.2/go.mod h1:qhpnLmrcvAnlZsUyPXZRqldiHapPTXC3t7xFgDi3aQg= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635 h1:kdXcSzyDtseVEc4yCz2qF8ZrQvIDBJLl4S1c3GCXmoI= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible h1:JvoDL7JSoIP2HDE8AbDH3zC8QBPxmzYe32HHy5yQ+Ck= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tchap/go-patricia/v2 v2.3.1 h1:6rQp39lgIYZ+MHmdEq4xzuk1t7OdC35z/xm0BGhTkes= +github.com/tchap/go-patricia/v2 v2.3.1/go.mod h1:VZRHKAb53DLaG+nA9EaYYiaEx6YztwDlLElMsnSHD4k= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/tink-crypto/tink-go/v2 v2.2.0 h1:L2Da0F2Udh2agtKztdr69mV/KpnY3/lGTkMgLTVIXlA= +github.com/tink-crypto/tink-go/v2 v2.2.0/go.mod h1:JJ6PomeNPF3cJpfWC0lgyTES6zpJILkAX0cJNwlS3xU= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.19.1/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8= +github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8= +github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ= +github.com/vbatts/tar-split v0.11.2 h1:Via6XqJr0hceW4wff3QRzD5gAk/tatMw/4ZA7cTlIME= +github.com/vbatts/tar-split v0.11.2/go.mod h1:vV3ZuO2yWSVsz+pfFzDG/upWH1JhjOiEaWq6kXyQ3VI= +github.com/vektah/gqlparser/v2 v2.5.8/go.mod h1:z8xXUff237NntSuH8mLFijZ+1tjV1swDbpDqjJmk6ME= +github.com/vektah/gqlparser/v2 v2.5.16/go.mod h1:1lz1OeCqgQbQepsGxPVywrjdBHW2T08PUS3pJqepRww= +github.com/veraison/go-cose v1.0.0-rc.1 h1:4qA7dbFJGvt7gcqv5MCIyCQvN+NpHFPkW7do3EeDLb8= +github.com/veraison/go-cose v1.0.0-rc.1/go.mod h1:7ziE85vSq4ScFTg6wyoMXjucIGOf4JkFEZi/an96Ct4= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack/v5 v5.3.4/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= +github.com/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= +github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= +github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50 h1:hlE8//ciYMztlGpl/VA+Zm1AcTPHYkHJPbHqE6WJUXE= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f h1:ERexzlUfuTvpE74urLSbIQW0Z/6hF9t8U4NsJLaioAY= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= +github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM= +github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= +github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= +github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= +go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0= +go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8= +go.etcd.io/etcd/client/pkg/v3 v3.5.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8= +go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ= +go.etcd.io/etcd/client/v2 v2.305.5 h1:DktRP60//JJpnPC0VBymAN/7V71GHMdjDCBt4ZPXDjI= +go.etcd.io/etcd/client/v2 v2.305.5/go.mod h1:zQjKllfqfBVyVStbt4FaosoX2iYd8fV/GRy/PbowgP4= +go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI= +go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c= +go.etcd.io/etcd/pkg/v3 v3.5.5 h1:Ablg7T7OkR+AeeeU32kdVhw/AGDsitkKPl7aW73ssjU= +go.etcd.io/etcd/pkg/v3 v3.5.5/go.mod h1:6ksYFxttiUGzC2uxyqiyOEvhAiD0tuIqSZkX3TyPdaE= +go.etcd.io/etcd/raft/v3 v3.5.5 h1:Ibz6XyZ60OYyRopu73lLM/P+qco3YtlZMOhnXNS051I= +go.etcd.io/etcd/raft/v3 v3.5.5/go.mod h1:76TA48q03g1y1VpTue92jZLr9lIHKUNcYdZOOGyx8rI= +go.etcd.io/etcd/server/v3 v3.5.5 h1:jNjYm/9s+f9A9r6+SC4RvNaz6AqixpOvhrFdT0PvIj0= +go.etcd.io/etcd/server/v3 v3.5.5/go.mod h1:rZ95vDw/jrvsbj9XpTqPrTAB9/kzchVdhRirySPkUBc= +go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= +go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwfMkW0JX+cIcQi/SwLAmZP5M= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opentelemetry.io/collector/component v1.28.1/go.mod h1:jwZRDML3tXo1whueZdRf+y6z3DeEYTLPBmb/O1ujB40= +go.opentelemetry.io/collector/component v1.29.0/go.mod h1:qHoiz0iyBgyAYsT0F8FgtcJv8pTEQDvo1Ox3eO3qVlY= +go.opentelemetry.io/collector/component v1.32.0/go.mod h1:r2gxdx07gNVbsdH1ypt43W/hWAEgP2ti1eAYnrT6j7s= +go.opentelemetry.io/collector/component v1.35.0/go.mod h1:hU/ieWPxWbMAacODCSqem5ZaN6QH9W5GWiZ3MtXVuwc= +go.opentelemetry.io/collector/component v1.37.0/go.mod h1:SYHTXOzZLFwX075LEU6FMVBT15reVrwKHNB2En2URro= +go.opentelemetry.io/collector/component v1.38.0/go.mod h1:h5JuuxJk/ZXl5EVzvSZSnRQKFocaB/pGhQQNwxJAfgk= +go.opentelemetry.io/collector/component/componenttest v0.123.0/go.mod h1:4Y6EMvsgE9fUNM98G0eW5+LFXfcxdhTHQDhaOxJrgN8= +go.opentelemetry.io/collector/component/componenttest v0.129.0/go.mod h1:JR9k34Qvd/pap6sYkPr5QqdHpTn66A5lYeYwhenKBAM= +go.opentelemetry.io/collector/component/componenttest v0.132.0/go.mod h1:3Qm91Gd54HMkPwrSkkgO9KwXKjeWzyG42wG3R5QCP3s= +go.opentelemetry.io/collector/config/configtelemetry v0.120.0 h1:YPXMpfMd9PhngFXiwi3Lmze/Rs0nGS5wQOX16Elev+8= +go.opentelemetry.io/collector/config/configtelemetry v0.120.0/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA= +go.opentelemetry.io/collector/config/configtelemetry v0.122.0 h1:jBPdzU0CVrlxttnfKa0s2kyMVJeHY/faBht6/FUQcWI= +go.opentelemetry.io/collector/config/configtelemetry v0.122.0/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA= +go.opentelemetry.io/collector/config/configtelemetry v0.125.0 h1:P0WYb7zPZQnluefA5JgJEWmgjTywWTNln1VH8778Mf0= +go.opentelemetry.io/collector/config/configtelemetry v0.125.0/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA= +go.opentelemetry.io/collector/config/configtelemetry v0.133.0 h1:VmASg7/Of+ErRHyvnsd/Oh0HveHhC5g3ErwAWoRtHw0= +go.opentelemetry.io/collector/config/configtelemetry v0.133.0/go.mod h1:0AfDnMBeammIMRxF57/nhHPR0kJBuaLmUwpgh3JqBJw= +go.opentelemetry.io/collector/confmap v1.26.0 h1:+EVk0RaCBHs+7dYTwawd5n5tJiiUtErIy3YS3NIFP8o= +go.opentelemetry.io/collector/confmap v1.26.0/go.mod h1:tmOa6iw3FJsEgfBHKALqvcdfRtf71JZGor0wSM5MoH8= +go.opentelemetry.io/collector/confmap v1.28.0 h1:pUQh4eOW0YQ1GFWTDP5pw/ZMQuppkz6oSoDDloAH/Sc= +go.opentelemetry.io/collector/confmap v1.28.0/go.mod h1:k/3fo+2RE6m+OKlJzx78Q8hstABYwYgvXO3u9zyTeHI= +go.opentelemetry.io/collector/confmap v1.31.0 h1:+AW5VJc1rCtgEyGd+1J5uSNw/kVZ98+lKO/pqXEwVvU= +go.opentelemetry.io/collector/confmap v1.31.0/go.mod h1:TdutQlIoHDPXcZ2xZ0QWGRkSFC8oTKO61zTx569dvrY= +go.opentelemetry.io/collector/confmap v1.39.0 h1:DvwKWwkclygZO+2PTDSGFUE83BnjgWazTFyMdlNZZIk= +go.opentelemetry.io/collector/confmap v1.39.0/go.mod h1:P/oXKO4JEESNVyJmayVJe90UgiNK38EtG++ChKROS0c= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.26.0 h1:aQ4Ku10upKeHzEaFiCHpkdJiM3DGK6K22bwLZxZHvPA= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.26.0/go.mod h1:NhIEWAC7TelwS1jO+alkgjnWUEnCYMbty4XmNpyil5A= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.0 h1:FHYkRkdRqFBXI1kKT3oOxJBvh4bTEo8tJlKTI5+Yywc= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.0/go.mod h1:NYC/WqWjFhYtpM6vgwuk+IAtZsy7lyEOFlhARROb0RE= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.31.0 h1:2deKHDVqED7WbPGZxzxm6dAbU24JznK6K1mFiSKssIc= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.31.0/go.mod h1:aL+DfTduboNIgE+HYg1/Kdw/0ACJuMu/tLaehrndZco= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.39.0 h1:qLjW6ZJpa/xkPwAyNG+2Rg3aaX/oNtFEkS/i48TmrIQ= +go.opentelemetry.io/collector/confmap/provider/envprovider v1.39.0/go.mod h1:yPcIWhiGhaf1OhlEt04MdHvilT6RsoZI0F/yShdcg5o= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.26.0 h1:sJ2o/PdrAquo6Z+pLhaSu8QDOMNse4t+VuTbt09Idsk= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.26.0/go.mod h1:dLA9sBikILspt7g2fAWpKwe896236tAjGIjJl+zAnr4= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.0 h1:fUHB8JtK2AxhOrp8NlF4lAjmZxwzxPiw8cIqQoz313c= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.0/go.mod h1:O0GKyr4jxDe8RVbpOLvTz1FgIk4IMOnC4YTA38Iz4Fo= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.31.0 h1:pCv59yXSBeiiaEqaa75wwK0INikjZ+A8aNamjxDkFAk= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.31.0/go.mod h1:F1Jb+9Awc8nd7/Xeedb95efQGVM6SuaN8CaA2gV0poE= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.39.0 h1:hDvZGDV9g3XVhvjNp9uRT2ml0PArOsRjKkR72Fdn6rY= +go.opentelemetry.io/collector/confmap/provider/fileprovider v1.39.0/go.mod h1:SDo9Tz4x+ysiFQ4F46pu5cfbF+NNZOKHVHBB18Sfhkk= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.26.0 h1:FWKxIFpo3Li8PFczLgf/WW3/L9GcKn7zsU3cEU6FLZA= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.26.0/go.mod h1:1Nc9xmYdvABkUZytg4QSHbvJTIKr0KT7t2cHhP6/jDs= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.0 h1:XWbUtA26dhDx8s2+zdHXGo7Rdj+4mK3UgRHctQeW718= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.0/go.mod h1:NKrAuoki1R5zUNOTaJY4ApIjschFCtU1Vl0zVvWO3uU= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.31.0 h1:8zVhJhqKT71THr66YN4FY+dVdibYGQ0HUiKQsucObrI= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.31.0/go.mod h1:1jsq1qZwqAtUt83XubkfTQG8pALirbGe9/NyN0iATdk= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.39.0 h1:tjWxyrmnVo3Cqrn8c014GS+49+FHcNB8tKAtKxquKmY= +go.opentelemetry.io/collector/confmap/provider/httpprovider v1.39.0/go.mod h1:EsP3iPmZ1lr52Kqufc01diMJLG5EdM/3hA4jiks3paM= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.26.0 h1:KYHCHGV+tF4xx9X/umqiWB8Tnrflq26NPPEKKAHU3ag= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.26.0/go.mod h1:HHYJ+1t5XUUOTCuFVc7OmyWHPZpIxSMgqckhCTD/F0Y= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.0 h1:W/3Uw2RfuWxfX78KsHOecckyWYwxWgYgI2RsxjHHEEk= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.0/go.mod h1:8bObp2ah2C8AdZMb8O3Ek/TZm3wCh0Bs43n7RRom54E= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.31.0 h1:SkNr8jTwqO7NmXzRWPqaSatx0kxxnE2kt8P/JavP4po= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.31.0/go.mod h1:L6+XgpBpCPn58gIpdGy7t8hAS/tiB1vqoTYQDWix+Us= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.39.0 h1:CPDbbGPsgJwPY+kEnYjv6PnqLT9dhKiZbzkkktz07XQ= +go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.39.0/go.mod h1:0bf1tDiHZXetoZJ23kWM+IovyXiIYLD+pOgqABxcMJk= +go.opentelemetry.io/collector/confmap/xconfmap v0.120.0 h1:wt+9H/TLXhY6q40AVx+fn2XK/FhjXuwInwFq9X9+aik= +go.opentelemetry.io/collector/confmap/xconfmap v0.120.0/go.mod h1:wkzt6fVdLqBP+ZvbJWCLbo68nedvmoK09wFpR17awgs= +go.opentelemetry.io/collector/confmap/xconfmap v0.122.0 h1:uRwR2/DEhLCwsdQyD5rTG/cAPUm5ixZb96y3rUaUo/g= +go.opentelemetry.io/collector/confmap/xconfmap v0.122.0/go.mod h1:76K9ypccfRyorlYYit8O82mX4hseQP8VJ/TYqCKI4fA= +go.opentelemetry.io/collector/confmap/xconfmap v0.125.0 h1:Y0LPtz+xgtRYVAk2gZmvnBROEJj8C3YDiFPj5URbsX8= +go.opentelemetry.io/collector/confmap/xconfmap v0.125.0/go.mod h1:8hNqCMs9Gzahh4W1h5XWOrQ+bE6NfP13WAggNyExJJs= +go.opentelemetry.io/collector/confmap/xconfmap v0.133.0 h1:Y8hdxtxYZk9q2dn0Dqn7eZQbvz3ajUyMnJ/ZfgIZXE0= +go.opentelemetry.io/collector/confmap/xconfmap v0.133.0/go.mod h1:cd63uv7oPkQohRlLqaBctjXdDRGeMkXH0Ni7p4Y4IAE= +go.opentelemetry.io/collector/connector v0.120.0 h1:t6/2wOhm2UAgOPRKhMhybna8UjvoJI4hX305CIA2hWU= +go.opentelemetry.io/collector/connector v0.120.0/go.mod h1:REneUxc1SnH07DlNXCvh0ZBBi67wAT4HpzAPRmIt378= +go.opentelemetry.io/collector/connector v0.122.0 h1:VrILgvrE4PWuJzPfB2lj+wxqRK8+SnnFFB9Ft9G1Tok= +go.opentelemetry.io/collector/connector v0.122.0/go.mod h1:ppWh+4gDym2C/zZ4ygID7DMZxVJyyvy1is415attDjA= +go.opentelemetry.io/collector/connector v0.125.0 h1:kV6eMM+FwrI//o7IM6PilzxphMh3ynYJhcTuECs6BQI= +go.opentelemetry.io/collector/connector v0.125.0/go.mod h1:kZFJr+ORqEGIle9NrUBG1fZhRQ2+n+WoR8+yWEmLkOY= +go.opentelemetry.io/collector/connector v0.133.0 h1:5r1BNbf8mn61h0yaq/ty3gu67BGb8PQHSC39q03i4nQ= +go.opentelemetry.io/collector/connector v0.133.0/go.mod h1:5yQ+RGMiyWD7Miy5qvPVu4v8AbdZ3VxAUAX6G+0X8Yw= +go.opentelemetry.io/collector/connector/connectortest v0.120.0 h1:Blh4QsVBoPoT9dR4GC6f1oGrzotkOOElevTQOk9Wn7c= +go.opentelemetry.io/collector/connector/connectortest v0.120.0/go.mod h1:NPyD5TVRND637kd+5nTeik8ZDl82MNJXln3mY80sY2M= +go.opentelemetry.io/collector/connector/connectortest v0.122.0 h1:7kwexYryefADAP/eG9v3ycqIxgQh6qgmMlsjkgcBW34= +go.opentelemetry.io/collector/connector/connectortest v0.122.0/go.mod h1:UxShMFmkmjwimWqlkRiDoVxyYMxk3ZQaoWsWb7Oe9is= +go.opentelemetry.io/collector/connector/connectortest v0.125.0 h1:r5JZv3BVdhv92CKtx8ECFaJ5L9VKRasgGBoY2uqLuHU= +go.opentelemetry.io/collector/connector/connectortest v0.125.0/go.mod h1:WUlYSF+5pEevOD4jZUmoy2qEEsama8f6/A9HXJG8ZVw= +go.opentelemetry.io/collector/connector/connectortest v0.133.0 h1:Hwv++mrVobZ0ZZkE8rrut0vzhvmHZ9eMKZ1ljgFpTA0= +go.opentelemetry.io/collector/connector/connectortest v0.133.0/go.mod h1:DDabjE+8VYOnxx2zBbJSGITriqx9h5RgRPmrY+ZBYX8= +go.opentelemetry.io/collector/connector/xconnector v0.120.0 h1:waYzmPSRr9BwDJxFO2wYgfPIttPhaIdyKj2xRTYLXZo= +go.opentelemetry.io/collector/connector/xconnector v0.120.0/go.mod h1:wpy9ab9AAZiekNPKZoaEmXWDmzIdQ2o2xNSgx6Otamg= +go.opentelemetry.io/collector/connector/xconnector v0.122.0 h1:D0e/ZbDhIJA8harTulMilhSG/yqQmi/k/yaLbGiPeH8= +go.opentelemetry.io/collector/connector/xconnector v0.122.0/go.mod h1:gjFaSA5EZxOqzhoLrcf7Pj+U4sB60GcKIZYGaNvQ1jQ= +go.opentelemetry.io/collector/connector/xconnector v0.125.0 h1:bvOPaN1aj0hygJPtxi8PNm6TXAPKPNdI58AvLyeAl5Q= +go.opentelemetry.io/collector/connector/xconnector v0.125.0/go.mod h1:HnzWVgoZYYAnyRIyg6EebH0MQmB9TC6U0CLX9bsMW7I= +go.opentelemetry.io/collector/connector/xconnector v0.133.0 h1:92sEnTBgjDBLyVwvFm+a7W9ZTqJM8cUt9c4gDIpRUqk= +go.opentelemetry.io/collector/connector/xconnector v0.133.0/go.mod h1:xzeHzexGKW1L7OGfSHIASJONsQUu6wlUmSR8+zJsHZs= +go.opentelemetry.io/collector/consumer/consumererror v0.120.0 h1:f46ZnKCGBdvkjtJBT0ruA9cxDnvuR1jeR0amq9qc6Mc= +go.opentelemetry.io/collector/consumer/consumererror v0.120.0/go.mod h1:2Cx8948nywlM1MFJgqLrIJ7N/pfxZsMF0qq+n9oFJz0= +go.opentelemetry.io/collector/consumer/consumererror v0.122.0 h1:IoCEQE0xqNVsH7wOwmBBLR0W/+p8QFjYwNlZTrhztvM= +go.opentelemetry.io/collector/consumer/consumererror v0.122.0/go.mod h1:8RPibMrh84PHzqGchjiKIRz4eqdylMg8boLwMJY3WjU= +go.opentelemetry.io/collector/consumer/consumererror v0.125.0 h1:Qq9SgbxlJoRn0952dj4lPJhcuBiqKzD1aNxCfa+Bz00= +go.opentelemetry.io/collector/consumer/consumererror v0.125.0/go.mod h1:t/YDU7G2TxG27LbcUvgKo/l75TI5VApnnqC7FgKZds0= +go.opentelemetry.io/collector/consumer/consumererror v0.133.0 h1:SYHSrKdZQB3gp5oDDaPwL5T/g9mhKf1BUY/10lS4AVQ= +go.opentelemetry.io/collector/consumer/consumererror v0.133.0/go.mod h1:IOaHXiqGghQoirLDXlCXoXiY3mrV6ngrYKbZa9f2ZZI= +go.opentelemetry.io/collector/exporter v0.120.0 h1:8PIJTV0VW1gyr8XuiEMi/aq+baCMdk1hjSrAYiG8aKk= +go.opentelemetry.io/collector/exporter v0.120.0/go.mod h1:JZCNkv0K+Gwdnfwby7Nxc1/gsmy468SBIjI/6fQdxuk= +go.opentelemetry.io/collector/exporter v0.122.0 h1:Y1ZigdLwHrN1/VA+P3lYrnM2gAmo/tQxHVxdfg+489U= +go.opentelemetry.io/collector/exporter v0.122.0/go.mod h1:xtoCOeeGpZgcvMX8Od+HLBgDGqUstIii/NQXXjEkNR0= +go.opentelemetry.io/collector/exporter v0.125.0 h1:GJxeCuOQVPndQzvzpZUFEv5njHuVnzBEuXgddRShiCM= +go.opentelemetry.io/collector/exporter v0.125.0/go.mod h1:x+FFBRxWGk+GGaP7u+Bi+OcZoG5qK5vZmgFwI/t4ZwM= +go.opentelemetry.io/collector/exporter v0.133.0 h1:UtyPT0wGabc3a5ix6Wl+2rf6k4OFvrAm5XCo1Pne5FE= +go.opentelemetry.io/collector/exporter v0.133.0/go.mod h1:qw8gYmANhUnUmjTEJdP0e+EirLA/qOdnjnD1EVjvhjA= +go.opentelemetry.io/collector/exporter/exportertest v0.120.0 h1:7ABriAYXGxvUdCXxe0LpsrMGQ+BP5z/gadm1gRWbD4o= +go.opentelemetry.io/collector/exporter/exportertest v0.120.0/go.mod h1:t0hONsvJp5MM1EF1l83voJHcharIPdnpUBP42UhCoCY= +go.opentelemetry.io/collector/exporter/exportertest v0.122.0 h1:NfhUI8OocfhLCpIuNlS9yx1Lt/Vmmn97Z8JnId+qVKw= +go.opentelemetry.io/collector/exporter/exportertest v0.122.0/go.mod h1:1ntDyuDvpiqJH/YyQ4uvfePESaJm0g2D77syBkLAmmg= +go.opentelemetry.io/collector/exporter/exportertest v0.125.0 h1:FFCEHKlTct0vl/657E1papmL3NicdcxY4ChZbHI3nWk= +go.opentelemetry.io/collector/exporter/exportertest v0.125.0/go.mod h1:UQ6ETigK5yTASXGvjSlE7RcM8C6Ro+TcR8iqDHpXa2U= +go.opentelemetry.io/collector/exporter/exportertest v0.133.0 h1:6FctO4Ok/xD0goCnN5qnm278+FZRBRKwReCFRuXs+ps= +go.opentelemetry.io/collector/exporter/exportertest v0.133.0/go.mod h1:7ebEzg1tOTZfYfeN8QfdOdW81bxtAtzuUZOB45qcmH8= +go.opentelemetry.io/collector/exporter/xexporter v0.120.0 h1:HSe3a+0lt/o/g8GgNKgkw9y9vULN4QeY6NeKms8j/GI= +go.opentelemetry.io/collector/exporter/xexporter v0.120.0/go.mod h1:P/87SRTCd/PnQhwAQbELAxotp5gIewT/vpOfEWJZPLk= +go.opentelemetry.io/collector/exporter/xexporter v0.122.0 h1:fd+IEFSNZoUa/3Z8eNLPKqOkeh7nEV6qTlqoFzt+uD0= +go.opentelemetry.io/collector/exporter/xexporter v0.122.0/go.mod h1:pRqtMIBLcnUsyMwaIjUz//0fKWj+9VXOA+tUGnS9DDQ= +go.opentelemetry.io/collector/exporter/xexporter v0.125.0 h1:be5oK6+QOXvyXiCxfiTKxdo/TmjewvciCbC8iMKi/1s= +go.opentelemetry.io/collector/exporter/xexporter v0.125.0/go.mod h1:ebfTFVtKR2eUiAQQc/cS1aBTV2OoFDvFjLiX+thE23s= +go.opentelemetry.io/collector/exporter/xexporter v0.133.0 h1:D8gyYnMofgSYnrgGwsPv1sHbt1FAe9slCOsG2BA5o/M= +go.opentelemetry.io/collector/exporter/xexporter v0.133.0/go.mod h1:ZSy1jDQRCqzCHPVfuqokeSLE2tJWdLJTa57coK9xrbQ= +go.opentelemetry.io/collector/extension v0.120.0 h1:CA2e6jF5Sz6PE+yxGbJUn0QTMwTo28MO8FNBhdKAABw= +go.opentelemetry.io/collector/extension v0.120.0/go.mod h1:o2/Kk61I1G9XOdD8W4Tbrg05jD4P/QF0ecxYTcT8OZ8= +go.opentelemetry.io/collector/extension v1.28.0 h1:E3j6/EtcahF2bX9DvRduLQ6tD7SuZdXM9DzAi7NSAeY= +go.opentelemetry.io/collector/extension v1.28.0/go.mod h1:3MW9IGCNNgjG/ngkALVH5epwbCwYuoZMTbh4523aYv0= +go.opentelemetry.io/collector/extension v1.31.0 h1:DaqSl50jOA3BGtqPfPtSGJy4XwyXtQwvemVl/L9fDb4= +go.opentelemetry.io/collector/extension v1.31.0/go.mod h1:SiRNOZIJ6R0JbHEvs3g84hPEmiys5CZyIlMOE1RQ85s= +go.opentelemetry.io/collector/extension v1.39.0 h1:NOh2MQ8ETY2qx4Yd97HWAviwKVD5a65x5CV9LNujPII= +go.opentelemetry.io/collector/extension v1.39.0/go.mod h1:KRrzszfycxesfnKQZMNKm6ggZ4nb2jDs0hYcJFBGG2Q= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.120.0 h1:RaXVtUOiRNuPA5mr8cgieuY1O7M0sVWn2Gvhe24n51c= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.120.0/go.mod h1:3PBL7XUwQIzEhnMn12w6XC7sSh9JRUvmdlWs3KJ9KLc= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.0 h1:ecxODEslQT87P82n1bWzVaVyj57OAwxh56RxLL1fyxc= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.0/go.mod h1:0Sl5KgS06MdhvFog9JOHLl8SnZLmDQwgcA0IhYoAuxo= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.125.0 h1:2T0mJYSBd/QlZuX1b0s0hKXVPvpw8aQKcbZ9iPZJezY= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.125.0/go.mod h1:ApOeGMoOWtNZBqxobAba2yhR0rHLr8Yz2nE3B22u2/M= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.133.0 h1:kAq8C3yGgQQzK4M35E7ugAU54CjaaWKzyi3kXrjBvzk= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.133.0/go.mod h1:WKewl+pVmfbRLl9E76CTiDgAUEqTJk+sQ1wsTShE/6k= +go.opentelemetry.io/collector/extension/extensiontest v0.120.0 h1:DSN2cuuQ+CUVEgEStX04lG4rg/6oZeM2zyeX5wXeGWg= +go.opentelemetry.io/collector/extension/extensiontest v0.120.0/go.mod h1:MTFigcQ7hblDUv12b3RbfYvtmzUNZzLiDoug11ezJWQ= +go.opentelemetry.io/collector/extension/extensiontest v0.122.0 h1:daeCPXhb4HveyeYyX6G0IqjGuvWJprZeiq7pZiSdC+M= +go.opentelemetry.io/collector/extension/extensiontest v0.122.0/go.mod h1:JXSONLbyuX+uOy1gcQ3Jcp/48pfkh0RiZPy7XkyCBdU= +go.opentelemetry.io/collector/extension/extensiontest v0.125.0 h1:NYtQ42HBjfS5lnfmZdT8+ucq+i70JGLdvDN8V/drvIw= +go.opentelemetry.io/collector/extension/extensiontest v0.125.0/go.mod h1:HABANc94xQmUtOSZokG5E6Z02GrHfKYSkQqOz+oCpPQ= +go.opentelemetry.io/collector/extension/extensiontest v0.133.0 h1:3+3jqcb4JfXmZH5VX5rA71CaBjzLwCN2Ap4lHnz/0Go= +go.opentelemetry.io/collector/extension/extensiontest v0.133.0/go.mod h1:d5042DdvUJySOWXeZ5Qbqy5etw+nSBH9y+iA9gaE2Z8= +go.opentelemetry.io/collector/featuregate v1.26.0 h1:NIZdJby6jL9tEHI25ddeUNgc09Q0Fof31YHF1CSVp4Y= +go.opentelemetry.io/collector/featuregate v1.26.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.28.0 h1:nkaMw0HyOSxojLwlezF2O/xJ9T/Jo1a0iEetesT9lr0= +go.opentelemetry.io/collector/featuregate v1.28.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.29.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.32.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.35.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.37.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/featuregate v1.38.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.120.0 h1:vcY46z2WnYs0bcFulJX51O2dXc2sgWDymR91u/tV5EE= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.120.0/go.mod h1:qUcJqy4Us/pxnWJTqloDmlAz8wGUIZDe/RMSmzfymdo= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.0 h1:Oup8r2FaIEi7si3Kz7ybSgeNh6TrQFNJ9I7bNNdgJ0o= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.0/go.mod h1:02AWRtzi/v9P2ldMdQq5+OKKoqIVPdqZQ/B3KKNu/So= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.125.0 h1:aaRn0DmHL0pkEMRQ69XbQs0NwpwLBUlo/DDxnyKx5+0= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.125.0/go.mod h1:7JxEQa7o9WxBH5EWy7FufzgZ+7QsICOOA987myR5hsU= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.133.0 h1:WkA0nSjAw9IOdCaSHFiWU7agD5RpWXNkk1Q754LLUvg= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.133.0/go.mod h1:CYPyhTLepyl3vY5XgACFFTqjMKzBfi/6GUDfLfuGf4w= +go.opentelemetry.io/collector/internal/telemetry v0.120.0 h1:JsHTY2/9+EYGgg6sqb85KU5iSZow373Z3IZywYTgiUA= +go.opentelemetry.io/collector/internal/telemetry v0.120.0/go.mod h1:5F/UCo4WlIjobkypTWgoWTvyIM2AN2INR5/HmvXdilQ= +go.opentelemetry.io/collector/internal/telemetry v0.122.0 h1:5RCl/CdT3+VaduRI5IphoH3xS49sHZmEY/y3N3CEZjs= +go.opentelemetry.io/collector/internal/telemetry v0.122.0/go.mod h1:FrmVXPmQMn3BuGIWg/pOdmHTMvXmlNzcbMusn8SSZn4= +go.opentelemetry.io/collector/internal/telemetry v0.123.0/go.mod h1:Qwh5XcqAlAT9NorjaaSaNcilDgaecs8S+OKljJ9hFno= +go.opentelemetry.io/collector/internal/telemetry v0.126.0/go.mod h1:7MqIwRTPLKH5LySJpo5nZmbX9AmfCUp34F6KSB2C94g= +go.opentelemetry.io/collector/internal/telemetry v0.129.0/go.mod h1:riAPlR2LZBV7VEx4LicOKebg3N1Ja3izzkv5fl1Lhiw= +go.opentelemetry.io/collector/internal/telemetry v0.131.0/go.mod h1:TzNVIkIolnk/Jq/3qc4uWhL0bOeaP56jpyrMlUOeA/Y= +go.opentelemetry.io/collector/internal/telemetry v0.132.0/go.mod h1:KUo0IpZZvImIl172+//Oh2mboILCV5WU4TjdUgU8xEM= +go.opentelemetry.io/collector/otelcol v0.120.0 h1:iCUzunaztU69MlA+fe1/5VLIuufAFo53psghgaEdamo= +go.opentelemetry.io/collector/otelcol v0.120.0/go.mod h1:nNELe3quKRa4Ra3zTsCOkC7IXii0Z2E2wureB1SW1OA= +go.opentelemetry.io/collector/otelcol v0.122.0 h1:Uq8MKHHAAdgPs1VhHtoAYC6Wuxom1Dd8TaoOnIc7vWQ= +go.opentelemetry.io/collector/otelcol v0.122.0/go.mod h1:/HAitWFSlD8dVwc9qekh+FcUfMyn/hT5p7+f3BfEqa8= +go.opentelemetry.io/collector/otelcol v0.125.0 h1:2YeA76daEHrXPNHCNffEAT9IAfv+n73XsrnmoeGwioE= +go.opentelemetry.io/collector/otelcol v0.125.0/go.mod h1:vqzaQw+ArFLAP5o+9WBVlrZo5lgJCX6UW0z2/5aROe4= +go.opentelemetry.io/collector/otelcol v0.133.0 h1:fBMZd6y0mcNU71RcWo2HCfKtc20LXk45q0RKadjuFU0= +go.opentelemetry.io/collector/otelcol v0.133.0/go.mod h1:wkX/pAeijNs1lcMKX+cfwj1GTMgLLA9DSRwL+tE9tas= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.120.0 h1:j+xLokFCKaeR0t9qL00FrzGn247h/ntJOmXGJm0yFs0= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.120.0/go.mod h1:QwZG/+Zfvh76eihBH+FJ6UV2gWTZZPNxamhHToRNUxQ= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.122.0 h1:JyP1laPqALttixC90aTwYkS4e47PSdGNipiLcqlJmAo= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.122.0/go.mod h1:rfMPxfLH73Of/mvc8TZEuNZv+l4VD4pALZz1Z0r+jd0= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.125.0 h1:GYgwOoLKhBl64ndua+5RFeW8zEC1GB0mR94cXGBdMFk= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.125.0/go.mod h1:xadhCU4sDwga7XSOQVMyCOA5Yi7aeZ0/DSb+m+eWK+0= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.133.0 h1:WqV21LkRTD9unwKB9KU3hhwWSfeDccp6DzG4KLP65d4= +go.opentelemetry.io/collector/otelcol/otelcoltest v0.133.0/go.mod h1:aoWoCusvVLW1Vmh6P5M8o8MP8AaMF4u9rZPt/snaNPw= +go.opentelemetry.io/collector/pdata v1.28.1/go.mod h1:asKE8MD/4SOKz1mCrGdAz4VO2U2HUNg8A6094uK7pq0= +go.opentelemetry.io/collector/pdata v1.29.0/go.mod h1:9kb3zMtLFXBPA6WGWkBHbkFwlwwYL/OHk1m0ASWZpeY= +go.opentelemetry.io/collector/pdata v1.32.0/go.mod h1:m41io9nWpy7aCm/uD1L9QcKiZwOP0ldj83JEA34dmlk= +go.opentelemetry.io/collector/pdata v1.35.0/go.mod h1:pttpb089864qG1k0DMeXLgwwTFLk+o3fAW9I6MF9tzw= +go.opentelemetry.io/collector/pdata v1.37.0/go.mod h1:aE9l1Lcdsg7nmSoiucnWHuPYIk6T0RKzOjPepNJC5AQ= +go.opentelemetry.io/collector/pdata v1.38.0/go.mod h1:DSvnwj37IKyQj2hpB97cGITyauR8tvAauJ6/gsxg8mg= +go.opentelemetry.io/collector/pdata/pprofile v0.122.1/go.mod h1:+jSjgb4zRnNmr1R/zgVLVyTVSm9irfGrvGTrk3lDxSE= +go.opentelemetry.io/collector/pdata/xpdata v0.133.0 h1:qQ+u3b2oiD5Q3ABKI7JdlRKvDdNHpSwjMNUCyb1P3BQ= +go.opentelemetry.io/collector/pdata/xpdata v0.133.0/go.mod h1:1SGbr1XPFG0Kuz8qzg4j4KGngf+r3gleBRMvKrAIt4k= +go.opentelemetry.io/collector/pipeline v0.123.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/pipeline v0.131.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/pipeline/xpipeline v0.120.0 h1:klY22BaRMO1+JmjUu0Af961hpHA5qnOTAVR7tN+UTW8= +go.opentelemetry.io/collector/pipeline/xpipeline v0.120.0/go.mod h1:K/7Ki7toZQpNV0GF7TbrOEoo8dP3dDXKKSRNnTyEsBE= +go.opentelemetry.io/collector/pipeline/xpipeline v0.122.0 h1:Zu6zvO/6epvsjZ74t7qAiMowqhScxHZURlBzBaJ00iY= +go.opentelemetry.io/collector/pipeline/xpipeline v0.122.0/go.mod h1:uBWsvO37xU8cPgG8znDMW7bIwzrwRQ0jQ0u05rFeB/g= +go.opentelemetry.io/collector/pipeline/xpipeline v0.125.0 h1:K+Q0e0jpRwkYTyFZJSTM1aotQ2BpxOHc24P14PCHPa8= +go.opentelemetry.io/collector/pipeline/xpipeline v0.125.0/go.mod h1:wuzpoh+f5u3Vnk32M4EUfEddnoZC8oEjX/LmvsB5Ni4= +go.opentelemetry.io/collector/pipeline/xpipeline v0.133.0 h1:ryGAS0bVsP9CZ0TXC5Kh7A/jNbiX7tRnpoqDp8vkORg= +go.opentelemetry.io/collector/pipeline/xpipeline v0.133.0/go.mod h1:wTr5Bn5Hj4B8bLHMq9EyFlDwDSkHHJ7dwJf800q0g/Q= +go.opentelemetry.io/collector/receiver v0.120.0 h1:JTnPqmBLRXpOyLPh8Kch/5C8SivnpYK9Lzy4PvtEnLQ= +go.opentelemetry.io/collector/receiver v0.120.0/go.mod h1:jpYY55wTVE0FqiBIJrNv2HrvSUnGEjLS/3CWGA+CeL4= +go.opentelemetry.io/collector/receiver v1.28.0 h1:yvAUb+QTdkhIuUVY5wGUPyXqIylIttGpt+k+1b77jic= +go.opentelemetry.io/collector/receiver v1.28.0/go.mod h1:ceNMHvsSkFOHK80UkQd5kdrU3Qq7NA+dS7oc6C4zLRc= +go.opentelemetry.io/collector/receiver v1.31.0 h1:OSRrCWclb1QmGPnxFMxQsdegua4vlKpZESOtDKSzKeQ= +go.opentelemetry.io/collector/receiver v1.31.0/go.mod h1:zPUiv3jgJGQSY01nx500cYJiEz6JfaR53BAvCW2tgGs= +go.opentelemetry.io/collector/receiver v1.39.0 h1:RdZn4v9wUa4QVu3+5zJcdM3BJeFM1l8hO/eZmNxKkBA= +go.opentelemetry.io/collector/receiver v1.39.0/go.mod h1:wKHijIb17Dsj02z2j8JahvAn9ANEe6itosIHZlwu9bc= +go.opentelemetry.io/collector/receiver/receivertest v0.120.0 h1:Op9yCT0kGvqPF0BB83+iOcsxJJHPCLeL4f4/Op1MBoI= +go.opentelemetry.io/collector/receiver/receivertest v0.120.0/go.mod h1:lpFA4FzcHWki7rLzsNncYmDZ4f7Eik8JY1Mmsaw5uMw= +go.opentelemetry.io/collector/receiver/receivertest v0.122.0 h1:qBy1XbddIQRvslmS1WXhTnjzOIwuLBTbp8CGN8atNKk= +go.opentelemetry.io/collector/receiver/receivertest v0.122.0/go.mod h1:zuB9o86N1UFgauDS9cHT8vHWQVggNRcyinwRZZv5Z9A= +go.opentelemetry.io/collector/receiver/receivertest v0.125.0 h1:xV3Jm3OT7SfDpJ5mXhNmK/Nch7f41whA8k0q4XkaWT8= +go.opentelemetry.io/collector/receiver/receivertest v0.125.0/go.mod h1:CoSPPn3kwVcAhdLOK5NVjMCVVjmCsFpBXU9h9I6Kdh8= +go.opentelemetry.io/collector/receiver/receivertest v0.133.0 h1:WRwXNWO3pQikr30G86kUyvR9JXu7holcNrk6g9rFNTQ= +go.opentelemetry.io/collector/receiver/receivertest v0.133.0/go.mod h1:bvcaf7Z2FvPOm/dBlW0CBEReVdtrdgMUg4JOLJ50NEY= +go.opentelemetry.io/collector/receiver/xreceiver v0.120.0 h1:+gHYd9rTBRKSQfWsTzV2wlwfaVL/LZSz5wu4sygZH7w= +go.opentelemetry.io/collector/receiver/xreceiver v0.120.0/go.mod h1:dkHpL1QqLi/G+60VZnfFpZQf9qoxDVnp6G9FuAcMgfk= +go.opentelemetry.io/collector/receiver/xreceiver v0.122.0 h1:rAWEMR/TDu+a9ATGIec4m9swVT0KvimUQqZpOLgTCVM= +go.opentelemetry.io/collector/receiver/xreceiver v0.122.0/go.mod h1:LLMY2gDtQCieYEOa5h6heHv+FMkC+b1u/yUXRJvwrEo= +go.opentelemetry.io/collector/receiver/xreceiver v0.125.0 h1:wQ1ZgCA0Y3EFWWZ6gZDGDXT7qV5IrqkisccUWhvmmTg= +go.opentelemetry.io/collector/receiver/xreceiver v0.125.0/go.mod h1:5Kl/mtf6oIy+rizFcElkUpp3LEVTJnjAyos6z+FVsGc= +go.opentelemetry.io/collector/receiver/xreceiver v0.133.0 h1:AvgzAg5u90TJ7+taSyZ5mSnQn4GrrV1qHbrx+AXD1X0= +go.opentelemetry.io/collector/receiver/xreceiver v0.133.0/go.mod h1:ZqAFQ2Ew/ftQGvbEvftITh0IheQD300A0HsuCB5Qgdk= +go.opentelemetry.io/collector/semconv v0.123.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= +go.opentelemetry.io/collector/semconv v0.126.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= +go.opentelemetry.io/collector/semconv v0.128.0 h1:MzYOz7Vgb3Kf5D7b49pqqgeUhEmOCuT10bIXb/Cc+k4= +go.opentelemetry.io/collector/semconv v0.128.0/go.mod h1:OPXer4l43X23cnjLXIZnRj/qQOjSuq4TgBLI76P9hns= +go.opentelemetry.io/collector/service v0.120.0 h1:7E0ILhOYP72qZBNmprsJxLFozEuXlF0Evy5e4HinTJI= +go.opentelemetry.io/collector/service v0.120.0/go.mod h1:hRVK2Tvgm6W+8zb6NZ4fKuhMot3jzz6tu9YHDgwIQ8E= +go.opentelemetry.io/collector/service v0.122.0 h1:OPDNiuGTHYj0B3ozeC5IV6wNDmgp0j2RlyEsPbSS0o0= +go.opentelemetry.io/collector/service v0.122.0/go.mod h1:ffOT//Aa8i/cg3Vy//BeqKV9W7EYJ06n0MmrY2h/7C0= +go.opentelemetry.io/collector/service v0.125.0 h1:YZPSoc2am0hP9koVX0oO24g2TfoY4y07XkfVfBglQPQ= +go.opentelemetry.io/collector/service v0.125.0/go.mod h1:baRaoOdfyNikHFqrltdhYiqn7UsQudvGeth0cq884Ts= +go.opentelemetry.io/collector/service v0.133.0 h1:larQTdsbVI9APSqZvSYeIiqgVyHl/rQJxRsy1QNpb3U= +go.opentelemetry.io/collector/service v0.133.0/go.mod h1:3tePh48EjLZb4/rSC8A/loVFFWUIiFeYYdQLz/9+BUg= +go.opentelemetry.io/collector/service/hostcapabilities v0.122.0 h1:JyhvWTg0sx8a8DFPoZjpdwQoJEvSiColvRnsBjhAoYA= +go.opentelemetry.io/collector/service/hostcapabilities v0.122.0/go.mod h1:QsoygBvcIywthvZ9eUZ7TkzXNzfTKO1KMRzb/dkTYQE= +go.opentelemetry.io/collector/service/hostcapabilities v0.125.0 h1:7kcGkYuvkyWfYdE0gdlzUgRHGRTWsBYGoAw15Qhw2u0= +go.opentelemetry.io/collector/service/hostcapabilities v0.125.0/go.mod h1:+vVwkI6223D/TrpycEEXNhq/v2CDiDPUGjjAjNFGpUw= +go.opentelemetry.io/collector/service/hostcapabilities v0.133.0 h1:v4WXnpR/zg3Lz3qDd9WYNF7xhFaa8jBrREiXrgCLvUs= +go.opentelemetry.io/collector/service/hostcapabilities v0.133.0/go.mod h1:18Z5+kwru1tmKOl2eCPLxoHI8TLLiKXo8XI4R8ld+aY= +go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/bridges/otelzap v0.9.0 h1:f+xpAfhQTjR8beiSMe1bnT/25PkeyWmOcI+SjXWguNw= +go.opentelemetry.io/contrib/bridges/otelzap v0.9.0/go.mod h1:T1Z1jyS5FttgQoF6UcGhnM+gF9wU32B4lHO69nXw4FE= +go.opentelemetry.io/contrib/bridges/otelzap v0.11.0/go.mod h1:pJPCLM8gzX4ASqLlyAXjHBEYxgbOQJ/9bidWxD6PEPQ= +go.opentelemetry.io/contrib/config v0.14.0 h1:QAG8uHNp5ZiCkpT7XggSmg5AyW1sA0LgypMoXgBB1+4= +go.opentelemetry.io/contrib/config v0.14.0/go.mod h1:77rDmFPqBae5jtQ2C78RuDTHz4P27C8LzoN0MZyumYQ= +go.opentelemetry.io/contrib/detectors/gcp v1.32.0 h1:P78qWqkLSShicHmAzfECaTgvslqHxblNE9j62Ws1NK8= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw= +go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.25.0/go.mod h1:E5NNboN0UqSAki0Atn9kVwaN7I+l25gGxDqBueo/74E= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.45.0/go.mod h1:vsh3ySueQCiKPxFLvjWC4Z135gIa34TQ/NSqkDTZYUM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.59.0/go.mod h1:ijPqXp5P6IRRByFVVg9DY8P5HkxkHE5ARIa+86aXPf4= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0/go.mod h1:snMWehoOh2wsEwnvvwtDyFCxVeDAODenXHtn5vzrKjo= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.45.0/go.mod h1:62CPTSry9QZtOaSsE3tOzhx6LzDhHnXJ6xHeMNNiM6Q= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.51.0/go.mod h1:vy+2G/6NvVMpwGX/NyLqcC41fxepnuKHk16E6IZUcJc= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= +go.opentelemetry.io/contrib/otelconf v0.15.0 h1:BLNiIUsrNcqhSKpsa6CnhE6LdrpY1A8X0szMVsu99eo= +go.opentelemetry.io/contrib/otelconf v0.15.0/go.mod h1:OPH1seO5z9dp1P26gnLtoM9ht7JDvh3Ws6XRHuXqImY= +go.opentelemetry.io/contrib/otelconf v0.17.0 h1:Yh9uifPSe8yiksLshMbeAXGm/ZRmo7LD7Di+/yd1L5w= +go.opentelemetry.io/contrib/otelconf v0.17.0/go.mod h1:8dHKS6uMiZlvmrA7MGUtb4HwnX+ukdF5iS3p2UPKvLE= +go.opentelemetry.io/contrib/propagators/b3 v1.34.0 h1:9pQdCEvV/6RWQmag94D6rhU+A4rzUhYBEJ8bpscx5p8= +go.opentelemetry.io/contrib/propagators/b3 v1.34.0/go.mod h1:FwM71WS8i1/mAK4n48t0KU6qUS/OZRBgDrHZv3RlJ+w= +go.opentelemetry.io/contrib/propagators/b3 v1.35.0 h1:DpwKW04LkdFRFCIgM3sqwTJA/QREHMeMHYPWP1WeaPQ= +go.opentelemetry.io/contrib/propagators/b3 v1.35.0/go.mod h1:9+SNxwqvCWo1qQwUpACBY5YKNVxFJn5mlbXg/4+uKBg= +go.opentelemetry.io/contrib/propagators/b3 v1.37.0 h1:0aGKdIuVhy5l4GClAjl72ntkZJhijf2wg1S7b5oLoYA= +go.opentelemetry.io/contrib/propagators/b3 v1.37.0/go.mod h1:nhyrxEJEOQdwR15zXrCKI6+cJK60PXAkJ/jRyfhr2mg= +go.opentelemetry.io/otel v1.0.1/go.mod h1:OPEOD4jIT2SlZPMmwT6FqZz2C0ZNdQqiWcoK6M0SNFU= +go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel v1.23.0/go.mod h1:YCycw9ZeKhcJFrb34iVSkyT0iczq/zYDtZYFufObyB0= +go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y= +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0 h1:5dTKu4I5Dn4P2hxyW3l3jTaZx9ACgg0ECos1eAVrheY= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.10.0/go.mod h1:P5HcUI8obLrCCmM3sbVBohZFH34iszk/+CPWuakZWL8= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.11.0 h1:HMUytBT3uGhPKYY/u/G5MR9itrlSO2SMOsSD3Tk3k7A= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.11.0/go.mod h1:hdDXsiNLmdW/9BF2jQpnHHlhFajpWCEYfM6e5m2OAZg= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0 h1:z6lNIajgEBVtQZHjfw2hAccPEBDs+nx58VemmXWa2ec= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.13.0/go.mod h1:+kyc3bRx/Qkq05P6OCu3mTEIOxYRYzoIg+JsUp5X+PM= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0 h1:q/heq5Zh8xV1+7GoMGJpTxM2Lhq5+bFxB29tshuRuw0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.10.0/go.mod h1:leO2CSTg0Y+LyvmR7Wm4pUxE8KAmaM2GCVx7O+RATLA= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.11.0 h1:C/Wi2F8wEmbxJ9Kuzw/nhP+Z9XaHYMkyDmXy6yR2cjw= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.11.0/go.mod h1:0Lr9vmGKzadCTgsiBydxr6GEZ8SsZ7Ks53LzjWG5Ar4= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0 h1:zUfYw8cscHHLwaY8Xz3fiJu+R59xBnkgq2Zr1lwmK/0= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.13.0/go.mod h1:514JLMCcFLQFS8cnTepOk6I09cKWJ5nGHBxHrMJ8Yfg= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0 h1:ajl4QczuJVA2TU9W9AGw++86Xga/RKt//16z/yxPgdk= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.34.0/go.mod h1:Vn3/rlOJ3ntf/Q3zAI0V5lDnTbHGaUsNUeF6nZmm7pA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0 h1:QcFwRrZLc82r8wODjvyCbP7Ifp3UANaBSmhDSFjnqSc= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.35.0/go.mod h1:CXIWhUomyWBG/oY2/r/kLp6K/cmx9e/7DLpBuuGdLCA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0 h1:opwv08VbCZ8iecIWs+McMdHRcAXzjAeda3uG2kI/hcA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.34.0/go.mod h1:oOP3ABpW7vFHulLpE8aYtNBodrHhMTrvfxUXGvqm7Ac= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0 h1:0NIXxOCFx+SKbhCVxwl3ETG8ClLPAa0KuKV6p3yhxP8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0/go.mod h1:ChZSJbbfbl/DcRZNc9Gqh6DYGlfjw4PvO1pEOZH1ZsE= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0 h1:9PgnL3QNlj10uGxExowIDIZu66aVBwWhXmbOp1pa6RA= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0/go.mod h1:0ineDcLELf6JmKfuo0wvvhAVMuxWFYvkTin2iV4ydPQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.0.1/go.mod h1:Kv8liBeVNFkkkbilbgWRpV+wWuu+H5xdOT6HAgd30iw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.1/go.mod h1:xOvWoTOrQjxjW61xtOmD/WKGRYb/P4NzRo3bs65U6Rk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0 h1:tgJ0uaNS4c98WRNUEx5U3aDlrDOI5Rs+1Vifcw4DJ8U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA= +go.opentelemetry.io/otel/exporters/prometheus v0.56.0 h1:GnCIi0QyG0yy2MrJLzVrIM7laaJstj//flf1zEJCG+E= +go.opentelemetry.io/otel/exporters/prometheus v0.56.0/go.mod h1:JQcVZtbIIPM+7SWBB+T6FK+xunlyidwLp++fN0sUaOk= +go.opentelemetry.io/otel/exporters/prometheus v0.57.0 h1:AHh/lAP1BHrY5gBwk8ncc25FXWm/gmmY3BX258z5nuk= +go.opentelemetry.io/otel/exporters/prometheus v0.57.0/go.mod h1:QpFWz1QxqevfjwzYdbMb4Y1NnlJvqSGwyuU0B4iuc9c= +go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo= +go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0 h1:GKCEAZLEpEf78cUvudQdTg0aET2ObOZRB2HtXA0qPAI= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.10.0/go.mod h1:9/zqSWLCmHT/9Jo6fYeUDRRogOLL60ABLsHWS99lF8s= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.11.0 h1:k6KdfZk72tVW/QVZf60xlDziDvYAePj5QHwoQvrB2m8= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.11.0/go.mod h1:5Y3ZJLqzi/x/kYtrSrPSx7TFI/SGsL7q2kME027tH6I= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 h1:yEX3aC9KDgvYPhuKECHbOlr5GLwH6KTjLJ1sBSkkxkc= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0/go.mod h1:/GXR0tBmmkxDaCUGahvksvp66mx4yh5+cFXgSlhg0vQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0 h1:czJDQwFrMbOr9Kk+BPo1y8WZIIFIK58SA1kykuVeiOU= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.34.0/go.mod h1:lT7bmsxOe58Tq+JIOkTQMCGXdu47oA+VJKLZHbaBKbs= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0 h1:6VjV6Et+1Hd2iLZEPtdV7vie80Yyqf7oikJLjQ/myi0= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.37.0/go.mod h1:u8hcp8ji5gaM/RfcOo8z9NMnf1pVLfVY7lBY2VOGuUU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0 h1:jBpDk4HAUsrnVO1FsfCfCOTEc/MkInJmvfCHYLFiT80= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.34.0/go.mod h1:H9LUIM1daaeZaz91vZcfeM0fejXPmgCYE8ZhzqfJuiU= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0 h1:T0Ec2E+3YZf5bgTNQVet8iTDW7oIk03tXHq+wkwIDnE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0/go.mod h1:30v2gqH+vYGJsesLWFov8u47EpYTcIQcBjKpI6pJThg= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4= +go.opentelemetry.io/otel/log v0.10.0 h1:1CXmspaRITvFcjA4kyVszuG4HjA61fPDxMb7q3BuyF0= +go.opentelemetry.io/otel/log v0.10.0/go.mod h1:PbVdm9bXKku/gL0oFfUF4wwsQsOPlpo4VEqjvxih+FM= +go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E= +go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/metric v1.23.0/go.mod h1:MqUW2X2a6Q8RN96E2/nqNoT+z9BSms20Jb7Bbp+HiTo= +go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= +go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel/sdk v1.0.1/go.mod h1:HrdXne+BiwsOHYYkBE5ysIcv2bvdZstxzmCQhxTcZkI= +go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE= +go.opentelemetry.io/otel/sdk v1.19.0/go.mod h1:NedEbbS4w3C6zElbLdPJKOpJQOrGUJ+GfzpjUvI0v1A= +go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= +go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= +go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= +go.opentelemetry.io/otel/sdk/log v0.10.0 h1:lR4teQGWfeDVGoute6l0Ou+RpFqQ9vaPdrNJlST0bvw= +go.opentelemetry.io/otel/sdk/log v0.10.0/go.mod h1:A+V1UTWREhWAittaQEG4bYm4gAZa6xnvVu+xKrIRkzo= +go.opentelemetry.io/otel/sdk/log v0.11.0 h1:7bAOpjpGglWhdEzP8z0VXc4jObOiDEwr3IYbhBnjk2c= +go.opentelemetry.io/otel/sdk/log v0.11.0/go.mod h1:dndLTxZbwBstZoqsJB3kGsRPkpAgaJrWfQg3lhlHFFY= +go.opentelemetry.io/otel/sdk/log v0.13.0 h1:I3CGUszjM926OphK8ZdzF+kLqFvfRY/IIoFq/TjwfaQ= +go.opentelemetry.io/otel/sdk/log v0.13.0/go.mod h1:lOrQyCCXmpZdN7NchXb6DOZZa1N5G1R2tm5GMMTpDBw= +go.opentelemetry.io/otel/sdk/log/logtest v0.13.0 h1:9yio6AFZ3QD9j9oqshV1Ibm9gPLlHNxurno5BreMtIA= +go.opentelemetry.io/otel/sdk/log/logtest v0.13.0/go.mod h1:QOGiAJHl+fob8Nu85ifXfuQYmJTFAvcrxL6w5/tu168= +go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4= +go.opentelemetry.io/otel/trace v1.0.1/go.mod h1:5g4i4fKLaX2BQpSBsxw8YYcgKpMMSW3x7ZTuYBr3sUk= +go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= +go.opentelemetry.io/otel/trace v1.23.0/go.mod h1:GSGTbIClEsuZrGIzoEHqsVfxgn5UkggkflQwDScNUsk= +go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= +go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= +go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/proto/otlp v0.9.0/go.mod h1:1vKfU9rv61e9EVGthD1zNvUbiwPcimSsOPU9brfSHJg= +go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= +go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= +go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= +go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os= +go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= +go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200414173820-0848c9571904/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.4.0/go.mod h1:3quD/ATkf6oY+rnes5c3ExXTbLc8mueNue5/DoinL80= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp v0.0.0-20241108190413-2d47ceb2692f/go.mod h1:D5SMRVC3C2/4+F/DB1wZsLRnSNimn2Sp/NPsCrsv8ak= +golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= +golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE= +golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY= +golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= +golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I= +golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8= +golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= +golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b h1:DU+gwOBXU+6bO0sEyO7o/NeMlxZxCZEvI7v+J4a1zRQ= +golang.org/x/telemetry v0.0.0-20250710130107-8d8967aff50b/go.mod h1:4ZwOYna0/zsOKwuR5X/m0QFOJpSZvAxFfkQT+Erd9D4= +golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053 h1:dHQOQddU4YHS5gY33/6klKjq7Gp3WwMyOXGNp5nzRj8= +golang.org/x/telemetry v0.0.0-20250908211612-aef8a434d053/go.mod h1:+nZKN+XVh4LCiA9DV3ywrzN4gumyCnKjau3NGb9SGoE= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.17.0/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps= +golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= +golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= +golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= +golang.org/x/tools/go/expect v0.1.0-deprecated h1:jY2C5HGYR5lqex3gEniOQL0r7Dq5+VGVgY1nudX5lXY= +golang.org/x/tools/go/expect v0.1.0-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= +golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.11.0 h1:f1IJhK4Km5tBJmaiJXtk/PkL4cdVX6J+tGiM187uT5E= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= +gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= +google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= +google.golang.org/api v0.196.0/go.mod h1:g9IL21uGkYgvQ5BZg6BAtoGJQIm8r6EgaAbpNey5wBE= +google.golang.org/api v0.197.0/go.mod h1:AuOuo20GoQ331nq7DquGHlU6d+2wN2fZ8O0ta60nRNw= +google.golang.org/api v0.205.0/go.mod h1:NrK1EMqO8Xk6l6QwRAmrXXg2v6dzukhlOyvkYtnvUuc= +google.golang.org/api v0.211.0/go.mod h1:XOloB4MXFH4UTlQSGuNUxw0UT74qdENK8d6JNsXKLi0= +google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= +google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= +google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= +google.golang.org/api v0.232.0/go.mod h1:p9QCfBWZk1IJETUdbTKloR5ToFdKbYh2fkjsUL6vNoY= +google.golang.org/api v0.237.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= +google.golang.org/api v0.243.0 h1:sw+ESIJ4BVnlJcWu9S+p2Z6Qq1PjG77T8IJ1xtp4jZQ= +google.golang.org/api v0.243.0/go.mod h1:GE4QtYfaybx1KmeHMdBnNnyLzBZCVihGBXAmJu/uUr8= +google.golang.org/api v0.244.0 h1:lpkP8wVibSKr++NCD36XzTk/IzeKJ3klj7vbj+XU5pE= +google.golang.org/api v0.244.0/go.mod h1:dMVhVcylamkirHdzEBAIQWUCgqY885ivNeZYd7VAVr8= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8 h1:Cpp2P6TPjujNoC5M2KHY6g7wfyLYfIWRZaSdIKfDasA= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20230920204549-e6e6cdab5c13/go.mod h1:CCviP9RmpZ1mxVr8MUjCnSiY09IbAXZxhLE6EhHIdPU= +google.golang.org/genproto v0.0.0-20231211222908-989df2bf70f3/go.mod h1:5RBcpGRxr25RbDzY5w+dmaqpSEvl8Gwl1x2CICf60ic= +google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= +google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= +google.golang.org/genproto v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:hL97c3SYopEHblzpxRL4lSs523++l8DYxGM1FQiYmb4= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU= +google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= +google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230913181813-007df8e322eb/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20231120223509-83a465c0220f/go.mod h1:Uy9bTZJqmfrw2rIBxgGLnamc78euZULUBrLZ9XTITKI= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= +google.golang.org/genproto/googleapis/api v0.0.0-20240311132316-a219d84964c2/go.mod h1:O1cOfN1Cy6QEYr7VxtjOyP5AdAuR0aJ/MYZaaof623Y= +google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= +google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be/go.mod h1:dvdCTIoAGbkWbcIKBniID56/7XHTt6WfxXNMxuziJ+w= +google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= +google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= +google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/api v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:wp2WsuBYj6j8wUdo3ToZsdxxixbvQNAHqVJrTgi5E5M= +google.golang.org/genproto/googleapis/api v0.0.0-20241015192408-796eee8c2d53/go.mod h1:riSXTwQ4+nqmPGtobMFyW5FqVAmIs0St6VPp4Ug7CE4= +google.golang.org/genproto/googleapis/api v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:dguCy7UOdZhTvLzDyt15+rOrawrpM4q7DD9dQ1P11P4= +google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= +google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY= +google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= +google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4= +google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= +google.golang.org/genproto/googleapis/api v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:c8q6Z6OCqnfVIqUFJkCzKcrj8eCvUrz+K4KRzSTuANg= +google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8= +google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= +google.golang.org/genproto/googleapis/api v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:W3S/3np0/dPWsWLi1h/UymYctGXaGBM2StwzD0y140U= +google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= +google.golang.org/genproto/googleapis/api v0.0.0-20250528174236-200df99c418a/go.mod h1:a77HrdMjoeKbnd2jmgcWdaS++ZLZAEq3orIOAEIKiVw= +google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc= +google.golang.org/genproto/googleapis/api v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:vYFwMYFbmA8vl6Z/krj/h7+U/AqpHknwJX4Uqgfyc7I= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa h1:wBkzraZsSqhj1M4L/nMrljUU6XasJkgHvUsq8oRGwF0= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:IN9OQUXZ0xT+26MDwZL8fJcYw+y99b0eYPA2U15Jt8o= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20241209162323-e6fa225c2576 h1:H8LrtQMZ6iQnV+zpgeb0YqwdByodQltmFqIhjuwexOI= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20241209162323-e6fa225c2576/go.mod h1:qUsLYwbwz5ostUWtuFuXPlHmSJodC5NI/88ZlHj4M1o= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250414145226-207652e42e2e h1:OK8bKvRgTGs7U871RdjtCiRcQJLice8/rZkeoaZgnlc= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250414145226-207652e42e2e/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250603155806-513f23925822/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250715232539-7130f93afb79 h1:IpwY95CV9qj08VMQEirHQF61g0THzlzHaj9sQ3vlExY= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250715232539-7130f93afb79/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250728155136-f173205681a0/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231002182017-d307bd883b97/go.mod h1:v7nGkzlmW8P3n/bKmWBn2WpBjpOEx8Q6gMueudAmKfY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240304161311-37d4d3c04a78/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240311132316-a219d84964c2/go.mod h1:UCOku4NytXMJuLQE5VuqA5lX3PcHCBo8pxNyvkf4xBs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240708141625-4ad9e859172b/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241015192408-796eee8c2d53/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241104194629-dd2ea8efbc28/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241206012308-a4fef0638583/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250106144421-5f5ef82da422/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250409194420-de1ac958c67a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250528174236-200df99c418a/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250715232539-7130f93afb79/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250721164621-a45f3dfb1074/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= +google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= +google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1 h1:F29+wU6Ee6qgu9TddPgooOdaqsxTMunOoj8KA5yuS5A= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1/go.mod h1:5KF+wpkbTSbGcR9zteSqZV6fqFOWBl4Yde8En8MryZA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183 h1:PGIdqvwfpMUyUP+QAlAnKTSWQ671SmYjoou2/5j7HXk= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v1 v1.0.0 h1:n+7XfCyygBFb8sEjg6692xjC6Us50TFRO54+xYUEwjE= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/httprequest.v1 v1.2.1 h1:pEPLMdF/gjWHnKxLpuCYaHFjc8vAB2wrYjXrqDVC16E= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/jinzhu/gorm.v1 v1.9.2 h1:sTqyEcgrxG68jdeUXA9syQHNdeRhhfaYZ+vcL3x730I= +gopkg.in/jinzhu/gorm.v1 v1.9.2/go.mod h1:56JJPUzbikvTVnoyP1nppSkbJ2L8sunqTBDY2fDrmFg= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/olivere/elastic.v3 v3.0.75 h1:u3B8p1VlHF3yNLVOlhIWFT3F1ICcHfM5V6FFJe6pPSo= +gopkg.in/olivere/elastic.v3 v3.0.75/go.mod h1:yDEuSnrM51Pc8dM5ov7U8aI/ToR3PG0llA8aRv2qmw0= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/retry.v1 v1.0.3 h1:a9CArYczAVv6Qs6VGoLMio99GEs7kY9UzSF9+LD+iGs= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= +gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/postgres v1.4.6/go.mod h1:UJChCNLFKeBqQRE+HrkFUbKbq9idPXmTOk2u4Wok8S4= +gorm.io/gorm v1.24.2/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.26.2/go.mod h1:1kjMQsFE+QHPfskEcVNgL3+Hp88B80uj0QtSOlj8itU= +k8s.io/apiextensions-apiserver v0.31.1 h1:L+hwULvXx+nvTYX/MKM3kKMZyei+UiSXQWciX/N6E40= +k8s.io/apiextensions-apiserver v0.31.1/go.mod h1:tWMPR3sgW+jsl2xm9v7lAyRF1rYEK71i9G5dRtkknoQ= +k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.26.2/go.mod h1:ats7nN1LExKHvJ9TmwootT00Yz05MuYqPXEXaVeOy5I= +k8s.io/apimachinery v0.26.7/go.mod h1:qYzLkrQ9lhrZRh0jNKo2cfvf/R1/kQONnSiyB7NUJU0= +k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.26.2/go.mod h1:GHcozwXgXsPuOJ28EnQ/jXEM9QeG6HT22YxSNmpYNh8= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.26.2/go.mod h1:u5EjOuSyBa09yqqyY7m3abZeovO/7D/WehVVlZ2qcqU= +k8s.io/code-generator v0.31.1 h1:GvkRZEP2g2UnB2QKT2Dgc/kYxIkDxCHENv2Q1itioVs= +k8s.io/code-generator v0.31.1/go.mod h1:oL2ky46L48osNqqZAeOcWWy0S5BXj50vVdwOtTefqIs= +k8s.io/code-generator v0.32.3/go.mod h1:+mbiYID5NLsBuqxjQTygKM/DAdKpAjvBzrJd64NU1G8= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.26.2 h1:IfWgCGUDzrD6wLLgXEstJKYZKAFS2kO+rBRi0p3LqcI= +k8s.io/component-base v0.26.2/go.mod h1:DxbuIe9M3IZPRxPIzhch2m1eT7uFrSBJUBuVCQEBivs= +k8s.io/component-base v0.26.7 h1:uqsOyZh0Zqoaup8tmHa491D/CvgFdGUs+X2H/inNUKM= +k8s.io/component-base v0.26.7/go.mod h1:CZe1HTmX/DQdeBrb9XYOXzs96jXth8ZbFvhLMsoJLUg= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.27.1 h1:KWO+U8MfI9drXB/P4oU9VchaWYOlwDglJZVHWMpTT3Q= +k8s.io/cri-api v0.27.1/go.mod h1:+Ts/AVYbIo04S86XbTD73UPp/DkTiYxtsFeOFEu32L0= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c h1:GohjlNKauSai7gN4wsJkeZ3WAJx4Sh+oT/b5IYn5suA= +k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= +k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 h1:cErOOTkQ3JW19o4lo91fFurouhP8NcoBvb7CkvhZZpk= +k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/klog v0.2.0 h1:0ElL0OHzF3N+OhoJTL0uca20SxtYt4X4+bzHeqrB83c= +k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kms v0.26.7 h1:vruEJNh2IyFnPHbCH8CpUjekHy1HFJtHd/lE2K0lU78= +k8s.io/kms v0.26.7/go.mod h1:AYuV9ZebRhr6cb1eT9L6kZVxvgIUxmE1Fe6kPhqYvuc= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20221107191617-1a15be271d1d/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +modernc.org/cc/v4 v4.2.1 h1:xwwaXFwiPaVZpGRMd19NPLsaiNyNBO8oChey4501g1M= +modernc.org/cc/v4 v4.2.1/go.mod h1:0O8vuqhQfwBy+piyfEjzWIUGV4I3TPsXSf0W05+lgN8= +modernc.org/ccgo/v4 v4.0.0-20230612200659-63de3e82e68d h1:3yB/pQNL5kVPDifGFqoZjeRxf8m0+Us15rB7ertNASQ= +modernc.org/ccgo/v4 v4.0.0-20230612200659-63de3e82e68d/go.mod h1:austqj6cmEDRfewsUvmGmyIgsI/Nq87oTXlfTgY85Fc= +modernc.org/gc/v2 v2.1.2-0.20220923113132-f3b5abcf8083 h1:rGoLVwiOxdeVkGYMOF/8Pw7xpDd3OqScJU/tqHgvY1c= +modernc.org/gc/v2 v2.1.2-0.20220923113132-f3b5abcf8083/go.mod h1:Zt5HLUW0j+l02wj99UsPs+1DOFwwsGnqfcw+BGyyP/A= +nullprogram.com/x/optparse v1.0.0 h1:xGFgVi5ZaWOnYdac2foDT3vg0ZZC9ErXFV57mr4OHrI= +rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= +rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= +rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37 h1:fAPTNEpzQMOLMGwOHNbUkR2xXTQwMJOZYNx+/mLlOh0= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.37/go.mod h1:vfnxT4FXNT8eGvO+xi/DsyC/qHmdujqwrUa1WSspCsk= +sigs.k8s.io/controller-runtime v0.18.0 h1:Z7jKuX784TQSUL1TIyeuF7j8KXZ4RtSX0YgtjKcSTME= +sigs.k8s.io/controller-runtime v0.18.0/go.mod h1:tuAt1+wbVsXIT8lPtk5RURxqAnq7xkpv2Mhttslg7Hw= +sigs.k8s.io/controller-runtime v0.20.4/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= +sigs.k8s.io/controller-tools v0.16.3 h1:z48C5/d4jCVQQvtiSBL5MYyZ3EO2eFIOXrIKMgHVhFY= +sigs.k8s.io/controller-tools v0.16.3/go.mod h1:AEj6k+w1kYpLZv2einOH3mj52ips4W/6FUjnB5tkJGs= +sigs.k8s.io/controller-tools v0.17.3/go.mod h1:1ii+oXcYZkxcBXzwv3YZBlzjt1fvkrCGjVF73blosJI= +sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016 h1:kXv6kKdoEtedwuqMmkqhbkgvYKeycVbC8+iPCP9j5kQ= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +tags.cncf.io/container-device-interface/specs-go v0.7.0 h1:w/maMGVeLP6TIQJVYT5pbqTi8SCw/iHZ+n4ignuGHqg= +tags.cncf.io/container-device-interface/specs-go v0.7.0/go.mod h1:hMAwAbMZyBLdmYqWgYcKH0F/yctNpV3P35f+/088A80= +tags.cncf.io/container-device-interface/specs-go v0.8.0 h1:QYGFzGxvYK/ZLMrjhvY0RjpUavIn4KcmRmVP/JjdBTA= +tags.cncf.io/container-device-interface/specs-go v0.8.0/go.mod h1:BhJIkjjPh4qpys+qm4DAYtUyryaTDg9zris+AczXyws= diff --git a/internal/appsec/dyngo/operation.go b/instrumentation/appsec/dyngo/operation.go similarity index 89% rename from internal/appsec/dyngo/operation.go rename to instrumentation/appsec/dyngo/operation.go index b5c0a16831..ae2ab084ba 100644 --- a/internal/appsec/dyngo/operation.go +++ b/instrumentation/appsec/dyngo/operation.go @@ -22,10 +22,11 @@ package dyngo import ( "context" + "runtime" "sync" "sync/atomic" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" ) // LogError is the function used to log errors in the dyngo package. @@ -76,8 +77,8 @@ var rootOperation atomic.Pointer[Operation] // SwapRootOperation allows to atomically swap the current root operation with // the given new one. Concurrent uses of the old root operation on already // existing and running operation are still valid. -func SwapRootOperation(new Operation) { - rootOperation.Swap(&new) +func SwapRootOperation(newOp Operation) { + rootOperation.Swap(&newOp) // Note: calling Finish(old, ...) could result into mem leaks because // some finish event listeners, possibly releasing memory and resources, // wouldn't be called anymore (because Finish() disables the operation and @@ -89,7 +90,7 @@ func SwapRootOperation(new Operation) { // bubble-up the operation stack, which allows listening to future events that // might happen in the operation lifetime. type operation struct { - parent *operation + parent Operation eventRegister dataBroadcaster @@ -146,11 +147,7 @@ func NewOperation(parent Operation) Operation { parent = *ptr } } - var parentOp *operation - if parent != nil { - parentOp = parent.unwrap() - } - return &operation{parent: parentOp} + return &operation{parent: parent} } // FromContext looks into the given context (or the GLS if orchestrion is enabled) for a parent Operation and returns it. @@ -164,13 +161,33 @@ func FromContext(ctx context.Context) (Operation, bool) { return op, ok } +// FindOperation looks into the current operation tree for the first operation matching the given type. +// It has a hardcoded limit of 32 levels of depth even looking for the operation in the parent tree +func FindOperation[T any, O interface { + Operation + *T +}](ctx context.Context) (*T, bool) { + op, found := FromContext(ctx) + if !found { + return nil, false + } + + for current := op; current != nil; current = current.unwrap().parent { + if o, ok := current.(O); ok { + return o, true + } + } + + return nil, false +} + // StartOperation starts a new operation along with its arguments and emits a // start event with the operation arguments. func StartOperation[O Operation, E ArgOf[O]](op O, args E) { // Bubble-up the start event starting from the parent operation as you can't // listen for your own start event - for current := op.unwrap().parent; current != nil; current = current.parent { - emitEvent(¤t.eventRegister, op, args) + for current := op.unwrap().parent; current != nil; current = current.Parent() { + emitEvent(¤t.unwrap().eventRegister, op, args) } } @@ -205,8 +222,9 @@ func FinishOperation[O Operation, E ResultOf[O]](op O, results E) { return } - for current := o; current != nil; current = current.parent { - emitEvent(¤t.eventRegister, op, results) + var current Operation = op + for ; current != nil; current = current.Parent() { + emitEvent(¤t.unwrap().eventRegister, op, results) } } @@ -274,8 +292,8 @@ func EmitData[T any](op Operation, data T) { // Bubble up the data to the stack of operations. Contrary to events, // we also send the data to ourselves since SDK operations are leaf operations // that both emit and listen for data (errors). - for current := o; current != nil; current = current.parent { - emitData(¤t.dataBroadcaster, data) + for current := op; current != nil; current = current.Parent() { + emitData(¤t.unwrap().dataBroadcaster, data) } } @@ -313,16 +331,12 @@ func addDataListener[T any](b *dataBroadcaster, l DataListener[T]) { b.listeners[key] = append(b.listeners[key], l) } -func (b *dataBroadcaster) clear() { - b.mu.Lock() - defer b.mu.Unlock() - b.listeners = nil -} - func emitData[T any](b *dataBroadcaster, v T) { defer func() { if r := recover(); r != nil { - LogError("appsec: recovered from an unexpected panic from an event listener: %+v", r) + var buf [4_096]byte + n := runtime.Stack(buf[:], false) + LogError("appsec: recovered from an unexpected panic from a data listener (for %T): %+v\n%s", v, r, string(buf[:n])) } }() b.mu.RLock() @@ -353,7 +367,9 @@ func (r *eventRegister) clear() { func emitEvent[O Operation, T any](r *eventRegister, op O, v T) { defer func() { if r := recover(); r != nil { - LogError("appsec: recovered from an unexpected panic from an event listener: %+v", r) + var buf [4_096]byte + n := runtime.Stack(buf[:], false) + LogError("appsec: recovered from an unexpected panic from an event listener (%T > %T): %+v\n%s", op, v, r, string(buf[:n])) } }() r.mu.RLock() diff --git a/internal/appsec/dyngo/operation_test.go b/instrumentation/appsec/dyngo/operation_test.go similarity index 92% rename from internal/appsec/dyngo/operation_test.go rename to instrumentation/appsec/dyngo/operation_test.go index e5ce3f1c24..cf03102e2f 100644 --- a/internal/appsec/dyngo/operation_test.go +++ b/instrumentation/appsec/dyngo/operation_test.go @@ -6,6 +6,7 @@ package dyngo_test import ( + "context" "errors" "fmt" "io" @@ -17,7 +18,9 @@ import ( "sync/atomic" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" "github.com/stretchr/testify/require" ) @@ -669,6 +672,54 @@ func TestOperationEvents(t *testing.T) { }) } +func testFindOperation[T any, O interface { + dyngo.Operation + *T +}](arg dyngo.Operation, expectOp dyngo.Operation, expectFound bool) func(t *testing.T) { + return func(t *testing.T) { + t.Helper() + + op, found := dyngo.FindOperation[T, O](dyngo.RegisterOperation(context.Background(), arg)) + assert.Equal(t, expectFound, found, "FindOperation() found = %v, want %v", found, expectFound) + if !found { + return + } + + if expectOp == nil { + assert.Nil(t, op, "FindOperation() op = %v, want %v", op, expectOp) + } else { + assert.EqualValues(t, expectOp, op, "FindOperation() op = %v, want %v", op, expectOp) + } + } +} + +func TestFindOperation(t *testing.T) { + root := dyngo.NewOperation(nil) + type Op1 struct{ dyngo.Operation } + type Op2 struct{ dyngo.Operation } + type Op3 struct{ dyngo.Operation } + + var op1 dyngo.Operation = &Op1{root} + var op2 dyngo.Operation = &Op2{root} + var op3 dyngo.Operation = &Op3{root} + var parentOp1 dyngo.Operation = &Op1{dyngo.NewOperation(op3)} + var parentOp2 dyngo.Operation = &Op2{dyngo.NewOperation(op1)} + var parentOp3 dyngo.Operation = &Op3{dyngo.NewOperation(op2)} + var gpOp1 dyngo.Operation = &Op1{dyngo.NewOperation(parentOp1)} + var gpOp2 dyngo.Operation = &Op2{dyngo.NewOperation(parentOp3)} + var gpOp3 dyngo.Operation = &Op3{dyngo.NewOperation(parentOp2)} + + t.Run("no-parent", testFindOperation[Op1](root, nil, false)) + t.Run("found", testFindOperation[Op1](op1, op1, true)) + t.Run("not-found", testFindOperation[Op1](op2, nil, false)) + t.Run("found-parent", testFindOperation[Op1](parentOp2, op1, true)) + t.Run("found-parent-2", testFindOperation[Op2](gpOp3, parentOp2, true)) + t.Run("not-found-parent", testFindOperation[Op1](parentOp3, nil, false)) + t.Run("found-grandparent", testFindOperation[Op1](gpOp3, op1, true)) + t.Run("found-grandparent-2", testFindOperation[Op3](gpOp1, op3, true)) + t.Run("not-found-grandparent", testFindOperation[Op1](gpOp2, nil, false)) +} + func BenchmarkEvents(b *testing.B) { b.Run("emitting", func(b *testing.B) { // Benchmark the emission of events according to the operation stack length diff --git a/internal/appsec/emitter/doc.go b/instrumentation/appsec/emitter/doc.go similarity index 88% rename from internal/appsec/emitter/doc.go rename to instrumentation/appsec/emitter/doc.go index 6c8ef6d3da..3aff8b5657 100644 --- a/internal/appsec/emitter/doc.go +++ b/instrumentation/appsec/emitter/doc.go @@ -6,5 +6,5 @@ // Package emitter provides functions and types used to instrument go libraries // to integrate them with Datadog AppSec features. The events produced by this // instrumentation can be listened to using the functions found in -// gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener. +// github.com/DataDog/dd-trace-go/v2/internal/appsec/listener. package emitter diff --git a/internal/appsec/emitter/graphqlsec/README.md b/instrumentation/appsec/emitter/graphqlsec/README.md similarity index 100% rename from internal/appsec/emitter/graphqlsec/README.md rename to instrumentation/appsec/emitter/graphqlsec/README.md diff --git a/internal/appsec/emitter/graphqlsec/execution.go b/instrumentation/appsec/emitter/graphqlsec/execution.go similarity index 83% rename from internal/appsec/emitter/graphqlsec/execution.go rename to instrumentation/appsec/emitter/graphqlsec/execution.go index 0599d5e18d..06b6981b97 100644 --- a/internal/appsec/emitter/graphqlsec/execution.go +++ b/instrumentation/appsec/emitter/graphqlsec/execution.go @@ -3,18 +3,14 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package graphql is the GraphQL instrumentation API and contract for AppSec -// defining an abstract run-time representation of AppSec middleware. GraphQL -// integrations must use this package to enable AppSec features for GraphQL, -// which listens to this package's operation events. package graphqlsec import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" ) type ( diff --git a/internal/appsec/emitter/graphqlsec/request.go b/instrumentation/appsec/emitter/graphqlsec/request.go similarity index 62% rename from internal/appsec/emitter/graphqlsec/request.go rename to instrumentation/appsec/emitter/graphqlsec/request.go index 70e1f6dff7..e1f363b92a 100644 --- a/internal/appsec/emitter/graphqlsec/request.go +++ b/instrumentation/appsec/emitter/graphqlsec/request.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -// Package graphql is the GraphQL instrumentation API and contract for AppSec +// Package graphqlsec is the GraphQL instrumentation API and contract for AppSec // defining an abstract run-time representation of AppSec middleware. GraphQL // integrations must use this package to enable AppSec features for GraphQL, // which listens to this package's operation events. @@ -12,9 +12,9 @@ package graphqlsec import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" ) type ( @@ -22,6 +22,9 @@ type ( dyngo.Operation // used in case we don't have a parent operation *waf.ContextOperation + + // wafContextOwner indicates if the waf.ContextOperation was started by us or not and if we need to close it. + wafContextOwner bool } // RequestOperationArgs describes arguments passed to a GraphQL request. @@ -41,10 +44,10 @@ type ( // Finish the GraphQL query operation, along with the given results, and emit a finish event up in // the operation stack. -func (op *RequestOperation) Finish(span trace.TagSetter, res RequestOperationRes) { +func (op *RequestOperation) Finish(res RequestOperationRes) { dyngo.FinishOperation(op, res) - if op.ContextOperation != nil { - op.ContextOperation.Finish(span) + if op.wafContextOwner { + op.ContextOperation.Finish() } } @@ -55,14 +58,16 @@ func (RequestOperationRes) IsResultOf(*RequestOperation) {} // emits a start event up in the operation stack. The operation is usually linked to tge global root // operation. The operation is tracked on the returned context, and can be extracted later on using // FromContext. -func StartRequestOperation(ctx context.Context, args RequestOperationArgs) (context.Context, *RequestOperation) { - parent, ok := dyngo.FromContext(ctx) - op := &RequestOperation{} - if !ok { // Usually we can find the HTTP Handler Operation as the parent but it's technically optional - op.ContextOperation, ctx = waf.StartContextOperation(ctx) - op.Operation = dyngo.NewOperation(op.ContextOperation) - } else { - op.Operation = dyngo.NewOperation(parent) +func StartRequestOperation(ctx context.Context, span trace.TagSetter, args RequestOperationArgs) (context.Context, *RequestOperation) { + wafOp, found := dyngo.FindOperation[waf.ContextOperation](ctx) + if !found { // Usually we can find the HTTP Handler Operation as the parent, but it's technically optional + wafOp, ctx = waf.StartContextOperation(ctx, span) + } + + op := &RequestOperation{ + Operation: dyngo.NewOperation(wafOp), + ContextOperation: wafOp, + wafContextOwner: !found, // If we started the parent operation, we finish it, otherwise we don't } return dyngo.StartAndRegisterOperation(ctx, op, args), op diff --git a/internal/appsec/emitter/graphqlsec/resolve.go b/instrumentation/appsec/emitter/graphqlsec/resolve.go similarity index 94% rename from internal/appsec/emitter/graphqlsec/resolve.go rename to instrumentation/appsec/emitter/graphqlsec/resolve.go index b7f5fe067b..fd1b1b6376 100644 --- a/internal/appsec/emitter/graphqlsec/resolve.go +++ b/instrumentation/appsec/emitter/graphqlsec/resolve.go @@ -8,9 +8,9 @@ package graphqlsec import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" ) type ( diff --git a/internal/appsec/emitter/grpcsec/grpc.go b/instrumentation/appsec/emitter/grpcsec/grpc.go similarity index 80% rename from internal/appsec/emitter/grpcsec/grpc.go rename to instrumentation/appsec/emitter/grpcsec/grpc.go index e6b28e3124..f6b6691f22 100644 --- a/internal/appsec/emitter/grpcsec/grpc.go +++ b/instrumentation/appsec/emitter/grpcsec/grpc.go @@ -26,11 +26,11 @@ import ( "context" "sync/atomic" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/actions" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/actions" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" ) type ( @@ -42,6 +42,9 @@ type ( HandlerOperation struct { dyngo.Operation *waf.ContextOperation + + // wafContextOwner indicates if the waf.ContextOperation was started by us or not and if we need to close it. + wafContextOwner bool } // HandlerOperationArgs is the grpc handler arguments. @@ -74,11 +77,15 @@ func (HandlerOperationRes) IsResultOf(*HandlerOperation) {} // given arguments and parent operation, and emits a start event up in the // operation stack. When parent is nil, the operation is linked to the global // root operation. -func StartHandlerOperation(ctx context.Context, args HandlerOperationArgs) (context.Context, *HandlerOperation, *atomic.Pointer[actions.BlockGRPC]) { - wafOp, ctx := waf.StartContextOperation(ctx) +func StartHandlerOperation(ctx context.Context, span trace.TagSetter, args HandlerOperationArgs) (context.Context, *HandlerOperation, *atomic.Pointer[actions.BlockGRPC]) { + wafOp, found := dyngo.FindOperation[waf.ContextOperation](ctx) + if !found { + wafOp, ctx = waf.StartContextOperation(ctx, span) + } op := &HandlerOperation{ Operation: dyngo.NewOperation(wafOp), ContextOperation: wafOp, + wafContextOwner: !found, } var block atomic.Pointer[actions.BlockGRPC] @@ -110,7 +117,9 @@ func MonitorResponseMessage(ctx context.Context, msg any) error { // Finish the gRPC handler operation, along with the given results, and emit a // finish event up in the operation stack. -func (op *HandlerOperation) Finish(span trace.TagSetter, res HandlerOperationRes) { +func (op *HandlerOperation) Finish(res HandlerOperationRes) { dyngo.FinishOperation(op, res) - op.ContextOperation.Finish(span) + if op.wafContextOwner { + op.ContextOperation.Finish() + } } diff --git a/internal/appsec/emitter/httpsec/config.go b/instrumentation/appsec/emitter/httpsec/config.go similarity index 72% rename from internal/appsec/emitter/httpsec/config.go rename to instrumentation/appsec/emitter/httpsec/config.go index bdbf3af317..e61acd0da3 100644 --- a/internal/appsec/emitter/httpsec/config.go +++ b/instrumentation/appsec/emitter/httpsec/config.go @@ -5,9 +5,13 @@ package httpsec -import "net/http" +import ( + "net/http" +) type Config struct { + // Framework is the name of the framework or library being used (optional). + Framework string // OnBlock is a list of callbacks to be invoked when a block decision is made. OnBlock []func() // ResponseHeaderCopier provides a way to access response headers for reading @@ -15,10 +19,12 @@ type Config struct { // apply synchronization if they allow http.ResponseWriter objects to be // accessed by multiple goroutines. ResponseHeaderCopier func(http.ResponseWriter) http.Header + // Route is the route name to be used for the request. + Route string + // RouteParams is a map of route parameters to be used for the request. + RouteParams map[string]string } var defaultWrapHandlerConfig = &Config{ - ResponseHeaderCopier: func(w http.ResponseWriter) http.Header { - return w.Header() - }, + ResponseHeaderCopier: func(w http.ResponseWriter) http.Header { return w.Header() }, } diff --git a/instrumentation/appsec/emitter/httpsec/http.go b/instrumentation/appsec/emitter/httpsec/http.go new file mode 100644 index 0000000000..0f3e4fde1a --- /dev/null +++ b/instrumentation/appsec/emitter/httpsec/http.go @@ -0,0 +1,306 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package httpsec defines is the HTTP instrumentation API and contract for +// AppSec. It defines an abstract representation of HTTP handlers, along with +// helper functions to wrap (aka. instrument) standard net/http handlers. +// HTTP integrations must use this package to enable AppSec features for HTTP, +// which listens to this package's operation events. +package httpsec + +import ( + "context" + // Blank import needed to use embed for the default blocked response payloads + _ "embed" + "net/http" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/actions" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" +) + +// HandlerOperation type representing an HTTP operation. It must be created with +// StartOperation() and finished with its Finish(). +type ( + HandlerOperation struct { + dyngo.Operation + *waf.ContextOperation + + // wafContextOwner indicates if the waf.ContextOperation was started by us or not and if we need to close it. + wafContextOwner bool + + // framework is the name of the framework or library that started the operation. + framework string + // method is the HTTP method for the current handler operation. + method string + // route is the HTTP route for the current handler operation (or the URL if no route is available). + route string + + // downstreamRequestBodyAnalysis is the number of times a call to a downstream request body monitoring function was made. + downstreamRequestBodyAnalysis atomic.Int32 + } + + // HandlerOperationArgs is the HTTP handler operation arguments. + HandlerOperationArgs struct { + Framework string // Optional: name of the framework or library being used + Method string + RequestURI string + RequestRoute string + Host string + RemoteAddr string + Headers map[string][]string + Cookies map[string][]string + QueryParams map[string][]string + PathParams map[string]string + } + + // HandlerOperationRes is the HTTP handler operation results. + HandlerOperationRes struct { + Headers map[string][]string + StatusCode int + } + + // EarlyBlock is used to trigger an early block before the handler is executed. + EarlyBlock struct{} +) + +func (HandlerOperationArgs) IsArgOf(*HandlerOperation) {} +func (HandlerOperationRes) IsResultOf(*HandlerOperation) {} + +func StartOperation(ctx context.Context, args HandlerOperationArgs, span trace.TagSetter) (*HandlerOperation, *atomic.Pointer[actions.BlockHTTP], context.Context) { + wafOp, found := dyngo.FindOperation[waf.ContextOperation](ctx) + if !found { + wafOp, ctx = waf.StartContextOperation(ctx, span) + } + + op := &HandlerOperation{ + Operation: dyngo.NewOperation(wafOp), + ContextOperation: wafOp, + wafContextOwner: !found, // If we started the parent operation, we finish it, otherwise we don't + framework: args.Framework, + method: args.Method, + route: args.RequestRoute, + } + + // We need to use an atomic pointer to store the action because the action may be created asynchronously in the future + var action atomic.Pointer[actions.BlockHTTP] + dyngo.OnData(op, func(a *actions.BlockHTTP) { + action.Store(a) + }) + + return op, &action, dyngo.StartAndRegisterOperation(ctx, op, args) +} + +// Framework returns the name of the framework or library that started the operation. +func (op *HandlerOperation) Framework() string { + return op.framework +} + +// Method returns the HTTP method for the current handler operation. +func (op *HandlerOperation) Method() string { + return op.method +} + +// Route returns the HTTP route for the current handler operation. +func (op *HandlerOperation) Route() string { + return op.route +} + +// DownstreamRequestBodyAnalysis returns the number of times a call to a downstream request body monitoring function was made. +func (op *HandlerOperation) DownstreamRequestBodyAnalysis() int { + return int(op.downstreamRequestBodyAnalysis.Load()) +} + +// IncrementDownstreamRequestBodyAnalysis increments the number of times a call to a downstream request body monitoring function was made. +func (op *HandlerOperation) IncrementDownstreamRequestBodyAnalysis() { + op.downstreamRequestBodyAnalysis.Add(1) +} + +// Finish the HTTP handler operation and its children operations and write everything to the service entry span. +func (op *HandlerOperation) Finish(res HandlerOperationRes) { + dyngo.FinishOperation(op, res) + if op.wafContextOwner { + op.ContextOperation.Finish() + } +} + +const ( + monitorParsedBodyErrorLog = ` +"appsec: parsed http body monitoring ignored: could not find the http handler instrumentation metadata in the request context: + the request handler is not being monitored by a middleware function or the provided context is not the expected request context +` + monitorResponseBodyErrorLog = ` +"appsec: http response body monitoring ignored: could not find the http handler instrumentation metadata in the request context: + the request handler is not being monitored by a middleware function or the provided context is not the expected request context +` +) + +// MonitorParsedBody starts and finishes the SDK body operation. +// This function should not be called when AppSec is disabled in order to +// get more accurate error logs. +func MonitorParsedBody(ctx context.Context, body any) error { + return waf.RunSimple(ctx, + addresses.NewAddressesBuilder(). + WithRequestBody(body). + Build(), + monitorParsedBodyErrorLog, + ) +} + +// MonitorResponseBody gets the response body through the in-app WAF. +// This function should not be called when AppSec is disabled in order to get +// more accurate error logs. +func MonitorResponseBody(ctx context.Context, body any) error { + return waf.RunSimple(ctx, + addresses.NewAddressesBuilder(). + WithResponseBody(body). + Build(), + monitorResponseBodyErrorLog, + ) +} + +// Return the map of parsed cookies if any and following the specification of +// the rule address `server.request.cookies`. +func makeCookies(parsed []*http.Cookie) map[string][]string { + if len(parsed) == 0 { + return nil + } + cookies := make(map[string][]string, len(parsed)) + for _, c := range parsed { + cookies[c.Name] = append(cookies[c.Name], c.Value) + } + return cookies +} + +// RouteMatched can be called if BeforeHandle is started too early in the http request lifecycle like +// before the router has matched the request to a route. This can happen when the HTTP handler is wrapped +// using http.NewServeMux instead of http.WrapHandler. In this case the route is empty and so are the path parameters. +// In this case the route and path parameters will be filled in later by calling RouteMatched with the actual route. +// If RouteMatched returns an error, the request should be considered blocked and the error should be reported. +func RouteMatched(ctx context.Context, route string, routeParams map[string]string) error { + op, ok := dyngo.FindOperation[HandlerOperation](ctx) + if !ok { + log.Debug("appsec: RouteMatched called without an active HandlerOperation in the context, ignoring") + telemetrylog.With(telemetry.WithTags([]string{"product:appsec"})). + Warn("appsec: RouteMatched called without an active HandlerOperation in the context, ignoring") + return nil + } + + // Overwrite the previous route that was created using a quantization algorithm + op.route = route + + var err error + dyngo.OnData(op, func(e *events.BlockingSecurityEvent) { + err = e + }) + + // Call the WAF with this new data + op.Run(op, addresses.NewAddressesBuilder(). + WithPathParams(routeParams). + Build(), + ) + + return err +} + +// BeforeHandle contains the appsec functionality that should be executed before a http.Handler runs. +// It returns the modified http.ResponseWriter and http.Request, an additional afterHandle function +// that should be executed after the Handler runs, and a handled bool that instructs if the request has been handled +// or not - in case it was handled, the original handler should not run. +func BeforeHandle( + w http.ResponseWriter, + r *http.Request, + span trace.TagSetter, + opts *Config, +) (http.ResponseWriter, *http.Request, func(), bool) { + if opts == nil { + opts = defaultWrapHandlerConfig + } + if opts.ResponseHeaderCopier == nil { + opts.ResponseHeaderCopier = defaultWrapHandlerConfig.ResponseHeaderCopier + } + + op, blockAtomic, ctx := StartOperation(r.Context(), HandlerOperationArgs{ + Framework: opts.Framework, + Method: r.Method, + RequestURI: r.RequestURI, + RequestRoute: opts.Route, + Host: r.Host, + RemoteAddr: r.RemoteAddr, + Headers: r.Header, + Cookies: makeCookies(r.Cookies()), + QueryParams: r.URL.Query(), + PathParams: opts.RouteParams, + }, span) + tr := r.WithContext(ctx) + + afterHandle := func() { + var statusCode int + if res, ok := w.(interface{ Status() int }); ok { + statusCode = res.Status() + } + op.Finish(HandlerOperationRes{ + Headers: opts.ResponseHeaderCopier(w), + StatusCode: statusCode, + }) + + // Execute the onBlock functions to make sure blocking works properly + // in case we are instrumenting the Gin framework + if blockPtr := blockAtomic.Load(); blockPtr != nil { + for _, f := range opts.OnBlock { + f() + } + + if blockPtr.Handler != nil { + blockPtr.Handler.ServeHTTP(w, tr) + } + } + } + + handled := false + if blockPtr := blockAtomic.Load(); blockPtr != nil && blockPtr.Handler != nil { + // handler is replaced + blockPtr.Handler.ServeHTTP(w, tr) + blockPtr.Handler = nil + handled = true + } + + // We register a handler for cases that would require us to write the blocking response before any more code + // from a specific framework (like Gin) is executed that would write another (wrong) response here. + dyngo.OnData(op, func(e EarlyBlock) { + if blockPtr := blockAtomic.Load(); blockPtr != nil && blockPtr.Handler != nil { + blockPtr.Handler.ServeHTTP(w, tr) + blockPtr.Handler = nil + } + }) + + return w, tr, afterHandle, handled +} + +// WrapHandler wraps the given HTTP handler with the abstract HTTP operation defined by HandlerOperationArgs and +// HandlerOperationRes. +// The onBlock params are used to cleanup the context when needed. +// It is a specific patch meant for Gin, for which we must abort the +// context since it uses a queue of handlers and it's the only way to make +// sure other queued handlers don't get executed. +// TODO: this patch must be removed/improved when we rework our actions/operations system +func WrapHandler(handler http.Handler, span trace.TagSetter, opts *Config) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + tw, tr, afterHandle, handled := BeforeHandle(w, r, span, opts) + defer afterHandle() + if handled { + return + } + + handler.ServeHTTP(tw, tr) + }) +} diff --git a/instrumentation/appsec/emitter/httpsec/roundtripper.go b/instrumentation/appsec/emitter/httpsec/roundtripper.go new file mode 100644 index 0000000000..a04908d012 --- /dev/null +++ b/instrumentation/appsec/emitter/httpsec/roundtripper.go @@ -0,0 +1,109 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httpsec + +import ( + "context" + "io" + "net/http" + "sync" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +var badInputContextOnce sync.Once + +type ( + RoundTripOperation struct { + dyngo.Operation + HandlerOp *HandlerOperation + + analyseBody bool + } + + // RoundTripOperationArgs is the round trip operation arguments. + RoundTripOperationArgs struct { + // URL corresponds to the address `server.io.net.url`. + URL string + Method string + Headers map[string][]string + Body *io.ReadCloser + } + + // RoundTripOperationRes is the round trip operation results. + RoundTripOperationRes struct { + StatusCode int + Headers map[string][]string + Body *io.ReadCloser + } +) + +func (r *RoundTripOperation) SetAnalyseBody() { + r.analyseBody = true +} + +func (r *RoundTripOperation) AnalyseBody() bool { + return r.analyseBody +} + +func (RoundTripOperationArgs) IsArgOf(*RoundTripOperation) {} +func (RoundTripOperationRes) IsResultOf(*RoundTripOperation) {} + +// ProtectRoundTrip starts a round trip operation in the given context. +// If the context does not contain a parent operation, it returns nil. +// If the request is blocked by the WAF, it returns a [events.BlockingSecurityEvent] error. +// The returned function must be called before the span is finished, with the response and error of the round trip. +// If an error is returned, the returned function must not be called. +func ProtectRoundTrip(ctx context.Context, req *http.Request) (func(*http.Response), error) { + opArgs := RoundTripOperationArgs{ + URL: req.URL.String(), + Method: req.Method, + Headers: req.Header, + Body: &req.Body, + } + + handlerOp, ok := dyngo.FindOperation[HandlerOperation](ctx) + if !ok { // No parent operation => we can't monitor the request + badInputContextOnce.Do(func() { + log.Debug("appsec: outgoing http request monitoring ignored: could not find the handler " + + "instrumentation metadata in the request context: the request handler is not being monitored by a " + + "middleware function or the incoming request context has not be forwarded correctly to the roundtripper") + }) + return nil, nil + } + + op := &RoundTripOperation{ + Operation: dyngo.NewOperation(handlerOp), + HandlerOp: handlerOp, + } + + var err *events.BlockingSecurityEvent + // TODO: move the data listener as a setup function of httpsec.StartRoundTripperOperation(ars, ) + dyngo.OnData(op, func(e *events.BlockingSecurityEvent) { + err = e + }) + + dyngo.StartOperation(op, opArgs) + + if err != nil { + log.Debug("appsec: outgoing http request blocked by the WAF on URL: %s", req.URL.String()) + return nil, err + } + + return func(response *http.Response) { + var resArgs RoundTripOperationRes + if response != nil { + resArgs = RoundTripOperationRes{ + StatusCode: response.StatusCode, + Headers: response.Header, + Body: &response.Body, + } + } + dyngo.FinishOperation(op, resArgs) + }, nil +} diff --git a/internal/appsec/emitter/ossec/lfi.go b/instrumentation/appsec/emitter/ossec/lfi.go similarity index 94% rename from internal/appsec/emitter/ossec/lfi.go rename to instrumentation/appsec/emitter/ossec/lfi.go index b769d4c40b..555fd73a6f 100644 --- a/internal/appsec/emitter/ossec/lfi.go +++ b/instrumentation/appsec/emitter/ossec/lfi.go @@ -8,7 +8,7 @@ package ossec import ( "io/fs" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" ) type ( diff --git a/internal/appsec/emitter/sqlsec/sql.go b/instrumentation/appsec/emitter/sqlsec/sql.go similarity index 91% rename from internal/appsec/emitter/sqlsec/sql.go rename to instrumentation/appsec/emitter/sqlsec/sql.go index 1c888d9f85..3b1db53068 100644 --- a/internal/appsec/emitter/sqlsec/sql.go +++ b/instrumentation/appsec/emitter/sqlsec/sql.go @@ -9,9 +9,9 @@ import ( "context" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) var badInputContextOnce sync.Once diff --git a/internal/appsec/emitter/waf/actions/actions.go b/instrumentation/appsec/emitter/waf/actions/actions.go similarity index 68% rename from internal/appsec/emitter/waf/actions/actions.go rename to instrumentation/appsec/emitter/waf/actions/actions.go index 4eabcfaff6..dc83f705fe 100644 --- a/internal/appsec/emitter/waf/actions/actions.go +++ b/instrumentation/appsec/emitter/waf/actions/actions.go @@ -6,8 +6,12 @@ package actions import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "fmt" + "log/slog" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" ) type ( @@ -34,18 +38,22 @@ func registerActionHandler(aType string, handler actionHandler) { // SendActionEvents sends the relevant actions to the operation's data listener. // It returns true if at least one of those actions require interrupting the request handler // When SDKError is not nil, this error is sent to the op with EmitData so that the invoked SDK can return it -func SendActionEvents(op dyngo.Operation, actions map[string]any) { +// returns whenever the request should be interrupted +func SendActionEvents(op dyngo.Operation, actions map[string]any) bool { + var blocked bool for aType, params := range actions { - log.Debug("appsec: processing %s action with params %v", aType, params) + log.Debug("appsec: processing %q action with params %v", aType, params) //nolint:gocritic params, ok := params.(map[string]any) if !ok { - log.Debug("appsec: could not cast action params to map[string]any from %T", params) + telemetrylog.Error("appsec: could not cast action params to map[string]any", slog.String("actual_type", fmt.Sprintf("%T", params))) continue } + blocked = blocked || aType == "block_request" + actionHandler, ok := actionHandlers[aType] if !ok { - log.Debug("appsec: unknown action type `%s`", aType) + telemetrylog.Error("appsec: unknown action type", slog.String("action_type", aType)) continue } @@ -53,4 +61,6 @@ func SendActionEvents(op dyngo.Operation, actions map[string]any) { a.EmitData(op) } } + + return blocked } diff --git a/internal/appsec/emitter/waf/actions/actions_test.go b/instrumentation/appsec/emitter/waf/actions/actions_test.go similarity index 100% rename from internal/appsec/emitter/waf/actions/actions_test.go rename to instrumentation/appsec/emitter/waf/actions/actions_test.go diff --git a/internal/appsec/emitter/waf/actions/block.go b/instrumentation/appsec/emitter/waf/actions/block.go similarity index 91% rename from internal/appsec/emitter/waf/actions/block.go rename to instrumentation/appsec/emitter/waf/actions/block.go index ae802b60bd..43ad2714c5 100644 --- a/internal/appsec/emitter/waf/actions/block.go +++ b/instrumentation/appsec/emitter/waf/actions/block.go @@ -11,11 +11,12 @@ import ( "os" "strings" - "github.com/mitchellh/mapstructure" + "github.com/go-viper/mapstructure/v2" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // blockedTemplateJSON is the default JSON template used to write responses for blocked requests @@ -34,10 +35,10 @@ const ( ) func init() { - for env, template := range map[string]*[]byte{envBlockedTemplateJSON: &blockedTemplateJSON, envBlockedTemplateHTML: &blockedTemplateHTML} { - if path, ok := os.LookupEnv(env); ok { + for key, template := range map[string]*[]byte{envBlockedTemplateJSON: &blockedTemplateJSON, envBlockedTemplateHTML: &blockedTemplateHTML} { + if path, ok := env.Lookup(key); ok { if t, err := os.ReadFile(path); err != nil { - log.Error("Could not read template at %s: %v", path, err) + log.Error("Could not read template at %q: %v", path, err.Error()) } else { *template = t } diff --git a/internal/appsec/emitter/waf/actions/blocked-template.html b/instrumentation/appsec/emitter/waf/actions/blocked-template.html similarity index 100% rename from internal/appsec/emitter/waf/actions/blocked-template.html rename to instrumentation/appsec/emitter/waf/actions/blocked-template.html diff --git a/internal/appsec/emitter/waf/actions/blocked-template.json b/instrumentation/appsec/emitter/waf/actions/blocked-template.json similarity index 100% rename from internal/appsec/emitter/waf/actions/blocked-template.json rename to instrumentation/appsec/emitter/waf/actions/blocked-template.json diff --git a/internal/appsec/emitter/waf/actions/http_redirect.go b/instrumentation/appsec/emitter/waf/actions/http_redirect.go similarity index 94% rename from internal/appsec/emitter/waf/actions/http_redirect.go rename to instrumentation/appsec/emitter/waf/actions/http_redirect.go index 3cdca4c818..562bc31ad6 100644 --- a/internal/appsec/emitter/waf/actions/http_redirect.go +++ b/instrumentation/appsec/emitter/waf/actions/http_redirect.go @@ -8,9 +8,9 @@ package actions import ( "net/http" - "github.com/mitchellh/mapstructure" + "github.com/go-viper/mapstructure/v2" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // redirectActionParams are the dynamic parameters to be provided to a "redirect_request" diff --git a/internal/appsec/emitter/waf/actions/stacktrace.go b/instrumentation/appsec/emitter/waf/actions/stacktrace.go similarity index 85% rename from internal/appsec/emitter/waf/actions/stacktrace.go rename to instrumentation/appsec/emitter/waf/actions/stacktrace.go index 47b4dd6078..9ddd07cf3e 100644 --- a/internal/appsec/emitter/waf/actions/stacktrace.go +++ b/instrumentation/appsec/emitter/waf/actions/stacktrace.go @@ -6,9 +6,9 @@ package actions import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace" ) func init() { diff --git a/internal/appsec/emitter/waf/addresses/addresses.go b/instrumentation/appsec/emitter/waf/addresses/addresses.go similarity index 74% rename from internal/appsec/emitter/waf/addresses/addresses.go rename to instrumentation/appsec/emitter/waf/addresses/addresses.go index 03163df23a..9e166a1e1a 100644 --- a/internal/appsec/emitter/waf/addresses/addresses.go +++ b/instrumentation/appsec/emitter/waf/addresses/addresses.go @@ -13,20 +13,31 @@ const ( ServerRequestQueryAddr = "server.request.query" ServerRequestPathParamsAddr = "server.request.path_params" ServerRequestBodyAddr = "server.request.body" + ServerResponseBodyAddr = "server.response.body" ServerResponseStatusAddr = "server.response.status" ServerResponseHeadersNoCookiesAddr = "server.response.headers.no_cookies" ClientIPAddr = "http.client_ip" UserIDAddr = "usr.id" + UserLoginAddr = "usr.login" + UserOrgAddr = "usr.org" UserSessionIDAddr = "usr.session_id" UserLoginSuccessAddr = "server.business_logic.users.login.success" UserLoginFailureAddr = "server.business_logic.users.login.failure" - ServerIoNetURLAddr = "server.io.net.url" + ServerIONetRequestHeadersAddr = "server.io.net.request.headers" + ServerIONetRequestMethodAddr = "server.io.net.request.method" + ServerIONetRequestBodyAddr = "server.io.net.request.body" + ServerIONetResponseStatusAddr = "server.io.net.response.status" + ServerIONetResponseHeadersAddr = "server.io.net.response.headers" + ServerIONetResponseBodyAddr = "server.io.net.response.body" + + ServerIONetURLAddr = "server.io.net.url" ServerIOFSFileAddr = "server.io.fs.file" ServerDBStatementAddr = "server.db.statement" ServerDBTypeAddr = "server.db.system" + ServerSysExecCmd = "server.sys.exec.cmd" GRPCServerMethodAddr = "grpc.server.method" GRPCServerRequestMetadataAddr = "grpc.server.request.metadata" diff --git a/internal/appsec/emitter/waf/addresses/builder.go b/instrumentation/appsec/emitter/waf/addresses/builder.go similarity index 65% rename from internal/appsec/emitter/waf/addresses/builder.go rename to instrumentation/appsec/emitter/waf/addresses/builder.go index 946a62bcf9..14bbe65356 100644 --- a/internal/appsec/emitter/waf/addresses/builder.go +++ b/instrumentation/appsec/emitter/waf/addresses/builder.go @@ -9,20 +9,21 @@ import ( "net/netip" "strconv" - waf "github.com/DataDog/go-libddwaf/v3" + "github.com/DataDog/go-libddwaf/v4" ) const contextProcessKey = "waf.context.processor" type RunAddressDataBuilder struct { - waf.RunAddressData + libddwaf.RunAddressData } func NewAddressesBuilder() *RunAddressDataBuilder { return &RunAddressDataBuilder{ - RunAddressData: waf.RunAddressData{ + RunAddressData: libddwaf.RunAddressData{ Persistent: make(map[string]any, 1), Ephemeral: make(map[string]any, 1), + TimerKey: WAFScope, // Default value for TimerKey }, } } @@ -47,7 +48,7 @@ func (b *RunAddressDataBuilder) WithHeadersNoCookies(headers map[string][]string func (b *RunAddressDataBuilder) WithCookies(cookies map[string][]string) *RunAddressDataBuilder { if len(cookies) == 0 { - cookies = nil + return b } b.Persistent[ServerRequestCookiesAddr] = cookies return b @@ -77,6 +78,14 @@ func (b *RunAddressDataBuilder) WithRequestBody(body any) *RunAddressDataBuilder return b } +func (b *RunAddressDataBuilder) WithResponseBody(body any) *RunAddressDataBuilder { + if body == nil { + return b + } + b.Persistent[ServerResponseBodyAddr] = body + return b +} + func (b *RunAddressDataBuilder) WithResponseStatus(status int) *RunAddressDataBuilder { if status == 0 { return b @@ -109,6 +118,22 @@ func (b *RunAddressDataBuilder) WithUserID(id string) *RunAddressDataBuilder { return b } +func (b *RunAddressDataBuilder) WithUserLogin(login string) *RunAddressDataBuilder { + if login == "" { + return b + } + b.Persistent[UserLoginAddr] = login + return b +} + +func (b *RunAddressDataBuilder) WithUserOrg(org string) *RunAddressDataBuilder { + if org == "" { + return b + } + b.Persistent[UserOrgAddr] = org + return b +} + func (b *RunAddressDataBuilder) WithUserSessionID(id string) *RunAddressDataBuilder { if id == "" { return b @@ -133,16 +158,69 @@ func (b *RunAddressDataBuilder) WithFilePath(file string) *RunAddressDataBuilder return b } b.Ephemeral[ServerIOFSFileAddr] = file - b.Scope = waf.RASPScope + b.TimerKey = RASPScope + return b +} + +func (b *RunAddressDataBuilder) WithDownwardMethod(method string) *RunAddressDataBuilder { + if method == "" { + return b + } + b.Ephemeral[ServerIONetRequestMethodAddr] = method + b.TimerKey = RASPScope + return b +} + +func (b *RunAddressDataBuilder) WithDownwardRequestHeaders(headers map[string][]string) *RunAddressDataBuilder { + if len(headers) == 0 { + return b + } + b.Ephemeral[ServerIONetRequestHeadersAddr] = headers + b.TimerKey = RASPScope return b } -func (b *RunAddressDataBuilder) WithURL(url string) *RunAddressDataBuilder { +func (b *RunAddressDataBuilder) WithDownwardURL(url string) *RunAddressDataBuilder { if url == "" { return b } - b.Ephemeral[ServerIoNetURLAddr] = url - b.Scope = waf.RASPScope + b.Ephemeral[ServerIONetURLAddr] = url + b.TimerKey = RASPScope + return b +} + +func (b *RunAddressDataBuilder) WithDownwardRequestBody(body any) *RunAddressDataBuilder { + if body == nil { + return b + } + b.Ephemeral[ServerIONetRequestBodyAddr] = body + return b +} + +func (b *RunAddressDataBuilder) WithDownwardResponseStatus(status int) *RunAddressDataBuilder { + if status == 0 { + return b + } + b.Ephemeral[ServerIONetResponseStatusAddr] = strconv.Itoa(status) + b.TimerKey = RASPScope + return b +} + +func (b *RunAddressDataBuilder) WithDownwardResponseHeaders(headers map[string][]string) *RunAddressDataBuilder { + if len(headers) == 0 { + return b + } + b.Ephemeral[ServerIONetResponseHeadersAddr] = headers + b.TimerKey = RASPScope + return b +} + +func (b *RunAddressDataBuilder) WithDownwardResponseBody(body any) *RunAddressDataBuilder { + if body == nil { + return b + } + b.Ephemeral[ServerIONetResponseBodyAddr] = body + b.TimerKey = RASPScope return b } @@ -151,7 +229,7 @@ func (b *RunAddressDataBuilder) WithDBStatement(statement string) *RunAddressDat return b } b.Ephemeral[ServerDBStatementAddr] = statement - b.Scope = waf.RASPScope + b.TimerKey = RASPScope return b } @@ -160,7 +238,16 @@ func (b *RunAddressDataBuilder) WithDBType(driver string) *RunAddressDataBuilder return b } b.Ephemeral[ServerDBTypeAddr] = driver - b.Scope = waf.RASPScope + b.TimerKey = RASPScope + return b +} + +func (b *RunAddressDataBuilder) WithSysExecCmd(cmd []string) *RunAddressDataBuilder { + if len(cmd) == 0 { + return b + } + b.Ephemeral[ServerSysExecCmd] = cmd + b.TimerKey = RASPScope return b } @@ -222,7 +309,7 @@ func (b *RunAddressDataBuilder) WithGRPCResponseStatusCode(status int) *RunAddre func (b *RunAddressDataBuilder) WithGraphQLResolver(fieldName string, args map[string]any) *RunAddressDataBuilder { if _, ok := b.Ephemeral[GraphQLServerResolverAddr]; !ok { - b.Ephemeral[GraphQLServerResolverAddr] = map[string]any{} + b.Ephemeral[GraphQLServerResolverAddr] = make(map[string]any, 1) } b.Ephemeral[GraphQLServerResolverAddr].(map[string]any)[fieldName] = args @@ -231,13 +318,22 @@ func (b *RunAddressDataBuilder) WithGraphQLResolver(fieldName string, args map[s func (b *RunAddressDataBuilder) ExtractSchema() *RunAddressDataBuilder { if _, ok := b.Persistent[contextProcessKey]; !ok { - b.Persistent[contextProcessKey] = map[string]bool{} + b.Persistent[contextProcessKey] = make(map[string]bool, 1) } b.Persistent[contextProcessKey].(map[string]bool)["extract-schema"] = true return b } -func (b *RunAddressDataBuilder) Build() waf.RunAddressData { +func (b *RunAddressDataBuilder) NoExtractSchema() *RunAddressDataBuilder { + if _, ok := b.Persistent[contextProcessKey]; !ok { + b.Persistent[contextProcessKey] = make(map[string]bool, 1) + } + + b.Persistent[contextProcessKey].(map[string]bool)["extract-schema"] = false + return b +} + +func (b *RunAddressDataBuilder) Build() libddwaf.RunAddressData { return b.RunAddressData } diff --git a/instrumentation/appsec/emitter/waf/addresses/rasp_rule_type.go b/instrumentation/appsec/emitter/waf/addresses/rasp_rule_type.go new file mode 100644 index 0000000000..3b98dc74b5 --- /dev/null +++ b/instrumentation/appsec/emitter/waf/addresses/rasp_rule_type.go @@ -0,0 +1,68 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package addresses + +import ( + "math" + + "github.com/DataDog/go-libddwaf/v4" +) + +type RASPRuleType uint8 + +const ( + RASPRuleTypeLFI RASPRuleType = iota + RASPRuleTypeSSRFRequest + RASPRuleTypeSSRFResponse + RASPRuleTypeSQLI + RASPRuleTypeCMDI +) + +var RASPRuleTypes = [...]RASPRuleType{ + RASPRuleTypeLFI, + RASPRuleTypeSSRFRequest, + RASPRuleTypeSSRFResponse, + RASPRuleTypeSQLI, + RASPRuleTypeCMDI, +} + +func (r RASPRuleType) String() string { + switch r { + case RASPRuleTypeLFI: + return "lfi" + case RASPRuleTypeSSRFRequest, RASPRuleTypeSSRFResponse: + return "ssrf" + case RASPRuleTypeSQLI: + return "sql_injection" + case RASPRuleTypeCMDI: + return "command_injection" + } + return "unknown()" +} + +// RASPRuleTypeFromAddressSet returns the RASPRuleType for the given address set if it has a RASP address. +func RASPRuleTypeFromAddressSet(addressSet libddwaf.RunAddressData) (RASPRuleType, bool) { + if addressSet.TimerKey != RASPScope { + return math.MaxUint8, false + } + + for address := range addressSet.Ephemeral { + switch address { + case ServerIOFSFileAddr: + return RASPRuleTypeLFI, true + case ServerIONetURLAddr: + return RASPRuleTypeSSRFRequest, true + case ServerIONetResponseStatusAddr: + return RASPRuleTypeSSRFResponse, true + case ServerDBStatementAddr, ServerDBTypeAddr: + return RASPRuleTypeSQLI, true + case ServerSysExecCmd: + return RASPRuleTypeCMDI, true + } + } + + return math.MaxUint8, false +} diff --git a/instrumentation/appsec/emitter/waf/addresses/scope.go b/instrumentation/appsec/emitter/waf/addresses/scope.go new file mode 100644 index 0000000000..8c3198163a --- /dev/null +++ b/instrumentation/appsec/emitter/waf/addresses/scope.go @@ -0,0 +1,25 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package addresses + +import ( + "github.com/DataDog/go-libddwaf/v4/timer" +) + +// Scope is used to divide the time spend in go-libddwaf between multiple parts. These scopes are then fed into +// [liddwaf.RunAddressData.TimerKey] to decide where to store the time spent in the WAF. +// Time which is then added to [libddwaf.Context.Timer]. +type Scope = timer.Key + +const ( + RASPScope Scope = "rasp" + WAFScope Scope = "waf" +) + +var Scopes = [...]Scope{ + RASPScope, + WAFScope, +} diff --git a/instrumentation/appsec/proxy/body_buffer.go b/instrumentation/appsec/proxy/body_buffer.go new file mode 100644 index 0000000000..33e252fe6a --- /dev/null +++ b/instrumentation/appsec/proxy/body_buffer.go @@ -0,0 +1,44 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package proxy + +// bodyBuffer manages the buffering of request/response bodies with size limits +type bodyBuffer struct { + buffer []byte + sizeLimit int + truncated bool + analyzed bool +} + +// newBodyBuffer creates a new bodyBuffer with the specified size limit +func newBodyBuffer(sizeLimit int) *bodyBuffer { + return &bodyBuffer{ + sizeLimit: sizeLimit, + truncated: false, + } +} + +// append adds a chunk of data to the buffer, respecting the size limit +func (b *bodyBuffer) append(chunk []byte) { + if b.truncated || len(chunk) == 0 { + return + } + + currentSize := len(b.buffer) + remainingCapacity := b.sizeLimit - currentSize + + bytesToAdd := len(chunk) + if bytesToAdd > remainingCapacity { + bytesToAdd = remainingCapacity + b.truncated = true + } + + if b.buffer == nil { + b.buffer = make([]byte, 0, bytesToAdd) + } + + b.buffer = append(b.buffer, chunk[:bytesToAdd]...) +} diff --git a/instrumentation/appsec/proxy/config.go b/instrumentation/appsec/proxy/config.go new file mode 100644 index 0000000000..0f2249a21e --- /dev/null +++ b/instrumentation/appsec/proxy/config.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package proxy + +import ( + "context" +) + +const ( + // DefaultBodyParsingSizeLimit is the default number of bytes parsed for body analysis. + DefaultBodyParsingSizeLimit = 10 * 1 << 20 // 10MB +) + +// ContinueActionOptions contains options for the continue action created through [ProcessorConfig.ContinueMessageFunc]. +type ContinueActionOptions struct { + // HeaderMutations are the HTTP header mutations to be applied to the message (default is empty) + HeaderMutations map[string][]string + // Body indicates whether the body should be requested from the proxy to the external processing service (default is false) + Body bool + // MessageType indicates when the response is being created + MessageType MessageType +} + +// BlockActionOptions contains options for the block action created through [ProcessorConfig.BlockMessageFunc]. +type BlockActionOptions struct { + // StatusCode is the HTTP status code to be used in the block response, default is 403 + StatusCode int + // Headers are the HTTP headers to be included in the block response, MUST contain at least "Content-Type" + // if a Body is provided (default is empty) + Headers map[string][]string + // Body is the HTTP body to be included in the block response (default is empty) + Body []byte +} + +// ProcessorConfig contains configuration for the message processor +type ProcessorConfig struct { + context.Context + BlockingUnavailable bool + BodyParsingSizeLimit *int + Framework string + + // ContinueMessageFunc is a function that generates a continue message of type O based on the provided ContinueActionOptions. + ContinueMessageFunc func(context.Context, ContinueActionOptions) error + + // BlockMessageFunc is a function that generates a block message of type O based on the provided status code, headers, and body. + BlockMessageFunc func(context.Context, BlockActionOptions) error +} diff --git a/instrumentation/appsec/proxy/fakehttp.go b/instrumentation/appsec/proxy/fakehttp.go new file mode 100644 index 0000000000..c49ed3b216 --- /dev/null +++ b/instrumentation/appsec/proxy/fakehttp.go @@ -0,0 +1,143 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package proxy + +import ( + "context" + "crypto/tls" + "errors" + "fmt" + "net/http" + "net/url" + "strings" + "sync" +) + +// PseudoRequest represents the pseudo headers of an HTTP request. +type PseudoRequest struct { + Scheme string + Authority string + Path string + Method string + RemoteAddr string + Headers map[string][]string +} + +func (pr PseudoRequest) toNetHTTP(ctx context.Context) (*http.Request, error) { + parsedURL, err := urlParse(pr.Scheme, pr.Authority, pr.Path) + if err != nil { + return nil, err + } + + var tlsState *tls.ConnectionState + if pr.Scheme == "https" { + tlsState = &tls.ConnectionState{} + } + + return (&http.Request{ + Method: pr.Method, + Host: pr.Authority, + RequestURI: pr.Path, + URL: parsedURL, + Header: pr.Headers, + RemoteAddr: pr.RemoteAddr, + TLS: tlsState, + }).WithContext(ctx), nil +} + +func urlParse(scheme, authority, rest string) (*url.URL, error) { + var escapeErr url.EscapeError + + // Parse the URL from the scheme, authority and path + parsedURL, err := url.Parse(fmt.Sprintf("%s://%s%s", scheme, authority, rest)) + for i := 0; i < 5 && errors.As(err, &escapeErr); i++ { + // If an unknown escape sequence is found, we try to escape the path again by adding a % in front + i := strings.Index(rest, string(escapeErr)) // This is to trigger the escape error + if i < 0 { + return nil, fmt.Errorf("error parsing URL: %w", err) + } + + rest = rest[:i] + "%25" + rest[i+1:] + parsedURL, err = url.Parse(fmt.Sprintf("%s://%s%s", scheme, authority, rest)) + } + + if err != nil { + return nil, fmt.Errorf( + "error building envoy URI from scheme %q, from host %q and from path %q: %w", + scheme, + authority, + rest, + err) + } + return parsedURL, nil +} + +// PseudoResponse represents the pseudo headers of an HTTP response. +type PseudoResponse struct { + StatusCode int + Headers map[string][]string +} + +func (pr PseudoResponse) toNetHTTP(rw http.ResponseWriter) { + for k, v := range pr.Headers { + for _, vv := range v { + rw.Header().Add(k, vv) + } + } + + rw.WriteHeader(pr.StatusCode) +} + +type fakeResponseWriter struct { + mu sync.Mutex + status int + body []byte + headers http.Header +} + +// Reset resets the fakeResponseWriter to its initial state +func (w *fakeResponseWriter) Reset() { + w.mu.Lock() + defer w.mu.Unlock() + w.status = 0 + w.body = nil + w.headers = make(http.Header) +} + +// Status is not in the [http.ResponseWriter] interface, but it is cast into it by the tracing code +func (w *fakeResponseWriter) Status() int { + w.mu.Lock() + defer w.mu.Unlock() + return w.status +} + +func (w *fakeResponseWriter) WriteHeader(status int) { + w.mu.Lock() + defer w.mu.Unlock() + w.status = status +} + +func (w *fakeResponseWriter) Header() http.Header { + w.mu.Lock() + defer w.mu.Unlock() + return w.headers +} + +func (w *fakeResponseWriter) Write(b []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + w.body = append(w.body, b...) + return len(b), nil +} + +var _ http.ResponseWriter = &fakeResponseWriter{} + +// newFakeResponseWriter creates a new fakeResponseWriter that can be used to store the response a [http.Handler] made +func newFakeResponseWriter() *fakeResponseWriter { + return &fakeResponseWriter{ + headers: make(http.Header), + } +} diff --git a/instrumentation/appsec/proxy/interfaces.go b/instrumentation/appsec/proxy/interfaces.go new file mode 100644 index 0000000000..eb2cb20079 --- /dev/null +++ b/instrumentation/appsec/proxy/interfaces.go @@ -0,0 +1,96 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package proxy + +import ( + "context" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +type InputMessage interface { + GetEndOfStream() bool + MessageType() MessageType +} + +// RequestHeaders is an interface for accessing request headers used by the message processor. +type RequestHeaders interface { + InputMessage + + // ExtractRequest extracts the pseudo headers and other relevant information from the request. + ExtractRequest(context.Context) (PseudoRequest, error) + + // SpanOptions returns additional options to use when starting the span for this request. + SpanOptions(context.Context) []tracer.StartSpanOption + + // BodyParsingSizeLimit returns the default value for body processing based on the request. + BodyParsingSizeLimit(ctx context.Context) int +} + +// HTTPBody is an interface for accessing the body of an HTTP message used by the message processor. +// Whenever request or response body. It can be only a fraction of the full body. and multiple of these messages can be sent. +type HTTPBody interface { + InputMessage + GetBody() []byte +} + +// ResponseHeaders is an interface for accessing response headers used by the message processor. +type ResponseHeaders interface { + InputMessage + + // ExtractResponse extracts the response headers and other relevant information from the response. + ExtractResponse() (PseudoResponse, error) +} + +// MessageType defines the type of message being processed. +type MessageType int + +const ( + _ MessageType = iota + MessageTypeRequestHeaders + MessageTypeRequestBody + MessageTypeRequestTrailers + MessageTypeResponseHeaders + MessageTypeResponseBody + MessageTypeResponseTrailers + MessageTypeBlocked + MessageTypeFinished +) + +func (mt MessageType) Ongoing() bool { + return mt != MessageTypeFinished && mt != MessageTypeBlocked && mt != 0 +} + +func (mt MessageType) Request() bool { + return mt == MessageTypeRequestHeaders || mt == MessageTypeRequestBody || mt == MessageTypeRequestTrailers +} + +func (mt MessageType) Response() bool { + return mt == MessageTypeResponseHeaders || mt == MessageTypeResponseBody || mt == MessageTypeResponseTrailers +} + +func (mt MessageType) String() string { + switch mt { + case MessageTypeRequestHeaders: + return "" + case MessageTypeRequestBody: + return "" + case MessageTypeRequestTrailers: + return "" + case MessageTypeResponseHeaders: + return "" + case MessageTypeResponseBody: + return "" + case MessageTypeResponseTrailers: + return "" + case MessageTypeBlocked: + return "" + case MessageTypeFinished: + return "" + default: + return "" + } +} diff --git a/instrumentation/appsec/proxy/message_processor.go b/instrumentation/appsec/proxy/message_processor.go new file mode 100644 index 0000000000..05c71f8daf --- /dev/null +++ b/instrumentation/appsec/proxy/message_processor.go @@ -0,0 +1,290 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package proxy + +import ( + "context" + "errors" + "fmt" + "io" + "sync" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/actions" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/body" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/body/json" +) + +// Processor is a state machine that handles incoming HTTP request and response is a streaming manner +// made for proxy external processing streaming protocols like Envoy's External Processing or HAProxy's SPOP +type Processor struct { + ProcessorConfig + instr *instrumentation.Instrumentation + + metrics *metrics + done context.CancelFunc + firstRequest sync.Once + computedBodyParsingSizeLimit atomic.Int64 +} + +// NewProcessor creates a new [Processor] instance with the given configuration and instrumentation +// It also initializes the metrics reporter and a context cancellation function +func NewProcessor(config ProcessorConfig, instr *instrumentation.Instrumentation) Processor { + if config.Context == nil { + config.Context = context.Background() + } + var done context.CancelFunc + config.Context, done = context.WithCancel(config.Context) + return Processor{ + ProcessorConfig: config, + instr: instr, + metrics: newMetricsReporter(config.Context, instr.Logger()), + done: done, + } +} + +// OnRequestHeaders handles incoming request headers using the [RequestHeaders] interface +// It returns a [RequestState] to be used in subsequent calls for the same request/response cycle +// along with an optional output message of type O created by either [ProcessorConfig.ContinueMessageFunc] or [ProcessorConfig.BlockMessageFunc] +// If the request is blocked or the message ends the stream, it returns io.EOF as error +func (mp *Processor) OnRequestHeaders(ctx context.Context, req RequestHeaders) (reqState RequestState, err error) { + mp.metrics.incrementRequestCount() + pseudoRequest, err := req.ExtractRequest(ctx) + if err != nil { + return reqState, fmt.Errorf("error extracting request header from input message: %w", err) + } + + httpRequest, err := pseudoRequest.toNetHTTP(ctx) + if err != nil { + return reqState, fmt.Errorf("error converting to net/http request: %w", err) + } + + mp.firstRequest.Do(func() { + var bodyLimit int64 + if mp.BodyParsingSizeLimit != nil { + bodyLimit = int64(*mp.BodyParsingSizeLimit) + } else { + bodyLimit = int64(req.BodyParsingSizeLimit(ctx)) + } + mp.computedBodyParsingSizeLimit.Store(bodyLimit) + + if bodyLimit <= 0 { + mp.instr.Logger().Info("external_processing: body parsing size limit set to 0 or negative. The request and response bodies will NOT be analyzed.") + } + RegisterConfig(mp) + mp.instr.Logger().Info("external_processing: first request received. Configuration: BlockingUnavailable=%v, BodyParsingSizeLimit=%dB, Framework=%s", mp.BlockingUnavailable, mp.computedBodyParsingSizeLimit.Load(), mp.Framework) + }) + + reqState, blocked := newRequestState( + httpRequest, + int(mp.computedBodyParsingSizeLimit.Load()), + mp.Framework, + req.SpanOptions(ctx)..., + ) + + defer func() { + if err != nil { + reqState.Close() + } + }() + + if !mp.BlockingUnavailable && blocked { + actionOpts := reqState.BlockAction() + if err := mp.BlockMessageFunc(reqState.Context, actionOpts); err != nil { + return reqState, fmt.Errorf("error creating block message: %w", err) + } + return reqState, io.EOF + } + + headerMutation, err := reqState.PropagationHeaders() + if err != nil { + return reqState, err + } + + if !req.GetEndOfStream() && mp.isBodySupported(httpRequest.Header.Get("Content-Type")) { + reqState.State = MessageTypeRequestBody + } + + if err := mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{ + HeaderMutations: headerMutation, + Body: reqState.State == MessageTypeRequestBody, + MessageType: MessageTypeRequestHeaders, + }); err != nil { + return reqState, fmt.Errorf("error creating continue message: %w", err) + } + + return reqState, nil +} + +// OnRequestBody handles incoming request body chunks using the [HTTPBody] interface +// It uses the provided [RequestState] to keep track of the request/response cycle state +// It returns an optional output message of type O created by either [ProcessorConfig.ContinueMessageFunc] or [ProcessorConfig.BlockMessageFunc] +// If the request is blocked or the message ends the stream, it returns io.EOF as error +// Once the whole body has been received, it will try to parse it following the Content-Type header +// and if the body is not too large, it will be analyzed by the WAF +func (mp *Processor) OnRequestBody(req HTTPBody, reqState *RequestState) error { + if !reqState.State.Ongoing() { + return errors.New("received request body too early") + } + + mp.instr.Logger().Debug("message_processor: received request body: %v - EOS: %v\n", len(req.GetBody()), req.GetEndOfStream()) + + if mp.computedBodyParsingSizeLimit.Load() <= 0 || reqState.State != MessageTypeRequestBody { + mp.instr.Logger().Error("message_processor: the body parsing has been wrongly configured. " + + "Please refer to the official documentation for guidance on the proper settings or contact support.") + + return mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{MessageType: MessageTypeRequestBody}) + } + + blocked := processBody(reqState.Context, reqState.requestBuffer, req.GetBody(), req.GetEndOfStream(), appsec.MonitorParsedHTTPBody, "request") + if blocked != nil && !mp.BlockingUnavailable { + mp.instr.Logger().Debug("external_processing: request blocked, end the stream") + actionOpts := reqState.BlockAction() + if err := mp.BlockMessageFunc(reqState.Context, actionOpts); err != nil { + return fmt.Errorf("error creating block message: %w", err) + } + return io.EOF + } + + return mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{MessageType: MessageTypeRequestBody}) +} + +// OnResponseHeaders handles incoming response headers using the [ResponseHeaders] interface +// It returns a [RequestState] to be used in subsequent calls for the same request/response cycle +// along with an optional output message of type O created by either [ProcessorConfig.ContinueMessageFunc] or [ProcessorConfig.BlockMessageFunc] +// If the request is blocked or the message ends the stream, it returns io.EOF as error +func (mp *Processor) OnResponseHeaders(res ResponseHeaders, reqState *RequestState) error { + if !reqState.State.Request() { + return fmt.Errorf("received response headers too early: %v", reqState.State) + } + + reqState.State = MessageTypeResponseHeaders + + pseudoResponse, err := res.ExtractResponse() + if err != nil { + return fmt.Errorf("error extracting response header from input message: %w", err) + } + + pseudoResponse.toNetHTTP(reqState.wrappedResponseWriter) + + // We need to know if the request has been blocked, but we don't have any other way than to look for the operation and bind a blocking data listener to it + if !mp.BlockingUnavailable { + op, ok := dyngo.FromContext(reqState.Context) + if ok { + dyngo.OnData(op, func(_ *actions.BlockHTTP) { + // We already wrote over the response writer, we need to reset it so the blocking Processor can write to it + httptrace.ResetStatusCode(reqState.wrappedResponseWriter) + reqState.fakeResponseWriter.Reset() + reqState.State = MessageTypeBlocked + }) + } + } + + reqState.State = MessageTypeResponseBody + + // Run the waf on the response headers only when we are sure to not receive a response body + if res.GetEndOfStream() || !mp.isBodySupported(reqState.wrappedResponseWriter.Header().Get("Content-Type")) { + reqState.Close() + if !mp.BlockingUnavailable && reqState.State == MessageTypeBlocked { + if err := mp.BlockMessageFunc(reqState.Context, reqState.BlockAction()); err != nil { + return fmt.Errorf("error creating block message: %w", err) + } + return io.EOF + } + + mp.instr.Logger().Debug("message_processor: finishing request with status code: %v\n", reqState.fakeResponseWriter.status) + return io.EOF + } + + return mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{MessageType: MessageTypeResponseHeaders, Body: reqState.State == MessageTypeResponseBody}) +} + +// OnResponseBody handles incoming response body chunks using the [HTTPBody] interface +// It uses the provided [RequestState] to keep track of the request/response cycle state +// It returns an optional output message of type O created by either [ProcessorConfig.ContinueMessageFunc] or [ProcessorConfig.BlockMessageFunc] +// If the request is blocked or the message ends the stream, it returns io.EOF as error +// Once the whole body has been received, it will try to parse it following the Content-Type header +// and if the body is not too large, it will be analyzed by the WAF +func (mp *Processor) OnResponseBody(resp HTTPBody, reqState *RequestState) error { + if !reqState.State.Response() { + return fmt.Errorf("received response body too early: %v", reqState.State) + } + + mp.instr.Logger().Debug("message_processor: received response body: %v - EOS: %v\n", len(resp.GetBody()), resp.GetEndOfStream()) + + if mp.computedBodyParsingSizeLimit.Load() <= 0 || reqState.State != MessageTypeResponseBody { + mp.instr.Logger().Error("message_processor: the body parsing has been wrongly configured. " + + "Please refer to the official documentation for guidance on the proper settings or contact support.") + return io.EOF + } + + blocked := processBody(reqState.Context, reqState.responseBuffer, resp.GetBody(), resp.GetEndOfStream(), appsec.MonitorHTTPResponseBody, "response") + if reqState.responseBuffer.analyzed { + reqState.Close() // Call Close to ensure the response headers are analyzed + + if (reqState.State == MessageTypeBlocked || blocked != nil) && !mp.BlockingUnavailable { + mp.instr.Logger().Debug("external_processing: request blocked, end the stream") + if err := mp.BlockMessageFunc(reqState.Context, reqState.BlockAction()); err != nil { + return fmt.Errorf("error creating block message: %w", err) + } + } + return io.EOF + } + + return mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{MessageType: MessageTypeResponseBody}) +} + +// OnRequestTrailers handles incoming request trailers +func (mp *Processor) OnRequestTrailers(reqState *RequestState) error { + if reqState == nil { + return fmt.Errorf("received a request trailer without a valid request state") + } + mp.instr.Logger().Debug("message_processor: received request trailers, ignoring") + return mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{MessageType: MessageTypeRequestTrailers}) +} + +// OnResponseTrailers handles incoming response trailers +func (mp *Processor) OnResponseTrailers(reqState *RequestState) error { + if reqState == nil { + return fmt.Errorf("received a response trailer without a valid request state") + } + mp.instr.Logger().Debug("message_processor: received response trailers, ignoring") + return mp.ContinueMessageFunc(reqState.Context, ContinueActionOptions{MessageType: MessageTypeResponseTrailers}) +} + +func processBody(ctx context.Context, bodyBuffer *bodyBuffer, body []byte, eos bool, analyzeBody func(ctx context.Context, encodable any) error, direction string) error { + if bodyBuffer.analyzed { + return nil + } + + bodyBuffer.append(body) + + if eos || bodyBuffer.truncated { + EmitBodySize(len(bodyBuffer.buffer), direction, bodyBuffer.truncated) + bodyBuffer.analyzed = true + return analyzeBody(ctx, json.NewEncodableFromData(bodyBuffer.buffer, bodyBuffer.truncated)) + } + + return nil +} + +// isBodySupported checks if the body should be analyzed based on content type +func (mp *Processor) isBodySupported(contentType string) bool { + if mp.computedBodyParsingSizeLimit.Load() <= 0 { + return false + } + + return body.IsBodySupported(contentType) +} + +func (mp *Processor) Close() error { + mp.done() + return nil +} diff --git a/instrumentation/appsec/proxy/metrics.go b/instrumentation/appsec/proxy/metrics.go new file mode 100644 index 0000000000..b57020514c --- /dev/null +++ b/instrumentation/appsec/proxy/metrics.go @@ -0,0 +1,63 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package proxy + +import ( + "context" + "strconv" + "sync/atomic" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +type metrics struct { + requestCounter atomic.Uint32 + logger instrumentation.Logger +} + +// newMetricsReporter starts a background goroutine to report request metrics +func newMetricsReporter(ctx context.Context, logger instrumentation.Logger) *metrics { + m := &metrics{ + logger: logger, + } + + go func() { + ticker := time.NewTicker(1 * time.Minute) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + m.logger.Info("analyzed %d requests in the last minute", m.requestCounter.Swap(0)) + case <-ctx.Done(): + return + } + } + }() + + return m +} + +func (m *metrics) incrementRequestCount() { + m.requestCounter.Add(1) +} + +func EmitBodySize(bodySize int, direction string, truncated bool) { + telemetry.Distribution(telemetry.NamespaceAppSec, "instrum.body_size", []string{ + "direction:" + direction, + "truncated:" + strconv.FormatBool(truncated), + }).Submit(float64(bodySize)) +} + +func RegisterConfig(mp *Processor) { + telemetry.RegisterAppConfigs( + telemetry.Configuration{Name: "appsec.proxy.blockingUnavailable", Value: mp.BlockingUnavailable}, + telemetry.Configuration{Name: "appsec.proxy.bodyParsingSizeLimit", Value: mp.computedBodyParsingSizeLimit.Load()}, + telemetry.Configuration{Name: "appsec.proxy.framework", Value: mp.Framework}, + ) +} diff --git a/instrumentation/appsec/proxy/metrics_test.go b/instrumentation/appsec/proxy/metrics_test.go new file mode 100644 index 0000000000..05cae92c60 --- /dev/null +++ b/instrumentation/appsec/proxy/metrics_test.go @@ -0,0 +1,185 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package proxy + +import ( + "context" + "fmt" + "io" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var _ RequestHeaders = (*fakeRequestHeaders)(nil) +var _ ResponseHeaders = (*fakeResponseHeaders)(nil) +var _ HTTPBody = (*fakeBody)(nil) + +type fakeRequestHeaders struct { + eos bool + limit int + headers map[string][]string +} + +func (f fakeRequestHeaders) GetEndOfStream() bool { return f.eos } +func (f fakeRequestHeaders) MessageType() MessageType { return MessageTypeRequestHeaders } +func (f fakeRequestHeaders) SpanOptions(context.Context) []tracer.StartSpanOption { return nil } +func (f fakeRequestHeaders) BodyParsingSizeLimit(context.Context) int { return f.limit } +func (f fakeRequestHeaders) ExtractRequest(context.Context) (PseudoRequest, error) { + return PseudoRequest{ + Scheme: "https", + Authority: "datadoghq.com", + Path: "/test", + Method: "POST", + Headers: f.headers, + RemoteAddr: "127.0.0.1:1234", + }, nil +} + +type fakeResponseHeaders struct { + eos bool + headers map[string][]string +} + +func (f fakeResponseHeaders) MessageType() MessageType { return MessageTypeResponseHeaders } +func (f fakeResponseHeaders) GetEndOfStream() bool { return f.eos } +func (f fakeResponseHeaders) ExtractResponse() (PseudoResponse, error) { + return PseudoResponse{ + StatusCode: 200, + Headers: f.headers, + }, nil +} + +func TestRegisterConfig_OnFirstRequest(t *testing.T) { + recorder := new(telemetrytest.RecordClient) + defer telemetry.MockClient(recorder)() + + mt := mocktracer.Start() + defer mt.Stop() + appsec.Start() + defer appsec.Stop() + + instr := instrumentation.Load(instrumentation.PackageEnvoyProxyGoControlPlane) + bodyLimit := 256 + mp := NewProcessor(ProcessorConfig{ + BlockingUnavailable: true, + BodyParsingSizeLimit: nil, // use request-provided limit + Framework: "test-framework", + ContinueMessageFunc: func(_ context.Context, _ ContinueActionOptions) error { return nil }, + BlockMessageFunc: func(_ context.Context, _ BlockActionOptions) error { return nil }, + }, instr) + defer mp.Close() + + reqState, err := mp.OnRequestHeaders(context.Background(), fakeRequestHeaders{eos: true, limit: bodyLimit}) + require.NoError(t, err) + err = mp.OnResponseHeaders(fakeResponseHeaders{eos: true}, &reqState) + require.ErrorIs(t, err, io.EOF) + + telemetrytest.CheckConfig(t, recorder.Configuration, "appsec.proxy.blockingUnavailable", true) + telemetrytest.CheckConfig(t, recorder.Configuration, "appsec.proxy.bodyParsingSizeLimit", int64(bodyLimit)) + telemetrytest.CheckConfig(t, recorder.Configuration, "appsec.proxy.framework", "test-framework") +} + +type fakeBody struct { + b []byte + eos bool +} + +func (f fakeBody) GetEndOfStream() bool { return f.eos } +func (f fakeBody) MessageType() MessageType { return MessageTypeRequestBody } +func (f fakeBody) GetBody() []byte { return f.b } + +func TestOnBody_SubmitsBodySize_ByDirection(t *testing.T) { + directions := []string{"request", "response"} + for _, direction := range directions { + t.Run(direction, func(t *testing.T) { + tests := []struct { + name string + limit int + body []byte + eos bool + wantVal float64 + wantTruncated bool + }{ + { + name: "truncated-larger-than-limit", + limit: 5, + body: []byte("0123456789"), + eos: false, + wantVal: 5.0, + wantTruncated: true, + }, + { + name: "not-truncated-less-than-limit", + limit: 15, + body: []byte("0123456789"), + eos: true, + wantVal: 10.0, + wantTruncated: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + recorder := new(telemetrytest.RecordClient) + defer telemetry.MockClient(recorder)() + + mt := mocktracer.Start() + defer mt.Stop() + appsec.Start() + defer appsec.Stop() + + instr := instrumentation.Load(instrumentation.PackageEnvoyProxyGoControlPlane) + mp := NewProcessor(ProcessorConfig{ + BlockingUnavailable: false, + Framework: "test-framework", + ContinueMessageFunc: func(_ context.Context, _ ContinueActionOptions) error { return nil }, + BlockMessageFunc: func(_ context.Context, _ BlockActionOptions) error { return nil }, + }, instr) + defer mp.Close() + + reqHeaders := fakeRequestHeaders{eos: direction != "request", limit: tt.limit, headers: map[string][]string{"Content-Type": {"application/json"}}} + reqState, err := mp.OnRequestHeaders(context.Background(), reqHeaders) + require.NoError(t, err) + + if direction == "request" { + err = mp.OnRequestBody(fakeBody{b: tt.body, eos: tt.eos}, &reqState) + require.NoError(t, err) + } + + err = mp.OnResponseHeaders(fakeResponseHeaders{eos: direction != "response", headers: map[string][]string{"Content-Type": {"application/json"}}}, &reqState) + + if direction == "response" { + require.NoError(t, err) + err = mp.OnResponseBody(fakeBody{b: tt.body, eos: tt.eos}, &reqState) + } + require.ErrorIs(t, err, io.EOF) + + // Find metric + found := false + truncatedStr := fmt.Sprintf("truncated:%v", tt.wantTruncated) + for key, handle := range recorder.Metrics { + if key.Namespace == telemetry.NamespaceAppSec && key.Name == "instrum.body_size" && + strings.Contains(key.Tags, "direction:"+direction) && + strings.Contains(key.Tags, truncatedStr) { + assert.Equal(t, tt.wantVal, handle.Get()) + found = true + } + } + require.True(t, found, "expected instrum.body_size metric to be recorded with correct tags") + }) + } + }) + } +} diff --git a/instrumentation/appsec/proxy/request_state.go b/instrumentation/appsec/proxy/request_state.go new file mode 100644 index 0000000000..d4b36e083e --- /dev/null +++ b/instrumentation/appsec/proxy/request_state.go @@ -0,0 +1,115 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package proxy + +import ( + "context" + "errors" + "io" + "net/http" + "path" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" +) + +var _ io.Closer = (*RequestState)(nil) + +// RequestState manages the state of a single request through its lifecycle +type RequestState struct { + Context context.Context + afterHandle func() + + // HTTP components + wrappedResponseWriter http.ResponseWriter + fakeResponseWriter *fakeResponseWriter + + // Body processing + requestBuffer *bodyBuffer + responseBuffer *bodyBuffer + + // Processing state + State MessageType +} + +// newRequestState creates a new request state +func newRequestState(request *http.Request, bodyLimit int, framework string, options ...tracer.StartSpanOption) (RequestState, bool) { + fakeResponseWriter := newFakeResponseWriter() + wrappedResponseWriter, spanRequest, afterHandle, blocked := httptrace.BeforeHandle(&httptrace.ServeConfig{ + Framework: framework, + Resource: request.Method + " " + path.Clean(request.URL.Path), + SpanOpts: append(options, tracer.Tag(ext.SpanKind, ext.SpanKindServer)), + }, fakeResponseWriter, request) + + var requestBuffer *bodyBuffer + if bodyLimit > 0 { + requestBuffer = newBodyBuffer(bodyLimit) + } + + var responseBuffer *bodyBuffer + if bodyLimit > 0 { + responseBuffer = newBodyBuffer(bodyLimit) + } + + return RequestState{ + Context: spanRequest.Context(), + afterHandle: afterHandle, + fakeResponseWriter: fakeResponseWriter, + wrappedResponseWriter: wrappedResponseWriter, + requestBuffer: requestBuffer, + responseBuffer: responseBuffer, + State: MessageTypeRequestHeaders, + }, blocked +} + +// PropagationHeaders creates header mutations for trace propagation +func (rs *RequestState) PropagationHeaders() (http.Header, error) { + span, ok := tracer.SpanFromContext(rs.Context) + if !ok { + return nil, errors.New("no span found in context") + } + + newHeaders := make(http.Header) + if err := tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(newHeaders)); err != nil { + return nil, err + } + + return newHeaders, nil +} + +// BlockAction marks the request as blocked and completes it. +func (rs *RequestState) BlockAction() BlockActionOptions { + rs.Close() + if rs.fakeResponseWriter.status == 0 { + panic("cannot block request without a status code") + } + + return BlockActionOptions{ + StatusCode: rs.fakeResponseWriter.status, + Headers: rs.fakeResponseWriter.headers, + Body: rs.fakeResponseWriter.body, + } +} + +// Close finalizes the request processing. +func (rs *RequestState) Close() error { + if rs.afterHandle != nil { + // Avoid Complete recursion by clearing afterHandle before calling it + afterHandle := rs.afterHandle + rs.afterHandle = nil + afterHandle() + } + + if rs.State.Ongoing() { + rs.State = MessageTypeFinished + } + return nil +} + +func (rs *RequestState) Span() (*tracer.Span, bool) { + return tracer.SpanFromContext(rs.Context) +} diff --git a/internal/appsec/emitter/trace/service_entry_span.go b/instrumentation/appsec/trace/service_entry_span.go similarity index 82% rename from internal/appsec/emitter/trace/service_entry_span.go rename to instrumentation/appsec/trace/service_entry_span.go index 98e14b092f..9c85549ff0 100644 --- a/internal/appsec/emitter/trace/service_entry_span.go +++ b/instrumentation/appsec/trace/service_entry_span.go @@ -10,17 +10,17 @@ import ( "encoding/json" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) type ( // ServiceEntrySpanOperation is a dyngo.Operation that holds a the first span of a service. Usually a http or grpc span. ServiceEntrySpanOperation struct { dyngo.Operation - tags map[string]any - jsonTags map[string]any - mu sync.Mutex + jsonTags map[string]any + tagSetter TagSetter + mu sync.Mutex } // ServiceEntrySpanArgs is the arguments for a ServiceEntrySpanOperation @@ -52,7 +52,7 @@ func (ServiceEntrySpanArgs) IsArgOf(*ServiceEntrySpanOperation) {} func (op *ServiceEntrySpanOperation) SetTag(key string, value any) { op.mu.Lock() defer op.mu.Unlock() - op.tags[key] = value + op.tagSetter.SetTag(key, value) } // SetSerializableTag adds the key/value pair to the tags to add to the service entry span. @@ -76,7 +76,7 @@ func (op *ServiceEntrySpanOperation) SetSerializableTags(tags map[string]any) { func (op *ServiceEntrySpanOperation) setSerializableTag(key string, value any) { switch value.(type) { case string, int8, int16, int32, int64, uint8, uint16, uint32, uint64, float32, float64, bool: - op.tags[key] = value + op.tagSetter.SetTag(key, value) default: op.jsonTags[key] = value } @@ -87,7 +87,7 @@ func (op *ServiceEntrySpanOperation) SetTags(tags map[string]any) { op.mu.Lock() defer op.mu.Unlock() for k, v := range tags { - op.tags[k] = v + op.tagSetter.SetTag(k, v) } } @@ -96,7 +96,7 @@ func (op *ServiceEntrySpanOperation) SetStringTags(tags map[string]string) { op.mu.Lock() defer op.mu.Unlock() for k, v := range tags { - op.tags[k] = v + op.tagSetter.SetTag(k, v) } } @@ -126,32 +126,34 @@ func (op *ServiceEntrySpanOperation) OnSpanTagEvent(tag SpanTag) { op.SetTag(tag.Key, tag.Value) } -func StartServiceEntrySpanOperation(ctx context.Context) (*ServiceEntrySpanOperation, context.Context) { +func StartServiceEntrySpanOperation(ctx context.Context, span TagSetter) (*ServiceEntrySpanOperation, context.Context) { parent, _ := dyngo.FromContext(ctx) + if span == nil { + // Ensure we have a non-nil tagSetter going forward, so we don't have to check all the time. + span = NoopTagSetter{} + } op := &ServiceEntrySpanOperation{ Operation: dyngo.NewOperation(parent), - tags: make(map[string]any), - jsonTags: make(map[string]any), + jsonTags: make(map[string]any, 2), + tagSetter: span, } return op, dyngo.StartAndRegisterOperation(ctx, op, ServiceEntrySpanArgs{}) } -func (op *ServiceEntrySpanOperation) Finish(span TagSetter) { - if _, ok := span.(*NoopTagSetter); ok { // If the span is a NoopTagSetter or is nil, we don't need to set any tags +func (op *ServiceEntrySpanOperation) Finish() { + span := op.tagSetter + if _, ok := span.(NoopTagSetter); ok { // If the span is a NoopTagSetter or is nil, we don't need to set any tags return } op.mu.Lock() defer op.mu.Unlock() - for k, v := range op.tags { - span.SetTag(k, v) - } - for k, v := range op.jsonTags { strValue, err := json.Marshal(v) if err != nil { - log.Debug("appsec: failed to marshal tag %s: %v", k, err) + log.Debug("appsec: failed to marshal tag %q: %v", k, err.Error()) + continue } span.SetTag(k, string(strValue)) } diff --git a/internal/appsec/emitter/trace/span.go b/instrumentation/appsec/trace/span.go similarity index 84% rename from internal/appsec/emitter/trace/span.go rename to instrumentation/appsec/trace/span.go index d6614f90de..8e2719ab36 100644 --- a/internal/appsec/emitter/trace/span.go +++ b/instrumentation/appsec/trace/span.go @@ -9,11 +9,11 @@ import ( "context" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" ) type ( - // SpanOperation is a dyngo.Operation that holds a ddtrace.Span. + // SpanOperation is a dyngo.Operation that holds a tracer.Span. // It used as a middleware for appsec code and the tracer code // hopefully some day this operation will create spans instead of simply using them SpanOperation struct { @@ -54,7 +54,7 @@ func StartSpanOperation(ctx context.Context) (*SpanOperation, context.Context) { } func (op *SpanOperation) Finish(span TagSetter) { - if _, ok := span.(*NoopTagSetter); ok { // If the span is a NoopTagSetter or is nil, we don't need to set any tags + if _, ok := span.(NoopTagSetter); ok || span == nil { // If the span is a NoopTagSetter or is nil, we don't need to set any tags return } diff --git a/internal/appsec/emitter/trace/tag_setter.go b/instrumentation/appsec/trace/tag_setter.go similarity index 100% rename from internal/appsec/emitter/trace/tag_setter.go rename to instrumentation/appsec/trace/tag_setter.go diff --git a/instrumentation/contrib_test.go b/instrumentation/contrib_test.go new file mode 100644 index 0000000000..ba6aa7d320 --- /dev/null +++ b/instrumentation/contrib_test.go @@ -0,0 +1,155 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package instrumentation + +import ( + "fmt" + "go/parser" + "go/token" + "io/fs" + "os" + "path/filepath" + "strings" + "testing" +) + +func TestIntegrationEnabled(t *testing.T) { + root, err := filepath.Abs("../contrib") + if err != nil { + t.Fatal(err) + } + if _, err = os.Stat(root); err != nil { + t.Fatal(err) + } + err = filepath.WalkDir(root, func(path string, _ fs.DirEntry, _ error) error { + if filepath.Base(path) != "go.mod" || strings.Contains(path, fmt.Sprintf("%cinternal", os.PathSeparator)) || + strings.Contains(path, fmt.Sprintf("%ctest%c", os.PathSeparator, os.PathSeparator)) { + return nil + } + rErr := testIntegrationEnabled(t, filepath.Dir(path)) + if rErr != nil { + return fmt.Errorf("path: %s, err: %w", path, rErr) + } + return nil + }) + if err != nil { + t.Fatal(err) + } +} + +func testIntegrationEnabled(t *testing.T, contribPath string) error { + t.Helper() + t.Log(contribPath) + packages, err := parsePackages(contribPath) + if err != nil { + return fmt.Errorf("unable to get package info: %w", err) + } + for _, pkg := range packages { + if strings.Contains(pkg.ImportPath, "/test") || strings.Contains(pkg.ImportPath, "/internal") || strings.Contains(pkg.ImportPath, "/cmd") { + continue + } + if hasInstrumentationImport(pkg) { + return nil + } + } + return fmt.Errorf(`package %q is expected use instrumentation telemetry. For more info see https://github.com/DataDog/dd-trace-go/blob/main/contrib/README.md#instrumentation-telemetry`, contribPath) +} + +func parsePackages(root string) ([]contribPkg, error) { + var packages []contribPkg + packageMap := make(map[string]*contribPkg) + + err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if !strings.HasSuffix(path, ".go") || strings.HasSuffix(path, "_test.go") { + return nil + } + + fset := token.NewFileSet() + node, err := parser.ParseFile(fset, path, nil, parser.ParseComments) + if err != nil { + return nil + } + + dir := filepath.Dir(path) + relPath, err := filepath.Rel(root, dir) + if err != nil { + return err + } + + importPath := filepath.Join(getModulePath(root), relPath) + importPath = filepath.ToSlash(importPath) + + pkg, exists := packageMap[importPath] + if !exists { + pkg = &contribPkg{ + ImportPath: importPath, + Imports: make([]string, 0), + } + packageMap[importPath] = pkg + } + + for _, imp := range node.Imports { + importStr := strings.Trim(imp.Path.Value, `"`) + found := false + for _, existing := range pkg.Imports { + if existing == importStr { + found = true + break + } + } + if !found { + pkg.Imports = append(pkg.Imports, importStr) + } + } + + return nil + }) + + if err != nil { + return nil, err + } + + for _, pkg := range packageMap { + packages = append(packages, *pkg) + } + + return packages, nil +} + +func getModulePath(root string) string { + goModPath := filepath.Join(root, "go.mod") + data, err := os.ReadFile(goModPath) + if err != nil { + return "" + } + + lines := strings.Split(string(data), "\n") + for _, line := range lines { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "module ") { + return strings.TrimSpace(strings.TrimPrefix(line, "module")) + } + } + return "" +} + +func hasInstrumentationImport(p contribPkg) bool { + for _, imp := range p.Imports { + if imp == "github.com/DataDog/dd-trace-go/v2/instrumentation" { + return true + } + } + return false +} + +type contribPkg struct { + ImportPath string + Imports []string +} diff --git a/instrumentation/env/env.go b/instrumentation/env/env.go new file mode 100644 index 0000000000..92a80ee7fb --- /dev/null +++ b/instrumentation/env/env.go @@ -0,0 +1,40 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package env + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/env" +) + +// Get is a wrapper around os.Getenv that validates the environment variable +// against a list of supported environment variables. +// +// When a environment variable is not supported because it is not +// listed in the list of supported environment variables, the function will log an error +// and behave as if the environment variable was not set. +// +// In testing mode, the reader will automatically add the environment variable +// to the configuration file. +// +// This function is a passthrough to the internal env package. +func Get(name string) string { + return env.Get(name) +} + +// Lookup is a wrapper around os.LookupEnv that validates the environment variable +// against a list of supported environment variables. +// +// When a environment variable is not supported because it is not +// listed in the list of supported environment variables, the function will log an error +// and behave as if the environment variable was not set. +// +// In testing mode, the reader will automatically add the environment variable +// to the configuration file. +// +// This function is a passthrough to the internal env package. +func Lookup(name string) (string, bool) { + return env.Lookup(name) +} diff --git a/instrumentation/errortrace/errortrace.go b/instrumentation/errortrace/errortrace.go new file mode 100644 index 0000000000..37bf9cc591 --- /dev/null +++ b/instrumentation/errortrace/errortrace.go @@ -0,0 +1,162 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package errortrace + +import ( + "bytes" + "errors" + "fmt" + "runtime" + "strconv" + "strings" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +// TracerError is an error type that holds stackframes from when the error was thrown. +// It can be used interchangeably with the built-in Go error type. +type TracerError struct { + stackFrames *runtime.Frames + inner error + stack *bytes.Buffer +} + +// defaultStackLength specifies the default maximum size of a stack trace. +const defaultStackLength = 32 + +func (err *TracerError) Error() string { + return err.inner.Error() +} + +func New(text string) *TracerError { + // Skip one to exclude New(...) + return Wrap(errors.New(text)) +} + +// Wrap takes in an error and records the stack trace at the moment that it was thrown. +func Wrap(err error) *TracerError { + return WrapN(err, 0, 1) +} + +// WrapN takes in an error and records the stack trace at the moment that it was thrown. +// It will capture a maximum of `n` entries, skipping the first `skip` entries. +// If n is 0, it will capture up to 32 entries instead. +func WrapN(err error, n uint, skip uint) *TracerError { + if err == nil { + return nil + } + var e *TracerError + if errors.As(err, &e) { + return e + } + if n <= 0 { + n = defaultStackLength + } + + telemetry.Count(telemetry.NamespaceTracers, "errorstack.source", []string{"source:TracerError"}).Submit(1) + now := time.Now() + defer func() { + dur := float64(time.Since(now)) + telemetry.Distribution(telemetry.NamespaceTracers, "errorstack.duration", []string{"source:TracerError"}).Submit(dur) + }() + + pcs := make([]uintptr, n) + var stackFrames *runtime.Frames + // +2 to exclude runtime.Callers and Wrap + numFrames := runtime.Callers(2+int(skip), pcs) + if numFrames == 0 { + stackFrames = nil + } else { + stackFrames = runtime.CallersFrames(pcs[:numFrames]) + } + + tracerErr := &TracerError{ + stackFrames: stackFrames, + inner: err, + } + return tracerErr +} + +// Format returns a string representation of the stack trace. +func (err *TracerError) Format() string { + if err == nil || err.stackFrames == nil { + return "" + } + if err.stack != nil { + return err.stack.String() + } + + out := bytes.Buffer{} + for i := 0; ; i++ { + frame, more := err.stackFrames.Next() + if i != 0 { + out.WriteByte('\n') + } + out.WriteString(frame.Function) + out.WriteByte('\n') + out.WriteByte('\t') + out.WriteString(frame.File) + out.WriteByte(':') + out.WriteString(strconv.Itoa(frame.Line)) + if !more { + break + } + } + // CallersFrames returns an iterator that is consumed as we read it. In order to + // allow calling Format() multiple times, we save the result into err.stack, which can be + // returned in future calls + err.stack = &out + return out.String() +} + +// Errorf serves the same purpose as fmt.Errorf, but returns a TracerError +// and prevents wrapping errors of type TracerError twice. +// The %w flag will only wrap errors if they are not already of type *TracerError. +func Errorf(format string, a ...any) *TracerError { + switch len(a) { + case 0: + return New(format) + case 1: + if _, ok := a[0].(*TracerError); ok { + format = strings.Replace(format, "%w", "%v", 1) + } + default: + aIndex := 0 + var newFormat strings.Builder + for i := 0; i < len(format); i++ { + c := format[i] + newFormat.WriteByte(c) + if c != '%' { + continue + } + if i+1 >= len(format) { + break + } + if format[i+1] == '%' { + continue + } + if format[i+1] == 'w' { + if _, ok := a[aIndex].(*TracerError); ok { + newFormat.WriteString("v") + i++ + } + } + aIndex++ + } + format = newFormat.String() + } + err := fmt.Errorf(format, a...) + return Wrap(err) +} + +// Unwrap takes a wrapped error and returns the inner error. +func (err *TracerError) Unwrap() error { + if err == nil { + return nil + } + return err.inner +} diff --git a/instrumentation/errortrace/errortrace_test.go b/instrumentation/errortrace/errortrace_test.go new file mode 100644 index 0000000000..8c4dbd3863 --- /dev/null +++ b/instrumentation/errortrace/errortrace_test.go @@ -0,0 +1,254 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package errortrace + +import ( + "errors" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +// Creates an additional level of callers around the error returned by createTestError +// Helps us test that TracerErrors contain all callers after an error is created. +func testErrorWrapper() *TracerError { + return createTestError() +} + +// Creates a new TracerError instance with default parameters (n = 32, skip = 0) +func createTestError() *TracerError { + return New("Something wrong") +} + +func TestWrap(t *testing.T) { + t.Run("wrap nil", func(t *testing.T) { + assert := assert.New(t) + err := WrapN(nil, 0, 0) + assert.Nil(err) + }) + + t.Run("wrap TracerError", func(t *testing.T) { + assert := assert.New(t) + err := createTestError() + wrappedErr := WrapN(err, 0, 0) + + assert.NotNil(wrappedErr) + assert.Equal(err, wrappedErr) + assert.Equal(err.Error(), wrappedErr.Error()) + wrappedStack := wrappedErr.Format() + originalStack := err.Format() + assert.Equal(wrappedStack, originalStack) + }) + + t.Run("default", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 0, 0) + + assert.NotNil(wrappedErr) + assert.Equal("msg", wrappedErr.Error()) + assert.Equal(err, wrappedErr.Unwrap()) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + }) + + t.Run("with Errorf", func(t *testing.T) { + assert := assert.New(t) + err := fmt.Errorf("val: %d", 1) + wrappedErr := WrapN(err, 0, 0) + + assert.NotNil(wrappedErr) + assert.Equal(err.Error(), wrappedErr.Error()) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + }) +} + +func TestErrorStack(t *testing.T) { + t.Run("errortrace New", func(t *testing.T) { + assert := assert.New(t) + err := createTestError() + stack := err.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.Contains(stack, "errortrace.createTestError") + assert.Contains(stack, "errortrace.TestErrorStack") + assert.Contains(stack, "testing.tRunner") + assert.Contains(stack, "runtime.goexit") + }) + + t.Run("layered tracererror", func(t *testing.T) { + assert := assert.New(t) + err := testErrorWrapper() + stack := err.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.Contains(stack, "errortrace.testErrorWrapper") + assert.Contains(stack, "errortrace.createTestError") + assert.Contains(stack, "errortrace.TestErrorStack") + assert.Contains(stack, "testing.tRunner") + assert.Contains(stack, "runtime.goexit") + }) + + t.Run("wrapped error", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 0, 0) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.Contains(stack, "errortrace.TestErrorStack") + assert.Contains(stack, "testing.tRunner") + assert.Contains(stack, "runtime.goexit") + }) + + t.Run("skip 1", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 0, 1) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.NotContains(stack, "errortrace.TestErrorStack") + assert.Contains(stack, "testing.tRunner") + assert.Contains(stack, "runtime.goexit") + }) + + t.Run("skip 2", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 0, 2) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.NotContains(stack, "errortrace.TestErrorStack") + assert.NotContains(stack, "testing.tRunner") + assert.Contains(stack, "runtime.goexit") + }) + + t.Run("skip > num frames", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 0, 3) + stack := wrappedErr.Format() + assert.Empty(stack) + }) + + t.Run("n = 1", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 1, 0) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.Contains(stack, "errortrace.TestErrorStack") + assert.NotContains(stack, "testing.tRunner") + assert.NotContains(stack, "runtime.goexit") + }) + + t.Run("n = 2", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 2, 0) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.Contains(stack, "errortrace.TestErrorStack") + assert.Contains(stack, "testing.tRunner") + assert.NotContains(stack, "runtime.goexit") + }) + + t.Run("skip == n", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 1, 1) + stack := wrappedErr.Format() + assert.NotNil(stack) + assert.Greater(len(stack), 0) + assert.NotContains(stack, "errortrace.TestErrorStack") + assert.Contains(stack, "testing.tRunner") + assert.NotContains(stack, "runtime.goexit") + }) + + t.Run("invalid skip", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("msg") + wrappedErr := WrapN(err, 0, 100) + stack := wrappedErr.Format() + assert.Empty(stack) + }) +} + +func TestUnwrap(t *testing.T) { + t.Run("unwrap nil", func(t *testing.T) { + assert := assert.New(t) + err := WrapN(nil, 0, 0) + unwrapped := err.Unwrap() + assert.Nil(unwrapped) + }) + + t.Run("unwrap TracerError", func(t *testing.T) { + assert := assert.New(t) + err := errors.New("Something wrong") + wrapped := WrapN(err, 0, 0) + unwrapped := wrapped.Unwrap() + assert.Equal(err, unwrapped) + }) +} + +func TestErrorf(t *testing.T) { + t.Run("empty", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("") + assert.NotNil(err) + assert.Equal("", err.Error()) + }) + + t.Run("single, non-error", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("val: %d", 1) + assert.NotNil(err) + assert.Equal("val: 1", err.Error()) + }) + + t.Run("%w, error", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("val: %w", errors.New("Something wrong")) + assert.NotNil(err) + assert.Equal("val: Something wrong", err.Error()) + }) + + t.Run("%w, TracerError", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("val: %w", createTestError()) + assert.NotNil(err) + assert.Equal("val: Something wrong", err.Error()) + }) + + t.Run("multiple args, error", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("val: %w, %w", errors.New("e1"), errors.New("e2")) + assert.NotNil(err) + assert.Equal("val: e1, e2", err.Error()) + }) + + t.Run("multiple args, TracerError", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("val: %w, %w", createTestError(), createTestError()) + assert.NotNil(err) + assert.Equal("val: Something wrong, Something wrong", err.Error()) + }) + + t.Run("multiple args, different types", func(t *testing.T) { + assert := assert.New(t) + err := Errorf("val: %w, %d, %w", errors.New("err"), 1, createTestError()) + assert.NotNil(err) + assert.Equal("val: err, 1, Something wrong", err.Error()) + }) +} diff --git a/instrumentation/errortrace/orchestrion.yml b/instrumentation/errortrace/orchestrion.yml new file mode 100644 index 0000000000..8c6e2de909 --- /dev/null +++ b/instrumentation/errortrace/orchestrion.yml @@ -0,0 +1,34 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2025 Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: error-tracking + description: The entry point of a Go program with error tracking. + +aspects: + - id: Error Tracking + join-point: + all-of: + - package-filter: + root: true + - function-body: + function: + - signature-contains: + returns: [error] + advice: + - prepend-statements: + order: 100 + imports: + errortrace: github.com/DataDog/dd-trace-go/v2/instrumentation/errortrace + template: |- + {{ $ret := .Function.LastResultThatImplements "error" }} + {{ with $ret }} + defer func() { + if {{ $ret }} != nil { + {{ $ret }} = errortrace.Wrap({{ $ret }}) + } + }() + {{- end -}} diff --git a/instrumentation/graphql/graphql.go b/instrumentation/graphql/graphql.go new file mode 100644 index 0000000000..90ee621a9a --- /dev/null +++ b/instrumentation/graphql/graphql.go @@ -0,0 +1,171 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package graphql + +import ( + "encoding/json" + "fmt" + "reflect" + "runtime" + "slices" + "strconv" + "strings" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// ErrorExtensionsFromEnv returns the configured error extensions from an environment variable. +func ErrorExtensionsFromEnv() []string { + s := env.Get("DD_TRACE_GRAPHQL_ERROR_EXTENSIONS") + if s == "" { + return nil + } + return ParseErrorExtensions(strings.Split(s, ",")) +} + +// ParseErrorExtensions validates and cleans up the user provider error extension list. +func ParseErrorExtensions(errExtensions []string) []string { + var res []string + for _, v := range errExtensions { + cleanupVal := strings.TrimSpace(v) + if cleanupVal != "" { + res = append(res, cleanupVal) + } + } + slices.Sort(res) + return slices.Compact(res) +} + +// Error represents a generic Graphql error. +type Error struct { + OriginalErr error + Message string + Locations []ErrorLocation + Path []any + Extensions map[string]any +} + +// ErrorLocation represents each individual member of the locations field of a Graphql error. +type ErrorLocation struct { + Line int + Column int +} + +// AddErrorsAsSpanEvents attaches the given graphql errors to the span as span events, according to the standard +// Datadog specification. +// errExtensions allows to include the given extensions field from the error as attributes in the span events. +func AddErrorsAsSpanEvents(span *tracer.Span, errs []Error, errExtensions []string) { + ts := time.Now() + for _, err := range errs { + span.AddEvent( + ext.GraphqlQueryErrorEvent, + tracer.WithSpanEventTimestamp(ts), + tracer.WithSpanEventAttributes(errToSpanEventAttributes(err, errExtensions)), + ) + } +} + +func errToSpanEventAttributes(gErr Error, errExtensions []string) map[string]any { + res := map[string]any{ + "message": gErr.Message, + "type": reflect.TypeOf(gErr.OriginalErr).String(), + "stacktrace": takeStacktrace(0, 0), + } + if locs := parseErrLocations(gErr.Locations); len(locs) > 0 { + res["locations"] = locs + } + if errPath := parseErrPath(gErr.Path); len(errPath) > 0 { + res["path"] = errPath + } + setErrExtensions(res, gErr.Extensions, errExtensions) + return res +} + +func parseErrLocations(locs []ErrorLocation) []string { + res := make([]string, 0, len(locs)) + for _, loc := range locs { + res = append(res, fmt.Sprintf("%d:%d", loc.Line, loc.Column)) + } + return res +} + +func parseErrPath(p []any) []string { + res := make([]string, 0, len(p)) + for _, v := range p { + res = append(res, fmt.Sprintf("%v", v)) + } + return res +} + +func setErrExtensions(result map[string]any, extensions map[string]any, whitelist []string) { + for _, errExt := range whitelist { + val, ok := extensions[errExt] + if !ok { + continue + } + key := fmt.Sprintf("extensions.%s", errExt) + mapVal, err := errExtensionMapValue(val) + if err != nil { + log.Debug("failed to set error extension as span event attribute %q: %v", errExt, err.Error()) + continue + } + result[key] = mapVal + } +} + +func errExtensionMapValue(val any) (any, error) { + switch v := val.(type) { + case string, bool, int, uint, int64, uint64, uint8, uint16, uint32, uintptr, int8, int16, int32, float64, float32, + []string, []bool, []int, []uint, []int64, []uint64, []uint8, []uint16, []uint32, []uintptr, []int8, []int16, []int32, []float64, []float32: + return v, nil + default: + b, err := json.Marshal(val) + if err != nil { + return nil, err + } + return string(b), nil + } +} + +// defaultStackLength specifies the default maximum size of a stack trace. +const defaultStackLength = 32 + +// takeStacktrace takes a stack trace of maximum n entries, skipping the first skip entries. +// This function is the same as ddtrace/tracer/span.go +func takeStacktrace(n, skip uint) string { + if n == 0 { + n = defaultStackLength + } + var builder strings.Builder + pcs := make([]uintptr, n) + + // +2 to exclude runtime.Callers and takeStacktrace + numFrames := runtime.Callers(2+int(skip), pcs) + if numFrames == 0 { + return "" + } + frames := runtime.CallersFrames(pcs[:numFrames]) + for i := 0; ; i++ { + frame, more := frames.Next() + if i != 0 { + builder.WriteByte('\n') + } + builder.WriteString(frame.Function) + builder.WriteByte('\n') + builder.WriteByte('\t') + builder.WriteString(frame.File) + builder.WriteByte(':') + builder.WriteString(strconv.Itoa(frame.Line)) + if !more { + break + } + } + return builder.String() +} diff --git a/instrumentation/graphql/graphql_test.go b/instrumentation/graphql/graphql_test.go new file mode 100644 index 0000000000..f06cd221bb --- /dev/null +++ b/instrumentation/graphql/graphql_test.go @@ -0,0 +1,97 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package graphql + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func TestAddErrorsAsSpanEvents(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + errExtensions := []string{"ext1", "ext2"} + + type customString string + type customInt int + + span := tracer.StartSpan("test") + errs := []Error{ + { + OriginalErr: errors.New("some error"), + Message: "message 1", + Locations: []ErrorLocation{ + {Line: 1, Column: 2}, + {Line: 100, Column: 200}, + }, + Path: []any{ + "1", 2, "3", 4, customString("5"), customInt(6), + }, + Extensions: map[string]any{ + "ext1": "ext1", + "ext2": 2, + "ext3": 3, + }, + }, + { + OriginalErr: errors.New("some error"), + Message: "message 2", + Locations: []ErrorLocation{ + {Line: 2, Column: 3}, + {Line: 200, Column: 300}, + }, + Path: []any{ + "1", 2, "3", 4, customString("5"), customInt(6), + }, + Extensions: map[string]any{ + "ext1": "ext1", + "ext3": 3, + }, + }, + } + AddErrorsAsSpanEvents(span, errs, errExtensions) + span.Finish() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + events := spans[0].Events() + require.Len(t, events, 2) + + assert.Equal(t, "dd.graphql.query.error", events[0].Name) + assert.NotEmpty(t, events[0].TimeUnixNano) + + assert.NotEmpty(t, events[0].Attributes["stacktrace"]) + wantAttrs1 := map[string]any{ + "message": "message 1", + "type": "*errors.errorString", + "locations": []string{"1:2", "100:200"}, + "stacktrace": events[0].Attributes["stacktrace"], + "path": []string{"1", "2", "3", "4", "5", "6"}, + "extensions.ext1": "ext1", + "extensions.ext2": 2, + } + events[0].AssertAttributes(t, wantAttrs1) + + assert.Equal(t, "dd.graphql.query.error", events[1].Name) + assert.NotEmpty(t, events[1].TimeUnixNano) + + assert.NotEmpty(t, events[1].Attributes["stacktrace"]) + wantAttrs2 := map[string]any{ + "message": "message 2", + "type": "*errors.errorString", + "locations": []string{"2:3", "200:300"}, + "stacktrace": events[1].Attributes["stacktrace"], + "path": []string{"1", "2", "3", "4", "5", "6"}, + "extensions.ext1": "ext1", + } + events[1].AssertAttributes(t, wantAttrs2) +} diff --git a/internal/httpmem/httpmem.go b/instrumentation/httpmem/httpmem.go similarity index 96% rename from internal/httpmem/httpmem.go rename to instrumentation/httpmem/httpmem.go index dd66865663..1fdb053770 100644 --- a/internal/httpmem/httpmem.go +++ b/instrumentation/httpmem/httpmem.go @@ -21,7 +21,7 @@ func ServerAndClient(h http.Handler) (*http.Server, *http.Client) { p := newConnPool() c := &http.Client{ Transport: &http.Transport{ - DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { return p.NewConn() }, }, diff --git a/internal/httpmem/httpmem_test.go b/instrumentation/httpmem/httpmem_test.go similarity index 75% rename from internal/httpmem/httpmem_test.go rename to instrumentation/httpmem/httpmem_test.go index 9150f6ba7b..a6f2788bc9 100644 --- a/internal/httpmem/httpmem_test.go +++ b/instrumentation/httpmem/httpmem_test.go @@ -9,11 +9,11 @@ import ( "net/http" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/httpmem" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httpmem" ) func TestServerAndClient(t *testing.T) { - s, c := httpmem.ServerAndClient(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + s, c := httpmem.ServerAndClient(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})) defer s.Close() r, err := http.NewRequest("GET", "http://foo/bar", nil) if err != nil { @@ -27,7 +27,7 @@ func TestServerAndClient(t *testing.T) { } func TestServerClosed(t *testing.T) { - s, c := httpmem.ServerAndClient(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {})) + s, c := httpmem.ServerAndClient(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {})) s.Close() r, err := http.NewRequest("GET", "http://foo/bar", nil) if err != nil { diff --git a/instrumentation/httptrace/before_handle.go b/instrumentation/httptrace/before_handle.go new file mode 100644 index 0000000000..bce8b0ff99 --- /dev/null +++ b/instrumentation/httptrace/before_handle.go @@ -0,0 +1,137 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package httptrace + +import ( + "net/http" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/options" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" +) + +// ServeConfig specifies the tracing configuration when using TraceAndServe. +type ServeConfig struct { + // Framework is the name of the framework or library being used (optional). + Framework string + // Service specifies the service name to use. If left blank, the global service name + // will be inherited. + Service string + // Resource optionally specifies the resource name for this request. + Resource string + // QueryParams should be true in order to append the URL query values to the "http.url" tag. + QueryParams bool + // Route is the request matched route if any, if empty, a quantization algorithm will create one using the request URL. + Route string + // RouteParams specifies framework-specific route parameters (e.g. for route /user/:id coming + // in as /user/123 we'll have {"id": "123"}). This field is optional and is used for monitoring + // by AppSec. It is only taken into account when AppSec is enabled. + RouteParams map[string]string + // FinishOpts specifies any options to be used when finishing the request span. + FinishOpts []tracer.FinishOption + // SpanOpts specifies any options to be applied to the request starting span. + SpanOpts []tracer.StartSpanOption + // isStatusError allows customization of error code determination. + IsStatusError func(int) bool +} + +// BeforeHandle contains functionality that should be executed before a http.Handler runs. +// It returns the "traced" http.ResponseWriter and http.Request, an additional afterHandle function +// that should be executed after the Handler runs, and a handled bool that instructs if the request has been handled +// or not - in case it was handled, the original handler should not run. +func BeforeHandle(cfg *ServeConfig, w http.ResponseWriter, r *http.Request) (http.ResponseWriter, *http.Request, func(), bool) { + if cfg == nil { + cfg = new(ServeConfig) + } + opts := options.Expand(cfg.SpanOpts, 2, 3) + // Pre-append span.kind, component and http.route tags to the options so that they can be overridden. + opts[0] = tracer.Tag(ext.SpanKind, ext.SpanKindServer) + opts[1] = tracer.Tag(ext.Component, "net/http") + if cfg.Service != "" { + opts = append(opts, tracer.ServiceName(cfg.Service)) + } + if cfg.Resource != "" { + opts = append(opts, tracer.ResourceName(cfg.Resource)) + } + endpointOpt, endpointFn := handleHTTPEndpoint(cfg, r) + opts = append(opts, endpointOpt) + span, ctx, finishSpans := StartRequestSpan(r, opts...) + rw, ddrw := wrapResponseWriter(w) + rt := r.WithContext(ctx) + closeSpan := func() { + finishSpans(ddrw.status, cfg.IsStatusError, cfg.FinishOpts...) + } + afterHandle := closeSpan + handled := false + if appsec.Enabled() { + appsecConfig := &httpsec.Config{ + Framework: cfg.Framework, + Route: renamedRoute(cfg.Route, endpointFn(), r.URL.EscapedPath()), + RouteParams: cfg.RouteParams, + } + + secW, secReq, secAfterHandle, secHandled := httpsec.BeforeHandle(rw, rt, span, appsecConfig) + afterHandle = func() { + secAfterHandle() + closeSpan() + } + rw = secW + rt = secReq + handled = secHandled + } + return rw, rt, afterHandle, handled +} + +// handleHTTPEndpoint tags the span with http.endpoint based on the resource renaming configuration and returns the computed endpoint. +func handleHTTPEndpoint(serveCfg *ServeConfig, r *http.Request) (tracer.StartSpanOption, func() string) { + var endpoint string + + return func(sc *tracer.StartSpanConfig) { + if sc.Tags == nil { + return + } + if serveCfg.Route != "" { + sc.Tags[ext.HTTPRoute] = serveCfg.Route + } + + // This feature is currently disabled by default, except when AppSec is enabled at startup. It can be explicitly + // enabled or disabled for all requests by setting the value of DD_TRACE_RESOURCE_RENAMING_ENABLED. + if (cfg.resourceRenamingEnabled != nil && !*cfg.resourceRenamingEnabled) || (cfg.resourceRenamingEnabled == nil && !cfg.appsecEnabledMode()) { + return + } + + httpURL := r.URL.EscapedPath() + if cfg.resourceRenamingAlwaysSimplifiedEndpoint { + endpoint = simplifyHTTPUrl(httpURL) + sc.Tags[ext.HTTPEndpoint] = endpoint + return + } + + if serveCfg.Route != "" { + endpoint = serveCfg.Route + } else { + endpoint = simplifyHTTPUrl(httpURL) + } + + sc.Tags[ext.HTTPEndpoint] = endpoint + }, func() string { + return endpoint + } +} + +// renamedRoute returns the key value to use for the API Security sampler. +// If no route or endpoint are available, the key is computed based on the url. +func renamedRoute(route string, endpoint string, url string) string { + if route != "" { + return route + } + if endpoint != "" { + return endpoint + } + return simplifyHTTPUrl(url) +} diff --git a/instrumentation/httptrace/config.go b/instrumentation/httptrace/config.go new file mode 100644 index 0000000000..312edeaa88 --- /dev/null +++ b/instrumentation/httptrace/config.go @@ -0,0 +1,185 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +package httptrace + +import ( + "fmt" + "regexp" + "strconv" + "strings" + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// The env vars described below are used to configure the http security tags collection. +// See https://docs.datadoghq.com/tracing/setup_overview/configure_data_security to learn how to use those properly. +const ( + // envQueryStringDisabled is the name of the env var used to disabled query string collection. + envQueryStringDisabled = "DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED" + // EnvQueryStringRegexp is the name of the env var used to specify the regexp to use for query string obfuscation. + EnvQueryStringRegexp = "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP" + // envTraceClientIPEnabled is the name of the env var used to specify whether or not to collect client ip in span tags + envTraceClientIPEnabled = "DD_TRACE_CLIENT_IP_ENABLED" + // envServerErrorStatuses is the name of the env var used to specify error status codes on http server spans + envServerErrorStatuses = "DD_TRACE_HTTP_SERVER_ERROR_STATUSES" + // envInferredProxyServicesEnabled is the name of the env var used for enabling inferred span tracing + envInferredProxyServicesEnabled = "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED" +) + +// defaultQueryStringRegexp is the regexp used for query string obfuscation if [EnvQueryStringRegexp] is empty. +var defaultQueryStringRegexp = regexp.MustCompile("(?i)(?:p(?:ass)?w(?:or)?d|pass(?:_?phrase)?|secret|(?:api_?|private_?|public_?|access_?|secret_?)key(?:_?id)?|token|consumer_?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?)(?:(?:\\s|%20)*(?:=|%3D)[^&]+|(?:\"|%22)(?:\\s|%20)*(?::|%3A)(?:\\s|%20)*(?:\"|%22)(?:%2[^2]|%[^2]|[^\"%])+(?:\"|%22))|bearer(?:\\s|%20)+[a-z0-9\\._\\-]|token(?::|%3A)[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L](?:[\\w=-]|%3D)+\\.ey[I-L](?:[\\w=-]|%3D)+(?:\\.(?:[\\w.+\\/=-]|%3D|%2F|%2B)+)?|[\\-]{5}BEGIN(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY[\\-]{5}[^\\-]+[\\-]{5}END(?:[a-z\\s]|%20)+PRIVATE(?:\\s|%20)KEY|ssh-rsa(?:\\s|%20)*(?:[a-z0-9\\/\\.+]|%2F|%5C|%2B){100,}") + +type config struct { + queryStringRegexp *regexp.Regexp // specifies the regexp to use for query string obfuscation. + queryString bool // reports whether the query string should be included in the URL span tag. + traceClientIP bool + isStatusError func(statusCode int) bool + inferredProxyServicesEnabled bool + allowAllBaggage bool // tag all baggage items when true (DD_TRACE_BAGGAGE_TAG_KEYS="*"). + baggageTagKeys map[string]struct{} // when allowAllBaggage is false, only tag baggage items whose keys are listed here. + resourceRenamingEnabled *bool + resourceRenamingAlwaysSimplifiedEndpoint bool + appsecEnabledMode func() bool // first state of Appsec (registered at the start of the application) // TODO: remove and use the real state of appsec +} + +func (c config) String() string { + return fmt.Sprintf("config{queryString: %t, traceClientIP: %t, inferredProxyServicesEnabled: %t}", c.queryString, c.traceClientIP, c.inferredProxyServicesEnabled) +} + +// ResetCfg sets local variable cfg back to its defaults (mainly useful for testing) +func ResetCfg() { + cfg = newConfig() +} + +func newConfig() config { + c := config{ + queryString: !internal.BoolEnv(envQueryStringDisabled, false), + queryStringRegexp: QueryStringRegexp(), + traceClientIP: internal.BoolEnv(envTraceClientIPEnabled, false), + isStatusError: isServerError, + inferredProxyServicesEnabled: internal.BoolEnv(envInferredProxyServicesEnabled, false), + baggageTagKeys: make(map[string]struct{}), + resourceRenamingAlwaysSimplifiedEndpoint: internal.BoolEnv("DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT", false), + appsecEnabledMode: sync.OnceValue(appsec.Enabled), + } + if v, ok := env.Lookup("DD_TRACE_BAGGAGE_TAG_KEYS"); ok { + if v == "*" { + c.allowAllBaggage = true + } else { + for _, part := range strings.Split(v, ",") { + key := strings.TrimSpace(part) + if key == "" { + continue + } + c.baggageTagKeys[key] = struct{}{} + } + } + } else { + c.baggageTagKeys = defaultBaggageTagKeys() + } + v := env.Get(envServerErrorStatuses) + if fn := GetErrorCodesFromInput(v); fn != nil { + c.isStatusError = fn + } + if vv, ok := internal.BoolEnvNoDefault("DD_TRACE_RESOURCE_RENAMING_ENABLED"); ok { + c.resourceRenamingEnabled = &vv + } + return c +} + +func isServerError(statusCode int) bool { + return statusCode >= 500 && statusCode < 600 +} + +func QueryStringRegexp() *regexp.Regexp { + if s, ok := env.Lookup(EnvQueryStringRegexp); !ok { + return defaultQueryStringRegexp + } else if s == "" { + log.Debug("%s is set but empty. Query string obfuscation will be disabled.", EnvQueryStringRegexp) + return nil + } else if r, err := regexp.Compile(s); err == nil { + return r + } + log.Error("Could not compile regexp from %s. Using default regexp instead.", EnvQueryStringRegexp) + return defaultQueryStringRegexp + +} + +// GetErrorCodesFromInput parses a comma-separated string s to determine which codes are to be considered errors +// Its purpose is to support the DD_TRACE_HTTP_SERVER_ERROR_STATUSES env var +// If error condition cannot be determined from s, `nil` is returned +// e.g, input of "100,200,300-400" returns a function that returns true on 100, 200, and all values between 300-400, inclusive +// any input that cannot be translated to integer values returns nil +func GetErrorCodesFromInput(s string) func(statusCode int) bool { + if s == "" { + return nil + } + var codes []int + var ranges [][]int + vals := strings.Split(s, ",") + for _, val := range vals { + // "-" indicates a range of values + if strings.Contains(val, "-") { + bounds := strings.Split(val, "-") + if len(bounds) != 2 { + log.Debug("Trouble parsing %q due to entry %q, using default error status determination logic", s, val) + return nil + } + before, err := strconv.Atoi(bounds[0]) + if err != nil { + log.Debug("Trouble parsing %q due to entry %q, using default error status determination logic", s, val) + return nil + } + after, err := strconv.Atoi(bounds[1]) + if err != nil { + log.Debug("Trouble parsing %q due to entry %q, using default error status determination logic", s, val) + return nil + } + ranges = append(ranges, []int{before, after}) + } else { + intVal, err := strconv.Atoi(val) + if err != nil { + log.Debug("Trouble parsing %q due to entry %q, using default error status determination logic", s, val) + return nil + } + codes = append(codes, intVal) + } + } + return func(statusCode int) bool { + for _, c := range codes { + if c == statusCode { + return true + } + } + for _, bounds := range ranges { + if statusCode >= bounds[0] && statusCode <= bounds[1] { + return true + } + } + return false + } +} + +func defaultBaggageTagKeys() map[string]struct{} { + return map[string]struct{}{ + "user.id": {}, + "account.id": {}, + "session.id": {}, + } +} + +// tagBaggageKey returns true if we should tag this baggage key. +func (c *config) tagBaggageKey(key string) bool { + if c.allowAllBaggage { + return true + } + _, ok := c.baggageTagKeys[key] + return ok +} diff --git a/contrib/internal/httptrace/config_test.go b/instrumentation/httptrace/config_test.go similarity index 93% rename from contrib/internal/httptrace/config_test.go rename to instrumentation/httptrace/config_test.go index 6b6856d01c..ce21bcb817 100644 --- a/contrib/internal/httptrace/config_test.go +++ b/instrumentation/httptrace/config_test.go @@ -29,7 +29,7 @@ func TestConfig(t *testing.T) { name: "bad-values", env: map[string]string{ envQueryStringDisabled: "invalid", - envQueryStringRegexp: "+", + EnvQueryStringRegexp: "+", }, cfg: defaultCfg, }, @@ -42,7 +42,7 @@ func TestConfig(t *testing.T) { }, { name: "disable-query-obf", - env: map[string]string{envQueryStringRegexp: ""}, + env: map[string]string{EnvQueryStringRegexp: ""}, cfg: config{ queryString: true, }, diff --git a/instrumentation/httptrace/httptrace.go b/instrumentation/httptrace/httptrace.go new file mode 100644 index 0000000000..ce0bd67b94 --- /dev/null +++ b/instrumentation/httptrace/httptrace.go @@ -0,0 +1,250 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package httptrace provides functionalities to trace HTTP requests that are commonly required and used across +// contrib/** integrations. +package httptrace + +import ( + "context" + "fmt" + "net/http" + "strconv" + "strings" + "sync" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +var ( + cfg = newConfig() +) + +var instr *instrumentation.Instrumentation + +func init() { + instr = instrumentation.Load(instrumentation.PackageNetHTTP) +} + +var reportTelemetryConfigOnce sync.Once + +type inferredSpanCreatedCtxKey struct{} + +type FinishSpanFunc = func(status int, errorFn func(int) bool, opts ...tracer.FinishOption) + +// StartRequestSpan starts an HTTP request span with the standard list of HTTP request span tags (http.method, http.url, +// http.useragent). Any further span start option can be added with opts. +func StartRequestSpan(r *http.Request, opts ...tracer.StartSpanOption) (*tracer.Span, context.Context, FinishSpanFunc) { + // Append our span options before the given ones so that the caller can "overwrite" them. + // TODO(): rework span start option handling (https://github.com/DataDog/dd-trace-go/issues/1352) + + // we cannot track the configuration in newConfig because it's called during init() and the the telemetry client + // is not initialized yet + reportTelemetryConfigOnce.Do(func() { + telemetry.RegisterAppConfig("inferred_proxy_services_enabled", cfg.inferredProxyServicesEnabled, telemetry.OriginEnvVar) + log.Debug("internal/httptrace: telemetry.RegisterAppConfig called with cfg: %s", cfg) + }) + + var ipTags map[string]string + if cfg.traceClientIP { + ipTags, _ = httpsec.ClientIPTags(r.Header, true, r.RemoteAddr) + } + + var inferredProxySpan *tracer.Span + + if cfg.inferredProxyServicesEnabled { + inferredProxySpanCreated := false + + if created, ok := r.Context().Value(inferredSpanCreatedCtxKey{}).(bool); ok { + inferredProxySpanCreated = created + } + + if !inferredProxySpanCreated { + var inferredStartSpanOpts []tracer.StartSpanOption + + requestProxyContext, err := extractInferredProxyContext(r.Header) + if err != nil { + log.Debug("%s\n", err.Error()) + } else { + // TODO: Baggage? + spanParentCtx, spanParentErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) + if spanParentErr == nil { + if spanParentCtx != nil && spanParentCtx.SpanLinks() != nil { + inferredStartSpanOpts = append(inferredStartSpanOpts, tracer.WithSpanLinks(spanParentCtx.SpanLinks())) + } + } + inferredProxySpan = startInferredProxySpan(requestProxyContext, spanParentCtx, inferredStartSpanOpts...) + } + } + } + + parentCtx, extractErr := tracer.Extract(tracer.HTTPHeadersCarrier(r.Header)) + if extractErr == nil && parentCtx != nil { + ctx2 := r.Context() + parentCtx.ForeachBaggageItem(func(k, v string) bool { + ctx2 = baggage.Set(ctx2, k, v) + return true + }) + r = r.WithContext(ctx2) + } + + nopts := make([]tracer.StartSpanOption, 0, len(opts)+1+len(ipTags)) + nopts = append(nopts, + func(ssCfg *tracer.StartSpanConfig) { + if ssCfg.Tags == nil { + ssCfg.Tags = make(map[string]interface{}) + } + ssCfg.Tags[ext.SpanType] = ext.SpanTypeWeb + ssCfg.Tags[ext.HTTPMethod] = r.Method + ssCfg.Tags[ext.HTTPURL] = URLFromRequest(r, cfg.queryString) + ssCfg.Tags[ext.HTTPUserAgent] = r.UserAgent() + ssCfg.Tags["_dd.measured"] = 1 + if r.Host != "" { + ssCfg.Tags["http.host"] = r.Host + } + + if inferredProxySpan != nil { + tracer.ChildOf(inferredProxySpan.Context())(ssCfg) + } else if extractErr == nil && parentCtx != nil { + if links := parentCtx.SpanLinks(); links != nil { + tracer.WithSpanLinks(links)(ssCfg) + } + tracer.ChildOf(parentCtx)(ssCfg) + } + + parentCtx.ForeachBaggageItem(func(k, v string) bool { + if cfg.tagBaggageKey(k) { + ssCfg.Tags["baggage."+k] = v + } + return true + }) + + for k, v := range ipTags { + ssCfg.Tags[k] = v + } + }) + nopts = append(nopts, opts...) + + requestContext := r.Context() + if inferredProxySpan != nil { + requestContext = context.WithValue(requestContext, inferredSpanCreatedCtxKey{}, true) + } + + span, ctx := tracer.StartSpanFromContext(requestContext, instr.OperationName(instrumentation.ComponentServer, nil), nopts...) + return span, ctx, func(status int, errorFn func(int) bool, opts ...tracer.FinishOption) { + FinishRequestSpan(span, status, errorFn, opts...) + if inferredProxySpan != nil { + FinishRequestSpan(inferredProxySpan, status, errorFn, opts...) + } + } +} + +// FinishRequestSpan finishes the given HTTP request span and sets the expected response-related tags such as the status +// code. If not nil, errorFn will override the isStatusError method on httptrace for determining error codes. Any further span finish option can be added with opts. +func FinishRequestSpan(s *tracer.Span, status int, errorFn func(int) bool, opts ...tracer.FinishOption) { + var statusStr string + var fn func(int) bool + if errorFn == nil { + fn = cfg.isStatusError + } else { + fn = errorFn + } + // if status is 0, treat it like 200 unless 0 was called out in DD_TRACE_HTTP_SERVER_ERROR_STATUSES + if status == 0 { + if fn(status) { + statusStr = "0" + s.SetTag(ext.ErrorNoStackTrace, fmt.Errorf("%s: %s", statusStr, http.StatusText(status))) + } else { + statusStr = "200" + } + } else { + statusStr = strconv.Itoa(status) + if fn(status) { + s.SetTag(ext.ErrorNoStackTrace, fmt.Errorf("%s: %s", statusStr, http.StatusText(status))) + } + } + fc := &tracer.FinishConfig{} + for _, opt := range opts { + if opt == nil { + continue + } + opt(fc) + } + if fc.NoDebugStack { + // This is a workaround to ensure that the error stack is not set when NoDebugStack is true. + // This is required because the error stack is set when we call `s.SetTag(ext.Error, err)` just + // a few lines above. + // This is also caused by the fact that the error stack generation is controlled by `tracer.WithDebugStack` (globally) + // or `tracer.NoDebugStack` (per span, but only when we finish the span). These two options don't allow to control + // the error stack generation per span that happens in `FinishRequestSpan` before calling `s.Finish`. + s.SetTag("error.stack", "") + } + s.SetTag(ext.HTTPCode, statusStr) + s.Finish(tracer.WithFinishConfig(fc)) +} + +// URLFromRequest returns the full URL from the HTTP request. If queryString is true, params are collected and they are obfuscated either by the default query string obfuscator or the custom obfuscator provided by the user (through DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP) +// See https://docs.datadoghq.com/tracing/configure_data_security/?tab=net#redact-query-strings for more information. +func URLFromRequest(r *http.Request, queryString bool) string { + // Quoting net/http comments about net.Request.URL on server requests: + // "For most requests, fields other than Path and RawQuery will be + // empty. (See RFC 7230, Section 5.3)" + // This is why we can't rely entirely on url.URL.String(), url.URL.Host, url.URL.Scheme, etc... + var url string + path := r.URL.EscapedPath() + scheme := "http" + if s := r.URL.Scheme; s != "" { + scheme = s + } else if r.TLS != nil { + scheme = "https" + } + if r.Host != "" { + url = strings.Join([]string{scheme, "://", r.Host, path}, "") + } else { + url = path + } + // Collect the query string if we are allowed to report it and obfuscate it if possible/allowed + if queryString && r.URL.RawQuery != "" { + query := r.URL.RawQuery + if cfg.queryStringRegexp != nil { + query = cfg.queryStringRegexp.ReplaceAllLiteralString(query, "") + } + url = strings.Join([]string{url, query}, "?") + } + if frag := r.URL.EscapedFragment(); frag != "" { + url = strings.Join([]string{url, frag}, "#") + } + return url +} + +// HeaderTagsFromRequest matches req headers to user-defined list of header tags +// and creates span tags based on the header tag target and the req header value +func HeaderTagsFromRequest(req *http.Request, headerTags instrumentation.HeaderTags) tracer.StartSpanOption { + var tags []struct { + key string + val string + } + + headerTags.Iter(func(header, tag string) { + if vs, ok := req.Header[header]; ok { + tags = append(tags, struct { + key string + val string + }{tag, strings.TrimSpace(strings.Join(vs, ","))}) + } + }) + + return func(cfg *tracer.StartSpanConfig) { + for _, t := range tags { + cfg.Tags[t.key] = t.val + } + } +} diff --git a/instrumentation/httptrace/httptrace_api_gateway_test.go b/instrumentation/httptrace/httptrace_api_gateway_test.go new file mode 100644 index 0000000000..8d8b6d6295 --- /dev/null +++ b/instrumentation/httptrace/httptrace_api_gateway_test.go @@ -0,0 +1,198 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptrace + +import ( + "fmt" + "net/http" + "strconv" + "strings" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/internal/normalizer" +) + +func TestInferredProxySpans(t *testing.T) { + t.Setenv("DD_SERVICE", "aws-server") + t.Setenv("DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED", "true") + ResetCfg() + + startTime := time.Now().Add(-5 * time.Second) + + inferredHeaders := map[string]string{ + "x-dd-proxy": "aws-apigateway", + "x-dd-proxy-request-time-ms": strconv.FormatInt(startTime.UnixMilli(), 10), + "x-dd-proxy-path": "/test", + "x-dd-proxy-httpmethod": "GET", + "x-dd-proxy-domain-name": "example.com", + "x-dd-proxy-stage": "dev", + } + srvURL := "https://example.com/test" + + t.Run("should create parent and child spans for a 200", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", fmt.Sprintf("%s/", srvURL), nil) + require.NoError(t, err) + + for k, v := range inferredHeaders { + req.Header.Set(k, v) + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 2, len(spans)) + + gwSpan := spans[1] + webReqSpan := spans[0] + assert.Equal(t, "aws.apigateway", gwSpan.OperationName()) + assert.Equal(t, "http.request", webReqSpan.OperationName()) + assert.Equal(t, "example.com", gwSpan.Tag("service.name")) + assert.Equal(t, float64(1), gwSpan.Tag("_dd.inferred_span")) + assert.True(t, webReqSpan.ParentID() == gwSpan.SpanID()) + assert.Equal(t, webReqSpan.Tag("http.status_code"), gwSpan.Tag("http.status_code")) + assert.Equal(t, webReqSpan.Tag("span.type"), gwSpan.Tag("span.type")) + + assert.Equal(t, startTime.UnixMilli(), gwSpan.StartTime().UnixMilli()) + + for _, arg := range inferredHeaders { + header, tag := normalizer.HeaderTag(arg) + + // Default to an empty string if the tag does not exist + gwSpanTags, exists := gwSpan.Tags()[tag] + if !exists { + gwSpanTags = "" + } + expectedTags := strings.Join(req.Header.Values(header), ",") + assert.Equal(t, expectedTags, gwSpanTags) + } + }) + + t.Run("should create parent and child spans for error", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", fmt.Sprintf("%s/error", srvURL), nil) + require.NoError(t, err) + + for k, v := range inferredHeaders { + req.Header.Set(k, v) + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(500, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 2, len(spans)) + + gwSpan := spans[1] + webReqSpan := spans[0] + assert.Equal(t, "aws.apigateway", gwSpan.OperationName()) + assert.Equal(t, "http.request", webReqSpan.OperationName()) + assert.Equal(t, "example.com", gwSpan.Tag("service.name")) + assert.Equal(t, float64(1), gwSpan.Tag("_dd.inferred_span")) + assert.True(t, webReqSpan.ParentID() == gwSpan.SpanID()) + assert.Equal(t, webReqSpan.Tag("http.status_code"), gwSpan.Tag("http.status_code")) + assert.Equal(t, webReqSpan.Tag("span.type"), gwSpan.Tag("span.type")) + assert.Equal(t, startTime.UnixMilli(), gwSpan.StartTime().UnixMilli()) + + assert.Equal(t, "500: Internal Server Error", gwSpan.Tag(ext.ErrorMsg)) + assert.Equal(t, "500: Internal Server Error", webReqSpan.Tag(ext.ErrorMsg)) + + for _, arg := range inferredHeaders { + header, tag := normalizer.HeaderTag(arg) + + // Default to an empty string if the tag does not exist + gwSpanTags, exists := gwSpan.Tags()[tag] + if !exists { + gwSpanTags = "" + } + expectedTags := strings.Join(req.Header.Values(header), ",") + assert.Equal(t, expectedTags, gwSpanTags) + } + }) + + t.Run("should not create API Gateway span if headers are missing", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", fmt.Sprintf("%s/no-aws-headers", srvURL), nil) + require.NoError(t, err) + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + assert.Equal(t, http.StatusOK, 200) + + spans := mt.FinishedSpans() + require.Equal(t, 1, len(spans)) + assert.Equal(t, "http.request", spans[0].OperationName()) + }) + + t.Run("should not create API Gateway span if x-dd-proxy is missing", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", fmt.Sprintf("%s/no-aws-headers", srvURL), nil) + require.NoError(t, err) + + for k, v := range inferredHeaders { + if k != "x-dd-proxy" { + req.Header.Set(k, v) + } + } + + _, _, finishSpans := StartRequestSpan(req) + finishSpans(200, nil) + + spans := mt.FinishedSpans() + assert.Equal(t, 1, len(spans)) + assert.Equal(t, "http.request", spans[0].OperationName()) + }) + + t.Run("should not create more than one API Gateway span for a local trace", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", fmt.Sprintf("%s/", srvURL), nil) + require.NoError(t, err) + for k, v := range inferredHeaders { + req.Header.Set(k, v) + } + + _, ctx, finishSpans1 := StartRequestSpan(req) + finishSpans1(200, nil) + + req2 := req.WithContext(ctx) + _, _, finishSpans2 := StartRequestSpan(req2) + finishSpans2(200, nil) + + spans := mt.FinishedSpans() + require.Equal(t, 3, len(spans)) + + gwSpan := spans[1] + webReqSpan := spans[0] + assert.Equal(t, "aws.apigateway", gwSpan.OperationName()) + assert.Equal(t, "http.request", webReqSpan.OperationName()) + assert.Equal(t, "example.com", gwSpan.Tag("service.name")) + assert.Equal(t, float64(1), gwSpan.Tag("_dd.inferred_span")) + assert.True(t, webReqSpan.ParentID() == gwSpan.SpanID()) + assert.Equal(t, webReqSpan.Tag("http.status_code"), gwSpan.Tag("http.status_code")) + assert.Equal(t, webReqSpan.Tag("span.type"), gwSpan.Tag("span.type")) + + assert.Equal(t, startTime.UnixMilli(), gwSpan.StartTime().UnixMilli()) + }) +} diff --git a/instrumentation/httptrace/httptrace_test.go b/instrumentation/httptrace/httptrace_test.go new file mode 100644 index 0000000000..971b3269c5 --- /dev/null +++ b/instrumentation/httptrace/httptrace_test.go @@ -0,0 +1,852 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptrace + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "net/netip" + "net/url" + "os" + "runtime" + "strconv" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/baggage" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/normalizer" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestGetErrorCodesFromInput(t *testing.T) { + codesOnly := "400,401,402" + rangesOnly := "400-405,408-410" + mixed := "400,403-405,407-410,412" + invalid1 := "1,100-200-300-" + invalid2 := "abc:@3$5^," + empty := "" + t.Run("codesOnly", func(t *testing.T) { + fn := GetErrorCodesFromInput(codesOnly) + for i := 400; i <= 402; i++ { + assert.True(t, fn(i)) + } + assert.False(t, fn(500)) + assert.False(t, fn(0)) + }) + t.Run("rangesOnly", func(t *testing.T) { + fn := GetErrorCodesFromInput(rangesOnly) + for i := 400; i <= 405; i++ { + assert.True(t, fn(i)) + } + for i := 408; i <= 410; i++ { + assert.True(t, fn(i)) + } + assert.False(t, fn(406)) + assert.False(t, fn(411)) + assert.False(t, fn(500)) + }) + t.Run("mixed", func(t *testing.T) { + fn := GetErrorCodesFromInput(mixed) + assert.True(t, fn(400)) + assert.False(t, fn(401)) + for i := 403; i <= 405; i++ { + assert.True(t, fn(i)) + } + assert.False(t, fn(406)) + for i := 407; i <= 410; i++ { + assert.True(t, fn(i)) + } + assert.False(t, fn(411)) + assert.False(t, fn(500)) + }) + // invalid entries below should result in nils + t.Run("invalid1", func(t *testing.T) { + fn := GetErrorCodesFromInput(invalid1) + assert.Nil(t, fn) + }) + t.Run("invalid2", func(t *testing.T) { + fn := GetErrorCodesFromInput(invalid2) + assert.Nil(t, fn) + }) + t.Run("empty", func(t *testing.T) { + fn := GetErrorCodesFromInput(empty) + assert.Nil(t, fn) + }) +} + +func TestConfiguredErrorStatuses(t *testing.T) { + defer os.Unsetenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES") + t.Run("configured", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + os.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "199-399,400,501") + + // re-run config defaults based on new DD_TRACE_HTTP_SERVER_ERROR_STATUSES value + ResetCfg() + + statuses := []int{0, 200, 400, 500} + r := httptest.NewRequest(http.MethodGet, "/test", nil) + for i, status := range statuses { + sp, _, _ := StartRequestSpan(r) + FinishRequestSpan(sp, status, nil) + spans := mt.FinishedSpans() + require.Len(t, spans, i+1) + + switch status { + case 0: + assert.Equal(t, "200", spans[i].Tag(ext.HTTPCode)) + assert.Nil(t, spans[i].Tag(ext.ErrorMsg)) + case 200, 400: + assert.Equal(t, strconv.Itoa(status), spans[i].Tag(ext.HTTPCode)) + assert.Equal(t, fmt.Sprintf("%s: %s", strconv.Itoa(status), http.StatusText(status)), spans[i].Tag(ext.ErrorMsg)) + case 500: + assert.Equal(t, strconv.Itoa(status), spans[i].Tag(ext.HTTPCode)) + assert.Nil(t, spans[i].Tag(ext.ErrorMsg)) + } + } + }) + t.Run("zero", func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + os.Setenv("DD_TRACE_HTTP_SERVER_ERROR_STATUSES", "0") + + // re-run config defaults based on new DD_TRACE_HTTP_SERVER_ERROR_STATUSES value + ResetCfg() + + r := httptest.NewRequest(http.MethodGet, "/test", nil) + sp, _, _ := StartRequestSpan(r) + FinishRequestSpan(sp, 0, nil) + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Equal(t, "0", spans[0].Tag(ext.HTTPCode)) + assert.Equal(t, fmt.Sprintf("0: %s", http.StatusText(0)), spans[0].Tag(ext.ErrorMsg)) + }) +} + +func TestHeaderTagsFromRequest(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + r := httptest.NewRequest(http.MethodGet, "/test", nil) + r.Header.Set("header1", "val1") + r.Header.Set("header2", " val2 ") + r.Header.Set("header3", "v a l 3") + r.Header.Set("x-datadog-header", "val4") + + expectedHeaderTags := map[string]string{ + "tag1": "val1", + "tag2": "val2", + "tag3": "v a l 3", + "tag4": "val4", + } + + hs := []string{"header1:tag1", "header2:tag2", "header3:tag3", "x-datadog-header:tag4"} + ht := internal.NewLockMap(normalizer.HeaderTagSlice(hs)) + s, _, _ := StartRequestSpan(r, HeaderTagsFromRequest(r, ht)) + s.Finish() + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + for expectedTag, expectedTagVal := range expectedHeaderTags { + assert.Equal(t, expectedTagVal, spans[0].Tags()[expectedTag]) + } +} + +func TestStartRequestSpan(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + r := httptest.NewRequest(http.MethodGet, "/somePath", nil) + s, _, _ := StartRequestSpan(r) + s.Finish() + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Equal(t, "example.com", spans[0].Tag("http.host")) +} + +// TestClientIP tests behavior of StartRequestSpan based on +// the DD_TRACE_CLIENT_IP_ENABLED environment variable +func TestTraceClientIPFlag(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + tp := new(log.RecordLogger) + defer log.UseLogger(tp)() + + // use 0.0.0.0 as ip address of all test cases + // more comprehensive ip address testing is done in testing + // of ClientIPTags in appsec/dyngo/instrumentation/httpsec + validIPAddr := "0.0.0.0" + + type ipTestCase struct { + name string + remoteAddr string + traceClientIPEnvVal string + expectTrace bool + expectedIP netip.Addr + } + + oldConfig := cfg + defer func() { cfg = oldConfig }() + + for _, tc := range []ipTestCase{ + { + name: "Trace client IP set to true", + remoteAddr: validIPAddr, + expectedIP: netip.MustParseAddr(validIPAddr), + traceClientIPEnvVal: "true", + expectTrace: true, + }, + { + name: "Trace client IP set to false", + remoteAddr: validIPAddr, + expectedIP: netip.MustParseAddr(validIPAddr), + traceClientIPEnvVal: "false", + expectTrace: false, + }, + { + name: "Trace client IP unset", + remoteAddr: validIPAddr, + expectedIP: netip.MustParseAddr(validIPAddr), + traceClientIPEnvVal: "", + expectTrace: false, + }, + { + name: "Trace client IP set to non-boolean value", + remoteAddr: validIPAddr, + expectedIP: netip.MustParseAddr(validIPAddr), + traceClientIPEnvVal: "asdadsasd", + expectTrace: false, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Setenv(envTraceClientIPEnabled, tc.traceClientIPEnvVal) + + // reset config based on new DD_TRACE_CLIENT_IP_ENABLED value + cfg = newConfig() + + r := httptest.NewRequest(http.MethodGet, "/somePath", nil) + r.RemoteAddr = tc.remoteAddr + s, _, _ := StartRequestSpan(r) + s.Finish() + spans := mt.FinishedSpans() + targetSpan := spans[0] + + if tc.expectTrace { + assert.Equal(t, tc.expectedIP.String(), targetSpan.Tag(ext.HTTPClientIP)) + } else { + assert.NotContains(t, targetSpan.Tags(), ext.HTTPClientIP) + if _, err := strconv.ParseBool(tc.traceClientIPEnvVal); err != nil && tc.traceClientIPEnvVal != "" { + logs := tp.Logs() + assert.Contains(t, logs[len(logs)-1], "Non-boolean value for env var DD_TRACE_CLIENT_IP_ENABLED") + tp.Reset() + } + } + mt.Reset() + }) + } +} + +func TestURLTag(t *testing.T) { + type URLTestCase struct { + name, expectedURL, host, port, path, query, fragment string + } + for _, tc := range []URLTestCase{ + { + name: "no-host", + expectedURL: "/test", + path: "/test", + }, + { + name: "basic", + expectedURL: "http://example.com/", + host: "example.com", + }, + { + name: "basic-path", + expectedURL: "http://example.com/test", + host: "example.com", + path: "/test", + }, + { + name: "basic-port", + expectedURL: "http://example.com:8080/", + host: "example.com", + port: "8080", + }, + { + name: "basic-fragment", + expectedURL: "http://example.com/#test", + host: "example.com", + fragment: "test", + }, + { + name: "query1", + expectedURL: "http://example.com/?test1=test2", + host: "example.com", + query: "test1=test2", + }, + { + name: "query2", + expectedURL: "http://example.com/?test1=test2&test3=test4", + host: "example.com", + query: "test1=test2&test3=test4", + }, + { + name: "combined", + expectedURL: "http://example.com:7777/test?test1=test2&test3=test4#test", + host: "example.com", + path: "/test", + query: "test1=test2&test3=test4", + port: "7777", + fragment: "test", + }, + { + name: "basic-obfuscation1", + expectedURL: "http://example.com/?%3Credacted%3E", + host: "example.com", + query: "token=value", + }, + { + name: "basic-obfuscation2", + expectedURL: "http://example.com/?test0=test1&%3Credacted%3E&test1=test2", + host: "example.com", + query: "test0=test1&token=value&test1=test2", + }, + { + name: "combined-obfuscation", + expectedURL: "http://example.com:7777/test?test1=test2&%3Credacted%3E&test3=test4#test", + host: "example.com", + path: "/test", + query: "test1=test2&token=value&test3=test4", + port: "7777", + fragment: "test", + }, + } { + t.Run(tc.name, func(t *testing.T) { + r := http.Request{ + URL: &url.URL{ + Path: tc.path, + RawQuery: tc.query, + Fragment: tc.fragment, + }, + Host: tc.host, + } + if tc.port != "" { + r.Host += ":" + tc.port + } + url := URLFromRequest(&r, true) + require.Equal(t, tc.expectedURL, url) + }) + } +} + +func BenchmarkStartRequestSpan(b *testing.B) { + b.ReportAllocs() + r, err := http.NewRequest("GET", "http://example.com/", nil) + if err != nil { + b.Errorf("Failed to create request: %v", err) + return + } + log.UseLogger(log.DiscardLogger{}) + opts := []tracer.StartSpanOption{ + tracer.ServiceName("SomeService"), + tracer.ResourceName("SomeResource"), + tracer.Tag(ext.HTTPRoute, "/some/route/?"), + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + StartRequestSpan(r, opts...) + } +} + +func TestStartRequestSpanWithBaggage(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE", "datadog,tracecontext,baggage") + tracer.Start() + defer tracer.Stop() + + r := httptest.NewRequest(http.MethodGet, "/somePath", nil) + r.Header.Set("baggage", "key1=value1,key2=value2") + s, ctx, _ := StartRequestSpan(r) + s.Finish() + // TODO: This behavior is not ideal. We want baggage headers accessible with r.Context (baggage.All(r.Context())) -- not the generated span's context. + spanBm := make(map[string]string) + s.Context().ForeachBaggageItem(func(k, v string) bool { + spanBm[k] = v + return true + }) + assert.Equal(t, "value1", spanBm["key1"]) + assert.Equal(t, "value2", spanBm["key2"]) + baggageMap := baggage.All(ctx) + assert.Equal(t, "value1", baggageMap["key1"], "should propagate baggage from header to context") + assert.Equal(t, "value2", baggageMap["key2"], "should propagate baggage from header to context") +} + +func TestBeforeHandleHTTPEndpoint(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + type tc struct { + name string + trn string // DD_TRACE_RESOURCE_RENAMING_ENABLED + always string // DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT + route string + expect func(*testing.T, *mocktracer.Span, *http.Request) + } + + route := "/api/v1/users/{id}" + cases := []tc{ + { + name: "no route, TRN=false, ALWAYS=false", + trn: "false", + always: "false", + route: "", + expect: func(t *testing.T, s *mocktracer.Span, r *http.Request) { + assert.Equal(t, nil, s.Tag(ext.HTTPEndpoint)) + }, + }, + { + name: "no route, TRN=true, ALWAYS=false", + trn: "true", + always: "false", + route: "", + expect: func(t *testing.T, s *mocktracer.Span, r *http.Request) { + expected := simplifyHTTPUrl(URLFromRequest(r, true)) + assert.Equal(t, expected, s.Tag(ext.HTTPEndpoint)) + }, + }, + { + name: "route present, TRN=true, ALWAYS=false", + trn: "true", + always: "false", + route: route, + expect: func(t *testing.T, s *mocktracer.Span, r *http.Request) { + assert.Equal(t, route, s.Tag(ext.HTTPEndpoint)) + }, + }, + { + name: "route present, TRN=true, ALWAYS=true", + trn: "true", + always: "true", + route: "/a/b/{id}", + expect: func(t *testing.T, s *mocktracer.Span, r *http.Request) { + expected := simplifyHTTPUrl(URLFromRequest(r, true)) + assert.Equal(t, expected, s.Tag(ext.HTTPEndpoint)) + }, + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + t.Setenv("DD_TRACE_RESOURCE_RENAMING_ENABLED", c.trn) + t.Setenv("DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT", c.always) + ResetCfg() + + r := httptest.NewRequest(http.MethodGet, "https://example.com/api/v1/users/123?foo=bar", nil) + w := httptest.NewRecorder() + cfg := &ServeConfig{Route: c.route} + + rw, rt, after, handled := BeforeHandle(cfg, w, r) + assert.False(t, handled) + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }).ServeHTTP(rw, rt) + after() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + c.expect(t, spans[0], r) + mt.Reset() + }) + } +} + +func TestResourceRenamingActivation(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skipf("cgo disabled / no appsec tag") + } + + type tc struct { + name string + trn *string // nil => unset + appsecStart bool + expectSet bool + } + + makeReq := func() (*http.Request, *httptest.ResponseRecorder, *ServeConfig) { + r := httptest.NewRequest(http.MethodGet, "https://example.com/a/b/123", nil) + w := httptest.NewRecorder() + cfg := &ServeConfig{Route: "/a/b/{id}"} + return r, w, cfg + } + + trueStr := "true" + falseStr := "false" + + cases := []tc{ + {name: "TRN true -> enabled", trn: &trueStr, appsecStart: false, expectSet: true}, + {name: "TRN false -> disabled", trn: &falseStr, appsecStart: false, expectSet: false}, + {name: "APPSEC true, TRN unset -> enabled", trn: nil, appsecStart: true, expectSet: true}, + {name: "APPSEC false, TRN unset -> disabled", trn: nil, appsecStart: false, expectSet: false}, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + os.Unsetenv("DD_TRACE_RESOURCE_RENAMING_ENABLED") + os.Unsetenv("DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT") + os.Unsetenv("DD_APPSEC_ENABLED") + + mt := mocktracer.Start() + defer mt.Stop() + + if c.trn != nil { + t.Setenv("DD_TRACE_RESOURCE_RENAMING_ENABLED", *c.trn) + } + + if c.appsecStart { + os.Setenv("DD_APPSEC_ENABLED", "true") + appsec.Start() + } + defer appsec.Stop() + + ResetCfg() + + r, w, cfg := makeReq() + rw, rt, after, handled := BeforeHandle(cfg, w, r) + assert.False(t, handled) + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }).ServeHTTP(rw, rt) + after() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + if c.expectSet { + assert.NotEmpty(t, spans[0].Tag(ext.HTTPEndpoint)) + } else { + assert.Empty(t, spans[0].Tag(ext.HTTPEndpoint)) + } + }) + } +} + +// Ensure the resource renaming is enabled only if appsec was enabled at the startup with the env var. +func TestResourceRenamingActivationAppSecNotStartup(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skipf("cgo disabled / no appsec tag") + } + + mt := mocktracer.Start() + defer mt.Stop() + + r := httptest.NewRequest(http.MethodGet, "https://example.com/a/b/123", nil) + w := httptest.NewRecorder() + cfg := &ServeConfig{Route: "/a/b/{id}"} + + rw, rt, after, handled := BeforeHandle(cfg, w, r) + assert.False(t, handled) + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }).ServeHTTP(rw, rt) + after() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Empty(t, spans[0].Tag(ext.HTTPEndpoint)) + + t.Setenv("DD_APPSEC_ENABLED", "true") // Force activation + appsec.Start() + defer appsec.Stop() + + rw, rt, after, handled = BeforeHandle(cfg, w, r) + assert.False(t, handled) + http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) }).ServeHTTP(rw, rt) + after() + + spans = mt.FinishedSpans() + require.Len(t, spans, 2) + assert.Empty(t, spans[1].Tag(ext.HTTPEndpoint)) +} + +func TestRenamedRouteSelection(t *testing.T) { + type tc struct { + name string + route string + endpoint string + url string // escaped path + expect string + } + + cases := []tc{ + { + name: "route used when available", + route: "/users/{id}", + url: "/users/123", + expect: "/users/{id}", + }, + { + name: "endpoint used when route empty", + endpoint: "/users/{id}", + url: "/users/123", + expect: "/users/{id}", + }, + { + name: "fallback to simplified url when both empty", + url: "/a/b/123456", + expect: simplifyHTTPUrl("/a/b/123456"), + }, + } + + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + got := renamedRoute(c.route, c.endpoint, c.url) + assert.Equal(t, c.expect, got) + }) + } +} + +func TestStartRequestSpanMergedBaggage(t *testing.T) { + t.Setenv("DD_TRACE_PROPAGATION_STYLE", "datadog,tracecontext,baggage") + tracer.Start() + defer tracer.Stop() + + // Create a base context with pre-set baggage. + baseCtx := baggage.Set(context.Background(), "pre_key", "pre_value") + + // Create an HTTP request with that context. + req := httptest.NewRequest(http.MethodGet, "/somePath", nil).WithContext(baseCtx) + + // Set the baggage header with additional baggage items. + req.Header.Set("baggage", "header_key=header_value,another_header=another_value") + + // Start the request span, which will extract header baggage and merge it with the context's baggage. + span, ctx, _ := StartRequestSpan(req) + span.Finish() + + // Retrieve the merged baggage from the span's context. + mergedBaggage := baggage.All(ctx) + + // Verify that both pre-set and header baggage items are present. + assert.Equal(t, "pre_value", mergedBaggage["pre_key"], "should contain pre-set baggage") + assert.Equal(t, "header_value", mergedBaggage["header_key"], "should contain header baggage") + assert.Equal(t, "another_value", mergedBaggage["another_header"], "should contain header baggage") +} + +func TestBaggageSpanTagsOpentracer(t *testing.T) { + tracer.Start() + defer tracer.Stop() + ctx := context.Background() + + // Create an HTTP request with no additional baggage context + req := httptest.NewRequest(http.MethodGet, "/somePath", nil).WithContext(ctx) + req.Header.Set("x-datadog-trace-id", "1") + req.Header.Set("x-datadog-parent-id", "2") + req.Header.Set("baggage", "session.id=789") // w3c baggage header + req.Header.Set("ot-baggage-user.id", "1234") // opentracer baggage header + + // Start the request span, which will extract baggage and add it as span tags + reqSpan, _, _ := StartRequestSpan(req) + m := reqSpan.AsMap() + + // Keys that SHOULD be present: + assert.Contains(t, m, "baggage.session.id", "baggage.session.id should be included in span tags") + assert.Equal(t, "789", m["baggage.session.id"], "should contain session.id value") + + // Keys that should NOT be present (user.id is ot-baggage header) + // This assertion WILL FAIL until baggage revamp is complete; therefore, commented out + // Baggage revamp Jira card: APMAPI-1442 + // assert.NotContains(t, m, "baggage.user.id", "baggage.user.id should not be included in span tags") + + reqSpan.Finish() +} + +// baggageSpanTagTest represents a test case for baggage span tag functionality +type baggageSpanTagTest struct { + name string + envValue string // DD_TRACE_BAGGAGE_TAG_KEYS value + baggageHeader string // baggage header value + preSetBaggage map[string]string // baggage to set in context before request + expectedTags map[string]string // tags that should be present with their values + unexpectedTags []string // tag keys that should not be present + needsResetCfg bool // whether to call ResetCfg() +} + +// runBaggageSpanTagTest is a helper function that runs a baggage span tag test case +func runBaggageSpanTagTest(t *testing.T, tc baggageSpanTagTest) { + t.Helper() + + // Set up environment variable if specified + if tc.envValue != "" { + os.Setenv("DD_TRACE_BAGGAGE_TAG_KEYS", tc.envValue) + defer os.Unsetenv("DD_TRACE_BAGGAGE_TAG_KEYS") + if tc.needsResetCfg { + ResetCfg() + } + } + + tracer.Start() + defer tracer.Stop() + + // Create base context with pre-set baggage if specified + ctx := context.Background() + for key, value := range tc.preSetBaggage { + ctx = baggage.Set(ctx, key, value) + } + + // Create HTTP request with context + req := httptest.NewRequest(http.MethodGet, "/somePath", nil).WithContext(ctx) + + // Set baggage header + if tc.baggageHeader != "" { + req.Header.Set("baggage", tc.baggageHeader) + } + + // Start request span and get span tags + span, _, _ := StartRequestSpan(req) + m := span.AsMap() + + // Check expected tags + for key, expectedValue := range tc.expectedTags { + assert.Contains(t, m, key, fmt.Sprintf("%s should be included in span tags", key)) + assert.Equal(t, expectedValue, m[key], fmt.Sprintf("should contain %s value", key)) + } + + // Check unexpected tags + for _, key := range tc.unexpectedTags { + assert.NotContains(t, m, key, fmt.Sprintf("%s should not be included in span tags", key)) + } + + span.Finish() +} + +func TestBaggageSpanTags(t *testing.T) { + tests := []baggageSpanTagTest{ + { + name: "default", + baggageHeader: "header_key=header_value,account.id=456,session.id=789", + preSetBaggage: map[string]string{"user.id": "1234"}, + expectedTags: map[string]string{ + "baggage.account.id": "456", + "baggage.session.id": "789", + }, + unexpectedTags: []string{"baggage.header_key", "baggage.user.id"}, + }, + { + name: "wildcard", + envValue: "*", + needsResetCfg: true, + baggageHeader: "user.id=abcd,account.id=456,session.id=789,color=blue,foo=bar", + expectedTags: map[string]string{ + "baggage.account.id": "456", + "baggage.user.id": "abcd", + "baggage.session.id": "789", + "baggage.color": "blue", + "baggage.foo": "bar", + }, + }, + { + name: "disabled", + envValue: " ", + needsResetCfg: true, + baggageHeader: "user.id=abcd,account.id=456,session.id=789,color=blue", + unexpectedTags: []string{ + "baggage.account.id", + "baggage.user.id", + "baggage.session.id", + "baggage.color", + }, + }, + { + name: "specify_keys", + envValue: "device,os.version,app.version", + needsResetCfg: true, + baggageHeader: "device=mobile,os.version=14.2,app.version=5.3.1,account.id=456,session.id=789,color=blue", + expectedTags: map[string]string{ + "baggage.device": "mobile", + "baggage.os.version": "14.2", + "baggage.app.version": "5.3.1", + }, + unexpectedTags: []string{ + "baggage.account.id", + "baggage.session.id", + "baggage.color", + }, + }, + { + name: "asterisk_key", + envValue: "user.id,*version", + needsResetCfg: true, + baggageHeader: "usr.id=fakeuser,*version=9.4,app.version=9.1.2", + expectedTags: map[string]string{ + "baggage.*version": "9.4", + }, + unexpectedTags: []string{ + "baggage.user.id", + "baggage.usr.id", + "baggage.app.version", + }, + }, + { + name: "malformed_header", + baggageHeader: "user.id=,account.id=456,session.id=789,foo=bar", + unexpectedTags: []string{ + "baggage.account.id", + "baggage.user.id", + "baggage.session.id", + "baggage.foo", + }, + }, + { + name: "case_sensitive", + baggageHeader: "user.id=doggo,ACCOUNT.id=456,seSsIon.id=789", + expectedTags: map[string]string{ + "baggage.user.id": "doggo", + }, + unexpectedTags: []string{ + "baggage.account.id", + "baggage.session.id", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + runBaggageSpanTagTest(t, tt) + }) + } +} + +// TestStartRequestSpanOnlyBaggageCreatesNewTrace verifies that when only baggage headers are present +// (no trace/span IDs), a new trace is created with a non-zero trace ID while still preserving the baggage. +func TestStartRequestSpanOnlyBaggageCreatesNewTrace(t *testing.T) { + tracer.Start() + defer tracer.Stop() + + // Create a request with only baggage header, no trace context + req := httptest.NewRequest(http.MethodGet, "/somePath", nil).WithContext(context.Background()) + req.Header.Set("baggage", "foo=bar") + + span, ctx, _ := StartRequestSpan(req) + span.Finish() + + // Verify that a new trace was created with a non-zero trace ID + sc := span.Context() + lower := sc.TraceIDLower() + assert.NotZero( + t, + lower, + "expected a new non‐zero TraceIDLower when only baggage header is present", + ) + + // Verify that baggage is still propagated despite the new trace + baggageMap := baggage.All(ctx) + assert.Equal(t, "bar", baggageMap["foo"], "should propagate baggage even when it's the only header") + +} diff --git a/instrumentation/httptrace/inferred_proxy.go b/instrumentation/httptrace/inferred_proxy.go new file mode 100644 index 0000000000..f74b51689b --- /dev/null +++ b/instrumentation/httptrace/inferred_proxy.go @@ -0,0 +1,153 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptrace + +import ( + "errors" + "fmt" + "net/http" + "strconv" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// These constants are intended to be used by tracers to extract and infer +// parent span information for distributed tracing systems. +const ( + // ProxyHeaderSystem is the header used to indicate the source of the + // proxy. In the case of AWS API Gateway, the value of this header + // will always be 'aws-apigateway'. + ProxyHeaderSystem = "X-Dd-Proxy" + + // ProxyHeaderStartTimeMs is the header used to indicate the start time + // of the request in milliseconds. This value corresponds to the + // 'context.requestTimeEpoch' in AWS API Gateway, providing a timestamp + // for when the request was initiated. + ProxyHeaderStartTimeMs = "X-Dd-Proxy-Request-Time-Ms" + + // ProxyHeaderPath is the header used to indicate the path of the + // request. This value corresponds to 'context.path' in AWS API Gateway, + // and helps identify the resource that the request is targeting. + ProxyHeaderPath = "X-Dd-Proxy-Path" + + // ProxyHeaderHTTPMethod is the header used to indicate the HTTP method + // of the request (e.g., GET, POST, PUT, DELETE). This value corresponds + // to 'context.httpMethod' in AWS API Gateway, and provides the method + // used to make the request. + ProxyHeaderHTTPMethod = "X-Dd-Proxy-Httpmethod" + + // ProxyHeaderDomain is the header used to indicate the AWS domain name + // handling the request. This value corresponds to 'context.domainName' + // in AWS API Gateway, which represents the custom domain associated + // with the API Gateway. + ProxyHeaderDomain = "X-Dd-Proxy-Domain-Name" + + // ProxyHeaderStage is the header used to indicate the AWS stage name + // for the API request. This value corresponds to 'context.stage' in + // AWS API Gateway, and provides the stage (e.g., dev, prod, etc.) + // in which the request is being processed. + ProxyHeaderStage = "X-Dd-Proxy-Stage" +) + +type proxyDetails struct { + spanName string + component string +} + +type proxyContext struct { + startTime time.Time + method string + path string + stage string + domainName string + proxySystemName string +} + +var ( + supportedProxies = map[string]proxyDetails{ + "aws-apigateway": { + spanName: "aws.apigateway", + component: "aws-apigateway", + }, + } +) + +func extractInferredProxyContext(headers http.Header) (*proxyContext, error) { + _, exists := headers[ProxyHeaderStartTimeMs] + if !exists { + return nil, errors.New("proxy header start time does not exist") + } + + proxyHeaderSystem, exists := headers[ProxyHeaderSystem] + if !exists { + return nil, errors.New("proxy header system does not exist") + } + + if _, ok := supportedProxies[proxyHeaderSystem[0]]; !ok { + return nil, errors.New("unsupported Proxy header system") + } + + pc := proxyContext{ + method: headers.Get(ProxyHeaderHTTPMethod), + path: headers.Get(ProxyHeaderPath), + stage: headers.Get(ProxyHeaderStage), + domainName: headers.Get(ProxyHeaderDomain), + proxySystemName: headers.Get(ProxyHeaderSystem), + } + + startTimeUnixMilli, err := strconv.ParseInt(headers[ProxyHeaderStartTimeMs][0], 10, 64) + if err != nil { + return nil, fmt.Errorf("error parsing time string: %s", err.Error()) + } + pc.startTime = time.UnixMilli(startTimeUnixMilli) + + return &pc, nil +} + +func startInferredProxySpan(requestProxyContext *proxyContext, parent *tracer.SpanContext, opts ...tracer.StartSpanOption) *tracer.Span { + proxySpanInfo := supportedProxies[requestProxyContext.proxySystemName] + log.Debug(`Successfully extracted inferred span info ${proxyContext} for proxy: ${proxyContext.proxySystemName}`) + + startTime := requestProxyContext.startTime + + configService := requestProxyContext.domainName + if configService == "" { + configService = globalconfig.ServiceName() + } + + optsLocal := make([]tracer.StartSpanOption, len(opts), len(opts)+1) + copy(optsLocal, opts) + + optsLocal = append(optsLocal, + func(cfg *tracer.StartSpanConfig) { + if cfg.Tags == nil { + cfg.Tags = make(map[string]interface{}) + } + + cfg.Parent = parent + cfg.StartTime = startTime + + cfg.Tags[ext.SpanType] = ext.SpanTypeWeb + cfg.Tags[ext.ServiceName] = configService + cfg.Tags[ext.Component] = proxySpanInfo.component + cfg.Tags[ext.HTTPMethod] = requestProxyContext.method + cfg.Tags[ext.HTTPURL] = requestProxyContext.domainName + requestProxyContext.path + cfg.Tags[ext.HTTPRoute] = requestProxyContext.path + cfg.Tags[ext.ResourceName] = fmt.Sprintf("%s %s", requestProxyContext.method, requestProxyContext.path) + cfg.Tags["_dd.inferred_span"] = 1 + cfg.Tags["stage"] = requestProxyContext.stage + }, + ) + + span := tracer.StartSpan(proxySpanInfo.spanName, optsLocal...) + + return span +} diff --git a/contrib/internal/httptrace/make_responsewriter.go b/instrumentation/httptrace/make_responsewriter.go similarity index 69% rename from contrib/internal/httptrace/make_responsewriter.go rename to instrumentation/httptrace/make_responsewriter.go index da08b62d99..63ae04d4be 100644 --- a/contrib/internal/httptrace/make_responsewriter.go +++ b/instrumentation/httptrace/make_responsewriter.go @@ -16,15 +16,13 @@ package main import ( "os" "text/template" - - "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/lists" ) func main() { interfaces := []string{"Flusher", "Pusher", "CloseNotifier", "Hijacker"} var combos [][][]string for pick := len(interfaces); pick > 0; pick-- { - combos = append(combos, lists.Combinations(interfaces, pick)) + combos = append(combos, combinations(interfaces, pick)) } template.Must(template.New("").Parse(tpl)).Execute(os.Stdout, map[string]interface{}{ "Interfaces": interfaces, @@ -32,6 +30,43 @@ func main() { }) } +// combinations returns all possible unique selections of size `pick` of a list +// of strings for which order does not matter +// +// an example: +// +// Combinations([cat, dog, bird], 2): +// [cat] -> Combinations([dog, bird], 1) +// [cat, dog] +// [cat, bird] +// [dog] -> Combinations([bird], 1) +// [dog, bird] +// [bird] -> Combinations([], 0) +// n/a +func combinations(list []string, pick int) (all [][]string) { + switch pick { + case 0: + // nothing to do + case 1: + for i := range list { + all = append(all, list[i:i+1]) + } + default: + // we recursively find combinations by taking each item in the list + // and then finding the combinations at (pick-1) for the remaining + // items in the list + // the reason we start at [i+1:], is because the order of the items in + // the list doesn't matter, so this will remove all the duplicates we + // would get otherwise + for i := range list { + for _, next := range combinations(list[i+1:], pick-1) { + all = append(all, append([]string{list[i]}, next...)) + } + } + } + return all +} + var tpl = `// Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). diff --git a/contrib/internal/httptrace/response_writer.go b/instrumentation/httptrace/response_writer.go similarity index 89% rename from contrib/internal/httptrace/response_writer.go rename to instrumentation/httptrace/response_writer.go index 2bbc31bad7..f44fff762f 100644 --- a/contrib/internal/httptrace/response_writer.go +++ b/instrumentation/httptrace/response_writer.go @@ -16,6 +16,13 @@ type responseWriter struct { status int } +// ResetStatusCode resets the status code of the response writer. +func ResetStatusCode(w http.ResponseWriter) { + if rw, ok := w.(*responseWriter); ok { + rw.status = 0 + } +} + func newResponseWriter(w http.ResponseWriter) *responseWriter { return &responseWriter{w, 0} } diff --git a/contrib/internal/httptrace/response_writer_test.go b/instrumentation/httptrace/response_writer_test.go similarity index 100% rename from contrib/internal/httptrace/response_writer_test.go rename to instrumentation/httptrace/response_writer_test.go diff --git a/instrumentation/httptrace/route_quantization.go b/instrumentation/httptrace/route_quantization.go new file mode 100644 index 0000000000..b90ee3670a --- /dev/null +++ b/instrumentation/httptrace/route_quantization.go @@ -0,0 +1,156 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package httptrace + +import ( + "strings" +) + +// QuantizeURL quantizes a URL path into a more generic form that resembles a route. +func QuantizeURL(path string) string { + var quantizer urlQuantizer + return quantizer.Quantize(path) +} + +// urlQuantizer is responsible for quantizing URLs paths into a more generic form that resembles a route +// in case a handler pattern is not available. net/http was the last framework where we did not have access to it +// until go 1.22. Now this algorithm is only used in proxy implementations where handlers don't make sense. +type urlQuantizer struct { + tokenizer tokenizer + buf strings.Builder +} + +// Quantize path (eg /segment1/segment2/segment3) by doing the following: +// * If a segment contains only letters, we keep it as it is; +// * If a segment contains one or more digits or special characters, we replace it by '*' +// * If a segments represents an API version (eg. v123) we keep it as it is +func (q *urlQuantizer) Quantize(path string) string { + if len(path) == 0 { + return "" + } + + if path[0] != '/' { + path = "/" + path + } + + q.tokenizer.Reset(path) + q.buf.Reset() + replacements := 0 + + for q.tokenizer.Next() { + q.buf.WriteByte('/') + tokenType, tokenValue := q.tokenizer.Value() + if tokenType == tokenWildcard { + replacements++ + q.buf.WriteByte('*') + continue + } + + q.buf.WriteString(tokenValue) + } + + if replacements == 0 { + return path + } + + // Copy quantized path into original byte slice + return q.buf.String() +} + +// tokenType represents a type of token handled by the `tokenizer` +type tokenType string + +const ( + // tokenUnknown represents a token of type unknown + tokenUnknown = "token:unknown" + // tokenWildcard represents a token that contains digits or special chars + tokenWildcard = "token:wildcard" + // tokenString represents a token that contains only letters + tokenString = "token:string" + // tokenAPIVersion represents an API version (eg. v123) + tokenAPIVersion = "token:api-version" +) + +// tokenizer provides a stream of tokens for a given URL +type tokenizer struct { + // These variables represent the moving cursors (left and right side + // respectively) of the tokenizer. After each "Next()" execution, they will + // point to the beginning and end of a segment like the following: + // + // /segment1/segment2/segment3 + // ----------^-------^-------- + // i j + // + i, j int + + path string + + countAllowedChars int // a-Z, "-", "_" + countNumbers int // 0-9 + countSpecialChars int // anything else +} + +// Reset underlying path being consumed +func (t *tokenizer) Reset(path string) { + t.i = 0 + t.j = 0 + t.path = path +} + +// Next attempts to parse the next token, and returns true if a token was read +func (t *tokenizer) Next() bool { + t.countNumbers = 0 + t.countAllowedChars = 0 + t.countSpecialChars = 0 + t.i = t.j + 1 + + for t.j = t.i; t.j < len(t.path); t.j++ { + c := t.path[t.j] + + if c == '/' { + break + } else if c >= '0' && c <= '9' { + t.countNumbers++ + } else if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '-' || c == '_' { + t.countAllowedChars++ + } else { + t.countSpecialChars++ + } + } + + return t.i < len(t.path) +} + +// Value returns the current token along with its byte value +// Note that the byte value is only valid until the next call to `Reset()` +func (t *tokenizer) Value() (tokenType, string) { + if t.i < 0 || t.j > len(t.path) || t.i >= t.j { + return tokenUnknown, "" + } + + return t.getType(), t.path[t.i:t.j] +} + +func (t *tokenizer) getType() tokenType { + // This matches segments like "v1" + if t.countAllowedChars == 1 && t.countNumbers > 0 && t.path[t.i] == 'v' { + return tokenAPIVersion + } + + // A segment that contains one or more special characters or numbers is + // considered a wildcard token + if t.countSpecialChars > 0 || t.countNumbers > 0 { + return tokenWildcard + } + + // If the segment is comprised by only allowed chars, we classify it as a + // string token which is preserved as it is by the quantizer + if t.countAllowedChars > 0 && t.countSpecialChars == 0 && t.countNumbers == 0 { + return tokenString + } + + return tokenUnknown +} diff --git a/instrumentation/httptrace/route_quantization_test.go b/instrumentation/httptrace/route_quantization_test.go new file mode 100644 index 0000000000..5f6263bff3 --- /dev/null +++ b/instrumentation/httptrace/route_quantization_test.go @@ -0,0 +1,213 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package httptrace + +import ( + "runtime" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestTokenizer(t *testing.T) { + tokenizer := new(tokenizer) + + type val struct { + tokenType tokenType + data string + } + + type testCase struct { + path string + expected []val + } + + testCases := []testCase{ + { + path: "/", + expected: nil, + }, + { + path: "/1", + expected: []val{{tokenWildcard, "1"}}, + }, + { + path: "/foo/1", + expected: []val{{tokenString, "foo"}, {tokenWildcard, "1"}}, + }, + { + path: "/abc/def", + expected: []val{{tokenString, "abc"}, {tokenString, "def"}}, + }, + { + path: "/abc/123/def", + expected: []val{{tokenString, "abc"}, {tokenWildcard, "123"}, {tokenString, "def"}}, + }, + { + path: "/abc/def123", + expected: []val{{tokenString, "abc"}, {tokenWildcard, "def123"}}, + }, + { + path: "/abc#def", + expected: []val{{tokenWildcard, "abc#def"}}, + }, + { + path: "/v5/abc", + expected: []val{{tokenAPIVersion, "v5"}, {tokenString, "abc"}}, + }, + { + path: "/こんにちは/世界", + expected: []val{{tokenWildcard, "こんにちは"}, {tokenWildcard, "世界"}}, + }, + { + path: "/abc/123/🌟", + expected: []val{{tokenString, "abc"}, {tokenWildcard, "123"}, {tokenWildcard, "🌟"}}, + }, + } + + for _, tc := range testCases { + t.Run(tc.path, func(t *testing.T) { + tokenizer.Reset(tc.path) + var got []val + for tokenizer.Next() { + tokenType, tokenValue := tokenizer.Value() + got = append(got, val{tokenType, tokenValue}) + } + + assert.Equalf(t, tc.expected, got, "tokenization of %s should have returned %s. got %s", tc.path, tc.expected, got) + }) + } +} + +func TestURLQuantizer(t *testing.T) { + var quantizer urlQuantizer + + type testCase struct { + path string + expected string + } + + testCases := []testCase{ + { + path: "/", + expected: "/", + }, + { + path: "/a", + expected: "/a", + }, + { + path: "/1", + expected: "/*", + }, + { + path: "/abc", + expected: "/abc", + }, + { + path: "/trailing/slash/", + expected: "/trailing/slash/", + }, + { + path: "/users/1/view", + expected: "/users/*/view", + }, + { + path: "/abc/def", + expected: "/abc/def", + }, + { + path: "/abc/123/def", + expected: "/abc/*/def", + }, + { + path: "/abc/def123", + expected: "/abc/*", + }, + { + path: "/abc#def", + expected: "/*", + }, + { + path: "/v5/abc", + expected: "/v5/abc", + }, + { + path: "/latest/meta-data", + expected: "/latest/meta-data", + }, + { + path: "/health_check", + expected: "/health_check", + }, + { + path: "/abc/F05065B2-7934-4480-8500-A2C40D76F59F", + expected: "/abc/*", + }, + { + path: "/DataDog/datadog-agent/pull/19720", + expected: "/DataDog/datadog-agent/pull/*", + }, + { + path: "/DataDog/datadog-agent/blob/22ba7d3d9d7cba67886dc905970d7f2f68b37dc5/pkg/network/protocols/http/quantization_test.go", + expected: "/DataDog/datadog-agent/blob/*/pkg/network/protocols/http/*", + }, + { + path: "/uuid/v1/f475ca90-71ab-11ee-b962-0242ac120002", + expected: "/uuid/v1/*", + }, + { + path: "/uuid/v4/0253ee45-3098-4a7e-8569-73a99a9fc030", + expected: "/uuid/v4/*", + }, + { + path: "/こんにちは/世界", + expected: "/*/*", + }, + { + path: "/abc/123/🌟", + expected: "/abc/*/*", + }, + } + for _, tc := range testCases { + t.Run(tc.path, func(t *testing.T) { + result := quantizer.Quantize(tc.path) + assert.Equalf(t, tc.expected, result, "expected: %s, got: %s", tc.expected, result) + + // Test quantization a second time to ensure idempotency. + // We do this to validate that bringing the quantization code to + // the agent-side won't cause any issues for the backend, which uses a + // similar set of heuristics. In other words, an agent payload with + // pre-quantized endpoint arriving at the backend should be a no-op. + result = quantizer.Quantize(result) + assert.Equalf(t, tc.expected, result, "expected: %s, got: %s", tc.expected, result) + }) + } +} + +// The purpose of this benchmark is to ensure that the whole quantization process doesn't allocate +func BenchmarkQuantization(b *testing.B) { + // This should trigger the quantization since `/users/1/view` becomes + // `/users/*/view` post-quantization (see test case above) + path := "/users/1/view" + + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + runtime.KeepAlive(QuantizeURL(path)) + } +} + +// This benchmark represents the case where a path does *not* trigger a quantization +func BenchmarkQuantizationHappyPath(b *testing.B) { + var quantizer urlQuantizer + path := "/foo/bar" + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + runtime.KeepAlive(quantizer.Quantize(path)) + } +} diff --git a/instrumentation/httptrace/route_simplification.go b/instrumentation/httptrace/route_simplification.go new file mode 100644 index 0000000000..daa44a5ca4 --- /dev/null +++ b/instrumentation/httptrace/route_simplification.go @@ -0,0 +1,103 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptrace + +import ( + "regexp" + "strings" +) + +var ( + urlPathExtractionRegex = regexp.MustCompile(`^(?P[a-z]+://(?P[^?/]+))?(?P/[^?]*)(?P(\?).*)?$`) + + // Route parameter replacement patterns in order of priority + intPattern = regexp.MustCompile(`^[1-9][0-9]+$`) + intIDPattern = regexp.MustCompile(`^(?:[0-9][0-9._-]{2,}|[._-][0-9][0-9._-]+|[._-]{2,}[0-9][0-9._-]*)$`) + hexPattern = regexp.MustCompile(`^(?:[0-9][A-Fa-f0-9]{5,}|[A-Fa-f][0-9][A-Fa-f0-9]{4,}|[A-Fa-f]{2}[0-9][A-Fa-f0-9]{3,}|[A-Fa-f]{3}[0-9][A-Fa-f0-9]{2,}|[A-Fa-f]{4}[0-9][A-Fa-f0-9]+|[A-Fa-f]{5,}[0-9][A-Fa-f0-9]*)$`) + hexIDPattern = regexp.MustCompile(`^(?:[0-9][A-Fa-f0-9._-]{5,}|[A-Fa-f._-][0-9][A-Fa-f0-9._-]{4,}|[A-Fa-f._-]{2}[0-9][A-Fa-f0-9._-]{3,}|[A-Fa-f._-]{3}[0-9][A-Fa-f0-9._-]{2,}|[A-Fa-f._-]{4}[0-9][A-Fa-f0-9._-]+|[A-Fa-f._-]{5,}[0-9][A-Fa-f0-9._-]*)$`) + strPattern = regexp.MustCompile(`^(.{20,}|.*[%&'()*+,:=@].*)$`) +) + +// maxElems defines the maximum number of non-empty path elements to keep when simplifying a url path. +const maxElems = 8 + +// simplifyHTTPUrl extracts and simplifies the path from a url. +func simplifyHTTPUrl(url string) string { + if url == "" { + return "/" + } + + path := extractPathFromURL(url) + if path == "" || path == "/" { + return "/" + } + + i, n := 0, len(path) + count := 0 + + var b strings.Builder + b.Grow(n) + b.WriteByte('/') + + for count < maxElems { + // Skip any number of consecutive slashes + for i < n && path[i] == '/' { + i++ + } + if i >= n { + break + } + + // Capture the next segment + start := i + for i < n && path[i] != '/' { + i++ + } + seg := path[start:i] + + simplified := simplifyPathElement(seg) + + if count > 0 { + b.WriteByte('/') // separator before every element except the first + } + b.WriteString(simplified) + count++ + } + + if count == 0 { + return "/" + } + return b.String() +} + +// extractPathFromURL extracts the path component from a URL +func extractPathFromURL(url string) string { + matches := urlPathExtractionRegex.FindStringSubmatch(url) + if len(matches) < 4 { + return "" + } + + // The path is located in the 3rd capturing group + return matches[3] +} + +// simplifyPathElement applies the parameter replacement rules to a path element +func simplifyPathElement(elem string) string { + switch { + case intPattern.MatchString(elem): + return "{param:int}" + case intIDPattern.MatchString(elem): + return "{param:int_id}" + case hexPattern.MatchString(elem): + return "{param:hex}" + case hexIDPattern.MatchString(elem): + return "{param:hex_id}" + case strPattern.MatchString(elem): + return "{param:str}" + default: + return elem + } +} diff --git a/instrumentation/httptrace/route_simplification_test.go b/instrumentation/httptrace/route_simplification_test.go new file mode 100644 index 0000000000..431430bb9e --- /dev/null +++ b/instrumentation/httptrace/route_simplification_test.go @@ -0,0 +1,268 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptrace + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSimplifyHTTPRoute(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + // Empty and basic cases + { + name: "empty URL", + input: "", + expected: "/", + }, + { + name: "no path", + input: "http://example.com/", + expected: "/", + }, + { + name: "root path", + input: "http://example.com/", + expected: "/", + }, + { + name: "simple path", + input: "http://example.com/api/v1/users", + expected: "/api/v1/users", + }, + + // URL parsing tests + { + name: "URL with query params", + input: "http://example.com/api/users?id=123", + expected: "/api/users", + }, + { + name: "path only (no protocol)", + input: "/api/v1/users/123", + expected: "/api/v1/users/{param:int}", + }, + { + name: "https URL", + input: "https://example.com:8080/api/users", + expected: "/api/users", + }, + + // Integer parameter tests + { + name: "integer ID (2 digits)", + input: "/users/12", + expected: "/users/{param:int}", + }, + { + name: "integer ID (at least 2 digits)", + input: "/users/123", + expected: "/users/{param:int}", + }, + { + name: "single digit not replaced", + input: "/users/5", + expected: "/users/5", + }, + { + name: "integer starting with 0 not replaced", + input: "/users/0123", + expected: "/users/{param:int_id}", + }, + + // Integer ID parameter tests + { + name: "integer ID minimal length with dash", + input: "/items/1-2", + expected: "/items/{param:int_id}", + }, + { + name: "integer ID with mixed numbers and separators", + input: "/items/.----00-1_2.3", + expected: "/items/{param:int_id}", + }, + { + name: "integer ID containing a non-hex letter should not match", + input: "/items/12g-34", + expected: "/items/12g-34", + }, + { + name: "integer ID all zeros length three", + input: "/items/000", + expected: "/items/{param:int_id}", + }, + + // Hex parameter tests + { + name: "hex ID (6+ chars with digit)", + input: "/commits/abc123", + expected: "/commits/{param:hex}", + }, + { + name: "hex ID all letters (no digit)", + input: "/commits/deadbeef", + expected: "/commits/deadbeef", + }, + { + name: "hex ID too short", + input: "/commits/abc12", + expected: "/commits/abc12", + }, + { + name: "hex ID uppercase all letters (no digit)", + input: "/h/ABCDEF", + expected: "/h/ABCDEF", + }, + { + name: "hex ID uppercase with a digit", + input: "/h/ABCDEF1", + expected: "/h/{param:hex}", + }, + { + name: "hex ID uppercase with a digit", + input: "/h/000ABCDEF1", + expected: "/h/{param:hex}", + }, + + // Hex ID parameter tests + { + name: "hex ID with separators", + input: "/items/abc123-def.def2_def3", + expected: "/items/{param:hex_id}", + }, + { + name: "hex ID no digit should not match", + input: "/items/abcdef-abc", + expected: "/items/abcdef-abc", + }, + { + name: "hex ID many dashes and a digit and an hex letter", + input: "/items/-----1a", + expected: "/items/{param:hex_id}", + }, + { + name: "hex ID vs int_id precedence on digits and dash", + input: "/items/123-456", + expected: "/items/{param:int_id}", + }, + + // String parameter tests + { + name: "long string (20+ chars)", + input: "/files/verylongfilename12345", + expected: "/files/{param:str}", + }, + { + name: "string with special chars", + input: "/search/hello+world", + expected: "/search/{param:str}", + }, + { + name: "string with percent encoding", + input: "/files/hello%20world", + expected: "/files/{param:str}", + }, + { + name: "string with @ symbol", + input: "/users/user@example", + expected: "/users/{param:str}", + }, + + // Path tests + { + name: "more than 8 path elements", + input: "/a/b/c/d/e/f/g/h/i/j/k", + expected: "/a/b/c/d/e/f/g/h", + }, + { + name: "weird path with only slashes", + input: "///////////////////////", + expected: "/", + }, + { + name: "8 empty path elements and a value", + input: "//////////a", + expected: "/a", + }, + + // Empty elements handling + { + name: "consecutive slashes", + input: "/api//v1///users//123", + expected: "/api/v1/users/{param:int}", + }, + + // Complex scenarios + { + name: "mixed parameter types", + input: "/api/v2/users/123/posts/abc123/comments/hello%20world", + expected: "/api/v2/users/{param:int}/posts/{param:hex}/comments/{param:str}", + }, + { + name: "UUID-like hex pattern", + input: "/objects/9219c7f7-3704-44d3-8cc9-2b63ba554636", + expected: "/objects/{param:hex_id}", + }, + { + name: "all parameter types", + input: "/12/123-456/abc123/abc-def-123/longstringthathastoomanycharacters", + expected: "/{param:int}/{param:int_id}/{param:hex}/{param:hex_id}/{param:str}", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := simplifyHTTPUrl(tt.input) + assert.Equal(t, tt.expected, result) + }) + } +} + +func TestExtractPathFromURL(t *testing.T) { + tests := []struct { + name string + input string + expected string + }{ + { + name: "full URL", + input: "http://example.com/api/users", + expected: "/api/users", + }, + { + name: "URL with query", + input: "https://example.com:8080/api/users?id=123&name=test", + expected: "/api/users", + }, + { + name: "path only", + input: "/api/users", + expected: "/api/users", + }, + { + name: "empty string", + input: "", + expected: "", + }, + { + name: "root path", + input: "http://example.com/", + expected: "/", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := extractPathFromURL(tt.input) + assert.Equal(t, tt.expected, result) + }) + } +} diff --git a/contrib/internal/httptrace/trace_gen.go b/instrumentation/httptrace/trace_gen.go similarity index 100% rename from contrib/internal/httptrace/trace_gen.go rename to instrumentation/httptrace/trace_gen.go diff --git a/instrumentation/httptracemock/httptracemock.go b/instrumentation/httptracemock/httptracemock.go new file mode 100644 index 0000000000..221ed84731 --- /dev/null +++ b/instrumentation/httptracemock/httptracemock.go @@ -0,0 +1,84 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package httptracemock + +import ( + "net/http" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httptrace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" +) + +// ServeMux is an HTTP request multiplexer that traces all the incoming requests. +type ServeMux struct { + *http.ServeMux + spanOpts []tracer.StartSpanOption +} + +// NewServeMux allocates and returns an http.ServeMux augmented with the +// global tracer. +func NewServeMux() *ServeMux { + spanOpts := []tracer.StartSpanOption{ + tracer.Tag(ext.SpanKind, ext.SpanKindServer), + tracer.Tag(ext.Component, "net/http"), + } + return &ServeMux{ + ServeMux: http.NewServeMux(), + spanOpts: spanOpts, + } +} + +type responseWriter struct { + http.ResponseWriter + statusCode int +} + +func (rw *responseWriter) Write(b []byte) (int, error) { + if rw.statusCode == 0 { + rw.statusCode = http.StatusOK + } + return rw.ResponseWriter.Write(b) +} + +func (rw *responseWriter) WriteHeader(code int) { + rw.statusCode = code + rw.ResponseWriter.WriteHeader(code) +} + +func (rw *responseWriter) Status() int { + return rw.statusCode +} + +// ServeHTTP dispatches the request to the handler +// whose pattern most closely matches the request URL. +// We only need to rewrite this function to be able to trace +// all the incoming requests to the underlying multiplexer +func (mux *ServeMux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // get the resource associated to this request + _, route := mux.Handler(r) + + resource := r.Method + " " + route + so := make([]tracer.StartSpanOption, len(mux.spanOpts), len(mux.spanOpts)+2) + copy(so, mux.spanOpts) + so = append(so, tracer.ResourceName(resource)) + so = append(so, tracer.Tag(ext.HTTPRoute, route)) + + rw := &responseWriter{ResponseWriter: w} + span, ctx, finishSpans := httptrace.StartRequestSpan(r, so...) + defer func() { + finishSpans(rw.statusCode, nil) + }() + var h http.Handler = mux.ServeMux + if appsec.Enabled() { + h = httpsec.WrapHandler(h, span, &httpsec.Config{ + Route: route, + }) + } + h.ServeHTTP(rw, r.WithContext(ctx)) +} diff --git a/instrumentation/instrumentation.go b/instrumentation/instrumentation.go new file mode 100644 index 0000000000..87d7106786 --- /dev/null +++ b/instrumentation/instrumentation.go @@ -0,0 +1,187 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package instrumentation + +import ( + "context" + "math" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/namingschema" + "github.com/DataDog/dd-trace-go/v2/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +// OperationContext holds metadata about an instrumentation operation. +type OperationContext map[string]string + +// Load attempts to load the requested package instrumentation. It panics if the package has not been registered. +func Load(pkg Package) *Instrumentation { + info, ok := packages[pkg] + if !ok { + panic("instrumentation package: " + pkg + " was not found. If this is an external package, you must " + + "call instrumentation.Register first") + } + + telemetry.LoadIntegration(string(pkg)) + tracer.MarkIntegrationImported(info.TracedPackage) + + return &Instrumentation{ + logger: newLogger(pkg), + telemetrylog: telemetrylog.With(telemetry.WithTags([]string{"integration:" + string(pkg)})), + + pkg: pkg, + info: info, + } +} + +// ReloadConfig reloads config read from environment variables. This is useful for tests. +func ReloadConfig() { + namingschema.ReloadConfig() +} + +// Version returns the version of the dd-trace-go package. +func Version() string { + return version.Tag +} + +// Instrumentation represents instrumentation for a package. +type Instrumentation struct { + logger Logger + telemetrylog *telemetrylog.Logger + + pkg Package + info PackageInfo +} + +// ServiceName returns the default service name to be set for the given instrumentation component. +func (i *Instrumentation) ServiceName(component Component, opCtx OperationContext) string { + cfg := namingschema.GetConfig() + + n, ok := i.info.naming[component] + if !ok { + return cfg.DDService + } + + useDDService := cfg.NamingSchemaVersion == namingschema.SchemaV1 || cfg.RemoveIntegrationServiceNames || n.useDDServiceV0 || n.buildServiceNameV0 == nil + if useDDService && cfg.DDService != "" { + return cfg.DDService + } + return n.buildServiceNameV0(opCtx) +} + +// OperationName returns the operation name to be set for the given instrumentation component. +func (i *Instrumentation) OperationName(component Component, opCtx OperationContext) string { + op, ok := i.info.naming[component] + if !ok { + return "" + } + + switch namingschema.GetVersion() { + case namingschema.SchemaV1: + return op.buildOpNameV1(opCtx) + default: + return op.buildOpNameV0(opCtx) + } +} + +func (i *Instrumentation) Logger() Logger { + return i.logger +} + +func (i *Instrumentation) TelemetryLog() *telemetrylog.Logger { + return i.telemetrylog +} + +type TelemetryOrigin = telemetry.Origin + +const ( + TelemetryOriginDefault = telemetry.OriginDefault + TelemetryOriginEnvVar = telemetry.OriginEnvVar +) + +func (i *Instrumentation) TelemetryRegisterAppConfig(key string, value any, origin TelemetryOrigin) { + telemetry.RegisterAppConfig(key, value, origin) +} + +func (i *Instrumentation) AnalyticsRate(defaultGlobal bool) float64 { + if internal.BoolEnv("DD_TRACE_"+i.info.EnvVarPrefix+"_ANALYTICS_ENABLED", false) { + return 1.0 + } + if defaultGlobal { + return i.GlobalAnalyticsRate() + } + return math.NaN() +} + +func (i *Instrumentation) GlobalAnalyticsRate() float64 { + return globalconfig.AnalyticsRate() +} + +func (i *Instrumentation) AppSecEnabled() bool { + return appsec.Enabled() +} + +func (i *Instrumentation) AppSecRASPEnabled() bool { + return appsec.RASPEnabled() +} + +func (i *Instrumentation) DataStreamsEnabled() bool { + v, _, _ := stableconfig.Bool("DD_DATA_STREAMS_ENABLED", false) + return v +} + +// TracerInitialized returns whether the global tracer has been initialized or not. +func (i *Instrumentation) TracerInitialized() bool { + return internal.TracerInitialized() +} + +// WithExecutionTraced marks ctx as being associated with an execution trace +// task. It is assumed that ctx already contains a trace task. The caller is +// responsible for ending the task. +// +// This is intended for a specific case where the database/sql contrib package +// only creates spans *after* an operation, in case the operation was +// unavailable, and thus execution trace tasks tied to the span only capture the +// very end. This function enables creating a task *before* creating a span, and +// communicating to the APM tracer that it does not need to create a task. In +// general, APM instrumentation should prefer creating tasks around the +// operation rather than after the fact, if possible. +func (i *Instrumentation) WithExecutionTraced(ctx context.Context) context.Context { + return internal.WithExecutionTraced(ctx) +} + +type StatsdClient = internal.StatsdClient + +func (i *Instrumentation) StatsdClient(extraTags []string) (StatsdClient, error) { + addr := globalconfig.DogstatsdAddr() + tags := globalconfig.StatsTags() + tags = append(tags, extraTags...) + return internal.NewStatsdClient(addr, tags) +} + +type HeaderTags interface { + Iter(f func(header string, tag string)) +} + +func NewHeaderTags(headers []string) HeaderTags { + headerTagsMap := normalizer.HeaderTagSlice(headers) + return internal.NewLockMap(headerTagsMap) +} + +func (i *Instrumentation) HTTPHeadersAsTags() HeaderTags { + return globalconfig.HeaderTagMap() +} + +func (i *Instrumentation) ActiveSpanKey() any { + return internal.ActiveSpanKey +} diff --git a/instrumentation/instrumentation_test.go b/instrumentation/instrumentation_test.go new file mode 100644 index 0000000000..b1812b6d9b --- /dev/null +++ b/instrumentation/instrumentation_test.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package instrumentation + +import ( + "math" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestInstrumentation_AnalyticsRate(t *testing.T) { + pkgs := GetPackages() + for pkg, info := range pkgs { + t.Run(string(pkg), func(t *testing.T) { + // Skip packages that don't implement analytics functionality + if pkg == PackageAWSDatadogLambdaGo { + t.Skip("Lambda contrib does not implement analytics functionality") + return + } + + instr := Load(pkg) + + // No env var set, without defaulting to global should return NaN + rate := instr.AnalyticsRate(false) + require.True(t, math.IsNaN(rate)) + + // With env var set, should return 1.0 + t.Setenv("DD_TRACE_"+info.EnvVarPrefix+"_ANALYTICS_ENABLED", "true") + rate = instr.AnalyticsRate(false) + require.Equal(t, 1.0, rate) + }) + } +} diff --git a/instrumentation/internal/namingschema/namingschema.go b/instrumentation/internal/namingschema/namingschema.go new file mode 100644 index 0000000000..68eb1aaa85 --- /dev/null +++ b/instrumentation/internal/namingschema/namingschema.go @@ -0,0 +1,88 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschema + +import ( + "strings" + "sync" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +type Version int + +const ( + VersionV0 Version = iota + VersionV1 +) + +var ( + mu sync.Mutex + activeNamingSchema int32 + removeFakeServiceNames bool +) + +type Config struct { + NamingSchemaVersion Version + RemoveFakeServiceNames bool + DDService string +} + +func init() { + LoadFromEnv() +} + +func LoadFromEnv() { + schemaVersionStr := env.Get("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA") + if v, ok := parseVersionString(schemaVersionStr); ok { + setVersion(v) + } else { + setVersion(VersionV0) + log.Warn("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA=%s is not a valid value, setting to default of v%d", schemaVersionStr, v) + } + // Allow DD_TRACE_SPAN_ATTRIBUTE_SCHEMA=v0 users to disable default integration (contrib AKA v0) service names. + // These default service names are always disabled for v1 onwards. + removeFakeServiceNames = internal.BoolEnv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", false) +} + +func ReloadConfig() { + LoadFromEnv() + globalconfig.SetServiceName(env.Get("DD_SERVICE")) +} + +func GetConfig() Config { + mu.Lock() + defer mu.Unlock() + + return Config{ + NamingSchemaVersion: GetVersion(), + RemoveFakeServiceNames: removeFakeServiceNames, + DDService: globalconfig.ServiceName(), + } +} + +func GetVersion() Version { + return Version(atomic.LoadInt32(&activeNamingSchema)) +} + +func setVersion(v Version) { + atomic.StoreInt32(&activeNamingSchema, int32(v)) +} + +func parseVersionString(v string) (Version, bool) { + switch strings.ToLower(v) { + case "", "v0": + return VersionV0, true + case "v1": + return VersionV1, true + default: + return VersionV0, false + } +} diff --git a/instrumentation/internal/namingschematest/aws_sdk_v1_test.go b/instrumentation/internal/namingschematest/aws_sdk_v1_test.go new file mode 100644 index 0000000000..ce9cb2be64 --- /dev/null +++ b/instrumentation/internal/namingschematest/aws_sdk_v1_test.go @@ -0,0 +1,147 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ec2" + "github.com/aws/aws-sdk-go/service/s3" + "github.com/aws/aws-sdk-go/service/sns" + "github.com/aws/aws-sdk-go/service/sqs" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + awstrace "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +func awsSDKV1Session(opts ...awstrace.Option) *session.Session { + cfg := aws.NewConfig(). + WithRegion("us-east-1"). + WithDisableSSL(true). + WithCredentials(credentials.AnonymousCredentials). + WithEndpoint("http://localhost:4566/"). // use localstack + WithS3ForcePathStyle(true) + + return awstrace.WrapSession(session.Must(session.NewSession(cfg)), opts...) +} + +var ( + awsSDKV1 = harness.TestCase{ + Name: instrumentation.PackageAWSSDKGo, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []awstrace.Option + if serviceOverride != "" { + opts = append(opts, awstrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + s := awsSDKV1Session(opts...) + ec2Client := ec2.New(s) + s3Client := s3.New(s) + sqsClient := sqs.New(s) + snsClient := sns.New(s) + + _, err := ec2Client.DescribeInstances(&ec2.DescribeInstancesInput{}) + require.NoError(t, err) + _, err = s3Client.ListBuckets(&s3.ListBucketsInput{}) + require.NoError(t, err) + _, err = sqsClient.ListQueues(&sqs.ListQueuesInput{}) + require.NoError(t, err) + _, err = snsClient.ListTopics(&sns.ListTopicsInput{}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"aws.ec2", "aws.s3", "aws.sqs", "aws.sns"}, + DDService: []string{"aws.ec2", "aws.s3", "aws.sqs", "aws.sns"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride, harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + assert.Equal(t, "ec2.command", spans[0].OperationName()) + assert.Equal(t, "s3.command", spans[1].OperationName()) + assert.Equal(t, "sqs.command", spans[2].OperationName()) + assert.Equal(t, "sns.command", spans[3].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + assert.Equal(t, "aws.ec2.request", spans[0].OperationName()) + assert.Equal(t, "aws.s3.request", spans[1].OperationName()) + assert.Equal(t, "aws.sqs.request", spans[2].OperationName()) + assert.Equal(t, "aws.sns.request", spans[3].OperationName()) + }, + } + + awsSDKV1Messaging = harness.TestCase{ + Name: instrumentation.PackageAWSSDKGo + "_messaging", + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []awstrace.Option + if serviceOverride != "" { + opts = append(opts, awstrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + s := awsSDKV1Session(opts...) + resourceName := "test-naming-schema-aws-v1" + sqsClient := sqs.New(s) + snsClient := sns.New(s) + + // create a SQS queue + sqsResp, err := sqsClient.CreateQueue(&sqs.CreateQueueInput{QueueName: aws.String(resourceName)}) + require.NoError(t, err) + + msg := &sqs.SendMessageInput{QueueUrl: sqsResp.QueueUrl, MessageBody: aws.String("body")} + _, err = sqsClient.SendMessage(msg) + require.NoError(t, err) + + batchMsg := &sqs.SendMessageBatchInput{QueueUrl: sqsResp.QueueUrl} + entry := &sqs.SendMessageBatchRequestEntry{Id: aws.String("1"), MessageBody: aws.String("body")} + batchMsg.SetEntries([]*sqs.SendMessageBatchRequestEntry{entry}) + _, err = sqsClient.SendMessageBatch(batchMsg) + require.NoError(t, err) + + // create an SNS topic + snsResp, err := snsClient.CreateTopic(&sns.CreateTopicInput{Name: aws.String(resourceName)}) + require.NoError(t, err) + + _, err = snsClient.Publish(&sns.PublishInput{TopicArn: snsResp.TopicArn, Message: aws.String("message")}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 5) + assert.Equal(t, "sqs.command", spans[0].OperationName()) + assert.Equal(t, "sqs.command", spans[1].OperationName()) + assert.Equal(t, "sqs.command", spans[2].OperationName()) + assert.Equal(t, "sns.command", spans[3].OperationName()) + assert.Equal(t, "sns.command", spans[4].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 5) + assert.Equal(t, "aws.sqs.request", spans[0].OperationName()) + assert.Equal(t, "aws.sqs.send", spans[1].OperationName()) + assert.Equal(t, "aws.sqs.send", spans[2].OperationName()) + assert.Equal(t, "aws.sns.request", spans[3].OperationName()) + assert.Equal(t, "aws.sns.send", spans[4].OperationName()) + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"aws.sqs", "aws.sqs", "aws.sqs", "aws.sns", "aws.sns"}, + DDService: []string{"aws.sqs", "aws.sqs", "aws.sqs", "aws.sns", "aws.sns"}, + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 5), + }, + } +) diff --git a/instrumentation/internal/namingschematest/aws_sdk_v2_test.go b/instrumentation/internal/namingschematest/aws_sdk_v2_test.go new file mode 100644 index 0000000000..149747ac58 --- /dev/null +++ b/instrumentation/internal/namingschematest/aws_sdk_v2_test.go @@ -0,0 +1,159 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "testing" + + "github.com/aws/aws-sdk-go-v2/aws" + awsconfig "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/service/ec2" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/sns" + "github.com/aws/aws-sdk-go-v2/service/sqs" + "github.com/aws/aws-sdk-go-v2/service/sqs/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + awstrace "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +func awsSDKV2Config(t *testing.T, opts ...awstrace.Option) aws.Config { + awsEndpoint := "http://localhost:4566/" // use localstack + awsRegion := "us-east-1" + + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, opts ...interface{}) (aws.Endpoint, error) { + return aws.Endpoint{ + PartitionID: "aws", + URL: awsEndpoint, + SigningRegion: awsRegion, + }, nil + }) + cfg, err := awsconfig.LoadDefaultConfig( + context.Background(), + awsconfig.WithRegion(awsRegion), + awsconfig.WithEndpointResolverWithOptions(customResolver), + awsconfig.WithCredentialsProvider(aws.AnonymousCredentials{}), + ) + require.NoError(t, err, "failed to load AWS config") + awstrace.AppendMiddleware(&cfg, opts...) + return cfg +} + +var ( + awsSDKV2 = harness.TestCase{ + Name: instrumentation.PackageAWSSDKGoV2, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []awstrace.Option + if serviceOverride != "" { + opts = append(opts, awstrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + awsCfg := awsSDKV2Config(t, opts...) + ctx := context.Background() + ec2Client := ec2.NewFromConfig(awsCfg) + s3Client := s3.NewFromConfig(awsCfg) + sqsClient := sqs.NewFromConfig(awsCfg) + snsClient := sns.NewFromConfig(awsCfg) + + _, err := ec2Client.DescribeInstances(ctx, &ec2.DescribeInstancesInput{}) + require.NoError(t, err) + _, err = s3Client.ListBuckets(ctx, &s3.ListBucketsInput{}) + require.NoError(t, err) + _, err = sqsClient.ListQueues(ctx, &sqs.ListQueuesInput{}) + require.NoError(t, err) + _, err = snsClient.ListTopics(ctx, &sns.ListTopicsInput{}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + assert.Equal(t, "EC2.request", spans[0].OperationName()) + assert.Equal(t, "S3.request", spans[1].OperationName()) + assert.Equal(t, "SQS.request", spans[2].OperationName()) + assert.Equal(t, "SNS.request", spans[3].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + assert.Equal(t, "aws.ec2.request", spans[0].OperationName()) + assert.Equal(t, "aws.s3.request", spans[1].OperationName()) + assert.Equal(t, "aws.sqs.request", spans[2].OperationName()) + assert.Equal(t, "aws.sns.request", spans[3].OperationName()) + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"aws.EC2", "aws.S3", "aws.SQS", "aws.SNS"}, + DDService: []string{"aws.EC2", "aws.S3", "aws.SQS", "aws.SNS"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride, harness.TestServiceOverride, harness.TestServiceOverride}, + }, + } + awsSDKV2Messaging = harness.TestCase{ + Name: instrumentation.PackageAWSSDKGoV2 + "_messaging", + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []awstrace.Option + if serviceOverride != "" { + opts = append(opts, awstrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + awsCfg := awsSDKV2Config(t, opts...) + resourceName := "test-naming-schema-aws-v2" + ctx := context.Background() + sqsClient := sqs.NewFromConfig(awsCfg) + snsClient := sns.NewFromConfig(awsCfg) + + // create a SQS queue + sqsResp, err := sqsClient.CreateQueue(ctx, &sqs.CreateQueueInput{QueueName: aws.String(resourceName)}) + require.NoError(t, err) + + msg := &sqs.SendMessageInput{QueueUrl: sqsResp.QueueUrl, MessageBody: aws.String("body")} + _, err = sqsClient.SendMessage(ctx, msg) + require.NoError(t, err) + + entry := types.SendMessageBatchRequestEntry{Id: aws.String("1"), MessageBody: aws.String("body")} + batchMsg := &sqs.SendMessageBatchInput{QueueUrl: sqsResp.QueueUrl, Entries: []types.SendMessageBatchRequestEntry{entry}} + _, err = sqsClient.SendMessageBatch(ctx, batchMsg) + require.NoError(t, err) + + // create an SNS topic + snsResp, err := snsClient.CreateTopic(ctx, &sns.CreateTopicInput{Name: aws.String(resourceName)}) + require.NoError(t, err) + + _, err = snsClient.Publish(ctx, &sns.PublishInput{TopicArn: snsResp.TopicArn, Message: aws.String("message")}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 5) + assert.Equal(t, "SQS.request", spans[0].OperationName()) + assert.Equal(t, "SQS.request", spans[1].OperationName()) + assert.Equal(t, "SQS.request", spans[2].OperationName()) + assert.Equal(t, "SNS.request", spans[3].OperationName()) + assert.Equal(t, "SNS.request", spans[4].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 5) + assert.Equal(t, "aws.sqs.request", spans[0].OperationName()) + assert.Equal(t, "aws.sqs.send", spans[1].OperationName()) + assert.Equal(t, "aws.sqs.send", spans[2].OperationName()) + assert.Equal(t, "aws.sns.request", spans[3].OperationName()) + assert.Equal(t, "aws.sns.send", spans[4].OperationName()) + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"aws.SQS", "aws.SQS", "aws.SQS", "aws.SNS", "aws.SNS"}, + DDService: []string{"aws.SQS", "aws.SQS", "aws.SQS", "aws.SNS", "aws.SNS"}, + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 5), + }, + } +) diff --git a/instrumentation/internal/namingschematest/chi_v1_test.go b/instrumentation/internal/namingschematest/chi_v1_test.go new file mode 100644 index 0000000000..929705fd40 --- /dev/null +++ b/instrumentation/internal/namingschematest/chi_v1_test.go @@ -0,0 +1,57 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/go-chi/chi" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + chitrace "github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var chiV1Test = harness.TestCase{ + Name: instrumentation.PackageChi, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []chitrace.Option + if serviceOverride != "" { + opts = append(opts, chitrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := chi.NewRouter().With(chitrace.Middleware(opts...)) + mux.HandleFunc("/200", func(w http.ResponseWriter, r *http.Request) { + _, err := w.Write([]byte("ok")) + require.NoError(t, err) + }) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"chi.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/chi_v5_test.go b/instrumentation/internal/namingschematest/chi_v5_test.go new file mode 100644 index 0000000000..3cc94d742f --- /dev/null +++ b/instrumentation/internal/namingschematest/chi_v5_test.go @@ -0,0 +1,57 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/go-chi/chi/v5" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + chitrace "github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var chiV5Test = harness.TestCase{ + Name: instrumentation.PackageChiV5, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []chitrace.Option + if serviceOverride != "" { + opts = append(opts, chitrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := chi.NewRouter().With(chitrace.Middleware(opts...)) + mux.HandleFunc("/200", func(w http.ResponseWriter, r *http.Request) { + _, err := w.Write([]byte("ok")) + require.NoError(t, err) + }) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"chi.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/confluent_kafka_go_v1/confluent_kafka_go_test.go b/instrumentation/internal/namingschematest/confluent_kafka_go_v1/confluent_kafka_go_test.go new file mode 100644 index 0000000000..94a8ca9d5f --- /dev/null +++ b/instrumentation/internal/namingschematest/confluent_kafka_go_v1/confluent_kafka_go_test.go @@ -0,0 +1,89 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package confluent_kafka_go_v1 + +import ( + "testing" + "time" + + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + kafkatrace "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var testCase = harness.KafkaTestCase( + instrumentation.PackageConfluentKafkaGo, + func(t *testing.T, serviceOverride string) []*mocktracer.Span { + mt := mocktracer.Start() + defer mt.Stop() + + var ( + testGroupID = "gotest" + testTopic = "gotest" + ) + + var opts []kafkatrace.Option + if serviceOverride != "" { + opts = append(opts, kafkatrace.WithService(serviceOverride)) + } + p, err := kafkatrace.NewProducer(&kafka.ConfigMap{ + "bootstrap.servers": "127.0.0.1:9092", + "go.delivery.reports": true, + }, opts...) + require.NoError(t, err) + + delivery := make(chan kafka.Event, 1) + err = p.Produce(&kafka.Message{ + TopicPartition: kafka.TopicPartition{ + Topic: &testTopic, + Partition: 0, + }, + Key: []byte("key2"), + Value: []byte("value2"), + }, delivery) + require.NoError(t, err) + + msg1, _ := (<-delivery).(*kafka.Message) + p.Close() + + // next attempt to consume the message + c, err := kafkatrace.NewConsumer(&kafka.ConfigMap{ + "group.id": testGroupID, + "bootstrap.servers": "127.0.0.1:9092", + "fetch.wait.max.ms": 500, + "socket.timeout.ms": 1500, + "session.timeout.ms": 1500, + "enable.auto.offset.store": false, + }, opts...) + require.NoError(t, err) + + err = c.Assign([]kafka.TopicPartition{ + {Topic: &testTopic, Partition: 0, Offset: msg1.TopicPartition.Offset}, + }) + require.NoError(t, err) + + msg2, err := c.ReadMessage(3000 * time.Millisecond) + require.NoError(t, err) + _, err = c.CommitMessage(msg2) + require.NoError(t, err) + assert.Equal(t, msg1.String(), msg2.String()) + err = c.Close() + require.NoError(t, err) + + return mt.FinishedSpans() + }, +) + +// This test lives in a separate package because having both confluent-kafka-go v1 and v2 in the same package +// causes "duplicate symbol" failures due to the cgo dependency on librdkafka. +func TestNamingSchema(t *testing.T) { + harness.RunTest(t, testCase) +} diff --git a/instrumentation/internal/namingschematest/confluent_kafka_v2_test.go b/instrumentation/internal/namingschematest/confluent_kafka_v2_test.go new file mode 100644 index 0000000000..233dd5fb97 --- /dev/null +++ b/instrumentation/internal/namingschematest/confluent_kafka_v2_test.go @@ -0,0 +1,84 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + "time" + + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + kafkatrace "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var ( + confluentKafkaV2GroupID = "ckgo-v2-gotest" + confluentKafkaV2Topic = "ckgo-v2-gotest" +) + +var confluentKafkaV2 = harness.KafkaTestCase( + instrumentation.PackageConfluentKafkaGoV2, + func(t *testing.T, serviceOverride string) []*mocktracer.Span { + + mt := mocktracer.Start() + defer mt.Stop() + + var opts []kafkatrace.Option + if serviceOverride != "" { + opts = append(opts, kafkatrace.WithService(serviceOverride)) + } + p, err := kafkatrace.NewProducer(&kafka.ConfigMap{ + "bootstrap.servers": kafkaAddr, + "go.delivery.reports": true, + }, opts...) + require.NoError(t, err) + + delivery := make(chan kafka.Event, 1) + err = p.Produce(&kafka.Message{ + TopicPartition: kafka.TopicPartition{ + Topic: &confluentKafkaV2Topic, + Partition: 0, + }, + Key: []byte("key2"), + Value: []byte("value2"), + }, delivery) + require.NoError(t, err) + + msg1, _ := (<-delivery).(*kafka.Message) + p.Close() + + // next attempt to consume the message + c, err := kafkatrace.NewConsumer(&kafka.ConfigMap{ + "group.id": confluentKafkaV2GroupID, + "bootstrap.servers": kafkaAddr, + "fetch.wait.max.ms": 500, + "socket.timeout.ms": 1500, + "session.timeout.ms": 1500, + "enable.auto.offset.store": false, + }, opts...) + require.NoError(t, err) + + err = c.Assign([]kafka.TopicPartition{ + {Topic: &confluentKafkaV2Topic, Partition: 0, Offset: msg1.TopicPartition.Offset}, + }) + require.NoError(t, err) + + msg2, err := c.ReadMessage(3000 * time.Millisecond) + require.NoError(t, err) + _, err = c.CommitMessage(msg2) + require.NoError(t, err) + assert.Equal(t, msg1.String(), msg2.String()) + err = c.Close() + require.NoError(t, err) + + return mt.FinishedSpans() + }, +) diff --git a/instrumentation/internal/namingschematest/database_sql_test.go b/instrumentation/internal/namingschematest/database_sql_test.go new file mode 100644 index 0000000000..a44fdd54a9 --- /dev/null +++ b/instrumentation/internal/namingschematest/database_sql_test.go @@ -0,0 +1,151 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "database/sql/driver" + "testing" + + mssql "github.com/denisenkom/go-mssqldb" + "github.com/go-sql-driver/mysql" + "github.com/lib/pq" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +func dbSQLGenSpans(driverName string, registerOverride bool) harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var registerOpts []sqltrace.Option + // serviceOverride has higher priority than the registerOverride parameter. + if serviceOverride != "" { + registerOpts = append(registerOpts, sqltrace.WithService(serviceOverride)) + } else if registerOverride { + registerOpts = append(registerOpts, sqltrace.WithService("register-override")) + } + var openOpts []sqltrace.Option + if serviceOverride != "" { + openOpts = append(openOpts, sqltrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + var ( + dv driver.Driver + dsn string + ) + switch driverName { + case "sqlserver": + dv = &mssql.Driver{} + dsn = "sqlserver://sa:myPassw0rd@127.0.0.1:1433?database=master" + case "postgres": + dv = &pq.Driver{} + dsn = "postgres://postgres:postgres@127.0.0.1:5432/postgres?sslmode=disable" + case "mysql": + dv = &mysql.MySQLDriver{} + dsn = "test:test@tcp(127.0.0.1:3306)/test" + default: + t.Fatal("unknown driver: ", driverName) + } + sqltrace.Register(driverName, dv, registerOpts...) + db, err := sqltrace.Open(driverName, dsn, openOpts...) + require.NoError(t, err) + + err = db.Ping() + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + return spans + } +} + +var databaseSQL_SQLServer = harness.TestCase{ + Name: instrumentation.PackageDatabaseSQL + "_SQLServer", + GenSpans: dbSQLGenSpans("sqlserver", false), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"sqlserver.db", "sqlserver.db"}, + DDService: []string{"sqlserver.db", "sqlserver.db"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "sqlserver.query", spans[0].OperationName()) + assert.Equal(t, "sqlserver.query", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "mssql.query", spans[0].OperationName()) + assert.Equal(t, "mssql.query", spans[1].OperationName()) + }, +} + +var databaseSQL_Postgres = harness.TestCase{ + Name: instrumentation.PackageDatabaseSQL + "_Postgres", + GenSpans: dbSQLGenSpans("postgres", false), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"postgres.db", "postgres.db"}, + DDService: []string{"postgres.db", "postgres.db"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "postgres.query", spans[0].OperationName()) + assert.Equal(t, "postgres.query", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "postgresql.query", spans[0].OperationName()) + assert.Equal(t, "postgresql.query", spans[1].OperationName()) + }, +} + +var databaseSQL_PostgresWithRegisterOverride = harness.TestCase{ + Name: instrumentation.PackageDatabaseSQL + "_PostgresWithRegisterOverride", + GenSpans: dbSQLGenSpans("postgres", true), + WantServiceNameV0: harness.ServiceNameAssertions{ + // when the WithService option is set during Register and not providing a service name when opening + // the DB connection, that value is used as default instead of postgres.db. + Defaults: []string{"register-override", "register-override"}, + // in v0, DD_SERVICE is ignored for this integration. + DDService: []string{"register-override", "register-override"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "postgres.query", spans[0].OperationName()) + assert.Equal(t, "postgres.query", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "postgresql.query", spans[0].OperationName()) + assert.Equal(t, "postgresql.query", spans[1].OperationName()) + }, +} + +var databaseSQL_MySQL = harness.TestCase{ + Name: instrumentation.PackageDatabaseSQL + "_MySQL", + GenSpans: dbSQLGenSpans("mysql", false), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"mysql.db", "mysql.db"}, + DDService: []string{"mysql.db", "mysql.db"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "mysql.query", spans[0].OperationName()) + assert.Equal(t, "mysql.query", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "mysql.query", spans[0].OperationName()) + assert.Equal(t, "mysql.query", spans[1].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/elastic_v6_test.go b/instrumentation/internal/namingschematest/elastic_v6_test.go new file mode 100644 index 0000000000..e4ff6788f0 --- /dev/null +++ b/instrumentation/internal/namingschematest/elastic_v6_test.go @@ -0,0 +1,66 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "strings" + "testing" + + elasticsearch8 "github.com/elastic/go-elasticsearch/v8" + esapi8 "github.com/elastic/go-elasticsearch/v8/esapi" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + elastictrace "github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var elasticV6 = harness.TestCase{ + Name: instrumentation.PackageGoElasticSearchV6, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []elastictrace.ClientOption + if serviceOverride != "" { + opts = append(opts, elastictrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + cfg := elasticsearch8.Config{ + Transport: elastictrace.NewRoundTripper(opts...), + Addresses: []string{ + "http://127.0.0.1:9204/", + }, + } + client, err := elasticsearch8.NewClient(cfg) + require.NoError(t, err) + + _, err = esapi8.IndexRequest{ + Index: "twitter", + DocumentID: "1", + Body: strings.NewReader(`{"user": "test", "message": "hello"}`), + }.Do(context.Background(), client) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + return spans + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"elastic.client"}, + DDService: []string{"elastic.client"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/fiber_v2_test.go b/instrumentation/internal/namingschematest/fiber_v2_test.go new file mode 100644 index 0000000000..dbf24b7b0d --- /dev/null +++ b/instrumentation/internal/namingschematest/fiber_v2_test.go @@ -0,0 +1,57 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http/httptest" + "testing" + + "github.com/gofiber/fiber/v2" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + fibertrace "github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var fiberV2Test = harness.TestCase{ + Name: instrumentation.PackageGoFiberV2, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []fibertrace.Option + if serviceOverride != "" { + opts = append(opts, fibertrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := fiber.New() + mux.Use(fibertrace.Middleware(opts...)) + mux.Get("/200", func(c *fiber.Ctx) error { + return c.SendString("ok") + }) + req := httptest.NewRequest("GET", "/200", nil) + resp, err := mux.Test(req) + require.NoError(t, err) + defer resp.Body.Close() + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"fiber"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/gcp_pubsub_test.go b/instrumentation/internal/namingschematest/gcp_pubsub_test.go new file mode 100644 index 0000000000..7e06b5ebac --- /dev/null +++ b/instrumentation/internal/namingschematest/gcp_pubsub_test.go @@ -0,0 +1,110 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "testing" + "time" + + "cloud.google.com/go/pubsub" + "cloud.google.com/go/pubsub/pstest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/status" + + pubsubtrace "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var gcpPubsub = harness.TestCase{ + Name: instrumentation.PackageGCPPubsub, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + mt := mocktracer.Start() + defer mt.Stop() + + var opts []pubsubtrace.Option + if serviceOverride != "" { + opts = append(opts, pubsubtrace.WithService(serviceOverride)) + } + topic, sub, srv, cleanup := newTestGCPPubsub(t) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + _, err := pubsubtrace.Publish(ctx, topic, &pubsub.Message{Data: []byte("hello"), OrderingKey: "xxx"}, opts...).Get(ctx) + require.NoError(t, err) + + done := make(chan struct{}) + go func() { + err := sub.Receive(ctx, pubsubtrace.WrapReceiveHandler(sub, func(ctx context.Context, msg *pubsub.Message) { + msg.Ack() + close(done) + }, opts...)) + if err != nil { + if st, ok := status.FromError(err); !ok || st.Code() != codes.Canceled { + t.Logf("sub.Receive failed: %v", err) + } + } + }() + + <-done + cancel() + cleanup() + srv.Wait() + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"", ""}, + DDService: []string{"", ""}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "pubsub.publish", spans[0].OperationName()) + assert.Equal(t, "pubsub.receive", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "gcp.pubsub.send", spans[0].OperationName()) + assert.Equal(t, "gcp.pubsub.process", spans[1].OperationName()) + }, +} + +func newTestGCPPubsub(t *testing.T) (*pubsub.Topic, *pubsub.Subscription, *pstest.Server, func()) { + srv := pstest.NewServer() + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + + conn, err := grpc.NewClient(srv.Addr, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + + client, err := pubsub.NewClient(ctx, "project", option.WithGRPCConn(conn)) + require.NoError(t, err) + + _, err = client.CreateTopic(ctx, "topic") + require.NoError(t, err) + + topic := client.Topic("topic") + topic.EnableMessageOrdering = true + _, err = client.CreateSubscription(ctx, "subscription", pubsub.SubscriptionConfig{ + Topic: topic, + }) + require.NoError(t, err) + + sub := client.Subscription("subscription") + return topic, sub, srv, func() { + assert.NoError(t, conn.Close()) + assert.NoError(t, srv.Close()) + } +} diff --git a/instrumentation/internal/namingschematest/gin_test.go b/instrumentation/internal/namingschematest/gin_test.go new file mode 100644 index 0000000000..c3acc6ff10 --- /dev/null +++ b/instrumentation/internal/namingschematest/gin_test.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http/httptest" + "testing" + + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + gintrace "github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var ginTest = harness.TestCase{ + Name: instrumentation.PackageGin, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + // silence startup logs + gin.SetMode(gin.ReleaseMode) + + mt := mocktracer.Start() + defer mt.Stop() + + mux := gin.New() + mux.Use(gintrace.Middleware(serviceOverride)) + mux.GET("/200", func(c *gin.Context) { + c.Status(200) + }) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"gin.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/go.mod b/instrumentation/internal/namingschematest/go.mod new file mode 100644 index 0000000000..b8211cac63 --- /dev/null +++ b/instrumentation/internal/namingschematest/go.mod @@ -0,0 +1,434 @@ +module github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2 + +go 1.24.0 + +require ( + cloud.google.com/go/pubsub v1.37.0 + github.com/99designs/gqlgen v0.17.72 + github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2 v2.3.0-dev.1 + github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2 v2.0.0-00010101000000-000000000000 + github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/IBM/sarama v1.42.1 + github.com/Shopify/sarama v1.38.1 + github.com/aws/aws-sdk-go v1.44.327 + github.com/aws/aws-sdk-go-v2 v1.36.5 + github.com/aws/aws-sdk-go-v2/config v1.29.17 + github.com/aws/aws-sdk-go-v2/service/ec2 v1.231.0 + github.com/aws/aws-sdk-go-v2/service/s3 v1.83.0 + github.com/aws/aws-sdk-go-v2/service/sns v1.34.7 + github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8 + github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 + github.com/confluentinc/confluent-kafka-go v1.9.2 + github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 + github.com/denisenkom/go-mssqldb v0.11.0 + github.com/elastic/go-elasticsearch/v8 v8.4.0 + github.com/emicklei/go-restful/v3 v3.11.0 + github.com/gin-gonic/gin v1.10.1 + github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 + github.com/go-chi/chi v1.5.4 + github.com/go-chi/chi/v5 v5.2.2 + github.com/go-pg/pg/v10 v10.15.0 + github.com/go-redis/redis v6.15.9+incompatible + github.com/go-redis/redis/v7 v7.4.1 + github.com/go-redis/redis/v8 v8.11.5 + github.com/go-sql-driver/mysql v1.6.0 + github.com/gocql/gocql v1.6.0 + github.com/gofiber/fiber/v2 v2.52.9 + github.com/graph-gophers/graphql-go v1.5.0 + github.com/graphql-go/graphql v0.8.1 + github.com/graphql-go/handler v0.2.4 + github.com/hashicorp/consul/api v1.24.0 + github.com/hashicorp/vault/api v1.15.0 + github.com/julienschmidt/httprouter v1.3.0 + github.com/labstack/echo/v4 v4.11.1 + github.com/lib/pq v1.10.2 + github.com/redis/go-redis/v9 v9.7.3 + github.com/segmentio/kafka-go v0.4.42 + github.com/stretchr/testify v1.11.1 + github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d + github.com/twitchtv/twirp v8.1.3+incompatible + github.com/urfave/negroni v1.0.0 + go.mongodb.org/mongo-driver v1.13.1 + google.golang.org/api v0.214.0 + google.golang.org/grpc v1.75.0 + gopkg.in/olivere/elastic.v5 v5.0.84 +) + +require ( + cloud.google.com/go v0.112.2 // indirect + cloud.google.com/go/auth v0.13.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.1.7 // indirect + dario.cat/mergo v1.0.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/agnivade/levenshtein v1.2.1 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 // indirect + github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.83 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.44.0 // indirect + github.com/aws/aws-sdk-go-v2/service/eventbridge v1.40.0 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 // indirect + github.com/aws/aws-sdk-go-v2/service/kinesis v1.35.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sfn v1.35.7 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect + github.com/aws/smithy-go v1.22.4 // indirect + github.com/bytedance/sonic v1.12.0 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/containerd/containerd/api v1.9.0 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dimfeld/httptreemux/v5 v5.5.0 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v28.0.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.4.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/elastic/elastic-transport-go/v8 v8.1.0 // indirect + github.com/fatih/color v1.17.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-pg/zerochecker v0.2.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v0.0.4 // indirect + github.com/gomodule/redigo v1.8.9 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/s2a-go v0.1.8 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/gax-go/v2 v2.14.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.0 // indirect + github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.6.3 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9 // indirect + github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/hashicorp/vault/sdk v0.15.0 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mdelapenya/tlscert v0.2.0 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/user v0.2.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/montanaflynn/stats v0.6.6 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sosodev/duration v1.3.1 // indirect + github.com/testcontainers/testcontainers-go v0.37.0 // indirect + github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0 // indirect + github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0 // indirect + github.com/testcontainers/testcontainers-go/modules/redis v0.37.0 // indirect + github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tidwall/btree v1.6.0 // indirect + github.com/tidwall/buntdb v1.3.0 // indirect + github.com/tidwall/gjson v1.16.0 // indirect + github.com/tidwall/grect v0.1.4 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tidwall/rtred v0.1.2 // indirect + github.com/tidwall/tinyqueue v0.1.1 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/vektah/gqlparser/v2 v2.5.25 // indirect + github.com/vmihailenco/bufpool v0.1.11 // indirect + github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect + github.com/vmihailenco/tagparser v0.1.2 // indirect + github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.einride.tech/aip v0.66.0 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + mellium.im/sasl v0.3.1 // indirect +) + +// Pin Shopify/sarama to the last version available to avoid breaking changes +// caused by the IBM/sarama fork. +replace github.com/Shopify/sarama => github.com/Shopify/sarama v1.38.1 + +replace github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 => ../../../contrib/99designs/gqlgen + +replace github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 => ../../../contrib/IBM/sarama + +replace github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 => ../../../contrib/Shopify/sarama + +replace github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 => ../../../contrib/aws/aws-sdk-go-v2 + +replace github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 => ../../../contrib/aws/aws-sdk-go + +replace github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2 => ../../../contrib/bradfitz/gomemcache + +replace github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 => ../../../contrib/cloud.google.com/go/pubsub.v1 + +replace github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 => ../../../contrib/confluentinc/confluent-kafka-go/kafka.v2 + +replace github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 => ../../../contrib/confluentinc/confluent-kafka-go/kafka + +replace github.com/DataDog/dd-trace-go/contrib/database/sql/v2 => ../../../contrib/database/sql + +replace github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2 => ../../../contrib/dimfeld/httptreemux.v5 + +replace github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 => ../../../contrib/elastic/go-elasticsearch.v6 + +replace github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2 => ../../../contrib/emicklei/go-restful.v3 + +replace github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 => ../../../contrib/gin-gonic/gin + +replace github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2 => ../../../contrib/globalsign/mgo + +replace github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 => ../../../contrib/go-chi/chi.v5 + +replace github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 => ../../../contrib/go-chi/chi + +replace github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2 => ../../../contrib/go-pg/pg.v10 + +replace github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 => ../../../contrib/go-redis/redis.v7 + +replace github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 => ../../../contrib/go-redis/redis.v8 + +replace github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 => ../../../contrib/go-redis/redis + +replace github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 => ../../../contrib/go.mongodb.org/mongo-driver + +replace github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 => ../../../contrib/gocql/gocql + +replace github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 => ../../../contrib/gofiber/fiber.v2 + +replace github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 => ../../../contrib/gomodule/redigo + +replace github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 => ../../../contrib/google.golang.org/grpc + +replace github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 => ../../../contrib/gorilla/mux + +replace github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 => ../../../contrib/graph-gophers/graphql-go + +replace github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2 => ../../../contrib/hashicorp/consul + +replace github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 => ../../../contrib/hashicorp/vault + +replace github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 => ../../../contrib/julienschmidt/httprouter + +replace github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 => ../../../contrib/labstack/echo.v4 + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../../contrib/net/http + +replace github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2 => ../../../contrib/olivere/elastic.v5 + +replace github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 => ../../../contrib/redis/go-redis.v9 + +replace github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 => ../../../contrib/segmentio/kafka-go + +replace github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2 => ../../../contrib/syndtr/goleveldb + +replace github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2 => ../../../contrib/tidwall/buntdb + +replace github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 => ../../../contrib/twitchtv/twirp + +replace github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2 => ../../../contrib/urfave/negroni + +replace github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 => ../../testutils/grpc + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. + +replace github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 => ../../../contrib/graphql-go/graphql + +replace github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2 => ../../testutils/containers diff --git a/instrumentation/internal/namingschematest/go.sum b/instrumentation/internal/namingschematest/go.sum new file mode 100644 index 0000000000..32305ae429 --- /dev/null +++ b/instrumentation/internal/namingschematest/go.sum @@ -0,0 +1,1363 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.112.2 h1:ZaGT6LiG7dBzi6zNOvVZwacaXlmf3lRqnC4DQzqyRQw= +cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= +cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs= +cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q= +cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU= +cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/iam v1.1.7 h1:z4VHOhwKLF/+UYXAJDFwGtNF0b6gjsW1Pk9Ml0U/IoM= +cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= +cloud.google.com/go/kms v1.15.8 h1:szIeDCowID8th2i8XE4uRev5PMxQFqW+JjwYxL9h6xs= +cloud.google.com/go/kms v1.15.8/go.mod h1:WoUHcDjD9pluCg7pNds131awnH429QGvRM3N/4MyoVs= +cloud.google.com/go/pubsub v1.37.0 h1:0uEEfaB1VIJzabPpwpZf44zWAKAme3zwKKxHk7vJQxQ= +cloud.google.com/go/pubsub v1.37.0/go.mod h1:YQOQr1uiUM092EXwKs56OPT650nwnawc+8/IjoUeGzQ= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/99designs/gqlgen v0.17.72 h1:2JDAuutIYtAN26BAtigfLZFnTN53fpYbIENL8bVgAKY= +github.com/99designs/gqlgen v0.17.72/go.mod h1:BoL4C3j9W2f95JeWMrSArdDNGWmZB9MOS2EMHJDZmUc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/IBM/sarama v1.42.1 h1:wugyWa15TDEHh2kvq2gAy1IHLjEjuYOYgXz/ruC/OSQ= +github.com/IBM/sarama v1.42.1/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= +github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= +github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/aws/aws-sdk-go v1.44.327 h1:ZS8oO4+7MOBLhkdwIhgtVeDzCeWOlTfKJS7EgggbIEY= +github.com/aws/aws-sdk-go v1.44.327/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0= +github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY= +github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0= +github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8= +github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0= +github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.83 h1:08otkOELsIi0toRRGMytlJhOctcN8xfKfKFR2NXz3kE= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.83/go.mod h1:dGsGb2wI8JDWeMAhjVPP+z+dqvYjL6k6o+EujcRNk5c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36 h1:GMYy2EOWfzdP3wfVAGXBNKY5vK4K8vMET4sYOYltmqs= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.36/go.mod h1:gDhdAV6wL3PmPqBhiPbnlS447GoWs8HTTOYef9/9Inw= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.44.0 h1:A99gjqZDbdhjtjJVZrmVzVKO2+p3MSg35bDWtbMQVxw= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.44.0/go.mod h1:mWB0GE1bqcVSvpW7OtFA0sKuHk52+IqtnsYU2jUfYAs= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.231.0 h1:uhIwvt6crp2kQenKojfDShGw39WEIrtPRfYZ3FAFlJk= +github.com/aws/aws-sdk-go-v2/service/ec2 v1.231.0/go.mod h1:35jGWx7ECvCwTsApqicFYzZ7JFEnBc6oHUuOQ3xIS54= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.40.0 h1:S2zUrIgbvBdHCWP5I5P3Wz8+YfDyp7rpCfGXBwmO3a8= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.40.0/go.mod h1:sIrUII6Z+hAVAgcpmsc2e9HvEr++m/v8aBPT7s4ZYUk= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4 h1:nAP2GYbfh8dd2zGZqFRSMlq+/F6cMPBUuCsGAMkN074= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.4/go.mod h1:LT10DsiGjLWh4GbjInf9LQejkYEhBgBCjLG5+lvk4EE= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.17 h1:x187MqiHwBGjMGAed8Y8K1VGuCtFvQvXb24r+bwmSdo= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.17/go.mod h1:mC9qMbA6e1pwEq6X3zDGtZRXMG2YaElJkbJlMVHLs5I= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17 h1:qcLWgdhq45sDM9na4cvXax9dyLitn8EYBRl8Ak4XtG4= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.17/go.mod h1:M+jkjBFZ2J6DJrjMv2+vkBbuht6kxJYtJiwoVgX4p4U= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.35.3 h1:aAi9YBNpYMEX52Z9qy1YP2t3RhDqMcP67Ep/C4q5RiQ= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.35.3/go.mod h1:DH0TzTbBG82HKNpBQlplRNSS4bGz0dsbJvxdK9f6rUY= +github.com/aws/aws-sdk-go-v2/service/s3 v1.83.0 h1:5Y75q0RPQoAbieyOuGLhjV9P3txvYgXv2lg0UwJOfmE= +github.com/aws/aws-sdk-go-v2/service/s3 v1.83.0/go.mod h1:kUklwasNoCn5YpyAqC/97r6dzTA1SRKJfKq16SXeoDU= +github.com/aws/aws-sdk-go-v2/service/sfn v1.35.7 h1:W5ZFACjUxkIjjtMGG21GhJ3uJfV7ejEsOkJTQHMHrEY= +github.com/aws/aws-sdk-go-v2/service/sfn v1.35.7/go.mod h1:x82j2Ux2Qr9Qzdb47peCIIa8agq7z3k0Zf4TWHEAxjo= +github.com/aws/aws-sdk-go-v2/service/sns v1.34.7 h1:OBuZE9Wt8h2imuRktu+WfjiTGrnYdCIJg8IX92aalHE= +github.com/aws/aws-sdk-go-v2/service/sns v1.34.7/go.mod h1:4WYoZAhHt+dWYpoOQUgkUKfuQbE6Gg/hW4oXE0pKS9U= +github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8 h1:80dpSqWMwx2dAm30Ib7J6ucz1ZHfiv5OCRwN/EnCOXQ= +github.com/aws/aws-sdk-go-v2/service/sqs v1.38.8/go.mod h1:IzNt/udsXlETCdvBOL0nmyMe2t9cGmXmZgsdoZGYYhI= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0= +github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w= +github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= +github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 h1:Dr+ezPI5ivhMn/3WOoB86XzMhie146DNaBbhaQWZHMY= +github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/bytedance/sonic v1.12.0 h1:YGPgxF9xzaCNvd/ZKdQ28yRovhfMFZQjuk6fKBzZ3ls= +github.com/bytedance/sonic v1.12.0/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2 h1:eJ01FpliL/02KvsaPyH1bSLbM1S70yWQUojHVRbyvy4= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2/go.mod h1:IVsvFyGVhw4FASzUtlWNVaAOhYmakXAFY9IlZ7LAuD8= +github.com/confluentinc/confluent-kafka-go v1.9.2 h1:gV/GxhMBUb03tFWkN+7kdhg+zf+QUM+wVkI9zwh770Q= +github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pnwWZElUoWxHoV8E43DCrliyo= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 h1:NbOku86JJlsRJPJKE0snNsz6D1Qr4j5VR/lticrLZrY= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0/go.mod h1:E1dEQy50ZLfqs7T9luxz0rLxaeFZJZE92XvApJOr/Rk= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= +github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= +github.com/containerd/containerd/api v1.9.0 h1:HZ/licowTRazus+wt9fM6r/9BQO7S0vD5lMcWspGIg0= +github.com/containerd/containerd/api v1.9.0/go.mod h1:GhghKFmTR3hNtyznBoQ0EMWr9ju5AqHjcZPsSpTKutI= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/dimfeld/httptreemux/v5 v5.5.0 h1:p8jkiMrCuZ0CmhwYLcbNbl7DDo21fozhKHQ2PccwOFQ= +github.com/dimfeld/httptreemux/v5 v5.5.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu93CKPnTLbsidvSw= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315 h1:UZxx9xBADdf/9UmSdEUi+pdJoPKpgcf9QUAY5gEIYmY= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315/go.mod h1:X8ZHhuW6ncwtoJ36TlU+gyaROTcBkTE01VHYmTStQCE= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.24.3 h1:BVc1oDV7aQgksH64pDKTvcI95G36uJ+Mz9DGGBBoZeQ= +github.com/docker/compose/v2 v2.24.3/go.mod h1:D8Nv9+juzD7xiMyyHJ7G2J/MOYiGBmb9SvdIW5+2zKo= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= +github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= +github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/elastic-transport-go/v8 v8.1.0 h1:NeqEz1ty4RQz+TVbUrpSU7pZ48XkzGWQj02k5koahIE= +github.com/elastic/elastic-transport-go/v8 v8.1.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= +github.com/elastic/go-elasticsearch/v6 v6.8.5 h1:U2HtkBseC1FNBmDr0TR2tKltL6FxoY+niDAlj5M8TK8= +github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= +github.com/elastic/go-elasticsearch/v7 v7.17.1 h1:49mHcHx7lpCL8cW1aioEwSEVKQF3s+Igi4Ye/QTWwmk= +github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/go-elasticsearch/v8 v8.4.0 h1:Rn1mcqaIMcNT43hnx2H62cIFZ+B6mjWtzj85BDKrvCE= +github.com/elastic/go-elasticsearch/v8 v8.4.0/go.mod h1:yY52i2Vj0unLz+N3Nwx1gM5LXwoj3h2dgptNGBYkMLA= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/fsnotify/fsevents v0.1.1 h1:/125uxJvvoSDDBPen6yUZbil8J9ydKZnnl3TWWmvnkw= +github.com/fsnotify/fsevents v0.1.1/go.mod h1:+d+hS27T6k5J8CRaPLKFgwKYcpS7GwW3Ule9+SC2ZRc= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= +github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= +github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= +github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= +github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= +github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.20.0 h1:MYlu0sBgChmCfJxxUKZ8g1cPWFOB37YSZqewK7OKeyA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-pg/pg/v10 v10.15.0 h1:6DQwbaxJz/e4wvgzbxBkBLiL/Uuk87MGgHhkURtzx24= +github.com/go-pg/pg/v10 v10.15.0/go.mod h1:FIn/x04hahOf9ywQ1p68rXqaDVbTRLYlu4MQR0lhoB8= +github.com/go-pg/zerochecker v0.2.0 h1:pp7f72c3DobMWOb2ErtZsnrPaSvHd2W4o9//8HtF4mU= +github.com/go-pg/zerochecker v0.2.0/go.mod h1:NJZ4wKL0NmTtz0GKCoJ8kym6Xn/EQzXRl2OnAe7MmDo= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= +github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw= +github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= +github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= +github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o= +github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= +github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= +github.com/graphql-go/handler v0.2.4 h1:gz9q11TUHPNUpqzV8LMa+rkqM5NUuH/nkE3oF2LS3rI= +github.com/graphql-go/handler v0.2.4/go.mod h1:gsQlb4gDvURR0bgN8vWQEh+s5vJALM2lYL3n3cf6OxQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= +github.com/hashicorp/consul/api v1.24.0 h1:u2XyStA2j0jnCiVUU7Qyrt8idjRn4ORhK6DlvZ3bWhA= +github.com/hashicorp/consul/api v1.24.0/go.mod h1:NZJGRFYruc/80wYowkPFCp1LbGmJC9L8izrwfyVx/Wg= +github.com/hashicorp/consul/sdk v0.14.1 h1:ZiwE2bKb+zro68sWzZ1SgHF3kRMBZ94TwOCFRF4ylPs= +github.com/hashicorp/consul/sdk v0.14.1/go.mod h1:vFt03juSzocLRFo59NkeQHHmQa6+g7oU0pfzdI1mUhg= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9 h1:FW0YttEnUNDJ2WL9XcrrfteS1xW8u+sh4ggM8pN5isQ= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= +github.com/hashicorp/vault/api v1.15.0 h1:O24FYQCWwhwKnF7CuSqP30S51rTV7vz1iACXE/pj5DA= +github.com/hashicorp/vault/api v1.15.0/go.mod h1:+5YTO09JGn0u+b6ySD/LLVf8WkJCPLAL2Vkmrn2+CM8= +github.com/hashicorp/vault/sdk v0.15.0 h1:xNo1lL2shm0yE4coXNZkTV/6++2GfEh+/cCAfBjzEnA= +github.com/hashicorp/vault/sdk v0.15.0/go.mod h1:2Wj2tHIgfz0gNWgEPWBbCXFIiPrq96E8FTjPNV9J1Bc= +github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20180730094502-03f2033d19d5/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mdelapenya/tlscert v0.2.0 h1:7H81W6Z/4weDvZBNOfQte5GpIMo0lGYEeWbkGp5LJHI= +github.com/mdelapenya/tlscert v0.2.0/go.mod h1:O4njj3ELLnJjGdkN7M/vIVCpZ+Cf0L6muqOG4tLSl8o= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 h1:r80LLQ91uOLxU1ElAvrB1o8oBsph51lPzVnr7t2b200= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991/go.mod h1:6MddWPSL5jxy+W8eMMHWDOfZzzRRKWXPZqajw72YHBc= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.2.0 h1:OnpapJsRp25vkhw8TFG6OLJODNh/3rEwRWtJ3kakwRM= +github.com/moby/sys/user v0.2.0/go.mod h1:RYstrcWOJpVh+6qzUqp2bU3eaRpdiQeKGlKitaH0PM8= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= +github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs= +github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/testcontainers/testcontainers-go v0.37.0 h1:L2Qc0vkTw2EHWQ08djon0D2uw7Z/PtHS/QzZZ5Ra/hg= +github.com/testcontainers/testcontainers-go v0.37.0/go.mod h1:QPzbxZhQ6Bclip9igjLFj6z0hs01bU8lrl2dHQmgFGM= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1 h1:47ipPM+s+ltCDOP3Sa1j95AkNb+z+WGiHLDbLU8ixuc= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1/go.mod h1:Sqh+Ef2ESdbJQjTJl57UOkEHkOc7gXvQLg1b5xh6f1Y= +github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0 h1:ZkYNKqhqvKm+aZk9C1fxw/fpNNOK+Nm/wHPjmJdN3Ko= +github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0/go.mod h1:+LvaFfSFW5PMiJTxTQlV6TBpXH1Ktk1h0FTVRZfqSxY= +github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0 h1:drGy4LJOVkIKpKGm1YKTfVzb1qRhN/konVpmuUphq0k= +github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0/go.mod h1:e9/4dGJfSZW59/kXGf/ksrEvA+BqP/daax0Usp2cpsM= +github.com/testcontainers/testcontainers-go/modules/redis v0.37.0 h1:9HIY28I9ME/Zmb+zey1p/I1mto5+5ch0wLX+nJdOsQ4= +github.com/testcontainers/testcontainers-go/modules/redis v0.37.0/go.mod h1:Abu9g/25Qv+FkYVx3U4Voaynou1c+7D0HIhaQJXvk6E= +github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0 h1:eIf5TWPO7Oq/h2Hb6UVn5r/x0ucGRxcKkbNtqCRzH9k= +github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0/go.mod h1:bOuF2ueLQxiK44g7y90UT2lf3qitxUHV8ax2OHrPGT4= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= +github.com/tidwall/assert v0.1.0/go.mod h1:QLYtGyeqse53vuELQheYl9dngGCJQ+mTtlxcktb+Kj8= +github.com/tidwall/btree v1.6.0 h1:LDZfKfQIBHGHWSwckhXI0RPSXzlo+KYdjK7FWSqOzzg= +github.com/tidwall/btree v1.6.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= +github.com/tidwall/buntdb v1.3.0 h1:gdhWO+/YwoB2qZMeAU9JcWWsHSYU3OvcieYgFRS0zwA= +github.com/tidwall/buntdb v1.3.0/go.mod h1:lZZrZUWzlyDJKlLQ6DKAy53LnG7m5kHyrEHvvcDmBpU= +github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/gjson v1.16.0 h1:SyXa+dsSPpUlcwEDuKuEBJEz5vzTvOea+9rjyYodQFg= +github.com/tidwall/gjson v1.16.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/grect v0.1.4 h1:dA3oIgNgWdSspFzn1kS4S/RDpZFLrIxAZOdJKjYapOg= +github.com/tidwall/grect v0.1.4/go.mod h1:9FBsaYRaR0Tcy4UwefBX/UDcDcDy9V5jUcxHzv2jd5Q= +github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8= +github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/rtred v0.1.2 h1:exmoQtOLvDoO8ud++6LwVsAMTu0KPzLTUrMln8u1yu8= +github.com/tidwall/rtred v0.1.2/go.mod h1:hd69WNXQ5RP9vHd7dqekAz+RIdtfBogmglkZSRxCHFQ= +github.com/tidwall/tinyqueue v0.1.1 h1:SpNEvEggbpyN5DIReaJ2/1ndroY8iyEGxPYxoSaymYE= +github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q096fQP5zMYw= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc h1:9lRDQMhESg+zvGYmW5DyG0UqvY96Bu5QYsTLvCHdrgo= +github.com/tmthrgd/go-hex v0.0.0-20190904060850-447a3041c3bc/go.mod h1:bciPuU6GHm1iF1pBvUfxfsH0Wmnc2VbpgvbI9ZWuIRs= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 h1:ZT8ibgassurSISJ1Pj26NsM3vY2jxFZn63Nd/TpHmRw= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302/go.mod h1:9kMVqMyQ/Sx2df5LtnGG+nbrmiZzCS7V6gjW3oGHsvI= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/twitchtv/twirp v8.1.3+incompatible h1:+F4TdErPgSUbMZMwp13Q/KgDVuI7HJXP61mNV3/7iuU= +github.com/twitchtv/twirp v8.1.3+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/valkey-io/valkey-go v1.0.41 h1:pWgh9MP24Vl0ANZ0KxEMwB/LHvTUKwlm2SPuWIrSlFw= +github.com/valkey-io/valkey-go v1.0.41/go.mod h1:LXqAbjygRuA1YRocojTslAGx2dQB4p8feaseGviWka4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektah/gqlparser/v2 v2.5.25 h1:FmWtFEa+invTIzWlWK6Vk7BVEZU/97QBzeI8Z1JjGt8= +github.com/vektah/gqlparser/v2 v2.5.25/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vmihailenco/bufpool v0.1.11 h1:gOq2WmBrq0i2yW5QJ16ykccQ4wH9UyEsgLm6czKAd94= +github.com/vmihailenco/bufpool v0.1.11/go.mod h1:AFf/MOy3l2CFTKbxwt0mp2MwnqjNEs5H/UxrkA5jxTQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= +github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= +github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= +go.einride.tech/aip v0.66.0/go.mod h1:qAhMsfT7plxBX+Oy7Huol6YUvZ0ZzdUz26yZsQwfl1M= +go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 h1:2ea0IkZBsWH+HA2GkD+7+hRw2u97jzdFyRtXuO14a1s= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0/go.mod h1:4m3RnBBb+7dB9d21y510oO1pdB1V4J6smNf14WXcBFQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0 h1:jwV9iQdvp38fxXi8ZC+lNpxjK16MRcZlpDYvbuO1FiA= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0/go.mod h1:f3bYiqNqhoPxkvI2LrXqQVC546K7BuRDL/kKuxkujhA= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/api v0.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA= +google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa h1:ePqxpG3LVx+feAUOx8YmR5T7rc0rdzK8DyxM8cQ9zq0= +google.golang.org/genproto v0.0.0-20240325203815-454cdb8f5daa/go.mod h1:CnZenrTdRJb7jc+jOm0Rkywq+9wh0QC4U8tyiRbEPPM= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/olivere/elastic.v5 v5.0.84 h1:acF/tRSg5geZpE3rqLglkS79CQMIMzOpWZE7hRXIkjs= +gopkg.in/olivere/elastic.v5 v5.0.84/go.mod h1:LXF6q9XNBxpMqrcgax95C6xyARXWbbCXUrtTxrNrxJI= +gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.26.7 h1:Lf4iEBEJb5OFNmawtBfSZV/UNi9riSJ0t1qdhyZqI40= +k8s.io/api v0.26.7/go.mod h1:Vk9bMadzA49UHPmHB//lX7VRCQSXGoVwfLd3Sc1SSXI= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.26.7 h1:NX/zBZZn4R+Cq6shwyn8Pn8REd0yJJ16dbtv9WkEVEU= +k8s.io/apiserver v0.26.7/go.mod h1:r0wDRWHI7VL/KlQLTkJJBVGZ3KeNfv+VetlyRtr86xs= +k8s.io/client-go v0.26.7 h1:hyU9aKHlwVOykgyxzGYkrDSLCc4+mimZVyUJjPyUn1E= +k8s.io/client-go v0.26.7/go.mod h1:okYjy0jtq6sdeztALDvCh24tg4opOQS1XNvsJlERDAo= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E= +k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4= +k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= +k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +mellium.im/sasl v0.3.1 h1:wE0LW6g7U83vhvxjC1IY8DnXM+EU095yeo8XClvCdfo= +mellium.im/sasl v0.3.1/go.mod h1:xm59PUYpZHhgQ9ZqoJ5QaCqzWMi8IeS49dhp6plPCzw= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k= +sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +tags.cncf.io/container-device-interface v0.6.2 h1:dThE6dtp/93ZDGhqaED2Pu374SOeUkBfuvkLuiTdwzg= +tags.cncf.io/container-device-interface v0.6.2/go.mod h1:Shusyhjs1A5Na/kqPVLL0KqnHQHuunol9LFeUNkuGVE= diff --git a/instrumentation/internal/namingschematest/go_pg_v10_test.go b/instrumentation/internal/namingschematest/go_pg_v10_test.go new file mode 100644 index 0000000000..746f668751 --- /dev/null +++ b/instrumentation/internal/namingschematest/go_pg_v10_test.go @@ -0,0 +1,58 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/go-pg/pg/v10" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + pgtrace "github.com/DataDog/dd-trace-go/contrib/go-pg/pg.v10/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var goPGv10Test = harness.TestCase{ + Name: instrumentation.PackageGoPGV10, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []pgtrace.Option + if serviceOverride != "" { + opts = append(opts, pgtrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + conn := pg.Connect(&pg.Options{ + User: "postgres", + Password: "postgres", + Database: "postgres", + }) + pgtrace.Wrap(conn, opts...) + defer conn.Close() + + var n int + _, err := conn.QueryOne(pg.Scan(&n), "SELECT 1") + require.NoError(t, err) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"gopg.db"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "go-pg", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "postgresql.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/go_redis_v1_test.go b/instrumentation/internal/namingschematest/go_redis_v1_test.go new file mode 100644 index 0000000000..a058127da6 --- /dev/null +++ b/instrumentation/internal/namingschematest/go_redis_v1_test.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/go-redis/redis" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + redistrace "github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var goRedisV1Test = harness.TestCase{ + Name: instrumentation.PackageGoRedis, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []redistrace.ClientOption + if serviceOverride != "" { + opts = append(opts, redistrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + client := redistrace.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) + st := client.Set("test_key", "test_value", 0) + require.NoError(t, st.Err()) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"redis.client"}, + DDService: []string{"redis.client"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/go_redis_v7_test.go b/instrumentation/internal/namingschematest/go_redis_v7_test.go new file mode 100644 index 0000000000..78f7aeca6d --- /dev/null +++ b/instrumentation/internal/namingschematest/go_redis_v7_test.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/go-redis/redis/v7" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + redistrace "github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var goRedisV7Test = harness.TestCase{ + Name: instrumentation.PackageGoRedisV7, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []redistrace.ClientOption + if serviceOverride != "" { + opts = append(opts, redistrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + client := redistrace.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) + st := client.Set("test_key", "test_value", 0) + require.NoError(t, st.Err()) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"redis.client"}, + DDService: []string{"redis.client"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/go_redis_v8_test.go b/instrumentation/internal/namingschematest/go_redis_v8_test.go new file mode 100644 index 0000000000..dc92b64ea2 --- /dev/null +++ b/instrumentation/internal/namingschematest/go_redis_v8_test.go @@ -0,0 +1,51 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "testing" + + "github.com/go-redis/redis/v8" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + redistrace "github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var goRedisV8Test = harness.TestCase{ + Name: instrumentation.PackageGoRedisV8, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []redistrace.ClientOption + if serviceOverride != "" { + opts = append(opts, redistrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + client := redistrace.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) + st := client.Set(context.Background(), "test_key", "test_value", 0) + require.NoError(t, st.Err()) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"redis.client"}, + DDService: []string{"redis.client"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/go_restful_v3_test.go b/instrumentation/internal/namingschematest/go_restful_v3_test.go new file mode 100644 index 0000000000..9780666122 --- /dev/null +++ b/instrumentation/internal/namingschematest/go_restful_v3_test.go @@ -0,0 +1,61 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http/httptest" + "testing" + + "github.com/emicklei/go-restful/v3" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + restfultrace "github.com/DataDog/dd-trace-go/contrib/emicklei/go-restful.v3/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var goRestfulV3 = harness.TestCase{ + Name: instrumentation.PackageEmickleiGoRestfulV3, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []restfultrace.Option + if serviceOverride != "" { + opts = append(opts, restfultrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + ws := new(restful.WebService) + ws.Filter(restfultrace.FilterFunc(opts...)) + ws.Route(ws.GET("/user/{id}").Param(restful.PathParameter("id", "user ID")). + To(func(request *restful.Request, response *restful.Response) { + _, err := response.Write([]byte(request.PathParameter("id"))) + require.NoError(t, err) + })) + container := restful.NewContainer() + container.Add(ws) + + r := httptest.NewRequest("GET", "/user/200", nil) + w := httptest.NewRecorder() + container.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"go-restful"}, + DDService: []string{"go-restful"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/gocql_test.go b/instrumentation/internal/namingschematest/gocql_test.go new file mode 100644 index 0000000000..4f5bfda34f --- /dev/null +++ b/instrumentation/internal/namingschematest/gocql_test.go @@ -0,0 +1,76 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + "time" + + "github.com/gocql/gocql" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + gocqltrace "github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var gocqlTest = harness.TestCase{ + Name: instrumentation.PackageGoCQL, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []gocqltrace.WrapOption + if serviceOverride != "" { + opts = append(opts, gocqltrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + nonTraced, err := gocql.NewSession(*gocql.NewCluster("127.0.0.1:9042")) + require.NoError(t, err) + // Ensures test keyspace and table person exists. + require.NoError(t, nonTraced.Query("CREATE KEYSPACE if not exists trace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor': 1}").Exec()) + require.NoError(t, nonTraced.Query("CREATE TABLE if not exists trace.person (name text PRIMARY KEY, age int, description text)").Exec()) + + cluster := gocqltrace.NewCluster([]string{"127.0.0.1:9042"}, opts...) + cluster.ConnectTimeout = 2 * time.Second + cluster.Timeout = 2 * time.Second + + session, err := cluster.CreateSession() + require.NoError(t, err) + + stmt := "INSERT INTO trace.person (name, age, description) VALUES (?, ?, ?)" + + // generate query span + err = session.Query(stmt, "name", 30, "description").Exec() + require.NoError(t, err) + + // generate batch span + tb := session.NewBatch(gocql.UnloggedBatch) + + tb.Query(stmt, "Kate", 80, "Cassandra's sister running in kubernetes") + tb.Query(stmt, "Lucas", 60, "Another person") + err = tb.ExecuteBatch(session.Session) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"gocql.query", "gocql.query"}, + DDService: []string{"gocql.query", "gocql.query"}, + ServiceOverride: []string{harness.TestServiceOverride, harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "cassandra.query", spans[0].OperationName()) + assert.Equal(t, "cassandra.batch", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "cassandra.query", spans[0].OperationName()) + assert.Equal(t, "cassandra.query", spans[1].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/gomemcache_test.go b/instrumentation/internal/namingschematest/gomemcache_test.go new file mode 100644 index 0000000000..cad302c1a6 --- /dev/null +++ b/instrumentation/internal/namingschematest/gomemcache_test.go @@ -0,0 +1,105 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "bufio" + "fmt" + "net" + "strings" + "testing" + "time" + + "github.com/bradfitz/gomemcache/memcache" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + memcachetrace "github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2/memcache" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var gomemcache = harness.TestCase{ + Name: instrumentation.PackageBradfitzGoMemcache, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + li := startMemcacheTestServer(t) + defer li.Close() + addr := li.Addr().String() + + var opts []memcachetrace.ClientOption + if serviceOverride != "" { + opts = append(opts, memcachetrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + client := memcachetrace.WrapClient(memcache.New(addr), opts...) + client.Timeout = 2 * time.Second // Default timeout is 100ms, it can be short for the CI runner. + + defer client.DeleteAll() + err := client.Add(&memcache.Item{Key: "key1", Value: []byte("value1")}) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + return spans + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"memcached"}, + DDService: []string{"memcached"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "memcached.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "memcached.command", spans[0].OperationName()) + }, +} + +func startMemcacheTestServer(t *testing.T) net.Listener { + li, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + go func() { + for { + c, err := li.Accept() + if err != nil { + break + } + go func() { + defer c.Close() + + // the memcache textual protocol is line-oriented with each + // command being space separated: + // + // command1 arg1 arg2 + // command2 arg1 arg2 + // ... + // + s := bufio.NewScanner(c) + for s.Scan() { + args := strings.Split(s.Text(), " ") + switch args[0] { + case "add": + if !s.Scan() { + return + } + fmt.Fprintf(c, "STORED\r\n") + default: + fmt.Fprintf(c, "SERVER ERROR unknown command: %v \r\n", args[0]) + return + } + } + }() + } + }() + + return li +} diff --git a/instrumentation/internal/namingschematest/gorilla_mux_test.go b/instrumentation/internal/namingschematest/gorilla_mux_test.go new file mode 100644 index 0000000000..ff500d393a --- /dev/null +++ b/instrumentation/internal/namingschematest/gorilla_mux_test.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + muxtrace "github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var gorillaMux = harness.TestCase{ + Name: instrumentation.PackageGorillaMux, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []muxtrace.RouterOption + if serviceOverride != "" { + opts = append(opts, muxtrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := muxtrace.NewRouter(opts...) + mux.Handle("/200", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("200!\n")) + })) + req := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, req) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"mux.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/gqlgen_test.go b/instrumentation/internal/namingschematest/gqlgen_test.go new file mode 100644 index 0000000000..bd7e59b699 --- /dev/null +++ b/instrumentation/internal/namingschematest/gqlgen_test.go @@ -0,0 +1,82 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/99designs/gqlgen/client" + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/handler/testserver" + "github.com/99designs/gqlgen/graphql/handler/transport" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + gqlgentrace "github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var gqlgen = harness.TestCase{ + Name: instrumentation.Package99DesignsGQLGen, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + type testServerResponse struct { + Name string + } + newTestClient := func(t *testing.T, h *testserver.TestServer, tracer graphql.HandlerExtension) *client.Client { + t.Helper() + h.AddTransport(transport.POST{}) + h.Use(tracer) + return client.New(h) + } + + var opts []gqlgentrace.Option + if serviceOverride != "" { + opts = append(opts, gqlgentrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + c := newTestClient(t, testserver.New(), gqlgentrace.NewTracer(opts...)) + err := c.Post(`{ name }`, &testServerResponse{}) + require.NoError(t, err) + + err = c.Post(`mutation { name }`, &testServerResponse{}) + require.ErrorContains(t, err, "mutations are not supported") + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("graphql", 9), + DDService: harness.RepeatString("graphql", 9), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 9), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 9) + assert.Equal(t, "graphql.read", spans[0].OperationName()) + assert.Equal(t, "graphql.parse", spans[1].OperationName()) + assert.Equal(t, "graphql.validate", spans[2].OperationName()) + assert.Equal(t, "graphql.field", spans[3].OperationName()) + assert.Equal(t, "graphql.query", spans[4].OperationName()) + assert.Equal(t, "graphql.read", spans[5].OperationName()) + assert.Equal(t, "graphql.parse", spans[6].OperationName()) + assert.Equal(t, "graphql.validate", spans[7].OperationName()) + assert.Equal(t, "graphql.mutation", spans[8].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 9) + assert.Equal(t, "graphql.read", spans[0].OperationName()) + assert.Equal(t, "graphql.parse", spans[1].OperationName()) + assert.Equal(t, "graphql.validate", spans[2].OperationName()) + assert.Equal(t, "graphql.field", spans[3].OperationName()) + assert.Equal(t, "graphql.server.request", spans[4].OperationName()) + assert.Equal(t, "graphql.read", spans[5].OperationName()) + assert.Equal(t, "graphql.parse", spans[6].OperationName()) + assert.Equal(t, "graphql.validate", spans[7].OperationName()) + assert.Equal(t, "graphql.server.request", spans[8].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/graphgophers_graphql_test.go b/instrumentation/internal/namingschematest/graphgophers_graphql_test.go new file mode 100644 index 0000000000..758e12227a --- /dev/null +++ b/instrumentation/internal/namingschematest/graphgophers_graphql_test.go @@ -0,0 +1,82 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/graph-gophers/graphql-go" + "github.com/graph-gophers/graphql-go/relay" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + graphqltrace "github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +type testResolver struct{} + +func (*testResolver) Hello() string { return "Hello, world!" } +func (*testResolver) HelloNonTrivial() (string, error) { return "Hello, world!", nil } + +const testServerSchema = ` + schema { + query: Query + } + type Query { + hello: String! + helloNonTrivial: String! + } +` + +func graphGophersGraphQLGoGenSpans() harness.GenSpansFn { + newTestServer := func(opts ...graphqltrace.Option) *httptest.Server { + schema := graphql.MustParseSchema(testServerSchema, new(testResolver), graphql.Tracer(graphqltrace.NewTracer(opts...))) + return httptest.NewServer(&relay.Handler{Schema: schema}) + } + + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []graphqltrace.Option + if serviceOverride != "" { + opts = append(opts, graphqltrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + srv := newTestServer(opts...) + defer srv.Close() + resp, err := http.Post(srv.URL, "application/json", strings.NewReader(`{"query": "{ hello }"}`)) + require.NoError(t, err) + defer resp.Body.Close() + + return mt.FinishedSpans() + } +} + +var graphGophersGraphQLGo = harness.TestCase{ + Name: instrumentation.PackageGraphGophersGraphQLGo, + GenSpans: graphGophersGraphQLGoGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("graphql.server", 2), + DDService: harness.RepeatString(harness.TestDDService, 2), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 2), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "graphql.field", spans[0].OperationName()) + assert.Equal(t, "graphql.request", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "graphql.field", spans[0].OperationName()) + assert.Equal(t, "graphql.server.request", spans[1].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/graphqlgo_test.go b/instrumentation/internal/namingschematest/graphqlgo_test.go new file mode 100644 index 0000000000..fc47875dfb --- /dev/null +++ b/instrumentation/internal/namingschematest/graphqlgo_test.go @@ -0,0 +1,98 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "errors" + "net/http" + "net/http/httptest" + "strings" + "testing" + + "github.com/graphql-go/graphql" + "github.com/graphql-go/handler" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + graphqltrace "github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var graphqlGo = harness.TestCase{ + Name: instrumentation.PackageGraphQLGoGraphQL, + GenSpans: graphQLGoGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("graphql.server", 5), + DDService: harness.RepeatString(harness.TestDDService, 5), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 5), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 5) + assert.Equal(t, "graphql.parse", spans[0].OperationName()) + assert.Equal(t, "graphql.validate", spans[1].OperationName()) + assert.Equal(t, "graphql.resolve", spans[2].OperationName()) + assert.Equal(t, "graphql.execute", spans[3].OperationName()) + assert.Equal(t, "graphql.server", spans[4].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 5) + assert.Equal(t, "graphql.parse", spans[0].OperationName()) + assert.Equal(t, "graphql.validate", spans[1].OperationName()) + assert.Equal(t, "graphql.resolve", spans[2].OperationName()) + assert.Equal(t, "graphql.execute", spans[3].OperationName()) + assert.Equal(t, "graphql.server", spans[4].OperationName()) + }, +} + +func graphQLGoGenSpans() harness.GenSpansFn { + newTestServer := func(t *testing.T, opts ...graphqltrace.Option) *httptest.Server { + cfg := graphql.SchemaConfig{ + Query: graphql.NewObject(graphql.ObjectConfig{ + Name: "Query", + Fields: graphql.Fields{ + "withError": &graphql.Field{ + Args: graphql.FieldConfigArgument{}, + Type: graphql.ID, + Resolve: func(_ graphql.ResolveParams) (interface{}, error) { + return nil, errors.New("some error") + }, + }, + }, + }), + } + schema, err := graphqltrace.NewSchema(cfg, opts...) + require.NoError(t, err) + + h := handler.New(&handler.Config{Schema: &schema, Pretty: true, GraphiQL: true}) + srv := httptest.NewServer(h) + t.Cleanup(srv.Close) + + return srv + } + + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []graphqltrace.Option + if serviceOverride != "" { + opts = append(opts, graphqltrace.WithService(serviceOverride)) + } + + mt := mocktracer.Start() + defer mt.Stop() + + srv := newTestServer(t, opts...) + defer srv.Close() + + q := `{"query": "{ withError }"}` + resp, err := http.Post(srv.URL, "application/json", strings.NewReader(q)) + require.NoError(t, err) + require.Equal(t, 200, resp.StatusCode) + defer resp.Body.Close() + + return mt.FinishedSpans() + } +} diff --git a/instrumentation/internal/namingschematest/grpc_test.go b/instrumentation/internal/namingschematest/grpc_test.go new file mode 100644 index 0000000000..45546e7370 --- /dev/null +++ b/instrumentation/internal/namingschematest/grpc_test.go @@ -0,0 +1,157 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "net" + "testing" + "time" + + grpctrace "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2/fixturepb" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +var ( + grpcServerTest = harness.TestCase{ + Name: instrumentation.PackageGRPC + "_server", + GenSpans: grpcGenSpansFn(false, true), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("grpc.server", 4), + DDService: harness.RepeatString(harness.TestDDService, 4), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 4), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + for i := 0; i < 4; i++ { + assert.Equal(t, "grpc.server", spans[i].OperationName()) + } + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + for i := 0; i < 4; i++ { + assert.Equal(t, "grpc.server.request", spans[i].OperationName()) + } + }, + } + grpcClientTest = harness.TestCase{ + Name: instrumentation.PackageGRPC + "_client", + GenSpans: grpcGenSpansFn(true, false), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("grpc.client", 4), + DDService: harness.RepeatString("grpc.client", 4), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 4), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + for i := 0; i < 4; i++ { + assert.Equal(t, "grpc.client", spans[i].OperationName()) + } + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 4) + for i := 0; i < 4; i++ { + assert.Equal(t, "grpc.client.request", spans[i].OperationName()) + } + }, + } +) + +func grpcGenSpansFn(traceClient, traceServer bool) harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []grpctrace.Option + if serviceOverride != "" { + opts = append(opts, grpctrace.WithService(serviceOverride)) + } + // exclude the grpc.message spans as they are not affected by naming schema + opts = append(opts, grpctrace.WithStreamMessages(false)) + mt := mocktracer.Start() + defer mt.Stop() + + var serverInterceptors []grpc.ServerOption + if traceServer { + serverInterceptors = append(serverInterceptors, + grpc.UnaryInterceptor(grpctrace.UnaryServerInterceptor(opts...)), + grpc.StreamInterceptor(grpctrace.StreamServerInterceptor(opts...)), + grpc.StatsHandler(grpctrace.NewServerStatsHandler(opts...)), + ) + } + clientInterceptors := []grpc.DialOption{grpc.WithTransportCredentials(insecure.NewCredentials())} + if traceClient { + clientInterceptors = append(clientInterceptors, + grpc.WithUnaryInterceptor(grpctrace.UnaryClientInterceptor(opts...)), + grpc.WithStreamInterceptor(grpctrace.StreamClientInterceptor(opts...)), + grpc.WithStatsHandler(grpctrace.NewClientStatsHandler(opts...)), + ) + } + client := startGRPCTestServer(t, serverInterceptors, clientInterceptors) + _, err := client.Ping(context.Background(), &fixturepb.FixtureRequest{Name: "pass"}) + require.NoError(t, err) + + stream, err := client.StreamPing(context.Background()) + require.NoError(t, err) + err = stream.Send(&fixturepb.FixtureRequest{Name: "break"}) + require.NoError(t, err) + _, err = stream.Recv() + require.NoError(t, err) + err = stream.CloseSend() + require.NoError(t, err) + // to flush the spans + _, _ = stream.Recv() + + waitForSpans(t, mt, 4, 2*time.Second) + return mt.FinishedSpans() + } +} + +func startGRPCTestServer( + t *testing.T, + serverInterceptors []grpc.ServerOption, + clientInterceptors []grpc.DialOption, +) fixturepb.FixtureClient { + server := grpc.NewServer(serverInterceptors...) + srv := fixturepb.NewFixtureServer() + fixturepb.RegisterFixtureServer(server, srv) + + li, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + _, port, _ := net.SplitHostPort(li.Addr().String()) + // start our test server + go server.Serve(li) + t.Cleanup(server.Stop) + + conn, err := grpc.NewClient("localhost:"+port, clientInterceptors...) + require.NoError(t, err) + + return fixturepb.NewFixtureClient(conn) +} + +func waitForSpans(t *testing.T, mt mocktracer.Tracer, minSpans int, timeout time.Duration) { + timeoutChan := time.After(timeout) + ticker := time.NewTicker(100 * time.Millisecond) + defer ticker.Stop() + + for { + if len(mt.FinishedSpans()) >= minSpans { + return + } + select { + case <-ticker.C: + continue + case <-timeoutChan: + assert.FailNow(t, "timeout waiting for spans", "(want: %d, got: %d)", minSpans, len(mt.FinishedSpans())) + } + } +} diff --git a/instrumentation/internal/namingschematest/harness/harness.go b/instrumentation/internal/namingschematest/harness/harness.go new file mode 100644 index 0000000000..216aa092d6 --- /dev/null +++ b/instrumentation/internal/namingschematest/harness/harness.go @@ -0,0 +1,146 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package harness + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" +) + +const ( + TestDDService = "dd-service" + TestServiceOverride = "service-override" +) + +type AssertSpansFn func(t *testing.T, spans []*mocktracer.Span) + +type ServiceNameAssertions struct { + Defaults []string + DDService []string + ServiceOverride []string +} + +type GenSpansFn func(t *testing.T, serviceOverride string) []*mocktracer.Span + +type TestCase struct { + Name instrumentation.Package + GenSpans GenSpansFn + WantServiceNameV0 ServiceNameAssertions + AssertOpV0 AssertSpansFn + AssertOpV1 AssertSpansFn +} + +func RunTest(t *testing.T, tc TestCase) { + if _, ok := env.Lookup("INTEGRATION"); !ok { + t.Skip("🚧 Skipping integration test (INTEGRATION environment variable is not set)") + } + t.Run(strings.ReplaceAll(string(tc.Name), "/", "_"), func(t *testing.T) { + t.Run("ServiceName", func(t *testing.T) { + // v0 + t.Run("v0_defaults", func(t *testing.T) { + t.Setenv("DD_SERVICE", "") + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + assertServiceNames(t, spans, tc.WantServiceNameV0.Defaults) + }) + t.Run("v0_dd_service", func(t *testing.T) { + t.Setenv("DD_SERVICE", TestDDService) + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + assertServiceNames(t, spans, tc.WantServiceNameV0.DDService) + }) + t.Run("v0_dd_service_and_override", func(t *testing.T) { + t.Setenv("DD_SERVICE", TestDDService) + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, TestServiceOverride) + assertServiceNames(t, spans, tc.WantServiceNameV0.ServiceOverride) + }) + t.Run("v0_dd_service_remove_integration_service_names", func(t *testing.T) { + t.Setenv("DD_SERVICE", TestDDService) + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") + t.Setenv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", "true") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + // in this setup, we should always have DD_SERVICE even if using schema v0 + assertServiceNames(t, spans, RepeatString(TestDDService, len(tc.WantServiceNameV0.DDService))) + }) + t.Run("v0_dd_service_remove_integration_service_names_tracer_option", func(t *testing.T) { + t.Setenv("DD_SERVICE", TestDDService) + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") + instrumentation.ReloadConfig() + // this option is equivalent to setting the environment variable DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED + tracer.WithGlobalServiceName(true)(nil) + + spans := tc.GenSpans(t, "") + // in this setup, we should always have DD_SERVICE even if using schema v0 + assertServiceNames(t, spans, RepeatString(TestDDService, len(tc.WantServiceNameV0.DDService))) + }) + + // v1 + t.Run("v1_defaults", func(t *testing.T) { + t.Setenv("DD_SERVICE", "") + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + assertServiceNames(t, spans, tc.WantServiceNameV0.Defaults) + }) + t.Run("v1_dd_service", func(t *testing.T) { + t.Setenv("DD_SERVICE", TestDDService) + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + assertServiceNames(t, spans, RepeatString(TestDDService, len(tc.WantServiceNameV0.DDService))) + }) + t.Run("v1_dd_service_and_override", func(t *testing.T) { + t.Setenv("DD_SERVICE", TestDDService) + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, TestServiceOverride) + assertServiceNames(t, spans, RepeatString(TestServiceOverride, len(tc.WantServiceNameV0.ServiceOverride))) + }) + }) + + t.Run("SpanName", func(t *testing.T) { + t.Run("v0", func(t *testing.T) { + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v0") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + tc.AssertOpV0(t, spans) + }) + t.Run("v1", func(t *testing.T) { + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") + instrumentation.ReloadConfig() + spans := tc.GenSpans(t, "") + tc.AssertOpV1(t, spans) + }) + }) + }) +} + +func assertServiceNames(t *testing.T, spans []*mocktracer.Span, wantServiceNames []string) { + t.Helper() + require.Len(t, spans, len(wantServiceNames), "the number of spans and number of assertions should be the same") + for i := 0; i < len(spans); i++ { + want, got, spanName := wantServiceNames[i], spans[i].Tag(ext.ServiceName), spans[i].OperationName() + if want == "" { + assert.Empty(t, got, "expected empty service name tag for span: %s", spanName) + } else { + assert.Equal(t, want, got, "incorrect service name for span: %s", spanName) + } + } +} diff --git a/instrumentation/internal/namingschematest/harness/kafka.go b/instrumentation/internal/namingschematest/harness/kafka.go new file mode 100644 index 0000000000..3d9eaf482e --- /dev/null +++ b/instrumentation/internal/namingschematest/harness/kafka.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package harness + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +// KafkaTestCase creates a new test case for different Kafka libraries. +func KafkaTestCase(pkg instrumentation.Package, genSpans GenSpansFn) TestCase { + return TestCase{ + Name: pkg, + GenSpans: genSpans, + WantServiceNameV0: ServiceNameAssertions{ + Defaults: []string{"kafka", "kafka"}, + DDService: []string{"kafka", TestDDService}, + ServiceOverride: []string{TestServiceOverride, TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.produce", spans[0].OperationName()) + assert.Equal(t, "kafka.consume", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.send", spans[0].OperationName()) + assert.Equal(t, "kafka.process", spans[1].OperationName()) + }, + } +} diff --git a/instrumentation/internal/namingschematest/harness/utils.go b/instrumentation/internal/namingschematest/harness/utils.go new file mode 100644 index 0000000000..27c7231fe5 --- /dev/null +++ b/instrumentation/internal/namingschematest/harness/utils.go @@ -0,0 +1,14 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package harness + +func RepeatString(s string, n int) []string { + r := make([]string, 0, n) + for i := 0; i < n; i++ { + r = append(r, s) + } + return r +} diff --git a/instrumentation/internal/namingschematest/hashicorp_consul_test.go b/instrumentation/internal/namingschematest/hashicorp_consul_test.go new file mode 100644 index 0000000000..43d8e7de8c --- /dev/null +++ b/instrumentation/internal/namingschematest/hashicorp_consul_test.go @@ -0,0 +1,60 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + consul "github.com/hashicorp/consul/api" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + consultrace "github.com/DataDog/dd-trace-go/contrib/hashicorp/consul/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +func hashicorpConsulGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []consultrace.ClientOption + if serviceOverride != "" { + opts = append(opts, consultrace.WithService(serviceOverride)) + } + + mt := mocktracer.Start() + defer mt.Stop() + client, err := consultrace.NewClient(consul.DefaultConfig(), opts...) + require.NoError(t, err) + kv := client.KV() + + pair := &consul.KVPair{Key: "test.key", Value: []byte("test_value")} + _, err = kv.Put(pair, nil) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + return spans + } +} + +var hashicorpConsul = harness.TestCase{ + Name: instrumentation.PackageHashicorpConsulAPI, + GenSpans: hashicorpConsulGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"consul"}, + DDService: []string{"consul"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "consul.command", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "consul.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/hashicorp_vault_test.go b/instrumentation/internal/namingschematest/hashicorp_vault_test.go new file mode 100644 index 0000000000..d468814870 --- /dev/null +++ b/instrumentation/internal/namingschematest/hashicorp_vault_test.go @@ -0,0 +1,122 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/hashicorp/vault/api" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + vaulttrace "github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +const secretMountPath = "/ns1/ns2/secret" + +func hashicorpVaultGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []vaulttrace.Option + if serviceOverride != "" { + opts = append(opts, vaulttrace.WithService(serviceOverride)) + } + + mt := mocktracer.Start() + defer mt.Stop() + + ts, cleanup := setupServer(t) + defer cleanup() + + client, err := api.NewClient(&api.Config{ + HttpClient: vaulttrace.NewHTTPClient(opts...), + Address: ts.URL, + }) + require.NoError(t, err) + if err != nil { + t.Fatal(err) + } + defer mountKV(client, t)() + + // Write key with namespace first + data := map[string]interface{}{"Key1": "Val1", "Key2": "Val2"} + _, err = client.Logical().Write("/some/path", data) + require.NoError(t, err) + + return mt.FinishedSpans() + } +} + +func setupServer(t *testing.T) (*httptest.Server, func()) { + storage := make(map[string]string) + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.Method { + case http.MethodPut: + slurp, err := io.ReadAll(r.Body) + if err != nil { + t.Fatal(err) + } + defer r.Body.Close() + storage[r.URL.Path] = string(slurp) + fmt.Fprintln(w, "{}") + case http.MethodGet: + val, ok := storage[r.URL.Path] + if !ok { + http.Error(w, "No data for key.", http.StatusNotFound) + return + } + secret := api.Secret{Data: make(map[string]interface{})} + json.Unmarshal([]byte(val), &secret.Data) + if err := json.NewEncoder(w).Encode(secret); err != nil { + t.Fatal(err) + } + } + })) + return ts, func() { + ts.Close() + } +} + +// mountKV mounts the K/V engine on secretMountPath and returns a function to unmount it. +// See: https://www.vaultproject.io/docs/secrets/ +func mountKV(c *api.Client, t *testing.T) func() { + secretMount := api.MountInput{ + Type: "kv", + Description: "Test KV Store", + Local: true, + } + if err := c.Sys().Mount(secretMountPath, &secretMount); err != nil { + t.Fatal(err) + } + return func() { + c.Sys().Unmount(secretMountPath) + } +} + +var hashicorpVault = harness.TestCase{ + Name: instrumentation.PackageHashicorpVaultAPI, + GenSpans: hashicorpVaultGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("vault", 2), + DDService: harness.RepeatString("vault", 2), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 2), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "vault.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/httptreemux_v5_test.go b/instrumentation/internal/namingschematest/httptreemux_v5_test.go new file mode 100644 index 0000000000..55865d0de9 --- /dev/null +++ b/instrumentation/internal/namingschematest/httptreemux_v5_test.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + httptrace "github.com/DataDog/dd-trace-go/contrib/dimfeld/httptreemux.v5/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var httpTreeMuxTestCase = harness.TestCase{ + Name: instrumentation.PackageDimfeldHTTPTreeMuxV5, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []httptrace.RouterOption + if serviceOverride != "" { + opts = append(opts, httptrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := httptrace.New(opts...) + mux.GET("/200", func(w http.ResponseWriter, _ *http.Request, _ map[string]string) { + w.Write([]byte("OK\n")) + }) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"http.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/ibm_sarama_test.go b/instrumentation/internal/namingschematest/ibm_sarama_test.go new file mode 100644 index 0000000000..2f90e74b70 --- /dev/null +++ b/instrumentation/internal/namingschematest/ibm_sarama_test.go @@ -0,0 +1,108 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/IBM/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + saramatrace "github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +const ( + saramaTopic = "sarama-gotest" +) + +func ibmSaramaGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []saramatrace.Option + if serviceOverride != "" { + opts = append(opts, saramatrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + broker := sarama.NewMockBroker(t, 1) + defer broker.Close() + + broker.SetHandlerByMap(map[string]sarama.MockResponse{ + "MetadataRequest": sarama.NewMockMetadataResponse(t). + SetBroker(broker.Addr(), broker.BrokerID()). + SetLeader(saramaTopic, 0, broker.BrokerID()), + "OffsetRequest": sarama.NewMockOffsetResponse(t). + SetOffset(saramaTopic, 0, sarama.OffsetOldest, 0). + SetOffset(saramaTopic, 0, sarama.OffsetNewest, 1), + "FetchRequest": sarama.NewMockFetchResponse(t, 1). + SetMessage(saramaTopic, 0, 0, sarama.StringEncoder("hello")), + "ProduceRequest": sarama.NewMockProduceResponse(t). + SetError(saramaTopic, 0, sarama.ErrNoError), + }) + cfg := sarama.NewConfig() + cfg.Version = sarama.MinVersion + cfg.Producer.Return.Successes = true + cfg.Producer.Flush.Messages = 1 + + producer, err := sarama.NewSyncProducer([]string{broker.Addr()}, cfg) + require.NoError(t, err) + producer = saramatrace.WrapSyncProducer(cfg, producer, opts...) + + c, err := sarama.NewConsumer([]string{broker.Addr()}, cfg) + require.NoError(t, err) + defer func(c sarama.Consumer) { + err := c.Close() + require.NoError(t, err) + }(c) + c = saramatrace.WrapConsumer(c, opts...) + + msg1 := &sarama.ProducerMessage{ + Topic: saramaTopic, + Value: sarama.StringEncoder("test 1"), + Metadata: "test", + } + _, _, err = producer.SendMessage(msg1) + require.NoError(t, err) + + pc, err := c.ConsumePartition(saramaTopic, 0, 0) + if err != nil { + t.Fatal(err) + } + _ = <-pc.Messages() + err = pc.Close() + require.NoError(t, err) + // wait for the channel to be closed + <-pc.Messages() + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + return spans + } +} + +var ibmSarama = harness.TestCase{ + Name: instrumentation.PackageIBMSarama, + GenSpans: ibmSaramaGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("kafka", 2), + DDService: []string{"kafka", harness.TestDDService}, + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 2), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.produce", spans[0].OperationName()) + assert.Equal(t, "kafka.consume", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.send", spans[0].OperationName()) + assert.Equal(t, "kafka.process", spans[1].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/julienschmidt_httprouter_test.go b/instrumentation/internal/namingschematest/julienschmidt_httprouter_test.go new file mode 100644 index 0000000000..9900680148 --- /dev/null +++ b/instrumentation/internal/namingschematest/julienschmidt_httprouter_test.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/julienschmidt/httprouter" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + httproutertrace "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var julienschmidtHTTPRouter = harness.TestCase{ + Name: instrumentation.PackageJulienschmidtHTTPRouter, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []httproutertrace.RouterOption + if serviceOverride != "" { + opts = append(opts, httproutertrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := httproutertrace.New(opts...) + mux.GET("/200", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + w.Write([]byte("OK\n")) + }) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"http.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/labstack_echo_v4_test.go b/instrumentation/internal/namingschematest/labstack_echo_v4_test.go new file mode 100644 index 0000000000..bd99de7833 --- /dev/null +++ b/instrumentation/internal/namingschematest/labstack_echo_v4_test.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http/httptest" + "testing" + + "github.com/labstack/echo/v4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + echotrace "github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var labstackEchoV4 = harness.TestCase{ + Name: instrumentation.PackageLabstackEchoV4, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []echotrace.Option + if serviceOverride != "" { + opts = append(opts, echotrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := echo.New() + mux.Use(echotrace.Middleware(opts...)) + mux.GET("/200", func(c echo.Context) error { + return c.NoContent(200) + }) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"echo"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/main_test.go b/instrumentation/internal/namingschematest/main_test.go new file mode 100644 index 0000000000..f391867ec0 --- /dev/null +++ b/instrumentation/internal/namingschematest/main_test.go @@ -0,0 +1,83 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "os" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" +) + +var kafkaAddr string + +func TestNamingSchema(t *testing.T) { + if _, ok := os.LookupEnv("INTEGRATION"); !ok { + t.Skip("🚧 Skipping integration test (INTEGRATION environment variable is not set)") + } + t.Setenv("__DD_TRACE_SQL_TEST", "true") + + _, kafkaAddr = containers.StartKafkaTestContainer( + t, + []string{segmentioTopic, confluentKafkaV2Topic, saramaTopic}, + ) + + testCases := []harness.TestCase{ + gqlgen, + awsSDKV1, + awsSDKV1Messaging, + awsSDKV2, + awsSDKV2Messaging, + // confluentKafkaV1, // this one lives in a separate package due to build errors + confluentKafkaV2, + databaseSQL_SQLServer, + databaseSQL_Postgres, + databaseSQL_PostgresWithRegisterOverride, + databaseSQL_MySQL, + httpTreeMuxTestCase, + elasticV6, + goRestfulV3, + ginTest, + globalsignMgo, + mongoDriverTest, + chiV1Test, + chiV5Test, + goPGv10Test, + goRedisV1Test, + goRedisV7Test, + goRedisV8Test, + gocqlTest, + grpcServerTest, + grpcClientTest, + fiberV2Test, + redigoTest, + netHTTPServerServeMux, + netHTTPServerWrapHandler, + netHTTPClient, + gomemcache, + gcpPubsub, + urfaveNegroni, + twitchTVTwirp, + tidwallBuntDB, + syndtrGoLevelDB, + shopifySarama, + segmentioKafkaGo, + redisGoRedisV9, + olivereElasticV5, + labstackEchoV4, + julienschmidtHTTPRouter, + ibmSarama, + hashicorpConsul, + hashicorpVault, + graphGophersGraphQLGo, + graphqlGo, + gorillaMux, + } + for _, tc := range testCases { + harness.RunTest(t, tc) + } +} diff --git a/instrumentation/internal/namingschematest/mgo_test.go b/instrumentation/internal/namingschematest/mgo_test.go new file mode 100644 index 0000000000..fb20918486 --- /dev/null +++ b/instrumentation/internal/namingschematest/mgo_test.go @@ -0,0 +1,54 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/globalsign/mgo/bson" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + mgotrace "github.com/DataDog/dd-trace-go/contrib/globalsign/mgo/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var globalsignMgo = harness.TestCase{ + Name: instrumentation.PackageGlobalsignMgo, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []mgotrace.DialOption + if serviceOverride != "" { + opts = append(opts, mgotrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + session, err := mgotrace.Dial("localhost:27018", opts...) + require.NoError(t, err) + err = session. + DB("my_db"). + C("MyCollection"). + Insert(bson.D{bson.DocElem{Name: "entity", Value: bson.DocElem{Name: "index", Value: 0}}}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"mongodb"}, + DDService: []string{"mongodb"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "mongodb.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "mongodb.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/mongodriver_test.go b/instrumentation/internal/namingschematest/mongodriver_test.go new file mode 100644 index 0000000000..f7d0a3c9f6 --- /dev/null +++ b/instrumentation/internal/namingschematest/mongodriver_test.go @@ -0,0 +1,62 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + + mongotrace "github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2/mongo" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var mongoDriverTest = harness.TestCase{ + Name: instrumentation.PackageMongoDriver, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []mongotrace.Option + if serviceOverride != "" { + opts = append(opts, mongotrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + addr := fmt.Sprintf("mongodb://localhost:27017/?connect=direct") + mongopts := options.Client() + mongopts.Monitor = mongotrace.NewMonitor(opts...) + mongopts.ApplyURI(addr) + client, err := mongo.Connect(context.Background(), mongopts) + require.NoError(t, err) + _, err = client. + Database("test-database"). + Collection("test-collection"). + InsertOne(context.Background(), bson.D{{Key: "test-item", Value: "test-value"}}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"mongo"}, + DDService: []string{"mongo"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "mongodb.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "mongodb.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/negroni_test.go b/instrumentation/internal/namingschematest/negroni_test.go new file mode 100644 index 0000000000..eb156eed08 --- /dev/null +++ b/instrumentation/internal/namingschematest/negroni_test.go @@ -0,0 +1,60 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/urfave/negroni" + + negronitrace "github.com/DataDog/dd-trace-go/contrib/urfave/negroni/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var urfaveNegroni = harness.TestCase{ + Name: instrumentation.PackageUrfaveNegroni, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []negronitrace.Option + if serviceOverride != "" { + opts = append(opts, negronitrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := http.NewServeMux() + mux.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { + _, err := w.Write([]byte("ok")) + require.NoError(t, err) + }) + router := negroni.New() + router.Use(negronitrace.Middleware(opts...)) + router.UseHandler(mux) + r := httptest.NewRequest("GET", "/200", nil) + w := httptest.NewRecorder() + router.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"negroni.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/net_http_test.go b/instrumentation/internal/namingschematest/net_http_test.go new file mode 100644 index 0000000000..85b93e734c --- /dev/null +++ b/instrumentation/internal/namingschematest/net_http_test.go @@ -0,0 +1,134 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var ( + netHTTPServerServeMux = harness.TestCase{ + Name: instrumentation.PackageNetHTTP + "_server_serve_mux", + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []httptrace.Option + if serviceOverride != "" { + opts = append(opts, httptrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := httptrace.NewServeMux(opts...) + mux.HandleFunc("/200", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("OK\n")) + }) + r := httptest.NewRequest("GET", "http://localhost/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"http.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, + } + + netHTTPServerWrapHandler = harness.TestCase{ + Name: instrumentation.PackageNetHTTP + "_server_wrap_handler", + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []httptrace.Option + if serviceOverride != "" { + opts = append(opts, httptrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + mux := http.NewServeMux() + var h http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("OK\n")) + }) + h = httptrace.WrapHandler(h, "", "", opts...) + mux.Handle("/200", h) + + r := httptest.NewRequest("GET", "http://localhost/200", nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"http.router"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.server.request", spans[0].OperationName()) + }, + } + + netHTTPClient = harness.TestCase{ + Name: instrumentation.PackageNetHTTP + "_client", + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []httptrace.RoundTripperOption + if serviceOverride != "" { + opts = append(opts, httptrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("OK\n")) + })) + defer srv.Close() + + c := httptrace.WrapClient(&http.Client{}, opts...) + req, err := http.NewRequest(http.MethodGet, srv.URL+"/200", nil) + require.NoError(t, err) + resp, err := c.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{""}, + DDService: []string{""}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.request", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "http.client.request", spans[0].OperationName()) + }, + } +) diff --git a/instrumentation/internal/namingschematest/olivere_elastic_v5_test.go b/instrumentation/internal/namingschematest/olivere_elastic_v5_test.go new file mode 100644 index 0000000000..43bf36fe58 --- /dev/null +++ b/instrumentation/internal/namingschematest/olivere_elastic_v5_test.go @@ -0,0 +1,68 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "testing" + + elastictrace "github.com/DataDog/dd-trace-go/contrib/olivere/elastic.v5/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/olivere/elastic.v5" +) + +func olivereElasticV5GenSpans() harness.GenSpansFn { + const elasticURL = "http://127.0.0.1:9201/" + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []elastictrace.ClientOption + if serviceOverride != "" { + opts = append(opts, elastictrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + tc := elastictrace.NewHTTPClient(opts...) + client, err := elastic.NewClient( + elastic.SetURL(elasticURL), + elastic.SetHttpClient(tc), + elastic.SetSniff(false), + elastic.SetHealthcheck(false), + ) + require.NoError(t, err) + + _, err = client.Index(). + Index("twitter").Id("1"). + Type("tweet"). + BodyString(`{"user": "test", "message": "hello"}`). + Do(context.Background()) + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + return spans + } +} + +var olivereElasticV5 = harness.TestCase{ + Name: instrumentation.PackageOlivereElasticV5, + GenSpans: olivereElasticV5GenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"elastic.client"}, + DDService: []string{"elastic.client"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "elasticsearch.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/redigo_test.go b/instrumentation/internal/namingschematest/redigo_test.go new file mode 100644 index 0000000000..a1ee1f981e --- /dev/null +++ b/instrumentation/internal/namingschematest/redigo_test.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + redigotrace "github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +var redigoTest = harness.TestCase{ + Name: instrumentation.PackageRedigo, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []interface{} + if serviceOverride != "" { + opts = append(opts, redigotrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + c, err := redigotrace.Dial("tcp", "127.0.0.1:6379", opts...) + require.NoError(t, err) + _, err = c.Do("SET", "test_key", "test_value") + require.NoError(t, err) + + return mt.FinishedSpans() + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"redis.conn"}, + DDService: []string{"redis.conn"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/redis_goredis_v9_test.go b/instrumentation/internal/namingschematest/redis_goredis_v9_test.go new file mode 100644 index 0000000000..4e80f383a8 --- /dev/null +++ b/instrumentation/internal/namingschematest/redis_goredis_v9_test.go @@ -0,0 +1,63 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "testing" + + redistrace "github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/redis/go-redis/v9" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func redisGoRedisV9GenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []redistrace.ClientOption + if serviceOverride != "" { + opts = append(opts, redistrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + client := redistrace.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}, opts...) + st := client.Set(context.Background(), "test_key", "test_value", 0) + require.NoError(t, st.Err()) + + spans := mt.FinishedSpans() + var span *mocktracer.Span + for _, s := range spans { + // pick up the redis.command span except dial + if s.OperationName() == "redis.command" { + span = s + } + } + assert.NotNil(t, span) + return []*mocktracer.Span{span} + } +} + +var redisGoRedisV9 = harness.TestCase{ + Name: instrumentation.PackageRedisGoRedisV9, + GenSpans: redisGoRedisV9GenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"redis.client"}, + DDService: []string{harness.TestDDService}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "redis.command", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/segmentio_kafkago_test.go b/instrumentation/internal/namingschematest/segmentio_kafkago_test.go new file mode 100644 index 0000000000..f0a9da8c3f --- /dev/null +++ b/instrumentation/internal/namingschematest/segmentio_kafkago_test.go @@ -0,0 +1,124 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "testing" + "time" + + "github.com/segmentio/kafka-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + kafkatrace "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" +) + +const ( + segmentioGroupID = "segmentio-kafka-namingschematest" + segmentioTopic = "segmentio-kafka-namingschematest" + testReaderMaxWait = 10 * time.Millisecond +) + +type readerOpFn func(t *testing.T, r *kafkatrace.Reader) + +func genIntegrationTestSpans(t *testing.T, mt mocktracer.Tracer, writerOp func(t *testing.T, w *kafkatrace.KafkaWriter), readerOp readerOpFn, writerOpts []kafkatrace.Option, readerOpts []kafkatrace.Option) ([]*mocktracer.Span, []kafka.Message) { + writtenMessages := []kafka.Message{} + + // add some dummy values to broker/addr to test bootstrap servers. + kw := &kafka.Writer{ + Addr: kafka.TCP(kafkaAddr), + Topic: segmentioTopic, + RequiredAcks: kafka.RequireOne, + Completion: func(messages []kafka.Message, err error) { + writtenMessages = append(writtenMessages, messages...) + }, + } + w := kafkatrace.WrapWriter(kw, writerOpts...) + writerOp(t, w) + err := w.Close() + require.NoError(t, err) + + r := kafkatrace.NewReader(kafka.ReaderConfig{ + Brokers: []string{kafkaAddr}, + GroupID: segmentioGroupID, + Topic: segmentioTopic, + MaxWait: testReaderMaxWait, + }, readerOpts...) + readerOp(t, r) + err = r.Close() + require.NoError(t, err) + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + // they should be linked via headers + assert.Equal(t, spans[0].TraceID(), spans[1].TraceID(), "Trace IDs should match") + return spans, writtenMessages +} + +func segmentioKafkaGoGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []kafkatrace.Option + if serviceOverride != "" { + opts = append(opts, kafkatrace.WithService(serviceOverride)) + } + + mt := mocktracer.Start() + defer mt.Stop() + + messagesToWrite := []kafka.Message{ + { + Key: []byte("key1"), + Value: []byte("value1"), + }, + } + + spans, _ := genIntegrationTestSpans( + t, + mt, + func(t *testing.T, w *kafkatrace.KafkaWriter) { + err := w.WriteMessages(context.Background(), messagesToWrite...) + require.NoError(t, err, "Expected to write message to topic") + }, + func(t *testing.T, r *kafkatrace.Reader) { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + readMsg, err := r.FetchMessage(ctx) + require.NoError(t, err, "Expected to consume message") + assert.Equal(t, messagesToWrite[0].Value, readMsg.Value, "Values should be equal") + + err = r.CommitMessages(context.Background(), readMsg) + assert.NoError(t, err, "Expected CommitMessages to not return an error") + }, + opts, + opts, + ) + return spans + } +} + +var segmentioKafkaGo = harness.TestCase{ + Name: instrumentation.PackageSegmentioKafkaGo, + GenSpans: segmentioKafkaGoGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("kafka", 2), + DDService: []string{"kafka", harness.TestDDService}, + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 2), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.produce", spans[0].OperationName()) + assert.Equal(t, "kafka.consume", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.send", spans[0].OperationName()) + assert.Equal(t, "kafka.process", spans[1].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/shopify_sarama_test.go b/instrumentation/internal/namingschematest/shopify_sarama_test.go new file mode 100644 index 0000000000..7379914945 --- /dev/null +++ b/instrumentation/internal/namingschematest/shopify_sarama_test.go @@ -0,0 +1,103 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + saramatrace "github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/Shopify/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func shopifySaramaGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []saramatrace.Option + if serviceOverride != "" { + opts = append(opts, saramatrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + broker := sarama.NewMockBroker(t, 1) + defer broker.Close() + + broker.SetHandlerByMap(map[string]sarama.MockResponse{ + "MetadataRequest": sarama.NewMockMetadataResponse(t). + SetBroker(broker.Addr(), broker.BrokerID()). + SetLeader("test-topic", 0, broker.BrokerID()), + "OffsetRequest": sarama.NewMockOffsetResponse(t). + SetOffset("test-topic", 0, sarama.OffsetOldest, 0). + SetOffset("test-topic", 0, sarama.OffsetNewest, 1), + "FetchRequest": sarama.NewMockFetchResponse(t, 1). + SetMessage("test-topic", 0, 0, sarama.StringEncoder("hello")), + "ProduceRequest": sarama.NewMockProduceResponse(t). + SetError("test-topic", 0, sarama.ErrNoError), + }) + cfg := sarama.NewConfig() + cfg.Version = sarama.MinVersion + cfg.Producer.Return.Successes = true + cfg.Producer.Flush.Messages = 1 + + producer, err := sarama.NewSyncProducer([]string{broker.Addr()}, cfg) + require.NoError(t, err) + producer = saramatrace.WrapSyncProducer(cfg, producer, opts...) + + c, err := sarama.NewConsumer([]string{broker.Addr()}, cfg) + require.NoError(t, err) + defer func(c sarama.Consumer) { + err := c.Close() + require.NoError(t, err) + }(c) + c = saramatrace.WrapConsumer(c, opts...) + + msg1 := &sarama.ProducerMessage{ + Topic: "test-topic", + Value: sarama.StringEncoder("test 1"), + Metadata: "test", + } + _, _, err = producer.SendMessage(msg1) + require.NoError(t, err) + + pc, err := c.ConsumePartition("test-topic", 0, 0) + if err != nil { + t.Fatal(err) + } + _ = <-pc.Messages() + err = pc.Close() + require.NoError(t, err) + // wait for the channel to be closed + <-pc.Messages() + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) + return spans + } +} + +var shopifySarama = harness.TestCase{ + Name: instrumentation.PackageShopifySarama, + GenSpans: shopifySaramaGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: harness.RepeatString("kafka", 2), + DDService: []string{"kafka", harness.TestDDService}, + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 2), + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.produce", spans[0].OperationName()) + assert.Equal(t, "kafka.consume", spans[1].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 2) + assert.Equal(t, "kafka.send", spans[0].OperationName()) + assert.Equal(t, "kafka.process", spans[1].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/syndtr_goleveldb_test.go b/instrumentation/internal/namingschematest/syndtr_goleveldb_test.go new file mode 100644 index 0000000000..825467dd41 --- /dev/null +++ b/instrumentation/internal/namingschematest/syndtr_goleveldb_test.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + leveldbtrace "github.com/DataDog/dd-trace-go/contrib/syndtr/goleveldb/v2/leveldb" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/storage" +) + +func syndtrGoLevelDBGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []leveldbtrace.Option + if serviceOverride != "" { + opts = append(opts, leveldbtrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + db, err := leveldbtrace.Open(storage.NewMemStorage(), &opt.Options{}, opts...) + require.NoError(t, err) + defer db.Close() + err = db.Put([]byte("key"), []byte("value"), nil) + require.NoError(t, err) + + return mt.FinishedSpans() + } +} + +var syndtrGoLevelDB = harness.TestCase{ + Name: instrumentation.PackageSyndtrGoLevelDB, + GenSpans: syndtrGoLevelDBGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"leveldb"}, + DDService: []string{"leveldb"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "leveldb.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "leveldb.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/tidwall_buntdb_test.go b/instrumentation/internal/namingschematest/tidwall_buntdb_test.go new file mode 100644 index 0000000000..d702420557 --- /dev/null +++ b/instrumentation/internal/namingschematest/tidwall_buntdb_test.go @@ -0,0 +1,58 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "testing" + + buntdbtrace "github.com/DataDog/dd-trace-go/contrib/tidwall/buntdb/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func buntDBGenSpans() harness.GenSpansFn { + return func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []buntdbtrace.Option + if serviceOverride != "" { + opts = append(opts, buntdbtrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + db, err := buntdbtrace.Open(":memory:", opts...) + require.NoError(t, err) + defer db.Close() + + err = db.Update(func(tx *buntdbtrace.Tx) error { + _, _, err := tx.Set("key", "value", nil) + return err + }) + require.NoError(t, err) + + return mt.FinishedSpans() + } +} + +var tidwallBuntDB = harness.TestCase{ + Name: instrumentation.PackageTidwallBuntDB, + GenSpans: buntDBGenSpans(), + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"buntdb"}, + DDService: []string{"buntdb"}, + ServiceOverride: []string{harness.TestServiceOverride}, + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "buntdb.query", spans[0].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 1) + assert.Equal(t, "buntdb.query", spans[0].OperationName()) + }, +} diff --git a/instrumentation/internal/namingschematest/twirp_test.go b/instrumentation/internal/namingschematest/twirp_test.go new file mode 100644 index 0000000000..0bf19a42d6 --- /dev/null +++ b/instrumentation/internal/namingschematest/twirp_test.go @@ -0,0 +1,116 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package namingschematest + +import ( + "context" + "net" + "net/http" + "testing" + + twitchtvtrace "github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2" + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2/harness" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/twitchtv/twirp" + "github.com/twitchtv/twirp/example" +) + +var twitchTVTwirp = harness.TestCase{ + Name: instrumentation.PackageTwitchTVTwirp, + GenSpans: func(t *testing.T, serviceOverride string) []*mocktracer.Span { + var opts []twitchtvtrace.Option + if serviceOverride != "" { + opts = append(opts, twitchtvtrace.WithService(serviceOverride)) + } + mt := mocktracer.Start() + defer mt.Stop() + + client, cleanup := startIntegrationTestServer(t, opts...) + defer cleanup() + _, err := client.MakeHat(context.Background(), &example.Size{Inches: 6}) + require.NoError(t, err) + + return mt.FinishedSpans() + }, + AssertOpV0: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 3) + assert.Equal(t, "twirp.Haberdasher", spans[0].OperationName()) + assert.Equal(t, "twirp.handler", spans[1].OperationName()) + assert.Equal(t, "twirp.request", spans[2].OperationName()) + }, + AssertOpV1: func(t *testing.T, spans []*mocktracer.Span) { + require.Len(t, spans, 3) + assert.Equal(t, "twirp.server.request", spans[0].OperationName()) + assert.Equal(t, "twirp.handler", spans[1].OperationName()) + assert.Equal(t, "twirp.client.request", spans[2].OperationName()) + }, + WantServiceNameV0: harness.ServiceNameAssertions{ + Defaults: []string{"twirp-server", "twirp-server", "twirp-client"}, + DDService: harness.RepeatString(harness.TestDDService, 3), + ServiceOverride: harness.RepeatString(harness.TestServiceOverride, 3), + }, +} + +// Copied from contrib/twitchtv/twirp/twirp_test.go +type notifyListener struct { + net.Listener + ch chan<- struct{} +} + +func (n *notifyListener) Accept() (c net.Conn, err error) { + if n.ch != nil { + close(n.ch) + n.ch = nil + } + return n.Listener.Accept() +} + +type haberdasher int32 + +func (h haberdasher) MakeHat(_ context.Context, size *example.Size) (*example.Hat, error) { + if size.Inches != int32(h) { + return nil, twirp.InvalidArgumentError("Inches", "Only size of %d is allowed") + } + hat := &example.Hat{ + Size: size.Inches, + Color: "purple", + Name: "doggie beanie", + } + return hat, nil +} + +func startIntegrationTestServer(t *testing.T, opts ...twitchtvtrace.Option) (example.Haberdasher, func()) { + l, err := net.Listen("tcp4", "127.0.0.1:0") + require.NoError(t, err) + + readyCh := make(chan struct{}) + nl := ¬ifyListener{Listener: l, ch: readyCh} + + hooks := twitchtvtrace.NewServerHooks(opts...) + server := twitchtvtrace.WrapServer(example.NewHaberdasherServer(haberdasher(6), hooks), opts...) + errCh := make(chan error) + go func() { + err := http.Serve(nl, server) + if err != nil && err != http.ErrServerClosed { + errCh <- err + } + close(errCh) + }() + select { + case <-readyCh: + break + case err := <-errCh: + l.Close() + assert.FailNow(t, "server not started", err) + } + client := example.NewHaberdasherJSONClient("http://"+nl.Addr().String(), twitchtvtrace.WrapClient(http.DefaultClient, opts...)) + return client, func() { + assert.NoError(t, l.Close()) + } +} diff --git a/instrumentation/internal/telemetrytest/telemetry_test.go b/instrumentation/internal/telemetrytest/telemetry_test.go new file mode 100644 index 0000000000..0fe2b902ee --- /dev/null +++ b/instrumentation/internal/telemetrytest/telemetry_test.go @@ -0,0 +1,112 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. +package telemetrytest + +import ( + "encoding/json" + "fmt" + "io/fs" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +type contribPkg struct { + ImportPath string + Name string + Imports []string + Dir string +} + +var InstrumentationImport = "github.com/DataDog/dd-trace-go/v2/instrumentation" + +func (p *contribPkg) hasInstrumentationImport() bool { + for _, imp := range p.Imports { + if imp == InstrumentationImport { + return true + } + } + return false +} + +// TestTelemetryEnabled verifies that the expected contrib packages leverage instrumentation telemetry +func TestTelemetryEnabled(t *testing.T) { + root, err := filepath.Abs(filepath.Join("..", "..", "..", "contrib")) + if err != nil { + t.Fatal(err) + } + if _, err = os.Stat(root); err != nil { + t.Fatal(err) + } + err = filepath.WalkDir(root, func(path string, _ fs.DirEntry, _ error) error { + if filepath.Base(path) != "go.mod" { + return nil + } + if strings.Contains(path, "integration_tests") { + return nil + } + rErr := testTelemetryEnabled(t, filepath.Dir(path)) + if rErr != nil { + return fmt.Errorf("path: %s, err: %w", path, rErr) + } + return nil + }) + if err != nil { + t.Fatal(err) + } +} + +func testTelemetryEnabled(t *testing.T, contribPath string) error { + t.Helper() + t.Log(contribPath) + pwd, err := os.Getwd() + if err != nil { + return err + } + defer func() { + _ = os.Chdir(pwd) + }() + if err = os.Chdir(contribPath); err != nil { + return err + } + body, err := exec.Command("go", "list", "-json", "./...").Output() + if err != nil { + t.Log(string(body)) + return err + } + var packages []contribPkg + stream := json.NewDecoder(strings.NewReader(string(body))) + for stream.More() { + var out contribPkg + err := stream.Decode(&out) + if err != nil { + return err + } + packages = append(packages, out) + } + for _, pkg := range packages { + if strings.Contains(pkg.ImportPath, "/test") || strings.Contains(pkg.ImportPath, "/internal") { + continue + } + // Skip AWS SDK v2 subpackages + if strings.Contains(pkg.ImportPath, "aws-sdk-go-v2/") && !strings.HasSuffix(pkg.ImportPath, "/aws") { + continue + } + // Skip command subpackages + if strings.Contains(pkg.ImportPath, "/cmd/") { + continue + } + // Skip net/http subpackages + if strings.Contains(pkg.ImportPath, "/net/http/v2") { + continue + } + if !pkg.hasInstrumentationImport() { + return fmt.Errorf(`package %q is expected use instrumentation telemetry. For more info see https://github.com/DataDog/dd-trace-go/blob/main/contrib/README.md#instrumentation-telemetry`, pkg.ImportPath) + } + } + return nil +} diff --git a/instrumentation/internal/validationtest/go.mod b/instrumentation/internal/validationtest/go.mod new file mode 100644 index 0000000000..d78b7df2af --- /dev/null +++ b/instrumentation/internal/validationtest/go.mod @@ -0,0 +1,102 @@ +module github.com/DataDog/dd-trace-go/instrumentation/internal/validationtest/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 + github.com/miekg/dns v1.1.55 + github.com/stretchr/testify v1.11.1 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2 => ../../../contrib/bradfitz/gomemcache + +replace github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2 => ../../../contrib/miekg/dns + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/instrumentation/internal/validationtest/go.sum b/instrumentation/internal/validationtest/go.sum new file mode 100644 index 0000000000..64fe7915ac --- /dev/null +++ b/instrumentation/internal/validationtest/go.sum @@ -0,0 +1,317 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285 h1:Dr+ezPI5ivhMn/3WOoB86XzMhie146DNaBbhaQWZHMY= +github.com/bradfitz/gomemcache v0.0.0-20230611145640-acc696258285/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/internal/validationtest/contrib/bradfitz_memcache.go b/instrumentation/internal/validationtest/testcases/bradfitz_memcache.go similarity index 82% rename from contrib/internal/validationtest/contrib/bradfitz_memcache.go rename to instrumentation/internal/validationtest/testcases/bradfitz_memcache.go index eaf9518514..ebc26dd814 100644 --- a/contrib/internal/validationtest/contrib/bradfitz_memcache.go +++ b/instrumentation/internal/validationtest/testcases/bradfitz_memcache.go @@ -3,12 +3,12 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2023 Datadog, Inc. -package validationtest +package testcases import ( "testing" - memcachetrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/bradfitz/gomemcache/memcache" + memcachetrace "github.com/DataDog/dd-trace-go/contrib/bradfitz/gomemcache/v2/memcache" "github.com/bradfitz/gomemcache/memcache" "github.com/stretchr/testify/require" @@ -48,6 +48,6 @@ func (i *Memcache) NumSpans() int { return i.numSpans } -func (i *Memcache) WithServiceName(name string) { - i.opts = append(i.opts, memcachetrace.WithServiceName(name)) +func (i *Memcache) WithService(name string) { + i.opts = append(i.opts, memcachetrace.WithService(name)) } diff --git a/contrib/internal/validationtest/contrib/miekg_dns.go b/instrumentation/internal/validationtest/testcases/miekg_dns.go similarity index 94% rename from contrib/internal/validationtest/contrib/miekg_dns.go rename to instrumentation/internal/validationtest/testcases/miekg_dns.go index 4e38467847..b14f01d2c9 100644 --- a/contrib/internal/validationtest/contrib/miekg_dns.go +++ b/instrumentation/internal/validationtest/testcases/miekg_dns.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2023 Datadog, Inc. -package validationtest +package testcases import ( "context" @@ -11,7 +11,7 @@ import ( "testing" "time" - dnstrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/miekg/dns" + dnstrace "github.com/DataDog/dd-trace-go/contrib/miekg/dns/v2" "github.com/miekg/dns" "github.com/stretchr/testify/assert" @@ -72,7 +72,7 @@ func (i *DNS) NumSpans() int { return i.numSpans } -func (i *DNS) WithServiceName(_ string) { +func (i *DNS) WithService(_ string) { return } diff --git a/contrib/internal/validationtest/validation_test.go b/instrumentation/internal/validationtest/validation_test.go similarity index 94% rename from contrib/internal/validationtest/validation_test.go rename to instrumentation/internal/validationtest/validation_test.go index db372a198b..a4d14ccc20 100644 --- a/contrib/internal/validationtest/validation_test.go +++ b/instrumentation/internal/validationtest/validation_test.go @@ -16,8 +16,9 @@ import ( "testing" "time" - validationtest "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/validationtest/contrib" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/instrumentation/internal/validationtest/v2/testcases" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -40,8 +41,8 @@ type Integration interface { // NumSpans returns the number of spans that should have been generated during the test. NumSpans() int - // WithServiceName configures the integration to use the given service name. - WithServiceName(name string) + // WithService configures the integration to use the given service name. + WithService(name string) } // tracerEnv gets the current tracer configuration variables needed for Test Agent testing and places @@ -94,8 +95,8 @@ func TestIntegrations(t *testing.T) { t.Skip("to enable integration test, set the INTEGRATION environment variable") } integrations := []Integration{ - validationtest.NewMemcache(), - validationtest.NewDNS(), + testcases.NewMemcache(), + testcases.NewDNS(), } testCases := []struct { @@ -149,17 +150,19 @@ func TestIntegrations(t *testing.T) { } // also include the testCase start options within the tracer config - tracer.Start( + err := tracer.Start( tracer.WithAgentAddr(agentAddr), tracer.WithHTTPClient(tracerHTTPClient()), ) + require.NoError(t, err) defer tracer.Stop() if tc.integrationServiceName != "" { componentName := ig.Name() t.Setenv(fmt.Sprintf("DD_%s_SERVICE", strings.ToUpper(componentName)), tc.integrationServiceName) - ig.WithServiceName(tc.integrationServiceName) + ig.WithService(tc.integrationServiceName) } + instrumentation.ReloadConfig() ig.Init(t) ig.GenSpans(t) diff --git a/instrumentation/logger.go b/instrumentation/logger.go new file mode 100644 index 0000000000..93c9f19039 --- /dev/null +++ b/instrumentation/logger.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package instrumentation + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +type Logger interface { + Debug(msg string, args ...any) + Info(msg string, args ...any) + Warn(msg string, args ...any) + Error(msg string, args ...any) +} + +type logger struct { + logOpts []telemetry.LogOption +} + +func newLogger(pkg Package) *logger { + return &logger{ + logOpts: []telemetry.LogOption{telemetry.WithTags([]string{"integration:" + string(pkg)})}, + } +} + +func (l logger) Debug(msg string, args ...any) { + log.Debug(msg, args...) //nolint:gocritic // Logger plumbing needs to pass through variable format strings +} + +func (l logger) Info(msg string, args ...any) { + log.Info(msg, args...) //nolint:gocritic // Logger plumbing needs to pass through variable format strings +} + +func (l logger) Warn(msg string, args ...any) { + log.Warn(msg, args...) //nolint:gocritic // Logger plumbing needs to pass through variable format strings +} + +func (l logger) Error(msg string, args ...any) { + log.Error(msg, args...) //nolint:gocritic // Logger plumbing needs to pass through variable format strings +} + +func hasErrors(args ...any) bool { + for _, arg := range args { + if _, ok := arg.(error); ok { + return true + } + } + return false +} diff --git a/instrumentation/logger_test.go b/instrumentation/logger_test.go new file mode 100644 index 0000000000..5a42bf2928 --- /dev/null +++ b/instrumentation/logger_test.go @@ -0,0 +1,38 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package instrumentation + +import ( + "errors" + "fmt" + "testing" +) + +func TestHasErrors(t *testing.T) { + tests := []struct { + name string + args []any + want bool + }{ + {"No arguments", []any{}, false}, + {"Only non-error arguments", []any{42, "hello", true}, false}, + {"Single error argument", []any{errors.New("test error")}, true}, + {"Multiple arguments with one error", []any{"data", 123, errors.New("some error")}, true}, + {"Multiple error arguments", []any{errors.New("error 1"), errors.New("error 2")}, true}, + {"Pointer to an error", []any{&struct{ error }{errors.New("pointer error")}}, true}, + {"Wrapped error with fmt.Errorf", []any{fmt.Errorf("wrapped: %w", errors.New("wrapped error"))}, true}, + {"Error inside a slice (should return false)", []any{[]any{errors.New("hidden error")}}, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := hasErrors(tt.args...) + if got != tt.want { + t.Errorf("hasErrors(%v) = %v; want %v", tt.args, got, tt.want) + } + }) + } +} diff --git a/instrumentation/net/http/pattern/pattern.go b/instrumentation/net/http/pattern/pattern.go new file mode 100644 index 0000000000..40637ab95f --- /dev/null +++ b/instrumentation/net/http/pattern/pattern.go @@ -0,0 +1,177 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Deprecated: this package was not meant to be exported. It now exists only for +// compatibility with older contrib module versions and won't be actively +// maintained. +package pattern + +import ( + "errors" + "fmt" + "log/slog" + "net/http" + "strings" + "unicode" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + + "github.com/puzpuzpuz/xsync/v3" +) + +// Route returns the route part of a go1.22 style ServeMux pattern. I.e. +// it returns "/foo" for the pattern "/foo" as well as the pattern "GET /foo". +func Route(s string) string { + // Support go1.22 serve mux patterns: [METHOD ][HOST]/[PATH] + // Consider any text before a space or tab to be the method of the pattern. + // See net/http.parsePattern and the link below for more information. + // https://pkg.go.dev/net/http#hdr-Patterns-ServeMux + if i := strings.IndexAny(s, " \t"); i > 0 && len(s) >= i+1 { + return strings.TrimLeft(s[i+1:], " \t") + } + return s +} + +// PathParameters return the path parameter values and names from the request. +func PathParameters(pattern string, request *http.Request) map[string]string { + if pattern == "" { + return nil + } + names := patternNames(pattern) + res := make(map[string]string, len(names)) + for _, name := range names { + res[name] = request.PathValue(name) + } + return res +} + +var patternSegmentsCache = xsync.NewMapOf[string, []string]() + +func patternNames(pattern string) []string { + v, _ := patternSegmentsCache.LoadOrCompute(pattern, func() []string { + segments, err := parsePatternNames(pattern) + if err != nil { + // Ignore the error: Something as gone wrong, but we are not eager to find out why. + // We will just log it as a telemetry logs warning (and Debug to the user-facing log). + log.Warn("instrumentation/net/http/pattern: failed to parse mux path pattern", slog.Any("error", log.NewSafeError(err))) + // here we fallthrough instead of returning to load a nil value into the cache to avoid reparsing the pattern. + } + return segments + }) + return v +} + +// parsePatternNames returns the names of the wildcards in the pattern. +// Based on https://cs.opensource.google/go/go/+/refs/tags/go1.23.4:src/net/http/pattern.go;l=84 +// but very simplified as we know that the pattern returned must be valid or `net/http` would have panicked earlier. +// +// The pattern string's syntax is +// +// [METHOD] [HOST]/[PATH] +// +// where: +// - METHOD is an HTTP method +// - HOST is a hostname +// - PATH consists of slash-separated segments, where each segment is either +// a literal or a wildcard of the form "{name}", "{name...}", or "{$}". +// +// METHOD, HOST and PATH are all optional; that is, the string can be "/". +// If METHOD is present, it must be followed by at least one space or tab. +// Wildcard names must be valid Go identifiers. +// The "{$}" and "{name...}" wildcard must occur at the end of PATH. +// PATH may end with a '/'. +// Wildcard names in a path must be distinct. +// +// Some examples could be: +// - "/foo/{bar}" returns ["bar"] +// - "/foo/{bar}/{baz}" returns ["bar", "baz"] +// - "/foo" returns [] +func parsePatternNames(pattern string) ([]string, error) { + if len(pattern) == 0 { + return nil, errors.New("empty pattern") + } + method, rest, found := pattern, "", false + if i := strings.IndexAny(pattern, " \t"); i >= 0 { + method, rest, found = pattern[:i], strings.TrimLeft(pattern[i+1:], " \t"), true + } + if !found { + rest = method + method = "" + } + + i := strings.IndexByte(rest, '/') + if i < 0 { + return nil, errors.New("host/path missing /") + } + host := rest[:i] + rest = rest[i:] + if j := strings.IndexByte(host, '{'); j >= 0 { + return nil, errors.New("host contains '{' (missing initial '/'?)") + } + + // At this point, rest is the path. + var names []string + seenNames := make(map[string]bool) + for len(rest) > 0 { + // Invariant: rest[0] == '/'. + rest = rest[1:] + if len(rest) == 0 { + // Trailing slash. + break + } + i := strings.IndexByte(rest, '/') + if i < 0 { + i = len(rest) + } + var seg string + seg, rest = rest[:i], rest[i:] + if i := strings.IndexByte(seg, '{'); i >= 0 { + // Wildcard. + if i != 0 { + return nil, errors.New("bad wildcard segment (must start with '{')") + } + if seg[len(seg)-1] != '}' { + return nil, errors.New("bad wildcard segment (must end with '}')") + } + name := seg[1 : len(seg)-1] + if name == "$" { + if len(rest) != 0 { + return nil, errors.New("{$} not at end") + } + break + } + name, multi := strings.CutSuffix(name, "...") + if multi && len(rest) != 0 { + return nil, errors.New("{...} wildcard not at end") + } + if name == "" { + return nil, errors.New("empty wildcard name") + } + if !isValidWildcardName(name) { + return nil, fmt.Errorf("bad wildcard name %q", name) + } + if seenNames[name] { + return nil, fmt.Errorf("duplicate wildcard name %q", name) + } + seenNames[name] = true + names = append(names, name) + } + } + + return names, nil +} + +func isValidWildcardName(s string) bool { + if s == "" { + return false + } + // Valid Go identifier. + for i, c := range s { + if !unicode.IsLetter(c) && c != '_' && (i == 0 || !unicode.IsDigit(c)) { + return false + } + } + return true +} diff --git a/instrumentation/net/http/pattern/pattern_test.go b/instrumentation/net/http/pattern/pattern_test.go new file mode 100644 index 0000000000..ee88b715d4 --- /dev/null +++ b/instrumentation/net/http/pattern/pattern_test.go @@ -0,0 +1,169 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package pattern + +import ( + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestPathParameters(t *testing.T) { + t.Run("blank", func(t *testing.T) { + req := httptest.NewRequest("GET", "/foo/123", nil) + assert.Equal(t, "", req.Pattern) + require.Nil(t, PathParameters(req.Pattern, req)) + }) + + for _, tt := range []struct { + name string + pattern string + url string + expected map[string]string + }{ + { + name: "simple", + pattern: "/foo/{bar}", + url: "/foo/123", + expected: map[string]string{"bar": "123"}, + }, + { + name: "multiple", + pattern: "/foo/{bar}/{baz}", + url: "/foo/123/456", + expected: map[string]string{"bar": "123", "baz": "456"}, + }, + { + name: "nested", + pattern: "/foo/{bar}/baz/{qux}", + url: "/foo/123/baz/456", + expected: map[string]string{"bar": "123", "qux": "456"}, + }, + { + name: "empty", + pattern: "/foo/{bar}", + url: "/foo/", + expected: map[string]string{"bar": ""}, + }, + { + name: "http method", + pattern: "GET /foo/{bar}", + url: "/foo/123", + expected: map[string]string{"bar": "123"}, + }, + { + name: "host", + pattern: "example.com/foo/{bar}", + url: "http://example.com/foo/123", + expected: map[string]string{"bar": "123"}, + }, + { + name: "host and method", + pattern: "GET example.com/foo/{bar}", + url: "http://example.com/foo/123", + expected: map[string]string{"bar": "123"}, + }, + } { + t.Run(tt.name, func(t *testing.T) { + mux := http.NewServeMux() + mux.HandleFunc(tt.pattern, func(_ http.ResponseWriter, r *http.Request) { + _, pattern := mux.Handler(r) + params := PathParameters(pattern, r) + assert.Equal(t, tt.expected, params) + }) + + r := httptest.NewRequest("GET", tt.url, nil) + w := httptest.NewRecorder() + mux.ServeHTTP(w, r) + }) + } +} + +func TestParsePatternNames(t *testing.T) { + tests := []struct { + pattern string + expected []string + err bool + }{ + {"/foo/{bar}", []string{"bar"}, false}, + {"/foo/{bar}/{baz}", []string{"bar", "baz"}, false}, + {"/foo/{bar}/{bar}", nil, true}, + {"/foo/{bar}...", nil, true}, + {"/foo/{bar}.../baz", nil, true}, + {"/foo/{bar}/{baz}...", nil, true}, + {"/foo/{bar", nil, true}, + {"/foo/{bar{baz}}", nil, true}, + {"/foo/{}", nil, true}, + {"{}", nil, true}, + {"GET /foo/{bar}", []string{"bar"}, false}, + {"POST /foo/{bar}/{baz}", []string{"bar", "baz"}, false}, + {"PUT /foo/{bar}/{bar}", nil, true}, + {"DELETE /foo/{bar}...", nil, true}, + {"PATCH /foo/{bar}.../baz", nil, true}, + {"OPTIONS /foo/{bar}/{baz}...", nil, true}, + {"GET /foo/{bar", nil, true}, + {"POST /foo/{bar{baz}}", nil, true}, + {"DELETE /foo/{}", nil, true}, + {"OPTIONS {}", nil, true}, + {"GET example.com/foo/{bar}", []string{"bar"}, false}, + {"POST example.com/foo/{bar}/{baz}", []string{"bar", "baz"}, false}, + {"PUT example.com/foo/{bar}/{bar}", nil, true}, + {"DELETE example.com/foo/{bar}...", nil, true}, + {"PATCH example.com/foo/{bar}.../baz", nil, true}, + {"OPTIONS example.com/foo/{bar}/{baz}...", nil, true}, + {"GET example.com/foo/{bar", nil, true}, + {"POST example.com/foo/{bar{baz}}", nil, true}, + {"DELETE example.com/foo/{}", nil, true}, + {"OPTIONS example.com/{}", nil, true}, + } + + for _, tt := range tests { + t.Run(tt.pattern, func(t *testing.T) { + names, err := parsePatternNames(tt.pattern) + if tt.err { + assert.Error(t, err) + assert.Nil(t, names) + } else { + assert.NoError(t, err) + assert.Equal(t, tt.expected, names) + } + }) + } +} + +func TestServeMuxGo122Patterns(t *testing.T) { + // A mux with go1.21 patterns ("/bar") and go1.22 patterns ("GET /foo") + mux := http.NewServeMux() + handler := func(w http.ResponseWriter, r *http.Request) { + route := Route(r.Pattern) + w.Write([]byte(route)) + } + mux.HandleFunc("/bar/{id}", handler) + mux.HandleFunc("GET /foo/{id}/baz", handler) + + srv := httptest.NewServer(mux) + defer srv.Close() + + // Check for the /bar route + res, err := srv.Client().Get(srv.URL + "/bar/1337") + require.NoError(t, err) + body, err := io.ReadAll(res.Body) + res.Body.Close() + require.NoError(t, err) + require.Equal(t, "/bar/{id}", string(body)) + + // Check for the /foo route + res, err = srv.Client().Get(srv.URL + "/foo/42/baz") + require.NoError(t, err) + body, err = io.ReadAll(res.Body) + res.Body.Close() + require.NoError(t, err) + require.Equal(t, "/foo/{id}/baz", string(body)) +} diff --git a/instrumentation/options/options.go b/instrumentation/options/options.go new file mode 100644 index 0000000000..ab2cb8c296 --- /dev/null +++ b/instrumentation/options/options.go @@ -0,0 +1,40 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package options + +import "github.com/DataDog/dd-trace-go/v2/internal" + +// Copy should be used any time existing options are copied into +// a new locally scoped set of options. This is to avoid data races and +// accidental side effects. +func Copy[T any](opts []T) []T { + return Expand(opts, 0, 0) +} + +// Expand should be used any time existing options are copied into +// a new locally scoped set of options and extra space is required. +// This is to avoid data accidental side effects and undesired reallocations +// when appending to the new slice. +// The initialPosition parameter specifies the position in the new slice +// where the existing options should be copied to. It's assumed that the new +// slice will at least have a length of initialPosition + len(opts). +// The trailCapacity parameter specifies the number of additional options that may be +// appended to the new slice. +// The new slice will have a capacity of initialPosition + len(opts) + trailCapacity +// and a length of initialPosition + len(opts). +func Expand[T any](opts []T, initialPosition, trailCapacity int) []T { + capacity := initialPosition + len(opts) + dup := make([]T, capacity, capacity+trailCapacity) + copy(dup[initialPosition:], opts) + return dup +} + +// This is a workaround needed because of v2 changes that prevents contribs from accessing +// the internal directory. This function should not be used if the internal directory +// can be +func GetBoolEnv(key string, def bool) bool { + return internal.BoolEnv(key, def) +} diff --git a/instrumentation/options/options_test.go b/instrumentation/options/options_test.go new file mode 100644 index 0000000000..80042bf92a --- /dev/null +++ b/instrumentation/options/options_test.go @@ -0,0 +1,44 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package options + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func consumeTagPair(dst map[string]string, v string) { + values := strings.Split(v, ":") + if len(values) != 2 { + panic("invalid tag pair") + } + dst[values[0]] = values[1] +} + +func TestStringSliceModify(t *testing.T) { + t.Run("modify-original", func(t *testing.T) { + opts := []string{"mytag:myvalue"} + optsCopy := Copy(opts) + opts[0] = "mytag:somethingelse" + cfg := make(map[string]string, len(optsCopy)) + for _, v := range optsCopy { + consumeTagPair(cfg, v) + } + assert.Equal(t, "myvalue", cfg["mytag"]) + }) + t.Run("modify-copy", func(t *testing.T) { + opts := []string{"mytag:myvalue"} + optsCopy := Copy(opts) + optsCopy[0] = "mytag:somethingelse" + cfg := make(map[string]string, len(opts)) + for _, v := range opts { + consumeTagPair(cfg, v) + } + assert.Equal(t, "myvalue", cfg["mytag"]) + }) +} diff --git a/instrumentation/packages.go b/instrumentation/packages.go new file mode 100644 index 0000000000..7539c84bbe --- /dev/null +++ b/instrumentation/packages.go @@ -0,0 +1,939 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package instrumentation + +import ( + "fmt" + "strings" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" +) + +type Package string + +const ( + Package99DesignsGQLGen Package = "99designs/gqlgen" + PackageAWSSDKGo Package = "aws/aws-sdk-go" + PackageAWSSDKGoV2 Package = "aws/aws-sdk-go-v2" + PackageAWSDatadogLambdaGo Package = "aws/datadog-lambda-go" + PackageBradfitzGoMemcache Package = "bradfitz/gomemcache" + PackageGCPPubsub Package = "cloud.google.com/go/pubsub.v1" + PackageGCPPubsubV2 Package = "cloud.google.com/go/pubsub.v2" + PackageConfluentKafkaGo Package = "confluentinc/confluent-kafka-go/kafka" + PackageConfluentKafkaGoV2 Package = "confluentinc/confluent-kafka-go/kafka.v2" + PackageDatabaseSQL Package = "database/sql" + PackageDimfeldHTTPTreeMuxV5 Package = "dimfeld/httptreemux.v5" + PackageGoElasticSearchV6 Package = "elastic/go-elasticsearch.v6" + PackageEmickleiGoRestfulV3 Package = "emicklei/go-restful.v3" + PackageGin Package = "gin-gonic/gin" + PackageGlobalsignMgo Package = "globalsign/mgo" + PackageMongoDriver Package = "go.mongodb.org/mongo-driver" + PackageMongoDriverV2 Package = "go.mongodb.org/mongo-driver.v2" + PackageChi Package = "go-chi/chi" + PackageChiV5 Package = "go-chi/chi.v5" + PackageGoPGV10 Package = "go-pg/pg.v10" + PackageGoRedis Package = "go-redis/redis" + PackageGoRedisV7 Package = "go-redis/redis.v7" + PackageGoRedisV8 Package = "go-redis/redis.v8" + PackageGoCQL Package = "gocql/gocql" + PackageGoFiberV2 Package = "gofiber/fiber.v2" + PackageRedigo Package = "gomodule/redigo" + PackageGoogleAPI Package = "google.golang.org/api" + PackageGRPC Package = "google.golang.org/grpc" + + PackageNetHTTP Package = "net/http" + PackageIBMSarama Package = "IBM/sarama" + + PackageValyalaFastHTTP Package = "valyala/fasthttp" + PackageUrfaveNegroni Package = "urfave/negroni" + PackageTwitchTVTwirp Package = "twitchtv/twirp" + PackageTidwallBuntDB Package = "tidwall/buntdb" + PackageSyndtrGoLevelDB Package = "syndtr/goleveldb" + PackageSirupsenLogrus Package = "sirupsen/logrus" + PackageShopifySarama Package = "Shopify/sarama" + PackageSegmentioKafkaGo Package = "segmentio/kafka-go" + PackageRedisGoRedisV9 Package = "redis/go-redis.v9" + PackageOlivereElasticV5 Package = "olivere/elastic.v5" + PackageMiekgDNS Package = "miekg/dns" + PackageLabstackEchoV4 Package = "labstack/echo.v4" + PackageK8SClientGo Package = "k8s.io/client-go" + PackageK8SGatewayAPI Package = "k8s.io/gateway-api" + PackageJulienschmidtHTTPRouter Package = "julienschmidt/httprouter" + PackageJmoironSQLx Package = "jmoiron/sqlx" + PackageJackcPGXV5 Package = "jackc/pgx.v5" + PackageHashicorpConsulAPI Package = "hashicorp/consul" + PackageHashicorpVaultAPI Package = "hashicorp/vault" + PackageGraphQLGoGraphQL Package = "graphql-go/graphql" + PackageGraphGophersGraphQLGo Package = "graph-gophers/graphql-go" + PackageGormIOGormV1 Package = "gorm.io/gorm.v1" + PackageGorillaMux Package = "gorilla/mux" + PackageUptraceBun Package = "uptrace/bun" + PackageLogSlog Package = "log/slog" + + PackageValkeyIoValkeyGo Package = "valkey-io/valkey-go" + PackageEnvoyProxyGoControlPlane Package = "envoyproxy/go-control-plane" + PackageHAProxyStreamProcessingOffload Package = "haproxy/stream-processing-offload" + PackageOS Package = "os" + PackageRedisRueidis Package = "redis/rueidis" +) + +// These packages have been removed in v2, but they are kept here for the transitional version. +const ( + PackageEmickleiGoRestful Package = "emicklei/go-restful" + PackageGaryburdRedigo Package = "garyburd/redigo" + PackageGopkgJinZhuGormV1 Package = "gopkg.in/jinzhu/gorm.v1" + PackageGojiV1Web Package = "zenazn/goji.v1/web" + PackageJinzhuGorm Package = "jinzhu/gorm" + PackageLabstackEcho Package = "labstack/echo" +) + +type Component int + +const ( + ComponentDefault Component = iota + ComponentServer + ComponentClient + ComponentProducer + ComponentConsumer +) + +type componentNames struct { + useDDServiceV0 bool + buildServiceNameV0 func(opCtx OperationContext) string + buildOpNameV0 func(opCtx OperationContext) string + buildOpNameV1 func(opCtx OperationContext) string +} + +type PackageInfo struct { + external bool + + TracedPackage string + IsStdLib bool + EnvVarPrefix string + + naming map[Component]componentNames +} + +var packages = map[Package]PackageInfo{ + Package99DesignsGQLGen: { + TracedPackage: "github.com/99designs/gqlgen", + EnvVarPrefix: "GQLGEN", + naming: map[Component]componentNames{ + ComponentDefault: { + buildServiceNameV0: staticName("graphql"), + buildOpNameV0: func(opCtx OperationContext) string { + name := "graphql.request" + if graphqlOp, ok := opCtx["graphql.operation"]; ok { + name = fmt.Sprintf("%s.%s", ext.SpanTypeGraphQL, graphqlOp) + } + return name + }, + buildOpNameV1: staticName("graphql.server.request"), + }, + }, + }, + PackageAWSSDKGo: { + TracedPackage: "github.com/aws/aws-sdk-go", + EnvVarPrefix: "AWS", + naming: map[Component]componentNames{ + ComponentDefault: { + buildServiceNameV0: awsBuildDefaultServiceNameV0, + buildOpNameV0: func(opCtx OperationContext) string { + awsService, ok := opCtx[ext.AWSService] + if !ok { + return "" + } + return awsService + ".command" + }, + buildOpNameV1: awsBuildOpNameV1, + }, + }, + }, + PackageAWSSDKGoV2: { + TracedPackage: "github.com/aws/aws-sdk-go-v2", + EnvVarPrefix: "AWS", + naming: map[Component]componentNames{ + ComponentDefault: { + buildServiceNameV0: awsBuildDefaultServiceNameV0, + buildOpNameV0: func(opCtx OperationContext) string { + awsService, ok := opCtx[ext.AWSService] + if !ok { + return "" + } + return awsService + ".request" + }, + buildOpNameV1: awsBuildOpNameV1, + }, + }, + }, + PackageAWSDatadogLambdaGo: { + TracedPackage: "github.com/DataDog/dd-trace-go/contrib/aws/datadog-lambda-go", + EnvVarPrefix: "LAMBDA", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("aws.lambda"), + buildOpNameV0: staticName("aws.lambda"), + buildOpNameV1: staticName("aws.lambda"), + }, + }, + }, + PackageBradfitzGoMemcache: { + TracedPackage: "github.com/bradfitz/gomemcache", + EnvVarPrefix: "MEMCACHE", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("memcached"), + buildOpNameV0: staticName("memcached.query"), + buildOpNameV1: staticName("memcached.command"), + }, + }, + }, + PackageGCPPubsub: { + TracedPackage: "cloud.google.com/go/pubsub", + EnvVarPrefix: "GCP_PUBSUB", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("pubsub.receive"), + buildOpNameV1: staticName("gcp.pubsub.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("pubsub.publish"), + buildOpNameV1: staticName("gcp.pubsub.send"), + }, + }, + }, + PackageGCPPubsubV2: { + TracedPackage: "cloud.google.com/go/pubsub/v2", + EnvVarPrefix: "GCP_PUBSUB", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("pubsub.receive"), + buildOpNameV1: staticName("gcp.pubsub.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("pubsub.publish"), + buildOpNameV1: staticName("gcp.pubsub.send"), + }, + }, + }, + PackageConfluentKafkaGo: { + TracedPackage: "github.com/confluentinc/confluent-kafka-go", + EnvVarPrefix: "KAFKA", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.consume"), + buildOpNameV1: staticName("kafka.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.produce"), + buildOpNameV1: staticName("kafka.send"), + }, + }, + }, + PackageConfluentKafkaGoV2: { + TracedPackage: "github.com/confluentinc/confluent-kafka-go/v2", + EnvVarPrefix: "KAFKA", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.consume"), + buildOpNameV1: staticName("kafka.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.produce"), + buildOpNameV1: staticName("kafka.send"), + }, + }, + }, + PackageDatabaseSQL: { + TracedPackage: "database/sql", + IsStdLib: true, + EnvVarPrefix: "SQL", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: func(opCtx OperationContext) string { + if svc := opCtx["registerService"]; svc != "" { + return svc + } + return fmt.Sprintf("%s.db", opCtx["driverName"]) + }, + buildOpNameV0: func(opCtx OperationContext) string { + return fmt.Sprintf("%s.query", opCtx["driverName"]) + }, + buildOpNameV1: func(opCtx OperationContext) string { + return fmt.Sprintf("%s.query", opCtx[ext.DBSystem]) + }, + }, + }, + }, + PackageDimfeldHTTPTreeMuxV5: { + TracedPackage: "github.com/dimfeld/httptreemux/v5", + EnvVarPrefix: "HTTPTREEMUX", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("http.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageGoElasticSearchV6: { + TracedPackage: "github.com/elastic/go-elasticsearch/v6", + EnvVarPrefix: "ELASTIC", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("elastic.client"), + buildOpNameV0: staticName("elasticsearch.query"), + buildOpNameV1: staticName("elasticsearch.query"), + }, + }, + }, + PackageEmickleiGoRestfulV3: { + TracedPackage: "github.com/emicklei/go-restful/v3", + EnvVarPrefix: "RESTFUL", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("go-restful"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageGin: { + TracedPackage: "github.com/gin-gonic/gin", + EnvVarPrefix: "GIN", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("gin.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageGlobalsignMgo: { + TracedPackage: "github.com/globalsign/mgo", + EnvVarPrefix: "MGO", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("mongodb"), + buildOpNameV0: staticName("mongodb.query"), + buildOpNameV1: staticName("mongodb.query"), + }, + }, + }, + PackageMongoDriver: { + TracedPackage: "go.mongodb.org/mongo-driver", + EnvVarPrefix: "MONGO", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("mongo"), + buildOpNameV0: staticName("mongodb.query"), + buildOpNameV1: staticName("mongodb.query"), + }, + }, + }, + PackageMongoDriverV2: { + TracedPackage: "go.mongodb.org/mongo-driver/v2", + EnvVarPrefix: "MONGO", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("mongo"), + buildOpNameV0: staticName("mongodb.query"), + buildOpNameV1: staticName("mongodb.query"), + }, + }, + }, + PackageChi: { + TracedPackage: "github.com/go-chi/chi", + EnvVarPrefix: "CHI", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("chi.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageChiV5: { + TracedPackage: "github.com/go-chi/chi/v5", + EnvVarPrefix: "CHI", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("chi.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageGoPGV10: { + TracedPackage: "github.com/go-pg/pg/v10", + EnvVarPrefix: "GOPG", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("gopg.db"), + buildOpNameV0: staticName("go-pg"), + buildOpNameV1: staticName("postgresql.query"), + }, + }, + }, + PackageGoRedis: { + TracedPackage: "github.com/go-redis/redis", + EnvVarPrefix: "REDIS", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("redis.client"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageGoRedisV7: { + TracedPackage: "github.com/go-redis/redis/v7", + EnvVarPrefix: "REDIS", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("redis.client"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageGoRedisV8: { + TracedPackage: "github.com/go-redis/redis/v8", + EnvVarPrefix: "REDIS", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("redis.client"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageGoCQL: { + TracedPackage: "github.com/gocql/gocql", + EnvVarPrefix: "GOCQL", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("gocql.query"), + buildOpNameV0: func(opCtx OperationContext) string { + if opCtx["operationType"] == "batch" { + return "cassandra.batch" + } + return "cassandra.query" + }, + buildOpNameV1: staticName("cassandra.query"), + }, + }, + }, + PackageGoFiberV2: { + TracedPackage: "github.com/gofiber/fiber/v2", + EnvVarPrefix: "FIBER", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("fiber"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageRedigo: { + TracedPackage: "github.com/gomodule/redigo", + EnvVarPrefix: "REDIGO", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("redis.conn"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageGoogleAPI: { + TracedPackage: "google.golang.org/api", + EnvVarPrefix: "GOOGLE_API", + naming: nil, // this package does not use naming schema + }, + PackageGRPC: { + TracedPackage: "google.golang.org/grpc", + EnvVarPrefix: "GRPC", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("grpc.server"), + buildOpNameV0: staticName("grpc.server"), + buildOpNameV1: staticName("grpc.server.request"), + }, + ComponentClient: { + useDDServiceV0: false, + buildServiceNameV0: staticName("grpc.client"), + buildOpNameV0: staticName("grpc.client"), + buildOpNameV1: staticName("grpc.client.request"), + }, + }, + }, + // TODO + + PackageNetHTTP: { + TracedPackage: "net/http", + IsStdLib: true, + EnvVarPrefix: "HTTP", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("http.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + ComponentClient: { + useDDServiceV0: false, + buildServiceNameV0: staticName(""), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.client.request"), + }, + }, + }, + PackageValyalaFastHTTP: { + TracedPackage: "github.com/valyala/fasthttp", + EnvVarPrefix: "FASTHTTP", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("fasthttp"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageUrfaveNegroni: { + TracedPackage: "github.com/urfave/negroni", + EnvVarPrefix: "NEGRONI", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("negroni.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageTwitchTVTwirp: { + TracedPackage: "github.com/twitchtv/twirp", + EnvVarPrefix: "TWIRP", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("twirp-server"), + buildOpNameV0: func(opCtx OperationContext) string { + rpcService, ok := opCtx[ext.RPCService] + if rpcService == "" || !ok { + return "twirp.service" + } + return fmt.Sprintf("twirp.%s", rpcService) + }, + buildOpNameV1: staticName("twirp.server.request"), + }, + ComponentClient: { + useDDServiceV0: true, + buildServiceNameV0: staticName("twirp-client"), + buildOpNameV0: staticName("twirp.request"), + buildOpNameV1: staticName("twirp.client.request"), + }, + }, + }, + PackageTidwallBuntDB: { + TracedPackage: "github.com/tidwall/buntdb", + EnvVarPrefix: "BUNTDB", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("buntdb"), + buildOpNameV0: staticName("buntdb.query"), + buildOpNameV1: staticName("buntdb.query"), + }, + }, + }, + PackageSyndtrGoLevelDB: { + TracedPackage: "github.com/syndtr/goleveldb", + EnvVarPrefix: "LEVELDB", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("leveldb"), + buildOpNameV0: staticName("leveldb.query"), + buildOpNameV1: staticName("leveldb.query"), + }, + }, + }, + PackageSirupsenLogrus: { + TracedPackage: "github.com/sirupsen/logrus", + EnvVarPrefix: "LOGRUS", + }, + PackageShopifySarama: { + TracedPackage: "github.com/Shopify/sarama", + EnvVarPrefix: "SARAMA", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.consume"), + buildOpNameV1: staticName("kafka.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.produce"), + buildOpNameV1: staticName("kafka.send"), + }, + }, + }, + PackageSegmentioKafkaGo: { + TracedPackage: "github.com/segmentio/kafka-go", + EnvVarPrefix: "KAFKA", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.consume"), + buildOpNameV1: staticName("kafka.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.produce"), + buildOpNameV1: staticName("kafka.send"), + }, + }, + }, + PackageRedisGoRedisV9: { + TracedPackage: "github.com/redis/go-redis/v9", + EnvVarPrefix: "REDIS", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("redis.client"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageRedisRueidis: { + TracedPackage: "github.com/redis/rueidis", + EnvVarPrefix: "REDIS", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("redis.client"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageOlivereElasticV5: { + TracedPackage: "gopkg.in/olivere/elastic.v5", + EnvVarPrefix: "ELASTIC", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("elastic.client"), + buildOpNameV0: staticName("elasticsearch.query"), + buildOpNameV1: staticName("elasticsearch.query"), + }, + }, + }, + PackageMiekgDNS: { + TracedPackage: "github.com/miekg/dns", + }, + PackageLabstackEchoV4: { + TracedPackage: "github.com/labstack/echo/v4", + EnvVarPrefix: "ECHO", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("echo"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageK8SClientGo: { + TracedPackage: "k8s.io/client-go", + }, + PackageK8SGatewayAPI: { + TracedPackage: "sigs.k8s.io/gateway-api", + }, + PackageJulienschmidtHTTPRouter: { + TracedPackage: "github.com/julienschmidt/httprouter", + EnvVarPrefix: "HTTPROUTER", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("http.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageJmoironSQLx: { + TracedPackage: "github.com/jmoiron/sqlx", + }, + PackageJackcPGXV5: { + TracedPackage: "github.com/jackc/pgx/v5", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("postgres.db"), + }, + }, + }, + PackageIBMSarama: { + TracedPackage: "github.com/IBM/sarama", + EnvVarPrefix: "SARAMA", + naming: map[Component]componentNames{ + ComponentConsumer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.consume"), + buildOpNameV1: staticName("kafka.process"), + }, + ComponentProducer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("kafka"), + buildOpNameV0: staticName("kafka.produce"), + buildOpNameV1: staticName("kafka.send"), + }, + }, + }, + PackageHashicorpConsulAPI: { + TracedPackage: "github.com/hashicorp/consul/api", + EnvVarPrefix: "CONSUL", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("consul"), + buildOpNameV0: staticName("consul.command"), + buildOpNameV1: staticName("consul.query"), + }, + }, + }, + PackageHashicorpVaultAPI: { + TracedPackage: "github.com/hashicorp/vault/api", + EnvVarPrefix: "VAULT", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("vault"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("vault.query"), + }, + }, + }, + PackageGraphQLGoGraphQL: { + TracedPackage: "github.com/graphql-go/graphql", + EnvVarPrefix: "GRAPHQL", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("graphql.server"), + }, + }, + }, + PackageGraphGophersGraphQLGo: { + TracedPackage: "github.com/graph-gophers/graphql-go", + EnvVarPrefix: "GRAPHQL", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("graphql.server"), + buildOpNameV0: staticName("graphql.request"), + buildOpNameV1: staticName("graphql.server.request"), + }, + }, + }, + PackageGormIOGormV1: { + TracedPackage: "gorm.io/gorm", + }, + PackageGorillaMux: { + TracedPackage: "github.com/gorilla/mux", + EnvVarPrefix: "MUX", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("mux.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageUptraceBun: { + TracedPackage: "github.com/uptrace/bun", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("bun.db"), + }, + }, + }, + PackageLogSlog: { + TracedPackage: "log/slog", + IsStdLib: true, + }, + PackageValkeyIoValkeyGo: { + TracedPackage: "github.com/valkey-io/valkey-go", + EnvVarPrefix: "VALKEY", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: true, + buildServiceNameV0: staticName("valkey.client"), + }, + }, + }, + PackageEnvoyProxyGoControlPlane: { + TracedPackage: "github.com/envoyproxy/go-control-plane", + }, + PackageHAProxyStreamProcessingOffload: { + TracedPackage: "haproxy/stream-processing-offload", + }, + PackageOS: { + TracedPackage: "os", + }, + PackageEmickleiGoRestful: { + TracedPackage: "github.com/emicklei/go-restful", + EnvVarPrefix: "RESTFUL", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: false, + buildServiceNameV0: staticName("go-restful"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageGaryburdRedigo: { + TracedPackage: "github.com/garyburd/redigo", + EnvVarPrefix: "REDIGO", + naming: map[Component]componentNames{ + ComponentDefault: { + useDDServiceV0: false, + buildServiceNameV0: staticName("redis.conn"), + buildOpNameV0: staticName("redis.command"), + buildOpNameV1: staticName("redis.command"), + }, + }, + }, + PackageGopkgJinZhuGormV1: { + TracedPackage: "gopkg.in/jinzhu/gorm.v1", + }, + PackageGojiV1Web: { + TracedPackage: "github.com/zenazn/goji/web", + EnvVarPrefix: "GOJI", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("http.router"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, + PackageJinzhuGorm: { + TracedPackage: "github.com/jinzhu/gorm", + }, + PackageLabstackEcho: { + TracedPackage: "github.com/labstack/echo", + EnvVarPrefix: "ECHO", + naming: map[Component]componentNames{ + ComponentServer: { + useDDServiceV0: true, + buildServiceNameV0: staticName("echo"), + buildOpNameV0: staticName("http.request"), + buildOpNameV1: staticName("http.server.request"), + }, + }, + }, +} + +func staticName(name string) func(OperationContext) string { + return func(_ OperationContext) string { + return name + } +} + +func awsBuildDefaultServiceNameV0(opCtx OperationContext) string { + awsService, ok := opCtx[ext.AWSService] + if !ok { + return "" + } + return "aws." + awsService +} + +func awsBuildOpNameV1(opCtx OperationContext) string { + awsService, ok := opCtx[ext.AWSService] + if !ok { + return "" + } + awsOp, ok := opCtx[ext.AWSOperation] + if !ok { + return "" + } + op := "request" + if isAWSMessagingSendOp(awsService, awsOp) { + op = "send" + } + return fmt.Sprintf("aws.%s.%s", strings.ToLower(awsService), op) +} + +func isAWSMessagingSendOp(awsService, awsOperation string) bool { + s, op := strings.ToLower(awsService), strings.ToLower(awsOperation) + if s == "sqs" { + return strings.HasPrefix(op, "sendmessage") + } + if s == "sns" { + return op == "publish" + } + return false +} + +// GetPackages returns a map of Package to the corresponding instrumented module. +func GetPackages() map[Package]PackageInfo { + cp := make(map[Package]PackageInfo) + for pkg, info := range packages { + cp[pkg] = info + } + return cp +} diff --git a/instrumentation/testutils/containers/assert.go b/instrumentation/testutils/containers/assert.go new file mode 100644 index 0000000000..07cbf5de32 --- /dev/null +++ b/instrumentation/testutils/containers/assert.go @@ -0,0 +1,29 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "runtime" + "testing" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/stretchr/testify/require" +) + +// AssertTestContainersError decides whether the provided testcontainers error should make the test +// fail or mark it as skipped, depending on the environment where the test is running. +func AssertTestContainersError(t testing.TB, err error) { + if err == nil { + return + } + if _, ok := env.Lookup("CI"); ok && runtime.GOOS != "linux" { + t.Skipf("failed to start container (CI does not support docker, skipping test): %s", err.Error()) + return + } + require.NoError(t, err) +} diff --git a/instrumentation/testutils/containers/aws-dynamodb.go b/instrumentation/testutils/containers/aws-dynamodb.go new file mode 100644 index 0000000000..c3a33bbfe8 --- /dev/null +++ b/instrumentation/testutils/containers/aws-dynamodb.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "context" + "testing" + + "github.com/docker/go-connections/nat" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/wait" +) + +// StartDynamoDBTestContainer starts a new dynamoDB test container and returns the necessary information to connect +// to it. +func StartDynamoDBTestContainer(t testing.TB) (testcontainers.Container, string, string) { + exposedPort := "8000/tcp" + req := testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Image: "amazon/dynamodb-local:latest", // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + ExposedPorts: []string{exposedPort}, + WaitingFor: wait.ForHTTP("").WithStatusCodeMatcher(func(int) bool { return true }), + WorkingDir: "/home/dynamodblocal", + Cmd: []string{ + "-jar", "DynamoDBLocal.jar", + "-inMemory", + "-disableTelemetry", + }, + LogConsumerCfg: &testcontainers.LogConsumerConfig{ + Consumers: []testcontainers.LogConsumer{TestLogConsumer(t)}, + }, + }, + Started: true, + Logger: tclog.TestLogger(t), + } + + ctx := context.Background() + container, err := testcontainers.GenericContainer(ctx, req) + AssertTestContainersError(t, err) + RegisterContainerCleanup(t, container) + + mappedPort, err := container.MappedPort(ctx, nat.Port(exposedPort)) + require.NoError(t, err) + + host, err := container.Host(ctx) + require.NoError(t, err) + + return container, host, mappedPort.Port() +} diff --git a/instrumentation/testutils/containers/cleanup.go b/instrumentation/testutils/containers/cleanup.go new file mode 100644 index 0000000000..322aa9f1cb --- /dev/null +++ b/instrumentation/testutils/containers/cleanup.go @@ -0,0 +1,31 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/stretchr/testify/assert" + "github.com/testcontainers/testcontainers-go" +) + +// RegisterContainerCleanup registers a function to terminate the provided container to be executed after the test finishes. +func RegisterContainerCleanup(t testing.TB, container testcontainers.Container) { + t.Cleanup(func() { + if _, ok := env.Lookup("CI"); ok { + t.Log("skipping container cleanup in CI environment") + return + } + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + assert.NoError(t, container.Terminate(ctx)) + }) +} diff --git a/instrumentation/testutils/containers/go.mod b/instrumentation/testutils/containers/go.mod new file mode 100644 index 0000000000..387fe7ed05 --- /dev/null +++ b/instrumentation/testutils/containers/go.mod @@ -0,0 +1,70 @@ +module github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/docker/go-connections v0.5.0 + github.com/stretchr/testify v1.11.1 + github.com/testcontainers/testcontainers-go v0.37.0 + github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0 + github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0 + github.com/testcontainers/testcontainers-go/modules/redis v0.37.0 + github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0 +) + +require ( + dario.cat/mergo v1.0.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v28.0.1+incompatible // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mdelapenya/tlscert v0.2.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/user v0.1.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + golang.org/x/crypto v0.39.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/sys v0.37.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/instrumentation/testutils/containers/go.sum b/instrumentation/testutils/containers/go.sum new file mode 100644 index 0000000000..653802f5ab --- /dev/null +++ b/instrumentation/testutils/containers/go.sum @@ -0,0 +1,251 @@ +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/IBM/sarama v1.42.1 h1:wugyWa15TDEHh2kvq2gAy1IHLjEjuYOYgXz/ruC/OSQ= +github.com/IBM/sarama v1.42.1/go.mod h1:Xxho9HkHd4K/MDUo/T/sOqwtX/17D33++E9Wib6hUdQ= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= +github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= +github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mdelapenya/tlscert v0.2.0 h1:7H81W6Z/4weDvZBNOfQte5GpIMo0lGYEeWbkGp5LJHI= +github.com/mdelapenya/tlscert v0.2.0/go.mod h1:O4njj3ELLnJjGdkN7M/vIVCpZ+Cf0L6muqOG4tLSl8o= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/user v0.1.0 h1:WmZ93f5Ux6het5iituh9x2zAG7NFY9Aqi49jjE1PaQg= +github.com/moby/sys/user v0.1.0/go.mod h1:fKJhFOnsCN6xZ5gSfbM6zaHGgDJMrqt9/reuj4T7MmU= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/testcontainers/testcontainers-go v0.37.0 h1:L2Qc0vkTw2EHWQ08djon0D2uw7Z/PtHS/QzZZ5Ra/hg= +github.com/testcontainers/testcontainers-go v0.37.0/go.mod h1:QPzbxZhQ6Bclip9igjLFj6z0hs01bU8lrl2dHQmgFGM= +github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0 h1:ZkYNKqhqvKm+aZk9C1fxw/fpNNOK+Nm/wHPjmJdN3Ko= +github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0/go.mod h1:+LvaFfSFW5PMiJTxTQlV6TBpXH1Ktk1h0FTVRZfqSxY= +github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0 h1:drGy4LJOVkIKpKGm1YKTfVzb1qRhN/konVpmuUphq0k= +github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0/go.mod h1:e9/4dGJfSZW59/kXGf/ksrEvA+BqP/daax0Usp2cpsM= +github.com/testcontainers/testcontainers-go/modules/redis v0.37.0 h1:9HIY28I9ME/Zmb+zey1p/I1mto5+5ch0wLX+nJdOsQ4= +github.com/testcontainers/testcontainers-go/modules/redis v0.37.0/go.mod h1:Abu9g/25Qv+FkYVx3U4Voaynou1c+7D0HIhaQJXvk6E= +github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0 h1:eIf5TWPO7Oq/h2Hb6UVn5r/x0ucGRxcKkbNtqCRzH9k= +github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0/go.mod h1:bOuF2ueLQxiK44g7y90UT2lf3qitxUHV8ax2OHrPGT4= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/valkey-io/valkey-go v1.0.41 h1:pWgh9MP24Vl0ANZ0KxEMwB/LHvTUKwlm2SPuWIrSlFw= +github.com/valkey-io/valkey-go v1.0.41/go.mod h1:LXqAbjygRuA1YRocojTslAGx2dQB4p8feaseGviWka4= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.mongodb.org/mongo-driver v1.13.1 h1:YIc7HTYsKndGK4RFzJ3covLz1byri52x0IoMB0Pt/vk= +go.mongodb.org/mongo-driver v1.13.1/go.mod h1:wcDf1JBCXy2mOW0bWHwO/IOYqdca1MPCwDtFu/Z9+eo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7 h1:FiusG7LWj+4byqhbvmB+Q93B/mOxJLN2DTozDuZm4EU= +google.golang.org/genproto/googleapis/api v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:kXqgZtrWaf6qS3jZOCnCH7WYfrvFjkC51bM8fz3RsCA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= +gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= diff --git a/instrumentation/testutils/containers/healthy.go b/instrumentation/testutils/containers/healthy.go new file mode 100644 index 0000000000..c5a6c90177 --- /dev/null +++ b/instrumentation/testutils/containers/healthy.go @@ -0,0 +1,43 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "runtime" + "testing" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/testcontainers/testcontainers-go" +) + +// SkipIfProviderIsNotHealthy calls [testcontainers.SkipIfProviderIsNotHealthy] to skip tests of +// the testcontainers provider is not healthy or running at all; except when the test is running in +// CI mode (the CI environment variable is defined) and the GOOS is linux. +func SkipIfProviderIsNotHealthy(t *testing.T) { + t.Helper() + + if _, ci := env.Lookup("CI"); ci && runtime.GOOS == "linux" { + // We never want to skip tests on Linux CI, as this could lead to not noticing the tests are not + // running at all, resulting in usurped confidence in the (un)tested code. + return + } + + defer func() { + err := recover() + if err == nil { + return + } + // We recovered from a panic (e.g, "rootless Docker not found" on GitHub Actions + macOS), so we + // will behave as if the provider was not healthy (because it's not and shouldn't have panic'd + // in the first place). + t.Log(err) + t.SkipNow() + }() + + testcontainers.SkipIfProviderIsNotHealthy(t) +} diff --git a/instrumentation/testutils/containers/kafka.go b/instrumentation/testutils/containers/kafka.go new file mode 100644 index 0000000000..8f0e8657ce --- /dev/null +++ b/instrumentation/testutils/containers/kafka.go @@ -0,0 +1,85 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "context" + "fmt" + "testing" + + "github.com/docker/go-connections/nat" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + "github.com/testcontainers/testcontainers-go/modules/kafka" + "github.com/testcontainers/testcontainers-go/wait" +) + +// StartKafkaTestContainer starts a new Kafka test container and returns the connection string. +func StartKafkaTestContainer(t testing.TB, topics []string) (*kafka.KafkaContainer, string) { + ctx := context.Background() + exposedPort := "9093/tcp" + + waitStrategies := []wait.Strategy{ + wait.ForListeningPort(nat.Port(exposedPort)), + } + for _, topic := range topics { + waitStrategies = append(waitStrategies, wait.ForExec(createTopicCmd(topic))) + } + for _, topic := range topics { + waitStrategies = append(waitStrategies, wait.ForExec(checkTopicExistsCmd(topic))) + } + + container, err := kafka.Run(ctx, + "confluentinc/confluent-local:7.5.0", // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + kafka.WithClusterID("test-cluster"), + WithTestLogConsumer(t), + testcontainers.WithWaitStrategy(wait.ForAll(waitStrategies...)), + testcontainers.CustomizeRequest(testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Name: "kafka", + Hostname: "localhost", + }, + Started: true, + Reuse: true, + }), + ) + AssertTestContainersError(t, err) + RegisterContainerCleanup(t, container) + + mappedPort, err := container.MappedPort(ctx, nat.Port(exposedPort)) + require.NoError(t, err) + + host, err := container.Host(ctx) + require.NoError(t, err) + + addr := fmt.Sprintf("%s:%s", host, mappedPort.Port()) + return container, addr +} + +func createTopicCmd(topic string) []string { + return []string{ + "kafka-topics", + "--bootstrap-server", "localhost:9092", + "--topic", topic, + "--create", + "--if-not-exists", + "--partitions", "1", + "--replication-factor", "1", + } +} + +func checkTopicExistsCmd(topic string) []string { + return []string{ + "kafka-topics", + "--bootstrap-server", + "localhost:9092", + "--list", + "|", + "grep", topic, + } +} diff --git a/instrumentation/testutils/containers/logs.go b/instrumentation/testutils/containers/logs.go new file mode 100644 index 0000000000..a0a52c185c --- /dev/null +++ b/instrumentation/testutils/containers/logs.go @@ -0,0 +1,30 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "testing" + + "github.com/testcontainers/testcontainers-go" +) + +func WithTestLogConsumer(t testing.TB) testcontainers.CustomizeRequestOption { + return testcontainers.WithLogConsumers(TestLogConsumer(t)) +} + +type testLogConsumer struct { + testing.TB +} + +func TestLogConsumer(t testing.TB) testcontainers.LogConsumer { + return testLogConsumer{t} +} + +func (t testLogConsumer) Accept(log testcontainers.Log) { + t.TB.Log(string(log.Content)) +} diff --git a/instrumentation/testutils/containers/mongodb.go b/instrumentation/testutils/containers/mongodb.go new file mode 100644 index 0000000000..6ac953b489 --- /dev/null +++ b/instrumentation/testutils/containers/mongodb.go @@ -0,0 +1,48 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/modules/mongodb" +) + +// StartMongoDBTestContainer starts a new MongoDB test container and returns the connection string. +func StartMongoDBTestContainer(t testing.TB) (*mongodb.MongoDBContainer, string) { + ctx := context.Background() + + opts := []testcontainers.ContainerCustomizer{ + testcontainers.WithLogger(tclog.TestLogger(t)), + WithTestLogConsumer(t), + // attempt to reuse this container + testcontainers.CustomizeRequest(testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Name: "mongodb", + Hostname: "localhost", + }, + Started: true, + Reuse: true, + }), + } + container, err := mongodb.Run(ctx, + "mongo:8", + opts..., + ) + AssertTestContainersError(t, err) + RegisterContainerCleanup(t, container) + + connStr, err := container.ConnectionString(ctx) + require.NoError(t, err) + + return container, connStr +} diff --git a/instrumentation/testutils/containers/redis.go b/instrumentation/testutils/containers/redis.go new file mode 100644 index 0000000000..c7b3e76490 --- /dev/null +++ b/instrumentation/testutils/containers/redis.go @@ -0,0 +1,67 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "context" + "net/url" + "testing" + + "github.com/docker/go-connections/nat" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/modules/redis" + "github.com/testcontainers/testcontainers-go/wait" +) + +// StartRedisTestContainer starts a new Redis test container and returns the connection string. +func StartRedisTestContainer(t testing.TB) (*redis.RedisContainer, string) { + ctx := context.Background() + exposedPort := "6379/tcp" + waitReadyCmd := []string{ + "redis-cli", + "ping", + } + + opts := []testcontainers.ContainerCustomizer{ + testcontainers.WithLogger(tclog.TestLogger(t)), + WithTestLogConsumer(t), + testcontainers.WithWaitStrategy( + wait.ForAll( + wait.ForLog("* Ready to accept connections"), + wait.ForExposedPort(), + wait.ForListeningPort(nat.Port(exposedPort)), + wait.ForExec(waitReadyCmd), + ), + ), + // attempt to reuse this container + testcontainers.CustomizeRequest(testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Name: "redis", + Hostname: "localhost", + }, + Started: true, + Reuse: true, + }), + } + container, err := redis.Run(ctx, + "redis:7-alpine", // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + opts..., + ) + AssertTestContainersError(t, err) + RegisterContainerCleanup(t, container) + + connStr, err := container.ConnectionString(ctx) + require.NoError(t, err) + + redisURL, err := url.Parse(connStr) + require.NoError(t, err) + + return container, redisURL.Host +} diff --git a/instrumentation/testutils/containers/valkey.go b/instrumentation/testutils/containers/valkey.go new file mode 100644 index 0000000000..0e82b8e36e --- /dev/null +++ b/instrumentation/testutils/containers/valkey.go @@ -0,0 +1,65 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package containers + +import ( + "context" + "net/url" + "testing" + + "github.com/docker/go-connections/nat" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + testvalkey "github.com/testcontainers/testcontainers-go/modules/valkey" + "github.com/testcontainers/testcontainers-go/wait" +) + +// StartValkeyTestContainer starts a new Valkey test container and returns the connection string. +func StartValkeyTestContainer(t testing.TB) (*testvalkey.ValkeyContainer, string) { + ctx := context.Background() + exposedPort := "6379/tcp" + waitReadyCmd := []string{ + "valkey-cli", + "ping", + } + + opts := []testcontainers.ContainerCustomizer{ + testcontainers.WithLogger(tclog.TestLogger(t)), + WithTestLogConsumer(t), + testcontainers.WithWaitStrategy( + wait.ForAll( + wait.ForLog("* Ready to accept connections"), + wait.ForExposedPort(), + wait.ForListeningPort(nat.Port(exposedPort)), + wait.ForExec(waitReadyCmd), + ), + ), + // attempt to reuse this container + testcontainers.CustomizeRequest(testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Name: "valkey", + Hostname: "localhost", + }, + Started: true, + Reuse: true, + }), + } + + container, err := testvalkey.Run(ctx, "valkey/valkey:8-alpine", opts...) + AssertTestContainersError(t, err) + RegisterContainerCleanup(t, container) + + connStr, err := container.ConnectionString(ctx) + require.NoError(t, err) + + valkeyURL, err := url.Parse(connStr) + require.NoError(t, err) + + return container, valkeyURL.Host +} diff --git a/instrumentation/testutils/grpc/fixturepb/fixture.go b/instrumentation/testutils/grpc/fixturepb/fixture.go new file mode 100644 index 0000000000..215bb9d029 --- /dev/null +++ b/instrumentation/testutils/grpc/fixturepb/fixture.go @@ -0,0 +1,76 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +//go:generate sh ./gen_proto.sh . + +package fixturepb + +import ( + "context" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" + "google.golang.org/grpc/status" +) + +// FixtureSrv a dummy implementation of FixtureServer. +type FixtureSrv struct { + UnimplementedFixtureServer + LastRequestMetadata atomic.Value +} + +func NewFixtureServer() *FixtureSrv { + return &FixtureSrv{} +} + +func (s *FixtureSrv) StreamPing(stream Fixture_StreamPingServer) (err error) { + for { + msg, err := stream.Recv() + if err != nil { + return err + } + + reply, err := s.Ping(stream.Context(), msg) + if err != nil { + return err + } + + err = stream.Send(reply) + if err != nil { + return err + } + + if msg.Name == "break" { + return nil + } + } +} + +func (s *FixtureSrv) Ping(ctx context.Context, in *FixtureRequest) (*FixtureReply, error) { + if md, ok := metadata.FromIncomingContext(ctx); ok { + s.LastRequestMetadata.Store(md) + } + switch { + case in.Name == "child": + span, _ := tracer.StartSpanFromContext(ctx, "child") + span.Finish() + return &FixtureReply{Message: "child"}, nil + case in.Name == "disabled": + if _, ok := tracer.SpanFromContext(ctx); ok { + panic("should be disabled") + } + return &FixtureReply{Message: "disabled"}, nil + case in.Name == "invalid": + return nil, status.Error(codes.InvalidArgument, "invalid") + case in.Name == "errorDetails": + s, _ := status.New(codes.Unknown, "unknown"). + WithDetails(&FixtureReply{Message: "a"}, &FixtureReply{Message: "b"}) + return nil, s.Err() + } + return &FixtureReply{Message: "passed"}, nil +} diff --git a/contrib/google.golang.org/grpc/fixtures_test.pb.go b/instrumentation/testutils/grpc/fixturepb/fixture.pb.go similarity index 54% rename from contrib/google.golang.org/grpc/fixtures_test.pb.go rename to instrumentation/testutils/grpc/fixturepb/fixture.pb.go index 0ffa6edf3d..f4ad5d9216 100644 --- a/contrib/google.golang.org/grpc/fixtures_test.pb.go +++ b/instrumentation/testutils/grpc/fixturepb/fixture.pb.go @@ -5,11 +5,11 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v5.26.1 -// source: fixtures_test.proto +// protoc-gen-go v1.31.0 +// protoc v5.27.3 +// source: fixture.proto -package grpc +package fixturepb import ( protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -37,7 +37,7 @@ type FixtureRequest struct { func (x *FixtureRequest) Reset() { *x = FixtureRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fixtures_test_proto_msgTypes[0] + mi := &file_fixture_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -50,7 +50,7 @@ func (x *FixtureRequest) String() string { func (*FixtureRequest) ProtoMessage() {} func (x *FixtureRequest) ProtoReflect() protoreflect.Message { - mi := &file_fixtures_test_proto_msgTypes[0] + mi := &file_fixture_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -63,7 +63,7 @@ func (x *FixtureRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use FixtureRequest.ProtoReflect.Descriptor instead. func (*FixtureRequest) Descriptor() ([]byte, []int) { - return file_fixtures_test_proto_rawDescGZIP(), []int{0} + return file_fixture_proto_rawDescGZIP(), []int{0} } func (x *FixtureRequest) GetName() string { @@ -85,7 +85,7 @@ type FixtureReply struct { func (x *FixtureReply) Reset() { *x = FixtureReply{} if protoimpl.UnsafeEnabled { - mi := &file_fixtures_test_proto_msgTypes[1] + mi := &file_fixture_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -98,7 +98,7 @@ func (x *FixtureReply) String() string { func (*FixtureReply) ProtoMessage() {} func (x *FixtureReply) ProtoReflect() protoreflect.Message { - mi := &file_fixtures_test_proto_msgTypes[1] + mi := &file_fixture_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -111,7 +111,7 @@ func (x *FixtureReply) ProtoReflect() protoreflect.Message { // Deprecated: Use FixtureReply.ProtoReflect.Descriptor instead. func (*FixtureReply) Descriptor() ([]byte, []int) { - return file_fixtures_test_proto_rawDescGZIP(), []int{1} + return file_fixture_proto_rawDescGZIP(), []int{1} } func (x *FixtureReply) GetMessage() string { @@ -121,51 +121,52 @@ func (x *FixtureReply) GetMessage() string { return "" } -var File_fixtures_test_proto protoreflect.FileDescriptor - -var file_fixtures_test_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x66, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x67, 0x72, 0x70, 0x63, 0x22, 0x24, 0x0a, 0x0e, 0x46, - 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x7b, 0x0a, 0x07, 0x46, - 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x14, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, 0x78, 0x74, - 0x75, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x0a, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, +var File_fixture_proto protoreflect.FileDescriptor + +var file_fixture_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x66, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x04, 0x67, 0x72, 0x70, 0x63, 0x22, 0x24, 0x0a, 0x0e, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x28, 0x0a, 0x0c, 0x46, + 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0x7b, 0x0a, 0x07, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x32, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6c, 0x0a, 0x19, 0x69, 0x6f, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x74, 0x65, 0x73, - 0x74, 0x67, 0x72, 0x70, 0x63, 0x42, 0x0d, 0x54, 0x65, 0x73, 0x74, 0x47, 0x52, 0x50, 0x43, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x6f, 0x70, 0x6b, 0x67, 0x2e, 0x69, 0x6e, - 0x2f, 0x44, 0x61, 0x74, 0x61, 0x44, 0x6f, 0x67, 0x2f, 0x64, 0x64, 0x2d, 0x74, 0x72, 0x61, 0x63, - 0x65, 0x2d, 0x67, 0x6f, 0x2e, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x2f, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, - 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, + 0x46, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x28, 0x01, + 0x30, 0x01, 0x42, 0x7e, 0x0a, 0x19, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x65, 0x78, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x67, 0x72, 0x70, 0x63, 0x42, + 0x0d, 0x54, 0x65, 0x73, 0x74, 0x47, 0x52, 0x50, 0x43, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x61, 0x74, + 0x61, 0x44, 0x6f, 0x67, 0x2f, 0x64, 0x64, 0x2d, 0x74, 0x72, 0x61, 0x63, 0x65, 0x2d, 0x67, 0x6f, + 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x69, 0x62, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x66, 0x69, 0x78, 0x74, 0x75, 0x72, 0x65, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_fixtures_test_proto_rawDescOnce sync.Once - file_fixtures_test_proto_rawDescData = file_fixtures_test_proto_rawDesc + file_fixture_proto_rawDescOnce sync.Once + file_fixture_proto_rawDescData = file_fixture_proto_rawDesc ) -func file_fixtures_test_proto_rawDescGZIP() []byte { - file_fixtures_test_proto_rawDescOnce.Do(func() { - file_fixtures_test_proto_rawDescData = protoimpl.X.CompressGZIP(file_fixtures_test_proto_rawDescData) +func file_fixture_proto_rawDescGZIP() []byte { + file_fixture_proto_rawDescOnce.Do(func() { + file_fixture_proto_rawDescData = protoimpl.X.CompressGZIP(file_fixture_proto_rawDescData) }) - return file_fixtures_test_proto_rawDescData + return file_fixture_proto_rawDescData } -var file_fixtures_test_proto_msgTypes = make([]protoimpl.MessageInfo, 2) -var file_fixtures_test_proto_goTypes = []interface{}{ +var file_fixture_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_fixture_proto_goTypes = []interface{}{ (*FixtureRequest)(nil), // 0: grpc.FixtureRequest (*FixtureReply)(nil), // 1: grpc.FixtureReply } -var file_fixtures_test_proto_depIdxs = []int32{ +var file_fixture_proto_depIdxs = []int32{ 0, // 0: grpc.Fixture.Ping:input_type -> grpc.FixtureRequest 0, // 1: grpc.Fixture.StreamPing:input_type -> grpc.FixtureRequest 1, // 2: grpc.Fixture.Ping:output_type -> grpc.FixtureReply @@ -177,13 +178,13 @@ var file_fixtures_test_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for field type_name } -func init() { file_fixtures_test_proto_init() } -func file_fixtures_test_proto_init() { - if File_fixtures_test_proto != nil { +func init() { file_fixture_proto_init() } +func file_fixture_proto_init() { + if File_fixture_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_fixtures_test_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_fixture_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FixtureRequest); i { case 0: return &v.state @@ -195,7 +196,7 @@ func file_fixtures_test_proto_init() { return nil } } - file_fixtures_test_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_fixture_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FixtureReply); i { case 0: return &v.state @@ -212,18 +213,18 @@ func file_fixtures_test_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_fixtures_test_proto_rawDesc, + RawDescriptor: file_fixture_proto_rawDesc, NumEnums: 0, NumMessages: 2, NumExtensions: 0, NumServices: 1, }, - GoTypes: file_fixtures_test_proto_goTypes, - DependencyIndexes: file_fixtures_test_proto_depIdxs, - MessageInfos: file_fixtures_test_proto_msgTypes, + GoTypes: file_fixture_proto_goTypes, + DependencyIndexes: file_fixture_proto_depIdxs, + MessageInfos: file_fixture_proto_msgTypes, }.Build() - File_fixtures_test_proto = out.File - file_fixtures_test_proto_rawDesc = nil - file_fixtures_test_proto_goTypes = nil - file_fixtures_test_proto_depIdxs = nil + File_fixture_proto = out.File + file_fixture_proto_rawDesc = nil + file_fixture_proto_goTypes = nil + file_fixture_proto_depIdxs = nil } diff --git a/contrib/google.golang.org/grpc/fixtures_test_grpc.pb.go b/instrumentation/testutils/grpc/fixturepb/fixture_grpc.pb.go similarity index 98% rename from contrib/google.golang.org/grpc/fixtures_test_grpc.pb.go rename to instrumentation/testutils/grpc/fixturepb/fixture_grpc.pb.go index 95509e9025..c0081b9bbd 100644 --- a/contrib/google.golang.org/grpc/fixtures_test_grpc.pb.go +++ b/instrumentation/testutils/grpc/fixturepb/fixture_grpc.pb.go @@ -6,10 +6,10 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 -// source: fixtures_test.proto +// - protoc v5.27.3 +// source: fixture.proto -package grpc +package fixturepb import ( context "context" @@ -180,5 +180,5 @@ var Fixture_ServiceDesc = grpc.ServiceDesc{ ClientStreams: true, }, }, - Metadata: "fixtures_test.proto", + Metadata: "fixture.proto", } diff --git a/contrib/google.golang.org/grpc/gen_proto.sh b/instrumentation/testutils/grpc/fixturepb/gen_proto.sh similarity index 69% rename from contrib/google.golang.org/grpc/gen_proto.sh rename to instrumentation/testutils/grpc/fixturepb/gen_proto.sh index 42e611a8eb..173995287e 100755 --- a/contrib/google.golang.org/grpc/gen_proto.sh +++ b/instrumentation/testutils/grpc/fixturepb/gen_proto.sh @@ -1,4 +1,8 @@ -#!/bin/sh +#!/bin/bash +set -euo pipefail + +OUT_DIR=$1 +cd "${OUT_DIR}" YEAR=$(date +'%Y') COPYRIGHT_HEADER="// Unless explicitly stated otherwise all files in this repository are licensed @@ -7,10 +11,10 @@ COPYRIGHT_HEADER="// Unless explicitly stated otherwise all files in this reposi // Copyright ${YEAR} Datadog, Inc. " -go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.33.0 -go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0 +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +export PATH="${SCRIPT_DIR}/../../../../bin:${PATH}" -protoc fixtures_test.proto \ +protoc fixture.proto \ --go_out=. \ --go_opt=paths=source_relative \ --go-grpc_out=. \ diff --git a/instrumentation/testutils/grpc/go.mod b/instrumentation/testutils/grpc/go.mod new file mode 100644 index 0000000000..f7bc9ce126 --- /dev/null +++ b/instrumentation/testutils/grpc/go.mod @@ -0,0 +1,89 @@ +module github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + google.golang.org/grpc v1.75.0 + google.golang.org/protobuf v1.36.7 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/instrumentation/testutils/grpc/go.sum b/instrumentation/testutils/grpc/go.sum new file mode 100644 index 0000000000..caa4165cda --- /dev/null +++ b/instrumentation/testutils/grpc/go.sum @@ -0,0 +1,309 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/contrib/internal/sqltest/sqltest.go b/instrumentation/testutils/sql/sql.go similarity index 92% rename from contrib/internal/sqltest/sqltest.go rename to instrumentation/testutils/sql/sql.go index 35dbd1ddd0..5bf2474657 100644 --- a/contrib/internal/sqltest/sqltest.go +++ b/instrumentation/testutils/sql/sql.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package sqltest // import "gopkg.in/DataDog/dd-trace-go.v1/contrib/internal/sqltest" +package sql import ( "context" @@ -12,9 +12,9 @@ import ( "log" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" "github.com/stretchr/testify/assert" ) @@ -124,7 +124,7 @@ func testQuery(cfg *Config) func(*testing.T) { assert.Nil(err) spans := cfg.mockTracer.FinishedSpans() - var querySpan mocktracer.Span + var querySpan *mocktracer.Span if cfg.DriverName == "sqlserver" { //The mssql driver doesn't support non-prepared queries so there are 3 spans //connect, prepare, and query @@ -240,11 +240,12 @@ func testExec(cfg *Config) func(*testing.T) { ) cfg.mockTracer.Reset() - tx, err := cfg.DB.BeginTx(ctx, nil) + tx, err := cfg.DB.BeginTx(ctx, nil) // Generates 2 spans with `sql.query_type` Connect & Begin assert.Equal(nil, err) + // Generates 1 span with `sql.query_type` Exec, but 3 spans for the mssql driver (Prepare, Exec, Close) _, err = tx.ExecContext(ctx, query) assert.Equal(nil, err) - err = tx.Commit() + err = tx.Commit() // Generates 1 span with `sql.query_type` Commit assert.Equal(nil, err) parent.Finish() // flush children @@ -253,7 +254,7 @@ func testExec(cfg *Config) func(*testing.T) { if cfg.DriverName == "sqlserver" { //The mssql driver doesn't support non-prepared exec so there are 2 extra spans for the exec: //prepare, exec, and then a close - assert.Len(spans, 7) + assert.Len(spans, 6) span := spans[2] cfg.ExpectTags["sql.query_type"] = "Prepare" assert.Equal(cfg.ExpectName, span.OperationName()) @@ -267,10 +268,10 @@ func testExec(cfg *Config) func(*testing.T) { assert.Equal(v, span.Tag(k), "Value mismatch on tag %s", k) } } else { - assert.Len(spans, 5) + assert.Len(spans, 4) } - var span mocktracer.Span + var span *mocktracer.Span for _, s := range spans { if s.OperationName() == cfg.ExpectName && s.Tag(ext.ResourceName) == query { span = s @@ -294,7 +295,7 @@ func testExec(cfg *Config) func(*testing.T) { } } -func verifyConnectSpan(span mocktracer.Span, assert *assert.Assertions, cfg *Config) { +func verifyConnectSpan(span *mocktracer.Span, assert *assert.Assertions, cfg *Config) { assert.Equal(cfg.ExpectName, span.OperationName()) cfg.ExpectTags["sql.query_type"] = "Connect" for k, v := range cfg.ExpectTags { diff --git a/instrumentation/testutils/testtracer/testtracer.go b/instrumentation/testutils/testtracer/testtracer.go new file mode 100644 index 0000000000..2cfe3fa6db --- /dev/null +++ b/instrumentation/testutils/testtracer/testtracer.go @@ -0,0 +1,475 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package testtracer provides a wrapper over the ddtrace/tracer package with a mocked transport that allows to inspect +// traces while keeping the rest of the tracer logic the same. +package testtracer + +import ( + "bytes" + "context" + "encoding/json" + "io" + "net/http" + "strings" + "sync" + "testing" + "time" + + llmobstransport "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tinylib/msgp/msgp" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +// AgentInfo defines the response from the agent /info endpoint. +type AgentInfo struct { + Endpoints []string `json:"endpoints"` + ClientDropP0s bool `json:"client_drop_p0s"` + FeatureFlags []string `json:"feature_flags"` + PeerTags []string `json:"peer_tags"` + SpanMetaStruct bool `json:"span_meta_structs"` + ObfuscationVersion int `json:"obfuscation_version"` + Config AgentConfig `json:"config"` +} + +// AgentConfig defines the agent config. +type AgentConfig struct { + StatsdPort int `json:"statsd_port"` +} + +// Span defines a span with the same format as it is sent to the agent. +type Span struct { + Name string `json:"name"` + Service string `json:"service"` + Resource string `json:"resource"` + Type string `json:"type"` + Start int64 `json:"start"` + Duration int64 `json:"duration"` + Meta map[string]string `json:"meta"` + MetaStruct map[string]any `json:"meta_struct"` + Metrics map[string]float64 `json:"metrics"` + SpanID uint64 `json:"span_id"` + TraceID uint64 `json:"trace_id"` + ParentID uint64 `json:"parent_id"` + Error int32 `json:"error"` + SpanLinks []SpanLink `json:"span_links"` +} + +// SpanLink defines a span link with the same format as it is sent to the agent. +type SpanLink struct { + TraceID uint64 `json:"trace_id"` + TraceIDHigh uint64 `json:"trace_id_high"` + SpanID uint64 `json:"span_id"` + Attributes map[string]string `json:"attributes"` + Tracestate string `json:"tracestate"` + Flags uint32 `json:"flags"` +} + +// LLMObsSpan is an alias for the LLMObs span event type. +type LLMObsSpan = llmobstransport.LLMObsSpanEvent + +// LLMObsMetric is an alias for the LLMObs metric type. +type LLMObsMetric = llmobstransport.LLMObsMetric + +// MockResponseFunc is a function to return mock responses. +type MockResponseFunc func(*http.Request) *http.Response + +// Payloads contains all captured payloads organized by type. +type Payloads struct { + mu sync.RWMutex + Spans []Span + LLMSpans []LLMObsSpan + LLMMetrics []LLMObsMetric +} + +// WaitCondition is a function that checks if the wait condition is met. +// It receives the current payloads and returns true if waiting should stop. +type WaitCondition func(*Payloads) bool + +// TestTracer is an inspectable tracer useful for tests. +type TestTracer struct { + startError error + payloads *Payloads + roundTripper *mockTransport +} + +// Start calls [tracer.Start] with a mocked transport and provides a new [TestTracer] that allows to inspect +// the spans produced by this application. +func Start(t testing.TB, opts ...Option) *TestTracer { + cfg := defaultConfig() + for _, opt := range opts { + opt(cfg) + } + + payloadChan := make(chan any) + payloads := &Payloads{} + + rt := &mockTransport{ + T: t, + payloadChan: payloadChan, + agentInfo: cfg.AgentInfoResponse, + mockResponse: cfg.MockResponse, + requestDelay: cfg.RequestDelay, + } + httpClient := &http.Client{ + Transport: rt, + } + tt := &TestTracer{ + payloads: payloads, + roundTripper: rt, + } + + // Start payload collector goroutine + go tt.collectPayloads(payloadChan) + t.Cleanup(tt.Stop) + + startOpts := append([]tracer.StartOption{ + tracer.WithEnv("TestTracer"), + tracer.WithService("TestTracer"), + tracer.WithServiceVersion("1.0.0"), + tracer.WithHTTPClient(httpClient), + tracer.WithLogger(&testLogger{T: t}), + }, cfg.TracerStartOpts...) + + err := tracer.Start(startOpts...) + if cfg.RequireNoError { + require.NoError(t, err) + } + tt.startError = err + return tt +} + +type config struct { + TracerStartOpts []tracer.StartOption + AgentInfoResponse AgentInfo + RequestDelay time.Duration + MockResponse MockResponseFunc + RequireNoError bool +} + +func defaultConfig() *config { + return &config{ + TracerStartOpts: nil, + AgentInfoResponse: AgentInfo{}, + RequestDelay: 0, + MockResponse: nil, + RequireNoError: true, + } +} + +// Option configures the TestTracer. +type Option func(*config) + +// WithTracerStartOpts allows to set [tracer.StartOption] on the tracer. +func WithTracerStartOpts(opts ...tracer.StartOption) Option { + return func(cfg *config) { + cfg.TracerStartOpts = append(cfg.TracerStartOpts, opts...) + } +} + +// WithAgentInfoResponse sets a custom /info agent response. It can be used to enable/disable certain features +// from the tracer that depend on whether the agent supports them or not. +func WithAgentInfoResponse(response AgentInfo) Option { + return func(cfg *config) { + cfg.AgentInfoResponse = response + } +} + +// WithRequestDelay introduces a fake delay in all requests. +func WithRequestDelay(delay time.Duration) Option { + return func(cfg *config) { + cfg.RequestDelay = delay + } +} + +// WithMockResponses allows setting a custom request handler for mocking HTTP responses. +// If the provided function returns nil, it fallbacks to the default behavior of returning empty 200 responses. +func WithMockResponses(mr MockResponseFunc) Option { + return func(cfg *config) { + cfg.MockResponse = mr + } +} + +// WithRequireNoTracerStartError allows to customize the behavior for the Start function. By default, it calls require.NoError +// on the error returned by tracer.Start, but that can be changed by using this option with false as argument. +func WithRequireNoTracerStartError(requireNoErr bool) Option { + return func(cfg *config) { + cfg.RequireNoError = requireNoErr + } +} + +// collectPayloads runs in a goroutine and collects payloads from the channel +func (tt *TestTracer) collectPayloads(payloadChan <-chan any) { + for payload := range payloadChan { + tt.payloads.mu.Lock() + switch p := payload.(type) { + case Span: + tt.payloads.Spans = append(tt.payloads.Spans, p) + case LLMObsSpan: + tt.payloads.LLMSpans = append(tt.payloads.LLMSpans, p) + case LLMObsMetric: + tt.payloads.LLMMetrics = append(tt.payloads.LLMMetrics, p) + } + tt.payloads.mu.Unlock() + } +} + +// StartError returns the error from tracer.Start. +func (tt *TestTracer) StartError() error { + return tt.startError +} + +// Stop stops the tracer. It should be called after the test finishes. +func (tt *TestTracer) Stop() { + tt.roundTripper.Stop() + tracer.Stop() +} + +// WaitFor waits for a condition to be met within the specified timeout. +// The condition function receives the current payloads and should return true when the wait should stop. +// It fails the test if the condition is not met within the timeout. +func (tt *TestTracer) WaitFor(t testing.TB, timeout time.Duration, cond WaitCondition) *Payloads { + // Force a flush so we don't need to wait for the default flush interval + tracer.Flush() + + timeoutChan := time.After(timeout) + ticker := time.NewTicker(10 * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + tt.payloads.mu.RLock() + if cond(tt.payloads) { + tt.payloads.mu.RUnlock() + return tt.payloads + } + tt.payloads.mu.RUnlock() + case <-timeoutChan: + tt.payloads.mu.RLock() + assert.FailNowf(t, "timeout waiting for condition", + "Current payloads: %d spans, %d LLM spans, %d LLM metrics", + len(tt.payloads.Spans), len(tt.payloads.LLMSpans), len(tt.payloads.LLMMetrics)) + tt.payloads.mu.RUnlock() + } + } +} + +// WaitForSpans waits for the specified number of spans to be captured. +// It returns the captured spans or fails the test if the timeout is reached. +func (tt *TestTracer) WaitForSpans(t *testing.T, count int) []Span { + if count == 0 { + return nil + } + p := tt.WaitFor(t, 5*time.Second, func(p *Payloads) bool { + return len(p.Spans) >= count + }) + return p.Spans +} + +// WaitForLLMObsSpans waits for the specified number of LLMObs spans to be captured. +// It returns the captured LLMObs spans or fails the test if the timeout is reached. +func (tt *TestTracer) WaitForLLMObsSpans(t *testing.T, count int) []LLMObsSpan { + if count == 0 { + return nil + } + p := tt.WaitFor(t, 5*time.Second, func(p *Payloads) bool { + return len(p.LLMSpans) >= count + }) + return p.LLMSpans +} + +// WaitForLLMObsMetrics waits for the specified number of LLMObs metrics to be captured. +// It returns the captured LLMObs metrics or fails the test if the timeout is reached. +func (tt *TestTracer) WaitForLLMObsMetrics(t *testing.T, count int) []LLMObsMetric { + if count == 0 { + return nil + } + p := tt.WaitFor(t, 5*time.Second, func(p *Payloads) bool { + return len(p.LLMMetrics) >= count + }) + return p.LLMMetrics +} + +// SentPayloads returns a thread-safe copy of all captured payloads. +func (tt *TestTracer) SentPayloads() Payloads { + tt.payloads.mu.RLock() + defer tt.payloads.mu.RUnlock() + + return Payloads{ + Spans: append([]Span(nil), tt.payloads.Spans...), + LLMSpans: append([]LLMObsSpan(nil), tt.payloads.LLMSpans...), + LLMMetrics: append([]LLMObsMetric(nil), tt.payloads.LLMMetrics...), + } +} + +type mockTransport struct { + T testing.TB + payloadChan chan<- any + mu sync.RWMutex + finished bool + agentInfo AgentInfo + requestDelay time.Duration + mockResponse MockResponseFunc +} + +func (rt *mockTransport) RoundTrip(r *http.Request) (*http.Response, error) { + time.Sleep(rt.requestDelay) + return rt.handleRequest(r), nil +} + +func (rt *mockTransport) Stop() { + rt.mu.Lock() + defer rt.mu.Unlock() + if rt.finished { + return + } + rt.finished = true + close(rt.payloadChan) +} + +var noLogPaths = []string{ + "/v0.7/config", + "/telemetry/proxy/api/v2/apmtelemetry", + "/api/unstable/llm-obs/v1/", +} + +func (rt *mockTransport) handleRequest(r *http.Request) *http.Response { + rt.mu.RLock() + defer rt.mu.RUnlock() + if rt.finished { + return rt.emptyResponse(r) + } + + var resp *http.Response + + if rt.mockResponse != nil { + resp = rt.mockResponse(r) + if resp != nil { + return resp + } + } + resp = rt.emptyResponse(r) + + switch r.URL.Path { + case "/v0.4/traces": + rt.handleTraces(r) + case "/info": + resp = rt.handleInfo(r) + case "/evp_proxy/v2/api/v2/llmobs", "/api/v2/llmobs": + rt.handleLLMObsSpanEvents(r) + case "/evp_proxy/v2/api/intake/llm-obs/v2/eval-metric", "/api/intake/llm-obs/v2/eval-metric": + rt.handleLLMObsEvalMetrics(r) + default: + logWarn := true + for _, p := range noLogPaths { + if r.URL.Path == p || strings.Contains(r.URL.Path, p) { + logWarn = false + break + } + } + if logWarn { + rt.T.Logf("testtracer: received request to a non-implemented path: %s", r.URL.Path) + } + } + return resp +} + +func (rt *mockTransport) emptyResponse(r *http.Request) *http.Response { + resp := &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{}`)), + Request: r, + } + resp.Header.Set("Content-Type", "application/json") + return resp +} + +func (rt *mockTransport) handleInfo(r *http.Request) *http.Response { + data, err := json.Marshal(rt.agentInfo) + require.NoError(rt.T, err) + + resp := &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(data)), + Request: r, + } + resp.Header.Set("Content-Type", "application/json") + return resp +} + +func (rt *mockTransport) handleTraces(r *http.Request) { + req := r.Clone(context.Background()) + defer req.Body.Close() + + buf, err := io.ReadAll(req.Body) + require.NoError(rt.T, err) + + var payload bytes.Buffer + _, err = msgp.UnmarshalAsJSON(&payload, buf) + require.NoError(rt.T, err) + + var traces [][]Span + err = json.Unmarshal(payload.Bytes(), &traces) + require.NoError(rt.T, err) + + if len(traces) == 0 { + return + } + for _, spans := range traces { + for _, span := range spans { + rt.payloadChan <- span + } + } +} + +func (rt *mockTransport) handleLLMObsSpanEvents(r *http.Request) { + req := r.Clone(context.Background()) + defer req.Body.Close() + + buf, err := io.ReadAll(req.Body) + require.NoError(rt.T, err) + + var payload []llmobstransport.PushSpanEventsRequest + err = json.Unmarshal(buf, &payload) + require.NoError(rt.T, err) + + for _, p := range payload { + for _, span := range p.Spans { + rt.payloadChan <- *span + } + } +} + +func (rt *mockTransport) handleLLMObsEvalMetrics(r *http.Request) { + req := r.Clone(context.Background()) + defer req.Body.Close() + + buf, err := io.ReadAll(req.Body) + require.NoError(rt.T, err) + + var payload llmobstransport.PushMetricsRequest + err = json.Unmarshal(buf, &payload) + require.NoError(rt.T, err) + + for _, metric := range payload.Data.Attributes.Metrics { + rt.payloadChan <- *metric + } +} + +type testLogger struct { + T testing.TB +} + +func (l *testLogger) Log(msg string) { + l.T.Log(msg) +} diff --git a/instrumentation/testutils/testutils.go b/instrumentation/testutils/testutils.go new file mode 100644 index 0000000000..e63c30713d --- /dev/null +++ b/instrumentation/testutils/testutils.go @@ -0,0 +1,126 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package testutils + +import ( + "sync" + "testing" + "unsafe" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/normalizer" + "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +func SetGlobalServiceName(t *testing.T, val string) { + t.Helper() + prev := globalconfig.ServiceName() + t.Cleanup(func() { + globalconfig.SetServiceName(prev) + }) + globalconfig.SetServiceName(val) +} + +func SetGlobalAnalyticsRate(t *testing.T, val float64) { + t.Helper() + prev := globalconfig.AnalyticsRate() + t.Cleanup(func() { + globalconfig.SetAnalyticsRate(prev) + }) + globalconfig.SetAnalyticsRate(val) +} + +func SetGlobalDogstatsdAddr(t *testing.T, val string) { + t.Helper() + prev := globalconfig.DogstatsdAddr() + t.Cleanup(func() { + globalconfig.SetDogstatsdAddr(prev) + }) + globalconfig.SetDogstatsdAddr(val) +} + +func SetGlobalHeaderTags(t *testing.T, headers ...string) { + t.Helper() + + setValue := func(val []string) { + globalconfig.ClearHeaderTags() + for _, h := range val { + header, tag := normalizer.HeaderTag(h) + globalconfig.SetHeaderTag(header, tag) + } + } + + var prev []string + globalconfig.HeaderTagMap().Iter(func(_ string, tag string) { + prev = append(prev, tag) + }) + + t.Cleanup(func() { + setValue(prev) + }) + setValue(headers) +} + +func StartAppSec(t *testing.T, opts ...config.StartOption) { + appsec.Start(opts...) + t.Cleanup(appsec.Stop) +} + +func StartAppSecBench(b *testing.B) { + // maximize rate limit to prevent the spam of "too many WAF events" errors + // 1000000000 = time.Second.Nanoseconds() is the largest value that we are able to set here + b.Setenv("DD_APPSEC_TRACE_RATE_LIMIT", "1000000000") + appsec.Start() + b.Cleanup(appsec.Stop) +} + +type discardLogger struct{} + +func (d discardLogger) Log(_ string) {} + +func DiscardLogger() tracer.Logger { + return discardLogger{} +} + +type MockStatsdClient = statsdtest.TestStatsdClient + +func NewMockStatsdClient() *MockStatsdClient { + return &MockStatsdClient{} +} + +// SetPropagatingTag sets a tag on the given span context. It assumes it comes from a span, +// so it has a trace attached to it. +func SetPropagatingTag(t testing.TB, ctx *tracer.SpanContext, k, v string) { + t.Helper() + + // Forgive us for the following hack, oh great and powerful GODpher. + // Assuming the context contains a trace, we extract it by cookie-cutting it. + // It's easier than using offsets when the desired data isn't far away from + // the struct's beginning. + type cookieCutter struct { + _ bool // spanContext.updated + trace *struct { + _ sync.RWMutex // trace.mu + _ []any // trace.spans + _ map[string]string // trace.tags + propagatingTags map[string]string // trace level tags that will be propagated across service boundaries + } + } + ptr := uintptr(unsafe.Pointer(ctx)) + cc := (*cookieCutter)(*(*unsafe.Pointer)(unsafe.Pointer(&ptr))) + cc.trace.propagatingTags[k] = v +} + +// FlushTelemetry flushes any pending telemetry data. +func FlushTelemetry() { + if client := telemetry.GlobalClient(); client != nil { + client.Flush() + } +} diff --git a/instrumentation/testutils/testutils_test.go b/instrumentation/testutils/testutils_test.go new file mode 100644 index 0000000000..36ea2e8bbe --- /dev/null +++ b/instrumentation/testutils/testutils_test.go @@ -0,0 +1,43 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package testutils_test + +import ( + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/stretchr/testify/require" +) + +func TestSetPropagatingTag(t *testing.T) { + t.Run("propagating tag is set", func(t *testing.T) { + tracer.Start() + defer tracer.Stop() + + span := tracer.StartSpan("test") + defer span.Finish() + + ctx := span.Context() + testutils.SetPropagatingTag(t, ctx, "test", "test") + + dst := map[string]string{} + carrier := tracer.TextMapCarrier(dst) + tracer.Inject(ctx, &carrier) + + propagatingTags := strings.Split(dst["x-datadog-tags"], ",") + require.NotEmpty(t, propagatingTags) + require.Contains(t, propagatingTags, "test=test") + }) + t.Run("panics", func(t *testing.T) { + require.Panics(t, func() { + ctx := tracer.SpanContext{} + // No trace attached to the context, it will panic + testutils.SetPropagatingTag(t, &ctx, "test", "test") + }) + }) +} diff --git a/internal/agent.go b/internal/agent.go index f4bcdce8b0..561ba20db8 100644 --- a/internal/agent.go +++ b/internal/agent.go @@ -7,10 +7,13 @@ package internal import ( "net" + "net/http" "net/url" "os" + "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const ( @@ -31,10 +34,10 @@ var DefaultTraceAgentUDSPath = "/var/run/datadog/apm.socket" // - Then, DefaultTraceAgentUDSPath, if the path exists // - Finally, localhost:8126 func AgentURLFromEnv() *url.URL { - if agentURL := os.Getenv("DD_TRACE_AGENT_URL"); agentURL != "" { + if agentURL := env.Get("DD_TRACE_AGENT_URL"); agentURL != "" { u, err := url.Parse(agentURL) if err != nil { - log.Warn("Failed to parse DD_TRACE_AGENT_URL: %v", err) + log.Warn("Failed to parse DD_TRACE_AGENT_URL: %s", err.Error()) } else { switch u.Scheme { case "unix", "http", "https": @@ -45,8 +48,8 @@ func AgentURLFromEnv() *url.URL { } } - host, providedHost := os.LookupEnv("DD_AGENT_HOST") - port, providedPort := os.LookupEnv("DD_TRACE_AGENT_PORT") + host, providedHost := env.Lookup("DD_AGENT_HOST") + port, providedPort := env.Lookup("DD_TRACE_AGENT_PORT") if host == "" { // We treat set but empty the same as unset providedHost = false @@ -73,3 +76,26 @@ func AgentURLFromEnv() *url.URL { } return httpURL } + +func DefaultDialer(timeout time.Duration) *net.Dialer { + return &net.Dialer{ + Timeout: timeout, + KeepAlive: 30 * time.Second, + DualStack: true, + } +} + +func DefaultHTTPClient(timeout time.Duration, disableKeepAlives bool) *http.Client { + return &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: DefaultDialer(timeout).DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + DisableKeepAlives: disableKeepAlives, + }, + Timeout: timeout, + } +} diff --git a/internal/apps/Dockerfile b/internal/apps/Dockerfile index 35993e4c94..684ca8a0a5 100644 --- a/internal/apps/Dockerfile +++ b/internal/apps/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.23 +FROM golang:1.24 COPY . /dd-trace-go WORKDIR /dd-trace-go/internal/apps # -t will download all dependencies, including test dependencies diff --git a/internal/apps/README.md b/internal/apps/README.md index fe7ce20b18..0200b986c1 100644 --- a/internal/apps/README.md +++ b/internal/apps/README.md @@ -39,6 +39,7 @@ docker-compose run --build scenario memory-leak/heap$ ``` Note: +* Datadog employees should prefer using [dd-auth](https://datadoghq.atlassian.net/wiki/spaces/COBS/pages/4094591351/Datadog+Authentication+CLI+dd-auth-cli+dd-auth) over setting `DD_API_KEY` manually. * The default destination site is prod. Set `export DD_SITE=datad0g.com` to send the data to staging. * You can pass `-e DD_TEST_APPS_TOTAL_DURATION=120s` and similar vars to `docker-compose`, see [scenario_test.go](./scenario_test.go) for the available vars. diff --git a/internal/apps/apps.go b/internal/apps/apps.go index a0eb8157ff..4a47a724c0 100644 --- a/internal/apps/apps.go +++ b/internal/apps/apps.go @@ -15,8 +15,9 @@ import ( "os/signal" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/profiler" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/env" + "github.com/DataDog/dd-trace-go/v2/profiler" ) // Config is the configuration for a test app used by RunHTTP. @@ -38,10 +39,15 @@ func (c *Config) RunHTTP(handler func() http.Handler) { flag.Parse() // Configure non-stop execution tracing by default - if v := os.Getenv("DD_PROFILING_EXECUTION_TRACE_PERIOD"); v == "" && !c.DisableExecutionTracing { + if v := env.Get("DD_PROFILING_EXECUTION_TRACE_PERIOD"); v == "" && !c.DisableExecutionTracing { os.Setenv("DD_PROFILING_EXECUTION_TRACE_PERIOD", "1s") } + // Enabled runtime metrics v2 by default + if v := env.Get("DD_RUNTIME_METRICS_V2_ENABLED"); v == "" { + os.Setenv("DD_RUNTIME_METRICS_V2_ENABLED", "true") + } + // Setup context that gets canceled on receiving SIGINT ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() @@ -61,14 +67,14 @@ func (c *Config) RunHTTP(handler func() http.Handler) { profiler.GoroutineProfile, ), ); err != nil { - log.Fatalf("failed to start profiler: %s", err) + log.Fatalf("failed to start profiler: %s", err.Error()) } defer profiler.Stop() // Start http server l, err := net.Listen("tcp", *httpF) if err != nil { - log.Fatalf("failed to listen: %s", err) + log.Fatalf("failed to listen: %s", err.Error()) } defer l.Close() c.httpAddr = l.Addr() diff --git a/internal/apps/gc-overhead/main.go b/internal/apps/gc-overhead/main.go index fd6fc567fe..23eab1a1c4 100644 --- a/internal/apps/gc-overhead/main.go +++ b/internal/apps/gc-overhead/main.go @@ -24,8 +24,8 @@ import ( "sync" "time" - "github.com/DataDog/dd-trace-go/internal/apps" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/internal/apps/v2" ) func main() { diff --git a/internal/apps/go.mod b/internal/apps/go.mod index 95996c44a0..2a56eeb892 100644 --- a/internal/apps/go.mod +++ b/internal/apps/go.mod @@ -1,57 +1,103 @@ -module github.com/DataDog/dd-trace-go/internal/apps +module github.com/DataDog/dd-trace-go/internal/apps/v2 -go 1.23.0 +go 1.24.0 require ( - golang.org/x/sync v0.7.0 - gopkg.in/DataDog/dd-trace-go.v1 v1.64.0 + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + golang.org/x/sync v0.17.0 ) require ( - github.com/DataDog/appsec-internal-go v1.8.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.4.0 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 // indirect - github.com/ebitengine/purego v0.6.0-alpha.5 // indirect - github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 // indirect - github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/kr/pretty v0.3.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/rogpeppe/go-internal v1.8.1 // indirect - github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/tools v0.22.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/text v0.30.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) require ( - github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect - github.com/DataDog/datadog-go/v5 v5.3.0 // indirect - github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect github.com/DataDog/gostackparse v0.7.0 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b // indirect - github.com/google/uuid v1.5.0 // indirect - github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 // indirect - github.com/pkg/errors v0.9.1 // indirect - github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/stretchr/testify v1.9.0 - github.com/tinylib/msgp v1.2.1 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/time v0.3.0 // indirect + github.com/stretchr/testify v1.11.1 + golang.org/x/sys v0.37.0 // indirect + golang.org/x/time v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect ) -// use local version of dd-trace-go -replace gopkg.in/DataDog/dd-trace-go.v1 => ../.. +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../contrib/net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../.. diff --git a/internal/apps/go.sum b/internal/apps/go.sum index 50cbaff7fe..025bdb5ac3 100644 --- a/internal/apps/go.sum +++ b/internal/apps/go.sum @@ -1,106 +1,139 @@ -github.com/DataDog/appsec-internal-go v1.8.0 h1:1Tfn3LEogntRqZtf88twSApOCAAO3V+NILYhuQIo4J4= -github.com/DataDog/appsec-internal-go v1.8.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 h1:bUMSNsw1iofWiju9yc1f+kBd33E3hMJtq9GuU602Iy8= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= -github.com/DataDog/datadog-go/v5 v5.3.0 h1:2q2qjFOb3RwAZNU+ez27ZVDwErJv5/VpbBPprz7Z+s8= -github.com/DataDog/datadog-go/v5 v5.3.0/go.mod h1:XRDJk1pTc00gm+ZDiBKsjh7oOOtJfYfglVCmFb8C2+Q= -github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= -github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= -github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= -github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 h1:8EXxF+tCLqaVk8AOC29zl2mnhQjwyLxxOTuhUazWRsg= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4/go.mod h1:I5sHm0Y0T1u5YjlyqC5GVArM7aNZRUYtTjmJ8mPJFds= -github.com/ebitengine/purego v0.6.0-alpha.5 h1:EYID3JOAdmQ4SNZYJHu9V6IqOeRQDBYxqKAg9PyoHFY= -github.com/ebitengine/purego v0.6.0-alpha.5/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 h1:jYi87L8j62qkXzaYHAQAhEapgukhenIMZRBKTNRLHJ4= -github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1 h1:geMPLpDpQOgVyCg5z5GoRwLHepNdb71NXb67XFkP+Eg= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -116,89 +149,171 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= -github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= -lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= -modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= -modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= -modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= -modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= -modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= -modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= -modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= -modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= -modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= -modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/internal/apps/memory-leak/main.go b/internal/apps/memory-leak/main.go index 6bacbb8a84..4b8b997b1d 100644 --- a/internal/apps/memory-leak/main.go +++ b/internal/apps/memory-leak/main.go @@ -13,9 +13,9 @@ import ( "net/http" "sync" - "github.com/DataDog/dd-trace-go/internal/apps" + "github.com/DataDog/dd-trace-go/internal/apps/v2" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" ) var rawJSONData []byte diff --git a/internal/apps/unit-of-work/main.go b/internal/apps/unit-of-work/main.go index 4e1e180b2a..e9b474f46e 100644 --- a/internal/apps/unit-of-work/main.go +++ b/internal/apps/unit-of-work/main.go @@ -11,9 +11,9 @@ import ( "net/http" "os" - "github.com/DataDog/dd-trace-go/internal/apps" + "github.com/DataDog/dd-trace-go/internal/apps/v2" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" ) var dummyData = map[string]int{} diff --git a/internal/apps/worker-pool-bottleneck/main.go b/internal/apps/worker-pool-bottleneck/main.go index 0b25b1ba47..2401b456e3 100644 --- a/internal/apps/worker-pool-bottleneck/main.go +++ b/internal/apps/worker-pool-bottleneck/main.go @@ -28,15 +28,15 @@ import ( "net/http" "time" - "github.com/DataDog/dd-trace-go/internal/apps" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/internal/apps/v2" ) func main() { // Init queue queue, err := NewQueue() if err != nil { - log.Fatalf("failed to create queue: %v", err) + log.Fatalf("failed to create queue: %s", err.Error()) } // Start app @@ -66,7 +66,7 @@ func QueuePushHandler(queue *Queue) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { for i := 0; i < 100; i++ { if err := queue.Push(data); err != nil { - log.Fatalf("failed to push message: %v", err) + log.Fatalf("failed to push message: %s", err.Error()) } } } @@ -99,7 +99,7 @@ func ConsumeMessageWorker(queue *Queue, decode chan<- []byte) { for { msg, err := queue.Pull() if err != nil { - log.Fatalf("failed to pull message: %v", err) + log.Fatalf("failed to pull message: %s", err.Error()) } decode <- msg } diff --git a/internal/apps/worker-pool-bottleneck/queue.go b/internal/apps/worker-pool-bottleneck/queue.go index c6a2436c2c..dc33d53927 100644 --- a/internal/apps/worker-pool-bottleneck/queue.go +++ b/internal/apps/worker-pool-bottleneck/queue.go @@ -27,14 +27,14 @@ func NewQueue() (q *Queue, err error) { q = &Queue{} q.listener, err = net.Listen("tcp", "localhost:0") if err != nil { - return nil, fmt.Errorf("failed to start TCP server: %v", err) + return nil, fmt.Errorf("failed to start TCP server: %s", err) } go q.echoServer() q.conn, err = net.Dial("tcp", q.listener.Addr().String()) if err != nil { - return nil, fmt.Errorf("failed to dial TCP server: %v", err) + return nil, fmt.Errorf("failed to dial TCP server: %s", err) } return q, nil @@ -43,13 +43,13 @@ func NewQueue() (q *Queue, err error) { func (q *Queue) echoServer() { conn, err := q.listener.Accept() if err != nil { - log.Fatalf("failed to accept connection: %v\n", err) + log.Fatalf("failed to accept connection: %s\n", err.Error()) return } defer conn.Close() if _, err := io.Copy(conn, conn); err != nil { - log.Fatalf("failed to copy data: %v\n", err) + log.Fatalf("failed to copy data: %s\n", err.Error()) return } } @@ -61,13 +61,13 @@ func (q *Queue) Push(data []byte) error { // Send the length of the message first err := binary.Write(q.conn, binary.BigEndian, uint64(len(data))) if err != nil { - return fmt.Errorf("failed to send message length: %v", err) + return fmt.Errorf("failed to send message length: %s", err) } // Send the actual message _, err = q.conn.Write(data) if err != nil { - return fmt.Errorf("failed to send message: %v", err) + return fmt.Errorf("failed to send message: %s", err) } return nil } @@ -80,14 +80,14 @@ func (q *Queue) Pull() ([]byte, error) { var length uint64 err := binary.Read(q.conn, binary.BigEndian, &length) if err != nil { - return nil, fmt.Errorf("failed to read message length: %v", err) + return nil, fmt.Errorf("failed to read message length: %s", err) } // Read the actual message data := make([]byte, length) _, err = io.ReadFull(q.conn, data) if err != nil { - return nil, fmt.Errorf("failed to read message: %v", err) + return nil, fmt.Errorf("failed to read message: %s", err) } return data, nil } diff --git a/internal/appsec/README.md b/internal/appsec/README.md index d693d883f2..cc60323ea6 100644 --- a/internal/appsec/README.md +++ b/internal/appsec/README.md @@ -19,7 +19,7 @@ API entrypoint present in `dd-trace-go/contrib` that support appsec is a call to ```mermaid flowchart LR -UserCode[User Code] --> Instrumentation --> IG{Instrumentation Gateway} -----> Listener +UserCode[User Code] --> Instrumentation --> IG{Instrumentation
Gateway} --> Listener ``` Dyngo is a context-scoped event listener system that provide a way to listen dynamically to events that are happening in @@ -28,7 +28,9 @@ the customer code and to react to configuration changes and hot-swap event liste ```mermaid flowchart LR -UserCode[User Code] --> appsec/emitter --> IG{dyngo} -----> appsec/listener +UserCode[contrib] --> appsec/emitter --> IG{dyngo} --> appsec/listener --> WAF +appsec/remoteconfig -->|config change| IG +appsec/config -->|config change| IG ``` ### Operation definition requirements @@ -44,8 +46,8 @@ package main import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) type ( @@ -73,12 +75,12 @@ func StartExampleOperation(ctx context.Context, args ExampleOperationArgs) *Exam } op := &ExampleOperation{ Operation: dyngo.NewOperation(parent), - } + } return dyngo.StartOperation(op, args) } func (op *ExampleOperation) Finish(result ExampleOperationResult) { - dyngo.FinishOperation(op, result) + dyngo.FinishOperation(op, result) } ``` @@ -143,5 +145,68 @@ flowchart TD > [!IMPORTANT] > Please note that this is how the operation SHOULD be stacked. If the user code does not have a Top Level Operation -> then nothing will be monitored. In this case an error log should be produced to explain thouroughly the issue to +> then nothing will be monitored. In this case an error log should be produced to explain thoroughly the issue to > the user. + +### Features + +Features represent an abstract feature added to the tracer by AppSec. They are the bridge between the configuration and +its sources +and the actual code that needs to be ran in case of enablement or disablement of a feature. Features are divided in two +parts: + +- The builder that should be a pure function that takes the configuration and returns a feature object. +- The listeners that are methods of the feature object that are called when an event from the Instrumentation Gateway is + triggered. + +From there, at each configuration change from any config source, the AppSec module will rebuild the feature objects, +register the listeners to the Instrumentation Gateway, and hot-swap the root level operation with the new one, +consequently making the whole AppSec code atomic. + +Here is an example of how a system with only two features, GRPC and HTTP WAF Protection, would look like: + +```mermaid +flowchart TD + + subgraph HTTP Feature + HTTPListener + HTTPBuilder + end + + subgraph GRPC Feature + GRPCBuilder + GRPCListener + end + + subgraph Configuration + RemoteConfig + EnvConfig + ... + end + + Configuration -->|config change| AppSec + + AppSec -->|rebuild| HTTPBuilder + AppSec -->|rebuild| GRPCBuilder + HTTPBuilder -->|register HTTP Listener| IG + GRPCBuilder -->|register GRPC Listener| IG + + + + IG{Instrumentation
Gateway} -->|Start httpsec.HandlerOperation| HTTPListener + IG{Instrumentation
Gateway} -->|Start grpcsec.HandlerOperation| GRPCListener +``` + +All currently available features are the following ones: + +| Feature Name | Description | +|------------------------|--------------------------------------------------------| +| HTTP WAF Protection | Protects HTTP requests from attacks | +| GRPC WAF Protection | Protects GRPC requests from attacks | +| GraphQL WAF Protection | Protects GraphQL requests from attacks | +| SQL RASP | Runtime Application Self-Protection for SQL injections | +| OS RASP | Runtime Application Self-Protection for LFI attacks | +| HTTP RASP | Runtime Application Self-Protection for SSRF attacks | +| User Security | User blocking and login failures/success events | +| WAF Context | Setup of the request scoped context system of the WAF | +| Tracing | Bridge between the tracer and AppSec features | diff --git a/internal/appsec/apisec/internal/config/const.go b/internal/appsec/apisec/internal/config/const.go new file mode 100644 index 0000000000..6483f28808 --- /dev/null +++ b/internal/appsec/apisec/internal/config/const.go @@ -0,0 +1,11 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package config + +const ( + // MaxItemCount is the maximum amount of items to keep in a timed set. + MaxItemCount = 4_096 +) diff --git a/internal/appsec/apisec/internal/timed/clock.go b/internal/appsec/apisec/internal/timed/clock.go new file mode 100644 index 0000000000..6fb4448af4 --- /dev/null +++ b/internal/appsec/apisec/internal/timed/clock.go @@ -0,0 +1,31 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package timed + +import "time" + +type ( + // biasedClock is a specialized clock implementation used to ensure we can get + // 32-bit wide timestamps without having to worry about wraparound. + biasedClock struct { + // bias is effectively the time at which the biasedClock was initialized. + bias int64 + } +) + +// newBiasedClock creates a new [biasedClock] with the given clock function and +// horizon. +func newBiasedClock(horizon uint32) biasedClock { + return biasedClock{ + bias: time.Now().Unix() - int64(horizon), + } +} + +// Now returns the current timestamp, relative to this [biasedClock]. +func (c *biasedClock) Now() uint32 { + // We clamp it to [0,) to be absolutely safe... + return uint32(max(0, time.Now().Unix()-c.bias)) +} diff --git a/internal/appsec/apisec/internal/timed/lru.go b/internal/appsec/apisec/internal/timed/lru.go new file mode 100644 index 0000000000..ac7150df19 --- /dev/null +++ b/internal/appsec/apisec/internal/timed/lru.go @@ -0,0 +1,211 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package timed + +import ( + "fmt" + "math" + "math/rand" + "sync/atomic" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec/internal/config" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// capacity is the maximum number of items that may be temporarily present in a +// [LRU]. An eviction triggers once [config.MaxItemCount] is reached, however the +// implementation is based on Copy-Update-Replace semantics, so during a table +// rebuild, the old table may contrinue to receive items for a short while. +const capacity = 2 * config.MaxItemCount + +// LRU is a specialized open-addressing-hash-table-based implementation of a +// specialized LRU cache, using Copy-Update-Replace semantics to operate in a +// completely lock-less manner. +type LRU struct { + // table is the pointer to the current backing hash table + table atomic.Pointer[table] + // clock is used to determine the current timestamp when making + // changes + clock biasedClock + // intervalSeconds is the amount of time in seconds that an entry is + // considered live for. + intervalSeconds uint32 + // zeroKey is a key that is used to replace 0 in the set. This key and 0 are + // effectively the same item. This allows us to gracefully handle 0 in our + // use-case without having to half the hash-space (to 63 bits) so we can use + // one bit as an empty discriminator. The value is chosen at random when the + // set is created, so that different instances will merge 0 with a different + // key. + zeroKey uint64 + // rebuilding is a flag to indicate whether the table is being rebuilt as + // part of an eviction request. + rebuilding atomic.Bool +} + +// NewLRU initializes a new, empty [LRU] with the given interval and clock +// function. A warning will be logged if it is set below 1 second. Panics if +// the interval is more than [math.MaxUint32] seconds, as this value cannot be +// used internally. +// +// Note: timestamps are stored at second resolution, so the interval will be +// rounded down to the nearest second. +func NewLRU(interval time.Duration) *LRU { + if interval < time.Second { + log.Debug("NewLRU: interval is less than one second; this should not be attempted in production (value: %s)", interval) + } + if interval > time.Second*math.MaxUint32 { + panic(fmt.Errorf("NewLRU: interval must be <= %s, but was %s", time.Second*math.MaxUint32, interval)) + } + + intervalSeconds := uint32(interval.Seconds()) + set := &LRU{ + clock: newBiasedClock(intervalSeconds), + intervalSeconds: intervalSeconds, + zeroKey: rand.Uint64(), + } + + // That value cannot be zero... + for set.zeroKey == 0 { + set.zeroKey = rand.Uint64() + } + + set.table.Store(&table{}) + + return set +} + +// Hit determines whether the given key should be kept or dropped based on the +// last time it was sampled. If the table grows larger than [config.MaxItemCount], the +// [LRU.rebuild] method is called in a separate goroutine to begin the +// eviction process. Until this has completed, all updates to the [LRU] are +// effectively dropped, as they happen on the soon-to-be-replaced table. +// +// Note: in order to run completely lock-less, [LRU] cannot store the 0 key in +// the table, as a 0 key is used as a sentinel value to identify free entries. +// To avoid this pitfall, [LRU.zeroKey] is used as a substitute for 0, meaning +// 0 and [LRU.zeroKey] are treated as the same key. This is not an issue in +// common use, as given a uniform distribution of keys this only happens 1 in +// 2^64-1 times. +func (m *LRU) Hit(key uint64) bool { + if key == 0 { + // The 0 key is used as a way to imply a slot is empty; so we cannot store + // it in the table. To address this, when passed a 0 key, we will use the + // [Set.zeroKey] as a substitute. + key = m.zeroKey + } + + now := m.clock.Now() + threshold := now - m.intervalSeconds + + var ( + table = m.table.Load() + entry *entry + ) + for { + var exists bool + entry, exists = table.FindEntry(key) + if exists { + // The entry already exists, so we can proceed... + break + } + + // We're adding a new entry to the table, so we need to: + // 1. Ensure we have capacity (possibly trigger an eviction rebuild) + // 2. Claim the slot (or look for another slot if it's already claimed) + newCount := table.count.Add(1) + if newCount > config.MaxItemCount && m.rebuilding.CompareAndSwap(false, true) { + // We're already holding the maximium number of items, so we will rebuild + // in order to perform an eviction pass. Updates made in the meantime will + // be lost. + go m.rebuild(table, threshold) + } + if newCount > capacity { + // We don't have space to add any new item, so we'll ignore this and + // decide to DROP it (we may otherwise cause a surge of inconditional + // keep decisions, that is not desirable). This only happens in the most + // dire of circumstances (a table rebuild did not complete fast enough + // to make up free space). + table.count.Add(-1) + return false + } + + if entry.Key.CompareAndSwap(0, key) { + // We have successfully claimed the slot, so now we can proceed to set it + // up. If we fail to swap, another goroutine has sampled this slot just + // before this one, so we can DROP the sample. + return entry.Data.CompareAndSwap(0, newEntryData(now, now)) + } + + if entry.Key.Load() == key { + // Another goroutine has concurrently claimed this slot for this key, and + // since very little time has passed since then, so we can DROP this + // sample... This is extremely unlikely to happen (and nearly impossible + // to reliably cover in unit tests). + return false + } + + // Another goroutine has concurrently claimed this slot for another key... + // We will try to find another slot then... + table.count.Add(-1) + } + + // We have found an existing entry, so we can proceed to update it... + curData := entry.Data.Load() + if curData.SampleTime() <= threshold { + // We sampled this a while back (or this is the first time), so we may keep + // this sample! + + // Store the value ahead of the for loop so we don't have to do the bit + // shifts over and over again (even though they're cheap to do). + nowEntryData := newEntryData(now, now) + for !entry.Data.CompareAndSwap(curData, nowEntryData) { + // Another goroutine has already changed it... + curData = entry.Data.Load() + if curData.LastAccessKept() { + // The concurrent update was a KEEP (as is indicated by the fact its + // atime and stime are equal), so this one is necessarily a DROP. + return false + } + + if curData.SampleTime() >= now { + // The concurrent update was made in our future, and it somehow was not + // a KEEP, so we'll make a KEEP decision here, but avoid rolling back + // the [entryData.AccessTime] back. + return true + } + + // The concurrent update was a DROP, and our clock is ahead of theirs, so + // we'll try again... + } + + // We successfully swapped at this point, so we have our KEEP decision! + return true + } + + newData := curData.WithAccessTime(now) + for curData.AccessTime() < now { + if entry.Data.CompareAndSwap(curData, newData) { + // We are done here! + break + } + // Another goroutine has updated the access time... We'll try again... + curData = entry.Data.Load() + } + return false +} + +// rebuild runs in a separate goroutine, and creates a pruned copy of the +// provided [table] with old and expired entries removed. It will keep at most +// [config.MaxItemCount]*2/3 items in the new table. Once the rebuild is complete, it +// replaces the [LRU.table] with the copy. +func (m *LRU) rebuild(oldTable *table, threshold uint32) { + // Since Go has a GC, we can "just" replace the current [Set.table] with a + // trimmed down copy, and let the GC take care of reclaiming the old one, once + // it is no longer in use by any reader. + m.table.Store(oldTable.PrunedCopy(threshold)) + m.rebuilding.Store(false) +} diff --git a/internal/appsec/apisec/internal/timed/lru_test.go b/internal/appsec/apisec/internal/timed/lru_test.go new file mode 100644 index 0000000000..df0f229e79 --- /dev/null +++ b/internal/appsec/apisec/internal/timed/lru_test.go @@ -0,0 +1,106 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package timed + +import ( + "math" + "runtime" + "sync" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec/internal/config" + "github.com/DataDog/dd-trace-go/v2/internal/synctest" + + "github.com/stretchr/testify/require" +) + +func TestLRU(t *testing.T) { + t.Run("NewLRU", func(t *testing.T) { + require.PanicsWithError(t, "NewLRU: interval must be <= 1193046h28m15s, but was 1193046h28m16s", func() { + NewLRU(time.Second * (math.MaxUint32 + 1)) + }) + }) + + t.Run("Hit", func(t *testing.T) { + synctest.Test(t, func(t *testing.T) { + const sampleIntervalSeconds = 30 + subject := NewLRU(sampleIntervalSeconds * time.Second) + + require.True(t, subject.Hit(1337)) + for range sampleIntervalSeconds { + require.False(t, subject.Hit(1337)) + time.Sleep(time.Second) + } + require.True(t, subject.Hit(1337)) + + require.True(t, subject.Hit(0)) + + // Keys are slotted via [% capacity], so if we don't properly encode + // 0-values, the new slot will inherit the previously set sample time, and + // the assertion will fail as a result. + zeroSlot := uint64(capacity) + if zeroSlot == subject.zeroKey { + // There is a very small chance that the zero key has been set to + // [capacity], in which case we'll just double it to escape the + // collision and get a fresh new hit. + zeroSlot *= 2 + } + require.True(t, subject.Hit(zeroSlot)) + }) + }) + + t.Run("rebuild", func(t *testing.T) { + goCount := runtime.GOMAXPROCS(0) * 10 + + synctest.Test(t, func(t *testing.T) { + subject := NewLRU(30 * time.Second) + + var ( + startBarrier sync.WaitGroup + finishBarrier sync.WaitGroup + ) + startBarrier.Add(goCount + 1) + finishBarrier.Add(goCount) + for range goCount { + go func() { + defer finishBarrier.Done() + startBarrier.Done() + startBarrier.Wait() + + for key := range uint64(config.MaxItemCount * 4) { + _ = subject.Hit(key) + time.Sleep(time.Second) + } + }() + } + + startBarrier.Done() + finishBarrier.Wait() + + // Wait for an in-progress rebuild to finish... + for subject.rebuilding.Load() { + runtime.Gosched() + } + + // Check the final table has a reasonable content... + table := subject.table.Load() + count := 0 + for i := range table.entries { + entry := &table.entries[i] + if entry.Key.Load() == 0 { + continue + } + // Since we ran through the keys sequentially, we should not have kept any + // of the first [config.MaxItemCount] keys in any case. + require.Less(t, uint64(config.MaxItemCount), entry.Key.Load()) + count++ + } + // We should not have more than [maxItemCount] items left in the map... + require.LessOrEqual(t, count, config.MaxItemCount) + }) + }) +} diff --git a/internal/appsec/apisec/internal/timed/table.go b/internal/appsec/apisec/internal/timed/table.go new file mode 100644 index 0000000000..3826e9a057 --- /dev/null +++ b/internal/appsec/apisec/internal/timed/table.go @@ -0,0 +1,181 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package timed + +import ( + "slices" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec/internal/config" +) + +type ( + // table is a simple open-addressing hash table implementation that uses a + // fixed array of items. + table struct { + // entries is the set of items contained in the table. The last entry is + // reserved for cases where all slots are taken before a rebuild is + // complete (it saves us from having to write code to deal with the + // impossibility to find an empty slot, as we always have a slot to return. + // We could return a throw-away slot but this would incur a heap allocation, + // which we can spare by doing this). + entries [capacity + 1]entry + // count is the number of items currently stored in the table. + count atomic.Int32 + } + + // entry is a single item in the open-addressing hash table. + entry struct { + // Key is the Key of the entry. A zero Key indicates that the entry is + // currently free. + Key atomic.Uint64 + // Data is the Data associated with the entry. + Data atomicEntryData + } + + // atomicEntryData is an atomic version of [entryData]. + atomicEntryData atomic.Uint64 + // entryData is a 64-bit value that represents the last time an entry was + // accessed paired together with the last time this value was sampled. + entryData uint64 + + // copiableEntry is a copy-able version of entryData, which is used for + // sorting entries by recency using a heap when re-building the table. + copiableEntry struct { + // Key is the Key of the entry. + Key uint64 + // Data is the Data associated with the entry. + Data entryData + } +) + +// FindEntry locates the correct entry for use in the table. If an entry already +// exists for the given key, it is returned with true. If not, the first blank +// entry is returned with false. +func (t *table) FindEntry(key uint64) (*entry, bool) { + origIdx := key % capacity + idx := origIdx + + for { + entry := &t.entries[idx] + if curKey := entry.Key.Load(); curKey == 0 || curKey == key { + // This is either the entry we're looking for, or an empty slot we can + // claim for this key. + return entry, curKey == key + } + idx = (idx + 1) % capacity + if idx == origIdx { + // We are back at the original index, meaning the map is full. + break + } + } + // We have gone full circle without finding a blank slot, so we give up and + // return our last resort slot that is reserved for this situation. + return &t.entries[capacity], true +} + +// PrunedCopy creates a copy of this table with expired items removed, retaining +// up to the [config.MaxItemCount]*2/3 most recent items from the original. +func (t *table) PrunedCopy(threshold uint32) *table { + // Sort the existing entries (most recent at the top) + newEntries := make([]copiableEntry, 0, capacity) + for i := range capacity { + if t.entries[i].BlankOrExpired(threshold) { + continue + } + newEntries = append(newEntries, t.entries[i].Copyable()) + } + slices.SortFunc(newEntries, copiableEntry.Compare) + + // Insert up to [config.MaxItemCount]*2/3 items into the new table + t = new(table) + count := min(int32(config.MaxItemCount*2/3), int32(len(newEntries))) + for _, entry := range newEntries[:count] { + slot, _ := t.FindEntry(entry.Key) + slot.Key.Store(entry.Key) + slot.Data.Store(entry.Data) + } + t.count.Store(count) + + return t +} + +// BlankOrExpired returns true if the receiver is blank or has expired already. +func (e *entry) BlankOrExpired(threshold uint32) bool { + return e.Key.Load() == 0 || e.Data.Load().SampleTime() < threshold +} + +// Copyable returns a [copyableEntry] version of this entry. +func (e *entry) Copyable() copiableEntry { + return copiableEntry{ + Key: e.Key.Load(), + Data: e.Data.Load(), + } +} + +// Load returns the current value held by this atomic. +func (d *atomicEntryData) Load() entryData { + return entryData((*atomic.Uint64)(d).Load()) +} + +// CompareAndSwap atomically compares the current value held by this atomic with +// the old value, and if they match replaes it with the new value. Returns true +// if the swap happened. +func (d *atomicEntryData) CompareAndSwap(old entryData, new entryData) (swapped bool) { + return (*atomic.Uint64)(d).CompareAndSwap(uint64(old), uint64(new)) +} + +// Store atomically stores the given value in this atomic. +func (d *atomicEntryData) Store(new entryData) { + (*atomic.Uint64)(d).Store(uint64(new)) +} + +// newEntryData creates a new [entryData] value from the given access and sample +// times. +func newEntryData(atime uint32, stime uint32) entryData { + return entryData(uint64(atime)<<32 | uint64(stime)) +} + +// AccessTime is the access time part of the [entryData]. +func (d entryData) AccessTime() uint32 { + return uint32(d >> 32) +} + +// SampleTime is the sample time part of the [entryData]. +func (d entryData) SampleTime() uint32 { + return uint32(d) +} + +// LastAccessKept returns true if the last access to this entry resulted in a +// decision to keep the sample. This is true of the access time is not 0 and is +// equal to the sample time. +func (d entryData) LastAccessKept() bool { + return d.AccessTime() != 0 && d.AccessTime() == d.SampleTime() +} + +// WithAccessTime returns a new [entryData] by copying the receiver and +// replacing the access time portion with the specified value. +func (d entryData) WithAccessTime(atime uint32) entryData { + return (d & 0x00000000_FFFFFFFF) | (entryData(atime) << 32) +} + +// Compare performs a comparison between the receiver and another entry; such +// that most recently sampled entries come first. Two entries with the same +// sample time are considered equal. +func (e copiableEntry) Compare(other copiableEntry) int { + tst := e.Data.SampleTime() + ost := other.Data.SampleTime() + if tst < ost { + // Receiver was sampled more recently (sorts higher) + return 1 + } + if tst > ost { + // Receiver was sampled less recently (sorts lower) + return -1 + } + // Both have the same sample time, so we consider them equal. + return 0 +} diff --git a/internal/appsec/apisec/internal/timed/table_test.go b/internal/appsec/apisec/internal/timed/table_test.go new file mode 100644 index 0000000000..abd9305d20 --- /dev/null +++ b/internal/appsec/apisec/internal/timed/table_test.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package timed + +import ( + "math/rand/v2" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEntryData(t *testing.T) { + t.Run("zero", func(t *testing.T) { + var subject entryData + + require.EqualValues(t, 0, subject.AccessTime()) + require.EqualValues(t, 0, subject.SampleTime()) + }) + + t.Run("newEntryData", func(t *testing.T) { + atime := rand.Uint32() + stime := rand.Uint32() + subject := newEntryData(atime, stime) + + require.Equal(t, atime, subject.AccessTime()) + require.Equal(t, stime, subject.SampleTime()) + + t.Run("WithAccessTime", func(t *testing.T) { + subject = subject.WithAccessTime(atime + 1) + require.Equal(t, atime+1, subject.AccessTime()) + require.Equal(t, stime, subject.SampleTime()) // Unchanged + }) + }) +} diff --git a/internal/appsec/apisec/sampler.go b/internal/appsec/apisec/sampler.go new file mode 100644 index 0000000000..328e4228fe --- /dev/null +++ b/internal/appsec/apisec/sampler.go @@ -0,0 +1,92 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package apisec + +import ( + "encoding/binary" + "hash/fnv" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec/internal/timed" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/limiter" +) + +type ( + Sampler interface { + DecisionFor(SamplingKey) bool + } + + timedSetSampler timed.LRU + + proxySampler struct { + limiter limiter.Limiter + } + + nullSampler struct{} + + SamplingKey struct { + // Method is the value of the http.method span tag + Method string + // Route is the value of the http.route span tag + Route string + // StatusCode is the value of the http.status_code span tag + StatusCode int + } + + clockFunc = func() int64 +) + +// NewProxySampler creates a new sampler suitable for proxy environments where the sampling decision +// is not based on the request's properties, but on a rate. +func NewProxySampler(rate int, interval time.Duration) Sampler { + if rate <= 0 { + return &nullSampler{} + } + r := int64(rate) + l := limiter.NewTokenTickerWithInterval(r, r, interval) + l.Start() + return &proxySampler{ + limiter: l, + } +} + +// NewSampler returns a new [*Sampler] with the specified interval. +func NewSampler(interval time.Duration) Sampler { + return (*timedSetSampler)(timed.NewLRU(interval)) +} + +// DecisionFor makes a sampling decision for the provided [SamplingKey]. If it +// returns true, the request has been "sampled in" and the caller should proceed +// with the necessary actions. If it returns false, the request has been +// dropped, and the caller should short-circuit without extending further +// effort. +func (s *timedSetSampler) DecisionFor(key SamplingKey) bool { + keyHash := key.hash() + return (*timed.LRU)(s).Hit(keyHash) +} + +func (s *proxySampler) DecisionFor(_ SamplingKey) bool { + return s.limiter.Allow() +} + +func (s *nullSampler) DecisionFor(_ SamplingKey) bool { + return false +} + +// hash returns a hash of the key. Given the same seed, it always produces the +// same output. If the seed changes, the output is likely to change as well. +func (k SamplingKey) hash() uint64 { + fnv := fnv.New64() + + _, _ = fnv.Write([]byte(k.Method)) + _, _ = fnv.Write([]byte(k.Route)) + + var bytes [2]byte + binary.NativeEndian.PutUint16(bytes[:], uint16(k.StatusCode)) + _, _ = fnv.Write(bytes[:]) + + return fnv.Sum64() +} diff --git a/internal/appsec/apisec/sampler_test.go b/internal/appsec/apisec/sampler_test.go new file mode 100644 index 0000000000..7e91587bcd --- /dev/null +++ b/internal/appsec/apisec/sampler_test.go @@ -0,0 +1,1324 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package apisec + +import ( + "context" + "fmt" + "math/rand" + "net/http" + "runtime" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec/internal/config" + "github.com/DataDog/dd-trace-go/v2/internal/synctest" + + "github.com/stretchr/testify/assert" +) + +func TestSampler(t *testing.T) { + initTestVector() + + ctx := context.Background() + if deadline, ok := t.Deadline(); ok { + var cancel context.CancelFunc + ctx, cancel = context.WithDeadline(ctx, deadline) + defer cancel() + } + + const samplesToTake = config.MaxItemCount << 10 + + type testCase struct { + // KeySpace is the set of keys to randomly draw from when sampling. + KeySpace []SamplingKey + // SimulatedTPS is the number of samples per second to simulate. + SimulatedTPS int + // ExpectedKeepRate is the expected rate of samples being kept [0;1] + ExpectedKeepRate float64 + // AllowedDelta is the allowed delta for the keep rate. + AllowedDelta float64 + } + testCases := map[string]testCase{ + "small": { + KeySpace: testVector[:config.MaxItemCount/32], + SimulatedTPS: 10, + ExpectedKeepRate: .0415, + AllowedDelta: .0001, + }, + "medium": { + KeySpace: testVector[:config.MaxItemCount/16], + SimulatedTPS: 20, + ExpectedKeepRate: .0415, + AllowedDelta: .0001, + }, + "high": { + KeySpace: testVector[:config.MaxItemCount*2/3], + SimulatedTPS: 1000, + ExpectedKeepRate: .0091, + AllowedDelta: .0001, + }, + "large": { + KeySpace: testVector[:config.MaxItemCount], + SimulatedTPS: 1000, + ExpectedKeepRate: .01, + AllowedDelta: .005, // Small chance of collision here... so a bit more wiggle room... + }, + "extreme": { // Not actually realistic usage... Evictions galore! + KeySpace: testVector[:2*config.MaxItemCount], + SimulatedTPS: 10000, + ExpectedKeepRate: .21, + // Very random evictions, so keep rate can be pretty off... + // It appears that some newer gen P-cores/E-cores CPU are significantly worse at running this job + // so we allow a bit more wiggle room here (like 50% worse). + AllowedDelta: .5, + }, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + assert.Positive(t, tc.SimulatedTPS) + assert.GreaterOrEqual(t, tc.ExpectedKeepRate, 0.0) + assert.GreaterOrEqual(t, 1.0, tc.ExpectedKeepRate) + + const goroutineCount = 10 // Fixed to ensure consistent keep rate... + synctest.Test(t, func(t *testing.T) { + var ( + subject = NewSampler(30 * time.Second) + sb sync.WaitGroup // Start barrier + wg sync.WaitGroup // Completion barrier + kept atomic.Uint64 + dropped atomic.Uint64 + ) + sb.Add(1 + goroutineCount) // All child goroutines + this one... + wg.Add(goroutineCount) + for range goroutineCount { + go func() { + defer wg.Done() + + sb.Done() // We're ready for business, signal to the start barrier... + sb.Wait() // Wait for all the goroutines to have started... + + for i := range samplesToTake { + if subject.DecisionFor(randomOne(tc.KeySpace)) { + kept.Add(1) + } else { + dropped.Add(1) + } + // The clock ticks every 10 samples (model a server processing 10 TPS) + if i%tc.SimulatedTPS == 0 { + time.Sleep(time.Second) + } + } + }() + } + + sb.Done() + wg.Wait() + + samplesTaken := kept.Load() + dropped.Load() + + keepRate := float64(kept.Load()) / float64(samplesTaken) + assert.InDelta(t, tc.ExpectedKeepRate, keepRate, tc.AllowedDelta, "expected keep rate around %.2f±%.2f%%, was %.2f%%", 100*tc.ExpectedKeepRate, 100*tc.AllowedDelta, 100*keepRate) + }) + + }) + } +} + +func TestSamplingKeyHash(t *testing.T) { + initTestVector() + + t.Run("collisions-are-infrequent", func(t *testing.T) { + hashes := make(map[uint64]struct{}, len(testVector)) + for _, key := range testVector { + hashes[key.hash()] = struct{}{} + } + + // Validates that the hash function results in less than 1% collisions. This + // is a little arbitrary, but should ensure the function as at least + // somewhat fit for purpose here. + assert.GreaterOrEqual(t, float64(len(hashes))/float64(len(testVector)), .99, + "the hash function should have less than 10% collisions") + }) + + t.Run("distribution-is-uniform-on-buckets", func(t *testing.T) { + buckets := make(map[int]struct{}, len(testVector)) + for _, key := range testVector { + buckets[int(key.hash()%config.MaxItemCount)] = struct{}{} + } + + // Validates that the hash function results in hitting at least 80% of the + // buckets. This is arbitrary, and may feel a little low, but our sample + // count is quite close to the bucket count, so this is actually solid. + assert.GreaterOrEqual(t, float64(len(buckets))/float64(config.MaxItemCount), .80, + "the hash function should slot into 50% of the buckets at least") + }) +} + +func BenchmarkSampler(b *testing.B) { + initTestVector() + + for _, keySpaceSize := range []int{config.MaxItemCount / 2, config.MaxItemCount * 2} { + keySpace := testVector[:keySpaceSize] + b.Run(fmt.Sprintf("keySpaceSize=%d", keySpaceSize), func(b *testing.B) { + for _, parallelism := range []int{1, 1000} { + b.Run(fmt.Sprintf("parallelism=%d/interval=1s", parallelism), func(b *testing.B) { + var ( + subject = NewSampler(time.Second) + kept atomic.Uint64 + dropped atomic.Uint64 + ) + + // We'll synchronize the start of all of our goroutines to ensure contention happens early. + b.StopTimer() + b.SetParallelism(parallelism) + var ( + wg sync.WaitGroup + barrier = make(chan struct{}) + ) + wg.Add(parallelism * runtime.GOMAXPROCS(0)) + + go func() { + wg.Wait() + b.StartTimer() + close(barrier) // Un-block all the goroutines; we're in business! + }() + + b.RunParallel(func(pb *testing.PB) { + wg.Done() + <-barrier + + for i := 0; pb.Next(); i = (i + 1) % keySpaceSize { + if subject.DecisionFor(keySpace[i]) { + kept.Add(1) + } else { + dropped.Add(1) + } + } + }) + + fkept := float64(kept.Load()) + b.ReportMetric(100*fkept/(fkept+float64(dropped.Load())), "keep%") + }) + } + }) + } +} + +func randomOne[T any](list []T) T { + return list[rand.Intn(len(list))] +} + +var ( + httpMethods = []string{ + http.MethodGet, + http.MethodHead, + http.MethodPost, + http.MethodPut, + http.MethodPatch, + http.MethodDelete, + http.MethodConnect, + http.MethodOptions, + http.MethodTrace, + } + httpStatusCodes = []int{ + http.StatusContinue, + http.StatusSwitchingProtocols, + http.StatusProcessing, + http.StatusEarlyHints, + http.StatusOK, + http.StatusCreated, + http.StatusAccepted, + http.StatusNonAuthoritativeInfo, + http.StatusNoContent, + http.StatusResetContent, + http.StatusPartialContent, + http.StatusMultiStatus, + http.StatusAlreadyReported, + http.StatusIMUsed, + http.StatusMultipleChoices, + http.StatusMovedPermanently, + http.StatusFound, + http.StatusSeeOther, + http.StatusNotModified, + http.StatusUseProxy, + http.StatusTemporaryRedirect, + http.StatusPermanentRedirect, + http.StatusBadRequest, + http.StatusUnauthorized, + http.StatusPaymentRequired, + http.StatusForbidden, + http.StatusNotFound, + http.StatusMethodNotAllowed, + http.StatusNotAcceptable, + http.StatusProxyAuthRequired, + http.StatusRequestTimeout, + http.StatusConflict, + http.StatusGone, + http.StatusLengthRequired, + http.StatusPreconditionFailed, + http.StatusRequestEntityTooLarge, + http.StatusRequestURITooLong, + http.StatusUnsupportedMediaType, + http.StatusRequestedRangeNotSatisfiable, + http.StatusExpectationFailed, + http.StatusTeapot, + http.StatusMisdirectedRequest, + http.StatusUnprocessableEntity, + http.StatusLocked, + http.StatusFailedDependency, + http.StatusTooEarly, + http.StatusUpgradeRequired, + http.StatusPreconditionRequired, + http.StatusTooManyRequests, + http.StatusRequestHeaderFieldsTooLarge, + http.StatusUnavailableForLegalReasons, + http.StatusInternalServerError, + http.StatusNotImplemented, + http.StatusBadGateway, + http.StatusServiceUnavailable, + http.StatusGatewayTimeout, + http.StatusHTTPVersionNotSupported, + http.StatusVariantAlsoNegotiates, + http.StatusInsufficientStorage, + http.StatusLoopDetected, + http.StatusNotExtended, + http.StatusNetworkAuthenticationRequired, + } + httpRoute = []string{ + "/{namespace}/{repository}/@{snapshot}/*", + "/api/ui/query/timeseries", + "/api/v1/synthetics/private-locations/tests", + "/api/ui/frontend_telemetry/metrics", + "/api/ui/query/rapid-scalar", + "/api/v1/validate", + "/config", + "/v8/artifacts/{id}", + "/api/ui/feature-flags/get-active-feature-flags", + "/api/v1/synthetics/private-locations/tests/{publicID}/results", + "/api/v1/distribution_points", + "/api//logs-analytics/", + "/internal/snapshot/pull", + "/*", + "/api/unstable/apm/entities", + "/v2/", + "/dashboard/shared_widget_update/{id}/{widget_id}", + "/authn", + "/api/v1/synthetics/tests/updates/", + "/authz", + "/v3/elements/search", + "/api/ui/event-platform/logs/facets", + "/vault/agent/", + "/internal/snapshot/push", + "/api/v2/dashboard/presence/{resourceId}", + "/api/v1/snapshot", + "/api/v1/query", + "/api/v1/series", + "/v8/artifacts/events", + "/api/v1/monitor/", + "/series/batch_query", + "/orgs/{orgId}/analytics/requests", + "/api/v0.1/status", + "/api/v1/synthetics/private-locations/tests//results", + "/api/ui/error-tracking/issues/searches", + "/api/intake/ci/custom_spans", + "/internal/error-tracking/search", + "/v2/{name:(?:(?:(?:[a-zA-Z0-9]", + "/api/v0.1/configurations", + "/api/v2/apm/service_inference", + "/api/v2/git/repository/search_commits", + "/jobs/", + "/api/v2/libraries/tests/services/setting", + "/api/ui/data_streams/map", + "/readiness", + "/api/ui/apm/latency_breakdowns", + "/api/v2/discussions/dashboard/{dashboardID}", + "^dump-request$", + "/api/v2/watchdog/insights/search/", + "/api/ui/apm/versions", + "/probe", + "/api/v2/watchdog/insights/search", + "/api/ui/orchestration/facets/v2", + "/account/login", + "/-/readiness", + "/api/ui/apm/resources", + "/-/liveness", + "/monitor/evaluation_graph", + "/{namespace}/{repository}/@{snapshot}/simple/{project}", + "/watchdoginsights/outliers_query", + "/health/readiness", + "/health/liveness", + "/api/v2/on-prem-management-service/workflow-tasks/dequeue", + "/api/v2/users", + "/api/ui/slack-app/event", + "/token", + "/v2/{name:(?:(?:(?:[a-zA-Z0-9]", + "/watchdoginsights/outliers_resume", + "/_health", + "/api/unstable/coscreen", + "/internal/v0/3rd-party-software-info/query", + "/api/v2/org_configs/", + "/health", + "/watchdoginsights/watchdog_stories_query", + "/api//logs-analytics//", + "/api/intake/llm-obs/v1/trace/spans", + "/internal/ciem/enablementRequirements/{orgId}", + "/api/v2/ddsql/table", + "/monitor/search", + "/api/v2/cases/count", + "/api/ui/apm/live-search", + "/api/ui/orchestration/entities", + "/api/ui/experiments/get-all-experiments", + "/api/ui/event-platform/trace/facets", + "/api/v1/settings/favorite/list", + "/api/ui/team", + "/api/v1/dashboard/", + "/api/v2/query/timeseries", + "/api//watchdog/stories", + "/orgs/{orgId}/analytics/requests/{requestId}", + "/api/v2/team", + "/api/unstable/apm/entities/graph", + "/api/v2/incidents/search", + "/api/ui/support/authenticate", + "/dequeue_job", + "/api/ui/apm/breakdown", + "/static/*", + "/api/unstable/change-stories", + "/v2/{name:(?:(?:(?:[a-zA-Z0-9]", + "/api/v1/logs/views", + "/api/v2/ci/libraries/tests", + "/api/v2/notebook/presence/{resourceId}", + "/api/unstable/restriction_policy/relations/bulk", + "/orgs/{orgId}/scopes", + "/api/v1/security_analytics/activation", + "/api/v2/cases", + "/api/ui/api-monitoring/endpoint", + "/watchdoginsights/log_anomalies_query", + "/api/v1/slo//history", + "/api/ui/api-monitoring/endpoints", + "/api/v1/logs/indexes", + "/orgs/{orgId}/security_analytics/activation", + "/lock", + "/v2/{repo:(?:(?:(?:[a-zA-Z0-9]", + "/api/ui/apm/web/metadata", + "/metric/hosts_and_tags", + "/api/v1/monitor", + "/api/ui/event-platform/rum/facets", + "/favicon.ico", + "/api/ui/event-platform/feed/facets", + "/api/v2/workflows/{workflowId}/instances", + "/watchdoginsights/profiling_query", + "/api/v2/case/presence/{resourceId}", + "/api/v1/metrics/", + "/api//watchdog/story_facets", + "/v1/applications/{appId}", + "/snapshot/view////", + "/fabric-proxy-healthcheck", + "/api/v2/users/", + "/api/v2/current_user/user_team_fave", + "/dashboard/*", + "/api/v1/monitor//validate", + "/api/ui/query/scalar", + "/api/v2/static-analysis/rulesets/{RulesetName}", + "/api/ui/data_streams/info", + "/api/v2/event-platform/profile/activity", + "/metric/flat_tags_for_metric", + "/api/v2/services/definitions/", + "/api/unstable/databases/hosts", + "^$", + "api/usage/v1/hourly-usage.{ext}", + "/internal/api/v2/devflow/run-workflow", + "/api/ui/apm/host_groups", + "/api/v2/ci/tests/skippable", + "/api/v2/restriction_policy/", + "/status/index", + "/api/v1/logs/default-views", + "/api/v2/cases/aggregate", + "/dash/set_preference", + "/internal/catalog/v1/namespaces/*", + "/computeMetadata/v1/instance/service-accounts/{serviceAccount:[^/]+}/token", + "/metric/metric_metadata", + "/orgs/{orgId}/security_analytics/activation/{product}/pricing_model", + "/api/unstable/databases/recommendations/aggregated", + "/api/ui/event-platform/audit/facets", + "/api/v1/restriction_policy/{resourceID}", + "/api/ui/event-platform/query/field", + "/api/v1/monitor/validate", + "/metric/contexts_for_metrics", + "/graphql", + "/{version}/meta-data/iam/security-credentials/{role:.+}", + "/orgs/{orgId}/indexes", + "/api/v2/workflows//instances/", + "/api/v1/monitor//search_groups", + "/v1/applications/{appId}/streaming", + "/check//contexts", + "/api/v2/process/summary", + "/{version}/meta-data/iam/security-credentials/", + "/api/ui/flows/scalar", + "/api/v2/catalog/entity", + "/api/ui/integration/jira/webhook/{org_uuid}", + "/api/v1/apps/:app/inputs", + "/internal/dashboards/search/_index", + "/api/v1/apps/:app/inputs/:inputId", + "/api/v2/services/definitions", + "/api/v2/embed_query/timeseries", + "/api/ui/orchestration/manifest_history", + "/api/ui/monitor/search_all_counts", + "/api/ui/apm/latest_deployments", + "/", + "/internal/compliance/frameworks/{orgId}", + "/api/v2/ci/pipeline/tags", + "/api/unstable/public_dashboard_widget_query", + "/api/v2/logs/events/search", + "/api/unstable/datasets", + "/internal/event-platform/query/composite", + "/api/ui/trace/{traceID}", + "/api/unstable/accupath/entities/graph/{entityType}/*", + "^click$", + "/api/v1/monitor/groups/search", + "/api/v2/static-analysis/config/client", + "/api/v2/incidents-incident/presence/{resourceId}", + "/api/v2/metrics//volumes", + "/api/v1/dashboard_search", + "/api//hosts", + "/v2/{repo:(?:(?:(?:[a-zA-Z0-9]", + "/api/v2/roles", + "/api/ui/event-platform/{track}/standard-attributes/rules", + "/api/v2/ci/pipeline/metrics", + "/api/v2/host_map/nodes_by_group", + "/api//databases/hosts", + "/api/ui/apm/widget_stats_histogram", + "/api//logs-queries/list", + "/api/ui/dashboards//payload_version_history", + "/api/unstable/on-call/teams", + "/api/v1/tags/hosts/", + "/api/ui/security/asm/services", + "/api/v2/synthetics/tests//results", + "/api/ui/data_streams/alerts", + "/api/v2/workflows/{workflowId}/instances/{instanceId}", + "/api/v2/incident/presence/{resourceId}", + "/mail/sendgrid_incoming", + "/v2/{name:(?:(?:(?:[a-zA-Z0-9]", + "/api/v1/legacy_current_user", + "/unauthenticated_probe", + "/api/ui/services/catalog", + "/v3/elements/update", + "/api/unstable/obs-pipelines/quotas/{pipelineId}/buckets", + "/api/v2/services/catalog/product_areas", + "/computeMetadata/v1/instance/service-accounts/{serviceAccount:[^/]+}/", + "/api/v2/apm/services/stats", + "/api/v1/intake_monitoring", + "/series/proc_key_query", + "/api/v2/incidents-timeline/presence/{resourceId}", + "/lock/", + "/api/ui/apm/service/graph_real_time", + "/api/ui/error-tracking/issues/field-translations", + "/internal/security-graph/shards/{orgID}", + "/api//events/", + "/autoscaling/recommendation", + "/api/ui/event-platform/databasequery/facets", + "/api/unstable/databases/monitors", + "/api/unstable/apm/entities/ranked_entity_id_tags", + "/api/unstable/cost/tags", + "/api/intake/aws/securitylake", + "/tile/validate", + "/api/unstable/datasets/", + "/api/ui/monitor/search_all", + "/api/v1/synthetics/tests/uptimes", + "/api/ui/metric/search", + "/api/v2/notebook/multiplayer/{resourceId}", + "/api/v2/ci/pipeline", + "/api/v1/notebooks/", + "/api/v2/host_map/filters_and_groups", + "/monitor/validate_text", + "/api/ui/apm/has_traces", + "/api/ui/apm/dependency_stats_tree", + "/api/v1/rum/projects", + "/api/unstable/databases/recommendations", + "/api/v1/check_run", + "/api/v2/scorecard/grouped-outcomes", + "/integration/slack/inbound-event", + "/api/v2/intake_monitoring", + "/api/unstable/on-call/pages", + "/api/ui/event-platform/{track}/livetail/token", + "/api/ui/app_installations", + "/internal/event-platform/query/composite/resume", + "/api/v2/services/integrations/pagerduty", + "/api/v1/monitor/search", + "/v1/applications", + "/api/ui/api-monitoring/endpoints/count", + "/liveness", + "/dashboard/template-variables/values", + "/v1/version", + "/api/v2/workflows", + "/api/v1/notebooks", + "/metric/tag_keys_for_metric", + "/api/unstable/security/appsec/vm/activation", + "/computeMetadata/v1/project/project-id", + "/api/v1/synthetics/tests//locations", + "/api/ui/slo/correction_windows", + "/files/{ref}/{filename}", + "/api/unstable/datasets/{datasetUUID}", + "/api/v1/integration/webhooks/configuration/webhooks/", + "/process/tags/v2", + "/api/v2/monitor//downtime_matches", + "/apm/*", + "/api/v2/security_monitoring/rules", + `/sb/{string_1:[^/?()[\]]+}`, + "^basic-auth$", + "/v3/elements", + "/utils/healthcheck", + "/api/v2/scorecard/outcomes/batch", + "/metadata/identity/oauth2/token", + "/api/ui/apm/web/metadata/{serviceName}", + "/api/v1/synthetics/tests/search", + "/api/v1/logs/rate_limited_indexes", + "/api//node_map/nodes_by_group", + "/api/unstable/symdb-api/scopes/search", + "/api/v2/catalog/relation", + "/monitor/search_counts", + "/api/unstable/stegadography/cache", + "/query", + "/api/ui/event-platform/signal/facets", + "/api/beta/sketches", + "^simple-variable$", + "/internal/api/repository/{owner}/{repository}/history", + "/api/v2/current_user", + "/connectors/{connector}/status", + "/v1/health", + "/api/ui/error-tracking/issues/field-values", + "/api/unstable/symdb-api/services/metadata", + "/api/ui/span_links/{traceID}", + "/internal/domains/{DomainName}/routegroups/{RouteGroupName}", + "/v1/orgs/{orgId}/logs-queries/list", + "/api/v2/permissions", + "/api/v2/workflows//instances", + "/api/ui/watchdog/explains/influential-tags/ff", + "/apm/home", + "/cost/tags/pod/{namespace}/{pod_name}", + "/api/v2/integration/salesforce_marketing_cloud/event", + "/api/ui/cost/settings", + "^click-trap$", + "/api/v2/watchdog-story/presence/{resourceId}", + "/api/v2/reporting/schedule//", + "/api/v2/static-analysis/default-rulesets/{Language}", + "/indicators", + "/api/ui/cost/multisource", + "/internal/api/v2/spark_jobs/{spark_job_id}", + "/api/v2/scorecard/rules", + "/api/v2/roles/{roleUuid}", + "/internal/ci/gitlab/pipeline/*", + "/api/v2/security_monitoring/configuration/notification_rules", + "/api/ui/event-platform/query/field-value", + "/api/v2/synthetics/private-locations/config", + "/api/v2/test/libraries/test-management/tests", + "/api/v1/slo", + "/cluster_configuration/", + "/api/v1/slo/search", + "/api/ui/error-tracking/config", + "/api/ui/event-platform/profile/facets", + "/internal/api/v2/concurrency_locks", + "/api/v2/rum/funnel", + "/api/v0/synthetics/tests//status", + "/catalog/v1/namespaces", + "/api/unstable/restriction_policy/principal/", + "/api/v2/services/integrations/pagerduty/oncalls", + "/api/v1/synthetics/tests", + "/api/v1/monitor/tags", + "/internal/notebooks/search/_index", + "/orgs/{orgId}/cloud_security_management/resource_filters", + "/api/v1/integration", + "^cors-protected-resource$", + "/connectors/{connector}", + "/api/unstable/ui/trace/{traceID}", + "/alert/query_value/", + "/api/v2/query/scalar", + "/metric/histogram", + "/api/ui/resource_catalog/list", + "/v2/orgs/{orgId}/{trackType}/events/search", + "/api/ui/remote_config/*", + "/api/v2/security_monitoring/rules/{ruleId}", + "/api/v2/api_keys/", + "^status$", + "/api/v2/source-code-integration/enrich-stack-trace", + "/monitor/validate_param", + "/orgs/{orgId}/v2/security_analytics/rules", + "/api/v2/on-prem-management-service/runner/health-check", + "/api/v2/security_monitoring/signals/", + "/event/distrib", + "/internal/ciem/enabledIntegrations/{orgId}", + "/jobs", + "/internal/core/v2/prefixes/{id}", + "/api/v2/apicatalog/endpoints", + "/v2/orgs/{orgId}/vm", + "^sigv4$", + "/oauth2/v1/token", + "/api/v1/synthetics/tests/browser/", + "/api/v1/dashboard/public/", + "^simple-iframe$", + "/api//host_map/node_values", + "/api/v2/services/integrations/pagerduty/incidents", + "/v2/orgs/{orgId}/security_monitoring/configuration/notification_rules", + "/internal/intake/developer-telemetry/count", + "/api/v2/org_connections", + "/api/v1/synthetics/browser/tests//results//steps//screenshot", + "/api/ui/security_monitoring/content_packs", + "/api/unstable/on-call/escalation-policies/{policyUUID}/steps/{policyStepUUID}/escalations", + "/orgs/{orgId}/security_analytics/signals/get_metadata", + "/api/ui/container_images/facets", + "/api/ui/on-call/shifts", + "/api/v2/services/integrations/opsgenie", + "/monitors/*", + "/api/v2/services/integrations/opsgenie/incidents", + "/api//logs/analytics/aggregate", + "/orgs/{orgId}/analytics/requests/validate-search", + "/.well-known/jwks.json", + "/api/v2/events", + "/api/v1/slo/", + "/api/v1/monitor//unmute", + "/*id", + "/api/v1/rum/replay/sessions//views//segments", + "/api/v2/infrastructure/devices", + "/probe_smart_edge", + "/api/ui/event-platform/profilemetrics/facets", + "/api/ui/data_streams/apm_streaming_services", + "/api/v2/ucap/annotations/search-by-file", + "/api/v2/processes", + "/healthz/liveness", + "/api/v2/reporting/schedule/list", + "/catalog/v1/namespaces/{namespace}/tables/{table}/metrics", + "/watchdoginsights/synthetics_search_tests", + "/v2/models/{model_name}/versions/{model_version}/ready", + "/security/*", + "/v1/task/{taskId}", + "/api/v0.1/org", + "/clusters", + "/watchdoginsights/outliers_cancel", + "/logs", + "/api/v1/dashboard/lists", + "/v3/elements/aggregate", + "/api/v1/notebook//comments", + "/api/unstable/apm/tracer_agent_latest_versions", + "/api/ui/event-platform/{track}/org/state", + "/orgs/{orgId}/facets-with-reserved-fields", + "/event/icon/", + "/profiling/api/v1/aggregate", + "/api/ui/event-platform/netflow/facets", + "/api/v2/ci/my-commits", + "/v2/orgs/{orgId}/{trackType}/analytics/aggregate", + "/api/v1/synthetics/tests/", + "/api/v1/synthetics/ci/batch/", + "/api/v1/security_analytics/rules/facet_info", + "/orgs/{orgId}/state", + "/api/ui/apm/live-search/keys", + "/api/v1/events", + "/api/v1/synthetics/tests/poll_results", + "/api/v2/monitor/recommended", + "/api/v2/ucap/annotations/search", + "/api/v2/scorecard/outcomes", + "/internal/csm/onboarding/steps", + "/api/unstable/obs-pipelines/quotas/batch", + "/api/v2/incidents//relationships/integrations", + "/api/ui/notebooks//payload_version_history", + "/api/v2/team//memberships", + "/api/v2/security_monitoring/configuration/security_filters", + "/api/v2/internal/*", + "/api/ui/remote_config/products/live_debugging/probes", + "/series/embed_batch_query", + "/api/ui/error-tracking/issues/facets", + "/api/v2/services/definitions/{service:.*}", + "/api/v1/integrations/tiles/list", + "/api/v2/services/catalog", + "/healthz", + "/api/v1/metadata", + "/api/v2/logs/events", + "/api/v2/bits-ai-investigation/presence/{resourceId}", + "/status", + "/-/health", + "/api/v2/api_keys", + "/api/v2/metrics", + "/api/v1/synthetics/settings", + "/internal/api/ui/prr-survey-relay/surveys/{ServiceName}", + "/v1/info/state", + "/internal/disruptioncrons", + "/internal/hypothesis", + "/api/ui/error-tracking/issues/{issueID}", + "/series/proc_container_query", + "/api/v2/slo/{sloID}/status", + "/v3/entities", + "/account/change_subdomain/", + "^headers$", + "/rum/*", + "/api/:version/jobs/request", + "/api//apm/config/retention-filters", + "/api/v2/monitor/policy", + "/api/v1/role/{roleUuid}/user/{userHandle}", + "/api/ui/billing/vat_required", + "/api/ui/apm/resource", + "/api/v0/synthetics/tests/", + "/api/v2/product_trial_summary", + "/account/oauth2", + "/api/v1/restriction_policy/principal/{principalID}", + "/proc/query", + "/api/v1/insights", + "/intake", + "/profiling/api/v1/profiles//breakdown", + "/api/ui/error-tracking/issues/searches/{searchID}", + "/eee-intake/prod/gitlab", + "/internal/reporting/job/dequeue", + "/api/v2/incidents/", + "/api/v2/users//permissions", + "/api/unstable/security_monitoring/csm_features", + "/api/v2/bits-ai/config/global", + "/api/v2/powerpacks", + "/api/v1/lineage", + "/api/ui/public_dashboard/", + "/account/plan/plan_details", + "/v1/memory", + "/api/v2/incidents//timeline", + "/api/v2/metrics//all-tags", + "/api/unstable/on-call/pages/{pageIdentifier}", + "/v1/task/{taskId}/status", + "/monitor/notifications", + "/api/v2/workflow_instance_sources//instances", + "/account/integration", + "/api/ui/usage/billable/overall", + "/catalog/v1/config", + "/api/v2/security_monitoring/livetail", + "/api//events", + "/api//node_map/node_values", + "/api/v2/application_keys", + "/api/unstable/slo/search/group_by_tag", + "/api/ui/event-platform/appsecspan/facets", + "/api/ui/monitor//evaluation_graph", + "/api/v2/rum/analytics/aggregate", + "/api/v2/rum/applications", + "/api//node_map/filters_and_groups", + "/api/v2/static-analysis-sca/dependencies", + "/api/v1/hosts/totals", + "/api/ui/notebooks/lfg", + "/metrics", + "api/usage/v1/status", + "/api/v2/workflow_instance_sources/{id}/instances", + "/api/ui/ms-teams-app/bot/activity", + "/api/v0.2/stats", + "/internal/api/v2/spark_jobs", + "^scroll$", + "/api/v1/audit/config", + "/api/ui/flows/timeseries", + "/v1/status", + "/healthcheck", + "/monitors/manage", + "/api/unstable/catalog/definition", + "/orgs/{orgId}/security_analytics/rules/{ruleId}", + "/internal/dashboards/search/_bulkindex", + "/api/ui/trace/related_dashboards", + "/api/v2/source-code-integration/code-snippet", + "/synthetics/*", + "/agent_stats/report_failure", + "/api/v1/synthetics/_multilocator/updates", + "/account/saml/assertion", + "/api/v2/notebooks/search", + "/v1/task/{taskId}/results/{bufferId}/{token}", + "/api/v2/rum/resource", + "/api/v2/rum/events", + "/api/v2/events/search", + "/api/ui/event-platform/citest/facets", + "/api/ui/cost/aws_accounts", + "/api/v2/incidents", + "/api/ui/debugger/probe-statuses", + "/api/ui/event-platform/cipipeline/facets", + "/api/v2/synthetics/tests//results/", + "/api/v1/security_analytics/rules/facets", + "/screen/setup_notify_change", + "/api/v2/metrics/{metricName}/assets", + "/orgs/{orgId}/security_analytics/rules/facet_info", + "^assert-element-content$", + "^user-agent$", + "/api/v2/saml_configurations/", + "/signup/process", + "/api/ui/metrics/summary/list", + "/api/v2/integration/gcp/accounts", + "/api/v2/logs/config/custom-destinations/", + "/api/v2/embed_query/scalar", + "/api/v2/dora/settings", + "/api/v2/apicatalog/tags", + "/api/v1/logs/views/", + "/api/v2/host_map/node_names", + "/v1/announcement/{node_id}", + "/api/unstable/llm-obs/v2/clusters", + "/v1/service/{type}/{pool}", + "^input$", + "/internal/intake/developer-telemetry/distribution", + "/api/v2/dora/deployment", + "/api/unstable/monitor/on_missing_data_default_details", + "/api/v2/rum/replay/sessions/{sessionID}/watchers", + "^authenticated$", + "/functions", + "^assert-text-nowhere$", + "^iframeception$", + "^small-device$", + "/api/v2/{trackType}", + "/v2/_scanning/", + "^assert-text-present$", + "^iframe-in-popup$", + "/api/v1/synthetics/config", + "^prototype$", + "^cors$", + "/api/v1/security_analytics/rules/{ruleId}", + "/api/v1/synthetics/tests/api/", + "/gomod/{ref}/*", + "^hover$", + "^redirect-auth$", + "/api/v1/synthetics/variables", + "/v2/_scanning/{name:(?:(?:(?:[a-zA-Z0-9]", + "/v2/orgs/{orgId}/security_monitoring/configuration/security_filters", + "/process/get_token", + "/v1/statement/executing/{queryId}/{slug}/{token}", + "^select-option$", + "/api/v2/pets/{petID}", + "/monitors/{int_1:[0-9]+}/edit", + "/api/unstable/ddsql/custom_output", + "/api/v2/spreadsheets/{spreadsheetID}", + "/*repository_path/git-upload-pack", + "/notebook/*", + "/api/unstable/trace/{traceID}", + "/api/ui/app_listings", + "/api/ui/remote_config/management/org_config", + "/api/v1/security_analytics/rules/tags", + "/api/v1/rum/projects/", + "/account/saml/assertion/id/", + "/api/unstable/on-call/teams/{teamUUID}/on-call", + "/api/v2/apm/services", + "/internal/core/v2/routetables/{id}", + "/api/ui/container_images", + "/api/ui/security/appsec/flaggedips/{from}/{to}", + "/api/v2/incidents/config/rules", + "/orgs/{orgId}/facets", + "/api/v2/flamegraph", + "/api/v2/oauth2/.well-known/sites", + "/orgs/{orgId}/v2/security_analytics/livetail", + "/api//logs/config/archives/", + "/internal/security-graph/shards/mappings", + "/api/ui/team-list", + "fakecdnoutage", + "/api/:version/jobs/:id", + "/api/ui/cost/lite", + "/api/v2/internal/admin/org_access_request_meta/", + "/api/unstable/integration/aws/accounts", + "/internal/core/v2/pools/{id}/summary", + "/api/v2/metrics//tags", + "/monitor/bulk_delete", + "/orgs/{orgId}/security_analytics/rules", + "/v1/task/{taskId}/results/{bufferId}/{token}/acknowledge", + "^upload-file$", + "/api/ui/event-platform/cpfinding/facets", + "/account/forgot_password", + "/api/v2/rum/replay/playlists/{playlistID}", + "/internal/catalog/v1/namespaces", + "/integration/github/private-apps/hostnames", + "/api/v2/rum/resource/token", + "/api/v1/synthetics/tests/browser//results", + "/api/v1/synthetics/tests//results", + `/orchestration/{string_1:[^/?()[\]]+}/{string_2:[^/?()[\]]+}`, + "/api//observability_pipelines/v2/graphql", + "/api/v1/monitor//related_dashboards", + `/monitors/create/{string_1:[^/?()[\]]+}`, + "/xds/validate-config", + "/api/ui/data_streams/clusters", + "/v2/orgs/{orgId}/logs/config/custom-destination/{customDestinationId}", + "/api/ui/remote_config/products/asm/waf/exclusion_filters", + "/api/v2/py/pets/{pet_id}", + "/api/v2/security_monitoring/configuration/suppressions/{suppressionId}", + "/api/v2/rum/events/search", + "/api/unstable/smoke-test-go-classic-http/five", + "/api/unstable/smoke-test-go-classic-http/gzip", + "/api/unstable/smoke-test-go-classic-http/vault/secret", + "/api/unstable/smoke-test-go-classic-http/consul/value", + "/api/unstable/smoke-test-go-classic-http/experiment/status", + "/api/unstable/smoke-test-go-classic-http/panic", + "/metric/explorer", + "/api/unstable/smoke-test-go-classic-http/four", + "/api/unstable/smoke-test-go-classic-http/tap", + "/api/v1/security_analytics/resource_type_mapping", + "/api/ui/flows/list", + "/orgs/{orgId}/security_analytics/activation/{product}/enabled_log_sources", + "/api/v2/rum/replay/sessions//retention", + "/api/ui/resource_catalog/facet_resources", + "/v2/orgs/{orgId}/security_monitoring/cloud_workload_security/agent_rules/csm_features", + "/api/v1/notebooks//cells/", + "/api//tag_keys", + "/api/v2/apm/primary_tags/list", + "/api/ui/billing/accessible_features", + "/api/ui/ip-lookup/get-info", + "/api/v2/rum/replay/sessions/{sessionID}/watches", + "/api/v2/spans/events", + "/api/v2/app-builder/apps/{appId}", + "/error-tracking", + "/api/v2/team/{team_id}/memberships", + "/api/v2/ci/pipelines/events/search", + "/locks", + "/api/v1/org", + "/api/v2/connection/connections", + "/orgs/{orgId}/security_analytics/rules/tags", + "/api/v2/ddsql/user/table", + "/api/v1/integration/azure", + "/api/ui/event-platform/llmobs/facets", + "/logs/", + "/api/ui/remote_config/products/live_debugging/probes/log/{probeID}", + "/api/v1/check_github", + "/security/appsec/*", + "/api/ui/metrics/summary/facet_info", + "/api/v2/internal/admin/get_support_org_list", + "/api/ui/event-platform/ccm/facets", + "/api/v1/org/", + "/api/v1/widget/share", + "/v1/statement/queued/{queryId}/{slug}/{token}", + "/api/ui/remote_config/products/fleet/agents/count", + "/api/ui/resource-catalog-api/resources", + "/api/v2/reference-tables/{TableName}/rows", + "/api/v1/monitor/can_delete", + "/api/v2/spreadsheets", + "/debug/vars", + "/api/:version/jobs/:id/artifacts", + "/api/v2/infrastructure/facets", + "/api//event-platform//processors/samples", + "/api/v1/downtime", + "/api/v1/integration/gcp", + "/api/v1/slo/correction/", + "/profiling/api/v1/profiles//timeline", + "/api/ui/flows/map", + "/api/v1/service_dependencies/*", + "/api/v1/timeline", + "/api/unstable/error-tracking-codegen/*", + "/api/v2/git/repository/packfile", + "/api/v2/actions-datastores/{datastoreId}/items", + "/api/v2/integration/aws/accounts/{aws_account_config_id}", + "/oauth2/v1/keys", + "/api/ui/error-tracking/issues/field-values/{fieldValuesID}", + "/api/ui/remote_config/products/asm/waf/policies", + "/api/v2/agentless_scanning/accounts/azure", + "/api/ui/security_monitoring/rules/dependents", + "/api//node_map/node_names", + "/account/saml/metadata.xml", + "/metric/distribution/summary_aggr", + "/api/v2/current_user/application_keys", + "/api/v1/synthetics/private-locations/tests/files", + "/api/ui/usage/relevant-summary", + "/api/ui/error-tracking/issues/{issueID}/suspect-commit", + "/api/v2/incidents/config/user-defined-roles", + "/api/v2/incidents/{IncidentUUID}/rule-execution-states", + "/java-bazel/{ref}/{name}/{filename}", + "/api/v2/saml_configurations", + "/intake/", + "/account/saml/config//sp_metadata.xml", + "/api/ui/usage/ddm-summary", + "/api/v2/ide/product-availability", + "/api/v2/logs/historical_indexes", + "/api/unstable/on-call/schedules/{scheduleUUID}/on-call", + "/api/v1/integration/pagerduty/configuration/services/", + "api/usage/v1/relevant-usage.json", + "/api/ui/usage/relevant-trends", + "/api/ui/usage/summary", + "/api/ui/usage/trends", + "/api/v2/users//memberships", + "/orgs/{orgId}/security_analytics/rules/dependents", + "/api/ui/error-tracking/issues/{issueID}/activity-timeline", + "/oauth2/v1/.well-known/openid-configuration", + "/api/v2/org", + "/api/:version/jobs/:id/trace", + "/api/unstable/sensitive-data-scanner/groups", + "/api/v2/saml_configurations/idp_metadata", + "/api/unstable/cost/tag_keys", + "/v2/orgs/{orgId}/external-archives", + "/api/unstable/metric//tag_cardinalities", + "/internal/api/v2/concurrency_locks/{concurrency_lock_definition_id}/{workflow_id}", + "/api/ui/monitor/evaluation_preview", + "/api/v1/synthetics/private-locations", + "/api/v2/static-analysis/analysis/diff-aware", + "/api/unstable/error-tracking-codegen/ai-suggestions", + "/api/ui/app_listings/", + "/api/v1/breakdown", + "/api/ui/remote_config/products/live_debugging/probes/log", + "/api/v1/dashboard", + "/api/v2/incidents/config/types", + "/graph/embed", + "/orgs/{orgId}/security_analytics/rules/facets", + "/api/ui/orchestration/manifest_content", + "/api/v2/consul/value", + "/api/v2/ide/services/search", + "/api/v2/vault/secret", + "/account/login/by_email", + "/api/ui/usage/ddm-trends", + "/api/v2/exception", + "/api/unstable/remote_config/products/asm/activation", + "/api/v2/experiment/status", + "/v2/_dd/operations/replicate", + "/api/v1/correlations/", + "/internal/trino-ui/{cluster}/cluster_details_json", + "/api/unstable/profiles/list", + "/api/v2/app-builder/apps", + "/api/v2/agentless_scanning/setup_feedback/accounts/aws", + "/api/v2/identity_providers", + "/api/v2/cloud_security_management/resource_filters", + "/api/ui/event-platform/synthetics/facets", + "/api/v2/hamr", + "/api/v2/agentless_scanning/accounts/aws", + "/api/ui/event-platform/query/composite-list", + "/api/v2/users//orgs", + "/api/ui/security_monitoring/configuration/suppressions/rules/{ruleId}", + "/internal/api/v2/spark_jobs/{spark_job_id}/{retry_attempt}/state", + "/api/v2/quality-gates/evaluate", + "/source/list", + "/api/ui/siem-historical-detections/jobs/facet_info", + "/api/v1/trial", + "/overview/system_tiles", + "/api/v1/screen/integration/", + "/api/v1/downtime/search", + "/security", + "/internal/error-tracking/incoming", + "/v2/orgs/{orgId}/logs/config/archives/{externalId}", + "/api/unstable/team", + "/api/v2/internal/admin/switch_handle_post", + "/notebook", + "/v3/orgs/{orgId}/{trackType}/pipelines", + "/api/ui/data_streams/schemas", + "/integration/slack/configuration", + "/api/ui/security/appsec/responses/entities", + "/metric/distribution/list_summaries", + "/api/v1/downtime/cancel/by_scope", + "/api/unstable/stegadography/cache/{id}", + "/account/login/id/", + "/api/v1/health", + "/api/v2/spreadsheets/{spreadsheetID}/table-sheets/{sheetID}", + "/api/v2/static-analysis/repositories/counts/analysis", + "/api/v2/reference-tables", + "/api/v2/roles/{roleUuid}/permissions", + "/api/v1/synthetics/browser/tests/", + "/api/v2/incidents/config/org/settings/", + "/api/v2/roles/{roleUuid}/users", + "/api/v2/downtime", + "/api/v2/rum/replay/playlists", + "/api/v2/incidents/config/user-defined-fields", + "/api/v2/incidents//responders", + "/api/ui/twilio/voice/events", + "api/usage/v1/active-usage-types.json", + "/api/v2/audit/events", + "/api/v2/identity_providers//users", + "/api/v1/graph/embed", + "/api/v2/incidents/config/integrations//workflows", + "/api/v2/logs/views/mark-as-viewed", + "/api/ui/billing/last-updated", + "/signup_corp", + "/integration/github/private-apps/enrich-link", + "None", + "/api/v2/connection/integrations", + "/internal/doggo/search", + "/api/v2/source-code-integration/repositories-v2", + "/api/ui/billing/org/is-super", + "/api/v2/cases/projects", + "/api/v2/source-code-integration/code-owners", + "/api/v2/spans/events/search", + "/.well-known/apollo/server-health", + "/api/v2/on_prem_runners", + "/get_org_billing_data", + "/api/ui/product-catalog/be/ddm/product", + "/api/ui/product-catalog/bp/billing-dimension", + "/api/ui/product-catalog/rq/usage_attribution", + "/api/ui/product-catalog/be/billing-dimension", + "/api/ui/product-catalog/be/category", + "/api/ui/product-catalog/bp/percent-based", + "/api/v1/synthetics/browser/subtests//parents", + "/api/v2/authn_mappings/", + "/api/v2/on-call/presence/{resourceId}", + "/locks/delete", + "/api/v2/metrics//estimate", + "/api/v1/dashboard/recommendations_load_event//", + "/api/:version/runners/verify", + "/api/ui/integration/aws/integrationissues/account", + "/api/unstable/csm/onboarding/agents/count", + "/api/unstable/csm/onboarding/agents", + "/api/unstable/csm/onboarding/agents/facets", + "/api/v1/synthetics/browser/tests//results//artifacts", + "/api/v2/workflow_actions", + "/api/v2/apicatalog/facet/{facet}", + "/api/ui/csm/onboarding/agents/count", + "/api/ui/resource-catalog-api/distinct", + "/organization-settings/*", + "/api/v2/rum/replay/sessions//metadata", + "/api/ui/spans/custom-metrics", + "/services", + "/api/ui/obs-pipelines/pipelines/{pipelineId}", + "/api/v1/compliance_monitoring/findings/rule_based_view", + "/api/v2/static-analysis/repositories/products-enabled", + "/internal/cit/pr-comment", + "/v1/statement", + "/api/ui/integration/aws/integrationissues/status", + "/api/v2/py/pets", + "/process/agent_hosts", + "/api/unstable/smoke-test-go-classic-http/smoketest/grpc", + "/-/healthy", + "/api/unstable/smoke-test-go-classic-http-dest/smoketest/grpc", + "/api/unstable/smoke-test-go-classic-http/paginated/number-size", + "/api/unstable/smoke-test-go-classic-http/paginated/cursor", + "/internal/slack/event", + "/startup", + "/api/ui/data_streams/lag_metrics", + "/api/unstable/smoke-test-go-classic-http/paginated/offset-limit", + "/api/v1/synthetics/settings/default_locations", + "/api/v2/pets", + "/v2/orgs/{orgId}/security_monitoring/configuration/suppressions/rules/{ruleId}", + "/api/v2/actions-datastores/{datastoreId}", + "/api/unstable/on-prem-management-service/workflow-tasks/dequeue", + "/api/v1/search", + "/api/:version/job", + "/reports/v2/agents", + "/api/ui/ide/profiles/analytics", + "/api/ui/metrics/summary/export", + "/api/v2/paginated/cursor_limit", + "/api/v2/paginated/offset_limit", + "/api/ui/obs-pipelines/pipelines/{pipelineId}/relationships/draft", + "/api/v2/cloud_security_management/iac_remediation/code_location/finding", + "/api/v2/response_test/five", + "/api/v1/metrics", + "/api/v2/response_test/four", + "/api/v1/slo//corrections", + "/api/v2/paginated/number_size", + "/api/unstable/databases/recommendations/tags", + "/api/v2/services/integrations/opsgenie/oncalls", + "/api/v2/integration/aws/accounts", + "/u", + "/api/ui/security/appsec/responses/integrations", + "/api/v1/synthetics/tests/trigger/ci", + "/internal/reporting/job/heartbeat", + "/api/v1/integration/aws", + "/api/v2/incidents/incident_roles/reserved_roles", + "/downtime/monitors/match", + "/-/ready", + "/api/v1/security_analytics/rules", + "/v1/bundles/general", + "/api/ui/integrations//accounts", + "/api/ui/slo/summary_widget_query", + "/api/ui/workflows/", + "/api/unstable/data_security/summary", + "/api/v2/change-tracking/service_edges", + "/internal/v1/events", + "/api/ui/event-platform/secruntime/facets", + "/ticino/agent/", + "/api/unstable/cost/tag_keys/", + "/api/ui/apm/default_env_setting", + "/api/ui/security/appsec/responses/safeguards", + "/internal/gitlab/*", + "/api/intake/llm-obs/v1/eval-metric", + "/api/ui/remote_config/products/asm/waf/rules", + "/api/v2/workflow_actions/", + "^email_ses$", + "/api/v1/notebooks//cells", + "/api/v1/slo/saved_view/search", + "/jobs/spark_config", + "/api/ui/csm/onboarding/agents/heartbeats", + "/api/ui/remote_config/products/fleet/agents", + "/gateway/backend/all", + "/v1/task/{taskId}/results/{bufferId}", + "/api//apm/pipelines", + "/api/v2/rum/sankey", + "/api/unstable/cost/tag_groups", + "/api/v2/users/{user_id}/memberships", + "/api/v2/logs/config/custom-destinations", + "/api/v1/settings/favorite", + "/api/v2/event-correlation/rules", + "/api/v1/graph/snapshot", + "/api/v2/ddsql/user/csv", + "/api/v2/source-code-integration/get-file-link", + "/api/unstable/on-call/pages/facets", + "/api/ui/ide/profiles/flamegraph", + "/api/v2/metrics//active-configurations", + "/api/ui/data_streams/service_summary", + "/api/v1/inventories/taxonomy", + "/_internal/health", + "/api/v2/containers", + "/ready", + "/api/ui/apm/operation_names", + "/api/v1/logs/configuration/indexes", + "/orgs/{orgId}/integrations", + "/v1/issuer/sycamore/token", + "/api/v2/notifications/handles", + "/api/v2/workflow_templates", + "/api/v1/slo/preview_history", + "/event/explorer", + "/api/v1/service_dependencies", + "/infrastructure", + "/api/v2/static-analysis/secrets/rules", + "/v2/_scanning/{name:(?:(?:(?:[a-zA-Z0-9]", + "/orgs/{orgId}/security_analytics/default_rules", + "/api/ui/apm/host_group_keys", + "/api/ui/resource_catalog/list/group", + "/api/v1/downtime/", + "/api/v2/audit/events/search", + "/internal/v2/telemetry-archive/api/orgs/{orgID}/analytics/requests", + "/api/v1/dash/integration/", + "/gateway", + "/account/not_my_account", + "/api/v2/source-code-integration/repo-ids/search", + "/api/v2/tags/enrichment/{rulesetId}", + "/api//watchdog/stories/", + "/api/ui/integration/aws/metric_streams_config/{aws_account_config_id}", + "/api/ui/apps/categories", + "/api/ui/slo/search/tag_keys", + "/api/ui/workflows/{workflowId}", + "/api/unstable/data_security/resources/csv", + "/account/login/recaptcha", + "/api/ui/signup/event", + "/api/unstable/data_security/resources", + "/api/unstable/query-prediction/predict", + "/api/v1/synthetics/tests/fast", + "/api/v2/series", + "/process", + "/api//usage/hourly-attribution", + "/api/unstable/databases/datamodels/query", + "/kubernetes_jobs/", + "/v2/orgs/{orgId}/historical-indexes", + "/api/:version/projects/:id", + "/api/v2/security_monitoring/signals/search", + "/api/v1/logs/filters", + "/internal/csm/onboarding/capabilities", + "^create-element-with-user-provided-id$", + "/api/ui/reporting/recurrence/list", + "/specs//trigger", + } +) + +var ( + once sync.Once + testVector []SamplingKey +) + +func initTestVector() { + once.Do(func() { + testVector = make([]SamplingKey, len(httpMethods)*len(httpRoute)*len(httpStatusCodes)) + var mi, ri, si int + for i := range testVector { + testVector[i] = SamplingKey{ + Method: httpMethods[mi], + Route: httpRoute[ri], + StatusCode: httpStatusCodes[si], + } + if si = (si + 1) % len(httpStatusCodes); si == 0 { + if ri = (ri + 1) % len(httpRoute); ri == 0 { + mi++ + } + } + } + + // Shuffle the order of the key space so it's random, but use a constant-seed RNG so that all + // runs are equal (useful in benchmarks). + rand := rand.New(rand.NewSource(1337)) + rand.Shuffle(len(testVector), func(i int, j int) { testVector[i], testVector[j] = testVector[j], testVector[i] }) + }) +} diff --git a/internal/appsec/appsec.go b/internal/appsec/appsec.go index 0dc042caa1..fdc4444974 100644 --- a/internal/appsec/appsec.go +++ b/internal/appsec/appsec.go @@ -7,15 +7,18 @@ package appsec import ( "fmt" + "log/slog" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/go-libddwaf/v4" - appsecLog "github.com/DataDog/appsec-internal-go/log" - waf "github.com/DataDog/go-libddwaf/v3" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + globalinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" ) // Enabled returns true when AppSec is up and running. Meaning that the appsec build tag is enabled, the env var @@ -36,61 +39,62 @@ func RASPEnabled() bool { // Start AppSec when enabled is enabled by both using the appsec build tag and // setting the environment variable DD_APPSEC_ENABLED to true. func Start(opts ...config.StartOption) { - telemetry := newAppsecTelemetry() - defer telemetry.emit() + // TODO: Add support to configure the tracer via a public interface + if globalinternal.BoolEnv("_DD_APPSEC_BLOCKING_UNAVAILABLE", false) { + opts = append(opts, config.WithBlockingUnavailable(true)) + } + if globalinternal.BoolEnv("_DD_APPSEC_PROXY_ENVIRONMENT", false) { + opts = append(opts, config.WithProxyEnvironment()) + } + + startConfig := config.NewStartConfig(opts...) // AppSec can start either: - // 1. Manually thanks to DD_APPSEC_ENABLED + // 1. Manually thanks to DD_APPSEC_ENABLED (or via [config.WithEnablementMode]) // 2. Remotely when DD_APPSEC_ENABLED is undefined // Note: DD_APPSEC_ENABLED=false takes precedence over remote configuration // and enforces to have AppSec disabled. - enabled, set, err := config.IsEnabled() + mode, modeOrigin, err := startConfig.EnablementMode() if err != nil { - logUnexpectedStartError(err) - return - } - if set { - telemetry.addEnvConfig("DD_APPSEC_ENABLED", enabled) + // Even when DD_APPSEC_ENABLED is an empty string or unset, an error can be returned here + log.Debug("appsec: could not determine the AppSec enablement mode from DD_APPSEC_ENABLED: %s", err.Error()) } - // Check if AppSec is explicitly disabled - if set && !enabled { + defer registerAppsecStartTelemetry(mode, modeOrigin) + + if mode == config.ForcedOff { log.Debug("appsec: disabled by the configuration: set the environment variable DD_APPSEC_ENABLED to true to enable it") return } // Check whether libddwaf - required for Threats Detection - is ok or not - if ok, err := waf.Health(); !ok { + if ok, err := libddwaf.Usable(); !ok && err != nil { // We need to avoid logging an error to APM tracing users who don't necessarily intend to enable appsec - if set { - // DD_APPSEC_ENABLED is explicitly set so we log an error - log.Error("appsec: threats detection cannot be enabled for the following reasons: %vappsec: no security activities will be collected. Please contact support at https://docs.datadoghq.com/help/ for help.", err) + if mode == config.ForcedOn { + logUnexpectedStartError(err) } else { // DD_APPSEC_ENABLED is not set so we cannot know what the intent is here, we must log a // debug message instead to avoid showing an error to APM-tracing-only users. - log.Debug("appsec: remote activation of threats detection cannot be enabled for the following reasons: %v", err) + telemetrylog.Error("appsec: remote activation of threats detection cannot be enabled", slog.Any("error", telemetrylog.NewSafeError(err))) } return } // From this point we know that AppSec is either enabled or can be enabled through remote config - cfg, err := config.NewConfig() + cfg, err := startConfig.NewConfig() if err != nil { logUnexpectedStartError(err) return } - for _, opt := range opts { - opt(cfg) - } appsec := newAppSec(cfg) // Start the remote configuration client log.Debug("appsec: starting the remote configuration client") if err := appsec.startRC(); err != nil { - log.Error("appsec: Remote config: disabled due to an instanciation error: %v", err) + telemetrylog.Error("appsec: Remote config: disabled due to an instantiation error", slog.Any("error", telemetrylog.NewSafeError(err))) } - if !set { + if mode == config.RCStandby { // AppSec is not enforced by the env var and can be enabled through remote config log.Debug("appsec: %s is not set, appsec won't start until activated through remote configuration", config.EnvEnabled) if err := appsec.enableRemoteActivation(); err != nil { @@ -100,17 +104,25 @@ func Start(opts ...config.StartOption) { return } log.Debug("appsec: awaiting for possible remote activation") - } else if err := appsec.start(telemetry); err != nil { // AppSec is specifically enabled + setActiveAppSec(appsec) + return + } + + if err := appsec.start(); err != nil { // AppSec is specifically enabled logUnexpectedStartError(err) appsec.stopRC() return } + setActiveAppSec(appsec) } // Implement the AppSec log message C1 func logUnexpectedStartError(err error) { - log.Error("appsec: could not start because of an unexpected error: %v\nNo security activities will be collected. Please contact support at https://docs.datadoghq.com/help/ for help.", err) + log.Error("appsec: could not start because of an unexpected error: %s\nNo security activities will be collected. Please contact support at https://docs.datadoghq.com/help/ for help.", err.Error()) + + telemetrylog.Error("appsec: could not start because of an unexpected error", slog.Any("error", telemetrylog.NewSafeError(err))) + telemetry.ProductStartError(telemetry.NamespaceAppSec, err) } // Stop AppSec. @@ -147,9 +159,9 @@ func newAppSec(cfg *config.Config) *appsec { } // Start AppSec by registering its security protections according to the configured the security rules. -func (a *appsec) start(telemetry *appsecTelemetry) error { +func (a *appsec) start() error { // Load the waf to catch early errors if any - if ok, err := waf.Load(); err != nil { + if ok, err := libddwaf.Load(); err != nil { // 1. If there is an error and the loading is not ok: log as an unexpected error case and quit appsec // Note that we assume here that the test for the unsupported target has been done before calling // this method, so it is now considered an error for this method @@ -157,7 +169,7 @@ func (a *appsec) start(telemetry *appsecTelemetry) error { return fmt.Errorf("error while loading libddwaf: %w", err) } // 2. If there is an error and the loading is ok: log as an informative error where appsec can be used - log.Error("appsec: non-critical error while loading libddwaf: %v", err) + log.Error("appsec: non-critical error while loading libddwaf: %s", err.Error()) } // Register dyngo listeners @@ -174,7 +186,6 @@ func (a *appsec) start(telemetry *appsecTelemetry) error { // TODO: log the config like the APM tracer does but we first need to define // an user-friendly string representation of our config and its sources - telemetry.setEnabled() return nil } @@ -183,10 +194,8 @@ func (a *appsec) stop() { if !a.started { return } - telemetry := newAppsecTelemetry() - defer telemetry.emit() - a.started = false + registerAppsecStopTelemetry() // Disable RC blocking first so that the following is guaranteed not to be concurrent anymore. a.disableRCBlocking() @@ -196,9 +205,8 @@ func (a *appsec) stop() { // Disable the currently applied instrumentation dyngo.SwapRootOperation(nil) - // Reset rules edits received from the remote configuration - // We skip the error because we can't do anything about and it was already logged in config.NewRulesManager - a.cfg.RulesManager, _ = config.NewRulesManager(nil) + // Close the WAF manager to release all resources associated with it + a.cfg.WAFManager.Reset() // TODO: block until no more requests are using dyngo operations @@ -208,16 +216,3 @@ func (a *appsec) stop() { a.features = nil } - -func init() { - appsecLog.SetBackend(appsecLog.Backend{ - Debug: log.Debug, - Info: log.Info, - Warn: log.Warn, - Errorf: func(s string, a ...any) error { - err := fmt.Errorf(s, a...) - log.Error(err.Error()) - return err - }, - }) -} diff --git a/internal/appsec/appsec_test.go b/internal/appsec/appsec_test.go index af23d26d1d..b8b7cc1c18 100644 --- a/internal/appsec/appsec_test.go +++ b/internal/appsec/appsec_test.go @@ -10,18 +10,20 @@ import ( "strconv" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - - waf "github.com/DataDog/go-libddwaf/v3" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/DataDog/go-libddwaf/v4" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestEnabled(t *testing.T) { enabledConfig, _ := strconv.ParseBool(os.Getenv(config.EnvEnabled)) - wafSupported, _ := waf.Health() + wafSupported, _ := libddwaf.Usable() canBeEnabled := enabledConfig && wafSupported require.False(t, appsec.Enabled()) @@ -36,6 +38,65 @@ func TestStartStop(t *testing.T) { // Use t.Setenv() to automatically restore the initial env var value, if set t.Setenv(config.EnvEnabled, "") os.Unsetenv(config.EnvEnabled) - appsec.Start() + testutils.StartAppSec(t) appsec.Stop() } + +func TestAppsecEnabledTelemetry(t *testing.T) { + t.Run("default", func(t *testing.T) { + var telemetryClient telemetrytest.RecordClient + defer telemetry.MockClient(&telemetryClient)() + t.Setenv(config.EnvEnabled, "") + + appsec.Start() + defer appsec.Stop() + + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: config.EnvEnabled, Value: false, Origin: telemetry.OriginDefault}) + }) + + t.Run("env_enabled", func(t *testing.T) { + var telemetryClient telemetrytest.RecordClient + defer telemetry.MockClient(&telemetryClient)() + t.Setenv(config.EnvEnabled, "true") + + appsec.Start() + defer appsec.Stop() + + shouldBeEnabled, _ := libddwaf.Usable() + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: config.EnvEnabled, Value: shouldBeEnabled, Origin: telemetry.OriginEnvVar}) + }) + + t.Run("env_disable", func(t *testing.T) { + var telemetryClient telemetrytest.RecordClient + defer telemetry.MockClient(&telemetryClient)() + t.Setenv(config.EnvEnabled, "false") + + appsec.Start() + defer appsec.Stop() + + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: config.EnvEnabled, Value: false, Origin: telemetry.OriginEnvVar}) + }) + + t.Run("code_enabled", func(t *testing.T) { + var telemetryClient telemetrytest.RecordClient + defer telemetry.MockClient(&telemetryClient)() + t.Setenv(config.EnvEnabled, "") + + appsec.Start(config.WithEnablementMode(config.ForcedOn)) + defer appsec.Stop() + + shouldBeEnabled, _ := libddwaf.Usable() + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: config.EnvEnabled, Value: shouldBeEnabled, Origin: telemetry.OriginCode}) + }) + + t.Run("code_enabled", func(t *testing.T) { + var telemetryClient telemetrytest.RecordClient + defer telemetry.MockClient(&telemetryClient)() + t.Setenv(config.EnvEnabled, "") + + appsec.Start(config.WithEnablementMode(config.ForcedOff)) + defer appsec.Stop() + + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: config.EnvEnabled, Value: false, Origin: telemetry.OriginCode}) + }) +} diff --git a/internal/appsec/body/body.go b/internal/appsec/body/body.go new file mode 100644 index 0000000000..e96a4bedf3 --- /dev/null +++ b/internal/appsec/body/body.go @@ -0,0 +1,99 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package body + +import ( + "bytes" + "errors" + "fmt" + "io" + "mime" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/appsec/body/json" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/go-libddwaf/v4" +) + +// IsBodySupported checks if the body should be analyzed based on content type +func IsBodySupported(contentType string) bool { + if contentType == "" { + return false + } + + parsedCT, _, err := mime.ParseMediaType(contentType) + if err != nil { + log.Debug("failed to parse content type %q: %s", contentType, err.Error()) + return false + } + + return strings.HasSuffix(parsedCT, "json") +} + +// NewEncodable creates a new libddwaf.Encodable from an io.ReadCloser with a size limit +// It reads up to 'limit' bytes from the reader and returns an error if reading fails +// If the content is larger than 'limit', it will be truncated and the returned Encodable will have the truncated flag set to true +// The given reader is not closed by this function and is replaced by a new io.ReadCloser that reads the all the data as if +// this function had not been called. +func NewEncodable(contentType string, reader *io.ReadCloser, limit int) (libddwaf.Encodable, error) { + if !IsBodySupported(contentType) { + return nil, nil + } + + if reader == nil || *reader == nil { + return nil, errors.New("reader is nil") + } + + limitedReader := io.LimitedReader{ + R: *reader, + N: int64(limit), + } + + data, err := io.ReadAll(&limitedReader) + if err != nil { + return nil, fmt.Errorf("failed to read data: %w", err) + } + + var newReader io.Reader = bytes.NewReader(data) + + truncated := false + if len(data) >= limit { + data = data[:limit] + newReader = io.MultiReader(newReader, *reader) + truncated = true + } + + *reader = &readerAndCloser{ + Reader: newReader, + Closer: *reader, + } + + return NewEncodableFromData(contentType, data, truncated) +} + +type readerAndCloser struct { + io.Reader + io.Closer +} + +func NewEncodableFromData(contentType string, data []byte, truncated bool) (libddwaf.Encodable, error) { + parsedCT, _, err := mime.ParseMediaType(contentType) + if err != nil { + log.Debug("failed to parse content type, no body parsing will be performed on data type: %s", err.Error()) + return nil, err + } + + switch { + // Handle cases like: + // * application/json: https://www.iana.org/assignments/media-types/application/json + // * application/vnd.api+json: https://jsonapi.org/ + // * text/json: https://mimetype.io/text/json + case strings.HasSuffix(parsedCT, "json"): + return json.NewEncodableFromData(data, truncated), nil + } + + return nil, fmt.Errorf("unsupported content type: %s", contentType) +} diff --git a/internal/appsec/body/body_test.go b/internal/appsec/body/body_test.go new file mode 100644 index 0000000000..62c2dcb116 --- /dev/null +++ b/internal/appsec/body/body_test.go @@ -0,0 +1,91 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package body + +import ( + "bytes" + "errors" + "io" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewEncodable_UnsupportedContentType(t *testing.T) { + r := io.NopCloser(bytes.NewReader([]byte(`{"key":"value"}`))) + reader := &r + enc, err := NewEncodable("text/plain", reader, 100) + assert.Nil(t, enc) + assert.NoError(t, err) +} + +func TestNewEncodable_NilReader(t *testing.T) { + var reader *io.ReadCloser + enc, err := NewEncodable("application/json", reader, 100) + assert.Nil(t, enc) + assert.Error(t, err) +} + +func TestNewEncodable_ValidJSON(t *testing.T) { + r := io.NopCloser(bytes.NewReader([]byte(`{"key":"value"}`))) + reader := &r + enc, err := NewEncodable("application/json", reader, 100) + assert.NotNil(t, enc) + assert.NoError(t, err) +} + +func TestNewEncodable_Truncated(t *testing.T) { + r := io.NopCloser(bytes.NewReader([]byte(`{"key":"value","extra":"data"}`))) + reader := &r + enc, err := NewEncodable("application/json", reader, 10) + assert.NotNil(t, enc) + assert.NoError(t, err) +} + +func TestOriginalReaderIsUsable(t *testing.T) { + originalData := `{"key":"value","extra":"data"}` + r := io.NopCloser(strings.NewReader(originalData)) + reader := &r + enc, err := NewEncodable("application/json", reader, 1000) + assert.NotNil(t, enc) + assert.NoError(t, err) + + // Read from the original reader + data, err := io.ReadAll(*reader) + assert.NoError(t, err) + + assert.Equal(t, originalData, string(data)) +} + +func TestOriginalReaderIsUsableLowerLimit(t *testing.T) { + originalData := `{"key":"value","extra":"data"}` + r := io.NopCloser(strings.NewReader(originalData)) + reader := &r + enc, err := NewEncodable("application/json", reader, 10) + assert.NotNil(t, enc) + assert.NoError(t, err) + + // Read from the original reader + data, err := io.ReadAll(*reader) + assert.NoError(t, err) + + assert.Equal(t, originalData, string(data)) +} + +func TestNewEncodable_ReadError(t *testing.T) { + badReader := io.NopCloser(&errorReader{}) + reader := &badReader + enc, err := NewEncodable("application/json", reader, 100) + assert.Nil(t, enc) + assert.Error(t, err) +} + +type errorReader struct{} + +func (e *errorReader) Read(p []byte) (int, error) { + return 0, errors.New("read error") +} diff --git a/internal/appsec/body/json/encoder_test.go b/internal/appsec/body/json/encoder_test.go new file mode 100644 index 0000000000..1a0972a1db --- /dev/null +++ b/internal/appsec/body/json/encoder_test.go @@ -0,0 +1,725 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package json + +import ( + "encoding/json" + "fmt" + "math" + "math/rand" + "reflect" + "runtime" + "sort" + "testing" + + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" + + "github.com/stretchr/testify/require" +) + +type testCase struct { + name string + jsonInput string + encoderSetup func(e *libddwaf.EncoderConfig) // For configuring limits + expectOutput any + expectEncodingError bool + expectedDecodingError bool + truncations map[libddwaf.TruncationReason][]int +} + +func verifyTestCases(t *testing.T, pinner *runtime.Pinner, tc testCase, initiallyTruncated bool, checkOutput bool) { + for name, encodableFunc := range map[string]func([]byte, bool) libddwaf.Encodable{ + "jsoniter": newJSONIterEncodableFromData, + "simdjson": NewEncodableFromData, + } { + + t.Run(name, func(t *testing.T) { + encoder := encodableFunc([]byte(tc.jsonInput), initiallyTruncated) + config := newTestMaxJSONEncoderConfig(pinner) + + if tc.encoderSetup != nil { + tc.encoderSetup(&config) + } + + wafObj := &libddwaf.WAFObject{} + truncations, err := encoder.Encode(config, wafObj, config.MaxObjectDepth) + + // Check truncations + if len(tc.truncations) == 0 { + require.Empty(t, truncations, "Expected no truncations") + } else { + require.Equal(t, sortTruncations(tc.truncations), sortTruncations(truncations), "truncations mismatch") + } + + // Check on expected error, when there is an error, the WAFObject is in an undefined state + if tc.expectEncodingError { + require.Error(t, err, "Expected encoding to fail with an error") + return + } + + require.NoError(t, err, "Encode failed with an error") + require.False(t, wafObj.IsUnusable(), "The WAFObject should not be Nil nor Invalid") + + if !checkOutput { + return + } + + decoded, decodeErr := wafObj.AnyValue() + + if tc.expectedDecodingError { + require.Error(t, decodeErr, "Expected decoding to fail with an error") + return + } + + require.NoError(t, decodeErr, "Decode failed with an error") + require.True(t, reflect.DeepEqual(tc.expectOutput, decoded), fmt.Sprintf("Decoded object mismatch.\nExpected: %v\nGot: %v", tc.expectOutput, decoded)) + }) + } +} + +func TestJSONEncode_SimpleTypes(t *testing.T) { + var pinner runtime.Pinner + defer pinner.Unpin() + + testCases := []testCase{ + { + name: "null", + jsonInput: `null`, + expectEncodingError: true, // The null value in the root of the json will result in a Nil WAF Object + }, + { + name: "boolean true", + jsonInput: `true`, + expectOutput: true, + }, + { + name: "boolean false", + jsonInput: `false`, + expectOutput: false, + }, + { + name: "simple string", + jsonInput: `"hello world"`, + expectOutput: "hello world", + }, + { + name: "empty string", + jsonInput: `""`, + expectOutput: "", + }, + { + name: "integer zero", + jsonInput: `0`, + expectOutput: int64(0), + }, + { + name: "positive integer", + jsonInput: `12345`, + expectOutput: int64(12345), + }, + { + name: "negative integer", + jsonInput: `-67890`, + expectOutput: int64(-67890), + }, + { + name: "float zero", + jsonInput: `0.0`, + expectOutput: float64(0.0), + }, + { + name: "positive float", + jsonInput: `123.456`, + expectOutput: float64(123.456), + }, + { + name: "negative float", + jsonInput: `-78.901`, + expectOutput: float64(-78.901), + }, + { + name: "float scientific", + jsonInput: `1.23e4`, // 12300 + expectOutput: float64(12300), + }, + { + name: "large integer (fits int64)", + jsonInput: `9223372036854775807`, // MaxInt64 + expectOutput: int64(9223372036854775807), + }, + { + name: "very large integer (becomes float64)", + jsonInput: `9223372036854775808`, // MaxInt64 + 1 + expectOutput: float64(9223372036854775808), + }, + { + name: "very large negative integer (becomes float64)", + jsonInput: `-9223372036854775809`, // MinInt64 - 1 + expectOutput: float64(-9223372036854775809), + }, + { + name: "number too large for float64 (becomes string)", + jsonInput: `1e400`, // Too large for float64 + expectOutput: "1e400", // Expected to be stored as string + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + verifyTestCases(t, &pinner, tc, false, true) + }) + } +} + +func TestJSONEncode_Arrays(t *testing.T) { + var pinner runtime.Pinner + defer pinner.Unpin() + + testCases := []testCase{ + { + name: "empty array", + jsonInput: `[]`, + expectOutput: []any{}, + }, + { + name: "simple array of numbers", + jsonInput: `[1, 2, 3]`, + expectOutput: []any{int64(1), int64(2), int64(3)}, + }, + { + name: "array of mixed types", + jsonInput: `[1, "two", true, null, 3.14]`, + expectOutput: []any{int64(1), "two", true, float64(3.14)}, + }, + { + name: "nested arrays", + jsonInput: `[[1, 2], ["three"], [], [true, null]]`, + expectOutput: []any{ + []any{int64(1), int64(2)}, + []any{"three"}, + []any{}, + []any{true}, + }, + }, + { + name: "array container too large", + jsonInput: `[1, 2, 3, 4, 5, 6]`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxContainerSize = 3 + }, + expectOutput: []any{int64(1), int64(2), int64(3)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ContainerTooLarge: {6}}, + }, + { + name: "double array container too large", + jsonInput: `[1, [11, 22, 33, 44, 55, 66], 3, 4, 5]`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxContainerSize = 3 + }, + expectOutput: []any{int64(1), []any{int64(11), int64(22), int64(33)}, int64(3)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ContainerTooLarge: {6, 5}}, + }, + { + name: "array depth", + jsonInput: `[1, 2, [4, 5]]`, // Depth 3 for the innermost array containing 1 + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 1 + }, + expectOutput: []any{int64(1), int64(2)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ObjectTooDeep: {2}}, + }, + { + name: "array object too deep", + jsonInput: `[[[1]]]`, // Depth 3 for the innermost array containing 1 + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 2 + }, + expectOutput: []any{[]any{}}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ObjectTooDeep: {3}}, + }, + { + name: "array object too deep - simple", + jsonInput: `[0, [1, 2], 3]`, // Depth 2 for the innermost array containing 1 + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 1 + }, + expectOutput: []any{int64(0), int64(3)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ObjectTooDeep: {2}}, + }, + { + name: "array object too deep - complex", + jsonInput: `[1, [2, [3, "deep"]]]`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 3 // Allows [1], [2, ...], [3, "deep"]. "deep" string is at depth 3 with its array. + }, + expectOutput: []any{int64(1), []any{int64(2), []any{int64(3), "deep"}}}, + }, + { + name: "array object too deep - at limit", + jsonInput: `[1, [2, [3, "deep"]]]`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 2 // Allows [1], [2, ...]. The array [3, "deep"] is at depth 3. + }, + expectOutput: []any{int64(1), []any{int64(2)}}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ObjectTooDeep: {3}}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + verifyTestCases(t, &pinner, tc, false, true) + }) + } +} + +func TestJSONEncode_Objects(t *testing.T) { + var pinner runtime.Pinner + defer pinner.Unpin() + + testCases := []testCase{ + { + name: "empty object", + jsonInput: `{}`, + expectOutput: map[string]any{}, + }, + { + name: "simple object", + jsonInput: `{"key1": "value1", "key2": 123, "key3": true, "key4": null, "key5": 3.14}`, + expectOutput: map[string]any{"key1": "value1", "key2": int64(123), "key3": true, "key4": nil, "key5": float64(3.14)}, + }, + { + name: "nested object", + jsonInput: `{"level1_key1": "value1", "level1_key2": {"level2_key1": 456, "level2_key2": {"level3_key1": "deep_value"}}}`, + expectOutput: map[string]any{ + "level1_key1": "value1", + "level1_key2": map[string]any{ + "level2_key1": int64(456), + "level2_key2": map[string]any{ + "level3_key1": "deep_value", + }, + }, + }, + }, + { + name: "object container too large", + jsonInput: `{"a":1, "b":2, "c":3, "d":4, "e":5}`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxContainerSize = 3 + }, + expectOutput: map[string]any{"a": int64(1), "b": int64(2), "c": int64(3)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ContainerTooLarge: {5}}, + }, + { + name: "double object container too large", + jsonInput: `{"a":1, "b": { "aa": 11, "bb": 22, "cc": 33, "dd": 44, "ee": 55, "ff": 66 }, "c":3, "d":4, "e":5}`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxContainerSize = 3 + }, + expectOutput: map[string]any{"a": int64(1), "b": map[string]any{"aa": int64(11), "bb": int64(22), "cc": int64(33)}, "c": int64(3)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ContainerTooLarge: {5, 6}}, + }, + { + name: "object key string too long", + jsonInput: `{"verylongkeyname": 1, "shortkey": 2}`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxStringSize = 5 + }, + expectOutput: map[string]any{"veryl": int64(1), "short": int64(2)}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.StringTooLong: {15, 8}}, // Lengths of "verylongkeyname" and "shortkey" + }, + { + name: "object value string too long", + jsonInput: `{"key1": "verylongstringvalue", "key2": "short"}`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxStringSize = 5 + }, + expectOutput: map[string]any{"key1": "veryl", "key2": "short"}, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.StringTooLong: {19}}, // Length of "verylongstringvalue" + }, + { + name: "object object too deep", + jsonInput: `{"a": {"b": {"c": 1}}}`, // c:1 is at depth 3 (obj a, obj b, obj c) + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 2 + }, + // As the map is truncated, the "c" object value is replaced by an invalid wAF object + // thus returning a decoding error + expectedDecodingError: true, + expectOutput: nil, + truncations: map[libddwaf.TruncationReason][]int{libddwaf.ObjectTooDeep: {3}}, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + verifyTestCases(t, &pinner, tc, false, true) + }) + } +} + +func TestJSONEncode_MalformedInput(t *testing.T) { + var pinner runtime.Pinner + defer pinner.Unpin() + + type sharedTestCase struct { + name string + jsonInput string + encoderSetup func(e *libddwaf.EncoderConfig) // For configuring limits + truncatedTestCase testCase + notTruncatedTestCase testCase + } + + testCases := []sharedTestCase{ + { + name: "malformed json - missing value", + jsonInput: `{"k":`, + truncatedTestCase: testCase{ + expectOutput: map[string]any{"k": nil}, + expectedDecodingError: true, // Decoding error expected due to nil as WAFInvalidType + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "malformed json - unclosed object", + jsonInput: `{"key": "value"`, + truncatedTestCase: testCase{ + expectOutput: map[string]any{"key": "value"}, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + // malformed json - full discard + name: "malformed json - trailing comma in array", + jsonInput: `[1, 2, ]`, + truncatedTestCase: testCase{ + expectEncodingError: true, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "malformed json - trailing comma in array", + jsonInput: `[1, 2,`, + truncatedTestCase: testCase{ + expectOutput: []any{int64(1), int64(2)}, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "malformed json - trailing comma in object", + jsonInput: `{"key1":"val1",`, + truncatedTestCase: testCase{ + expectOutput: map[string]any{"key1": "val1"}, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "array first object key truncated", + jsonInput: `[{"name": "value", "test`, + truncatedTestCase: testCase{ + expectOutput: []any{map[string]any{"name": "value"}}, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "object in object with key truncated", + jsonInput: `{"name": {"key": "val", "test`, + truncatedTestCase: testCase{ + expectOutput: map[string]any{"name": map[string]any{"key": "val"}}, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "malformed json - missing colon", + jsonInput: `{"key" "value"}`, + truncatedTestCase: testCase{ + expectEncodingError: true, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "malformed json - bare string", + jsonInput: `hello world`, + truncatedTestCase: testCase{ + expectEncodingError: true, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "root string too long", + jsonInput: `"thisisaverylongstringthatwillbetruncated"`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxStringSize = 10 + }, + truncatedTestCase: testCase{ + expectOutput: "thisisaver", + truncations: map[libddwaf.TruncationReason][]int{libddwaf.StringTooLong: {40}}, // Length of original string + }, + notTruncatedTestCase: testCase{ + expectOutput: "thisisaver", + truncations: map[libddwaf.TruncationReason][]int{libddwaf.StringTooLong: {40}}, + }, + }, + { + name: "root level not an object or array - max depth 0", + jsonInput: `"string"`, // A string is not a container, depth is effectively 0 for it. + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 0 + }, + truncatedTestCase: testCase{ + expectOutput: "string", + }, + notTruncatedTestCase: testCase{ + expectOutput: "string", + }, + }, + { + name: "object max depth 0 - actual object", + jsonInput: `{}`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 0 + }, + truncatedTestCase: testCase{ + expectEncodingError: true, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + { + name: "array max depth 0 - actual array", + jsonInput: `[]`, + encoderSetup: func(e *libddwaf.EncoderConfig) { + e.MaxObjectDepth = 0 + }, + truncatedTestCase: testCase{ + expectEncodingError: true, + }, + notTruncatedTestCase: testCase{ + expectEncodingError: true, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tc.truncatedTestCase.encoderSetup = tc.encoderSetup + tc.truncatedTestCase.jsonInput = tc.jsonInput + + tc.notTruncatedTestCase.encoderSetup = tc.encoderSetup + tc.notTruncatedTestCase.jsonInput = tc.jsonInput + + // Test with truncation + t.Run("truncated", func(t *testing.T) { + verifyTestCases(t, &pinner, tc.truncatedTestCase, true, true) + }) + + // Test without truncation + t.Run("not truncated", func(t *testing.T) { + verifyTestCases(t, &pinner, tc.notTruncatedTestCase, false, true) + }) + }) + } +} + +func TestJSONEncode_TruncatedInput_AllStringError(t *testing.T) { + var pinner runtime.Pinner + defer pinner.Unpin() + + input := `{"a": 1, "b": [[], false, {"c": 3.0}, "d"], "e": true}` + + // Loop through the input string and remove a character at the end and check that the parsing errors out every time + for i := 0; i < len(input); i++ { + if i == 0 { + continue // First loop is the full valid json + } + + newInput := input[:len(input)-i] + testName := fmt.Sprintf("truncated invalid structure: %s", newInput) + t.Run(testName, func(t *testing.T) { + tc := testCase{ + name: testName, + jsonInput: newInput, + expectEncodingError: true, + } + + verifyTestCases(t, &pinner, tc, false, false) + }) + } +} + +func TestJSONEncode_TruncatedInvalidStructure(t *testing.T) { + var pinner runtime.Pinner + defer pinner.Unpin() + + inputsEncodingError := []string{ + `{'k'`, + `{[]}`, + `{{}}`, + `{hello: world}`, + `{"hello":: 1}`, + `{1: 2}`, + `[,,]`, + `[1,,2]`, + `["Hello", 3.14, true, ]`, + `["Hello", 3.14, true,]`, + `["k": "v"]`, + `hello world`, + } + + t.Run("truncated invalid structure", func(t *testing.T) { + for _, input := range inputsEncodingError { + testName := "truncated invalid structure: " + input + t.Run(testName, func(t *testing.T) { + tc := testCase{ + name: testName, + jsonInput: input, + expectEncodingError: true, + } + + verifyTestCases(t, &pinner, tc, true, true) + }) + } + }) + + // Using the current `jsoniter` library, when a provided json is malformed on the last character, + // it's difficult to know if the error is due to an EOF or by the fact that the json is malformed (while being initially truncated). + // In this case, we won't errors out but return the partially parsed object as is. + + inputsThatShouldErrorButPass := map[string]any{ + `{"k": 1 ,}`: map[string]any{"k": int64(1)}, // '}' unexpected, should have saw a '"' for string key + `{"k": 1, "v}`: map[string]any{"k": int64(1)}, // '}' unexpected, should have saw a '"' for end of string key + `{"a}`: map[string]any{}, // No key because the value is not parsed completely + `{"t"}`: map[string]any{}, // No key because the ':' is not found + `{"k"`: map[string]any{}, // No key because the ':' is not found + `[1"`: []any{int64(1)}, // '1' parsed then iter over, '"' is found and was expecting a comma or a closing bracket + } + + t.Run("truncated invalid structure that should error but pass", func(t *testing.T) { + for k, v := range inputsThatShouldErrorButPass { + t.Run(k, func(t *testing.T) { + tc := testCase{ + jsonInput: k, + expectOutput: v, + } + + verifyTestCases(t, &pinner, tc, true, true) + }) + } + }) +} + +// newTestMaxJSONEncoderConfig creates a new JSON encoder configuration for testing purposes with all configs set to max +func newTestMaxJSONEncoderConfig(pinner *runtime.Pinner) libddwaf.EncoderConfig { + tm, err := timer.NewTimer(timer.WithUnlimitedBudget()) + if err != nil { + panic(err) + } + + return libddwaf.EncoderConfig{ + Pinner: pinner, + Timer: tm, + MaxObjectDepth: math.MaxInt, + MaxContainerSize: math.MaxInt, + MaxStringSize: math.MaxInt, + } +} + +// sortTruncations sorts the truncation values for consistent comparison +func sortTruncations(truncations map[libddwaf.TruncationReason][]int) map[libddwaf.TruncationReason][]int { + if truncations == nil { + return nil + } + for k := range truncations { + sort.Ints(truncations[k]) + } + return truncations +} + +func BenchmarkEncoder(b *testing.B) { + rnd := rand.New(rand.NewSource(33)) + buf := make([]byte, 16384) + n, err := rnd.Read(buf) + fullstr := string(buf) + encodeTimer, _ := timer.NewTimer(timer.WithUnlimitedBudget()) + var pinner runtime.Pinner + defer pinner.Unpin() + + for _, l := range []int{4, 16, 128, 1024, 4096} { + config := libddwaf.EncoderConfig{ + Pinner: &pinner, + MaxObjectDepth: 10, + MaxStringSize: 1 * 1024 * 1024, + MaxContainerSize: 100, + Timer: encodeTimer, + } + + for name, encodableFunc := range map[string]func([]byte) libddwaf.Encodable{ + "jsoniter": func(data []byte) libddwaf.Encodable { + return newJSONIterEncodableFromData(data, false) + }, + "simdjson": func(data []byte) libddwaf.Encodable { + return NewEncodableFromData(data, false) + }, + } { + b.Run(fmt.Sprintf("%s/%d", name, l), func(b *testing.B) { + b.ReportAllocs() + str := fullstr[:l] + slice := []string{str, str, str, str, str, str, str, str, str, str} + data := map[string]any{ + "k0": slice, + "k1": slice, + "k2": slice, + "k3": slice, + "k4": slice, + "k5": slice, + "k6": slice, + "k7": slice, + "k8": slice, + "k9": slice, + } + if err != nil || n != len(buf) { + b.Fatal(err) + } + bytes, err := json.Marshal(data) + if err != nil { + b.Fatal(err) + } + b.ResetTimer() + for i := 0; i < b.N; i++ { + encodable := encodableFunc(bytes) + var wafObj libddwaf.WAFObject + truncations, err := encodable.Encode(config, &wafObj, config.MaxObjectDepth) + if err != nil { + b.Fatalf("Error encoding: %v", err) + } + + runtime.KeepAlive(encodable) + runtime.KeepAlive(wafObj) + runtime.KeepAlive(truncations) + } + }) + } + } +} diff --git a/internal/appsec/body/json/jsoniter.go b/internal/appsec/body/json/jsoniter.go new file mode 100644 index 0000000000..9c1c38f7d7 --- /dev/null +++ b/internal/appsec/body/json/jsoniter.go @@ -0,0 +1,322 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package json + +import ( + "encoding/json" + "errors" + "fmt" + "io" + + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/waferrors" + + jsoniter "github.com/json-iterator/go" +) + +type jsonIterEncodable struct { + truncated bool + data []byte +} + +func newJSONIterEncodableFromData(data []byte, truncated bool) libddwaf.Encodable { + return &jsonIterEncodable{ + truncated: truncated, + data: data, + } +} + +func (e *jsonIterEncodable) ToEncoder(config libddwaf.EncoderConfig) *jsonIterEncoder { + iter := cfg.BorrowIterator(e.data) + + return &jsonIterEncoder{ + jsonIterEncodable: e, + config: config, + iter: iter, + } +} + +func (e *jsonIterEncodable) Encode(config libddwaf.EncoderConfig, obj *libddwaf.WAFObject, remainingDepth int) (map[libddwaf.TruncationReason][]int, error) { + encoder := e.ToEncoder(config) + + defer cfg.ReturnIterator(encoder.iter) + + if err := encoder.Encode(obj, remainingDepth); err != nil && (errors.Is(err, waferrors.ErrTimeout) || !e.truncated) { + // Return an error if a waf timeout error occurred, or we are in normal parsing mode + return nil, err + } + + if obj.IsUnusable() { + // Do not return an invalid root object + return nil, fmt.Errorf("invalid json at root") + } + + head := getIteratorHead(encoder.iter) + if head < len(e.data) { + // If the iterator head is not at the end of the array, it means that there are still bytes left in the buffer, + // thus alerting that a structural parsing error occurred (other than due to truncation) + return nil, fmt.Errorf("malformed JSON, expected end of input but found more data") + } + + return encoder.truncations, nil +} + +type jsonIterEncoder struct { + *jsonIterEncodable + truncations map[libddwaf.TruncationReason][]int + config libddwaf.EncoderConfig + iter *jsoniter.Iterator +} + +var cfg = jsoniter.Config{ + MarshalFloatWith6Digits: true, + EscapeHTML: true, +}.Froze() + +// addTruncation records a truncation event. +func (e *jsonIterEncoder) addTruncation(reason libddwaf.TruncationReason, size int) { + if e.truncations == nil { + e.truncations = make(map[libddwaf.TruncationReason][]int, 3) + } + e.truncations[reason] = append(e.truncations[reason], size) +} + +func (e *jsonIterEncoder) Encode(obj *libddwaf.WAFObject, remainingDepth int) error { + if e.config.Timer.Exhausted() { + return waferrors.ErrTimeout + } + + var err error + + switch e.iter.WhatIsNext() { + case jsoniter.ObjectValue: + return e.encodeObject(obj, remainingDepth-1) + case jsoniter.ArrayValue: + return e.encodeArray(obj, remainingDepth-1) + case jsoniter.StringValue: + s := e.iter.ReadString() + if err = e.iter.Error; err == nil || err == io.EOF { + e.encodeString(s, obj) + } + case jsoniter.NumberValue: + jsonNbr := e.iter.ReadNumber() + if err = e.iter.Error; err == nil || err == io.EOF { + err = nil + e.encodeJSONNumber(jsonNbr, obj) + } + case jsoniter.BoolValue: + b := e.iter.ReadBool() + if err = e.iter.Error; err == nil || err == io.EOF { + err = nil + obj.SetBool(b) + } + case jsoniter.NilValue: + e.iter.ReadNil() + if err = e.iter.Error; err == nil || err == io.EOF { + err = nil + obj.SetNil() + } + default: + return fmt.Errorf("unexpected JSON token: %v", e.iter.WhatIsNext()) + } + + return err +} + +func (e *jsonIterEncoder) encodeJSONNumber(num json.Number, obj *libddwaf.WAFObject) { + // Important to attempt int64 first, as this is lossless. Values that are either too small or too + // large to be represented as int64 can be represented as float64, but this can be lossy. + if i, err := num.Int64(); err == nil { + obj.SetInt(i) + return + } + + if f, err := num.Float64(); err == nil { + obj.SetFloat(f) + return + } + + // Could not store as int64 nor float, so we'll store it as a string... + e.encodeString(num.String(), obj) +} + +func (e *jsonIterEncoder) encodeString(str string, obj *libddwaf.WAFObject) { + strLen := len(str) + if strLen > e.config.MaxStringSize { + str = str[:e.config.MaxStringSize] + e.addTruncation(libddwaf.StringTooLong, strLen) + } + + obj.SetString(e.config.Pinner, str) +} + +// encodeMapKeyFromString takes a string and a wafObject and sets the map key attribute on the wafObject to the supplied +// string. The key may be truncated if it exceeds the maximum string size allowed by the jsonEncoder. +func (e *jsonIterEncoder) encodeMapKeyFromString(keyStr string, obj *libddwaf.WAFObject) { + size := len(keyStr) + if size > e.config.MaxStringSize { + keyStr = keyStr[:e.config.MaxStringSize] + e.addTruncation(libddwaf.StringTooLong, size) + } + + obj.SetMapKey(e.config.Pinner, keyStr) +} + +func (e *jsonIterEncoder) encodeObject(parentObj *libddwaf.WAFObject, depth int) error { + if e.config.Timer.Exhausted() { + return waferrors.ErrTimeout + } + + if depth < 0 { + e.addTruncation(libddwaf.ObjectTooDeep, e.config.MaxObjectDepth-depth) + e.iter.Skip() + if e.iter.Error != nil { + return e.iter.Error + } + + return skipErr + } + + var ( + errs []error + length int + wafObjs []libddwaf.WAFObject + ) + + e.iter.ReadObjectCB(func(_ *jsoniter.Iterator, field string) bool { + length++ + if e.config.Timer.Exhausted() { + errs = append(errs, waferrors.ErrTimeout) + return false + } + + if len(wafObjs) >= e.config.MaxContainerSize { + e.iter.Skip() + return true + } + + if e.iter.Error != nil { + // Note: We reject the object entry where the key field could not be parsed. + // A valid key field is considered to be a string wrapped inside quotes followed by a colon. + // We don't do partial parsing of the key, like assuming the key was full even if we don't detect the closing quote, + // this could cause bad API Security schema generation. + return false + } + + // The key of the object is set even if the value is invalid + wafObjs = append(wafObjs, libddwaf.WAFObject{}) + entryObj := &wafObjs[len(wafObjs)-1] + e.encodeMapKeyFromString(field, entryObj) + + if err := e.Encode(entryObj, depth); err != nil { + if errors.Is(err, io.EOF) && e.truncated { + return false + } + + entryObj.SetInvalid() + if err == skipErr { + return true + } + + errs = append(errs, fmt.Errorf("failed to encode value for key %q: %w", field, err)) + return false + } + + return true + }) + + if len(wafObjs) >= e.config.MaxContainerSize { + e.addTruncation(libddwaf.ContainerTooLarge, length) + } + + if err := e.extractIterError(); err != nil { + errs = append(errs, err) + } + parentObj.SetMapData(e.config.Pinner, wafObjs) + return errors.Join(errs...) +} + +func (e *jsonIterEncoder) encodeArray(parentObj *libddwaf.WAFObject, depth int) error { + if e.config.Timer.Exhausted() { + return waferrors.ErrTimeout + } + + if depth < 0 { + e.addTruncation(libddwaf.ObjectTooDeep, e.config.MaxObjectDepth-depth) + e.iter.Skip() + if e.iter.Error != nil { + return e.iter.Error + } + return skipErr + } + + var ( + errs []error + length int + wafObjs []libddwaf.WAFObject + ) + + e.iter.ReadArrayCB(func(_ *jsoniter.Iterator) bool { + length++ + if e.config.Timer.Exhausted() { + errs = append(errs, waferrors.ErrTimeout) + return false + } + + // We want to skip all the elements in the array if the length is reached + if len(wafObjs) >= e.config.MaxContainerSize { + e.iter.Skip() + return true + } + + wafObjs = append(wafObjs, libddwaf.WAFObject{}) + entryObj := &wafObjs[len(wafObjs)-1] + + if err := e.Encode(entryObj, depth); err != nil { + if errors.Is(err, io.EOF) && e.truncated { + return false + } + + wafObjs = wafObjs[:len(wafObjs)-1] // Remove the last element if encoding failed + if err == skipErr { + return true + } + + errs = append(errs, fmt.Errorf("failed to encode array element %d: %w", len(wafObjs)-1, err)) + return false + } + + if entryObj.IsUnusable() { + wafObjs = wafObjs[:len(wafObjs)-1] // Remove the last element if it is nil or invalid + } + + return true + }) + + if len(wafObjs) >= e.config.MaxContainerSize { + e.addTruncation(libddwaf.ContainerTooLarge, length) + } + + if err := e.extractIterError(); err != nil { + errs = append(errs, err) + } + parentObj.SetArrayData(e.config.Pinner, wafObjs) + return errors.Join(errs...) +} + +func (e *jsonIterEncoder) extractIterError() error { + if e.iter.Error == nil { + return nil + } + + err := e.iter.Error + head := getIteratorHead(e.iter) + if head == len(e.data) { + err = io.EOF + } + + return err +} diff --git a/internal/appsec/body/json/simdjson.go b/internal/appsec/body/json/simdjson.go new file mode 100644 index 0000000000..d408651153 --- /dev/null +++ b/internal/appsec/body/json/simdjson.go @@ -0,0 +1,296 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package json + +import ( + "errors" + "fmt" + "io" + "sync" + "unsafe" + + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/waferrors" + json "github.com/minio/simdjson-go" +) + +type Encodable struct { + truncated bool + data []byte + parsedJSON *json.ParsedJson +} + +var ( + parsedJSONPool sync.Pool +) + +func NewEncodableFromData(data []byte, truncated bool) libddwaf.Encodable { + parsedJSON, _ := parsedJSONPool.Get().(*json.ParsedJson) + pj, err := json.Parse(data, parsedJSON, json.WithCopyStrings(false)) + if err != nil { + // This can happen if a trivial JSON type is found like a string or number, in this case simply return a + // simpler encoder where performance is not critical. + return newJSONIterEncodableFromData(data, truncated) + } + + return &Encodable{ + truncated: truncated, + data: data, + parsedJSON: pj, + } +} + +func (e *Encodable) ToEncoder(config libddwaf.EncoderConfig) *encoder { + return &encoder{ + Encodable: e, + config: config, + } +} + +func (e *Encodable) Encode(config libddwaf.EncoderConfig, obj *libddwaf.WAFObject, remainingDepth int) (map[libddwaf.TruncationReason][]int, error) { + encoder := e.ToEncoder(config) + defer parsedJSONPool.Put(encoder.parsedJSON) + + iter := encoder.parsedJSON.Iter() + if err := encoder.Encode(obj, iter.Advance(), &iter, remainingDepth); err != nil && (errors.Is(err, waferrors.ErrTimeout) || !e.truncated) { + // Return an error if a waf timeout error occurred, or we are in normal parsing mode + return nil, err + } + + if obj.IsUnusable() { + // Do not return an invalid root object + return nil, fmt.Errorf("invalid json at root") + } + + return encoder.truncations, nil +} + +type encoder struct { + *Encodable + truncations map[libddwaf.TruncationReason][]int + config libddwaf.EncoderConfig +} + +type skipError struct{} + +func (skipError) Error() string { + return "skip error" +} + +var skipErr error = skipError{} + +// addTruncation records a truncation event. +func (e *encoder) addTruncation(reason libddwaf.TruncationReason, size int) { + if e.truncations == nil { + e.truncations = make(map[libddwaf.TruncationReason][]int, 3) + } + e.truncations[reason] = append(e.truncations[reason], size) +} + +func (e *encoder) Encode(obj *libddwaf.WAFObject, typ json.Type, iter *json.Iter, remainingDepth int) (err error) { + if e.config.Timer.Exhausted() { + return waferrors.ErrTimeout + } + + // EOF errors and non-fatal if we truncated the input. + defer func() { + if err == io.EOF && e.truncated { + err = nil + } + + if err != nil { + obj.SetInvalid() + } + }() + + if typ == json.TypeRoot { + typ, _, err = iter.Root(iter) + if err != nil { + return fmt.Errorf("failed to get root element: %w", err) + } + } + + switch typ { + case json.TypeObject: + return e.encodeObject(obj, iter, remainingDepth-1) + case json.TypeArray: + return e.encodeArray(obj, iter, remainingDepth-1) + case json.TypeString: + var value []byte + value, err = iter.StringBytes() + e.encodeString(value, obj) + case json.TypeInt: + var value int64 + value, err = iter.Int() + obj.SetInt(value) + case json.TypeUint: + var value uint64 + value, err = iter.Uint() + obj.SetUint(value) + case json.TypeFloat: + var value float64 + value, err = iter.Float() + obj.SetFloat(value) + case json.TypeBool: + var value bool + value, err = iter.Bool() + obj.SetBool(value) + case json.TypeNull: + obj.SetNil() + case json.TypeNone: + err = io.EOF + default: + return fmt.Errorf("unexpected JSON token: %v", typ) + } + + return err +} + +func (e *encoder) encodeString(str []byte, obj *libddwaf.WAFObject) { + strLen := len(str) + if strLen > e.config.MaxStringSize { + str = str[:e.config.MaxStringSize] + e.addTruncation(libddwaf.StringTooLong, strLen) + strLen = e.config.MaxStringSize + } + + obj.SetString(e.config.Pinner, unsafe.String(unsafe.SliceData(str), strLen)) +} + +// encodeMapKeyFromString takes a string and a wafObject and sets the map key attribute on the wafObject to the supplied +// string. The key may be truncated if it exceeds the maximum string size allowed by the jsonEncoder. +func (e *encoder) encodeMapKeyFromString(keyStr []byte, obj *libddwaf.WAFObject) { + size := len(keyStr) + if size > e.config.MaxStringSize { + keyStr = keyStr[:e.config.MaxStringSize] + e.addTruncation(libddwaf.StringTooLong, size) + size = e.config.MaxStringSize + } + + obj.SetMapKey(e.config.Pinner, unsafe.String(unsafe.SliceData(keyStr), size)) +} + +func (e *encoder) encodeObject(parentObj *libddwaf.WAFObject, iter *json.Iter, depth int) error { + if e.config.Timer.Exhausted() { + return waferrors.ErrTimeout + } + + if depth < 0 { + e.addTruncation(libddwaf.ObjectTooDeep, e.config.MaxObjectDepth-depth) + return skipErr + } + + var ( + errs []error + length int + wafObjs []libddwaf.WAFObject + ) + + var jsonObj json.Object + _, err := iter.Object(&jsonObj) + if err != nil { + return err + } + + var innerIter json.Iter + for key, typ, err := jsonObj.NextElementBytes(&innerIter); typ != json.TypeNone; key, typ, err = jsonObj.NextElementBytes(&innerIter) { + length++ + if e.config.Timer.Exhausted() { + errs = append(errs, waferrors.ErrTimeout) + break + } + + if err != nil { + errs = append(errs, err) + continue + } + + if len(wafObjs) >= e.config.MaxContainerSize { + innerIter.Advance() + continue + } + + wafObjs = append(wafObjs, libddwaf.WAFObject{}) + entryObj := &wafObjs[len(wafObjs)-1] + e.encodeMapKeyFromString(key, entryObj) + + if err := e.Encode(entryObj, typ, &innerIter, depth); err != nil { + entryObj.SetInvalid() + if err == skipErr || errors.Is(err, io.EOF) && e.truncated { + continue + } + + errs = append(errs, fmt.Errorf("failed to encode value for key %q: %w", key, err)) + break + } + } + + if len(wafObjs) >= e.config.MaxContainerSize { + e.addTruncation(libddwaf.ContainerTooLarge, length) + } + + parentObj.SetMapData(e.config.Pinner, wafObjs) + return errors.Join(errs...) +} + +func (e *encoder) encodeArray(parentObj *libddwaf.WAFObject, iter *json.Iter, depth int) error { + if e.config.Timer.Exhausted() { + return waferrors.ErrTimeout + } + + if depth < 0 { + e.addTruncation(libddwaf.ObjectTooDeep, e.config.MaxObjectDepth-depth) + return skipErr + } + + var ( + errs []error + length int + wafObjs []libddwaf.WAFObject + ) + + var jsonArray json.Array + _, err := iter.Array(&jsonArray) + if err != nil { + return err + } + + innerIter := jsonArray.Iter() + for typ := innerIter.Advance(); typ != json.TypeNone; typ = innerIter.Advance() { + length++ + if e.config.Timer.Exhausted() { + errs = append(errs, waferrors.ErrTimeout) + break + } + + if len(wafObjs) >= e.config.MaxContainerSize { + continue + } + + wafObjs = append(wafObjs, libddwaf.WAFObject{}) + entryObj := &wafObjs[len(wafObjs)-1] + if err := e.Encode(entryObj, typ, &innerIter, depth); err != nil { + wafObjs = wafObjs[:len(wafObjs)-1] + if err == skipErr { + continue + } + errs = append(errs, fmt.Errorf("failed to encode value: %w", err)) + break + } + + if entryObj.IsUnusable() { + // If the entry object is unusable, we skip it and continue with the next element. + wafObjs = wafObjs[:len(wafObjs)-1] // Remove the last element if nothing is worth encoding + } + } + + if len(wafObjs) >= e.config.MaxContainerSize { + e.addTruncation(libddwaf.ContainerTooLarge, length) + } + + parentObj.SetArrayData(e.config.Pinner, wafObjs) + return errors.Join(errs...) +} diff --git a/internal/appsec/body/json/unsafe.go b/internal/appsec/body/json/unsafe.go new file mode 100644 index 0000000000..0244b9b8fb --- /dev/null +++ b/internal/appsec/body/json/unsafe.go @@ -0,0 +1,40 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package json + +import ( + "reflect" + "runtime" + "unsafe" + + jsoniter "github.com/json-iterator/go" +) + +const intSize = unsafe.Sizeof(int(0)) + +var headOffset = getOffset("head") + +func getOffset(name string) uintptr { + typ := reflect.TypeFor[jsoniter.Iterator]() + field, found := typ.FieldByName(name) + if !found { + panic("jsoniter.Iterator does not have a field named '" + name + "'") + } + + if field.Type.Size() != intSize { + panic("jsoniter.Iterator field '" + name + "' is not of the right size") + } + + return field.Offset +} + +// getIteratorHead retrieves the head field from a jsoniter.Iterator. +// This is done using unsafe operations to avoid the overhead of reflection. +func getIteratorHead(iter *jsoniter.Iterator) int { + head := *(*int)(unsafe.Add(unsafe.Pointer(iter), headOffset)) + runtime.KeepAlive(iter) // Ensure the iterator is not garbage collected while we're using it + return head +} diff --git a/internal/appsec/config/config.go b/internal/appsec/config/config.go index 6ffcbafcf1..494358b06c 100644 --- a/internal/appsec/config/config.go +++ b/internal/appsec/config/config.go @@ -7,38 +7,29 @@ package config import ( "fmt" - "os" - "strconv" + "log/slog" "time" - internal "github.com/DataDog/appsec-internal-go/appsec" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + sharedinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" ) func init() { - registerAppConfigTelemetry() -} - -// Register the global app telemetry configuration. -func registerAppConfigTelemetry() { - registerSCAAppConfigTelemetry(telemetry.GlobalClient) + registerSCAAppConfigTelemetry() } // Register the global app telemetry configuration related to the Software Composition Analysis (SCA) product. // Report over telemetry whether SCA's enablement env var was set or not along with its value. Nothing is reported in // case of an error or if the env var is not set. -func registerSCAAppConfigTelemetry(client telemetry.Client) { - val, defined, err := parseBoolEnvVar(EnvSCAEnabled) +func registerSCAAppConfigTelemetry() { + _, _, err := stableconfig.Bool(EnvSCAEnabled, false) if err != nil { - log.Error("appsec: %v", err) + telemetrylog.Error("appsec: failed to get SCA config", slog.Any("error", telemetrylog.NewSafeError(err))) return } - if defined { - client.RegisterAppConfig(EnvSCAEnabled, val, telemetry.OriginEnvVar) - } } // The following environment variables dictate the enablement of different the ASM products. @@ -50,26 +41,125 @@ const ( ) // StartOption is used to customize the AppSec configuration when invoked with appsec.Start() -type StartOption func(c *Config) +type StartOption func(c *StartConfig) + +type StartConfig struct { + // RC is the remote config client configuration to be used. + RC *remoteconfig.ClientConfig + // IsEnabled is a function that determines whether AppSec is enabled or not. When unset, the + // default [IsEnabled] function is used. + EnablementMode func() (EnablementMode, telemetry.Origin, error) + // MetaStructAvailable is true if meta struct is supported by the trace agent. + MetaStructAvailable bool + + APISecOptions []APISecOption + + // BlockingUnavailable is true when the application run in an environment where blocking is not possible + BlockingUnavailable bool + + // ProxyEnvironment is true if the application is running in a proxy environment, + // such as within an Envoy External Processor. + ProxyEnvironment bool +} + +type EnablementMode int8 + +const ( + // ForcedOff is the mode where AppSec is forced to be disabled, not allowing remote activation. + ForcedOff EnablementMode = -1 + // RCStandby is the mode where AppSec is in stand-by, waiting remote activation. + RCStandby EnablementMode = 0 + // ForcedOn is the mode where AppSec is forced to be enabled. + ForcedOn EnablementMode = 1 +) + +func NewStartConfig(opts ...StartOption) *StartConfig { + c := &StartConfig{ + EnablementMode: func() (mode EnablementMode, origin telemetry.Origin, err error) { + enabled, set, err := IsEnabledByEnvironment() + if set { + origin = telemetry.OriginEnvVar + if enabled { + mode = ForcedOn + } else { + mode = ForcedOff + } + } else { + origin = telemetry.OriginDefault + mode = RCStandby + } + return mode, origin, err + }, + } + for _, opt := range opts { + opt(c) + } + return c +} + +// WithEnablementMode forces AppSec enablement, replacing the default initialization conditions +// implemented by [IsEnabledByEnvironment]. +func WithEnablementMode(mode EnablementMode) StartOption { + return func(c *StartConfig) { + c.EnablementMode = func() (EnablementMode, telemetry.Origin, error) { + return mode, telemetry.OriginCode, nil + } + } +} + +// WithRCConfig sets the AppSec remote config client configuration to the specified cfg +func WithRCConfig(cfg remoteconfig.ClientConfig) StartOption { + return func(c *StartConfig) { + c.RC = &cfg + } +} + +func WithMetaStructAvailable(available bool) StartOption { + return func(c *StartConfig) { + c.MetaStructAvailable = available + } +} + +func WithAPISecOptions(opts ...APISecOption) StartOption { + return func(c *StartConfig) { + c.APISecOptions = append(c.APISecOptions, opts...) + } +} + +func WithBlockingUnavailable(unavailable bool) StartOption { + return func(c *StartConfig) { + c.BlockingUnavailable = unavailable + } +} + +func WithProxyEnvironment() StartOption { + return func(c *StartConfig) { + c.APISecOptions = append(c.APISecOptions, WithProxy()) + } +} // Config is the AppSec configuration. type Config struct { - // rules loaded via the env var DD_APPSEC_RULES. When not set, the builtin rules will be used - // and live-updated with remote configuration. - RulesManager *RulesManager - // Maximum WAF execution time + *WAFManager + + // WAFTimeout is the maximum WAF execution time WAFTimeout time.Duration - // AppSec trace rate limit (traces per second). + // TraceRateLimit is the AppSec trace rate limit (traces per second). TraceRateLimit int64 - // Obfuscator configuration - Obfuscator internal.ObfuscatorConfig // APISec configuration - APISec internal.APISecConfig + APISec APISecConfig // RC is the remote configuration client used to receive product configuration updates. Nil if RC is disabled (default) - RC *remoteconfig.ClientConfig + RC *remoteconfig.ClientConfig + // RASP determines whether RASP features are enabled or not. RASP bool // SupportedAddresses are the addresses that the AppSec listener will bind to. SupportedAddresses AddressSet + // MetaStructAvailable is true if meta struct is supported by the trace agent. + MetaStructAvailable bool + // BlockingUnavailable is true when the application run in an environment where blocking is not possible + BlockingUnavailable bool + // TracingAsTransport is true if APM is disabled and manually force keeping a trace is the only way for it to be sent. + TracingAsTransport bool } // AddressSet is a set of WAF addresses. @@ -94,52 +184,39 @@ func (set AddressSet) AnyOf(anyOf ...string) bool { return false } -// WithRCConfig sets the AppSec remote config client configuration to the specified cfg -func WithRCConfig(cfg remoteconfig.ClientConfig) StartOption { - return func(c *Config) { - c.RC = &cfg - } -} - -// IsEnabled returns true when appsec is enabled by the environment variable DD_APPSEC_ENABLED (as of strconv's boolean -// parsing rules). When false, it also returns whether the env var was actually set or not. -// In case of a parsing error, it returns a detailed error. -func IsEnabled() (enabled bool, set bool, err error) { - return parseBoolEnvVar(EnvEnabled) -} - -// Return true when the given environment variable is defined and set to true (as of strconv's -// parsing rules). When false, it also returns whether the env var was actually set or not. -// In case of a parsing error, it returns a detailed error. -func parseBoolEnvVar(env string) (enabled bool, set bool, err error) { - str, set := os.LookupEnv(env) - if str == "" { - return false, set, nil - } else if enabled, err = strconv.ParseBool(str); err != nil { - return false, set, fmt.Errorf("could not parse %s value `%s` as a boolean value", env, str) +// IsEnabledByEnvironment returns true when appsec is enabled by the environment variable +// [EnvEnabled] being set to a truthy value, as well as whether the environment variable was set at +// all or not (so it is possible to distinguish between explicitly false, and false-by-default). +// If the [EnvEnabled] variable is set to a value that is not a valid boolean (according to +// [strconv.ParseBool]), it is considered false-y, and a detailed error is also returned. +func IsEnabledByEnvironment() (enabled bool, set bool, err error) { + enabled, origin, err := stableconfig.Bool(EnvEnabled, false) + if origin != telemetry.OriginDefault { + set = true } - - return enabled, set, nil + return enabled, set, err } // NewConfig returns a fresh appsec configuration read from the env -func NewConfig() (*Config, error) { - rules, err := internal.RulesFromEnv() +func (c *StartConfig) NewConfig() (*Config, error) { + data, err := RulesFromEnv() if err != nil { - return nil, err + return nil, fmt.Errorf("reading WAF rules from environment: %w", err) } - - r, err := NewRulesManager(rules) + manager, err := NewWAFManagerWithStaticRules(NewObfuscatorConfig(), data) if err != nil { return nil, err } return &Config{ - RulesManager: r, - WAFTimeout: internal.WAFTimeoutFromEnv(), - TraceRateLimit: int64(internal.RateLimitFromEnv()), - Obfuscator: internal.NewObfuscatorConfig(), - APISec: internal.NewAPISecConfig(), - RASP: internal.RASPEnabled(), + WAFManager: manager, + WAFTimeout: WAFTimeoutFromEnv(), + TraceRateLimit: RateLimitFromEnv(), + APISec: NewAPISecConfig(c.APISecOptions...), + RASP: RASPEnabled(), + RC: c.RC, + MetaStructAvailable: c.MetaStructAvailable, + BlockingUnavailable: c.BlockingUnavailable, + TracingAsTransport: !sharedinternal.BoolEnv("DD_APM_TRACING_ENABLED", true), }, nil } diff --git a/internal/appsec/config/config_test.go b/internal/appsec/config/config_test.go index 77d29e36df..9e44299056 100644 --- a/internal/appsec/config/config_test.go +++ b/internal/appsec/config/config_test.go @@ -6,10 +6,12 @@ package config import ( + "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/stretchr/testify/mock" ) func TestSCAEnabled(t *testing.T) { @@ -17,6 +19,7 @@ func TestSCAEnabled(t *testing.T) { name string envVarVal string telemetryExpected bool + telemetryLog string expectedValue bool }{ { @@ -41,6 +44,7 @@ func TestSCAEnabled(t *testing.T) { name: "parsing error", envVarVal: "not a boolean string representation [at {all!}]", telemetryExpected: false, + telemetryLog: "appsec: failed to get SCA config", expectedValue: false, }, } { @@ -50,15 +54,28 @@ func TestSCAEnabled(t *testing.T) { } telemetryClient := new(telemetrytest.MockClient) + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: EnvSCAEnabled, Value: tc.expectedValue, Origin: telemetry.OriginEnvVar}}).Return() telemetryClient.On("RegisterAppConfig", EnvSCAEnabled, tc.expectedValue, telemetry.OriginEnvVar).Return() - registerSCAAppConfigTelemetry(telemetryClient) + var logMatcher any + if tc.telemetryLog != "" { + logMatcher = mock.MatchedBy(func(record telemetry.Record) bool { + return strings.HasPrefix(record.Message, tc.telemetryLog) + }) + telemetryClient.On("Log", logMatcher, []telemetry.LogOption(nil)).Return() + } + defer telemetry.MockClient(telemetryClient)() + + registerSCAAppConfigTelemetry() if tc.telemetryExpected { - telemetryClient.AssertCalled(t, "RegisterAppConfig", EnvSCAEnabled, tc.expectedValue, telemetry.OriginEnvVar) - telemetryClient.AssertNumberOfCalls(t, "RegisterAppConfig", 1) + telemetryClient.AssertCalled(t, "RegisterAppConfigs", []telemetry.Configuration{{Name: EnvSCAEnabled, Value: tc.expectedValue, Origin: telemetry.OriginEnvVar}}) + telemetryClient.AssertNumberOfCalls(t, "RegisterAppConfigs", 1) } else { - telemetryClient.AssertNumberOfCalls(t, "RegisterAppConfig", 0) + telemetryClient.AssertNumberOfCalls(t, "RegisterAppConfigs", 0) + } + if tc.telemetryLog != "" { + telemetryClient.AssertCalled(t, "Log", logMatcher, []telemetry.LogOption(nil)) } }) } diff --git a/internal/appsec/config/internal_config.go b/internal/appsec/config/internal_config.go new file mode 100644 index 0000000000..f2d850076b --- /dev/null +++ b/internal/appsec/config/internal_config.go @@ -0,0 +1,277 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package config + +import ( + "fmt" + "math" + "os" + "regexp" + "strconv" + "time" + "unicode" + "unicode/utf8" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// Configuration environment variables +const ( + // EnvAPISecEnabled is the env var used to enable API Security + EnvAPISecEnabled = "DD_API_SECURITY_ENABLED" + // EnvAPISecSampleRate is the env var used to set the sampling rate of API Security schema extraction. + // Deprecated: a new [APISecConfig.Sampler] is now used instead of this. + EnvAPISecSampleRate = "DD_API_SECURITY_REQUEST_SAMPLE_RATE" + // EnvAPISecProxySampleRate is the env var used to set the sampling rate of API Security schema extraction for proxies. + // The value represents the number of schemas extracted per minute (samples per minute). + EnvAPISecProxySampleRate = "DD_API_SECURITY_PROXY_SAMPLE_RATE" + // EnvAPISecDownstreamRequestBodyAnalysisSampleRate Defines the probability of a downstream request body being sampled, + // or said differently, defines the overall number of requests for which the request and response body should be sampled / analysed (50%). + EnvAPISecDownstreamRequestBodyAnalysisSampleRate = "DD_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE" + // EnvAPISecMaxDownstreamRequestBodyAnalysis The maximum number of downstream requests per request for which the request and response body should be analysed. + EnvAPISecMaxDownstreamRequestBodyAnalysis = "DD_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS" + // EnvObfuscatorKey is the env var used to provide the WAF key obfuscation regexp + EnvObfuscatorKey = "DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP" + // EnvObfuscatorValue is the env var used to provide the WAF value obfuscation regexp + EnvObfuscatorValue = "DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP" + // EnvWAFTimeout is the env var used to specify the timeout value for a WAF run + EnvWAFTimeout = "DD_APPSEC_WAF_TIMEOUT" + // EnvTraceRateLimit is the env var used to set the ASM trace limiting rate + EnvTraceRateLimit = "DD_APPSEC_TRACE_RATE_LIMIT" + // EnvRules is the env var used to provide a path to a local security rule file + EnvRules = "DD_APPSEC_RULES" + // EnvRASPEnabled is the env var used to enable/disable RASP functionalities for ASM + EnvRASPEnabled = "DD_APPSEC_RASP_ENABLED" + + // envAPISecSampleDelay is the env var used to set the delay for the API Security sampler in system tests. + // It is not indended to be set by users. + envAPISecSampleDelay = "DD_API_SECURITY_SAMPLE_DELAY" +) + +// Configuration constants and default values +const ( + // DefaultAPISecSampleRate is the default rate at which API Security schemas are extracted from requests + DefaultAPISecSampleRate = .1 + // DefaultAPISecSampleInterval is the default interval between two samples being taken. + DefaultAPISecSampleInterval = 30 * time.Second + // DefaultAPISecProxySampleRate is the default rate (schemas per minute) at which API Security schemas are extracted from requests + DefaultAPISecProxySampleRate = 300 + // DefaultAPISecProxySampleInterval is the default time window for the API Security proxy sampler rate limiter. + DefaultAPISecProxySampleInterval = time.Minute + // DefaultDownstreamRequestBodyAnalysisSampleRate is the default sample rate for downstream request body analysis per incoming request. + DefaultDownstreamRequestBodyAnalysisSampleRate = 0.5 + // DefaultMaxDownstreamRequestBodyAnalysis is the default maximum size in bytes of downstream request body to be analyzed. + DefaultMaxDownstreamRequestBodyAnalysis = 1 + // DefaultObfuscatorKeyRegex is the default regexp used to obfuscate keys + DefaultObfuscatorKeyRegex = `(?i)pass|pw(?:or)?d|secret|(?:api|private|public|access)[_-]?key|token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)|bearer|authorization|jsessionid|phpsessid|asp\.net[_-]sessionid|sid|jwt` + // DefaultObfuscatorValueRegex is the default regexp used to obfuscate values + DefaultObfuscatorValueRegex = `(?i)(?:p(?:ass)?w(?:or)?d|pass(?:[_-]?phrase)?|secret(?:[_-]?key)?|(?:(?:api|private|public|access)[_-]?)key(?:[_-]?id)?|(?:(?:auth|access|id|refresh)[_-]?)?token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?|jsessionid|phpsessid|asp\.net(?:[_-]|-)sessionid|sid|jwt)(?:\s*=([^;&]+)|"\s*:\s*("[^"]+"|\d+))|bearer\s+([a-z0-9\._\-]+)|token\s*:\s*([a-z0-9]{13})|gh[opsu]_([0-9a-zA-Z]{36})|ey[I-L][\w=-]+\.(ey[I-L][\w=-]+(?:\.[\w.+\/=-]+)?)|[\-]{5}BEGIN[a-z\s]+PRIVATE\sKEY[\-]{5}([^\-]+)[\-]{5}END[a-z\s]+PRIVATE\sKEY|ssh-rsa\s*([a-z0-9\/\.+]{100,})` + // DefaultWAFTimeout is the default time limit past which a WAF run will timeout + DefaultWAFTimeout = 2 * time.Millisecond + // DefaultTraceRate is the default limit (trace/sec) past which ASM traces are sampled out + DefaultTraceRate = 100 // up to 100 appsec traces/s +) + +// APISecConfig holds the configuration for API Security schemas reporting. +// It is used to enabled/disable the feature. +type APISecConfig struct { + Sampler apisec.Sampler + Enabled bool + IsProxy bool + // Deprecated: use the new [APISecConfig.Sampler] instead. + SampleRate float64 + // DownstreamRequestBodyAnalysisSampleRate is the sample rate for downstream request body analysis per incoming request. + DownstreamRequestBodyAnalysisSampleRate float64 + // MaxDownstreamRequestBodyAnalysis is the maximum size in bytes of downstream request body to be analyzed. + MaxDownstreamRequestBodyAnalysis int +} + +// ObfuscatorConfig wraps the key and value regexp to be passed to the WAF to perform obfuscation. +type ObfuscatorConfig struct { + KeyRegex string + ValueRegex string +} + +type APISecOption func(*APISecConfig) + +// NewAPISecConfig creates and returns a new API Security configuration by reading the env +func NewAPISecConfig(opts ...APISecOption) APISecConfig { + cfg := APISecConfig{ + Enabled: internal.BoolEnv(EnvAPISecEnabled, true), + DownstreamRequestBodyAnalysisSampleRate: internal.FloatEnv(EnvAPISecDownstreamRequestBodyAnalysisSampleRate, DefaultDownstreamRequestBodyAnalysisSampleRate), + MaxDownstreamRequestBodyAnalysis: internal.IntEnv(EnvAPISecMaxDownstreamRequestBodyAnalysis, DefaultMaxDownstreamRequestBodyAnalysis), + SampleRate: readAPISecuritySampleRate(), + } + for _, opt := range opts { + opt(&cfg) + } + + if !RASPEnabled() { + log.Debug("appsec: RASP functionalities are disabled, disabling API Security downward request body analysis") + cfg.DownstreamRequestBodyAnalysisSampleRate = 0.0 + cfg.MaxDownstreamRequestBodyAnalysis = 0 + } + + if cfg.Sampler != nil { + return cfg + } + + if cfg.IsProxy { + rate := internal.IntEnv(EnvAPISecProxySampleRate, DefaultAPISecProxySampleRate) + cfg.Sampler = apisec.NewProxySampler(rate, DefaultAPISecProxySampleInterval) + } else { + interval := internal.DurationEnvWithUnit(envAPISecSampleDelay, "s", DefaultAPISecSampleInterval) + cfg.Sampler = apisec.NewSampler(interval) + } + + return cfg +} + +func readAPISecuritySampleRate() float64 { + value := env.Get(EnvAPISecSampleRate) + if value == "" { + return DefaultAPISecSampleRate + } + + rate, err := strconv.ParseFloat(value, 64) + if err != nil { + logEnvVarParsingError(EnvAPISecSampleRate, value, err, DefaultAPISecSampleRate) + return DefaultAPISecSampleRate + } + // Clamp the value so that 0.0 <= rate <= 1.0 + if rate < 0. { + rate = 0. + } else if rate > 1. { + rate = 1. + } + return rate +} + +// WithAPISecSampler sets the sampler for the API Security configuration. This is useful for testing +// purposes. +func WithAPISecSampler(sampler apisec.Sampler) APISecOption { + return func(c *APISecConfig) { + c.Sampler = sampler + } +} + +// WithProxy configures API Security for a proxy environment. +func WithProxy() APISecOption { + return func(c *APISecConfig) { + c.IsProxy = true + } +} + +// RASPEnabled returns true if RASP functionalities are enabled through the env, or if DD_APPSEC_RASP_ENABLED +// is not set +func RASPEnabled() bool { + return internal.BoolEnv(EnvRASPEnabled, true) +} + +// NewObfuscatorConfig creates and returns a new WAF obfuscator configuration by reading the env +func NewObfuscatorConfig() ObfuscatorConfig { + keyRE := readObfuscatorConfigRegexp(EnvObfuscatorKey, DefaultObfuscatorKeyRegex) + valueRE := readObfuscatorConfigRegexp(EnvObfuscatorValue, DefaultObfuscatorValueRegex) + return ObfuscatorConfig{KeyRegex: keyRE, ValueRegex: valueRE} +} + +func readObfuscatorConfigRegexp(name, defaultValue string) string { + val, present := env.Lookup(name) + if !present { + log.Debug("appsec: %s not defined, starting with the default obfuscator regular expression", name) + return defaultValue + } + if _, err := regexp.Compile(val); err != nil { + logUnexpectedEnvVarValue(name, val, "could not compile the configured obfuscator regular expression", defaultValue) + return defaultValue + } + log.Debug("appsec: starting with the configured obfuscator regular expression %s", name) + return val +} + +// WAFTimeoutFromEnv reads and parses the WAF timeout value set through the env +// If not set, it defaults to `DefaultWAFTimeout` +func WAFTimeoutFromEnv() (timeout time.Duration) { + timeout = DefaultWAFTimeout + value := env.Get(EnvWAFTimeout) + if value == "" { + return + } + + // Check if the value ends with a letter, which means the user has + // specified their own time duration unit(s) such as 1s200ms. + // Otherwise, default to microseconds. + if lastRune, _ := utf8.DecodeLastRuneInString(value); !unicode.IsLetter(lastRune) { + value += "us" // Add the default microsecond time-duration suffix + } + + parsed, err := time.ParseDuration(value) + if err != nil { + logEnvVarParsingError(EnvWAFTimeout, value, err, timeout) + return + } + if parsed <= 0 { + logUnexpectedEnvVarValue(EnvWAFTimeout, parsed, "expecting a strictly positive duration", timeout) + return + } + return parsed +} + +// RateLimitFromEnv reads and parses the trace rate limit set through the env +// If not set, it defaults to `DefaultTraceRate` +func RateLimitFromEnv() (rate int64) { + rate = DefaultTraceRate + value := env.Get(EnvTraceRateLimit) + if value == "" { + return rate + } + parsed, err := strconv.ParseUint(value, 10, 0) + if err != nil { + logEnvVarParsingError(EnvTraceRateLimit, value, err, rate) + return + } + if parsed == 0 { + logUnexpectedEnvVarValue(EnvTraceRateLimit, parsed, "expecting a value strictly greater than 0", rate) + return + } + if parsed > math.MaxInt64 { + logUnexpectedEnvVarValue(EnvTraceRateLimit, parsed, "expecting a value less than or equal to math.MaxInt64", rate) + return + } + return int64(parsed) +} + +// RulesFromEnv returns the security rules provided through the environment +// If the env var is not set, the default recommended rules are returned instead +func RulesFromEnv() ([]byte, error) { + filepath := env.Get(EnvRules) + if filepath == "" { + log.Debug("appsec: using the default built-in recommended security rules") + return nil, nil + } + buf, err := os.ReadFile(filepath) + if err != nil { + if os.IsNotExist(err) { + err = fmt.Errorf("appsec: could not find the rules file in path %s: %w", filepath, err) + } + return nil, err + } + log.Debug("appsec: using the security rules from file %s", filepath) + return buf, nil +} + +func logEnvVarParsingError(name, value string, err error, defaultValue any) { + //nolint:gocritic // we're trying to be helpful here... + log.Debug("appsec: could not parse the env var %s=%s as a duration: %v. Using default value %v.", name, value, err, defaultValue) +} + +func logUnexpectedEnvVarValue(name string, value any, reason string, defaultValue any) { + //nolint:gocritic // we're trying to be helpful here... + log.Debug("appsec: unexpected configuration value of %s=%v: %s. Using default value %v.", name, value, reason, defaultValue) +} diff --git a/internal/appsec/config/internal_config_test.go b/internal/appsec/config/internal_config_test.go new file mode 100644 index 0000000000..71115623b7 --- /dev/null +++ b/internal/appsec/config/internal_config_test.go @@ -0,0 +1,241 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package config + +import ( + "os" + "path/filepath" + "runtime" + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestAPISecConfig(t *testing.T) { + for _, tc := range []struct { + name string + enabledVar string + enabled bool + }{ + { + name: "disabled", + enabledVar: "false", + }, + { + name: "disabled", + enabledVar: "0", + }, + { + name: "enabled", + enabled: true, + }, + { + name: "enabled", + enabledVar: "true", + enabled: true, + }, + { + name: "enabled", + enabledVar: "1", + enabled: true, + }, + { + name: "enabled", + enabledVar: "weirdvalue", + enabled: true, + }, + } { + t.Run(tc.name, func(t *testing.T) { + if len(tc.enabledVar) > 0 { + t.Setenv(EnvAPISecEnabled, tc.enabledVar) + } + cfg := NewAPISecConfig() + require.Equal(t, tc.enabled, cfg.Enabled) + }) + } +} + +func TestObfuscatorConfig(t *testing.T) { + defaultConfig := ObfuscatorConfig{ + KeyRegex: DefaultObfuscatorKeyRegex, + ValueRegex: DefaultObfuscatorValueRegex, + } + t.Run("key/env-var-normal", func(t *testing.T) { + expCfg := defaultConfig + expCfg.KeyRegex = "test" + t.Setenv(EnvObfuscatorKey, "test") + cfg := NewObfuscatorConfig() + require.Equal(t, expCfg, cfg) + }) + t.Run("key/env-var-empty", func(t *testing.T) { + expCfg := defaultConfig + expCfg.KeyRegex = "" + t.Setenv(EnvObfuscatorKey, "") + cfg := NewObfuscatorConfig() + require.Equal(t, expCfg, cfg) + }) + t.Run("key/compile-error", func(t *testing.T) { + t.Setenv(EnvObfuscatorKey, "+") + cfg := NewObfuscatorConfig() + require.Equal(t, defaultConfig, cfg) + }) + + t.Run("value/env-var-normal", func(t *testing.T) { + expCfg := defaultConfig + expCfg.ValueRegex = "test" + t.Setenv(EnvObfuscatorValue, "test") + cfg := NewObfuscatorConfig() + require.Equal(t, expCfg, cfg) + }) + t.Run("value/env-var-empty", func(t *testing.T) { + expCfg := defaultConfig + expCfg.ValueRegex = "" + t.Setenv(EnvObfuscatorValue, "") + cfg := NewObfuscatorConfig() + require.Equal(t, expCfg, cfg) + }) + t.Run("value/compile-error", func(t *testing.T) { + t.Setenv(EnvObfuscatorValue, "+") + cfg := NewObfuscatorConfig() + require.Equal(t, defaultConfig, cfg) + }) +} + +func TestTraceRateLimit(t *testing.T) { + for _, tc := range []struct { + name string + env string + expected int64 + }{ + { + name: "parsable", + env: "1234567890", + expected: 1234567890, + }, + { + name: "not-parsable", + env: "not a uint", + expected: DefaultTraceRate, + }, + { + name: "negative", + env: "-1", + expected: DefaultTraceRate, + }, + { + name: "zero", + env: "0", + expected: DefaultTraceRate, + }, + { + name: "empty-string", + env: "", + expected: DefaultTraceRate, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Setenv(EnvTraceRateLimit, tc.env) + require.Equal(t, tc.expected, RateLimitFromEnv()) + }) + } +} + +func TestWAFTimeout(t *testing.T) { + for _, tc := range []struct { + name string + env string + expected time.Duration + }{ + { + name: "parsable", + env: "5s", + expected: 5 * time.Second, + }, + { + name: "parsable-default-microsecond", + env: "1", + expected: 1 * time.Microsecond, + }, + { + name: "not-parsable", + env: "not a duration string", + expected: DefaultWAFTimeout, + }, + { + name: "negative", + env: "-1s", + expected: DefaultWAFTimeout, + }, + { + name: "zero", + env: "0", + expected: DefaultWAFTimeout, + }, + { + name: "empty-string", + env: "", + expected: DefaultWAFTimeout, + }, + } { + t.Run(tc.name, func(t *testing.T) { + t.Setenv(EnvWAFTimeout, tc.env) + require.Equal(t, tc.expected, WAFTimeoutFromEnv()) + }) + + } +} + +func TestRules(t *testing.T) { + t.Run("empty-string", func(t *testing.T) { + t.Setenv(EnvRules, "") + rules, err := RulesFromEnv() + require.NoError(t, err) + require.Nil(t, rules) + }) + + t.Run("file-not-found", func(t *testing.T) { + t.Setenv(EnvRules, "i do not exist") + rules, err := RulesFromEnv() + require.Error(t, err) + require.Nil(t, rules) + }) + + t.Run("local-file", func(t *testing.T) { + file := filepath.Join(t.TempDir(), "rules.json") + + _, thisFile, _, _ := runtime.Caller(0) + + bytes, err := os.ReadFile(filepath.Join(filepath.Dir(thisFile), "..", "testdata", "custom_rules.json")) + require.NoError(t, err) + + err = os.WriteFile(file, bytes, 0666) + require.NoError(t, err) + t.Setenv(EnvRules, file) + rules, err := RulesFromEnv() + require.NoError(t, err) + require.Equal(t, string(bytes), string(rules)) + }) +} + +func TestRASPEnablement(t *testing.T) { + t.Run("enabled", func(t *testing.T) { + t.Setenv(EnvRASPEnabled, "true") + require.True(t, RASPEnabled()) + }) + + t.Run("disabled", func(t *testing.T) { + t.Setenv(EnvRASPEnabled, "false") + require.False(t, RASPEnabled()) + }) + + t.Run("unset", func(t *testing.T) { + // t.Setenv first to restore the original value at the end of the test + t.Setenv(EnvRASPEnabled, "") + os.Unsetenv(EnvRASPEnabled) + require.True(t, RASPEnabled()) + }) +} diff --git a/internal/appsec/config/rule_test.go b/internal/appsec/config/rule_test.go deleted file mode 100644 index 14133d2e8b..0000000000 --- a/internal/appsec/config/rule_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package config - -import ( - "encoding/json" - "testing" - - rules "github.com/DataDog/appsec-internal-go/appsec" - waf "github.com/DataDog/go-libddwaf/v3" - "github.com/stretchr/testify/require" -) - -func TestStaticRule(t *testing.T) { - if supported, _ := waf.Health(); !supported { - t.Skip("waf disabled") - return - } - - var parsedRules RulesFragment - require.NoError(t, json.Unmarshal([]byte(rules.StaticRecommendedRules), &parsedRules)) - waf, err := waf.NewHandle(parsedRules, "", "") - require.NoError(t, err) - require.NotNil(t, waf) - waf.Close() -} diff --git a/internal/appsec/config/rules_manager.go b/internal/appsec/config/rules_manager.go deleted file mode 100644 index e4e003eda1..0000000000 --- a/internal/appsec/config/rules_manager.go +++ /dev/null @@ -1,147 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package config - -import ( - "encoding/json" - "fmt" - "slices" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - - rules "github.com/DataDog/appsec-internal-go/appsec" - rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" -) - -type ( - // RulesManager is used to build a full rules file from a combination of rules fragments - // The `Base` fragment is the default rules (either local or received through ASM_DD), - // and the `Edits` fragments each represent a remote configuration update that affects the rules. - // `BasePath` is either empty if the local Base rules are used, or holds the path of the ASM_DD config. - RulesManager struct { - Latest RulesFragment - Base RulesFragment - BasePath string - Edits map[string]RulesFragment - } - // RulesFragment can represent a full ruleset or a fragment of it. - RulesFragment struct { - Version string `json:"version,omitempty"` - Metadata any `json:"metadata,omitempty"` - Rules []any `json:"rules,omitempty"` - Overrides []any `json:"rules_override,omitempty"` - Exclusions []any `json:"exclusions,omitempty"` - ExclusionData []DataEntry `json:"exclusion_data,omitempty"` - RulesData []DataEntry `json:"rules_data,omitempty"` - Actions []any `json:"actions,omitempty"` - CustomRules []any `json:"custom_rules,omitempty"` - Processors []any `json:"processors,omitempty"` - Scanners []any `json:"scanners,omitempty"` - } - - // DataEntry represents an entry in the "rules_data" top level field of a rules file - DataEntry rc.ASMDataRuleData -) - -// DefaultRulesFragment returns a RulesFragment created using the default static recommended rules -func DefaultRulesFragment() RulesFragment { - var f RulesFragment - if err := json.Unmarshal([]byte(rules.StaticRecommendedRules), &f); err != nil { - log.Debug("appsec: error unmarshalling default rules: %v", err) - } - return f -} - -func (f *RulesFragment) clone() (clone RulesFragment) { - clone.Version = f.Version - clone.Metadata = f.Metadata - clone.Overrides = slices.Clone(f.Overrides) - clone.Exclusions = slices.Clone(f.Exclusions) - clone.ExclusionData = slices.Clone(f.ExclusionData) - clone.RulesData = slices.Clone(f.RulesData) - clone.CustomRules = slices.Clone(f.CustomRules) - clone.Processors = slices.Clone(f.Processors) - clone.Scanners = slices.Clone(f.Scanners) - return -} - -// NewRulesManager initializes and returns a new RulesManager using the provided rules. -// If no rules are provided (nil), the default rules are used instead. -// If the provided rules are invalid, an error is returned -func NewRulesManager(rules []byte) (*RulesManager, error) { - var f RulesFragment - if rules == nil { - f = DefaultRulesFragment() - log.Debug("appsec: RulesManager: using default rules configuration") - } else if err := json.Unmarshal(rules, &f); err != nil { - log.Debug("appsec: cannot create RulesManager from specified rules") - return nil, err - } - return &RulesManager{ - Latest: f, - Base: f, - Edits: map[string]RulesFragment{}, - }, nil -} - -// Clone returns a duplicate of the current rules manager object -func (r *RulesManager) Clone() (clone RulesManager) { - clone.Edits = make(map[string]RulesFragment, len(r.Edits)) - for k, v := range r.Edits { - clone.Edits[k] = v - } - clone.BasePath = r.BasePath - clone.Base = r.Base.clone() - clone.Latest = r.Latest.clone() - return -} - -// AddEdit appends the configuration to the map of edits in the rules manager -func (r *RulesManager) AddEdit(cfgPath string, f RulesFragment) { - r.Edits[cfgPath] = f -} - -// RemoveEdit deletes the configuration associated to `cfgPath` in the edits slice -func (r *RulesManager) RemoveEdit(cfgPath string) { - delete(r.Edits, cfgPath) -} - -// ChangeBase sets a new rules fragment base for the rules manager -func (r *RulesManager) ChangeBase(f RulesFragment, basePath string) { - r.Base = f - r.BasePath = basePath -} - -// Compile compiles the RulesManager fragments together stores the result in r.Latest -func (r *RulesManager) Compile() { - if r.Base.Rules == nil || len(r.Base.Rules) == 0 { - r.Base = DefaultRulesFragment() - } - r.Latest = r.Base - - // Simply concatenate the content of each top level rule field as specified in our RFCs - for _, v := range r.Edits { - r.Latest.Overrides = append(r.Latest.Overrides, v.Overrides...) - r.Latest.Exclusions = append(r.Latest.Exclusions, v.Exclusions...) - r.Latest.ExclusionData = append(r.Latest.ExclusionData, v.ExclusionData...) - r.Latest.Actions = append(r.Latest.Actions, v.Actions...) - r.Latest.RulesData = append(r.Latest.RulesData, v.RulesData...) - r.Latest.CustomRules = append(r.Latest.CustomRules, v.CustomRules...) - r.Latest.Processors = append(r.Latest.Processors, v.Processors...) - r.Latest.Scanners = append(r.Latest.Scanners, v.Scanners...) - } -} - -// Raw returns a compact json version of the rules -func (r *RulesManager) Raw() []byte { - data, _ := json.Marshal(r.Latest) - return data -} - -// String returns the string representation of the Latest compiled json rules. -func (r *RulesManager) String() string { - return fmt.Sprintf("%+v", r.Latest) -} diff --git a/internal/appsec/config/wafmanager.go b/internal/appsec/config/wafmanager.go new file mode 100644 index 0000000000..ec20a26525 --- /dev/null +++ b/internal/appsec/config/wafmanager.go @@ -0,0 +1,207 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package config + +import ( + "bytes" + "encoding/json" + "fmt" + "log/slog" + "runtime" + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetryLog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/go-libddwaf/v4" +) + +type ( + // WAFManager holds a [libddwaf.Builder] and allows managing its configuration. + WAFManager struct { + builder *libddwaf.Builder + staticRules []byte // nullable + rulesVersion string + closed bool + mu sync.RWMutex + } +) + +const defaultRulesPath = "ASM_DD/default" + +// NewWAFManager creates a new [WAFManager] with the provided [config.ObfuscatorConfig] and initial +// rules (if any). +func NewWAFManager(obfuscator ObfuscatorConfig) (*WAFManager, error) { + return NewWAFManagerWithStaticRules(obfuscator, nil) +} + +func NewWAFManagerWithStaticRules(obfuscator ObfuscatorConfig, staticRules []byte) (*WAFManager, error) { + builder, err := libddwaf.NewBuilder(obfuscator.KeyRegex, obfuscator.ValueRegex) + if err != nil { + return nil, err + } + + mgr := &WAFManager{ + builder: builder, + staticRules: staticRules, + } + + if err := mgr.RestoreDefaultConfig(); err != nil { + return nil, err + } + + // Attach a finalizer to close the builder when it is garbage collected, in case + // [WAFManager.Close] is not called explicitly by the user. The call to [libddwaf.Builder.Close] + // is safe to make multiple times. + runtime.SetFinalizer(mgr, func(m *WAFManager) { m.doClose(true) }) + + return mgr, nil +} + +// Reset resets the WAF manager to its initial state. +func (m *WAFManager) Reset() error { + for _, path := range m.ConfigPaths("") { + m.RemoveConfig(path) + } + return m.RestoreDefaultConfig() +} + +// ConfigPaths returns the list of configuration paths currently loaded in the receiving +// [WAFManager]. This is typically used for testing purposes. An optional filter regular expression +// can be provided to limit what paths are returned. +func (m *WAFManager) ConfigPaths(filter string) []string { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.builder.ConfigPaths(filter) +} + +// NewHandle returns a new [*libddwaf.Handle] (which may be nil if no valid WAF could be built) and the +// version of the rules that were used to build it. +func (m *WAFManager) NewHandle() (*libddwaf.Handle, string) { + m.mu.RLock() + rulesVersion := m.rulesVersion + hdl := m.builder.Build() + m.mu.RUnlock() + return hdl, rulesVersion +} + +// Close releases all resources associated with this [WAFManager]. +func (m *WAFManager) Close() { + m.doClose(false) +} + +func (m *WAFManager) doClose(leaked bool) { + m.mu.Lock() + defer m.mu.Unlock() + + if m.closed { + return + } + if leaked { + telemetryLog.Warn("WAFManager was leaked and is being closed by GC. Remember to call WAFManager.Close() explicitly!") + } + + m.builder.Close() + m.rulesVersion = "" + m.closed = true +} + +// RemoveConfig removes a configuration from the receiving [WAFManager]. +func (m *WAFManager) RemoveConfig(path string) { + m.mu.Lock() + defer m.mu.Unlock() + m.builder.RemoveConfig(path) +} + +// RemoveDefaultConfig removes the initial configuration from the receiving [WAFManager]. Returns +// true if the default config was actually removed; false otherwise (e.g, if it had previously been +// removed, or there was no default config to begin with). +func (m *WAFManager) RemoveDefaultConfig() bool { + m.mu.Lock() + defer m.mu.Unlock() + + if m.staticRules != nil { + return m.builder.RemoveConfig(defaultRulesPath) + } + + return m.builder.RemoveDefaultRecommendedRuleset() +} + +// AddOrUpdateConfig adds or updates a configuration in the receiving [WAFManager]. +func (m *WAFManager) AddOrUpdateConfig(path string, fragment any) (libddwaf.Diagnostics, error) { + m.mu.Lock() + defer m.mu.Unlock() + diags, err := m.builder.AddOrUpdateConfig(path, fragment) + if err != nil { + return diags, err + } + + // Submit the telemetry metrics for error counts obtained from the [libddwaf.Diagnostics] object. + // See: https://docs.google.com/document/d/1lcCvURsWTS_p01-MvrI6SmDB309L1e8bx9txuUR1zCk/edit?tab=t.0#heading=h.nwzm8andnx41 + if diags.Version != "" { + m.rulesVersion = diags.Version + } + diags.EachFeature(updateTelemetryMetrics(m.rulesVersion)) + return diags, err +} + +// RestoreDefaultConfig restores the initial configurations to the receiving [WAFManager]. +func (m *WAFManager) RestoreDefaultConfig() error { + var diags libddwaf.Diagnostics + var err error + if m.staticRules == nil { + diags, err = m.builder.AddDefaultRecommendedRuleset() + } else { + var rules map[string]any + dec := json.NewDecoder(bytes.NewReader(m.staticRules)) + dec.UseNumber() + if err := dec.Decode(&rules); err != nil { + return err + } + diags, err = m.AddOrUpdateConfig(defaultRulesPath, rules) + } + if err != nil { + return err + } + + if diags.Version != "" { + m.rulesVersion = diags.Version + } + + diags.EachFeature(updateTelemetryMetrics(m.rulesVersion)) + diags.EachFeature(logLocalDiagnosticMessages) + return err +} + +func logLocalDiagnosticMessages(name string, feature *libddwaf.Feature) { + logger := telemetryLog.With(telemetry.WithTags([]string{"appsec_config_key:" + name, "log_type:local::diagnostic"})) + + if feature.Error != "" { + logger.Error("feature error", slog.String("message", feature.Error)) + } + for msg, ids := range feature.Errors { + logger.Error("feature error", slog.String("message", msg), slog.String("affected_rule_ids", fmt.Sprintf("%v", ids))) + } + for msg, ids := range feature.Warnings { + logger.Warn("feature warning", slog.String("message", msg), slog.String("affected_rule_ids", fmt.Sprintf("%v", ids))) + } +} + +func updateTelemetryMetrics(eventRulesVersion string) func(name string, feat *libddwaf.Feature) { + return func(name string, feat *libddwaf.Feature) { + errCount := telemetry.Count(telemetry.NamespaceAppSec, "waf.config_errors", []string{ + "waf_version:" + libddwaf.Version(), + "event_rules_version:" + eventRulesVersion, + "config_key:" + name, + "scope:item", + "action:update", + }) + errCount.Submit(0) + for _, ids := range feat.Errors { + errCount.Submit(float64(len(ids))) + } + } +} diff --git a/internal/appsec/emitter/httpsec/http.go b/internal/appsec/emitter/httpsec/http.go deleted file mode 100644 index 9f81cdc20e..0000000000 --- a/internal/appsec/emitter/httpsec/http.go +++ /dev/null @@ -1,190 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -// Package httpsec defines is the HTTP instrumentation API and contract for -// AppSec. It defines an abstract representation of HTTP handlers, along with -// helper functions to wrap (aka. instrument) standard net/http handlers. -// HTTP integrations must use this package to enable AppSec features for HTTP, -// which listens to this package's operation events. -package httpsec - -import ( - "context" - // Blank import needed to use embed for the default blocked response payloads - _ "embed" - "net/http" - "sync" - "sync/atomic" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/actions" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" -) - -// HandlerOperation type representing an HTTP operation. It must be created with -// StartOperation() and finished with its Finish(). -type ( - HandlerOperation struct { - dyngo.Operation - *waf.ContextOperation - mu sync.RWMutex - } - - // HandlerOperationArgs is the HTTP handler operation arguments. - HandlerOperationArgs struct { - Method string - RequestURI string - Host string - RemoteAddr string - Headers map[string][]string - Cookies map[string][]string - QueryParams map[string][]string - PathParams map[string]string - } - - // HandlerOperationRes is the HTTP handler operation results. - HandlerOperationRes struct { - Headers map[string][]string - StatusCode int - } -) - -func (HandlerOperationArgs) IsArgOf(*HandlerOperation) {} -func (HandlerOperationRes) IsResultOf(*HandlerOperation) {} - -func StartOperation(ctx context.Context, args HandlerOperationArgs) (*HandlerOperation, *atomic.Pointer[actions.BlockHTTP], context.Context) { - wafOp, ctx := waf.StartContextOperation(ctx) - op := &HandlerOperation{ - Operation: dyngo.NewOperation(wafOp), - ContextOperation: wafOp, - } - - // We need to use an atomic pointer to store the action because the action may be created asynchronously in the future - var action atomic.Pointer[actions.BlockHTTP] - dyngo.OnData(op, func(a *actions.BlockHTTP) { - action.Store(a) - }) - - return op, &action, dyngo.StartAndRegisterOperation(ctx, op, args) -} - -// Finish the HTTP handler operation and its children operations and write everything to the service entry span. -func (op *HandlerOperation) Finish(res HandlerOperationRes, span ddtrace.Span) { - dyngo.FinishOperation(op, res) - op.ContextOperation.Finish(span) -} - -const monitorBodyErrorLog = ` -"appsec: parsed http body monitoring ignored: could not find the http handler instrumentation metadata in the request context: - the request handler is not being monitored by a middleware function or the provided context is not the expected request context -` - -// MonitorParsedBody starts and finishes the SDK body operation. -// This function should not be called when AppSec is disabled in order to -// get preciser error logs. -func MonitorParsedBody(ctx context.Context, body any) error { - return waf.RunSimple(ctx, - addresses.NewAddressesBuilder(). - WithRequestBody(body). - Build(), - monitorBodyErrorLog, - ) -} - -// Return the map of parsed cookies if any and following the specification of -// the rule address `server.request.cookies`. -func makeCookies(parsed []*http.Cookie) map[string][]string { - if len(parsed) == 0 { - return nil - } - cookies := make(map[string][]string, len(parsed)) - for _, c := range parsed { - cookies[c.Name] = append(cookies[c.Name], c.Value) - } - return cookies -} - -// BeforeHandle contains the appsec functionality that should be executed before a http.Handler runs. -// It returns the modified http.ResponseWriter and http.Request, an additional afterHandle function -// that should be executed after the Handler runs, and a handled bool that instructs if the request has been handled -// or not - in case it was handled, the original handler should not run. -func BeforeHandle( - w http.ResponseWriter, - r *http.Request, - span ddtrace.Span, - pathParams map[string]string, - opts *Config, -) (http.ResponseWriter, *http.Request, func(), bool) { - if opts == nil { - opts = defaultWrapHandlerConfig - } else if opts.ResponseHeaderCopier == nil { - opts.ResponseHeaderCopier = defaultWrapHandlerConfig.ResponseHeaderCopier - } - - op, blockAtomic, ctx := StartOperation(r.Context(), HandlerOperationArgs{ - Method: r.Method, - RequestURI: r.RequestURI, - Host: r.Host, - RemoteAddr: r.RemoteAddr, - Headers: r.Header, - Cookies: makeCookies(r.Cookies()), - QueryParams: r.URL.Query(), - PathParams: pathParams, - }) - tr := r.WithContext(ctx) - - afterHandle := func() { - var statusCode int - if res, ok := w.(interface{ Status() int }); ok { - statusCode = res.Status() - } - op.Finish(HandlerOperationRes{ - Headers: opts.ResponseHeaderCopier(w), - StatusCode: statusCode, - }, span) - - // Execute the onBlock functions to make sure blocking works properly - // in case we are instrumenting the Gin framework - if blockPtr := blockAtomic.Load(); blockPtr != nil { - for _, f := range opts.OnBlock { - f() - } - - if blockPtr.Handler != nil { - blockPtr.Handler.ServeHTTP(w, tr) - } - } - } - - handled := false - if blockPtr := blockAtomic.Load(); blockPtr != nil && blockPtr.Handler != nil { - // handler is replaced - blockPtr.Handler.ServeHTTP(w, tr) - blockPtr.Handler = nil - handled = true - } - return w, tr, afterHandle, handled -} - -// WrapHandler wraps the given HTTP handler with the abstract HTTP operation defined by HandlerOperationArgs and -// HandlerOperationRes. -// The onBlock params are used to cleanup the context when needed. -// It is a specific patch meant for Gin, for which we must abort the -// context since it uses a queue of handlers and it's the only way to make -// sure other queued handlers don't get executed. -// TODO: this patch must be removed/improved when we rework our actions/operations system -func WrapHandler(handler http.Handler, span ddtrace.Span, pathParams map[string]string, opts *Config) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - tw, tr, afterHandle, handled := BeforeHandle(w, r, span, pathParams, opts) - defer afterHandle() - if handled { - return - } - - handler.ServeHTTP(tw, tr) - }) -} diff --git a/internal/appsec/emitter/httpsec/roundtripper.go b/internal/appsec/emitter/httpsec/roundtripper.go deleted file mode 100644 index 8a7f1f2448..0000000000 --- a/internal/appsec/emitter/httpsec/roundtripper.go +++ /dev/null @@ -1,71 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package httpsec - -import ( - "context" - "sync" - - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" -) - -var badInputContextOnce sync.Once - -type ( - RoundTripOperation struct { - dyngo.Operation - } - - // RoundTripOperationArgs is the round trip operation arguments. - RoundTripOperationArgs struct { - // URL corresponds to the address `server.io.net.url`. - URL string - } - - // RoundTripOperationRes is the round trip operation results. - RoundTripOperationRes struct{} -) - -func (RoundTripOperationArgs) IsArgOf(*RoundTripOperation) {} -func (RoundTripOperationRes) IsResultOf(*RoundTripOperation) {} - -func ProtectRoundTrip(ctx context.Context, url string) error { - opArgs := RoundTripOperationArgs{ - URL: url, - } - - parent, _ := dyngo.FromContext(ctx) - if parent == nil { // No parent operation => we can't monitor the request - badInputContextOnce.Do(func() { - log.Debug("appsec: outgoing http request monitoring ignored: could not find the handler " + - "instrumentation metadata in the request context: the request handler is not being monitored by a " + - "middleware function or the incoming request context has not be forwarded correctly to the roundtripper") - }) - return nil - } - - op := &RoundTripOperation{ - Operation: dyngo.NewOperation(parent), - } - - var err *events.BlockingSecurityEvent - // TODO: move the data listener as a setup function of httpsec.StartRoundTripperOperation(ars, ) - dyngo.OnData(op, func(e *events.BlockingSecurityEvent) { - err = e - }) - - dyngo.StartOperation(op, opArgs) - dyngo.FinishOperation(op, RoundTripOperationRes{}) - - if err != nil { - log.Debug("appsec: outgoing http request blocked by the WAF on URL: %s", url) - return err - } - - return nil -} diff --git a/internal/appsec/emitter/usersec/user.go b/internal/appsec/emitter/usersec/user.go index 50a4352e6d..f03301cfc1 100644 --- a/internal/appsec/emitter/usersec/user.go +++ b/internal/appsec/emitter/usersec/user.go @@ -7,9 +7,11 @@ package usersec import ( "context" + "sync" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const errorLog = ` @@ -17,11 +19,17 @@ appsec: user login monitoring ignored: could not find the http handler instrumen the request handler is not being monitored by a middleware function or the provided context is not the expected request context ` +var errorLogOnce sync.Once + type ( + // UserEventType is the type of user event, such as a successful login or a failed login or any other authenticated request. + UserEventType int + // UserLoginOperation type representing a call to appsec.SetUser(). It gets both created and destroyed in a single // call to ExecuteUserIDOperation UserLoginOperation struct { dyngo.Operation + EventType UserEventType } // UserLoginOperationArgs is the user ID operation arguments. UserLoginOperationArgs struct{} @@ -29,14 +37,28 @@ type ( // UserLoginOperationRes is the user ID operation results. UserLoginOperationRes struct { UserID string + UserLogin string + UserOrg string SessionID string - Success bool } ) -func StartUserLoginOperation(ctx context.Context, args UserLoginOperationArgs) (*UserLoginOperation, *error) { - parent, _ := dyngo.FromContext(ctx) - op := &UserLoginOperation{Operation: dyngo.NewOperation(parent)} +const ( + // UserLoginSuccess is the event type for a successful user login, when a new session or JWT is created. + UserLoginSuccess UserEventType = iota + // UserLoginFailure is the event type for a failed user login, when the user ID is not found or the password is incorrect. + UserLoginFailure + // UserSet is the event type for a user ID operation that is not a login, such as any authenticated request made by the user. + UserSet +) + +func StartUserLoginOperation(ctx context.Context, eventType UserEventType, args UserLoginOperationArgs) (*UserLoginOperation, *error) { + parent, ok := dyngo.FromContext(ctx) + if !ok { // Nothing will be reported in this case, but we can still block so we don't return + errorLogOnce.Do(func() { log.Error(errorLog) }) + } + + op := &UserLoginOperation{Operation: dyngo.NewOperation(parent), EventType: eventType} var err error dyngo.OnData(op, func(e *events.BlockingSecurityEvent) { err = e }) dyngo.StartOperation(op, args) diff --git a/internal/appsec/emitter/waf/context.go b/internal/appsec/emitter/waf/context.go index 698e721880..f85cf7d8c3 100644 --- a/internal/appsec/emitter/waf/context.go +++ b/internal/appsec/emitter/waf/context.go @@ -9,18 +9,17 @@ import ( "context" "maps" "slices" + "strings" "sync" "sync/atomic" - "github.com/DataDog/appsec-internal-go/limiter" - waf "github.com/DataDog/go-libddwaf/v3" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/limiter" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace" + "github.com/DataDog/go-libddwaf/v4" ) type ( @@ -30,7 +29,7 @@ type ( // context is an atomic pointer to the current WAF context. // Makes sure the calls to context.Run are safe. - context atomic.Pointer[waf.Context] + context atomic.Pointer[libddwaf.Context] // limiter comes from the WAF feature and is used to limit the number of events as a whole. limiter limiter.Limiter // events is where we store WAF events received from the WAF over the course of the request. @@ -41,7 +40,11 @@ type ( derivatives map[string]any // supportedAddresses is the set of addresses supported by the WAF. supportedAddresses config.AddressSet - // mu protects the events, stacks, and derivatives, supportedAddresses slices. + // metrics the place that manages reporting for the current execution + metrics *ContextMetrics + // requestBlocked is used to track if the request has been requestBlocked by the WAF or not. + requestBlocked bool + // mu protects the events, stacks, and derivatives, supportedAddresses, eventRulesetVersion slices, and requestBlocked. mu sync.Mutex // logOnce is used to log a warning once when a request has too many WAF events via the built-in limiter or the max value. logOnce sync.Once @@ -53,16 +56,19 @@ type ( // RunEvent is the type of event that should be emitted to child operations to run the WAF RunEvent struct { - waf.RunAddressData + libddwaf.RunAddressData dyngo.Operation } + + // SecurityEvent is a dyngo data event sent when a security event is detected by the WAF + SecurityEvent struct{} ) func (ContextArgs) IsArgOf(*ContextOperation) {} func (ContextRes) IsResultOf(*ContextOperation) {} -func StartContextOperation(ctx context.Context) (*ContextOperation, context.Context) { - entrySpanOp, ctx := trace.StartServiceEntrySpanOperation(ctx) +func StartContextOperation(ctx context.Context, span trace.TagSetter) (*ContextOperation, context.Context) { + entrySpanOp, ctx := trace.StartServiceEntrySpanOperation(ctx, span) op := &ContextOperation{ Operation: dyngo.NewOperation(entrySpanOp), ServiceEntrySpanOperation: entrySpanOp, @@ -70,12 +76,12 @@ func StartContextOperation(ctx context.Context) (*ContextOperation, context.Cont return op, dyngo.StartAndRegisterOperation(ctx, op, ContextArgs{}) } -func (op *ContextOperation) Finish(span trace.TagSetter) { +func (op *ContextOperation) Finish() { dyngo.FinishOperation(op, ContextRes{}) - op.ServiceEntrySpanOperation.Finish(span) + op.ServiceEntrySpanOperation.Finish() } -func (op *ContextOperation) SwapContext(ctx *waf.Context) *waf.Context { +func (op *ContextOperation) SwapContext(ctx *libddwaf.Context) *libddwaf.Context { return op.context.Swap(ctx) } @@ -83,14 +89,29 @@ func (op *ContextOperation) SetLimiter(limiter limiter.Limiter) { op.limiter = limiter } -func (op *ContextOperation) AddEvents(events ...any) { +func (op *ContextOperation) SetMetricsInstance(metrics *ContextMetrics) { + op.metrics = metrics +} + +func (op *ContextOperation) GetMetricsInstance() *ContextMetrics { + return op.metrics +} + +func (op *ContextOperation) SetRequestBlocked() { + op.mu.Lock() + defer op.mu.Unlock() + op.requestBlocked = true +} + +// AddEvents adds WAF events to the operation and returns true if the operation has reached the maximum number of events, by the limiter or the max value. +func (op *ContextOperation) AddEvents(events ...any) bool { if len(events) == 0 { - return + return false } if !op.limiter.Allow() { - log.Warn("appsec: too many WAF events, stopping further reporting") - return + log.Error("appsec: too many WAF events, stopping further reporting") + return true } op.mu.Lock() @@ -101,10 +122,11 @@ func (op *ContextOperation) AddEvents(events ...any) { op.logOnce.Do(func() { log.Warn("appsec: ignoring new WAF event due to the maximum number of security events per request was reached") }) - return + return true } op.events = append(op.events, events...) + return false } func (op *ContextOperation) AddStackTraces(stacks ...*stacktrace.Event) { @@ -125,10 +147,15 @@ func (op *ContextOperation) AbsorbDerivatives(derivatives map[string]any) { op.mu.Lock() defer op.mu.Unlock() if op.derivatives == nil { - op.derivatives = make(map[string]any) + op.derivatives = make(map[string]any, len(derivatives)) } for k, v := range derivatives { + // If the request has been blocked, we don't want to report any derivatives representing the response schema. + if op.requestBlocked && strings.HasPrefix(k, "_dd.appsec.s.res.") { + continue + } + op.derivatives[k] = v } } diff --git a/internal/appsec/emitter/waf/metrics.go b/internal/appsec/emitter/waf/metrics.go new file mode 100644 index 0000000000..f4658347ff --- /dev/null +++ b/internal/appsec/emitter/waf/metrics.go @@ -0,0 +1,402 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package waf + +import ( + "errors" + "log/slog" + "strconv" + "sync" + "sync/atomic" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" + "github.com/DataDog/go-libddwaf/v4/waferrors" + "github.com/puzpuzpuz/xsync/v3" +) + +// newHandleTelemetryMetric is the name of the metric that will be used to track the initialization of the WAF handle +// this values is changed to waf.updates after the first call to [NewMetricsInstance] +var newHandleTelemetryMetric = "waf.init" +var changeToWafUpdates sync.Once + +// RequestMilestones is a list of things that can happen as a result of a waf call. They are stacked for each requests +// and used as tags to the telemetry metric `waf.requests`. +// this struct can be modified concurrently. +// TODO: add request_excluded and block_failure to the mix once we have the capability to track them +type RequestMilestones struct { + requestBlocked bool + ruleTriggered bool + wafTimeout bool + rateLimited bool + wafError bool + inputTruncated bool +} + +// raspMetricKey is used as a cache key for the metrics having tags depending on the RASP rule type +type raspMetricKey[T any] struct { + typ addresses.RASPRuleType + additionalTag T +} + +// HandleMetrics is a struct that holds all the telemetry metrics for the WAF that lives and die alongside with the WAF handle +// It basically serves as a big cache to not go through the telemetry package each time we want to submit a metric +// and have to recompute all tags that are static (from a WAF handle lifetime perspective) +type HandleMetrics struct { + baseTags []string + baseRASPTags [len(addresses.RASPRuleTypes)][]string + + // Common metric types + + // externalTimerDistributions holds the telemetry metrics for the `rasp.duration_ext`, `waf.duration_ext` metrics + externalTimerDistributions map[addresses.Scope]telemetry.MetricHandle + // internalTimerDistributions holds the telemetry metrics for the `rasp.duration`, `waf.duration` metrics + internalTimerDistributions map[addresses.Scope]telemetry.MetricHandle + + // wafRequestsCounts holds the telemetry metrics for the `waf.requests` metric, lazily filled + wafRequestsCounts *xsync.MapOf[RequestMilestones, telemetry.MetricHandle] + + // Uncommon metric types + + // raspTimeout holds the telemetry metrics for the rasp.timeout metrics since there is no waf.timeout metric + raspTimeout [len(addresses.RASPRuleTypes)]telemetry.MetricHandle + // raspRuleEval holds the telemetry metrics for the `rasp.rule_eval` metric by rule type + raspRuleEval [len(addresses.RASPRuleTypes)]telemetry.MetricHandle + + // Rare metric types + + // truncationCounts holds the telemetry metrics for the `waf.input_truncated` metric, lazily filled + truncationCounts *xsync.MapOf[libddwaf.TruncationReason, telemetry.MetricHandle] + // truncationDistributions holds the telemetry metrics for the `waf.truncated_value_size` metric, lazily filled + truncationDistributions *xsync.MapOf[libddwaf.TruncationReason, telemetry.MetricHandle] + + // Epic metric types + + // wafErrorCount holds the telemetry metrics for the `waf.error` metric, lazily filled + wafErrorCount *xsync.MapOf[int, telemetry.MetricHandle] + // raspErrorCount holds the telemetry metrics for the `rasp.error` metric, lazily filled + raspErrorCount *xsync.MapOf[raspMetricKey[int], telemetry.MetricHandle] + + // Legendary metric types + + // raspRuleMatch holds the telemetry metrics for the `rasp.rule.match` metric, lazily filled + raspRuleMatch *xsync.MapOf[raspMetricKey[string], telemetry.MetricHandle] +} + +var baseRASPTags = [len(addresses.RASPRuleTypes)][]string{ + addresses.RASPRuleTypeLFI: {"rule_type:" + addresses.RASPRuleTypeLFI.String()}, + addresses.RASPRuleTypeSSRFRequest: {"rule_type:" + addresses.RASPRuleTypeSSRFResponse.String(), "rule_variant:request"}, + addresses.RASPRuleTypeSSRFResponse: {"rule_type:" + addresses.RASPRuleTypeSSRFResponse.String(), "rule_variant:response"}, + addresses.RASPRuleTypeSQLI: {"rule_type:" + addresses.RASPRuleTypeSQLI.String()}, + addresses.RASPRuleTypeCMDI: {"rule_type:" + addresses.RASPRuleTypeCMDI.String(), "rule_variant:exec"}, +} + +// NewMetricsInstance creates a new HandleMetrics struct and submit the `waf.init` or `waf.updates` metric. To be called with the raw results of the WAF handle initialization +func NewMetricsInstance(newHandle *libddwaf.Handle, eventRulesVersion string) HandleMetrics { + telemetry.Count(telemetry.NamespaceAppSec, newHandleTelemetryMetric, []string{ + "waf_version:" + libddwaf.Version(), + "event_rules_version:" + eventRulesVersion, + "success:" + strconv.FormatBool(newHandle != nil), + }).Submit(1) + + changeToWafUpdates.Do(func() { + newHandleTelemetryMetric = "waf.updates" + }) + + baseTags := []string{ + "event_rules_version:" + eventRulesVersion, + "waf_version:" + libddwaf.Version(), + } + + metrics := HandleMetrics{ + baseTags: baseTags, + externalTimerDistributions: map[addresses.Scope]telemetry.MetricHandle{ + addresses.RASPScope: telemetry.Distribution(telemetry.NamespaceAppSec, "rasp.duration_ext", baseTags), + addresses.WAFScope: telemetry.Distribution(telemetry.NamespaceAppSec, "waf.duration_ext", baseTags), + }, + internalTimerDistributions: map[addresses.Scope]telemetry.MetricHandle{ + addresses.RASPScope: telemetry.Distribution(telemetry.NamespaceAppSec, "rasp.duration", baseTags), + addresses.WAFScope: telemetry.Distribution(telemetry.NamespaceAppSec, "waf.duration", baseTags), + }, + wafRequestsCounts: xsync.NewMapOf[RequestMilestones, telemetry.MetricHandle](xsync.WithGrowOnly(), xsync.WithPresize(2^6)), + truncationCounts: xsync.NewMapOf[libddwaf.TruncationReason, telemetry.MetricHandle](xsync.WithGrowOnly(), xsync.WithPresize(2^3)), + truncationDistributions: xsync.NewMapOf[libddwaf.TruncationReason, telemetry.MetricHandle](xsync.WithGrowOnly(), xsync.WithPresize(2^2)), + wafErrorCount: xsync.NewMapOf[int, telemetry.MetricHandle](xsync.WithGrowOnly(), xsync.WithPresize(2^3)), + raspErrorCount: xsync.NewMapOf[raspMetricKey[int], telemetry.MetricHandle](xsync.WithGrowOnly(), xsync.WithPresize(2^3)), + raspRuleMatch: xsync.NewMapOf[raspMetricKey[string], telemetry.MetricHandle](xsync.WithGrowOnly(), xsync.WithPresize(2^3)), + } + + for ruleType := range metrics.baseRASPTags { + tags := make([]string, len(baseRASPTags[ruleType])+len(baseTags)) + copy(tags, baseRASPTags[ruleType]) + copy(tags[len(baseRASPTags[ruleType]):], baseTags) + metrics.baseRASPTags[ruleType] = tags + } + + for ruleType := range metrics.raspRuleEval { + metrics.raspRuleEval[ruleType] = telemetry.Count(telemetry.NamespaceAppSec, "rasp.rule.eval", metrics.baseRASPTags[ruleType]) + } + + for ruleType := range metrics.raspTimeout { + metrics.raspTimeout[ruleType] = telemetry.Count(telemetry.NamespaceAppSec, "rasp.timeout", metrics.baseRASPTags[ruleType]) + } + + return metrics +} + +func (m *HandleMetrics) NewContextMetrics() *ContextMetrics { + return &ContextMetrics{ + HandleMetrics: m, + SumDurations: map[addresses.Scope]map[timer.Key]*atomic.Int64{ + addresses.WAFScope: { + libddwaf.EncodeTimeKey: &atomic.Int64{}, + libddwaf.DurationTimeKey: &atomic.Int64{}, + libddwaf.DecodeTimeKey: &atomic.Int64{}, + }, + addresses.RASPScope: { + libddwaf.EncodeTimeKey: &atomic.Int64{}, + libddwaf.DurationTimeKey: &atomic.Int64{}, + libddwaf.DecodeTimeKey: &atomic.Int64{}, + }, + }, + logger: telemetrylog.With(telemetry.WithTags([]string{"product:appsec"})), + } +} + +type ContextMetrics struct { + *HandleMetrics + + // SumRASPCalls is the sum of all the RASP calls made by the WAF whatever the rasp rule type it is. + SumRASPCalls atomic.Uint32 + // SumWAFErrors is the sum of all the WAF errors that happened not in the RASP scope. + SumWAFErrors atomic.Uint32 + // SumRASPErrors is the sum of all the RASP errors that happened in the RASP scope. + SumRASPErrors atomic.Uint32 + + // SumWAFTimeouts is the sum of all the WAF timeouts that happened not in the RASP scope. + SumWAFTimeouts atomic.Uint32 + + // SumRASPTimeouts is the sum of all the RASP timeouts that happened in the RASP scope by rule type. + SumRASPTimeouts [len(addresses.RASPRuleTypes)]atomic.Uint32 + + // SumDurations is the sum of all the run durations calls to ddwaf_run behind go-libddwaf + // This map is built statically when ContextMetrics is created and readonly after that. + SumDurations map[addresses.Scope]map[timer.Key]*atomic.Int64 + + // Milestones are the tags of the metric `waf.requests` that will be submitted at the end of the waf context + Milestones RequestMilestones + + // logger is a pre-configured logger with appsec product tags + logger *telemetrylog.Logger +} + +// Submit increment the metrics for the WAF run stats at the end of each waf context lifecycle +// It registers the metrics: +// - `waf.duration_ext` and `rasp.duration_ext` using [libddwaf.Context.Timer] +// - `waf.duration` and `rasp.duration` using [libddwaf.Result.TimerStats] accumulated in the ContextMetrics +// - `rasp.timeout` for the RASP scope using [libddwaf.Stats.TimeoutRASPCount] +// - `waf.input_truncated` and `waf.truncated_value_size` for the truncations using [libddwaf.Stats.Truncations] +// - `waf.requests` for the milestones using [ContextMetrics.Milestones] +func (m *ContextMetrics) Submit(truncations map[libddwaf.TruncationReason][]int, timerStats map[timer.Key]time.Duration) { + for scope, value := range timerStats { + // Add metrics `{waf,rasp}.duration_ext` + metric, found := m.externalTimerDistributions[scope] + if !found { + m.logger.Error("unexpected scope name", slog.String("scope", string(scope))) + continue + } + + metric.Submit(float64(value) / float64(time.Microsecond.Nanoseconds())) + + // Add metrics `{waf,rasp}.duration` + for key, value := range m.SumDurations[scope] { + if key != libddwaf.DurationTimeKey { + continue + } + + if metric, found := m.internalTimerDistributions[scope]; found { + metric.Submit(float64(value.Load()) / float64(time.Microsecond.Nanoseconds())) + } + } + } + + for ruleTyp := range m.SumRASPTimeouts { + if nbTimeouts := m.SumRASPTimeouts[ruleTyp].Load(); nbTimeouts > 0 { + m.raspTimeout[ruleTyp].Submit(float64(nbTimeouts)) + } + } + + var truncationTypes libddwaf.TruncationReason + for reason, sizes := range truncations { + truncationTypes |= reason + handle, _ := m.truncationDistributions.LoadOrCompute(reason, func() telemetry.MetricHandle { + return telemetry.Distribution(telemetry.NamespaceAppSec, "waf.truncated_value_size", []string{"truncation_reason:" + strconv.Itoa(int(reason))}) + }) + for _, size := range sizes { + handle.Submit(float64(size)) + } + } + + if truncationTypes != 0 { + handle, _ := m.truncationCounts.LoadOrCompute(truncationTypes, func() telemetry.MetricHandle { + return telemetry.Count(telemetry.NamespaceAppSec, "waf.input_truncated", []string{"truncation_reason:" + strconv.Itoa(int(truncationTypes))}) + }) + handle.Submit(1) + } + + if len(truncations) > 0 { + m.Milestones.inputTruncated = true + } + + m.incWafRequestsCounts() +} + +// incWafRequestsCounts increments the `waf.requests` metric with the current milestones and creates a new metric handle if it does not exist +func (m *ContextMetrics) incWafRequestsCounts() { + handle, _ := m.wafRequestsCounts.LoadOrCompute(m.Milestones, func() telemetry.MetricHandle { + return telemetry.Count(telemetry.NamespaceAppSec, "waf.requests", append([]string{ + "request_blocked:" + strconv.FormatBool(m.Milestones.requestBlocked), + "rule_triggered:" + strconv.FormatBool(m.Milestones.ruleTriggered), + "waf_timeout:" + strconv.FormatBool(m.Milestones.wafTimeout), + "rate_limited:" + strconv.FormatBool(m.Milestones.rateLimited), + "waf_error:" + strconv.FormatBool(m.Milestones.wafError), + "input_truncated:" + strconv.FormatBool(m.Milestones.inputTruncated), + }, m.baseTags...)) + }) + + handle.Submit(1) +} + +// RegisterWafRun register the different outputs of the WAF for the `waf.requests` and also directly increment the `rasp.rule.match` and `rasp.rule.eval` metrics. +// It registers the metrics: +// - `rasp.rule.match` +// - `rasp.rule.eval` +// It accumulate data for: +// - `waf.requests` +// - `rasp.duration` +// - `waf.duration` +func (m *ContextMetrics) RegisterWafRun(addrs libddwaf.RunAddressData, timerStats map[timer.Key]time.Duration, tags RequestMilestones) { + for key, value := range timerStats { + m.SumDurations[addrs.TimerKey][key].Add(int64(value)) + } + + switch addrs.TimerKey { + case addresses.RASPScope: + m.SumRASPCalls.Add(1) + ruleType, ok := addresses.RASPRuleTypeFromAddressSet(addrs) + if !ok { + m.logger.Error("unexpected call to RASPRuleTypeFromAddressSet") + return + } + if metric := m.raspRuleEval[ruleType]; metric != nil { + metric.Submit(1) + } + if tags.ruleTriggered { + blockTag := "block:irrelevant" + if tags.requestBlocked { // TODO: add block:failure to the mix + blockTag = "block:success" + } + + handle, _ := m.raspRuleMatch.LoadOrCompute(raspMetricKey[string]{typ: ruleType, additionalTag: blockTag}, func() telemetry.MetricHandle { + return telemetry.Count(telemetry.NamespaceAppSec, "rasp.rule.match", append([]string{ + blockTag, + }, m.baseRASPTags[ruleType]...)) + }) + + handle.Submit(1) + } + if tags.wafTimeout { + m.SumRASPTimeouts[ruleType].Add(1) + } + case addresses.WAFScope, "": + if tags.requestBlocked { + m.Milestones.requestBlocked = true + } + if tags.ruleTriggered { + m.Milestones.ruleTriggered = true + } + if tags.wafTimeout { + m.Milestones.wafTimeout = true + m.SumWAFTimeouts.Add(1) + } + if tags.rateLimited { + m.Milestones.rateLimited = true + } + if tags.wafError { + m.Milestones.wafError = true + } + default: + m.logger.Error("unexpected scope name", slog.String("scope", string(addrs.TimerKey))) + } +} + +// IncWafError should be called if go-libddwaf.(*Context).Run() returns an error to increments metrics linked to WAF errors +// It registers the metrics: +// - `waf.error` +// - `rasp.error` +func (m *ContextMetrics) IncWafError(addrs libddwaf.RunAddressData, in error) { + if in == nil { + return + } + + if !errors.Is(in, waferrors.ErrTimeout) { + logger := m.logger.With(telemetry.WithTags(m.baseTags)) + logger.Error("unexpected WAF error", slog.Any("error", telemetrylog.NewSafeError(in))) + } + + switch addrs.TimerKey { + case addresses.RASPScope: + ruleType, ok := addresses.RASPRuleTypeFromAddressSet(addrs) + if !ok { + m.logger.Error("unexpected call to RASPRuleTypeFromAddressSet", slog.Any("error", telemetrylog.NewSafeError(in))) + } + m.raspError(in, ruleType) + case addresses.WAFScope, "": + m.wafError(in) + default: + m.logger.Error("unexpected scope name", slog.String("scope", string(addrs.TimerKey))) + } +} + +// defaultWafErrorCode is the default error code if the error does not implement [libddwaf.RunError] +// meaning if the error actual come for the bindings and not from the WAF itself +const defaultWafErrorCode = -127 + +func (m *ContextMetrics) wafError(in error) { + m.SumWAFErrors.Add(1) + errCode := defaultWafErrorCode + if code := waferrors.ToWafErrorCode(in); code != 0 { + errCode = code + } + + handle, _ := m.wafErrorCount.LoadOrCompute(errCode, func() telemetry.MetricHandle { + return telemetry.Count(telemetry.NamespaceAppSec, "waf.error", append([]string{ + "error_code:" + strconv.Itoa(errCode), + }, m.baseTags...)) + }) + + handle.Submit(1) +} + +func (m *ContextMetrics) raspError(in error, ruleType addresses.RASPRuleType) { + m.SumRASPErrors.Add(1) + errCode := defaultWafErrorCode + if code := waferrors.ToWafErrorCode(in); code != 0 { + errCode = code + } + + handle, _ := m.raspErrorCount.LoadOrCompute(raspMetricKey[int]{typ: ruleType, additionalTag: errCode}, func() telemetry.MetricHandle { + return telemetry.Count(telemetry.NamespaceAppSec, "rasp.error", append([]string{ + "error_code:" + strconv.Itoa(errCode), + }, m.baseRASPTags[ruleType]...)) + }) + + handle.Submit(1) +} diff --git a/internal/appsec/emitter/waf/run.go b/internal/appsec/emitter/waf/run.go index a77abd5b20..b12c331928 100644 --- a/internal/appsec/emitter/waf/run.go +++ b/internal/appsec/emitter/waf/run.go @@ -10,20 +10,20 @@ import ( "errors" "maps" - waf "github.com/DataDog/go-libddwaf/v3" - wafErrors "github.com/DataDog/go-libddwaf/v3/errors" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/actions" - - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/actions" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/waferrors" ) // Run runs the WAF with the given address data and sends the results to the event receiver // the event receiver can be the same os the method receiver but not always // the event receiver is the one that will receive the actions events generated by the WAF -func (op *ContextOperation) Run(eventReceiver dyngo.Operation, addrs waf.RunAddressData) { +func (op *ContextOperation) Run(eventReceiver dyngo.Operation, addrs libddwaf.RunAddressData) { ctx := op.context.Load() if ctx == nil { // Context was closed concurrently return @@ -41,27 +41,40 @@ func (op *ContextOperation) Run(eventReceiver dyngo.Operation, addrs waf.RunAddr } result, err := ctx.Run(addrs) - if errors.Is(err, wafErrors.ErrTimeout) { - log.Debug("appsec: WAF timeout value reached: %v", err) - } else if err != nil { - log.Error("appsec: unexpected WAF error: %v", err) + if errors.Is(err, waferrors.ErrTimeout) { + log.Debug("appsec: WAF timeout value reached: %s", err.Error()) } - op.AddEvents(result.Events...) + op.metrics.IncWafError(addrs, err) + + wafTimeout := errors.Is(err, waferrors.ErrTimeout) + rateLimited := op.AddEvents(result.Events...) + blocking := actions.SendActionEvents(eventReceiver, result.Actions) op.AbsorbDerivatives(result.Derivatives) - actions.SendActionEvents(eventReceiver, result.Actions) + // Set the trace to ManualKeep if the WAF instructed us to keep it. + if result.Keep { + op.SetTag(ext.ManualKeep, samplernames.AppSec) + } if result.HasEvents() { - log.Debug("appsec: WAF detected a suspicious event") + dyngo.EmitData(op, &SecurityEvent{}) } + + op.metrics.RegisterWafRun(addrs, result.TimerStats, RequestMilestones{ + requestBlocked: blocking, + ruleTriggered: result.HasEvents(), + wafTimeout: wafTimeout, + rateLimited: rateLimited, + wafError: err != nil && !wafTimeout, + }) } // RunSimple runs the WAF with the given address data and returns an error that should be forwarded to the caller -func RunSimple(ctx context.Context, addrs waf.RunAddressData, errorLog string) error { +func RunSimple(ctx context.Context, addrs libddwaf.RunAddressData, errorLog string) error { parent, _ := dyngo.FromContext(ctx) if parent == nil { - log.Error(errorLog) + log.Error("%s", errorLog) return nil } diff --git a/internal/appsec/features.go b/internal/appsec/features.go index ca286de742..b6b7c0fba4 100644 --- a/internal/appsec/features.go +++ b/internal/appsec/features.go @@ -8,17 +8,17 @@ package appsec import ( "errors" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/graphqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/grpcsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/ossec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/sqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/trace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/usersec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/graphqlsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/grpcsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/ossec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/sqlsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/usersec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/waf" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) var features = []listener.NewFeature{ @@ -66,8 +66,12 @@ func (a *appsec) SwapRootOperation() error { oldFeatures := a.features a.features = newFeatures - log.Debug("appsec: stopping the following features: %v", oldFeatures) - log.Debug("appsec: starting the following features: %v", newFeatures) + if len(oldFeatures) > 0 { + log.Debug("appsec: stopping the following features: %q", oldFeatures) + } + if len(newFeatures) > 0 { + log.Debug("appsec: starting the following features: %q", newFeatures) + } dyngo.SwapRootOperation(newRoot) diff --git a/internal/appsec/limiter/limiter.go b/internal/appsec/limiter/limiter.go new file mode 100644 index 0000000000..625c7d98c4 --- /dev/null +++ b/internal/appsec/limiter/limiter.go @@ -0,0 +1,153 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022-present Datadog, Inc. + +// Package limiter provides simple rate limiting primitives, and an implementation of a token bucket rate limiter. +package limiter + +import ( + "sync/atomic" + "time" +) + +// Limiter is used to abstract the rate limiter implementation to only expose the needed function for rate limiting. +// This is for example useful for testing, allowing us to use a modified rate limiter tuned for testing through the same +// interface. +type Limiter interface { + Allow() bool +} + +// TokenTicker is a thread-safe and lock-free rate limiter based on a token bucket. +// The idea is to have a goroutine that will update the bucket with fresh tokens at regular intervals using a time.Ticker. +// The advantage of using a goroutine here is that the implementation becomes easily thread-safe using a few +// atomic operations with little overhead overall. TokenTicker.Start() *should* be called before the first call to +// TokenTicker.Allow() and TokenTicker.Stop() *must* be called once done using. Note that calling TokenTicker.Allow() +// before TokenTicker.Start() is valid, but it means the bucket won't be refilling until the call to TokenTicker.Start() is made +type TokenTicker struct { + tokens atomic.Int64 // The amount of tokens currently available + maxTokens int64 // The maximum amount of tokens the bucket can hold + interval time.Duration // The interval at which the tokens are refilled + ticker *time.Ticker // The ticker used to update the bucket (nil if not started yet) + stopChan chan struct{} // The channel to stop the ticker updater (nil if not started yet) +} + +// NewTokenTicker is a utility function that allocates a token ticker, initializes necessary fields and returns it +func NewTokenTicker(tokens, maxTokens int64) *TokenTicker { + return NewTokenTickerWithInterval(tokens, maxTokens, time.Second) +} + +// NewTokenTickerWithInterval is a utility function that allocates a token ticker with a custom interval +func NewTokenTickerWithInterval(tokens, maxTokens int64, interval time.Duration) *TokenTicker { + t := &TokenTicker{ + maxTokens: maxTokens, + interval: interval, + } + t.tokens.Store(tokens) + return t +} + +// updateBucket performs a select loop to update the token amount in the bucket. +// Used in a goroutine by the rate limiter. +func (t *TokenTicker) updateBucket(startTime time.Time, ticksChan <-chan time.Time, stopChan <-chan struct{}, syncChan chan<- struct{}) { + nsPerToken := t.interval.Nanoseconds() / t.maxTokens + elapsedNs := int64(0) + prevStamp := startTime + + for { + select { + case <-stopChan: + if syncChan != nil { + close(syncChan) + } + return + case stamp, ok := <-ticksChan: + if !ok { + // The ticker has been closed, stamp is a zero-value, we ignore that. We nil-out the + // ticksChan so we don't get stuck endlessly reading from this closed channel again. + ticksChan = nil + continue + } + + // Compute the time in nanoseconds that passed between the previous timestamp and this one + // This will be used to know how many tokens can be added into the bucket depending on the limiter rate + elapsedNs += stamp.Sub(prevStamp).Nanoseconds() + if elapsedNs > t.maxTokens*nsPerToken { + elapsedNs = t.maxTokens * nsPerToken + } + prevStamp = stamp + // Update the number of tokens in the bucket if enough nanoseconds have passed + if elapsedNs >= nsPerToken { + // Atomic spin lock to make sure we don't race for `t.tokens` + for { + tokens := t.tokens.Load() + if tokens == t.maxTokens { + break // Bucket is already full, nothing to do + } + inc := elapsedNs / nsPerToken + // Make sure not to add more tokens than we are allowed to into the bucket + if tokens+inc > t.maxTokens { + inc -= (tokens + inc) % t.maxTokens + } + if t.tokens.CompareAndSwap(tokens, tokens+inc) { + // Keep track of remaining elapsed ns that were not taken into account for this computation, + // so that increment computation remains precise over time + elapsedNs = elapsedNs % nsPerToken + break + } + } + } + // Sync channel used to signify that the goroutine is done updating the bucket. Used for tests to guarantee + // that the goroutine ticked at least once. + if syncChan != nil { + syncChan <- struct{}{} + } + } + } +} + +// Start starts the ticker and launches the goroutine responsible for updating the token bucket. +// The ticker is set to tick at a fixed rate of 500us. +func (t *TokenTicker) Start() { + timeNow := time.Now() + t.ticker = time.NewTicker(500 * time.Microsecond) + t.start(timeNow, t.ticker.C, nil) +} + +// start is used for internal testing. Controlling the ticker means being able to test per-tick +// rather than per-duration, which is more reliable if the app is under a lot of stress. The +// syncChan, if non-nil, will receive one message after each tick from the ticksChan has been +// processed, providing a strong synchronization primitive. The limiter will close the syncChan when +// it is stopped, signaling that no further ticks will be processed. +func (t *TokenTicker) start(startTime time.Time, ticksChan <-chan time.Time, syncChan chan<- struct{}) { + t.stopChan = make(chan struct{}) + go t.updateBucket(startTime, ticksChan, t.stopChan, syncChan) +} + +// Stop shuts down the rate limiter, taking care stopping the ticker and closing all channels +func (t *TokenTicker) Stop() { + // Stop the ticker only if it has been instantiated (not the case when testing by calling start() directly) + if t.ticker != nil { + t.ticker.Stop() + t.ticker = nil // Ensure stop can be called multiple times idempotently. + } + // Close the stop channel only if it has been created. This covers the case where Stop() is called without any prior + // call to Start() + if t.stopChan != nil { + close(t.stopChan) + t.stopChan = nil // Ensure stop can be called multiple times idempotently. + } +} + +// Allow checks and returns whether a token can be retrieved from the bucket and consumed. +// Thread-safe. +func (t *TokenTicker) Allow() bool { + for { + tokens := t.tokens.Load() + if tokens == 0 { + return false + } else if t.tokens.CompareAndSwap(tokens, tokens-1) { + return true + } + } +} diff --git a/internal/appsec/limiter/limiter_test.go b/internal/appsec/limiter/limiter_test.go new file mode 100644 index 0000000000..7d0467cc0e --- /dev/null +++ b/internal/appsec/limiter/limiter_test.go @@ -0,0 +1,395 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022-present Datadog, Inc. + +package limiter + +import ( + "fmt" + "math" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/goleak" +) + +func TestLimiterUnit(t *testing.T) { + startTime := time.Now() + + t.Run("no-ticks-1", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(1, 100) + l.start(startTime) + defer l.stop() + // No ticks between the requests + require.True(t, l.Allow(), "First call to limiter.Allow() should return True") + require.False(t, l.Allow(), "Second call to limiter.Allow() should return False") + }) + + t.Run("no-ticks-2", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(100, 100) + l.start(startTime) + defer l.stop() + // No ticks between the requests + for i := 0; i < 100; i++ { + require.True(t, l.Allow()) + } + require.False(t, l.Allow()) + }) + + t.Run("10ms-ticks", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(1, 100) + l.start(startTime) + defer l.stop() + require.True(t, l.Allow(), "First call to limiter.Allow() should return True") + require.False(t, l.Allow(), "Second call to limiter.Allow() should return false") + l.tick(10 * time.Millisecond) + require.True(t, l.Allow(), "Third call to limiter.Allow() after 10ms should return True") + }) + + t.Run("9ms-ticks", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(1, 100) + l.start(startTime) + defer l.stop() + require.True(t, l.Allow(), "First call to limiter.Allow() should return True") + l.tick(9 * time.Millisecond) + require.False(t, l.Allow(), "Second call to limiter.Allow() after 9ms should return False") + l.tick(10 * time.Millisecond) + require.True(t, l.Allow(), "Third call to limiter.Allow() after 10ms should return True") + }) + + t.Run("1s-rate", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(1, 1) + l.start(startTime) + defer l.stop() + require.True(t, l.Allow(), "First call to limiter.Allow() should return True with 1s per token") + l.tick(500 * time.Millisecond) + require.False(t, l.Allow(), "Second call to limiter.Allow() should return False with 1s per Token") + l.tick(1000 * time.Millisecond) + require.True(t, l.Allow(), "Third call to limiter.Allow() should return True with 1s per Token") + }) + + t.Run("100-requests-burst", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(100, 100) + l.start(startTime) + defer l.stop() + for i := 0; i < 100; i++ { + require.Truef(t, l.Allow(), + "Burst call %d to limiter.Allow() should return True with 100 initial tokens", i) + l.tick(50 * time.Millisecond) + } + }) + + t.Run("101-requests-burst", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(100, 100) + l.start(startTime) + defer l.stop() + for i := 0; i < 100; i++ { + require.Truef(t, l.Allow(), + "Burst call %d to limiter.Allow() should return True with 100 initial tokens", i) + startTime = startTime.Add(50 * time.Microsecond) + l.tick(0) + } + require.False(t, l.Allow(), + "Burst call 101 to limiter.Allow() should return False with 100 initial tokens") + }) + + t.Run("bucket-refill-short", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(100, 100) + l.start(startTime) + defer l.stop() + + for i := 0; i < 1000; i++ { + l.tick(time.Millisecond) + require.Equalf(t, int64(100), l.t.tokens.Load(), "Bucket should have exactly 100 tokens") + } + }) + + t.Run("bucket-refill-long", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(100, 100) + l.start(startTime) + defer l.stop() + + for i := 0; i < 1000; i++ { + l.tick(3 * time.Second) + } + require.Equalf(t, int64(100), l.t.tokens.Load(), "Bucket should have exactly 100 tokens") + }) + + t.Run("allow-after-stop", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(3, 3) + l.start(startTime) + require.True(t, l.Allow()) + l.stop() + // The limiter keeps allowing until there's no more tokens + require.True(t, l.Allow()) + require.True(t, l.Allow()) + require.False(t, l.Allow()) + }) + + t.Run("allow-before-start", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTicker(2, 100) + // The limiter keeps allowing until there's no more tokens + require.True(t, l.Allow()) + require.True(t, l.Allow()) + require.False(t, l.Allow()) + l.start(startTime) + // The limiter has used all its tokens and the bucket is not getting refilled yet + require.False(t, l.Allow()) + l.tick(10 * time.Millisecond) + // The limiter has started refilling its tokens + require.True(t, l.Allow()) + l.stop() + }) +} + +func TestLimiter(t *testing.T) { + t.Run("concurrency", func(t *testing.T) { + // Tests the limiter's ability to sample the traces when subjected to a continuous flow of requests + // Each goroutine will continuously call the rate limiter for 1 second + for nbUsers := 1; nbUsers <= 10; nbUsers *= 10 { + t.Run(fmt.Sprintf("continuous-requests-%d-users", nbUsers), func(t *testing.T) { + defer goleak.VerifyNone(t) + + var startBarrier, stopBarrier sync.WaitGroup + // Create a start barrier to synchronize every goroutine's launch and + // increase the chances of parallel accesses + startBarrier.Add(1) + // Create a stopBarrier to signal when all user goroutines are done. + stopBarrier.Add(nbUsers) + var skipped, kept atomic.Uint64 + l := NewTokenTicker(0, 100) + + for n := 0; n < nbUsers; n++ { + go func(l Limiter, kept, skipped *atomic.Uint64) { + startBarrier.Wait() // Sync the starts of the goroutines + defer stopBarrier.Done() // Signal we are done when returning + + for tStart := time.Now(); time.Since(tStart) < 1*time.Second; { + if !l.Allow() { + skipped.Add(1) + } else { + kept.Add(1) + } + } + }(l, &kept, &skipped) + } + + l.Start() + defer l.Stop() + start := time.Now() + startBarrier.Done() // Unblock the user goroutines + stopBarrier.Wait() // Wait for the user goroutines to be done + duration := time.Since(start).Seconds() + maxExpectedKept := uint64(math.Ceil(duration) * 100) + + require.LessOrEqualf(t, kept.Load(), maxExpectedKept, + "Expected at most %d kept tokens for a %fs duration", maxExpectedKept, duration) + }) + } + + burstFreq := 1000 * time.Millisecond + burstSize := 101 + startTime := time.Now() + // Simulate sporadic bursts during up to 1 minute + for burstAmount := 1; burstAmount <= 10; burstAmount++ { + t.Run(fmt.Sprintf("requests-bursts-%d-iterations", burstAmount), func(t *testing.T) { + defer goleak.VerifyNone(t) + + skipped := 0 + kept := 0 + l := newTestTicker(100, 100) + l.start(startTime) + defer l.stop() + + for c := 0; c < burstAmount; c++ { + for i := 0; i < burstSize; i++ { + if !l.Allow() { + skipped++ + } else { + kept++ + } + } + // Schedule next burst 1sec later + l.tick(burstFreq) + } + + expectedSkipped := (burstSize - 100) * burstAmount + expectedKept := 100 * burstAmount + if burstSize < 100 { + expectedSkipped = 0 + expectedKept = burstSize * burstAmount + } + require.Equalf(t, kept, expectedKept, "Expected %d burst requests to be kept", expectedKept) + require.Equalf(t, expectedSkipped, skipped, "Expected %d burst requests to be skipped", expectedSkipped) + }) + } + }) +} + +func BenchmarkLimiter(b *testing.B) { + defer goleak.VerifyNone(b, goleak.IgnoreCurrent()) + + for nbUsers := 1; nbUsers <= 1000; nbUsers *= 10 { + b.Run(fmt.Sprintf("%d-users", nbUsers), func(b *testing.B) { + var skipped, kept atomic.Uint64 + limiter := NewTokenTicker(0, 100) + limiter.Start() + defer limiter.Stop() + + b.StopTimer() + b.ResetTimer() + + for n := 0; n < b.N; n++ { + var startBarrier, stopBarrier sync.WaitGroup + // Create a start barrier to synchronize every goroutine's launch and + // increase the chances of parallel accesses + startBarrier.Add(1) + // Create a stopBarrier to signal when all user goroutines are done. + stopBarrier.Add(nbUsers) + + for n := 0; n < nbUsers; n++ { + go func(l Limiter, kept, skipped *atomic.Uint64) { + startBarrier.Wait() // Sync the starts of the goroutines + defer stopBarrier.Done() // Signal we are done when returning + + b.StartTimer() // Ensure the timer is started now... + + for i := 0; i < 100; i++ { + if !l.Allow() { + skipped.Add(1) + } else { + kept.Add(1) + } + } + }(limiter, &kept, &skipped) + } + + startBarrier.Done() // Unblock the user goroutines + stopBarrier.Wait() // Wait for the user goroutines to be done + b.StopTimer() + } + + assert.NotEqual(b, 0, kept.Load(), "expected to have accepted at least 1") + assert.NotEqual(b, 0, skipped.Load(), "expected to have skipped at least 1") + }) + } +} + +// TestTicker is a utility struct used to send hand-crafted ticks to the rate limiter for controlled testing +// It also makes sure to give time to the bucket update goroutine by using the optional sync channel +type TestTicker struct { + C chan time.Time + syncChan <-chan struct{} + t *TokenTicker + timestamp time.Time +} + +func newTestTicker(tokens, maxTokens int64) *TestTicker { + return &TestTicker{ + C: make(chan time.Time), + t: NewTokenTicker(tokens, maxTokens), + } +} + +func (t *TestTicker) start(timestamp time.Time) { + syncChan := make(chan struct{}, 1) + t.syncChan = syncChan + t.timestamp = timestamp + t.t.start(timestamp, t.C, syncChan) +} + +func (t *TestTicker) stop() { + t.t.Stop() + close(t.C) + // syncChan is closed by the token ticker when sure that nothing else will be sent on it. + for _, ok := <-t.syncChan; ok; _, ok = <-t.syncChan { + // Drain the channel. + } + t.syncChan = nil + t.timestamp = time.Time{} +} + +// tick advances the `TestTicker`'s internal clock by the provided duration, and sends a tick to the +// underlying `TokenTicker`. It then waits for the `TokenTicker` to be done processing that tick, so +// the caller can assume the tocken bucket has been appropriately updated. +func (t *TestTicker) tick(delta time.Duration) { + t.timestamp = t.timestamp.Add(delta) + + t.C <- t.timestamp + <-t.syncChan +} + +func (t *TestTicker) Allow() bool { + return t.t.Allow() +} + +func newTestTickerWithInterval(tokens, maxTokens int64, interval time.Duration) *TestTicker { + return &TestTicker{ + C: make(chan time.Time), + t: NewTokenTickerWithInterval(tokens, maxTokens, interval), + } +} + +func TestLimiterWithInterval(t *testing.T) { + startTime := time.Now() + t.Run("60-per-minute-rate", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTickerWithInterval(1, 60, time.Minute) // 60 tokens per minute, so 1 per second + l.start(startTime) + defer l.stop() + require.True(t, l.Allow(), "First call should be allowed") + require.False(t, l.Allow(), "Second call should be disallowed") + + l.tick(500 * time.Millisecond) + require.False(t, l.Allow(), "A call after 0.5s should be disallowed") + + l.tick(500 * time.Millisecond) // Total 1 second passed + require.True(t, l.Allow(), "A call after 1s should be allowed") + require.False(t, l.Allow(), "Another call should be disallowed") + }) + + t.Run("1-per-100ms-rate", func(t *testing.T) { + defer goleak.VerifyNone(t) + + l := newTestTickerWithInterval(1, 1, 100*time.Millisecond) // 1 token per 100ms + l.start(startTime) + defer l.stop() + require.True(t, l.Allow(), "First call should be allowed") + require.False(t, l.Allow(), "Second call should be disallowed") + + l.tick(50 * time.Millisecond) + require.False(t, l.Allow(), "A call after 50ms should be disallowed") + + l.tick(50 * time.Millisecond) // Total 100ms passed + require.True(t, l.Allow(), "A call after 100ms should be allowed") + require.False(t, l.Allow(), "Another call should be disallowed") + }) +} diff --git a/internal/appsec/listener/feature.go b/internal/appsec/listener/feature.go index 6f07e2cd56..d22067cd8d 100644 --- a/internal/appsec/listener/feature.go +++ b/internal/appsec/listener/feature.go @@ -6,8 +6,8 @@ package listener import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" ) // Feature is an interface that represents a feature that can be started and stopped. diff --git a/internal/appsec/listener/graphqlsec/graphql.go b/internal/appsec/listener/graphqlsec/graphql.go index cb97baf3ea..4de4b95369 100644 --- a/internal/appsec/listener/graphqlsec/graphql.go +++ b/internal/appsec/listener/graphqlsec/graphql.go @@ -6,12 +6,12 @@ package graphqlsec import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/graphqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/graphqlsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" ) type Feature struct{} diff --git a/internal/appsec/listener/grpcsec/grpc.go b/internal/appsec/listener/grpcsec/grpc.go index 52bb2c0fb7..13222a9d32 100644 --- a/internal/appsec/listener/grpcsec/grpc.go +++ b/internal/appsec/listener/grpcsec/grpc.go @@ -6,14 +6,14 @@ package grpcsec import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/grpcsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/grpcsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) type Feature struct{} diff --git a/internal/appsec/listener/grpcsec/grpc_test.go b/internal/appsec/listener/grpcsec/grpc_test.go index bfb8520b5c..3b3f32e059 100644 --- a/internal/appsec/listener/grpcsec/grpc_test.go +++ b/internal/appsec/listener/grpcsec/grpc_test.go @@ -6,13 +6,13 @@ package grpcsec import ( + "encoding/json" "fmt" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" - + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/waf" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" "github.com/stretchr/testify/require" ) @@ -94,18 +94,20 @@ func TestTags(t *testing.T) { metadataCase := metadataCase t.Run(fmt.Sprintf("%s-%s", eventCase.name, metadataCase.name), func(t *testing.T) { var span MockSpan - err := waf.SetEventSpanTags(&span, eventCase.events) + waf.SetEventSpanTags(&span) + value, err := json.Marshal(map[string][]any{"triggers": eventCase.events}) if eventCase.expectedError { require.Error(t, err) return } + + span.SetTag("_dd.appsec.json", string(value)) require.NoError(t, err) SetRequestMetadataTags(&span, metadataCase.md) if eventCase.events != nil { require.Subset(t, span.Tags, map[string]interface{}{ "_dd.appsec.json": eventCase.expectedTag, - "manual.keep": true, "appsec.event": true, "_dd.origin": "appsec", }) diff --git a/internal/appsec/listener/httpsec/clientip.go b/internal/appsec/listener/httpsec/clientip.go new file mode 100644 index 0000000000..84350ac89c --- /dev/null +++ b/internal/appsec/listener/httpsec/clientip.go @@ -0,0 +1,153 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package httpsec + +import ( + "net" + "net/netip" + "net/textproto" + "regexp" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/theckman/httpforwarded" +) + +// ClientIP returns the first public IP address found in the given headers. If +// none is present, it returns the first valid IP address present, possibly +// being a local IP address. The remote address, when valid, is used as fallback +// when no IP address has been found at all. +func ClientIP(hdrs map[string][]string, hasCanonicalHeaders bool, remoteAddr string, monitoredHeaders []string) (remoteIP, clientIP netip.Addr) { + // Walk IP-related headers + var foundIP netip.Addr +headersLoop: + for _, headerName := range monitoredHeaders { + if hasCanonicalHeaders { + headerName = textproto.CanonicalMIMEHeaderKey(headerName) + } + + headerValues, exists := hdrs[headerName] + if !exists { + continue // this monitored header is not present + } + + // Assuming a list of comma-separated IP addresses, split them and build + // the list of values to try to parse as IP addresses + var ips []string + for _, headerValue := range headerValues { + if strings.ToLower(headerName) == "forwarded" { + ips = append(ips, parseForwardedHeader(headerValue)...) + } else { + ips = append(ips, strings.Split(headerValue, ",")...) + } + } + + // Look for the first valid or global IP address in the comma-separated list + for _, ipstr := range ips { + ip := parseIP(strings.TrimSpace(ipstr)) + if !ip.IsValid() { + continue + } + // Replace foundIP if still not valid in order to keep the oldest + if !foundIP.IsValid() { + foundIP = ip + } + if isGlobalIP(ip) { + foundIP = ip + break headersLoop + } + } + } + + // Decide which IP address is the client one by starting with the remote IP + if ip := parseIP(remoteAddr); ip.IsValid() { + remoteIP = ip + clientIP = ip + } + + // The IP address found in the headers supersedes a private remote IP address. + if foundIP.IsValid() && !isGlobalIP(remoteIP) || isGlobalIP(foundIP) { + clientIP = foundIP + } + + return remoteIP, clientIP +} + +var ( + forwardedPortRe = regexp.MustCompile(`^(?:\[([a-f0-9:]+)\]|(\d+\.\d+\.\d+\.\d+))(?::\d+)?$`) +) + +// parseForwardedHeader parses the value of the `Forwarded` header, returning +// the values of all `for` directives it contains, in the order they appear. +// Values may not always be IP addresses; but those values that are will have +// any quoting and port information removed. +// +// If the value is found to be syntactically incorrect, a null slice is returned. +// +// See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Forwarded +func parseForwardedHeader(value string) []string { + result, err := httpforwarded.ParseParameter("for", []string{value}) + if err != nil { + log.Debug("invalid Forwarded header value: %v", err.Error()) + return nil + } + + for idx, val := range result { + matches := forwardedPortRe.FindStringSubmatch(val) + if matches == nil { + continue + } + // Remove the port information from the value, and un-brace IPv6 addresses. + if matches[1] != "" { + result[idx] = matches[1] + } else { + result[idx] = matches[2] + } + } + + return result +} + +func parseIP(s string) netip.Addr { + if ip, err := netip.ParseAddr(s); err == nil { + return ip + } + if h, _, err := net.SplitHostPort(s); err == nil { + if ip, err := netip.ParseAddr(h); err == nil { + return ip + } + } + return netip.Addr{} +} + +var ( + ipv6SpecialNetworks = [...]netip.Prefix{ + netip.MustParsePrefix("fec0::/10"), // site local + } + + // This IP block is not routable on internet and an industry standard/trend + // is emerging to use it for traditional IT-managed networking environments + // with limited RFC1918 space allocations. This is also frequently used by + // kubernetes pods' internal networking. It is hence deemed private for the + // purpose of Client IP extraction. + k8sInternalIPv4Prefix = netip.MustParsePrefix("100.65.0.0/10") +) + +func isGlobalIP(ip netip.Addr) bool { + // IsPrivate also checks for ipv6 ULA. + // We care to check for these addresses are not considered public, hence not global. + // See https://www.rfc-editor.org/rfc/rfc4193.txt for more details. + isGlobal := ip.IsValid() && !ip.IsPrivate() && !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !k8sInternalIPv4Prefix.Contains(ip) + if !isGlobal || !ip.Is6() { + return isGlobal + } + for _, n := range ipv6SpecialNetworks { + if n.Contains(ip) { + return false + } + } + return isGlobal +} diff --git a/internal/appsec/listener/httpsec/clientip_test.go b/internal/appsec/listener/httpsec/clientip_test.go new file mode 100644 index 0000000000..13aeb5c2d4 --- /dev/null +++ b/internal/appsec/listener/httpsec/clientip_test.go @@ -0,0 +1,492 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package httpsec + +import ( + "fmt" + "math/rand" + "net/http" + "net/netip" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/stretchr/testify/require" +) + +type ipTestCase struct { + name string + remoteAddr string + headers map[string]string + expectedIP netip.Addr + clientIPHeaders []string +} + +func genIPTestCases() []ipTestCase { + ipv4Global := randGlobalIPv4().String() + ipv6Global := randGlobalIPv6().String() + ipv4Private := randPrivateIPv4().String() + k8sPrivate := randK8sPrivate().String() + ipv6Private := randPrivateIPv6().String() + + tcs := []ipTestCase{ + { + name: "ipv4-global-remoteaddr", + remoteAddr: ipv4Global, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ipv4-private-remoteaddr", + remoteAddr: ipv4Private, + expectedIP: netip.MustParseAddr(ipv4Private), + }, + { + name: "ipv6-global-remoteaddr", + remoteAddr: ipv6Global, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv6-private-remoteaddr", + remoteAddr: ipv6Private, + expectedIP: netip.MustParseAddr(ipv6Private), + }, + } + + // Simple ipv4 test cases over all headers + for _, header := range defaultIPHeaders { + if header == "forwarded" { + // The `Forwarded` header has a different format to others, so it's handled separately. + continue + } + + tcs = append(tcs, + ipTestCase{ + name: "ipv4-global." + header, + remoteAddr: ipv4Private, + headers: map[string]string{header: ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv4-private." + header, + headers: map[string]string{header: ipv4Private}, + remoteAddr: ipv6Private, + expectedIP: netip.MustParseAddr(ipv4Private), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv4-global-remoteaddr-local-ip-header." + header, + remoteAddr: ipv4Global, + headers: map[string]string{header: ipv4Private}, + expectedIP: netip.MustParseAddr(ipv4Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv4-global-remoteaddr-global-ip-header." + header, + remoteAddr: ipv6Global, + headers: map[string]string{header: ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + clientIPHeaders: defaultIPHeaders, + }) + } + + // Simple ipv6 test cases over all headers + for _, header := range defaultIPHeaders { + if header == "forwarded" { + // The `Forwarded` header has a different format to others, so it's handled separately. + continue + } + + tcs = append(tcs, ipTestCase{ + name: "ipv6-global." + header, + remoteAddr: ipv4Private, + headers: map[string]string{header: ipv6Global}, + expectedIP: netip.MustParseAddr(ipv6Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv6-private." + header, + headers: map[string]string{header: ipv6Private}, + remoteAddr: ipv4Private, + expectedIP: netip.MustParseAddr(ipv6Private), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv6-global-remoteaddr-local-ip-header." + header, + remoteAddr: ipv6Global, + headers: map[string]string{header: ipv6Private}, + expectedIP: netip.MustParseAddr(ipv6Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv6-global-remoteaddr-global-ip-header." + header, + remoteAddr: ipv4Global, + headers: map[string]string{header: ipv6Global}, + expectedIP: netip.MustParseAddr(ipv6Global), + clientIPHeaders: defaultIPHeaders, + }) + } + + // private and global in same header + tcs = append([]ipTestCase{ + { + name: "ipv4-private+global", + headers: map[string]string{"x-forwarded-for": ipv4Private + "," + ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ipv4-global+private", + headers: map[string]string{"x-forwarded-for": ipv4Global + "," + ipv4Private}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ipv6-private+global", + headers: map[string]string{"x-forwarded-for": ipv6Private + "," + ipv6Global}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv6-global+private", + headers: map[string]string{"x-forwarded-for": ipv6Global + "," + ipv6Private}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "mixed-global+global", + headers: map[string]string{"x-forwarded-for": ipv4Private + "," + ipv6Global + "," + ipv4Global}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "mixed-global+global", + headers: map[string]string{"x-forwarded-for": ipv4Private + "," + ipv4Global + "," + ipv6Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "k8s-private+global", + headers: map[string]string{"x-forwarded-for": k8sPrivate + "," + ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + }, tcs...) + + // Invalid IPs (or a mix of valid/invalid over a single or multiple headers) + tcs = append([]ipTestCase{ + { + name: "no headers", + headers: nil, + expectedIP: netip.Addr{}, + }, + { + name: "invalid-ipv4", + headers: map[string]string{"x-forwarded-for": "127..0.0.1"}, + expectedIP: netip.Addr{}, + }, + { + name: "invalid-ipv4-header-valid-remoteaddr", + headers: map[string]string{"x-forwarded-for": "127..0.0.1"}, + remoteAddr: ipv4Private, + expectedIP: netip.MustParseAddr(ipv4Private), + }, + { + name: "invalid-ipv4-recover", + headers: map[string]string{"x-forwarded-for": "127..0.0.1, " + ipv6Private + "," + ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ip-multi-header-order-0", + headers: map[string]string{"x-forwarded-for": ipv4Global, "forwarded-for": ipv6Global}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ip-multi-header-order-1", + headers: map[string]string{"x-forwarded-for": ipv4Global, "forwarded-for": ipv6Global}, + clientIPHeaders: []string{"forwarded-for", "x-forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv4-multi-header-0", + headers: map[string]string{"x-forwarded-for": ipv4Private, "forwarded-for": ipv4Global}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ipv4-multi-header-1", + headers: map[string]string{"x-forwarded-for": ipv4Global, "forwarded-for": ipv4Private}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ipv4-multi-header-2", + headers: map[string]string{"x-forwarded-for": "127.0.0.1, " + ipv4Private, "forwarded-for": fmt.Sprintf("%s, %s", ipv4Private, ipv4Global)}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "ipv4-multi-header-3", + headers: map[string]string{"x-forwarded-for": "127.0.0.1, " + ipv4Global, "forwarded-for": ipv4Private}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "invalid-ipv6", + headers: map[string]string{"x-forwarded-for": "2001:0db8:2001:zzzz::"}, + expectedIP: netip.Addr{}, + }, + { + name: "invalid-ipv6-recover", + headers: map[string]string{"x-forwarded-for": "2001:0db8:2001:zzzz::, " + ipv6Global}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv6-multi-header-0", + headers: map[string]string{"x-forwarded-for": ipv6Private, "forwarded-for": ipv6Global}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv6-multi-header-1", + headers: map[string]string{"x-forwarded-for": ipv6Global, "forwarded-for": ipv6Private}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv6-multi-header-2", + headers: map[string]string{"x-forwarded-for": "127.0.0.1, " + ipv6Private, "forwarded-for": fmt.Sprintf("%s, %s", ipv6Private, ipv6Global)}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "ipv6-multi-header-3", + headers: map[string]string{"x-forwarded-for": "127.0.0.1, " + ipv6Global, "forwarded-for": ipv6Private}, + clientIPHeaders: []string{"x-forwarded-for", "forwarded-for"}, + expectedIP: netip.MustParseAddr(ipv6Global), + }, + { + name: "no-headers", + expectedIP: netip.Addr{}, + }, + { + name: "header-case", + headers: map[string]string{"X-fOrWaRdEd-FoR": ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "user-header", + headers: map[string]string{"x-forwarded-for": ipv6Global, "custom-header": ipv4Global}, + clientIPHeaders: []string{"custom-header"}, + expectedIP: netip.MustParseAddr(ipv4Global), + }, + { + name: "user-header-not-found", + headers: map[string]string{"x-forwarded-for": ipv4Global}, + clientIPHeaders: []string{"custom-header"}, + expectedIP: netip.Addr{}, + }, + }, tcs...) + + // Special case for the Forwarded header (as it has its own format) + tcs = append(tcs, + // IPv4 flavor + ipTestCase{ + name: "ipv4-global.forwarded", + remoteAddr: ipv4Private, + headers: map[string]string{"forwarded": "for=" + ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv4-private.forwarded", + headers: map[string]string{"forwarded": "for=" + ipv4Private}, + remoteAddr: ipv6Private, + expectedIP: netip.MustParseAddr(ipv4Private), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv4-global-remoteaddr-local-ip-header.forwarded", + remoteAddr: ipv4Global, + headers: map[string]string{"forwarded": "for=" + ipv4Private}, + expectedIP: netip.MustParseAddr(ipv4Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv4-global-remoteaddr-global-ip-header.forwarded", + remoteAddr: ipv6Global, + headers: map[string]string{"forwarded": "for=" + ipv4Global}, + expectedIP: netip.MustParseAddr(ipv4Global), + clientIPHeaders: defaultIPHeaders, + }, + // IPv6 flavor + ipTestCase{ + name: "ipv6-global.forwarded", + remoteAddr: ipv4Private, + headers: map[string]string{"forwarded": `for="[` + ipv6Global + `]"`}, + expectedIP: netip.MustParseAddr(ipv6Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv6-private.forwarded", + headers: map[string]string{"forwarded": `for="[` + ipv6Private + `]"`}, + remoteAddr: ipv4Private, + expectedIP: netip.MustParseAddr(ipv6Private), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv6-global-remoteaddr-local-ip-header.forwarded", + remoteAddr: ipv6Global, + headers: map[string]string{"forwarded": `for="[` + ipv6Private + `]"`}, + expectedIP: netip.MustParseAddr(ipv6Global), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "ipv6-global-remoteaddr-global-ip-header.forwarded", + remoteAddr: ipv4Global, + headers: map[string]string{"forwarded": `for="[` + ipv6Global + `]"`}, + expectedIP: netip.MustParseAddr(ipv6Global), + clientIPHeaders: defaultIPHeaders, + }, + // Seen in the System-Tests + ipTestCase{ + name: "system-tests-ipv4.forwarded", + remoteAddr: ipv4Global, + headers: map[string]string{"forwarded": `for=127.0.0.1;host="example.host";by=2.2.2.2;proto=http,for="1.1.1.1:6543"`}, + expectedIP: netip.MustParseAddr("1.1.1.1"), + clientIPHeaders: defaultIPHeaders, + }, + ipTestCase{ + name: "system-tests-ipv6.forwarded", + remoteAddr: ipv6Global, + headers: map[string]string{"forwarded": `for="[::1]",for="[9f7b:5e67:5472:4464:90b0:6b0a:9aa6:f9dc]:4485"`}, + expectedIP: netip.MustParseAddr("9f7b:5e67:5472:4464:90b0:6b0a:9aa6:f9dc"), + clientIPHeaders: defaultIPHeaders, + }, + ) + + return tcs +} + +func TestClientIPExtraction(t *testing.T) { + for _, hasCanonicalMIMEHeaderKeys := range []bool{true, false} { + t.Run(fmt.Sprintf("canonical-headers-%t", hasCanonicalMIMEHeaderKeys), func(t *testing.T) { + for _, tc := range genIPTestCases() { + t.Run(tc.name, func(t *testing.T) { + headers := http.Header{} + for k, v := range tc.headers { + if hasCanonicalMIMEHeaderKeys { + headers.Add(k, v) + } else { + k = strings.ToLower(k) + headers[k] = append(headers[k], v) + } + } + + // Default list to use - the tests rely on x-forwarded-for only when using this default list + monitoredHeaders := []string{"x-client-ip", "x-forwarded-for", "true-client-ip"} + if tc.clientIPHeaders != nil { + monitoredHeaders = tc.clientIPHeaders + } + remoteIP, clientIP := ClientIP(headers, hasCanonicalMIMEHeaderKeys, tc.remoteAddr, monitoredHeaders) + tags := ClientIPTagsFor(remoteIP, clientIP) + if tc.expectedIP.IsValid() { + expectedIP := tc.expectedIP.String() + require.Equal(t, expectedIP, clientIP.String()) + if tc.remoteAddr != "" { + require.Equal(t, tc.remoteAddr, remoteIP.String()) + require.Equal(t, tc.remoteAddr, tags[ext.NetworkClientIP]) + } else { + require.NotContains(t, tags, ext.NetworkClientIP) + } + require.Equal(t, expectedIP, tags[ext.HTTPClientIP]) + } else { + require.NotContains(t, tags, ext.HTTPClientIP) + require.False(t, clientIP.IsValid()) + } + }) + } + }) + } +} + +func TestParseForwardedHeader(t *testing.T) { + require.Equal(t, + []string{"127.0.0.1", "127.0.0.2", "fe80::2897:fcb4:830e:9e44", "quoted\"escaped", "fe80::2897:fcb4:830e:9e45"}, + parseForwardedHeader(`by=unknown;FOR="127.0.0.1:443";proto="https;TLS",for=127.0.0.2,for="[fe80::2897:fcb4:830e:9e44]:443",for="quoted\"escaped",for="[fe80::2897:fcb4:830e:9e45]"`), + ) + require.Equal(t, + []string{"127.0.0.1"}, + parseForwardedHeader(`by=unknown,FOR="127.0.0.1:443"`), + ) + require.Equal(t, + []string{"127.0.0.1"}, + parseForwardedHeader(`for="127.0.0.1";`), + ) + require.Equal(t, + []string{}, + // Valid, but there is no `for` directive in there... + parseForwardedHeader(`by=127.0.0.1;proto=https`), + ) + require.Equal(t, + []string(nil), + // Invalid: the quote is not properly closed + parseForwardedHeader(`for="127.0.0.1`), + ) +} + +func randIPv4() netip.Addr { + return netip.AddrFrom4([4]byte{byte(rand.Uint32()), byte(rand.Uint32()), byte(rand.Uint32()), byte(rand.Uint32())}) +} + +func randIPv6() netip.Addr { + return netip.AddrFrom16([16]byte{ + uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), + uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), + uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), + uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), uint8(rand.Uint32()), + }) +} + +func randGlobalIPv4() netip.Addr { + for { + ip := randIPv4() + if isGlobalIP(ip) { + return ip + } + } +} + +func randGlobalIPv6() netip.Addr { + for { + ip := randIPv6() + if isGlobalIP(ip) { + return ip + } + } +} + +func randPrivateIPv4() netip.Addr { + for { + ip := randIPv4() + if !isGlobalIP(ip) && ip.IsPrivate() { + return ip + } + } +} + +func randK8sPrivate() netip.Addr { + for { + // IPs in 100.65.0.0/10 (100.65.0.0 - 100.127.255.255) are considered private + ip := netip.AddrFrom4([4]byte{100, 65 + byte(rand.Uint32()%64), byte(rand.Uint32()), byte(rand.Uint32())}) + if k8sInternalIPv4Prefix.Contains(ip) { + return ip + } + } +} + +func randPrivateIPv6() netip.Addr { + for { + ip := randIPv6() + if !isGlobalIP(ip) && ip.IsPrivate() { + return ip + } + } +} diff --git a/internal/appsec/listener/httpsec/http.go b/internal/appsec/listener/httpsec/http.go index 08b9e853dd..f3652a5bb4 100644 --- a/internal/appsec/listener/httpsec/http.go +++ b/internal/appsec/listener/httpsec/http.go @@ -6,21 +6,23 @@ package httpsec import ( - "math/rand" - - "github.com/DataDog/appsec-internal-go/appsec" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "net/netip" + "strings" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) type Feature struct { - APISec appsec.APISecConfig + APISec config.APISecConfig + ForceKeepWhenGeneratingSchema bool } func (*Feature) String() string { @@ -37,13 +39,21 @@ func NewHTTPSecFeature(config *config.Config, rootOp dyngo.Operation) (listener. addresses.ServerRequestQueryAddr, addresses.ServerRequestPathParamsAddr, addresses.ServerRequestBodyAddr, + addresses.ServerResponseBodyAddr, addresses.ServerResponseStatusAddr, - addresses.ServerResponseHeadersNoCookiesAddr) { - return nil, nil + addresses.ServerResponseHeadersNoCookiesAddr, + addresses.ClientIPAddr, + ) { + // We extract headers even when the security features are not enabled... + feature := &HeaderExtractionFeature{} + dyngo.On(rootOp, feature.OnRequest) + dyngo.OnFinish(rootOp, feature.OnResponse) + return feature, nil } feature := &Feature{ - APISec: config.APISec, + APISec: config.APISec, + ForceKeepWhenGeneratingSchema: config.TracingAsTransport, } dyngo.On(rootOp, feature.OnRequest) @@ -52,14 +62,7 @@ func NewHTTPSecFeature(config *config.Config, rootOp dyngo.Operation) (listener. } func (feature *Feature) OnRequest(op *httpsec.HandlerOperation, args httpsec.HandlerOperationArgs) { - tags, ip := ClientIPTags(args.Headers, true, args.RemoteAddr) - log.Debug("appsec: http client ip detection returned `%s` given the http headers `%v`", ip, args.Headers) - - op.SetStringTags(tags) - headers := headersRemoveCookies(args.Headers) - headers["host"] = []string{args.Host} - - setRequestHeadersTags(op, headers) + headers, ip := extractRequestHeaders(op, args) op.Run(op, addresses.NewAddressesBuilder(). @@ -75,22 +78,73 @@ func (feature *Feature) OnRequest(op *httpsec.HandlerOperation, args httpsec.Han } func (feature *Feature) OnResponse(op *httpsec.HandlerOperation, resp httpsec.HandlerOperationRes) { - headers := headersRemoveCookies(resp.Headers) - setResponseHeadersTags(op, headers) + headers := extractResponseHeaders(op, resp) builder := addresses.NewAddressesBuilder(). WithResponseHeadersNoCookies(headers). WithResponseStatus(resp.StatusCode) - if feature.canExtractSchemas() { + if feature.shouldExtractShema(op, resp.StatusCode) { builder = builder.ExtractSchema() + + if feature.ForceKeepWhenGeneratingSchema { + op.SetTag(ext.ManualKeep, samplernames.AppSec) + } } op.Run(op, builder.Build()) + + metric := "no_schema" + for k := range op.Derivatives() { + if strings.HasPrefix(k, "_dd.appsec.s.") { + metric = "schema" + break + } + } + telemetry.Count(telemetry.NamespaceAppSec, "api_security.request."+metric, []string{"framework:" + op.Framework()}).Submit(1) } -// canExtractSchemas checks that API Security is enabled and that sampling rate +// shouldExtractShema checks that API Security is enabled and that sampling rate // allows extracting schemas -func (feature *Feature) canExtractSchemas() bool { - return feature.APISec.Enabled && feature.APISec.SampleRate >= rand.Float64() +func (feature *Feature) shouldExtractShema(op *httpsec.HandlerOperation, statusCode int) bool { + return feature.APISec.Enabled && + feature.APISec.Sampler.DecisionFor(apisec.SamplingKey{ + Method: op.Method(), + Route: op.Route(), + StatusCode: statusCode, + }) +} + +type HeaderExtractionFeature struct{} + +func (*HeaderExtractionFeature) String() string { + return "HTTP Header Extraction" +} + +func (*HeaderExtractionFeature) Stop() {} + +func (*HeaderExtractionFeature) OnRequest(op *httpsec.HandlerOperation, args httpsec.HandlerOperationArgs) { + _, _ = extractRequestHeaders(op, args) +} + +func (*HeaderExtractionFeature) OnResponse(op *httpsec.HandlerOperation, resp httpsec.HandlerOperationRes) { + _ = extractResponseHeaders(op, resp) +} + +func extractRequestHeaders(op *httpsec.HandlerOperation, args httpsec.HandlerOperationArgs) (map[string][]string, netip.Addr) { + tags, ip := ClientIPTags(args.Headers, true, args.RemoteAddr) + + op.SetStringTags(tags) + headers := headersRemoveCookies(args.Headers) + headers["host"] = []string{args.Host} + + setRequestHeadersTags(op, headers) + + return headers, ip +} + +func extractResponseHeaders(op *httpsec.HandlerOperation, resp httpsec.HandlerOperationRes) map[string][]string { + headers := headersRemoveCookies(resp.Headers) + setResponseHeadersTags(op, headers) + return headers } diff --git a/internal/appsec/listener/httpsec/internal/http_test.go b/internal/appsec/listener/httpsec/internal/http_test.go new file mode 100644 index 0000000000..671076a863 --- /dev/null +++ b/internal/appsec/listener/httpsec/internal/http_test.go @@ -0,0 +1,135 @@ +package internal + +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +import ( + "context" + _ "embed" // For go:embed + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + emitter "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + listener "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/waf" + "github.com/DataDog/go-libddwaf/v4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +var ( + //go:embed rules.blocking.json + blockingRules []byte + //go:embed rules.irrelevant.json + irrelevantRules []byte +) + +func TestFeature_headerCollection(t *testing.T) { + if ok, err := libddwaf.Usable(); !ok { + t.Skipf("Skipping tests because libddwaf is not available: %v", err) + } + + appsec.Start() + defer appsec.Stop() + + blockingRulesWAFManager, err := config.NewWAFManagerWithStaticRules(config.ObfuscatorConfig{}, blockingRules) + require.NoError(t, err) + + irrelevantRulesWAFManager, err := config.NewWAFManagerWithStaticRules(config.ObfuscatorConfig{}, irrelevantRules) + require.NoError(t, err) + + var ( + request = emitter.HandlerOperationArgs{ + Method: http.MethodGet, + RequestURI: "https://datadoghq.com/", + Host: "datadoghq.com", + RemoteAddr: "1.2.3.4", + Headers: map[string][]string{"X-Forwarded": {"127.0.0.1"}, "X-Forwarded-For": {"4.5.6.7", "9.8.7.6"}}, + } + response = emitter.HandlerOperationRes{ + Headers: map[string][]string{"Content-Type": {"application/json"}, "Content-Length": {"1337"}}, + } + ) + + type testCase struct { + WAFManager *config.WAFManager + ExpectedBlocked bool + ExpectedTags map[string]string + } + testCases := map[string]testCase{ + "no-supported-addresses": { + WAFManager: irrelevantRulesWAFManager, + ExpectedTags: map[string]string{ + "http.client_ip": "4.5.6.7", + "http.request.headers.host": "datadoghq.com", + "http.request.headers.x-forwarded-for": "4.5.6.7,9.8.7.6", + "http.request.headers.x-forwarded": "127.0.0.1", + "http.response.headers.content-type": "application/json", + "http.response.headers.content-length": "1337", + "network.client.ip": "1.2.3.4", + }, + }, + "blocking": { + WAFManager: blockingRulesWAFManager, + ExpectedBlocked: true, + ExpectedTags: map[string]string{ + "appsec.blocked": "true", + "appsec.event": "true", + "http.client_ip": "4.5.6.7", + "http.request.headers.host": "datadoghq.com", + "http.request.headers.x-forwarded-for": "4.5.6.7,9.8.7.6", + "http.request.headers.x-forwarded": "127.0.0.1", + "http.response.headers.content-type": "application/json", + "http.response.headers.content-length": "1337", + "network.client.ip": "1.2.3.4", + }, + }, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + rootOp := dyngo.NewRootOperation() + ctx := dyngo.RegisterOperation(context.Background(), rootOp) + + cfg := &config.Config{ + WAFManager: tc.WAFManager, + TraceRateLimit: 1000, + WAFTimeout: time.Second, + } + + waf, err := waf.NewWAFFeature(cfg, rootOp) + require.NoError(t, err) + defer waf.Stop() + + feat, err := listener.NewHTTPSecFeature(cfg, rootOp) + require.NoError(t, err) + defer feat.Stop() + + blocked := false + dyngo.OnData(rootOp, func(blk *events.BlockingSecurityEvent) { blocked = blk != nil }) + + span := mt.StartSpan("test") + req, _, _ := emitter.StartOperation(ctx, request, span) + assert.Equal(t, tc.ExpectedBlocked, blocked) + req.Finish(response) + span.Finish() + + finishedSpans := mt.FinishedSpans() + require.Len(t, finishedSpans, 1) + finishedSpan := finishedSpans[0] + + assert.Subset(t, finishedSpan.Tags(), tc.ExpectedTags) + }) + } +} diff --git a/internal/appsec/listener/httpsec/internal/rules.blocking.json b/internal/appsec/listener/httpsec/internal/rules.blocking.json new file mode 100644 index 0000000000..d551e2be00 --- /dev/null +++ b/internal/appsec/listener/httpsec/internal/rules.blocking.json @@ -0,0 +1,27 @@ +{ + "version": "2.2", + "metadata": { + "rules_version": "1.2.6" + }, + "rules": [ + { + "id": "block-hostile-ip", + "name": "Block request from 4.5.6.7", + "tags": { + "type": "block_ip", + "category": "security_response" + }, + "conditions": [ + { + "parameters": { + "inputs": [{ "address": "http.client_ip" }], + "list": ["4.5.6.7"] + }, + "operator": "ip_match" + } + ], + "transformers": [], + "on_match": ["block"] + } + ] +} diff --git a/internal/appsec/listener/httpsec/internal/rules.irrelevant.json b/internal/appsec/listener/httpsec/internal/rules.irrelevant.json new file mode 100644 index 0000000000..3b879a9b85 --- /dev/null +++ b/internal/appsec/listener/httpsec/internal/rules.irrelevant.json @@ -0,0 +1,27 @@ +{ + "version": "2.2", + "metadata": { + "rules_version": "1.2.6" + }, + "rules": [ + { + "id": "irrelevant-address", + "name": "Block on some irrelevant address", + "tags": { + "type": "block_user", + "category": "security_response" + }, + "conditions": [ + { + "parameters": { + "inputs": [{ "address": "usr.id" }], + "list": ["nobody"] + }, + "operator": "exact_match" + } + ], + "transformers": [], + "on_match": ["block"] + } + ] +} diff --git a/internal/appsec/listener/httpsec/request.go b/internal/appsec/listener/httpsec/request.go index abd3983183..488ebd4c78 100644 --- a/internal/appsec/listener/httpsec/request.go +++ b/internal/appsec/listener/httpsec/request.go @@ -8,12 +8,11 @@ package httpsec import ( "net/http" "net/netip" - "os" "strings" - "github.com/DataDog/appsec-internal-go/httpsec" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/env" ) const ( @@ -23,13 +22,15 @@ const ( var ( // defaultIPHeaders is the default list of IP-related headers leveraged to - // retrieve the public client IP address in RemoteAddr. + // retrieve the public client IP address in RemoteAddr. The headers are + // checked in the order they are listed; do not re-order unless you know what + // you are doing. defaultIPHeaders = []string{ "x-forwarded-for", "x-real-ip", "true-client-ip", "x-client-ip", - "x-forwarded", + "forwarded", "forwarded-for", "x-cluster-client-ip", "fastly-client-ip", @@ -40,23 +41,23 @@ var ( // defaultCollectedHeaders is the default list of HTTP headers collected as // request span tags when appsec is enabled. defaultCollectedHeaders = append([]string{ - "host", - "content-length", - "content-type", + "accept-encoding", + "accept-language", + "accept", + "akamai-user-risk", + "cf-ray", + "cloudfront-viewer-ja3-fingerprint", "content-encoding", "content-language", - "forwarded", - "via", + "content-length", + "content-type", + "host", "user-agent", - "accept", - "accept-encoding", - "accept-language", + "via", "x-amzn-trace-id", - "cloudfront-viewer-ja3-fingerprint", - "cf-ray", - "x-cloud-trace-context", "x-appgw-trace-id", - "akamai-user-risk", + "x-cloud-trace-context", + "x-forwarded", "x-sigsci-requestid", "x-sigsci-tags", }, defaultIPHeaders...) @@ -77,9 +78,27 @@ var ( // The tags are present only if a valid ip address has been returned by // RemoteAddr(). func ClientIPTags(headers map[string][]string, hasCanonicalHeaders bool, remoteAddr string) (tags map[string]string, clientIP netip.Addr) { - remoteIP, clientIP := httpsec.ClientIP(headers, hasCanonicalHeaders, remoteAddr, monitoredClientIPHeadersCfg) - tags = httpsec.ClientIPTags(remoteIP, clientIP) - return tags, clientIP + remoteIP, clientIP := ClientIP(headers, hasCanonicalHeaders, remoteAddr, monitoredClientIPHeadersCfg) + return ClientIPTagsFor(remoteIP, clientIP), clientIP +} + +func ClientIPTagsFor(remoteIP netip.Addr, clientIP netip.Addr) map[string]string { + remoteIPValid := remoteIP.IsValid() + clientIPValid := clientIP.IsValid() + + if !remoteIPValid && !clientIPValid { + return nil + } + + tags := make(map[string]string, 2) + if remoteIPValid { + tags[ext.NetworkClientIP] = remoteIP.String() + } + if clientIPValid { + tags[ext.HTTPClientIP] = clientIP.String() + } + + return tags } // NormalizeHTTPHeaders returns the HTTP headers following Datadog's @@ -115,6 +134,14 @@ func headersRemoveCookies(headers http.Header) map[string][]string { return headersNoCookies } +func headersToLower(headers map[string][]string) map[string][]string { + headersNoCookies := make(map[string][]string, len(headers)) + for k, v := range headers { + headersNoCookies[strings.ToLower(k)] = v + } + return headersNoCookies +} + func normalizeHTTPHeaderName(name string) string { return strings.ToLower(name) } @@ -136,7 +163,7 @@ func makeCollectedHTTPHeadersLookupMap() { } func readMonitoredClientIPHeadersConfig() { - if header := os.Getenv(envClientIPHeader); header != "" { + if header := env.Get(envClientIPHeader); header != "" { // Make this header the only one to consider in RemoteAddr monitoredClientIPHeadersCfg = []string{header} diff --git a/internal/appsec/listener/httpsec/request_test.go b/internal/appsec/listener/httpsec/request_test.go index 38052cbb96..f4107c7cb5 100644 --- a/internal/appsec/listener/httpsec/request_test.go +++ b/internal/appsec/listener/httpsec/request_test.go @@ -6,17 +6,27 @@ package httpsec import ( + "context" + _ "embed" // For go:embed + "encoding/json" "fmt" "net" "net/netip" "testing" + "time" "github.com/stretchr/testify/require" "google.golang.org/grpc/metadata" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener/waf" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/go-libddwaf/v4" ) func TestClientIP(t *testing.T) { @@ -209,11 +219,15 @@ func TestTags(t *testing.T) { respHeadersCase := respHeadersCase t.Run(fmt.Sprintf("%s-%s-%s", eventCase.name, reqHeadersCase.name, respHeadersCase.name), func(t *testing.T) { var span MockSpan - err := waf.SetEventSpanTags(&span, eventCase.events) + waf.SetEventSpanTags(&span) + value, err := json.Marshal(map[string][]any{"triggers": eventCase.events}) if eventCase.expectedError { require.Error(t, err) return } + + span.SetTag("_dd.appsec.json", string(value)) + require.NoError(t, err) setRequestHeadersTags(&span, reqHeadersCase.headers) setResponseHeadersTags(&span, respHeadersCase.headers) @@ -221,9 +235,9 @@ func TestTags(t *testing.T) { if eventCase.events != nil { require.Subset(t, span.Tags, map[string]interface{}{ "_dd.appsec.json": eventCase.expectedTag, - "manual.keep": true, "appsec.event": true, "_dd.origin": "appsec", + "_dd.p.ts": internal.TraceSourceTagValue{Value: internal.ASMTraceSource}, }) } @@ -239,3 +253,90 @@ func TestTags(t *testing.T) { } } } + +//go:embed testdata/trace_tagging_rules.json +var wafRulesJSON []byte + +func TestTraceTagging(t *testing.T) { + if usable, err := libddwaf.Usable(); !usable { + t.Skipf("libddwaf is not usable in this context: %v", err) + } + + wafManager, err := config.NewWAFManagerWithStaticRules(config.ObfuscatorConfig{}, wafRulesJSON) + require.NoError(t, err) + cfg := config.Config{ + WAFManager: wafManager, + WAFTimeout: time.Hour, + TraceRateLimit: 1_000, + APISec: config.APISecConfig{Enabled: true, Sampler: apisec.NewSampler(0)}, + RC: nil, + RASP: false, + SupportedAddresses: config.NewAddressSet([]string{"server.request.headers.no_cookies"}), + MetaStructAvailable: true, + BlockingUnavailable: false, + TracingAsTransport: false, + } + + rootOp := dyngo.NewRootOperation() + feat, err := waf.NewWAFFeature(&cfg, rootOp) + require.NoError(t, err) + defer feat.Stop() + + feat, err = NewHTTPSecFeature(&cfg, rootOp) + require.NoError(t, err) + defer feat.Stop() + + type testCase struct { + UserAgent string + ExpectedTags map[string]any + } + testCases := map[string]testCase{ + "Attributes, No Keep, No Event": { + UserAgent: "TraceTagging/v1+test", + ExpectedTags: map[string]any{ + "_dd.appsec.trace.integer": int64(662607015), + "_dd.appsec.trace.agent": "TraceTagging/v1+test", + }, + }, + "Attributes, Keep, No Event": { + UserAgent: "TraceTagging/v2+test", + ExpectedTags: map[string]any{ + ext.ManualKeep: true, + "_dd.appsec.trace.integer": int64(602214076), + "_dd.appsec.trace.agent": "TraceTagging/v2+test", + }, + }, + "Attributes, Keep, Event": { + UserAgent: "TraceTagging/v3+test", + ExpectedTags: map[string]any{ + ext.ManualKeep: true, + "appsec.event": true, + "_dd.appsec.trace.integer": int64(299792458), + "_dd.appsec.trace.agent": "TraceTagging/v3+test", + }, + }, + } + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + ctx := context.Background() + ctx = dyngo.RegisterOperation(ctx, rootOp) + + var span MockSpan + op, _, _ := httpsec.StartOperation(ctx, httpsec.HandlerOperationArgs{ + Framework: "test/phony", + Method: "GET", + RequestURI: "/fake/test/uri", + RequestRoute: "/fake/:id/uri", + Host: "localhost", + RemoteAddr: "127.0.0.1:4242", + Headers: map[string][]string{"user-agent": {tc.UserAgent}}, + Cookies: map[string][]string{}, + QueryParams: map[string][]string{}, + PathParams: map[string]string{"id": "test"}, + }, &span) + op.Finish(httpsec.HandlerOperationRes{StatusCode: 200}) + + require.Subset(t, span.Tags, tc.ExpectedTags) + }) + } +} diff --git a/internal/appsec/listener/httpsec/roundtripper.go b/internal/appsec/listener/httpsec/roundtripper.go index b72e8e8329..d6fbbacf51 100644 --- a/internal/appsec/listener/httpsec/roundtripper.go +++ b/internal/appsec/listener/httpsec/roundtripper.go @@ -6,35 +6,107 @@ package httpsec import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/httpsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" + "log/slog" + "net/http" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/httpsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/body" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/internal/log" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" ) -type SSRFProtectionFeature struct{} +type DownwardRequestFeature struct { + analysisSampleRate float64 + maxDownstreamRequestBodyAnalysis int + + // downstreamRequestAnalysis is the number of times a call to a downstream request monitoring function was made + // we don't really care if it overflows, as it's just used for sampling + downstreamRequestAnalysis atomic.Uint64 +} -func (*SSRFProtectionFeature) String() string { - return "SSRF Protection" +func (*DownwardRequestFeature) String() string { + return "SSRF Protection & OWASP API10 Protection" } -func (*SSRFProtectionFeature) Stop() {} +func (*DownwardRequestFeature) Stop() {} func NewSSRFProtectionFeature(config *config.Config, rootOp dyngo.Operation) (listener.Feature, error) { - if !config.RASP || !config.SupportedAddresses.AnyOf(addresses.ServerIoNetURLAddr) { + if !config.RASP || !config.SupportedAddresses.AnyOf( + addresses.ServerIONetURLAddr, + addresses.ServerIONetRequestMethodAddr, + addresses.ServerIONetRequestHeadersAddr, + addresses.ServerIONetRequestBodyAddr, + addresses.ServerIONetResponseStatusAddr, + addresses.ServerIONetResponseHeadersAddr, + addresses.ServerIONetResponseBodyAddr) { return nil, nil } - feature := &SSRFProtectionFeature{} + feature := &DownwardRequestFeature{ + analysisSampleRate: config.APISec.DownstreamRequestBodyAnalysisSampleRate, + maxDownstreamRequestBodyAnalysis: config.APISec.MaxDownstreamRequestBodyAnalysis, + } dyngo.On(rootOp, feature.OnStart) + dyngo.OnFinish(rootOp, feature.OnFinish) return feature, nil } -func (*SSRFProtectionFeature) OnStart(op *httpsec.RoundTripOperation, args httpsec.RoundTripOperationArgs) { - dyngo.EmitData(op, waf.RunEvent{ - Operation: op, - RunAddressData: addresses.NewAddressesBuilder().WithURL(args.URL).Build(), - }) +const ( + knuthFactor uint64 = 11400714819323199488 + maxBodyParseSize = 128 * 1024 // 128 KiB arbitrary value since it is not mentioned in the RFC + + // maxUint64 represented as a float64 because [math.MaxUint64] cannot be represented exactly as a float64 + // so we use the closest representable value that is MORE than 2^64-1 so it overflows + // https://github.com/golang/go/issues/29463 + maxUint64 float64 = (1 << 64) - 1<<11 +) + +func (feature *DownwardRequestFeature) OnStart(op *httpsec.RoundTripOperation, args httpsec.RoundTripOperationArgs) { + builder := addresses.NewAddressesBuilder(). + WithDownwardURL(args.URL). + WithDownwardMethod(args.Method). + WithDownwardRequestHeaders(args.Headers) + + requestCount := feature.downstreamRequestAnalysis.Add(1) + + // Sampling algorithm based on: + // https://docs.google.com/document/d/1DIGuCl1rkhx5swmGxKO7Je8Y4zvaobXBlgbm6C89yzU/edit?tab=t.0#heading=h.qawhep7pps5a + if op.HandlerOp.DownstreamRequestBodyAnalysis() < feature.maxDownstreamRequestBodyAnalysis && + requestCount*knuthFactor <= uint64(feature.analysisSampleRate*maxUint64) { + op.HandlerOp.IncrementDownstreamRequestBodyAnalysis() + op.SetAnalyseBody() + } + + if op.AnalyseBody() && args.Body != nil && *args.Body != nil && *args.Body != http.NoBody { + encodable, err := body.NewEncodable(http.Header(args.Headers).Get("Content-Type"), args.Body, maxBodyParseSize) + if err != nil { + log.Debug("Unsupported response body content type or error reading body: %s", err.Error()) + telemetrylog.Warn("Unsupported request body content type or error reading body", slog.Any("error", telemetrylog.NewSafeError(err))) + } + builder = builder.WithDownwardRequestBody(encodable) + } + + op.HandlerOp.Run(op, builder.Build()) +} + +func (feature *DownwardRequestFeature) OnFinish(op *httpsec.RoundTripOperation, args httpsec.RoundTripOperationRes) { + builder := addresses.NewAddressesBuilder(). + WithDownwardResponseStatus(args.StatusCode). + WithDownwardResponseHeaders(headersToLower(args.Headers)) + + if op.AnalyseBody() && args.Body != nil && *args.Body != nil && *args.Body != http.NoBody { + encodable, err := body.NewEncodable(http.Header(args.Headers).Get("Content-Type"), args.Body, maxBodyParseSize) + if err != nil { + log.Debug("Unsupported response body content type or error reading body: %s", err.Error()) + telemetrylog.Warn("Unsupported response body content type or error reading body", slog.Any("error", telemetrylog.NewSafeError(err))) + } + builder = builder.WithDownwardResponseBody(encodable) + } + + op.HandlerOp.Run(op, builder.Build()) } diff --git a/internal/appsec/listener/httpsec/testdata/trace_tagging_rules.json b/internal/appsec/listener/httpsec/testdata/trace_tagging_rules.json new file mode 100644 index 0000000000..b22c09efe9 --- /dev/null +++ b/internal/appsec/listener/httpsec/testdata/trace_tagging_rules.json @@ -0,0 +1,156 @@ +{ + "rules_compat": [ + { + "id": "ttr-000-001", + "name": "Trace Tagging Rule: Attributes, No Keep, No Event", + "tags": { + "type": "security_scanner", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + } + ], + "regex": "^TraceTagging\\/v1" + }, + "operator": "match_regex" + } + ], + "output": { + "event": false, + "keep": false, + "attributes": { + "_dd.appsec.trace.integer": { + "value": 662607015 + }, + "_dd.appsec.trace.agent": { + "address": "server.request.headers.no_cookies", + "key_path": ["user-agent"] + } + } + }, + "on_match": [] + }, + { + "id": "ttr-000-002", + "name": "Trace Tagging Rule: Attributes, Keep, No Event", + "tags": { + "type": "security_scanner", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + } + ], + "regex": "^TraceTagging\\/v2" + }, + "operator": "match_regex" + } + ], + "output": { + "event": false, + "keep": true, + "attributes": { + "_dd.appsec.trace.integer": { + "value": 602214076 + }, + "_dd.appsec.trace.agent": { + "address": "server.request.headers.no_cookies", + "key_path": ["user-agent"] + } + } + }, + "on_match": [] + }, + { + "id": "ttr-000-003", + "name": "Trace Tagging Rule: Attributes, Keep, Event", + "tags": { + "type": "security_scanner", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + } + ], + "regex": "^TraceTagging\\/v3" + }, + "operator": "match_regex" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.integer": { + "value": 299792458 + }, + "_dd.appsec.trace.agent": { + "address": "server.request.headers.no_cookies", + "key_path": ["user-agent"] + } + } + }, + "on_match": [] + }, + { + "id": "ttr-000-004", + "name": "Trace Tagging Rule: Attributes, No Keep, Event", + "tags": { + "type": "security_scanner", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + } + ], + "regex": "^TraceTagging\\/v4" + }, + "operator": "match_regex" + } + ], + "output": { + "event": true, + "keep": false, + "attributes": { + "_dd.appsec.trace.integer": { + "value": 1729 + }, + "_dd.appsec.trace.agent": { + "address": "server.request.headers.no_cookies", + "key_path": ["user-agent"] + } + } + }, + "on_match": [] + } + ] +} diff --git a/internal/appsec/listener/ossec/lfi.go b/internal/appsec/listener/ossec/lfi.go index 3161651147..57cc0995af 100644 --- a/internal/appsec/listener/ossec/lfi.go +++ b/internal/appsec/listener/ossec/lfi.go @@ -8,13 +8,13 @@ package ossec import ( "os" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/ossec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/ossec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" ) type Feature struct{} diff --git a/internal/appsec/listener/sqlsec/sql.go b/internal/appsec/listener/sqlsec/sql.go index 3a6fbc0769..7f3e35d79b 100644 --- a/internal/appsec/listener/sqlsec/sql.go +++ b/internal/appsec/listener/sqlsec/sql.go @@ -6,12 +6,12 @@ package sqlsec import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/sqlsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/sqlsec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" ) type Feature struct{} diff --git a/internal/appsec/listener/trace/trace.go b/internal/appsec/listener/trace/trace.go index 45fb28e99f..eb721c3596 100644 --- a/internal/appsec/listener/trace/trace.go +++ b/internal/appsec/listener/trace/trace.go @@ -6,10 +6,10 @@ package trace import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" ) // AppSec-specific span tags that are expected to diff --git a/internal/appsec/listener/usersec/usec.go b/internal/appsec/listener/usersec/usec.go index c8a6458019..91e490e89f 100644 --- a/internal/appsec/listener/usersec/usec.go +++ b/internal/appsec/listener/usersec/usec.go @@ -6,12 +6,12 @@ package usersec import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/usersec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/usersec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" ) type Feature struct{} @@ -25,6 +25,8 @@ func (*Feature) Stop() {} func NewUserSecFeature(cfg *config.Config, rootOp dyngo.Operation) (listener.Feature, error) { if !cfg.SupportedAddresses.AnyOf( addresses.UserIDAddr, + addresses.UserLoginAddr, + addresses.UserOrgAddr, addresses.UserSessionIDAddr, addresses.UserLoginSuccessAddr, addresses.UserLoginFailureAddr) { @@ -39,12 +41,27 @@ func NewUserSecFeature(cfg *config.Config, rootOp dyngo.Operation) (listener.Fea func (*Feature) OnFinish(op *usersec.UserLoginOperation, res usersec.UserLoginOperationRes) { builder := addresses.NewAddressesBuilder(). WithUserID(res.UserID). + WithUserLogin(res.UserLogin). + WithUserOrg(res.UserOrg). WithUserSessionID(res.SessionID) - if res.Success { - builder = builder.WithUserLoginSuccess() - } else { - builder = builder.WithUserLoginFailure() + switch op.EventType { + case usersec.UserLoginSuccess: + builder = builder.WithUserLoginSuccess(). + WithUserID(res.UserID). + WithUserLogin(res.UserLogin). + WithUserOrg(res.UserOrg). + WithUserSessionID(res.SessionID) + case usersec.UserLoginFailure: + builder = builder.WithUserLoginFailure(). + WithUserID(res.UserID). + WithUserLogin(res.UserLogin). + WithUserOrg(res.UserOrg) + case usersec.UserSet: + builder = builder.WithUserID(res.UserID). + WithUserLogin(res.UserLogin). + WithUserOrg(res.UserOrg). + WithUserSessionID(res.SessionID) } dyngo.EmitData(op, waf.RunEvent{ diff --git a/internal/appsec/listener/waf/tags.go b/internal/appsec/listener/waf/tags.go index bac41ce5ed..6ce403e4de 100644 --- a/internal/appsec/listener/waf/tags.go +++ b/internal/appsec/listener/waf/tags.go @@ -6,96 +6,91 @@ package waf import ( - "encoding/json" - "fmt" - - waf "github.com/DataDog/go-libddwaf/v3" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" - "gopkg.in/DataDog/dd-trace-go.v1/internal/samplernames" + "slices" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal" + emitter "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" ) const ( wafSpanTagPrefix = "_dd.appsec." eventRulesVersionTag = wafSpanTagPrefix + "event_rules.version" - eventRulesErrorsTag = wafSpanTagPrefix + "event_rules.errors" - eventRulesLoadedTag = wafSpanTagPrefix + "event_rules.loaded" - eventRulesFailedTag = wafSpanTagPrefix + "event_rules.error_count" wafVersionTag = wafSpanTagPrefix + "waf.version" + wafErrorTag = wafSpanTagPrefix + "waf.error" + wafTimeoutTag = wafSpanTagPrefix + "waf.timeouts" + raspRuleEvalTag = wafSpanTagPrefix + "rasp.rule.eval" + raspErrorTag = wafSpanTagPrefix + "rasp.error" + raspTimeoutTag = wafSpanTagPrefix + "rasp.timeout" + truncationTagPrefix = wafSpanTagPrefix + "truncated." - // BlockedRequestTag used to convey whether a request is blocked - BlockedRequestTag = "appsec.blocked" + durationExtSuffix = ".duration_ext" + + blockedRequestTag = "appsec.blocked" ) // AddRulesMonitoringTags adds the tags related to security rules monitoring -func AddRulesMonitoringTags(th trace.TagSetter, wafDiags waf.Diagnostics) { - rInfo := wafDiags.Rules - if rInfo == nil { - return - } - - var rulesetErrors []byte - var err error - rulesetErrors, err = json.Marshal(wafDiags.Rules.Errors) - if err != nil { - log.Error("appsec: could not marshal the waf ruleset info errors to json") - } - th.SetTag(eventRulesErrorsTag, string(rulesetErrors)) - th.SetTag(eventRulesLoadedTag, len(rInfo.Loaded)) - th.SetTag(eventRulesFailedTag, len(rInfo.Failed)) - th.SetTag(wafVersionTag, waf.Version()) +func AddRulesMonitoringTags(th trace.TagSetter) { + th.SetTag(wafVersionTag, libddwaf.Version()) th.SetTag(ext.ManualKeep, samplernames.AppSec) } -// AddWAFMonitoringTags adds the tags related to the monitoring of the Feature -func AddWAFMonitoringTags(th trace.TagSetter, rulesVersion string, stats map[string]any) { +// AddWAFMonitoringTags adds the tags related to the monitoring of the WAF +func AddWAFMonitoringTags(th trace.TagSetter, metrics *emitter.ContextMetrics, rulesVersion string, truncations map[libddwaf.TruncationReason][]int, timerStats map[timer.Key]time.Duration) { // Rules version is set for every request to help the backend associate Feature duration metrics with rule version th.SetTag(eventRulesVersionTag, rulesVersion) - // Report the stats sent by the Feature - for k, v := range stats { - th.SetTag(wafSpanTagPrefix+k, v) + if raspCallsCount := metrics.SumRASPCalls.Load(); raspCallsCount > 0 { + th.SetTag(raspRuleEvalTag, raspCallsCount) } -} -// SetEventSpanTags sets the security event span tags into the service entry span. -func SetEventSpanTags(span trace.TagSetter, events []any) error { - if len(events) == 0 { - return nil + if raspErrorsCount := metrics.SumRASPErrors.Load(); raspErrorsCount > 0 { + th.SetTag(raspErrorTag, raspErrorsCount) } - // Set the appsec event span tag - val, err := makeEventTagValue(events) - if err != nil { - return err + if wafErrorsCount := metrics.SumWAFErrors.Load(); wafErrorsCount > 0 { + th.SetTag(wafErrorTag, wafErrorsCount) + } + + // Add metrics like `waf.duration` and `rasp.duration_ext` + for scope, value := range timerStats { + th.SetTag(wafSpanTagPrefix+string(scope)+durationExtSuffix, float64(value.Nanoseconds())/float64(time.Microsecond.Nanoseconds())) + for component, atomicValue := range metrics.SumDurations[scope] { + if value := atomicValue.Load(); value > 0 { + th.SetTag(wafSpanTagPrefix+string(scope)+"."+string(component), float64(value)/float64(time.Microsecond.Nanoseconds())) + } + } } - span.SetTag("_dd.appsec.json", string(val)) - // Keep this span due to the security event - // - // This is a workaround to tell the tracer that the trace was kept by AppSec. - // Passing any other value than `appsec.SamplerAppSec` has no effect. - // Customers should use `span.SetTag(ext.ManualKeep, true)` pattern - // to keep the trace, manually. - span.SetTag(ext.ManualKeep, samplernames.AppSec) - span.SetTag("_dd.origin", "appsec") - // Set the appsec.event tag needed by the appsec backend - span.SetTag("appsec.event", true) - return nil -} -// Create the value of the security event tag. -func makeEventTagValue(events []any) (json.RawMessage, error) { - type eventTagValue struct { - Triggers []any `json:"triggers"` + if value := metrics.SumWAFTimeouts.Load(); value > 0 { + th.SetTag(wafTimeoutTag, value) } - tag, err := json.Marshal(eventTagValue{events}) - if err != nil { - return nil, fmt.Errorf("unexpected error while serializing the appsec event span tag: %v", err) + var sumRASPTimeouts uint32 + for ruleType := range metrics.SumRASPTimeouts { + sumRASPTimeouts += metrics.SumRASPTimeouts[ruleType].Load() } - return tag, nil + if sumRASPTimeouts > 0 { + th.SetTag(raspTimeoutTag, sumRASPTimeouts) + } + + for reason, count := range truncations { + if len(count) > 0 { + th.SetTag(truncationTagPrefix+reason.String(), slices.Max(count)) + } + } +} + +// SetEventSpanTags sets the security event span tags related to an appsec event +func SetEventSpanTags(span trace.TagSetter) { + span.SetTag("_dd.origin", "appsec") + // Set the appsec.event tag needed by the appsec backend + span.SetTag("appsec.event", true) + span.SetTag("_dd.p.ts", internal.TraceSourceTagValue{Value: internal.ASMTraceSource}) } diff --git a/internal/appsec/listener/waf/tags_test.go b/internal/appsec/listener/waf/tags_test.go index d69a8fcdd7..d956e5c8d1 100644 --- a/internal/appsec/listener/waf/tags_test.go +++ b/internal/appsec/listener/waf/tags_test.go @@ -6,51 +6,67 @@ package waf import ( + "maps" + "slices" + "sync/atomic" "testing" + "time" - waf "github.com/DataDog/go-libddwaf/v3" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + emitter "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" "github.com/stretchr/testify/require" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/trace" ) const ( - wafDurationTag = "_dd.appsec.waf.duration" - wafDurationExtTag = "_dd.appsec.waf.duration_ext" - wafTimeoutTag = "_dd.appsec.waf.timeouts" + wafDurationTag = "_dd.appsec.waf.duration" + wafDurationExtTag = "_dd.appsec.waf.duration_ext" + raspDurationTag = "_dd.appsec.rasp.duration" + raspDurationExtTag = "_dd.appsec.rasp.duration_ext" ) // Test that internal functions used to set span tags use the correct types func TestTagsTypes(t *testing.T) { th := make(trace.TestTagSetter) - wafDiags := waf.Diagnostics{ - Version: "1.3.0", - Rules: &waf.DiagnosticEntry{ - Loaded: []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}, - Failed: []string{"1337"}, - Errors: map[string][]string{"test": {"1", "2"}}, - }, - } - - AddRulesMonitoringTags(&th, wafDiags) + AddRulesMonitoringTags(&th) - stats := map[string]any{ - "waf.duration": 10, - "rasp.duration": 10, - "waf.duration_ext": 20, - "rasp.duration_ext": 20, - "waf.timeouts": 0, - "waf.truncations.depth": []int{1, 2, 3}, - "waf.run": 12000, + metrics := &emitter.ContextMetrics{ + SumDurations: map[addresses.Scope]map[timer.Key]*atomic.Int64{ + addresses.WAFScope: {libddwaf.DurationTimeKey: &atomic.Int64{}}, + addresses.RASPScope: {libddwaf.DurationTimeKey: &atomic.Int64{}}, + }, } + metrics.SumDurations[addresses.WAFScope][libddwaf.DurationTimeKey].Store(int64(time.Millisecond)) + metrics.SumDurations[addresses.RASPScope][libddwaf.DurationTimeKey].Store(int64(time.Millisecond)) + metrics.SumWAFTimeouts.Store(1) + metrics.SumRASPTimeouts[addresses.RASPRuleTypeLFI].Store(2) - AddWAFMonitoringTags(&th, "1.2.3", stats) + AddWAFMonitoringTags(&th, metrics, "1.2.3", map[libddwaf.TruncationReason][]int{ + libddwaf.ObjectTooDeep: {1, 2, 3}, + }, map[timer.Key]time.Duration{ + addresses.WAFScope: 10 * time.Millisecond, + addresses.RASPScope: 10 * time.Millisecond, + }) tags := th.Tags() - _, ok := tags[eventRulesErrorsTag].(string) - require.True(t, ok) - for _, tag := range []string{eventRulesLoadedTag, eventRulesFailedTag, wafDurationTag, wafDurationExtTag, wafVersionTag, wafTimeoutTag} { - require.Contains(t, tags, tag) + var expectedTags = []string{ + eventRulesVersionTag, + wafDurationTag, + wafDurationExtTag, + raspDurationTag, + raspDurationExtTag, + wafVersionTag, + wafTimeoutTag, + raspTimeoutTag, + truncationTagPrefix + libddwaf.ObjectTooDeep.String(), + ext.ManualKeep, } + + slices.Sort(expectedTags) + + require.Equal(t, expectedTags, slices.Sorted(maps.Keys(tags))) } diff --git a/internal/appsec/listener/waf/waf.go b/internal/appsec/listener/waf/waf.go index 308eaa25d7..2931d671d8 100644 --- a/internal/appsec/listener/waf/waf.go +++ b/internal/appsec/listener/waf/waf.go @@ -7,33 +7,44 @@ package waf import ( "fmt" + "log/slog" "sync" "time" - "github.com/DataDog/appsec-internal-go/limiter" - wafv3 "github.com/DataDog/go-libddwaf/v3" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/listener" - - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/actions" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/actions" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/emitter/waf" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/limiter" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/listener" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" ) type Feature struct { timeout time.Duration limiter *limiter.TokenTicker - handle *wafv3.Handle + handle *libddwaf.Handle supportedAddrs config.AddressSet + rulesVersion string reportRulesTags sync.Once + + telemetryMetrics waf.HandleMetrics + + // Determine if we can use [internal.MetaStructValue] to delegate the WAF events serialization to the trace writer + // or if we have to use the [SerializableTag] method to serialize the events + metaStructAvailable bool } func NewWAFFeature(cfg *config.Config, rootOp dyngo.Operation) (listener.Feature, error) { - if ok, err := wafv3.Load(); err != nil { + if ok, err := libddwaf.Load(); err != nil { // 1. If there is an error and the loading is not ok: log as an unexpected error case and quit appsec // Note that we assume here that the test for the unsupported target has been done before calling // this method, so it is now considered an error for this method @@ -41,12 +52,21 @@ func NewWAFFeature(cfg *config.Config, rootOp dyngo.Operation) (listener.Feature return nil, fmt.Errorf("error while loading libddwaf: %w", err) } // 2. If there is an error and the loading is ok: log as an informative error where appsec can be used - log.Error("appsec: non-critical error while loading libddwaf: %v", err) + logger := telemetrylog.With(telemetry.WithTags([]string{"product:appsec"})) + logger.Warn("appsec: non-critical error while loading libddwaf", slog.Any("error", telemetrylog.NewSafeError(err))) } - newHandle, err := wafv3.NewHandle(cfg.RulesManager.Latest, cfg.Obfuscator.KeyRegex, cfg.Obfuscator.ValueRegex) - if err != nil { - return nil, err + newHandle, rulesVersion := cfg.NewHandle() + telemetryMetrics := waf.NewMetricsInstance(newHandle, rulesVersion) + if newHandle == nil { + // As specified @ https://docs.google.com/document/d/1t6U7WXko_QChhoNIApn0-CRNe6SAKuiiAQIyCRPUXP4/edit?tab=t.0#bookmark=id.vddhd140geg7 + logger := telemetrylog.With(telemetry.WithTags([]string{ + "log_type:rc::asm_dd::diagnostic", + "appsec_config_key:*", + "rc_config_id:*", + })) + logger.Error("Failed to build WAF instance: no valid rules or processors available") + return nil, fmt.Errorf("failed to obtain WAF instance from the waf.Builder (loaded paths: %q)", cfg.WAFManager.ConfigPaths("")) } cfg.SupportedAddresses = config.NewAddressSet(newHandle.Addresses()) @@ -55,10 +75,13 @@ func NewWAFFeature(cfg *config.Config, rootOp dyngo.Operation) (listener.Feature tokenTicker.Start() feature := &Feature{ - handle: newHandle, - timeout: cfg.WAFTimeout, - limiter: tokenTicker, - supportedAddrs: cfg.SupportedAddresses, + handle: newHandle, + timeout: cfg.WAFTimeout, + limiter: tokenTicker, + supportedAddrs: cfg.SupportedAddresses, + telemetryMetrics: telemetryMetrics, + metaStructAvailable: cfg.MetaStructAvailable, + rulesVersion: rulesVersion, } dyngo.On(rootOp, feature.onStart) @@ -69,17 +92,18 @@ func NewWAFFeature(cfg *config.Config, rootOp dyngo.Operation) (listener.Feature func (waf *Feature) onStart(op *waf.ContextOperation, _ waf.ContextArgs) { waf.reportRulesTags.Do(func() { - AddRulesMonitoringTags(op, waf.handle.Diagnostics()) + AddRulesMonitoringTags(op) }) - ctx, err := waf.handle.NewContextWithBudget(waf.timeout) + ctx, err := waf.handle.NewContext(timer.WithBudget(waf.timeout), timer.WithComponents(addresses.Scopes[:]...)) if err != nil { - log.Debug("appsec: failed to create Feature context: %v", err) + log.Debug("appsec: failed to create WAF context: %s", err.Error()) } op.SwapContext(ctx) op.SetLimiter(waf.limiter) op.SetSupportedAddresses(waf.supportedAddrs) + op.SetMetricsInstance(waf.telemetryMetrics.NewContextMetrics()) // Run the WAF with the given address data dyngo.OnData(op, op.OnEvent) @@ -87,15 +111,23 @@ func (waf *Feature) onStart(op *waf.ContextOperation, _ waf.ContextArgs) { waf.SetupActionHandlers(op) } -func (waf *Feature) SetupActionHandlers(op *waf.ContextOperation) { +func (*Feature) SetupActionHandlers(op *waf.ContextOperation) { // Set the blocking tag on the operation when a blocking event is received - dyngo.OnData(op, func(_ *events.BlockingSecurityEvent) { - op.SetTag(BlockedRequestTag, true) + dyngo.OnData(op, func(*events.BlockingSecurityEvent) { + log.Debug("appsec: blocking event detected") + op.SetTag(blockedRequestTag, true) + op.SetRequestBlocked() }) // Register the stacktrace if one is requested by a WAF action - dyngo.OnData(op, func(err *actions.StackTraceAction) { - op.AddStackTraces(err.Event) + dyngo.OnData(op, func(action *actions.StackTraceAction) { + log.Debug("appsec: registering stack trace for security purposes") + op.AddStackTraces(action.Event) + }) + + dyngo.OnData(op, func(*waf.SecurityEvent) { + log.Debug("appsec: WAF detected a suspicious event") + SetEventSpanTags(op) }) } @@ -107,9 +139,19 @@ func (waf *Feature) onFinish(op *waf.ContextOperation, _ waf.ContextRes) { ctx.Close() - AddWAFMonitoringTags(op, waf.handle.Diagnostics().Version, ctx.Stats().Metrics()) - if err := SetEventSpanTags(op, op.Events()); err != nil { - log.Debug("appsec: failed to set event span tags: %v", err) + truncations := ctx.Truncations() + timerStats := ctx.Timer.Stats() + metrics := op.GetMetricsInstance() + AddWAFMonitoringTags(op, metrics, waf.rulesVersion, truncations, timerStats) + metrics.Submit(truncations, timerStats) + + if wafEvents := op.Events(); len(wafEvents) > 0 { + tagValue := map[string][]any{"triggers": wafEvents} + if waf.metaStructAvailable { + op.SetTag("appsec", internal.MetaStructValue{Value: tagValue}) + } else { + op.SetSerializableTag("_dd.appsec.json", tagValue) + } } op.SetSerializableTags(op.Derivatives()) diff --git a/internal/appsec/remoteconfig.go b/internal/appsec/remoteconfig.go index ccf6fe7631..a0c99223b4 100644 --- a/internal/appsec/remoteconfig.go +++ b/internal/appsec/remoteconfig.go @@ -9,327 +9,261 @@ import ( "encoding/json" "errors" "fmt" + "log/slog" "maps" - "os" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" - "gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig" - - internal "github.com/DataDog/appsec-internal-go/appsec" - rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "slices" + "strings" + + "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/go-libddwaf/v4" ) -func genApplyStatus(ack bool, err error) rc.ApplyStatus { - status := rc.ApplyStatus{ - State: rc.ApplyStateUnacknowledged, - } - if err != nil { - status.State = rc.ApplyStateError - status.Error = err.Error() - } else if ack { - status.State = rc.ApplyStateAcknowledged - } - - return status -} +// onRCRulesUpdate is the RC callback called when security rules related RC updates are available +func (a *appsec) onRCRulesUpdate(updates map[string]remoteconfig.ProductUpdate) map[string]state.ApplyStatus { + statuses := make(map[string]state.ApplyStatus) -func statusesFromUpdate(u remoteconfig.ProductUpdate, ack bool, err error) map[string]rc.ApplyStatus { - statuses := make(map[string]rc.ApplyStatus, len(u)) - for path := range u { - statuses[path] = genApplyStatus(ack, err) + // If appsec was deactivated through RC, stop here + if !a.started { + for _, pu := range updates { + for path := range pu { + // We are not acknowledging anything... since we are ignoring all these updates... + statuses[path] = state.ApplyStatus{State: state.ApplyStateUnacknowledged} + } + } + return statuses } - return statuses -} -// combineRCRulesUpdates updates the state of the given RulesManager with the combination of all the provided rules updates -func combineRCRulesUpdates(r *config.RulesManager, updates map[string]remoteconfig.ProductUpdate) (statuses map[string]rc.ApplyStatus, err error) { - // Spare some re-allocations (but there may still be some because 1 update may contain N configs) - statuses = make(map[string]rc.ApplyStatus, len(updates)) - // Set the default statuses for all updates to unacknowledged - for _, u := range updates { - maps.Copy(statuses, statusesFromUpdate(u, false, nil)) + // Updates the local [config.WAFManager] with the new data... We track deletions and add/updates + // separately as it is important to process all deletions first. + // See: https://docs.google.com/document/d/1t6U7WXko_QChhoNIApn0-CRNe6SAKuiiAQIyCRPUXP4/edit?tab=t.0#heading=h.pqke0ujtvm2j + type UpdatedConfig struct { + Product string + Content map[string]any } + addOrUpdates := make(map[string]UpdatedConfig) -updateLoop: - // Process rules related updates - for p, u := range updates { - if u != nil && len(u) == 0 { - continue - } - switch p { - case rc.ProductASMData: - // Merge all rules data entries together and store them as a RulesManager edit entry - fragment, status := mergeASMDataUpdates(u) - maps.Copy(statuses, status) - r.AddEdit("asmdata", fragment) - case rc.ProductASMDD: - var ( - removalFound = false - newBasePath string - newBaseData []byte - ) - for path, data := range u { - if data == nil && removalFound { - err = errors.New("more than one config removal received for ASM_DD") - } else if data != nil && newBaseData != nil { - err = errors.New("more than one config switch received for ASM_DD") - } - // Already seen a removal or an update, return an error - if err != nil { - maps.Copy(statuses, statusesFromUpdate(u, true, err)) - break updateLoop - } - + for product, prodUpdates := range updates { + for path, data := range prodUpdates { + switch product { + case state.ProductASMDD, state.ProductASMData, state.ProductASM: if data == nil { - removalFound = true + // Perofrm the deletion right away; we need to do these before any other updates... + log.Debug("appsec: remote config: removing configuration %q", path) + a.cfg.WAFManager.RemoveConfig(path) + statuses[path] = state.ApplyStatus{State: state.ApplyStateAcknowledged} continue } - - // Save the new base path and data and only make the update after cycle through all received configs - // This makes sure that we don't update the ruleset in case the update is invalid (ex: several non nil configs) - newBasePath = path - newBaseData = data - } - // update with data = nil means the config was removed, so we switch back to the default rules - // only happens if no update was found, otherwise it could revert the switch to the new base rules - if newBaseData == nil { - if removalFound { - log.Debug("appsec: Remote config: ASM_DD config removed. Switching back to default rules") - r.ChangeBase(config.DefaultRulesFragment(), "") - maps.Copy(statuses, statusesFromUpdate(u, true, nil)) - } - continue - } - - // Switch the base rules of the RulesManager if the config received through ASM_DD is valid - var newBase config.RulesFragment - if err := json.Unmarshal(newBaseData, &newBase); err != nil { - log.Debug("appsec: Remote config: could not unmarshall ASM_DD rules: %v", err) - statuses[newBasePath] = genApplyStatus(true, err) - break updateLoop - } - log.Debug("appsec: Remote config: switching to %s as the base rules file", newBasePath) - r.ChangeBase(newBase, newBasePath) - statuses[newBasePath] = genApplyStatus(true, nil) - case rc.ProductASM: - // Store each config received through ASM as an edit entry in the RulesManager - // Those entries will get merged together when the final rules are compiled - // If a config gets removed, the RulesManager edit entry gets removed as well - for path, data := range u { - log.Debug("appsec: Remote config: processing the %s ASM config", path) - if data == nil { - log.Debug("appsec: Remote config: ASM config %s was removed", path) - r.RemoveEdit(path) + cfg := UpdatedConfig{Product: product} + if err := json.Unmarshal(data, &cfg.Content); err != nil { + log.Error("appsec: unmarshaling remote config update for %s (%q): %s", product, path, err.Error()) + statuses[product] = state.ApplyStatus{State: state.ApplyStateError, Error: err.Error()} continue } - var f config.RulesFragment - if err = json.Unmarshal(data, &f); err != nil { - log.Debug("appsec: Remote config: error processing ASM config %s: %v", path, err) - statuses[path] = genApplyStatus(true, err) - break updateLoop + addOrUpdates[path] = cfg + if product == state.ProductASMDD { + // Remove the default config if present when an ASM_DD config is received. + log.Debug("appsec: remote config: processed ASM_DD addition/update; removing default config if present") + if deletedDefault := a.cfg.WAFManager.RemoveDefaultConfig(); deletedDefault { + log.Debug("appsec: remote config: successfully removed default config") + } } - r.AddEdit(path, f) + case state.ProductASMFeatures: + // This is a global hook, so it'll receive [remoteconfig.ProductASMFeatures] updates as well, which are not + // relevant for this particular handler. These are handled by a product-specific handler, + // [appsec.handleASMFeatures]. + default: + log.Debug("appsec: remote config: ignoring RC update for non-ASM product %q", path) } - default: - log.Debug("appsec: Remote config: ignoring unsubscribed product %s", p) } } - // Set all statuses to ack if no error occured - if err == nil { - for _, u := range updates { - maps.Copy(statuses, statusesFromUpdate(u, true, nil)) - } - } + // Sort the paths to apply updates in a deterministic order... + addOrUpdatePaths := slices.Collect(maps.Keys(addOrUpdates)) + slices.Sort(addOrUpdatePaths) - return statuses, err + // Apply all the additions and updates + for _, path := range addOrUpdatePaths { + update := addOrUpdates[path] + log.Debug("appsec: remote config: adding/updating configuration %q", path) + diag, err := a.cfg.WAFManager.AddOrUpdateConfig(path, update.Content) + if err != nil { + log.Debug("appsec: remote config: error while adding/updating configuration %q: %s", path, err.Error()) + // Configuration object has been fully rejected; or there was an error processing it or parsing the diagnostics + // value. If we have a diagnostics object, encode all errors from the diagnostics object as a JSON value, as + // described by: + // https://docs.google.com/document/d/1t6U7WXko_QChhoNIApn0-CRNe6SAKuiiAQIyCRPUXP4/edit?tab=t.0#heading=h.6ud96uy74pzs + type errInfo struct { + Error string `json:"error,omitempty"` + Errors map[string][]string `json:"errors,omitempty"` + } + var errs map[string]errInfo + diag.EachFeature(func(name string, feat *libddwaf.Feature) { + var ( + info errInfo + some bool + ) + if feat.Error != "" { + log.Debug("appsec: remote config: error in %q feature %s: %s", path, name, feat.Error) + info.Error = feat.Error + some = true + } + for msg, ids := range feat.Errors { + log.Debug("appsec: remote config: error in %q feature %s: %s for %q", path, name, msg, ids) + if info.Errors == nil { + info.Errors = make(map[string][]string) + } + info.Errors[msg] = ids + some = true + } + if !some { + return + } + if errs == nil { + errs = make(map[string]errInfo) + } + errs[name] = info + }) + + errMsg := err.Error() + if len(errs) > 0 { + if data, err := json.Marshal(errs); err == nil { + errMsg = string(data) + } else { + telemetrylog.Error("appsec: remote config: failed to marshal error details", slog.Any("error", telemetrylog.NewSafeError(err))) + } + } -} + statuses[path] = state.ApplyStatus{State: state.ApplyStateError, Error: errMsg} + continue + } -// onRemoteActivation is the RC callback called when an update is received for ASM_FEATURES -func (a *appsec) onRemoteActivation(updates map[string]remoteconfig.ProductUpdate) map[string]rc.ApplyStatus { - statuses := map[string]rc.ApplyStatus{} - if u, ok := updates[rc.ProductASMFeatures]; ok { - statuses = a.handleASMFeatures(u) + statuses[path] = state.ApplyStatus{State: state.ApplyStateAcknowledged} + diag.EachFeature(logDiagnosticMessages(update.Product, path)) } - return statuses - -} - -// onRCRulesUpdate is the RC callback called when security rules related RC updates are available -func (a *appsec) onRCRulesUpdate(updates map[string]remoteconfig.ProductUpdate) map[string]rc.ApplyStatus { - // If appsec was deactivated through RC, stop here - if !a.started { - return map[string]rc.ApplyStatus{} + if len(a.cfg.WAFManager.ConfigPaths(`^(?:datadog/\d+|employee)/ASM_DD/.+`)) == 0 { + log.Debug("appsec: remote config: no ASM_DD config loaded; restoring default config if available") + if err := a.cfg.WAFManager.RestoreDefaultConfig(); err != nil { + telemetrylog.Error("appsec: RC could not restore default config", slog.Any("error", telemetrylog.NewSafeError(err))) + } } - // Create a new local RulesManager - r := a.cfg.RulesManager.Clone() - statuses, err := combineRCRulesUpdates(&r, updates) - if err != nil { - log.Debug("appsec: Remote config: not applying any updates because of error: %v", err) - return statuses + if log.DebugEnabled() { + // Avoiding the call to ConfigPaths if the Debug level is not enabled... + log.Debug("appsec: remote config: rules loaded after update: %q", a.cfg.WAFManager.ConfigPaths("")) } - // Compile the final rules once all updates have been processed and no error occurred - r.Compile() - log.Debug("appsec: Remote config: final compiled rules: %s", r.String()) - - // Replace the RulesManager with the new one holding the new state - a.cfg.RulesManager = &r - // If an error occurs while updating the WAF handle, don't swap the RulesManager and propagate the error // to all config statuses since we can't know which config is the faulty one - if err = a.SwapRootOperation(); err != nil { - log.Error("appsec: Remote config: could not apply the new security rules: %v", err) + if err := a.SwapRootOperation(); err != nil { + log.Error("appsec: remote config: could not apply the new security rules: %s", err.Error()) for k := range statuses { - statuses[k] = genApplyStatus(true, err) + if statuses[k].State == state.ApplyStateError || statuses[k].State == state.ApplyStateUnacknowledged { + // Leave failed & un-acknowledged configs as-is... This failure is not related to these... + continue + } + statuses[k] = state.ApplyStatus{State: state.ApplyStateError, Error: err.Error()} } - return statuses } return statuses } -// handleASMFeatures deserializes an ASM_FEATURES configuration received through remote config -// and starts/stops appsec accordingly. -func (a *appsec) handleASMFeatures(u remoteconfig.ProductUpdate) map[string]rc.ApplyStatus { - statuses := statusesFromUpdate(u, false, nil) - if l := len(u); l > 1 { - log.Error("appsec: Remote config: %d configs received for ASM_FEATURES. Expected one at most, returning early", l) - return statuses - } - for path, raw := range u { - var data rc.ASMFeaturesData - status := rc.ApplyStatus{State: rc.ApplyStateAcknowledged} - var err error - log.Debug("appsec: Remote config: processing %s", path) - - // A nil config means ASM was disabled, and we stopped receiving the config file - // Don't ack the config in this case and return early - if raw == nil { - log.Debug("appsec: Remote config: Stopping AppSec") - a.stop() - return statuses +func logDiagnosticMessages(product string, path string) func(string, *libddwaf.Feature) { + return func(name string, feat *libddwaf.Feature) { + if feat.Error == "" && len(feat.Errors) == 0 && len(feat.Warnings) == 0 { + // No errors or warnings; nothing to report... + return } - if err = json.Unmarshal(raw, &data); err != nil { - log.Error("appsec: Remote config: error while unmarshalling %s: %v. Configuration won't be applied.", path, err) - } else if data.ASM.Enabled && !a.started { - log.Debug("appsec: Remote config: Starting AppSec") - telemetry := newAppsecTelemetry() - defer telemetry.emit() - if err = a.start(telemetry); err != nil { - log.Error("appsec: Remote config: error while processing %s. Configuration won't be applied: %v", path, err) - } - } else if !data.ASM.Enabled && a.started { - log.Debug("appsec: Remote config: Stopping AppSec") - a.stop() + + path, _ := remoteconfig.ParsePath(path) + // As defined @ https://docs.google.com/document/d/1t6U7WXko_QChhoNIApn0-CRNe6SAKuiiAQIyCRPUXP4/edit?tab=t.0#bookmark=id.cthxzqjuodhh + logger := telemetrylog.With(telemetry.WithTags([]string{ + "log_type:rc::" + strings.ToLower(product) + "::diagnostic", + "appsec_config_key:" + name, + "rc_config_id:" + path.ConfigID, + })) + if err := feat.Error; err != "" { + logger.Error("rule error occurred", slog.String("error", err)) } - if err != nil { - status = genApplyStatus(false, err) + for err, ids := range feat.Errors { + logger.Error("rule error occurred", slog.String("error", err), slog.Any("affected_rule_ids", telemetrylog.NewSafeSlice(ids))) + } + for err, ids := range feat.Warnings { + logger.Warn("rule warning occurred", slog.String("error", err), slog.Any("affected_rule_ids", telemetrylog.NewSafeSlice(ids))) } - statuses[path] = status } - - return statuses } -func mergeASMDataUpdates(u remoteconfig.ProductUpdate) (config.RulesFragment, map[string]rc.ApplyStatus) { - // Following the RFC, merging should only happen when two rules data with the same ID and same Type are received - type mapKey struct { - id string - typ string - } - mergedRulesData := make(map[mapKey]config.DataEntry) - mergedExclusionData := make(map[mapKey]config.DataEntry) - statuses := statusesFromUpdate(u, true, nil) - - mergeUpdateEntry := func(mergeMap map[mapKey]config.DataEntry, data []config.DataEntry) { - for _, ruleData := range data { - key := mapKey{id: ruleData.ID, typ: ruleData.Type} - if data, ok := mergeMap[key]; ok { - // Merge rules data entries with the same ID and Type - mergeMap[key] = config.DataEntry{ - ID: data.ID, - Type: data.Type, - Data: mergeRulesDataEntries(data.Data, ruleData.Data), - } - continue - } - - mergeMap[key] = ruleData - } +// handleASMFeatures deserializes an ASM_FEATURES configuration received through remote config +// and starts/stops appsec accordingly. +func (a *appsec) handleASMFeatures(u remoteconfig.ProductUpdate) map[string]state.ApplyStatus { + if len(u) == 0 { + // That should not actually happen; but would not be "invalid" per se. + return nil } - mapValues := func(m map[mapKey]config.DataEntry) []config.DataEntry { - values := make([]config.DataEntry, 0, len(m)) - for _, v := range m { - values = append(values, v) + if len(u) > 1 { + log.Warn("appsec: Remote Config: received multiple ASM_FEATURES update; not processing any.") + statuses := make(map[string]state.ApplyStatus, len(u)) + for path := range u { + statuses[path] = state.ApplyStatus{State: state.ApplyStateUnacknowledged} } - return values + return statuses } - for path, raw := range u { - log.Debug("appsec: Remote config: processing %s", path) - - // A nil config means ASM_DATA was disabled, and we stopped receiving the config file - // Don't ack the config in this case - if raw == nil { - log.Debug("appsec: remote config: %s disabled", path) - statuses[path] = genApplyStatus(false, nil) - continue - } - - var asmdataUpdate struct { - RulesData []config.DataEntry `json:"rules_data,omitempty"` - ExclusionData []config.DataEntry `json:"exclusion_data,omitempty"` - } - if err := json.Unmarshal(raw, &asmdataUpdate); err != nil { - log.Debug("appsec: Remote config: error while unmarshalling payload for %s: %v. Configuration won't be applied.", path, err) - statuses[path] = genApplyStatus(false, err) - continue - } - - mergeUpdateEntry(mergedExclusionData, asmdataUpdate.ExclusionData) - mergeUpdateEntry(mergedRulesData, asmdataUpdate.RulesData) + // NOTE: There is exactly 1 item in the map at this point; but it's a map, so we for-range over it. + var ( + path string + raw []byte + ) + for p, r := range u { + path, raw = p, r } - var fragment config.RulesFragment - if len(mergedRulesData) > 0 { - fragment.RulesData = mapValues(mergedRulesData) - } + log.Debug("appsec: remote config: processing %s", path) - if len(mergedExclusionData) > 0 { - fragment.ExclusionData = mapValues(mergedExclusionData) + // A nil config means ASM was disabled, and we stopped receiving the config file + // Don't ack the config in this case and return early + if raw == nil { + log.Debug("appsec: remote config: Stopping AppSec") + a.stop() + return map[string]state.ApplyStatus{path: {State: state.ApplyStateAcknowledged}} } - return fragment, statuses -} - -// mergeRulesDataEntries merges two slices of rules data entries together, removing duplicates and -// only keeping the longest expiration values for similar entries. -func mergeRulesDataEntries(entries1, entries2 []rc.ASMDataRuleDataEntry) []rc.ASMDataRuleDataEntry { - // There will be at most len(entries1) + len(entries2) entries in the merge map - mergeMap := make(map[string]int64, len(entries1)+len(entries2)) - - for _, entry := range entries1 { - mergeMap[entry.Value] = entry.Expiration + // Parse the config object we just received... + var parsed state.ASMFeaturesData + if err := json.Unmarshal(raw, &parsed); err != nil { + log.Error("appsec: remote config: error while unmarshalling %q: %s. Configuration won't be applied.", path, err.Error()) + return map[string]state.ApplyStatus{path: {State: state.ApplyStateError, Error: err.Error()}} } - // Replace the entry only if the new expiration timestamp goes later than the current one - // If no expiration timestamp was provided (default to 0), then the data doesn't expire - for _, entry := range entries2 { - if exp, ok := mergeMap[entry.Value]; !ok || entry.Expiration == 0 || entry.Expiration > exp { - mergeMap[entry.Value] = entry.Expiration + + // RC triggers activation of ASM; ASM is not started yet... Starting it! + if parsed.ASM.Enabled && !a.started { + log.Debug("appsec: remote config: Starting AppSec") + if err := a.start(); err != nil { + log.Error("appsec: remote config: error while processing %q. Configuration won't be applied: %s", path, err.Error()) + return map[string]state.ApplyStatus{path: {State: state.ApplyStateError, Error: err.Error()}} } + registerAppsecStartTelemetry(config.RCStandby, telemetry.OriginRemoteConfig) } - // Create the final slice and return it - entries := make([]rc.ASMDataRuleDataEntry, 0, len(mergeMap)) - for val, exp := range mergeMap { - entries = append(entries, rc.ASMDataRuleDataEntry{Value: val, Expiration: exp}) + + // RC triggers desactivation of ASM; ASM is started... Stopping it! + if !parsed.ASM.Enabled && a.started { + log.Debug("appsec: remote config: Stopping AppSec") + a.stop() + registerAppsecStartTelemetry(config.ForcedOff, telemetry.OriginRemoteConfig) + return map[string]state.ApplyStatus{path: {State: state.ApplyStateAcknowledged}} } - return entries + + // If we got here, we have an idempotent success! + return map[string]state.ApplyStatus{path: {State: state.ApplyStateAcknowledged}} } func (a *appsec) startRC() error { @@ -361,7 +295,7 @@ func (a *appsec) registerRCCapability(c remoteconfig.Capability) error { func (a *appsec) unregisterRCCapability(c remoteconfig.Capability) error { if a.cfg.RC == nil { - log.Debug("appsec: Remote config: no valid remote configuration client") + log.Debug("appsec: remote config: no valid remote configuration client") return nil } return remoteconfig.UnregisterCapability(c) @@ -369,59 +303,68 @@ func (a *appsec) unregisterRCCapability(c remoteconfig.Capability) error { func (a *appsec) enableRemoteActivation() error { if a.cfg.RC == nil { - return fmt.Errorf("no valid remote configuration client") - } - err := a.registerRCProduct(rc.ProductASMFeatures) - if err != nil { - return err + return errors.New("no valid remote configuration client") } - err = a.registerRCCapability(remoteconfig.ASMActivation) - if err != nil { - return err - } - return remoteconfig.RegisterCallback(a.onRemoteActivation) + log.Debug("appsec: Remote Config: subscribing to ASM_FEATURES updates...") + return remoteconfig.Subscribe(state.ProductASMFeatures, a.handleASMFeatures, remoteconfig.ASMActivation) } -var blockingCapabilities = [...]remoteconfig.Capability{ - remoteconfig.ASMUserBlocking, - remoteconfig.ASMRequestBlocking, - remoteconfig.ASMIPBlocking, +var baseCapabilities = [...]remoteconfig.Capability{ + remoteconfig.ASMDDMultiConfig, remoteconfig.ASMDDRules, remoteconfig.ASMExclusions, remoteconfig.ASMCustomRules, - remoteconfig.ASMCustomBlockingResponse, remoteconfig.ASMTrustedIPs, + remoteconfig.ASMProcessorOverrides, + remoteconfig.ASMCustomDataScanners, remoteconfig.ASMExclusionData, remoteconfig.ASMEndpointFingerprinting, remoteconfig.ASMSessionFingerprinting, remoteconfig.ASMNetworkFingerprinting, remoteconfig.ASMHeaderFingerprinting, + remoteconfig.ASMTraceTaggingRules, +} + +var blockingCapabilities = [...]remoteconfig.Capability{ + remoteconfig.ASMUserBlocking, + remoteconfig.ASMRequestBlocking, + remoteconfig.ASMIPBlocking, + remoteconfig.ASMCustomBlockingResponse, } func (a *appsec) enableRCBlocking() { if a.cfg.RC == nil { - log.Debug("appsec: Remote config: no valid remote configuration client") - return - } - if _, isSet := os.LookupEnv(internal.EnvRules); isSet { - log.Debug("appsec: Remote config: using rules from %s, blocking capabilities won't be enabled", a.cfg.RulesManager.BasePath) + log.Debug("appsec: remote config: no valid remote configuration client") return } - products := []string{rc.ProductASM, rc.ProductASMDD, rc.ProductASMData} + products := []string{state.ProductASM, state.ProductASMDD, state.ProductASMData} for _, p := range products { if err := a.registerRCProduct(p); err != nil { - log.Debug("appsec: Remote config: couldn't register product %s: %v", p, err) + log.Debug("appsec: remote config: couldn't register product %q: %s", p, err.Error()) } } + log.Debug("appsec: remote config: registering onRCRulesUpdate callback") if err := remoteconfig.RegisterCallback(a.onRCRulesUpdate); err != nil { - log.Debug("appsec: Remote config: couldn't register callback: %v", err) + log.Debug("appsec: remote config: couldn't register callback: %s", err.Error()) } - for _, c := range blockingCapabilities { + for _, c := range baseCapabilities { if err := a.registerRCCapability(c); err != nil { - log.Debug("appsec: Remote config: couldn't register capability %v: %v", c, err) + log.Debug("appsec: remote config: couldn't register capability %d: %s", c, err.Error()) + } + } + + if localRulesPath, hasLocalRules := env.Lookup(config.EnvRules); hasLocalRules { + log.Debug("appsec: remote config: using rules from %s; will not register blocking capabilities", localRulesPath) + return + } + if !a.cfg.BlockingUnavailable { + for _, c := range blockingCapabilities { + if err := a.registerRCCapability(c); err != nil { + log.Debug("appsec: remote config: couldn't register capability %d: %s", c, err.Error()) + } } } } @@ -431,14 +374,14 @@ func (a *appsec) enableRASP() { return } if err := remoteconfig.RegisterCapability(remoteconfig.ASMRASPSSRF); err != nil { - log.Debug("appsec: Remote config: couldn't register RASP SSRF: %v", err) + log.Debug("appsec: remote config: couldn't register RASP SSRF: %s", err.Error()) } if err := remoteconfig.RegisterCapability(remoteconfig.ASMRASPSQLI); err != nil { - log.Debug("appsec: Remote config: couldn't register RASP SQLI: %v", err) + log.Debug("appsec: remote config: couldn't register RASP SQLI: %s", err.Error()) } if orchestrion.Enabled() { if err := remoteconfig.RegisterCapability(remoteconfig.ASMRASPLFI); err != nil { - log.Debug("appsec: Remote config: couldn't register RASP LFI: %v", err) + log.Debug("appsec: remote config: couldn't register RASP LFI: %s", err.Error()) } } } @@ -447,12 +390,19 @@ func (a *appsec) disableRCBlocking() { if a.cfg.RC == nil { return } - for _, c := range blockingCapabilities { + for _, c := range baseCapabilities { if err := a.unregisterRCCapability(c); err != nil { - log.Debug("appsec: Remote config: couldn't unregister capability %v: %v", c, err) + log.Debug("appsec: remote config: couldn't unregister capability %d: %s", c, err.Error()) + } + } + if !a.cfg.BlockingUnavailable { + for _, c := range blockingCapabilities { + if err := a.unregisterRCCapability(c); err != nil { + log.Debug("appsec: remote config: couldn't unregister capability %d: %s", c, err.Error()) + } } } if err := remoteconfig.UnregisterCallback(a.onRCRulesUpdate); err != nil { - log.Debug("appsec: Remote config: couldn't unregister callback: %v", err) + log.Debug("appsec: remote config: couldn't unregister callback: %s", err.Error()) } } diff --git a/internal/appsec/remoteconfig_test.go b/internal/appsec/remoteconfig_test.go index 908cea0793..1a1430a3ac 100644 --- a/internal/appsec/remoteconfig_test.go +++ b/internal/appsec/remoteconfig_test.go @@ -6,32 +6,41 @@ package appsec import ( + "embed" + "strings" + "encoding/json" - "errors" + "fmt" "os" - "reflect" + "path/filepath" + "runtime" "slices" - "strings" "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - "gopkg.in/DataDog/dd-trace-go.v1/internal/remoteconfig" - - internal "github.com/DataDog/appsec-internal-go/appsec" - rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" - waf "github.com/DataDog/go-libddwaf/v3" + "time" + + "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +//go:embed "testdata/custom-data-classification/*.json" +var customDataClassificationPayloads embed.FS + func TestASMFeaturesCallback(t *testing.T) { - if supported, _ := waf.Health(); !supported { + if supported, _ := libddwaf.Usable(); !supported { t.Skip("WAF cannot be used") } enabledPayload := []byte(`{"asm":{"enabled":true}}`) disabledPayload := []byte(`{"asm":{"enabled":false}}`) - cfg, err := config.NewConfig() + cfg, err := config.NewStartConfig().NewConfig() require.NoError(t, err) + defer cfg.WAFManager.Close() + a := newAppSec(cfg) err = a.startRC() require.NoError(t, err) @@ -86,7 +95,7 @@ func TestASMFeaturesCallback(t *testing.T) { defer a.stop() require.NotNil(t, a) if tc.startBefore { - a.start(nil) + require.NoError(t, a.start()) } require.Equal(t, tc.startBefore, a.started) a.handleASMFeatures(tc.update) @@ -114,268 +123,9 @@ func TestASMFeaturesCallback(t *testing.T) { }) } -func TestMergeRulesData(t *testing.T) { - for _, tc := range []struct { - name string - update remoteconfig.ProductUpdate - expected config.RulesFragment - statuses map[string]rc.ApplyStatus - }{ - { - name: "empty-rule-data", - update: map[string][]byte{}, - statuses: map[string]rc.ApplyStatus{}, - }, - { - name: "bad-json", - update: map[string][]byte{ - "some/path": []byte(`[}]`), - }, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateError, Error: "invalid character '}' looking for beginning of value"}}, - }, - { - name: "single-rules-value", - update: map[string][]byte{ - "some/path": []byte(`{"rules_data":[{"id":"test","type":"data_with_expiration","data":[{"expiration":3494138481,"value":"user1"}]}]}`), - }, - expected: config.RulesFragment{RulesData: []config.DataEntry{{ID: "test", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138481, Value: "user1"}, - }}}}, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateAcknowledged}}, - }, - { - name: "multiple-rules-values", - update: map[string][]byte{ - "some/path": []byte(`{"rules_data":[{"id":"test","type":"data_with_expiration","data":[{"expiration":3494138481,"value":"user1"},{"expiration":3494138441,"value":"user2"}]}]}`), - }, - expected: config.RulesFragment{RulesData: []config.DataEntry{{ID: "test", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138481, Value: "user1"}, - {Expiration: 3494138441, Value: "user2"}, - }}}}, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateAcknowledged}}, - }, - { - name: "multiple-rules-entries", - update: map[string][]byte{ - "some/path": []byte(`{"rules_data":[{"id":"test1","type":"data_with_expiration","data":[{"expiration":3494138444,"value":"user3"}]},{"id":"test2","type":"data_with_expiration","data":[{"expiration":3495138481,"value":"user4"}]}]}`), - }, - expected: config.RulesFragment{RulesData: []config.DataEntry{ - {ID: "test1", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138444, Value: "user3"}, - }}, {ID: "test2", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3495138481, Value: "user4"}, - }}, - }}, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateAcknowledged}}, - }, - { - name: "merging-rules-entries", - update: map[string][]byte{ - "some/path/1": []byte(`{"rules_data":[{"id":"test1","type":"data_with_expiration","data":[{"expiration":3494138444,"value":"user3"}]},{"id":"test2","type":"data_with_expiration","data":[{"expiration":3495138481,"value":"user4"}]}]}`), - "some/path/2": []byte(`{"rules_data":[{"id":"test1","type":"data_with_expiration","data":[{"expiration":3494138445,"value":"user3"}]},{"id":"test2","type":"data_with_expiration","data":[{"expiration":0,"value":"user5"}]}]}`), - }, - expected: config.RulesFragment{RulesData: []config.DataEntry{ - {ID: "test1", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138445, Value: "user3"}, - }}, - {ID: "test2", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3495138481, Value: "user4"}, - {Expiration: 0, Value: "user5"}, - }}, - }}, - statuses: map[string]rc.ApplyStatus{ - "some/path/1": {State: rc.ApplyStateAcknowledged}, - "some/path/2": {State: rc.ApplyStateAcknowledged}, - }, - }, - { - name: "single-exclusions-value", - update: map[string][]byte{ - "some/path": []byte(`{"exclusion_data":[{"id":"test","type":"data_with_expiration","data":[{"expiration":3494138481,"value":"user1"}]}]}`), - }, - expected: config.RulesFragment{ExclusionData: []config.DataEntry{{ID: "test", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138481, Value: "user1"}, - }}}}, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateAcknowledged}}, - }, - { - name: "multiple-exclusions-values", - update: map[string][]byte{ - "some/path": []byte(`{"exclusion_data":[{"id":"test","type":"data_with_expiration","data":[{"expiration":3494138481,"value":"user1"},{"expiration":3494138441,"value":"user2"}]}]}`), - }, - expected: config.RulesFragment{ExclusionData: []config.DataEntry{{ID: "test", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138481, Value: "user1"}, - {Expiration: 3494138441, Value: "user2"}, - }}}}, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateAcknowledged}}, - }, - { - name: "multiple-exclusions-entries", - update: map[string][]byte{ - "some/path": []byte(`{"exclusion_data":[{"id":"test1","type":"data_with_expiration","data":[{"expiration":3494138444,"value":"user3"}]},{"id":"test2","type":"data_with_expiration","data":[{"expiration":3495138481,"value":"user4"}]}]}`), - }, - expected: config.RulesFragment{ExclusionData: []config.DataEntry{ - {ID: "test1", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138444, Value: "user3"}, - }}, {ID: "test2", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3495138481, Value: "user4"}, - }}, - }}, - statuses: map[string]rc.ApplyStatus{"some/path": {State: rc.ApplyStateAcknowledged}}, - }, - { - name: "merging-exclusions-entries", - update: map[string][]byte{ - "some/path/1": []byte(`{"exclusion_data":[{"id":"test1","type":"data_with_expiration","data":[{"expiration":3494138444,"value":"user3"}]},{"id":"test2","type":"data_with_expiration","data":[{"expiration":3495138481,"value":"user4"}]}]}`), - "some/path/2": []byte(`{"exclusion_data":[{"id":"test1","type":"data_with_expiration","data":[{"expiration":3494138445,"value":"user3"}]},{"id":"test2","type":"data_with_expiration","data":[{"expiration":0,"value":"user5"}]}]}`), - }, - expected: config.RulesFragment{ExclusionData: []config.DataEntry{ - {ID: "test1", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3494138445, Value: "user3"}, - }}, - {ID: "test2", Type: "data_with_expiration", Data: []rc.ASMDataRuleDataEntry{ - {Expiration: 3495138481, Value: "user4"}, - {Expiration: 0, Value: "user5"}, - }}, - }}, - statuses: map[string]rc.ApplyStatus{ - "some/path/1": {State: rc.ApplyStateAcknowledged}, - "some/path/2": {State: rc.ApplyStateAcknowledged}, - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - fragment, statuses := mergeASMDataUpdates(tc.update) - - // Sort the data entries to make the comparison easier - sort := func(actual []config.DataEntry) { - slices.SortStableFunc(actual, func(a, b config.DataEntry) int { - return strings.Compare(a.ID, b.ID) - }) - for _, data := range actual { - slices.SortStableFunc(data.Data, func(a, b rc.ASMDataRuleDataEntry) int { - return strings.Compare(a.Value, b.Value) - }) - } - } - - sort(fragment.RulesData) - sort(fragment.ExclusionData) - sort(tc.expected.RulesData) - sort(tc.expected.ExclusionData) - - require.Equal(t, tc.expected, fragment) - require.Equal(t, tc.statuses, statuses) - }) - } -} - -// This test makes sure that the merging behavior for rule data entries follows what is described in the ASM blocking RFC -func TestMergeRulesDataEntries(t *testing.T) { - for _, tc := range []struct { - name string - in1 []rc.ASMDataRuleDataEntry - in2 []rc.ASMDataRuleDataEntry - out []rc.ASMDataRuleDataEntry - }{ - { - name: "empty", - out: []rc.ASMDataRuleDataEntry{}, - }, - { - name: "no-collision-1", - in1: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 1, - }, - }, - out: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 1, - }, - }, - }, - { - name: "no-collision-2", - in1: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 1, - }, - }, - in2: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.8", - Expiration: 1, - }, - }, - out: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 1, - }, - { - Value: "127.0.0.8", - Expiration: 1, - }, - }, - }, - { - name: "collision", - in1: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 1, - }, - }, - in2: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 2, - }, - }, - out: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 2, - }, - }, - }, - { - name: "collision-no-expiration", - in1: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 1, - }, - }, - in2: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 0, - }, - }, - out: []rc.ASMDataRuleDataEntry{ - { - Value: "127.0.0.1", - Expiration: 0, - }, - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - res := mergeRulesDataEntries(tc.in1, tc.in2) - require.ElementsMatch(t, tc.out, res) - }) - } - -} - // This test ensures that the remote activation capabilities are only set if DD_APPSEC_ENABLED is not set in the env. func TestRemoteActivationScenarios(t *testing.T) { - if supported, _ := waf.Health(); !supported { + if supported, _ := libddwaf.Usable(); !supported { t.Skip("WAF cannot be used") } @@ -390,7 +140,7 @@ func TestRemoteActivationScenarios(t *testing.T) { found, err := remoteconfig.HasCapability(remoteconfig.ASMActivation) require.NoError(t, err) require.True(t, found) - found, err = remoteconfig.HasProduct(rc.ProductASMFeatures) + found, err = remoteconfig.HasProduct(state.ProductASMFeatures) require.NoError(t, err) require.True(t, found) }) @@ -405,11 +155,31 @@ func TestRemoteActivationScenarios(t *testing.T) { found, err := remoteconfig.HasCapability(remoteconfig.ASMActivation) require.NoError(t, err) require.False(t, found) - found, err = remoteconfig.HasProduct(rc.ProductASMFeatures) + found, err = remoteconfig.HasProduct(state.ProductASMFeatures) require.NoError(t, err) require.False(t, found) }) + t.Run("WithEnablementMode(EnabledModeForcedOn)", func(t *testing.T) { + for _, envVal := range []string{"", "true", "false"} { + t.Run(fmt.Sprintf("DD_APPSEC_ENABLED=%s", envVal), func(t *testing.T) { + t.Setenv(config.EnvEnabled, envVal) + + remoteconfig.Reset() + Start(config.WithEnablementMode(config.ForcedOn), config.WithRCConfig(remoteconfig.DefaultClientConfig())) + defer Stop() + + require.True(t, Enabled()) + found, err := remoteconfig.HasCapability(remoteconfig.ASMActivation) + require.NoError(t, err) + require.False(t, found) + found, err = remoteconfig.HasProduct(state.ProductASMFeatures) + require.NoError(t, err) + require.False(t, found) + }) + } + }) + t.Run("DD_APPSEC_ENABLED=false", func(t *testing.T) { t.Setenv(config.EnvEnabled, "false") Start(config.WithRCConfig(remoteconfig.DefaultClientConfig())) @@ -417,6 +187,19 @@ func TestRemoteActivationScenarios(t *testing.T) { require.Nil(t, activeAppSec) require.False(t, Enabled()) }) + + t.Run("WithEnablementMode(EnabledModeForcedOff)", func(t *testing.T) { + for _, envVal := range []string{"", "true", "false"} { + t.Run(fmt.Sprintf("DD_APPSEC_ENABLED=%s", envVal), func(t *testing.T) { + t.Setenv(config.EnvEnabled, envVal) + + Start(config.WithEnablementMode(config.ForcedOff), config.WithRCConfig(remoteconfig.DefaultClientConfig())) + defer Stop() + require.Nil(t, activeAppSec) + require.False(t, Enabled()) + }) + } + }) } func TestCapabilitiesAndProducts(t *testing.T) { @@ -429,17 +212,22 @@ func TestCapabilitiesAndProducts(t *testing.T) { { name: "appsec-unspecified", expectedC: []remoteconfig.Capability{remoteconfig.ASMActivation}, - expectedP: []string{rc.ProductASMFeatures}, + expectedP: []string{state.ProductASMFeatures}, }, { - name: "appsec-enabled/default-RulesManager", - env: map[string]string{config.EnvEnabled: "1"}, - expectedC: blockingCapabilities[:], - expectedP: []string{rc.ProductASM, rc.ProductASMData, rc.ProductASMDD}, + name: "appsec-enabled/default-RulesManager", + env: map[string]string{config.EnvEnabled: "1"}, + expectedC: func() []remoteconfig.Capability { + result := make([]remoteconfig.Capability, 0, len(baseCapabilities)+len(blockingCapabilities)) + result = append(result, baseCapabilities[:]...) + result = append(result, blockingCapabilities[:]...) + return result + }(), + expectedP: []string{state.ProductASM, state.ProductASMData, state.ProductASMDD}, }, { name: "appsec-enabled/RulesManager-from-env", - env: map[string]string{config.EnvEnabled: "1", internal.EnvRules: "testdata/blocking.json"}, + env: map[string]string{config.EnvEnabled: "1", config.EnvRules: "testdata/blocking.json"}, expectedC: []remoteconfig.Capability{}, expectedP: []string{}, }, @@ -471,28 +259,84 @@ func TestCapabilitiesAndProducts(t *testing.T) { } } -func craftRCUpdates(fragments map[string]config.RulesFragment) map[string]remoteconfig.ProductUpdate { +func TestCapabilitiesAndProductsBlockingUnavailable(t *testing.T) { + for _, tc := range []struct { + name string + env map[string]string + expectedC []remoteconfig.Capability + excludedC []remoteconfig.Capability + expectedP []string + }{ + { + name: "appsec-enabled/default-RulesManager", + env: map[string]string{config.EnvEnabled: "1"}, + expectedC: baseCapabilities[:], + excludedC: blockingCapabilities[:], + expectedP: []string{state.ProductASM, state.ProductASMData, state.ProductASMDD}, + }, + } { + + t.Run(tc.name, func(t *testing.T) { + t.Setenv(config.EnvEnabled, "") + os.Unsetenv(config.EnvEnabled) + for k, v := range tc.env { + t.Setenv(k, v) + } + Start(config.WithRCConfig(remoteconfig.DefaultClientConfig()), config.WithBlockingUnavailable(true)) + defer Stop() + if !Enabled() && activeAppSec == nil { + t.Skip() + } + + for _, cap := range tc.expectedC { + found, err := remoteconfig.HasCapability(cap) + require.NoError(t, err) + require.True(t, found) + } + for _, cap := range tc.excludedC { + found, err := remoteconfig.HasCapability(cap) + require.NoError(t, err) + require.False(t, found) + } + for _, p := range tc.expectedP { + found, err := remoteconfig.HasProduct(p) + require.NoError(t, err) + require.True(t, found) + } + }) + } +} + +func craftRCUpdates(fragments map[string]*RulesFragment) map[string]remoteconfig.ProductUpdate { update := make(map[string]remoteconfig.ProductUpdate) for path, frag := range fragments { + if frag == nil { + if _, ok := update[state.ProductASMDD]; !ok { + update[state.ProductASMDD] = make(remoteconfig.ProductUpdate) + } + update[state.ProductASMDD][path] = nil + continue + } + data, err := json.Marshal(frag) if err != nil { panic(err) } if len(frag.Rules) > 0 { - if _, ok := update[rc.ProductASMDD]; !ok { - update[rc.ProductASMDD] = make(remoteconfig.ProductUpdate) + if _, ok := update[state.ProductASMDD]; !ok { + update[state.ProductASMDD] = make(remoteconfig.ProductUpdate) } - update[rc.ProductASMDD][path] = data + update[state.ProductASMDD][path] = data } else if len(frag.Overrides) > 0 || len(frag.Exclusions) > 0 || len(frag.Actions) > 0 { - if _, ok := update[rc.ProductASM]; !ok { - update[rc.ProductASM] = make(remoteconfig.ProductUpdate) + if _, ok := update[state.ProductASM]; !ok { + update[state.ProductASM] = make(remoteconfig.ProductUpdate) } - update[rc.ProductASM][path] = data + update[state.ProductASM][path] = data } else if len(frag.RulesData) > 0 || len(frag.ExclusionData) > 0 { - if _, ok := update[rc.ProductASMData]; !ok { - update[rc.ProductASMData] = make(remoteconfig.ProductUpdate) + if _, ok := update[state.ProductASMData]; !ok { + update[state.ProductASMData] = make(remoteconfig.ProductUpdate) } - update[rc.ProductASMData][path] = data + update[state.ProductASMData][path] = data } } @@ -500,30 +344,32 @@ func craftRCUpdates(fragments map[string]config.RulesFragment) map[string]remote } type testRulesOverrideEntry struct { - ID string `json:"id,omitempty"` - RulesTarget []interface{} `json:"rules_target,omitempty"` - Enabled interface{} `json:"enabled,omitempty"` - OnMatch interface{} `json:"on_match,omitempty"` + ID string `json:"id,omitempty"` + RulesTarget []any `json:"rules_target,omitempty"` + Enabled any `json:"enabled,omitempty"` + OnMatch any `json:"on_match,omitempty"` } func TestOnRCUpdate(t *testing.T) { - - BaseRuleset, err := config.NewRulesManager(nil) + _, thisFile, _, _ := runtime.Caller(0) + bytes, err := os.ReadFile(filepath.Join(filepath.Dir(thisFile), "testdata", "custom_rules.json")) require.NoError(t, err) - BaseRuleset.Compile() - rules := config.RulesFragment{ - Version: BaseRuleset.Latest.Version, - Metadata: BaseRuleset.Latest.Metadata, - Rules: []interface{}{ - BaseRuleset.Base.Rules[0], + var defaultRules RulesFragment + require.NoError(t, json.Unmarshal(bytes, &defaultRules)) + + rules := RulesFragment{ + Version: defaultRules.Version, + Metadata: defaultRules.Metadata, + Rules: []any{ + defaultRules.Rules[0], }, } // Test rules overrides t.Run("Overrides", func(t *testing.T) { - overrides1 := config.RulesFragment{ - Overrides: []interface{}{ + overrides1 := RulesFragment{ + Overrides: []any{ testRulesOverrideEntry{ ID: "crs-941-290", Enabled: false, @@ -534,8 +380,8 @@ func TestOnRCUpdate(t *testing.T) { }, }, } - overrides2 := config.RulesFragment{ - Overrides: []interface{}{ + overrides2 := RulesFragment{ + Overrides: []any{ testRulesOverrideEntry{ ID: "crs-941-300", Enabled: false, @@ -549,31 +395,31 @@ func TestOnRCUpdate(t *testing.T) { for _, tc := range []struct { name string - edits map[string]config.RulesFragment - statuses map[string]rc.ApplyStatus + edits map[string]*RulesFragment + statuses map[string]state.ApplyStatus }{ { name: "no-updates", - statuses: map[string]rc.ApplyStatus{}, + statuses: map[string]state.ApplyStatus{}, }, { name: "ASM/overrides/1-config", - edits: map[string]config.RulesFragment{ - "overrides1/path": overrides1, + edits: map[string]*RulesFragment{ + "overrides1/path": &overrides1, }, - statuses: map[string]rc.ApplyStatus{ - "overrides1/path": genApplyStatus(true, nil), + statuses: map[string]state.ApplyStatus{ + "overrides1/path": {State: state.ApplyStateAcknowledged}, }, }, { name: "ASM/overrides/2-configs", - edits: map[string]config.RulesFragment{ - "overrides1/path": overrides1, - "overrides2/path": overrides2, + edits: map[string]*RulesFragment{ + "overrides1/path": &overrides1, + "overrides2/path": &overrides2, }, - statuses: map[string]rc.ApplyStatus{ - "overrides1/path": genApplyStatus(true, nil), - "overrides2/path": genApplyStatus(true, nil), + statuses: map[string]state.ApplyStatus{ + "overrides1/path": {State: state.ApplyStateAcknowledged}, + "overrides2/path": {State: state.ApplyStateAcknowledged}, }, }, } { @@ -590,10 +436,14 @@ func TestOnRCUpdate(t *testing.T) { require.Equal(t, tc.statuses, statuses) // Make sure edits are added to the active ruleset - require.Equal(t, len(tc.edits), len(activeAppSec.cfg.RulesManager.Edits)) - for cfg := range tc.edits { - require.Contains(t, activeAppSec.cfg.RulesManager.Edits, cfg) + expected := []string{"::/go-libddwaf/default/recommended.json"} + for path := range tc.statuses { + expected = append(expected, path) } + slices.Sort(expected) + actual := activeAppSec.cfg.WAFManager.ConfigPaths("") + slices.Sort(actual) + require.Equal(t, expected, actual) }) } @@ -601,60 +451,58 @@ func TestOnRCUpdate(t *testing.T) { // Test rules update (ASM_DD) for _, tc := range []struct { - name string - initialBasePath string - expectedBasePath string - edits map[string]config.RulesFragment - statuses map[string]rc.ApplyStatus - removal string + name string + initialBasePath string + expectedConfigPaths []string + edits map[string]*RulesFragment + statuses map[string]state.ApplyStatus }{ { name: "no-updates", - statuses: map[string]rc.ApplyStatus{}, + statuses: map[string]state.ApplyStatus{}, }, { - name: "ASM_DD/1-config", - expectedBasePath: "rules/path", - edits: map[string]config.RulesFragment{ - "rules/path": rules, + name: "ASM_DD/1-config", + expectedConfigPaths: []string{"datadog/2/ASM_DD/rules/config"}, + edits: map[string]*RulesFragment{ + "datadog/2/ASM_DD/rules/config": &rules, }, - statuses: map[string]rc.ApplyStatus{ - "rules/path": genApplyStatus(true, nil), + statuses: map[string]state.ApplyStatus{ + "datadog/2/ASM_DD/rules/config": {State: state.ApplyStateAcknowledged}, }, }, { - name: "ASM_DD/2-configs (invalid)", - edits: map[string]config.RulesFragment{ - "rules/path1": rules, - "rules/path2": rules, + name: "ASM_DD/2-configs", + expectedConfigPaths: []string{"datadog/2/ASM_DD/rules-1/config"}, + edits: map[string]*RulesFragment{ + "datadog/2/ASM_DD/rules-1/config": &rules, + "datadog/2/ASM_DD/rules-2/config": &rules, }, - statuses: map[string]rc.ApplyStatus{ - "rules/path1": genApplyStatus(true, errors.New("more than one config switch received for ASM_DD")), - "rules/path2": genApplyStatus(true, errors.New("more than one config switch received for ASM_DD")), + statuses: map[string]state.ApplyStatus{ + "datadog/2/ASM_DD/rules-1/config": {State: state.ApplyStateAcknowledged}, + "datadog/2/ASM_DD/rules-2/config": {State: state.ApplyStateError, Error: `{"rules":{"errors":{"duplicate rule":["custom-001"]}}}`}, }, }, { - name: "ASM_DD/1-config-1-removal", - expectedBasePath: "rules/path1", - edits: map[string]config.RulesFragment{ - "rules/path1": rules, + name: "ASM_DD/1-config-1-removal", + expectedConfigPaths: []string{"datadog/2/ASM_DD/rules/config"}, + edits: map[string]*RulesFragment{ + "datadog/2/ASM_DD/rules/config": &rules, + "datadog/2/ASM_DD/rules-v1/config": nil, }, - statuses: map[string]rc.ApplyStatus{ - "rules/path1": genApplyStatus(true, nil), - "rules/v1": genApplyStatus(true, nil), + statuses: map[string]state.ApplyStatus{ + "datadog/2/ASM_DD/rules/config": {State: state.ApplyStateAcknowledged}, + "datadog/2/ASM_DD/rules-v1/config": {State: state.ApplyStateAcknowledged}, }, - removal: "rules/v1", }, { - name: "ASM_DD/1-removal", - initialBasePath: "rules/path", - edits: map[string]config.RulesFragment{ - "rules/path": rules, + name: "ASM_DD/1-removal", + edits: map[string]*RulesFragment{ + "datadog/2/ASM_DD/rules/config": nil, }, - statuses: map[string]rc.ApplyStatus{ - "rules/path": genApplyStatus(true, nil), + statuses: map[string]state.ApplyStatus{ + "datadog/2/ASM_DD/rules/config": {State: state.ApplyStateAcknowledged}, }, - removal: "rules/path", }, } { t.Run(tc.name, func(t *testing.T) { @@ -664,33 +512,99 @@ func TestOnRCUpdate(t *testing.T) { t.Skip() } - activeAppSec.cfg.RulesManager.BasePath = tc.initialBasePath - activeAppSec.cfg.RulesManager.Compile() + require.Equal(t, []string{"::/go-libddwaf/default/recommended.json"}, activeAppSec.cfg.WAFManager.ConfigPaths("")) // Craft and process the RC updates updates := craftRCUpdates(tc.edits) - if tc.removal != "" { - updates[rc.ProductASMDD][tc.removal] = nil - } statuses := activeAppSec.onRCRulesUpdate(updates) require.Equal(t, tc.statuses, statuses) // Compare rulesets base paths to make sure the updates were processed correctly - require.Equal(t, tc.expectedBasePath, activeAppSec.cfg.RulesManager.BasePath) - - if len(tc.edits) == 1 { - if _, ok := tc.edits[tc.removal]; ok { - require.Equal(t, BaseRuleset.Base.Rules, activeAppSec.cfg.RulesManager.Base.Rules) - } else { - require.Equal(t, tc.edits[tc.expectedBasePath].Rules, activeAppSec.cfg.RulesManager.Base.Rules) - } + expected := tc.expectedConfigPaths + if expected == nil { + expected = []string{"::/go-libddwaf/default/recommended.json"} } + require.Equal(t, expected, activeAppSec.cfg.WAFManager.ConfigPaths("")) }) } + t.Run("custom data classification", func(t *testing.T) { + if supported, _ := libddwaf.Usable(); !supported { + t.Skip("WAF needs to be available for this test (verifies WAF is provided correct data)") + } + + // This test is cloned from https://github.com/DataDog/system-tests/blob/e3d14f27c6b8e2ca867cd4a4c423a30e0cde9f25/tests/appsec/api_security/test_custom_data_classification.py#L77 + + // RFC-1071: + // - Tracers MUST ensure that the `processor_overrides` and `scanners` key + // provided by ASM configurations is forwarded to libddwaf without + // alteration; + // - Tracers MUST provide the `ASM_PROCESSOR_OVERRIDES` and + // `ASM_CUSTOM_DATA_SCANNERS` capabilities through remote configuration. + + t.Setenv(config.EnvEnabled, "1") + Start(config.WithRCConfig(remoteconfig.DefaultClientConfig())) + defer Stop() + + pathPrefix := "testdata/custom-data-classification" + entries, err := customDataClassificationPayloads.ReadDir(pathPrefix) + require.NoError(t, err) + rcRulesUpdate := make(map[string]remoteconfig.ProductUpdate, len(entries)) + for _, entry := range entries { + product := strings.TrimSuffix(entry.Name(), ".json") + path := "datadog/2/" + product + "/ASM-base/config" + data, err := customDataClassificationPayloads.ReadFile(filepath.Join(pathPrefix, entry.Name())) + require.NoError(t, err) + + productUpdates, found := rcRulesUpdate[product] + if !found { + productUpdates = make(remoteconfig.ProductUpdate, 1) + rcRulesUpdate[product] = productUpdates + } + productUpdates[path] = data + } + status := activeAppSec.onRCRulesUpdate(rcRulesUpdate) + for path, status := range status { + assert.Equal(t, state.ApplyStatus{State: state.ApplyStateAcknowledged}, status, "did not acknowledge update to %s", path) + } + + // At this point, ASM should be fully enabled + require.True(t, Enabled()) + + handle, _ := activeAppSec.cfg.WAFManager.NewHandle() + require.NotNil(t, handle) + defer handle.Close() + + ctx, err := handle.NewContext(timer.WithUnlimitedBudget()) + require.NoError(t, err) + defer ctx.Close() + + res, err := ctx.Run(libddwaf.RunAddressData{ + Persistent: map[string]any{ + "waf.context.processor": map[string]bool{"extract-schema": true}, + addresses.ServerRequestBodyAddr: map[string]any{ + "testcard": "1234567890", + }, + }, + }) + require.NoError(t, err) + assert.Equal(t, map[string]any{ + "_dd.appsec.s.req.bodytest": []any{map[string]any{ + "testcard": []any{ + uint64(8), + map[string]any{ + "category": "testcategory", + "type": "card", + }, + }, + }, + }, + }, res.Derivatives) + }) + t.Run("post-stop", func(t *testing.T) { - if supported, _ := waf.Health(); !supported { + if supported, _ := libddwaf.Usable(); !supported { t.Skip("WAF needs to be available for this test (remote activation requirement)") } @@ -702,31 +616,28 @@ func TestOnRCUpdate(t *testing.T) { enabledPayload := []byte(`{"asm":{"enabled":true}}`) // Activate appsec - updates := map[string]remoteconfig.ProductUpdate{rc.ProductASMFeatures: map[string][]byte{"features/config": enabledPayload}} - activeAppSec.onRemoteActivation(updates) + status := activeAppSec.handleASMFeatures(map[string][]byte{"features/config": enabledPayload}) require.True(t, Enabled()) + require.Equal(t, map[string]state.ApplyStatus{"features/config": {State: state.ApplyStateAcknowledged}}, status) - // Deactivate and try to update the rules. The rules update should not happen - updates = map[string]remoteconfig.ProductUpdate{ - rc.ProductASMFeatures: map[string][]byte{"features/config": nil}, - rc.ProductASM: map[string][]byte{"irrelevant/config": []byte("random payload that shouldn't even get unmarshalled")}, - } - activeAppSec.onRemoteActivation(updates) + // Deactivate appsec + status = activeAppSec.handleASMFeatures(map[string][]byte{"features/config": nil}) require.False(t, Enabled()) - // Make sure rules did not get updated (callback gets short circuited when activeAppsec.started == false) - statuses := activeAppSec.onRCRulesUpdate(updates) - require.Empty(t, statuses) - require.NotContains(t, activeAppSec.cfg.RulesManager.Edits, "irrelevant/config") + require.Equal(t, map[string]state.ApplyStatus{"features/config": {State: state.ApplyStateAcknowledged}}, status) + status = activeAppSec.onRCRulesUpdate(map[string]remoteconfig.ProductUpdate{ + state.ProductASMDD: map[string][]byte{"irrelevant/config": []byte("random payload that shouldn't even get unmarshalled")}, + }) + require.Equal(t, map[string]state.ApplyStatus{"irrelevant/config": {State: state.ApplyStateUnacknowledged}}, status) + require.NotContains(t, activeAppSec.cfg.WAFManager.ConfigPaths(""), "irrelevant/config") }) } func TestOnRCUpdateStatuses(t *testing.T) { - invalidRuleset, err := config.NewRulesManager([]byte(`{"version": "2.2", "metadata": {"rules_version": "1.4.2"}, "rules": [{"id": "id","name":"name","tags":{},"conditions":[],"transformers":[],"on_match":[]}]}`)) - require.NoError(t, err) - invalidRules := invalidRuleset.Base - overrides := config.RulesFragment{ - Overrides: []interface{}{ + var invalidRules RulesFragment + require.NoError(t, json.Unmarshal([]byte(`{"version": "2.2", "metadata": {"rules_version": "1.4.2"}, "rules": [{"id": "id","name":"name","tags":{},"conditions":[],"transformers":[],"on_match":[]}]}`), &invalidRules)) + overrides := RulesFragment{ + Overrides: []any{ testRulesOverrideEntry{ ID: "rule-1", Enabled: true, @@ -737,8 +648,8 @@ func TestOnRCUpdateStatuses(t *testing.T) { }, }, } - overrides2 := config.RulesFragment{ - Overrides: []interface{}{ + overrides2 := RulesFragment{ + Overrides: []any{ testRulesOverrideEntry{ ID: "rule-3", Enabled: true, @@ -749,44 +660,46 @@ func TestOnRCUpdateStatuses(t *testing.T) { }, }, } - invalidOverrides := config.RulesFragment{ - Overrides: []interface{}{1, 2, 3, 4, "random data"}, + invalidOverrides := RulesFragment{ + Overrides: []any{1, 2, 3, 4, "random data"}, } - ackStatus := genApplyStatus(true, nil) + ackStatus := state.ApplyStatus{State: state.ApplyStateAcknowledged} for _, tc := range []struct { - name string - updates map[string]remoteconfig.ProductUpdate - expected map[string]rc.ApplyStatus - updateError bool + name string + updates map[string]remoteconfig.ProductUpdate + expected map[string]state.ApplyStatus }{ { name: "single/ack", - updates: craftRCUpdates(map[string]config.RulesFragment{"overrides": overrides}), - expected: map[string]rc.ApplyStatus{"overrides": ackStatus}, + updates: craftRCUpdates(map[string]*RulesFragment{"overrides": &overrides}), + expected: map[string]state.ApplyStatus{"overrides": ackStatus}, }, { name: "single/error", - updates: craftRCUpdates(map[string]config.RulesFragment{"invalid": invalidOverrides}), - expected: map[string]rc.ApplyStatus{"invalid": ackStatus}, // Success, as there exists at least 1 usable rule in the whole set + updates: craftRCUpdates(map[string]*RulesFragment{"invalid": &invalidOverrides}), + expected: map[string]state.ApplyStatus{"invalid": {State: state.ApplyStateError, Error: `{"rules_overrides":{"error":"bad cast, expected 'map', obtained 'float'"}}`}}, }, { name: "multiple/ack", - updates: craftRCUpdates(map[string]config.RulesFragment{"overrides": overrides, "overrides2": overrides2}), - expected: map[string]rc.ApplyStatus{"overrides": ackStatus, "overrides2": ackStatus}, + updates: craftRCUpdates(map[string]*RulesFragment{"overrides": &overrides, "overrides2": &overrides2}), + expected: map[string]state.ApplyStatus{"overrides": ackStatus, "overrides2": ackStatus}, }, { name: "multiple/single-error", - updates: craftRCUpdates(map[string]config.RulesFragment{"overrides": overrides, "invalid": invalidOverrides}), - expected: map[string]rc.ApplyStatus{ - "overrides": ackStatus, // Success, as there exists at least 1 usable rule in the whole set - "invalid": ackStatus, // Success, as there exists at least 1 usable rule in the whole set + updates: craftRCUpdates(map[string]*RulesFragment{"overrides": &overrides, "invalid": &invalidOverrides}), + expected: map[string]state.ApplyStatus{ + "overrides": ackStatus, + "invalid": {State: state.ApplyStateError, Error: `{"rules_overrides":{"error":"bad cast, expected 'map', obtained 'float'"}}`}, }, }, { - name: "multiple/all-errors", - updates: craftRCUpdates(map[string]config.RulesFragment{"overrides": overrides, "invalid": invalidRules}), - updateError: true, + name: "multiple/all-errors", + updates: craftRCUpdates(map[string]*RulesFragment{"overrides": &invalidOverrides, "invalid": &invalidRules}), + expected: map[string]state.ApplyStatus{ + "overrides": {State: state.ApplyStateError, Error: `{"rules_overrides":{"error":"bad cast, expected 'map', obtained 'float'"}}`}, + "invalid": {State: state.ApplyStateError, Error: `{"rules":{"errors":{"rule has no valid conditions":["id"]}}}`}, + }, }, } { t.Run(tc.name, func(t *testing.T) { @@ -798,15 +711,7 @@ func TestOnRCUpdateStatuses(t *testing.T) { } statuses := activeAppSec.onRCRulesUpdate(tc.updates) - if tc.updateError { - for _, status := range statuses { - require.NotEmpty(t, status.Error) - require.Equal(t, rc.ApplyStateError, status.State) - } - } else { - require.Len(t, statuses, len(tc.expected)) - require.True(t, reflect.DeepEqual(tc.expected, statuses), "expected: %#v\nactual: %#v", tc.expected, statuses) - } + require.Equal(t, tc.expected, statuses) }) } } @@ -814,9 +719,9 @@ func TestOnRCUpdateStatuses(t *testing.T) { // TestWafUpdate tests that the WAF behaves correctly after the WAF handle gets updated with a new set of security rules // through remote configuration func TestWafRCUpdate(t *testing.T) { - override := config.RulesFragment{ + override := RulesFragment{ // Override the already existing and enabled rule crs-913-120 with the "block" action - Overrides: []interface{}{ + Overrides: []any{ testRulesOverrideEntry{ ID: "crs-913-120", OnMatch: []string{"block"}, @@ -824,43 +729,42 @@ func TestWafRCUpdate(t *testing.T) { }, } - if supported, _ := waf.Health(); !supported { + if supported, _ := libddwaf.Usable(); !supported { t.Skip("WAF needs to be available for this test") } t.Run("toggle-blocking", func(t *testing.T) { - cfg, err := config.NewConfig() - require.NoError(t, err) - wafHandle, err := waf.NewHandle(cfg.RulesManager.Latest, cfg.Obfuscator.KeyRegex, cfg.Obfuscator.ValueRegex) + cfg, err := config.NewStartConfig().NewConfig() require.NoError(t, err) + appsec := appsec{cfg: cfg, started: true} + + wafHandle, _ := appsec.cfg.NewHandle() + require.NotNil(t, wafHandle) defer wafHandle.Close() - wafCtx, err := wafHandle.NewContext() + wafCtx, err := wafHandle.NewContext(timer.WithBudget(time.Hour)) require.NoError(t, err) defer wafCtx.Close() - values := map[string]interface{}{ + values := map[string]any{ addresses.ServerRequestPathParamsAddr: "/rfiinc.txt", } // Make sure the rule matches as expected - result, err := wafCtx.Run(waf.RunAddressData{Persistent: values}) + result, err := wafCtx.Run(libddwaf.RunAddressData{Persistent: values}) require.NoError(t, err) require.Contains(t, jsonString(t, result.Events), "crs-913-120") require.Empty(t, result.Actions) + // Simulate an RC update that disables the rule - statuses, err := combineRCRulesUpdates(cfg.RulesManager, craftRCUpdates(map[string]config.RulesFragment{"override": override})) - require.NoError(t, err) - for _, status := range statuses { - require.Equal(t, status.State, rc.ApplyStateAcknowledged) - } - cfg.RulesManager.Compile() - newWafHandle, err := waf.NewHandle(cfg.RulesManager.Latest, cfg.Obfuscator.KeyRegex, cfg.Obfuscator.ValueRegex) - require.NoError(t, err) - defer newWafHandle.Close() - newWafCtx, err := newWafHandle.NewContext() + statuses := appsec.onRCRulesUpdate(craftRCUpdates(map[string]*RulesFragment{"override": &override})) + require.Subset(t, statuses, map[string]state.ApplyStatus{"override": {State: state.ApplyStateAcknowledged}}) + wafHandle, _ = appsec.cfg.NewHandle() + require.NotNil(t, wafHandle) + defer wafHandle.Close() + newWafCtx, err := wafHandle.NewContext(timer.WithBudget(time.Hour)) require.NoError(t, err) defer newWafCtx.Close() // Make sure the rule returns a blocking action when matching - result, err = newWafCtx.Run(waf.RunAddressData{Persistent: values}) + result, err = newWafCtx.Run(libddwaf.RunAddressData{Persistent: values}) require.NoError(t, err) require.Contains(t, jsonString(t, result.Events), "crs-913-120") require.Contains(t, result.Actions, "block_request") @@ -872,3 +776,18 @@ func jsonString(t *testing.T, v any) string { require.NoError(t, err) return string(bytes) } + +// RulesFragment can represent a full ruleset or a fragment of it. +type RulesFragment struct { + Version string `json:"version,omitempty"` + Metadata any `json:"metadata,omitempty"` + Rules []any `json:"rules,omitempty"` + Overrides []any `json:"rules_override,omitempty"` + Exclusions []any `json:"exclusions,omitempty"` + ExclusionData []state.ASMDataRuleData `json:"exclusion_data,omitempty"` + RulesData []state.ASMDataRuleData `json:"rules_data,omitempty"` + Actions []any `json:"actions,omitempty"` + CustomRules []any `json:"custom_rules,omitempty"` + Processors []any `json:"processors,omitempty"` + Scanners []any `json:"scanners,omitempty"` +} diff --git a/internal/appsec/telemetry.go b/internal/appsec/telemetry.go index 2b07117bd8..094a9a483c 100644 --- a/internal/appsec/telemetry.go +++ b/internal/appsec/telemetry.go @@ -6,78 +6,249 @@ package appsec import ( + "bytes" + "errors" + "io" + "log/slog" + "os" + "os/exec" "runtime" + "sync" + "sync/atomic" - waf "github.com/DataDog/go-libddwaf/v3" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/waferrors" ) -// cgoEnabled is true if cgo is enabled, false otherwise. -// No way to check this at runtime, so we compute it at build time in -// telemetry_cgo.go. -var cgoEnabled bool - -type appsecTelemetry struct { - configs []telemetry.Configuration - enabled bool -} - var ( - wafSupported, _ = waf.SupportsTarget() - wafHealthy, _ = waf.Health() - staticConfigs = []telemetry.Configuration{ + detectLibDLOnce sync.Once + wafUsable, wafError = libddwaf.Usable() + wafSupported = !errors.As(wafError, &waferrors.UnsupportedOSArchError{}) && !errors.As(wafError, &waferrors.UnsupportedGoVersionError{}) + staticConfigs = []telemetry.Configuration{ {Name: "goos", Value: runtime.GOOS, Origin: telemetry.OriginCode}, {Name: "goarch", Value: runtime.GOARCH, Origin: telemetry.OriginCode}, + {Name: "cgo_enabled", Value: cgoEnabled, Origin: telemetry.OriginCode}, {Name: "waf_supports_target", Value: wafSupported, Origin: telemetry.OriginCode}, - {Name: "waf_healthy", Value: wafHealthy, Origin: telemetry.OriginCode}, + {Name: "waf_healthy", Value: wafUsable, Origin: telemetry.OriginCode}, } + appsecEnabledOrigin atomic.Pointer[telemetry.Origin] ) -// newAppsecTelemetry creates a new telemetry event for AppSec. -func newAppsecTelemetry() *appsecTelemetry { - if telemetry.Disabled() { - // If telemetry is disabled, we won't do anything... - return nil - } +// init sends the static telemetry for AppSec. +func init() { + telemetry.RegisterAppConfigs(staticConfigs...) + telemetry.AddFlushTicker(func(client telemetry.Client) { + var val float64 + if Enabled() { + val = 1.0 + } - configs := make([]telemetry.Configuration, len(staticConfigs)+1, len(staticConfigs)+2) - configs[0] = telemetry.Configuration{Name: "cgo_enabled", Value: cgoEnabled} - copy(configs[1:], staticConfigs) + origin := telemetry.OriginDefault + if o := appsecEnabledOrigin.Load(); o != nil { + origin = *o + } - return &appsecTelemetry{ - configs: configs, - } + client.Gauge(telemetry.NamespaceAppSec, "enabled", []string{"origin:" + string(origin)}).Submit(val) + }) } -// addConfig adds a new configuration entry to this telemetry event. -func (a *appsecTelemetry) addConfig(name string, value any) { - if a == nil { +func registerAppsecStartTelemetry(mode config.EnablementMode, origin telemetry.Origin) { + telemetry.RegisterAppConfig(config.EnvEnabled, Enabled(), origin) + appsecEnabledOrigin.Store(&origin) + detectLibDLOnce.Do(detectLibDL) + + if !Enabled() { return } - a.configs = append(a.configs, telemetry.Configuration{Name: name, Value: value}) + + if origin == telemetry.OriginCode { + telemetry.RegisterAppConfig("WithEnablementMode", mode, telemetry.OriginCode) + } + + telemetry.ProductStarted(telemetry.NamespaceAppSec) } -// addEnvConfig adds a new envionment-sourced configuration entry to this event. -func (a *appsecTelemetry) addEnvConfig(name string, value any) { - if a == nil { +func detectLibDL() { + if runtime.GOOS != "linux" { return } - a.configs = append(a.configs, telemetry.Configuration{Name: name, Value: value, Origin: telemetry.OriginEnvVar}) + + for _, method := range detectLibDLMethods { + if ok, err := method.method(); ok { + logger := telemetrylog.With(telemetry.WithTags([]string{"method:" + method.name})) + logger.Debug("libdl detected using method", slog.String("method", method.name)) + log.Debug("libdl detected using method: %s", method.name) + telemetry.RegisterAppConfig("libdl_present", true, telemetry.OriginCode) + return + } else if err != nil { + log.Debug("failed to detect libdl with method %s: %v", method.name, err.Error()) + } + } + + telemetry.RegisterAppConfig("libdl_present", false, telemetry.OriginCode) } -// setEnabled makes AppSec as having effectively been enabled. -func (a *appsecTelemetry) setEnabled() { - if a == nil { - return +func registerAppsecStopTelemetry() { + telemetry.ProductStopped(telemetry.NamespaceAppSec) +} + +var detectLibDLMethods = []struct { + name string + method func() (bool, error) +}{ + {"cgo", func() (bool, error) { + return cgoEnabled, nil + }}, + {"ldconfig", ldconfig}, + {"ldsocache", ldCache}, + {"ldd", ldd}, + {"proc_maps", procMaps}, + {"manual_search", manualSearch}, +} + +// ldCache is messily looking into /etc/ld.so.cache to check if libdl.so.2 is present. +// Normally ld.so.cache should be parsed but standards differ so simply looking for the string should make sense. +// It is sadly disabled by default in alpine images. +func ldCache() (bool, error) { + fp, err := os.Open("/etc/ld.so.cache") + if err != nil { + if os.IsNotExist(err) { + return false, nil // ld.so.cache does not exist, so we assume libdl is not present + } + return false, err + } + defer fp.Close() + + output, err := io.ReadAll(io.LimitReader(fp, libDLReadLimit)) + if err != nil { + return false, err } - a.enabled = true + + return searchLibdl(output), nil } -// emit sends the telemetry event to the telemetry.GlobalClient. -func (a *appsecTelemetry) emit() { - if a == nil { - return +// ldd on ourself will check if libdl.so if we are currently running with libdl. It needs the ldd binary. +// We first try to check the whole system, then we check the current process. +func ldd() (bool, error) { + var output limitedBuffer + cmd := exec.Command("ldd", "/proc/1/exe") + cmd.Stdout = &output + cmd.Stderr = io.Discard + + oneErr := cmd.Run() + + if searchLibdl(output.Bytes()) { + return true, nil + } + + var selfOutput limitedBuffer + cmd = exec.Command("ldd", "/proc/self/exe") + cmd.Stdout = &output + cmd.Stderr = io.Discard + + selfErr := cmd.Run() + + return searchLibdl(selfOutput.Bytes()), errors.Join(oneErr, selfErr) +} + +// ldconfig -p is the most reliable way to check for libdl.so presence but it does not work on musl. It also +// needs the ldconfig binary, which is not always available in containers or minimal environments. +func ldconfig() (bool, error) { + var output limitedBuffer + cmd := exec.Command("ldconfig", "-p") + cmd.Stdout = &output + cmd.Stderr = io.Discard + + if err := cmd.Run(); err != nil { + return false, err + } + + return searchLibdl(output.Bytes()), nil +} + +// procMaps is another way to check for libdl.so presence, that works on musl if we are running with libdl already. +// but does not always work because libdl can be symlink. +// We first try to check the whole system, then we check the current process. +func procMaps() (bool, error) { + fp, err := os.Open("/proc/1/maps") + if err != nil { + if os.IsNotExist(err) || os.IsPermission(err) { + return false, nil + } + return false, err } - telemetry.GlobalClient.ProductChange(telemetry.NamespaceAppSec, a.enabled, a.configs) + defer fp.Close() + + output, oneErr := io.ReadAll(io.LimitReader(fp, libDLReadLimit)) + + if searchLibdl(output) { + return true, nil + } + + fp, err = os.Open("/proc/self/maps") + if err != nil { + if os.IsNotExist(err) { + return false, nil + } + return false, err + } + + defer fp.Close() + + output, selfErr := io.ReadAll(io.LimitReader(fp, libDLReadLimit)) + + return searchLibdl(output), errors.Join(oneErr, selfErr) +} + +// manualSearch is a fallback method to search for libdl.so.2 in common library directories. +// See ld.so(8) for more details on the directories searched by the dynamic linker. +func manualSearch() (bool, error) { + for _, dir := range []string{"/lib", "/usr/lib", "/lib64", "/usr/lib64"} { + entries, err := os.ReadDir(dir) + if err != nil { + if os.IsNotExist(err) { + continue + } + return false, err + } + + for _, entry := range entries { + if !entry.IsDir() && entry.Name() == libDLName { + return true, nil + } + } + } + + return false, nil +} + +func searchLibdl(input []byte) bool { + data := bytes.TrimSpace(input) + if len(data) == 0 { + return false + } + + return bytes.Contains(data, []byte(libDLName)) +} + +// limitedBuffer is a custom buffer that limits its size to 256 KiB. +type limitedBuffer struct { + bytes.Buffer +} + +const ( + libDLReadLimit = 256 * 1024 + libDLName = "libdl.so.2" +) + +func (b *limitedBuffer) Write(p []byte) (n int, err error) { + if b.Len()+len(p) > libDLReadLimit { // 256 KiB limit + return 0, io.ErrShortWrite + } + return b.Buffer.Write(p) } diff --git a/internal/appsec/telemetry_cgo.go b/internal/appsec/telemetry_cgo.go index 4d38d6bcf9..da3ce74f6c 100644 --- a/internal/appsec/telemetry_cgo.go +++ b/internal/appsec/telemetry_cgo.go @@ -7,8 +7,4 @@ package appsec -func init() { - // Go doesn't provide any way to check if cgo is enabled, so we compute it - // ourselves with the cgo build tag. - cgoEnabled = true -} +const cgoEnabled = true diff --git a/internal/appsec/telemetry_nocgo.go b/internal/appsec/telemetry_nocgo.go new file mode 100644 index 0000000000..f789693242 --- /dev/null +++ b/internal/appsec/telemetry_nocgo.go @@ -0,0 +1,10 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +//go:build !cgo + +package appsec + +const cgoEnabled = false diff --git a/internal/appsec/testdata/api10.json b/internal/appsec/testdata/api10.json new file mode 100644 index 0000000000..29aa631a1f --- /dev/null +++ b/internal/appsec/testdata/api10.json @@ -0,0 +1,610 @@ +{ + "version": "2.1", + "metadata": { + "rules_version": "1.99.0" + }, + "rules": [ + { + "id": "api-010-100", + "name": "Collect move location", + "tags": { + "type": "api10", + "category": "api_security", + "confidence": "0", + "module": "business-logic" + }, + "min_version": "1.25.0", + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.response.status" + } + ], + "list": [ + 301, + 302 + ] + }, + "operator": "exact_match" + } + ], + "transformers": [], + "output": { + "event": false, + "keep": false, + "attributes": { + "appsec.api.redirection.move_target": { + "address": "server.io.net.response.headers", + "key_path": [ + "location" + ] + } + } + } + }, + { + "id": "api-010-110", + "name": "Collect redirect location", + "tags": { + "type": "api10", + "category": "api_security", + "confidence": "0", + "module": "business-logic" + }, + "min_version": "1.25.0", + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.response.status" + } + ], + "list": [ + 307, + 308 + ] + }, + "operator": "exact_match" + } + ], + "transformers": [], + "output": { + "event": false, + "keep": false, + "attributes": { + "appsec.api.redirection.redirect_target": { + "address": "server.io.net.response.headers", + "key_path": [ + "location" + ] + } + } + } + }, + { + "id": "api-010-111", + "name": "Collect that nothing happened", + "tags": { + "type": "api10", + "category": "api_security", + "confidence": "0", + "module": "business-logic" + }, + "min_version": "1.25.0", + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.response.status" + } + ], + "list": [ + 200 + ] + }, + "operator": "exact_match" + } + ], + "transformers": [], + "output": { + "event": false, + "keep": false, + "attributes": { + "appsec.api.redirection.nothing": { + "value": 1 + } + } + } + }, + { + "id": "rasp-930-111", + "name": "Local file inclusion exploit", + "tags": { + "type": "lfi", + "category": "vulnerability_trigger", + "cwe": "22", + "capec": "1000/255/153/126", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.query" + } + ], + "regex": "asdnjakslnbdklasbdkasbdkl" + }, + "operator": "match_regex" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-930-100", + "name": "Local file inclusion exploit", + "tags": { + "type": "lfi", + "category": "vulnerability_trigger", + "cwe": "22", + "capec": "1000/255/153/126", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.io.fs.file" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ] + }, + "operator": "lfi_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-934-100", + "name": "Server-side request forgery exploit", + "tags": { + "type": "ssrf", + "category": "vulnerability_trigger", + "cwe": "918", + "capec": "1000/225/115/664", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.io.net.url" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ] + }, + "operator": "ssrf_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-942-100", + "name": "SQL injection exploit", + "tags": { + "type": "sql_injection", + "category": "vulnerability_trigger", + "cwe": "89", + "capec": "1000/152/248/66", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.db.statement" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ], + "db_type": [ + { + "address": "server.db.system" + } + ] + }, + "operator": "sqli_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-932-100", + "name": "Shell injection exploit", + "enabled": true, + "tags": { + "type": "command_injection", + "category": "vulnerability_trigger", + "cwe": "77", + "capec": "1000/152/248/88", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.sys.shell.cmd" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ] + }, + "operator": "shi_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-932-110", + "name": "OS command injection exploit", + "enabled": true, + "tags": { + "type": "command_injection", + "category": "vulnerability_trigger", + "cwe": "77", + "capec": "1000/152/248/88", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.sys.exec.cmd" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ] + }, + "operator": "cmdi_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "apiA-100-001", + "name": "API 10 tag rule on request headers", + "tags": { + "type": "api10 request headers", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.request.headers", + "key_path": [ + "Witness" + ] + } + ], + "list": [ + "pwq3ojtropiw3hjtowir" + ] + }, + "operator": "exact_match" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.req_headers": { + "value": "TAG_API10_REQ_HEADERS" + } + } + }, + "on_match": [] + }, + { + "id": "apiA-100-002", + "name": "API 10 tag rule on request body", + "tags": { + "type": "api10 request body", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.request.body", + "key_path": [ + "payload_in" + ] + } + ], + "list": [ + "qw2jedrkjerbgol23ewpfirj2qw3or" + ] + }, + "operator": "exact_match" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.req_body": { + "value": "TAG_API10_REQ_BODY" + } + } + }, + "on_match": [] + }, + { + "id": "apiA-100-003", + "name": "API 10 tag rule on request method", + "tags": { + "type": "api10 request method", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.request.method" + } + ], + "list": [ + "TRACE" + ] + }, + "operator": "exact_match" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.req_method": { + "value": "TAG_API10_REQ_METHOD" + } + } + }, + "on_match": [] + }, + { + "id": "apiA-100-004", + "name": "API 10 tag rule on response status", + "tags": { + "type": "api10 response status", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.response.status" + } + ], + "list": [ + "201" + ] + }, + "operator": "exact_match" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.res_status": { + "value": "TAG_API10_RES_STATUS" + } + } + }, + "on_match": [] + }, + { + "id": "apiA-100-005", + "name": "API 10 tag rule on response headers", + "tags": { + "type": "api10 response headers", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.response.headers", + "key_path": [ + "echo-headers" + ] + } + ], + "list": [ + "qwoierj12l3" + ] + }, + "operator": "exact_match" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.res_headers": { + "value": "TAG_API10_RES_HEADERS" + } + } + }, + "on_match": [] + }, + { + "id": "apiA-100-006", + "name": "API 10 tag rule on response body", + "tags": { + "type": "api10 reponse body", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.io.net.response.body" + } + ], + "list": [ + "kqehf09123r4lnksef" + ] + }, + "operator": "exact_match" + } + ], + "output": { + "event": true, + "keep": true, + "attributes": { + "_dd.appsec.trace.res_body": { + "value": "TAG_API10_RES_BODY" + } + } + }, + "on_match": [] + } + ] +} diff --git a/internal/appsec/testdata/custom-data-classification/ASM.json b/internal/appsec/testdata/custom-data-classification/ASM.json new file mode 100644 index 0000000000..79192e20e0 --- /dev/null +++ b/internal/appsec/testdata/custom-data-classification/ASM.json @@ -0,0 +1,35 @@ +{ + "processor_overrides": [ + { + "target": [{ "id": "extract-content" }], + "scanners": { + "include": [ + { "id": "test-scanner-001" }, + { "id": "test-scanner-custom-001" } + ], + "exclude": [] + } + } + ], + "scanners": [ + { + "id": "test-scanner-custom-001", + "name": "Custom scanner", + "key": { + "operator": "match_regex", + "parameters": { + "regex": "\\btestcard\\b", + "options": { "case_sensitive": false, "min_length": 2 } + } + }, + "value": { + "operator": "match_regex", + "parameters": { + "regex": "\\b1234567890\\b", + "options": { "case_sensitive": false, "min_length": 5 } + } + }, + "tags": { "type": "card", "category": "testcategory" } + } + ] +} diff --git a/internal/appsec/testdata/custom-data-classification/ASM_DD.json b/internal/appsec/testdata/custom-data-classification/ASM_DD.json new file mode 100644 index 0000000000..4d6e35ef72 --- /dev/null +++ b/internal/appsec/testdata/custom-data-classification/ASM_DD.json @@ -0,0 +1,82 @@ +{ + "version": "2.2", + "metadata": { "rules_version": "1.10.0" }, + "rules": [ + { + "id": "test-001", + "name": "Test 001 rule", + "tags": { "type": "commercial_scanner", "category": "attack_attemp" }, + "conditions": [ + { + "parameters": { + "inputs": [ + { "address": "server.request.query" }, + { "address": "server.request.uri.raw" }, + { "address": "server.request.body" } + ], + "regex": "testattack", + "options": { "case_sensitive": false } + }, + "operator": "match_regex" + } + ] + } + ], + "processors": [ + { + "id": "extract-content", + "generator": "extract_schema", + "conditions": [ + { + "operator": "equals", + "parameters": { + "inputs": [ + { + "address": "waf.context.processor", + "key_path": ["extract-schema"] + } + ], + "type": "boolean", + "value": true + } + } + ], + "parameters": { + "mappings": [ + { + "inputs": [{ "address": "server.request.query" }], + "output": "_dd.appsec.s.req.querytest" + }, + { + "inputs": [{ "address": "server.request.body" }], + "output": "_dd.appsec.s.req.bodytest" + } + ], + "scanners": [{ "tags": { "category": "pii" } }] + }, + "evaluate": true, + "output": true + } + ], + "scanners": [ + { + "id": "test-scanner-001", + "name": "Standard E-mail Address", + "key": { + "operator": "match_regex", + "parameters": { + "regex": "\\b(?:(?:e[-\\s]?)?mail|address|sender|\\bto\\b|from|recipient)\\b", + "options": { "case_sensitive": false, "min_length": 2 } + } + }, + "value": { + "operator": "match_regex", + "parameters": { + "regex": "\\b[\\w!#$%&'*+/=?`{|}~^-]+(?:\\.[\\w!#$%&'*+/=?`{|}~^-]+)*(%40|@)(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,6}\\b", + "options": { "case_sensitive": false, "min_length": 5 } + } + }, + "tags": { "type": "email", "category": "pii" } + } + ] +} diff --git a/internal/appsec/testdata/fp.json b/internal/appsec/testdata/fp.json index 52af47f36c..c7f630caec 100644 --- a/internal/appsec/testdata/fp.json +++ b/internal/appsec/testdata/fp.json @@ -15,6 +15,7 @@ }, "conditions": [ { + "operator": "phrase_match", "parameters": { "inputs": [ { @@ -24,13 +25,62 @@ "list": [ "$globals" ] - }, - "operator": "phrase_match" + } } ], "transformers": [ "lowercase" ] + }, + { + "id": "9d50832c-200d-4b21-a050-61379f1a9af8", + "name": "Track users.login.failure on id-auth - /id/auth/v1/login", + "tags": { + "category": "business_logic", + "custom": "1", + "type": "users.login.failure" + }, + "conditions": [ + { + "operator": "phrase_match", + "parameters": { + "inputs": [ + { + "address": "server.request.uri.raw" + } + ], + "list": [ + "/id/auth/v1/login" + ] + } + }, + { + "operator": "phrase_match", + "parameters": { + "inputs": [ + { + "address": "server.request.method" + } + ], + "list": [ + "POST" + ] + } + }, + { + "operator": "phrase_match", + "parameters": { + "inputs": [ + { + "address": "server.response.status" + } + ], + "list": [ + "401" + ] + } + } + ] } ], "processors": [ diff --git a/internal/appsec/testdata/user_rules.json b/internal/appsec/testdata/user_rules.json index 6acb14089e..c8b0b41714 100644 --- a/internal/appsec/testdata/user_rules.json +++ b/internal/appsec/testdata/user_rules.json @@ -50,7 +50,33 @@ ], "transformers": [], "on_match": [ - "block" + "block_418" + ] + }, + { + "id": "tst-037-008", + "name": "Test block on cookies", + "tags": { + "type": "lfi", + "crs_id": "000008", + "category": "attack_attempt" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.cookies" + } + ], + "regex": "jdfoSDGFkivRG_234" + }, + "operator": "match_regex" + } + ], + "transformers": [], + "on_match": [ + "block_418" ] }, { @@ -76,7 +102,7 @@ ], "transformers": [], "on_match": [ - "block" + "block_418" ] } ], @@ -103,11 +129,256 @@ } ], "transformers": [] + }, + { + "id": "ua0-600-55x", + "name": "Datadog test scanner: user-agent", + "tags": { + "type": "security_scanner", + "category": "attack_attempt", + "cwe": "200", + "capec": "1000/118/169", + "tool_name": "Datadog Canary Test", + "confidence": "1", + "module": "waf" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + }, + { + "address": "grpc.server.request.metadata", + "key_path": [ + "dd-canary" + ] + } + ], + "regex": "^dd-test-scanner-log(?:$|/|\\s)" + }, + "operator": "match_regex" + } + ], + "transformers": [] + }, + { + "id": "ua0-600-56x", + "name": "Datadog test scanner - blocking version: user-agent", + "tags": { + "type": "attack_tool", + "category": "attack_attempt", + "cwe": "200", + "capec": "1000/118/169", + "tool_name": "Datadog Canary Test", + "confidence": "1", + "module": "waf" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + }, + { + "address": "grpc.server.request.metadata", + "key_path": [ + "dd-canary" + ] + } + ], + "regex": "^dd-test-scanner-log-block(?:$|/|\\s)" + }, + "operator": "match_regex" + } + ], + "transformers": [], + "on_match": [ + "block" + ] + }, + { + "id": "crs-941-110", + "name": "XSS Filter - Category 1: Script Tag Vector", + "tags": { + "type": "xss", + "crs_id": "941110", + "category": "attack_attempt", + "confidence": "1" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "user-agent" + ] + }, + { + "address": "server.request.headers.no_cookies", + "key_path": [ + "referer" + ] + }, + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + } + ], + "regex": "]*>[\\s\\S]*?", + "options": { + "min_length": 8 + } + }, + "operator": "match_regex" + } + ], + "transformers": [ + "removeNulls" + ] + }, + { + "id": "crs-933-130-block", + "name": "PHP Injection Attack: Global Variables Found", + "tags": { + "type": "php_code_injection", + "crs_id": "933130", + "category": "attack_attempt", + "confidence": "1" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + } + ], + "list": [ + "$globals", + "$_cookie", + "$_env", + "$_files", + "$_get", + "$_post", + "$_request", + "$_server", + "$_session", + "$argc", + "$argv", + "$http_\\u200bresponse_\\u200bheader", + "$php_\\u200berrormsg", + "$http_cookie_vars", + "$http_env_vars", + "$http_get_vars", + "$http_post_files", + "$http_post_vars", + "$http_raw_post_data", + "$http_request_vars", + "$http_server_vars" + ] + }, + "operator": "phrase_match" + } + ], + "transformers": [ + "lowercase" + ], + "on_match": [ + "block" + ] + }, + { + "id": "blk-001-001", + "name": "Block IP Addresses", + "tags": { + "type": "block_ip", + "category": "security_response" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "http.client_ip" + } + ], + "data": "blocked_ips" + }, + "operator": "ip_match" + } + ], + "transformers": [], + "on_match": [ + "block" + ] + }, + { + "id": "headers-004", + "name": "query match monitor", + "tags": { + "type": "security_scanner", + "category": "attack_attempt", + "confidence": "1" + }, + "conditions": [ + { + "parameters": { + "inputs": [ + { + "address": "server.response.headers.no_cookies", + "key_path": [ + "test" + ] + } + ], + "regex": "match-no-block-response-header" + }, + "operator": "match_regex" + } + ], + "transformers": [] + } + ], + "rules_data": [ + { + "id": "blocked_ips", + "type": "ip_with_expiration", + "data": [ + { "value": "111.222.111.222" } + ] } ], "actions":[ { - "id": "block", + "id": "block_418", "type": "block_request", "parameters": { "status_code": 418, diff --git a/internal/appsec/waf_test.go b/internal/appsec/waf_test.go index 7e169ffb7a..d55e228028 100644 --- a/internal/appsec/waf_test.go +++ b/internal/appsec/waf_test.go @@ -7,44 +7,45 @@ package appsec_test import ( "context" - "database/sql" "encoding/json" - "fmt" "io" "io/fs" - "log" - "math/rand" "net/http" "net/http/httptest" "net/url" "os" + "path/filepath" + "runtime" "strconv" "strings" "testing" - - internal "github.com/DataDog/appsec-internal-go/appsec" - waf "github.com/DataDog/go-libddwaf/v3" - - pAppsec "gopkg.in/DataDog/dd-trace-go.v1/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/appsec/events" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/config" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/ossec" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" - + "time" + + pAppsec "github.com/DataDog/dd-trace-go/v2/appsec" + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/ossec" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + httptrace "github.com/DataDog/dd-trace-go/v2/instrumentation/httptracemock" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils" + "github.com/DataDog/dd-trace-go/v2/internal/appsec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/apisec" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/body" + "github.com/DataDog/dd-trace-go/v2/internal/appsec/config" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" - _ "modernc.org/sqlite" ) func TestCustomRules(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "testdata/custom_rules.json") - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) if !appsec.Enabled() { t.Skip("appsec disabled") @@ -78,6 +79,10 @@ func TestCustomRules(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + telemetryClient := new(telemetrytest.RecordClient) + prevClient := telemetry.SwapClient(telemetryClient) + defer telemetry.SwapClient(prevClient) + req, err := http.NewRequest(tc.method, srv.URL, nil) require.NoError(t, err) @@ -94,14 +99,24 @@ func TestCustomRules(t *testing.T) { require.NotNil(t, event) require.Contains(t, event, tc.ruleMatch) } + + assert.Equal(t, 1.0, telemetryClient.Count(telemetry.NamespaceAppSec, "waf.requests", []string{ + "request_blocked:false", + "rule_triggered:" + strconv.FormatBool(tc.ruleMatch != ""), + "waf_timeout:false", + "rate_limited:false", + "waf_error:false", + "waf_version:" + libddwaf.Version(), + "event_rules_version:1.4.2", + "input_truncated:false", + }).Get()) }) } } func TestUserRules(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "testdata/user_rules.json") - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) if !appsec.Enabled() { t.Skip("appsec disabled") @@ -166,8 +181,7 @@ func TestUserRules(t *testing.T) { // the WAF is properly detecting an LFI attempt and that the corresponding security event is being sent to the agent. // Additionally, verifies that rule matching through SDK body instrumentation works as expected func TestWAF(t *testing.T) { - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) if !appsec.Enabled() { t.Skip("appsec disabled") @@ -317,8 +331,8 @@ func TestWAF(t *testing.T) { // Test that request blocking works by using custom rules/rules data func TestBlocking(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "testdata/blocking.json") - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) + if !appsec.Enabled() { t.Skip("AppSec needs to be enabled for this test") } @@ -421,6 +435,9 @@ func TestBlocking(t *testing.T) { t.Run(tc.name, func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + telemetryClient := new(telemetrytest.RecordClient) + prevClient := telemetry.SwapClient(telemetryClient) + defer telemetry.SwapClient(prevClient) req, err := http.NewRequest("POST", srv.URL+tc.endpoint, strings.NewReader(tc.reqBody)) require.NoError(t, err) for k, v := range tc.headers { @@ -443,6 +460,16 @@ func TestBlocking(t *testing.T) { require.Contains(t, spans[0].Tag("_dd.appsec.json"), tc.ruleMatch) } + assert.Equal(t, 1.0, telemetryClient.Count(telemetry.NamespaceAppSec, "waf.requests", []string{ + "request_blocked:" + strconv.FormatBool(tc.status != 200), + "rule_triggered:" + strconv.FormatBool(tc.ruleMatch != ""), + "waf_timeout:false", + "rate_limited:false", + "waf_error:false", + "waf_version:" + libddwaf.Version(), + "event_rules_version:1.4.2", + "input_truncated:false", + }).Get()) }) } } @@ -451,26 +478,33 @@ func TestBlocking(t *testing.T) { func TestAPISecurity(t *testing.T) { // Start and trace an HTTP server t.Setenv(config.EnvEnabled, "true") - if wafOK, err := waf.Health(); !wafOK { + if wafOK, err := libddwaf.Usable(); !wafOK { t.Skipf("WAF must be usable for this test to run correctly: %v", err) } mux := httptrace.NewServeMux() - mux.HandleFunc("/apisec", func(w http.ResponseWriter, r *http.Request) { + mux.HandleFunc("/apisec/{id}", func(w http.ResponseWriter, r *http.Request) { pAppsec.MonitorParsedHTTPBody(r.Context(), "plain body") w.Write([]byte("Hello World!\n")) }) srv := httptest.NewServer(mux) defer srv.Close() - req, err := http.NewRequest("POST", srv.URL+"/apisec?vin=AAAAAAAAAAAAAAAAA", nil) + req, err := http.NewRequest("POST", srv.URL+"/apisec/1337?vin=AAAAAAAAAAAAAAAAA", nil) require.NoError(t, err) t.Run("enabled", func(t *testing.T) { - t.Setenv(internal.EnvAPISecEnabled, "true") - t.Setenv(internal.EnvAPISecSampleRate, "1.0") - appsec.Start() + var sampler mockSampler + samplingKey := apisec.SamplingKey{ + Method: "POST", + Route: "/apisec/{id}", + StatusCode: 200, + } + sampler.On("DecisionFor", samplingKey).Return(true).Once() + + t.Setenv(config.EnvAPISecEnabled, "true") + testutils.StartAppSec(t, config.WithAPISecOptions(config.WithAPISecSampler(&sampler))) require.True(t, appsec.Enabled()) - defer appsec.Stop() + mt := mocktracer.Start() defer mt.Stop() @@ -481,17 +515,41 @@ func TestAPISecurity(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 1) + // Verify we did make a sampling decision as expected... + sampler.AssertCalled(t, "DecisionFor", samplingKey) + // Make sure the addresses that are present are getting extracted as schemas - require.NotNil(t, spans[0].Tag("_dd.appsec.s.req.headers")) - require.NotNil(t, spans[0].Tag("_dd.appsec.s.req.query")) - require.NotNil(t, spans[0].Tag("_dd.appsec.s.req.body")) + assert.NotNil(t, spans[0].Tag("_dd.appsec.s.req.headers")) + assert.NotNil(t, spans[0].Tag("_dd.appsec.s.req.query")) + assert.NotNil(t, spans[0].Tag("_dd.appsec.s.req.body")) + + t.Run("sampler-drops-second-request", func(t *testing.T) { + sampler.On("DecisionFor", samplingKey).Return(false).Once() + + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + + spans := mt.FinishedSpans() + require.Len(t, spans, 2) // Includes the span from the first request... + + // Verify we did make a sampling decision as expected... + sampler.AssertCalled(t, "DecisionFor", samplingKey) + + // Make sure that the schema has NOT been extracted + assert.Nil(t, spans[1].Tag("_dd.appsec.s.req.headers")) + assert.Nil(t, spans[1].Tag("_dd.appsec.s.req.query")) + assert.Nil(t, spans[1].Tag("_dd.appsec.s.req.body")) + }) }) t.Run("disabled", func(t *testing.T) { - t.Setenv(internal.EnvAPISecEnabled, "false") - appsec.Start() + var sampler mockSampler + + t.Setenv(config.EnvAPISecEnabled, "false") + testutils.StartAppSec(t, config.WithAPISecOptions(config.WithAPISecSampler(&sampler))) require.True(t, appsec.Enabled()) - defer appsec.Stop() + mt := mocktracer.Start() defer mt.Stop() @@ -502,6 +560,9 @@ func TestAPISecurity(t *testing.T) { spans := mt.FinishedSpans() require.Len(t, spans, 1) + // Make sure the sampler was never called + sampler.AssertNotCalled(t, "DecisionFor") + // Make sure the addresses that are present are not getting extracted as schemas require.Nil(t, spans[0].Tag("_dd.appsec.s.req.headers")) require.Nil(t, spans[0].Tag("_dd.appsec.s.req.query")) @@ -509,152 +570,74 @@ func TestAPISecurity(t *testing.T) { }) } -func prepareSQLDB(nbEntries int) (*sql.DB, error) { - const tables = ` -CREATE TABLE user ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - name text NOT NULL, - email text NOT NULL, - password text NOT NULL -); -CREATE TABLE product ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, - name text NOT NULL, - category text NOT NULL, - price int NOT NULL -); -` - db, err := sqltrace.Open("sqlite", ":memory:", sqltrace.WithErrorCheck(func(err error) bool { - return err != nil - })) - if err != nil { - log.Fatalln("unexpected sql.Open error:", err) - } - - if _, err := db.Exec(tables); err != nil { - return nil, err - } - - for i := 0; i < nbEntries; i++ { - _, err := db.Exec( - "INSERT INTO user (name, email, password) VALUES (?, ?, ?)", - fmt.Sprintf("User#%d", i), - fmt.Sprintf("user%d@mail.com", i), - fmt.Sprintf("secret-password#%d", i)) - if err != nil { - return nil, err - } - - _, err = db.Exec( - "INSERT INTO product (name, category, price) VALUES (?, ?, ?)", - fmt.Sprintf("Product %d", i), - "sneaker", - rand.Intn(500)) - if err != nil { - return nil, err - } - } - - return db, nil -} - -func TestRASPSQLi(t *testing.T) { - t.Setenv("DD_APPSEC_RULES", "testdata/rasp.json") - appsec.Start() - defer appsec.Stop() - - if !appsec.RASPEnabled() { - t.Skip("RASP needs to be enabled for this test") +func TestAPISecurityProxy(t *testing.T) { + if wafOK, err := libddwaf.Usable(); !wafOK { + t.Skipf("WAF must be usable for this test to run correctly: %v", err) } - db, err := prepareSQLDB(10) - require.NoError(t, err) - // Setup the http server mux := httptrace.NewServeMux() - mux.HandleFunc("/query", func(w http.ResponseWriter, r *http.Request) { - // Subsequent spans inherit their parent from context. - q := r.URL.Query().Get("query") - rows, err := db.QueryContext(r.Context(), q) - if events.IsSecurityError(err) { - return - } - if err == nil { - rows.Close() - } - w.Write([]byte("Hello World!\n")) - }) - mux.HandleFunc("/exec", func(w http.ResponseWriter, r *http.Request) { - // Subsequent spans inherit their parent from context. - q := r.URL.Query().Get("query") - _, err := db.ExecContext(r.Context(), q) - if events.IsSecurityError(err) { - return - } + mux.HandleFunc("/apisec/{id}", func(w http.ResponseWriter, r *http.Request) { + pAppsec.MonitorParsedHTTPBody(r.Context(), "plain body") w.Write([]byte("Hello World!\n")) }) srv := httptest.NewServer(mux) defer srv.Close() - for name, tc := range map[string]struct { - query string - err error - }{ - "no-error": { - query: url.QueryEscape("SELECT 1"), - }, - "injection/SELECT": { - query: url.QueryEscape("SELECT * FROM users WHERE user=\"\" UNION ALL SELECT NULL;version()--"), - err: &events.BlockingSecurityEvent{}, - }, - "injection/UPDATE": { - query: url.QueryEscape("UPDATE users SET pwd = \"root\" WHERE id = \"\" OR 1 = 1--"), - err: &events.BlockingSecurityEvent{}, - }, - "injection/EXEC": { - query: url.QueryEscape("EXEC version(); DROP TABLE users--"), - err: &events.BlockingSecurityEvent{}, - }, - } { - for _, endpoint := range []string{"/query", "/exec"} { - t.Run(name+endpoint, func(t *testing.T) { - // Start tracer and appsec - mt := mocktracer.Start() - defer mt.Stop() - - req, err := http.NewRequest("POST", srv.URL+endpoint+"?query="+tc.query, nil) - require.NoError(t, err) - res, err := srv.Client().Do(req) - require.NoError(t, err) - defer res.Body.Close() + req, err := http.NewRequest("POST", srv.URL+"/apisec/1337?vin=AAAAAAAAAAAAAAAAA", nil) + require.NoError(t, err) - spans := mt.FinishedSpans() + t.Run("rate-limits", func(t *testing.T) { + t.Setenv(config.EnvEnabled, "true") + t.Setenv(config.EnvAPISecEnabled, "true") + // Set the rate to 1 schema per minute + t.Setenv(config.EnvAPISecProxySampleRate, "1") + testutils.StartAppSec(t, config.WithAPISecOptions(config.WithProxy())) + require.True(t, appsec.Enabled()) + + mt := mocktracer.Start() + defer mt.Stop() + + // First request should be sampled + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() - require.Len(t, spans, 2) + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.NotNil(t, spans[0].Tag("_dd.appsec.s.req.query")) - if tc.err != nil { - require.Equal(t, 403, res.StatusCode) + // Second request should be dropped + res, err = srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + spans = mt.FinishedSpans() + require.Len(t, spans, 2) + assert.Nil(t, spans[1].Tag("_dd.appsec.s.req.query")) + }) - for _, sp := range spans { - switch sp.OperationName() { - case "http.request": - require.Contains(t, sp.Tag("_dd.appsec.json"), "rasp-942-100") - case "sqlite.query": - require.NotContains(t, sp.Tags(), "error") - } - } - } else { - require.Equal(t, 200, res.StatusCode) - } + t.Run("disabled-with-rate-0", func(t *testing.T) { + t.Setenv(config.EnvEnabled, "true") + t.Setenv(config.EnvAPISecEnabled, "true") + t.Setenv(config.EnvAPISecProxySampleRate, "0") + testutils.StartAppSec(t, config.WithAPISecOptions(config.WithProxy())) + require.True(t, appsec.Enabled()) - }) - } - } + mt := mocktracer.Start() + defer mt.Stop() + + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + assert.Nil(t, spans[0].Tag("_dd.appsec.s.req.query")) + }) } func TestRASPLFI(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "testdata/rasp.json") - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) if !appsec.RASPEnabled() { t.Skip("RASP needs to be enabled for this test") @@ -723,6 +706,9 @@ func TestRASPLFI(t *testing.T) { t.Run(tc.name, func(t *testing.T) { mt := mocktracer.Start() defer mt.Stop() + telemetryClient := new(telemetrytest.RecordClient) + prevClient := telemetry.SwapClient(telemetryClient) + defer telemetry.SwapClient(prevClient) req, err := http.NewRequest("GET", srv.URL+"?path="+tc.path+"&block="+strconv.FormatBool(tc.block), nil) require.NoError(t, err) @@ -740,14 +726,31 @@ func TestRASPLFI(t *testing.T) { } else { require.Equal(t, 204, res.StatusCode) } + + assert.Equal(t, 1.0, telemetryClient.Count(telemetry.NamespaceAppSec, "rasp.rule.eval", []string{ + "rule_type:lfi", + "waf_version:" + libddwaf.Version(), + "event_rules_version:1.4.2", + }).Get()) + + if !tc.block { + return + } + + assert.Equal(t, 1.0, telemetryClient.Count(telemetry.NamespaceAppSec, "rasp.rule.match", []string{ + "block:success", + "rule_type:lfi", + "waf_version:" + libddwaf.Version(), + "event_rules_version:1.4.2", + }).Get()) }) } } func TestSuspiciousAttackerBlocking(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "testdata/sab.json") - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) + if !appsec.Enabled() { t.Skip("AppSec needs to be enabled for this test") } @@ -862,30 +865,100 @@ func TestSuspiciousAttackerBlocking(t *testing.T) { } } +func TestWafEventsInMetaStruct(t *testing.T) { + t.Setenv("DD_APPSEC_RULES", "testdata/user_rules.json") + appsec.Start(config.WithMetaStructAvailable(true)) + defer appsec.Stop() + + if !appsec.Enabled() { + t.Skip("appsec disabled") + } + + // Start and trace an HTTP server + mux := httptrace.NewServeMux() + mux.HandleFunc("/hello", func(w http.ResponseWriter, _ *http.Request) { + w.Write([]byte("Hello World!\n")) + }) + mux.HandleFunc("/response-header", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("match-response-header", "match-response-header") + w.WriteHeader(204) + }) + + srv := httptest.NewServer(mux) + defer srv.Close() + + for _, tc := range []struct { + name string + url string + rule string + }{ + { + name: "custom-001", + url: "/hello", + rule: "custom-001", + }, + { + name: "custom-action", + url: "/hello?match=match-request-query", + rule: "query-002", + }, + { + name: "response-headers", + url: "/response-header", + rule: "headers-003", + }, + } { + t.Run(tc.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("GET", srv.URL+tc.url, nil) + require.NoError(t, err) + + res, err := srv.Client().Do(req) + require.NoError(t, err) + defer res.Body.Close() + + spans := mt.FinishedSpans() + require.Len(t, spans, 1) + + events, ok := spans[0].Tag("appsec").(map[string][]any) + require.True(t, ok) + + triggers := events["triggers"] + ids := make([]string, 0, len(triggers)) + for _, trigger := range triggers { + ids = append(ids, trigger.(map[string]any)["rule"].(map[string]any)["id"].(string)) + } + + require.Contains(t, ids, tc.rule) + }) + } + +} + // BenchmarkSampleWAFContext benchmarks the creation of a WAF context and running the WAF on a request/response pair // This is a basic sample of what could happen in a real-world scenario. func BenchmarkSampleWAFContext(b *testing.B) { - rules, err := internal.DefaultRuleset() - if err != nil { - b.Fatalf("error loading rules: %v", err) - } + builder, err := libddwaf.NewBuilder(config.DefaultObfuscatorKeyRegex, config.DefaultObfuscatorValueRegex) + require.NoError(b, err) + defer builder.Close() - var parsedRuleset map[string]any - err = json.Unmarshal(rules, &parsedRuleset) - if err != nil { - b.Fatalf("error parsing rules: %v", err) - } + _, err = builder.AddDefaultRecommendedRuleset() + require.NoError(b, err) + + handle := builder.Build() + require.NotNil(b, handle) - handle, err := waf.NewHandle(parsedRuleset, internal.DefaultObfuscatorKeyRegex, internal.DefaultObfuscatorValueRegex) for i := 0; i < b.N; i++ { - ctx, err := handle.NewContext() + ctx, err := handle.NewContext(timer.WithBudget(time.Second)) if err != nil || ctx == nil { b.Fatal("nil context") } // Request WAF Run _, err = ctx.Run( - waf.RunAddressData{ + libddwaf.RunAddressData{ Persistent: map[string]any{ addresses.ClientIPAddr: "1.1.1.1", addresses.ServerRequestMethodAddr: "GET", @@ -916,7 +989,7 @@ func BenchmarkSampleWAFContext(b *testing.B) { // Response WAF Run _, err = ctx.Run( - waf.RunAddressData{ + libddwaf.RunAddressData{ Persistent: map[string]any{ addresses.ServerResponseHeadersNoCookiesAddr: map[string][]string{ "content-type": {"application/json"}, @@ -937,18 +1010,19 @@ func BenchmarkSampleWAFContext(b *testing.B) { func TestAttackerFingerprinting(t *testing.T) { t.Setenv("DD_APPSEC_RULES", "testdata/fp.json") - appsec.Start() - defer appsec.Stop() + testutils.StartAppSec(t) + if !appsec.Enabled() { t.Skip("AppSec needs to be enabled for this test") } // Start and trace an HTTP server mux := httptrace.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - pAppsec.TrackUserLoginSuccessEvent( + mux.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) { + pAppsec.TrackUserLoginSuccess( r.Context(), "toto", + "", map[string]string{}, tracer.WithUserSessionID("sessionID")) @@ -956,37 +1030,120 @@ func TestAttackerFingerprinting(t *testing.T) { w.Write([]byte("Hello World!\n")) }) + + mux.HandleFunc("/id/auth/v1/login", func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(401) + }) + srv := httptest.NewServer(mux) defer srv.Close() - mt := mocktracer.Start() - defer mt.Stop() - req, err := http.NewRequest("POST", srv.URL+"/test?x=1", nil) + for _, tc := range []struct { + name string + url string + }{ + { + name: "SDK", + url: "/test?x=1", + }, + { + name: "WAF", + url: "/?x=$globals", + }, + { + name: "CustomRule", + url: "/id/auth/v1/login", + }, + } { + t.Run(tc.name, func(t *testing.T) { + mt := mocktracer.Start() + defer mt.Stop() + + req, err := http.NewRequest("POST", srv.URL+tc.url, nil) + require.NoError(t, err) + req.AddCookie(&http.Cookie{Name: "cookie", Value: "value"}) + resp, err := srv.Client().Do(req) + require.NoError(t, err) + defer resp.Body.Close() + + require.Len(t, mt.FinishedSpans(), 1) + + tags := mt.FinishedSpans()[0].Tags() + + require.Contains(t, tags, "_dd.appsec.fp.http.header") + require.Contains(t, tags, "_dd.appsec.fp.http.endpoint") + require.Contains(t, tags, "_dd.appsec.fp.http.network") + require.Contains(t, tags, "_dd.appsec.fp.session") + + require.Regexp(t, `^hdr-`, tags["_dd.appsec.fp.http.header"]) + require.Regexp(t, `^http-`, tags["_dd.appsec.fp.http.endpoint"]) + require.Regexp(t, `^ssn-`, tags["_dd.appsec.fp.session"]) + require.Regexp(t, `^net-`, tags["_dd.appsec.fp.http.network"]) + }) + + } +} + +func TestAPI10ResponseBody(t *testing.T) { + if ok, err := libddwaf.Usable(); !ok { + t.Skipf("WAF must be usable for this test to run correctly: %v", err) + } + + builder, err := libddwaf.NewBuilder("", "") require.NoError(t, err) - req.AddCookie(&http.Cookie{Name: "cookie", Value: "value"}) - resp, err := srv.Client().Do(req) + + var ruleset any + + _, thisFile, _, _ := runtime.Caller(0) + + fp, err := os.ReadFile(filepath.Join(filepath.Dir(thisFile), "testdata", "api10.json")) require.NoError(t, err) - defer resp.Body.Close() - require.Len(t, mt.FinishedSpans(), 1) + err = json.Unmarshal(fp, &ruleset) + require.NoError(t, err) - tags := mt.FinishedSpans()[0].Tags() + builder.AddOrUpdateConfig("/custom", ruleset) + defer builder.Close() - require.Contains(t, tags, "_dd.appsec.fp.http.header") - require.Contains(t, tags, "_dd.appsec.fp.http.endpoint") - require.Contains(t, tags, "_dd.appsec.fp.http.network") - require.Contains(t, tags, "_dd.appsec.fp.session") + handle := builder.Build() + require.NotNil(t, handle) + + defer handle.Close() + + ctx, err := handle.NewContext(timer.WithUnlimitedBudget(), timer.WithComponents(addresses.Scopes[:]...)) + require.NoError(t, err) + + defer ctx.Close() + + reader := io.NopCloser(strings.NewReader(`{"payload":{"payload_out":"kqehf09123r4lnksef"},"status":"OK"}`)) + + encodable, err := body.NewEncodable("application/json", &reader, 999999) + require.NoError(t, err) + + result, err := ctx.Run(libddwaf.RunAddressData{ + Ephemeral: map[string]any{ + addresses.ServerIONetResponseBodyAddr: encodable, + }, + }) + + require.NoError(t, err) + + require.Contains(t, result.Derivatives, "_dd.appsec.trace.res_body") +} + +type mockSampler struct { + mock.Mock +} - require.Regexp(t, `^hdr-`, tags["_dd.appsec.fp.http.header"]) - require.Regexp(t, `^http-`, tags["_dd.appsec.fp.http.endpoint"]) - require.Regexp(t, `^ssn-`, tags["_dd.appsec.fp.session"]) - require.Regexp(t, `^net-`, tags["_dd.appsec.fp.http.network"]) +func (m *mockSampler) DecisionFor(key apisec.SamplingKey) bool { + ret := m.Called(key) + return ret.Bool(0) } func init() { // This permits running the tests locally without defining the env var manually // We do this because the default go-libddwaf timeout value is too small and makes the tests timeout for no reason - if _, ok := os.LookupEnv(internal.EnvWAFTimeout); !ok { - os.Setenv(internal.EnvWAFTimeout, "1s") + if _, ok := os.LookupEnv(config.EnvWAFTimeout); !ok { + os.Setenv(config.EnvWAFTimeout, "1s") } } diff --git a/internal/appsec/waf_unit_test.go b/internal/appsec/waf_unit_test.go index ce2af140a6..6d2ba06f42 100644 --- a/internal/appsec/waf_unit_test.go +++ b/internal/appsec/waf_unit_test.go @@ -7,24 +7,54 @@ package appsec import ( "encoding/json" + "runtime" "testing" + "time" - internal "github.com/DataDog/appsec-internal-go/appsec" - waf "github.com/DataDog/go-libddwaf/v3" - + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/emitter/waf/addresses" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/DataDog/go-libddwaf/v4" + "github.com/DataDog/go-libddwaf/v4/timer" "github.com/stretchr/testify/require" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/emitter/waf/addresses" ) +func TestDetectLibDL(t *testing.T) { + client := new(telemetrytest.RecordClient) + restore := telemetry.MockClient(client) + defer restore() + + prevLevel := log.GetLevel() + log.SetLevel(log.LevelDebug) + defer log.SetLevel(prevLevel) + + if ok, _ := libddwaf.Usable(); !ok { + t.Skip("WAF is not usable, skipping test") + } + + if runtime.GOOS != "linux" { + t.Skip("This test is only relevant for Linux") + } + + detectLibDL() + + telemetrytest.CheckConfig(t, client.Configuration, "libdl_present", true) +} + func TestAPISecuritySchemaCollection(t *testing.T) { - if wafOk, err := waf.Health(); !wafOk { + if wafOk, err := libddwaf.Usable(); !wafOk { t.Skipf("WAF must be usable for this test to run correctly: %v", err) } - rules, err := internal.DefaultRulesetMap() + builder, err := libddwaf.NewBuilder("", "") require.NoError(t, err) - handle, err := waf.NewHandle(rules, "", "") + defer builder.Close() + + _, err = builder.AddDefaultRecommendedRuleset() require.NoError(t, err) + + handle := builder.Build() + require.NotNil(t, handle) defer handle.Close() for _, tc := range []struct { @@ -83,10 +113,10 @@ func TestAPISecuritySchemaCollection(t *testing.T) { }, } { t.Run(tc.name, func(t *testing.T) { - wafCtx, err := handle.NewContext() + wafCtx, err := handle.NewContext(timer.WithBudget(time.Second)) require.NoError(t, err) defer wafCtx.Close() - runData := waf.RunAddressData{ + runData := libddwaf.RunAddressData{ Persistent: map[string]any{ "waf.context.processor": map[string]any{"extract-schema": true}, "server.request.path_params": tc.pathParams, @@ -160,11 +190,11 @@ func TestAPISecuritySchemaCollection(t *testing.T) { }, } { t.Run("tags/"+tc.name, func(t *testing.T) { - wafCtx, err := handle.NewContext() + wafCtx, err := handle.NewContext(timer.WithBudget(time.Second)) require.NoError(t, err) defer wafCtx.Close() - runData := waf.RunAddressData{ + runData := libddwaf.RunAddressData{ Ephemeral: map[string]any{ "waf.context.processor": map[string]any{"extract-schema": true}, }, @@ -177,9 +207,13 @@ func TestAPISecuritySchemaCollection(t *testing.T) { require.NoError(t, err) require.True(t, wafRes.HasDerivatives()) for k, v := range wafRes.Derivatives { + expected, checked := tc.tags[k] + if !checked { + continue + } res, err := json.Marshal(v) require.NoError(t, err) - require.Equal(t, tc.tags[k], string(res)) + require.Equal(t, expected, string(res)) } }) } diff --git a/internal/civisibility/CIVISIBILITY_OVERVIEW.md b/internal/civisibility/CIVISIBILITY_OVERVIEW.md new file mode 100644 index 0000000000..d981a666b5 --- /dev/null +++ b/internal/civisibility/CIVISIBILITY_OVERVIEW.md @@ -0,0 +1,90 @@ +# `internal/civisibility` Walkthrough + +## High-Level Purpose +- Implements Datadog Test Optimization for Go: bootstraps tracing/log streaming, exposes manual test lifecycle APIs, and auto-instruments `testing`. +- Coordinates feature toggles such as Intelligent Test Runner (ITR), early flake detection, flaky retries, impacted tests, test management, subtest-level directives, code coverage, and CI logs. +- Normalizes CI/git metadata, fetches repository deltas, and communicates with backend settings/coverage/logs endpoints through a configurable client layer. +- Houses telemetry hooks to measure git command usage, HTTP behavior, and test instrumentation statistics. + +## Top-Level Layout +- `civisibility.go` – atomic state/test-mode switches shared across integrations. +- `constants/` – tag keys, span types, environment variable names, capability flags, span metadata helpers. +- `integrations/` – tracer bootstrapping, feature negotiation, manual test lifecycle API, Go `testing` instrumentation (including subtest orchestration), log streaming. +- `integrations/gotesting/subtests/` – mock backend + scenario harness exercising parent/subtest directive matrices and retry ownership rules. +- `utils/` – CI provider discovery, git utilities, code owners lookup, network clients, telemetry plumbing, name canonicalization, impacted test logic, fixtures. + +## Core Components + +### Root State Management +`civisibility.go` stores a process-wide `status` (`StateUninitialized` through `StateExited`) and a `isTestMode` flag using `atomic` types. Integrations set these to coordinate tracer startup/teardown, and tests can toggle “test mode” for mock tracer usage. + +### Constants Package +- `ci.go`, `env.go`, `git.go`, `os.go`, `runtime.go` declare string keys for CI metadata, git fields, OS/runtime descriptors, and env var names driving feature toggles (`DD_CIVISIBILITY_*`, `CIVisibility*`). +- `tags.go`, `test_tags.go`, `span_types.go` centralize span tag names, capability markers, and status/type enumerations used by integrations and utils. +- `test_tags.go` captures nuanced flags (`test.itr.forced_run`, quarantine/disable toggles, retry reasons, coverage toggles) ensuring consistent tagging between retries, EFD, ITR, and test management flows. + +### Integrations Package +- `civisibility.go` handles one-time tracer initialization: sets `DD_CIVISIBILITY_ENABLED`, forces tracing sample rate to 1, preloads CI metadata/code owners, optionally sets service name from repo URL, and registers signal handlers that call `ExitCiVisibility`. Close actions queue via `PushCiVisibilityCloseAction`, running in LIFO order during shutdown. +- `civisibility_features.go` orchestrates backend settings negotiation. It spawns asynchronous git pack uploads, retries settings fetch if backend needs git data, applies env-var kill switches for features (flaky retries, impacted tests, test management, subtest directives), and lazily loads supplementary data (known tests, skippables, impacted tests analyzer). Settings and HTTP client live in package-level vars protected by `sync.Once`. +- `manual_api*.go` files expose strongly-typed interfaces for user-driven test lifecycle: `TestSession`, `TestModule`, `TestSuite`, `Test`, along with option structs for command, framework, working directory, start/finish timestamps, and error reporting via `ErrorOption`. Variants (`manual_api_ddtest*.go`) adapt to `ddtest` helper semantics, and `manual_api_mocktracer_test.go` validates API behavior under mock tracer mode. +- `gotesting/` auto-instruments `testing.M`, `testing.T`, and `testing.B`. + - `testing.go`, `testingT.go`, `testingB.go`, and related files manage session/module/suite creation, attach tags (including module/suite counters), handle chatty output, skip logic, coverage capture, log streaming, and telemetry emission. They integrate with `integrations.GetSettings()`, `net` clients, and `logs`. + - Hierarchical identity plumbing: `testIdentity` (module, suite, base name, full name, path segments) plus `matchTestManagementData` allow subtests to resolve directives like `TestParent/SubChild`. `getTestManagementData` reports whether a directive was an exact match or inherited from an ancestor. + - `instrumentation.go` wires wrappers around test functions, stores execution metadata (retries, new/modified flags, quarantined/disabled states, attempt-to-fix ownership), and coordinates with backend settings for retries/EFD/ITR. It leverages `unsafe` pointers and reflective lookup to map `testing` internals, guarded by `sync` primitives. Subtests consult the parent execution metadata to decide whether they should wrap themselves or defer to the parent-run retry loop. + - Attempt-to-fix ownership rules: + 1. Parent-only directives orchestrate retries and tag success/failure; children inherit attempt-to-fix tagging but emit no retry spans. + 2. Child-only directives wrap the subtest locally (when feature flag enabled and exact match present) while leaving the parent neutral. + 3. Parent and child requesting attempt-to-fix results in the parent winning; subtests receive tags but do not run retries. + 4. Parent quarantine + attempt-to-fix keeps the parent as the retry owner while subtests inherit quarantine tags; a quarantined parent without attempt-to-fix leaves children free to execute their own retries if explicitly configured. + - Feature gating: `DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED` enables subtest directives. Standard debug logs capture identity/ownership traces when enabled. + - `instrumentation_orchestrion.go` and `orchestrion.yml` support bytecode rewriting via Orchestrion for transparent instrumentation in user code. The orchestrion path computes subtest identities, inspects parent metadata, and applies the same ownership logic as the manual wrappers. + - `coverage/` builds code coverage payloads, writes them via `coverage_writer`, and includes an auto-generated `test_coverage_msgp.go` for MsgPack encoding. + - `reflections.go` / `_test.go` ensure compatibility with `go test` internal structures across versions; helper routines detect struct offsets, function pointers, and maintain compatibility with new Go releases. +- `logs/` encapsulates CI log forwarding: gating via `DD_CIVISIBILITY_LOGS_ENABLED` stable config, packaging log entries with consistent tags, buffering/flush policies, payload formatting (`logs_payload.go`) and writer lifecycle (`logs_writer.go`). + +### Subtest Scenario Harness (`integrations/gotesting/subtests/`) +- Provides an executable matrix covering parent/subtest directive permutations. `main_test.go` enables the subtest feature flag and spawns subprocesses per scenario using `SUBTEST_MATRIX_SCENARIO`. +- `subtestcontroller_test.go` spins up a mock backend (`startSubtestServer`) that surfaces settings, test-management payloads, and stubbed endpoints for logs/git to keep tests hermetic. +- Scenarios assert span counts, `test.status`, `test.is_quarantined`, `test.is_disabled`, retry metadata (`test.is_retry`, `test.retry_reason`), and ownership of attempt-to-fix success tags. Parallel subtests and custom retry budgets are part of the matrix. +- Utilities (`scenarioContext`, `setParentDirective`, `setSubDirective`) help craft hierarchical directives; helper assertions document expected tagging for collaborators extending the matrix. + +### Utils Package +- `ci_providers.go` detects CI metadata across numerous providers (AppVeyor, Azure Pipelines, GitHub Actions, Jenkins, etc.), normalizes refs/URLs, removes secrets, supports user overrides through `DD_GIT_*` env vars, and logs detected provider. Fixtures under `testdata/fixtures/{providers}` supply provider-specific JSON. +- `environmentTags.go` maintains cached CI tags/metrics with thread-safe mutation (`AddCITags*`, `ResetCITags*`), expands `~`, computes relative paths, and augments CPU metrics (logical cores). +- `git.go` performs git command execution with telemetry instrumentation, synchronized access (`gitCommandMutex`), shallow clone detection/unshallow, pack-file generation (`MaxPackFileSizeInMb`, `CreatePackfiles`), base branch discovery, and sensitive info filtering. Interacts with `utils/telemetry` enums to classify commands/errors. Backed by tests covering command paths and error handling. +- `file_environmental_data.go` and `_test.go` collect file-level metadata (size, permissions, hash) referenced by impacted tests. `filebitmap/` stores efficient bitmap representation of file coverage. +- `impactedtests/` implements incremental test selection. `algorithm.md` documents the base branch detection heuristic (with 2025 updates) and ties closely to git utilities; `impacted_tests.go` consumes backend responses to track new/modified tests. +- `codeowners.go` parses CODEOWNERS files with caching and fallback to repo root; fixtures for GitHub/GitLab located under `testdata/fixtures/codeowners`. +- `names.go` normalizes module/suite names via runtime function lookup and heuristics, ensuring consistent tagging even with nested/subtests; tests validate complex name resolution. +- `home.go` and `file_environmental_data.go` handle home directory discovery with consideration for CI sandboxes and Windows drive letters. +- `net/` houses HTTP client logic: + - `client.go` builds agent or agentless clients, selects base URL/subdomain, attaches tags/headers, and exposes methods for settings, known tests, pack files, coverage, logs, skippables, and test management APIs. Incorporates retry/backoff (`math/rand/v2` jitter), compression awareness, telemetry hooks, and optional EVP proxy over Unix sockets. + - `http.go`, `coverage.go`, `logs_api.go`, `settings_api.go`, etc., serialize network payloads, set proper endpoints, compress payloads, and capture request/response telemetry (status codes, compression flags, payload sizes). + - `skippable.go`, `known_tests_api.go`, `test_management_tests_api.go` parse backend responses into typed structs for downstream integrations. +- `telemetry/` defines dimensional labels for events (framework identifiers, CI provider tags, error types, git command categories) used throughout the package to emit consistent metrics. +- `names_test.go`, `git_test.go`, `codeowners_test.go`, `ci_providers_test.go`, `net/*_test.go`, etc., provide extensive coverage, often using fixtures to simulate CI environments and network responses. + +## Testing, Fixtures, and Tooling +- Extensive `_test.go` coverage in integrations (`manual_api`, `gotesting`, `logs`) and utils ensures feature toggles, retries, coverage serialization, and network clients behave as expected. +- Subtest matrix harness (`integrations/gotesting/subtests`) runs under `go test` and exercises the parent/subtest permutations needed to guard subtest-specific instrumentation changes. Enable debug logging to surface per-scenario diagnostics. +- `integrations/gotesting/testcontroller_test.go` retains historical scenarios for flaky retries, EFD, ITR, and impacted tests; it coexists with the new subtest harness to avoid regression gaps. +- `utils/testdata/fixtures/providers/*.json` mimics CI payloads; `github-event.json` supports webhook parsing tests. +- Generated assets: `coverage/test_coverage_msgp.go` (MsgPack via `go:generate`), with tests to ensure deterministic encoding. +- `integrations/gotesting/reflections_test.go` safeguards reflection-based hooks against Go runtime changes. +- Mock tracer support via `mocktracer` allows unit tests to assert spans without real agent connectivity. + +## Notable Nuances & Design Choices +- Heavy use of `sync.Once`, `atomic`, and mutexes to guard global state, ensuring idempotent initialization even under concurrent instrumentation hooks. +- Feature toggles honor both backend settings and local env overrides, often logging when overrides disable capabilities to aid troubleshooting. Subtest features default off unless an env var enables them, allowing gradual rollout. +- Subtest wrappers strictly require an exact directive match before wrapping to avoid unnecessary allocations when hierarchy lookups fall back to parent configuration. +- Git operations are serialized to avoid repository lock contention, and telemetry logs command timings plus categorized exit codes to monitor flaky git environments. +- Instrumentation leans on `unsafe.Pointer` and reflection to interpose on testing internals, a delicate strategy mitigated by fallback logic and version checks. Helper utilities (`reflections.go`) centralize offsets so new Go releases require updates in a single place. +- Coverage and impacted test features rely on asynchronous git uploads; close actions ensure goroutines finish before process exit. +- Network layer supports agentless uploads with API key validation and on-the-fly compression, while also accommodating Datadog agent EVP proxy over HTTP or Unix sockets. +- `orchestrion.yml` indicates support for compile-time rewriting, hinting at hybrid instrumentation strategies (manual wrappers plus bytecode injection). +- Logging pipeline mirrors test span IDs and includes service/host tags, but is guarded behind stable-config flag to avoid unexpected log emission. + +## Getting Involved +- When touching `integrations/gotesting`, run both the legacy controller suite and the subtest matrix (`go test ./internal/civisibility/integrations/gotesting/...`). Many scenarios spawn subprocesses; enable debug logging for verbose traces. +- Any change to retry ownership or metadata propagation should be mirrored in the harness scenarios and in `docs/SUBTEST_FEATURE_IMPLEMENTATION.md` to keep documentation synchronized. +- Utility changes often require updating fixtures or provider expectations; leverage the existing test suites instead of ad-hoc scripts. diff --git a/internal/civisibility/civisibility.go b/internal/civisibility/civisibility.go new file mode 100644 index 0000000000..d1d55329a5 --- /dev/null +++ b/internal/civisibility/civisibility.go @@ -0,0 +1,41 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package civisibility + +import "sync/atomic" + +type State int + +const ( + StateUninitialized State = iota + StateInitializing + StateInitialized + StateExiting + StateExited +) + +var ( + status atomic.Int32 + isTestMode atomic.Bool +) + +func GetState() State { + // Get the state atomically + return State(status.Load()) +} + +func SetState(state State) { + // Set the state atomically + status.Store(int32(state)) +} + +func SetTestMode() { + isTestMode.Store(true) +} + +func IsTestMode() bool { + return isTestMode.Load() +} diff --git a/internal/civisibility/constants/ci.go b/internal/civisibility/constants/ci.go index d1ca2e80b8..4d98c37e07 100644 --- a/internal/civisibility/constants/ci.go +++ b/internal/civisibility/constants/ci.go @@ -6,6 +6,9 @@ package constants const ( + // CIJobID indicates the id of the CI job. + CIJobID = "ci.job.id" + // CIJobName indicates the name of the CI job. CIJobName = "ci.job.name" diff --git a/internal/civisibility/constants/env.go b/internal/civisibility/constants/env.go index 66e6de7636..869e476dd3 100644 --- a/internal/civisibility/constants/env.go +++ b/internal/civisibility/constants/env.go @@ -37,4 +37,25 @@ const ( // CIVisibilityTotalFlakyRetryCountEnvironmentVariable indicates the maximum number of retry attempts for the entire session. CIVisibilityTotalFlakyRetryCountEnvironmentVariable = "DD_CIVISIBILITY_TOTAL_FLAKY_RETRY_COUNT" + + // CIVisibilityTestManagementEnabledEnvironmentVariable indicates if the test management feature is enabled. + CIVisibilityTestManagementEnabledEnvironmentVariable = "DD_TEST_MANAGEMENT_ENABLED" + + // CIVisibilityTestManagementAttemptToFixRetriesEnvironmentVariable indicates the maximum number of retries for the attempt to fix a test. + CIVisibilityTestManagementAttemptToFixRetriesEnvironmentVariable = "DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES" + + // CIVisibilityAutoInstrumentationProviderEnvironmentVariable indicates that the auto-instrumentation script was used. + CIVisibilityAutoInstrumentationProviderEnvironmentVariable = "DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER" + + // CIVisibilityEnvironmentDataFilePath is the environment variable that holds the path to the file containing the environmental data. + CIVisibilityEnvironmentDataFilePath = "DD_TEST_OPTIMIZATION_ENV_DATA_FILE" + + // CIVisibilityImpactedTestsDetectionEnabled indicates if the impacted tests detection feature is enabled. + CIVisibilityImpactedTestsDetectionEnabled = "DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED" + + // CIVisibilityInternalParallelEarlyFlakeDetectionEnabled indicates if the internal parallel early flake detection feature is enabled. + CIVisibilityInternalParallelEarlyFlakeDetectionEnabled = "DD_CIVISIBILITY_INTERNAL_PARALLEL_EARLY_FLAKE_DETECTION_ENABLED" + + // CIVisibilitySubtestFeaturesEnabled indicates if subtest-specific management and retry features are enabled. + CIVisibilitySubtestFeaturesEnabled = "DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED" ) diff --git a/internal/civisibility/constants/git.go b/internal/civisibility/constants/git.go index a373132950..f23209fc21 100644 --- a/internal/civisibility/constants/git.go +++ b/internal/civisibility/constants/git.go @@ -51,11 +51,38 @@ const ( GitTag = "git.tag" // GitHeadCommit indicates the GIT head commit hash. - GitHeadCommit = "git.commit.head_sha" + GitHeadCommit = "git.commit.head.sha" + + // GitHeadMessage indicates the GIT head commit message. + GitHeadMessage = "git.commit.head.message" + + // GitHeadAuthorDate indicates the GIT head commit author date. + GitHeadAuthorDate = "git.commit.head.author.date" + + // GitHeadAuthorEmail indicates the GIT head commit author email. + GitHeadAuthorEmail = "git.commit.head.author.email" + + // GitHeadAuthorName indicates the GIT head commit author name. + GitHeadAuthorName = "git.commit.head.author.name" + + // GitHeadCommitterDate indicates the GIT head commit committer date. + GitHeadCommitterDate = "git.commit.head.committer.date" + + // GitHeadCommitterEmail indicates the GIT head commit committer email. + GitHeadCommitterEmail = "git.commit.head.committer.email" + + // GitHeadCommitterName indicates the GIT head commit committer name. + GitHeadCommitterName = "git.commit.head.committer.name" // GitPrBaseCommit indicates the GIT PR base commit hash. GitPrBaseCommit = "git.pull_request.base_branch_sha" + // GitPrBaseHeadCommit indicates the GIT PR base branch head commit hash. + GitPrBaseHeadCommit = "git.pull_request.base_branch_head_sha" + // GitPrBaseBranch indicates the GIT PR base branch name. GitPrBaseBranch = "git.pull_request.base_branch" + + // PrNumber indicates the pull request number. + PrNumber = "pr.number" ) diff --git a/internal/civisibility/constants/tags.go b/internal/civisibility/constants/tags.go index 0a6d690835..ba1499a2aa 100644 --- a/internal/civisibility/constants/tags.go +++ b/internal/civisibility/constants/tags.go @@ -33,6 +33,9 @@ const ( // ItrCorrelationIDTag defines the correlation ID for the intelligent test runner tag for the CI Visibility Protocol. // This constant is used to tag traces with the correlation ID for intelligent test runs. ItrCorrelationIDTag string = "itr_correlation_id" + + // UserProvidedTestServiceTag defines if the user provided the test service. + UserProvidedTestServiceTag string = "_dd.test.is_user_provided_service" ) // Coverage tags @@ -45,3 +48,24 @@ const ( // This constant is used to tag traces with the percentage of code lines covered during the test session. CodeCoveragePercentageOfTotalLines string = "test.code_coverage.lines_pct" ) + +// Capabilities +const ( + // LibraryCapabilitiesTestImpactAnalysis is a tag used to indicate the test impact analysis capability of the library. + LibraryCapabilitiesTestImpactAnalysis = "_dd.library_capabilities.test_impact_analysis" + + // LibraryCapabilitiesEarlyFlakeDetection is a tag used to indicate the early flake detection capability of the library. + LibraryCapabilitiesEarlyFlakeDetection = "_dd.library_capabilities.early_flake_detection" + + // LibraryCapabilitiesAutoTestRetries is a tag used to indicate the auto test retries capability of the library. + LibraryCapabilitiesAutoTestRetries = "_dd.library_capabilities.auto_test_retries" + + // LibraryCapabilitiesTestManagementQuarantine is a tag used to indicate the quarantine capability of the library. + LibraryCapabilitiesTestManagementQuarantine = "_dd.library_capabilities.test_management.quarantine" + + // LibraryCapabilitiesTestManagementDisable is a tag used to indicate the disable capability of the library. + LibraryCapabilitiesTestManagementDisable = "_dd.library_capabilities.test_management.disable" + + // LibraryCapabilitiesTestManagementAttemptToFix is a tag used to indicate the attempt to fix capability of the library. + LibraryCapabilitiesTestManagementAttemptToFix = "_dd.library_capabilities.test_management.attempt_to_fix" +) diff --git a/internal/civisibility/constants/test_tags.go b/internal/civisibility/constants/test_tags.go index 7248d82450..cd8c40dcf3 100644 --- a/internal/civisibility/constants/test_tags.go +++ b/internal/civisibility/constants/test_tags.go @@ -78,8 +78,59 @@ const ( // This constant is used to tag test events that are part of a retry execution TestIsRetry = "test.is_retry" + // TestRetryReason indicates the reason for retrying the test + TestRetryReason = "test.retry_reason" + // TestEarlyFlakeDetectionRetryAborted indicates a retry abort reason by the early flake detection feature TestEarlyFlakeDetectionRetryAborted = "test.early_flake.abort_reason" + + // TestSkippedByITR indicates a test skipped by the ITR feature + TestSkippedByITR = "test.skipped_by_itr" + + // SkippedByITRReason indicates the reason why the test was skipped by the ITR feature + SkippedByITRReason = "Skipped by Datadog Intelligent Test Runner" + + // ITRTestsSkipped indicates that tests were skipped by the ITR feature + ITRTestsSkipped = "_dd.ci.itr.tests_skipped" + + // ITRTestsSkippingEnabled indicates that the ITR test skipping feature is enabled + ITRTestsSkippingEnabled = "test.itr.tests_skipping.enabled" + + // ITRTestsSkippingType indicates the type of ITR test skipping + ITRTestsSkippingType = "test.itr.tests_skipping.type" + + // ITRTestsSkippingCount indicates the number of tests skipped by the ITR feature + ITRTestsSkippingCount = "test.itr.tests_skipping.count" + + // CodeCoverageEnabled indicates that code coverage is enabled + CodeCoverageEnabled = "test.code_coverage.enabled" + + // TestUnskippable indicates that the test is unskippable + TestUnskippable = "test.itr.unskippable" + + // TestForcedToRun indicates that the test is forced to run because is unskippable + TestForcedToRun = "test.itr.forced_run" + + // TestIsQuarantined indicates that the test is quarantined + TestIsQuarantined = "test.test_management.is_quarantined" + + // TestIsDisabled indicates that the test is disabled + TestIsDisabled = "test.test_management.is_test_disabled" + + // TestIsAttempToFix indicates that the test is an attempt to fix + TestIsAttempToFix = "test.test_management.is_attempt_to_fix" + + // TestHasFailedAllRetries indicates that the test has failed all retries + TestHasFailedAllRetries = "test.has_failed_all_retries" + + // TestAttemptToFixPassed indicates that the attempt to fix has passed + TestAttemptToFixPassed = "test.test_management.attempt_to_fix_passed" + + // TestManagementEnabled indicates that the test management feature is enabled + TestManagementEnabled = "test.test_management.enabled" + + // TestIsModified indicates that the test is modified + TestIsModified = "test.is_modified" ) // Define valid test status types. @@ -107,3 +158,23 @@ const ( // This constant is used to tag traces indicating that the type of test is a benchmark. TestTypeBenchmark = "benchmark" ) + +// Retry reasons +const ( + // AttemptToFixRetryReason indicates that the test is retried due to an attempt to fix. + AttemptToFixRetryReason = "attempt_to_fix" + + // EarlyFlakeDetectionRetryReason indicates that the test is retried due to early flake detection. + EarlyFlakeDetectionRetryReason = "early_flake_detection" + + // AutoTestRetriesRetryReason indicates that the test is retried due to auto test retries. + AutoTestRetriesRetryReason = "auto_test_retry" + + // ExternalRetryReason indicates that the test is retried due to an external reason. + ExternalRetryReason = "external" +) + +const ( + // TestDisabledSkipReason indicates the skip reason for a test that is disabled. + TestDisabledSkipReason = "Flaky test is disabled by Datadog" +) diff --git a/internal/civisibility/docs/SUBTEST_FEATURE_IMPLEMENTATION.md b/internal/civisibility/docs/SUBTEST_FEATURE_IMPLEMENTATION.md new file mode 100644 index 0000000000..2d8de82b28 --- /dev/null +++ b/internal/civisibility/docs/SUBTEST_FEATURE_IMPLEMENTATION.md @@ -0,0 +1,151 @@ +# Subtest Test Management & Retry Enablement + +## Goals + +- Honour Datadog Test Management directives (disable, quarantine, attempt-to-fix) for Go + subtests created with `t.Run`. +- Allow subtests to orchestrate their own retry loops while keeping parent behaviour intact. +- Preserve existing semantics for flaky retries, coverage, logging, telemetry, and testify support. +- Provide deterministic integration tests that exercise the parent/subtest matrix. + +This document walks through the implementation added since commit +`a722e23890a1f7306af5ac6bf9060e4846dbb895`, highlighting how the new pieces work together and the +nuances reviewers should keep in mind. + +## Architecture Overview + +The feature builds on three pillars: + +1. **Identity plumbing** – every test/subtest now has a `testIdentity` with module, suite, base name, + full name, and hierarchical segments (see `newTestIdentity`). This identity is threaded through + `applyAdditionalFeaturesToTestFunc`, the orchestrion wrapper, and tests so configuration lookups + can fall back to parent segments when a subtest lacks explicit settings. + +2. **Enhanced instrumentation** – `applyAdditionalFeaturesToTestFunc` and + `instrumentTestingTFunc` gained subtest-aware logic. Parents still own global wrappers, but + subtests may now wrap themselves when the feature flag (`DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED`) is + on and an exact directive exists. Attempt-to-fix orchestration honours a single “owner” to avoid + double retries. + +3. **Scenario harness** – the new `integrations/gotesting/subtests` package spins up a mock backend + and walks through the parent/subtest matrix. Each scenario asserts span counts and tags, including + retry telemetry (`test.is_retry`, `test.retry_reason`), so regressions surface immediately. + +## Feature Gating & Settings Bootstrap + +- `integrations/civisibility_features.go` honours `DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED` so + environments can opt into subtest directives explicitly. +- `ciSettings.SubtestFeaturesEnabled` guards *every* subtest-specific branch. When the flag is off, + behaviour is identical to pre-feature builds. + +## Identity & Management Lookup + +- `integrations/gotesting/testing.go` + - Introduces `testIdentity` and `newTestIdentity`. Segments allow lookups like + `TestParent/Sub1/Sub2`, falling back to `TestParent/Sub1`, then `TestParent`. + - `commonInfo` now carries a pointer to the identity so wrappers can reuse it. + - Internal test/benchmark instrumentation stores the identity and threads it into + `applyAdditionalFeaturesToTestFunc`. +- `getTestManagementData` returns both the matched properties and `matchKind` + (`Exact`, `Ancestor`, or `None`) so subtests can tell whether they should run the additional + wrapper or inherit parent behaviour. +- The subtest matrix exercises identity matching directly; no extra test-only helpers are required. + +## Instrumentation Enhancements + +### `applyAdditionalFeaturesToTestFunc` + +- Accepts an optional `parentExecMeta` so subtests know if their parent already owns attempt-to-fix + retries. +- Builds a metadata struct with explicit flags (`hasExplicitAttemptToFix`, etc.) and the match kind. +- For subtests: + - Requires the feature flag plus an **exact** match before wrapping. + - Disables EFD/flaky auto retries to avoid double wrapping. + - Only orchestrates attempt-to-fix locally if the subtest explicitly asked for it and the parent + isn’t already handling retries. +- During execution: + - Propagates explicit directives before OR-ing inherited values, ensuring targeted overrides win. + - Emits debug logs to help trace scenario execution when verbose logging is enabled. + - Only the orchestrator in charge emits attempt-to-fix retry logs and success tags. + +### `instrumentation_orchestrion.go` + +- On entry, computes the subtest identity and inspects parent metadata when available. +- Short-circuits in two cases: + - Feature flag disabled or no directives present (harness mode short-circuits to defer to the scenario driver). + - Parent already handles everything (legacy behaviour). +- For subtests needing instrumentation: + - Calls `applyAdditionalFeaturesToTestFunc` with parent metadata so ownership stays consistent. + - Handles panic, fail, skip, and pass paths, tagging attempt-to-fix success/failure and retry + exhaustion where appropriate. + - Writes verbose debug messages when debug logging is enabled to aid troubleshooting. + +## Attempt-to-Fix Ownership Rules + +1. **Parent only** – Parent orchestrates retries, subtests inherit attempt-to-fix tagging but never + claim success. Child spans have `test.is_retry=false`. +2. **Subtest only** – Parent remains neutral, child wraps itself and emits retry spans. +3. **Parent & subtest** – Parent wins; child spans show attempt-to-fix tagging with zero retry tags, + ensuring telemetry is counted once. +4. **Parent quarantine + attempt-to-fix** – When the parent carries both directives it remains the + retry owner; children inherit the quarantine tag but do not emit retry spans. A quarantined parent + without attempt-to-fix leaves subtests free to orchestrate their own retries if requested. + +These rules are codified in `parentAttemptFixScenario`, +`subAttemptFixOnlyScenario`, `parentAndSubAttemptFixScenario`, and +`parentQuarantinedAttemptFixScenario`. + +## Scenario Harness (`integrations/gotesting/subtests`) + +- `TestMain` iterates scenarios by spawning subprocesses to keep environment state isolated. +- `startSubtestServer` mimics Datadog APIs (settings, test-management, logs, git endpoints). Every + branch is commented and safe under the sandbox. +- Each scenario uses `scenarioContext` helpers to build a mock payload, including parent and subtest + directives. +- `subtestcontroller_test.go` validates: + - Span counts per resource. + - Passage/failure status tags. + - Attempt-to-fix telemetry (`test.is_retry`, `test.retry_reason`, `test.test_management.attempt_to_fix_passed`). + - Quarantine/disable tags for parent/child combinations. + - Parallel subtests (`SubAttemptFixParallel`) behave identically to sequential ones. +- Debug logging provides detailed trace output, including identity matches, + retry decisions, and span metadata. + +### Scenarios Covered + +- Baseline (no directives) +- `sub_disabled` +- `sub_quarantined` +- `parent_quarantined` +- `parent_quarantined_attempt_to_fix` +- `parent_attempt_to_fix` +- `sub_attempt_to_fix_only` +- `sub_attempt_to_fix_custom_retries` +- `sub_attempt_to_fix_parallel` +- `parent_and_sub_attempt_to_fix` + +Each scenario is thoroughly documented inline so future contributors can extend the matrix. + +## Testing Metadata & Utilities + +- Subtest scenarios interact with the existing instrumentation helpers (`propagateTestExecutionMetadataFlags`, + `setTestTagsFromExecutionMetadata`, etc.), demonstrating metadata propagation without introducing additional + white-box-only harnesses. +- Ancestor fallback is exercised through the `subtests` matrix scenarios, removing the need for exported helper wrappers and keeping white-box tests out of the hot path. + +## Feature Flags & Environment Variables + +- `DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED` – enable subtest-specific behaviour. +- `CIVisibilityTestManagementAttemptToFixRetries` – global attempt-to-fix retry budget (already + supported but exercised by new scenarios). + +## Summary + +- Subtests now honour Datadog Test Management directives without breaking parent behaviour, testify + support, or legacy flows. +- Attempt-to-fix orchestration chooses a single owner (parent by default) to prevent double retries + and conflicting telemetry. +- The integration harness thoroughly exercises the directive matrix, including parallel subtests, + custom retry budgets, and quarantine inheritance. +- Extensive inline documentation across instrumentation and tests explains each branch and decision, + easing PR review and future maintenance. diff --git a/internal/civisibility/integrations/civisibility.go b/internal/civisibility/integrations/civisibility.go index aca1d2e5ee..28f238fcd1 100644 --- a/internal/civisibility/integrations/civisibility.go +++ b/internal/civisibility/integrations/civisibility.go @@ -13,12 +13,16 @@ import ( "sync" "syscall" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/logs" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) // ciVisibilityCloseAction defines an action to be executed when CI visibility is closing. @@ -49,6 +53,8 @@ func EnsureCiVisibilityInitialization() { // InitializeCIVisibilityMock initialize the mocktracer for CI Visibility usage func InitializeCIVisibilityMock() mocktracer.Tracer { internalCiVisibilityInitialization(func([]tracer.StartOption) { + // Set the library to test mode + civisibility.SetTestMode() // Initialize the mocktracer mTracer = mocktracer.Start() }) @@ -57,9 +63,12 @@ func InitializeCIVisibilityMock() mocktracer.Tracer { func internalCiVisibilityInitialization(tracerInitializer func([]tracer.StartOption)) { ciVisibilityInitializationOnce.Do(func() { + civisibility.SetState(civisibility.StateInitializing) + defer civisibility.SetState(civisibility.StateInitialized) + // check the debug flag to enable debug logs. The tracer initialization happens // after the CI Visibility initialization so we need to handle this flag ourselves - if internal.BoolEnv("DD_TRACE_DEBUG", false) { + if enabled, _, _ := stableconfig.Bool("DD_TRACE_DEBUG", false); enabled { log.SetLevel(log.LevelDebug) } @@ -80,7 +89,7 @@ func internalCiVisibilityInitialization(tracerInitializer func([]tracer.StartOpt // Check if DD_SERVICE has been set; otherwise default to the repo name (from the spec). var opts []tracer.StartOption - serviceName := os.Getenv("DD_SERVICE") + serviceName := env.Get("DD_SERVICE") if serviceName == "" { if repoURL, ok := ciTags[constants.GitRepositoryURL]; ok { // regex to sanitize the repository url to be used as a service name @@ -101,6 +110,14 @@ func internalCiVisibilityInitialization(tracerInitializer func([]tracer.StartOpt log.Debug("civisibility: initializing tracer") tracerInitializer(opts) + // Initialize the logs + if logs.IsEnabled() { + log.Debug("civisibility: initializing logs for service: %s", serviceName) + logs.Initialize(serviceName) + } else { + log.Debug("civisibility: logs are disabled") + } + // Handle SIGINT and SIGTERM signals to ensure we close all open spans and flush the tracer before exiting signals := make(chan os.Signal, 1) signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM) @@ -121,15 +138,24 @@ func PushCiVisibilityCloseAction(action ciVisibilityCloseAction) { // ExitCiVisibility executes all registered close actions and stops the tracer. func ExitCiVisibility() { + if civisibility.GetState() != civisibility.StateInitialized { + log.Debug("civisibility: already closed or not initialized") + return + } + + civisibility.SetState(civisibility.StateExiting) + defer civisibility.SetState(civisibility.StateExited) log.Debug("civisibility: exiting") closeActionsMutex.Lock() defer closeActionsMutex.Unlock() defer func() { closeActions = []ciVisibilityCloseAction{} - + log.Debug("civisibility: flushing and stopping the logger") + logs.Stop() log.Debug("civisibility: flushing and stopping tracer") tracer.Flush() tracer.Stop() + telemetry.StopApp() log.Debug("civisibility: done.") }() for _, v := range closeActions { diff --git a/internal/civisibility/integrations/civisibility_features.go b/internal/civisibility/integrations/civisibility_features.go index 31f1bff760..0fa909421a 100644 --- a/internal/civisibility/integrations/civisibility_features.go +++ b/internal/civisibility/integrations/civisibility_features.go @@ -11,11 +11,12 @@ import ( "slices" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils/net" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/impactedtests" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const ( @@ -39,6 +40,9 @@ type ( ) var ( + // settingsInitializationOnce ensures we do the settings initialization just once + settingsInitializationOnce sync.Once + // additionalFeaturesInitializationOnce ensures we do the additional features initialization just once additionalFeaturesInitializationOnce sync.Once @@ -48,17 +52,26 @@ var ( // ciVisibilitySettings contains the CI Visibility settings for this session ciVisibilitySettings net.SettingsResponseData - // ciVisibilityEarlyFlakyDetectionSettings contains the CI Visibility Early Flake Detection data for this session - ciVisibilityEarlyFlakyDetectionSettings net.EfdResponseData + // ciVisibilityKnownTests contains the CI Visibility Known Tests data for this session + ciVisibilityKnownTests net.KnownTestsResponseData // ciVisibilityFlakyRetriesSettings contains the CI Visibility Flaky Retries settings for this session ciVisibilityFlakyRetriesSettings FlakyRetriesSetting + + // ciVisibilitySkippables contains the CI Visibility skippable tests for this session + ciVisibilitySkippables map[string]map[string][]net.SkippableResponseDataAttributes + + // ciVisibilityTestManagementTests contains the CI Visibility test management tests for this session + ciVisibilityTestManagementTests net.TestManagementTestsResponseDataModules + + // ciVisibilityImpactedTestsAnalyzer contains the CI Visibility impacted tests analyzer + ciVisibilityImpactedTestsAnalyzer *impactedtests.ImpactedTestAnalyzer ) -// ensureAdditionalFeaturesInitialization initialize all the additional features -func ensureAdditionalFeaturesInitialization(serviceName string) { - additionalFeaturesInitializationOnce.Do(func() { - log.Debug("civisibility: initializing additional features") +func ensureSettingsInitialization(serviceName string) { + settingsInitializationOnce.Do(func() { + log.Debug("civisibility: initializing settings") + defer log.Debug("civisibility: settings initialization complete") // Create the CI Visibility client ciVisibilityClient = net.NewClientWithServiceName(serviceName) @@ -72,31 +85,79 @@ func ensureAdditionalFeaturesInitialization(serviceName string) { go func() { bytes, err := uploadRepositoryChanges() if err != nil { - log.Error("civisibility: error uploading repository changes: %v", err) + log.Error("civisibility: error uploading repository changes: %s", err.Error()) } else { - log.Debug("civisibility: uploaded %v bytes in pack files", bytes) + log.Debug("civisibility: uploaded %d bytes in pack files", bytes) } uploadChannel <- struct{}{} }() // Get the CI Visibility settings payload for this test session ciSettings, err := ciVisibilityClient.GetSettings() - if err != nil { - log.Error("civisibility: error getting CI visibility settings: %v", err) - } else if ciSettings != nil { - ciVisibilitySettings = *ciSettings + if err != nil || ciSettings == nil { + log.Error("civisibility: error getting CI visibility settings: %s", err.Error()) + log.Debug("civisibility: no need to wait for the git upload to finish") + // Enqueue a close action to wait for the upload to finish before finishing the process + PushCiVisibilityCloseAction(func() { + <-uploadChannel + }) + return } // check if we need to wait for the upload to finish and repeat the settings request or we can just continue - if ciVisibilitySettings.RequireGit { + if ciSettings.RequireGit { log.Debug("civisibility: waiting for the git upload to finish and repeating the settings request") <-uploadChannel ciSettings, err = ciVisibilityClient.GetSettings() if err != nil { - log.Error("civisibility: error getting CI visibility settings: %v", err) - } else if ciSettings != nil { - ciVisibilitySettings = *ciSettings + log.Error("civisibility: error getting CI visibility settings: %s", err.Error()) + return } + } + + // check if we need to disable EFD because known tests is not enabled + if !ciSettings.KnownTestsEnabled { + // "known_tests_enabled" parameter works as a kill-switch for EFD, so if “known_tests_enabled” is false it + // will disable EFD even if “early_flake_detection.enabled” is set to true (which should not happen normally, + // the backend should disable both of them in that case) + ciSettings.EarlyFlakeDetection.Enabled = false + } + + // check if flaky test retries is disabled by env-vars + if ciSettings.FlakyTestRetriesEnabled && !internal.BoolEnv(constants.CIVisibilityFlakyRetryEnabledEnvironmentVariable, true) { + log.Warn("civisibility: flaky test retries was disabled by the environment variable") + ciSettings.FlakyTestRetriesEnabled = false + } + + // check if impacted tests is disabled by env-vars + if ciSettings.ImpactedTestsEnabled && !internal.BoolEnv(constants.CIVisibilityImpactedTestsDetectionEnabled, true) { + log.Warn("civisibility: impacted tests was disabled by the environment variable") + ciSettings.ImpactedTestsEnabled = false + } + + // check if test management is disabled by env-vars + if ciSettings.TestManagement.Enabled && !internal.BoolEnv(constants.CIVisibilityTestManagementEnabledEnvironmentVariable, true) { + log.Warn("civisibility: test management was disabled by the environment variable") + ciSettings.TestManagement.Enabled = false + } + + // overwrite the test management attempt to fix retries with the env var if set + testManagementAttemptToFixRetriesEnv := internal.IntEnv(constants.CIVisibilityTestManagementAttemptToFixRetriesEnvironmentVariable, -1) + if testManagementAttemptToFixRetriesEnv != -1 { + ciSettings.TestManagement.AttemptToFixRetries = testManagementAttemptToFixRetriesEnv + } + + // determine if subtest-specific features are enabled via environment variables + subtestFeaturesEnabled := internal.BoolEnv(constants.CIVisibilitySubtestFeaturesEnabled, true) + if !subtestFeaturesEnabled { + log.Debug("civisibility: subtest test management features disabled by environment variable") + } + ciSettings.SubtestFeaturesEnabled = subtestFeaturesEnabled + + // check if we need to wait for the upload to finish before continuing + if ciSettings.ImpactedTestsEnabled { + log.Debug("civisibility: impacted tests is enabled we need to wait for the upload to finish (for the unshallow process)") + <-uploadChannel } else { log.Debug("civisibility: no need to wait for the git upload to finish") // Enqueue a close action to wait for the upload to finish before finishing the process @@ -105,49 +166,152 @@ func ensureAdditionalFeaturesInitialization(serviceName string) { }) } - // if early flake detection is enabled then we run the early flake detection request - if ciVisibilitySettings.EarlyFlakeDetection.Enabled { - ciEfdData, err := ciVisibilityClient.GetEarlyFlakeDetectionData() - if err != nil { - log.Error("civisibility: error getting CI visibility early flake detection data: %v", err) - } else if ciEfdData != nil { - ciVisibilityEarlyFlakyDetectionSettings = *ciEfdData - log.Debug("civisibility: early flake detection data loaded.") + // set the ciVisibilitySettings with the settings from the backend + ciVisibilitySettings = *ciSettings + }) +} + +// ensureAdditionalFeaturesInitialization initialize all the additional features +func ensureAdditionalFeaturesInitialization(_ string) { + additionalFeaturesInitializationOnce.Do(func() { + log.Debug("civisibility: initializing additional features") + defer log.Debug("civisibility: additional features initialization complete") + + // get a copy of the settings instance + currentSettings := *GetSettings() + + // if there's no ciVisibilityClient then we don't need to do anything + if ciVisibilityClient == nil { + return + } + + // map to store the additional tags we want to add (Capabilities and CorrelationId) + additionalTags := make(map[string]string) + defer func() { + if len(additionalTags) > 0 { + log.Debug("civisibility: adding additional tags: %v", additionalTags) //nolint:gocritic // Map structure logging for debugging + utils.AddCITagsMap(additionalTags) } + }() + + // set the default values for the additional tags + additionalTags[constants.LibraryCapabilitiesEarlyFlakeDetection] = "1" + additionalTags[constants.LibraryCapabilitiesAutoTestRetries] = "1" + additionalTags[constants.LibraryCapabilitiesTestImpactAnalysis] = "1" + additionalTags[constants.LibraryCapabilitiesTestManagementQuarantine] = "1" + additionalTags[constants.LibraryCapabilitiesTestManagementDisable] = "1" + additionalTags[constants.LibraryCapabilitiesTestManagementAttemptToFix] = "5" + + // mutex to protect the additional tags map + var aTagsMutex sync.Mutex + // function to set additional tags locking with the mutex + setAdditionalTags := func(key string, value string) { + aTagsMutex.Lock() + defer aTagsMutex.Unlock() + additionalTags[key] = value } // if flaky test retries is enabled then let's load the flaky retries settings - if ciVisibilitySettings.FlakyTestRetriesEnabled { - flakyRetryEnabledByEnv := internal.BoolEnv(constants.CIVisibilityFlakyRetryEnabledEnvironmentVariable, true) - if flakyRetryEnabledByEnv { - totalRetriesCount := (int64)(internal.IntEnv(constants.CIVisibilityTotalFlakyRetryCountEnvironmentVariable, DefaultFlakyTotalRetryCount)) - retryCount := (int64)(internal.IntEnv(constants.CIVisibilityFlakyRetryCountEnvironmentVariable, DefaultFlakyRetryCount)) - ciVisibilityFlakyRetriesSettings = FlakyRetriesSetting{ - RetryCount: retryCount, - TotalRetryCount: totalRetriesCount, - RemainingTotalRetryCount: totalRetriesCount, - } - log.Debug("civisibility: automatic test retries enabled [retryCount: %v, totalRetryCount: %v]", retryCount, totalRetriesCount) - } else { - log.Warn("civisibility: flaky test retries was disabled by the environment variable") - ciVisibilitySettings.FlakyTestRetriesEnabled = false + if currentSettings.FlakyTestRetriesEnabled { + totalRetriesCount := (int64)(internal.IntEnv(constants.CIVisibilityTotalFlakyRetryCountEnvironmentVariable, DefaultFlakyTotalRetryCount)) + retryCount := (int64)(internal.IntEnv(constants.CIVisibilityFlakyRetryCountEnvironmentVariable, DefaultFlakyRetryCount)) + ciVisibilityFlakyRetriesSettings = FlakyRetriesSetting{ + RetryCount: retryCount, + TotalRetryCount: totalRetriesCount, + RemainingTotalRetryCount: totalRetriesCount, } + log.Debug("civisibility: automatic test retries enabled [retryCount: %d, totalRetryCount: %d]", retryCount, totalRetriesCount) } + + // wait group to wait for all the additional features to be loaded + var wg sync.WaitGroup + + // if early flake detection is enabled then we run the known tests request + if currentSettings.KnownTestsEnabled { + wg.Add(1) + go func() { + defer wg.Done() + ciEfdData, err := ciVisibilityClient.GetKnownTests() + if err != nil { + log.Error("civisibility: error getting CI visibility known tests data: %s", err.Error()) + } else if ciEfdData != nil { + ciVisibilityKnownTests = *ciEfdData + log.Debug("civisibility: known tests data loaded.") + } + }() + } + + // if ITR is enabled then we do the skippable tests request + if currentSettings.TestsSkipping { + wg.Add(1) + go func() { + defer wg.Done() + // get the skippable tests + correlationID, skippableTests, err := ciVisibilityClient.GetSkippableTests() + if err != nil { + log.Error("civisibility: error getting CI visibility skippable tests: %s", err.Error()) + } else if skippableTests != nil { + log.Debug("civisibility: skippable tests loaded: %d suites", len(skippableTests)) + setAdditionalTags(constants.ItrCorrelationIDTag, correlationID) + ciVisibilitySkippables = skippableTests + } + }() + } + + // if test management is enabled then we do the test management request + if currentSettings.TestManagement.Enabled { + wg.Add(1) + go func() { + defer wg.Done() + testManagementTests, err := ciVisibilityClient.GetTestManagementTests() + if err != nil { + log.Error("civisibility: error getting CI visibility test management tests: %s", err.Error()) + } else if testManagementTests != nil { + ciVisibilityTestManagementTests = *testManagementTests + log.Debug("civisibility: test management loaded [attemptToFixRetries: %d]", currentSettings.TestManagement.AttemptToFixRetries) + } + }() + } + + // if wheter the settings response or the env var is true we load the impacted tests analyzer + if currentSettings.ImpactedTestsEnabled { + wg.Add(1) + go func() { + defer wg.Done() + iTests, err := impactedtests.NewImpactedTestAnalyzer() + if err != nil { + log.Error("civisibility: error getting CI visibility impacted tests analyzer: %s", err.Error()) + } else { + ciVisibilityImpactedTestsAnalyzer = iTests + log.Debug("civisibility: impacted tests analyzer loaded") + } + }() + } + + // wait for all the additional features to be loaded + wg.Wait() }) } // GetSettings gets the settings from the backend settings endpoint func GetSettings() *net.SettingsResponseData { + // call to ensure the settings features initialization is completed (service name can be null here) + ensureSettingsInitialization("") + return &ciVisibilitySettings +} + +// GetKnownTests gets the known tests data +func GetKnownTests() *net.KnownTestsResponseData { // call to ensure the additional features initialization is completed (service name can be null here) ensureAdditionalFeaturesInitialization("") - return &ciVisibilitySettings + return &ciVisibilityKnownTests } -// GetEarlyFlakeDetectionSettings gets the early flake detection known tests data -func GetEarlyFlakeDetectionSettings() *net.EfdResponseData { +// GetTestManagementTestsData gets the test management tests data +func GetTestManagementTestsData() *net.TestManagementTestsResponseDataModules { // call to ensure the additional features initialization is completed (service name can be null here) ensureAdditionalFeaturesInitialization("") - return &ciVisibilityEarlyFlakyDetectionSettings + return &ciVisibilityTestManagementTests } // GetFlakyRetriesSettings gets the flaky retries settings @@ -157,11 +321,25 @@ func GetFlakyRetriesSettings() *FlakyRetriesSetting { return &ciVisibilityFlakyRetriesSettings } +// GetSkippableTests gets the skippable tests from the backend +func GetSkippableTests() map[string]map[string][]net.SkippableResponseDataAttributes { + // call to ensure the additional features initialization is completed (service name can be null here) + ensureAdditionalFeaturesInitialization("") + return ciVisibilitySkippables +} + +// GetImpactedTestsAnalyzer gets the impacted tests analyzer +func GetImpactedTestsAnalyzer() *impactedtests.ImpactedTestAnalyzer { + // call to ensure the additional features initialization is completed (service name can be null here) + ensureAdditionalFeaturesInitialization("") + return ciVisibilityImpactedTestsAnalyzer +} + func uploadRepositoryChanges() (bytes int64, err error) { // get the search commits response initialCommitData, err := getSearchCommits() if err != nil { - return 0, fmt.Errorf("civisibility: error getting the search commits response: %s", err.Error()) + return 0, fmt.Errorf("civisibility: error getting the search commits response: %s", err) } // let's check if we could retrieve commit data @@ -188,7 +366,7 @@ func uploadRepositoryChanges() (bytes int64, err error) { hasBeenUnshallowed, err := utils.UnshallowGitRepository() if err != nil || !hasBeenUnshallowed { if err != nil { - log.Warn(err.Error()) + log.Warn("%s", err.Error()) } // if unshallowing the repository failed or if there's nothing to unshallow then we try to upload the packfiles from // the initial commit data @@ -200,7 +378,7 @@ func uploadRepositoryChanges() (bytes int64, err error) { // after unshallowing the repository we need to get the search commits to calculate the missing commits again commitsData, err := getSearchCommits() if err != nil { - return 0, fmt.Errorf("civisibility: error getting the search commits response: %s", err.Error()) + return 0, fmt.Errorf("civisibility: error getting the search commits response: %s", err) } // let's check if we could retrieve commit data @@ -260,7 +438,7 @@ func sendObjectsPackFile(commitSha string, commitsToInclude []string, commitsToE } // send the pack files - log.Debug("civisibility: sending pack file with missing commits. files: %v", packFiles) + log.Debug("civisibility: sending pack file with missing commits. files: %v", packFiles) //nolint:gocritic // File list logging for debugging // try to remove the pack files after sending them defer func(files []string) { diff --git a/internal/civisibility/integrations/gotesting/coverage/coverage_payload.go b/internal/civisibility/integrations/gotesting/coverage/coverage_payload.go new file mode 100644 index 0000000000..44130a52b0 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/coverage_payload.go @@ -0,0 +1,189 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "bytes" + "encoding/binary" + "io" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/tinylib/msgp/msgp" +) + +// coveragePayload is a slim copy of the payload struct from the tracer package. +type coveragePayload struct { + // header specifies the first few bytes in the msgpack stream + // indicating the type of array (fixarray, array16 or array32) + // and the number of items contained in the stream. + header []byte + + // off specifies the current read position on the header. + off int + + // count specifies the number of items in the stream. + count int + + // buf holds the sequence of msgpack-encoded items. + buf bytes.Buffer + + // reader is used for reading the contents of buf. + reader *bytes.Reader + + // serializationTime time to do serialization + serializationTime time.Duration + + // mu is a mutex to protect concurrent access to the payload. + mu sync.RWMutex +} + +var _ io.Reader = (*coveragePayload)(nil) + +// newCoveragePayload returns a ready to use coverage payload. +func newCoveragePayload() *coveragePayload { + p := &coveragePayload{ + header: make([]byte, 8), + off: 8, + } + return p +} + +// push pushes a new item into the stream. +func (p *coveragePayload) push(testCoverageData *ciTestCoverageData) error { + p.mu.Lock() + defer p.mu.Unlock() + startTime := time.Now() + defer func() { + p.serializationTime += time.Since(startTime) + }() + p.buf.Grow(testCoverageData.Msgsize()) + if err := msgp.Encode(&p.buf, testCoverageData); err != nil { + return err + } + p.count = p.count + 1 + p.updateHeader() + return nil +} + +// itemCount returns the number of items available in the srteam. +func (p *coveragePayload) itemCount() int { + p.mu.RLock() + defer p.mu.RUnlock() + return p.count +} + +// size returns the payload size in bytes. After the first read the value becomes +// inaccurate by up to 8 bytes. +func (p *coveragePayload) size() int { + p.mu.RLock() + defer p.mu.RUnlock() + return p.buf.Len() + len(p.header) - p.off +} + +// reset sets up the payload to be read a second time. It maintains the +// underlying byte contents of the buffer. reset should not be used in order to +// reuse the payload for another set of traces. +func (p *coveragePayload) reset() { + p.mu.Lock() + defer p.mu.Unlock() + p.updateHeader() + if p.reader != nil { + p.reader.Seek(0, 0) + } +} + +// clear empties the payload buffers. +func (p *coveragePayload) clear() { + p.mu.Lock() + defer p.mu.Unlock() + p.buf = bytes.Buffer{} + p.reader = nil +} + +// https://github.com/msgpack/msgpack/blob/master/spec.md#array-format-family +const ( + msgpackArrayFix byte = 144 // up to 15 items + msgpackArray16 = 0xdc // up to 2^16-1 items, followed by size in 2 bytes + msgpackArray32 = 0xdd // up to 2^32-1 items, followed by size in 4 bytes +) + +// updateHeader updates the payload header based on the number of items currently +// present in the stream. +func (p *coveragePayload) updateHeader() { + n := uint64(p.count) + switch { + case n <= 15: + p.header[7] = msgpackArrayFix + byte(n) + p.off = 7 + case n <= 1<<16-1: + binary.BigEndian.PutUint64(p.header, n) // writes 2 bytes + p.header[5] = msgpackArray16 + p.off = 5 + default: // n <= 1<<32-1 + binary.BigEndian.PutUint64(p.header, n) // writes 4 bytes + p.header[3] = msgpackArray32 + p.off = 3 + } +} + +// Close implements io.Closer +func (p *coveragePayload) Close() error { + return nil +} + +// Read implements io.Reader. It reads from the msgpack-encoded stream. +func (p *coveragePayload) Read(b []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.off < len(p.header) { + // reading header + n = copy(b, p.header[p.off:]) + p.off += n + return n, nil + } + if p.reader == nil { + p.reader = bytes.NewReader(p.buf.Bytes()) + } + return p.reader.Read(b) +} + +// getBuffer retrieves the complete body of the CI Visibility coverage payload, including the header. +// It reads the current payload buffer, adds the header, and encodes the entire payload in MessagePack format. +// +// Returns: +// +// A pointer to a bytes.Buffer containing the encoded CI Visibility coverage payload. +// An error if reading from the buffer or encoding the payload fails. +func (p *coveragePayload) getBuffer() (*bytes.Buffer, error) { + startTime := time.Now() + log.Debug("coveragePayload: .getBuffer (count: %d)", p.itemCount()) + + // Create a buffer to read the current payload + payloadBuf := new(bytes.Buffer) + if _, err := payloadBuf.ReadFrom(p); err != nil { + return nil, err + } + + // Create the final coverage payload + finalPayload := &ciTestCovPayload{ + Version: 2, + Coverages: payloadBuf.Bytes(), + } + + // Create a new buffer to encode the coverage payload in MessagePack format + encodedBuf := new(bytes.Buffer) + if err := msgp.Encode(encodedBuf, finalPayload); err != nil { + return nil, err + } + + telemetry.EndpointPayloadBytes(telemetry.CodeCoverageEndpointType, float64(encodedBuf.Len())) + telemetry.EndpointPayloadEventsCount(telemetry.CodeCoverageEndpointType, float64(p.itemCount())) + telemetry.EndpointEventsSerializationMs(telemetry.CodeCoverageEndpointType, float64((p.serializationTime + time.Since(startTime)).Milliseconds())) + return encodedBuf, nil +} diff --git a/internal/civisibility/integrations/gotesting/coverage/coverage_payload_format.go b/internal/civisibility/integrations/gotesting/coverage/coverage_payload_format.go new file mode 100644 index 0000000000..fb16d9b14d --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/coverage_payload_format.go @@ -0,0 +1,67 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +//go:generate go run github.com/tinylib/msgp -unexported -marshal=false -o=test_coverage_msgp.go -tests=false + +package coverage + +import "github.com/tinylib/msgp/msgp" + +type ( + // ciTestCoveragePayloads represents a list of test code coverage payloads. + ciTestCoveragePayloads []*ciTestCovPayload + + // ciTestCoverages represents a list of test code coverage data. + ciTestCoverages []*ciTestCoverageData + + // ciTestCovPayload represents a test code coverage payload specifically designed for CI Visibility events. + ciTestCovPayload struct { + Version int32 `msg:"version"` // Version of the payload + Coverages msgp.Raw `msg:"coverages"` // list of coverages + } + + // ciTestCoverageData represents the coverage data for a single test. + ciTestCoverageData struct { + SessionID uint64 `msg:"test_session_id"` // identifier of this session + SuiteID uint64 `msg:"test_suite_id"` // identifier of the suite + SpanID uint64 `msg:"span_id"` // identifier of this test + Files []*ciTestCoverageFile `msg:"files"` // list of files covered + } + + // ciTestCoverageFile represents the coverage data for a single file. + ciTestCoverageFile struct { + FileName string `msg:"filename"` // name of the file + } +) + +var ( + _ msgp.Encodable = (*ciTestCoverageData)(nil) + _ msgp.Decodable = (*ciTestCoverageData)(nil) + + _ msgp.Encodable = (*ciTestCoverages)(nil) + _ msgp.Decodable = (*ciTestCoverages)(nil) + + _ msgp.Encodable = (*ciTestCovPayload)(nil) + _ msgp.Decodable = (*ciTestCoveragePayloads)(nil) +) + +// newCiTestCovPayload creates a new instance of ciTestCovPayload. +func newCiTestCoverageData(tCove *testCoverage) *ciTestCoverageData { + return &ciTestCoverageData{ + SessionID: tCove.sessionID, + SuiteID: tCove.suiteID, + SpanID: tCove.testID, + Files: newCiTestCoverageFiles(tCove.filesCovered), + } +} + +// newCiTestCoverageFiles creates a new instance of ciTestCoverageFile array. +func newCiTestCoverageFiles(files []string) []*ciTestCoverageFile { + ciFiles := make([]*ciTestCoverageFile, 0, len(files)) + for _, file := range files { + ciFiles = append(ciFiles, &ciTestCoverageFile{FileName: file}) + } + return ciFiles +} diff --git a/internal/civisibility/integrations/gotesting/coverage/coverage_payload_test.go b/internal/civisibility/integrations/gotesting/coverage/coverage_payload_test.go new file mode 100644 index 0000000000..9e7d45f6fa --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/coverage_payload_test.go @@ -0,0 +1,100 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "bytes" + "encoding/json" + "io" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/tinylib/msgp/msgp" +) + +func newCoverageData(n int) []*ciTestCoverageData { + list := make([]*ciTestCoverageData, n) + for i := 0; i < n; i++ { + cov := newCiTestCoverageData(NewTestCoverage(uint64(i), uint64(i), uint64(i), uint64(i), "").(*testCoverage)) + list[i] = cov + } + + return list +} + +// TestCoveragePayloadIntegrity tests that whatever we push into the payload +// allows us to read the same content as would have been encoded by +// the codec. +func TestCoveragePayloadIntegrity(t *testing.T) { + want := new(bytes.Buffer) + for _, n := range []int{10, 1 << 10, 1 << 17} { + t.Run(strconv.Itoa(n), func(t *testing.T) { + assert := assert.New(t) + p := newCoveragePayload() + var allEvents ciTestCoverages + + for i := 0; i < n; i++ { + list := newCoverageData(i%5 + 1) + allEvents = append(allEvents, list...) + for _, event := range list { + p.push(event) + } + } + + want.Reset() + err := msgp.Encode(want, allEvents) + assert.NoError(err) + assert.Equal(want.Len(), p.size()) + assert.Equal(p.itemCount(), len(allEvents)) + + got, err := io.ReadAll(p) + assert.NoError(err) + assert.Equal(want.Bytes(), got) + }) + } +} + +// TestCoveragePayloadDecode ensures that whatever we push into the payload can +// be decoded by the codec. +func TestCoveragePayloadDecode(t *testing.T) { + for _, n := range []int{10, 1 << 10} { + t.Run(strconv.Itoa(n), func(t *testing.T) { + assert := assert.New(t) + p := newCoveragePayload() + for i := 0; i < n; i++ { + list := newCoverageData(i%5 + 1) + for _, event := range list { + p.push(event) + } + } + var got ciTestCoverages + err := msgp.Decode(p, &got) + assert.NoError(err) + }) + } +} + +func TestCoveragePayloadEnvelope(t *testing.T) { + assert := assert.New(t) + p := newCoveragePayload() + encodedBuf, err := p.getBuffer() + assert.NoError(err) + + // Convert the message pack to json + jsonBuf := new(bytes.Buffer) + _, err = msgp.CopyToJSON(jsonBuf, encodedBuf) + assert.NoError(err) + + // Decode the json payload + var testCyclePayload ciTestCovPayload + err = json.Unmarshal(jsonBuf.Bytes(), &testCyclePayload) + assert.NoError(err) + + // Now let's assert the decoded envelope metadata + assert.Equal(testCyclePayload.Version, int32(2)) + assert.Empty(testCyclePayload.Coverages) +} diff --git a/internal/civisibility/integrations/gotesting/coverage/coverage_writer.go b/internal/civisibility/integrations/gotesting/coverage/coverage_writer.go new file mode 100644 index 0000000000..a2e3f1b763 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/coverage_writer.go @@ -0,0 +1,101 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// Constants defining the payload size limits for agentless mode. +const ( + // agentlessPayloadMaxLimit is the maximum payload size allowed, indicating the + // maximum size of the package that the intake can receive. + agentlessPayloadMaxLimit = 50 * 1024 * 1024 // 5 MB + + // agentlessPayloadSizeLimit specifies the maximum allowed size of the payload before + // it triggers a flush to the transport. + agentlessPayloadSizeLimit = agentlessPayloadMaxLimit / 2 + + // concurrentConnectionLimit specifies the maximum number of concurrent outgoing + // connections allowed. + concurrentConnectionLimit = 100 +) + +type coverageWriter struct { + client net.Client // http client + payload *coveragePayload // Encodes and buffers events in msgpack format. + climit chan struct{} // Limits the number of concurrent outgoing connections. + wg sync.WaitGroup // Waits for all uploads to finish. +} + +func newCoverageWriter() *coverageWriter { + log.Debug("coverageWriter: creating trace writer instance") + return &coverageWriter{ + client: net.NewClientForCodeCoverage(), + payload: newCoveragePayload(), + climit: make(chan struct{}, concurrentConnectionLimit), + } +} + +func (w *coverageWriter) add(coverage *testCoverage) { + telemetry.EventsEnqueueForSerialization() + ciTestCoverage := newCiTestCoverageData(coverage) + if err := w.payload.push(ciTestCoverage); err != nil { + log.Error("coverageWriter: Error encoding msgpack: %s", err.Error()) + } + if w.payload.size() > agentlessPayloadSizeLimit { + w.flush() + } +} + +func (w *coverageWriter) stop() { + log.Debug("coverageWriter: stopping writer") + w.flush() + w.wg.Wait() +} + +func (w *coverageWriter) flush() { + if w.payload.itemCount() == 0 { + return + } + + w.wg.Add(1) + w.climit <- struct{}{} + oldp := w.payload + w.payload = newCoveragePayload() + + go func(p *coveragePayload) { + defer func() { + // Once the payload has been used, clear the buffer for garbage + // collection to avoid a memory leak when references to this object + // may still be kept by faulty transport implementations or the + // standard library. See dd-trace-go#976 + p.clear() + + <-w.climit + w.wg.Done() + }() + + size, count := p.size(), p.itemCount() + log.Debug("coverageWriter: sending payload: size: %d events: %d\n", size, count) + + buf, err := p.getBuffer() + if err != nil { + log.Error("coverageWriter: failure getting coverage data: %s", err.Error()) + return + } + + telemetry.CodeCoverageFiles(float64(p.itemCount())) + err = w.client.SendCoveragePayload(buf) + if err != nil { + log.Error("coverageWriter: failure sending coverage data: %s", err.Error()) + } + }(oldp) +} diff --git a/internal/civisibility/integrations/gotesting/coverage/coverage_writer_test.go b/internal/civisibility/integrations/gotesting/coverage/coverage_writer_test.go new file mode 100644 index 0000000000..06568f35e6 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/coverage_writer_test.go @@ -0,0 +1,118 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "fmt" + "io" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/stretchr/testify/assert" +) + +func TestNewCoverageWriter(t *testing.T) { + writer := newCoverageWriter() + assert.NotNil(t, writer) + assert.NotNil(t, writer.client) + assert.NotNil(t, writer.payload) + assert.NotNil(t, writer.climit) +} + +func TestCoverageWriterAdd(t *testing.T) { + writer := newCoverageWriter() + coverage := &testCoverage{} + writer.add(coverage) + assert.Equal(t, writer.payload.itemCount(), 1) +} + +func TestCoverageWriterStop(t *testing.T) { + writer := newCoverageWriter() + coverage := &testCoverage{} + writer.add(coverage) + writer.stop() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +func TestCoverageWriterFlush(t *testing.T) { + writer := newCoverageWriter() + coverage := &testCoverage{} + writer.add(coverage) + writer.flush() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +func TestCoverageWriterConcurrentFlush(t *testing.T) { + writer := newCoverageWriter() + coverage := &testCoverage{} + + for i := 0; i < concurrentConnectionLimit+1; i++ { + writer.add(coverage) + } + writer.flush() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +func TestCoverageWriterFlushError(t *testing.T) { + writer := newCoverageWriter() + writer.client = &MockClient{SendCoveragePayloadFunc: func(_ io.Reader) error { + return fmt.Errorf("mock error") + }, + } + coverage := &testCoverage{} + writer.add(coverage) + writer.flush() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +// MockClient is a mock implementation of the Client interface for testing purposes. +type MockClient struct { + SendCoveragePayloadFunc func(ciTestCovPayload io.Reader) error + SendCoveragePayloadWithFormatFunc func(ciTestCovPayload io.Reader, format string) error + GetSettingsFunc func() (*net.SettingsResponseData, error) + GetKnownTestsFunc func() (*net.KnownTestsResponseData, error) + GetCommitsFunc func(localCommits []string) ([]string, error) + SendPackFilesFunc func(commitSha string, packFiles []string) (bytes int64, err error) + GetSkippableTestsFunc func() (correlationId string, skippables map[string]map[string][]net.SkippableResponseDataAttributes, err error) + GetTestManagementTestsFunc func() (*net.TestManagementTestsResponseDataModules, error) + SendLogsFunc func(logsPayload io.Reader) error +} + +func (m *MockClient) SendCoveragePayload(ciTestCovPayload io.Reader) error { + return m.SendCoveragePayloadFunc(ciTestCovPayload) +} + +func (m *MockClient) SendCoveragePayloadWithFormat(ciTestCovPayload io.Reader, format string) error { + return m.SendCoveragePayloadWithFormatFunc(ciTestCovPayload, format) +} + +func (m *MockClient) GetSettings() (*net.SettingsResponseData, error) { + return m.GetSettingsFunc() +} + +func (m *MockClient) GetKnownTests() (*net.KnownTestsResponseData, error) { + return m.GetKnownTestsFunc() +} + +func (m *MockClient) GetCommits(localCommits []string) ([]string, error) { + return m.GetCommitsFunc(localCommits) +} + +func (m *MockClient) SendPackFiles(commitSha string, packFiles []string) (bytes int64, err error) { + return m.SendPackFilesFunc(commitSha, packFiles) +} + +func (m *MockClient) GetSkippableTests() (_ string, _ map[string]map[string][]net.SkippableResponseDataAttributes, err error) { + return m.GetSkippableTestsFunc() +} + +func (m *MockClient) GetTestManagementTests() (*net.TestManagementTestsResponseDataModules, error) { + return m.GetTestManagementTestsFunc() +} + +func (m *MockClient) SendLogs(logsPayload io.Reader) error { + return m.SendLogsFunc(logsPayload) +} diff --git a/internal/civisibility/integrations/gotesting/coverage/reflections.go b/internal/civisibility/integrations/gotesting/coverage/reflections.go new file mode 100644 index 0000000000..e192afbf60 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/reflections.go @@ -0,0 +1,74 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "errors" + "reflect" + "unsafe" +) + +// testDepsCoverage is an interface to support runtime coverage initialization from the original testDeps testing interface +type testDepsCoverage interface { + InitRuntimeCoverage() (mode string, tearDown func(coverprofile string, gocoverdir string) (string, error), snapcov func() float64) +} + +// getFieldPointerFrom gets an unsafe.Pointer (gc-safe type of pointer) to a struct field +// useful to get or set values to private field +func getFieldPointerFrom(value any, fieldName string) (unsafe.Pointer, error) { + return getFieldPointerFromValue(reflect.Indirect(reflect.ValueOf(value)), fieldName) +} + +// getFieldPointerFromValue gets an unsafe.Pointer (gc-safe type of pointer) to a struct field +// useful to get or set values to private field +func getFieldPointerFromValue(value reflect.Value, fieldName string) (unsafe.Pointer, error) { + member := value.FieldByName(fieldName) + if member.IsValid() { + return unsafe.Pointer(member.UnsafeAddr()), nil + } + + return unsafe.Pointer(nil), errors.New("member is invalid") +} + +// getTestDepsCoverage gets the testDepsCoverage interface from a testing.M instance +func getTestDepsCoverage(m any) (testDepsCoverage, error) { + // let's first do some signature checks to avoid panics before calling the method + reflectDeps := reflect.ValueOf(m).Elem().FieldByName("deps") + reflectInitRuntimeCoverage := reflectDeps.MethodByName("InitRuntimeCoverage") + if !reflectInitRuntimeCoverage.IsValid() { + return nil, errors.New("InitRuntimeCoverage not found") + } + + reflectInitRuntimeCoverageType := reflectInitRuntimeCoverage.Type() + if reflectInitRuntimeCoverageType.NumIn() != 0 { + return nil, errors.New("InitRuntimeCoverage has arguments (this signature is not supported)") + } + if reflectInitRuntimeCoverageType.NumOut() != 3 { + return nil, errors.New("InitRuntimeCoverage has an unexpected number of return values") + } + if reflectInitRuntimeCoverageType.Out(0).String() != "string" { + return nil, errors.New("InitRuntimeCoverage has an unexpected return type") + } + if reflectInitRuntimeCoverageType.Out(1).String() != "func(string, string) (string, error)" { + return nil, errors.New("InitRuntimeCoverage has an unexpected return type") + } + if reflectInitRuntimeCoverageType.Out(2).String() != "func() float64" { + return nil, errors.New("InitRuntimeCoverage has an unexpected return type") + } + + // now we can safely call the method + ptr, err := getFieldPointerFrom(m, "deps") + if err != nil { + return nil, err + } + + if ptr == nil { + return nil, errors.New("testDepsCoverage not found") + } + + tDepValue := reflect.NewAt(reflect.TypeFor[testDepsCoverage](), ptr) + return tDepValue.Elem().Interface().(testDepsCoverage), nil +} diff --git a/internal/civisibility/integrations/gotesting/coverage/reflections_test.go b/internal/civisibility/integrations/gotesting/coverage/reflections_test.go new file mode 100644 index 0000000000..500fb49101 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/reflections_test.go @@ -0,0 +1,112 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "reflect" + "testing" +) + +// testStruct is a struct with private and public fields for testing +type testStruct struct { + publicField int + privateField string +} + +// mockDeps simulates the 'deps' field with the 'InitRuntimeCoverage' method +type mockDeps struct{} + +func (m *mockDeps) InitRuntimeCoverage() (string, func(string, string) (string, error), func() float64) { + return "test-mode", func(_, _ string) (string, error) { return "tearDownResult", nil }, func() float64 { return 42.0 } +} + +// Ensure mockDeps implements testDepsCoverage +var _ testDepsCoverage = &mockDeps{} + +// mockM simulates a testing.M struct with a 'deps' field +type mockM struct { + deps testDepsCoverage +} + +func TestGetFieldPointerFrom(t *testing.T) { + s := testStruct{ + publicField: 42, + privateField: "secret", + } + + ptr, err := getFieldPointerFrom(&s, "privateField") + if err != nil { + t.Fatalf("getFieldPointerFrom failed: %v", err) + } + if ptr == nil { + t.Fatal("getFieldPointerFrom returned nil pointer") + } + + // Convert the unsafe pointer to a *string + strPtr := (*string)(ptr) + if *strPtr != "secret" { + t.Errorf("Expected 'secret', got '%s'", *strPtr) + } + + // Modify the value via the pointer + *strPtr = "modified" + if s.privateField != "modified" { + t.Errorf("Expected 'modified', got '%s'", s.privateField) + } +} + +func TestGetFieldPointerFromValue(t *testing.T) { + s := testStruct{ + publicField: 42, + privateField: "secret", + } + + value := reflect.ValueOf(&s).Elem() // Get the value of s + ptr, err := getFieldPointerFromValue(value, "privateField") + if err != nil { + t.Fatalf("getFieldPointerFromValue failed: %v", err) + } + if ptr == nil { + t.Fatal("getFieldPointerFromValue returned nil pointer") + } + + // Convert the unsafe pointer to a *string + strPtr := (*string)(ptr) + if *strPtr != "secret" { + t.Errorf("Expected 'secret', got '%s'", *strPtr) + } + + // Modify the value via the pointer + *strPtr = "modified" + if s.privateField != "modified" { + t.Errorf("Expected 'modified', got '%s'", s.privateField) + } +} + +func TestGetTestDepsCoverage(t *testing.T) { + m := &mockM{ + deps: &mockDeps{}, + } + + testDepsCov, err := getTestDepsCoverage(m) + if err != nil { + t.Fatalf("getTestDepsCoverage failed: %v", err) + } + if testDepsCov == nil { + t.Fatal("getTestDepsCoverage returned nil") + } + + mode, tearDown, snapcov := testDepsCov.InitRuntimeCoverage() + if mode != "test-mode" { + t.Errorf("Expected mode 'test-mode', got '%s'", mode) + } + if tearDown == nil { + t.Error("Expected non-nil tearDown function") + } + if snapcov == nil { + t.Error("Expected non-nil snapcov function") + } +} diff --git a/internal/civisibility/integrations/gotesting/coverage/test_coverage.go b/internal/civisibility/integrations/gotesting/coverage/test_coverage.go new file mode 100644 index 0000000000..58ade7afa8 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/test_coverage.go @@ -0,0 +1,449 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "bufio" + "fmt" + "os" + "os/exec" + "path/filepath" + "strconv" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const ( + // testFramework represents the name of the testing framework. + testFramework = "golang.org/pkg/testing" +) + +type ( + // TestCoverage is the interface for collecting test coverage. + TestCoverage interface { + // CollectCoverageBeforeTestExecution collects coverage before test execution. + CollectCoverageBeforeTestExecution() + // CollectCoverageAfterTestExecution collects coverage after test execution. + CollectCoverageAfterTestExecution() + } + + // testCoverage holds information about test coverage. + testCoverage struct { + sessionID uint64 + moduleID uint64 + suiteID uint64 + testID uint64 + testFile string + preCoverageFilename string + postCoverageFilename string + filesCovered []string + } + + // coverageData holds information about coverage data with their block + coverageData struct { + fileName string + blocks []coverageBlock + } + + // coverageBlock holds information about coverage block. + coverageBlock struct { + startLine int + startCol int + endLine int + endCol int + numStmt int + count int + } +) + +var _ TestCoverage = (*testCoverage)(nil) + +var ( + // mode is the coverage mode. + mode string + // tearDown is the function to write the coverage counters to the file. + tearDown func(coverprofile string, gocoverdir string) (string, error) + + // covWriter is the coverage writer for sending test coverage data to the backend. + covWriter *coverageWriter + + // temporaryDir is the temporary directory to store coverage files. + temporaryDir string + // modulePath is the module path. + modulePath string + // moduleDir is the module directory. + moduleDir string +) + +// InitializeCoverage initializes the runtime coverage. +func InitializeCoverage(m *testing.M) { + log.Debug("civisibility.cov: initializing runtime coverage") + testDep, err := getTestDepsCoverage(m) + if err != nil || testDep == nil { + log.Debug("civisibility.cov: error initializing runtime coverage: %s", err.Error()) + return + } + + // initializing runtime coverage + tMode, tDown, _ := testDep.InitRuntimeCoverage() + mode = tMode + tearDown = func(coverprofile string, gocoverdir string) (string, error) { + // writing the coverage counters to the file + return tDown(coverprofile, gocoverdir) + } + + // if we cannot collect we bailout early + if !CanCollect() { + return + } + + // initializing coverage writer + covWriter = newCoverageWriter() + integrations.PushCiVisibilityCloseAction(func() { + covWriter.stop() + }) + + // create a temporary directory to store coverage files + temporaryDir, err = os.MkdirTemp("", "coverage") + if err != nil { + log.Debug("civisibility.cov: error creating temporary directory: %s", err.Error()) + } else { + log.Debug("civisibility.cov: temporary coverage directory created: %s", temporaryDir) + } + integrations.PushCiVisibilityCloseAction(func() { + _ = os.RemoveAll(temporaryDir) + }) + + // executing go list -f '{{.Module.Path}};{{.Module.Dir}}' to get the module path and module dir + stdOut, err := exec.Command("go", "list", "-f", "{{.Module.Path}};{{.Module.Dir}}").CombinedOutput() + if err != nil { + log.Debug("civisibility.cov: error getting module path and module dir: %s", err.Error()) + } else { + parts := strings.Split(string(stdOut), ";") + if len(parts) == 2 { + modulePath = strings.TrimSpace(parts[0]) + moduleDir = strings.TrimSpace(parts[1]) + } + } +} + +// CanCollect returns whether coverage can be collected. +func CanCollect() bool { + return mode == "count" || mode == "atomic" +} + +// GetCoverage returns the total coverage percentage for the test package +func GetCoverage() float64 { + if !CanCollect() { + return 0 + } + + coverageFile := filepath.Join(temporaryDir, "global_coverage.out") + _, err := tearDown(coverageFile, "") + if err != nil { + log.Debug("civisibility.cov: error getting coverage file: %s", err.Error()) + } + + defer func(cFile string) { + err = os.Remove(cFile) + if err != nil { + log.Debug("civisibility.cov: error removing coverage file: %s", err.Error()) + } + }(coverageFile) + + totalStatements, coveredStatements, err := getCoverageStatementsInfo(coverageFile) + if err != nil { + log.Debug("civisibility.cov: error parsing coverage file: %s", err.Error()) + } + + if totalStatements == 0 { + return 0 + } + + return float64(coveredStatements) / float64(totalStatements) +} + +// NewTestCoverage creates a new test coverage. +func NewTestCoverage(sessionID, moduleID, suiteID, testID uint64, testFile string) TestCoverage { + testFile = utils.GetRelativePathFromCITagsSourceRoot(testFile) + return &testCoverage{ + sessionID: sessionID, + moduleID: moduleID, + suiteID: suiteID, + testID: testID, + testFile: testFile, + } +} + +// CollectCoverageBeforeTestExecution collects coverage before test execution. +func (t *testCoverage) CollectCoverageBeforeTestExecution() { + if !CanCollect() { + return + } + + t.preCoverageFilename = filepath.Join(temporaryDir, fmt.Sprintf("%d-%d-%d-pre.out", t.moduleID, t.suiteID, t.testID)) + _, err := tearDown(t.preCoverageFilename, "") + if err != nil { + log.Debug("civisibility.cov: error getting coverage file: %s", err.Error()) + telemetry.CodeCoverageErrors() + } else { + telemetry.CodeCoverageStarted(testFramework, telemetry.DefaultCoverageLibraryType) + } +} + +// CollectCoverageAfterTestExecution collects coverage after test execution. +func (t *testCoverage) CollectCoverageAfterTestExecution() { + if !CanCollect() { + return + } + + if t.getCoverageData() != nil { + return + } + + var pChannel = make(chan struct{}) + integrations.PushCiVisibilityCloseAction(func() { + <-pChannel + }) + go func() { + t.processCoverageData() + pChannel <- struct{}{} + }() +} + +// getCoverageData gets the coverage data. +func (t *testCoverage) getCoverageData() error { + t.postCoverageFilename = filepath.Join(temporaryDir, fmt.Sprintf("%d-%d-%d-post.out", t.moduleID, t.suiteID, t.testID)) + _, err := tearDown(t.postCoverageFilename, "") + if err != nil { + log.Debug("civisibility.cov: error getting coverage file: %s", err.Error()) + telemetry.CodeCoverageErrors() + } + + return err +} + +// processCoverageData processes the coverage data. +func (t *testCoverage) processCoverageData() { + if t.preCoverageFilename == "" || + t.postCoverageFilename == "" || + t.preCoverageFilename == t.postCoverageFilename { + log.Debug("civisibility.cov: no coverage data to process") + telemetry.CodeCoverageErrors() + return + } + preCoverage, err := parseCoverProfile(t.preCoverageFilename) + if err != nil { + log.Debug("civisibility.cov: error parsing pre-coverage file: %s", err.Error()) + telemetry.CodeCoverageErrors() + return + } + postCoverage, err := parseCoverProfile(t.postCoverageFilename) + if err != nil { + log.Debug("civisibility.cov: error parsing post-coverage file: %s", err.Error()) + telemetry.CodeCoverageErrors() + return + } + + t.filesCovered = getFilesCovered(t.testFile, preCoverage, postCoverage) + telemetry.CodeCoverageFinished(testFramework, telemetry.DefaultCoverageLibraryType) + if len(t.filesCovered) == 0 { + telemetry.CodeCoverageIsEmpty() + } + + covWriter.add(t) + + err = os.Remove(t.preCoverageFilename) + if err != nil { + log.Debug("civisibility.cov: error removing pre-coverage file: %s", err.Error()) + } + + err = os.Remove(t.postCoverageFilename) + if err != nil { + log.Debug("civisibility.cov: error removing post-coverage file: %s", err.Error()) + } +} + +// parseCoverProfile parses the coverage profile data and returns the coverage data for each file +func parseCoverProfile(filename string) (map[string][]coverageBlock, error) { + file, err := os.Open(filename) + if err != nil { + return nil, err + } + defer file.Close() + + coverageData := make(map[string][]coverageBlock) + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + line := scanner.Text() + + // Skip the header + if strings.HasPrefix(line, "mode:") { + continue + } + + // Split the line into the file and block parts + parts := strings.SplitN(line, ":", 2) + if len(parts) < 2 { + continue + } + + fileName := parts[0] + blockInfo := parts[1] + + // Split the block info by space + infoParts := strings.Fields(blockInfo) + if len(infoParts) < 3 { + continue + } + + // Extract start and end positions (line.column) + startEnd := strings.Split(infoParts[0], ",") + if len(startEnd) < 2 { + continue + } + + startPos := strings.Split(startEnd[0], ".") + endPos := strings.Split(startEnd[1], ".") + + if len(startPos) < 2 || len(endPos) < 2 { + continue + } + + // Convert to integers + startLine, err1 := strconv.Atoi(startPos[0]) + startCol, err2 := strconv.Atoi(startPos[1]) + endLine, err3 := strconv.Atoi(endPos[0]) + endCol, err4 := strconv.Atoi(endPos[1]) + numStmt, err5 := strconv.Atoi(infoParts[1]) + count, err6 := strconv.Atoi(infoParts[2]) + + if err1 != nil || err2 != nil || err3 != nil || err4 != nil || err5 != nil || err6 != nil { + continue + } + + block := coverageBlock{ + startLine: startLine, + startCol: startCol, + endLine: endLine, + endCol: endCol, + numStmt: numStmt, + count: count, + } + + coverageData[fileName] = append(coverageData[fileName], block) + } + + return coverageData, scanner.Err() +} + +// getFilesCovered subtracts the before profile from the after profile and returns the files covered +func getFilesCovered(testFile string, before, after map[string][]coverageBlock) []string { + result := []string{testFile} + + for fileName, afterBlocks := range after { + if beforeBlocks, found := before[fileName]; found { + // Create a map for quick lookup by (startLine, startCol, endLine, endCol) + beforeMap := make(map[string]coverageBlock) + for _, block := range beforeBlocks { + key := fmt.Sprintf("%d.%d-%d.%d", block.startLine, block.startCol, block.endLine, block.endCol) + beforeMap[key] = block + } + + // Subtract each block in after from the corresponding block in before + for _, afterBlock := range afterBlocks { + key := fmt.Sprintf("%d.%d-%d.%d", afterBlock.startLine, afterBlock.startCol, afterBlock.endLine, afterBlock.endCol) + if beforeBlock, found := beforeMap[key]; found { + // Subtract hit counts + diffCount := afterBlock.count - beforeBlock.count + if diffCount > 0 { + result = append(result, getRelativePathFromCITagsSourceRootForCoverage(fileName)) + break + } + } else if afterBlock.count > 0 { + // If there's no matching block in before, add the whole block from after + result = append(result, getRelativePathFromCITagsSourceRootForCoverage(fileName)) + break + } + } + } else { + // If there's no before profile for this file, add the entire after profile + for _, afterBlock := range afterBlocks { + if afterBlock.count > 0 { + result = append(result, getRelativePathFromCITagsSourceRootForCoverage(fileName)) + break + } + } + } + } + + return result +} + +// getRelativePathFromCITagsSourceRootForCoverage returns the relative path from the CI tags source root for coverage +// by converting a module path to a module directory. +func getRelativePathFromCITagsSourceRootForCoverage(filePath string) string { + return utils.GetRelativePathFromCITagsSourceRoot(strings.ReplaceAll(filePath, modulePath, moduleDir)) +} + +// getCoverageStatementsInfo parses the coverage profile data and returns the total statements and covered statements +func getCoverageStatementsInfo(filename string) (totalStatements, coveredStatements int, err error) { + file, err := os.Open(filename) + if err != nil { + return 0, 0, err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + + for scanner.Scan() { + line := scanner.Text() + + // Skip the header + if strings.HasPrefix(line, "mode:") { + continue + } + + // Split the line into the file and block parts + parts := strings.SplitN(line, ":", 2) + if len(parts) < 2 { + continue + } + + blockInfo := parts[1] // Block data, including line info and statement counts + + // Split the block info by space + infoParts := strings.Fields(blockInfo) + if len(infoParts) < 3 { + continue + } + + // Convert the number of statements and hit count + numStmt, err1 := strconv.Atoi(infoParts[1]) + count, err2 := strconv.Atoi(infoParts[2]) + + // Skip if any conversion failed + if err1 != nil || err2 != nil { + continue + } + + // Update total statements + totalStatements += numStmt + + // Update covered statements if the hit count is greater than 0 + if count > 0 { + coveredStatements += numStmt + } + } + + return totalStatements, coveredStatements, scanner.Err() +} diff --git a/internal/civisibility/integrations/gotesting/coverage/test_coverage_msgp.go b/internal/civisibility/integrations/gotesting/coverage/test_coverage_msgp.go new file mode 100644 index 0000000000..0e3d1bfb1f --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/test_coverage_msgp.go @@ -0,0 +1,508 @@ +// Code generated by github.com/tinylib/msgp DO NOT EDIT. + +package coverage + +import ( + "github.com/tinylib/msgp/msgp" +) + +// DecodeMsg implements msgp.Decodable +func (z *ciTestCovPayload) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "version": + z.Version, err = dc.ReadInt32() + if err != nil { + err = msgp.WrapError(err, "Version") + return + } + case "coverages": + err = z.Coverages.DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, "Coverages") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *ciTestCovPayload) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 2 + // write "version" + err = en.Append(0x82, 0xa7, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteInt32(z.Version) + if err != nil { + err = msgp.WrapError(err, "Version") + return + } + // write "coverages" + err = en.Append(0xa9, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x73) + if err != nil { + return + } + err = z.Coverages.EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, "Coverages") + return + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *ciTestCovPayload) Msgsize() (s int) { + s = 1 + 8 + msgp.Int32Size + 10 + z.Coverages.Msgsize() + return +} + +// DecodeMsg implements msgp.Decodable +func (z *ciTestCoverageData) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "test_session_id": + z.SessionID, err = dc.ReadUint64() + if err != nil { + err = msgp.WrapError(err, "SessionID") + return + } + case "test_suite_id": + z.SuiteID, err = dc.ReadUint64() + if err != nil { + err = msgp.WrapError(err, "SuiteID") + return + } + case "span_id": + z.SpanID, err = dc.ReadUint64() + if err != nil { + err = msgp.WrapError(err, "SpanID") + return + } + case "files": + var zb0002 uint32 + zb0002, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err, "Files") + return + } + if cap(z.Files) >= int(zb0002) { + z.Files = (z.Files)[:zb0002] + } else { + z.Files = make([]*ciTestCoverageFile, zb0002) + } + for za0001 := range z.Files { + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, "Files", za0001) + return + } + z.Files[za0001] = nil + } else { + if z.Files[za0001] == nil { + z.Files[za0001] = new(ciTestCoverageFile) + } + var zb0003 uint32 + zb0003, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err, "Files", za0001) + return + } + for zb0003 > 0 { + zb0003-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err, "Files", za0001) + return + } + switch msgp.UnsafeString(field) { + case "filename": + z.Files[za0001].FileName, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "Files", za0001, "FileName") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err, "Files", za0001) + return + } + } + } + } + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z *ciTestCoverageData) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 4 + // write "test_session_id" + err = en.Append(0x84, 0xaf, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.SessionID) + if err != nil { + err = msgp.WrapError(err, "SessionID") + return + } + // write "test_suite_id" + err = en.Append(0xad, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.SuiteID) + if err != nil { + err = msgp.WrapError(err, "SuiteID") + return + } + // write "span_id" + err = en.Append(0xa7, 0x73, 0x70, 0x61, 0x6e, 0x5f, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteUint64(z.SpanID) + if err != nil { + err = msgp.WrapError(err, "SpanID") + return + } + // write "files" + err = en.Append(0xa5, 0x66, 0x69, 0x6c, 0x65, 0x73) + if err != nil { + return + } + err = en.WriteArrayHeader(uint32(len(z.Files))) + if err != nil { + err = msgp.WrapError(err, "Files") + return + } + for za0001 := range z.Files { + if z.Files[za0001] == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + // map header, size 1 + // write "filename" + err = en.Append(0x81, 0xa8, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Files[za0001].FileName) + if err != nil { + err = msgp.WrapError(err, "Files", za0001, "FileName") + return + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z *ciTestCoverageData) Msgsize() (s int) { + s = 1 + 16 + msgp.Uint64Size + 14 + msgp.Uint64Size + 8 + msgp.Uint64Size + 6 + msgp.ArrayHeaderSize + for za0001 := range z.Files { + if z.Files[za0001] == nil { + s += msgp.NilSize + } else { + s += 1 + 9 + msgp.StringPrefixSize + len(z.Files[za0001].FileName) + } + } + return +} + +// DecodeMsg implements msgp.Decodable +func (z *ciTestCoverageFile) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + case "filename": + z.FileName, err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "FileName") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z ciTestCoverageFile) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 1 + // write "filename" + err = en.Append(0x81, 0xa8, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.FileName) + if err != nil { + err = msgp.WrapError(err, "FileName") + return + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z ciTestCoverageFile) Msgsize() (s int) { + s = 1 + 9 + msgp.StringPrefixSize + len(z.FileName) + return +} + +// DecodeMsg implements msgp.Decodable +func (z *ciTestCoveragePayloads) DecodeMsg(dc *msgp.Reader) (err error) { + var zb0002 uint32 + zb0002, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + if cap((*z)) >= int(zb0002) { + (*z) = (*z)[:zb0002] + } else { + (*z) = make(ciTestCoveragePayloads, zb0002) + } + for zb0001 := range *z { + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + (*z)[zb0001] = nil + } else { + if (*z)[zb0001] == nil { + (*z)[zb0001] = new(ciTestCovPayload) + } + var field []byte + _ = field + var zb0003 uint32 + zb0003, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + for zb0003 > 0 { + zb0003-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + switch msgp.UnsafeString(field) { + case "version": + (*z)[zb0001].Version, err = dc.ReadInt32() + if err != nil { + err = msgp.WrapError(err, zb0001, "Version") + return + } + case "coverages": + err = (*z)[zb0001].Coverages.DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, zb0001, "Coverages") + return + } + default: + err = dc.Skip() + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + } + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z ciTestCoveragePayloads) EncodeMsg(en *msgp.Writer) (err error) { + err = en.WriteArrayHeader(uint32(len(z))) + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0004 := range z { + if z[zb0004] == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + // map header, size 2 + // write "version" + err = en.Append(0x82, 0xa7, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteInt32(z[zb0004].Version) + if err != nil { + err = msgp.WrapError(err, zb0004, "Version") + return + } + // write "coverages" + err = en.Append(0xa9, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x73) + if err != nil { + return + } + err = z[zb0004].Coverages.EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, zb0004, "Coverages") + return + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z ciTestCoveragePayloads) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + for zb0004 := range z { + if z[zb0004] == nil { + s += msgp.NilSize + } else { + s += 1 + 8 + msgp.Int32Size + 10 + z[zb0004].Coverages.Msgsize() + } + } + return +} + +// DecodeMsg implements msgp.Decodable +func (z *ciTestCoverages) DecodeMsg(dc *msgp.Reader) (err error) { + var zb0002 uint32 + zb0002, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + if cap((*z)) >= int(zb0002) { + (*z) = (*z)[:zb0002] + } else { + (*z) = make(ciTestCoverages, zb0002) + } + for zb0001 := range *z { + if dc.IsNil() { + err = dc.ReadNil() + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + (*z)[zb0001] = nil + } else { + if (*z)[zb0001] == nil { + (*z)[zb0001] = new(ciTestCoverageData) + } + err = (*z)[zb0001].DecodeMsg(dc) + if err != nil { + err = msgp.WrapError(err, zb0001) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z ciTestCoverages) EncodeMsg(en *msgp.Writer) (err error) { + err = en.WriteArrayHeader(uint32(len(z))) + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0003 := range z { + if z[zb0003] == nil { + err = en.WriteNil() + if err != nil { + return + } + } else { + err = z[zb0003].EncodeMsg(en) + if err != nil { + err = msgp.WrapError(err, zb0003) + return + } + } + } + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z ciTestCoverages) Msgsize() (s int) { + s = msgp.ArrayHeaderSize + for zb0003 := range z { + if z[zb0003] == nil { + s += msgp.NilSize + } else { + s += z[zb0003].Msgsize() + } + } + return +} diff --git a/internal/civisibility/integrations/gotesting/coverage/test_coverage_test.go b/internal/civisibility/integrations/gotesting/coverage/test_coverage_test.go new file mode 100644 index 0000000000..91ccfb0d1a --- /dev/null +++ b/internal/civisibility/integrations/gotesting/coverage/test_coverage_test.go @@ -0,0 +1,309 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package coverage + +import ( + "fmt" + "io" + "os" + "path/filepath" + "strings" + "testing" +) + +func TestCanCollect(t *testing.T) { + tests := []struct { + mode string + expected bool + }{ + {"", false}, + {"count", true}, + {"atomic", true}, + {"set", false}, + } + + for _, test := range tests { + mode = test.mode + result := CanCollect() + if result != test.expected { + t.Errorf("CanCollect() with mode=%q returned %v, expected %v", test.mode, result, test.expected) + } + } +} + +func TestGetCoverage(t *testing.T) { + // Mock environment + mode = "count" + temporaryDir = t.TempDir() + + // Mock tearDown function + tearDown = func(coverprofile string, _ string) (string, error) { + // Create a dummy coverage file + f, err := os.Create(coverprofile) + if err != nil { + return "", err + } + defer f.Close() + f.WriteString("mode: count\n") + f.WriteString("github.com/example/project/file.go:1.1,1.10 1 1\n") + return "", nil + } + + coverage := GetCoverage() + if coverage != 1.0 { + t.Errorf("Expected coverage to be 1.0, got %v", coverage) + } +} + +func TestNewTestCoverage(t *testing.T) { + sessionID := uint64(1) + moduleID := uint64(2) + suiteID := uint64(3) + testID := uint64(4) + testFile := "/path/to/testfile.go" + + tc := NewTestCoverage(sessionID, moduleID, suiteID, testID, testFile) + if tc == nil { + t.Fatal("NewTestCoverage returned nil") + } + + tcv, ok := tc.(*testCoverage) + if !ok { + t.Fatal("NewTestCoverage did not return *testCoverage") + } + + if tcv.sessionID != sessionID { + t.Errorf("Expected sessionID %d, got %d", sessionID, tcv.sessionID) + } + if tcv.moduleID != moduleID { + t.Errorf("Expected moduleID %d, got %d", moduleID, tcv.moduleID) + } + if tcv.suiteID != suiteID { + t.Errorf("Expected suiteID %d, got %d", suiteID, tcv.suiteID) + } + if tcv.testID != testID { + t.Errorf("Expected testID %d, got %d", testID, tcv.testID) + } + if !strings.Contains(tcv.testFile, testFile) { + t.Errorf("Expected testFile %s, got %s", testFile, tcv.testFile) + } +} + +func TestParseCoverProfile(t *testing.T) { + content := `mode: count +github.com/example/project/file1.go:10.12,12.3 2 1 +github.com/example/project/file2.go:20.5,22.10 1 0 +` + + tempFile, err := os.CreateTemp("", "coverage_profile") + if err != nil { + t.Fatal(err) + } + defer os.Remove(tempFile.Name()) + defer tempFile.Close() + + _, err = tempFile.WriteString(content) + if err != nil { + t.Fatal(err) + } + + data, err := parseCoverProfile(tempFile.Name()) + if err != nil { + t.Fatalf("parseCoverProfile returned error: %v", err) + } + + if len(data) != 2 { + t.Errorf("Expected 2 files in coverage data, got %d", len(data)) + } + + blocks1, ok := data["github.com/example/project/file1.go"] + if !ok || len(blocks1) != 1 { + t.Errorf("Expected one block for file1.go, got %d", len(blocks1)) + } else { + block := blocks1[0] + if block.startLine != 10 || block.startCol != 12 || + block.endLine != 12 || block.endCol != 3 || + block.numStmt != 2 || block.count != 1 { + t.Errorf("Block data for file1.go does not match expected values") + } + } + + blocks2, ok := data["github.com/example/project/file2.go"] + if !ok || len(blocks2) != 1 { + t.Errorf("Expected one block for file2.go, got %d", len(blocks2)) + } else { + block := blocks2[0] + if block.startLine != 20 || block.startCol != 5 || + block.endLine != 22 || block.endCol != 10 || + block.numStmt != 1 || block.count != 0 { + t.Errorf("Block data for file2.go does not match expected values") + } + } +} + +func TestGetCoverageStatementsInfo(t *testing.T) { + content := `mode: count +github.com/example/project/file1.go:10.12,12.3 2 1 +github.com/example/project/file2.go:20.5,22.10 1 0 +` + + tempFile, err := os.CreateTemp("", "coverage_profile") + if err != nil { + t.Fatal(err) + } + defer os.Remove(tempFile.Name()) + defer tempFile.Close() + + _, err = tempFile.WriteString(content) + if err != nil { + t.Fatal(err) + } + + total, covered, err := getCoverageStatementsInfo(tempFile.Name()) + if err != nil { + t.Fatalf("getCoverageStatementsInfo returned error: %v", err) + } + + if total != 3 { + t.Errorf("Expected total statements to be 3, got %d", total) + } + if covered != 2 { + t.Errorf("Expected covered statements to be 2, got %d", covered) + } +} + +func TestGetFilesCovered(t *testing.T) { + before := map[string][]coverageBlock{ + "file1.go": { + {startLine: 1, startCol: 0, endLine: 1, endCol: 10, numStmt: 1, count: 0}, + }, + "file2.go": { + {startLine: 2, startCol: 0, endLine: 2, endCol: 10, numStmt: 1, count: 0}, + }, + } + + after := map[string][]coverageBlock{ + "file1.go": { + {startLine: 1, startCol: 0, endLine: 1, endCol: 10, numStmt: 1, count: 1}, + }, + "file2.go": { + {startLine: 2, startCol: 0, endLine: 2, endCol: 10, numStmt: 1, count: 0}, + }, + "file3.go": { + {startLine: 3, startCol: 0, endLine: 3, endCol: 10, numStmt: 1, count: 1}, + }, + } + + testFile := "testfile.go" + filesCovered := getFilesCovered(testFile, before, after) + expectedFiles := []string{"testfile.go", "file1.go", "file3.go"} + + if len(filesCovered) != len(expectedFiles) { + t.Errorf("Expected %d files covered, got %d", len(expectedFiles), len(filesCovered)) + } + + for _, expectedFile := range expectedFiles { + found := false + for _, file := range filesCovered { + if file == expectedFile { + found = true + break + } + } + if !found { + t.Errorf("Expected file %s to be in covered files", expectedFile) + } + } +} + +func TestCollectCoverageBeforeTestExecution(t *testing.T) { + // Mock environment + tempDir := t.TempDir() + temporaryDir = tempDir + + // Mock tearDown function + tearDown = func(coverprofile string, _ string) (string, error) { + // Create a dummy coverage file + f, err := os.Create(coverprofile) + if err != nil { + return "", err + } + defer f.Close() + f.WriteString("mode: count\n") + return "", nil + } + + mode = "count" + + tc := &testCoverage{ + moduleID: 1, + suiteID: 2, + testID: 3, + } + + tc.CollectCoverageBeforeTestExecution() + + if tc.preCoverageFilename == "" { + t.Error("preCoverageFilename is empty after CollectCoverageBeforeTestExecution") + } else { + if _, err := os.Stat(tc.preCoverageFilename); os.IsNotExist(err) { + t.Errorf("Expected preCoverageFilename %s to exist", tc.preCoverageFilename) + } + } +} + +func TestCollectCoverageAfterTestExecution(t *testing.T) { + // Mock environment + tempDir := t.TempDir() + temporaryDir = tempDir + + // Mock tearDown function + tearDown = func(coverprofile string, _ string) (string, error) { + // Create a dummy coverage file + f, err := os.Create(coverprofile) + if err != nil { + return "", err + } + defer f.Close() + f.WriteString("mode: count\n") + return "", nil + } + covWriter = newCoverageWriter() + covWriter.client = &MockClient{SendCoveragePayloadFunc: func(_ io.Reader) error { + return fmt.Errorf("mock error") + }, + } + + mode = "count" + + tc := &testCoverage{ + moduleID: 1, + suiteID: 2, + testID: 3, + preCoverageFilename: filepath.Join(tempDir, "pre.out"), + } + + // Create a dummy pre-coverage file + f, err := os.Create(tc.preCoverageFilename) + if err != nil { + t.Fatal(err) + } + f.WriteString("mode: count\n") + f.Close() + + err = tc.getCoverageData() + if err != nil { + t.Errorf("getCoverageData returned error: %v", err) + } + + if tc.postCoverageFilename == "" { + t.Error("postCoverageFilename is empty after CollectCoverageAfterTestExecution") + } else { + if _, err := os.Stat(tc.postCoverageFilename); os.IsNotExist(err) { + t.Errorf("Expected postCoverageFilename %s to exist", tc.postCoverageFilename) + } + } +} diff --git a/internal/civisibility/integrations/gotesting/instrumentation.go b/internal/civisibility/integrations/gotesting/instrumentation.go index ba934dce7b..eef3eeed68 100644 --- a/internal/civisibility/integrations/gotesting/instrumentation.go +++ b/internal/civisibility/integrations/gotesting/instrumentation.go @@ -9,17 +9,16 @@ import ( "fmt" "reflect" "runtime" - "slices" "sync" "sync/atomic" "testing" "time" "unsafe" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) type ( @@ -30,26 +29,67 @@ type ( // testExecutionMetadata contains metadata regarding an unique *testing.T or *testing.B execution testExecutionMetadata struct { - test integrations.DdTest // internal CI Visibility test event - error atomic.Int32 // flag to check if the test event has error data already - skipped atomic.Int32 // flag to check if the test event has skipped data already - panicData any // panic data recovered from an internal test execution when using an additional feature wrapper - panicStacktrace string // stacktrace from the panic recovered from an internal test - isARetry bool // flag to tag if a current test execution is a retry - isANewTest bool // flag to tag if a current test execution is part of a new test (EFD not known test) - hasAdditionalFeatureWrapper bool // flag to check if the current execution is part of an additional feature wrapper + test integrations.Test // internal CI Visibility test event + originalTest *testing.T // original test that was executed + error atomic.Int32 // flag to check if the test event has error data already + skipped atomic.Int32 // flag to check if the test event has skipped data already + panicData any // panic data recovered from an internal test execution when using an additional feature wrapper + panicStacktrace string // stacktrace from the panic recovered from an internal test + isARetry bool // flag to tag if a current test execution is a retry + isANewTest bool // flag to tag if a current test a new test + isAModifiedTest bool // flag to tag if a current test a modified test + isEarlyFlakeDetectionEnabled bool // flag to tag if Early Flake Detection is enabled for this execution + isFlakyTestRetriesEnabled bool // flag to tag if Flaky Test Retries is enabled for this execution + isQuarantined bool // flag to check if the test is quarantined + isDisabled bool // flag to check if the test is disabled + isAttemptToFix bool // flag to check if the test is marked as attempt to fix + isLastRetry bool // flag to check if the current execution is the last retry + allAttemptsPassed bool // flag to check if all attempts passed for a test marked as attempt to fix + allRetriesFailed bool // flag to check if all retries failed for a test + hasAdditionalFeatureWrapper bool // flag to check if the current execution is part of an additional feature wrapper + identity *testIdentity // identity of the current execution (test or subtest) + hasExplicitQuarantined bool // flag to mark if quarantine state comes from explicit configuration + hasExplicitDisabled bool // flag to mark if disabled state comes from explicit configuration + hasExplicitAttemptToFix bool // flag to mark if attempt-to-fix state comes from explicit configuration } // runTestWithRetryOptions contains the options for calling runTestWithRetry function runTestWithRetryOptions struct { - targetFunc func(t *testing.T) // target function to retry - t *testing.T // test to be executed - initialRetryCount int64 // initial retry count - adjustRetryCount func(duration time.Duration) int64 // adjust retry count function depending on the duration of the first execution - shouldRetry func(ptrToLocalT *testing.T, executionIndex int, remainingRetries int64) bool // function to decide whether we want to perform a retry - perExecution func(ptrToLocalT *testing.T, executionIndex int, duration time.Duration) // function to run after each test execution - onRetryEnd func(t *testing.T, executionIndex int, lastPtrToLocalT *testing.T) // function executed when all execution have finished - execMetaAdjust func(execMeta *testExecutionMetadata, executionIndex int) // function to modify the execution metadata for each execution + targetFunc func(t *testing.T) // target function to retry + t *testing.T // test to be executed + isEfdInParallel bool // flag to check if the test is running in parallel + + // function to modify the execution metadata before each execution (first callback executed). It's also called before postOnRetryEnd to do a final sync + preExecMetaAdjust func(execMeta *testExecutionMetadata, executionIndex int) + + // function to decide whether we are in the last retry (second callback executed if we are in a retry execution) + preIsLastRetry func(execMeta *testExecutionMetadata, executionIndex int, remainingRetries int64) bool + + // adjust retry count function depending on the duration of the first execution (first callback executed post test execution only in the first execution of the test) + postAdjustRetryCount func(execMeta *testExecutionMetadata, duration time.Duration) int64 + + // function to run after each test execution (second callback executed after test execution) + postPerExecution func(ptrToLocalT *testing.T, execMeta *testExecutionMetadata, executionIndex int, duration time.Duration) + + // function to decide whether we want to perform a retry (third callback executed after test execution) + postShouldRetry func(ptrToLocalT *testing.T, execMeta *testExecutionMetadata, executionIndex int, remainingRetries int64) bool + + // function executed when all execution have finished (last callback executed after all test executions(+retries)) + postOnRetryEnd func(t *testing.T, executionIndex int, lastPtrToLocalT *testing.T) + } + + // executionOptions holds the execution options for the test + executionOptions struct { + mutex sync.Locker // mutex for synchronizing test iterations + options *runTestWithRetryOptions // options for the test execution + executionIndex int // current execution index + retryCount int64 // remaining retry count + originalExecutionMetadata *testExecutionMetadata // original test execution metadata + panicExecutionMetadata *testExecutionMetadata // panicked execution metadata + ptrToLocalT *testing.T // pointer to the local test instance + executionMetadata *testExecutionMetadata // current test execution metadata + module integrations.TestModule // module associated with the test + suite integrations.TestSuite // suite associated with the test } ) @@ -83,10 +123,10 @@ func isCiVisibilityEnabled() bool { if internal.BoolEnv(constants.CIVisibilityEnabledEnvironmentVariable, false) { atomic.StoreInt32(&ciVisibilityEnabledValue, 1) return true - } else { - atomic.StoreInt32(&ciVisibilityEnabledValue, 0) - return false } + atomic.StoreInt32(&ciVisibilityEnabledValue, 0) + return false + } return enabledValue == 1 @@ -104,16 +144,16 @@ func getInstrumentationMetadata(fn *runtime.Func) *instrumentationMetadata { // setInstrumentationMetadata stores an instrumentation metadata for a given *runtime.Func. func setInstrumentationMetadata(fn *runtime.Func, metadata *instrumentationMetadata) { - instrumentationMapMutex.RLock() - defer instrumentationMapMutex.RUnlock() + instrumentationMapMutex.Lock() + defer instrumentationMapMutex.Unlock() instrumentationMap[fn] = metadata } // createTestMetadata creates the CI visibility test metadata associated with a given *testing.T, *testing.B, *testing.common -func createTestMetadata(tb testing.TB) *testExecutionMetadata { - ciVisibilityTestMetadataMutex.RLock() - defer ciVisibilityTestMetadataMutex.RUnlock() - execMetadata := &testExecutionMetadata{} +func createTestMetadata(tb testing.TB, originalTest *testing.T) *testExecutionMetadata { + ciVisibilityTestMetadataMutex.Lock() + defer ciVisibilityTestMetadataMutex.Unlock() + execMetadata := &testExecutionMetadata{originalTest: originalTest} ciVisibilityTestMetadata[reflect.ValueOf(tb).UnsafePointer()] = execMetadata return execMetadata } @@ -135,8 +175,8 @@ func getTestMetadataFromPointer(ptr unsafe.Pointer) *testExecutionMetadata { // deleteTestMetadata delete the CI visibility test metadata associated with a given *testing.T, *testing.B, *testing.common func deleteTestMetadata(tb testing.TB) { - ciVisibilityTestMetadataMutex.RLock() - defer ciVisibilityTestMetadataMutex.RUnlock() + ciVisibilityTestMetadataMutex.Lock() + defer ciVisibilityTestMetadataMutex.Unlock() delete(ciVisibilityTestMetadata, reflect.ValueOf(tb).UnsafePointer()) } @@ -149,65 +189,355 @@ func checkIfCIVisibilityExitIsRequiredByPanic() bool { return !settings.FlakyTestRetriesEnabled && !settings.EarlyFlakeDetection.Enabled } -// applyAdditionalFeaturesToTestFunc applies all the additional features as wrapper of a func(*testing.T) -func applyAdditionalFeaturesToTestFunc(f func(*testing.T), testInfo *commonInfo) func(*testing.T) { +// applyAdditionalFeaturesToTestFunc applies all the additional features as wrapper of a func(*testing.T). +// parentExecMeta is optional and allows subtests to inherit behaviour from their parent test when needed. +func applyAdditionalFeaturesToTestFunc(f func(*testing.T), testInfo *commonInfo, parentExecMeta *testExecutionMetadata) func(*testing.T) { // Apply additional features settings := integrations.GetSettings() - // Check if we have something to do, if not we bail out - if !settings.FlakyTestRetriesEnabled && !settings.EarlyFlakeDetection.Enabled { + // ensure that the additional features are initialized + _ = integrations.GetKnownTests() + + // If none of the additional features are enabled, return the original function. + if !settings.TestManagement.Enabled && !settings.EarlyFlakeDetection.Enabled && !settings.FlakyTestRetriesEnabled { return f } - // Target function - targetFunc := f + identity := testInfo.identity + if identity == nil { + // Derive an identity for tests that did not populate it (such as subtests discovered at runtime). + identity = newTestIdentity(testInfo.moduleName, testInfo.suiteName, testInfo.testName) + } + isSubtest := len(identity.Segments) > 1 + + var meta struct { + identity *testIdentity + isTestManagementEnabled bool + isEarlyFlakeDetectionEnabled bool + isFlakyTestRetriesEnabled bool + isQuarantined bool + isDisabled bool + isAttemptToFix bool + isNew bool + isModified bool + hasExplicitQuarantined bool + hasExplicitDisabled bool + hasExplicitAttemptToFix bool + managementMatchKind testManagementMatchKind + shouldOrchestrateAttemptToFix bool + } + + // init metadata + meta.identity = identity + meta.isTestManagementEnabled = settings.TestManagement.Enabled + meta.isEarlyFlakeDetectionEnabled = settings.EarlyFlakeDetection.Enabled + meta.isFlakyTestRetriesEnabled = settings.FlakyTestRetriesEnabled + meta.isQuarantined = false + meta.isDisabled = false + meta.isAttemptToFix = false + meta.isNew = false + meta.isModified = false + meta.hasExplicitQuarantined = false + meta.hasExplicitDisabled = false + meta.hasExplicitAttemptToFix = false + meta.managementMatchKind = testManagementMatchNone + meta.shouldOrchestrateAttemptToFix = false + + // Test Management feature + if meta.isTestManagementEnabled { + // Pull the most specific directives available for the current identity. + if data, matchKind, ok := getTestManagementData(identity); ok && data != nil { + meta.managementMatchKind = matchKind + meta.isQuarantined = data.Quarantined + meta.isDisabled = data.Disabled + meta.isAttemptToFix = data.AttemptToFix + if matchKind == testManagementMatchExact { + meta.hasExplicitQuarantined = true + meta.hasExplicitDisabled = true + meta.hasExplicitAttemptToFix = true + } + } + } + + // determine whether attempt-to-fix retries should be orchestrated at this level + meta.shouldOrchestrateAttemptToFix = meta.isAttemptToFix + if parentExecMeta != nil && parentExecMeta.isAttemptToFix { + // The parent already controls the attempt-to-fix loop; subtests should only orchestrate if explicitly requested. + meta.shouldOrchestrateAttemptToFix = meta.hasExplicitAttemptToFix && meta.isAttemptToFix && !parentExecMeta.isAttemptToFix + } - // Flaky test retries - if settings.FlakyTestRetriesEnabled { - targetFunc = applyFlakyTestRetriesAdditionalFeature(targetFunc) + if isSubtest { + if !settings.SubtestFeaturesEnabled { + // Feature gate keeps legacy behaviour when subtests support is disabled. + return f + } + // Require an exact match before applying subtest-specific directives; fallbacks remain parent-scoped. + if meta.managementMatchKind != testManagementMatchExact { + return f + } + shouldWrap := meta.isQuarantined || meta.isDisabled || meta.isAttemptToFix || + meta.hasExplicitQuarantined || meta.hasExplicitDisabled || meta.hasExplicitAttemptToFix + if !shouldWrap { + return f + } + // Subtests currently inherit parent EFD/flaky retry behaviour; disable here to avoid double wrapping. + meta.isEarlyFlakeDetectionEnabled = false + meta.isFlakyTestRetriesEnabled = false } - // Early flake detection - if settings.EarlyFlakeDetection.Enabled { - targetFunc = applyEarlyFlakeDetectionAdditionalFeature(testInfo, targetFunc, settings) + // Early Flake Detection feature + if meta.isEarlyFlakeDetectionEnabled { + // Record whether the test is new so we can surface it in spans later. + isKnown, hasKnownData := isKnownTest(testInfo) + meta.isNew = hasKnownData && !isKnown } - // Register the instrumented func as an internal instrumented func (to avoid double instrumentation) - setInstrumentationMetadata(runtime.FuncForPC(reflect.ValueOf(targetFunc).Pointer()), &instrumentationMetadata{IsInternal: true}) - return targetFunc -} + // get the pointer to use the reference in the wrapper + ptrMeta := &meta + + // Create a unified wrapper that will use a single runTestWithRetry call. + wrapper := func(t *testing.T) { + t.Helper() + originalExecMeta := getTestMetadata(t) + + // For Early Flake Detection: counters used to collect test results. + var testPassCount, testSkipCount, testFailCount int + // For Test Management and auto retries. + var allAttemptsPassed int32 = 1 + var allRetriesFailed int32 = 1 + + runTestWithRetry(&runTestWithRetryOptions{ + targetFunc: f, + t: t, + isEfdInParallel: internal.BoolEnv(constants.CIVisibilityInternalParallelEarlyFlakeDetectionEnabled, false), + preExecMetaAdjust: func(execMeta *testExecutionMetadata, _ int) { + // Synchronize the test execution metadata with the original test execution metadata. + + execMeta.identity = ptrMeta.identity + if ptrMeta.hasExplicitQuarantined { + // Honour the explicitly requested quarantine flag for this execution. + execMeta.isQuarantined = ptrMeta.isQuarantined + execMeta.hasExplicitQuarantined = true + } else { + // Otherwise accumulate quarantine state from earlier runs. + execMeta.isQuarantined = execMeta.isQuarantined || ptrMeta.isQuarantined + } + if ptrMeta.hasExplicitDisabled { + // Apply the disabled directive exactly as configured. + execMeta.isDisabled = ptrMeta.isDisabled + execMeta.hasExplicitDisabled = true + } else { + // Merge prior disabled state from parent/wrappers. + execMeta.isDisabled = execMeta.isDisabled || ptrMeta.isDisabled + } + if ptrMeta.hasExplicitAttemptToFix { + // Only explicit attempt-to-fix should override propagated state. + execMeta.isAttemptToFix = ptrMeta.isAttemptToFix + execMeta.hasExplicitAttemptToFix = true + } else { + // Otherwise inherit whether previous owners already requested attempt-to-fix. + execMeta.isAttemptToFix = execMeta.isAttemptToFix || ptrMeta.isAttemptToFix + } + execMeta.isEarlyFlakeDetectionEnabled = execMeta.isEarlyFlakeDetectionEnabled || ptrMeta.isEarlyFlakeDetectionEnabled + execMeta.isFlakyTestRetriesEnabled = execMeta.isFlakyTestRetriesEnabled || ptrMeta.isFlakyTestRetriesEnabled + execMeta.allAttemptsPassed = atomic.LoadInt32(&allAttemptsPassed) == 1 + execMeta.allRetriesFailed = atomic.LoadInt32(&allRetriesFailed) == 1 + execMeta.isANewTest = execMeta.isANewTest || ptrMeta.isNew + execMeta.isAModifiedTest = execMeta.isAModifiedTest || ptrMeta.isModified + + // Propagate flags from the original test metadata. + propagateTestExecutionMetadataFlags(execMeta, originalExecMeta) + + ptrMeta.identity = execMeta.identity + ptrMeta.isQuarantined = execMeta.isQuarantined + ptrMeta.isDisabled = execMeta.isDisabled + ptrMeta.isAttemptToFix = execMeta.isAttemptToFix + ptrMeta.hasExplicitQuarantined = execMeta.hasExplicitQuarantined + ptrMeta.hasExplicitDisabled = execMeta.hasExplicitDisabled + ptrMeta.hasExplicitAttemptToFix = execMeta.hasExplicitAttemptToFix + ptrMeta.isEarlyFlakeDetectionEnabled = execMeta.isEarlyFlakeDetectionEnabled + ptrMeta.isFlakyTestRetriesEnabled = execMeta.isFlakyTestRetriesEnabled + ptrMeta.isNew = execMeta.isANewTest + ptrMeta.isModified = execMeta.isAModifiedTest + }, + preIsLastRetry: func(execMeta *testExecutionMetadata, _ int, remainingRetries int64) bool { + if execMeta.isAttemptToFix && ptrMeta.shouldOrchestrateAttemptToFix { + // For attempt-to-fix tests and EFD, the last retry is when remaining retries == 1. + return remainingRetries == 1 + } + + if isAnEfdExecution(execMeta) { + // For EFD, the last retry is when remaining retries == 1. + return remainingRetries == 1 + } + + // FlakyTestRetries also considers the global remaining retry count. + if execMeta.isFlakyTestRetriesEnabled { + return remainingRetries == 1 || atomic.LoadInt64(&integrations.GetFlakyRetriesSettings().RemainingTotalRetryCount) == 1 + } + + return false + }, + postAdjustRetryCount: func(execMeta *testExecutionMetadata, duration time.Duration) int64 { + // adjust retry count only runs after the first run + + // Attempt To Fix retries are always set to the configured value. + if execMeta.isAttemptToFix && ptrMeta.shouldOrchestrateAttemptToFix { + if execMeta.identity != nil && len(execMeta.identity.Segments) > 1 { + log.Debug("postAdjustRetryCount attempt_to_fix identity=%s setting=%d", execMeta.identity.FullName, settings.TestManagement.AttemptToFixRetries) + } + return int64(settings.TestManagement.AttemptToFixRetries) + } + + // Early Flake Detection adjusts the retry count based on test duration. + if isAnEfdExecution(execMeta) { + slowTestRetries := settings.EarlyFlakeDetection.SlowTestRetries + secs := duration.Seconds() + if secs < 5 { + return int64(slowTestRetries.FiveS) + } else if secs < 10 { + return int64(slowTestRetries.TenS) + } else if secs < 30 { + return int64(slowTestRetries.ThirtyS) + } else if duration.Minutes() < 5 { + return int64(slowTestRetries.FiveM) + } + } + + // Automatic flaky tests retries are set to the configured value. + if execMeta.isFlakyTestRetriesEnabled { + return integrations.GetFlakyRetriesSettings().RetryCount + } + + // No retries + return 0 + }, + postPerExecution: func(ptrToLocalT *testing.T, execMeta *testExecutionMetadata, executionIndex int, _ time.Duration) { + failed := ptrToLocalT.Failed() + skipped := ptrToLocalT.Skipped() + log.Debug("applyAdditionalFeaturesToTestFunc: postPerExecution called for execution %d, failed: %t, skipped: %t", executionIndex, failed, skipped) + + if failed || skipped { + atomic.StoreInt32(&allAttemptsPassed, 0) + } + if !failed { + atomic.StoreInt32(&allRetriesFailed, 0) + } + + if execMeta.isAttemptToFix { + status := "PASS" + if failed { + status = "FAIL" + } else if skipped { + status = "SKIP" + } + if execMeta.identity != nil && len(execMeta.identity.Segments) > 1 { + log.Debug("postPerExecution attempt_to_fix identity=%s orchestrate=%t run=%d status=%s", execMeta.identity.FullName, ptrMeta.shouldOrchestrateAttemptToFix, executionIndex, status) + } + + if ptrMeta.shouldOrchestrateAttemptToFix { + isSubtest := execMeta.identity != nil && len(execMeta.identity.Segments) > 1 + if !isSubtest { + ptrToLocalT.Logf(" [attempt to fix retry: %d (%s)]", executionIndex+1, status) + } + } + return + } + + if isAnEfdExecution(execMeta) { + if skipped { + log.Debug("applyAdditionalFeaturesToTestFunc: EFD test skipped, incrementing skip count") + testSkipCount++ + } else if failed { + log.Debug("applyAdditionalFeaturesToTestFunc: EFD test failed, incrementing fail count") + testFailCount++ + } else { + log.Debug("applyAdditionalFeaturesToTestFunc: EFD test passed, incrementing pass count") + testPassCount++ + } + return + } + + if execMeta.isFlakyTestRetriesEnabled { + if executionIndex > 0 { + atomic.AddInt64(&integrations.GetFlakyRetriesSettings().RemainingTotalRetryCount, -1) + } + return + } + }, + postShouldRetry: func(ptrToLocalT *testing.T, execMeta *testExecutionMetadata, _ int, remainingRetries int64) bool { + if execMeta.isAttemptToFix && ptrMeta.shouldOrchestrateAttemptToFix { + // For attempt-to-fix tests, retry if remaining retries > 0. + return remainingRetries > 0 + } + + if isAnEfdExecution(execMeta) { + // For EFD, retry if remaining retries >= 0. + return remainingRetries >= 0 + } + + if execMeta.isFlakyTestRetriesEnabled { + // For flaky test retries, retry if the test failed and remaining retries >= 0. + return ptrToLocalT.Failed() && remainingRetries >= 0 && + atomic.LoadInt64(&integrations.GetFlakyRetriesSettings().RemainingTotalRetryCount) >= 0 + } -// applyFlakyTestRetriesAdditionalFeature applies the flaky test retries feature as a wrapper of a func(*testing.T) -func applyFlakyTestRetriesAdditionalFeature(targetFunc func(*testing.T)) func(*testing.T) { - flakyRetrySettings := integrations.GetFlakyRetriesSettings() - - // If the retry count per test is > 1 and if we still have remaining total retry count - if flakyRetrySettings.RetryCount > 1 && flakyRetrySettings.RemainingTotalRetryCount > 0 { - return func(t *testing.T) { - runTestWithRetry(&runTestWithRetryOptions{ - targetFunc: targetFunc, - t: t, - initialRetryCount: flakyRetrySettings.RetryCount, - adjustRetryCount: nil, // No adjustRetryCount - shouldRetry: func(ptrToLocalT *testing.T, executionIndex int, remainingRetries int64) bool { - remainingTotalRetries := atomic.AddInt64(&flakyRetrySettings.RemainingTotalRetryCount, -1) - // Decide whether to retry - return ptrToLocalT.Failed() && remainingRetries >= 0 && remainingTotalRetries >= 0 - }, - perExecution: nil, // No perExecution needed - onRetryEnd: func(t *testing.T, executionIndex int, lastPtrToLocalT *testing.T) { - // Update original `t` with results from last execution - tCommonPrivates := getTestPrivateFields(t) + // No retries for other cases. + return false + }, + postOnRetryEnd: func(t *testing.T, executionIndex int, lastPtrToLocalT *testing.T) { + // if the test is disabled or quarantined, skip the test result to the testing framework + if ptrMeta.isDisabled || ptrMeta.isQuarantined { + log.Debug("applyAdditionalFeaturesToTestFunc: Skipping test result for disabled or quarantined test") + t.SkipNow() + return + } + + // get the test common privates + tCommonPrivates := getTestPrivateFields(t) + if tCommonPrivates == nil { + panic("getting test private fields failed") + } + + // if early flake detection is enabled, we need to set the test status + efdOnNewTest := ptrMeta.isEarlyFlakeDetectionEnabled && ptrMeta.isNew + efdOnModifiedTest := ptrMeta.isEarlyFlakeDetectionEnabled && ptrMeta.isModified && !ptrMeta.isAttemptToFix + if efdOnNewTest || efdOnModifiedTest { + log.Debug("applyAdditionalFeaturesToTestFunc: Setting test status for Early Flake Detection") + status := "passed" + if testPassCount == 0 { + if testSkipCount > 0 { + status = "skipped" + tCommonPrivates.SetSkipped(true) + } + if testFailCount > 0 { + status = "failed" + tCommonPrivates.SetFailed(true) + tParentCommonPrivates := getTestParentPrivateFields(t) + if tParentCommonPrivates == nil { + panic("getting test parent private fields failed") + } + tParentCommonPrivates.SetFailed(true) + } + } + if executionIndex > 0 { + fmt.Printf(" [ %v after %v retries by Datadog's early flake detection ]\n", status, executionIndex) + } + return + } + + // if the test is a flaky test retries test, we need to set the test status + if ptrMeta.isFlakyTestRetriesEnabled { + log.Debug("applyAdditionalFeaturesToTestFunc: Setting test status for Flaky Test Retries") tCommonPrivates.SetFailed(lastPtrToLocalT.Failed()) tCommonPrivates.SetSkipped(lastPtrToLocalT.Skipped()) - - // Update parent status if failed if lastPtrToLocalT.Failed() { tParentCommonPrivates := getTestParentPrivateFields(t) + if tParentCommonPrivates == nil { + panic("getting test parent private fields failed") + } tParentCommonPrivates.SetFailed(true) } - - // Print summary after retries if executionIndex > 0 { status := "passed" if t.Failed() { @@ -215,245 +545,285 @@ func applyFlakyTestRetriesAdditionalFeature(targetFunc func(*testing.T)) func(*t } else if t.Skipped() { status = "skipped" } - fmt.Printf(" [ %v after %v retries by Datadog's auto test retries ]\n", status, executionIndex) + if atomic.LoadInt64(&integrations.GetFlakyRetriesSettings().RemainingTotalRetryCount) < 1 { + fmt.Println(" the maximum number of total retries was exceeded.") + } } + return + } - // Check if total retry count was exceeded - if flakyRetrySettings.RemainingTotalRetryCount < 1 { - fmt.Println(" the maximum number of total retries was exceeded.") + log.Debug("applyAdditionalFeaturesToTestFunc: Setting test status for regular test execution") + tCommonPrivates.SetFailed(lastPtrToLocalT.Failed()) + tCommonPrivates.SetSkipped(lastPtrToLocalT.Skipped()) + if lastPtrToLocalT.Failed() { + tParentCommonPrivates := getTestParentPrivateFields(t) + if tParentCommonPrivates == nil { + panic("getting test parent private fields failed") } - }, - execMetaAdjust: nil, // No execMetaAdjust needed - }) - } + tParentCommonPrivates.SetFailed(true) + } + }, + }) } - return targetFunc + + // Mark the wrapper as instrumented. + setInstrumentationMetadata(runtime.FuncForPC(reflect.ValueOf(wrapper).Pointer()), &instrumentationMetadata{IsInternal: true}) + return wrapper } -// applyEarlyFlakeDetectionAdditionalFeature applies the early flake detection feature as a wrapper of a func(*testing.T) -func applyEarlyFlakeDetectionAdditionalFeature(testInfo *commonInfo, targetFunc func(*testing.T), settings *net.SettingsResponseData) func(*testing.T) { - earlyFlakeDetectionData := integrations.GetEarlyFlakeDetectionSettings() - if earlyFlakeDetectionData != nil && - len(earlyFlakeDetectionData.Tests) > 0 { +// runTestWithRetry encapsulates the common retry logic for test functions. +func runTestWithRetry(options *runTestWithRetryOptions) { + // Set this func as a helper func of t + options.t.Helper() + + // Initialize execution options variables + execOpts := &executionOptions{ + mutex: &noopMutex{}, + options: options, + executionIndex: -1, + retryCount: int64(0), + originalExecutionMetadata: getTestMetadata(options.t), + } - // Define is a known test flag - isAKnownTest := false + // Create a mutex for synchronizing test iterations + if options.isEfdInParallel { + execOpts.mutex = &sync.Mutex{} + } - // Check if the test is a known test or a new one - if knownSuites, ok := earlyFlakeDetectionData.Tests[testInfo.moduleName]; ok { - if knownTests, ok := knownSuites[testInfo.suiteName]; ok { - if slices.Contains(knownTests, testInfo.testName) { - isAKnownTest = true - } + // Execute the test function for the first time + if executeTestIteration(execOpts) { + // retry is required + if options.isEfdInParallel && isAnEfdExecution(execOpts.executionMetadata) { + // In parallel, we use the retry count set in the first execution + calculatedRetryCount := execOpts.retryCount + log.Debug("runTestWithRetry: executing test in parallel with retry count: %d", calculatedRetryCount) + var wg sync.WaitGroup + wg.Add(int(calculatedRetryCount + 1)) + for i := int64(0); i <= calculatedRetryCount; i++ { + go func(_ int64) { + defer wg.Done() + executeTestIteration(execOpts) + }(i) } - } - - // If it's a new test, then we apply the EFD wrapper - if !isAKnownTest { - return func(t *testing.T) { - var testPassCount, testSkipCount, testFailCount int - - runTestWithRetry(&runTestWithRetryOptions{ - targetFunc: targetFunc, - t: t, - initialRetryCount: 0, - adjustRetryCount: func(duration time.Duration) int64 { - slowTestRetriesSettings := settings.EarlyFlakeDetection.SlowTestRetries - durationSecs := duration.Seconds() - if durationSecs < 5 { - return int64(slowTestRetriesSettings.FiveS) - } else if durationSecs < 10 { - return int64(slowTestRetriesSettings.TenS) - } else if durationSecs < 30 { - return int64(slowTestRetriesSettings.ThirtyS) - } else if duration.Minutes() < 5 { - return int64(slowTestRetriesSettings.FiveM) - } - return 0 - }, - shouldRetry: func(ptrToLocalT *testing.T, executionIndex int, remainingRetries int64) bool { - return remainingRetries >= 0 - }, - perExecution: func(ptrToLocalT *testing.T, executionIndex int, duration time.Duration) { - // Collect test results - if ptrToLocalT.Failed() { - testFailCount++ - } else if ptrToLocalT.Skipped() { - testSkipCount++ - } else { - testPassCount++ - } - }, - onRetryEnd: func(t *testing.T, executionIndex int, lastPtrToLocalT *testing.T) { - // Update test status based on collected counts - tCommonPrivates := getTestPrivateFields(t) - tParentCommonPrivates := getTestParentPrivateFields(t) - status := "passed" - if testPassCount == 0 { - if testSkipCount > 0 { - status = "skipped" - tCommonPrivates.SetSkipped(true) - } - if testFailCount > 0 { - status = "failed" - tCommonPrivates.SetFailed(true) - tParentCommonPrivates.SetFailed(true) - } - } - - // Print summary after retries - if executionIndex > 0 { - fmt.Printf(" [ %v after %v retries by Datadog's early flake detection ]\n", status, executionIndex) - } - }, - execMetaAdjust: func(execMeta *testExecutionMetadata, executionIndex int) { - // Set the flag new test to true - execMeta.isANewTest = true - }, - }) + wg.Wait() + } else { + // Execute retries sequentially + for { + if !executeTestIteration(execOpts) { + break + } } } } - return targetFunc -} -// runTestWithRetry encapsulates the common retry logic for test functions. -func runTestWithRetry(options *runTestWithRetryOptions) { - executionIndex := -1 - var panicExecution *testExecutionMetadata - var lastPtrToLocalT *testing.T + // Adjust execution metadata + if options.preExecMetaAdjust != nil { + options.preExecMetaAdjust(execOpts.executionMetadata, execOpts.executionIndex) + } - // Module and suite for this test - var module integrations.DdTestModule - var suite integrations.DdTestSuite + // Call onRetryEnd + if options.postOnRetryEnd != nil { + options.postOnRetryEnd(options.t, execOpts.executionIndex, execOpts.ptrToLocalT) + } - // Check if we have execution metadata to propagate - originalExecMeta := getTestMetadata(options.t) + // After all test executions, check if we need to close the suite and the module + if execOpts.originalExecutionMetadata == nil { + checkModuleAndSuite(execOpts.module, execOpts.suite) + } - retryCount := options.initialRetryCount + // Re-panic if test failed and panic data exists + if options.t.Failed() && execOpts.panicExecutionMetadata != nil { + // Ensure we flush all CI visibility data and close the session event + integrations.ExitCiVisibility() + panic(fmt.Sprintf("test failed and panicked after %d retries.\n%v\n%v", execOpts.executionIndex, execOpts.panicExecutionMetadata.panicData, execOpts.panicExecutionMetadata.panicStacktrace)) + } +} - for { - // Clear the matcher subnames map before each execution to avoid subname tests being called "parent/subname#NN" due to retries - getTestContextMatcherPrivateFields(options.t).ClearSubNames() +// executeTestIteration runs a single attempt of the test (or subtest), recording metadata and +// ensuring the retry orchestration has the latest execution context. +func executeTestIteration(execOpts *executionOptions) bool { + // Iteration lock + execOpts.mutex.Lock() + defer execOpts.mutex.Unlock() + + // Clear the matcher subnames map before each execution to avoid subname tests being called "parent/subname#NN" due to retries + matcher := getTestContextMatcherPrivateFields(execOpts.options.t) + if matcher != nil { + matcher.ClearSubNames() + } - // Increment execution index - executionIndex++ + // Increment execution index + execOpts.executionIndex++ + currentIndex := execOpts.executionIndex + + // Create a new local copy of `t` to isolate execution results + ptrToLocalT := createNewTest() + copyTestWithoutParent(execOpts.options.t, ptrToLocalT) + ptrToLocalT.Helper() + execOpts.options.t.Helper() + + // Create a dummy parent so we can run the test using this local copy + // without affecting the test parent + localTPrivateFields := getTestPrivateFields(ptrToLocalT) + if localTPrivateFields == nil { + panic("getting test private fields failed") + } + if localTPrivateFields.parent == nil { + panic("parent of the test is nil") + } + dummyParent := &testing.T{} + copyTestWithoutParent(execOpts.options.t, dummyParent) + *localTPrivateFields.parent = unsafe.Pointer(dummyParent) - // Create a new local copy of `t` to isolate execution results - ptrToLocalT := &testing.T{} - copyTestWithoutParent(options.t, ptrToLocalT) + // Create an execution metadata instance + execMeta := createTestMetadata(ptrToLocalT, execOpts.options.t) + execMeta.hasAdditionalFeatureWrapper = true - // Create a dummy parent so we can run the test using this local copy - // without affecting the test parent - localTPrivateFields := getTestPrivateFields(ptrToLocalT) - *localTPrivateFields.parent = unsafe.Pointer(&testing.T{}) + // Propagate set tags from a parent wrapper + propagateTestExecutionMetadataFlags(execMeta, execOpts.originalExecutionMetadata) - // Create an execution metadata instance - execMeta := createTestMetadata(ptrToLocalT) - execMeta.hasAdditionalFeatureWrapper = true + // If we are in a retry execution, set the `isARetry` flag + execMeta.isARetry = currentIndex > 0 - // Propagate set tags from a parent wrapper - if originalExecMeta != nil { - if originalExecMeta.isANewTest { - execMeta.isANewTest = true - } - if originalExecMeta.isARetry { - execMeta.isARetry = true - } - } + // Adjust execution metadata + if execOpts.options.preExecMetaAdjust != nil { + execOpts.options.preExecMetaAdjust(execMeta, currentIndex) + } - // If we are in a retry execution, set the `isARetry` flag - if executionIndex > 0 { - execMeta.isARetry = true - } + // Set if we are in the last retry + if execMeta.isARetry { + execMeta.isLastRetry = execOpts.options.preIsLastRetry(execMeta, currentIndex, execOpts.retryCount) + } - // Adjust execution metadata - if options.execMetaAdjust != nil { - options.execMetaAdjust(execMeta, executionIndex) - } + // unlock the mutex + execOpts.mutex.Unlock() - // Run original func similar to how it gets run internally in tRunner - startTime := time.Now() - chn := make(chan struct{}, 1) - go func() { - defer func() { - chn <- struct{}{} - }() - options.targetFunc(ptrToLocalT) + // Run original func similar to how it gets run internally in tRunner + startTime := time.Now() + duration := time.Duration(0) + chn := make(chan struct{}, 1) + go func(pLocalT *testing.T, opts *runTestWithRetryOptions, cn *chan struct{}) { + defer func() { + *cn <- struct{}{} }() - <-chn - duration := time.Since(startTime) + defer func() { + // handle parallel sub tests execution + if localTPrivateFields.sub != nil { + if len(*localTPrivateFields.sub) > 0 { + if localTPrivateFields.barrier != nil { + close(*localTPrivateFields.barrier) + } + for _, sub := range *localTPrivateFields.sub { + pvSub := getTestPrivateFields(sub) + if pvSub.signal != nil { + <-*pvSub.signal + } + } + } + } + }() + defer func() { + duration = time.Since(startTime) + }() + pLocalT.Helper() + opts.t.Helper() + opts.targetFunc(pLocalT) + }(ptrToLocalT, execOpts.options, &chn) + <-chn + + // Call cleanup functions after this execution + if err := testingTRunCleanup(ptrToLocalT, 1); err != nil { + fmt.Printf("cleanup error: %v\n", err) + } - // Call cleanup functions after this execution - if err := testingTRunCleanup(ptrToLocalT, 1); err != nil { - fmt.Printf("cleanup error: %v\n", err) - } + // Lock mutex + execOpts.mutex.Lock() - // Copy the current test to the wrapper if necessary - if originalExecMeta != nil { - originalExecMeta.test = execMeta.test - } + // Copy the current test to the wrapper if necessary + if execOpts.originalExecutionMetadata != nil { + execOpts.originalExecutionMetadata.test = execMeta.test + } - // Extract module and suite if present - currentSuite := execMeta.test.Suite() - if suite == nil && currentSuite != nil { - suite = currentSuite - } - if module == nil && currentSuite != nil && currentSuite.Module() != nil { - module = currentSuite.Module() - } + // Extract module and suite if present + if execMeta.test == nil && execMeta.identity != nil { + log.Debug("execMeta.test nil for %s", execMeta.identity.FullName) + } + var currentSuite integrations.TestSuite + if execMeta.test != nil { + currentSuite = execMeta.test.Suite() + } + if execOpts.suite == nil && currentSuite != nil { + execOpts.suite = currentSuite + } + if execOpts.module == nil && currentSuite != nil && currentSuite.Module() != nil { + execOpts.module = currentSuite.Module() + } - // Remove execution metadata - deleteTestMetadata(ptrToLocalT) + // Remove execution metadata + deleteTestMetadata(ptrToLocalT) - // Handle panic data - if execMeta.panicData != nil { - ptrToLocalT.Fail() - if panicExecution == nil { - panicExecution = execMeta - } + // Handle panic data + if execMeta.panicData != nil { + ptrToLocalT.Fail() + if execOpts.panicExecutionMetadata == nil { + execOpts.panicExecutionMetadata = execMeta } + } - // Adjust retry count after first execution if necessary - if options.adjustRetryCount != nil && executionIndex == 0 { - retryCount = options.adjustRetryCount(duration) - } + // Adjust retry count after first execution if necessary + if execOpts.options.postAdjustRetryCount != nil && currentIndex == 0 { + execOpts.retryCount = execOpts.options.postAdjustRetryCount(execMeta, duration) + } - // Decrement retry count - retryCount-- + // Decrement retry count + execOpts.retryCount-- - // Call perExecution function - if options.perExecution != nil { - options.perExecution(ptrToLocalT, executionIndex, duration) - } + // Call perExecution function + if execOpts.options.postPerExecution != nil { + execOpts.options.postPerExecution(ptrToLocalT, execMeta, currentIndex, duration) + } - // Update lastPtrToLocalT - lastPtrToLocalT = ptrToLocalT + // Update lastPtrToLocalT and lastExecMeta + execOpts.ptrToLocalT = ptrToLocalT + execOpts.executionMetadata = execMeta - // Decide whether to continue - if !options.shouldRetry(ptrToLocalT, executionIndex, retryCount) { - break - } - } + // Decide whether to continue + return execOpts.options.postShouldRetry(ptrToLocalT, execMeta, currentIndex, execOpts.retryCount) +} - // Call onRetryEnd - if options.onRetryEnd != nil { - options.onRetryEnd(options.t, executionIndex, lastPtrToLocalT) +// propagateTestExecutionMetadataFlags propagates the test execution metadata flags from the original test execution metadata to the current one. +func propagateTestExecutionMetadataFlags(execMeta *testExecutionMetadata, originalExecMeta *testExecutionMetadata) { + if execMeta == nil || originalExecMeta == nil { + return } - // After all test executions, check if we need to close the suite and the module - if originalExecMeta == nil { - checkModuleAndSuite(module, suite) + // Propagate the test execution metadata + execMeta.isANewTest = execMeta.isANewTest || originalExecMeta.isANewTest + execMeta.isAModifiedTest = execMeta.isAModifiedTest || originalExecMeta.isAModifiedTest + execMeta.isARetry = execMeta.isARetry || originalExecMeta.isARetry + execMeta.isEarlyFlakeDetectionEnabled = execMeta.isEarlyFlakeDetectionEnabled || originalExecMeta.isEarlyFlakeDetectionEnabled + execMeta.isFlakyTestRetriesEnabled = execMeta.isFlakyTestRetriesEnabled || originalExecMeta.isFlakyTestRetriesEnabled + execMeta.isQuarantined = execMeta.isQuarantined || originalExecMeta.isQuarantined + execMeta.isDisabled = execMeta.isDisabled || originalExecMeta.isDisabled + if !execMeta.hasExplicitAttemptToFix && originalExecMeta.isAttemptToFix { + // Preserve attempt-to-fix inheritance only when the child didn't explicitly override it. + execMeta.isAttemptToFix = true } +} - // Re-panic if test failed and panic data exists - if options.t.Failed() && panicExecution != nil { - // Ensure we flush all CI visibility data and close the session event - integrations.ExitCiVisibility() - panic(fmt.Sprintf("test failed and panicked after %d retries.\n%v\n%v", executionIndex, panicExecution.panicData, panicExecution.panicStacktrace)) - } +// isAnEfdExecution checks if the current test execution is an Early Flake Detection execution. +func isAnEfdExecution(execMeta *testExecutionMetadata) bool { + isANewTest := execMeta.isANewTest + isAModifiedTest := execMeta.isAModifiedTest && !execMeta.isAttemptToFix + return execMeta.isEarlyFlakeDetectionEnabled && (isANewTest || isAModifiedTest) } +type noopMutex struct{} + +func (m *noopMutex) Lock() {} +func (m *noopMutex) Unlock() {} +func (m *noopMutex) TryLock() bool { return true } + //go:linkname testingTRunCleanup testing.(*common).runCleanup func testingTRunCleanup(c *testing.T, ph int) (panicVal any) diff --git a/internal/civisibility/integrations/gotesting/instrumentation_orchestrion.go b/internal/civisibility/integrations/gotesting/instrumentation_orchestrion.go index 2ae31b8e30..e96ea3efd2 100644 --- a/internal/civisibility/integrations/gotesting/instrumentation_orchestrion.go +++ b/internal/civisibility/integrations/gotesting/instrumentation_orchestrion.go @@ -6,6 +6,7 @@ package gotesting import ( + "context" "fmt" "os" "reflect" @@ -14,12 +15,15 @@ import ( "sync/atomic" "testing" "time" - _ "unsafe" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" + _ "unsafe" // required blank import to run orchestrion + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting/coverage" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // ****************************************************************************************************************** @@ -35,15 +39,36 @@ import ( func instrumentTestingM(m *testing.M) func(exitCode int) { // Check if CI Visibility was disabled using the kill switch before trying to initialize it atomic.StoreInt32(&ciVisibilityEnabledValue, -1) - if !isCiVisibilityEnabled() { - return func(exitCode int) {} + if !isCiVisibilityEnabled() || !testing.Testing() { + return func(_ int) {} } + log.Debug("instrumentTestingM: initializing CI Visibility for testing.M") + // Initialize CI Visibility integrations.EnsureCiVisibilityInitialization() // Create a new test session for CI visibility. - session = integrations.CreateTestSession() + session = integrations.CreateTestSession(integrations.WithTestSessionFramework(testFramework, runtime.Version())) + + coverageInitialized := false + settings := integrations.GetSettings() + if settings != nil { + if settings.CodeCoverage { + // Initialize the runtime coverage if enabled. + coverage.InitializeCoverage(m) + coverageInitialized = true + } + if settings.TestManagement.Enabled && internal.BoolEnv(constants.CIVisibilityTestManagementEnabledEnvironmentVariable, true) { + // Set the test management tag if enabled. + session.SetTag(constants.TestManagementEnabled, "true") + } + } + + // Check if the coverage was enabled by not initialized + if !coverageInitialized && testing.CoverMode() != "" { + coverage.InitializeCoverage(m) + } ddm := (*M)(m) @@ -60,9 +85,18 @@ func instrumentTestingM(m *testing.M) func(exitCode int) { } return func(exitCode int) { + log.Debug("instrumentTestingM: finished with exit code: %d", exitCode) + // Check for code coverage if enabled. if testing.CoverMode() != "" { - coveragePercentage := testing.Coverage() * 100 + // let's try first with our coverage package + cov := coverage.GetCoverage() + if cov == 0 { + // if not we try we the default testing package + cov = testing.Coverage() + } + + coveragePercentage := cov * 100 session.SetTag(constants.CodeCoveragePercentageOfTotalLines, coveragePercentage) } @@ -79,10 +113,12 @@ func instrumentTestingM(m *testing.M) func(exitCode int) { //go:linkname instrumentTestingTFunc func instrumentTestingTFunc(f func(*testing.T)) func(*testing.T) { // Check if CI Visibility was disabled using the kill switch before instrumenting - if !isCiVisibilityEnabled() { + if !isCiVisibilityEnabled() || !testing.Testing() { return f } + log.Debug("instrumentTestingTFunc: instrumenting test function") + // Reflect the function to obtain its pointer. fReflect := reflect.Indirect(reflect.ValueOf(f)) moduleName, suiteName := utils.GetModuleAndSuiteName(fReflect.Pointer()) @@ -96,96 +132,165 @@ func instrumentTestingTFunc(f func(*testing.T)) func(*testing.T) { } instrumentedFn := func(t *testing.T) { - // Initialize module counters if not already present. - if _, ok := modulesCounters[moduleName]; !ok { - var v int32 - modulesCounters[moduleName] = &v + // Check if we have testify suite data related to this test + testifyData := getTestifyTest(t) + if testifyData != nil { + // If we have testify data, we need to extract the module and suite name from the testify suite + moduleName = testifyData.moduleName + suiteName = testifyData.suiteName } - // Increment the test count in the module. - atomic.AddInt32(modulesCounters[moduleName], 1) - // Initialize suite counters if not already present. - if _, ok := suitesCounters[suiteName]; !ok { - var v int32 - suitesCounters[suiteName] = &v - } - // Increment the test count in the suite. - atomic.AddInt32(suitesCounters[suiteName], 1) + subtestIdentity := newTestIdentity(moduleName, suiteName, t.Name()) + isSubtest := len(subtestIdentity.Segments) > 1 - // Create or retrieve the module, suite, and test for CI visibility. - module := session.GetOrCreateModuleWithFramework(moduleName, testFramework, runtime.Version()) - suite := module.GetOrCreateSuite(suiteName) - test := suite.CreateTest(t.Name()) - test.SetTestFunc(originalFunc) + var testPrivateFields *commonPrivateFields + var parentExecMeta *testExecutionMetadata - // Get the metadata regarding the execution (in case is already created from the additional features) - execMeta := getTestMetadata(t) - if execMeta == nil { - // in case there's no additional features then we create the metadata for this execution and defer the disposal - execMeta = createTestMetadata(t) - defer deleteTestMetadata(t) - } + if isSubtest { + testPrivateFields = getTestPrivateFields(t) + if testPrivateFields != nil && testPrivateFields.parent != nil { + parentExecMeta = getTestMetadataFromPointer(*testPrivateFields.parent) + } + + settings := integrations.GetSettings() + shouldInstrument := settings != nil && settings.SubtestFeaturesEnabled + hasDirective := false + + log.Debug("subtest gating module=%s suite=%s identity=%s", moduleName, suiteName, subtestIdentity.FullName) - // Because this is a subtest let's propagate some execution metadata from the parent test - testPrivateFields := getTestPrivateFields(t) - if testPrivateFields.parent != nil { - parentExecMeta := getTestMetadataFromPointer(*testPrivateFields.parent) if parentExecMeta != nil { - if parentExecMeta.isANewTest { - execMeta.isANewTest = true + if parentExecMeta.isAttemptToFix || parentExecMeta.isDisabled || parentExecMeta.isQuarantined { + hasDirective = true + log.Debug("subtest gating parent directive for %s: attempt_to_fix=%t disabled=%t quarantined=%t", + subtestIdentity.FullName, parentExecMeta.isAttemptToFix, parentExecMeta.isDisabled, parentExecMeta.isQuarantined) } - if parentExecMeta.isARetry { - execMeta.isARetry = true + } + + if !hasDirective && shouldInstrument { + if data, matchKind, hasData := getTestManagementData(subtestIdentity); hasData && matchKind == testManagementMatchExact && data != nil { + if data.Disabled || data.Quarantined || data.AttemptToFix { + hasDirective = true + log.Debug("subtest gating exact match for %s: disabled=%t quarantined=%t attempt_to_fix=%t", + subtestIdentity.FullName, data.Disabled, data.Quarantined, data.AttemptToFix) + } + } else { + log.Debug("subtest gating no exact match for %s (hasData=%t matchKind=%d)", subtestIdentity.FullName, hasData, matchKind) } } } - // Set the CI visibility test. - execMeta.test = test - - // If the execution is for a new test we tag the test event from early flake detection - if execMeta.isANewTest { - // Set the is new test tag - test.SetTag(constants.TestIsNew, "true") + subtestInfo := &commonInfo{ + moduleName: moduleName, + suiteName: suiteName, + testName: subtestIdentity.FullName, + identity: subtestIdentity, } - // If the execution is a retry we tag the test event - if execMeta.isARetry { - // Set the retry tag - test.SetTag(constants.TestIsRetry, "true") - } + runSubtest := func(currentT *testing.T) { + localIdentity := subtestIdentity + if currentT.Name() != subtestIdentity.FullName { + // Nested subtests have their own full identity path. + localIdentity = newTestIdentity(moduleName, suiteName, currentT.Name()) + } + + addModulesCounters(moduleName, 1) + addSuitesCounters(suiteName, 1) + + log.Debug("instrumentTestingTFunc: creating test span for %s", currentT.Name()) + + module := session.GetOrCreateModule(moduleName) + suite := module.GetOrCreateSuite(suiteName) + test := suite.CreateTest(currentT.Name()) + + if testifyData != nil { + // Testify-based suites expose the original method so we should record that. + test.SetTestFunc(testifyData.methodFunc) + } else { + // Otherwise fall back to the standard testing function pointer. + test.SetTestFunc(originalFunc) + } - defer func() { - if r := recover(); r != nil { - // Handle panic and set error information. - test.SetErrorInfo("panic", fmt.Sprint(r), utils.GetStacktrace(1)) - test.Close(integrations.ResultStatusFail) + execMeta := getTestMetadata(currentT) + if execMeta == nil { + // Create fresh metadata when additional-feature wrappers were not executed above us. + execMeta = createTestMetadata(currentT, nil) + defer deleteTestMetadata(currentT) + } + execMeta.identity = localIdentity + + currentPrivates := getTestPrivateFields(currentT) + if currentPrivates != nil && currentPrivates.parent != nil { + parentFromCurrent := getTestMetadataFromPointer(*currentPrivates.parent) + propagateTestExecutionMetadataFlags(execMeta, parentFromCurrent) + } + + cancelExecution := setTestTagsFromExecutionMetadata(test, execMeta) + if cancelExecution { checkModuleAndSuite(module, suite) - // this is not an internal test. Retries are not applied to subtest (because the parent internal test is going to be retried) - // so for this case we avoid closing CI Visibility, but we don't stop the panic from happening. - // it will be handled by `t.Run` - if checkIfCIVisibilityExitIsRequiredByPanic() { - integrations.ExitCiVisibility() + return + } + + defer func() { + collectAndWriteLogs(currentT, test) + + if r := recover(); r != nil { + // Set failure metadata before rethrowing the panic. + if execMeta.isARetry && execMeta.isLastRetry { + if execMeta.allRetriesFailed { + test.SetTag(constants.TestHasFailedAllRetries, "true") + } + if execMeta.isAttemptToFix { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } + } + test.SetError(integrations.WithErrorInfo("panic", fmt.Sprint(r), utils.GetStacktrace(1))) + test.Close(integrations.ResultStatusFail) + checkModuleAndSuite(module, suite) + if checkIfCIVisibilityExitIsRequiredByPanic() && !execMeta.isAttemptToFix { + integrations.ExitCiVisibility() + } + panic(r) } - panic(r) - } else { - // Normal finalization: determine the test result based on its state. - if t.Failed() { + + if currentT.Failed() { + // Failure path: bubble up retry metadata so spans reflect attempts. + if execMeta.isARetry && execMeta.isLastRetry { + if execMeta.allRetriesFailed { + test.SetTag(constants.TestHasFailedAllRetries, "true") + } + if execMeta.isAttemptToFix { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } + } test.SetTag(ext.Error, true) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) test.Close(integrations.ResultStatusFail) - } else if t.Skipped() { + } else if currentT.Skipped() { + // Skip path still needs to communicate attempt-to-fix failure on the final run. + if execMeta.isAttemptToFix && execMeta.isARetry && execMeta.isLastRetry { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } test.Close(integrations.ResultStatusSkip) } else { + // Success path: tag attempt-to-fix success only if all retries eventually passed. + if execMeta.isAttemptToFix && execMeta.isARetry && execMeta.isLastRetry { + if execMeta.allAttemptsPassed { + test.SetTag(constants.TestAttemptToFixPassed, "true") + } else { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } + } test.Close(integrations.ResultStatusPass) } checkModuleAndSuite(module, suite) - } - }() + }() + + f(currentT) + } - // Execute the original test function. - f(t) + wrappedFunc := applyAdditionalFeaturesToTestFunc(runSubtest, subtestInfo, parentExecMeta) + wrappedFunc(t) } setInstrumentationMetadata(runtime.FuncForPC(reflect.Indirect(reflect.ValueOf(instrumentedFn)).Pointer()), &instrumentationMetadata{IsInternal: true}) @@ -204,7 +309,14 @@ func instrumentSetErrorInfo(tb testing.TB, errType string, errMessage string, sk // Get the CI Visibility span and check if we can set the error type, message and stack ciTestItem := getTestMetadata(tb) if ciTestItem != nil && ciTestItem.test != nil && ciTestItem.error.CompareAndSwap(0, 1) { - ciTestItem.test.SetErrorInfo(errType, errMessage, utils.GetStacktrace(2+skip)) + log.Debug("instrumentSetErrorInfo: setting error info [name: %q, type: %q, message: %q]", ciTestItem.test.Name(), errType, errMessage) + ciTestItem.test.SetError(integrations.WithErrorInfo(errType, errMessage, utils.GetStacktrace(2+skip))) + + // Ensure to close the test with error before CI visibility exits. In CI visibility mode, we try to never lose data. + // If the test gets closed sooner (perhaps with another status), then this will be a noop call + integrations.PushCiVisibilityCloseAction(func() { + ciTestItem.test.Close(integrations.ResultStatusFail) + }) } } @@ -220,7 +332,8 @@ func instrumentCloseAndSkip(tb testing.TB, skipReason string) { // Get the CI Visibility span and check if we can mark it as skipped and close it ciTestItem := getTestMetadata(tb) if ciTestItem != nil && ciTestItem.test != nil && ciTestItem.skipped.CompareAndSwap(0, 1) { - ciTestItem.test.CloseWithFinishTimeAndSkipReason(integrations.ResultStatusSkip, time.Now(), skipReason) + log.Debug("instrumentCloseAndSkip: skipping test [name: %q, reason: %q]", ciTestItem.test.Name(), skipReason) + ciTestItem.test.Close(integrations.ResultStatusSkip, integrations.WithTestSkipReason(skipReason)) } } @@ -236,6 +349,7 @@ func instrumentSkipNow(tb testing.TB) { // Get the CI Visibility span and check if we can mark it as skipped and close it ciTestItem := getTestMetadata(tb) if ciTestItem != nil && ciTestItem.test != nil && ciTestItem.skipped.CompareAndSwap(0, 1) { + log.Debug("instrumentSkipNow: skipping test [name: %q]", ciTestItem.test.Name()) ciTestItem.test.Close(integrations.ResultStatusSkip) } } @@ -249,6 +363,8 @@ func instrumentTestingBFunc(pb *testing.B, name string, f func(*testing.B)) (str return name, f } + log.Debug("instrumentTestingBFunc: instrumenting benchmark function [name: %q]", name) + // Reflect the function to obtain its pointer. fReflect := reflect.Indirect(reflect.ValueOf(f)) moduleName, suiteName := utils.GetModuleAndSuiteName(fReflect.Pointer()) @@ -269,34 +385,29 @@ func instrumentTestingBFunc(pb *testing.B, name string, f func(*testing.B)) (str // benchmark/[DD:TestVisibility]/child // We use regex and decrement the depth level of the benchmark to restore the original name - // Initialize module counters if not already present. - if _, ok := modulesCounters[moduleName]; !ok { - var v int32 - modulesCounters[moduleName] = &v - } // Increment the test count in the module. - atomic.AddInt32(modulesCounters[moduleName], 1) + addModulesCounters(moduleName, 1) - // Initialize suite counters if not already present. - if _, ok := suitesCounters[suiteName]; !ok { - var v int32 - suitesCounters[suiteName] = &v - } // Increment the test count in the suite. - atomic.AddInt32(suitesCounters[suiteName], 1) + addSuitesCounters(suiteName, 1) // Decrement level. bpf := getBenchmarkPrivateFields(b) + if bpf == nil { + panic("error getting private fields of the benchmark") + } bpf.AddLevel(-1) startTime := time.Now() - module := session.GetOrCreateModuleWithFrameworkAndStartTime(moduleName, testFramework, runtime.Version(), startTime) - suite := module.GetOrCreateSuiteWithStartTime(suiteName, startTime) - test := suite.CreateTestWithStartTime(fmt.Sprintf("%s/%s", pb.Name(), name), startTime) + module := session.GetOrCreateModule(moduleName, integrations.WithTestModuleStartTime(startTime)) + suite := module.GetOrCreateSuite(suiteName, integrations.WithTestSuiteStartTime(startTime)) + test := suite.CreateTest(fmt.Sprintf("%s/%s", pb.Name(), name), integrations.WithTestStartTime(startTime)) test.SetTestFunc(originalFunc) // Restore the original name without the sub-benchmark auto name. - *bpf.name = subBenchmarkAutoNameRegex.ReplaceAllString(*bpf.name, "") + if bpf.name != nil { + *bpf.name = subBenchmarkAutoNameRegex.ReplaceAllString(*bpf.name, "") + } // Run original benchmark. var iPfOfB *benchmarkPrivateFields @@ -317,14 +428,21 @@ func instrumentTestingBFunc(pb *testing.B, name string, f func(*testing.B)) (str // First time we get the private fields of the inner testing.B. iPfOfB = getBenchmarkPrivateFields(b) + if iPfOfB == nil { + panic("error getting private fields of the benchmark") + } + // Replace this function with the original one (executed only once - the first iteration[b.run1]). + if iPfOfB.benchFunc == nil { + panic("error getting the benchmark function") + } *iPfOfB.benchFunc = f // Get the metadata regarding the execution (in case is already created from the additional features) execMeta := getTestMetadata(b) if execMeta == nil { // in case there's no additional features then we create the metadata for this execution and defer the disposal - execMeta = createTestMetadata(b) + execMeta = createTestMetadata(b, nil) defer deleteTestMetadata(b) } @@ -373,7 +491,7 @@ func instrumentTestingBFunc(pb *testing.B, name string, f func(*testing.B)) (str // Define a function to handle panic during benchmark finalization. panicFunc := func(r any) { - test.SetErrorInfo("panic", fmt.Sprint(r), utils.GetStacktrace(1)) + test.SetError(integrations.WithErrorInfo("panic", fmt.Sprint(r), utils.GetStacktrace(1))) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) test.Close(integrations.ResultStatusFail) @@ -387,11 +505,11 @@ func instrumentTestingBFunc(pb *testing.B, name string, f func(*testing.B)) (str test.SetTag(ext.Error, true) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) - test.CloseWithFinishTime(integrations.ResultStatusFail, endTime) + test.Close(integrations.ResultStatusFail, integrations.WithTestFinishTime(endTime)) } else if iPfOfB.B.Skipped() { - test.CloseWithFinishTime(integrations.ResultStatusSkip, endTime) + test.Close(integrations.ResultStatusSkip, integrations.WithTestFinishTime(endTime)) } else { - test.CloseWithFinishTime(integrations.ResultStatusPass, endTime) + test.Close(integrations.ResultStatusPass, integrations.WithTestFinishTime(endTime)) } checkModuleAndSuite(module, suite) @@ -400,3 +518,56 @@ func instrumentTestingBFunc(pb *testing.B, name string, f func(*testing.B)) (str setCiVisibilityBenchmarkFunc(runtime.FuncForPC(reflect.Indirect(reflect.ValueOf(instrumentedFunc)).Pointer())) return subBenchmarkAutoName, instrumentedFunc } + +// instrumentTestifySuiteRun helper function to instrument the testify Suite.Run function +// +//go:linkname instrumentTestifySuiteRun +func instrumentTestifySuiteRun(t *testing.T, suite any) { + log.Debug("instrumentTestifySuiteRun: instrumenting testify suite run") + registerTestifySuite(t, suite) +} + +// getTestOptimizationContext helper function to get the context of the test +// +//go:linkname getTestOptimizationContext +func getTestOptimizationContext(tb testing.TB) context.Context { + if iTest := getTestOptimizationTest(tb); iTest != nil { + log.Debug("getTestOptimizationContext: returning context from test") + return iTest.Context() + } + + return context.Background() +} + +// getTestOptimizationTest helper function to get the test optimization test of the testing.TB +// +//go:linkname getTestOptimizationTest +func getTestOptimizationTest(tb testing.TB) integrations.Test { + ciTestItem := getTestMetadata(tb) + if ciTestItem != nil && ciTestItem.test != nil { + log.Debug("getTestOptimizationTest: returning test from metadata") + return ciTestItem.test + } + + return nil +} + +// instrumentTestingParallel helper function to instrument the Parallel method of a `*testing.T` instance +// +//go:linkname instrumentTestingParallel +func instrumentTestingParallel(t *testing.T) bool { + // Check if CI Visibility was disabled using the kill switch before + if !isCiVisibilityEnabled() { + return false + } + + meta := getTestMetadata(t) + if meta != nil && meta.originalTest != nil { + // if we have an original test, we call parallel on it + log.Debug("instrumentTestingParallel: calling Parallel on original test") + meta.originalTest.Parallel() + return true + } + + return false +} diff --git a/internal/civisibility/integrations/gotesting/orchestrion.yml b/internal/civisibility/integrations/gotesting/orchestrion.yml new file mode 100644 index 0000000000..a79530e2d0 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/orchestrion.yml @@ -0,0 +1,250 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting + description: Testing instrumentation + +aspects: + - id: M.Run + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Run + - receiver: '*testing.M' + advice: + - inject-declarations: + links: + - github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting + template: |- + //go:linkname __dd_civisibility_instrumentTestingM github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentTestingM + func __dd_civisibility_instrumentTestingM(*M) func(int) + - prepend-statements: + template: |- + exitFunc := __dd_civisibility_instrumentTestingM({{ .Function.Receiver }}) + defer func() { exitFunc({{ .Function.Receiver }}.exitCode) }() + + - id: T.Run + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Run + - receiver: '*testing.T' + advice: + - inject-declarations: + links: + - github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting + - github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations + template: |- + //go:linkname __dd_civisibility_instrumentTestingTFunc github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentTestingTFunc + func __dd_civisibility_instrumentTestingTFunc(func(*T)) func(*T) + + //go:linkname __dd_civisibility_instrumentSetErrorInfo github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentSetErrorInfo + func __dd_civisibility_instrumentSetErrorInfo(tb TB, errType string, errMessage string, skip int) + + //go:linkname __dd_civisibility_instrumentCloseAndSkip github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentCloseAndSkip + func __dd_civisibility_instrumentCloseAndSkip(tb TB, skipReason string) + + //go:linkname __dd_civisibility_instrumentSkipNow github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentSkipNow + func __dd_civisibility_instrumentSkipNow(tb TB) + + //go:linkname __dd_civisibility_instrumentTestingParallel github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentTestingParallel + func __dd_civisibility_instrumentTestingParallel(t *T) bool + + //go:linkname __dd_civisibility_ExitCiVisibility github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations.ExitCiVisibility + func __dd_civisibility_ExitCiVisibility() + + - prepend-statements: + template: |- + {{ .Function.Argument 1 }} = __dd_civisibility_instrumentTestingTFunc({{ .Function.Argument 1 }}) + + - id: B.Run + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Run + - receiver: '*testing.B' + advice: + - inject-declarations: + links: + - github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting + template: |- + //go:linkname __dd_civisibility_instrumentTestingBFunc github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentTestingBFunc + func __dd_civisibility_instrumentTestingBFunc(*B, string, func(*B)) (string, func(*B)) + - prepend-statements: + template: |- + {{ .Function.Argument 0 }}, {{ .Function.Argument 1 }} = __dd_civisibility_instrumentTestingBFunc({{ .Function.Receiver }}, {{ .Function.Argument 0 }}, {{ .Function.Argument 1 }}) + + - id: common.Fail + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Fail + - receiver: '*testing.common' + advice: + - prepend-statements: + template: |- + __dd_civisibility_instrumentSetErrorInfo({{ .Function.Receiver }}, "Fail", "failed test", 0) + + - id: common.FailNow + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: FailNow + - receiver: '*testing.common' + advice: + - prepend-statements: + template: |- + __dd_civisibility_instrumentSetErrorInfo({{ .Function.Receiver }}, "FailNow", "failed test", 0) + defer __dd_civisibility_ExitCiVisibility() + + - id: common.Error + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Error + - receiver: '*testing.common' + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + __dd_civisibility_instrumentSetErrorInfo({{ .Function.Receiver }}, "Error", fmt.Sprint({{ .Function.Argument 0 }}...), 0) + + - id: common.Errorf + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Errorf + - receiver: '*testing.common' + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + __dd_civisibility_instrumentSetErrorInfo({{ .Function.Receiver }}, "Errorf", fmt.Sprintf({{ .Function.Argument 0 }}, {{ .Function.Argument 1 }}...), 0) + + - id: common.Fatal + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Fatal + - receiver: '*testing.common' + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + __dd_civisibility_instrumentSetErrorInfo({{ .Function.Receiver }}, "Fatal", fmt.Sprint({{ .Function.Argument 0 }}...), 0) + + - id: common.Fatalf + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Fatalf + - receiver: '*testing.common' + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + __dd_civisibility_instrumentSetErrorInfo({{ .Function.Receiver }}, "Fatalf", fmt.Sprintf({{ .Function.Argument 0 }}, {{ .Function.Argument 1 }}...), 0) + + - id: common.Skip + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Skip + - receiver: '*testing.common' + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + __dd_civisibility_instrumentCloseAndSkip({{ .Function.Receiver }}, fmt.Sprint({{ .Function.Argument 0 }}...)) + + - id: common.Skipf + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Skipf + - receiver: '*testing.common' + advice: + - prepend-statements: + imports: + fmt: fmt + template: |- + __dd_civisibility_instrumentCloseAndSkip({{ .Function.Receiver }}, fmt.Sprintf({{ .Function.Argument 0 }}, {{ .Function.Argument 1 }}...)) + + - id: common.SkipNow + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: SkipNow + - receiver: '*testing.common' + advice: + - prepend-statements: + template: |- + __dd_civisibility_instrumentSkipNow({{ .Function.Receiver }}) + + - id: common.Parallel + join-point: + all-of: + - import-path: testing + - function-body: + function: + - name: Parallel + - receiver: '*testing.T' + advice: + - prepend-statements: + template: |- + defer func() { _ = __dd_civisibility_instrumentTestingParallel({{ .Function.Receiver }}) }() + + - id: testify.suite.Run + join-point: + all-of: + - import-path: github.com/stretchr/testify/suite + - function-body: + function: + - name: Run + - signature: + args: ['*testing.T' , 'TestingSuite'] + advice: + - inject-declarations: + imports: + testing: testing + links: + - github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting + template: |- + //go:linkname __dd_civisibility_instrumentTestifySuiteRun github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting.instrumentTestifySuiteRun + func __dd_civisibility_instrumentTestifySuiteRun(*testing.T, interface{}) + - prepend-statements: + template: |- + __dd_civisibility_instrumentTestifySuiteRun({{ .Function.Argument 0 }}, {{ .Function.Argument 1 }}) diff --git a/internal/civisibility/integrations/gotesting/reflections.go b/internal/civisibility/integrations/gotesting/reflections.go index 745aab1468..b637adb26c 100644 --- a/internal/civisibility/integrations/gotesting/reflections.go +++ b/internal/civisibility/integrations/gotesting/reflections.go @@ -6,6 +6,8 @@ package gotesting import ( + "bytes" + "context" "errors" "io" "reflect" @@ -35,6 +37,11 @@ func getFieldPointerFromValue(value reflect.Value, fieldName string) (unsafe.Poi // copyFieldUsingPointers copies a private field value from one struct to another of the same type func copyFieldUsingPointers[V any](source any, target any, fieldName string) error { + return copyFieldUsingPointersWithConversion[V](source, target, fieldName, func(sourceValue V) V { return sourceValue }) +} + +// copyFieldUsingPointersWithConversion copies a private field value from one struct to another of the same type +func copyFieldUsingPointersWithConversion[V any](source any, target any, fieldName string, convertFunc func(sourceValue V) V) error { sourcePtr, err := getFieldPointerFrom(source, fieldName) if err != nil { return err @@ -44,7 +51,23 @@ func copyFieldUsingPointers[V any](source any, target any, fieldName string) err return err } - *(*V)(targetPtr) = *(*V)(sourcePtr) + if targetPtr == nil { + return errors.New("target pointer is nil") + } + + if sourcePtr == nil { + return errors.New("source pointer is nil") + } + + if (*V)(targetPtr) == nil { + return errors.New("target pointer value is nil") + } + + if (*V)(sourcePtr) == nil { + return errors.New("source pointer value is nil") + } + + *(*V)(targetPtr) = convertFunc(*(*V)(sourcePtr)) return nil } @@ -55,36 +78,84 @@ func copyFieldUsingPointers[V any](source any, target any, fieldName string) err // commonPrivateFields is collection of required private fields from testing.common type commonPrivateFields struct { mu *sync.RWMutex + output *[]byte // Output generated by test or benchmark. level *int name *string // Name of test or benchmark. failed *bool // Test or benchmark has failed. skipped *bool // Test or benchmark has been skipped. parent *unsafe.Pointer // Parent common + barrier *chan bool // Barrier for parallel tests + signal *chan bool // Signal channel for test completion + sub *[]*testing.T // Queue of subtests to be run in parallel. } // AddLevel increase or decrease the testing.common.level field value, used by // testing.B to create the name of the benchmark test func (c *commonPrivateFields) AddLevel(delta int) int { + if c.mu == nil { + return 0 + } c.mu.Lock() defer c.mu.Unlock() + if c.level == nil { + return 0 + } *c.level = *c.level + delta return *c.level } // SetFailed set the boolean value in testing.common.failed field value func (c *commonPrivateFields) SetFailed(value bool) { + if c.mu == nil { + return + } c.mu.Lock() defer c.mu.Unlock() + if c.failed == nil { + return + } *c.failed = value } // SetSkipped set the boolean value in testing.common.skipped field value func (c *commonPrivateFields) SetSkipped(value bool) { + if c.mu == nil { + return + } c.mu.Lock() defer c.mu.Unlock() + if c.skipped == nil { + return + } *c.skipped = value } +// GetOutput returns the output generated by the test or benchmark +func (c *commonPrivateFields) GetOutput() []byte { + if c.mu == nil { + return nil + } + c.mu.RLock() + defer c.mu.RUnlock() + if c.output == nil { + return nil + } + return *c.output +} + +// AppendOutput appends the output generated by the test or benchmark +func (c *commonPrivateFields) AppendOutput(output []byte) { + if c.mu == nil { + return + } + c.mu.Lock() + defer c.mu.Unlock() + if c.output == nil { + return + } + *c.output = append(*c.output, output...) +} + // **************** // TESTING // **************** @@ -92,7 +163,7 @@ func (c *commonPrivateFields) SetSkipped(value bool) { // getInternalTestArray gets the pointer to the testing.InternalTest array inside a // testing.M instance containing all the "root" tests func getInternalTestArray(m *testing.M) *[]testing.InternalTest { - if ptr, err := getFieldPointerFrom(m, "tests"); err == nil { + if ptr, err := getFieldPointerFrom(m, "tests"); err == nil && ptr != nil { return (*[]testing.InternalTest)(ptr) } return nil @@ -104,24 +175,36 @@ func getTestPrivateFields(t *testing.T) *commonPrivateFields { testFields := &commonPrivateFields{} // testing.common - if ptr, err := getFieldPointerFrom(t, "mu"); err == nil { + if ptr, err := getFieldPointerFrom(t, "mu"); err == nil && ptr != nil { testFields.mu = (*sync.RWMutex)(ptr) } - if ptr, err := getFieldPointerFrom(t, "level"); err == nil { + if ptr, err := getFieldPointerFrom(t, "output"); err == nil && ptr != nil { + testFields.output = (*[]byte)(ptr) + } + if ptr, err := getFieldPointerFrom(t, "level"); err == nil && ptr != nil { testFields.level = (*int)(ptr) } - if ptr, err := getFieldPointerFrom(t, "name"); err == nil { + if ptr, err := getFieldPointerFrom(t, "name"); err == nil && ptr != nil { testFields.name = (*string)(ptr) } - if ptr, err := getFieldPointerFrom(t, "failed"); err == nil { + if ptr, err := getFieldPointerFrom(t, "failed"); err == nil && ptr != nil { testFields.failed = (*bool)(ptr) } - if ptr, err := getFieldPointerFrom(t, "skipped"); err == nil { + if ptr, err := getFieldPointerFrom(t, "skipped"); err == nil && ptr != nil { testFields.skipped = (*bool)(ptr) } - if ptr, err := getFieldPointerFrom(t, "parent"); err == nil { + if ptr, err := getFieldPointerFrom(t, "parent"); err == nil && ptr != nil { testFields.parent = (*unsafe.Pointer)(ptr) } + if ptr, err := getFieldPointerFrom(t, "barrier"); err == nil { + testFields.barrier = (*chan bool)(ptr) + } + if ptr, err := getFieldPointerFrom(t, "signal"); err == nil { + testFields.signal = (*chan bool)(ptr) + } + if ptr, err := getFieldPointerFrom(t, "sub"); err == nil { + testFields.sub = (*[]*testing.T)(ptr) + } return testFields } @@ -136,21 +219,27 @@ func getTestParentPrivateFields(t *testing.T) *commonPrivateFields { testFields := &commonPrivateFields{} // testing.common - if ptr, err := getFieldPointerFromValue(value, "mu"); err == nil { + if ptr, err := getFieldPointerFromValue(value, "mu"); err == nil && ptr != nil { testFields.mu = (*sync.RWMutex)(ptr) } - if ptr, err := getFieldPointerFromValue(value, "level"); err == nil { + if ptr, err := getFieldPointerFromValue(value, "output"); err == nil && ptr != nil { + testFields.output = (*[]byte)(ptr) + } + if ptr, err := getFieldPointerFromValue(value, "level"); err == nil && ptr != nil { testFields.level = (*int)(ptr) } - if ptr, err := getFieldPointerFromValue(value, "name"); err == nil { + if ptr, err := getFieldPointerFromValue(value, "name"); err == nil && ptr != nil { testFields.name = (*string)(ptr) } - if ptr, err := getFieldPointerFromValue(value, "failed"); err == nil { + if ptr, err := getFieldPointerFromValue(value, "failed"); err == nil && ptr != nil { testFields.failed = (*bool)(ptr) } - if ptr, err := getFieldPointerFromValue(value, "skipped"); err == nil { + if ptr, err := getFieldPointerFromValue(value, "skipped"); err == nil && ptr != nil { testFields.skipped = (*bool)(ptr) } + if ptr, err := getFieldPointerFromValue(value, "barrier"); err == nil { + testFields.barrier = (*chan bool)(ptr) + } return testFields } @@ -159,15 +248,21 @@ func getTestParentPrivateFields(t *testing.T) *commonPrivateFields { // contextMatcher is collection of required private fields from testing.context.match type contextMatcher struct { - mu *sync.RWMutex + mu *sync.Mutex subNames *map[string]int32 } // ClearSubNames clears the subname map used for creating unique names for subtests func (c *contextMatcher) ClearSubNames() { + if c.mu == nil { + return + } c.mu.Lock() defer c.mu.Unlock() - *c.subNames = map[string]int32{} + if c.subNames == nil || *c.subNames == nil { + return + } + clear(*c.subNames) } // getTestContextMatcherPrivateFields is a method to retrieve all required privates field from @@ -176,7 +271,11 @@ func getTestContextMatcherPrivateFields(t *testing.T) *contextMatcher { indirectValue := reflect.Indirect(reflect.ValueOf(t)) contextMember := indirectValue.FieldByName("context") if !contextMember.IsValid() { - return nil + // In 1.24 they changed the name of the field to tstate + contextMember = indirectValue.FieldByName("tstate") + if !contextMember.IsValid() { + return nil + } } contextMember = contextMember.Elem() matchMember := contextMember.FieldByName("match") @@ -186,21 +285,27 @@ func getTestContextMatcherPrivateFields(t *testing.T) *contextMatcher { matchMember = matchMember.Elem() fields := &contextMatcher{} - if ptr, err := getFieldPointerFromValue(matchMember, "mu"); err == nil { - fields.mu = (*sync.RWMutex)(ptr) + if ptr, err := getFieldPointerFromValue(matchMember, "mu"); err == nil && ptr != nil { + fields.mu = (*sync.Mutex)(ptr) } - if ptr, err := getFieldPointerFromValue(matchMember, "subNames"); err == nil { + if ptr, err := getFieldPointerFromValue(matchMember, "subNames"); err == nil && ptr != nil { fields.subNames = (*map[string]int32)(ptr) } return fields } +var copyMutex sync.Mutex // Mutex to protect concurrent read and writes to testing.T + // copyTestWithoutParent tries to copy all private fields except the t.parent from a *testing.T to another func copyTestWithoutParent(source *testing.T, target *testing.T) { + copyMutex.Lock() + defer copyMutex.Unlock() // Copy important field values - _ = copyFieldUsingPointers[[]byte](source, target, "output") // Output generated by test or benchmark. - _ = copyFieldUsingPointers[io.Writer](source, target, "w") // For flushToParent. + _ = copyFieldUsingPointers[[]byte](source, target, "output") // Output generated by test or benchmark. + _ = copyFieldUsingPointersWithConversion[io.Writer](source, target, "w", func(sourceValue io.Writer) io.Writer { + return getThreadSafeWriter(sourceValue) // Wrap the original writer in a thread-safe writer. + }) // For flushToParent. _ = copyFieldUsingPointers[bool](source, target, "ran") // Test or benchmark (or one of its subtests) was executed. _ = copyFieldUsingPointers[bool](source, target, "failed") // Test or benchmark has failed. _ = copyFieldUsingPointers[bool](source, target, "skipped") // Test or benchmark has been skipped. @@ -234,6 +339,155 @@ func copyTestWithoutParent(source *testing.T, target *testing.T) { _ = copyFieldUsingPointers[bool](source, target, "isEnvSet") _ = copyFieldUsingPointers[unsafe.Pointer](source, target, "context") // For running tests and subtests. + + // New 1.24 fields + _ = copyFieldUsingPointers[context.Context](source, target, "ctx") + _ = copyFieldUsingPointers[context.CancelFunc](source, target, "cancelCtx") + + _ = copyFieldUsingPointers[bool](source, target, "denyParallel") + _ = copyFieldUsingPointers[unsafe.Pointer](source, target, "tstate") // For running tests and subtests. +} + +// createNewTest creates a new testing.T instance +func createNewTest() *testing.T { + nT := &testing.T{} + var ctxPtr *context.Context + if ptr, err := getFieldPointerFrom(nT, "barrier"); err == nil && ptr != nil { + value := (*chan bool)(ptr) + *value = make(chan bool) // Initialize the barrier channel + } + if ptr, err := getFieldPointerFrom(nT, "signal"); err == nil && ptr != nil { + value := (*chan bool)(ptr) + *value = make(chan bool, 1) // Initialize the signal channel + } + if ptr, err := getFieldPointerFrom(nT, "ctx"); err == nil && ptr != nil { + ctxPtr = (*context.Context)(ptr) + *ctxPtr = context.Background() // Initialize the context + } + if ptr, err := getFieldPointerFrom(nT, "cancelCtx"); err == nil && ptr != nil && ctxPtr != nil { + ctx, cancelCtx := context.WithCancel(*ctxPtr) + value := (*context.CancelFunc)(ptr) + *ctxPtr = ctx // Update the context with the new one + *value = cancelCtx // Initialize the cancel function + } + return nT +} + +// chattyPrinter is a struct that holds the private fields of testing.T.chatty +type chattyPrinter struct { + w *io.Writer // Writer to which output is sent. + lastName *string // Last name used for output. +} + +// getTestChattyPrinter retrieves the chattyPrinter from a testing.T instance. +func getTestChattyPrinter(t *testing.T) *chattyPrinter { + indirectValue := reflect.Indirect(reflect.ValueOf(t)) + contextMember := indirectValue.FieldByName("chatty") + if !contextMember.IsValid() { + return nil + } + contextMember = contextMember.Elem() + if !contextMember.IsValid() { + return nil + } + + fields := &chattyPrinter{} + if ptr, err := getFieldPointerFromValue(contextMember, "w"); err == nil && ptr != nil { + fields.w = (*io.Writer)(ptr) + } + if ptr, err := getFieldPointerFromValue(contextMember, "lastName"); err == nil && ptr != nil { + fields.lastName = (*string)(ptr) + } else { + fields.lastName = new(string) // Initialize to avoid nil pointer dereference + } + + return fields +} + +type customWriter struct { + mu sync.Mutex // Mutex to protect concurrent writes. + chatty *chattyPrinter // Pointer to the chattyPrinter for output. + writer io.Writer // The original writer to which output is sent. + outputs map[string]*bytes.Buffer // Map to store outputs by test name. +} + +// internalWrite writes the output to the internal buffer of customWriter. +func (cw *customWriter) internalWrite(lastName string, p []byte) { + // get the lock + cw.mu.Lock() + defer cw.mu.Unlock() + if cw.outputs == nil { + cw.outputs = make(map[string]*bytes.Buffer) + } + var buf *bytes.Buffer + if v, ok := cw.outputs[lastName]; !ok { + buf = new(bytes.Buffer) + cw.outputs[lastName] = buf + } else { + buf = v + } + buf.Write(p) +} + +// Write implements the io.Writer interface for customWriter. +func (cw *customWriter) Write(p []byte) (n int, err error) { + if cw.chatty == nil || cw.chatty.w == nil { + return 0, errors.New("chattyPrinter is not initialized") + } + + // Write to the internal buffer + cw.internalWrite(*cw.chatty.lastName, p) + + // Use the chattyPrinter's writer to write the output + if cw.writer != nil { + return cw.writer.Write(p) + } + return len(p), nil +} + +// GetOutput retrieves the output for a specific test name from the customWriter. +func (cw *customWriter) GetOutput(name string) string { + cw.mu.Lock() + defer cw.mu.Unlock() + if buf, ok := cw.outputs[name]; ok { + return buf.String() + } + return "" +} + +type threadSafeWriter struct { + mu sync.Mutex // Mutex to protect concurrent writes. + writer io.Writer // The original writer to which output is sent. +} + +// Write implements the io.Writer interface for threadSafeWriter. +func (tsw *threadSafeWriter) Write(p []byte) (n int, err error) { + tsw.mu.Lock() + defer tsw.mu.Unlock() + copyMutex.Lock() + defer copyMutex.Unlock() + return tsw.writer.Write(p) +} + +// threadSafeWriters is a map to hold thread-safe writers for each original writer +var threadSafeWriters = make(map[io.Writer]io.Writer) + +// threadSafeWritersMu is a mutex to protect access to the threadSafeWriters map +var threadSafeWritersMu sync.Mutex + +// getThreadSafeWriter returns a thread-safe writer for the given writer. +func getThreadSafeWriter(writer io.Writer) io.Writer { + threadSafeWritersMu.Lock() + defer threadSafeWritersMu.Unlock() + if writer == nil { + return nil + } + if tsw, ok := threadSafeWriters[writer]; ok { + return tsw + } + tsw := &threadSafeWriter{writer: writer} + threadSafeWriters[writer] = tsw + return tsw } // **************** @@ -244,7 +498,7 @@ func copyTestWithoutParent(source *testing.T, target *testing.T) { // getInternalBenchmarkArray gets the pointer to the testing.InternalBenchmark array inside // a testing.M instance containing all the "root" benchmarks func getInternalBenchmarkArray(m *testing.M) *[]testing.InternalBenchmark { - if ptr, err := getFieldPointerFrom(m, "benchmarks"); err == nil { + if ptr, err := getFieldPointerFrom(m, "benchmarks"); err == nil && ptr != nil { return (*[]testing.InternalBenchmark)(ptr) } return nil @@ -267,30 +521,30 @@ func getBenchmarkPrivateFields(b *testing.B) *benchmarkPrivateFields { } // testing.common - if ptr, err := getFieldPointerFrom(b, "mu"); err == nil { + if ptr, err := getFieldPointerFrom(b, "mu"); err == nil && ptr != nil { benchFields.mu = (*sync.RWMutex)(ptr) } - if ptr, err := getFieldPointerFrom(b, "level"); err == nil { + if ptr, err := getFieldPointerFrom(b, "level"); err == nil && ptr != nil { benchFields.level = (*int)(ptr) } - if ptr, err := getFieldPointerFrom(b, "name"); err == nil { + if ptr, err := getFieldPointerFrom(b, "name"); err == nil && ptr != nil { benchFields.name = (*string)(ptr) } - if ptr, err := getFieldPointerFrom(b, "failed"); err == nil { + if ptr, err := getFieldPointerFrom(b, "failed"); err == nil && ptr != nil { benchFields.failed = (*bool)(ptr) } - if ptr, err := getFieldPointerFrom(b, "skipped"); err == nil { + if ptr, err := getFieldPointerFrom(b, "skipped"); err == nil && ptr != nil { benchFields.skipped = (*bool)(ptr) } - if ptr, err := getFieldPointerFrom(b, "parent"); err == nil { + if ptr, err := getFieldPointerFrom(b, "parent"); err == nil && ptr != nil { benchFields.parent = (*unsafe.Pointer)(ptr) } // testing.B - if ptr, err := getFieldPointerFrom(b, "benchFunc"); err == nil { + if ptr, err := getFieldPointerFrom(b, "benchFunc"); err == nil && ptr != nil { benchFields.benchFunc = (*func(b *testing.B))(ptr) } - if ptr, err := getFieldPointerFrom(b, "result"); err == nil { + if ptr, err := getFieldPointerFrom(b, "result"); err == nil && ptr != nil { benchFields.result = (*testing.BenchmarkResult)(ptr) } diff --git a/internal/civisibility/integrations/gotesting/reflections_test.go b/internal/civisibility/integrations/gotesting/reflections_test.go index 453cd7a0e9..1b16577091 100644 --- a/internal/civisibility/integrations/gotesting/reflections_test.go +++ b/internal/civisibility/integrations/gotesting/reflections_test.go @@ -12,6 +12,8 @@ import ( "github.com/stretchr/testify/assert" ) +//dd:suite.unskippable + // TestGetFieldPointerFrom tests the getFieldPointerFrom function. func TestGetFieldPointerFrom(t *testing.T) { // Create a mock struct with a private field @@ -126,7 +128,7 @@ func TestGetBenchmarkPrivateFields(t *testing.T) { // Set values to the private fields *benchFields.name = "BenchmarkTest" *benchFields.level = 1 - *benchFields.benchFunc = func(b *testing.B) {} + *benchFields.benchFunc = func(_ *testing.B) {} *benchFields.result = testing.BenchmarkResult{} // Check that the private fields have the expected values diff --git a/internal/civisibility/integrations/gotesting/subtests/fixtures_test.go b/internal/civisibility/integrations/gotesting/subtests/fixtures_test.go new file mode 100644 index 0000000000..1eb553ea95 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/subtests/fixtures_test.go @@ -0,0 +1,46 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package subtests + +import ( + "os" + "testing" + + gotesting "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting" +) + +// TestSubtestManagement exercises multiple subtests so the Datadog Go testing +// instrumentation can attach management directives at different hierarchy levels. +func TestSubtestManagement(t *testing.T) { + gt := gotesting.GetTest(t) + + gt.Run("SubDisabled", func(t *testing.T) { + t.Log("subtest intentionally disabled by management directives") + }) + + gt.Run("SubQuarantined", func(t *testing.T) { + t.Log("subtest intentionally quarantined by management directives") + }) + + gt.Run("SubAttemptFix", func(t *testing.T) { + }) + + gt.Run("SubAttemptFixParallel", func(t *testing.T) { + // Run this attempt-to-fix wrapper in parallel when the scenario requests it. + if os.Getenv(parallelToggleEnv) == "1" { + t.Parallel() + } + }) +} + +// TestParentDisabled validates fallback behaviour when only the parent test is +// configured by management data. The child subtest should inherit the disabled +// directive even without an explicit entry. +func TestParentDisabled(t *testing.T) { + gotesting.GetTest(t).Run("Child", func(t *testing.T) { + t.Log("child inherits disabled directive from parent") + }) +} diff --git a/internal/civisibility/integrations/gotesting/subtests/main_test.go b/internal/civisibility/integrations/gotesting/subtests/main_test.go new file mode 100644 index 0000000000..4736f1b7fb --- /dev/null +++ b/internal/civisibility/integrations/gotesting/subtests/main_test.go @@ -0,0 +1,76 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package subtests + +import ( + "bytes" + "fmt" + "os" + "os/exec" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const ( + subtestScenarioEnv = "SUBTEST_MATRIX_SCENARIO" +) + +// TestMain forces subtest-specific features on and orchestrates scenario subprocesses so this suite exercises the flag-enabled paths. +func TestMain(m *testing.M) { + prevDD, hadDD := os.LookupEnv(constants.CIVisibilitySubtestFeaturesEnabled) + + if scenario := os.Getenv(subtestScenarioEnv); scenario != "" { + code := runMatrixScenario(m, scenario) + restoreEnv(constants.CIVisibilitySubtestFeaturesEnabled, prevDD, hadDD) + os.Exit(code) + } + + for _, scenario := range matrixScenarioNames() { + cmd := exec.Command(os.Args[0], os.Args[1:]...) + var buffer bytes.Buffer + cmd.Stdout = &buffer + cmd.Stderr = &buffer + if log.DebugEnabled() { + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + } + cmd.Env = append(os.Environ(), fmt.Sprintf("%s=%s", subtestScenarioEnv, scenario)) + + fmt.Printf("\n**** [RUNNING SUBTEST SCENARIO: %s]\n", scenario) + if err := cmd.Run(); err != nil { + if exitErr, ok := err.(*exec.ExitError); ok { + fmt.Printf("\n**** [SCENARIO %s FAILED WITH EXIT CODE: %d]\n", scenario, exitErr.ExitCode()) + fmt.Printf("**** [SCENARIO %s OUTPUT]\n%s\n", scenario, buffer.String()) + restoreEnv(constants.CIVisibilitySubtestFeaturesEnabled, prevDD, hadDD) + os.Exit(exitErr.ExitCode()) + } + fmt.Printf("failed to run scenario %s: %v\n", scenario, err) + restoreEnv(constants.CIVisibilitySubtestFeaturesEnabled, prevDD, hadDD) + os.Exit(1) + } + fmt.Printf("**** [SCENARIO %s COMPLETED]\n", scenario) + } + + code := m.Run() + + restoreEnv(constants.CIVisibilitySubtestFeaturesEnabled, prevDD, hadDD) + + os.Exit(code) +} + +func restoreEnv(key, value string, had bool) { + if !had { + if err := os.Unsetenv(key); err != nil { + panic(err) + } + return + } + if err := os.Setenv(key, value); err != nil { + panic(err) + } +} diff --git a/internal/civisibility/integrations/gotesting/subtests/subtestcontroller_test.go b/internal/civisibility/integrations/gotesting/subtests/subtestcontroller_test.go new file mode 100644 index 0000000000..8916960461 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/subtests/subtestcontroller_test.go @@ -0,0 +1,856 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package subtests + +import ( + "compress/gzip" + "encoding/json" + "fmt" + "io" + "net/http" + "net/http/httptest" + "os" + "reflect" + "sort" + "strconv" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + gotesting "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const ( + moduleUnderTest = "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting/subtests" + suiteUnderTest = "fixtures_test.go" + parentTestName = "TestSubtestManagement" + parallelToggleEnv = "SUBTEST_MATRIX_PARALLEL" +) + +var ( + availableScenarios = []*matrixScenario{ + baselineScenario(), + subDisabledScenario(), + subQuarantinedScenario(), + parentQuarantinedScenario(), + parentQuarantinedAttemptFixScenario(), + parentAttemptFixScenario(), + subAttemptFixOnlyScenario(), + subAttemptFixCustomRetriesScenario(), + subAttemptFixParallelScenario(), + parentAndSubAttemptFixScenario(), + } + scenarioByName = func() map[string]*matrixScenario { + m := make(map[string]*matrixScenario, len(availableScenarios)) + for _, sc := range availableScenarios { + m[sc.name] = sc + } + return m + }() +) + +type directive struct { + disabled bool + quarantined bool + attemptToFix bool +} + +type matrixScenario struct { + name string + configure func(*scenarioContext) + validate func([]*mocktracer.Span) +} + +type scenarioContext struct { + data *net.TestManagementTestsResponseDataModules + attemptToFixRetries int + env map[string]string +} + +// newScenarioContext prepares an empty scenario scaffold with storage for module directives. +func newScenarioContext() *scenarioContext { + return &scenarioContext{ + data: &net.TestManagementTestsResponseDataModules{ + Modules: make(map[string]net.TestManagementTestsResponseDataSuites), + }, + attemptToFixRetries: 0, + env: make(map[string]string), + } +} + +// setParentDirective records backend directives for the parent test in the scenario payload. +func (ctx *scenarioContext) setParentDirective(dir directive) { + module := ctx.data.Modules[moduleUnderTest] + // Lazily allocate the suites map so directives can be written. + if module.Suites == nil { + module.Suites = make(map[string]net.TestManagementTestsResponseDataTests) + } + suite := module.Suites[suiteUnderTest] + // Lazily allocate the test map for the suite. + if suite.Tests == nil { + suite.Tests = make(map[string]net.TestManagementTestsResponseDataTestProperties) + } + props := net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Disabled: dir.disabled, + Quarantined: dir.quarantined, + AttemptToFix: dir.attemptToFix, + } + suite.Tests[parentTestName] = net.TestManagementTestsResponseDataTestProperties{Properties: props} + module.Suites[suiteUnderTest] = suite + ctx.data.Modules[moduleUnderTest] = module +} + +// setSubDirective associates directives with a specific subtest within the scenario payload. +func (ctx *scenarioContext) setSubDirective(subName string, dir directive) { + module := ctx.data.Modules[moduleUnderTest] + // Ensure the suite map exists before inserting the subtest directive. + if module.Suites == nil { + module.Suites = make(map[string]net.TestManagementTestsResponseDataTests) + } + suite := module.Suites[suiteUnderTest] + // Initialise per-test properties map when missing. + if suite.Tests == nil { + suite.Tests = make(map[string]net.TestManagementTestsResponseDataTestProperties) + } + fullName := fmt.Sprintf("%s/%s", parentTestName, subName) + props := net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Disabled: dir.disabled, + Quarantined: dir.quarantined, + AttemptToFix: dir.attemptToFix, + } + suite.Tests[fullName] = net.TestManagementTestsResponseDataTestProperties{Properties: props} + module.Suites[suiteUnderTest] = suite + ctx.data.Modules[moduleUnderTest] = module +} + +// ensureSuite creates suite entries in the mock payload when missing so directives can be attached. +func (ctx *scenarioContext) ensureSuite() { + module := ctx.data.Modules[moduleUnderTest] + // Avoid nil maps so later writes succeed. + if module.Suites == nil { + module.Suites = make(map[string]net.TestManagementTestsResponseDataTests) + } + suite := module.Suites[suiteUnderTest] + // Guarantee there is at least an empty tests map for the suite. + if suite.Tests == nil { + suite.Tests = make(map[string]net.TestManagementTestsResponseDataTestProperties) + } + module.Suites[suiteUnderTest] = suite + ctx.data.Modules[moduleUnderTest] = module +} + +// setEnv records an environment variable override to be applied during scenario execution. +func (ctx *scenarioContext) setEnv(key, value string) { + if ctx.env == nil { + ctx.env = make(map[string]string) + } + ctx.env[key] = value +} + +// baselineScenario captures the control case where no directives are present, ensuring +// that subtests execute normally without management tags or retry orchestration. +func baselineScenario() *matrixScenario { + return &matrixScenario{ + name: "baseline", + configure: func(ctx *scenarioContext) { + // Ensure the suite exists so subsequent lookups succeed. + ctx.ensureSuite() + // Explicitly reset the attempt-to-fix retry budget for the identity scenario. + ctx.attemptToFixRetries = 0 + module, suite := utils.GetModuleAndSuiteName(reflect.ValueOf(TestSubtestManagement).Pointer()) + debugMatrixf("baseline identity module=%s suite=%s", module, suite) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + debugMatrixf("baseline captured %d test spans", len(testSpans)) + for _, span := range testSpans { + // Skip nil spans because they do not carry any metadata. + if span == nil { + continue + } + // Log each resource to help diagnose unexpected spans during debugging. + if resource, ok := span.Tag(ext.ResourceName).(string); ok { + debugMatrixf(" - resource: %s", resource) + } + } + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "parent baseline") + + assertTagEquals(parentSpans[0], constants.TestStatus, constants.TestStatusPass, "parent baseline status") + assertTagNotTrue(parentSpans[0], constants.TestIsDisabled, "parent baseline disabled") + assertTagNotTrue(parentSpans[0], constants.TestIsQuarantined, "parent baseline quarantined") + assertTagNotTrue(parentSpans[0], constants.TestIsAttempToFix, "parent baseline attempt_to_fix") + + for _, sub := range []string{"SubDisabled", "SubQuarantined", "SubAttemptFix", "SubAttemptFixParallel"} { + resource := fmt.Sprintf("%s/%s", parentResource, sub) + subSpans := spansByResource(testSpans, resource) + requireSpanCount(subSpans, 1, fmt.Sprintf("subtest %s baseline count", sub)) + assertTagEquals(subSpans[0], constants.TestStatus, constants.TestStatusPass, fmt.Sprintf("subtest %s baseline status", sub)) + assertTagNotTrue(subSpans[0], constants.TestIsDisabled, fmt.Sprintf("subtest %s baseline disabled", sub)) + assertTagNotTrue(subSpans[0], constants.TestIsQuarantined, fmt.Sprintf("subtest %s baseline quarantined", sub)) + assertTagNotTrue(subSpans[0], constants.TestIsAttempToFix, fmt.Sprintf("subtest %s baseline attempt_to_fix", sub)) + } + }, + } +} + +// subAttemptFixOnlyScenario verifies that only the child subtest orchestrates attempt-to-fix retries +// while the parent remains neutral. +func subAttemptFixOnlyScenario() *matrixScenario { + return &matrixScenario{ + name: "sub_attempt_to_fix_only", + configure: func(ctx *scenarioContext) { + // Initialise the suite and make the retry budget available to the subtest. + ctx.ensureSuite() + ctx.attemptToFixRetries = 3 + ctx.setSubDirective("SubAttemptFix", directive{attemptToFix: true}) + module, suite := utils.GetModuleAndSuiteName(reflect.ValueOf(TestSubtestManagement).Pointer()) + debugMatrixf("sub_attempt_to_fix_only identity module=%s suite=%s", module, suite) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + debugMatrixf("sub_attempt_to_fix_only captured %d test spans", len(testSpans)) + for _, span := range testSpans { + // Guard against nil entries to avoid panics when introspecting tags. + if span == nil { + continue + } + // Provide verbose details when debugging span resources. + if resource, ok := span.Tag(ext.ResourceName).(string); ok { + debugMatrixf(" - resource: %s", resource) + } + } + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "sub attempt-to-fix-only parent count") + assertTagNotTrue(parentSpans[0], constants.TestIsAttempToFix, "sub attempt-to-fix-only parent tag") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubAttemptFix") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 3, "sub attempt-to-fix-only span count") + sort.Slice(subSpans, func(i, j int) bool { + // Order spans chronologically so comments and assertions match the retry lifecycle. + return subSpans[i].StartTime().Before(subSpans[j].StartTime()) + }) + for idx, span := range subSpans { + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("sub attempt-to-fix-only tag span %d", idx)) + } + lastSpan := subSpans[len(subSpans)-1] + assertTagEquals(lastSpan, constants.TestAttemptToFixPassed, "true", "sub attempt-to-fix-only success") + assertTagEquals(lastSpan, constants.TestStatus, constants.TestStatusPass, "sub attempt-to-fix-only final status") + assertTagCount(subSpans, constants.TestIsRetry, "true", 2, "sub attempt-to-fix-only retry tag count") + assertTagCount(subSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 2, "sub attempt-to-fix-only retry reason count") + }, + } +} + +// subAttemptFixCustomRetriesScenario demonstrates that a child can request a larger retry +// budget without involving the parent, ensuring the additional attempts are tagged correctly. +func subAttemptFixCustomRetriesScenario() *matrixScenario { + return &matrixScenario{ + name: "sub_attempt_to_fix_custom_retries", + configure: func(ctx *scenarioContext) { + // Initialise suite storage so directives can be attached safely. + ctx.ensureSuite() + ctx.attemptToFixRetries = 5 + ctx.setSubDirective("SubAttemptFix", directive{attemptToFix: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "sub attempt-to-fix custom parent count") + assertTagNotTrue(parentSpans[0], constants.TestIsAttempToFix, "sub attempt-to-fix custom parent tag") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubAttemptFix") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 5, "sub attempt-to-fix custom child span count") + sort.Slice(subSpans, func(i, j int) bool { + // Sort to make reasoning about retries deterministic. + return subSpans[i].StartTime().Before(subSpans[j].StartTime()) + }) + for idx, span := range subSpans { + // Each retry should still carry the attempt-to-fix tag for visibility. + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("sub attempt-to-fix custom tag span %d", idx)) + } + subFinal := subSpans[len(subSpans)-1] + assertTagEquals(subFinal, constants.TestAttemptToFixPassed, "true", "sub attempt-to-fix custom success") + assertTagEquals(subFinal, constants.TestStatus, constants.TestStatusPass, "sub attempt-to-fix custom final status") + assertTagCount(subSpans, constants.TestIsRetry, "true", 4, "sub attempt-to-fix custom retry tag count") + assertTagCount(subSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 4, "sub attempt-to-fix custom retry reason count") + }, + } +} + +// subAttemptFixParallelScenario asserts that parallel subtests inherit attempt-to-fix behaviour +// without conflicting with the sequential sibling. +func subAttemptFixParallelScenario() *matrixScenario { + return &matrixScenario{ + name: "sub_attempt_to_fix_parallel", + configure: func(ctx *scenarioContext) { + // Prepare suite metadata before writing directives. + ctx.ensureSuite() + ctx.attemptToFixRetries = 3 + ctx.setSubDirective("SubAttemptFix", directive{attemptToFix: true}) + ctx.setSubDirective("SubAttemptFixParallel", directive{attemptToFix: true}) + ctx.setEnv(parallelToggleEnv, "1") + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "sub attempt-to-fix parallel parent count") + assertTagNotTrue(parentSpans[0], constants.TestIsAttempToFix, "sub attempt-to-fix parallel parent tag") + + checkParallelChild := func(child string) { + // Focus validations on a single subtest resource at a time. + resource := fmt.Sprintf("%s/%s", parentResource, child) + childSpans := spansByResource(testSpans, resource) + requireSpanCount(childSpans, 3, fmt.Sprintf("%s attempt-to-fix parallel span count", child)) + sort.Slice(childSpans, func(i, j int) bool { + // Sort to match retry order regardless of goroutine scheduling. + return childSpans[i].StartTime().Before(childSpans[j].StartTime()) + }) + for idx, span := range childSpans { + // Confirm each execution is correctly tagged as part of the attempt-to-fix flow. + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("%s attempt-to-fix parallel tag span %d", child, idx)) + } + final := childSpans[len(childSpans)-1] + assertTagEquals(final, constants.TestAttemptToFixPassed, "true", fmt.Sprintf("%s attempt-to-fix parallel success", child)) + assertTagEquals(final, constants.TestStatus, constants.TestStatusPass, fmt.Sprintf("%s attempt-to-fix parallel status", child)) + assertTagCount(childSpans, constants.TestIsRetry, "true", 2, fmt.Sprintf("%s attempt-to-fix parallel retry tag count", child)) + assertTagCount(childSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 2, fmt.Sprintf("%s attempt-to-fix parallel retry reason count", child)) + } + + checkParallelChild("SubAttemptFix") + checkParallelChild("SubAttemptFixParallel") + }, + } +} + +// subDisabledScenario asserts that a subtest disabled directive skips the child while +// leaving the parent untouched. +func subDisabledScenario() *matrixScenario { + return &matrixScenario{ + name: "sub_disabled", + configure: func(ctx *scenarioContext) { + ctx.ensureSuite() + ctx.setParentDirective(directive{}) + ctx.setSubDirective("SubDisabled", directive{disabled: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "sub disabled parent count") + assertTagNotTrue(parentSpans[0], constants.TestIsDisabled, "parent disabled tag") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubDisabled") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 1, "sub disabled span count") + assertTagEquals(subSpans[0], constants.TestIsDisabled, "true", "sub disabled tag") + assertTagEquals(subSpans[0], constants.TestStatus, constants.TestStatusSkip, "sub disabled status") + }, + } +} + +// subQuarantinedScenario ensures a child-only quarantine directive reports the subtest as quarantined. +func subQuarantinedScenario() *matrixScenario { + return &matrixScenario{ + name: "sub_quarantined", + configure: func(ctx *scenarioContext) { + ctx.ensureSuite() + ctx.setParentDirective(directive{}) + ctx.setSubDirective("SubQuarantined", directive{quarantined: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "sub quarantined parent count") + assertTagNotTrue(parentSpans[0], constants.TestIsQuarantined, "parent quarantined tag") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubQuarantined") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 1, "sub quarantined span count") + assertTagEquals(subSpans[0], constants.TestIsQuarantined, "true", "sub quarantined tag") + assertTagEquals(subSpans[0], constants.TestStatus, constants.TestStatusPass, "sub quarantined status") + }, + } +} + +// parentQuarantinedScenario shows that a quarantined parent automatically propagates the tag to its child. +func parentQuarantinedScenario() *matrixScenario { + return &matrixScenario{ + name: "parent_quarantined", + configure: func(ctx *scenarioContext) { + ctx.ensureSuite() + ctx.setParentDirective(directive{quarantined: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 1, "parent quarantined span count") + assertTagEquals(parentSpans[0], constants.TestIsQuarantined, "true", "parent quarantined tag") + assertTagEquals(parentSpans[0], constants.TestStatus, constants.TestStatusPass, "parent quarantined status") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubQuarantined") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 1, "parent quarantined child span count") + assertTagEquals(subSpans[0], constants.TestIsQuarantined, "true", "parent quarantined child tag") + assertTagEquals(subSpans[0], constants.TestStatus, constants.TestStatusPass, "parent quarantined child status") + }, + } +} + +// parentQuarantinedAttemptFixScenario validates that a quarantined parent orchestrating retries +// propagates quarantine tags to the child while keeping ownership of the attempt-to-fix lifecycle. +func parentQuarantinedAttemptFixScenario() *matrixScenario { + return &matrixScenario{ + name: "parent_quarantined_attempt_to_fix", + configure: func(ctx *scenarioContext) { + ctx.ensureSuite() + ctx.attemptToFixRetries = 3 + ctx.setParentDirective(directive{quarantined: true, attemptToFix: true}) + ctx.setSubDirective("SubAttemptFix", directive{attemptToFix: true, quarantined: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 3, "parent quarantine attempt-to-fix span count") + // Confirm every parent retry is both quarantined and marked as attempt-to-fix. + for idx, span := range parentSpans { + assertTagEquals(span, constants.TestIsQuarantined, "true", fmt.Sprintf("parent quarantine attempt-to-fix quarantined tag span %d", idx)) + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("parent quarantine attempt-to-fix attempt tag span %d", idx)) + } + parentFinal := parentSpans[len(parentSpans)-1] + assertTagEquals(parentFinal, constants.TestAttemptToFixPassed, "true", "parent quarantine attempt-to-fix success") + assertTagEquals(parentFinal, constants.TestStatus, constants.TestStatusPass, "parent quarantine attempt-to-fix status") + assertTagCount(parentSpans, constants.TestIsRetry, "true", 2, "parent quarantine attempt-to-fix retry tag count") + assertTagCount(parentSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 2, "parent quarantine attempt-to-fix retry reason count") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubAttemptFix") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 3, "parent quarantine attempt-to-fix child span count") + // Each child execution must inherit the quarantined + attempt-to-fix state. + for idx, span := range subSpans { + assertTagEquals(span, constants.TestIsQuarantined, "true", fmt.Sprintf("child quarantine attempt-to-fix quarantined tag span %d", idx)) + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("child quarantine attempt-to-fix attempt tag span %d", idx)) + } + childFinal := subSpans[len(subSpans)-1] + assertTagNotTrue(childFinal, constants.TestAttemptToFixPassed, "child quarantine attempt-to-fix success tag ownership") + assertTagEquals(childFinal, constants.TestStatus, constants.TestStatusPass, "child quarantine attempt-to-fix status") + assertTagCount(subSpans, constants.TestIsRetry, "true", 0, "child quarantine attempt-to-fix retry tag count") + assertTagCount(subSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 0, "child quarantine attempt-to-fix retry reason count") + }, + } +} + +// parentAttemptFixScenario checks that a parent-level attempt-to-fix directive wraps both +// parent and child executions with consistent retry tagging. +func parentAttemptFixScenario() *matrixScenario { + return &matrixScenario{ + name: "parent_attempt_to_fix", + configure: func(ctx *scenarioContext) { + ctx.ensureSuite() + ctx.attemptToFixRetries = 3 + ctx.setParentDirective(directive{attemptToFix: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 3, "parent attempt-to-fix span count") + // Each parent span should reflect that attempt-to-fix logic is active. + for idx, span := range parentSpans { + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("parent attempt-to-fix tag span %d", idx)) + } + assertTagCount(parentSpans, constants.TestIsRetry, "true", 2, "parent attempt-to-fix retry tag count") + assertTagCount(parentSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 2, "parent attempt-to-fix retry reason count") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubAttemptFix") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 3, "sub attempt-to-fix inherited span count") + // The child inherits the attempt-to-fix directive and should pass under retry pressure. + for idx, span := range subSpans { + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("sub inherited attempt-to-fix tag span %d", idx)) + assertTagEquals(span, constants.TestStatus, constants.TestStatusPass, fmt.Sprintf("sub inherited attempt-to-fix status span %d", idx)) + } + assertTagCount(subSpans, constants.TestIsRetry, "true", 2, "sub inherited attempt-to-fix retry tag count") + assertTagCount(subSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 2, "sub inherited attempt-to-fix retry reason count") + }, + } +} + +// parentAndSubAttemptFixScenario makes sure that when both parent and child request +// attempt-to-fix behaviour the parent retains ownership of success tagging. +func parentAndSubAttemptFixScenario() *matrixScenario { + return &matrixScenario{ + name: "parent_and_sub_attempt_to_fix", + configure: func(ctx *scenarioContext) { + ctx.ensureSuite() + ctx.attemptToFixRetries = 3 + ctx.setParentDirective(directive{attemptToFix: true}) + ctx.setSubDirective("SubAttemptFix", directive{attemptToFix: true}) + }, + validate: func(spans []*mocktracer.Span) { + testSpans := filterTestSpans(spans) + + parentResource := fmt.Sprintf("%s.%s", suiteUnderTest, parentTestName) + parentSpans := spansByResource(testSpans, parentResource) + requireSpanCount(parentSpans, 3, "parent/sub attempt-to-fix parent span count") + // Validate every parent execution reflects the attempt-to-fix directive. + for idx, span := range parentSpans { + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("parent/sub attempt-to-fix parent tag span %d", idx)) + } + parentFinal := parentSpans[len(parentSpans)-1] + assertTagEquals(parentFinal, constants.TestAttemptToFixPassed, "true", "parent/sub attempt-to-fix parent success") + assertTagEquals(parentFinal, constants.TestStatus, constants.TestStatusPass, "parent/sub attempt-to-fix parent final status") + assertTagCount(parentSpans, constants.TestIsRetry, "true", 2, "parent/sub attempt-to-fix parent retry tag count") + assertTagCount(parentSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 2, "parent/sub attempt-to-fix parent retry reason count") + + subResource := fmt.Sprintf("%s/%s", parentResource, "SubAttemptFix") + subSpans := spansByResource(testSpans, subResource) + requireSpanCount(subSpans, 3, "parent/sub attempt-to-fix child span count") + // Even though the child has its own directive, it should not claim retry success. + for idx, span := range subSpans { + assertTagEquals(span, constants.TestIsAttempToFix, "true", fmt.Sprintf("parent/sub attempt-to-fix child tag span %d", idx)) + } + subFinal := subSpans[len(subSpans)-1] + assertTagNotTrue(subFinal, constants.TestAttemptToFixPassed, "parent/sub attempt-to-fix child success tag ownership") + assertTagEquals(subFinal, constants.TestStatus, constants.TestStatusPass, "parent/sub attempt-to-fix child final status") + assertTagCount(subSpans, constants.TestIsRetry, "true", 0, "parent/sub attempt-to-fix child retry tag count") + assertTagCount(subSpans, constants.TestRetryReason, constants.AttemptToFixRetryReason, 0, "parent/sub attempt-to-fix child retry reason count") + }, + } +} + +// filterTestSpans keeps only test spans so scenario assertions ignore suite/module noise. +func filterTestSpans(spans []*mocktracer.Span) []*mocktracer.Span { + var out []*mocktracer.Span + for _, span := range spans { + // Ignore placeholders without data. + if span == nil { + continue + } + // Only keep spans that represent tests, not suites or infrastructure. + if tag := span.Tag(ext.SpanType); tag == constants.SpanTypeTest { + out = append(out, span) + } + } + return out +} + +// spansByResource returns the subset of spans whose resource matches the provided identifier. +func spansByResource(spans []*mocktracer.Span, resource string) []*mocktracer.Span { + var out []*mocktracer.Span + for _, span := range spans { + // Skip nil entries that cannot hold tags. + if span == nil { + continue + } + // Collect spans that target the requested resource name. + if value, ok := span.Tag(ext.ResourceName).(string); ok && value == resource { + out = append(out, span) + } + } + return out +} + +// requireSpanCount asserts that a span slice contains exactly the amount expected for the scenario. +func requireSpanCount(spans []*mocktracer.Span, expected int, label string) { + // Panic with context when the scenario produced an unexpected number of spans. + if len(spans) != expected { + panic(fmt.Sprintf("%s: expected %d spans, got %d", label, expected, len(spans))) + } +} + +// assertTagCount enforces that a precise number of spans expose a tag/value pair, mirroring +// telemetry expectations such as retry counters. +func assertTagCount(spans []*mocktracer.Span, key string, value string, expected int, label string) { + var count int + for _, span := range spans { + if span == nil { + continue + } + if tag, ok := span.Tag(key).(string); ok && tag == value { + count++ + } + } + debugMatrixf("%s: observed %d spans with %s=%q", label, count, key, value) + if count != expected { + panic(fmt.Sprintf("%s: expected %d spans with tag %s=%q, got %d", label, expected, key, value, count)) + } +} + +// assertTagEquals verifies that a span tag matches the desired value and fails fast otherwise. +func assertTagEquals(span *mocktracer.Span, key string, want string, label string) { + if span == nil { + panic(fmt.Sprintf("%s: span is nil", label)) + } + if value, _ := span.Tag(key).(string); value != want { + panic(fmt.Sprintf("%s: expected tag %s=%q, got %q", label, key, want, value)) + } +} + +// assertTagNotTrue ensures a boolean-like tag is either absent or false, useful when testing inheritance. +func assertTagNotTrue(span *mocktracer.Span, key string, label string) { + if span == nil { + return + } + if value, ok := span.Tag(key).(string); ok && value == "true" { + panic(fmt.Sprintf("%s: expected tag %s to be absent/false, got true", label, key)) + } +} + +// matrixScenarioNames returns the list of scenario identifiers executed by TestMain. +func matrixScenarioNames() []string { + names := make([]string, 0, len(availableScenarios)) + for _, sc := range availableScenarios { + // Skip placeholder slots that may be left empty in future expansions. + if sc == nil { + continue + } + names = append(names, sc.name) + } + return names +} + +// runMatrixScenario executes a specific scenario in isolation by configuring the mock backend, +// running the go test harness, and validating the resulting spans. +func runMatrixScenario(m *testing.M, scenario string) int { + sc, ok := scenarioByName[scenario] + // Abort quickly when the requested scenario does not exist. + if !ok { + fmt.Printf("unknown subtest matrix scenario: %s\n", scenario) + return 1 + } + + ctx := newScenarioContext() + sc.configure(ctx) + debugMatrixf("scenario %s management data: %+v", scenario, ctx.data) + + var envSnapshots []envSnapshot + for key, value := range ctx.env { + envSnapshots = append(envSnapshots, setEnv(key, value)) + } + defer func() { + for i := len(envSnapshots) - 1; i >= 0; i-- { + envSnapshots[i].restore() + } + }() + + _, restore := startSubtestServer(subtestServerConfig{ + managementData: ctx.data, + attemptToFixRetries: ctx.attemptToFixRetries, + }) + defer restore() + + settings := integrations.GetSettings() + if settings != nil { + settings.SubtestFeaturesEnabled = true + debugMatrixf("subtest matrix: settings.SubtestFeaturesEnabled=%t", settings.SubtestFeaturesEnabled) + } else { + debugMatrixf("subtest matrix: settings unavailable") + } + + tracer := integrations.InitializeCIVisibilityMock() + + exitCode := gotesting.RunM(m) + // When the run fails, dump span resources for easier diagnosis. + if exitCode != 0 { + finished := tracer.FinishedSpans() + debugMatrixf("scenario %s exit code %d with %d spans", scenario, exitCode, len(finished)) + for i, span := range finished { + // Skip nil entries yet keep the loop for consistent indices. + if span == nil { + continue + } + // Provide per-span resource names to speed up debugging. + if resource, ok := span.Tag(ext.ResourceName).(string); ok { + debugMatrixf(" span[%d] resource=%s status=%v", i, resource, span.Tag(constants.TestStatus)) + } + } + return exitCode + } + + sc.validate(tracer.FinishedSpans()) + + return 0 +} + +// debugMatrixf emits scenario-scoped diagnostics using the package logger. +func debugMatrixf(format string, args ...interface{}) { + log.Debug(format, args...) +} + +type envSnapshot struct { + key string + value string + had bool +} + +// setEnv overrides an environment variable and returns a snapshot that can restore it. +func setEnv(key, value string) envSnapshot { + prev, had := os.LookupEnv(key) + if err := os.Setenv(key, value); err != nil { + panic(err) + } + return envSnapshot{key: key, value: prev, had: had} +} + +func (s envSnapshot) restore() { + var err error + if s.had { + err = os.Setenv(s.key, s.value) + } else { + err = os.Unsetenv(s.key) + } + if err != nil { + panic(err) + } +} + +type subtestServerConfig struct { + managementData *net.TestManagementTestsResponseDataModules + attemptToFixRetries int +} + +// startSubtestServer spins up the mock backend that feeds settings and management payloads to the harness. +func startSubtestServer(cfg subtestServerConfig) (*httptest.Server, func()) { + if cfg.managementData == nil { + cfg.managementData = &net.TestManagementTestsResponseDataModules{ + Modules: make(map[string]net.TestManagementTestsResponseDataSuites), + } + } + + handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Route each request to a stub mirroring the Datadog backend endpoints. + switch r.URL.Path { + case "/api/v2/libraries/tests/services/setting": + // Provide the library settings response required to enable management. + debugMatrixf("subtest server: settings request") + defer r.Body.Close() + w.Header().Set("Content-Type", "application/json") + var settings net.SettingsResponseData + settings.CodeCoverage = false + settings.FlakyTestRetriesEnabled = false + settings.ItrEnabled = false + settings.TestsSkipping = false + settings.KnownTestsEnabled = false + settings.ImpactedTestsEnabled = false + settings.EarlyFlakeDetection.Enabled = false + settings.TestManagement.Enabled = true + settings.TestManagement.AttemptToFixRetries = cfg.attemptToFixRetries + resp := struct { + Data struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes net.SettingsResponseData `json:"attributes"` + } `json:"data"` + }{} + resp.Data.ID = "settings" + resp.Data.Type = "ci_app_libraries_tests_settings" + resp.Data.Attributes = settings + if err := json.NewEncoder(w).Encode(&resp); err != nil { + panic(err) + } + case "/api/v2/test/libraries/test-management/tests": + // Serve the management payload that drives scenario directives. + debugMatrixf("subtest server: test-management request") + defer r.Body.Close() + w.Header().Set("Content-Type", "application/json") + if payload, err := json.Marshal(cfg.managementData); err == nil { + debugMatrixf("subtest server: management payload %s", payload) + } + resp := struct { + Data struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes net.TestManagementTestsResponseDataModules `json:"attributes"` + } `json:"data"` + }{} + resp.Data.ID = "test-management" + resp.Data.Type = "ci_app_libraries_tests" + resp.Data.Attributes = *cfg.managementData + if err := json.NewEncoder(w).Encode(&resp); err != nil { + panic(err) + } + case "/api/v2/ci/libraries/tests": + // Return an empty known-tests payload to satisfy the client. + debugMatrixf("subtest server: known-tests request") + defer r.Body.Close() + w.Header().Set("Content-Type", "application/json") + _, _ = io.Copy(io.Discard, r.Body) + w.Write([]byte(`{"data":{"attributes":{"tests":{}}}}`)) + case "/api/v2/git/repository/search_commits": + // Stub git search commits used during CI Visibility bootstrap. + debugMatrixf("subtest server: search-commits request") + defer r.Body.Close() + _, _ = io.Copy(io.Discard, r.Body) + w.WriteHeader(http.StatusOK) + w.Write([]byte(`{}`)) + case "/api/v2/git/repository/packfile": + // Accept packfile uploads even though the sandbox blocks writes. + debugMatrixf("subtest server: packfile request") + defer r.Body.Close() + _, _ = io.Copy(io.Discard, r.Body) + w.WriteHeader(http.StatusAccepted) + case "/api/v2/logs": + // Consume CI Visibility logs (ignored during tests) to prevent backpressure. + debugMatrixf("subtest server: logs intake request") + defer r.Body.Close() + var reader io.Reader = r.Body + if r.Header.Get("Content-Encoding") == "gzip" { + gz, err := gzip.NewReader(r.Body) + if err == nil { + defer gz.Close() + reader = gz + } + } + _, _ = io.Copy(io.Discard, reader) + w.WriteHeader(http.StatusAccepted) + default: + http.NotFound(w, r) + } + }) + + server := httptest.NewServer(handler) + + snapshots := []envSnapshot{ + setEnv(constants.CIVisibilityEnabledEnvironmentVariable, "1"), + setEnv(constants.CIVisibilityAgentlessEnabledEnvironmentVariable, "1"), + setEnv(constants.CIVisibilityAgentlessURLEnvironmentVariable, server.URL), + setEnv(constants.APIKeyEnvironmentVariable, "test-api-key"), + setEnv(constants.CIVisibilityTestManagementAttemptToFixRetriesEnvironmentVariable, strconv.Itoa(cfg.attemptToFixRetries)), + } + + cleanup := func() { + for i := len(snapshots) - 1; i >= 0; i-- { + snapshots[i].restore() + } + server.Close() + } + + return server, cleanup +} diff --git a/internal/civisibility/integrations/gotesting/testcontroller_test.go b/internal/civisibility/integrations/gotesting/testcontroller_test.go index 76246c27d5..f0ff54ba66 100644 --- a/internal/civisibility/integrations/gotesting/testcontroller_test.go +++ b/internal/civisibility/integrations/gotesting/testcontroller_test.go @@ -6,61 +6,90 @@ package gotesting import ( + "bytes" + "compress/gzip" "encoding/json" "fmt" + "io" "net/http" "net/http/httptest" "os" "os/exec" + "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils/net" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) var currentM *testing.M var mTracer mocktracer.Tracer +var logsEntries []*mockedLogEntry +var parallelEfd bool // TestMain is the entry point for testing and runs before any test. func TestMain(m *testing.M) { - log.SetLevel(log.LevelDebug) + // Enable logs collection for all test scenarios (propagates to spawned child processes). + _ = os.Setenv("DD_CIVISIBILITY_LOGS_ENABLED", "true") + const scenarioStarted = "**** [Scenario %s started] ****\n\n" // We need to spawn separated test process for each scenario - scenarios := []string{"TestFlakyTestRetries", "TestEarlyFlakeDetection", "TestFlakyTestRetriesAndEarlyFlakeDetection"} + scenarios := []string{"TestFlakyTestRetries", "TestEarlyFlakeDetection", "TestFlakyTestRetriesAndEarlyFlakeDetection", "TestIntelligentTestRunner", "TestManagementTests", "TestImpactedTests", "TestParallelEarlyFlakeDetection"} if internal.BoolEnv(scenarios[0], false) { - fmt.Printf("Scenario %s started.\n", scenarios[0]) + fmt.Printf(scenarioStarted, scenarios[0]) runFlakyTestRetriesTests(m) } else if internal.BoolEnv(scenarios[1], false) { - fmt.Printf("Scenario %s started.\n", scenarios[1]) + fmt.Printf(scenarioStarted, scenarios[1]) runEarlyFlakyTestDetectionTests(m) } else if internal.BoolEnv(scenarios[2], false) { - fmt.Printf("Scenario %s started.\n", scenarios[2]) - runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m) + fmt.Printf(scenarioStarted, scenarios[2]) + runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m, false) + } else if internal.BoolEnv(scenarios[3], false) { + fmt.Printf(scenarioStarted, scenarios[3]) + runIntelligentTestRunnerTests(m) + } else if internal.BoolEnv(scenarios[4], false) { + fmt.Printf(scenarioStarted, scenarios[4]) + runTestManagementTests(m) + } else if internal.BoolEnv(scenarios[5], false) { + fmt.Printf(scenarioStarted, scenarios[5]) + runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m, true) + } else if internal.BoolEnv(scenarios[6], false) { + fmt.Printf(scenarioStarted, scenarios[6]) + runParallelEarlyFlakyTestDetectionTests(m) + } else if internal.BoolEnv("Bypass", false) { + os.Exit(m.Run()) } else { - fmt.Println("Starting tests...") for _, v := range scenarios { cmd := exec.Command(os.Args[0], os.Args[1:]...) - cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + var b bytes.Buffer + if log.DebugEnabled() { + cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr + } else { + cmd.Stdout = &b + cmd.Stderr = &b + } cmd.Env = append(cmd.Env, os.Environ()...) cmd.Env = append(cmd.Env, fmt.Sprintf("%s=true", v)) - fmt.Printf("Running scenario: %s:\n", v) + fmt.Printf("\n**** [RUNNING SCENARIO: %s]\n", v) err := cmd.Run() - fmt.Printf("Done.\n\n") + fmt.Printf("\n**** [SCENARIO %s IS DONE]\n\n", v) if err != nil { if exiterr, ok := err.(*exec.ExitError); ok { - fmt.Printf("Scenario %s failed with exit code: %d\n", v, exiterr.ExitCode()) + fmt.Printf("\n===========================================\n**** [SCENARIO %s FAILED WITH EXIT CODE: %d]\n", v, exiterr.ExitCode()) + if !log.DebugEnabled() { + fmt.Printf("**** [SCENARIO %s OUTPUT]\n===========================================\n\n%s\n", v, b.String()) + } os.Exit(exiterr.ExitCode()) - } else { - fmt.Printf("cmd.Run: %v\n", err) - os.Exit(1) } - break + fmt.Printf("cmd.Run: %v\n", err) + os.Exit(1) } } } @@ -70,7 +99,22 @@ func TestMain(m *testing.M) { func runFlakyTestRetriesTests(m *testing.M) { // mock the settings api to enable automatic test retries - server := setUpHttpServer(true, false, nil) + server := setUpHTTPServer(true, true, false, &net.KnownTestsResponseData{ + Tests: net.KnownTestsResponseDataModules{ + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting": net.KnownTestsResponseDataSuites{ + "reflections_test.go": []string{ + "TestGetFieldPointerFrom", + "TestGetInternalTestArray", + "TestGetInternalBenchmarkArray", + "TestCommonPrivateFields_AddLevel", + "TestGetBenchmarkPrivateFields", + }, + }, + }, + }, + false, nil, + false, nil, + false) defer server.Close() // set a custom retry count @@ -82,32 +126,33 @@ func runFlakyTestRetriesTests(m *testing.M) { // execute the tests, we are expecting some tests to fail and check the assertion later exitCode := RunM(m) - if exitCode != 1 { - panic("expected the exit code to be 1. We have a failing test on purpose.") + if exitCode != 0 { + panic("expected the exit code to be 0. Got exit code: " + fmt.Sprintf("%d", exitCode)) } // get all finished spans finishedSpans := mTracer.FinishedSpans() + showResourcesNameFromSpans(finishedSpans) // 1 session span // 1 module span - // 2 suite span (testing_test.go and reflections_test.go) + // 4 suite span (testing_test.go, testify_test.go, testify_test.go/MySuite and reflections_test.go) // 5 tests from reflections_test.go // 1 TestMyTest01 // 1 TestMyTest02 + 2 subtests // 1 Test_Foo + 3 subtests - // 1 TestWithExternalCalls + 2 subtests // 1 TestSkip // 1 TestRetryWithPanic + 3 retry tests from testing_test.go // 1 TestRetryWithFail + 3 retry tests from testing_test.go - // 1 TestRetryAlwaysFail + 10 retry tests from testing_test.go // 1 TestNormalPassingAfterRetryAlwaysFail // 1 TestEarlyFlakeDetection - // 2 normal spans from testing_test.go + // 3 tests from testify_test.go and testify_test.go/MySuite // check spans by resource name - checkSpansByResourceName(finishedSpans, "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting", 1) + checkSpansByResourceName(finishedSpans, "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", 1) checkSpansByResourceName(finishedSpans, "reflections_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite", 1) checkSpansByResourceName(finishedSpans, "testing_test.go", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest01", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02", 1) @@ -117,36 +162,77 @@ func runFlakyTestRetriesTests(m *testing.M) { checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/yellow_should_return_color", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/banana_should_return_fruit", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/duck_should_return_animal", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls/default", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls/custom-name", 1) + + st01 := getSpansWithResourceName(finishedSpans, "testing_test.go.TestParallelSubTests/parallel_subtest_1")[0] + st02 := getSpansWithResourceName(finishedSpans, "testing_test.go.TestParallelSubTests/parallel_subtest_2")[0] + st03 := getSpansWithResourceName(finishedSpans, "testing_test.go.TestParallelSubTests/parallel_subtest_3")[0] + + st01EndTime := st01.StartTime().Add(st01.Duration()) + st02EndTime := st02.StartTime().Add(st02.Duration()) + + fmt.Println(st01.StartTime(), st01EndTime) + fmt.Println(st02.StartTime(), st02EndTime) + fmt.Println(st03.StartTime()) + + if st01EndTime.Before(st02.StartTime()) { + panic(fmt.Sprintf("parallel testing does not work as expected, span 'testing_test.go.TestParallelSubTests/parallel_subtest_1' ends before span 'testing_test.go.TestParallelSubTests/parallel_subtest_2' starts")) + } + if st02EndTime.Before(st03.StartTime()) { + panic(fmt.Sprintf("parallel testing does not work as expected, span 'testing_test.go.TestParallelSubTests/parallel_subtest_2' ends before span 'testing_test.go.TestParallelSubTests/parallel_subtest_3' starts")) + } + checkSpansByResourceName(finishedSpans, "testing_test.go.TestSkip", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 4) checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 4) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryAlwaysFail", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestNormalPassingAfterRetryAlwaysFail", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestEarlyFlakeDetection", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go.TestTestifyLikeTest", 1) + testifySub01 := checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite", 1)[0] + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite/sub01", 1) + + // check that testify span has the correct source file + if !strings.HasSuffix(testifySub01.Tag("test.source.file").(string), "/testify_test.go") { + panic(fmt.Sprintf("source file should be testify_test.go, got %s", testifySub01.Tag("test.source.file").(string))) + } // check spans by tag - checkSpansByTagName(finishedSpans, constants.TestIsRetry, 16) + checkSpansByTagName(finishedSpans, constants.TestIsRetry, 6) + trrSpan := checkSpansByTagName(finishedSpans, constants.TestRetryReason, 6)[0] + if trrSpan.Tag(constants.TestRetryReason) != "auto_test_retry" { + panic(fmt.Sprintf("expected retry reason to be %s, got %s", "auto_test_retry", trrSpan.Tag(constants.TestRetryReason))) + } + + // check the test is new tag + checkSpansByTagName(finishedSpans, constants.TestIsNew, 26) + + // check if suite has both test code owners and source file tags + suiteSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSuite) + checkSpansByTagName(suiteSpans, constants.TestCodeOwners, 4) + checkSpansByTagName(suiteSpans, constants.TestSourceFile, 4) // check spans by type checkSpansByType(finishedSpans, - 44, + 32, 1, 1, - 2, - 38, - 2) + 4, + 31, + 0) + + // check capabilities tags + checkCapabilitiesTags(finishedSpans) + + // check logs + checkLogs() os.Exit(0) } func runEarlyFlakyTestDetectionTests(m *testing.M) { // mock the settings api to enable automatic test retries - server := setUpHttpServer(false, true, &net.EfdResponseData{ - Tests: net.EfdResponseDataModules{ - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting": net.EfdResponseDataSuites{ + server := setUpHTTPServer(false, true, true, &net.KnownTestsResponseData{ + Tests: net.KnownTestsResponseDataModules{ + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting": net.KnownTestsResponseDataSuites{ "reflections_test.go": []string{ "TestGetFieldPointerFrom", "TestGetInternalTestArray", @@ -156,7 +242,10 @@ func runEarlyFlakyTestDetectionTests(m *testing.M) { }, }, }, - }) + }, + false, nil, + false, nil, + false) defer server.Close() // initialize the mock tracer for doing assertions on the finished spans @@ -165,32 +254,34 @@ func runEarlyFlakyTestDetectionTests(m *testing.M) { // execute the tests, we are expecting some tests to fail and check the assertion later exitCode := RunM(m) - if exitCode != 1 { - panic("expected the exit code to be 1. We have a failing test on purpose.") + if exitCode != 0 { + panic("expected the exit code to be 0. Got exit code: " + fmt.Sprintf("%d", exitCode)) } // get all finished spans finishedSpans := mTracer.FinishedSpans() + showResourcesNameFromSpans(finishedSpans) // 1 session span // 1 module span - // 2 suite span (testing_test.go and reflections_test.go) + // 4 suite span (testing_test.go, testify_test.go, testify_test.go/MySuite and reflections_test.go) // 5 tests from reflections_test.go // 11 TestMyTest01 // 11 TestMyTest02 + 22 subtests // 11 Test_Foo + 33 subtests - // 11 TestWithExternalCalls + 22 subtests // 11 TestSkip // 11 TestRetryWithPanic // 11 TestRetryWithFail - // 11 TestRetryAlwaysFail // 11 TestNormalPassingAfterRetryAlwaysFail // 11 TestEarlyFlakeDetection // 22 normal spans from testing_test.go + // 33 tests from testify_test.go and testify_test.go/MySuite // check spans by resource name - checkSpansByResourceName(finishedSpans, "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting", 1) + checkSpansByResourceName(finishedSpans, "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", 1) checkSpansByResourceName(finishedSpans, "reflections_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite", 1) checkSpansByResourceName(finishedSpans, "testing_test.go", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest01", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02", 11) @@ -200,37 +291,142 @@ func runEarlyFlakyTestDetectionTests(m *testing.M) { checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/yellow_should_return_color", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/banana_should_return_fruit", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/duck_should_return_animal", 11) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls", 11) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls/default", 11) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls/custom-name", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestSkip", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 11) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryAlwaysFail", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestNormalPassingAfterRetryAlwaysFail", 11) checkSpansByResourceName(finishedSpans, "testing_test.go.TestEarlyFlakeDetection", 11) + checkSpansByResourceName(finishedSpans, "testify_test.go.TestTestifyLikeTest", 11) + testifySub01 := checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite", 11)[0] + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite/sub01", 11) + + // check that testify span has the correct source file + if !strings.HasSuffix(testifySub01.Tag("test.source.file").(string), "/testify_test.go") { + panic(fmt.Sprintf("source file should be testify_test.go, got %s", testifySub01.Tag("test.source.file").(string))) + } // check spans by tag - checkSpansByTagName(finishedSpans, constants.TestIsNew, 187) - checkSpansByTagName(finishedSpans, constants.TestIsRetry, 170) + checkSpansByTagName(finishedSpans, constants.TestIsNew, 220) + checkSpansByTagName(finishedSpans, constants.TestIsRetry, 200) + trrSpan := checkSpansByTagName(finishedSpans, constants.TestRetryReason, 200)[0] + if trrSpan.Tag(constants.TestRetryReason) != "early_flake_detection" { + panic(fmt.Sprintf("expected retry reason to be %s, got %s", "early_flake_detection", trrSpan.Tag(constants.TestRetryReason))) + } + + // check if suite has both test code owners and source file tags + suiteSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSuite) + checkSpansByTagName(suiteSpans, constants.TestCodeOwners, 4) + checkSpansByTagName(suiteSpans, constants.TestSourceFile, 4) // check spans by type checkSpansByType(finishedSpans, - 218, + 152, 1, 1, - 2, - 192, - 22) + 4, + 225, + 0) + + // check capabilities tags + checkCapabilitiesTags(finishedSpans) + + // check logs + checkLogs() os.Exit(0) } -func runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m *testing.M) { +func runParallelEarlyFlakyTestDetectionTests(m *testing.M) { // mock the settings api to enable automatic test retries - server := setUpHttpServer(true, true, &net.EfdResponseData{ - Tests: net.EfdResponseDataModules{ - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting": net.EfdResponseDataSuites{ + server := setUpHTTPServer(false, true, true, &net.KnownTestsResponseData{ + Tests: net.KnownTestsResponseDataModules{ + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting": net.KnownTestsResponseDataSuites{ + "reflections_test.go": []string{ + "TestGetFieldPointerFrom", + "TestGetInternalTestArray", + "TestGetInternalBenchmarkArray", + "TestCommonPrivateFields_AddLevel", + "TestGetBenchmarkPrivateFields", + }, + }, + }, + }, + false, nil, + false, nil, + false) + defer server.Close() + + // set a custom retry count + os.Setenv(constants.CIVisibilityInternalParallelEarlyFlakeDetectionEnabled, "true") + parallelEfd = true + + // initialize the mock tracer for doing assertions on the finished spans + currentM = m + mTracer = integrations.InitializeCIVisibilityMock() + + // execute the tests, we are expecting some tests to fail and check the assertion later + exitCode := RunM(m) + if exitCode != 0 { + panic("expected the exit code to be 0. Got exit code: " + fmt.Sprintf("%d", exitCode)) + } + + // get all finished spans + finishedSpans := mTracer.FinishedSpans() + showResourcesNameFromSpans(finishedSpans) + + // 1 session span + // 1 module span + // 4 suite span (testing_test.go, testify_test.go, testify_test.go/MySuite and reflections_test.go) + // 5 tests from reflections_test.go + // 1 TestMyTest01 + // 1 TestMyTest02 + 22 subtests + // 1 Test_Foo + 33 subtests + // 1 TestSkip + // 1 TestRetryWithPanic + // 1 TestRetryWithFail + // 1 TestNormalPassingAfterRetryAlwaysFail + // 11 TestEarlyFlakeDetection + // 2 normal spans from testing_test.go + // 3 tests from testify_test.go and testify_test.go/MySuite + + // check spans by resource name + checkSpansByResourceName(finishedSpans, "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite", 0) + checkSpansByResourceName(finishedSpans, "testing_test.go", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest01", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestSkip", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestNormalPassingAfterRetryAlwaysFail", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestEarlyFlakeDetection", 11) + checkSpansByResourceName(finishedSpans, "testify_test.go.TestTestifyLikeTest", 11) + + // check spans by tag + checkSpansByTagName(finishedSpans, constants.TestIsNew, 198) + checkSpansByTagName(finishedSpans, constants.TestIsRetry, 180) + trrSpan := checkSpansByTagName(finishedSpans, constants.TestRetryReason, 180)[0] + if trrSpan.Tag(constants.TestRetryReason) != "early_flake_detection" { + panic(fmt.Sprintf("expected retry reason to be %s, got %s", "early_flake_detection", trrSpan.Tag(constants.TestRetryReason))) + } + + // check capabilities tags + checkCapabilitiesTags(finishedSpans) + + // check logs + checkLogs() + + os.Exit(0) +} + +func runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m *testing.M, impactedTests bool) { + // mock the settings api to enable automatic test retries + server := setUpHTTPServer(true, true, true, &net.KnownTestsResponseData{ + Tests: net.KnownTestsResponseDataModules{ + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting": net.KnownTestsResponseDataSuites{ "reflections_test.go": []string{ "TestGetFieldPointerFrom", "TestGetInternalTestArray", @@ -249,30 +445,58 @@ func runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m *testing.M) { "TestRetryAlwaysFail", "TestNormalPassingAfterRetryAlwaysFail", }, + "testify_test.go": []string{ + "TestTestifyLikeTest", + }, + "testify_test.go/MySuite": []string{ + "TestTestifyLikeTest/TestMySuite", + "TestTestifyLikeTest/TestMySuite/sub01", + }, }, }, - }) + }, + false, nil, + false, nil, + impactedTests) defer server.Close() // set a custom retry count os.Setenv(constants.CIVisibilityFlakyRetryCountEnvironmentVariable, "10") + // set impacted tests variables + if impactedTests { + // set the commit sha to a known value to always have the same git diff + base := "b97e7cbb464aef26da8cb5c07a225f7a144f26a4" + head := "3808532bc719ca418b938afb680246109768f343" + // 3808532bc719ca418b938afb680246109768f343 (feat) internal/civisibility: impacted tests (#3389) + // ... + // b97e7cbb464aef26da8cb5c07a225f7a144f26a4 v2.0.0 (#2427) + + // let's make sure we have both shas available + _ = exec.Command("git", "fetch", "origin", base).Run() + _ = exec.Command("git", "fetch", "origin", head).Run() + + utils.AddCITags(constants.GitPrBaseCommit, base) + utils.AddCITags(constants.GitHeadCommit, head) + } + // initialize the mock tracer for doing assertions on the finished spans currentM = m mTracer = integrations.InitializeCIVisibilityMock() // execute the tests, we are expecting some tests to fail and check the assertion later exitCode := RunM(m) - if exitCode != 1 { - panic("expected the exit code to be 1. We have a failing test on purpose.") + if exitCode != 0 { + panic("expected the exit code to be 0. Got exit code: " + fmt.Sprintf("%d", exitCode)) } // get all finished spans finishedSpans := mTracer.FinishedSpans() + showResourcesNameFromSpans(finishedSpans) // 1 session span // 1 module span - // 2 suite span (testing_test.go and reflections_test.go) + // 4 suite span (testing_test.go, testify_test.go, testify_test.go/MySuite and reflections_test.go) // 5 tests from reflections_test.go // 1 TestMyTest01 // 1 TestMyTest02 + 2 subtests @@ -281,100 +505,409 @@ func runFlakyTestRetriesWithEarlyFlakyTestDetectionTests(m *testing.M) { // 1 TestSkip // 1 TestRetryWithPanic + 3 retry tests from testing_test.go // 1 TestRetryWithFail + 3 retry tests from testing_test.go - // 1 TestRetryAlwaysFail + 10 retry tests from testing_test.go // 1 TestNormalPassingAfterRetryAlwaysFail - // 11 TestEarlyFlakeDetection + 10 retries + // 1 TestEarlyFlakeDetection + 10 EFD retries // 2 normal spans from testing_test.go + // 3 tests from testify_test.go and testify_test.go/MySuite // check spans by resource name - checkSpansByResourceName(finishedSpans, "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting", 1) + checkSpansByResourceName(finishedSpans, "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", 1) checkSpansByResourceName(finishedSpans, "reflections_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite", 1) checkSpansByResourceName(finishedSpans, "testing_test.go", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest01", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02/sub01", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02/sub01/sub03", 1) + if impactedTests { + // impacteds tests will trigger EFD retries (if the test is not quarantined nor disabled) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/yellow_should_return_color", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/banana_should_return_fruit", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/duck_should_return_animal", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestSkip", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 4) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 4) + + } else { + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/yellow_should_return_color", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/banana_should_return_fruit", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/duck_should_return_animal", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestSkip", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 4) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 4) + } + checkSpansByResourceName(finishedSpans, "testing_test.go.TestNormalPassingAfterRetryAlwaysFail", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestEarlyFlakeDetection", 11) + checkSpansByResourceName(finishedSpans, "testify_test.go.TestTestifyLikeTest", 1) + testifySub01 := checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite", 1)[0] + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite/sub01", 1) + + // check that testify span has the correct source file + if !strings.HasSuffix(testifySub01.Tag("test.source.file").(string), "/testify_test.go") { + panic(fmt.Sprintf("source file should be testify_test.go, got %s", testifySub01.Tag("test.source.file").(string))) + } + + // check capabilities tags + checkCapabilitiesTags(finishedSpans) + + // check spans by tag + checkSpansByTagName(finishedSpans, constants.TestIsNew, 55) + + // check if suite has both test code owners and source file tags + suiteSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSuite) + checkSpansByTagName(suiteSpans, constants.TestCodeOwners, 4) + checkSpansByTagName(suiteSpans, constants.TestSourceFile, 4) + + // Impacted tests + if impactedTests { + checkSpansByTagName(finishedSpans, constants.TestIsRetry, 96) + + // check spans by type + checkSpansByType(finishedSpans, + 97, + 1, + 1, + 4, + 121, + 0) + + checkSpansByTagName(finishedSpans, constants.TestIsModified, 33) + } else { + checkSpansByTagName(finishedSpans, constants.TestIsRetry, 56) + + // check spans by type + checkSpansByType(finishedSpans, + 38, + 1, + 1, + 4, + 81, + 0) + + checkSpansByTagName(finishedSpans, constants.TestIsModified, 0) + } + + // check logs + checkLogs() + + os.Exit(0) +} + +func runIntelligentTestRunnerTests(m *testing.M) { + // mock the settings api to enable automatic test retries + server := setUpHTTPServer(true, true, false, nil, true, []net.SkippableResponseDataAttributes{ + { + Suite: "testing_test.go", + Name: "TestMyTest01", + }, + { + Suite: "testing_test.go", + Name: "TestMyTest02", + }, + { + Suite: "testing_test.go", + Name: "Test_Foo", + }, + { + Suite: "testing_test.go", + Name: "TestRetryWithPanic", + }, + { + Suite: "testing_test.go", + Name: "TestRetryWithFail", + }, + { + Suite: "testing_test.go", + Name: "TestRetryAlwaysFail", + }, + { + Suite: "testing_test.go", + Name: "TestNormalPassingAfterRetryAlwaysFail", + }, + }, + false, nil, + false) + defer server.Close() + + // initialize the mock tracer for doing assertions on the finished spans + currentM = m + mTracer = integrations.InitializeCIVisibilityMock() + + // execute the tests, we are expecting some tests to fail and check the assertion later + exitCode := RunM(m) + if exitCode != 0 { + panic("expected the exit code to be 0. All tests should pass (failed ones should be skipped by ITR).") + } + + // get all finished spans + finishedSpans := mTracer.FinishedSpans() + showResourcesNameFromSpans(finishedSpans) + + // 1 session span + // 1 module span + // 4 suite span (testing_test.go, testify_test.go, testify_test.go/MySuite and reflections_test.go) + // 5 tests from reflections_test.go + // 1 TestMyTest01 + // 1 TestMyTest02 + // 1 Test_Foo + // 1 TestSkip + // 1 TestRetryWithPanic + // 1 TestRetryWithFail + // 1 TestRetryAlwaysFail + // 1 TestNormalPassingAfterRetryAlwaysFail + // 1 TestEarlyFlakeDetection + // 3 tests from testify_test.go and testify_test.go/MySuite + + // check spans by resource name + checkSpansByResourceName(finishedSpans, "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go.TestGetFieldPointerFrom", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go.TestGetInternalTestArray", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go.TestGetInternalBenchmarkArray", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go.TestCommonPrivateFields_AddLevel", 1) + checkSpansByResourceName(finishedSpans, "reflections_test.go.TestGetBenchmarkPrivateFields", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest01", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02/sub01", 0) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest02/sub01/sub03", 0) checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/yellow_should_return_color", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/banana_should_return_fruit", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/duck_should_return_animal", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls/default", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestWithExternalCalls/custom-name", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/yellow_should_return_color", 0) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/banana_should_return_fruit", 0) + checkSpansByResourceName(finishedSpans, "testing_test.go.Test_Foo/duck_should_return_animal", 0) checkSpansByResourceName(finishedSpans, "testing_test.go.TestSkip", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 4) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 4) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryAlwaysFail", 11) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 1) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 1) checkSpansByResourceName(finishedSpans, "testing_test.go.TestNormalPassingAfterRetryAlwaysFail", 1) - checkSpansByResourceName(finishedSpans, "testing_test.go.TestEarlyFlakeDetection", 21) + checkSpansByResourceName(finishedSpans, "testing_test.go.TestEarlyFlakeDetection", 1) + checkSpansByResourceName(finishedSpans, "testify_test.go.TestTestifyLikeTest", 1) + testifySub01 := checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite", 1)[0] + checkSpansByResourceName(finishedSpans, "testify_test.go/MySuite.TestTestifyLikeTest/TestMySuite/sub01", 1) - // check spans by tag - checkSpansByTagName(finishedSpans, constants.TestIsNew, 21) - checkSpansByTagName(finishedSpans, constants.TestIsRetry, 36) + // check that testify span has the correct source file + if !strings.HasSuffix(testifySub01.Tag("test.source.file").(string), "/testify_test.go") { + panic(fmt.Sprintf("source file should be testify_test.go, got %s", testifySub01.Tag("test.source.file").(string))) + } + + // check ITR spans + // 5 tests skipped by ITR and 1 normal skipped test + checkSpansByTagValue(finishedSpans, constants.TestStatus, constants.TestStatusSkip, 6) + checkSpansByTagValue(finishedSpans, constants.TestSkipReason, constants.SkippedByITRReason, 5) + + // check unskippable tests + // 5 tests from unskippable suite in reflections_test.go and 2 unskippable tests from testing_test.go + checkSpansByTagValue(finishedSpans, constants.TestUnskippable, "true", 7) + checkSpansByTagValue(finishedSpans, constants.TestForcedToRun, "true", 1) + + // check if suite has both test code owners and source file tags + suiteSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSuite) + checkSpansByTagName(suiteSpans, constants.TestCodeOwners, 4) + checkSpansByTagName(suiteSpans, constants.TestSourceFile, 4) // check spans by type checkSpansByType(finishedSpans, - 64, + 17, 1, 1, - 2, - 58, - 2) + 4, + 20, + 0) + + // check capabilities tags + checkCapabilitiesTags(finishedSpans) + + fmt.Println("All tests passed.") + os.Exit(0) +} + +func runTestManagementTests(m *testing.M) { + // mock the settings api to enable quarantine and disable tests + server := setUpHTTPServer(false, false, false, nil, false, nil, true, + &net.TestManagementTestsResponseDataModules{ + Modules: map[string]net.TestManagementTestsResponseDataSuites{ + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting": { + Suites: map[string]net.TestManagementTestsResponseDataTests{ + "reflections_test.go": { + Tests: map[string]net.TestManagementTestsResponseDataTestProperties{ + "TestGetFieldPointerFrom": { + Properties: net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Quarantined: true, + AttemptToFix: true, + }, + }, + "TestGetInternalTestArray": { + Properties: net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Disabled: true, + AttemptToFix: true, + }, + }, + }, + }, + "testing_test.go": { + Tests: map[string]net.TestManagementTestsResponseDataTestProperties{ + "TestMyTest01": { + Properties: net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Disabled: true, + }, + }, + "TestRetryWithFail": { + Properties: net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Quarantined: true, + }, + }, + "TestRetryWithPanic": { + Properties: net.TestManagementTestsResponseDataTestPropertiesAttributes{ + Disabled: true, + AttemptToFix: true, + }, + }, + }, + }, + }, + }, + }, + }, + false) + + defer server.Close() + + // set a custom retry count + os.Setenv(constants.CIVisibilityTestManagementAttemptToFixRetriesEnvironmentVariable, "10") + + // initialize the mock tracer for doing assertions on the finished spans + currentM = m + mTracer = integrations.InitializeCIVisibilityMock() + + testRetryWithPanicRunNumber.Store(-10) // this makes TestRetryWithPanic to always fail (required by this test) + exitCode := RunM(m) + if exitCode != 0 { + panic("expected the exit code to be 0. Got exit code: " + fmt.Sprintf("%d", exitCode)) + } + + // get all finished spans + finishedSpans := mTracer.FinishedSpans() + showResourcesNameFromSpans(finishedSpans) + + // Disabled test with an attempt to fix with 10 executions + testGetInternalTestArray := checkSpansByResourceName(finishedSpans, "reflections_test.go.TestGetInternalTestArray", 10) + checkSpansByTagValue(testGetInternalTestArray, constants.TestIsDisabled, "true", 10) // Disabled + checkSpansByTagValue(testGetInternalTestArray, constants.TestIsAttempToFix, "true", 10) // Is an attempt to fix + checkSpansByTagValue(testGetInternalTestArray, constants.TestIsRetry, "true", 9) // 9 retries + checkSpansByTagValue(testGetInternalTestArray, constants.TestRetryReason, "attempt_to_fix", 9) // 9 retries with the attempt to fix reason + checkSpansByTagValue(testGetInternalTestArray, constants.TestAttemptToFixPassed, "true", 1) // Attempt to fix passed (reported in the latest retry) + checkSpansByTagValue(testGetInternalTestArray, constants.TestAttemptToFixPassed, "false", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testGetInternalTestArray, constants.TestHasFailedAllRetries, "true", 0) // All retries failed = false (reported in the latest retry) + checkSpansByTagValue(testGetInternalTestArray, constants.TestStatus, constants.TestStatusPass, 10) // All tests passed + + // Quaratined test with an attempt to fix with 10 executions + testGetFieldPointerFrom := checkSpansByResourceName(finishedSpans, "reflections_test.go.TestGetFieldPointerFrom", 10) + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestIsQuarantined, "true", 10) // Quarantined + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestIsAttempToFix, "true", 10) // Is an attempt to fix + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestIsRetry, "true", 9) // 9 retries + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestRetryReason, "attempt_to_fix", 9) // 9 retries with the attempt to fix reason + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestAttemptToFixPassed, "true", 1) // Attempt to fix passed (reported in the latest retry) + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestAttemptToFixPassed, "false", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestHasFailedAllRetries, "true", 0) // All retries failed = false (reported in the latest retry) + checkSpansByTagValue(testGetFieldPointerFrom, constants.TestStatus, constants.TestStatusPass, 10) // All tests passed + + // Disabled test without an attempt to fix (it just skipped and reported as skipped) + testMyTest01 := checkSpansByResourceName(finishedSpans, "testing_test.go.TestMyTest01", 1) + checkSpansByTagValue(testMyTest01, constants.TestIsDisabled, "true", 1) // Disabled + checkSpansByTagValue(testMyTest01, constants.TestIsAttempToFix, "true", 0) // Is not an attempt to fix + checkSpansByTagValue(testMyTest01, constants.TestIsRetry, "true", 0) // 0 retries + checkSpansByTagValue(testMyTest01, constants.TestRetryReason, "attempt_to_fix", 0) // 0 retries with the attempt to fix reason + checkSpansByTagValue(testMyTest01, constants.TestHasFailedAllRetries, "true", 0) // All retries failed (reported in the latest retry) + checkSpansByTagValue(testMyTest01, constants.TestAttemptToFixPassed, "true", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testMyTest01, constants.TestAttemptToFixPassed, "false", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testMyTest01, constants.TestStatus, constants.TestStatusSkip, 1) // Because is not an attempt to fix we just skip it + + // Quarantined test without an attempt to fix (it executed but reported as skipped) + testRetryWithFail := checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithFail", 1) + checkSpansByTagValue(testRetryWithFail, constants.TestIsQuarantined, "true", 1) // Quarantined + checkSpansByTagValue(testRetryWithFail, constants.TestIsAttempToFix, "true", 0) // Is not an attempt to fix + checkSpansByTagValue(testRetryWithFail, constants.TestIsRetry, "true", 0) // 0 retries + checkSpansByTagValue(testRetryWithFail, constants.TestRetryReason, "attempt_to_fix", 0) // 0 retries with the attempt to fix reason + checkSpansByTagValue(testRetryWithFail, constants.TestHasFailedAllRetries, "true", 0) // All retries failed (reported in the latest retry) + checkSpansByTagValue(testRetryWithFail, constants.TestAttemptToFixPassed, "true", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testRetryWithFail, constants.TestAttemptToFixPassed, "false", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testRetryWithFail, constants.TestStatus, constants.TestStatusFail, 1) // Because is not an attempt to fix we execute it but don't report the status + + // Disabled test with an attempt to fix with 10 executions + testRetryWithPanic := checkSpansByResourceName(finishedSpans, "testing_test.go.TestRetryWithPanic", 10) + checkSpansByTagValue(testRetryWithPanic, constants.TestIsDisabled, "true", 10) // Disabled + checkSpansByTagValue(testRetryWithPanic, constants.TestIsAttempToFix, "true", 10) // Is an attempt to fix + checkSpansByTagValue(testRetryWithPanic, constants.TestIsRetry, "true", 9) // 9 retries + checkSpansByTagValue(testRetryWithPanic, constants.TestRetryReason, "attempt_to_fix", 9) // 9 retries with the attempt to fix reason + checkSpansByTagValue(testRetryWithPanic, constants.TestHasFailedAllRetries, "true", 1) // All retries failed (reported in the latest retry) + checkSpansByTagValue(testRetryWithPanic, constants.TestAttemptToFixPassed, "true", 0) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testRetryWithPanic, constants.TestAttemptToFixPassed, "false", 1) // Attempt to fix passed false (reported in the latest retry) + checkSpansByTagValue(testRetryWithPanic, constants.TestStatus, constants.TestStatusFail, 10) // All tests passed + + // check capabilities tags + checkCapabilitiesTags(finishedSpans) + + // check if suite has both test code owners and source file tags + suiteSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSuite) + checkSpansByTagName(suiteSpans, constants.TestCodeOwners, 4) + checkSpansByTagName(suiteSpans, constants.TestSourceFile, 4) + + // check logs + checkLogs() os.Exit(0) } -func checkSpansByType(finishedSpans []mocktracer.Span, +func checkSpansByType(finishedSpans []*mocktracer.Span, totalFinishedSpansCount int, sessionSpansCount int, moduleSpansCount int, suiteSpansCount int, testSpansCount int, normalSpansCount int) { calculatedFinishedSpans := len(finishedSpans) - fmt.Printf("Number of spans received: %d\n", calculatedFinishedSpans) + log.Debug("Number of spans received: %d", calculatedFinishedSpans) if calculatedFinishedSpans < totalFinishedSpansCount { panic(fmt.Sprintf("expected at least %d finished spans, got %d", totalFinishedSpansCount, calculatedFinishedSpans)) } sessionSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSession) calculatedSessionSpans := len(sessionSpans) - fmt.Printf("Number of sessions received: %d\n", calculatedSessionSpans) - showResourcesNameFromSpans(sessionSpans) + log.Debug("Number of sessions received: %d", calculatedSessionSpans) if calculatedSessionSpans != sessionSpansCount { panic(fmt.Sprintf("expected exactly %d session span, got %d", sessionSpansCount, calculatedSessionSpans)) } moduleSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestModule) calculatedModuleSpans := len(moduleSpans) - fmt.Printf("Number of modules received: %d\n", calculatedModuleSpans) - showResourcesNameFromSpans(moduleSpans) + log.Debug("Number of modules received: %d", calculatedModuleSpans) if calculatedModuleSpans != moduleSpansCount { panic(fmt.Sprintf("expected exactly %d module span, got %d", moduleSpansCount, calculatedModuleSpans)) } suiteSpans := getSpansWithType(finishedSpans, constants.SpanTypeTestSuite) calculatedSuiteSpans := len(suiteSpans) - fmt.Printf("Number of suites received: %d\n", calculatedSuiteSpans) - showResourcesNameFromSpans(suiteSpans) + log.Debug("Number of suites received: %d", calculatedSuiteSpans) if calculatedSuiteSpans != suiteSpansCount { panic(fmt.Sprintf("expected exactly %d suite spans, got %d", suiteSpansCount, calculatedSuiteSpans)) } testSpans := getSpansWithType(finishedSpans, constants.SpanTypeTest) calculatedTestSpans := len(testSpans) - fmt.Printf("Number of tests received: %d\n", calculatedTestSpans) - showResourcesNameFromSpans(testSpans) + log.Debug("Number of tests received: %d", calculatedTestSpans) if calculatedTestSpans != testSpansCount { panic(fmt.Sprintf("expected exactly %d test spans, got %d", testSpansCount, calculatedTestSpans)) } normalSpans := getSpansWithType(finishedSpans, ext.SpanTypeHTTP) calculatedNormalSpans := len(normalSpans) - fmt.Printf("Number of http spans received: %d\n", calculatedNormalSpans) - showResourcesNameFromSpans(normalSpans) + log.Debug("Number of http spans received: %d", calculatedNormalSpans) if calculatedNormalSpans != normalSpansCount { panic(fmt.Sprintf("expected exactly %d normal spans, got %d", normalSpansCount, calculatedNormalSpans)) } } -func checkSpansByResourceName(finishedSpans []mocktracer.Span, resourceName string, count int) []mocktracer.Span { +func checkSpansByResourceName(finishedSpans []*mocktracer.Span, resourceName string, count int) []*mocktracer.Span { spans := getSpansWithResourceName(finishedSpans, resourceName) numOfSpans := len(spans) if numOfSpans != count { @@ -384,7 +917,7 @@ func checkSpansByResourceName(finishedSpans []mocktracer.Span, resourceName stri return spans } -func checkSpansByTagName(finishedSpans []mocktracer.Span, tagName string, count int) []mocktracer.Span { +func checkSpansByTagName(finishedSpans []*mocktracer.Span, tagName string, count int) []*mocktracer.Span { spans := getSpansWithTagName(finishedSpans, tagName) numOfSpans := len(spans) if numOfSpans != count { @@ -394,13 +927,86 @@ func checkSpansByTagName(finishedSpans []mocktracer.Span, tagName string, count return spans } -func setUpHttpServer(flakyRetriesEnabled bool, earlyFlakyDetectionEnabled bool, earlyFlakyDetectionData *net.EfdResponseData) *httptest.Server { +func checkSpansByTagValue(finishedSpans []*mocktracer.Span, tagName, tagValue string, count int) []*mocktracer.Span { + spans := getSpansWithTagNameAndValue(finishedSpans, tagName, tagValue) + numOfSpans := len(spans) + if numOfSpans != count { + panic(fmt.Sprintf("expected exactly %d spans with tag name: %s and value %s, got %d", count, tagName, tagValue, numOfSpans)) + } + + return spans +} + +func checkCapabilitiesTags(finishedSpans []*mocktracer.Span) { + tests := getSpansWithType(finishedSpans, constants.SpanTypeTest) + numOfTests := len(tests) + if len(getSpansWithTagName(tests, constants.LibraryCapabilitiesTestImpactAnalysis)) != numOfTests { + panic(fmt.Sprintf("expected all test spans to have the %s tag", constants.LibraryCapabilitiesTestImpactAnalysis)) + } + if len(getSpansWithTagName(tests, constants.LibraryCapabilitiesEarlyFlakeDetection)) != numOfTests { + panic(fmt.Sprintf("expected all test spans to have the %s tag", constants.LibraryCapabilitiesEarlyFlakeDetection)) + } + if len(getSpansWithTagName(tests, constants.LibraryCapabilitiesAutoTestRetries)) != numOfTests { + panic(fmt.Sprintf("expected all test spans to have the %s tag", constants.LibraryCapabilitiesAutoTestRetries)) + } + if len(getSpansWithTagName(tests, constants.LibraryCapabilitiesTestManagementQuarantine)) != numOfTests { + panic(fmt.Sprintf("expected all test spans to have the %s tag", constants.LibraryCapabilitiesTestManagementQuarantine)) + } + if len(getSpansWithTagName(tests, constants.LibraryCapabilitiesTestManagementDisable)) != numOfTests { + panic(fmt.Sprintf("expected all test spans to have the %s tag", constants.LibraryCapabilitiesTestManagementDisable)) + } + if len(getSpansWithTagName(tests, constants.LibraryCapabilitiesTestManagementAttemptToFix)) != numOfTests { + panic(fmt.Sprintf("expected all test spans to have the %s tag", constants.LibraryCapabilitiesTestManagementAttemptToFix)) + } +} + +func checkLogs() { + // Assert that at least one logs payload has been sent by the library. + logsEntriesCount := len(logsEntries) + log.Debug("Number of logs received: %d", logsEntriesCount) + if logsEntriesCount == 0 { + panic("expected at least one logs payload to be sent, but none were received") + } +} + +type ( + skippableResponse struct { + Meta skippableResponseMeta `json:"meta"` + Data []skippableResponseData `json:"data"` + } + + skippableResponseMeta struct { + CorrelationID string `json:"correlation_id"` + } + + skippableResponseData struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes net.SkippableResponseDataAttributes `json:"attributes"` + } +) + +func setUpHTTPServer( + flakyRetriesEnabled bool, + knownTestsEnabled bool, + earlyFlakyDetectionEnabled bool, + earlyFlakyDetectionData *net.KnownTestsResponseData, + itrEnabled bool, + itrData []net.SkippableResponseDataAttributes, + testManagement bool, + testManagementData *net.TestManagementTestsResponseDataModules, + impactedTests bool) *httptest.Server { + // Reset the collected logs for the new server instance. + logsEntries = nil + enableKnownTests := knownTestsEnabled || earlyFlakyDetectionEnabled // mock the settings api to enable automatic test retries server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - fmt.Printf("MockApi received request: %s\n", r.URL.Path) + log.Debug("MockApi received request: %s", r.URL.Path) // Settings request if r.URL.Path == "/api/v2/libraries/tests/services/setting" { + body, _ := io.ReadAll(r.Body) + log.Debug("MockApi received body: %s", body) w.Header().Set("Content-Type", "application/json") response := struct { Data struct { @@ -413,22 +1019,31 @@ func setUpHttpServer(flakyRetriesEnabled bool, earlyFlakyDetectionEnabled bool, // let's enable flaky test retries response.Data.Attributes = net.SettingsResponseData{ FlakyTestRetriesEnabled: flakyRetriesEnabled, + ItrEnabled: itrEnabled, + TestsSkipping: itrEnabled, + KnownTestsEnabled: enableKnownTests, + ImpactedTestsEnabled: impactedTests, } + + response.Data.Attributes.TestManagement.Enabled = testManagement + response.Data.Attributes.EarlyFlakeDetection.Enabled = earlyFlakyDetectionEnabled response.Data.Attributes.EarlyFlakeDetection.SlowTestRetries.FiveS = 10 response.Data.Attributes.EarlyFlakeDetection.SlowTestRetries.TenS = 5 response.Data.Attributes.EarlyFlakeDetection.SlowTestRetries.ThirtyS = 3 response.Data.Attributes.EarlyFlakeDetection.SlowTestRetries.FiveM = 2 - fmt.Printf("MockApi sending response: %v\n", response) + log.Debug("MockApi sending response: %v", response) json.NewEncoder(w).Encode(&response) - } else if earlyFlakyDetectionEnabled && r.URL.Path == "/api/v2/ci/libraries/tests" { + } else if enableKnownTests && r.URL.Path == "/api/v2/ci/libraries/tests" { + body, _ := io.ReadAll(r.Body) + log.Debug("MockApi received body: %s", body) w.Header().Set("Content-Type", "application/json") response := struct { Data struct { - ID string `json:"id"` - Type string `json:"type"` - Attributes net.EfdResponseData `json:"attributes"` + ID string `json:"id"` + Type string `json:"type"` + Attributes net.KnownTestsResponseData `json:"attributes"` } `json:"data,omitempty"` }{} @@ -436,20 +1051,72 @@ func setUpHttpServer(flakyRetriesEnabled bool, earlyFlakyDetectionEnabled bool, response.Data.Attributes = *earlyFlakyDetectionData } - fmt.Printf("MockApi sending response: %v\n", response) + log.Debug("MockApi sending response: %v", response) json.NewEncoder(w).Encode(&response) } else if r.URL.Path == "/api/v2/git/repository/search_commits" { + body, _ := io.ReadAll(r.Body) + log.Debug("MockApi received body: %s", body) w.Header().Set("Content-Type", "application/json") w.Write([]byte("{}")) } else if r.URL.Path == "/api/v2/git/repository/packfile" { w.WriteHeader(http.StatusAccepted) + } else if itrEnabled && r.URL.Path == "/api/v2/ci/tests/skippable" { + body, _ := io.ReadAll(r.Body) + log.Debug("MockApi received body: %s", body) + w.Header().Set("Content-Type", "application/json") + response := skippableResponse{ + Meta: skippableResponseMeta{ + CorrelationID: "correlation_id", + }, + Data: []skippableResponseData{}, + } + for i, data := range itrData { + response.Data = append(response.Data, skippableResponseData{ + ID: fmt.Sprintf("id_%d", i), + Type: "type", + Attributes: data, + }) + } + log.Debug("MockApi sending response: %v", response) + json.NewEncoder(w).Encode(&response) + } else if r.URL.Path == "/api/v2/logs" { + // Mock the logs intake endpoint. + reader, _ := gzip.NewReader(r.Body) + body, _ := io.ReadAll(reader) + log.Debug("MockApi received logs payload: %d bytes", len(body)) + var newEntries []*mockedLogEntry + if err := json.Unmarshal(body, &newEntries); err != nil { + log.Debug("MockApi received invalid logs payload: %s", err) + log.Debug("Payload: %s", body) + w.WriteHeader(http.StatusBadRequest) + return + } + logsEntries = append(logsEntries, newEntries...) + log.Debug("MockApi received %d log entries", len(newEntries)) + // A 2xx status code is required to mark the payload as accepted. + w.WriteHeader(http.StatusAccepted) + } else if r.URL.Path == "/api/v2/test/libraries/test-management/tests" { + body, _ := io.ReadAll(r.Body) + log.Debug("MockApi received body: %s", body) + w.Header().Set("Content-Type", "application/json") + response := struct { + Data struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes net.TestManagementTestsResponseDataModules `json:"attributes"` + } `json:"data,omitempty"` + }{} + response.Data.Type = "ci_app_libraries_tests" + response.Data.Attributes = *testManagementData + log.Debug("MockApi sending response: %v", response) + json.NewEncoder(w).Encode(&response) } else { http.NotFound(w, r) } })) // set the custom agentless url and the flaky retry count env-var - fmt.Printf("Using mockapi at: %s\n", server.URL) + log.Debug("Using mockapi at: %s", server.URL) os.Setenv(constants.CIVisibilityAgentlessEnabledEnvironmentVariable, "1") os.Setenv(constants.CIVisibilityAgentlessURLEnvironmentVariable, server.URL) os.Setenv(constants.APIKeyEnvironmentVariable, "12345") @@ -457,8 +1124,8 @@ func setUpHttpServer(flakyRetriesEnabled bool, earlyFlakyDetectionEnabled bool, return server } -func getSpansWithType(spans []mocktracer.Span, spanType string) []mocktracer.Span { - var result []mocktracer.Span +func getSpansWithType(spans []*mocktracer.Span, spanType string) []*mocktracer.Span { + var result []*mocktracer.Span for _, span := range spans { if span.Tag(ext.SpanType) == spanType { result = append(result, span) @@ -468,8 +1135,8 @@ func getSpansWithType(spans []mocktracer.Span, spanType string) []mocktracer.Spa return result } -func getSpansWithResourceName(spans []mocktracer.Span, resourceName string) []mocktracer.Span { - var result []mocktracer.Span +func getSpansWithResourceName(spans []*mocktracer.Span, resourceName string) []*mocktracer.Span { + var result []*mocktracer.Span for _, span := range spans { if span.Tag(ext.ResourceName) == resourceName { result = append(result, span) @@ -479,8 +1146,8 @@ func getSpansWithResourceName(spans []mocktracer.Span, resourceName string) []mo return result } -func getSpansWithTagName(spans []mocktracer.Span, tag string) []mocktracer.Span { - var result []mocktracer.Span +func getSpansWithTagName(spans []*mocktracer.Span, tag string) []*mocktracer.Span { + var result []*mocktracer.Span for _, span := range spans { if span.Tag(tag) != nil { result = append(result, span) @@ -490,8 +1157,33 @@ func getSpansWithTagName(spans []mocktracer.Span, tag string) []mocktracer.Span return result } -func showResourcesNameFromSpans(spans []mocktracer.Span) { +func getSpansWithTagNameAndValue(spans []*mocktracer.Span, tag, value string) []*mocktracer.Span { + var result []*mocktracer.Span + for _, span := range spans { + if span.Tag(tag) == value { + result = append(result, span) + } + } + + return result +} + +func showResourcesNameFromSpans(spans []*mocktracer.Span) { for i, span := range spans { - fmt.Printf(" [%d] = %v\n", i, span.Tag(ext.ResourceName)) + log.Debug(" [%d] = %v | %v", i, span.Tag(ext.ResourceName), span.Tag(constants.TestName)) } } + +type mockedLogEntry struct { + DdSource string `json:"ddsource"` + Hostname string `json:"hostname"` + Timestamp int64 `json:"timestamp,omitempty"` + Message string `json:"message"` + DdTraceID string `json:"dd.trace_id"` + DdSpanID string `json:"dd.span_id"` + TestModule string `json:"test.module"` + TestSuite string `json:"test.suite"` + TestName string `json:"test.name"` + Service string `json:"service"` + DdTags string `json:"dd_tags,omitempty"` +} diff --git a/internal/civisibility/integrations/gotesting/testify.go b/internal/civisibility/integrations/gotesting/testify.go new file mode 100644 index 0000000000..5e91716d5d --- /dev/null +++ b/internal/civisibility/integrations/gotesting/testify.go @@ -0,0 +1,159 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package gotesting + +import ( + "fmt" + "path/filepath" + "reflect" + "regexp" + "runtime" + "strings" + "sync" + "testing" + "unsafe" +) + +// TestifyTest is a struct that stores the information about a test method from a Testify suite. +type TestifyTest struct { + methodName string + suiteName string + moduleName string + methodFunc *runtime.Func + suite reflect.Type +} + +var ( + // testifyTestsByParentT is a map that stores the TestifyTest structs for each parent T. + testifyTestsByParentT = map[unsafe.Pointer][]TestifyTest{} + + // testifyTestsByParentTMutex is a mutex to protect the testifyTestsByParentT map. + testifyTestsByParentTMutex sync.RWMutex +) + +// getTestifyTest returns the TestifyTest struct for the given *testing.T. +func getTestifyTest(t *testing.T) *TestifyTest { + return getTestifyTestFromReflectValue(reflect.ValueOf(t)) +} + +// getTestifyTestFromReflectValue returns the TestifyTest struct for the given reflect.Value (*testing.T or *common for the parent T). +func getTestifyTestFromReflectValue(tValue reflect.Value) *TestifyTest { + // check if the reflect.Value is valid + if !tValue.IsValid() || tValue.IsZero() || tValue.IsNil() { + return nil + } + // get the parent field for testing.T or common + member := reflect.Indirect(tValue).FieldByName("parent") + if !member.IsValid() && !member.IsNil() { + return nil + } + memberPtr := unsafe.Pointer(member.UnsafeAddr()) + + // let's check if the test parent was registered before (`suite.Run(*testing.T, TestSuite)` auto-instrumentation should register the parent T with the suite instance) + if tests, ok := getTestifyTestsByParentT(*(*unsafe.Pointer)(memberPtr)); ok { + // get the name of the test (not the parent) + var tName string + if ptr, err := getFieldPointerFromValue(reflect.Indirect(tValue), "name"); err == nil && ptr != nil { + tName = *(*string)(ptr) + } else { + return nil + } + + // let's find the TestifyTest struct for the current test + for _, test := range tests { + mName := fmt.Sprintf("/%s", test.methodName) + if strings.HasSuffix(tName, mName) { + return &test + } + } + } else if member.IsValid() && !member.IsZero() && !member.IsNil() { + // if the parent T was not registered, let's try to find the TestifyTest struct for the parent T + // this is required for subtests + return getTestifyTestFromReflectValue(member) + } + + return nil +} + +// registerTestifySuite registers the Testify suite with the given *testing.T. +func registerTestifySuite(t *testing.T, suite any) { + // check if the *testing.T and the suite are valid + if t == nil || suite == nil { + return + } + + // get the reflect.Type of the suite + methodFinder := reflect.TypeOf(suite) + suiteReflect := methodFinder.Elem() + + // get the suite name and module name + suiteName := suiteReflect.Name() + moduleName := suiteReflect.PkgPath() + + // get the parent T pointer + tPtr := reflect.ValueOf(t).UnsafePointer() + + // get the TestifyTest structs for the parent T in case is not the first Suite registration for the test + var tests []TestifyTest + if tmpTests, ok := getTestifyTestsByParentT(tPtr); ok { + tests = tmpTests + } + + // check if we already processed the suite + for _, test := range tests { + if test.suite == methodFinder { + // the suite was already registered + return + } + } + + // iterate over the methods of the suite to find the Test methods + for i := 0; i < methodFinder.NumMethod(); i++ { + method := methodFinder.Method(i) + + // get the name for the method + methodName := method.Name + + // filter out non Test methods + if ok, _ := regexp.MatchString("^Test", methodName); !ok { + continue + } + + // get the file for the method + methodFunc := runtime.FuncForPC(uintptr(method.Func.UnsafePointer())) + var methodFile string + if methodFunc != nil { + methodFile, _ = methodFunc.FileLine(methodFunc.Entry()) + } + + // append the TestifyTest struct to the tests slice + tests = append(tests, TestifyTest{ + methodName: methodName, + suiteName: fmt.Sprintf("%s/%s", filepath.Base(methodFile), suiteName), + moduleName: moduleName, + methodFunc: methodFunc, + suite: methodFinder, + }) + } + + // store the TestifyTest structs for the parent T + setTestifyTestsByParentT(tPtr, tests) +} + +func getTestifyTestsByParentT(ptr unsafe.Pointer) ([]TestifyTest, bool) { + testifyTestsByParentTMutex.RLock() + defer testifyTestsByParentTMutex.RUnlock() + if tests, ok := testifyTestsByParentT[ptr]; ok { + return tests, true + } + return nil, false +} + +func setTestifyTestsByParentT(ptr unsafe.Pointer, tests []TestifyTest) { + testifyTestsByParentTMutex.Lock() + defer testifyTestsByParentTMutex.Unlock() + testifyTestsByParentT[ptr] = tests +} diff --git a/internal/civisibility/integrations/gotesting/testify_test.go b/internal/civisibility/integrations/gotesting/testify_test.go new file mode 100644 index 0000000000..7465e54874 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/testify_test.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package gotesting + +import ( + "reflect" + "testing" +) + +func TestTestifyLikeTest(t *testing.T) { + if parallelEfd { + t.Skip("Skipping TestTestifyLikeTest in parallel mode") + } + mySuite := new(MySuite) + registerTestifySuite(t, mySuite) + Run(t, mySuite) + + tParent := t + t.Run("check_suite_registration", func(t *testing.T) { + if tests, ok := getTestifyTestsByParentT(reflect.ValueOf(tParent).UnsafePointer()); ok { + if len(tests) != 1 { + t.Errorf("Expected 1 test to be registered, got %d", len(tests)) + } + + test := tests[0] + if test.methodName != "TestMySuite" { + t.Errorf("Expected method name to be TestMySuite, got %s", test.methodName) + } + if test.suiteName != "testify_test.go/MySuite" { + t.Errorf("Expected suite name to be testify_test.go/MySuite, got %s", test.suiteName) + } + if test.moduleName != "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting" { + t.Errorf("Expected module name to be github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting, got %s", test.moduleName) + } + } else { + t.Errorf("Expected the parent T to be registered, got %v", reflect.ValueOf(tParent).UnsafePointer()) + } + }) +} + +func (s *MySuite) TestMySuite() { + t := (*T)(s.T) + t.Log("This is a test") + t.Run("sub01", func(_ *testing.T) { + }) +} diff --git a/internal/civisibility/integrations/gotesting/testify_utils_test.go b/internal/civisibility/integrations/gotesting/testify_utils_test.go new file mode 100644 index 0000000000..d3cb1b9a12 --- /dev/null +++ b/internal/civisibility/integrations/gotesting/testify_utils_test.go @@ -0,0 +1,42 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package gotesting + +import ( + "reflect" + "testing" +) + +type MySuite struct { + T *testing.T +} + +func Run(t *testing.T, suite *MySuite) { + suite.T = t + + tests := []testing.InternalTest{} + methodFinder := reflect.TypeOf(suite) + for i := 0; i < methodFinder.NumMethod(); i++ { + method := methodFinder.Method(i) + + parentT := t + test := testing.InternalTest{ + Name: method.Name, + F: func(t *testing.T) { + suite.T = t + defer func() { + suite.T = parentT + }() + method.Func.Call([]reflect.Value{reflect.ValueOf(suite)}) + }, + } + tests = append(tests, test) + } + + for _, test := range tests { + (*T)(t).Run(test.Name, test.F) + } +} diff --git a/internal/civisibility/integrations/gotesting/testing.go b/internal/civisibility/integrations/gotesting/testing.go index 4fa6443647..dc4f1cc4ed 100644 --- a/internal/civisibility/integrations/gotesting/testing.go +++ b/internal/civisibility/integrations/gotesting/testing.go @@ -6,17 +6,26 @@ package gotesting import ( + "bufio" "fmt" "reflect" "runtime" + "slices" + "strings" + "sync" "sync/atomic" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting/coverage" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/logs" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const ( @@ -26,7 +35,7 @@ const ( var ( // session represents the CI visibility test session. - session integrations.DdTestSession + session integrations.TestSession // testInfos holds information about the instrumented tests. testInfos []*testingTInfo @@ -34,19 +43,48 @@ var ( // benchmarkInfos holds information about the instrumented benchmarks. benchmarkInfos []*testingBInfo + // modulesCountersMutex is a mutex to protect access to the modulesCounters map. + modulesCountersMutex sync.Mutex + // modulesCounters keeps track of the number of tests per module. - modulesCounters = map[string]*int32{} + modulesCounters = map[string]int{} + + // suitesCountersMutex is a mutex to protect access to the suitesCounters map. + suitesCountersMutex sync.Mutex // suitesCounters keeps track of the number of tests per suite. - suitesCounters = map[string]*int32{} + suitesCounters = map[string]int{} + + // numOfTestsSkipped keeps track of the number of tests skipped by ITR. + numOfTestsSkipped atomic.Uint64 + + // chattyPrinterOnce ensures that the chatty printer is initialized only once. + chattyPrinterOnce sync.Once + + // chatty is the global chatty printer used for debugging and verbose output. + chatty *chattyPrinter ) type ( + // testIdentity represents the fully-qualified identity of a Go test or subtest. + // It captures the module and suite where the test belongs, the base test name + // (top-level test), the full hierarchical name reported by Go (including subtests), + // and every individual path segment in order. This allows test management logic to + // resolve configuration at any depth while still falling back to parent segments. + testIdentity struct { + ModuleName string + SuiteName string + BaseName string + FullName string + Segments []string + } + // commonInfo holds common information about tests and benchmarks. commonInfo struct { moduleName string suiteName string testName string + identity *testIdentity } // testingTInfo holds information specific to tests. @@ -65,6 +103,33 @@ type ( M testing.M ) +// newTestIdentity builds a testIdentity instance for the provided module, suite, +// and fully-qualified Go test name. The base name corresponds to the first path +// segment (the top-level test declared via testing.T.Run). The Segments slice +// always contains at least one entry so consumers can traverse parent levels. +func newTestIdentity(moduleName, suiteName, fullName string) *testIdentity { + if fullName == "" { + fullName = "" + } + segments := strings.Split(fullName, "/") + baseName := segments[0] + return &testIdentity{ + ModuleName: moduleName, + SuiteName: suiteName, + BaseName: baseName, + FullName: fullName, + Segments: segments, + } +} + +type testManagementMatchKind int + +const ( + testManagementMatchNone testManagementMatchKind = iota + testManagementMatchExact + testManagementMatchAncestor +) + // Run initializes CI Visibility, instruments tests and benchmarks, and runs them. func (ddm *M) Run() int { m := (*testing.M)(ddm) @@ -82,97 +147,211 @@ func (ddm *M) Run() int { // instrumentInternalTests instruments the internal tests for CI visibility. func (ddm *M) instrumentInternalTests(internalTests *[]testing.InternalTest) { - if internalTests != nil { - // Extract info from internal tests - testInfos = make([]*testingTInfo, len(*internalTests)) - for idx, test := range *internalTests { - moduleName, suiteName := utils.GetModuleAndSuiteName(reflect.Indirect(reflect.ValueOf(test.F)).Pointer()) - testInfo := &testingTInfo{ - originalFunc: test.F, - commonInfo: commonInfo{ - moduleName: moduleName, - suiteName: suiteName, - testName: test.Name, - }, - } + if internalTests == nil { + return + } - // Initialize module and suite counters if not already present. - if _, ok := modulesCounters[moduleName]; !ok { - var v int32 - modulesCounters[moduleName] = &v - } - // Increment the test count in the module. - atomic.AddInt32(modulesCounters[moduleName], 1) + // Get the settings response for this session + settings := integrations.GetSettings() + + // Check if the test is going to be skipped by ITR + if settings.ItrEnabled { + if settings.CodeCoverage && coverage.CanCollect() { + session.SetTag(constants.CodeCoverageEnabled, "true") + } else { + session.SetTag(constants.CodeCoverageEnabled, "true") + } + + if settings.TestsSkipping { + session.SetTag(constants.ITRTestsSkippingEnabled, "true") + session.SetTag(constants.ITRTestsSkippingType, "test") - if _, ok := suitesCounters[suiteName]; !ok { - var v int32 - suitesCounters[suiteName] = &v + // Check if the test is going to be skipped by ITR + skippableTests := integrations.GetSkippableTests() + if skippableTests != nil { + if len(skippableTests) > 0 { + session.SetTag(constants.ITRTestsSkipped, "false") + } } - // Increment the test count in the suite. - atomic.AddInt32(suitesCounters[suiteName], 1) + } else { + session.SetTag(constants.ITRTestsSkippingEnabled, "false") + } + } - testInfos[idx] = testInfo + // Extract info from internal tests + testInfos = make([]*testingTInfo, len(*internalTests)) + for idx, test := range *internalTests { + moduleName, suiteName := utils.GetModuleAndSuiteName(reflect.Indirect(reflect.ValueOf(test.F)).Pointer()) + identity := newTestIdentity(moduleName, suiteName, test.Name) + testInfo := &testingTInfo{ + originalFunc: test.F, + commonInfo: commonInfo{ + moduleName: moduleName, + suiteName: suiteName, + testName: test.Name, + identity: identity, + }, } - // Create new instrumented internal tests - newTestArray := make([]testing.InternalTest, len(*internalTests)) - for idx, testInfo := range testInfos { - newTestArray[idx] = testing.InternalTest{ - Name: testInfo.testName, - F: ddm.executeInternalTest(testInfo), - } + // Increment the test count in the module. + addModulesCounters(moduleName, 1) + + // Increment the test count in the suite. + addSuitesCounters(suiteName, 1) + + testInfos[idx] = testInfo + } + + // Create new instrumented internal tests + newTestArray := make([]testing.InternalTest, len(*internalTests)) + for idx, testInfo := range testInfos { + newTestArray[idx] = testing.InternalTest{ + Name: testInfo.testName, + F: ddm.executeInternalTest(testInfo), } - *internalTests = newTestArray } + *internalTests = newTestArray } // executeInternalTest wraps the original test function to include CI visibility instrumentation. func (ddm *M) executeInternalTest(testInfo *testingTInfo) func(*testing.T) { originalFunc := runtime.FuncForPC(reflect.Indirect(reflect.ValueOf(testInfo.originalFunc)).Pointer()) + + // Get the settings response for this session + settings := integrations.GetSettings() + coverageEnabled := settings.CodeCoverage + testSkippedByITR := false + testIsNew := true + + // Check if the test is going to be skipped by ITR + if settings.ItrEnabled && settings.TestsSkipping { + // Check if the test is going to be skipped by ITR + skippableTests := integrations.GetSkippableTests() + if skippableTests != nil { + if suitesMap, ok := skippableTests[testInfo.suiteName]; ok { + if _, ok := suitesMap[testInfo.testName]; ok { + testSkippedByITR = true + } + } + } + } + + // Check if the test is known + if settings.KnownTestsEnabled { + testIsKnown, testKnownDataOk := isKnownTest(&testInfo.commonInfo) + testIsNew = testKnownDataOk && !testIsKnown + } else { + // We don't mark any test as new if the feature is disabled + testIsNew = false + } + + // Instrument the test function instrumentedFunc := func(t *testing.T) { + // Set this func as a helper func of t + t.Helper() + // Get the metadata regarding the execution (in case is already created from the additional features) execMeta := getTestMetadata(t) if execMeta == nil { // in case there's no additional features then we create the metadata for this execution and defer the disposal - execMeta = createTestMetadata(t) + execMeta = createTestMetadata(t, nil) defer deleteTestMetadata(t) } + execMeta.identity = testInfo.identity // Create or retrieve the module, suite, and test for CI visibility. - module := session.GetOrCreateModuleWithFramework(testInfo.moduleName, testFramework, runtime.Version()) + module := session.GetOrCreateModule(testInfo.moduleName) suite := module.GetOrCreateSuite(testInfo.suiteName) test := suite.CreateTest(testInfo.testName) test.SetTestFunc(originalFunc) - // Set the CI Visibility test to the execution metadata - execMeta.test = test + // If the execution is for a new test we tag the test event as new + execMeta.isANewTest = execMeta.isANewTest || testIsNew - // If the execution is for a new test we tag the test event from early flake detection - if execMeta.isANewTest { - // Set the is new test tag - test.SetTag(constants.TestIsNew, "true") + // Set some required tags from the execution metadata + cancelExecution := setTestTagsFromExecutionMetadata(test, execMeta) + if cancelExecution { + return + } + + // Check if the test needs to be skipped by ITR (attempt to fix is excluded) + if testSkippedByITR && !execMeta.isAttemptToFix && !execMeta.isAModifiedTest { + // check if the test was marked as unskippable + if test.Context().Value(constants.TestUnskippable) != true { + test.SetTag(constants.TestSkippedByITR, "true") + test.Close(integrations.ResultStatusSkip, integrations.WithTestSkipReason(constants.SkippedByITRReason)) + telemetry.ITRSkipped(telemetry.TestEventType) + session.SetTag(constants.ITRTestsSkipped, "true") + session.SetTag(constants.ITRTestsSkippingCount, numOfTestsSkipped.Add(1)) + checkModuleAndSuite(module, suite) + t.Skip(constants.SkippedByITRReason) + return + } + test.SetTag(constants.TestForcedToRun, "true") + telemetry.ITRForcedRun(telemetry.TestEventType) } - // If the execution is a retry we tag the test event - if execMeta.isARetry { - // Set the retry tag - test.SetTag(constants.TestIsRetry, "true") + // Check if the coverage is enabled + var tCoverage coverage.TestCoverage + var tParentOldBarrier chan bool + if coverageEnabled && coverage.CanCollect() { + // set the test coverage collector + testFile, _ := originalFunc.FileLine(originalFunc.Entry()) + tCoverage = coverage.NewTestCoverage( + session.SessionID(), + module.ModuleID(), + suite.SuiteID(), + test.TestID(), + testFile) + + // now we need to disable parallelism for the test in order to collect the test coverage + tParent := getTestParentPrivateFields(t) + if tParent != nil && tParent.barrier != nil { + tParentOldBarrier = *tParent.barrier + *tParent.barrier = nil + } } + // Initialize the chatty printer if not already done. + instrumentChattyPrinter(t) + startTime := time.Now() defer func() { duration := time.Since(startTime) + + if tCoverage != nil { + // Collect coverage after test execution so we can calculate the diff comparing to the baseline. + tCoverage.CollectCoverageAfterTestExecution() + + // now we restore the original parent barrier + tParent := getTestParentPrivateFields(t) + if tParent != nil && tParent.barrier != nil { + *tParent.barrier = tParentOldBarrier + } + } + // check if is a new EFD test and the duration >= 5 min if execMeta.isANewTest && duration.Minutes() >= 5 { // Set the EFD retry abort reason test.SetTag(constants.TestEarlyFlakeDetectionRetryAborted, "slow") } + // Collect and write logs + collectAndWriteLogs(t, test) + if r := recover(); r != nil { // Handle panic and set error information. execMeta.panicData = r execMeta.panicStacktrace = utils.GetStacktrace(1) - test.SetErrorInfo("panic", fmt.Sprint(r), execMeta.panicStacktrace) + if execMeta.isARetry && execMeta.isLastRetry { + if execMeta.allRetriesFailed { + test.SetTag(constants.TestHasFailedAllRetries, "true") + } + if execMeta.isAttemptToFix { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } + } + test.SetError(integrations.WithErrorInfo("panic", fmt.Sprint(r), execMeta.panicStacktrace)) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) test.Close(integrations.ResultStatusFail) @@ -186,13 +365,31 @@ func (ddm *M) executeInternalTest(testInfo *testingTInfo) func(*testing.T) { } else { // Normal finalization: determine the test result based on its state. if t.Failed() { + if execMeta.isARetry && execMeta.isLastRetry { + if execMeta.allRetriesFailed { + test.SetTag(constants.TestHasFailedAllRetries, "true") + } + if execMeta.isAttemptToFix { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } + } test.SetTag(ext.Error, true) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) test.Close(integrations.ResultStatusFail) } else if t.Skipped() { + if execMeta.isAttemptToFix && execMeta.isARetry && execMeta.isLastRetry { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } test.Close(integrations.ResultStatusSkip) } else { + if execMeta.isAttemptToFix && execMeta.isARetry && execMeta.isLastRetry { + if execMeta.allAttemptsPassed { + test.SetTag(constants.TestAttemptToFixPassed, "true") + } else { + test.SetTag(constants.TestAttemptToFixPassed, "false") + } + } test.Close(integrations.ResultStatusPass) } @@ -204,6 +401,11 @@ func (ddm *M) executeInternalTest(testInfo *testingTInfo) func(*testing.T) { } }() + if tCoverage != nil { + // Collect coverage before test execution so we can register a baseline. + tCoverage.CollectCoverageBeforeTestExecution() + } + // Execute the original test function. testInfo.originalFunc(t) } @@ -211,71 +413,93 @@ func (ddm *M) executeInternalTest(testInfo *testingTInfo) func(*testing.T) { // Register the instrumented func as an internal instrumented func (to avoid double instrumentation) setInstrumentationMetadata(runtime.FuncForPC(reflect.Indirect(reflect.ValueOf(instrumentedFunc)).Pointer()), &instrumentationMetadata{IsInternal: true}) + // If the test is going to be skipped by ITR then we don't apply the additional features + if testSkippedByITR { + return instrumentedFunc + } + // Get the additional feature wrapper - return applyAdditionalFeaturesToTestFunc(instrumentedFunc, &testInfo.commonInfo) + return applyAdditionalFeaturesToTestFunc(instrumentedFunc, &testInfo.commonInfo, nil) } // instrumentInternalBenchmarks instruments the internal benchmarks for CI visibility. func (ddm *M) instrumentInternalBenchmarks(internalBenchmarks *[]testing.InternalBenchmark) { - if internalBenchmarks != nil { - // Extract info from internal benchmarks - benchmarkInfos = make([]*testingBInfo, len(*internalBenchmarks)) - for idx, benchmark := range *internalBenchmarks { - moduleName, suiteName := utils.GetModuleAndSuiteName(reflect.Indirect(reflect.ValueOf(benchmark.F)).Pointer()) - benchmarkInfo := &testingBInfo{ - originalFunc: benchmark.F, - commonInfo: commonInfo{ - moduleName: moduleName, - suiteName: suiteName, - testName: benchmark.Name, - }, - } + if internalBenchmarks == nil { + return + } - // Initialize module and suite counters if not already present. - if _, ok := modulesCounters[moduleName]; !ok { - var v int32 - modulesCounters[moduleName] = &v - } - // Increment the test count in the module. - atomic.AddInt32(modulesCounters[moduleName], 1) + // Extract info from internal benchmarks + benchmarkInfos = make([]*testingBInfo, len(*internalBenchmarks)) + for idx, benchmark := range *internalBenchmarks { + moduleName, suiteName := utils.GetModuleAndSuiteName(reflect.Indirect(reflect.ValueOf(benchmark.F)).Pointer()) + identity := newTestIdentity(moduleName, suiteName, benchmark.Name) + benchmarkInfo := &testingBInfo{ + originalFunc: benchmark.F, + commonInfo: commonInfo{ + moduleName: moduleName, + suiteName: suiteName, + testName: benchmark.Name, + identity: identity, + }, + } - if _, ok := suitesCounters[suiteName]; !ok { - var v int32 - suitesCounters[suiteName] = &v - } - // Increment the test count in the suite. - atomic.AddInt32(suitesCounters[suiteName], 1) + // Increment the test count in the module. + addModulesCounters(moduleName, 1) - benchmarkInfos[idx] = benchmarkInfo - } + // Increment the test count in the suite. + addSuitesCounters(suiteName, 1) - // Create a new instrumented internal benchmarks - newBenchmarkArray := make([]testing.InternalBenchmark, len(*internalBenchmarks)) - for idx, benchmarkInfo := range benchmarkInfos { - newBenchmarkArray[idx] = testing.InternalBenchmark{ - Name: benchmarkInfo.testName, - F: ddm.executeInternalBenchmark(benchmarkInfo), - } - } + benchmarkInfos[idx] = benchmarkInfo + } - *internalBenchmarks = newBenchmarkArray + // Create a new instrumented internal benchmarks + newBenchmarkArray := make([]testing.InternalBenchmark, len(*internalBenchmarks)) + for idx, benchmarkInfo := range benchmarkInfos { + newBenchmarkArray[idx] = testing.InternalBenchmark{ + Name: benchmarkInfo.testName, + F: ddm.executeInternalBenchmark(benchmarkInfo), + } } + + *internalBenchmarks = newBenchmarkArray } // executeInternalBenchmark wraps the original benchmark function to include CI visibility instrumentation. func (ddm *M) executeInternalBenchmark(benchmarkInfo *testingBInfo) func(*testing.B) { originalFunc := runtime.FuncForPC(reflect.Indirect(reflect.ValueOf(benchmarkInfo.originalFunc)).Pointer()) + + settings := integrations.GetSettings() + testIsNew := true + + // Check if the test is known + if settings.KnownTestsEnabled { + testIsKnown, testKnownDataOk := isKnownTest(&benchmarkInfo.commonInfo) + testIsNew = testKnownDataOk && !testIsKnown + } else { + // We don't mark any test as new if the feature is disabled + testIsNew = false + } + instrumentedInternalFunc := func(b *testing.B) { // decrement level - getBenchmarkPrivateFields(b).AddLevel(-1) + pBench := getBenchmarkPrivateFields(b) + if pBench != nil { + pBench.AddLevel(-1) + } startTime := time.Now() - module := session.GetOrCreateModuleWithFrameworkAndStartTime(benchmarkInfo.moduleName, testFramework, runtime.Version(), startTime) - suite := module.GetOrCreateSuiteWithStartTime(benchmarkInfo.suiteName, startTime) - test := suite.CreateTestWithStartTime(benchmarkInfo.testName, startTime) + module := session.GetOrCreateModule(benchmarkInfo.moduleName, integrations.WithTestModuleStartTime(startTime)) + suite := module.GetOrCreateSuite(benchmarkInfo.suiteName, integrations.WithTestSuiteStartTime(startTime)) + test := suite.CreateTest(benchmarkInfo.testName, integrations.WithTestStartTime(startTime)) test.SetTestFunc(originalFunc) + // If the execution is for a new test we tag the test event as new + if testIsNew { + // Set the is new test tag + test.SetTag(constants.TestIsNew, "true") + } + // Run the original benchmark function. var iPfOfB *benchmarkPrivateFields var recoverFunc *func(r any) @@ -296,16 +520,24 @@ func (ddm *M) executeInternalBenchmark(benchmarkInfo *testingBInfo) func(*testin // Enable allocation reporting. b.ReportAllocs() + // Retrieve the private fields of the inner testing.B. iPfOfB = getBenchmarkPrivateFields(b) + if iPfOfB == nil { + panic("failed to get private fields of the inner testing.B") + } + // Replace the benchmark function with the original one (this must be executed only once - the first iteration[b.run1]). + if iPfOfB.benchFunc == nil { + panic("failed to get the original benchmark function") + } *iPfOfB.benchFunc = benchmarkInfo.originalFunc // Get the metadata regarding the execution (in case is already created from the additional features) execMeta := getTestMetadata(b) if execMeta == nil { // in case there's no additional features then we create the metadata for this execution and defer the disposal - execMeta = createTestMetadata(b) + execMeta = createTestMetadata(b, nil) defer deleteTestMetadata(b) } @@ -352,7 +584,7 @@ func (ddm *M) executeInternalBenchmark(benchmarkInfo *testingBInfo) func(*testin // Define a function to handle panic during benchmark finalization. panicFunc := func(r any) { - test.SetErrorInfo("panic", fmt.Sprint(r), utils.GetStacktrace(1)) + test.SetError(integrations.WithErrorInfo("panic", fmt.Sprint(r), utils.GetStacktrace(1))) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) test.Close(integrations.ResultStatusFail) @@ -366,11 +598,11 @@ func (ddm *M) executeInternalBenchmark(benchmarkInfo *testingBInfo) func(*testin test.SetTag(ext.Error, true) suite.SetTag(ext.Error, true) module.SetTag(ext.Error, true) - test.CloseWithFinishTime(integrations.ResultStatusFail, endTime) + test.Close(integrations.ResultStatusFail, integrations.WithTestFinishTime(endTime)) } else if iPfOfB.B.Skipped() { - test.CloseWithFinishTime(integrations.ResultStatusSkip, endTime) + test.Close(integrations.ResultStatusSkip, integrations.WithTestFinishTime(endTime)) } else { - test.CloseWithFinishTime(integrations.ResultStatusPass, endTime) + test.Close(integrations.ResultStatusPass, integrations.WithTestFinishTime(endTime)) } checkModuleAndSuite(module, suite) @@ -386,14 +618,203 @@ func RunM(m *testing.M) int { } // checkModuleAndSuite checks and closes the modules and suites if all tests are executed. -func checkModuleAndSuite(module integrations.DdTestModule, suite integrations.DdTestSuite) { +func checkModuleAndSuite(module integrations.TestModule, suite integrations.TestSuite) { // If all tests in a suite has been executed we can close the suite - if atomic.AddInt32(suitesCounters[suite.Name()], -1) <= 0 { + if addSuitesCounters(suite.Name(), -1) <= 0 { suite.Close() } // If all tests in a module has been executed we can close the module - if atomic.AddInt32(modulesCounters[module.Name()], -1) <= 0 { + if addModulesCounters(module.Name(), -1) <= 0 { module.Close() } } + +// addSuitesCounters increments the suite counters for a given suite name. +func addSuitesCounters(suiteName string, delta int) int { + suitesCountersMutex.Lock() + defer suitesCountersMutex.Unlock() + nValue := suitesCounters[suiteName] + delta + suitesCounters[suiteName] = nValue + return nValue +} + +// addModulesCounters increments the module counters for a given module name. +func addModulesCounters(moduleName string, delta int) int { + modulesCountersMutex.Lock() + defer modulesCountersMutex.Unlock() + nValue := modulesCounters[moduleName] + delta + modulesCounters[moduleName] = nValue + return nValue +} + +// isKnownTest checks if a test is a known test or a new one +func isKnownTest(testInfo *commonInfo) (isKnown bool, hasKnownData bool) { + knownTestsData := integrations.GetKnownTests() + if knownTestsData != nil && len(knownTestsData.Tests) > 0 { + // Check if the test is a known test or a new one + if knownSuites, ok := knownTestsData.Tests[testInfo.moduleName]; ok { + if knownTests, ok := knownSuites[testInfo.suiteName]; ok { + return slices.Contains(knownTests, testInfo.testName), true + } + } + + return false, true + } + + return false, false +} + +// getTestManagementData retrieves the test management data for a test identity. +// It returns the matched properties, the type of match, and a flag indicating whether +// test-management data exists for the containing module/suite. +func getTestManagementData(identity *testIdentity) (data *net.TestManagementTestsResponseDataTestPropertiesAttributes, matchKind testManagementMatchKind, hasTestManagementData bool) { + testManagementData := integrations.GetTestManagementTestsData() + return matchTestManagementData(identity, testManagementData) +} + +// matchTestManagementData finds the best-matching test-management directive for a given identity within the provided dataset. +func matchTestManagementData(identity *testIdentity, modules *net.TestManagementTestsResponseDataModules) (data *net.TestManagementTestsResponseDataTestPropertiesAttributes, matchKind testManagementMatchKind, hasTestManagementData bool) { + if identity == nil || modules == nil || len(modules.Modules) == 0 { + return nil, testManagementMatchNone, false + } + + module, ok := modules.Modules[identity.ModuleName] + if !ok { + return nil, testManagementMatchNone, true + } + + suite, ok := module.Suites[identity.SuiteName] + if !ok { + return nil, testManagementMatchNone, true + } + + if len(suite.Tests) == 0 { + return nil, testManagementMatchNone, true + } + + for i := len(identity.Segments); i > 0; i-- { + candidate := strings.Join(identity.Segments[:i], "/") + if test, ok := suite.Tests[candidate]; ok { + kind := testManagementMatchExact + if candidate != identity.FullName { + kind = testManagementMatchAncestor + } + return &test.Properties, kind, true + } + } + + return nil, testManagementMatchNone, true +} + +// setTestTagsFromExecutionMetadata sets the test tags from the execution metadata. +func setTestTagsFromExecutionMetadata(test integrations.Test, execMeta *testExecutionMetadata) (cancelExecution bool) { + settings := integrations.GetSettings() + + // Set the Test Optimization test to the execution metadata + execMeta.test = test + if execMeta.identity != nil && len(execMeta.identity.Segments) > 1 { + log.Debug("setTestTagsFromExecutionMetadata assigned test for %s", execMeta.identity.FullName) + } + + // If the execution is for a new test we tag the test event as new + if execMeta.isANewTest { + // Set the is new test tag + test.SetTag(constants.TestIsNew, "true") + } + + // If the execution is for a modified test + execMeta.isAModifiedTest = execMeta.isAModifiedTest || (settings.ImpactedTestsEnabled && test.Context().Value(constants.TestIsModified) == true) + + // If the execution is a retry we tag the test event + if execMeta.isARetry { + // Set the retry tag + test.SetTag(constants.TestIsRetry, "true") + + // let's set the retry reason + if execMeta.isAttemptToFix { + // Set attempt_to_fix as the retry reason + test.SetTag(constants.TestRetryReason, constants.AttemptToFixRetryReason) + } else if execMeta.isEarlyFlakeDetectionEnabled && (execMeta.isANewTest || execMeta.isAModifiedTest) { + // Set early_flake_detection as the retry reason + test.SetTag(constants.TestRetryReason, constants.EarlyFlakeDetectionRetryReason) + } else if execMeta.isFlakyTestRetriesEnabled { + // Set auto_test_retry as the retry reason + test.SetTag(constants.TestRetryReason, constants.AutoTestRetriesRetryReason) + } else { + // Set the unknown reason + test.SetTag(constants.TestRetryReason, constants.ExternalRetryReason) + } + } + + // If the test is an attempt to fix we tag the test event + if execMeta.isAttemptToFix { + test.SetTag(constants.TestIsAttempToFix, "true") + } + + // If the test is quarantined we tag the test event + if execMeta.isQuarantined { + test.SetTag(constants.TestIsQuarantined, "true") + } + + // If the test is disabled we tag the test event + if execMeta.isDisabled { + test.SetTag(constants.TestIsDisabled, "true") + if !execMeta.isAttemptToFix { + test.Close(integrations.ResultStatusSkip, integrations.WithTestSkipReason(constants.TestDisabledSkipReason)) + return true + } + } + + return false +} + +// instrumentChattyPrinter initializes the chatty printer for verbose output if logging is enabled. +func instrumentChattyPrinter(t *testing.T) { + if !logs.IsEnabled() { + // If the logs integration is not enabled, we don't need to instrument the chatty printer. + return + } + + // Initialize the chatty printer if not already done. + chattyPrinterOnce.Do(func() { + chatty = getTestChattyPrinter(t) + // If the chatty printer is enabled, we wrap the writer to capture output. + if chatty != nil && chatty.w != nil && *chatty.w != nil { + *chatty.w = &customWriter{chatty: chatty, writer: *chatty.w} + } + }) +} + +// collectAndWriteLogs collects logs from the chatty printer and the test output, and writes them to the test. +func collectAndWriteLogs(t *testing.T, test integrations.Test) { + if !logs.IsEnabled() { + // If the logs integration is not enabled, we don't need to collect or write logs. + return + } + + if chatty != nil && chatty.w != nil && *chatty.w != nil { + if writer, ok := (*chatty.w).(*customWriter); ok { + strOutput := writer.GetOutput(test.Name()) + if len(strOutput) > 0 { + sc := bufio.NewScanner(strings.NewReader(strOutput)) + for sc.Scan() { + test.Log(sc.Text(), "") + } + + // if the chatty printer has output, we skip the test output extraction + return + } + } + } + + if tCommon := getTestPrivateFields(t); tCommon != nil && tCommon.output != nil { + strOutput := string(tCommon.GetOutput()) + if len(strOutput) > 0 { + sc := bufio.NewScanner(strings.NewReader(strOutput)) + for sc.Scan() { + test.Log(sc.Text(), "") + } + } + } +} diff --git a/internal/civisibility/integrations/gotesting/testingB.go b/internal/civisibility/integrations/gotesting/testingB.go index 5678daf6f6..22c2044ec1 100644 --- a/internal/civisibility/integrations/gotesting/testingB.go +++ b/internal/civisibility/integrations/gotesting/testingB.go @@ -14,7 +14,7 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" ) var ( diff --git a/internal/civisibility/integrations/gotesting/testingT.go b/internal/civisibility/integrations/gotesting/testingT.go index 74c2d5cee0..af6c6ebdf2 100644 --- a/internal/civisibility/integrations/gotesting/testingT.go +++ b/internal/civisibility/integrations/gotesting/testingT.go @@ -11,7 +11,7 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations" ) // T is a type alias for testing.T to provide additional methods for CI visibility. @@ -40,12 +40,7 @@ func (ddt *T) Run(name string, f func(*testing.T)) bool { // integration tests. func (ddt *T) Context() context.Context { t := (*testing.T)(ddt) - ciTestItem := getTestMetadata(t) - if ciTestItem != nil && ciTestItem.test != nil { - return ciTestItem.test.Context() - } - - return context.Background() + return getTestOptimizationContext(t) } // Fail marks the function as having failed but continues execution. @@ -102,7 +97,12 @@ func (ddt *T) SkipNow() { // other parallel tests. When a test is run multiple times due to use of // -test.count or -test.cpu, multiple instances of a single test never run in // parallel with each other. -func (ddt *T) Parallel() { (*testing.T)(ddt).Parallel() } +func (ddt *T) Parallel() { + t := (*testing.T)(ddt) + if !instrumentTestingParallel(t) { + t.Parallel() + } +} // Deadline reports the time at which the test binary will have // exceeded the timeout specified by the -timeout flag. diff --git a/internal/civisibility/integrations/gotesting/testing_test.go b/internal/civisibility/integrations/gotesting/testing_test.go index aff2263ed8..30f3a997b1 100644 --- a/internal/civisibility/integrations/gotesting/testing_test.go +++ b/internal/civisibility/integrations/gotesting/testing_test.go @@ -7,17 +7,16 @@ package gotesting import ( "fmt" - "net/http" - "net/http/httptest" + "os" "runtime" "slices" + "sync" + "sync/atomic" "testing" + "time" - ddhttp "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" - ddtracer "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" "github.com/stretchr/testify/assert" ) @@ -51,6 +50,7 @@ func TestMyTest02(gt *testing.T) { func Test_Foo(gt *testing.T) { assertTest(gt) t := (*T)(gt) + var tests = []struct { index byte name string @@ -63,10 +63,11 @@ func Test_Foo(gt *testing.T) { } buf := []byte{} for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - t.Log(test.name) - buf = append(buf, test.index) + mT := test + t.Run(mT.name, func(t *testing.T) { + // let's run the subtest in parallel + t.Log(mT.name) + buf = append(buf, mT.index) }) } @@ -76,140 +77,90 @@ func Test_Foo(gt *testing.T) { } } -// TestWithExternalCalls demonstrates testing with external HTTP calls. -func TestWithExternalCalls(gt *testing.T) { +// TestSkip demonstrates skipping a test with a message. +func TestSkip(gt *testing.T) { assertTest(gt) - t := (*T)(gt) - // Create a new HTTP test server - s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - _, _ = w.Write([]byte("Hello World")) - })) - defer s.Close() - - t.Run("default", func(t *testing.T) { - - // if we want to use the test span as a parent of a child span - // we can extract the SpanContext and use it in other integrations - ctx := (*T)(t).Context() + // To instrument skip tests we just need to cast + t := (*T)(gt) - // Wrap the default HTTP transport for tracing - rt := ddhttp.WrapRoundTripper(http.DefaultTransport) - client := &http.Client{ - Transport: rt, - } + // because we use the instrumented Skip + // the message will be reported as the skip reason. + t.Skip("Nothing to do here, skipping!") +} - // Create a new HTTP request - req, err := http.NewRequest("GET", s.URL+"/hello/world", nil) - if err != nil { - t.FailNow() - } +func TestParallelSubTests(gt *testing.T) { + assertTest(gt) - // Use the span context here so the http span will appear as a child of the test - req = req.WithContext(ctx) + // To instrument parallel sub-tests we just need to cast + t := (*T)(gt) - res, err := client.Do(req) - if err != nil { - t.FailNow() - } - _ = res.Body.Close() + t.Run("parallel_subtest_1", func(t *testing.T) { + t.Parallel() + <-time.After(300 * time.Millisecond) // Simulate some work + fmt.Println("Running parallel subtest 1") }) - t.Run("custom-name", func(t *testing.T) { - - // we can also add custom tags to the test span by retrieving the - // context and call the `ddtracer.SpanFromContext` api - ctx := (*T)(t).Context() - span, _ := ddtracer.SpanFromContext(ctx) - - // Custom namer function for the HTTP request - customNamer := func(req *http.Request) string { - value := fmt.Sprintf("%s %s", req.Method, req.URL.Path) - - // Then we can set custom tags to that test span - span.SetTag("customNamer.Value", value) - return value - } - - rt := ddhttp.WrapRoundTripper(http.DefaultTransport, ddhttp.RTWithResourceNamer(customNamer)) - client := &http.Client{ - Transport: rt, - } - - req, err := http.NewRequest("GET", s.URL+"/hello/world", nil) - if err != nil { - t.FailNow() - } - - // Use the span context here so the http span will appear as a child of the test - req = req.WithContext(ctx) - - res, err := client.Do(req) - if err != nil { - t.FailNow() - } - _ = res.Body.Close() + t.Run("parallel_subtest_2", func(t *testing.T) { + t.Parallel() + <-time.After(200 * time.Millisecond) // Simulate some work + fmt.Println("Running parallel subtest 2") }) -} - -// TestSkip demonstrates skipping a test with a message. -func TestSkip(gt *testing.T) { - assertTest(gt) - - t := (*T)(gt) - // because we use the instrumented Skip - // the message will be reported as the skip reason. - t.Skip("Nothing to do here, skipping!") + t.Run("parallel_subtest_3", func(t *testing.T) { + t.Parallel() + <-time.After(100 * time.Millisecond) // Simulate some work + fmt.Println("Running parallel subtest 3") + }) } // Tests for test retries feature -var testRetryWithPanicRunNumber = 0 +var testRetryWithPanicRunNumber atomic.Int32 func TestRetryWithPanic(t *testing.T) { t.Cleanup(func() { - if testRetryWithPanicRunNumber == 1 { + if testRetryWithPanicRunNumber.Load() == 1 { fmt.Println("CleanUp from the initial execution") } else { fmt.Println("CleanUp from the retry") } }) - testRetryWithPanicRunNumber++ - if testRetryWithPanicRunNumber < 4 { + + if testRetryWithPanicRunNumber.Add(1) < 4 { panic("Test Panic") } } -var testRetryWithFailRunNumber = 0 +var testRetryWithFailRunNumber atomic.Int32 func TestRetryWithFail(t *testing.T) { t.Cleanup(func() { - if testRetryWithFailRunNumber == 1 { + if testRetryWithFailRunNumber.Load() == 1 { fmt.Println("CleanUp from the initial execution") } else { fmt.Println("CleanUp from the retry") } }) - testRetryWithFailRunNumber++ - if testRetryWithFailRunNumber < 4 { + + if testRetryWithFailRunNumber.Add(1) < 4 { t.Fatal("Failed due the wrong execution number") } } -func TestRetryAlwaysFail(t *testing.T) { - t.Parallel() - t.Fatal("Always fail to test the auto retries feature") -} - -func TestNormalPassingAfterRetryAlwaysFail(t *testing.T) {} +//dd:test.unskippable +func TestNormalPassingAfterRetryAlwaysFail(_ *testing.T) {} -var run int +var run atomic.Int32 +//dd:test.unskippable func TestEarlyFlakeDetection(t *testing.T) { - run++ - fmt.Printf(" Run: %d", run) - if run%2 == 0 { + runValue := run.Add(1) + if os.Getenv(constants.CIVisibilityInternalParallelEarlyFlakeDetectionEnabled) == "true" { + <-time.After(4 * time.Second) + } + fmt.Printf(" Run: %d", runValue) + if runValue%2 == 0 { fmt.Println(" Failed") t.FailNow() } @@ -246,40 +197,81 @@ func BenchmarkFirst(gb *testing.B) { _ = gb.Elapsed() } +var assertMutex sync.Mutex + func assertTest(t *testing.T) { + // we don't assert on parallel efd tests + if parallelEfd { + return + } + assertMutex.Lock() + defer assertMutex.Unlock() assert := assert.New(t) spans := mTracer.OpenSpans() hasSession := false hasModule := false hasSuite := false hasTest := false + + assertCommon := func(spanTags map[string]interface{}) { + assert.Subset(spanTags, map[string]interface{}{ + constants.Origin: constants.CIAppTestOrigin, + constants.TestType: constants.TestTypeTest, + constants.LogicalCPUCores: float64(runtime.NumCPU()), + }) + + assert.Contains(spanTags, ext.ResourceName) + assert.Contains(spanTags, constants.TestCommand) + assert.Contains(spanTags, constants.TestCommandWorkingDirectory) + assert.Contains(spanTags, constants.OSPlatform) + assert.Contains(spanTags, constants.OSArchitecture) + assert.Contains(spanTags, constants.OSVersion) + assert.Contains(spanTags, constants.RuntimeVersion) + assert.Contains(spanTags, constants.RuntimeName) + assert.Contains(spanTags, constants.GitRepositoryURL) + assert.Contains(spanTags, constants.GitCommitSHA) + // GitHub CI does not provide commit details + if spanTags[constants.CIProviderName] != "github" { + assert.Contains(spanTags, constants.GitCommitMessage) + assert.Contains(spanTags, constants.GitCommitAuthorEmail) + assert.Contains(spanTags, constants.GitCommitAuthorDate) + assert.Contains(spanTags, constants.GitCommitCommitterEmail) + assert.Contains(spanTags, constants.GitCommitCommitterDate) + assert.Contains(spanTags, constants.GitCommitCommitterName) + } + assert.Contains(spanTags, constants.CIWorkspacePath) + } + for _, span := range spans { spanTags := span.Tags() // Assert Session - if span.Tag(ext.SpanType) == constants.SpanTypeTestSession { + if spanTags[ext.SpanType] == constants.SpanTypeTestSession { + assert.Subset(spanTags, map[string]interface{}{ + constants.TestFramework: "golang.org/pkg/testing", + }) assert.Contains(spanTags, constants.TestSessionIDTag) - assertCommon(assert, span) + assertCommon(spanTags) hasSession = true } // Assert Module - if span.Tag(ext.SpanType) == constants.SpanTypeTestModule { + if spanTags[ext.SpanType] == constants.SpanTypeTestModule { assert.Subset(spanTags, map[string]interface{}{ - constants.TestModule: "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting", + constants.TestModule: "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", constants.TestFramework: "golang.org/pkg/testing", }) assert.Contains(spanTags, constants.TestSessionIDTag) assert.Contains(spanTags, constants.TestModuleIDTag) assert.Contains(spanTags, constants.TestFrameworkVersion) - assertCommon(assert, span) + assertCommon(spanTags) hasModule = true } // Assert Suite - if span.Tag(ext.SpanType) == constants.SpanTypeTestSuite { + if spanTags[ext.SpanType] == constants.SpanTypeTestSuite { assert.Subset(spanTags, map[string]interface{}{ - constants.TestModule: "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting", + constants.TestModule: "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", constants.TestFramework: "golang.org/pkg/testing", }) assert.Contains(spanTags, constants.TestSessionIDTag) @@ -287,14 +279,14 @@ func assertTest(t *testing.T) { assert.Contains(spanTags, constants.TestSuiteIDTag) assert.Contains(spanTags, constants.TestFrameworkVersion) assert.Contains(spanTags, constants.TestSuite) - assertCommon(assert, span) + assertCommon(spanTags) hasSuite = true } // Assert Test - if span.Tag(ext.SpanType) == constants.SpanTypeTest { + if spanTags[ext.SpanType] == constants.SpanTypeTest { assert.Subset(spanTags, map[string]interface{}{ - constants.TestModule: "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/integrations/gotesting", + constants.TestModule: "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting", constants.TestFramework: "golang.org/pkg/testing", constants.TestSuite: "testing_test.go", constants.TestName: t.Name(), @@ -307,7 +299,7 @@ func assertTest(t *testing.T) { assert.Contains(spanTags, constants.TestCodeOwners) assert.Contains(spanTags, constants.TestSourceFile) assert.Contains(spanTags, constants.TestSourceStartLine) - assertCommon(assert, span) + assertCommon(spanTags) hasTest = true } } @@ -317,34 +309,3 @@ func assertTest(t *testing.T) { assert.True(hasSuite) assert.True(hasTest) } - -func assertCommon(assert *assert.Assertions, span mocktracer.Span) { - spanTags := span.Tags() - - assert.Subset(spanTags, map[string]interface{}{ - constants.Origin: constants.CIAppTestOrigin, - constants.TestType: constants.TestTypeTest, - constants.LogicalCPUCores: float64(runtime.NumCPU()), - }) - - assert.Contains(spanTags, ext.ResourceName) - assert.Contains(spanTags, constants.TestCommand) - assert.Contains(spanTags, constants.TestCommandWorkingDirectory) - assert.Contains(spanTags, constants.OSPlatform) - assert.Contains(spanTags, constants.OSArchitecture) - assert.Contains(spanTags, constants.OSVersion) - assert.Contains(spanTags, constants.RuntimeVersion) - assert.Contains(spanTags, constants.RuntimeName) - assert.Contains(spanTags, constants.GitRepositoryURL) - assert.Contains(spanTags, constants.GitCommitSHA) - // GitHub CI does not provide commit details - if spanTags[constants.CIProviderName] != "github" { - assert.Contains(spanTags, constants.GitCommitMessage) - assert.Contains(spanTags, constants.GitCommitAuthorEmail) - assert.Contains(spanTags, constants.GitCommitAuthorDate) - assert.Contains(spanTags, constants.GitCommitCommitterEmail) - assert.Contains(spanTags, constants.GitCommitCommitterDate) - assert.Contains(spanTags, constants.GitCommitCommitterName) - } - assert.Contains(spanTags, constants.CIWorkspacePath) -} diff --git a/internal/civisibility/integrations/logs/logs.go b/internal/civisibility/integrations/logs/logs.go new file mode 100644 index 0000000000..4748d7b559 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs.go @@ -0,0 +1,84 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package logs + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "os" + "strconv" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/hostname" +) + +var ( + // logsWriterInstance is the singleton instance of logsWriter. + logsWriterInstance *logsWriter + + // servName is the name of the service for which logs are being written. + servName string + + // host is the hostname of the machine where the logs are being written. + host string + + // enabled indicates whether the logs writer is enabled. + enabled *bool +) + +func IsEnabled() bool { + if enabled == nil { + v, _, _ := stableconfig.Bool("DD_CIVISIBILITY_LOGS_ENABLED", false) + enabled = &v + } + + return *enabled +} + +// Initialize initializes the logs writer for CI visibility. +func Initialize(serviceName string) { + if !IsEnabled() || logsWriterInstance != nil { + return + } + + servName = serviceName + host = hostname.Get() + if host == "" { + host, _ = os.Hostname() + } + logsWriterInstance = newLogsWriter() +} + +// Stop stops the logs writer and cleans up resources. +func Stop() { + if !IsEnabled() || logsWriterInstance == nil { + return + } + + logsWriterInstance.stop() + logsWriterInstance = nil +} + +// WriteLog writes a log entry with the given message and tags. +func WriteLog(testID uint64, moduleName string, suiteName string, testName string, message string, tags string) { + if !IsEnabled() || logsWriterInstance == nil { + return + } + + testIDStr := strconv.FormatUint(testID, 10) + logsWriterInstance.add(&logEntry{ + DdSource: "testoptimization", + Hostname: host, + Timestamp: time.Now().UnixMilli(), + Message: message, + DdTraceID: testIDStr, + DdSpanID: testIDStr, + TestModule: moduleName, + TestSuite: suiteName, + TestName: testName, + Service: servName, + DdTags: tags, + }) +} diff --git a/internal/civisibility/integrations/logs/logs_additional_test.go b/internal/civisibility/integrations/logs/logs_additional_test.go new file mode 100644 index 0000000000..bc0ea6a31e --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_additional_test.go @@ -0,0 +1,94 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package logs + +import ( + "encoding/json" + "io" + "os" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" +) + +// TestIsEnabled_CachesValue ensures that once the IsEnabled value is evaluated +// it is cached and further changes to the environment variable do not have any +// effect. +func TestIsEnabled_CachesValue(t *testing.T) { + resetGlobalState() + os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") + + // First call should evaluate the env var (unset => false) + assert.False(t, IsEnabled()) + + // Changing the environment variable afterwards should have no impact + os.Setenv("DD_CIVISIBILITY_LOGS_ENABLED", "true") + t.Cleanup(func() { os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") }) + + assert.False(t, IsEnabled(), "IsEnabled should return the cached value and ignore subsequent env changes") +} + +// TestLogsPayloadPushAfterRead verifies that attempting to push additional +// entries after the payload has been read results in the expected error. +func TestLogsPayloadPushAfterRead(t *testing.T) { + p := newLogsPayload() + assert.NoError(t, p.push(&logEntry{Message: "initial"})) + + // Read the payload to initialize the internal reader + _, err := io.ReadAll(p) + assert.NoError(t, err) + + // Now any further push should fail with io.ErrClosedPipe + err = p.push(&logEntry{Message: "extra"}) + assert.ErrorIs(t, err, io.ErrClosedPipe) +} + +// TestWriteLog_Serialization checks that WriteLog serialises the expected JSON +// structure into the payload buffer. +func TestWriteLog_Serialization(t *testing.T) { + resetGlobalState() + os.Setenv("DD_CIVISIBILITY_LOGS_ENABLED", "true") + t.Cleanup(func() { os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") }) + + Initialize("serialization-service") + assert.NotNil(t, logsWriterInstance) + + testID := uint64(12345) + moduleName := "module" + suiteName := "suite" + testName := "test" + message := "hello world" + tags := "env:test" + + WriteLog(testID, moduleName, suiteName, testName, message, tags) + + // Extract the payload from the writer and decode it. + payloadBytes, err := io.ReadAll(logsWriterInstance.payload) + assert.NoError(t, err) + + var entries logsEntriesPayload + err = json.Unmarshal(payloadBytes, &entries) + assert.NoError(t, err) + assert.Len(t, entries, 1) + + got := entries[0] + expectedID := strconv.FormatUint(testID, 10) + + assert.Equal(t, "testoptimization", got.DdSource) + assert.Equal(t, message, got.Message) + assert.Equal(t, moduleName, got.TestModule) + assert.Equal(t, suiteName, got.TestSuite) + assert.Equal(t, testName, got.TestName) + assert.Equal(t, "serialization-service", got.Service) + assert.Equal(t, expectedID, got.DdTraceID) + assert.Equal(t, expectedID, got.DdSpanID) + assert.Equal(t, tags, got.DdTags) + // Hostname and Timestamp are environment dependent, so we only check they + // are non-empty / non-zero. + assert.NotEmpty(t, got.Hostname) + assert.NotZero(t, got.Timestamp) +} diff --git a/internal/civisibility/integrations/logs/logs_payload.go b/internal/civisibility/integrations/logs/logs_payload.go new file mode 100644 index 0000000000..8ac78b5c61 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_payload.go @@ -0,0 +1,124 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package logs + +import ( + "bytes" + "encoding/json" + "io" + "sync" + "time" +) + +// logsPayload is a slim copy of the logs payload struct. +type logsPayload struct { + // count specifies the number of items in the stream. + count int + + // buf holds the sequence of json-encoded items. + buf *bytes.Buffer + + // reader is used for reading the contents of buf. + reader *bytes.Reader + + // serializationTime time to do serialization + serializationTime time.Duration + + // mu is a mutex to protect concurrent access to the payload. + mu sync.RWMutex +} + +var _ io.Reader = (*logsPayload)(nil) + +// newLogsPayload returns a ready to use logs payload. +func newLogsPayload() *logsPayload { + return &logsPayload{ + buf: bytes.NewBuffer([]byte{byte('[')}), + } +} + +// push pushes a new item into the stream. +func (p *logsPayload) push(logEntryData *logEntry) error { + p.mu.Lock() + defer p.mu.Unlock() + + if p.reader != nil { + // If the reader is already set, we cannot push new items. + return io.ErrClosedPipe + } + + startTime := time.Now() + defer func() { + p.serializationTime += time.Since(startTime) + }() + + var val []byte + var err error + if val, err = json.Marshal(logEntryData); err != nil { + return err + } + + p.count = p.count + 1 // increment the count after acquiring the lock to ensure consistency + if p.count > 1 { + p.buf.WriteByte(',') + } + p.buf.Write(val) + return nil +} + +// itemCount returns the number of items available in the srteam. +func (p *logsPayload) itemCount() int { + p.mu.RLock() + defer p.mu.RUnlock() + return p.count +} + +// size returns the payload size in bytes. After the first read the value becomes +// inaccurate by up to 8 bytes. +func (p *logsPayload) size() int { + p.mu.RLock() + defer p.mu.RUnlock() + if p.reader != nil { + return p.buf.Len() // the reader is already set, so the array is closed + } + return p.buf.Len() + 1 // 1 bytes for the array closing bracket ']' +} + +// reset sets up the payload to be read a second time. It maintains the +// underlying byte contents of the buffer. reset should not be used in order to +// reuse the payload for another set of traces. +func (p *logsPayload) reset() { + p.mu.Lock() + defer p.mu.Unlock() + if p.reader != nil { + p.reader.Seek(0, 0) + } +} + +// clear empties the payload buffers. +func (p *logsPayload) clear() { + p.mu.Lock() + defer p.mu.Unlock() + p.buf = bytes.NewBuffer([]byte{byte('[')}) + p.reader = nil + p.count = 0 +} + +// Close implements io.Closer +func (p *logsPayload) Close() error { + return nil +} + +// Read implements io.Reader. It reads from the msgpack-encoded stream. +func (p *logsPayload) Read(b []byte) (n int, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.reader == nil { + p.buf.WriteByte(']') // close the array + p.reader = bytes.NewReader(p.buf.Bytes()) + } + return p.reader.Read(b) +} diff --git a/internal/civisibility/integrations/logs/logs_payload_format.go b/internal/civisibility/integrations/logs/logs_payload_format.go new file mode 100644 index 0000000000..e9461dd679 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_payload_format.go @@ -0,0 +1,26 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package logs + +type ( + // logsEntriesPayload represents a list of log entries to be sent. + logsEntriesPayload []*logEntry + + // logEntryPayload represents a single log entry with its metadata. + logEntry struct { + DdSource string `json:"ddsource"` + Hostname string `json:"hostname"` + Timestamp int64 `json:"timestamp,omitempty"` + Message string `json:"message"` + DdTraceID string `json:"dd.trace_id"` + DdSpanID string `json:"dd.span_id"` + TestModule string `json:"test.module"` + TestSuite string `json:"test.suite"` + TestName string `json:"test.name"` + Service string `json:"service"` + DdTags string `json:"dd_tags,omitempty"` + } +) diff --git a/internal/civisibility/integrations/logs/logs_payload_test.go b/internal/civisibility/integrations/logs/logs_payload_test.go new file mode 100644 index 0000000000..ef093dcff1 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_payload_test.go @@ -0,0 +1,43 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package logs + +import ( + "encoding/json" + "io" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" +) + +func newLogEntry(i int) *logEntry { + return &logEntry{ + DdSource: "testoptimization", + DdTags: "", + Hostname: "host", + Message: "My Message " + strconv.Itoa(i), + Service: "service", + } +} + +// TestLogsPayloadDecode ensures that whatever we push into the payload can +// be decoded by the codec. +func TestLogsPayloadDecode(t *testing.T) { + for _, n := range []int{10, 1 << 10} { + t.Run(strconv.Itoa(n), func(t *testing.T) { + assert := assert.New(t) + p := newLogsPayload() + for i := 0; i < n; i++ { + p.push(newLogEntry(i%5 + 1)) + } + var got logsEntriesPayload + b, err := io.ReadAll(p) + err = json.Unmarshal(b, &got) + assert.NoError(err) + }) + } +} diff --git a/internal/civisibility/integrations/logs/logs_test.go b/internal/civisibility/integrations/logs/logs_test.go new file mode 100644 index 0000000000..ae65a93172 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_test.go @@ -0,0 +1,108 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package logs + +import ( + "io" + "os" + "strconv" + "testing" + + "github.com/stretchr/testify/assert" +) + +// resetGlobalState is a helper that resets the package level variables that keep +// state between invocations. This is required so that each test can start with +// a clean slate and does not depend on execution order. +func resetGlobalState() { + enabled = nil + logsWriterInstance = nil +} + +func TestIsEnabled_DefaultsToFalse(t *testing.T) { + resetGlobalState() + os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") + + assert.False(t, IsEnabled(), "IsEnabled should be false when the env var is not set") +} + +func TestIsEnabled_EnvVarTrue(t *testing.T) { + resetGlobalState() + os.Setenv("DD_CIVISIBILITY_LOGS_ENABLED", "true") + t.Cleanup(func() { os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") }) + + assert.True(t, IsEnabled(), "IsEnabled should be true when the env var is set to true") +} + +func TestInitializeAndStop(t *testing.T) { + // Make sure feature is enabled + resetGlobalState() + os.Setenv("DD_CIVISIBILITY_LOGS_ENABLED", "true") + t.Cleanup(func() { os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") }) + + Initialize("my-awesome-service") + assert.NotNil(t, logsWriterInstance, "logsWriterInstance should be set after Initialize") + assert.Equal(t, "my-awesome-service", servName) + assert.NotEmpty(t, host, "host should be detected during Initialize") + + Stop() + assert.Nil(t, logsWriterInstance, "logsWriterInstance should be nil after Stop") +} + +func TestWriteLog_WhenDisabled_NoOp(t *testing.T) { + resetGlobalState() + os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") + + // Call WriteLog – it should not panic and should not create a writer. + WriteLog(123, "module", "suite", "test", "msg", "") + assert.Nil(t, logsWriterInstance, "logsWriterInstance should remain nil when WriteLog is called while disabled") +} + +func TestWriteLog_WritesEntry(t *testing.T) { + resetGlobalState() + os.Setenv("DD_CIVISIBILITY_LOGS_ENABLED", "true") + t.Cleanup(func() { os.Unsetenv("DD_CIVISIBILITY_LOGS_ENABLED") }) + + Initialize("writer-test-service") + assert.NotNil(t, logsWriterInstance) + + WriteLog(42, "mod", "suite", "test", "hello", "tag:value") + + // Because WriteLog delegates to logsWriterInstance.add which, in turn, + // stores the entry inside the payload, we can verify that the payload + // now contains exactly one item. + assert.Equal(t, 1, logsWriterInstance.payload.itemCount(), "Exactly one log entry should be stored after WriteLog") +} + +func TestLogsPayloadResetAndRead(t *testing.T) { + p := newLogsPayload() + for i := 0; i < 5; i++ { + p.push(&logEntry{Message: "msg" + strconv.Itoa(i)}) + } + + // Read entire payload once. + first, err := io.ReadAll(p) + assert.NoError(t, err) + assert.NotEmpty(t, first) + + // Reset and read again – bytes should match the first read. + p.reset() + second, err := io.ReadAll(p) + assert.NoError(t, err) + assert.Equal(t, first, second, "Payload contents should be identical after reset") +} + +func TestLogsPayloadClear(t *testing.T) { + p := newLogsPayload() + p.push(&logEntry{Message: "msg"}) + + assert.Greater(t, p.size(), 0, "Size should be > 0 after pushing an entry") + + p.clear() + + assert.Equal(t, 0, p.itemCount()) + assert.LessOrEqual(t, p.size(), 2, "Size should be minimal after clear") +} diff --git a/internal/civisibility/integrations/logs/logs_writer.go b/internal/civisibility/integrations/logs/logs_writer.go new file mode 100644 index 0000000000..2f3eb7b925 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_writer.go @@ -0,0 +1,93 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package logs + +import ( + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// Constants defining the payload size limits for agentless mode. +const ( + // agentlessPayloadMaxLimit is the maximum payload size allowed, indicating the + // maximum size of the package that the intake can receive. + agentlessPayloadMaxLimit = 50 * 1024 * 1024 // 5 MB + + // agentlessPayloadSizeLimit specifies the maximum allowed size of the payload before + // it triggers a flush to the transport. + agentlessPayloadSizeLimit = agentlessPayloadMaxLimit / 2 + + // concurrentConnectionLimit specifies the maximum number of concurrent outgoing + // connections allowed. + concurrentConnectionLimit = 100 +) + +// logsWriter is responsible for writing logs to the agentless endpoint. +type logsWriter struct { + client net.Client // http client + payload *logsPayload // Encodes and buffers events in msgpack format. + climit chan struct{} // Limits the number of concurrent outgoing connections. + wg sync.WaitGroup // Waits for all uploads to finish. +} + +// newLogsWriter creates a new instance of logsWriter. +func newLogsWriter() *logsWriter { + log.Debug("logsWriter: creating logs writer instance") + return &logsWriter{ + client: net.NewClientForLogs(), + payload: newLogsPayload(), + climit: make(chan struct{}, concurrentConnectionLimit), + } +} + +func (w *logsWriter) add(entry *logEntry) { + if err := w.payload.push(entry); err != nil { + log.Error("logsWriter: Error encoding msgpack: %s", err.Error()) + } + if w.payload.size() > agentlessPayloadSizeLimit { + w.flush() + } +} + +func (w *logsWriter) stop() { + log.Debug("logsWriter: stopping writer") + w.flush() + w.wg.Wait() +} + +func (w *logsWriter) flush() { + if w.payload.itemCount() == 0 { + return + } + + w.wg.Add(1) + w.climit <- struct{}{} + oldp := w.payload + w.payload = newLogsPayload() + + go func(p *logsPayload) { + defer func() { + // Once the payload has been used, clear the buffer for garbage + // collection to avoid a memory leak when references to this object + // may still be kept by faulty transport implementations or the + // standard library. See dd-trace-go#976 + p.clear() + + <-w.climit + w.wg.Done() + }() + + size, count := p.size(), p.itemCount() + log.Debug("logsWriter: sending payload: size: %d logs entries: %d\n", size, count) + + err := w.client.SendLogs(p) + if err != nil { + log.Error("logsWriter: failure sending logs data data: %s", err.Error()) + } + }(oldp) +} diff --git a/internal/civisibility/integrations/logs/logs_writer_test.go b/internal/civisibility/integrations/logs/logs_writer_test.go new file mode 100644 index 0000000000..061b060c98 --- /dev/null +++ b/internal/civisibility/integrations/logs/logs_writer_test.go @@ -0,0 +1,118 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package logs + +import ( + "fmt" + "io" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/net" + "github.com/stretchr/testify/assert" +) + +func TestNewLogsWriter(t *testing.T) { + writer := newLogsWriter() + assert.NotNil(t, writer) + assert.NotNil(t, writer.client) + assert.NotNil(t, writer.payload) + assert.NotNil(t, writer.climit) +} + +func TestLogsWriterAdd(t *testing.T) { + writer := newLogsWriter() + entry := &logEntry{} + writer.add(entry) + assert.Equal(t, writer.payload.itemCount(), 1) +} + +func TestLogsWriterStop(t *testing.T) { + writer := newLogsWriter() + entry := &logEntry{} + writer.add(entry) + writer.stop() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +func TestLogsWriterFlush(t *testing.T) { + writer := newLogsWriter() + entry := &logEntry{} + writer.add(entry) + writer.flush() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +func TestLogsWriterConcurrentFlush(t *testing.T) { + writer := newLogsWriter() + entry := &logEntry{} + + for i := 0; i < concurrentConnectionLimit+1; i++ { + writer.add(entry) + } + writer.flush() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +func TestLogsWriterFlushError(t *testing.T) { + writer := newLogsWriter() + writer.client = &MockClient{SendLogsFunc: func(_ io.Reader) error { + return fmt.Errorf("mock error") + }, + } + entry := &logEntry{} + writer.add(entry) + writer.flush() + assert.Equal(t, 0, writer.payload.itemCount()) +} + +// MockClient is a mock implementation of the Client interface for testing purposes. +type MockClient struct { + SendCoveragePayloadFunc func(ciTestCovPayload io.Reader) error + SendCoveragePayloadWithFormatFunc func(ciTestCovPayload io.Reader, format string) error + GetSettingsFunc func() (*net.SettingsResponseData, error) + GetKnownTestsFunc func() (*net.KnownTestsResponseData, error) + GetCommitsFunc func(localCommits []string) ([]string, error) + SendPackFilesFunc func(commitSha string, packFiles []string) (bytes int64, err error) + GetSkippableTestsFunc func() (correlationId string, skippables map[string]map[string][]net.SkippableResponseDataAttributes, err error) + GetTestManagementTestsFunc func() (*net.TestManagementTestsResponseDataModules, error) + SendLogsFunc func(logsPayload io.Reader) error +} + +func (m *MockClient) SendCoveragePayload(ciTestCovPayload io.Reader) error { + return m.SendCoveragePayloadFunc(ciTestCovPayload) +} + +func (m *MockClient) SendCoveragePayloadWithFormat(ciTestCovPayload io.Reader, format string) error { + return m.SendCoveragePayloadWithFormatFunc(ciTestCovPayload, format) +} + +func (m *MockClient) GetSettings() (*net.SettingsResponseData, error) { + return m.GetSettingsFunc() +} + +func (m *MockClient) GetKnownTests() (*net.KnownTestsResponseData, error) { + return m.GetKnownTestsFunc() +} + +func (m *MockClient) GetCommits(localCommits []string) ([]string, error) { + return m.GetCommitsFunc(localCommits) +} + +func (m *MockClient) SendPackFiles(commitSha string, packFiles []string) (bytes int64, err error) { + return m.SendPackFilesFunc(commitSha, packFiles) +} + +func (m *MockClient) GetSkippableTests() (_ string, _ map[string]map[string][]net.SkippableResponseDataAttributes, err error) { + return m.GetSkippableTestsFunc() +} + +func (m *MockClient) GetTestManagementTests() (*net.TestManagementTestsResponseDataModules, error) { + return m.GetTestManagementTestsFunc() +} + +func (m *MockClient) SendLogs(logsPayload io.Reader) error { + return m.SendLogsFunc(logsPayload) +} diff --git a/internal/civisibility/integrations/manual_api.go b/internal/civisibility/integrations/manual_api.go index 2261233422..30fa512c32 100644 --- a/internal/civisibility/integrations/manual_api.go +++ b/internal/civisibility/integrations/manual_api.go @@ -8,13 +8,7 @@ package integrations import ( "context" "runtime" - "sync" "time" - - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" ) // TestResultStatus represents the result status of a test. @@ -31,6 +25,31 @@ const ( ResultStatusSkip TestResultStatus = 2 ) +// ErrorOption is a function that sets an option for creating an error. +type ErrorOption func(*tslvErrorOptions) + +// tslvErrorOptions is a struct that holds options for creating an error. +type tslvErrorOptions struct { + err error + errType string + message string + callstack string +} + +// WithError sets the error on the options. +func WithError(err error) ErrorOption { + return func(o *tslvErrorOptions) { o.err = err } +} + +// WithErrorInfo sets detailed error information on the options. +func WithErrorInfo(errType string, message string, callstack string) ErrorOption { + return func(o *tslvErrorOptions) { + o.errType = errType + o.message = message + o.callstack = callstack + } +} + // ddTslvEvent is an interface that provides common methods for CI visibility events. type ddTslvEvent interface { // Context returns the context of the event. @@ -40,19 +59,93 @@ type ddTslvEvent interface { StartTime() time.Time // SetError sets an error on the event. - SetError(err error) - - // SetErrorInfo sets detailed error information on the event. - SetErrorInfo(errType string, message string, callstack string) + SetError(options ...ErrorOption) // SetTag sets a tag on the event. SetTag(key string, value interface{}) + + // GetTag retrieves a tag from the event. + GetTag(key string) (interface{}, bool) +} + +// TestSessionStartOption represents an option that can be passed to CreateTestSession. +type TestSessionStartOption func(*tslvTestSessionStartOptions) + +// tslvTestSessionStartOptions contains the options for creating a new test session. +type tslvTestSessionStartOptions struct { + command string + workingDirectory string + framework string + frameworkVersion string + startTime time.Time +} + +// WithTestSessionCommand sets the command used to run the test session. +func WithTestSessionCommand(command string) TestSessionStartOption { + return func(o *tslvTestSessionStartOptions) { o.command = command } +} + +// WithTestSessionWorkingDirectory sets the working directory of the test session. +func WithTestSessionWorkingDirectory(workingDirectory string) TestSessionStartOption { + return func(o *tslvTestSessionStartOptions) { o.workingDirectory = workingDirectory } +} + +// WithTestSessionFramework sets the testing framework used in the test session. +func WithTestSessionFramework(framework, frameworkVersion string) TestSessionStartOption { + return func(o *tslvTestSessionStartOptions) { + o.framework = framework + o.frameworkVersion = frameworkVersion + } +} + +// WithTestSessionStartTime sets the start time of the test session. +func WithTestSessionStartTime(startTime time.Time) TestSessionStartOption { + return func(o *tslvTestSessionStartOptions) { o.startTime = startTime } } -// DdTestSession represents a session for a set of tests. -type DdTestSession interface { +// TestSessionCloseOption represents an option that can be passed to Close. +type TestSessionCloseOption func(*tslvTestSessionCloseOptions) + +// tslvTestSessionCloseOptions contains the options for closing a test session. +type tslvTestSessionCloseOptions struct { + finishTime time.Time +} + +// WithTestSessionFinishTime sets the finish time of the test session. +func WithTestSessionFinishTime(finishTime time.Time) TestSessionCloseOption { + return func(o *tslvTestSessionCloseOptions) { o.finishTime = finishTime } +} + +// TestModuleStartOption represents an option that can be passed to GetOrCreateModule. +type TestModuleStartOption func(*tslvTestModuleStartOptions) + +// tslvTestModuleOptions contains the options for creating a new test module. +type tslvTestModuleStartOptions struct { + framework string + frameworkVersion string + startTime time.Time +} + +// WithTestModuleFramework sets the testing framework used by the test module. +func WithTestModuleFramework(framework, frameworkVersion string) TestModuleStartOption { + return func(o *tslvTestModuleStartOptions) { + o.framework = framework + o.frameworkVersion = frameworkVersion + } +} + +// WithTestModuleStartTime sets the start time of the test module. +func WithTestModuleStartTime(startTime time.Time) TestModuleStartOption { + return func(o *tslvTestModuleStartOptions) { o.startTime = startTime } +} + +// TestSession represents a session for a set of tests. +type TestSession interface { ddTslvEvent + // SessionID returns the ID of the session. + SessionID() uint64 + // Command returns the command used to run the session. Command() string @@ -63,27 +156,47 @@ type DdTestSession interface { WorkingDirectory() string // Close closes the test session with the given exit code. - Close(exitCode int) - - // CloseWithFinishTime closes the test session with the given exit code and finish time. - CloseWithFinishTime(exitCode int, finishTime time.Time) + Close(exitCode int, options ...TestSessionCloseOption) // GetOrCreateModule returns an existing module or creates a new one with the given name. - GetOrCreateModule(name string) DdTestModule + GetOrCreateModule(name string, options ...TestModuleStartOption) TestModule +} + +// TestModuleCloseOption represents an option for closing a test module. +type TestModuleCloseOption func(*tslvTestModuleCloseOptions) - // GetOrCreateModuleWithFramework returns an existing module or creates a new one with the given name, framework, and framework version. - GetOrCreateModuleWithFramework(name string, framework string, frameworkVersion string) DdTestModule +// tslvTestModuleCloseOptions represents the options for closing a test module. +type tslvTestModuleCloseOptions struct { + finishTime time.Time +} + +// WithTestModuleFinishTime sets the finish time for closing the test module. +func WithTestModuleFinishTime(finishTime time.Time) TestModuleCloseOption { + return func(o *tslvTestModuleCloseOptions) { o.finishTime = finishTime } +} + +// TestSuiteStartOption represents an option for starting a test suite. +type TestSuiteStartOption func(*tslvTestSuiteStartOptions) + +// tslvTestSuiteStartOptions represents the options for starting a test suite. +type tslvTestSuiteStartOptions struct { + startTime time.Time +} - // GetOrCreateModuleWithFrameworkAndStartTime returns an existing module or creates a new one with the given name, framework, framework version, and start time. - GetOrCreateModuleWithFrameworkAndStartTime(name string, framework string, frameworkVersion string, startTime time.Time) DdTestModule +// WithTestSuiteStartTime sets the start time for starting a test suite. +func WithTestSuiteStartTime(startTime time.Time) TestSuiteStartOption { + return func(o *tslvTestSuiteStartOptions) { o.startTime = startTime } } -// DdTestModule represents a module within a test session. -type DdTestModule interface { +// TestModule represents a module within a test session. +type TestModule interface { ddTslvEvent + // ModuleID returns the ID of the module. + ModuleID() uint64 + // Session returns the test session to which the module belongs. - Session() DdTestSession + Session() TestSession // Framework returns the testing framework used by the module. Framework() string @@ -92,136 +205,99 @@ type DdTestModule interface { Name() string // Close closes the test module. - Close() - - // CloseWithFinishTime closes the test module with the given finish time. - CloseWithFinishTime(finishTime time.Time) + Close(options ...TestModuleCloseOption) // GetOrCreateSuite returns an existing suite or creates a new one with the given name. - GetOrCreateSuite(name string) DdTestSuite + GetOrCreateSuite(name string, options ...TestSuiteStartOption) TestSuite +} + +// TestSuiteCloseOption represents an option for closing a test suite. +type TestSuiteCloseOption func(*tslvTestSuiteCloseOptions) + +// tslvTestSuiteCloseOptions represents the options for closing a test suite. +type tslvTestSuiteCloseOptions struct { + finishTime time.Time +} + +// WithTestSuiteFinishTime sets the finish time for closing the test suite. +func WithTestSuiteFinishTime(finishTime time.Time) TestSuiteCloseOption { + return func(o *tslvTestSuiteCloseOptions) { o.finishTime = finishTime } +} - // GetOrCreateSuiteWithStartTime returns an existing suite or creates a new one with the given name and start time. - GetOrCreateSuiteWithStartTime(name string, startTime time.Time) DdTestSuite +// TestStartOption represents an option for starting a test. +type TestStartOption func(*tslvTestStartOptions) + +// tslvTestStartOptions represents the options for starting a test. +type tslvTestStartOptions struct { + startTime time.Time } -// DdTestSuite represents a suite of tests within a module. -type DdTestSuite interface { +// WithTestStartTime sets the start time for starting a test. +func WithTestStartTime(startTime time.Time) TestStartOption { + return func(o *tslvTestStartOptions) { o.startTime = startTime } +} + +// TestSuite represents a suite of tests within a module. +type TestSuite interface { ddTslvEvent + // SuiteID returns the ID of the suite. + SuiteID() uint64 + // Module returns the module to which the suite belongs. - Module() DdTestModule + Module() TestModule // Name returns the name of the suite. Name() string // Close closes the test suite. - Close() + Close(options ...TestSuiteCloseOption) + + // CreateTest creates a new test with the given name and options. + CreateTest(name string, options ...TestStartOption) Test +} - // CloseWithFinishTime closes the test suite with the given finish time. - CloseWithFinishTime(finishTime time.Time) +// TestCloseOption represents an option for closing a test. +type TestCloseOption func(*tslvTestCloseOptions) - // CreateTest creates a new test with the given name. - CreateTest(name string) DdTest +// tslvTestCloseOptions represents the options for closing a test. +type tslvTestCloseOptions struct { + finishTime time.Time + skipReason string +} - // CreateTestWithStartTime creates a new test with the given name and start time. - CreateTestWithStartTime(name string, startTime time.Time) DdTest +// WithTestFinishTime sets the finish time of the test. +func WithTestFinishTime(finishTime time.Time) TestCloseOption { + return func(o *tslvTestCloseOptions) { o.finishTime = finishTime } } -// DdTest represents an individual test within a suite. -type DdTest interface { +// WithTestSkipReason sets the skip reason of the test. +func WithTestSkipReason(skipReason string) TestCloseOption { + return func(o *tslvTestCloseOptions) { o.skipReason = skipReason } +} + +// Test represents an individual test within a suite. +type Test interface { ddTslvEvent + // TestID returns the ID of the test. + TestID() uint64 + // Name returns the name of the test. Name() string // Suite returns the suite to which the test belongs. - Suite() DdTestSuite + Suite() TestSuite // Close closes the test with the given status. - Close(status TestResultStatus) - - // CloseWithFinishTime closes the test with the given status and finish time. - CloseWithFinishTime(status TestResultStatus, finishTime time.Time) - - // CloseWithFinishTimeAndSkipReason closes the test with the given status, finish time, and skip reason. - CloseWithFinishTimeAndSkipReason(status TestResultStatus, finishTime time.Time, skipReason string) + Close(status TestResultStatus, options ...TestCloseOption) // SetTestFunc sets the function to be tested. (Sets the test.source tags and test.codeowners) SetTestFunc(fn *runtime.Func) // SetBenchmarkData sets benchmark data for the test. SetBenchmarkData(measureType string, data map[string]any) -} - -// common -var _ ddTslvEvent = (*ciVisibilityCommon)(nil) - -// ciVisibilityCommon is a struct that implements the ddTslvEvent interface and provides common functionality for CI visibility. -type ciVisibilityCommon struct { - startTime time.Time - - tags []tracer.StartSpanOption - span tracer.Span - ctx context.Context - mutex sync.Mutex - closed bool -} - -// Context returns the context of the event. -func (c *ciVisibilityCommon) Context() context.Context { return c.ctx } - -// StartTime returns the start time of the event. -func (c *ciVisibilityCommon) StartTime() time.Time { return c.startTime } - -// SetError sets an error on the event. -func (c *ciVisibilityCommon) SetError(err error) { - c.span.SetTag(ext.Error, err) -} - -// SetErrorInfo sets detailed error information on the event. -func (c *ciVisibilityCommon) SetErrorInfo(errType string, message string, callstack string) { - // set the span with error:1 - c.span.SetTag(ext.Error, true) - - // set the error type - if errType != "" { - c.span.SetTag(ext.ErrorType, errType) - } - - // set the error message - if message != "" { - c.span.SetTag(ext.ErrorMsg, message) - } - - // set the error stacktrace - if callstack != "" { - c.span.SetTag(ext.ErrorStack, callstack) - } -} - -// SetTag sets a tag on the event. -func (c *ciVisibilityCommon) SetTag(key string, value interface{}) { c.span.SetTag(key, value) } - -// fillCommonTags adds common tags to the span options for CI visibility. -func fillCommonTags(opts []tracer.StartSpanOption) []tracer.StartSpanOption { - opts = append(opts, []tracer.StartSpanOption{ - tracer.Tag(constants.Origin, constants.CIAppTestOrigin), - tracer.Tag(ext.ManualKeep, true), - }...) - - // Apply CI tags - for k, v := range utils.GetCITags() { - // Ignore the test session name (sent at the payload metadata level, see `civisibility_payload.go`) - if k == constants.TestSessionName { - continue - } - opts = append(opts, tracer.Tag(k, v)) - } - - // Apply CI metrics - for k, v := range utils.GetCIMetrics() { - opts = append(opts, tracer.Tag(k, v)) - } - return opts + // Log logs a message with the given tags. + Log(message string, tags string) } diff --git a/internal/civisibility/integrations/manual_api_common.go b/internal/civisibility/integrations/manual_api_common.go new file mode 100644 index 0000000000..68f6036adf --- /dev/null +++ b/internal/civisibility/integrations/manual_api_common.go @@ -0,0 +1,143 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package integrations + +import ( + "context" + "sync" + "time" + _ "unsafe" // for go:linkname + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" +) + +// Go linknames + +//go:linkname getMeta github.com/DataDog/dd-trace-go/v2/ddtrace/tracer.getMeta +func getMeta(s *tracer.Span, key string) (string, bool) + +//go:linkname getMetric github.com/DataDog/dd-trace-go/v2/ddtrace/tracer.getMetric +func getMetric(s *tracer.Span, key string) (float64, bool) + +// common +var _ ddTslvEvent = (*ciVisibilityCommon)(nil) + +// ciVisibilityCommon is a struct that implements the ddTslvEvent interface and provides common functionality for CI visibility. +type ciVisibilityCommon struct { + mutex sync.Mutex + startTime time.Time + + tags []tracer.StartSpanOption + span *tracer.Span + closed bool + + ctxMutex sync.Mutex + ctx context.Context +} + +// Context returns the context of the event. +func (c *ciVisibilityCommon) Context() context.Context { + c.ctxMutex.Lock() + defer c.ctxMutex.Unlock() + return c.ctx +} + +// StartTime returns the start time of the event. +func (c *ciVisibilityCommon) StartTime() time.Time { return c.startTime } + +// SetError sets an error on the event. +func (c *ciVisibilityCommon) SetError(options ...ErrorOption) { + defaults := &tslvErrorOptions{} + for _, o := range options { + o(defaults) + } + + // if there is an error, set the span with the error + if defaults.err != nil { + c.span.SetTag(ext.Error, defaults.err) + return + } + + // if there is no error, set the span with error the error info + + // set the span with error:1 + c.span.SetTag(ext.Error, true) + + // set the error type + if defaults.errType != "" { + c.span.SetTag(ext.ErrorType, defaults.errType) + } + + // set the error message + if defaults.message != "" { + c.span.SetTag(ext.ErrorMsg, defaults.message) + } + + // set the error stacktrace + if defaults.callstack != "" { + c.span.SetTag(ext.ErrorStack, defaults.callstack) + } +} + +// SetTag sets a tag on the event. +func (c *ciVisibilityCommon) SetTag(key string, value interface{}) { c.span.SetTag(key, value) } + +// GetTag retrieves a tag from the event. +func (c *ciVisibilityCommon) GetTag(key string) (interface{}, bool) { + // Check if the span is nil + if c.span == nil { + return nil, false + } + + // Check if the key is a meta key + metaVal, ok := getMeta(c.span, key) + if ok { + return metaVal, true + } + + // Check if the key is a metric key + metricVal, ok := getMetric(c.span, key) + return metricVal, ok +} + +// fillCommonTags adds common tags to the span options for CI visibility. +func fillCommonTags(opts []tracer.StartSpanOption) []tracer.StartSpanOption { + opts = append(opts, []tracer.StartSpanOption{ + tracer.Tag(constants.Origin, constants.CIAppTestOrigin), + tracer.Tag(ext.ManualKeep, true), + }...) + + // Apply CI tags + for k, v := range utils.GetCITags() { + // Ignore the test session name (sent at the payload metadata level, see `civisibility_payload.go`) + if k == constants.TestSessionName { + continue + } + opts = append(opts, tracer.Tag(k, v)) + } + + // Apply CI metrics + for k, v := range utils.GetCIMetrics() { + opts = append(opts, tracer.Tag(k, v)) + } + + return opts +} + +func (c *ciVisibilityCommon) getContextValue(key any) any { + c.ctxMutex.Lock() + defer c.ctxMutex.Unlock() + return c.ctx.Value(key) +} + +func (c *ciVisibilityCommon) setContextValue(key, value any) { + c.ctxMutex.Lock() + defer c.ctxMutex.Unlock() + c.ctx = context.WithValue(c.ctx, key, value) +} diff --git a/internal/civisibility/integrations/manual_api_ddtest.go b/internal/civisibility/integrations/manual_api_ddtest.go index 5ca025a783..a79be7b77b 100644 --- a/internal/civisibility/integrations/manual_api_ddtest.go +++ b/internal/civisibility/integrations/manual_api_ddtest.go @@ -11,30 +11,54 @@ import ( "go/ast" "go/parser" "go/token" + "math" "runtime" + "slices" "strings" + "sync" "time" + _ "unsafe" // for go:linkname - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/logs" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // Test -// Ensures that tslvTest implements the DdTest interface. -var _ DdTest = (*tslvTest)(nil) +// Ensures that tslvTest implements the Test interface. +var _ Test = (*tslvTest)(nil) -// tslvTest implements the DdTest interface and represents an individual test within a suite. -type tslvTest struct { - ciVisibilityCommon - suite *tslvTestSuite - name string -} +type ( + // tslvTest implements the DdTest interface and represents an individual test within a suite. + tslvTest struct { + ciVisibilityCommon + testID uint64 + suite *tslvTestSuite + name string + } + + // tslvTestDelayed is a struct that represents a delayed test close operation. + tslvTestDelayed struct { + *tslvTest + finishTime time.Time + } +) + +var ( + finishedTests []*tslvTestDelayed + finishedTestsMutex sync.Mutex + + globalTestEventStartHook func(any) + globalEventFinishHook func([]any) +) // createTest initializes a new test within a given suite. -func createTest(suite *tslvTestSuite, name string, startTime time.Time) DdTest { +func createTest(suite *tslvTestSuite, name string, startTime time.Time) Test { if suite == nil { return nil } @@ -47,7 +71,7 @@ func createTest(suite *tslvTestSuite, name string, startTime time.Time) DdTest { resourceName := fmt.Sprintf("%s.%s", suite.name, name) // Test tags should include suite, module, and session tags so the backend can calculate the suite, module, and session fingerprint from the test. - testTags := append(suite.tags, tracer.Tag(constants.TestName, name)) + testTags := append(slices.Clone(suite.tags), tracer.Tag(constants.TestName, name)) testOpts := append(fillCommonTags([]tracer.StartSpanOption{ tracer.ResourceName(resourceName), tracer.SpanType(constants.SpanTypeTest), @@ -60,10 +84,12 @@ func createTest(suite *tslvTestSuite, name string, startTime time.Time) DdTest { } span.SetTag(constants.TestModuleIDTag, fmt.Sprint(suite.module.moduleID)) span.SetTag(constants.TestSuiteIDTag, fmt.Sprint(suite.suiteID)) + testID := span.Context().SpanID() t := &tslvTest{ - suite: suite, - name: name, + testID: testID, + suite: suite, + name: name, ciVisibilityCommon: ciVisibilityCommon{ startTime: startTime, tags: testTags, @@ -72,34 +98,47 @@ func createTest(suite *tslvTestSuite, name string, startTime time.Time) DdTest { }, } - // Ensure to close everything before CI visibility exits. In CI visibility mode, we try to never lose data. - PushCiVisibilityCloseAction(func() { t.Close(ResultStatusFail) }) + // If we have a global test event start hook we call it here. + if globalTestEventStartHook != nil { + globalTestEventStartHook(t) + } + + // Note: if the process is killed some tests will not be closed and will be lost. This is a known limitation. + // We will not close it because there's no a good test status to report in this case, and we don't want to report a false positive (pass, fail, or skip). + // Creating telemetry event created + telemetry.EventCreated(t.suite.module.framework, telemetry.TestEventType) return t } +// TestID returns the ID of the test. +func (t *tslvTest) TestID() uint64 { + return t.testID +} + // Name returns the name of the test. func (t *tslvTest) Name() string { return t.name } // Suite returns the suite to which the test belongs. -func (t *tslvTest) Suite() DdTestSuite { return t.suite } +func (t *tslvTest) Suite() TestSuite { return t.suite } -// Close closes the test with the given status and sets the finish time to the current time. -func (t *tslvTest) Close(status TestResultStatus) { t.CloseWithFinishTime(status, time.Now()) } - -// CloseWithFinishTime closes the test with the given status and finish time. -func (t *tslvTest) CloseWithFinishTime(status TestResultStatus, finishTime time.Time) { - t.CloseWithFinishTimeAndSkipReason(status, finishTime, "") -} - -// CloseWithFinishTimeAndSkipReason closes the test with the given status, finish time, and skip reason. -func (t *tslvTest) CloseWithFinishTimeAndSkipReason(status TestResultStatus, finishTime time.Time, skipReason string) { +// Close closes the test with the given status. +func (t *tslvTest) Close(status TestResultStatus, options ...TestCloseOption) { t.mutex.Lock() defer t.mutex.Unlock() if t.closed { return } + defaults := &tslvTestCloseOptions{} + for _, opt := range options { + opt(defaults) + } + + if defaults.finishTime.IsZero() { + defaults.finishTime = time.Now() + } + switch status { case ResultStatusPass: t.span.SetTag(constants.TestStatus, constants.TestStatusPass) @@ -109,24 +148,80 @@ func (t *tslvTest) CloseWithFinishTimeAndSkipReason(status TestResultStatus, fin t.span.SetTag(constants.TestStatus, constants.TestStatusSkip) } - if skipReason != "" { - t.span.SetTag(constants.TestSkipReason, skipReason) + if defaults.skipReason != "" { + t.span.SetTag(constants.TestSkipReason, defaults.skipReason) } - t.span.Finish(tracer.FinishTime(finishTime)) + if globalEventFinishHook != nil { + // delayed close + finishedTestsMutex.Lock() + defer finishedTestsMutex.Unlock() + finishedTests = append(finishedTests, &tslvTestDelayed{ + tslvTest: t, + finishTime: defaults.finishTime, + }) + return + } + t.internalClose(tracer.FinishTime(defaults.finishTime)) +} + +// internalClose is a helper function to close the test and report the telemetry event. +func (t *tslvTest) internalClose(options ...tracer.FinishOption) { + t.span.Finish(options...) t.closed = true + + // Creating telemetry event finished + t.ctxMutex.Lock() + defer t.ctxMutex.Unlock() + testingEventType := telemetry.TestEventType + if t.ctx.Value(constants.TestIsNew) == "true" { + testingEventType = append(testingEventType, telemetry.IsNewEventType...) + } + if t.ctx.Value(constants.TestIsRetry) == "true" { + testingEventType = append(testingEventType, telemetry.IsRetryEventType...) + } + if t.ctx.Value(constants.TestEarlyFlakeDetectionRetryAborted) == "slow" { + testingEventType = append(testingEventType, telemetry.EfdAbortSlowEventType...) + } + if t.ctx.Value(constants.TestType) == constants.TestTypeBenchmark { + testingEventType = append(testingEventType, telemetry.IsBenchmarkEventType...) + } + if t.ctx.Value(constants.TestIsAttempToFix) == "true" { + testingEventType = append(testingEventType, telemetry.IsAttemptToFixEventType...) + } + if t.ctx.Value(constants.TestIsQuarantined) == "true" { + testingEventType = append(testingEventType, telemetry.IsQuarantinedEventType...) + } + if t.ctx.Value(constants.TestIsDisabled) == "true" { + testingEventType = append(testingEventType, telemetry.IsDisabledEventType...) + } + if t.ctx.Value(constants.TestHasFailedAllRetries) == "true" { + testingEventType = append(testingEventType, telemetry.HasFailedAllRetriesEventType...) + } + if retryReason, ok := t.ctx.Value(constants.TestRetryReason).(string); ok { + testingEventType = append(testingEventType, []string{fmt.Sprintf("retry_reason:%s", retryReason)}...) + } + telemetry.EventFinished(t.suite.module.framework, testingEventType) } -// SetError sets an error on the test and marks the suite and module as having an error. -func (t *tslvTest) SetError(err error) { - t.ciVisibilityCommon.SetError(err) - t.Suite().SetTag(ext.Error, true) - t.Suite().Module().SetTag(ext.Error, true) +// SetTag sets a tag on the test event. +func (t *tslvTest) SetTag(key string, value interface{}) { + t.ciVisibilityCommon.SetTag(key, value) + if key == constants.TestIsNew || + key == constants.TestIsRetry || + key == constants.TestEarlyFlakeDetectionRetryAborted || + key == constants.TestIsAttempToFix || + key == constants.TestIsQuarantined || + key == constants.TestIsDisabled || + key == constants.TestHasFailedAllRetries || + key == constants.TestRetryReason { + t.setContextValue(key, value) + } } -// SetErrorInfo sets detailed error information on the test and marks the suite and module as having an error. -func (t *tslvTest) SetErrorInfo(errType string, message string, callstack string) { - t.ciVisibilityCommon.SetErrorInfo(errType, message, callstack) +// SetError sets an error on the test and marks the suite and module as having an error. +func (t *tslvTest) SetError(options ...ErrorOption) { + t.ciVisibilityCommon.SetError(options...) t.Suite().SetTag(ext.Error, true) t.Suite().Module().SetTag(ext.Error, true) } @@ -142,13 +237,33 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { file := utils.GetRelativePathFromCITagsSourceRoot(absolutePath) t.SetTag(constants.TestSourceFile, file) t.SetTag(constants.TestSourceStartLine, startLine) + t.suite.SetTag(constants.TestSourceFile, file) // now, let's try to get the end line of the function using ast // parse the entire file where the function is defined to create an abstract syntax tree (AST) // if we can't parse the file (source code is not available) we silently bail out fset := token.NewFileSet() - fileNode, err := parser.ParseFile(fset, absolutePath, nil, parser.AllErrors) + fileNode, err := parser.ParseFile(fset, absolutePath, nil, parser.AllErrors|parser.ParseComments) if err == nil { + + // let's check if the suite was marked as unskippable before + isUnskippable, hasUnskippableValue := t.suite.getContextValue(constants.TestUnskippable).(bool) + if !hasUnskippableValue { + // check for suite level unskippable comment at the top of the file + for _, commentGroup := range fileNode.Comments { + for _, comment := range commentGroup.List { + if strings.Contains(comment.Text, "//dd:suite.unskippable") { + isUnskippable = true + break + } + } + if isUnskippable { + break + } + } + t.suite.setContextValue(constants.TestUnskippable, isUnskippable) + } + // get the function name without the package name fullName := fn.Name() firstDot := strings.LastIndex(fullName, ".") + 1 @@ -156,6 +271,7 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { // variable to store the ending line of the function var endLine int + // traverse the AST to find the function declaration for the target function ast.Inspect(fileNode, func(n ast.Node) bool { // check if the current node is a function declaration @@ -164,6 +280,17 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { if funcDecl.Name.Name == name { // get the line number of the end of the function body endLine = fset.Position(funcDecl.Body.End()).Line + // check for comments above the function declaration to look for unskippable tag + // but only if we haven't found a suite level unskippable comment + if !isUnskippable && funcDecl.Doc != nil { + for _, comment := range funcDecl.Doc.List { + if strings.Contains(comment.Text, "//dd:test.unskippable") { + isUnskippable = true + break + } + } + } + // stop further inspection since we have found the target function return false } @@ -173,7 +300,10 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { // get the line number of the start of the function literal funcStartLine := fset.Position(funcLit.Body.Pos()).Line // if the start line matches the known start line, record the end line - if funcStartLine == startLine { + // startLine is not so accurate because it is the line of the first instruction of the function (Go 1.24) + // so we need to check if the function literal is the one we are looking for (we are going to leave an error of 1 line) + if math.Abs(float64(funcStartLine-startLine)) <= 1 { + startLine = funcStartLine endLine = fset.Position(funcLit.Body.End()).Line return false // stop further inspection since we have found the function } @@ -184,8 +314,25 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { // if we found an endLine we check is greater than the calculated startLine if endLine >= startLine { + t.SetTag(constants.TestSourceStartLine, startLine) t.SetTag(constants.TestSourceEndLine, endLine) } + + // if the function is marked as unskippable, set the appropriate tag + if isUnskippable { + t.SetTag(constants.TestUnskippable, "true") + telemetry.ITRUnskippable(telemetry.TestEventType) + t.setContextValue(constants.TestUnskippable, true) + } + + // if impacted tests analyzer was loaded, we run it + if analyzer := GetImpactedTestsAnalyzer(); analyzer != nil { + if analyzer.IsImpacted(t.Name(), file, startLine, endLine) { + t.SetTag(constants.TestIsModified, "true") + telemetry.ImpactedTestsModified() + t.setContextValue(constants.TestIsModified, true) + } + } } // get the codeowner of the function @@ -193,7 +340,9 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { if codeOwners != nil { match, found := codeOwners.Match("/" + file) if found { - t.SetTag(constants.TestCodeOwners, match.GetOwnersString()) + ownerString := match.GetOwnersString() + t.SetTag(constants.TestCodeOwners, ownerString) + t.suite.SetTag(constants.TestCodeOwners, ownerString) } } } @@ -201,7 +350,72 @@ func (t *tslvTest) SetTestFunc(fn *runtime.Func) { // SetBenchmarkData sets benchmark data for the test. func (t *tslvTest) SetBenchmarkData(measureType string, data map[string]any) { t.span.SetTag(constants.TestType, constants.TestTypeBenchmark) + t.setContextValue(constants.TestType, constants.TestTypeBenchmark) for k, v := range data { t.span.SetTag(fmt.Sprintf("benchmark.%s.%s", measureType, k), v) } } + +// Log writes a log message for the test. +func (t *tslvTest) Log(message string, tags string) { + logs.WriteLog(t.testID, t.suite.module.name, t.suite.name, t.name, message, tags) +} + +// close closes the test and reports the telemetry event. +func (d *tslvTestDelayed) close() { + d.mutex.Lock() + defer d.mutex.Unlock() + if !d.closed { + d.internalClose(tracer.FinishTime(d.finishTime)) + } +} + +// SetGlobalTestEventStartHook sets a global hook to be called when a test event is started. + +//go:linkname SetGlobalTestEventStartHook +func SetGlobalTestEventStartHook(hook func(any)) { + globalTestEventStartHook = hook +} + +// SetGlobalEventFinishHook sets a global hook to be called when all test events are finished. +// +//go:linkname SetGlobalEventFinishHook +func SetGlobalEventFinishHook(hook func([]any)) { + globalEventFinishHook = hook +} + +func init() { + PushCiVisibilityCloseAction(func() { + finishedTestsMutex.Lock() + defer finishedTestsMutex.Unlock() + if len(finishedTests) > 0 { + // Create a slice with the tests + tests := make([]any, len(finishedTests)) + for i, test := range finishedTests { + tests[i] = test.tslvTest + } + + // Close all tests that were delayed in a defer function to ensure they are closed even if the hook panics. + defer func() { + // Close all tests that were delayed. + log.Debug("Closing delayed tests") + for _, test := range finishedTests { + test.close() + } + + // Clear the finished tests slice. + finishedTests = nil + }() + + // If we have a global test event finish hook, we call it here. + if globalEventFinishHook != nil { + log.Debug("Calling global tests event finish hook") + globalEventFinishHook(tests) + } + } + + // Reset the global hooks to avoid memory leaks. + globalTestEventStartHook = nil + globalEventFinishHook = nil + }) +} diff --git a/internal/civisibility/integrations/manual_api_ddtestmodule.go b/internal/civisibility/integrations/manual_api_ddtestmodule.go index 9f8746f4e3..31143c0344 100644 --- a/internal/civisibility/integrations/manual_api_ddtestmodule.go +++ b/internal/civisibility/integrations/manual_api_ddtestmodule.go @@ -8,17 +8,19 @@ package integrations import ( "context" "fmt" + "slices" "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" ) // Test Module -// Ensures that tslvTestModule implements the DdTestModule interface. -var _ DdTestModule = (*tslvTestModule)(nil) +// Ensures that tslvTestModule implements the TestModule interface. +var _ TestModule = (*tslvTestModule)(nil) // tslvTestModule implements the DdTestModule interface and represents a module within a test session. type tslvTestModule struct { @@ -28,11 +30,11 @@ type tslvTestModule struct { name string framework string - suites map[string]DdTestSuite + suites map[string]TestSuite } // createTestModule initializes a new test module within a given session. -func createTestModule(session *tslvTestSession, name string, framework string, frameworkVersion string, startTime time.Time) DdTestModule { +func createTestModule(session *tslvTestSession, name string, framework string, frameworkVersion string, startTime time.Time) TestModule { // Ensure CI visibility is properly configured. EnsureCiVisibilityInitialization() @@ -45,7 +47,7 @@ func createTestModule(session *tslvTestSession, name string, framework string, f var sessionTags []tracer.StartSpanOption if session != nil { - sessionTags = session.tags + sessionTags = slices.Clone(session.tags) } // Module tags should include session tags so the backend can calculate the session fingerprint from the module. @@ -74,7 +76,7 @@ func createTestModule(session *tslvTestSession, name string, framework string, f moduleID: moduleID, name: name, framework: framework, - suites: map[string]DdTestSuite{}, + suites: map[string]TestSuite{}, ciVisibilityCommon: ciVisibilityCommon{ startTime: startTime, tags: moduleTags, @@ -86,9 +88,16 @@ func createTestModule(session *tslvTestSession, name string, framework string, f // Ensure to close everything before CI visibility exits. In CI visibility mode, we try to never lose data. PushCiVisibilityCloseAction(func() { module.Close() }) + // Creating telemetry event created + telemetry.EventCreated(module.framework, telemetry.ModuleEventType) return module } +// ModuleID returns the ID of the module. +func (t *tslvTestModule) ModuleID() uint64 { + return t.moduleID +} + // Name returns the name of the test module. func (t *tslvTestModule) Name() string { return t.name } @@ -96,43 +105,56 @@ func (t *tslvTestModule) Name() string { return t.name } func (t *tslvTestModule) Framework() string { return t.framework } // Session returns the test session to which the test module belongs. -func (t *tslvTestModule) Session() DdTestSession { return t.session } +func (t *tslvTestModule) Session() TestSession { return t.session } -// Close closes the test module and sets the finish time to the current time. -func (t *tslvTestModule) Close() { t.CloseWithFinishTime(time.Now()) } - -// CloseWithFinishTime closes the test module with the given finish time. -func (t *tslvTestModule) CloseWithFinishTime(finishTime time.Time) { +// Close closes the test module. +func (t *tslvTestModule) Close(options ...TestModuleCloseOption) { t.mutex.Lock() defer t.mutex.Unlock() if t.closed { return } + defaults := &tslvTestModuleCloseOptions{} + for _, o := range options { + o(defaults) + } + + if defaults.finishTime.IsZero() { + defaults.finishTime = time.Now() + } + for _, suite := range t.suites { suite.Close() } - t.suites = map[string]DdTestSuite{} + t.suites = map[string]TestSuite{} - t.span.Finish(tracer.FinishTime(finishTime)) + t.span.Finish(tracer.FinishTime(defaults.finishTime)) t.closed = true -} -// GetOrCreateSuite returns an existing suite or creates a new one with the given name. -func (t *tslvTestModule) GetOrCreateSuite(name string) DdTestSuite { - return t.GetOrCreateSuiteWithStartTime(name, time.Now()) + // Creating telemetry event finished + telemetry.EventFinished(t.framework, telemetry.ModuleEventType) } -// GetOrCreateSuiteWithStartTime returns an existing suite or creates a new one with the given name and start time. -func (t *tslvTestModule) GetOrCreateSuiteWithStartTime(name string, startTime time.Time) DdTestSuite { +// GetOrCreateSuite returns an existing suite or creates a new one with the given name. +func (t *tslvTestModule) GetOrCreateSuite(name string, options ...TestSuiteStartOption) TestSuite { t.mutex.Lock() defer t.mutex.Unlock() - var suite DdTestSuite + defaults := &tslvTestSuiteStartOptions{} + for _, o := range options { + o(defaults) + } + + if defaults.startTime.IsZero() { + defaults.startTime = time.Now() + } + + var suite TestSuite if v, ok := t.suites[name]; ok { suite = v } else { - suite = createTestSuite(t, name, startTime) + suite = createTestSuite(t, name, defaults.startTime) t.suites[name] = suite } diff --git a/internal/civisibility/integrations/manual_api_ddtestsession.go b/internal/civisibility/integrations/manual_api_ddtestsession.go index 64b522b3b2..6b86067cc9 100644 --- a/internal/civisibility/integrations/manual_api_ddtestsession.go +++ b/internal/civisibility/integrations/manual_api_ddtestsession.go @@ -12,15 +12,16 @@ import ( "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" ) // Test Session -// Ensures that tslvTestSession implements the DdTestSession interface. -var _ DdTestSession = (*tslvTestSession)(nil) +// Ensures that tslvTestSession implements the TestSession interface. +var _ TestSession = (*tslvTestSession)(nil) // tslvTestSession implements the DdTestSession interface and represents a session for a set of tests. type tslvTestSession struct { @@ -29,41 +30,55 @@ type tslvTestSession struct { command string workingDirectory string framework string + frameworkVersion string - modules map[string]DdTestModule + modules map[string]TestModule } -// CreateTestSession initializes a new test session. It automatically determines the command and working directory. -func CreateTestSession() DdTestSession { - wd, err := os.Getwd() - if err == nil { - wd = utils.GetRelativePathFromCITagsSourceRoot(wd) +// CreateTestSession initializes a new test session with the given command and working directory. +func CreateTestSession(options ...TestSessionStartOption) TestSession { + defaults := &tslvTestSessionStartOptions{} + for _, f := range options { + f(defaults) } - return CreateTestSessionWith(utils.GetCITags()[constants.TestCommand], wd, "", time.Now()) -} -// CreateTestSessionWith initializes a new test session with specified command, working directory, framework, and start time. -func CreateTestSessionWith(command string, workingDirectory string, framework string, startTime time.Time) DdTestSession { - // Ensure CI visibility is properly configured. - EnsureCiVisibilityInitialization() - - operationName := "test_session" - if framework != "" { - operationName = fmt.Sprintf("%s.%s", strings.ToLower(framework), operationName) + if defaults.command == "" { + defaults.command = utils.GetCITags()[constants.TestCommand] + } + if defaults.workingDirectory == "" { + wd, err := os.Getwd() + if err == nil { + wd = utils.GetRelativePathFromCITagsSourceRoot(wd) + } + defaults.workingDirectory = wd + } + if defaults.startTime.IsZero() { + defaults.startTime = time.Now() } - resourceName := fmt.Sprintf("%s.%s", operationName, command) + // Ensure CI visibility is properly configured. + EnsureCiVisibilityInitialization() sessionTags := []tracer.StartSpanOption{ tracer.Tag(constants.TestType, constants.TestTypeTest), - tracer.Tag(constants.TestCommand, command), - tracer.Tag(constants.TestCommandWorkingDirectory, workingDirectory), + tracer.Tag(constants.TestCommand, defaults.command), + tracer.Tag(constants.TestCommandWorkingDirectory, defaults.workingDirectory), } + operationName := "test_session" + if defaults.framework != "" { + operationName = fmt.Sprintf("%s.%s", strings.ToLower(defaults.framework), operationName) + sessionTags = append(sessionTags, + tracer.Tag(constants.TestFramework, defaults.framework), + tracer.Tag(constants.TestFrameworkVersion, defaults.frameworkVersion)) + } + + resourceName := fmt.Sprintf("%s.%s", operationName, defaults.command) + testOpts := append(fillCommonTags([]tracer.StartSpanOption{ tracer.ResourceName(resourceName), tracer.SpanType(constants.SpanTypeTestSession), - tracer.StartTime(startTime), + tracer.StartTime(defaults.startTime), }), sessionTags...) span, ctx := tracer.StartSpanFromContext(context.Background(), operationName, testOpts...) @@ -72,12 +87,13 @@ func CreateTestSessionWith(command string, workingDirectory string, framework st s := &tslvTestSession{ sessionID: sessionID, - command: command, - workingDirectory: workingDirectory, - framework: framework, - modules: map[string]DdTestModule{}, + command: defaults.command, + workingDirectory: defaults.workingDirectory, + framework: defaults.framework, + frameworkVersion: defaults.frameworkVersion, + modules: map[string]TestModule{}, ciVisibilityCommon: ciVisibilityCommon{ - startTime: startTime, + startTime: defaults.startTime, tags: sessionTags, span: span, ctx: ctx, @@ -87,9 +103,28 @@ func CreateTestSessionWith(command string, workingDirectory string, framework st // Ensure to close everything before CI visibility exits. In CI visibility mode, we try to never lose data. PushCiVisibilityCloseAction(func() { s.Close(1) }) + // Creating telemetry event created + testingEventType := telemetry.SessionEventType + if utils.GetCodeOwners() != nil { + testingEventType = append(testingEventType, telemetry.HasCodeOwnerEventType...) + } + + ciProviderName, hasCiProvider := utils.GetCITags()[constants.CIProviderName] + if !hasCiProvider { + testingEventType = append(testingEventType, telemetry.UnsupportedCiEventType...) + } + + // Write test session telemetry + telemetry.TestSession(ciProviderName) + telemetry.EventCreated(s.framework, testingEventType) return s } +// SessionID returns the ID of the test session. +func (t *tslvTestSession) SessionID() uint64 { + return t.sessionID +} + // Command returns the command used to run the test session. func (t *tslvTestSession) Command() string { return t.command } @@ -99,56 +134,74 @@ func (t *tslvTestSession) Framework() string { return t.framework } // WorkingDirectory returns the working directory of the test session. func (t *tslvTestSession) WorkingDirectory() string { return t.workingDirectory } -// Close closes the test session with the given exit code and sets the finish time to the current time. -func (t *tslvTestSession) Close(exitCode int) { t.CloseWithFinishTime(exitCode, time.Now()) } - -// CloseWithFinishTime closes the test session with the given exit code and finish time. -func (t *tslvTestSession) CloseWithFinishTime(exitCode int, finishTime time.Time) { +// Close closes the test session with the given exit code. +func (t *tslvTestSession) Close(exitCode int, options ...TestSessionCloseOption) { t.mutex.Lock() defer t.mutex.Unlock() if t.closed { return } + defaults := &tslvTestSessionCloseOptions{} + for _, f := range options { + f(defaults) + } + + if defaults.finishTime.IsZero() { + defaults.finishTime = time.Now() + } + for _, m := range t.modules { m.Close() } - t.modules = map[string]DdTestModule{} + t.modules = map[string]TestModule{} t.span.SetTag(constants.TestCommandExitCode, exitCode) if exitCode == 0 { t.span.SetTag(constants.TestStatus, constants.TestStatusPass) } else { - t.SetErrorInfo("ExitCode", "exit code is not zero.", "") + t.SetError(WithErrorInfo("ExitCode", "exit code is not zero.", "")) t.span.SetTag(constants.TestStatus, constants.TestStatusFail) } - t.span.Finish(tracer.FinishTime(finishTime)) + t.span.Finish(tracer.FinishTime(defaults.finishTime)) t.closed = true + // Creating telemetry event finished + testingEventType := telemetry.SessionEventType + if utils.GetCodeOwners() != nil { + testingEventType = append(testingEventType, telemetry.HasCodeOwnerEventType...) + } + if _, hasCiProvider := utils.GetCITags()[constants.CIProviderName]; !hasCiProvider { + testingEventType = append(testingEventType, telemetry.UnsupportedCiEventType...) + } + telemetry.EventFinished(t.framework, testingEventType) tracer.Flush() } -// GetOrCreateModule returns an existing module or creates a new one with the given name. -func (t *tslvTestSession) GetOrCreateModule(name string) DdTestModule { - return t.GetOrCreateModuleWithFramework(name, "", "") -} - -// GetOrCreateModuleWithFramework returns an existing module or creates a new one with the given name, framework, and framework version. -func (t *tslvTestSession) GetOrCreateModuleWithFramework(name string, framework string, frameworkVersion string) DdTestModule { - return t.GetOrCreateModuleWithFrameworkAndStartTime(name, framework, frameworkVersion, time.Now()) -} - -// GetOrCreateModuleWithFrameworkAndStartTime returns an existing module or creates a new one with the given name, framework, framework version, and start time. -func (t *tslvTestSession) GetOrCreateModuleWithFrameworkAndStartTime(name string, framework string, frameworkVersion string, startTime time.Time) DdTestModule { +// GetOrCreateModule returns an existing module or creates a new one with the given name, framework, framework version, and start time. +func (t *tslvTestSession) GetOrCreateModule(name string, options ...TestModuleStartOption) TestModule { t.mutex.Lock() defer t.mutex.Unlock() - var mod DdTestModule + defaults := &tslvTestModuleStartOptions{} + for _, f := range options { + f(defaults) + } + + if defaults.framework == "" { + defaults.framework = t.framework + defaults.frameworkVersion = t.frameworkVersion + } + if defaults.startTime.IsZero() { + defaults.startTime = time.Now() + } + + var mod TestModule if v, ok := t.modules[name]; ok { mod = v } else { - mod = createTestModule(t, name, framework, frameworkVersion, startTime) + mod = createTestModule(t, name, defaults.framework, defaults.frameworkVersion, defaults.startTime) t.modules[name] = mod } diff --git a/internal/civisibility/integrations/manual_api_ddtestsuite.go b/internal/civisibility/integrations/manual_api_ddtestsuite.go index 9a1857dd21..69a905515a 100644 --- a/internal/civisibility/integrations/manual_api_ddtestsuite.go +++ b/internal/civisibility/integrations/manual_api_ddtestsuite.go @@ -8,18 +8,20 @@ package integrations import ( "context" "fmt" + "slices" "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" ) // Test Suite -// Ensures that tslvTestSuite implements the DdTestSuite interface. -var _ DdTestSuite = (*tslvTestSuite)(nil) +// Ensures that tslvTestSuite implements the TestSuite interface. +var _ TestSuite = (*tslvTestSuite)(nil) // tslvTestSuite implements the DdTestSuite interface and represents a suite of tests within a module. type tslvTestSuite struct { @@ -30,7 +32,7 @@ type tslvTestSuite struct { } // createTestSuite initializes a new test suite within a given module. -func createTestSuite(module *tslvTestModule, name string, startTime time.Time) DdTestSuite { +func createTestSuite(module *tslvTestModule, name string, startTime time.Time) TestSuite { if module == nil { return nil } @@ -43,7 +45,7 @@ func createTestSuite(module *tslvTestModule, name string, startTime time.Time) D resourceName := name // Suite tags should include module and session tags so the backend can calculate the module and session fingerprint from the suite. - suiteTags := append(module.tags, tracer.Tag(constants.TestSuite, name)) + suiteTags := append(slices.Clone(module.tags), tracer.Tag(constants.TestSuite, name)) testOpts := append(fillCommonTags([]tracer.StartSpanOption{ tracer.ResourceName(resourceName), tracer.SpanType(constants.SpanTypeTestSuite), @@ -73,48 +75,62 @@ func createTestSuite(module *tslvTestModule, name string, startTime time.Time) D // Ensure to close everything before CI visibility exits. In CI visibility mode, we try to never lose data. PushCiVisibilityCloseAction(func() { suite.Close() }) + // Creating telemetry event created + telemetry.EventCreated(module.framework, telemetry.SuiteEventType) return suite } +// SuiteID returns the ID of the test suite. +func (t *tslvTestSuite) SuiteID() uint64 { + return t.suiteID +} + // Name returns the name of the test suite. func (t *tslvTestSuite) Name() string { return t.name } // Module returns the module to which the test suite belongs. -func (t *tslvTestSuite) Module() DdTestModule { return t.module } +func (t *tslvTestSuite) Module() TestModule { return t.module } -// Close closes the test suite and sets the finish time to the current time. -func (t *tslvTestSuite) Close() { t.CloseWithFinishTime(time.Now()) } - -// CloseWithFinishTime closes the test suite with the given finish time. -func (t *tslvTestSuite) CloseWithFinishTime(finishTime time.Time) { +// Close closes the test suite with the given finish time. +func (t *tslvTestSuite) Close(options ...TestSuiteCloseOption) { t.mutex.Lock() defer t.mutex.Unlock() if t.closed { return } - t.span.Finish(tracer.FinishTime(finishTime)) + defaults := &tslvTestSuiteCloseOptions{} + for _, opt := range options { + opt(defaults) + } + + if defaults.finishTime.IsZero() { + defaults.finishTime = time.Now() + } + + t.span.Finish(tracer.FinishTime(defaults.finishTime)) t.closed = true + + // Creating telemetry event finished + telemetry.EventFinished(t.module.framework, telemetry.SuiteEventType) } // SetError sets an error on the test suite and marks the module as having an error. -func (t *tslvTestSuite) SetError(err error) { - t.ciVisibilityCommon.SetError(err) +func (t *tslvTestSuite) SetError(options ...ErrorOption) { + t.ciVisibilityCommon.SetError(options...) t.Module().SetTag(ext.Error, true) } -// SetErrorInfo sets detailed error information on the test suite and marks the module as having an error. -func (t *tslvTestSuite) SetErrorInfo(errType string, message string, callstack string) { - t.ciVisibilityCommon.SetErrorInfo(errType, message, callstack) - t.Module().SetTag(ext.Error, true) -} +// CreateTest creates a new test within the suite. +func (t *tslvTestSuite) CreateTest(name string, options ...TestStartOption) Test { + defaults := &tslvTestStartOptions{} + for _, opt := range options { + opt(defaults) + } -// CreateTest creates a new test with the given name and sets the start time to the current time. -func (t *tslvTestSuite) CreateTest(name string) DdTest { - return t.CreateTestWithStartTime(name, time.Now()) -} + if defaults.startTime.IsZero() { + defaults.startTime = time.Now() + } -// CreateTestWithStartTime creates a new test with the given name and start time. -func (t *tslvTestSuite) CreateTestWithStartTime(name string, startTime time.Time) DdTest { - return createTest(t, name, startTime) + return createTest(t, name, defaults.startTime) } diff --git a/internal/civisibility/integrations/manual_api_mocktracer_test.go b/internal/civisibility/integrations/manual_api_mocktracer_test.go index ba27d37249..8dd6c05a6a 100644 --- a/internal/civisibility/integrations/manual_api_mocktracer_test.go +++ b/internal/civisibility/integrations/manual_api_mocktracer_test.go @@ -9,19 +9,24 @@ import ( "errors" "os" "runtime" + "sync" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/mocktracer" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" "github.com/stretchr/testify/assert" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/mocktracer" ) var mockTracer mocktracer.Tracer func TestMain(m *testing.M) { + // Avoid any backend calls during tests + additionalFeaturesInitializationOnce = sync.Once{} + additionalFeaturesInitializationOnce.Do(func() {}) + // Initialize civisibility using the mocktracer for testing mockTracer = InitializeCIVisibilityMock() @@ -29,34 +34,34 @@ func TestMain(m *testing.M) { os.Exit(m.Run()) } -func createDDTestSession(now time.Time) DdTestSession { - session := CreateTestSessionWith("my-command", "/tmp/wd", "my-testing-framework", now) +func createDDTestSession(now time.Time) TestSession { + session := CreateTestSession(WithTestSessionCommand("my-command"), WithTestSessionWorkingDirectory("/tmp/wd"), WithTestSessionFramework("my-testing-framework", "framework-version"), WithTestSessionStartTime(now)) session.SetTag("my-tag", "my-value") return session } -func createDDTestModule(now time.Time) (DdTestSession, DdTestModule) { +func createDDTestModule(now time.Time) (TestSession, TestModule) { session := createDDTestSession(now) - module := session.GetOrCreateModuleWithFrameworkAndStartTime("my-module", "my-module-framework", "framework-version", now) + module := session.GetOrCreateModule("my-module", WithTestModuleFramework("my-module-framework", "framework-version"), WithTestModuleStartTime(now)) module.SetTag("my-tag", "my-value") return session, module } -func createDDTestSuite(now time.Time) (DdTestSession, DdTestModule, DdTestSuite) { +func createDDTestSuite(now time.Time) (TestSession, TestModule, TestSuite) { session, module := createDDTestModule(now) - suite := module.GetOrCreateSuiteWithStartTime("my-suite", now) + suite := module.GetOrCreateSuite("my-suite", WithTestSuiteStartTime(now)) suite.SetTag("my-tag", "my-value") return session, module, suite } -func createDDTest(now time.Time) (DdTestSession, DdTestModule, DdTestSuite, DdTest) { +func createDDTest(now time.Time) (TestSession, TestModule, TestSuite, Test) { session, module, suite := createDDTestSuite(now) - test := suite.CreateTestWithStartTime("my-test", now) + test := suite.CreateTest("my-test", WithTestStartTime(now)) test.SetTag("my-tag", "my-value") return session, module, suite, test } -func commonAssertions(assert *assert.Assertions, sessionSpan mocktracer.Span) { +func commonAssertions(assert *assert.Assertions, sessionSpan *mocktracer.Span) { tags := map[string]interface{}{ "my-tag": "my-value", constants.Origin: constants.CIAppTestOrigin, @@ -76,7 +81,7 @@ func commonAssertions(assert *assert.Assertions, sessionSpan mocktracer.Span) { assert.Contains(spanTags, constants.GitCommitSHA) } -func TestSession(t *testing.T) { +func TestTestSession(t *testing.T) { mockTracer.Reset() assert := assert.New(t) @@ -86,7 +91,7 @@ func TestSession(t *testing.T) { assert.Equal("my-command", session.Command()) assert.Equal("/tmp/wd", session.WorkingDirectory()) assert.Equal("my-testing-framework", session.Framework()) - assert.Equal(now, session.StartTime()) + assert.Equal(now.Unix(), session.StartTime().Unix()) session.Close(42) @@ -98,18 +103,17 @@ func TestSession(t *testing.T) { session.Close(0) } -func sessionAssertions(assert *assert.Assertions, now time.Time, sessionSpan mocktracer.Span) { - assert.Equal(now, sessionSpan.StartTime()) +func sessionAssertions(assert *assert.Assertions, now time.Time, sessionSpan *mocktracer.Span) { + assert.Equal(now.Unix(), sessionSpan.StartTime().Unix()) assert.Equal("my-testing-framework.test_session", sessionSpan.OperationName()) tags := map[string]interface{}{ ext.ResourceName: "my-testing-framework.test_session.my-command", - ext.Error: true, ext.ErrorType: "ExitCode", ext.ErrorMsg: "exit code is not zero.", ext.SpanType: constants.SpanTypeTestSession, constants.TestStatus: constants.TestStatusFail, - constants.TestCommandExitCode: 42, + constants.TestCommandExitCode: float64(42), } spanTags := sessionSpan.Tags() @@ -119,19 +123,19 @@ func sessionAssertions(assert *assert.Assertions, now time.Time, sessionSpan moc commonAssertions(assert, sessionSpan) } -func TestModule(t *testing.T) { +func TestTestModule(t *testing.T) { mockTracer.Reset() assert := assert.New(t) now := time.Now() session, module := createDDTestModule(now) defer func() { session.Close(0) }() - module.SetErrorInfo("my-type", "my-message", "my-stack") + module.SetError(WithErrorInfo("my-type", "my-message", "my-stack")) assert.NotNil(module.Context()) assert.Equal("my-module", module.Name()) assert.Equal("my-module-framework", module.Framework()) - assert.Equal(now, module.StartTime()) + assert.Equal(now.Unix(), module.StartTime().Unix()) assert.Equal(session, module.Session()) module.Close() @@ -144,13 +148,12 @@ func TestModule(t *testing.T) { module.Close() } -func moduleAssertions(assert *assert.Assertions, now time.Time, moduleSpan mocktracer.Span) { - assert.Equal(now, moduleSpan.StartTime()) +func moduleAssertions(assert *assert.Assertions, now time.Time, moduleSpan *mocktracer.Span) { + assert.Equal(now.Unix(), moduleSpan.StartTime().Unix()) assert.Equal("my-module-framework.test_module", moduleSpan.OperationName()) tags := map[string]interface{}{ ext.ResourceName: "my-module", - ext.Error: true, ext.ErrorType: "my-type", ext.ErrorMsg: "my-message", ext.ErrorStack: "my-stack", @@ -166,7 +169,7 @@ func moduleAssertions(assert *assert.Assertions, now time.Time, moduleSpan mockt commonAssertions(assert, moduleSpan) } -func TestSuite(t *testing.T) { +func TestTestSuite(t *testing.T) { mockTracer.Reset() assert := assert.New(t) @@ -176,11 +179,11 @@ func TestSuite(t *testing.T) { session.Close(0) module.Close() }() - suite.SetErrorInfo("my-type", "my-message", "my-stack") + suite.SetError(WithErrorInfo("my-type", "my-message", "my-stack")) assert.NotNil(suite.Context()) assert.Equal("my-suite", suite.Name()) - assert.Equal(now, suite.StartTime()) + assert.Equal(now.Unix(), suite.StartTime().Unix()) assert.Equal(module, suite.Module()) suite.Close() @@ -193,13 +196,12 @@ func TestSuite(t *testing.T) { suite.Close() } -func suiteAssertions(assert *assert.Assertions, now time.Time, suiteSpan mocktracer.Span) { - assert.Equal(now, suiteSpan.StartTime()) +func suiteAssertions(assert *assert.Assertions, now time.Time, suiteSpan *mocktracer.Span) { + assert.Equal(now.Unix(), suiteSpan.StartTime().Unix()) assert.Equal("my-module-framework.test_suite", suiteSpan.OperationName()) tags := map[string]interface{}{ ext.ResourceName: "my-suite", - ext.Error: true, ext.ErrorType: "my-type", ext.ErrorMsg: "my-message", ext.ErrorStack: "my-stack", @@ -217,7 +219,7 @@ func suiteAssertions(assert *assert.Assertions, now time.Time, suiteSpan mocktra commonAssertions(assert, suiteSpan) } -func Test(t *testing.T) { +func TestTest(t *testing.T) { mockTracer.Reset() assert := assert.New(t) @@ -228,14 +230,14 @@ func Test(t *testing.T) { module.Close() suite.Close() }() - test.SetError(errors.New("we keep the last error")) - test.SetErrorInfo("my-type", "my-message", "my-stack") + test.SetError(WithError(errors.New("we keep the last error"))) + test.SetError(WithErrorInfo("my-type", "my-message", "my-stack")) pc, _, _, _ := runtime.Caller(0) test.SetTestFunc(runtime.FuncForPC(pc)) assert.NotNil(test.Context()) assert.Equal("my-test", test.Name()) - assert.Equal(now, test.StartTime()) + assert.Equal(now.Unix(), test.StartTime().Unix()) assert.Equal(suite, test.Suite()) test.Close(ResultStatusPass) @@ -259,8 +261,8 @@ func TestWithInnerFunc(t *testing.T) { module.Close() suite.Close() }() - test.SetError(errors.New("we keep the last error")) - test.SetErrorInfo("my-type", "my-message", "my-stack") + test.SetError(WithError(errors.New("we keep the last error"))) + test.SetError(WithErrorInfo("my-type", "my-message", "my-stack")) func() { pc, _, _, _ := runtime.Caller(0) test.SetTestFunc(runtime.FuncForPC(pc)) @@ -281,13 +283,12 @@ func TestWithInnerFunc(t *testing.T) { test.Close(ResultStatusSkip) } -func testAssertions(assert *assert.Assertions, now time.Time, testSpan mocktracer.Span) { - assert.Equal(now, testSpan.StartTime()) +func testAssertions(assert *assert.Assertions, now time.Time, testSpan *mocktracer.Span) { + assert.Equal(now.Unix(), testSpan.StartTime().Unix()) assert.Equal("my-module-framework.test", testSpan.OperationName()) tags := map[string]interface{}{ ext.ResourceName: "my-suite.my-test", - ext.Error: true, ext.ErrorType: "my-type", ext.ErrorMsg: "my-message", ext.ErrorStack: "my-stack", @@ -309,8 +310,13 @@ func testAssertions(assert *assert.Assertions, now time.Time, testSpan mocktrace // make sure we have both start and end line assert.Contains(spanTags, constants.TestSourceStartLine) assert.Contains(spanTags, constants.TestSourceEndLine) + // make sure the startLine < endLine - assert.Less(spanTags[constants.TestSourceStartLine].(int), spanTags[constants.TestSourceEndLine].(int)) + if startLine, startLineOk := spanTags[constants.TestSourceStartLine].(float64); startLineOk { + if endLine, endLineOk := spanTags[constants.TestSourceEndLine].(float64); endLineOk { + assert.Less(startLine, endLine) + } + } commonAssertions(assert, testSpan) } diff --git a/internal/civisibility/integrations/manual_api_test.go b/internal/civisibility/integrations/manual_api_test.go index 2bb0a4ecb3..fced12461e 100644 --- a/internal/civisibility/integrations/manual_api_test.go +++ b/internal/civisibility/integrations/manual_api_test.go @@ -30,44 +30,42 @@ func (m *MockDdTslvEvent) StartTime() time.Time { return args.Get(0).(time.Time) } -func (m *MockDdTslvEvent) SetError(err error) { - m.Called(err) -} - -func (m *MockDdTslvEvent) SetErrorInfo(errType string, message string, callstack string) { - m.Called(errType, message, callstack) +func (m *MockDdTslvEvent) SetError(options ...ErrorOption) { + m.Called(options) } func (m *MockDdTslvEvent) SetTag(key string, value interface{}) { m.Called(key, value) } +func (m *MockDdTslvEvent) GetTag(key string) (interface{}, bool) { + args := m.Called(key) + return args.Get(0), true +} + // Mocking the DdTest interface type MockDdTest struct { MockDdTslvEvent mock.Mock } -func (m *MockDdTest) Name() string { +func (m *MockDdTest) TestID() uint64 { args := m.Called() - return args.String(0) + return args.Get(0).(uint64) } -func (m *MockDdTest) Suite() DdTestSuite { +func (m *MockDdTest) Name() string { args := m.Called() - return args.Get(0).(DdTestSuite) -} - -func (m *MockDdTest) Close(status TestResultStatus) { - m.Called(status) + return args.String(0) } -func (m *MockDdTest) CloseWithFinishTime(status TestResultStatus, finishTime time.Time) { - m.Called(status, finishTime) +func (m *MockDdTest) Suite() TestSuite { + args := m.Called() + return args.Get(0).(TestSuite) } -func (m *MockDdTest) CloseWithFinishTimeAndSkipReason(status TestResultStatus, finishTime time.Time, skipReason string) { - m.Called(status, finishTime, skipReason) +func (m *MockDdTest) Close(status TestResultStatus, options ...TestCloseOption) { + m.Called(status, options) } func (m *MockDdTest) SetTestFunc(fn *runtime.Func) { @@ -78,12 +76,21 @@ func (m *MockDdTest) SetBenchmarkData(measureType string, data map[string]any) { m.Called(measureType, data) } +func (m *MockDdTest) Log(message string, tags string) { + m.Called(message, tags) +} + // Mocking the DdTestSession interface type MockDdTestSession struct { MockDdTslvEvent mock.Mock } +func (m *MockDdTestSession) SessionID() uint64 { + args := m.Called() + return args.Get(0).(uint64) +} + func (m *MockDdTestSession) Command() string { args := m.Called() return args.String(0) @@ -99,27 +106,13 @@ func (m *MockDdTestSession) WorkingDirectory() string { return args.String(0) } -func (m *MockDdTestSession) Close(exitCode int) { - m.Called(exitCode) -} - -func (m *MockDdTestSession) CloseWithFinishTime(exitCode int, finishTime time.Time) { - m.Called(exitCode, finishTime) +func (m *MockDdTestSession) Close(exitCode int, options ...TestSessionCloseOption) { + m.Called(exitCode, options) } -func (m *MockDdTestSession) GetOrCreateModule(name string) DdTestModule { - args := m.Called(name) - return args.Get(0).(DdTestModule) -} - -func (m *MockDdTestSession) GetOrCreateModuleWithFramework(name string, framework string, frameworkVersion string) DdTestModule { - args := m.Called(name, framework, frameworkVersion) - return args.Get(0).(DdTestModule) -} - -func (m *MockDdTestSession) GetOrCreateModuleWithFrameworkAndStartTime(name string, framework string, frameworkVersion string, startTime time.Time) DdTestModule { - args := m.Called(name, framework, frameworkVersion, startTime) - return args.Get(0).(DdTestModule) +func (m *MockDdTestSession) GetOrCreateModule(name string, options ...TestModuleStartOption) TestModule { + args := m.Called(name, options) + return args.Get(0).(TestModule) } // Mocking the DdTestModule interface @@ -128,9 +121,14 @@ type MockDdTestModule struct { mock.Mock } -func (m *MockDdTestModule) Session() DdTestSession { +func (m *MockDdTestModule) ModuleID() uint64 { args := m.Called() - return args.Get(0).(DdTestSession) + return args.Get(0).(uint64) +} + +func (m *MockDdTestModule) Session() TestSession { + args := m.Called() + return args.Get(0).(TestSession) } func (m *MockDdTestModule) Framework() string { @@ -143,22 +141,18 @@ func (m *MockDdTestModule) Name() string { return args.String(0) } -func (m *MockDdTestModule) Close() { - m.Called() -} - -func (m *MockDdTestModule) CloseWithFinishTime(finishTime time.Time) { - m.Called(finishTime) +func (m *MockDdTestModule) Close(options ...TestModuleCloseOption) { + m.Called(options) } -func (m *MockDdTestModule) GetOrCreateSuite(name string) DdTestSuite { - args := m.Called(name) - return args.Get(0).(DdTestSuite) +func (m *MockDdTestModule) GetOrCreateSuite(name string, options ...TestSuiteStartOption) TestSuite { + args := m.Called(name, options) + return args.Get(0).(TestSuite) } -func (m *MockDdTestModule) GetOrCreateSuiteWithStartTime(name string, startTime time.Time) DdTestSuite { +func (m *MockDdTestModule) GetOrCreateSuiteWithStartTime(name string, startTime time.Time) TestSuite { args := m.Called(name, startTime) - return args.Get(0).(DdTestSuite) + return args.Get(0).(TestSuite) } // Mocking the DdTestSuite interface @@ -167,32 +161,28 @@ type MockDdTestSuite struct { mock.Mock } -func (m *MockDdTestSuite) Module() DdTestModule { +func (m *MockDdTestSuite) SuiteID() uint64 { args := m.Called() - return args.Get(0).(DdTestModule) + return args.Get(0).(uint64) } -func (m *MockDdTestSuite) Name() string { +func (m *MockDdTestSuite) Module() TestModule { args := m.Called() - return args.String(0) -} - -func (m *MockDdTestSuite) Close() { - m.Called() + return args.Get(0).(TestModule) } -func (m *MockDdTestSuite) CloseWithFinishTime(finishTime time.Time) { - m.Called(finishTime) +func (m *MockDdTestSuite) Name() string { + args := m.Called() + return args.String(0) } -func (m *MockDdTestSuite) CreateTest(name string) DdTest { - args := m.Called(name) - return args.Get(0).(DdTest) +func (m *MockDdTestSuite) Close(options ...TestSuiteCloseOption) { + m.Called(options) } -func (m *MockDdTestSuite) CreateTestWithStartTime(name string, startTime time.Time) DdTest { - args := m.Called(name, startTime) - return args.Get(0).(DdTest) +func (m *MockDdTestSuite) CreateTest(name string, options ...TestStartOption) Test { + args := m.Called(name, options) + return args.Get(0).(Test) } // Unit tests @@ -201,35 +191,32 @@ func TestDdTestSession(t *testing.T) { mockSession.On("Command").Return("test-command") mockSession.On("Framework").Return("test-framework") mockSession.On("WorkingDirectory").Return("/path/to/working/dir") - mockSession.On("Close", 0).Return() - mockSession.On("CloseWithFinishTime", 0, mock.Anything).Return() - mockSession.On("GetOrCreateModule", "test-module").Return(new(MockDdTestModule)) - mockSession.On("GetOrCreateModuleWithFramework", "test-module", "test-framework", "1.0").Return(new(MockDdTestModule)) - mockSession.On("GetOrCreateModuleWithFrameworkAndStartTime", "test-module", "test-framework", "1.0", mock.Anything).Return(new(MockDdTestModule)) + mockSession.On("Close", 0, mock.Anything).Return() + mockSession.On("GetOrCreateModule", "test-module", mock.Anything).Return(new(MockDdTestModule)) - session := (DdTestSession)(mockSession) + session := (TestSession)(mockSession) assert.Equal(t, "test-command", session.Command()) assert.Equal(t, "test-framework", session.Framework()) assert.Equal(t, "/path/to/working/dir", session.WorkingDirectory()) session.Close(0) - mockSession.AssertCalled(t, "Close", 0) + mockSession.AssertCalled(t, "Close", 0, mock.Anything) now := time.Now() - session.CloseWithFinishTime(0, now) - mockSession.AssertCalled(t, "CloseWithFinishTime", 0, now) + session.Close(0, WithTestSessionFinishTime(now)) + mockSession.AssertCalled(t, "Close", 0, mock.Anything) module := session.GetOrCreateModule("test-module") assert.NotNil(t, module) - mockSession.AssertCalled(t, "GetOrCreateModule", "test-module") + mockSession.AssertCalled(t, "GetOrCreateModule", "test-module", mock.Anything) - module = session.GetOrCreateModuleWithFramework("test-module", "test-framework", "1.0") + module = session.GetOrCreateModule("test-module", WithTestModuleFramework("test-framework", "1.0")) assert.NotNil(t, module) - mockSession.AssertCalled(t, "GetOrCreateModuleWithFramework", "test-module", "test-framework", "1.0") + mockSession.AssertCalled(t, "GetOrCreateModule", "test-module", mock.Anything) - module = session.GetOrCreateModuleWithFrameworkAndStartTime("test-module", "test-framework", "1.0", now) + module = session.GetOrCreateModule("test-module", WithTestModuleFramework("test-framework", "1.0"), WithTestModuleStartTime(now)) assert.NotNil(t, module) - mockSession.AssertCalled(t, "GetOrCreateModuleWithFrameworkAndStartTime", "test-module", "test-framework", "1.0", now) + mockSession.AssertCalled(t, "GetOrCreateModule", "test-module", mock.Anything) } func TestDdTestModule(t *testing.T) { @@ -237,72 +224,66 @@ func TestDdTestModule(t *testing.T) { mockModule.On("Session").Return(new(MockDdTestSession)) mockModule.On("Framework").Return("test-framework") mockModule.On("Name").Return("test-module") - mockModule.On("Close").Return() - mockModule.On("CloseWithFinishTime", mock.Anything).Return() - mockModule.On("GetOrCreateSuite", "test-suite").Return(new(MockDdTestSuite)) - mockModule.On("GetOrCreateSuiteWithStartTime", "test-suite", mock.Anything).Return(new(MockDdTestSuite)) + mockModule.On("Close", mock.Anything).Return() + mockModule.On("GetOrCreateSuite", "test-suite", mock.Anything).Return(new(MockDdTestSuite)) - module := (DdTestModule)(mockModule) + module := (TestModule)(mockModule) assert.Equal(t, "test-framework", module.Framework()) assert.Equal(t, "test-module", module.Name()) module.Close() - mockModule.AssertCalled(t, "Close") + mockModule.AssertCalled(t, "Close", mock.Anything) now := time.Now() - module.CloseWithFinishTime(now) - mockModule.AssertCalled(t, "CloseWithFinishTime", now) + module.Close(WithTestModuleFinishTime(now)) + mockModule.AssertCalled(t, "Close", mock.Anything) suite := module.GetOrCreateSuite("test-suite") assert.NotNil(t, suite) - mockModule.AssertCalled(t, "GetOrCreateSuite", "test-suite") + mockModule.AssertCalled(t, "GetOrCreateSuite", "test-suite", mock.Anything) - suite = module.GetOrCreateSuiteWithStartTime("test-suite", now) + suite = module.GetOrCreateSuite("test-suite", WithTestSuiteStartTime(now)) assert.NotNil(t, suite) - mockModule.AssertCalled(t, "GetOrCreateSuiteWithStartTime", "test-suite", now) + mockModule.AssertCalled(t, "GetOrCreateSuite", "test-suite", mock.Anything) } func TestDdTestSuite(t *testing.T) { mockSuite := new(MockDdTestSuite) mockSuite.On("Module").Return(new(MockDdTestModule)) mockSuite.On("Name").Return("test-suite") - mockSuite.On("Close").Return() - mockSuite.On("CloseWithFinishTime", mock.Anything).Return() - mockSuite.On("CreateTest", "test-name").Return(new(MockDdTest)) - mockSuite.On("CreateTestWithStartTime", "test-name", mock.Anything).Return(new(MockDdTest)) + mockSuite.On("Close", mock.Anything).Return() + mockSuite.On("CreateTest", "test-name", mock.Anything).Return(new(MockDdTest)) - suite := (DdTestSuite)(mockSuite) + suite := (TestSuite)(mockSuite) assert.Equal(t, "test-suite", suite.Name()) suite.Close() - mockSuite.AssertCalled(t, "Close") + mockSuite.AssertCalled(t, "Close", mock.Anything) now := time.Now() - suite.CloseWithFinishTime(now) - mockSuite.AssertCalled(t, "CloseWithFinishTime", now) + suite.Close(WithTestSuiteFinishTime(now)) + mockSuite.AssertCalled(t, "Close", mock.Anything) test := suite.CreateTest("test-name") assert.NotNil(t, test) - mockSuite.AssertCalled(t, "CreateTest", "test-name") + mockSuite.AssertCalled(t, "CreateTest", "test-name", mock.Anything) - test = suite.CreateTestWithStartTime("test-name", now) + test = suite.CreateTest("test-name", WithTestStartTime(now)) assert.NotNil(t, test) - mockSuite.AssertCalled(t, "CreateTestWithStartTime", "test-name", now) + mockSuite.AssertCalled(t, "CreateTest", "test-name", mock.Anything) } func TestDdTest(t *testing.T) { mockTest := new(MockDdTest) mockTest.On("Name").Return("test-name") mockTest.On("Suite").Return(new(MockDdTestSuite)) - mockTest.On("Close", ResultStatusPass).Return() - mockTest.On("CloseWithFinishTime", ResultStatusPass, mock.Anything).Return() - mockTest.On("CloseWithFinishTimeAndSkipReason", ResultStatusSkip, mock.Anything, "SkipReason").Return() + mockTest.On("Close", mock.Anything, mock.Anything).Return() mockTest.On("SetTestFunc", mock.Anything).Return() mockTest.On("SetBenchmarkData", "measure-type", mock.Anything).Return() - test := (DdTest)(mockTest) + test := (Test)(mockTest) assert.Equal(t, "test-name", test.Name()) @@ -310,15 +291,15 @@ func TestDdTest(t *testing.T) { assert.NotNil(t, suite) test.Close(ResultStatusPass) - mockTest.AssertCalled(t, "Close", ResultStatusPass) + mockTest.AssertCalled(t, "Close", ResultStatusPass, mock.Anything) now := time.Now() - test.CloseWithFinishTime(ResultStatusPass, now) - mockTest.AssertCalled(t, "CloseWithFinishTime", ResultStatusPass, now) + test.Close(ResultStatusPass, WithTestFinishTime(now)) + mockTest.AssertCalled(t, "Close", ResultStatusPass, mock.Anything) skipReason := "SkipReason" - test.CloseWithFinishTimeAndSkipReason(ResultStatusSkip, now, skipReason) - mockTest.AssertCalled(t, "CloseWithFinishTimeAndSkipReason", ResultStatusSkip, now, skipReason) + test.Close(ResultStatusSkip, WithTestFinishTime(now), WithTestSkipReason(skipReason)) + mockTest.AssertCalled(t, "Close", ResultStatusSkip, mock.Anything) test.SetTestFunc(nil) mockTest.AssertCalled(t, "SetTestFunc", (*runtime.Func)(nil)) diff --git a/internal/civisibility/utils/ci_providers.go b/internal/civisibility/utils/ci_providers.go index 17f0f304ad..7ad0b6fc8a 100644 --- a/internal/civisibility/utils/ci_providers.go +++ b/internal/civisibility/utils/ci_providers.go @@ -13,8 +13,9 @@ import ( "sort" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // providerType defines a function type that returns a map of string key-value pairs. @@ -36,13 +37,14 @@ var providers = map[string]providerType{ "BITRISE_BUILD_SLUG": extractBitrise, "CF_BUILD_ID": extractCodefresh, "CODEBUILD_INITIATOR": extractAwsCodePipeline, + "DRONE": extractDrone, } // getEnvVarsJSON returns a JSON representation of the specified environment variables. func getEnvVarsJSON(envVars ...string) ([]byte, error) { envVarsMap := make(map[string]string) for _, envVar := range envVars { - value := os.Getenv(envVar) + value := env.Get(envVar) if value != "" { envVarsMap[envVar] = value } @@ -54,7 +56,7 @@ func getEnvVarsJSON(envVars ...string) ([]byte, error) { func getProviderTags() map[string]string { tags := map[string]string{} for key, provider := range providers { - if _, ok := os.LookupEnv(key); !ok { + if _, ok := env.Lookup(key); !ok { continue } tags = provider() @@ -80,7 +82,7 @@ func getProviderTags() map[string]string { if log.DebugEnabled() { if providerName, ok := tags[constants.CIProviderName]; ok { - log.Debug("civisibility: detected ci provider: %v", providerName) + log.Debug("civisibility: detected ci provider: %s", providerName) } else { log.Debug("civisibility: no ci provider was detected.") } @@ -100,6 +102,9 @@ func normalizeTags(tags map[string]string) { if tag, ok := tags[constants.GitTag]; ok && tag != "" { tags[constants.GitTag] = normalizeRef(tag) } + if tag, ok := tags[constants.GitPrBaseBranch]; ok && tag != "" { + tags[constants.GitPrBaseBranch] = normalizeRef(tag) + } if tag, ok := tags[constants.GitRepositoryURL]; ok && tag != "" { tags[constants.GitRepositoryURL] = filterSensitiveInfo(tag) } @@ -131,11 +136,13 @@ func replaceWithUserSpecificTags(tags map[string]string) { replace(constants.GitCommitCommitterName, "DD_GIT_COMMIT_COMMITTER_NAME") replace(constants.GitCommitCommitterEmail, "DD_GIT_COMMIT_COMMITTER_EMAIL") replace(constants.GitCommitCommitterDate, "DD_GIT_COMMIT_COMMITTER_DATE") + replace(constants.GitPrBaseBranch, "DD_GIT_PULL_REQUEST_BASE_BRANCH") + replace(constants.GitPrBaseCommit, "DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA") } // getEnvironmentVariableIfIsNotEmpty returns the environment variable value if it is not empty, otherwise returns the default value. func getEnvironmentVariableIfIsNotEmpty(key string, defaultValue string) string { - if value, ok := os.LookupEnv(key); ok && value != "" { + if value, ok := env.Lookup(key); ok && value != "" { return value } return defaultValue @@ -158,7 +165,7 @@ func normalizeRef(name string) string { // firstEnv returns the value of the first non-empty environment variable from the provided list. func firstEnv(keys ...string) string { for _, key := range keys { - if value, ok := os.LookupEnv(key); ok { + if value, ok := env.Lookup(key); ok { if value != "" { return value } @@ -170,36 +177,41 @@ func firstEnv(keys ...string) string { // extractAppveyor extracts CI information specific to Appveyor. func extractAppveyor() map[string]string { tags := map[string]string{} - url := fmt.Sprintf("https://ci.appveyor.com/project/%s/builds/%s", os.Getenv("APPVEYOR_REPO_NAME"), os.Getenv("APPVEYOR_BUILD_ID")) + url := fmt.Sprintf("https://ci.appveyor.com/project/%s/builds/%s", env.Get("APPVEYOR_REPO_NAME"), env.Get("APPVEYOR_BUILD_ID")) tags[constants.CIProviderName] = "appveyor" - if os.Getenv("APPVEYOR_REPO_PROVIDER") == "github" { - tags[constants.GitRepositoryURL] = fmt.Sprintf("https://github.com/%s.git", os.Getenv("APPVEYOR_REPO_NAME")) + if env.Get("APPVEYOR_REPO_PROVIDER") == "github" { + tags[constants.GitRepositoryURL] = fmt.Sprintf("https://github.com/%s.git", env.Get("APPVEYOR_REPO_NAME")) } else { - tags[constants.GitRepositoryURL] = os.Getenv("APPVEYOR_REPO_NAME") + tags[constants.GitRepositoryURL] = env.Get("APPVEYOR_REPO_NAME") } - tags[constants.GitCommitSHA] = os.Getenv("APPVEYOR_REPO_COMMIT") + tags[constants.GitCommitSHA] = env.Get("APPVEYOR_REPO_COMMIT") tags[constants.GitBranch] = firstEnv("APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH", "APPVEYOR_REPO_BRANCH") - tags[constants.GitTag] = os.Getenv("APPVEYOR_REPO_TAG_NAME") + tags[constants.GitTag] = env.Get("APPVEYOR_REPO_TAG_NAME") - tags[constants.CIWorkspacePath] = os.Getenv("APPVEYOR_BUILD_FOLDER") - tags[constants.CIPipelineID] = os.Getenv("APPVEYOR_BUILD_ID") - tags[constants.CIPipelineName] = os.Getenv("APPVEYOR_REPO_NAME") - tags[constants.CIPipelineNumber] = os.Getenv("APPVEYOR_BUILD_NUMBER") + tags[constants.CIWorkspacePath] = env.Get("APPVEYOR_BUILD_FOLDER") + tags[constants.CIPipelineID] = env.Get("APPVEYOR_BUILD_ID") + tags[constants.CIPipelineName] = env.Get("APPVEYOR_REPO_NAME") + tags[constants.CIPipelineNumber] = env.Get("APPVEYOR_BUILD_NUMBER") tags[constants.CIPipelineURL] = url tags[constants.CIJobURL] = url - tags[constants.GitCommitMessage] = fmt.Sprintf("%s\n%s", os.Getenv("APPVEYOR_REPO_COMMIT_MESSAGE"), os.Getenv("APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED")) - tags[constants.GitCommitAuthorName] = os.Getenv("APPVEYOR_REPO_COMMIT_AUTHOR") - tags[constants.GitCommitAuthorEmail] = os.Getenv("APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL") + tags[constants.GitCommitMessage] = fmt.Sprintf("%s\n%s", env.Get("APPVEYOR_REPO_COMMIT_MESSAGE"), env.Get("APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED")) + tags[constants.GitCommitAuthorName] = env.Get("APPVEYOR_REPO_COMMIT_AUTHOR") + tags[constants.GitCommitAuthorEmail] = env.Get("APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL") + + tags[constants.GitPrBaseBranch] = env.Get("APPVEYOR_REPO_BRANCH") + tags[constants.GitHeadCommit] = env.Get("APPVEYOR_PULL_REQUEST_HEAD_COMMIT") + tags[constants.PrNumber] = env.Get("APPVEYOR_PULL_REQUEST_NUMBER") + return tags } // extractAzurePipelines extracts CI information specific to Azure Pipelines. func extractAzurePipelines() map[string]string { tags := map[string]string{} - baseURL := fmt.Sprintf("%s%s/_build/results?buildId=%s", os.Getenv("SYSTEM_TEAMFOUNDATIONSERVERURI"), os.Getenv("SYSTEM_TEAMPROJECTID"), os.Getenv("BUILD_BUILDID")) + baseURL := fmt.Sprintf("%s%s/_build/results?buildId=%s", env.Get("SYSTEM_TEAMFOUNDATIONSERVERURI"), env.Get("SYSTEM_TEAMPROJECTID"), env.Get("BUILD_BUILDID")) pipelineURL := baseURL - jobURL := fmt.Sprintf("%s&view=logs&j=%s&t=%s", baseURL, os.Getenv("SYSTEM_JOBID"), os.Getenv("SYSTEM_TASKINSTANCEID")) + jobURL := fmt.Sprintf("%s&view=logs&j=%s&t=%s", baseURL, env.Get("SYSTEM_JOBID"), env.Get("SYSTEM_TASKINSTANCEID")) branchOrTag := firstEnv("SYSTEM_PULLREQUEST_SOURCEBRANCH", "BUILD_SOURCEBRANCH", "BUILD_SOURCEBRANCHNAME") branch := "" tag := "" @@ -209,31 +221,35 @@ func extractAzurePipelines() map[string]string { branch = branchOrTag } tags[constants.CIProviderName] = "azurepipelines" - tags[constants.CIWorkspacePath] = os.Getenv("BUILD_SOURCESDIRECTORY") + tags[constants.CIWorkspacePath] = env.Get("BUILD_SOURCESDIRECTORY") - tags[constants.CIPipelineID] = os.Getenv("BUILD_BUILDID") - tags[constants.CIPipelineName] = os.Getenv("BUILD_DEFINITIONNAME") - tags[constants.CIPipelineNumber] = os.Getenv("BUILD_BUILDID") + tags[constants.CIPipelineID] = env.Get("BUILD_BUILDID") + tags[constants.CIPipelineName] = env.Get("BUILD_DEFINITIONNAME") + tags[constants.CIPipelineNumber] = env.Get("BUILD_BUILDID") tags[constants.CIPipelineURL] = pipelineURL - tags[constants.CIStageName] = os.Getenv("SYSTEM_STAGEDISPLAYNAME") + tags[constants.CIStageName] = env.Get("SYSTEM_STAGEDISPLAYNAME") - tags[constants.CIJobName] = os.Getenv("SYSTEM_JOBDISPLAYNAME") + tags[constants.CIJobID] = env.Get("SYSTEM_JOBID") + tags[constants.CIJobName] = env.Get("SYSTEM_JOBDISPLAYNAME") tags[constants.CIJobURL] = jobURL tags[constants.GitRepositoryURL] = firstEnv("SYSTEM_PULLREQUEST_SOURCEREPOSITORYURI", "BUILD_REPOSITORY_URI") tags[constants.GitCommitSHA] = firstEnv("SYSTEM_PULLREQUEST_SOURCECOMMITID", "BUILD_SOURCEVERSION") tags[constants.GitBranch] = branch tags[constants.GitTag] = tag - tags[constants.GitCommitMessage] = os.Getenv("BUILD_SOURCEVERSIONMESSAGE") - tags[constants.GitCommitAuthorName] = os.Getenv("BUILD_REQUESTEDFORID") - tags[constants.GitCommitAuthorEmail] = os.Getenv("BUILD_REQUESTEDFOREMAIL") + tags[constants.GitCommitMessage] = env.Get("BUILD_SOURCEVERSIONMESSAGE") + tags[constants.GitCommitAuthorName] = env.Get("BUILD_REQUESTEDFORID") + tags[constants.GitCommitAuthorEmail] = env.Get("BUILD_REQUESTEDFOREMAIL") jsonString, err := getEnvVarsJSON("SYSTEM_TEAMPROJECTID", "BUILD_BUILDID", "SYSTEM_JOBID") if err == nil { tags[constants.CIEnvVars] = string(jsonString) } + tags[constants.GitPrBaseBranch] = env.Get("SYSTEM_PULLREQUEST_TARGETBRANCH") + tags[constants.PrNumber] = env.Get("SYSTEM_PULLREQUEST_PULLREQUESTNUMBER") + return tags } @@ -241,34 +257,42 @@ func extractAzurePipelines() map[string]string { func extractBitrise() map[string]string { tags := map[string]string{} tags[constants.CIProviderName] = "bitrise" - tags[constants.GitRepositoryURL] = os.Getenv("GIT_REPOSITORY_URL") + tags[constants.GitRepositoryURL] = env.Get("GIT_REPOSITORY_URL") tags[constants.GitCommitSHA] = firstEnv("BITRISE_GIT_COMMIT", "GIT_CLONE_COMMIT_HASH") - tags[constants.GitBranch] = firstEnv("BITRISEIO_GIT_BRANCH_DEST", "BITRISE_GIT_BRANCH") - tags[constants.GitTag] = os.Getenv("BITRISE_GIT_TAG") - tags[constants.CIWorkspacePath] = os.Getenv("BITRISE_SOURCE_DIR") - tags[constants.CIPipelineID] = os.Getenv("BITRISE_BUILD_SLUG") - tags[constants.CIPipelineName] = os.Getenv("BITRISE_TRIGGERED_WORKFLOW_ID") - tags[constants.CIPipelineNumber] = os.Getenv("BITRISE_BUILD_NUMBER") - tags[constants.CIPipelineURL] = os.Getenv("BITRISE_BUILD_URL") - tags[constants.GitCommitMessage] = os.Getenv("BITRISE_GIT_MESSAGE") + tags[constants.GitBranch] = firstEnv("BITRISEIO_PULL_REQUEST_HEAD_BRANCH", "BITRISE_GIT_BRANCH") + tags[constants.GitTag] = env.Get("BITRISE_GIT_TAG") + tags[constants.CIWorkspacePath] = env.Get("BITRISE_SOURCE_DIR") + tags[constants.CIPipelineID] = env.Get("BITRISE_BUILD_SLUG") + tags[constants.CIPipelineName] = env.Get("BITRISE_TRIGGERED_WORKFLOW_ID") + tags[constants.CIPipelineNumber] = env.Get("BITRISE_BUILD_NUMBER") + tags[constants.CIPipelineURL] = env.Get("BITRISE_BUILD_URL") + tags[constants.GitCommitMessage] = env.Get("BITRISE_GIT_MESSAGE") + + tags[constants.GitPrBaseBranch] = env.Get("BITRISEIO_GIT_BRANCH_DEST") + tags[constants.PrNumber] = env.Get("BITRISE_PULL_REQUEST") + return tags } // extractBitbucket extracts CI information specific to Bitbucket. func extractBitbucket() map[string]string { tags := map[string]string{} - url := fmt.Sprintf("https://bitbucket.org/%s/addon/pipelines/home#!/results/%s", os.Getenv("BITBUCKET_REPO_FULL_NAME"), os.Getenv("BITBUCKET_BUILD_NUMBER")) + url := fmt.Sprintf("https://bitbucket.org/%s/addon/pipelines/home#!/results/%s", env.Get("BITBUCKET_REPO_FULL_NAME"), env.Get("BITBUCKET_BUILD_NUMBER")) tags[constants.CIProviderName] = "bitbucket" tags[constants.GitRepositoryURL] = firstEnv("BITBUCKET_GIT_SSH_ORIGIN", "BITBUCKET_GIT_HTTP_ORIGIN") - tags[constants.GitCommitSHA] = os.Getenv("BITBUCKET_COMMIT") - tags[constants.GitBranch] = os.Getenv("BITBUCKET_BRANCH") - tags[constants.GitTag] = os.Getenv("BITBUCKET_TAG") - tags[constants.CIWorkspacePath] = os.Getenv("BITBUCKET_CLONE_DIR") - tags[constants.CIPipelineID] = strings.Trim(os.Getenv("BITBUCKET_PIPELINE_UUID"), "{}") - tags[constants.CIPipelineNumber] = os.Getenv("BITBUCKET_BUILD_NUMBER") - tags[constants.CIPipelineName] = os.Getenv("BITBUCKET_REPO_FULL_NAME") + tags[constants.GitCommitSHA] = env.Get("BITBUCKET_COMMIT") + tags[constants.GitBranch] = env.Get("BITBUCKET_BRANCH") + tags[constants.GitTag] = env.Get("BITBUCKET_TAG") + tags[constants.CIWorkspacePath] = env.Get("BITBUCKET_CLONE_DIR") + tags[constants.CIPipelineID] = strings.Trim(env.Get("BITBUCKET_PIPELINE_UUID"), "{}") + tags[constants.CIPipelineNumber] = env.Get("BITBUCKET_BUILD_NUMBER") + tags[constants.CIPipelineName] = env.Get("BITBUCKET_REPO_FULL_NAME") tags[constants.CIPipelineURL] = url tags[constants.CIJobURL] = url + + tags[constants.GitPrBaseBranch] = env.Get("BITBUCKET_PR_DESTINATION_BRANCH") + tags[constants.PrNumber] = env.Get("BITBUCKET_PR_ID") + return tags } @@ -276,38 +300,43 @@ func extractBitbucket() map[string]string { func extractBuddy() map[string]string { tags := map[string]string{} tags[constants.CIProviderName] = "buddy" - tags[constants.CIPipelineID] = fmt.Sprintf("%s/%s", os.Getenv("BUDDY_PIPELINE_ID"), os.Getenv("BUDDY_EXECUTION_ID")) - tags[constants.CIPipelineName] = os.Getenv("BUDDY_PIPELINE_NAME") - tags[constants.CIPipelineNumber] = os.Getenv("BUDDY_EXECUTION_ID") - tags[constants.CIPipelineURL] = os.Getenv("BUDDY_EXECUTION_URL") - tags[constants.GitCommitSHA] = os.Getenv("BUDDY_EXECUTION_REVISION") - tags[constants.GitRepositoryURL] = os.Getenv("BUDDY_SCM_URL") - tags[constants.GitBranch] = os.Getenv("BUDDY_EXECUTION_BRANCH") - tags[constants.GitTag] = os.Getenv("BUDDY_EXECUTION_TAG") - tags[constants.GitCommitMessage] = os.Getenv("BUDDY_EXECUTION_REVISION_MESSAGE") - tags[constants.GitCommitCommitterName] = os.Getenv("BUDDY_EXECUTION_REVISION_COMMITTER_NAME") - tags[constants.GitCommitCommitterEmail] = os.Getenv("BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL") + tags[constants.CIPipelineID] = fmt.Sprintf("%s/%s", env.Get("BUDDY_PIPELINE_ID"), env.Get("BUDDY_EXECUTION_ID")) + tags[constants.CIPipelineName] = env.Get("BUDDY_PIPELINE_NAME") + tags[constants.CIPipelineNumber] = env.Get("BUDDY_EXECUTION_ID") + tags[constants.CIPipelineURL] = env.Get("BUDDY_EXECUTION_URL") + tags[constants.GitCommitSHA] = env.Get("BUDDY_EXECUTION_REVISION") + tags[constants.GitRepositoryURL] = env.Get("BUDDY_SCM_URL") + tags[constants.GitBranch] = env.Get("BUDDY_EXECUTION_BRANCH") + tags[constants.GitTag] = env.Get("BUDDY_EXECUTION_TAG") + tags[constants.GitCommitMessage] = env.Get("BUDDY_EXECUTION_REVISION_MESSAGE") + tags[constants.GitCommitCommitterName] = env.Get("BUDDY_EXECUTION_REVISION_COMMITTER_NAME") + tags[constants.GitCommitCommitterEmail] = env.Get("BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL") + + tags[constants.GitPrBaseBranch] = env.Get("BUDDY_RUN_PR_BASE_BRANCH") + tags[constants.PrNumber] = env.Get("BUDDY_RUN_PR_NO") + return tags } // extractBuildkite extracts CI information specific to Buildkite. func extractBuildkite() map[string]string { tags := map[string]string{} - tags[constants.GitBranch] = os.Getenv("BUILDKITE_BRANCH") - tags[constants.GitCommitSHA] = os.Getenv("BUILDKITE_COMMIT") - tags[constants.GitRepositoryURL] = os.Getenv("BUILDKITE_REPO") - tags[constants.GitTag] = os.Getenv("BUILDKITE_TAG") - tags[constants.CIPipelineID] = os.Getenv("BUILDKITE_BUILD_ID") - tags[constants.CIPipelineName] = os.Getenv("BUILDKITE_PIPELINE_SLUG") - tags[constants.CIPipelineNumber] = os.Getenv("BUILDKITE_BUILD_NUMBER") - tags[constants.CIPipelineURL] = os.Getenv("BUILDKITE_BUILD_URL") - tags[constants.CIJobURL] = fmt.Sprintf("%s#%s", os.Getenv("BUILDKITE_BUILD_URL"), os.Getenv("BUILDKITE_JOB_ID")) + tags[constants.GitBranch] = env.Get("BUILDKITE_BRANCH") + tags[constants.GitCommitSHA] = env.Get("BUILDKITE_COMMIT") + tags[constants.GitRepositoryURL] = env.Get("BUILDKITE_REPO") + tags[constants.GitTag] = env.Get("BUILDKITE_TAG") + tags[constants.CIPipelineID] = env.Get("BUILDKITE_BUILD_ID") + tags[constants.CIPipelineName] = env.Get("BUILDKITE_PIPELINE_SLUG") + tags[constants.CIPipelineNumber] = env.Get("BUILDKITE_BUILD_NUMBER") + tags[constants.CIPipelineURL] = env.Get("BUILDKITE_BUILD_URL") + tags[constants.CIJobID] = env.Get("BUILDKITE_JOB_ID") + tags[constants.CIJobURL] = fmt.Sprintf("%s#%s", env.Get("BUILDKITE_BUILD_URL"), env.Get("BUILDKITE_JOB_ID")) tags[constants.CIProviderName] = "buildkite" - tags[constants.CIWorkspacePath] = os.Getenv("BUILDKITE_BUILD_CHECKOUT_PATH") - tags[constants.GitCommitMessage] = os.Getenv("BUILDKITE_MESSAGE") - tags[constants.GitCommitAuthorName] = os.Getenv("BUILDKITE_BUILD_AUTHOR") - tags[constants.GitCommitAuthorEmail] = os.Getenv("BUILDKITE_BUILD_AUTHOR_EMAIL") - tags[constants.CINodeName] = os.Getenv("BUILDKITE_AGENT_ID") + tags[constants.CIWorkspacePath] = env.Get("BUILDKITE_BUILD_CHECKOUT_PATH") + tags[constants.GitCommitMessage] = env.Get("BUILDKITE_MESSAGE") + tags[constants.GitCommitAuthorName] = env.Get("BUILDKITE_BUILD_AUTHOR") + tags[constants.GitCommitAuthorEmail] = env.Get("BUILDKITE_BUILD_AUTHOR_EMAIL") + tags[constants.CINodeName] = env.Get("BUILDKITE_AGENT_ID") jsonString, err := getEnvVarsJSON("BUILDKITE_BUILD_ID", "BUILDKITE_JOB_ID") if err == nil { @@ -335,6 +364,9 @@ func extractBuildkite() map[string]string { } } + tags[constants.GitPrBaseBranch] = env.Get("BUILDKITE_PULL_REQUEST_BASE_BRANCH") + tags[constants.PrNumber] = env.Get("BUILDKITE_PULL_REQUEST") + return tags } @@ -342,17 +374,19 @@ func extractBuildkite() map[string]string { func extractCircleCI() map[string]string { tags := map[string]string{} tags[constants.CIProviderName] = "circleci" - tags[constants.GitRepositoryURL] = os.Getenv("CIRCLE_REPOSITORY_URL") - tags[constants.GitCommitSHA] = os.Getenv("CIRCLE_SHA1") - tags[constants.GitTag] = os.Getenv("CIRCLE_TAG") - tags[constants.GitBranch] = os.Getenv("CIRCLE_BRANCH") - tags[constants.CIWorkspacePath] = os.Getenv("CIRCLE_WORKING_DIRECTORY") - tags[constants.CIPipelineID] = os.Getenv("CIRCLE_WORKFLOW_ID") - tags[constants.CIPipelineName] = os.Getenv("CIRCLE_PROJECT_REPONAME") - tags[constants.CIPipelineNumber] = os.Getenv("CIRCLE_BUILD_NUM") - tags[constants.CIPipelineURL] = fmt.Sprintf("https://app.circleci.com/pipelines/workflows/%s", os.Getenv("CIRCLE_WORKFLOW_ID")) - tags[constants.CIJobName] = os.Getenv("CIRCLE_JOB") - tags[constants.CIJobURL] = os.Getenv("CIRCLE_BUILD_URL") + tags[constants.GitRepositoryURL] = env.Get("CIRCLE_REPOSITORY_URL") + tags[constants.GitCommitSHA] = env.Get("CIRCLE_SHA1") + tags[constants.GitTag] = env.Get("CIRCLE_TAG") + tags[constants.GitBranch] = env.Get("CIRCLE_BRANCH") + tags[constants.CIWorkspacePath] = env.Get("CIRCLE_WORKING_DIRECTORY") + tags[constants.CIPipelineID] = env.Get("CIRCLE_WORKFLOW_ID") + tags[constants.CIPipelineName] = env.Get("CIRCLE_PROJECT_REPONAME") + tags[constants.CIPipelineNumber] = env.Get("CIRCLE_BUILD_NUM") + tags[constants.CIPipelineURL] = fmt.Sprintf("https://app.circleci.com/pipelines/workflows/%s", env.Get("CIRCLE_WORKFLOW_ID")) + tags[constants.CIJobName] = env.Get("CIRCLE_JOB") + tags[constants.CIJobID] = env.Get("CIRCLE_BUILD_NUM") + tags[constants.CIJobURL] = env.Get("CIRCLE_BUILD_URL") + tags[constants.PrNumber] = env.Get("CIRCLE_PR_NUMBER") jsonString, err := getEnvVarsJSON("CIRCLE_BUILD_NUM", "CIRCLE_WORKFLOW_ID") if err == nil { @@ -374,29 +408,30 @@ func extractGithubActions() map[string]string { branch = branchOrTag } - serverURL := os.Getenv("GITHUB_SERVER_URL") + serverURL := env.Get("GITHUB_SERVER_URL") if serverURL == "" { serverURL = "https://github.com/" } serverURL = strings.TrimSuffix(serverURL, "/") - rawRepository := fmt.Sprintf("%s/%s", serverURL, os.Getenv("GITHUB_REPOSITORY")) - pipelineID := os.Getenv("GITHUB_RUN_ID") - commitSha := os.Getenv("GITHUB_SHA") + rawRepository := fmt.Sprintf("%s/%s", serverURL, env.Get("GITHUB_REPOSITORY")) + pipelineID := env.Get("GITHUB_RUN_ID") + commitSha := env.Get("GITHUB_SHA") tags[constants.CIProviderName] = "github" tags[constants.GitRepositoryURL] = rawRepository + ".git" tags[constants.GitCommitSHA] = commitSha tags[constants.GitBranch] = branch tags[constants.GitTag] = tag - tags[constants.CIWorkspacePath] = os.Getenv("GITHUB_WORKSPACE") + tags[constants.CIWorkspacePath] = env.Get("GITHUB_WORKSPACE") tags[constants.CIPipelineID] = pipelineID - tags[constants.CIPipelineNumber] = os.Getenv("GITHUB_RUN_NUMBER") - tags[constants.CIPipelineName] = os.Getenv("GITHUB_WORKFLOW") + tags[constants.CIPipelineNumber] = env.Get("GITHUB_RUN_NUMBER") + tags[constants.CIPipelineName] = env.Get("GITHUB_WORKFLOW") tags[constants.CIJobURL] = fmt.Sprintf("%s/commit/%s/checks", rawRepository, commitSha) - tags[constants.CIJobName] = os.Getenv("GITHUB_JOB") + tags[constants.CIJobID] = env.Get("GITHUB_JOB") + tags[constants.CIJobName] = env.Get("GITHUB_JOB") - attempts := os.Getenv("GITHUB_RUN_ATTEMPT") + attempts := env.Get("GITHUB_RUN_ATTEMPT") if attempts == "" { tags[constants.CIPipelineURL] = fmt.Sprintf("%s/actions/runs/%s", rawRepository, pipelineID) } else { @@ -409,12 +444,13 @@ func extractGithubActions() map[string]string { } // Extract PR information from the github event json file - eventFilePath := os.Getenv("GITHUB_EVENT_PATH") + eventFilePath := env.Get("GITHUB_EVENT_PATH") if stats, ok := os.Stat(eventFilePath); ok == nil && !stats.IsDir() { if eventFile, err := os.Open(eventFilePath); err == nil { defer eventFile.Close() - var eventJson struct { + var eventJSON struct { + Number int `json:"number"` PullRequest struct { Base struct { Sha string `json:"sha"` @@ -427,17 +463,18 @@ func extractGithubActions() map[string]string { } eventDecoder := json.NewDecoder(eventFile) - if eventDecoder.Decode(&eventJson) == nil { - tags[constants.GitHeadCommit] = eventJson.PullRequest.Head.Sha - tags[constants.GitPrBaseCommit] = eventJson.PullRequest.Base.Sha - tags[constants.GitPrBaseBranch] = eventJson.PullRequest.Base.Ref + if eventDecoder.Decode(&eventJSON) == nil { + tags[constants.GitHeadCommit] = eventJSON.PullRequest.Head.Sha + tags[constants.GitPrBaseHeadCommit] = eventJSON.PullRequest.Base.Sha + tags[constants.GitPrBaseBranch] = eventJSON.PullRequest.Base.Ref + tags[constants.PrNumber] = fmt.Sprintf("%d", eventJSON.Number) } } } // Fallback if GitPrBaseBranch is not set if tmpVal, ok := tags[constants.GitPrBaseBranch]; !ok || tmpVal == "" { - tags[constants.GitPrBaseBranch] = os.Getenv("GITHUB_BASE_REF") + tags[constants.GitPrBaseBranch] = env.Get("GITHUB_BASE_REF") } return tags @@ -446,38 +483,45 @@ func extractGithubActions() map[string]string { // extractGitlab extracts CI information specific to GitLab. func extractGitlab() map[string]string { tags := map[string]string{} - url := os.Getenv("CI_PIPELINE_URL") + url := env.Get("CI_PIPELINE_URL") tags[constants.CIProviderName] = "gitlab" - tags[constants.GitRepositoryURL] = os.Getenv("CI_REPOSITORY_URL") - tags[constants.GitCommitSHA] = os.Getenv("CI_COMMIT_SHA") + tags[constants.GitRepositoryURL] = env.Get("CI_REPOSITORY_URL") + tags[constants.GitCommitSHA] = env.Get("CI_COMMIT_SHA") tags[constants.GitBranch] = firstEnv("CI_COMMIT_BRANCH", "CI_COMMIT_REF_NAME") - tags[constants.GitTag] = os.Getenv("CI_COMMIT_TAG") - tags[constants.CIWorkspacePath] = os.Getenv("CI_PROJECT_DIR") - tags[constants.CIPipelineID] = os.Getenv("CI_PIPELINE_ID") - tags[constants.CIPipelineName] = os.Getenv("CI_PROJECT_PATH") - tags[constants.CIPipelineNumber] = os.Getenv("CI_PIPELINE_IID") + tags[constants.GitTag] = env.Get("CI_COMMIT_TAG") + tags[constants.CIWorkspacePath] = env.Get("CI_PROJECT_DIR") + tags[constants.CIPipelineID] = env.Get("CI_PIPELINE_ID") + tags[constants.CIPipelineName] = env.Get("CI_PROJECT_PATH") + tags[constants.CIPipelineNumber] = env.Get("CI_PIPELINE_IID") tags[constants.CIPipelineURL] = url - tags[constants.CIJobURL] = os.Getenv("CI_JOB_URL") - tags[constants.CIJobName] = os.Getenv("CI_JOB_NAME") - tags[constants.CIStageName] = os.Getenv("CI_JOB_STAGE") - tags[constants.GitCommitMessage] = os.Getenv("CI_COMMIT_MESSAGE") - tags[constants.CINodeName] = os.Getenv("CI_RUNNER_ID") - tags[constants.CINodeLabels] = os.Getenv("CI_RUNNER_TAGS") - - author := os.Getenv("CI_COMMIT_AUTHOR") + tags[constants.CIJobURL] = env.Get("CI_JOB_URL") + tags[constants.CIJobID] = env.Get("CI_JOB_ID") + tags[constants.CIJobName] = env.Get("CI_JOB_NAME") + tags[constants.CIStageName] = env.Get("CI_JOB_STAGE") + tags[constants.GitCommitMessage] = env.Get("CI_COMMIT_MESSAGE") + tags[constants.CINodeName] = env.Get("CI_RUNNER_ID") + tags[constants.CINodeLabels] = env.Get("CI_RUNNER_TAGS") + + author := env.Get("CI_COMMIT_AUTHOR") authorArray := strings.FieldsFunc(author, func(s rune) bool { return s == '<' || s == '>' }) tags[constants.GitCommitAuthorName] = strings.TrimSpace(authorArray[0]) tags[constants.GitCommitAuthorEmail] = strings.TrimSpace(authorArray[1]) - tags[constants.GitCommitAuthorDate] = os.Getenv("CI_COMMIT_TIMESTAMP") + tags[constants.GitCommitAuthorDate] = env.Get("CI_COMMIT_TIMESTAMP") jsonString, err := getEnvVarsJSON("CI_PROJECT_URL", "CI_PIPELINE_ID", "CI_JOB_ID") if err == nil { tags[constants.CIEnvVars] = string(jsonString) } + tags[constants.GitHeadCommit] = env.Get("CI_MERGE_REQUEST_SOURCE_BRANCH_SHA") + tags[constants.GitPrBaseHeadCommit] = env.Get("CI_MERGE_REQUEST_TARGET_BRANCH_SHA") + tags[constants.GitPrBaseCommit] = env.Get("CI_MERGE_REQUEST_DIFF_BASE_SHA") + tags[constants.GitPrBaseBranch] = env.Get("CI_MERGE_REQUEST_TARGET_BRANCH_NAME") + tags[constants.PrNumber] = env.Get("CI_MERGE_REQUEST_IID") + return tags } @@ -486,11 +530,11 @@ func extractJenkins() map[string]string { tags := map[string]string{} tags[constants.CIProviderName] = "jenkins" tags[constants.GitRepositoryURL] = firstEnv("GIT_URL", "GIT_URL_1") - tags[constants.GitCommitSHA] = os.Getenv("GIT_COMMIT") + tags[constants.GitCommitSHA] = env.Get("GIT_COMMIT") - branchOrTag := os.Getenv("GIT_BRANCH") + branchOrTag := env.Get("GIT_BRANCH") empty := []byte("") - name, hasName := os.LookupEnv("JOB_NAME") + name, hasName := env.Lookup("JOB_NAME") if strings.Contains(branchOrTag, "tags/") { tags[constants.GitTag] = branchOrTag @@ -506,19 +550,21 @@ func extractJenkins() map[string]string { name = string(removeVars.ReplaceAll([]byte(name), empty)) } - tags[constants.CIWorkspacePath] = os.Getenv("WORKSPACE") - tags[constants.CIPipelineID] = os.Getenv("BUILD_TAG") - tags[constants.CIPipelineNumber] = os.Getenv("BUILD_NUMBER") + tags[constants.CIWorkspacePath] = env.Get("WORKSPACE") + tags[constants.CIPipelineID] = env.Get("BUILD_TAG") + tags[constants.CIPipelineNumber] = env.Get("BUILD_NUMBER") tags[constants.CIPipelineName] = name - tags[constants.CIPipelineURL] = os.Getenv("BUILD_URL") - tags[constants.CINodeName] = os.Getenv("NODE_NAME") + tags[constants.CIPipelineURL] = env.Get("BUILD_URL") + tags[constants.CINodeName] = env.Get("NODE_NAME") + tags[constants.PrNumber] = env.Get("CHANGE_ID") + tags[constants.GitPrBaseBranch] = env.Get("CHANGE_TARGET") jsonString, err := getEnvVarsJSON("DD_CUSTOM_TRACE_ID") if err == nil { tags[constants.CIEnvVars] = string(jsonString) } - nodeLabels := os.Getenv("NODE_LABELS") + nodeLabels := env.Get("NODE_LABELS") if len(nodeLabels) > 0 { labelsArray := strings.Split(nodeLabels, " ") jsonString, err := json.Marshal(labelsArray) @@ -534,8 +580,11 @@ func extractJenkins() map[string]string { func extractTeamcity() map[string]string { tags := map[string]string{} tags[constants.CIProviderName] = "teamcity" - tags[constants.CIJobURL] = os.Getenv("BUILD_URL") - tags[constants.CIJobName] = os.Getenv("TEAMCITY_BUILDCONF_NAME") + tags[constants.CIJobURL] = env.Get("BUILD_URL") + tags[constants.CIJobName] = env.Get("TEAMCITY_BUILDCONF_NAME") + + tags[constants.PrNumber] = env.Get("TEAMCITY_PULLREQUEST_NUMBER") + tags[constants.GitPrBaseBranch] = env.Get("TEAMCITY_PULLREQUEST_TARGET_BRANCH") return tags } @@ -543,17 +592,17 @@ func extractTeamcity() map[string]string { func extractCodefresh() map[string]string { tags := map[string]string{} tags[constants.CIProviderName] = "codefresh" - tags[constants.CIPipelineID] = os.Getenv("CF_BUILD_ID") - tags[constants.CIPipelineName] = os.Getenv("CF_PIPELINE_NAME") - tags[constants.CIPipelineURL] = os.Getenv("CF_BUILD_URL") - tags[constants.CIJobName] = os.Getenv("CF_STEP_NAME") + tags[constants.CIPipelineID] = env.Get("CF_BUILD_ID") + tags[constants.CIPipelineName] = env.Get("CF_PIPELINE_NAME") + tags[constants.CIPipelineURL] = env.Get("CF_BUILD_URL") + tags[constants.CIJobName] = env.Get("CF_STEP_NAME") jsonString, err := getEnvVarsJSON("CF_BUILD_ID") if err == nil { tags[constants.CIEnvVars] = string(jsonString) } - cfBranch := os.Getenv("CF_BRANCH") + cfBranch := env.Get("CF_BRANCH") isTag := strings.Contains(cfBranch, "tags/") var refKey string if isTag { @@ -563,29 +612,37 @@ func extractCodefresh() map[string]string { } tags[refKey] = normalizeRef(cfBranch) + tags[constants.GitPrBaseBranch] = env.Get("CF_PULL_REQUEST_TARGET") + tags[constants.PrNumber] = env.Get("CF_PULL_REQUEST_NUMBER") + return tags } // extractTravis extracts CI information specific to Travis CI. func extractTravis() map[string]string { tags := map[string]string{} - prSlug := os.Getenv("TRAVIS_PULL_REQUEST_SLUG") + prSlug := env.Get("TRAVIS_PULL_REQUEST_SLUG") repoSlug := prSlug if strings.TrimSpace(repoSlug) == "" { - repoSlug = os.Getenv("TRAVIS_REPO_SLUG") + repoSlug = env.Get("TRAVIS_REPO_SLUG") } tags[constants.CIProviderName] = "travisci" tags[constants.GitRepositoryURL] = fmt.Sprintf("https://github.com/%s.git", repoSlug) - tags[constants.GitCommitSHA] = os.Getenv("TRAVIS_COMMIT") - tags[constants.GitTag] = os.Getenv("TRAVIS_TAG") + tags[constants.GitCommitSHA] = env.Get("TRAVIS_COMMIT") + tags[constants.GitTag] = env.Get("TRAVIS_TAG") tags[constants.GitBranch] = firstEnv("TRAVIS_PULL_REQUEST_BRANCH", "TRAVIS_BRANCH") - tags[constants.CIWorkspacePath] = os.Getenv("TRAVIS_BUILD_DIR") - tags[constants.CIPipelineID] = os.Getenv("TRAVIS_BUILD_ID") - tags[constants.CIPipelineNumber] = os.Getenv("TRAVIS_BUILD_NUMBER") + tags[constants.CIWorkspacePath] = env.Get("TRAVIS_BUILD_DIR") + tags[constants.CIPipelineID] = env.Get("TRAVIS_BUILD_ID") + tags[constants.CIPipelineNumber] = env.Get("TRAVIS_BUILD_NUMBER") tags[constants.CIPipelineName] = repoSlug - tags[constants.CIPipelineURL] = os.Getenv("TRAVIS_BUILD_WEB_URL") - tags[constants.CIJobURL] = os.Getenv("TRAVIS_JOB_WEB_URL") - tags[constants.GitCommitMessage] = os.Getenv("TRAVIS_COMMIT_MESSAGE") + tags[constants.CIPipelineURL] = env.Get("TRAVIS_BUILD_WEB_URL") + tags[constants.CIJobURL] = env.Get("TRAVIS_JOB_WEB_URL") + tags[constants.GitCommitMessage] = env.Get("TRAVIS_COMMIT_MESSAGE") + + tags[constants.GitPrBaseBranch] = env.Get("TRAVIS_BRANCH") + tags[constants.GitHeadCommit] = env.Get("TRAVIS_PULL_REQUEST_SHA") + tags[constants.PrNumber] = env.Get("TRAVIS_PULL_REQUEST") + return tags } @@ -593,13 +650,14 @@ func extractTravis() map[string]string { func extractAwsCodePipeline() map[string]string { tags := map[string]string{} - if !strings.HasPrefix(os.Getenv("CODEBUILD_INITIATOR"), "codepipeline") { + if !strings.HasPrefix(env.Get("CODEBUILD_INITIATOR"), "codepipeline") { // CODEBUILD_INITIATOR is defined but this is not a codepipeline build return tags } tags[constants.CIProviderName] = "awscodepipeline" - tags[constants.CIPipelineID] = os.Getenv("DD_PIPELINE_EXECUTION_ID") + tags[constants.CIPipelineID] = env.Get("DD_PIPELINE_EXECUTION_ID") + tags[constants.CIJobID] = env.Get("DD_ACTION_EXECUTION_ID") jsonString, err := getEnvVarsJSON("CODEBUILD_BUILD_ARN", "DD_ACTION_EXECUTION_ID", "DD_PIPELINE_EXECUTION_ID") if err == nil { @@ -608,3 +666,25 @@ func extractAwsCodePipeline() map[string]string { return tags } + +// extractDrone extracts CI information specific to Drone CI. +func extractDrone() map[string]string { + tags := map[string]string{} + tags[constants.CIProviderName] = "drone" + tags[constants.GitBranch] = env.Get("DRONE_BRANCH") + tags[constants.GitCommitSHA] = env.Get("DRONE_COMMIT_SHA") + tags[constants.GitRepositoryURL] = env.Get("DRONE_GIT_HTTP_URL") + tags[constants.GitTag] = env.Get("DRONE_TAG") + tags[constants.CIPipelineNumber] = env.Get("DRONE_BUILD_NUMBER") + tags[constants.CIPipelineURL] = env.Get("DRONE_BUILD_LINK") + tags[constants.GitCommitMessage] = env.Get("DRONE_COMMIT_MESSAGE") + tags[constants.GitCommitAuthorName] = env.Get("DRONE_COMMIT_AUTHOR_NAME") + tags[constants.GitCommitAuthorEmail] = env.Get("DRONE_COMMIT_AUTHOR_EMAIL") + tags[constants.CIWorkspacePath] = env.Get("DRONE_WORKSPACE") + tags[constants.CIJobName] = env.Get("DRONE_STEP_NAME") + tags[constants.CIStageName] = env.Get("DRONE_STAGE_NAME") + tags[constants.PrNumber] = env.Get("DRONE_PULL_REQUEST") + tags[constants.GitPrBaseBranch] = env.Get("DRONE_TARGET_BRANCH") + + return tags +} diff --git a/internal/civisibility/utils/ci_providers_test.go b/internal/civisibility/utils/ci_providers_test.go index 8aeed064e7..b271993e3f 100644 --- a/internal/civisibility/utils/ci_providers_test.go +++ b/internal/civisibility/utils/ci_providers_test.go @@ -14,12 +14,27 @@ import ( "strings" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" ) -func setEnvs(t *testing.T, env map[string]string) { +func setEnvs(t *testing.T, env map[string]any) { for key, value := range env { - t.Setenv(key, value) + if strValue, ok := value.(string); ok { + t.Setenv(key, strValue) + } + if intValue, ok := value.(int); ok { + t.Setenv(key, fmt.Sprintf("%d", intValue)) + } + if boolValue, ok := value.(bool); ok { + if boolValue { + t.Setenv(key, "true") + } else { + t.Setenv(key, "false") + } + } + if floatValue, ok := value.(float64); ok { + t.Setenv(key, fmt.Sprintf("%d", int(floatValue))) + } } } @@ -64,7 +79,7 @@ func TestTags(t *testing.T) { t.Fatal(err) } - var examples [][]map[string]string + var examples [][]map[string]any if err := json.Unmarshal(data, &examples); err != nil { t.Fatal(err) } @@ -98,9 +113,12 @@ func TestTags(t *testing.T) { for expectedKey, expectedValue := range tags { if actualValue, ok := providerTags[expectedKey]; ok { if expectedKey == "_dd.ci.env_vars" { - expectedValue = sortJSONKeys(expectedValue) + expectedValue = sortJSONKeys(expectedValue.(string)) + } + if providerName == "github" && expectedKey == constants.GitPrBaseBranch || expectedKey == constants.GitPrBaseCommit || expectedKey == constants.GitHeadCommit { + continue } - if expectedValue != actualValue { + if fmt.Sprintln(expectedValue) != actualValue { if expectedValue == strings.ReplaceAll(actualValue, "\\", "/") { continue } @@ -143,10 +161,12 @@ func TestGitHubEventFile(t *testing.T) { expectedHeadCommit := "df289512a51123083a8e6931dd6f57bb3883d4c4" expectedBaseCommit := "52e0974c74d41160a03d59ddc73bb9f5adab054b" expectedBaseRef := "main" + expectedPrNumber := "1" checkValue(tags, constants.GitHeadCommit, expectedHeadCommit) - checkValue(tags, constants.GitPrBaseCommit, expectedBaseCommit) + checkValue(tags, constants.GitPrBaseHeadCommit, expectedBaseCommit) checkValue(tags, constants.GitPrBaseBranch, expectedBaseRef) + checkValue(tags, constants.PrNumber, expectedPrNumber) }) t.Run("no event file", func(t *testing.T) { diff --git a/internal/civisibility/utils/codeowners.go b/internal/civisibility/utils/codeowners.go index 0674945151..9d606b14db 100644 --- a/internal/civisibility/utils/codeowners.go +++ b/internal/civisibility/utils/codeowners.go @@ -14,9 +14,9 @@ import ( "strings" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" - logger "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + logger "github.com/DataDog/dd-trace-go/v2/internal/log" ) // This is a port of https://github.com/DataDog/dd-trace-dotnet/blob/v2.53.0/tracer/src/Datadog.Trace/Ci/CodeOwners.cs @@ -73,22 +73,40 @@ func GetCodeOwners() *CodeOwners { filepath.Join(v, ".docs", "CODEOWNERS"), } for _, path := range paths { - if _, err := os.Stat(path); err == nil { - codeowners, err = NewCodeOwners(path) - if err == nil { - if logger.DebugEnabled() { - logger.Debug("civisibility: codeowner file '%v' was loaded successfully.", path) - } - return codeowners - } - logger.Debug("Error parsing codeowners: %s", err) + if cow, err := parseCodeOwners(path); err == nil { + codeowners = cow + return codeowners } } } + // If the codeowners file is not found, let's try a last resort by looking in the current directory (for standalone test binaries) + for _, path := range []string{"CODEOWNERS", filepath.Join(filepath.Dir(os.Args[0]), "CODEOWNERS")} { + if cow, err := parseCodeOwners(path); err == nil { + codeowners = cow + return codeowners + } + } + return nil } +// parseCodeOwners reads and parses the CODEOWNERS file located at the given filePath. +func parseCodeOwners(filePath string) (*CodeOwners, error) { + if _, err := os.Stat(filePath); err != nil { + return nil, err + } + cow, err := NewCodeOwners(filePath) + if err == nil { + if logger.DebugEnabled() { + logger.Debug("civisibility: codeowner file '%s' was loaded successfully.", filePath) + } + return cow, nil + } + logger.Debug("Error parsing codeowners: %s", err.Error()) + return nil, err +} + // NewCodeOwners creates a new instance of CodeOwners by parsing a CODEOWNERS file located at the given filePath. // It returns an error if the file cannot be read or parsed properly. func NewCodeOwners(filePath string) (*CodeOwners, error) { @@ -298,7 +316,7 @@ func (co *CodeOwners) Match(value string) (*Entry, bool) { // GetOwnersString returns a formatted string of the owners list in an Entry. // It returns an empty string if there are no owners. -func (e Entry) GetOwnersString() string { +func (e *Entry) GetOwnersString() string { if e.Owners == nil || len(e.Owners) == 0 { return "" } diff --git a/internal/civisibility/utils/environmentTags.go b/internal/civisibility/utils/environmentTags.go index 8904596e59..2854b67b04 100644 --- a/internal/civisibility/utils/environmentTags.go +++ b/internal/civisibility/utils/environmentTags.go @@ -7,6 +7,7 @@ package utils import ( "fmt" + "maps" "os" "path/filepath" "regexp" @@ -14,19 +15,24 @@ import ( "strings" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/osinfo" ) var ( // ciTags holds the CI/CD environment variable information. - ciTags map[string]string - ciTagsMutex sync.Mutex + currentCiTags map[string]string // currentCiTags holds the CI/CD tags after originalCiTags + addedTags + originalCiTags map[string]string // originalCiTags holds the original CI/CD tags after all the CMDs + addedTags map[string]string // addedTags holds the tags added by the user + ciTagsMutex sync.Mutex // ciMetrics holds the CI/CD environment numeric variable information - ciMetrics map[string]float64 - ciMetricsMutex sync.Mutex + currentCiMetrics map[string]float64 // currentCiMetrics holds the CI/CD metrics after originalCiMetrics + addedMetrics + originalCiMetrics map[string]float64 // originalCiMetrics holds the original CI/CD metrics after all the CMDs + addedMetrics map[string]float64 // addedMetrics holds the metrics added by the user + ciMetricsMutex sync.Mutex ) // GetCITags retrieves and caches the CI/CD tags from environment variables. @@ -40,11 +46,71 @@ func GetCITags() map[string]string { ciTagsMutex.Lock() defer ciTagsMutex.Unlock() - if ciTags == nil { - ciTags = createCITagsMap() + // Return the current tags if they are already initialized + if currentCiTags != nil { + return currentCiTags } - return ciTags + if originalCiTags == nil { + // If the original tags are not initialized, create them + originalCiTags = createCITagsMap() + } + + // Create a new map with the added tags + newTags := maps.Clone(originalCiTags) + for k, v := range addedTags { + newTags[k] = v + } + + // Update the current tags + currentCiTags = newTags + return currentCiTags +} + +// AddCITags adds a new tag to the CI/CD tags map. +func AddCITags(tagName, tagValue string) { + ciTagsMutex.Lock() + defer ciTagsMutex.Unlock() + + // Add the tag to the added tags dictionary + if addedTags == nil { + addedTags = make(map[string]string) + } + addedTags[tagName] = tagValue + + // Reset the current tags + currentCiTags = nil +} + +// AddCITagsMap adds a new map of tags to the CI/CD tags map. +func AddCITagsMap(tags map[string]string) { + if tags == nil { + return + } + + ciTagsMutex.Lock() + defer ciTagsMutex.Unlock() + + // Add the tag to the added tags dictionary + if addedTags == nil { + addedTags = make(map[string]string) + } + for k, v := range tags { + addedTags[k] = v + } + + // Reset the current tags + currentCiTags = nil +} + +// ResetCITags resets the CI/CD tags to their original values. +func ResetCITags() { + ciTagsMutex.Lock() + defer ciTagsMutex.Unlock() + + originalCiTags = nil + currentCiTags = nil + addedTags = nil } // GetCIMetrics retrieves and caches the CI/CD metrics from environment variables. @@ -58,11 +124,71 @@ func GetCIMetrics() map[string]float64 { ciMetricsMutex.Lock() defer ciMetricsMutex.Unlock() - if ciMetrics == nil { - ciMetrics = createCIMetricsMap() + // Return the current metrics if they are already initialized + if currentCiMetrics != nil { + return currentCiMetrics + } + + if originalCiMetrics == nil { + // If the original metrics are not initialized, create them + originalCiMetrics = createCIMetricsMap() + } + + // Create a new map with the added metrics + newMetrics := maps.Clone(originalCiMetrics) + for k, v := range addedMetrics { + newMetrics[k] = v } - return ciMetrics + // Update the current metrics + currentCiMetrics = newMetrics + return currentCiMetrics +} + +// AddCIMetrics adds a new metric to the CI/CD metrics map. +func AddCIMetrics(metricName string, metricValue float64) { + ciMetricsMutex.Lock() + defer ciMetricsMutex.Unlock() + + // Add the metric to the added metrics dictionary + if addedMetrics == nil { + addedMetrics = make(map[string]float64) + } + addedMetrics[metricName] = metricValue + + // Reset the current metrics + currentCiMetrics = nil +} + +// AddCIMetricsMap adds a new map of metrics to the CI/CD metrics map. +func AddCIMetricsMap(metrics map[string]float64) { + if metrics == nil { + return + } + + ciMetricsMutex.Lock() + defer ciMetricsMutex.Unlock() + + // Add the metric to the added metrics dictionary + if addedMetrics == nil { + addedMetrics = make(map[string]float64) + } + for k, v := range metrics { + addedMetrics[k] = v + } + + // Reset the current metrics + currentCiMetrics = nil +} + +// ResetCIMetrics resets the CI/CD metrics to their original values. +func ResetCIMetrics() { + ciMetricsMutex.Lock() + defer ciMetricsMutex.Unlock() + + originalCiMetrics = nil + currentCiMetrics = nil + addedMetrics = nil } // GetRelativePathFromCITagsSourceRoot calculates the relative path from the CI workspace root to the specified path. @@ -102,9 +228,9 @@ func createCITagsMap() map[string]string { localTags[constants.OSArchitecture] = runtime.GOARCH localTags[constants.RuntimeName] = runtime.Compiler localTags[constants.RuntimeVersion] = runtime.Version() - log.Debug("civisibility: os platform: %v", runtime.GOOS) - log.Debug("civisibility: os architecture: %v", runtime.GOARCH) - log.Debug("civisibility: runtime version: %v", runtime.Version()) + log.Debug("civisibility: os platform: %s", runtime.GOOS) + log.Debug("civisibility: os architecture: %s", runtime.GOARCH) + log.Debug("civisibility: runtime version: %s", runtime.Version()) // Get command line test command var cmd string @@ -120,17 +246,24 @@ func createCITagsMap() map[string]string { cmd = regexp.MustCompile(`(?si)-test.testlogfile=(.*)\s`).ReplaceAllString(cmd, "") cmd = strings.TrimSpace(cmd) localTags[constants.TestCommand] = cmd - log.Debug("civisibility: test command: %v", cmd) + log.Debug("civisibility: test command: %s", cmd) // Populate the test session name - if testSessionName, ok := os.LookupEnv(constants.CIVisibilityTestSessionNameEnvironmentVariable); ok { + if testSessionName, ok := env.Lookup(constants.CIVisibilityTestSessionNameEnvironmentVariable); ok { localTags[constants.TestSessionName] = testSessionName } else if jobName, ok := localTags[constants.CIJobName]; ok { localTags[constants.TestSessionName] = fmt.Sprintf("%s-%s", jobName, cmd) } else { localTags[constants.TestSessionName] = cmd } - log.Debug("civisibility: test session name: %v", localTags[constants.TestSessionName]) + log.Debug("civisibility: test session name: %s", localTags[constants.TestSessionName]) + + // Check if the user provided the test service + if ddService := env.Get("DD_SERVICE"); ddService != "" { + localTags[constants.UserProvidedTestServiceTag] = "true" + } else { + localTags[constants.UserProvidedTestServiceTag] = "false" + } // Populate missing git data gitData, _ := getLocalGitData() @@ -174,8 +307,28 @@ func createCITagsMap() map[string]string { } } - log.Debug("civisibility: workspace directory: %v", localTags[constants.CIWorkspacePath]) - log.Debug("civisibility: common tags created with %v items", len(localTags)) + // If the head commit SHA is available, populate additional Git head metadata + if headCommitSha, ok := localTags[constants.GitHeadCommit]; ok { + if headCommitData, err := fetchCommitData(headCommitSha); err != nil { + log.Warn("civisibility: failed to fetch head commit data: %s", err.Error()) + } else if headCommitSha == headCommitData.CommitSha { + localTags[constants.GitHeadAuthorDate] = headCommitData.AuthorDate.String() + localTags[constants.GitHeadAuthorName] = headCommitData.AuthorName + localTags[constants.GitHeadAuthorEmail] = headCommitData.AuthorEmail + localTags[constants.GitHeadCommitterDate] = headCommitData.CommitterDate.String() + localTags[constants.GitHeadCommitterName] = headCommitData.CommitterName + localTags[constants.GitHeadCommitterEmail] = headCommitData.CommitterEmail + localTags[constants.GitHeadMessage] = headCommitData.CommitMessage + } else { + log.Warn("civisibility: head commit SHA %s does not match the fetched commit SHA %s", headCommitSha, headCommitData.CommitSha) + } + } + + // Apply environmental data if is available + applyEnvironmentalDataIfRequired(localTags) + + log.Debug("civisibility: workspace directory: %s", localTags[constants.CIWorkspacePath]) + log.Debug("civisibility: common tags created with %d items", len(localTags)) return localTags } @@ -188,6 +341,6 @@ func createCIMetricsMap() map[string]float64 { localMetrics := make(map[string]float64) localMetrics[constants.LogicalCPUCores] = float64(runtime.NumCPU()) - log.Debug("civisibility: common metrics created with %v items", len(localMetrics)) + log.Debug("civisibility: common metrics created with %d items", len(localMetrics)) return localMetrics } diff --git a/internal/civisibility/utils/environmentTags_test.go b/internal/civisibility/utils/environmentTags_test.go index 3baf20a87e..3f93e07bc1 100644 --- a/internal/civisibility/utils/environmentTags_test.go +++ b/internal/civisibility/utils/environmentTags_test.go @@ -8,13 +8,14 @@ package utils import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" "github.com/stretchr/testify/assert" ) func TestGetCITagsCache(t *testing.T) { - ciTags = map[string]string{"key": "value"} + ResetCITags() + originalCiTags = map[string]string{"key": "value"} // First call to initialize ciTags tags := GetCITags() @@ -25,8 +26,41 @@ func TestGetCITagsCache(t *testing.T) { assert.Equal(t, "newvalue", tags["key"]) } +func TestAddCITags(t *testing.T) { + ResetCITags() + originalCiTags = map[string]string{"key": "value"} + + // First call to initialize ciTags + tags := GetCITags() + assert.Equal(t, "value", tags["key"]) + + AddCITags("key", "newvalue") + AddCITags("key2", "value2") + tags = GetCITags() + assert.Equal(t, "newvalue", tags["key"]) + assert.Equal(t, "value2", tags["key2"]) +} + +func TestAddCITagsMap(t *testing.T) { + ResetCITags() + originalCiTags = map[string]string{"key": "value"} + + // First call to initialize ciTags + tags := GetCITags() + assert.Equal(t, "value", tags["key"]) + + nmap := map[string]string{} + nmap["key"] = "newvalue" + nmap["key2"] = "value2" + AddCITagsMap(nmap) + tags = GetCITags() + assert.Equal(t, "newvalue", tags["key"]) + assert.Equal(t, "value2", tags["key2"]) +} + func TestGetCIMetricsCache(t *testing.T) { - ciMetrics = map[string]float64{"key": float64(1)} + ResetCIMetrics() + originalCiMetrics = map[string]float64{"key": float64(1)} // First call to initialize ciMetrics tags := GetCIMetrics() @@ -37,8 +71,42 @@ func TestGetCIMetricsCache(t *testing.T) { assert.Equal(t, float64(42), tags["key"]) } +func TestAddCIMetrics(t *testing.T) { + ResetCIMetrics() + originalCiMetrics = map[string]float64{"key": float64(1)} + + // First call to initialize ciMetrics + tags := GetCIMetrics() + assert.Equal(t, float64(1), tags["key"]) + + AddCIMetrics("key", float64(42)) + AddCIMetrics("key2", float64(2)) + tags = GetCIMetrics() + assert.Equal(t, float64(42), tags["key"]) + assert.Equal(t, float64(2), tags["key2"]) +} + +func TestAddCIMetricsMap(t *testing.T) { + ResetCIMetrics() + originalCiMetrics = map[string]float64{"key": float64(1)} + + // First call to initialize ciMetrics + tags := GetCIMetrics() + assert.Equal(t, float64(1), tags["key"]) + + nmap := map[string]float64{} + nmap["key"] = float64(42) + nmap["key2"] = float64(2) + AddCIMetricsMap(nmap) + tags = GetCIMetrics() + assert.Equal(t, float64(42), tags["key"]) + assert.Equal(t, float64(2), tags["key2"]) +} + func TestGetRelativePathFromCITagsSourceRoot(t *testing.T) { - ciTags = map[string]string{constants.CIWorkspacePath: "/ci/workspace"} + ResetCITags() + originalCiTags = map[string]string{constants.CIWorkspacePath: "/ci/workspace"} + absPath := "/ci/workspace/subdir/file.txt" expectedRelPath := "subdir/file.txt" @@ -46,7 +114,8 @@ func TestGetRelativePathFromCITagsSourceRoot(t *testing.T) { assert.Equal(t, expectedRelPath, relPath) // Test case when CIWorkspacePath is not set in ciTags - ciTags = map[string]string{} + originalCiTags = map[string]string{} + currentCiTags = nil relPath = GetRelativePathFromCITagsSourceRoot(absPath) assert.Equal(t, absPath, relPath) } diff --git a/internal/civisibility/utils/file_environmental_data.go b/internal/civisibility/utils/file_environmental_data.go new file mode 100644 index 0000000000..8274889d5e --- /dev/null +++ b/internal/civisibility/utils/file_environmental_data.go @@ -0,0 +1,276 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package utils + +import ( + "encoding/json" + "os" + "path/filepath" + "strings" + _ "unsafe" // for go:linkname + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/env" + logger "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +type ( + /* + { + "ci.workspace_path": "ci.workspace_path", + "git.repository_url": "git.repository_url", + "git.commit.sha": "git.commit.sha", + "git.branch": "user-supplied-branch", + "git.tag": "user-supplied-tag", + "git.commit.author.date": "usersupplied-authordate", + "git.commit.author.name": "usersupplied-authorname", + "git.commit.author.email": "usersupplied-authoremail", + "git.commit.committer.date": "usersupplied-comitterdate", + "git.commit.committer.name": "usersupplied-comittername", + "git.commit.committer.email": "usersupplied-comitteremail", + "git.commit.message": "usersupplied-message", + "ci.provider.name": "", + "ci.pipeline.id": "", + "ci.pipeline.url": "", + "ci.pipeline.name": "", + "ci.pipeline.number": "", + "ci.stage.name": "", + "ci.job.name": "", + "ci.job.url": "", + "ci.node.name": "", + "ci.node.labels": "", + "_dd.ci.env_vars": "" + } + */ + + // fileEnvironmentalData represents the environmental data for the complete test session. + fileEnvironmentalData struct { + WorkspacePath string `json:"ci.workspace_path,omitempty"` + RepositoryURL string `json:"git.repository_url,omitempty"` + CommitSHA string `json:"git.commit.sha,omitempty"` + Branch string `json:"git.branch,omitempty"` + Tag string `json:"git.tag,omitempty"` + CommitAuthorDate string `json:"git.commit.author.date,omitempty"` + CommitAuthorName string `json:"git.commit.author.name,omitempty"` + CommitAuthorEmail string `json:"git.commit.author.email,omitempty"` + CommitCommitterDate string `json:"git.commit.committer.date,omitempty"` + CommitCommitterName string `json:"git.commit.committer.name,omitempty"` + CommitCommitterEmail string `json:"git.commit.committer.email,omitempty"` + CommitMessage string `json:"git.commit.message,omitempty"` + CIProviderName string `json:"ci.provider.name,omitempty"` + CIPipelineID string `json:"ci.pipeline.id,omitempty"` + CIPipelineURL string `json:"ci.pipeline.url,omitempty"` + CIPipelineName string `json:"ci.pipeline.name,omitempty"` + CIPipelineNumber string `json:"ci.pipeline.number,omitempty"` + CIStageName string `json:"ci.stage.name,omitempty"` + CIJobName string `json:"ci.job.name,omitempty"` + CIJobURL string `json:"ci.job.url,omitempty"` + CINodeName string `json:"ci.node.name,omitempty"` + CINodeLabels string `json:"ci.node.labels,omitempty"` + DDCIEnvVars string `json:"_dd.ci.env_vars,omitempty"` + } +) + +// getEnvironmentalData reads the environmental data from the file. +// +//go:linkname getEnvironmentalData +func getEnvironmentalData() *fileEnvironmentalData { + envDataFileName := getEnvDataFileName() + if _, err := os.Stat(envDataFileName); os.IsNotExist(err) { + logger.Debug("civisibility: reading environmental data from %s not found.", envDataFileName) + return nil + } + file, err := os.Open(envDataFileName) + if err != nil { + logger.Error("civisibility: error reading environmental data from %s: %v", envDataFileName, err.Error()) + return nil + } + defer file.Close() + var envData fileEnvironmentalData + if err := json.NewDecoder(file).Decode(&envData); err != nil { + logger.Error("civisibility: error decoding environmental data from %s: %v", envDataFileName, err.Error()) + return nil + } + logger.Debug("civisibility: loaded environmental data from %s", envDataFileName) + return &envData +} + +// getEnvDataFileName returns the environmental data file name. +// +//go:linkname getEnvDataFileName +func getEnvDataFileName() string { + envDataFileName := strings.TrimSpace(env.Get(constants.CIVisibilityEnvironmentDataFilePath)) + if envDataFileName != "" { + return envDataFileName + } + cmd := filepath.Base(os.Args[0]) + cmdWithoutExt := strings.TrimSuffix(cmd, filepath.Ext(cmd)) + folder := filepath.Dir(os.Args[0]) + return filepath.Join(folder, cmdWithoutExt+".env.json") +} + +// applyEnvironmentalDataIfRequired applies the environmental data to the given tags if required. +// +//go:linkname applyEnvironmentalDataIfRequired +func applyEnvironmentalDataIfRequired(tags map[string]string) { + if tags == nil { + return + } + envData := getEnvironmentalData() + if envData == nil { + logger.Debug("civisibility: no environmental data found") + return + } + + logger.Debug("civisibility: applying environmental data") + + if envData.WorkspacePath != "" && tags[constants.CIWorkspacePath] == "" { + tags[constants.CIWorkspacePath] = envData.WorkspacePath + } + + if envData.RepositoryURL != "" && tags[constants.GitRepositoryURL] == "" { + tags[constants.GitRepositoryURL] = envData.RepositoryURL + } + + if envData.CommitSHA != "" && tags[constants.GitCommitSHA] == "" { + tags[constants.GitCommitSHA] = envData.CommitSHA + } + + if envData.Branch != "" && tags[constants.GitBranch] == "" { + tags[constants.GitBranch] = envData.Branch + } + + if envData.Tag != "" && tags[constants.GitTag] == "" { + tags[constants.GitTag] = envData.Tag + } + + if envData.CommitAuthorDate != "" && tags[constants.GitCommitAuthorDate] == "" { + tags[constants.GitCommitAuthorDate] = envData.CommitAuthorDate + } + + if envData.CommitAuthorName != "" && tags[constants.GitCommitAuthorName] == "" { + tags[constants.GitCommitAuthorName] = envData.CommitAuthorName + } + + if envData.CommitAuthorEmail != "" && tags[constants.GitCommitAuthorEmail] == "" { + tags[constants.GitCommitAuthorEmail] = envData.CommitAuthorEmail + } + + if envData.CommitCommitterDate != "" && tags[constants.GitCommitCommitterDate] == "" { + tags[constants.GitCommitCommitterDate] = envData.CommitCommitterDate + } + + if envData.CommitCommitterName != "" && tags[constants.GitCommitCommitterName] == "" { + tags[constants.GitCommitCommitterName] = envData.CommitCommitterName + } + + if envData.CommitCommitterEmail != "" && tags[constants.GitCommitCommitterEmail] == "" { + tags[constants.GitCommitCommitterEmail] = envData.CommitCommitterEmail + } + + if envData.CommitMessage != "" && tags[constants.GitCommitMessage] == "" { + tags[constants.GitCommitMessage] = envData.CommitMessage + } + + if envData.CIProviderName != "" && tags[constants.CIProviderName] == "" { + tags[constants.CIProviderName] = envData.CIProviderName + } + + if envData.CIPipelineID != "" && tags[constants.CIPipelineID] == "" { + tags[constants.CIPipelineID] = envData.CIPipelineID + } + + if envData.CIPipelineURL != "" && tags[constants.CIPipelineURL] == "" { + tags[constants.CIPipelineURL] = envData.CIPipelineURL + } + + if envData.CIPipelineName != "" && tags[constants.CIPipelineName] == "" { + tags[constants.CIPipelineName] = envData.CIPipelineName + } + + if envData.CIPipelineNumber != "" && tags[constants.CIPipelineNumber] == "" { + tags[constants.CIPipelineNumber] = envData.CIPipelineNumber + } + + if envData.CIStageName != "" && tags[constants.CIStageName] == "" { + tags[constants.CIStageName] = envData.CIStageName + } + + if envData.CIJobName != "" && tags[constants.CIJobName] == "" { + tags[constants.CIJobName] = envData.CIJobName + } + + if envData.CIJobURL != "" && tags[constants.CIJobURL] == "" { + tags[constants.CIJobURL] = envData.CIJobURL + } + + if envData.CINodeName != "" && tags[constants.CINodeName] == "" { + tags[constants.CINodeName] = envData.CINodeName + } + + if envData.CINodeLabels != "" && tags[constants.CINodeLabels] == "" { + tags[constants.CINodeLabels] = envData.CINodeLabels + } + + if envData.DDCIEnvVars != "" && tags[constants.CIEnvVars] == "" { + tags[constants.CIEnvVars] = envData.DDCIEnvVars + } +} + +// createEnvironmentalDataFromTags creates a fileEnvironmentalData object from the given tags. +// +//go:linkname createEnvironmentalDataFromTags +func createEnvironmentalDataFromTags(tags map[string]string) *fileEnvironmentalData { + if tags == nil { + return nil + } + + return &fileEnvironmentalData{ + WorkspacePath: tags[constants.CIWorkspacePath], + RepositoryURL: tags[constants.GitRepositoryURL], + CommitSHA: tags[constants.GitCommitSHA], + Branch: tags[constants.GitBranch], + Tag: tags[constants.GitTag], + CommitAuthorDate: tags[constants.GitCommitAuthorDate], + CommitAuthorName: tags[constants.GitCommitAuthorName], + CommitAuthorEmail: tags[constants.GitCommitAuthorEmail], + CommitCommitterDate: tags[constants.GitCommitCommitterDate], + CommitCommitterName: tags[constants.GitCommitCommitterName], + CommitCommitterEmail: tags[constants.GitCommitCommitterEmail], + CommitMessage: tags[constants.GitCommitMessage], + CIProviderName: tags[constants.CIProviderName], + CIPipelineID: tags[constants.CIPipelineID], + CIPipelineURL: tags[constants.CIPipelineURL], + CIPipelineName: tags[constants.CIPipelineName], + CIPipelineNumber: tags[constants.CIPipelineNumber], + CIStageName: tags[constants.CIStageName], + CIJobName: tags[constants.CIJobName], + CIJobURL: tags[constants.CIJobURL], + CINodeName: tags[constants.CINodeName], + CINodeLabels: tags[constants.CINodeLabels], + DDCIEnvVars: tags[constants.CIEnvVars], + } +} + +// writeEnvironmentalDataToFile writes the environmental data to a file. +// +//go:linkname writeEnvironmentalDataToFile +func writeEnvironmentalDataToFile(filePath string, tags map[string]string) error { + envData := createEnvironmentalDataFromTags(tags) + if envData == nil { + return nil + } + + file, err := os.Create(filePath) + if err != nil { + return err + } + defer file.Close() + + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + return encoder.Encode(envData) +} diff --git a/internal/civisibility/utils/file_environmental_data_test.go b/internal/civisibility/utils/file_environmental_data_test.go new file mode 100644 index 0000000000..a132214280 --- /dev/null +++ b/internal/civisibility/utils/file_environmental_data_test.go @@ -0,0 +1,550 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package utils + +import ( + "encoding/json" + "os" + "path/filepath" + "reflect" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" +) + +// --------------------- Tests for getEnvironmentalData ------------------------- + +// TestGetEnvironmentalData_NoFile verifies that when the expected environmental +// data file does not exist, getEnvironmentalData returns nil. +func TestGetEnvironmentalData_NoFile(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + origArg := os.Args[0] + defer func() { os.Args[0] = origArg }() + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + // Set os.Args[0] so that fallback filename is computed. + binaryPath := filepath.Join(tempDir, "testbinary") + os.Args[0] = binaryPath + + // Since no .env.json file exists, expect nil. + if result := getEnvironmentalData(); result != nil { + t.Errorf("Expected nil when environmental file does not exist, got: %+v", result) + } +} + +// TestGetEnvironmentalData_InvalidJSON creates an env file with invalid JSON and +// verifies that getEnvironmentalData returns nil. +func TestGetEnvironmentalData_InvalidJSON(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + origArg := os.Args[0] + defer func() { os.Args[0] = origArg }() + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + binaryPath := filepath.Join(tempDir, "testbinary") + os.Args[0] = binaryPath + + // Write a file with invalid JSON. + envFilePath := filepath.Join(tempDir, "testbinary.env.json") + invalidContent := []byte("{ invalid json }") + if err := os.WriteFile(envFilePath, invalidContent, 0644); err != nil { + t.Fatal(err) + } + + if result := getEnvironmentalData(); result != nil { + t.Errorf("Expected nil when JSON is invalid, got: %+v", result) + } +} + +// TestGetEnvironmentalData_ValidJSON creates a valid env file and verifies that +// getEnvironmentalData correctly decodes it. +func TestGetEnvironmentalData_ValidJSON(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + origArg := os.Args[0] + defer func() { os.Args[0] = origArg }() + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + binaryPath := filepath.Join(tempDir, "testbinary") + os.Args[0] = binaryPath + + expected := &fileEnvironmentalData{ + WorkspacePath: "/workspace/path", + RepositoryURL: "https://github.com/repo.git", + CommitSHA: "abc123", + Branch: "main", + Tag: "v1.0", + CommitAuthorDate: "2021-01-01", + CommitAuthorName: "Author", + CommitAuthorEmail: "author@example.com", + CommitCommitterDate: "2021-01-02", + CommitCommitterName: "Committer", + CommitCommitterEmail: "committer@example.com", + CommitMessage: "Initial commit", + CIProviderName: "provider", + CIPipelineID: "pipeline_id", + CIPipelineURL: "https://ci.example.com/", + CIPipelineName: "pipeline", + CIPipelineNumber: "42", + CIStageName: "stage", + CIJobName: "job", + CIJobURL: "https://ci.example.com/job", + CINodeName: "node", + CINodeLabels: "label", + DDCIEnvVars: "env_vars", + } + + envFilePath := filepath.Join(tempDir, "testbinary.env.json") + file, err := os.Create(envFilePath) + if err != nil { + t.Fatal(err) + } + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + if err := encoder.Encode(expected); err != nil { + t.Fatal(err) + } + file.Close() + + result := getEnvironmentalData() + if result == nil { + t.Fatal("Expected non-nil result when environmental file exists with valid JSON") + } + if !reflect.DeepEqual(result, expected) { + t.Errorf("Mismatch in environmental data.\nGot: %+v\nExpected: %+v", result, expected) + } +} + +// TestGetEnvironmentalData_UsesEnvVar verifies that when the environment variable +// is set, getEnvironmentalData uses that file. +func TestGetEnvironmentalData_UsesEnvVar(t *testing.T) { + origEnv := os.Getenv(constants.CIVisibilityEnvironmentDataFilePath) + defer os.Setenv(constants.CIVisibilityEnvironmentDataFilePath, origEnv) + + // Create a temporary file for environmental data. + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + customPath := filepath.Join(tempDir, "custom.env.json") + if err := os.Setenv(constants.CIVisibilityEnvironmentDataFilePath, customPath); err != nil { + t.Fatal(err) + } + + expected := &fileEnvironmentalData{ + // other fields can be left empty for this test + } + + file, err := os.Create(customPath) + if err != nil { + t.Fatal(err) + } + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + if err := encoder.Encode(expected); err != nil { + t.Fatal(err) + } + file.Close() + + result := getEnvironmentalData() + if result == nil { + t.Fatal("Expected non-nil environmental data when using env var") + } +} + +// --------------------- Tests for getEnvDataFileName ------------------------- + +// TestGetEnvDataFileName_WithEnvVar verifies that getEnvDataFileName returns the +// value from the environment variable when set. +func TestGetEnvDataFileName_WithEnvVar(t *testing.T) { + const customPath = "/tmp/custom.env.json" + orig := os.Getenv(constants.CIVisibilityEnvironmentDataFilePath) + defer os.Setenv(constants.CIVisibilityEnvironmentDataFilePath, orig) + + if err := os.Setenv(constants.CIVisibilityEnvironmentDataFilePath, customPath); err != nil { + t.Fatal(err) + } + if got := getEnvDataFileName(); got != customPath { + t.Errorf("Expected %q, got %q", customPath, got) + } +} + +// TestGetEnvDataFileName_WithoutEnvVar verifies that getEnvDataFileName constructs +// the file name based on os.Args[0] when the env var is not set. +func TestGetEnvDataFileName_WithoutEnvVar(t *testing.T) { + origEnv := os.Getenv(constants.CIVisibilityEnvironmentDataFilePath) + defer os.Setenv(constants.CIVisibilityEnvironmentDataFilePath, origEnv) + os.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + origArg := os.Args[0] + defer func() { os.Args[0] = origArg }() + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + binaryPath := filepath.Join(tempDir, "testbinary") + os.Args[0] = binaryPath + + expected := filepath.Join(tempDir, "testbinary.env.json") + if got := getEnvDataFileName(); got != expected { + t.Errorf("Expected %q, got %q", expected, got) + } +} + +// --------------------- Tests for applyEnvironmentalDataIfRequired ------------------------- + +// TestApplyEnvironmentalDataIfRequired_NoEnvFile verifies that if there is no +// environmental file, the tags map remains unchanged. +func TestApplyEnvironmentalDataIfRequired_NoEnvFile(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + origArg := os.Args[0] + defer func() { os.Args[0] = origArg }() + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + binaryPath := filepath.Join(tempDir, "testbinary") + os.Args[0] = binaryPath + + tags := map[string]string{ + constants.CIWorkspacePath: "", + constants.GitRepositoryURL: "", + constants.GitCommitSHA: "", + constants.GitBranch: "", + constants.GitTag: "", + constants.GitCommitAuthorDate: "", + constants.GitCommitAuthorName: "", + constants.GitCommitAuthorEmail: "", + constants.GitCommitCommitterDate: "", + constants.GitCommitCommitterName: "", + constants.GitCommitCommitterEmail: "", + constants.GitCommitMessage: "", + constants.CIProviderName: "", + constants.CIPipelineID: "", + constants.CIPipelineURL: "", + constants.CIPipelineName: "", + constants.CIPipelineNumber: "", + constants.CIStageName: "", + constants.CIJobName: "", + constants.CIJobURL: "", + constants.CINodeName: "", + constants.CINodeLabels: "", + constants.CIEnvVars: "", + } + + applyEnvironmentalDataIfRequired(tags) + for key, val := range tags { + if val != "" { + t.Errorf("Expected tag %s to remain empty, got: %s", key, val) + } + } +} + +// TestApplyEnvironmentalDataIfRequired_WithEnvFile creates an env file and checks +// that applyEnvironmentalDataIfRequired populates only the missing values. +func TestApplyEnvironmentalDataIfRequired_WithEnvFile(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + origArg := os.Args[0] + defer func() { os.Args[0] = origArg }() + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + binaryPath := filepath.Join(tempDir, "testbinary") + os.Args[0] = binaryPath + + envData := &fileEnvironmentalData{ + WorkspacePath: "/workspace", + RepositoryURL: "repo_url", + CommitSHA: "sha", + Branch: "branch", + Tag: "tag", + CommitAuthorDate: "date1", + CommitAuthorName: "author", + CommitAuthorEmail: "author@example.com", + CommitCommitterDate: "date2", + CommitCommitterName: "committer", + CommitCommitterEmail: "committer@example.com", + CommitMessage: "message", + CIProviderName: "ci_provider", + CIPipelineID: "pipeline_id", + CIPipelineURL: "pipeline_url", + CIPipelineName: "pipeline_name", + CIPipelineNumber: "pipeline_number", + CIStageName: "stage", + CIJobName: "job", + CIJobURL: "job_url", + CINodeName: "node", + CINodeLabels: "labels", + DDCIEnvVars: "env_vars", + } + + // Create the env file. + envFilePath := filepath.Join(tempDir, "testbinary.env.json") + file, err := os.Create(envFilePath) + if err != nil { + t.Fatal(err) + } + encoder := json.NewEncoder(file) + encoder.SetIndent("", " ") + if err := encoder.Encode(envData); err != nil { + t.Fatal(err) + } + file.Close() + + // Prepare tags with some values already set. + tags := map[string]string{ + constants.CIWorkspacePath: "existing", // should not be overwritten + constants.GitRepositoryURL: "", + constants.GitCommitSHA: "", + constants.GitBranch: "", + constants.GitTag: "", + constants.GitCommitAuthorDate: "", + constants.GitCommitAuthorName: "", + constants.GitCommitAuthorEmail: "", + constants.GitCommitCommitterDate: "", + constants.GitCommitCommitterName: "", + constants.GitCommitCommitterEmail: "", + constants.GitCommitMessage: "", + constants.CIProviderName: "", + constants.CIPipelineID: "", + constants.CIPipelineURL: "", + constants.CIPipelineName: "", + constants.CIPipelineNumber: "", + constants.CIStageName: "", + constants.CIJobName: "", + constants.CIJobURL: "", + constants.CINodeName: "", + constants.CINodeLabels: "", + constants.CIEnvVars: "", + } + + applyEnvironmentalDataIfRequired(tags) + if tags[constants.CIWorkspacePath] != "existing" { + t.Errorf("Expected CIWorkspacePath to remain 'existing', got '%s'", tags[constants.CIWorkspacePath]) + } + if tags[constants.GitRepositoryURL] != "repo_url" { + t.Errorf("Expected GitRepositoryURL to be 'repo_url', got '%s'", tags[constants.GitRepositoryURL]) + } + if tags[constants.GitCommitSHA] != "sha" { + t.Errorf("Expected GitCommitSHA to be 'sha', got '%s'", tags[constants.GitCommitSHA]) + } + if tags[constants.GitBranch] != "branch" { + t.Errorf("Expected GitBranch to be 'branch', got '%s'", tags[constants.GitBranch]) + } + if tags[constants.GitTag] != "tag" { + t.Errorf("Expected GitTag to be 'tag', got '%s'", tags[constants.GitTag]) + } + if tags[constants.GitCommitAuthorDate] != "date1" { + t.Errorf("Expected GitCommitAuthorDate to be 'date1', got '%s'", tags[constants.GitCommitAuthorDate]) + } + if tags[constants.GitCommitAuthorName] != "author" { + t.Errorf("Expected GitCommitAuthorName to be 'author', got '%s'", tags[constants.GitCommitAuthorName]) + } + if tags[constants.GitCommitAuthorEmail] != "author@example.com" { + t.Errorf("Expected GitCommitAuthorEmail to be 'author@example.com', got '%s'", tags[constants.GitCommitAuthorEmail]) + } + if tags[constants.GitCommitCommitterDate] != "date2" { + t.Errorf("Expected GitCommitCommitterDate to be 'date2', got '%s'", tags[constants.GitCommitCommitterDate]) + } + if tags[constants.GitCommitCommitterName] != "committer" { + t.Errorf("Expected GitCommitCommitterName to be 'committer', got '%s'", tags[constants.GitCommitCommitterName]) + } + if tags[constants.GitCommitCommitterEmail] != "committer@example.com" { + t.Errorf("Expected GitCommitCommitterEmail to be 'committer@example.com', got '%s'", tags[constants.GitCommitCommitterEmail]) + } + if tags[constants.GitCommitMessage] != "message" { + t.Errorf("Expected GitCommitMessage to be 'message', got '%s'", tags[constants.GitCommitMessage]) + } + if tags[constants.CIProviderName] != "ci_provider" { + t.Errorf("Expected CIProviderName to be 'ci_provider', got '%s'", tags[constants.CIProviderName]) + } + if tags[constants.CIPipelineID] != "pipeline_id" { + t.Errorf("Expected CIPipelineID to be 'pipeline_id', got '%s'", tags[constants.CIPipelineID]) + } + if tags[constants.CIPipelineURL] != "pipeline_url" { + t.Errorf("Expected CIPipelineURL to be 'pipeline_url', got '%s'", tags[constants.CIPipelineURL]) + } + if tags[constants.CIPipelineName] != "pipeline_name" { + t.Errorf("Expected CIPipelineName to be 'pipeline_name', got '%s'", tags[constants.CIPipelineName]) + } + if tags[constants.CIPipelineNumber] != "pipeline_number" { + t.Errorf("Expected CIPipelineNumber to be 'pipeline_number', got '%s'", tags[constants.CIPipelineNumber]) + } + if tags[constants.CIStageName] != "stage" { + t.Errorf("Expected CIStageName to be 'stage', got '%s'", tags[constants.CIStageName]) + } + if tags[constants.CIJobName] != "job" { + t.Errorf("Expected CIJobName to be 'job', got '%s'", tags[constants.CIJobName]) + } + if tags[constants.CIJobURL] != "job_url" { + t.Errorf("Expected CIJobURL to be 'job_url', got '%s'", tags[constants.CIJobURL]) + } + if tags[constants.CINodeName] != "node" { + t.Errorf("Expected CINodeName to be 'node', got '%s'", tags[constants.CINodeName]) + } + if tags[constants.CINodeLabels] != "labels" { + t.Errorf("Expected CINodeLabels to be 'labels', got '%s'", tags[constants.CINodeLabels]) + } + if tags[constants.CIEnvVars] != "env_vars" { + t.Errorf("Expected CIEnvVars to be 'env_vars', got '%s'", tags[constants.CIEnvVars]) + } +} + +// --------------------- Tests for createEnvironmentalDataFromTags ------------------------- + +// TestCreateEnvironmentalDataFromTags checks that a proper fileEnvironmentalData +// object is created from the given tags. +func TestCreateEnvironmentalDataFromTags(t *testing.T) { + // Nil tags should return nil. + if data := createEnvironmentalDataFromTags(nil); data != nil { + t.Error("Expected nil for nil tags") + } + + tags := map[string]string{ + constants.TestSessionName: "session", + constants.CIWorkspacePath: "/workspace", + constants.GitRepositoryURL: "repo", + constants.GitCommitSHA: "sha", + constants.GitBranch: "branch", + constants.GitTag: "tag", + constants.GitCommitAuthorDate: "date1", + constants.GitCommitAuthorName: "author", + constants.GitCommitAuthorEmail: "author@example.com", + constants.GitCommitCommitterDate: "date2", + constants.GitCommitCommitterName: "committer", + constants.GitCommitCommitterEmail: "committer@example.com", + constants.GitCommitMessage: "message", + constants.CIProviderName: "provider", + constants.CIPipelineID: "id", + constants.CIPipelineURL: "url", + constants.CIPipelineName: "name", + constants.CIPipelineNumber: "num", + constants.CIStageName: "stage", + constants.CIJobName: "job", + constants.CIJobURL: "joburl", + constants.CINodeName: "node", + constants.CINodeLabels: "labels", + constants.CIEnvVars: "env_vars", + } + + data := createEnvironmentalDataFromTags(tags) + if data == nil { + t.Fatal("Expected non-nil environmental data") + } + if data.WorkspacePath != "/workspace" { + t.Errorf("Expected WorkspacePath '/workspace', got '%s'", data.WorkspacePath) + } + // Additional field checks can be added similarly if needed. +} + +// --------------------- Tests for writeEnvironmentalDataToFile ------------------------- + +// TestWriteEnvironmentalDataToFile_NilTags verifies that if tags is nil, +// the function returns nil and does not create a file. +func TestWriteEnvironmentalDataToFile_NilTags(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + filePath := filepath.Join(tempDir, "output.env.json") + err = writeEnvironmentalDataToFile(filePath, nil) + if err != nil { + t.Errorf("Expected nil error for nil tags, got: %v", err) + } + if _, err := os.Stat(filePath); !os.IsNotExist(err) { + t.Errorf("Expected file not to exist when tags is nil") + } +} + +// TestWriteEnvironmentalDataToFile_WithTags creates a file from given tags and +// verifies that the written JSON matches the expected values. +func TestWriteEnvironmentalDataToFile_WithTags(t *testing.T) { + t.Setenv(constants.CIVisibilityEnvironmentDataFilePath, "") + + tempDir, err := os.MkdirTemp("", "envtest") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(tempDir) + + filePath := filepath.Join(tempDir, "output.env.json") + tags := map[string]string{ + constants.CIWorkspacePath: "/workspace", + constants.GitRepositoryURL: "repo", + constants.GitCommitSHA: "sha", + constants.GitBranch: "branch", + constants.GitTag: "tag", + constants.GitCommitAuthorDate: "date1", + constants.GitCommitAuthorName: "author", + constants.GitCommitAuthorEmail: "author@example.com", + constants.GitCommitCommitterDate: "date2", + constants.GitCommitCommitterName: "committer", + constants.GitCommitCommitterEmail: "committer@example.com", + constants.GitCommitMessage: "message", + constants.CIProviderName: "provider", + constants.CIPipelineID: "id", + constants.CIPipelineURL: "url", + constants.CIPipelineName: "name", + constants.CIPipelineNumber: "num", + constants.CIStageName: "stage", + constants.CIJobName: "job", + constants.CIJobURL: "joburl", + constants.CINodeName: "node", + constants.CINodeLabels: "labels", + constants.CIEnvVars: "env_vars", + } + + err = writeEnvironmentalDataToFile(filePath, tags) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + data, err := os.ReadFile(filePath) + if err != nil { + t.Fatalf("Error reading file: %v", err) + } + var envData fileEnvironmentalData + if err := json.Unmarshal(data, &envData); err != nil { + t.Fatalf("Error decoding JSON: %v", err) + } + if envData.WorkspacePath != "/workspace" { + t.Errorf("Expected WorkspacePath '/workspace', got '%s'", envData.WorkspacePath) + } + // Additional field checks can be added similarly if needed. +} diff --git a/internal/civisibility/utils/filebitmap/filebitmap.go b/internal/civisibility/utils/filebitmap/filebitmap.go new file mode 100644 index 0000000000..4b5b1a8237 --- /dev/null +++ b/internal/civisibility/utils/filebitmap/filebitmap.go @@ -0,0 +1,226 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package filebitmap + +import ( + "fmt" + "math/bits" +) + +// FileBitmap represents a memory-efficient, modifiable bitmap. +type FileBitmap struct { + data []byte +} + +// NewFileBitmapFromBytes creates a new FileBitmap from a given byte slice without modifying it. +func NewFileBitmapFromBytes(data []byte) *FileBitmap { + if data == nil { + panic("bitmap array source is nil") + } + return &FileBitmap{data: data} +} + +// FromLineCount creates a new FileBitmap that can hold the specified number of lines (bits). +func FromLineCount(lines int) *FileBitmap { + size := getSize(lines) + return &FileBitmap{data: make([]byte, size)} +} + +// FromActiveRange creates a FileBitmap with enough space for 'toLine' lines, +// and sets all bits in the range [fromLine, toLine] (1-indexed). +func FromActiveRange(fromLine, toLine int) *FileBitmap { + if fromLine <= 0 || toLine < fromLine { + panic("Invalid range") + } + fb := FromLineCount(toLine) + for i := fromLine; i <= toLine; i++ { + fb.Set(i) + } + return fb +} + +// getSize returns the number of bytes needed for numOfLines bits. +func getSize(numOfLines int) int { + return (numOfLines + 7) / 8 +} + +// Size returns the size of the bitmap in bytes. +func (fb *FileBitmap) Size() int { + return len(fb.data) +} + +// BitCount returns the total number of bits in the bitmap. +func (fb *FileBitmap) BitCount() int { + return len(fb.data) * 8 +} + +// Set sets the bit at the given line (1-indexed) to 1. +func (fb *FileBitmap) Set(line int) { + if fb.data == nil { + return + } + idx := line - 1 // adjust for zero-based index + byteIndex := idx / 8 // each byte holds 8 bits + if byteIndex >= len(fb.data) { + panic("line out of range") + } + bitMask := byte(128 >> (idx % 8)) // 128 >> (idx mod 8) creates the proper mask + fb.data[byteIndex] |= bitMask +} + +// Get returns true if the bit at the given line (1-indexed) is set to 1. +func (fb *FileBitmap) Get(line int) bool { + if fb.data == nil { + return false + } + idx := line - 1 + byteIndex := idx / 8 + if byteIndex >= len(fb.data) { + return false + } + bitMask := byte(128 >> (idx % 8)) + return (fb.data[byteIndex] & bitMask) != 0 +} + +// CountActiveBits counts the number of bits set to 1 in the bitmap. +func (fb *FileBitmap) CountActiveBits() int { + count := 0 + // Use the math/bits package to count the 1 bits in each byte. + for _, b := range fb.data { + count += bits.OnesCount8(b) + } + return count +} + +// HasActiveBits returns true if at least one bit is set in the bitmap. +func (fb *FileBitmap) HasActiveBits() bool { + for _, b := range fb.data { + if b != 0 { + return true + } + } + return false +} + +// IntersectsWith returns true if this bitmap has at least one common set bit with the other bitmap. +func (fb *FileBitmap) IntersectsWith(other *FileBitmap) bool { + minSize := len(fb.data) + if len(other.data) < minSize { + minSize = len(other.data) + } + for i := 0; i < minSize; i++ { + if (fb.data[i] & other.data[i]) != 0 { + return true + } + } + return false +} + +// Or performs a bitwise OR operation between two FileBitmaps. +// If reuseBuffer is true, the result is stored in bitmap 'a'; otherwise, a new FileBitmap is allocated. +func Or(a, b *FileBitmap, reuseBuffer bool) *FileBitmap { + var minSize, maxSize int + if len(a.data) < len(b.data) { + minSize = len(a.data) + maxSize = len(b.data) + } else { + minSize = len(b.data) + maxSize = len(a.data) + } + + var res *FileBitmap + if reuseBuffer { + res = a + } else { + res = &FileBitmap{data: make([]byte, maxSize)} + } + + // Perform bitwise OR on the overlapping region. + for i := 0; i < minSize; i++ { + res.data[i] = a.data[i] | b.data[i] + } + + // If the sizes differ, copy the remaining bytes from the larger bitmap. + if len(a.data) != len(b.data) { + if len(a.data) > len(b.data) { + for i := minSize; i < maxSize; i++ { + res.data[i] = a.data[i] + } + } else { + for i := minSize; i < maxSize; i++ { + res.data[i] = b.data[i] + } + } + } + + return res +} + +// And performs a bitwise AND operation between two FileBitmaps. +// If reuseBuffer is true, the result is stored in bitmap 'a'; otherwise, a new FileBitmap is allocated. +func And(a, b *FileBitmap, reuseBuffer bool) *FileBitmap { + var minSize, maxSize int + if len(a.data) < len(b.data) { + minSize = len(a.data) + maxSize = len(b.data) + } else { + minSize = len(b.data) + maxSize = len(a.data) + } + + var res *FileBitmap + if reuseBuffer { + res = a + } else { + res = &FileBitmap{data: make([]byte, maxSize)} + } + + // Perform bitwise AND on the overlapping region. + for i := 0; i < minSize; i++ { + res.data[i] = a.data[i] & b.data[i] + } + // For the remaining bytes (if any), fill with 0. + for i := minSize; i < maxSize; i++ { + res.data[i] = 0 + } + return res +} + +// Not performs a bitwise NOT operation on a FileBitmap. +// If reuseBuffer is true, the result is stored in the original bitmap; otherwise, a new FileBitmap is allocated. +func Not(a *FileBitmap, reuseBuffer bool) *FileBitmap { + var res *FileBitmap + if reuseBuffer { + res = a + } else { + res = &FileBitmap{data: make([]byte, len(a.data))} + } + for i, b := range a.data { + res.data[i] = ^b + } + return res +} + +// ToArray returns a new copy of the bitmap data. +func (fb *FileBitmap) ToArray() []byte { + dst := make([]byte, len(fb.data)) + copy(dst, fb.data) + return dst +} + +// GetBuffer returns the internal byte buffer of the bitmap. +func (fb *FileBitmap) GetBuffer() []byte { + return fb.data +} + +// String returns a string representation of the bitmap as a binary string. +func (fb *FileBitmap) String() string { + s := "" + for _, b := range fb.data { + s += fmt.Sprintf("%08b", b) + } + return s +} diff --git a/internal/civisibility/utils/filebitmap/filebitmap_test.go b/internal/civisibility/utils/filebitmap/filebitmap_test.go new file mode 100644 index 0000000000..d8872f2911 --- /dev/null +++ b/internal/civisibility/utils/filebitmap/filebitmap_test.go @@ -0,0 +1,284 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package filebitmap + +import ( + "testing" +) + +// TestConstructorWithSizeCreatesEmptyBitmap verifies that a new bitmap (created from a byte slice) +// has the expected size and that all bits are initially false. +func TestConstructorWithSizeCreatesEmptyBitmap(t *testing.T) { + lines := 135 + size := getSize(lines) + bitmap := NewFileBitmapFromBytes(make([]byte, size)) + + if bitmap.Size() != size { + t.Errorf("expected size %d, got %d", size, bitmap.Size()) + } + + // Check each bit (1-indexed) is false. + for i := 0; i < lines; i++ { + if bitmap.Get(i + 1) { + t.Errorf("expected bit %d to be false", i+1) + } + } +} + +// TestSetSingleBitSetsBitCorrectly verifies that setting a single bit works. +func TestSetSingleBitSetsBitCorrectly(t *testing.T) { + bitmap := NewFileBitmapFromBytes(make([]byte, 1)) + bitmap.Set(1) // Set the first bit + if !bitmap.Get(1) { + t.Errorf("expected bit 1 to be set") + } +} + +// TestCountActiveBitsNoBitsSetReturnsZero verifies that a bitmap with no bits set returns zero. +func TestCountActiveBitsNoBitsSetReturnsZero(t *testing.T) { + bitmap := NewFileBitmapFromBytes(make([]byte, 1)) + if count := bitmap.CountActiveBits(); count != 0 { + t.Errorf("expected 0 active bits, got %d", count) + } +} + +// TestCountActiveBitsOneBitSetReturnsOne verifies that a bitmap with one bit set returns one. +func TestCountActiveBitsOneBitSetReturnsOne(t *testing.T) { + bitmap := NewFileBitmapFromBytes(make([]byte, 1)) + bitmap.Set(1) + if count := bitmap.CountActiveBits(); count != 1 { + t.Errorf("expected 1 active bit, got %d", count) + } +} + +// TestBitwiseOrTwoBitmapsCombinesCorrectly verifies the OR operation on two bitmaps. +func TestBitwiseOrTwoBitmapsCombinesCorrectly(t *testing.T) { + bitmapA := NewFileBitmapFromBytes([]byte{0b00000001}) + bitmapB := NewFileBitmapFromBytes([]byte{0b00000010}) + resultBitmap := Or(bitmapA, bitmapB, false) + result := resultBitmap.ToArray() + if result[0] != 0b00000011 { + t.Errorf("expected 0b00000011, got %08b", result[0]) + } +} + +// TestBitwiseAndTwoBitmapsIntersectsCorrectly verifies the AND operation on two bitmaps. +func TestBitwiseAndTwoBitmapsIntersectsCorrectly(t *testing.T) { + bitmapA := NewFileBitmapFromBytes([]byte{0b00000011}) + bitmapB := NewFileBitmapFromBytes([]byte{0b00000010}) + resultBitmap := And(bitmapA, bitmapB, false) + result := resultBitmap.ToArray() + if result[0] != 0b00000010 { + t.Errorf("expected 0b00000010, got %08b", result[0]) + } +} + +// TestBitwiseNotSingleBitmapInvertsCorrectly verifies that the NOT operation correctly inverts the bits. +func TestBitwiseNotSingleBitmapInvertsCorrectly(t *testing.T) { + bitmap := NewFileBitmapFromBytes([]byte{0b11111110}) + resultBitmap := Not(bitmap, false) + result := resultBitmap.ToArray() + if result[0] != 0b00000001 { + t.Errorf("expected 0b00000001, got %08b", result[0]) + } +} + +// TestLargeBitmapBitwiseOperationsHandleCorrectly verifies bitwise operations on larger bitmaps. +func TestLargeBitmapBitwiseOperationsHandleCorrectly(t *testing.T) { + size := 1024 // 1 KB in bytes + bitmapA := NewFileBitmapFromBytes(make([]byte, size)) + bitmapB := NewFileBitmapFromBytes(make([]byte, size)) + totalBits := size * 8 + + // Set alternating bits in bitmapA and bitmapB with shifted positions. + for i := 1; i <= totalBits; i += 2 { + bitmapA.Set(i) + if i+1 <= totalBits { + bitmapB.Set(i + 1) + } + } + + resultOr := Or(bitmapA, bitmapB, false) + resultAnd := And(bitmapA, bitmapB, false) + + if count := resultOr.CountActiveBits(); count != totalBits { + t.Errorf("expected all %d bits set in OR result, got %d", totalBits, count) + } + if count := resultAnd.CountActiveBits(); count != 0 { + t.Errorf("expected 0 bits set in AND result, got %d", count) + } +} + +// TestBitwiseNotComplexPatternInvertsCorrectly verifies that a complex pattern is inverted properly. +func TestBitwiseNotComplexPatternInvertsCorrectly(t *testing.T) { + size := 256 // 256 bytes + pattern := make([]byte, size) + for i := 0; i < size; i++ { + if i%2 == 0 { + pattern[i] = 0xAA + } else { + pattern[i] = 0x55 + } + } + + bitmap := NewFileBitmapFromBytes(pattern) + invertedBitmap := Not(bitmap, false) + totalBits := size * 8 + + for i := 0; i < totalBits; i++ { + originalBit := bitmap.Get(i + 1) + invertedBit := invertedBitmap.Get(i + 1) + if originalBit == invertedBit { + t.Errorf("bit %d: expected inversion, got same value", i+1) + } + } +} + +// TestToArrayWithVariousBitSetsReturnsExpectedByteArray verifies that setting various bits produces the expected byte array. +func TestToArrayWithVariousBitSetsReturnsExpectedByteArray(t *testing.T) { + tests := []struct { + bitsToSet []int + expected []byte + }{ + {[]int{1, 8}, []byte{0b10000001, 0x00, 0x00, 0x00}}, + {[]int{9, 32}, []byte{0x00, 0b10000000, 0x00, 0b00000001}}, + {[]int{1, 8, 9, 32}, []byte{0b10000001, 0b10000000, 0x00, 0b00000001}}, + } + + for _, tt := range tests { + bitmap := NewFileBitmapFromBytes(make([]byte, 4)) // 4 bytes = 32 bits + for _, bit := range tt.bitsToSet { + bitmap.Set(bit) + } + actual := bitmap.ToArray() + if len(actual) != len(tt.expected) { + t.Errorf("expected array length %d, got %d", len(tt.expected), len(actual)) + } + for i, b := range tt.expected { + if actual[i] != b { + t.Errorf("at index %d, expected %08b, got %08b", i, b, actual[i]) + } + } + } +} + +// TestEnumeratorCorrectlyIteratesOverBits verifies that iterating over the internal byte slice +// yields the correct bit states. (Note: our Go implementation does not provide a dedicated enumerator, +// so we iterate over the underlying data.) +func TestEnumeratorCorrectlyIteratesOverBits(t *testing.T) { + tests := []struct { + bitmapBytes []byte + expectedBitStates []bool + }{ + { + []byte{0b10101010}, + []bool{true, false, true, false, true, false, true, false}, + }, + { + []byte{0b11110000}, + []bool{true, true, true, true, false, false, false, false}, + }, + { + []byte{0b00000000, 0b11111111}, + []bool{ + false, false, false, false, false, false, false, false, + true, true, true, true, true, true, true, true, + }, + }, + } + + for _, tt := range tests { + bitmap := NewFileBitmapFromBytes(tt.bitmapBytes) + var iterated []bool + for _, b := range bitmap.data { + for bitPos := 0; bitPos < 8; bitPos++ { + // Extract bit from most significant to least significant. + bit := (b & (1 << (7 - bitPos))) != 0 + iterated = append(iterated, bit) + } + } + if len(iterated) != len(tt.expectedBitStates) { + t.Errorf("expected %d bits, got %d", len(tt.expectedBitStates), len(iterated)) + } + for i, expected := range tt.expectedBitStates { + if iterated[i] != expected { + t.Errorf("bit %d: expected %v, got %v", i, expected, iterated[i]) + } + } + } +} + +// TestGivenARangeWhenCreatingFileBitmapProperBitsAreSet verifies that FromActiveRange +// properly sets bits in a given range and panics on invalid ranges. +func TestGivenARangeWhenCreatingFileBitmapProperBitsAreSet(t *testing.T) { + tests := []struct { + from int + to int + shouldPanic bool + }{ + {0, 10, true}, + {15, 10, true}, + {1, 10, false}, + {5, 15, false}, + {5, 5, false}, + } + + for _, tt := range tests { + if tt.shouldPanic { + didPanic := false + func() { + defer func() { + if r := recover(); r != nil { + didPanic = true + } + }() + _ = FromActiveRange(tt.from, tt.to) + }() + if !didPanic { + t.Errorf("expected panic for range (%d, %d)", tt.from, tt.to) + } + } else { + bitmap := FromActiveRange(tt.from, tt.to) + if bitmap.BitCount() < tt.to { + t.Errorf("expected bitmap bit count to be >= %d, got %d", tt.to, bitmap.BitCount()) + } + for x := 1; x <= bitmap.BitCount(); x++ { + bit := bitmap.Get(x) + expected := (x >= tt.from && x <= tt.to) + if bit != expected { + t.Errorf("bit %d: expected %v, got %v", x, expected, bit) + } + } + } + } +} + +// TestGivenTwoRangesWhenIntersectingFileBitmapsResultIsExpected verifies that the +// IntersectsWith method correctly identifies overlapping ranges. +func TestGivenTwoRangesWhenIntersectingFileBitmapsResultIsExpected(t *testing.T) { + tests := []struct { + from1, to1 int + from2, to2 int + intersect bool + }{ + {1, 10, 11, 15, false}, + {11, 15, 1, 10, false}, + {1, 10, 8, 15, true}, + {8, 15, 10, 15, true}, + {8, 15, 15, 16, true}, + {30, 36, 35, 35, true}, + } + + for _, tt := range tests { + bitmap1 := FromActiveRange(tt.from1, tt.to1) + bitmap2 := FromActiveRange(tt.from2, tt.to2) + result := bitmap1.IntersectsWith(bitmap2) + if result != tt.intersect { + t.Errorf("Intersection of range (%d, %d) and (%d, %d): expected %v, got %v", + tt.from1, tt.to1, tt.from2, tt.to2, tt.intersect, result) + } + } +} diff --git a/internal/civisibility/utils/git.go b/internal/civisibility/utils/git.go index 6e5284f584..972aaccec3 100644 --- a/internal/civisibility/utils/git.go +++ b/internal/civisibility/utils/git.go @@ -15,20 +15,19 @@ import ( "strconv" "strings" "sync" + "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // MaxPackFileSizeInMb is the maximum size of a pack file in megabytes. const MaxPackFileSizeInMb = 3 -// localGitData holds various pieces of information about the local Git repository, -// including the source root, repository URL, branch, commit SHA, author and committer details, and commit message. -type localGitData struct { - SourceRoot string - RepositoryURL string - Branch string +// localCommitData holds information about a single commit in the local Git repository. +type localCommitData struct { CommitSha string AuthorDate time.Time AuthorName string @@ -39,20 +38,67 @@ type localGitData struct { CommitMessage string } +// localGitData holds various pieces of information about the local Git repository, +// including the source root, repository URL, branch, commit SHA, author and committer details, and commit message. +type localGitData struct { + localCommitData + SourceRoot string + RepositoryURL string + Branch string +} + +// gitVersionData holds the major, minor, and patch version numbers of the Git executable. +type gitVersionData struct { + major int + minor int + patch int + err error +} + var ( + // gitCommandMutex is a mutex used to synchronize access to Git commands to prevent lock errors in git + gitCommandMutex sync.Mutex + // regexpSensitiveInfo is a regular expression used to match and filter out sensitive information from URLs. regexpSensitiveInfo = regexp.MustCompile("(https?://|ssh?://)[^/]*@") + // Constants for base branch detection algorithm + possibleBaseBranches = []string{"main", "master", "preprod", "prod", "dev", "development", "trunk"} + + // BASE_LIKE_BRANCH_FILTER - regex to check if the branch name is similar to a possible base branch + baseLikeBranchFilter = regexp.MustCompile(`^(main|master|preprod|prod|dev|development|trunk|release\/.*|hotfix\/.*)$`) + + // Cached data + // isGitFoundValue is a boolean flag indicating whether the Git executable is available on the system. isGitFoundValue bool // gitFinder is a sync.Once instance used to ensure that the Git executable is only checked once. - gitFinder sync.Once + gitFinderOnce sync.Once + + // gitVersion is a sync.Once instance used to ensure that the Git version is only retrieved once. + gitVersionOnce sync.Once + + // gitVersionValue holds the version of the Git executable installed on the system. + gitVersionValue gitVersionData + + // isAShallowCloneRepositoryOnce is a sync.Once instance used to ensure that the check for a shallow clone repository is only performed once. + isAShallowCloneRepositoryOnce atomic.Pointer[sync.Once] + + // isAShallowCloneRepositoryValue is a boolean flag indicating whether the repository is a shallow clone. + isAShallowCloneRepositoryValue bool ) +// branchMetrics holds metrics for evaluating base branch candidates +type branchMetrics struct { + behind int + ahead int + baseSha string +} + // isGitFound checks if the Git executable is available on the system. func isGitFound() bool { - gitFinder.Do(func() { + gitFinderOnce.Do(func() { _, err := exec.LookPath("git") isGitFoundValue = err == nil if err != nil { @@ -63,22 +109,102 @@ func isGitFound() bool { } // execGit executes a Git command with the given arguments. -func execGit(args ...string) ([]byte, error) { +func execGit(commandType telemetry.CommandType, args ...string) (val []byte, err error) { + startTime := time.Now() + if commandType != telemetry.NotSpecifiedCommandsType { + telemetry.GitCommand(commandType) + defer func() { + telemetry.GitCommandMs(commandType, float64(time.Since(startTime).Milliseconds())) + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + switch exitErr.ExitCode() { + case -1: + telemetry.GitCommandErrors(commandType, telemetry.ECMinus1CommandExitCode) + case 1: + telemetry.GitCommandErrors(commandType, telemetry.EC1CommandExitCode) + case 2: + telemetry.GitCommandErrors(commandType, telemetry.EC2CommandExitCode) + case 127: + telemetry.GitCommandErrors(commandType, telemetry.EC127CommandExitCode) + case 128: + telemetry.GitCommandErrors(commandType, telemetry.EC128CommandExitCode) + case 129: + telemetry.GitCommandErrors(commandType, telemetry.EC129CommandExitCode) + default: + telemetry.GitCommandErrors(commandType, telemetry.UnknownCommandExitCode) + } + } else if err != nil { + telemetry.GitCommandErrors(commandType, telemetry.MissingCommandExitCode) + } + }() + } + if log.DebugEnabled() { + defer func() { + durationInMs := time.Since(startTime).Milliseconds() + if err != nil { + log.Debug("civisibility.git.command [%s][%s][%dms]: git %s", commandType, err.Error(), durationInMs, strings.Join(args, " ")) + } else { + log.Debug("civisibility.git.command [%s][%dms]: git %s", commandType, durationInMs, strings.Join(args, " ")) + } + }() + } if !isGitFound() { return nil, errors.New("git executable not found") } + gitCommandMutex.Lock() + defer gitCommandMutex.Unlock() return exec.Command("git", args...).CombinedOutput() } // execGitString executes a Git command with the given arguments and returns the output as a string. -func execGitString(args ...string) (string, error) { - out, err := execGit(args...) +func execGitString(commandType telemetry.CommandType, args ...string) (string, error) { + out, err := execGit(commandType, args...) strOut := strings.TrimSpace(strings.Trim(string(out), "\n")) return strOut, err } // execGitStringWithInput executes a Git command with the given input and arguments and returns the output as a string. -func execGitStringWithInput(input string, args ...string) (string, error) { +func execGitStringWithInput(commandType telemetry.CommandType, input string, args ...string) (val string, err error) { + startTime := time.Now() + if commandType != telemetry.NotSpecifiedCommandsType { + telemetry.GitCommand(commandType) + defer func() { + telemetry.GitCommandMs(commandType, float64(time.Since(startTime).Milliseconds())) + var exitErr *exec.ExitError + if errors.As(err, &exitErr) { + switch exitErr.ExitCode() { + case -1: + telemetry.GitCommandErrors(commandType, telemetry.ECMinus1CommandExitCode) + case 1: + telemetry.GitCommandErrors(commandType, telemetry.EC1CommandExitCode) + case 2: + telemetry.GitCommandErrors(commandType, telemetry.EC2CommandExitCode) + case 127: + telemetry.GitCommandErrors(commandType, telemetry.EC127CommandExitCode) + case 128: + telemetry.GitCommandErrors(commandType, telemetry.EC128CommandExitCode) + case 129: + telemetry.GitCommandErrors(commandType, telemetry.EC129CommandExitCode) + default: + telemetry.GitCommandErrors(commandType, telemetry.UnknownCommandExitCode) + } + } else if err != nil { + telemetry.GitCommandErrors(commandType, telemetry.MissingCommandExitCode) + } + }() + } + if log.DebugEnabled() { + defer func() { + durationInMs := time.Since(startTime).Milliseconds() + if err != nil { + log.Debug("civisibility.git.command [%s][%s][%dms]: git %s", commandType, err.Error(), durationInMs, strings.Join(args, " ")) + } else { + log.Debug("civisibility.git.command [%s][%dms]: git %s", commandType, durationInMs, strings.Join(args, " ")) + } + }() + } + gitCommandMutex.Lock() + defer gitCommandMutex.Unlock() cmd := exec.Command("git", args...) cmd.Stdin = strings.NewReader(input) out, err := cmd.CombinedOutput() @@ -87,20 +213,31 @@ func execGitStringWithInput(input string, args ...string) (string, error) { } // getGitVersion retrieves the version of the Git executable installed on the system. -func getGitVersion() (major int, minor int, patch int, error error) { - out, err := execGitString("--version") - if err != nil { - return 0, 0, 0, err - } - out = strings.TrimSpace(strings.ReplaceAll(out, "git version ", "")) - versionParts := strings.Split(out, ".") - if len(versionParts) < 3 { - return 0, 0, 0, errors.New("invalid git version") - } - major, _ = strconv.Atoi(versionParts[0]) - minor, _ = strconv.Atoi(versionParts[1]) - patch, _ = strconv.Atoi(versionParts[2]) - return major, minor, patch, nil +func getGitVersion() (major int, minor int, patch int, err error) { + gitVersionOnce.Do(func() { + out, lerr := execGitString(telemetry.NotSpecifiedCommandsType, "--version") + if lerr != nil { + gitVersionValue = gitVersionData{err: lerr} + return + } + out = strings.TrimSpace(strings.ReplaceAll(out, "git version ", "")) + versionParts := strings.Split(out, ".") + if len(versionParts) < 3 { + gitVersionValue = gitVersionData{err: errors.New("invalid git version")} + return + } + major, _ = strconv.Atoi(versionParts[0]) + minor, _ = strconv.Atoi(versionParts[1]) + patch, _ = strconv.Atoi(versionParts[2]) + gitVersionValue = gitVersionData{ + major: major, + minor: minor, + patch: patch, + err: nil, + } + }) + + return gitVersionValue.major, gitVersionValue.minor, gitVersionValue.patch, gitVersionValue.err } // getLocalGitData retrieves information about the local Git repository from the current HEAD. @@ -117,30 +254,44 @@ func getLocalGitData() (localGitData, error) { return gitData, errors.New("git executable not found") } + // Ensure we have permissions to read the git directory + if currentDir, err := os.Getwd(); err == nil { + if gitDir, err := getParentGitFolder(currentDir); err == nil && gitDir != "" { + log.Debug("civisibility.git: setting permissions to git folder: %s", gitDir) + if out, err := execGitString(telemetry.GitAddPermissionCommandType, "config", "--global", "--add", "safe.directory", gitDir); err != nil { + log.Debug("civisibility.git: error while setting permissions to git folder: %s\n out: %s\n error: %s", gitDir, out, err.Error()) + } + } else { + log.Debug("civisibility.git: error getting the parent git folder.") + } + } else { + log.Debug("civisibility.git: error getting the current working directory.") + } + // Extract the absolute path to the Git directory log.Debug("civisibility.git: getting the absolute path to the Git directory") - out, err := execGitString("rev-parse", "--absolute-git-dir") + out, err := execGitString(telemetry.GetWorkingDirectoryCommandType, "rev-parse", "--show-toplevel") if err == nil { - gitData.SourceRoot = strings.ReplaceAll(out, ".git", "") + gitData.SourceRoot = out } // Extract the repository URL log.Debug("civisibility.git: getting the repository URL") - out, err = execGitString("ls-remote", "--get-url") + out, err = execGitString(telemetry.GetRepositoryCommandsType, "ls-remote", "--get-url") if err == nil { gitData.RepositoryURL = filterSensitiveInfo(out) } // Extract the current branch name log.Debug("civisibility.git: getting the current branch name") - out, err = execGitString("rev-parse", "--abbrev-ref", "HEAD") + out, err = execGitString(telemetry.GetBranchCommandsType, "rev-parse", "--abbrev-ref", "HEAD") if err == nil { gitData.Branch = out } // Get commit details from the latest commit using git log (git log -1 --pretty='%H","%aI","%an","%ae","%cI","%cn","%ce","%B') log.Debug("civisibility.git: getting the latest commit details") - out, err = execGitString("log", "-1", "--pretty=%H\",\"%at\",\"%an\",\"%ae\",\"%ct\",\"%cn\",\"%ce\",\"%B") + out, err = execGitString(telemetry.GetGitCommitInfoCommandType, "log", "-1", "--pretty=%H\",\"%at\",\"%an\",\"%ae\",\"%ct\",\"%cn\",\"%ce\",\"%B") if err != nil { return gitData, err } @@ -167,11 +318,94 @@ func getLocalGitData() (localGitData, error) { return gitData, nil } +// fetchCommitData retrieves commit data for a specific commit SHA in a shallow clone Git repository. +func fetchCommitData(commitSha string) (localCommitData, error) { + commitData := localCommitData{} + + // let's do a first check to see if the repository is a shallow clone + log.Debug("civisibility.fetchCommitData: checking if the repository is a shallow clone") + isAShallowClone, err := isAShallowCloneRepository() + if err != nil { + return commitData, fmt.Errorf("civisibility.fetchCommitData: error checking if the repository is a shallow clone: %s", err) + } + + // if the git repo is a shallow clone, we try to fecth the commit sha data + if isAShallowClone { + // let's check the git version >= 2.27.0 (git --version) to see if we can unshallow the repository + log.Debug("civisibility.fetchCommitData: checking the git version") + major, minor, patch, err := getGitVersion() + if err != nil { + return commitData, fmt.Errorf("civisibility.fetchCommitData: error getting the git version: %s", err) + } + log.Debug("civisibility.fetchCommitData: git version: %d.%d.%d", major, minor, patch) + if major < 2 || (major == 2 && minor < 27) { + log.Debug("civisibility.fetchCommitData: the git version is less than 2.27.0 we cannot unshallow the repository") + return commitData, nil + } + + // let's get the remote name + remoteName, err := getRemoteName() + if err != nil { + return commitData, fmt.Errorf("civisibility.fetchCommitData: error getting the remote name: %s\n%s", err, remoteName) + } + if remoteName == "" { + // if the origin name is empty, we fallback to "origin" + remoteName = "origin" + } + log.Debug("civisibility.fetchCommitData: remote name: %s", remoteName) + + // let's fetch the missing commits and trees from a commit sha + // git fetch --update-shallow --filter="blob:none" --recurse-submodules=no --no-write-fetch-head + log.Debug("civisibility.fetchCommitData: fetching the missing commits and trees from the last month") + if fetchOutput, fetchErr := execGitString( + telemetry.FetchCommandType, + "fetch", + "--update-shallow", + "--filter=blob:none", + "--recurse-submodules=no", + "--no-write-fetch-head", + remoteName, + commitSha); fetchErr != nil { + return commitData, fmt.Errorf("civisibility.fetchCommitData: error: %s\n%s", fetchErr, fetchOutput) + } + } + + // Get commit details from the latest commit using git log (git show -s --format='%H","%aI","%an","%ae","%cI","%cn","%ce","%B') + log.Debug("civisibility.git: getting the latest commit details") + out, err := execGitString(telemetry.GetGitCommitInfoCommandType, "show", commitSha, "-s", "--format=%H\",\"%at\",\"%an\",\"%ae\",\"%ct\",\"%cn\",\"%ce\",\"%B") + if err != nil { + return commitData, err + } + + // Split the output into individual components + outArray := strings.Split(out, "\",\"") + if len(outArray) < 8 { + return commitData, errors.New("git log failed") + } + + // Parse author and committer dates from Unix timestamp + authorUnixDate, _ := strconv.ParseInt(outArray[1], 10, 64) + committerUnixDate, _ := strconv.ParseInt(outArray[4], 10, 64) + + // Populate the localGitData struct with the parsed information + commitData.CommitSha = outArray[0] + commitData.AuthorDate = time.Unix(authorUnixDate, 0) + commitData.AuthorName = outArray[2] + commitData.AuthorEmail = outArray[3] + commitData.CommitterDate = time.Unix(committerUnixDate, 0) + commitData.CommitterName = outArray[5] + commitData.CommitterEmail = outArray[6] + commitData.CommitMessage = strings.Trim(outArray[7], "\n") + + log.Debug("civisibility.fetchCommitData: was completed successfully") + return commitData, nil +} + // GetLastLocalGitCommitShas retrieves the commit SHAs of the last 1000 commits in the local Git repository. func GetLastLocalGitCommitShas() []string { // git log --format=%H -n 1000 --since=\"1 month ago\" log.Debug("civisibility.git: getting the commit SHAs of the last 1000 commits in the local Git repository") - out, err := execGitString("log", "--format=%H", "-n", "1000", "--since=\"1 month ago\"") + out, err := execGitString(telemetry.GetLocalCommitsCommandsType, "log", "--format=%H", "-n", "1000", "--since=\"1 month ago\"") if err != nil || out == "" { return []string{} } @@ -185,7 +419,7 @@ func UnshallowGitRepository() (bool, error) { log.Debug("civisibility.unshallow: checking if the repository is a shallow clone") isAShallowClone, err := isAShallowCloneRepository() if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error checking if the repository is a shallow clone: %s", err.Error()) + return false, fmt.Errorf("civisibility.unshallow: error checking if the repository is a shallow clone: %s", err) } // if the git repo is not a shallow clone, we can return early @@ -198,7 +432,7 @@ func UnshallowGitRepository() (bool, error) { log.Debug("civisibility.unshallow: the repository is a shallow clone, checking if there are more than one commit in the logs") hasMoreThanOneCommits, err := hasTheGitLogHaveMoreThanOneCommits() if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error checking if the git log has more than one commit: %s", err.Error()) + return false, fmt.Errorf("civisibility.unshallow: error checking if the git log has more than one commit: %s", err) } // if there are more than 1 commits, we can return early @@ -211,9 +445,9 @@ func UnshallowGitRepository() (bool, error) { log.Debug("civisibility.unshallow: checking the git version") major, minor, patch, err := getGitVersion() if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error getting the git version: %s", err.Error()) + return false, fmt.Errorf("civisibility.unshallow: error getting the git version: %s", err) } - log.Debug("civisibility.unshallow: git version: %v.%v.%v", major, minor, patch) + log.Debug("civisibility.unshallow: git version: %d.%d.%d", major, minor, patch) if major < 2 || (major == 2 && minor < 27) { log.Debug("civisibility.unshallow: the git version is less than 2.27.0 we cannot unshallow the repository") return false, nil @@ -222,39 +456,39 @@ func UnshallowGitRepository() (bool, error) { // after asking for 2 logs lines, if the git log command returns just one commit sha, we reconfigure the repo // to ask for git commits and trees of the last month (no blobs) - // let's get the origin name (git config --default origin --get clone.defaultRemoteName) - originName, err := execGitString("config", "--default", "origin", "--get", "clone.defaultRemoteName") + // let's get the remote name + remoteName, err := getRemoteName() if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error getting the origin name: %s\n%s", err.Error(), originName) + return false, fmt.Errorf("civisibility.unshallow: error getting the remote name: %s\n%s", err, remoteName) } - if originName == "" { + if remoteName == "" { // if the origin name is empty, we fallback to "origin" - originName = "origin" + remoteName = "origin" } - log.Debug("civisibility.unshallow: origin name: %v", originName) + log.Debug("civisibility.unshallow: remote name: %s", remoteName) // let's get the sha of the HEAD (git rev-parse HEAD) - headSha, err := execGitString("rev-parse", "HEAD") + headSha, err := execGitString(telemetry.GetHeadCommandsType, "rev-parse", "HEAD") if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error getting the HEAD sha: %s\n%s", err.Error(), headSha) + return false, fmt.Errorf("civisibility.unshallow: error getting the HEAD sha: %s\n%s", err, headSha) } if headSha == "" { // if the HEAD is empty, we fallback to the current branch (git branch --show-current) - headSha, err = execGitString("branch", "--show-current") + headSha, err = execGitString(telemetry.GetBranchCommandsType, "branch", "--show-current") if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error getting the current branch: %s\n%s", err.Error(), headSha) + return false, fmt.Errorf("civisibility.unshallow: error getting the current branch: %s\n%s", err, headSha) } } - log.Debug("civisibility.unshallow: HEAD sha: %v", headSha) + log.Debug("civisibility.unshallow: HEAD sha: %s", headSha) // let's fetch the missing commits and trees from the last month // git fetch --shallow-since="1 month ago" --update-shallow --filter="blob:none" --recurse-submodules=no $(git config --default origin --get clone.defaultRemoteName) $(git rev-parse HEAD) log.Debug("civisibility.unshallow: fetching the missing commits and trees from the last month") - fetchOutput, err := execGitString("fetch", "--shallow-since=\"1 month ago\"", "--update-shallow", "--filter=blob:none", "--recurse-submodules=no", originName, headSha) + fetchOutput, err := execGitString(telemetry.UnshallowCommandsType, "fetch", "--shallow-since=\"1 month ago\"", "--update-shallow", "--filter=blob:none", "--recurse-submodules=no", remoteName, headSha) // let's check if the last command was unsuccessful if err != nil || fetchOutput == "" { - log.Debug("civisibility.unshallow: error fetching the missing commits and trees from the last month: %v", err) + log.Debug("civisibility.unshallow: error fetching the missing commits and trees from the last month: %s", err.Error()) // *** // The previous command has a drawback: if the local HEAD is a commit that has not been pushed to the remote, it will fail. // If this is the case, we fallback to: `git fetch --shallow-since="1 month ago" --update-shallow --filter="blob:none" --recurse-submodules=no $(git config --default origin --get clone.defaultRemoteName) $(git rev-parse --abbrev-ref --symbolic-full-name @{upstream})` @@ -264,36 +498,76 @@ func UnshallowGitRepository() (bool, error) { // let's get the remote branch name: git rev-parse --abbrev-ref --symbolic-full-name @{upstream} var remoteBranchName string log.Debug("civisibility.unshallow: getting the remote branch name") - remoteBranchName, err = execGitString("rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}") + remoteBranchName, err = execGitString(telemetry.UnshallowCommandsType, "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}") if err == nil { // let's try the alternative: git fetch --shallow-since="1 month ago" --update-shallow --filter="blob:none" --recurse-submodules=no $(git config --default origin --get clone.defaultRemoteName) $(git rev-parse --abbrev-ref --symbolic-full-name @{upstream}) log.Debug("civisibility.unshallow: fetching the missing commits and trees from the last month using the remote branch name") - fetchOutput, err = execGitString("fetch", "--shallow-since=\"1 month ago\"", "--update-shallow", "--filter=blob:none", "--recurse-submodules=no", originName, remoteBranchName) + fetchOutput, err = execGitString(telemetry.UnshallowCommandsType, "fetch", "--shallow-since=\"1 month ago\"", "--update-shallow", "--filter=blob:none", "--recurse-submodules=no", remoteName, remoteBranchName) } } // let's check if the last command was unsuccessful if err != nil || fetchOutput == "" { - log.Debug("civisibility.unshallow: error fetching the missing commits and trees from the last month: %v", err) + log.Debug("civisibility.unshallow: error fetching the missing commits and trees from the last month: %s", err.Error()) // *** - // It could be that the CI is working on a detached HEAD or maybe branch tracking hasn’t been set up. + // It could be that the CI is working on a detached HEAD or maybe branch tracking hasn't been set up. // In that case, this command will also fail, and we will finally fallback to we just unshallow all the things: // `git fetch --shallow-since="1 month ago" --update-shallow --filter="blob:none" --recurse-submodules=no $(git config --default origin --get clone.defaultRemoteName)` // *** // let's try the last fallback: git fetch --shallow-since="1 month ago" --update-shallow --filter="blob:none" --recurse-submodules=no $(git config --default origin --get clone.defaultRemoteName) log.Debug("civisibility.unshallow: fetching the missing commits and trees from the last month using the origin name") - fetchOutput, err = execGitString("fetch", "--shallow-since=\"1 month ago\"", "--update-shallow", "--filter=blob:none", "--recurse-submodules=no", originName) + fetchOutput, err = execGitString(telemetry.UnshallowCommandsType, "fetch", "--shallow-since=\"1 month ago\"", "--update-shallow", "--filter=blob:none", "--recurse-submodules=no", remoteName) } if err != nil { - return false, fmt.Errorf("civisibility.unshallow: error: %s\n%s", err.Error(), fetchOutput) + return false, fmt.Errorf("civisibility.unshallow: error: %s\n%s", err, fetchOutput) } log.Debug("civisibility.unshallow: was completed successfully") + tmpso := sync.Once{} + isAShallowCloneRepositoryOnce.Store(&tmpso) return true, nil } +// GetGitDiff retrieves the diff between two Git commits using the `git diff` command. +func GetGitDiff(baseCommit, headCommit string) (string, error) { + // git diff -U0 --word-diff=porcelain {baseCommit} {headCommit} + if len(baseCommit) != 40 { + // not a commit sha + var re = regexp.MustCompile(`(?i)^[a-f0-9]{40}$`) + if !re.MatchString(baseCommit) { + // first let's get the remote + remoteOut, err := execGitString(telemetry.GetRemoteCommandsType, "remote", "show") + if err != nil { + log.Debug("civisibility.git: error on git remote show origin: %s , error: %s", remoteOut, err.Error()) + } + if remoteOut == "" { + remoteOut = "origin" + } + + // let's ensure we have all the branch names from the remote + fetchOut, err := execGitString(telemetry.GetHeadCommandsType, "fetch", remoteOut, baseCommit, "--depth=1") + if err != nil { + log.Debug("civisibility.git: error fetching %s/%s: %s, error: %s", remoteOut, baseCommit, fetchOut, err.Error()) + } + + // then let's get the remote branch name + baseCommit = fmt.Sprintf("%s/%s", remoteOut, baseCommit) + } + } + + log.Debug("civisibility.git: getting the diff between %s and %s", baseCommit, headCommit) + out, err := execGitString(telemetry.DiffCommandType, "diff", "-U0", "--word-diff=porcelain", baseCommit, headCommit) + if err != nil { + return "", fmt.Errorf("civisibility.git: error getting the diff from %s to %s: %s | %s", baseCommit, headCommit, err, out) + } + if out == "" { + return "", fmt.Errorf("civisibility.git: error getting the diff from %s to %s: empty output", baseCommit, headCommit) + } + return out, nil +} + // filterSensitiveInfo removes sensitive information from a given URL using a regular expression. // It replaces the user credentials part of the URL (if present) with an empty string. // @@ -310,19 +584,32 @@ func filterSensitiveInfo(url string) string { // isAShallowCloneRepository checks if the local Git repository is a shallow clone. func isAShallowCloneRepository() (bool, error) { - // git rev-parse --is-shallow-repository - out, err := execGitString("rev-parse", "--is-shallow-repository") - if err != nil { - return false, err - } + var fErr error + var sOnce *sync.Once + sOnce = isAShallowCloneRepositoryOnce.Load() + if sOnce == nil { + sOnce = &sync.Once{} + isAShallowCloneRepositoryOnce.Store(sOnce) + } + sOnce.Do(func() { + // git rev-parse --is-shallow-repository + out, err := execGitString(telemetry.CheckShallowCommandsType, "rev-parse", "--is-shallow-repository") + if err != nil { + isAShallowCloneRepositoryValue = false + fErr = err + return + } - return strings.TrimSpace(out) == "true", nil + isAShallowCloneRepositoryValue = strings.TrimSpace(out) == "true" + }) + + return isAShallowCloneRepositoryValue, fErr } // hasTheGitLogHaveMoreThanOneCommits checks if the local Git repository has more than one commit. func hasTheGitLogHaveMoreThanOneCommits() (bool, error) { // git log --format=oneline -n 2 - out, err := execGitString("log", "--format=oneline", "-n", "2") + out, err := execGitString(telemetry.CheckShallowCommandsType, "log", "--format=oneline", "-n", "2") if err != nil || out == "" { return false, err } @@ -339,13 +626,14 @@ func getObjectsSha(commitsToInclude []string, commitsToExclude []string) []strin commitsToExcludeArgs[i] = "^" + c } args := append([]string{"rev-list", "--objects", "--no-object-names", "--filter=blob:none", "--since=\"1 month ago\"", "HEAD"}, append(commitsToExcludeArgs, commitsToInclude...)...) - out, err := execGitString(args...) + out, err := execGitString(telemetry.GetObjectsCommandsType, args...) if err != nil { return []string{} } return strings.Split(out, "\n") } +// CreatePackFiles creates pack files from the given commits to include and exclude. func CreatePackFiles(commitsToInclude []string, commitsToExclude []string) []string { // get the objects shas to send objectsShas := getObjectsSha(commitsToInclude, commitsToExclude) @@ -363,15 +651,15 @@ func CreatePackFiles(commitsToInclude []string, commitsToExclude []string) []str // get a temporary path to store the pack files temporaryPath, err := os.MkdirTemp("", "pack-objects") if err != nil { - log.Warn("civisibility: error creating temporary directory: %s", err) + log.Warn("civisibility: error creating temporary directory: %s", err.Error()) return nil } // git pack-objects --compression=9 --max-pack-size={MaxPackFileSizeInMb}m "{temporaryPath}" - out, err := execGitStringWithInput(objectsShasString, + out, err := execGitStringWithInput(telemetry.PackObjectsCommandsType, objectsShasString, "pack-objects", "--compression=9", "--max-pack-size="+strconv.Itoa(MaxPackFileSizeInMb)+"m", temporaryPath+"/") if err != nil { - log.Warn("civisibility: error creating pack files: %s", err) + log.Warn("civisibility: error creating pack files: %s", err.Error()) return nil } @@ -391,3 +679,332 @@ func CreatePackFiles(commitsToInclude []string, commitsToExclude []string) []str return packFiles } + +// getParentGitFolder searches from the given directory upwards to find the nearest .git directory. +func getParentGitFolder(innerFolder string) (string, error) { + if innerFolder == "" { + return "", nil + } + + dir := innerFolder + for { + gitDirPath := filepath.Join(dir, ".git") + info, err := os.Stat(gitDirPath) + if err == nil && info.IsDir() { + return gitDirPath, nil + } + if err != nil && !os.IsNotExist(err) { + return "", err + } + + parentDir := filepath.Dir(dir) + // If we've reached the root directory, stop the loop. + if parentDir == dir { + break + } + dir = parentDir + } + + return "", nil +} + +// isDefaultBranch checks if a branch is the default branch +func isDefaultBranch(branch, defaultBranch, remoteName string) bool { + return branch == defaultBranch || branch == remoteName+"/"+defaultBranch +} + +// detectDefaultBranch detects the default branch using git symbolic-ref +func detectDefaultBranch(remoteName string) (string, error) { + // Try to get the default branch using symbolic-ref + defaultRef, err := execGitString(telemetry.SymbolicRefCommandType, "symbolic-ref", "--quiet", "--short", "refs/remotes/"+remoteName+"/HEAD") + if err == nil && defaultRef != "" { + // Remove the remote prefix to get just the branch name + defaultBranch := removeRemotePrefix(defaultRef, remoteName) + if defaultBranch != "" { + log.Debug("civisibility.git: detected default branch from symbolic-ref: %s", defaultBranch) + return defaultBranch, nil + } + } + + log.Debug("civisibility.git: could not get symbolic-ref, trying to find a fallback (main, master)...") + + // Fallback to checking for main/master + fallbackBranch := findFallbackDefaultBranch(remoteName) + if fallbackBranch != "" { + return fallbackBranch, nil + } + + return "", errors.New("could not detect default branch") +} + +// findFallbackDefaultBranch tries to find main or master as fallback default branches +func findFallbackDefaultBranch(remoteName string) string { + fallbackBranches := []string{"main", "master"} + + for _, fallback := range fallbackBranches { + // Check if the remote branch exists + _, err := execGitString(telemetry.ShowRefCommandType, "show-ref", "--verify", "--quiet", "refs/remotes/"+remoteName+"/"+fallback) + if err == nil { + log.Debug("civisibility.git: found fallback default branch: %s", fallback) + return fallback + } + } + + return "" +} + +// GetBaseBranchSha detects the base branch SHA using the algorithm +func GetBaseBranchSha(defaultBranch string) (string, error) { + if !isGitFound() { + return "", errors.New("git executable not found") + } + + // Step 1 - collect info we'll need later + + // Step 1a - remote_name + remoteName, err := getRemoteName() + if err != nil { + return "", fmt.Errorf("failed to get remote name: %w", err) + } + + // Step 1b - source_branch + sourceBranch, err := getSourceBranch() + if err != nil { + return "", fmt.Errorf("failed to get source branch: %w", err) + } + + // Step 1c - Detect default branch automatically + detectedDefaultBranch, err := detectDefaultBranch(remoteName) + if err != nil { + // Fallback to the provided parameter if detection fails + if defaultBranch == "" { + defaultBranch = "main" // ultimate fallback + } + log.Debug("civisibility.git: failed to detect default branch, using fallback: %s", defaultBranch) + detectedDefaultBranch = defaultBranch + } + + // Step 2 - build candidate branches list and fetch them from remote + var candidateBranches []string + + // Check if we have git.pull_request.base_branch from CI provider environment variables + ciTags := GetCITags() + gitPrBaseBranch := ciTags[constants.GitPrBaseBranch] + + if gitPrBaseBranch != "" { + // Step 2b - we have git.pull_request.base_branch + log.Debug("civisibility.git: using git.pull_request.base_branch from CI: %s", gitPrBaseBranch) + checkAndFetchBranch(gitPrBaseBranch, remoteName) + candidateBranches = []string{gitPrBaseBranch} + } else { + // Step 2a - we don't have git.pull_request.base_branch + // Fetch all possible base branches from remote + for _, branch := range possibleBaseBranches { + checkAndFetchBranch(branch, remoteName) + } + + // Get the list of remote branches present in local repo and see which ones are base-like + remoteBranches, err := getRemoteBranches(remoteName) + if err != nil { + return "", fmt.Errorf("failed to get remote branches: %w", err) + } + + for _, branch := range remoteBranches { + if branch != sourceBranch && isMainLikeBranch(branch, remoteName) { + candidateBranches = append(candidateBranches, branch) + } + } + } + + if len(candidateBranches) == 0 { + return "", errors.New("no candidate base branches found") + } + + // Step 3 - find the best base branch + if len(candidateBranches) == 1 { + // Step 3a - single candidate + baseSha, err := execGitString(telemetry.MergeBaseCommandType, "merge-base", candidateBranches[0], sourceBranch) + if err != nil { + return "", fmt.Errorf("failed to find merge base for %s and %s: %w", candidateBranches[0], sourceBranch, err) + } + return baseSha, nil + } + + // Step 3b - multiple candidates + metrics, err := computeBranchMetrics(candidateBranches, sourceBranch) + if err != nil { + return "", fmt.Errorf("failed to compute branch metrics: %w", err) + } + + baseSha := findBestBranch(metrics, detectedDefaultBranch, remoteName) + if baseSha == "" { + return "", errors.New("failed to find best base branch") + } + + return baseSha, nil +} + +// getRemoteName determines the remote name using the algorithm from algorithm.md +func getRemoteName() (string, error) { + // Try to find remote from upstream tracking + upstream, err := execGitString(telemetry.GetRemoteUpstreamTrackingCommandsType, "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{upstream}") + if err == nil && upstream != "" { + parts := strings.Split(upstream, "/") + if len(parts) > 0 { + return parts[0], nil + } + } + + // Fallback to first remote if no upstream + remotes, err := execGitString(telemetry.GetRemoteCommandsType, "remote") + if err != nil { + return "origin", nil // ultimate fallback + } + + lines := strings.Split(strings.TrimSpace(remotes), "\n") + if len(lines) > 0 && lines[0] != "" { + return lines[0], nil + } + + return "origin", nil +} + +// getSourceBranch gets the current branch name +func getSourceBranch() (string, error) { + return execGitString(telemetry.GetBranchCommandsType, "rev-parse", "--abbrev-ref", "HEAD") +} + +// isMainLikeBranch checks if a branch name matches the base-like branch pattern +func isMainLikeBranch(branchName, remoteName string) bool { + shortBranchName := removeRemotePrefix(branchName, remoteName) + return baseLikeBranchFilter.MatchString(shortBranchName) +} + +// removeRemotePrefix removes the remote prefix from a branch name +func removeRemotePrefix(branchName, remoteName string) string { + prefix := remoteName + "/" + if strings.HasPrefix(branchName, prefix) { + return strings.TrimPrefix(branchName, prefix) + } + return branchName +} + +// checkAndFetchBranch checks if a branch exists and fetches it if needed +func checkAndFetchBranch(branch, remoteName string) { + // Check if branch exists locally (as remote ref) + _, err := execGitString(telemetry.ShowRefCommandType, "show-ref", "--verify", "--quiet", "refs/remotes/"+remoteName+"/"+branch) + if err == nil { + return // branch exists locally + } + + // Check if branch exists in remote + remoteHeads, err := execGitString(telemetry.LsRemoteHeadsCommandType, "ls-remote", "--heads", remoteName, branch) + if err != nil || remoteHeads == "" { + return // branch doesn't exist in remote + } + + // Fetch the latest commit for this branch from remote (without creating local branch) + _, err = execGitString(telemetry.FetchCommandType, "fetch", "--depth", "1", remoteName, branch) + if err != nil { + log.Debug("civisibility.git: failed to fetch branch %s: %v", branch, err.Error()) + } +} + +// getRemoteBranches gets list of remote tracking branches only (for Step 2a in algorithm) +func getRemoteBranches(remoteName string) ([]string, error) { + // Get remote tracking branches as per algorithm update + remoteOut, err := execGitString(telemetry.ForEachRefCommandType, "for-each-ref", "--format=%(refname:short)", "refs/remotes/"+remoteName) + if err != nil { + return nil, fmt.Errorf("failed to get remote branches: %w", err) + } + + var branches []string + if remoteOut != "" { + remoteBranches := strings.Split(strings.TrimSpace(remoteOut), "\n") + for _, branch := range remoteBranches { + if strings.TrimSpace(branch) != "" { + branches = append(branches, strings.TrimSpace(branch)) + } + } + } + + return branches, nil +} + +// computeBranchMetrics calculates metrics for candidate branches +func computeBranchMetrics(candidates []string, sourceBranch string) (map[string]branchMetrics, error) { + metrics := make(map[string]branchMetrics) + + for _, candidate := range candidates { + // Find common ancestor + baseSha, err := execGitString(telemetry.MergeBaseCommandType, "merge-base", candidate, sourceBranch) + if err != nil || baseSha == "" { + continue + } + + // Count commits ahead/behind + counts, err := execGitString(telemetry.RevListCommandType, "rev-list", "--left-right", "--count", candidate+"..."+sourceBranch) + if err != nil { + continue + } + + parts := strings.Fields(counts) + if len(parts) != 2 { + continue + } + + behind, err1 := strconv.Atoi(parts[0]) + ahead, err2 := strconv.Atoi(parts[1]) + if err1 != nil || err2 != nil { + continue + } + + metrics[candidate] = branchMetrics{ + behind: behind, + ahead: ahead, + baseSha: baseSha, + } + } + + return metrics, nil +} + +// findBestBranch finds the best branch from metrics, preferring default branch on tie +func findBestBranch(metrics map[string]branchMetrics, defaultBranch, remoteName string) string { + if len(metrics) == 0 { + return "" + } + + var bestBranch string + bestScore := []int{int(^uint(0) >> 1), 1, 1} // [ahead, is_not_default, is_remote_prefixed] - max int, not default, remote prefixed + + for branch, data := range metrics { + isDefault := 0 + if isDefaultBranch(branch, defaultBranch, remoteName) { + isDefault = 0 + } else { + isDefault = 1 + } + + // Check if this branch is remote-prefixed (prefer exact branch names) + isRemotePrefixed := 0 + if strings.HasPrefix(branch, remoteName+"/") { + isRemotePrefixed = 1 + } + + score := []int{data.ahead, isDefault, isRemotePrefixed} + + // Compare scores: prefer smaller ahead count, then prefer default branch, then prefer exact branch names + if score[0] < bestScore[0] || + (score[0] == bestScore[0] && score[1] < bestScore[1]) || + (score[0] == bestScore[0] && score[1] == bestScore[1] && score[2] < bestScore[2]) { + bestScore = score + bestBranch = branch + } + } + + if bestBranch != "" { + return metrics[bestBranch].baseSha + } + return "" +} diff --git a/internal/civisibility/utils/git_test.go b/internal/civisibility/utils/git_test.go index c3729b0317..0c23cc0b1c 100644 --- a/internal/civisibility/utils/git_test.go +++ b/internal/civisibility/utils/git_test.go @@ -6,8 +6,11 @@ package utils import ( + "strings" + "sync" "testing" + "github.com/DataDog/dd-trace-go/v2/internal/log" "github.com/stretchr/testify/assert" ) @@ -68,5 +71,518 @@ func TestGetLastLocalGitCommitShas(t *testing.T) { func TestUnshallowGitRepository(t *testing.T) { _, err := UnshallowGitRepository() + if err != nil && strings.Contains(err.Error(), "shallow.lock") { + // if the error is related to a shallow.lock file, we will skip the test; + // the test is flaky in the CI due to multiple git commands running at the same time. + return + } + + assert.NoError(t, err) +} + +func TestFetchCommitData(t *testing.T) { + log.SetLevel(log.LevelDebug) + for _, sha := range GetLastLocalGitCommitShas() { + if gitData, err := fetchCommitData(sha); err == nil { + assert.NotEmpty(t, gitData.AuthorName, "Author name should not be empty") + assert.NotEmpty(t, gitData.AuthorEmail, "Author email should not be empty") + assert.NotEmpty(t, gitData.AuthorDate, "Author date should not be empty") + assert.NotEmpty(t, gitData.CommitterName, "Committer name should not be empty") + assert.NotEmpty(t, gitData.CommitterEmail, "Committer email should not be empty") + assert.NotEmpty(t, gitData.CommitterDate, "Committer date should not be empty") + assert.NotEmpty(t, gitData.CommitMessage, "Commit message should not be empty") + } else { + t.Errorf("Failed to fetch commit data for SHA: %s, error: %v", sha, err) + } + } +} + +// Tests for base branch detection functions + +func TestRemoveRemotePrefix(t *testing.T) { + tests := []struct { + branchName string + remoteName string + expected string + }{ + {"origin/main", "origin", "main"}, + {"upstream/master", "upstream", "master"}, + {"origin/feature/test", "origin", "feature/test"}, + {"main", "origin", "main"}, // No prefix + {"upstream/main", "origin", "upstream/main"}, // Different remote + {"", "origin", ""}, // Empty branch + } + + for _, test := range tests { + result := removeRemotePrefix(test.branchName, test.remoteName) + assert.Equal(t, test.expected, result, "Failed for branch: %s, remote: %s", test.branchName, test.remoteName) + } +} + +func TestIsMainLikeBranch(t *testing.T) { + tests := []struct { + branchName string + remoteName string + expected bool + }{ + // Base branches + {"main", "origin", true}, + {"master", "origin", true}, + {"preprod", "origin", true}, + {"prod", "origin", true}, + {"dev", "origin", true}, + {"development", "origin", true}, + {"trunk", "origin", true}, + + // Release and hotfix branches + {"release/v1.0", "origin", true}, + {"release/2023.1", "origin", true}, + {"hotfix/critical", "origin", true}, + {"hotfix/bug-123", "origin", true}, + + // Remote branches + {"origin/main", "origin", true}, + {"origin/master", "origin", true}, + {"upstream/main", "upstream", true}, + + // Feature branches (should not match) + {"feature/test", "origin", false}, + {"bugfix/issue-123", "origin", false}, + {"update/dependencies", "origin", false}, + {"my-feature-branch", "origin", false}, + + // Edge cases + {"", "origin", false}, + {"main-backup", "origin", false}, // Similar but not exact + {"maintenance", "origin", false}, // Similar but not in list + } + + for _, test := range tests { + result := isMainLikeBranch(test.branchName, test.remoteName) + assert.Equal(t, test.expected, result, "Failed for branch: %s, remote: %s", test.branchName, test.remoteName) + } +} + +func TestIsDefaultBranch(t *testing.T) { + tests := []struct { + branch string + defaultBranch string + remoteName string + expected bool + }{ + {"main", "main", "origin", true}, + {"master", "master", "origin", true}, + {"origin/main", "main", "origin", true}, + {"upstream/master", "master", "upstream", true}, + {"feature/test", "main", "origin", false}, + {"origin/feature", "main", "origin", false}, + {"main", "master", "origin", false}, // Different default + } + + for _, test := range tests { + result := isDefaultBranch(test.branch, test.defaultBranch, test.remoteName) + assert.Equal(t, test.expected, result, "Failed for branch: %s, default: %s, remote: %s", test.branch, test.defaultBranch, test.remoteName) + } +} + +func TestComputeBranchMetrics(t *testing.T) { + // This test requires a real git repository with branches + // We'll test with the current repository + if !isGitFound() { + t.Skip("Git not available, skipping branch metrics test") + } + + // Get current branch for testing + currentBranch, err := getSourceBranch() + if err != nil { + t.Skip("Could not get current branch, skipping test") + } + + // Test with the current branch as both candidate and source (should work) + metrics, err := computeBranchMetrics([]string{currentBranch}, currentBranch) assert.NoError(t, err) + + // When comparing a branch to itself, ahead should be 0 + if metric, exists := metrics[currentBranch]; exists { + assert.Equal(t, 0, metric.ahead, "Ahead count should be 0 when comparing branch to itself") + assert.NotEmpty(t, metric.baseSha, "Base SHA should not be empty") + } +} + +func TestFindBestBranch(t *testing.T) { + // Test with mock metrics + metrics := map[string]branchMetrics{ + "main": { + behind: 10, + ahead: 2, + baseSha: "sha1", + }, + "master": { + behind: 15, + ahead: 1, // Better (fewer ahead commits) + baseSha: "sha2", + }, + "origin/main": { + behind: 5, + ahead: 2, + baseSha: "sha3", + }, + } + + // Test 1: master should win (fewer ahead commits) + result := findBestBranch(metrics, "main", "origin") + assert.Equal(t, "sha2", result, "Should prefer branch with fewer ahead commits") + + // Test 2: When ahead counts are equal, prefer default branch + metrics["master"] = branchMetrics{behind: 15, ahead: 2, baseSha: "sha2"} + result = findBestBranch(metrics, "main", "origin") + + // Both "main" and "origin/main" are default branches with equal ahead counts + // The algorithm should prefer one of them over "master" + assert.Contains(t, []string{"sha1", "sha3"}, result, "Should prefer a default branch when ahead counts are equal") + + // Test 3: Prefer exact default branch name over remote prefixed one + // This test is important to ensure deterministic behavior when both "main" and "origin/main" + // are considered default branches with equal ahead counts. Without proper tie-breaking, + // Go's non-deterministic map iteration can cause flaky test results. + metrics = map[string]branchMetrics{ + "main": { + behind: 10, + ahead: 2, + baseSha: "sha1", + }, + "origin/main": { + behind: 5, + ahead: 2, + baseSha: "sha3", + }, + } + result = findBestBranch(metrics, "main", "origin") + assert.Equal(t, "sha1", result, "Should prefer exact default branch name over remote prefixed one") + + // Test 4: Empty metrics + result = findBestBranch(map[string]branchMetrics{}, "main", "origin") + assert.Equal(t, "", result, "Should return empty string for empty metrics") +} + +func TestGetRemoteName(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping remote name test") + } + + remoteName, err := getRemoteName() + assert.NoError(t, err) + assert.NotEmpty(t, remoteName, "Remote name should not be empty") + // Most repositories have "origin" as the default remote + assert.Contains(t, []string{"origin", "upstream"}, remoteName, "Remote name should be a common name") +} + +func TestGetSourceBranch(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping source branch test") + } + + branch, err := getSourceBranch() + assert.NoError(t, err) + assert.NotEmpty(t, branch, "Source branch should not be empty") +} + +func TestGetBaseBranchSha(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping base branch SHA test") + } + + // Test with main as default + sha, err := GetBaseBranchSha("main") + + // The result depends on the repository state: + // - If no candidates found, should return error + // - If candidates found, should return a valid SHA + // - The algorithm no longer returns early for main-like branches + + if err != nil { + // Error is acceptable if no candidates found or merge-base fails + t.Logf("GetBaseBranchSha returned error (acceptable in some scenarios): %v", err) + // Verify it's one of the expected error scenarios + errorMessage := err.Error() + expectedErrors := []string{ + "no candidate base branches found", + "failed to find best base branch", + "failed to find merge base", + "failed to get remote branches", + } + + hasExpectedError := false + for _, expectedError := range expectedErrors { + if strings.Contains(errorMessage, expectedError) { + hasExpectedError = true + break + } + } + assert.True(t, hasExpectedError, "Error should be one of the expected scenarios: %v", err) + } else if sha == "" { + // Empty SHA could happen in some edge cases + t.Logf("GetBaseBranchSha returned empty SHA") + } else { + // Valid SHA should be 40 characters long + assert.Len(t, sha, 40, "SHA should be 40 characters long") + assert.Regexp(t, "^[a-f0-9]{40}$", sha, "SHA should be valid hex string") + } +} + +func TestGetBaseBranchShaWithoutGit(t *testing.T) { + // Temporarily disable git for this test + originalGitFound := isGitFoundValue + isGitFoundValue = false + defer func() { + isGitFoundValue = originalGitFound + gitFinderOnce = sync.Once{} // Reset the sync.Once + }() + + sha, err := GetBaseBranchSha("master") + assert.Error(t, err) + assert.Equal(t, "", sha) + assert.Contains(t, err.Error(), "git executable not found") +} + +func TestBranchMetricsStruct(t *testing.T) { + // Test the branchMetrics struct + metrics := branchMetrics{ + behind: 5, + ahead: 3, + baseSha: "abcdef1234567890", + } + + assert.Equal(t, 5, metrics.behind) + assert.Equal(t, 3, metrics.ahead) + assert.Equal(t, "abcdef1234567890", metrics.baseSha) +} + +func TestPossibleBaseBranches(t *testing.T) { + // Test that the possibleBaseBranches constant contains expected values + expectedBranches := []string{"main", "master", "preprod", "prod", "dev", "development", "trunk"} + + assert.Equal(t, expectedBranches, possibleBaseBranches, "possibleBaseBranches should contain expected values") + assert.Len(t, possibleBaseBranches, 7, "Should have 7 possible base branches") +} + +func TestBaseLikeBranchFilter(t *testing.T) { + // Test the regex pattern directly + testCases := []struct { + branch string + expected bool + }{ + {"main", true}, + {"master", true}, + {"preprod", true}, + {"prod", true}, + {"dev", true}, + {"development", true}, + {"trunk", true}, + {"release/v1.0", true}, + {"release/2023.1", true}, + {"hotfix/bug", true}, + {"hotfix/critical-fix", true}, + {"feature/test", false}, + {"bugfix/issue", false}, + {"update/deps", false}, + {"random-branch", false}, + {"", false}, + } + + for _, test := range testCases { + result := baseLikeBranchFilter.MatchString(test.branch) + assert.Equal(t, test.expected, result, "Failed for branch: %s", test.branch) + } +} + +func TestDetectDefaultBranch(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping default branch detection test") + } + + // Test with a real remote name + remoteName, err := getRemoteName() + if err != nil { + t.Skip("Could not get remote name, skipping test") + } + + defaultBranch, err := detectDefaultBranch(remoteName) + + // The function should either succeed or fail gracefully + if err != nil { + // If it fails, it should be because no default branch could be detected + assert.Contains(t, err.Error(), "could not detect default branch") + assert.Equal(t, "", defaultBranch) + } else { + // If it succeeds, we should get a valid branch name + assert.NotEmpty(t, defaultBranch, "Default branch should not be empty when detection succeeds") + // Common default branch names + assert.Contains(t, []string{"main", "master", "develop", "dev"}, defaultBranch, + "Default branch should be a common name, got: %s", defaultBranch) + } +} + +func TestFindFallbackDefaultBranch(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping fallback default branch test") + } + + // Test with a real remote name + remoteName, err := getRemoteName() + if err != nil { + t.Skip("Could not get remote name, skipping test") + } + + fallbackBranch := findFallbackDefaultBranch(remoteName) + + // The function should either return a valid branch or empty string + if fallbackBranch != "" { + assert.Contains(t, []string{"main", "master"}, fallbackBranch, + "Fallback branch should be main or master, got: %s", fallbackBranch) + } + // If empty string, that's also acceptable - it means neither main nor master exists +} + +func TestFindFallbackDefaultBranchWithNonExistentRemote(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping fallback default branch test") + } + + // Test with a non-existent remote + fallbackBranch := findFallbackDefaultBranch("nonexistent") + + // Should return empty string since the remote doesn't exist + assert.Equal(t, "", fallbackBranch, "Should return empty string for non-existent remote") +} + +func TestDetectDefaultBranchWithNonExistentRemote(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping default branch detection test") + } + + // Test with a non-existent remote + defaultBranch, err := detectDefaultBranch("nonexistent") + + // Should fail to detect + assert.Error(t, err) + assert.Equal(t, "", defaultBranch) + assert.Contains(t, err.Error(), "could not detect default branch") +} + +func TestGetBaseBranchShaWithAutoDetection(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping base branch SHA test with auto-detection") + } + + // Test with empty string to force auto-detection + sha, err := GetBaseBranchSha("") + + // The result depends on the repository state: + // - If no candidates found, should return error + // - If candidates found, should return a valid SHA + // - The algorithm no longer returns early for main-like branches + + if err != nil { + // Error is acceptable if no candidates found or merge-base fails + t.Logf("GetBaseBranchSha returned error (acceptable in some scenarios): %v", err) + // Verify it's one of the expected error scenarios + errorMessage := err.Error() + expectedErrors := []string{ + "no candidate base branches found", + "failed to find best base branch", + "failed to find merge base", + "failed to get remote branches", + } + + hasExpectedError := false + for _, expectedError := range expectedErrors { + if strings.Contains(errorMessage, expectedError) { + hasExpectedError = true + break + } + } + assert.True(t, hasExpectedError, "Error should be one of the expected scenarios: %v", err) + } else if sha == "" { + // Empty SHA could happen in some edge cases + t.Logf("GetBaseBranchSha returned empty SHA") + } else { + // Valid SHA should be 40 characters long + assert.Len(t, sha, 40, "SHA should be 40 characters long") + assert.Regexp(t, "^[a-f0-9]{40}$", sha, "SHA should be valid hex string") + } +} + +func TestGetRemoteBranches(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping remote branches test") + } + + remoteName, err := getRemoteName() + if err != nil { + t.Skip("Could not get remote name, skipping test") + } + + branches, err := getRemoteBranches(remoteName) + assert.NoError(t, err) + + // Should get some remote branches (even if empty in some test environments) + assert.NotNil(t, branches) + + // All returned branches should have the remote prefix + for _, branch := range branches { + if branch == remoteName { + continue // Skip the remote name itself + } + assert.Contains(t, branch, remoteName+"/", "Remote branch should have remote prefix: %s", branch) + } +} + +func TestCheckAndFetchBranchUpdatedAlgorithm(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping fetch branch test") + } + + remoteName, err := getRemoteName() + if err != nil { + t.Skip("Could not get remote name, skipping test") + } + + // Test with a common branch that might exist + testBranch := "main" + + // This should not fail even if the branch doesn't exist + checkAndFetchBranch(testBranch, remoteName) + + // Test should complete without errors - the function handles missing branches gracefully + assert.True(t, true, "checkAndFetchBranch should complete without panicking") +} + +func TestGetBaseBranchShaWithCIBaseBranch(t *testing.T) { + if !isGitFound() { + t.Skip("Git not available, skipping CI base branch test") + } + + // This test verifies that the algorithm correctly handles git.pull_request.base_branch from CI + // We can't easily mock CI environment in this test framework, but we can verify the logic path + + // Test that the algorithm works correctly when no CI tags are available + // (This essentially tests the Step 2a path) + sha, err := GetBaseBranchSha("main") + + // Since we're testing in a real repository, we expect either: + // 1. A valid SHA if candidates are found + // 2. An error if no candidates are found + // 3. Empty SHA in edge cases + + if err != nil { + t.Logf("GetBaseBranchSha without CI tags returned error: %v", err) + // This is expected in many test scenarios + } else if sha == "" { + t.Logf("GetBaseBranchSha without CI tags returned empty SHA") + } else { + assert.Len(t, sha, 40, "SHA should be 40 characters long") + assert.Regexp(t, "^[a-f0-9]{40}$", sha, "SHA should be valid hex string") + t.Logf("GetBaseBranchSha without CI tags returned valid SHA: %s", sha) + } } diff --git a/internal/civisibility/utils/home.go b/internal/civisibility/utils/home.go index fd2000c893..8cf43e81fe 100644 --- a/internal/civisibility/utils/home.go +++ b/internal/civisibility/utils/home.go @@ -14,7 +14,8 @@ import ( "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // This code is based on: https://github.com/mitchellh/go-homedir/blob/v1.1.0/homedir.go (MIT License) @@ -59,21 +60,21 @@ func ExpandPath(path string) string { // The home directory of the current user. func getHomeDir() (homeDir string) { defer func() { - log.Debug("civisibility: home directory: %v", homeDir) + log.Debug("civisibility: home directory: %s", homeDir) }() if runtime.GOOS == "windows" { - if home := os.Getenv("HOME"); home != "" { + if home := env.Get("HOME"); home != "" { // First prefer the HOME environment variable return home } - if userProfile := os.Getenv("USERPROFILE"); userProfile != "" { + if userProfile := env.Get("USERPROFILE"); userProfile != "" { // Prefer the USERPROFILE environment variable return userProfile } - homeDrive := os.Getenv("HOMEDRIVE") - homePath := os.Getenv("HOMEPATH") + homeDrive := env.Get("HOMEDRIVE") + homePath := env.Get("HOMEPATH") return homeDrive + homePath } @@ -83,7 +84,7 @@ func getHomeDir() (homeDir string) { homeEnv = "home" } - if home := os.Getenv(homeEnv); home != "" { + if home := env.Get(homeEnv); home != "" { // Prefer the HOME environment variable return home } diff --git a/internal/civisibility/utils/impactedtests/impacted_tests.go b/internal/civisibility/utils/impactedtests/impacted_tests.go new file mode 100644 index 0000000000..cf37afc0df --- /dev/null +++ b/internal/civisibility/utils/impactedtests/impacted_tests.go @@ -0,0 +1,292 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package impactedtests + +import ( + "fmt" + "regexp" + "slices" + "strconv" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/filebitmap" + logger "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +type ( + // fileWithBitmap represents a file with its coverage bitmap. + fileWithBitmap struct { + file string // file path + bitmap []byte // coverage bitmap + } + + // ImpactedTestAnalyzer is a struct that holds information about impacted tests. + ImpactedTestAnalyzer struct { + modifiedFiles []fileWithBitmap + currentCommitSha string + baseCommitSha string + } + + // lineRange represents a tuple of start and end line numbers. + lineRange struct { + start int + end int + } +) + +// Precompiled regex for diff header and line changes. +// Adjust these patterns to match the actual output of "git diff". +// Example: diff --git a/file.txt b/file.txt +var diffHeaderRegex = regexp.MustCompile(`^diff --git a\/(?P.+) b\/(?P.+)`) + +// Example: @@ -1,2 +3,4 @@ +// This regex captures "start" and "count" (if available) from the new file's diff. +var lineChangeRegex = regexp.MustCompile(`^@@ -\d+(?:,\d+)? \+(?P\d+)(?:,(?P\d+))? @@`) + +// NewImpactedTestAnalyzer creates a new instance of ImpactedTestAnalyzer. +func NewImpactedTestAnalyzer() (*ImpactedTestAnalyzer, error) { + ciTags := utils.GetCITags() + + // Get the current commit SHA + currentCommitSha := ciTags[constants.GitHeadCommit] + if currentCommitSha == "" { + currentCommitSha = ciTags[constants.GitCommitSHA] + } + if currentCommitSha == "" { + return nil, fmt.Errorf("civisibility.ImpactedTests: current commit is empty") + } + + // Get the base commit SHA + baseCommitSha := ciTags[constants.GitPrBaseCommit] + + // If we don't have the base commit from the tags, then let's try to calculate it using the git CLI + if baseCommitSha == "" { + var err error + baseCommitSha, err = utils.GetBaseBranchSha("") // empty string triggers auto-detection + if err != nil { + logger.Debug("civisibility.ImpactedTests: Failed to get base commit SHA from git CLI: %s", err.Error()) + // Don't fail here - we might be on a base branch or in a scenario where + // base branch detection isn't possible. Return an analyzer with no modified files. + } + } + + // Extract the modified files + var modifiedFiles []fileWithBitmap + + // Check if the base commit SHA is available + if len(baseCommitSha) > 0 { + logger.Debug("civisibility.ImpactedTests: PR detected. Retrieving diff lines from Git CLI from BaseCommit %s", baseCommitSha) + modifiedFiles = getGitDiffFrom(baseCommitSha, currentCommitSha) + } + + // If we still don't have modified files, initialize with empty slice instead of failing + if modifiedFiles == nil { + logger.Debug("civisibility.ImpactedTests: No modified files found - initializing with empty list") + modifiedFiles = []fileWithBitmap{} + } + + logger.Debug("civisibility.ImpactedTests: loaded [from: %s to %s]: %v", baseCommitSha, currentCommitSha, modifiedFiles) //nolint:gocritic // File list debug logging + return &ImpactedTestAnalyzer{ + modifiedFiles: modifiedFiles, + currentCommitSha: currentCommitSha, + baseCommitSha: baseCommitSha, + }, nil +} + +// IsImpacted checks if a test is impacted based on the modified files and their line ranges. +func (a *ImpactedTestAnalyzer) IsImpacted(testName string, sourceFile string, startLine int, endLine int) bool { + if len(a.modifiedFiles) == 0 { + return false + } + + // Has the test been modified? + modified := false + + // Get the test impact information + testFiles := getTestImpactInfo(sourceFile, startLine, endLine) + if len(testFiles) == 0 { + return false + } + + for _, testFile := range testFiles { + if testFile == nil || testFile.file == "" { + continue + } + + modifiedFileIndex := slices.IndexFunc(a.modifiedFiles, func(file fileWithBitmap) bool { + if file.file == "" { + return false + } + return strings.HasSuffix(testFile.file, file.file) + }) + if modifiedFileIndex >= 0 { + modifiedFile := a.modifiedFiles[modifiedFileIndex] + logger.Debug("civisibility.ImpactedTests: DiffFile found: %s...", modifiedFile.file) + if testFile.bitmap == nil || modifiedFile.bitmap == nil { + logger.Debug("civisibility.ImpactedTests: No line info found") + modified = true + break + } + + testFileBitmap := filebitmap.NewFileBitmapFromBytes(testFile.bitmap) + modifiedFileBitmap := filebitmap.NewFileBitmapFromBytes(modifiedFile.bitmap) + + if testFileBitmap.IntersectsWith(modifiedFileBitmap) { + logger.Debug("civisibility.ImpactedTests: Intersecting lines. Marking test %s as modified.", testName) + modified = true + break + } + } + } + + return modified +} + +// getGitDiffFrom retrieves the diff files and lines from the Git CLI. +func getGitDiffFrom(baseCommitSha string, currentCommitSha string) []fileWithBitmap { + var modifiedFiles []fileWithBitmap + + // Milestone 1.5 : Retrieve diff files and lines from Git Diff CLI + output, err := utils.GetGitDiff(baseCommitSha, currentCommitSha) + if err != nil { + logger.Debug("civisibility.ImpactedTests: Failed to get diff files from Git CLI: %s", err.Error()) + } else if output != "" { + modifiedFiles = parseGitDiffOutput(output) + } else { + logger.Debug("civisibility.ImpactedTests: No diff files found from Git CLI") + } + return modifiedFiles +} + +// getTestImpactInfo returns the test impact information based on the tags. +func getTestImpactInfo(sourceFile string, startLine int, endLine int) []*fileWithBitmap { + result := make([]*fileWithBitmap, 0) + if sourceFile == "" { + return result + } + + // Milestone 1: Return only the test definition file + file := &fileWithBitmap{file: sourceFile} + result = append(result, file) + + // Milestone 1.5: Return the test definition lines + if startLine == 0 || endLine == 0 { + return result + } + + bitmap := filebitmap.FromActiveRange(startLine, endLine) + file.bitmap = bitmap.GetBuffer() + + return result +} + +// parseGitDiffOutput parses the git diff output to extract modified files and their changed lines. +func parseGitDiffOutput(output string) []fileWithBitmap { + var fileChanges []fileWithBitmap + var currentFile *fileWithBitmap + var modifiedLines []lineRange + + // Split output into lines (ignoring empty lines) + lines := splitLines(output) + for _, line := range lines { + + // Check for the start of a new file diff + if headerMatch := diffHeaderRegex.FindStringSubmatch(line); headerMatch != nil { + // If there's a file in process, finalize it before iniciar uno nuevo + if currentFile != nil { + currentFile.bitmap = toFileBitmap(modifiedLines) + fileChanges = append(fileChanges, *currentFile) + // Clear the modified lines for the new file + modifiedLines = modifiedLines[:0] + } + + // Extract file path from the named group "file" + filePath := "" + for i, name := range diffHeaderRegex.SubexpNames() { + if name == "fileB" { + filePath = headerMatch[i] + break + } + } + currentFile = &fileWithBitmap{file: filePath} + continue + } + + // Check for the line change marker (e.g., @@ -1,2 +3,4 @@) + if lineChangeMatch := lineChangeRegex.FindStringSubmatch(line); lineChangeMatch != nil { + startLineStr := "" + countStr := "" + for i, name := range lineChangeRegex.SubexpNames() { + if name == "start" { + startLineStr = lineChangeMatch[i] + } + if name == "count" { + countStr = lineChangeMatch[i] + } + } + startLine, err := strconv.Atoi(startLineStr) + if err != nil { + // In case of error, we skip the line + continue + } + lineCount := 0 + if countStr != "" { + lineCount, err = strconv.Atoi(countStr) + if err != nil { + lineCount = 0 + } + if lineCount > 0 { + // Adjust the line count to account for the start line + lineCount = lineCount - 1 + } + } + + // Add the range + if startLine > 0 { + modifiedLines = append(modifiedLines, lineRange{start: startLine, end: startLine + lineCount}) + } + continue + } + } + if currentFile != nil { + currentFile.bitmap = toFileBitmap(modifiedLines) + fileChanges = append(fileChanges, *currentFile) + } + + return fileChanges +} + +// splitLines splits the text into lines, ignoring empty lines. +func splitLines(text string) []string { + rawLines := strings.Split(text, "\n") + var lines []string + for _, line := range rawLines { + if strings.TrimSpace(line) != "" { + lines = append(lines, line) + } + } + return lines +} + +// toFileBitmap converts a slice of modified line ranges into a bitmap (as a byte slice). +func toFileBitmap(modifiedLines []lineRange) []byte { + if len(modifiedLines) == 0 { + return nil + } + // Get the maximum count from the last range's end value. + maxCount := modifiedLines[len(modifiedLines)-1].end + bitmap := filebitmap.FromLineCount(maxCount) + // Mark all lines in the ranges as modified. + for _, r := range modifiedLines { + // Note: This marks lines from r.start to r.end inclusive. + for i := r.start; i <= r.end; i++ { + bitmap.Set(i) + } + } + return bitmap.GetBuffer() +} diff --git a/internal/civisibility/utils/impactedtests/impacted_tests_test.go b/internal/civisibility/utils/impactedtests/impacted_tests_test.go new file mode 100644 index 0000000000..4ee5a35057 --- /dev/null +++ b/internal/civisibility/utils/impactedtests/impacted_tests_test.go @@ -0,0 +1,174 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package impactedtests + +import ( + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/filebitmap" + "github.com/stretchr/testify/assert" +) + +// dummyTestSpan is a dummy implementation of the TestSpan interface for testing purposes. +type dummyTestSpan struct { + tags map[string]interface{} +} + +// AsMap returns the tags map. +func (d *dummyTestSpan) AsMap() map[string]interface{} { + return d.tags +} + +// SetTag sets a tag value. +func (d *dummyTestSpan) SetTag(key string, value any) { + d.tags[key] = value +} + +// newDummyTestSpan creates a new dummyTestSpan. +func newDummyTestSpan() *dummyTestSpan { + return &dummyTestSpan{tags: make(map[string]interface{})} +} + +// TestParseGitDiffOutput tests the parseGitDiffOutput function. +func TestParseGitDiffOutput(t *testing.T) { + // Sample git diff output with two file diffs. + diffOutput := `diff --git a/file1.txt b/file1.txt +@@ -1,2 +3,4 @@ +context line 1 +context line 2 +diff --git a/file2.txt b/file2.txt +@@ -10,1 +20,2 @@ +another context line` + + files := parseGitDiffOutput(diffOutput) + if len(files) != 2 { + t.Fatalf("Expected 2 files, got %d", len(files)) + } + + // Check that file names are correctly extracted. + if !strings.HasSuffix(files[0].file, "file1.txt") { + t.Errorf("Expected first file to be file1.txt, got %s", files[0].file) + } + if !strings.HasSuffix(files[1].file, "file2.txt") { + t.Errorf("Expected second file to be file2.txt, got %s", files[1].file) + } + + // Check that bitmap is not nil for files with changes. + if files[0].bitmap == nil { + t.Error("Expected bitmap for file1.txt to be non-nil") + } + if files[1].bitmap == nil { + t.Error("Expected bitmap for file2.txt to be non-nil") + } + files0Bitmap := filebitmap.NewFileBitmapFromBytes(files[0].bitmap).String() + if files0Bitmap != "00111100" { + t.Errorf("Expected bitmap for file1.txt to be 00111100, got %s", files0Bitmap) + } + + files1Bitmap := filebitmap.NewFileBitmapFromBytes(files[1].bitmap).String() + if files1Bitmap != "000000000000000000011000" { + t.Errorf("Expected bitmap for file1.txt to be 000000000000000000011000, got %s", files1Bitmap) + } +} + +// TestSplitLines tests the splitLines function. +func TestSplitLines(t *testing.T) { + input := "line1\n\nline2\n \nline3\n" + lines := splitLines(input) + expected := []string{"line1", "line2", "line3"} + if len(lines) != len(expected) { + t.Fatalf("Expected %d lines, got %d", len(expected), len(lines)) + } + for i, line := range lines { + if line != expected[i] { + t.Errorf("Expected line %d to be %q, got %q", i, expected[i], line) + } + } +} + +// TestGetTestImpactInfo tests the getTestImpactInfo method of tagsMap. +func TestGetTestImpactInfo(t *testing.T) { + // Create a tagsMap with the necessary tags. + testFile := "testfile.go" + startLine := 5 + endLine := 10 + + files := getTestImpactInfo(testFile, startLine, endLine) + if len(files) != 1 { + t.Fatalf("Expected 1 file from getTestImpactInfo, got %d", len(files)) + } + if files[0].file != testFile { + t.Errorf("Expected file %q, got %q", testFile, files[0].file) + } + if files[0].bitmap == nil { + t.Errorf("Expected non-nil bitmap for file %q", testFile) + } +} + +// TestProcessImpactedTest tests the ProcessImpactedTest method of ImpactedTestAnalyzer. +func TestProcessImpactedTest(t *testing.T) { + // Create a dummy TestSpan with the necessary test source tags. + span := newDummyTestSpan() + testFile := "testfile.go" + startLine := 5 + endLine := 10 + span.tags[constants.TestSourceFile] = testFile + span.tags[constants.TestSourceStartLine] = startLine + span.tags[constants.TestSourceEndLine] = endLine + + // Create a bitmap for the test file simulating a modified file. + testBitmap := filebitmap.FromActiveRange(startLine, endLine) + testBitmapBuffer := testBitmap.GetBuffer() + + // Create an ImpactedTestAnalyzer with modifiedFiles including the test file. + modifiedFile := &fileWithBitmap{ + file: testFile, + bitmap: testBitmapBuffer, + } + analyzer := &ImpactedTestAnalyzer{ + modifiedFiles: []fileWithBitmap{*modifiedFile}, + currentCommitSha: "dummyCurrentSha", + baseCommitSha: "dummyBaseSha", + } + + // Process the impacted test. + isImpacted := analyzer.IsImpacted("test", testFile, startLine, endLine) + + // Verify that the test is marked as impacted. + if !isImpacted { + t.Error("Expected to be impacted") + } +} + +// TestNewImpactedTestAnalyzerWithNoBaseBranch tests that the analyzer handles the case where no base branch can be found gracefully. +func TestNewImpactedTestAnalyzerWithNoBaseBranch(t *testing.T) { + // This test verifies that the analyzer can be created even when base branch detection fails + // According to the updated algorithm, this should not cause the analyzer creation to fail + + analyzer, err := NewImpactedTestAnalyzer() + + // The analyzer should be created successfully even if no base branch is found + if err != nil { + // If there's an error, it should only be due to missing current commit, not missing base + if !strings.Contains(err.Error(), "current commit is empty") { + t.Errorf("Unexpected error creating analyzer: %v", err) + } + return // Skip the rest if we can't get current commit + } + + // Analyzer should be valid + assert.NotNil(t, analyzer, "Analyzer should not be nil") + assert.NotNil(t, analyzer.modifiedFiles, "ModifiedFiles should not be nil (can be empty)") + + // The modified files can be empty if no base branch was found + t.Logf("Analyzer created with %d modified files", len(analyzer.modifiedFiles)) + + // Test that IsImpacted works correctly with empty modified files + isImpacted := analyzer.IsImpacted("test", "testfile.go", 1, 10) + assert.False(t, isImpacted, "Should not be impacted when no modified files are present") +} diff --git a/internal/civisibility/utils/names_test.go b/internal/civisibility/utils/names_test.go index fe98952392..e3223d8b80 100644 --- a/internal/civisibility/utils/names_test.go +++ b/internal/civisibility/utils/names_test.go @@ -16,7 +16,7 @@ import ( func TestGetModuleAndSuiteName(t *testing.T) { pc, _, _, _ := runtime.Caller(0) // Get the program counter of this function module, suite := GetModuleAndSuiteName(pc) - expectedModule := "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" + expectedModule := "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" expectedSuite := "names_test.go" assert.True(t, strings.HasPrefix(module, expectedModule)) diff --git a/internal/civisibility/utils/net/client.go b/internal/civisibility/utils/net/client.go index ca62998759..2a240fd88e 100644 --- a/internal/civisibility/utils/net/client.go +++ b/internal/civisibility/utils/net/client.go @@ -8,35 +8,47 @@ package net import ( "context" "fmt" + "io" "math" "math/rand/v2" "net" "net/http" "net/url" - "os" "regexp" "strings" + "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/constants" - "gopkg.in/DataDog/dd-trace-go.v1/internal/civisibility/utils" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) const ( - DefaultMaxRetries int = 5 - DefaultBackoff time.Duration = 150 * time.Millisecond + // DefaultMaxRetries is the default number of retries for a request. + DefaultMaxRetries int = 3 + // DefaultBackoff is the default backoff time for a request. + DefaultBackoff time.Duration = 100 * time.Millisecond ) type ( + // Client is an interface for sending requests to the Datadog backend. Client interface { GetSettings() (*SettingsResponseData, error) - GetEarlyFlakeDetectionData() (*EfdResponseData, error) + GetKnownTests() (*KnownTestsResponseData, error) GetCommits(localCommits []string) ([]string, error) SendPackFiles(commitSha string, packFiles []string) (bytes int64, err error) + SendCoveragePayload(ciTestCovPayload io.Reader) error + SendCoveragePayloadWithFormat(ciTestCovPayload io.Reader, format string) error + GetSkippableTests() (correlationID string, skippables map[string]map[string][]SkippableResponseDataAttributes, err error) + GetTestManagementTests() (*TestManagementTestsResponseDataModules, error) + SendLogs(logsPayload io.Reader) error } + // client is a client for sending requests to the Datadog backend. client struct { id string agentless bool @@ -46,12 +58,16 @@ type ( workingDirectory string repositoryURL string commitSha string + commitMessage string + headCommitSha string + headCommitMessage string branchName string testConfigurations testConfigurations headers map[string]string handler *RequestHandler } + // testConfigurations represents the test configurations. testConfigurations struct { OsPlatform string `json:"os.platform,omitempty"` OsVersion string `json:"os.version,omitempty"` @@ -63,20 +79,26 @@ type ( } ) -var _ Client = &client{} +var ( + _ Client = &client{} -func NewClientWithServiceName(serviceName string) Client { + // telemetryInit is used to initialize the telemetry client. + telemetryInit sync.Once +) + +// NewClientWithServiceNameAndSubdomain creates a new client with the given service name and subdomain. +func NewClientWithServiceNameAndSubdomain(serviceName, subdomain string) Client { ciTags := utils.GetCITags() // get the environment - environment := os.Getenv("DD_ENV") + environment := env.Get("DD_ENV") if environment == "" { environment = "none" } // get the service name if serviceName == "" { - serviceName = os.Getenv("DD_SERVICE") + serviceName = env.Get("DD_SERVICE") if serviceName == "" { if repoURL, ok := ciTags[constants.GitRepositoryURL]; ok { // regex to sanitize the repository url to be used as a service name @@ -92,7 +114,7 @@ func NewClientWithServiceName(serviceName string) Client { // get all custom configuration (test.configuration.*) var customConfiguration map[string]string - if v := os.Getenv("DD_TAGS"); v != "" { + if v := env.Get("DD_TAGS"); v != "" { prefix := "test.configuration." for k, v := range internal.ParseTagString(v) { if strings.HasPrefix(k, prefix) { @@ -109,29 +131,31 @@ func NewClientWithServiceName(serviceName string) Client { defaultHeaders := map[string]string{} var baseURL string var requestHandler *RequestHandler + var agentURL *url.URL + var apiKeyValue string agentlessEnabled := internal.BoolEnv(constants.CIVisibilityAgentlessEnabledEnvironmentVariable, false) if agentlessEnabled { // Agentless mode is enabled. - APIKeyValue := os.Getenv(constants.APIKeyEnvironmentVariable) - if APIKeyValue == "" { + apiKeyValue = env.Get(constants.APIKeyEnvironmentVariable) + if apiKeyValue == "" { log.Error("An API key is required for agentless mode. Use the DD_API_KEY env variable to set it") return nil } - defaultHeaders["dd-api-key"] = APIKeyValue + defaultHeaders["dd-api-key"] = apiKeyValue // Check for a custom agentless URL. - agentlessURL := os.Getenv(constants.CIVisibilityAgentlessURLEnvironmentVariable) + agentlessURL := env.Get(constants.CIVisibilityAgentlessURLEnvironmentVariable) if agentlessURL == "" { // Use the standard agentless URL format. site := "datadoghq.com" - if v := os.Getenv("DD_SITE"); v != "" { + if v := env.Get("DD_SITE"); v != "" { site = v } - baseURL = fmt.Sprintf("https://api.%s", site) + baseURL = fmt.Sprintf("https://%s.%s", subdomain, site) } else { // Use the custom agentless URL. baseURL = agentlessURL @@ -140,9 +164,9 @@ func NewClientWithServiceName(serviceName string) Client { requestHandler = NewRequestHandler() } else { // Use agent mode with the EVP proxy. - defaultHeaders["X-Datadog-EVP-Subdomain"] = "api" + defaultHeaders["X-Datadog-EVP-Subdomain"] = subdomain - agentURL := internal.AgentURLFromEnv() + agentURL = internal.AgentURLFromEnv() if agentURL.Scheme == "unix" { // If we're connecting over UDS we can just rely on the agent to provide the hostname log.Debug("connecting to agent over unix, do not set hostname on any traces") @@ -167,6 +191,7 @@ func NewClientWithServiceName(serviceName string) Client { }, Timeout: 10 * time.Second, }) + // TODO(darccio): use internal.UnixDataSocketURL instead agentURL = &url.URL{ Scheme: "http", Host: fmt.Sprintf("UDS_%s", strings.NewReplacer(":", "_", "/", "_", `\`, "_").Replace(agentURL.Path)), @@ -183,18 +208,61 @@ func NewClientWithServiceName(serviceName string) Client { defaultHeaders["trace_id"] = id defaultHeaders["parent_id"] = id - log.Debug("ciVisibilityHttpClient: new client created [id: %v, agentless: %v, url: %v, env: %v, serviceName: %v]", - id, agentlessEnabled, baseURL, environment, serviceName) + log.Debug("ciVisibilityHttpClient: new client created [id: %s, agentless: %t, url: %s, env: %s, serviceName: %s, subdomain: %s]", + id, agentlessEnabled, baseURL, environment, serviceName, subdomain) + + if !telemetry.Disabled() { + telemetryInit.Do(func() { + telemetry.ProductStarted(telemetry.NamespaceCIVisibility) + telemetry.RegisterAppConfigs( + telemetry.Configuration{Name: "service", Value: serviceName}, + telemetry.Configuration{Name: "env", Value: environment}, + telemetry.Configuration{Name: "agentless", Value: agentlessEnabled}, + telemetry.Configuration{Name: "test_session_name", Value: ciTags[constants.TestSessionName]}, + ) + if telemetry.GlobalClient() != nil { + return + } + cfg := telemetry.ClientConfig{ + HTTPClient: requestHandler.Client, + APIKey: apiKeyValue, + } + if agentURL != nil { + cfg.AgentURL = agentURL.String() + } + client, err := telemetry.NewClient(serviceName, environment, env.Get("DD_VERSION"), cfg) + if err != nil { + log.Debug("civisibility: failed to create telemetry client: %s", err.Error()) + return + } + telemetry.StartApp(client) + }) + } + + // we try to get the branch name + bName := ciTags[constants.GitBranch] + if bName == "" { + // if not we try to use the tag (checkout over a tag) + bName = ciTags[constants.GitTag] + } + if bName == "" { + // if is still empty we assume the customer just used a detached HEAD + bName = "auto:git-detached-head" + } + return &client{ - id: id, - agentless: agentlessEnabled, - baseURL: baseURL, - environment: environment, - serviceName: serviceName, - workingDirectory: ciTags[constants.CIWorkspacePath], - repositoryURL: ciTags[constants.GitRepositoryURL], - commitSha: ciTags[constants.GitCommitSHA], - branchName: ciTags[constants.GitBranch], + id: id, + agentless: agentlessEnabled, + baseURL: baseURL, + environment: environment, + serviceName: serviceName, + workingDirectory: ciTags[constants.CIWorkspacePath], + repositoryURL: ciTags[constants.GitRepositoryURL], + commitSha: ciTags[constants.GitCommitSHA], + commitMessage: ciTags[constants.GitCommitMessage], + headCommitSha: ciTags[constants.GitHeadCommit], + headCommitMessage: ciTags[constants.GitHeadMessage], + branchName: bName, testConfigurations: testConfigurations{ OsPlatform: ciTags[constants.OSPlatform], OsVersion: ciTags[constants.OSVersion], @@ -208,10 +276,17 @@ func NewClientWithServiceName(serviceName string) Client { } } +// NewClientWithServiceName creates a new client with the given service name. +func NewClientWithServiceName(serviceName string) Client { + return NewClientWithServiceNameAndSubdomain(serviceName, "api") +} + +// NewClient creates a new client with the default service name. func NewClient() Client { return NewClientWithServiceName("") } +// getURLPath returns the full URL path for the given URL path. func (c *client) getURLPath(urlPath string) string { if c.agentless { return fmt.Sprintf("%s/%s", c.baseURL, urlPath) @@ -220,6 +295,7 @@ func (c *client) getURLPath(urlPath string) string { return fmt.Sprintf("%s/%s/%s", c.baseURL, "evp_proxy/v2", urlPath) } +// getPostRequestConfig returns a new RequestConfig for a POST request. func (c *client) getPostRequestConfig(url string, body interface{}) *RequestConfig { return &RequestConfig{ Method: "POST", diff --git a/internal/civisibility/utils/net/coverage.go b/internal/civisibility/utils/net/coverage.go new file mode 100644 index 0000000000..81966acb49 --- /dev/null +++ b/internal/civisibility/utils/net/coverage.go @@ -0,0 +1,100 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package net + +import ( + "errors" + "fmt" + "io" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" +) + +const ( + // coverageSubDomain is the subdomain for the coverage endpoint. + coverageSubDomain string = "citestcov-intake" + // coverageURLPath is the URL path for the coverage endpoint. + coverageURLPath string = "api/v2/citestcov" +) + +// NewClientForCodeCoverage creates a new client for sending code coverage payloads. +func NewClientForCodeCoverage() Client { + return NewClientWithServiceNameAndSubdomain("", coverageSubDomain) +} + +// SendCoveragePayload sends a code coverage payload to the backend. +func (c *client) SendCoveragePayload(ciTestCovPayload io.Reader) error { + return c.SendCoveragePayloadWithFormat(ciTestCovPayload, FormatMessagePack) +} + +// SendCoveragePayload sends a code coverage payload to the backend. +func (c *client) SendCoveragePayloadWithFormat(ciTestCovPayload io.Reader, format string) error { + if ciTestCovPayload == nil { + return errors.New("coverage payload is nil") + } + // Create a dummy event to send with the coverage payload. + dummyEvent := FormFile{ + FieldName: "event", + ContentType: ContentTypeJSON, + FileName: "fileevent.json", + Content: []byte("{\"dummy\": true}"), + } + + var coverageEvent FormFile + if format == FormatMessagePack { + coverageEvent = FormFile{ + FieldName: "coveragex", + Content: ciTestCovPayload, + FileName: "filecoveragex.msgpack", + ContentType: ContentTypeMessagePack, + } + } else if format == FormatJSON { + coverageEvent = FormFile{ + FieldName: "coveragex", + Content: ciTestCovPayload, + FileName: "filecoveragex.json", + ContentType: ContentTypeJSON, + } + } else { + return fmt.Errorf("unsupported format: %s", format) + } + + // Send the coverage payload. + request := RequestConfig{ + Method: "POST", + URL: c.getURLPath(coverageURLPath), + Headers: c.headers, + Files: []FormFile{ + dummyEvent, + coverageEvent, + }, + } + + if request.Compressed { + telemetry.EndpointPayloadRequests(telemetry.CodeCoverageEndpointType, telemetry.CompressedRequestCompressedType) + } else { + telemetry.EndpointPayloadRequests(telemetry.CodeCoverageEndpointType, telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() + response, responseErr := c.handler.SendRequest(request) + telemetry.EndpointPayloadRequestsMs(telemetry.CodeCoverageEndpointType, float64(time.Since(startTime).Milliseconds())) + + if responseErr != nil { + telemetry.EndpointPayloadRequestsErrors(telemetry.CodeCoverageEndpointType, telemetry.NetworkErrorType) + telemetry.EndpointPayloadDropped(telemetry.CodeCoverageEndpointType) + return fmt.Errorf("failed to send coverage request: %s", responseErr) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.EndpointPayloadRequestsErrors(telemetry.CodeCoverageEndpointType, telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) + telemetry.EndpointPayloadDropped(telemetry.CodeCoverageEndpointType) + return fmt.Errorf("unexpected response code %d: %s", response.StatusCode, string(response.Body)) + } + + return nil +} diff --git a/internal/civisibility/utils/net/coverage_test.go b/internal/civisibility/utils/net/coverage_test.go new file mode 100644 index 0000000000..82242296b3 --- /dev/null +++ b/internal/civisibility/utils/net/coverage_test.go @@ -0,0 +1,63 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package net + +import ( + "bytes" + "io" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestCoverageApiRequest(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + reader, err := r.MultipartReader() + if err != nil { + http.Error(w, "failed to read body", http.StatusBadRequest) + return + } + + containsDummyEvent := false + containsCoverage := false + for { + part, errPart := reader.NextPart() + if errPart == io.EOF { + break + } + partName := part.FormName() + buf := new(bytes.Buffer) + buf.ReadFrom(part) + if partName == "event" { + assert.Equal(t, ContentTypeJSON, part.Header.Get(HeaderContentType)) + assert.Equal(t, "{\"dummy\": true}", string(buf.Bytes())) + containsDummyEvent = true + } else if partName == "coveragex" { + assert.Equal(t, ContentTypeMessagePack, part.Header.Get(HeaderContentType)) + assert.Equal(t, "filecoveragex.msgpack", part.FileName()) + containsCoverage = true + } + } + + assert.True(t, containsDummyEvent) + assert.True(t, containsCoverage) + })) + defer server.Close() + + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + setCiVisibilityEnv(path, server.URL) + + cInterface := NewClient() + var buf bytes.Buffer + err := cInterface.SendCoveragePayload(&buf) + assert.Nil(t, err) +} diff --git a/internal/civisibility/utils/net/efd_api.go b/internal/civisibility/utils/net/efd_api.go deleted file mode 100644 index 5e2ad94547..0000000000 --- a/internal/civisibility/utils/net/efd_api.go +++ /dev/null @@ -1,77 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2024 Datadog, Inc. - -package net - -import ( - "fmt" -) - -const ( - efdRequestType string = "ci_app_libraries_tests_request" - efdURLPath string = "api/v2/ci/libraries/tests" -) - -type ( - efdRequest struct { - Data efdRequestHeader `json:"data"` - } - - efdRequestHeader struct { - ID string `json:"id"` - Type string `json:"type"` - Attributes EfdRequestData `json:"attributes"` - } - - EfdRequestData struct { - Service string `json:"service"` - Env string `json:"env"` - RepositoryURL string `json:"repository_url"` - Configurations testConfigurations `json:"configurations"` - } - - efdResponse struct { - Data struct { - ID string `json:"id"` - Type string `json:"type"` - Attributes EfdResponseData `json:"attributes"` - } `json:"data"` - } - - EfdResponseData struct { - Tests EfdResponseDataModules `json:"tests"` - } - - EfdResponseDataModules map[string]EfdResponseDataSuites - EfdResponseDataSuites map[string][]string -) - -func (c *client) GetEarlyFlakeDetectionData() (*EfdResponseData, error) { - body := efdRequest{ - Data: efdRequestHeader{ - ID: c.id, - Type: efdRequestType, - Attributes: EfdRequestData{ - Service: c.serviceName, - Env: c.environment, - RepositoryURL: c.repositoryURL, - Configurations: c.testConfigurations, - }, - }, - } - - response, err := c.handler.SendRequest(*c.getPostRequestConfig(efdURLPath, body)) - if err != nil { - return nil, fmt.Errorf("sending early flake detection request: %s", err.Error()) - } - - var responseObject efdResponse - err = response.Unmarshal(&responseObject) - if err != nil { - return nil, fmt.Errorf("unmarshalling early flake detection data response: %s", err.Error()) - } - - return &responseObject.Data.Attributes, nil -} diff --git a/internal/civisibility/utils/net/http.go b/internal/civisibility/utils/net/http.go index 4176cd895a..0ad2be1ea2 100644 --- a/internal/civisibility/utils/net/http.go +++ b/internal/civisibility/utils/net/http.go @@ -14,12 +14,14 @@ import ( "io" "mime" "mime/multipart" + "net" "net/http" "net/textproto" "strconv" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/tinylib/msgp/msgp" ) // Constants for common strings @@ -27,6 +29,7 @@ const ( ContentTypeJSON = "application/json" ContentTypeJSONAlternative = "application/vnd.api+json" ContentTypeOctetStream = "application/octet-stream" + ContentTypeMessagePack = "application/msgpack" ContentEncodingGzip = "gzip" HeaderContentType = "Content-Type" HeaderContentEncoding = "Content-Encoding" @@ -34,6 +37,7 @@ const ( HeaderRateLimitReset = "x-ratelimit-reset" HTTPStatusTooManyRequests = 429 FormatJSON = "json" + FormatMessagePack = "msgpack" ) // FormFile represents a file to be uploaded in a multipart form request. @@ -63,6 +67,7 @@ type Response struct { Format string // Format of the response (json or msgpack) StatusCode int // HTTP status code CanUnmarshal bool // Whether the response body can be unmarshalled + Compressed bool // Whether to use gzip compression } // Unmarshal deserializes the response body into the provided target based on the response format. @@ -74,6 +79,12 @@ func (r *Response) Unmarshal(target interface{}) error { switch r.Format { case FormatJSON: return json.Unmarshal(r.Body, target) + case FormatMessagePack: + if target.(msgp.Unmarshaler) != nil { + _, err := target.(msgp.Unmarshaler).UnmarshalMsg(r.Body) + return err + } + return errors.New("target must implement msgp.Unmarshaler for MessagePack unmarshalling") default: return fmt.Errorf("unsupported format '%s' for unmarshalling", r.Format) } @@ -84,12 +95,36 @@ type RequestHandler struct { Client *http.Client } +// We copy the transport to avoid using the default one, as it might be +// augmented with tracing and we don't want these calls to be recorded. +// This also permits orchestrion to disable tracing on this client. +// See https://golang.org/pkg/net/http/#DefaultTransport . +// Except we use a higher timeout for this +var defaultHTTPClient = createNewHTTPClient() + +// createNewHTTPClient creates a new HTTP client with custom transport settings. +func createNewHTTPClient() *http.Client { + return &http.Client{ + Timeout: 45 * time.Second, + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + }, + } +} + // NewRequestHandler creates a new RequestHandler with a default HTTP client. func NewRequestHandler() *RequestHandler { return &RequestHandler{ - Client: &http.Client{ - Timeout: 45 * time.Second, // Customize timeout as needed - }, + Client: defaultHTTPClient, } } @@ -116,8 +151,6 @@ func (rh *RequestHandler) SendRequest(config RequestConfig) (*Response, error) { } for attempt := 0; attempt <= config.MaxRetries; attempt++ { - log.Debug("ciVisibilityHttpClient: new request [method: %v, url: %v, attempt: %v, maxRetries: %v]", - config.Method, config.URL, attempt, config.MaxRetries) stopRetries, rs, err := rh.internalSendRequest(&config, attempt) if stopRetries { return rs, err @@ -139,11 +172,12 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int } if log.DebugEnabled() { - var files []string + var fileNames []string for _, f := range config.Files { - files = append(files, f.FieldName) + fileNames = append(fileNames, f.FieldName) } - log.Debug("ciVisibilityHttpClient: sending files %v", files) + log.Debug("ciVisibilityHttpClient: new request with files [method: %s, url: %s, attempt: %d, maxRetries: %d] %s", + config.Method, config.URL, attempt, config.MaxRetries, fileNames) } req, err = http.NewRequest(config.Method, config.URL, bytes.NewBuffer(body)) if err != nil { @@ -160,9 +194,7 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int return true, nil, err } - if log.DebugEnabled() { - log.Debug("ciVisibilityHttpClient: serialized body [compressed: %v] %v", config.Compressed, string(serializedBody)) - } + originalSerializedBody := serializedBody // Compress body if needed if config.Compressed { @@ -172,6 +204,18 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int } } + if log.DebugEnabled() { + strBody := "(binary data)" + if config.Format == FormatJSON { + strBody = string(originalSerializedBody) + if len(strBody) > 4096 { + strBody = strBody[:4096] + "..." // Truncate for logging + } + } + log.Debug("ciVisibilityHttpClient: new request with body [method: %s, url: %s, attempt: %d, maxRetries: %d, compressed: %t, format: %s] %d bytes: %s", + config.Method, config.URL, attempt, config.MaxRetries, config.Compressed, config.Format, len(serializedBody), strBody) + } + req, err = http.NewRequest(config.Method, config.URL, bytes.NewBuffer(serializedBody)) if err != nil { return true, nil, err @@ -179,6 +223,9 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int if config.Format == FormatJSON { req.Header.Set(HeaderContentType, ContentTypeJSON) } + if config.Format == FormatMessagePack { + req.Header.Set(HeaderContentType, ContentTypeMessagePack) + } if config.Compressed { req.Header.Set(HeaderContentEncoding, ContentEncodingGzip) } @@ -189,6 +236,9 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int if err != nil { return true, nil, err } + + log.Debug("ciVisibilityHttpClient: new request [method: %s, url: %s, attempt: %d, maxRetries: %d]", + config.Method, config.URL, attempt, config.MaxRetries) } // Set that is possible to handle gzip responses @@ -201,7 +251,7 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int resp, err := rh.Client.Do(req) if err != nil { - log.Debug("ciVisibilityHttpClient: error [%v].", err) + log.Debug("ciVisibilityHttpClient: error = %s", err.Error()) // Retry if there's an error exponentialBackoff(attempt, config.Backoff) return false, nil, nil @@ -211,10 +261,11 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int // Capture the status code statusCode := resp.StatusCode - log.Debug("ciVisibilityHttpClient: response status code [%v]", resp.StatusCode) // Check for rate-limiting (HTTP 429) if resp.StatusCode == HTTPStatusTooManyRequests { + log.Debug("ciVisibilityHttpClient: response status code = %d", resp.StatusCode) + rateLimitReset := resp.Header.Get(HeaderRateLimitReset) if rateLimitReset != "" { if resetTime, err := strconv.ParseInt(rateLimitReset, 10, 64); err == nil { @@ -241,6 +292,7 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int // Check status code for retries if statusCode >= 406 { // Retry if the status code is >= 406 + log.Debug("ciVisibilityHttpClient: response status code = %d", resp.StatusCode) exponentialBackoff(attempt, config.Backoff) return false, nil, nil } @@ -251,7 +303,9 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int } // Decompress response if it is gzip compressed + compressedResponse := false if resp.Header.Get(HeaderContentEncoding) == ContentEncodingGzip { + compressedResponse = true responseBody, err = decompressData(responseBody) if err != nil { return true, nil, err @@ -264,17 +318,19 @@ func (rh *RequestHandler) internalSendRequest(config *RequestConfig, attempt int if err == nil { if mediaType == ContentTypeJSON || mediaType == ContentTypeJSONAlternative { responseFormat = FormatJSON - if log.DebugEnabled() { - log.Debug("ciVisibilityHttpClient: serialized response [%v]", string(responseBody)) - } } } + if log.DebugEnabled() { + log.Debug("ciVisibilityHttpClient: response received [method: %s, url: %s, status_code: %d, format: %s] %d bytes", + config.Method, config.URL, resp.StatusCode, responseFormat, len(responseBody)) + } + // Determine if we can unmarshal based on status code (2xx) canUnmarshal := statusCode >= 200 && statusCode < 300 // Return the successful response with status code and unmarshal capability - return true, &Response{Body: responseBody, Format: responseFormat, StatusCode: statusCode, CanUnmarshal: canUnmarshal}, nil + return true, &Response{Body: responseBody, Format: responseFormat, StatusCode: statusCode, CanUnmarshal: canUnmarshal, Compressed: compressedResponse}, nil } // Helper functions for data serialization, compression, and handling multipart form data @@ -285,11 +341,20 @@ func serializeData(data interface{}, format string) ([]byte, error) { case []byte: // If it's already a byte array, use it directly return v, nil + case io.Reader: + // If it's an io.Reader, read the content + return io.ReadAll(v) default: // Otherwise, serialize it according to the specified format if format == FormatJSON { return json.Marshal(data) } + if format == FormatMessagePack { + if data.(msgp.Marshaler) != nil { + return data.(msgp.Marshaler).MarshalMsg([]byte{}) + } + return nil, errors.New("data must implement msgp.Marshaler for MessagePack serialization") + } } return nil, fmt.Errorf("unsupported format '%s' for data type '%T'", format, data) } @@ -314,36 +379,46 @@ func compressData(data []byte) ([]byte, error) { func decompressData(data []byte) ([]byte, error) { reader, err := gzip.NewReader(bytes.NewReader(data)) if err != nil { - return nil, fmt.Errorf("failed to create gzip reader: %v", err) + return nil, fmt.Errorf("failed to create gzip reader: %s", err) } defer reader.Close() decompressedData, err := io.ReadAll(reader) if err != nil { - return nil, fmt.Errorf("failed to decompress data: %v", err) + return nil, fmt.Errorf("failed to decompress data: %s", err) } return decompressedData, nil } // exponentialBackoff performs an exponential backoff with retries. func exponentialBackoff(retryCount int, initialDelay time.Duration) { - maxDelay := 30 * time.Second + time.Sleep(getExponentialBackoffDuration(retryCount, initialDelay)) +} + +// getExponentialBackoffDuration calculates the backoff duration based on the retry count and initial delay. +func getExponentialBackoffDuration(retryCount int, initialDelay time.Duration) time.Duration { + maxDelay := 10 * time.Second delay := initialDelay * (1 << uint(retryCount)) // Exponential backoff if delay > maxDelay { delay = maxDelay } - time.Sleep(delay) + return delay } // prepareContent prepares the content for a FormFile by serializing it if needed. func prepareContent(content interface{}, contentType string) ([]byte, error) { if contentType == ContentTypeJSON { return serializeData(content, FormatJSON) + } else if contentType == ContentTypeMessagePack { + return serializeData(content, FormatMessagePack) } else if contentType == ContentTypeOctetStream { // For binary data, ensure it's already in byte format if data, ok := content.([]byte); ok { return data, nil } - return nil, errors.New("content must be []byte for octet-stream content type") + if reader, ok := content.(io.Reader); ok { + return io.ReadAll(reader) + } + return nil, errors.New("content must be []byte or an io.Reader for octet-stream content type") } return nil, errors.New("unsupported content type for serialization") } diff --git a/internal/civisibility/utils/net/http_test.go b/internal/civisibility/utils/net/http_test.go index 45a6c167bc..afe2cd5932 100644 --- a/internal/civisibility/utils/net/http_test.go +++ b/internal/civisibility/utils/net/http_test.go @@ -99,6 +99,7 @@ func mockRateLimitHandler(w http.ResponseWriter, _ *http.Request) { // Test Suite func TestSendJSONRequest(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() @@ -123,10 +124,11 @@ func TestSendJSONRequest(t *testing.T) { } func TestSendMultipartFormDataRequest(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockMultipartHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "POST", URL: server.URL, @@ -159,10 +161,11 @@ func TestSendMultipartFormDataRequest(t *testing.T) { } func TestSendJSONRequestWithGzipCompression(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "POST", URL: server.URL, @@ -184,10 +187,11 @@ func TestSendJSONRequestWithGzipCompression(t *testing.T) { } func TestSendMultipartFormDataRequestWithGzipCompression(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockMultipartHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "POST", URL: server.URL, @@ -221,15 +225,16 @@ func TestSendMultipartFormDataRequestWithGzipCompression(t *testing.T) { } func TestRateLimitHandlingWithRetries(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockRateLimitHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", // No body needed for GET URL: server.URL, Compressed: true, // Enable gzip compression for GET - MaxRetries: 2, + MaxRetries: 1, Backoff: 1 * time.Second, // Exponential backoff fallback } @@ -245,6 +250,7 @@ func TestRateLimitHandlingWithRetries(t *testing.T) { } func TestGzipDecompressionError(t *testing.T) { + t.Parallel() // Simulate corrupted gzip data corruptedData := []byte{0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03, 0x00} @@ -253,18 +259,19 @@ func TestGzipDecompressionError(t *testing.T) { } func TestExponentialBackoffDelays(t *testing.T) { - start := time.Now() + t.Parallel() // Simulate exponential backoff with 3 retries and 1-second initial delay + var duration time.Duration for i := 0; i < 3; i++ { - exponentialBackoff(i, 1*time.Second) + duration = duration + getExponentialBackoffDuration(i, 1*time.Second) } - elapsed := time.Since(start) - assert.True(t, elapsed >= 7*time.Second, "Expected at least 7 seconds due to exponential backoff") + assert.True(t, duration >= 7*time.Second, "Expected at least 7 seconds due to exponential backoff") } func TestCreateMultipartFormDataWithUnsupportedContentType(t *testing.T) { + t.Parallel() files := []FormFile{ { FieldName: "file1", @@ -279,20 +286,21 @@ func TestCreateMultipartFormDataWithUnsupportedContentType(t *testing.T) { } func TestRateLimitHandlingWithoutResetHeader(t *testing.T) { + t.Parallel() // Mock server without 'x-ratelimit-reset' header - mockRateLimitHandlerWithoutHeader := func(w http.ResponseWriter, r *http.Request) { + mockRateLimitHandlerWithoutHeader := func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "Too Many Requests", HTTPStatusTooManyRequests) } server := httptest.NewServer(http.HandlerFunc(mockRateLimitHandlerWithoutHeader)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", // No body needed for GET URL: server.URL, Compressed: false, - MaxRetries: 2, + MaxRetries: 1, Backoff: 1 * time.Second, } @@ -307,7 +315,8 @@ func TestRateLimitHandlingWithoutResetHeader(t *testing.T) { } func TestSendRequestWithInvalidURL(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: "http://[::1]:namedport", // Invalid URL @@ -320,10 +329,11 @@ func TestSendRequestWithInvalidURL(t *testing.T) { } func TestSendEmptyBodyWithGzipCompression(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "POST", URL: server.URL, @@ -338,16 +348,18 @@ func TestSendEmptyBodyWithGzipCompression(t *testing.T) { } func TestCompressDataWithInvalidInput(t *testing.T) { + t.Parallel() // Attempt to compress an invalid data type (e.g., an empty interface{}) _, err := compressData(nil) assert.Error(t, err) } func TestSendPUTRequestWithJSONBody(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "PUT", URL: server.URL, @@ -362,10 +374,11 @@ func TestSendPUTRequestWithJSONBody(t *testing.T) { } func TestSendDELETERequest(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "DELETE", URL: server.URL, @@ -378,10 +391,11 @@ func TestSendDELETERequest(t *testing.T) { } func TestSendHEADRequest(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "HEAD", URL: server.URL, @@ -394,10 +408,11 @@ func TestSendHEADRequest(t *testing.T) { } func TestSendRequestWithCustomHeaders(t *testing.T) { + t.Parallel() server := httptest.NewServer(http.HandlerFunc(mockJSONMsgPackHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) customHeaderKey := "X-Custom-Header" customHeaderValue := "CustomValue" @@ -421,21 +436,23 @@ func TestSendRequestWithCustomHeaders(t *testing.T) { } func TestSendRequestWithTimeout(t *testing.T) { + t.Parallel() // Mock server that delays response - mockSlowHandler := func(w http.ResponseWriter, r *http.Request) { - time.Sleep(5 * time.Second) // Delay longer than the client timeout + mockSlowHandler := func(w http.ResponseWriter, _ *http.Request) { + time.Sleep(2 * time.Second) // Delay longer than the client timeout w.WriteHeader(http.StatusOK) } server := httptest.NewServer(http.HandlerFunc(mockSlowHandler)) defer server.Close() - handler := NewRequestHandler() - handler.Client.Timeout = 2 * time.Second // Set client timeout to 2 seconds + handler := NewRequestHandlerWithClient(createNewHTTPClient()) + handler.Client.Timeout = 1 * time.Second // Set client timeout to 2 seconds config := RequestConfig{ - Method: "GET", - URL: server.URL, + Method: "GET", + URL: server.URL, + MaxRetries: 1, } response, err := handler.SendRequest(config) @@ -444,20 +461,21 @@ func TestSendRequestWithTimeout(t *testing.T) { } func TestSendRequestWithMaxRetriesExceeded(t *testing.T) { + t.Parallel() // Mock server that always returns a 500 error - mockAlwaysFailHandler := func(w http.ResponseWriter, r *http.Request) { + mockAlwaysFailHandler := func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "Internal Server Error", http.StatusInternalServerError) } server := httptest.NewServer(http.HandlerFunc(mockAlwaysFailHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: server.URL, Compressed: false, - MaxRetries: 2, // Only retry twice + MaxRetries: 1, // Only retry twice Backoff: 500 * time.Millisecond, } @@ -472,8 +490,9 @@ func TestSendRequestWithMaxRetriesExceeded(t *testing.T) { } func TestGzipResponseDecompressionHandling(t *testing.T) { + t.Parallel() // Mock server that returns a gzip-compressed response - mockGzipResponseHandler := func(w http.ResponseWriter, r *http.Request) { + mockGzipResponseHandler := func(w http.ResponseWriter, _ *http.Request) { originalResponse := `{"message": "Hello, Gzip!"}` var buf bytes.Buffer gzipWriter := gzip.NewWriter(&buf) @@ -493,7 +512,7 @@ func TestGzipResponseDecompressionHandling(t *testing.T) { server := httptest.NewServer(http.HandlerFunc(mockGzipResponseHandler)) defer server.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: server.URL, @@ -513,7 +532,8 @@ func TestGzipResponseDecompressionHandling(t *testing.T) { } func TestSendRequestWithUnsupportedFormat(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "POST", URL: "http://example.com/", @@ -528,7 +548,8 @@ func TestSendRequestWithUnsupportedFormat(t *testing.T) { } func TestSendRequestWithInvalidMethod(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "", URL: "http://example.com/", @@ -540,7 +561,8 @@ func TestSendRequestWithInvalidMethod(t *testing.T) { } func TestSendRequestWithEmptyURL(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: "", @@ -552,7 +574,8 @@ func TestSendRequestWithEmptyURL(t *testing.T) { } func TestSendRequestWithNetworkError(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: "http://invalid-url/", @@ -565,18 +588,21 @@ func TestSendRequestWithNetworkError(t *testing.T) { } func TestSerializeNilDataToJSON(t *testing.T) { + t.Parallel() data, err := serializeData(nil, FormatJSON) assert.NoError(t, err) assert.Equal(t, []byte("null"), data) } func TestCompressEmptyData(t *testing.T) { + t.Parallel() data, err := compressData([]byte{}) assert.NoError(t, err) assert.NotEmpty(t, data) } func TestDecompressValidGzipData(t *testing.T) { + t.Parallel() var buf bytes.Buffer writer := gzip.NewWriter(&buf) writer.Write([]byte("test data")) @@ -588,6 +614,7 @@ func TestDecompressValidGzipData(t *testing.T) { } func TestExponentialBackoffWithNegativeRetryCount(t *testing.T) { + t.Parallel() start := time.Now() exponentialBackoff(-1, 100*time.Millisecond) duration := time.Since(start) @@ -595,6 +622,7 @@ func TestExponentialBackoffWithNegativeRetryCount(t *testing.T) { } func TestResponseUnmarshalWithUnsupportedFormat(t *testing.T) { + t.Parallel() resp := &Response{ Body: []byte("data"), Format: "unknown", @@ -609,14 +637,15 @@ func TestResponseUnmarshalWithUnsupportedFormat(t *testing.T) { } func TestSendRequestWithUnsupportedResponseFormat(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Parallel() + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set(HeaderContentType, "application/xml") w.WriteHeader(http.StatusOK) w.Write([]byte("test")) })) defer ts.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: ts.URL, @@ -635,12 +664,14 @@ func TestSendRequestWithUnsupportedResponseFormat(t *testing.T) { } func TestPrepareContentWithNonByteContentForOctetStream(t *testing.T) { + t.Parallel() _, err := prepareContent(12345, ContentTypeOctetStream) assert.Error(t, err) - assert.EqualError(t, err, "content must be []byte for octet-stream content type") + assert.EqualError(t, err, "content must be []byte or an io.Reader for octet-stream content type") } func TestCreateMultipartFormDataWithCompression(t *testing.T) { + t.Parallel() files := []FormFile{ { FieldName: "file1", @@ -662,7 +693,8 @@ func TestCreateMultipartFormDataWithCompression(t *testing.T) { } func TestSendRequestWithBodySerializationError(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "POST", URL: "http://example.com/", @@ -676,8 +708,9 @@ func TestSendRequestWithBodySerializationError(t *testing.T) { } func TestSendRequestWithCompressedResponse(t *testing.T) { + t.Parallel() // Server that returns a compressed response - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set(HeaderContentType, ContentTypeJSON) w.Header().Set(HeaderContentEncoding, ContentEncodingGzip) var buf bytes.Buffer @@ -689,7 +722,7 @@ func TestSendRequestWithCompressedResponse(t *testing.T) { })) defer ts.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: ts.URL, @@ -709,8 +742,9 @@ func TestSendRequestWithCompressedResponse(t *testing.T) { } func TestSendRequestWithRetryAfterHeader(t *testing.T) { + t.Parallel() attempts := 0 - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { if attempts == 0 { w.Header().Set(HeaderRateLimitReset, "1") // Wait 1 second w.WriteHeader(HTTPStatusTooManyRequests) @@ -723,7 +757,7 @@ func TestSendRequestWithRetryAfterHeader(t *testing.T) { })) defer ts.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: ts.URL, @@ -747,8 +781,9 @@ func TestSendRequestWithRetryAfterHeader(t *testing.T) { } func TestSendRequestWithInvalidRetryAfterHeader(t *testing.T) { + t.Parallel() attempts := 0 - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { if attempts == 0 { w.Header().Set(HeaderRateLimitReset, "invalid") // Invalid value w.WriteHeader(HTTPStatusTooManyRequests) @@ -761,7 +796,7 @@ func TestSendRequestWithInvalidRetryAfterHeader(t *testing.T) { })) defer ts.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: ts.URL, @@ -785,13 +820,13 @@ func TestSendRequestWithInvalidRetryAfterHeader(t *testing.T) { } func TestExponentialBackoffWithMaxDelay(t *testing.T) { - start := time.Now() - exponentialBackoff(10, 1*time.Second) // Should be limited to maxDelay (30s) - duration := time.Since(start) - assert.LessOrEqual(t, duration, 31*time.Second) + t.Parallel() + delay := getExponentialBackoffDuration(10, 1*time.Second) // Should be limited to maxDelay (10s) + assert.LessOrEqual(t, delay, 11*time.Second) } func TestSendRequestWithContextTimeout(t *testing.T) { + t.Parallel() handler := &RequestHandler{ Client: &http.Client{ Timeout: 50 * time.Millisecond, @@ -799,7 +834,7 @@ func TestSendRequestWithContextTimeout(t *testing.T) { } // Server that sleeps longer than client timeout - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { time.Sleep(100 * time.Millisecond) w.WriteHeader(http.StatusOK) })) @@ -816,8 +851,9 @@ func TestSendRequestWithContextTimeout(t *testing.T) { } func TestSendRequestWithRateLimitButNoResetHeader(t *testing.T) { + t.Parallel() attempts := 0 - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { if attempts < 2 { w.WriteHeader(HTTPStatusTooManyRequests) attempts++ @@ -828,7 +864,7 @@ func TestSendRequestWithRateLimitButNoResetHeader(t *testing.T) { })) defer ts.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: ts.URL, @@ -847,7 +883,8 @@ func TestSendRequestWithRateLimitButNoResetHeader(t *testing.T) { } func TestSendRequestWhenServerClosesConnection(t *testing.T) { - ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + t.Parallel() + ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { h1 := w.(http.Hijacker) conn, _, _ := h1.Hijack() conn.Close() @@ -856,7 +893,7 @@ func TestSendRequestWhenServerClosesConnection(t *testing.T) { ts.Start() defer ts.Close() - handler := NewRequestHandler() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: ts.URL, @@ -870,7 +907,8 @@ func TestSendRequestWhenServerClosesConnection(t *testing.T) { } func TestSendRequestWithInvalidPortAndMaxRetriesExceeded(t *testing.T) { - handler := NewRequestHandler() + t.Parallel() + handler := NewRequestHandlerWithClient(createNewHTTPClient()) config := RequestConfig{ Method: "GET", URL: "http://localhost:0/", // Invalid port to force error @@ -884,12 +922,14 @@ func TestSendRequestWithInvalidPortAndMaxRetriesExceeded(t *testing.T) { } func TestPrepareContentWithNilContent(t *testing.T) { + t.Parallel() data, err := prepareContent(nil, ContentTypeJSON) assert.NoError(t, err) assert.Equal(t, []byte("null"), data) } func TestSerializeDataWithInvalidDataType(t *testing.T) { + t.Parallel() _, err := serializeData(make(chan int), FormatJSON) assert.Error(t, err) assert.Contains(t, err.Error(), "unsupported type: chan int") diff --git a/internal/civisibility/utils/net/known_tests_api.go b/internal/civisibility/utils/net/known_tests_api.go new file mode 100644 index 0000000000..956dc1e038 --- /dev/null +++ b/internal/civisibility/utils/net/known_tests_api.go @@ -0,0 +1,116 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package net + +import ( + "fmt" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" +) + +const ( + knownTestsRequestType string = "ci_app_libraries_tests_request" + knownTestsURLPath string = "api/v2/ci/libraries/tests" +) + +type ( + knownTestsRequest struct { + Data knownTestsRequestHeader `json:"data"` + } + + knownTestsRequestHeader struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes KnownTestsRequestData `json:"attributes"` + } + + KnownTestsRequestData struct { + Service string `json:"service"` + Env string `json:"env"` + RepositoryURL string `json:"repository_url"` + Configurations testConfigurations `json:"configurations"` + } + + knownTestsResponse struct { + Data struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes KnownTestsResponseData `json:"attributes"` + } `json:"data"` + } + + KnownTestsResponseData struct { + Tests KnownTestsResponseDataModules `json:"tests"` + } + + KnownTestsResponseDataModules map[string]KnownTestsResponseDataSuites + KnownTestsResponseDataSuites map[string][]string +) + +func (c *client) GetKnownTests() (*KnownTestsResponseData, error) { + if c.repositoryURL == "" || c.commitSha == "" { + return nil, fmt.Errorf("civisibility.GetKnownTests: repository URL and commit SHA are required") + } + + body := knownTestsRequest{ + Data: knownTestsRequestHeader{ + ID: c.id, + Type: knownTestsRequestType, + Attributes: KnownTestsRequestData{ + Service: c.serviceName, + Env: c.environment, + RepositoryURL: c.repositoryURL, + Configurations: c.testConfigurations, + }, + }, + } + + request := c.getPostRequestConfig(knownTestsURLPath, body) + if request.Compressed { + telemetry.KnownTestsRequest(telemetry.CompressedRequestCompressedType) + } else { + telemetry.KnownTestsRequest(telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() + response, err := c.handler.SendRequest(*request) + telemetry.KnownTestsRequestMs(float64(time.Since(startTime).Milliseconds())) + + if err != nil { + telemetry.KnownTestsRequestErrors(telemetry.NetworkErrorType) + return nil, fmt.Errorf("sending known tests request: %s", err) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.KnownTestsRequestErrors(telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) + } + if response.Compressed { + telemetry.KnownTestsResponseBytes(telemetry.CompressedResponseCompressedType, float64(len(response.Body))) + } else { + telemetry.KnownTestsResponseBytes(telemetry.UncompressedResponseCompressedType, float64(len(response.Body))) + } + + var responseObject knownTestsResponse + err = response.Unmarshal(&responseObject) + if err != nil { + return nil, fmt.Errorf("unmarshalling known tests response: %s", err) + } + + testCount := 0 + if responseObject.Data.Attributes.Tests != nil { + for _, suites := range responseObject.Data.Attributes.Tests { + if suites == nil { + continue + } + for _, tests := range suites { + testCount += len(tests) + } + } + } + telemetry.KnownTestsResponseTests(float64(testCount)) + return &responseObject.Data.Attributes, nil +} diff --git a/internal/civisibility/utils/net/efd_api_test.go b/internal/civisibility/utils/net/known_tests_api_test.go similarity index 75% rename from internal/civisibility/utils/net/efd_api_test.go rename to internal/civisibility/utils/net/known_tests_api_test.go index 93008d25ce..65bbefe91f 100644 --- a/internal/civisibility/utils/net/efd_api_test.go +++ b/internal/civisibility/utils/net/known_tests_api_test.go @@ -16,15 +16,15 @@ import ( "github.com/stretchr/testify/assert" ) -func TestEfdApiRequest(t *testing.T) { +func TestKnownTestsApiRequest(t *testing.T) { var c *client - expectedResponse := efdResponse{} + expectedResponse := knownTestsResponse{} expectedResponse.Data.Type = settingsRequestType - expectedResponse.Data.Attributes.Tests = EfdResponseDataModules{ - "MyModule1": EfdResponseDataSuites{ + expectedResponse.Data.Attributes.Tests = KnownTestsResponseDataModules{ + "MyModule1": KnownTestsResponseDataSuites{ "MySuite1": []string{"Test1", "Test2"}, }, - "MyModule2": EfdResponseDataSuites{ + "MyModule2": KnownTestsResponseDataSuites{ "MySuite2": []string{"Test3", "Test4"}, }, } @@ -37,11 +37,11 @@ func TestEfdApiRequest(t *testing.T) { } if r.Header.Get(HeaderContentType) == ContentTypeJSON { - var request efdRequest + var request knownTestsRequest json.Unmarshal(body, &request) assert.Equal(t, c.id, request.Data.ID) - assert.Equal(t, efdRequestType, request.Data.Type) - assert.Equal(t, efdURLPath, r.URL.Path[1:]) + assert.Equal(t, knownTestsRequestType, request.Data.Type) + assert.Equal(t, knownTestsURLPath, r.URL.Path[1:]) assert.Equal(t, c.environment, request.Data.Attributes.Env) assert.Equal(t, c.repositoryURL, request.Data.Attributes.RepositoryURL) assert.Equal(t, c.serviceName, request.Data.Attributes.Service) @@ -62,13 +62,13 @@ func TestEfdApiRequest(t *testing.T) { cInterface := NewClient() c = cInterface.(*client) - efdData, err := cInterface.GetEarlyFlakeDetectionData() + efdData, err := cInterface.GetKnownTests() assert.Nil(t, err) assert.Equal(t, expectedResponse.Data.Attributes, *efdData) } -func TestEfdApiRequestFailToUnmarshal(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +func TestKnownTestsApiRequestFailToUnmarshal(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "failed to read body", http.StatusBadRequest) })) defer server.Close() @@ -80,14 +80,14 @@ func TestEfdApiRequestFailToUnmarshal(t *testing.T) { setCiVisibilityEnv(path, server.URL) cInterface := NewClient() - efdData, err := cInterface.GetEarlyFlakeDetectionData() + efdData, err := cInterface.GetKnownTests() assert.Nil(t, efdData) assert.NotNil(t, err) assert.Contains(t, err.Error(), "cannot unmarshal response") } -func TestEfdApiRequestFailToGet(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { +func TestKnownTestsApiRequestFailToGet(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "internal processing error", http.StatusInternalServerError) })) defer server.Close() @@ -99,8 +99,8 @@ func TestEfdApiRequestFailToGet(t *testing.T) { setCiVisibilityEnv(path, server.URL) cInterface := NewClient() - efdData, err := cInterface.GetEarlyFlakeDetectionData() + efdData, err := cInterface.GetKnownTests() assert.Nil(t, efdData) assert.NotNil(t, err) - assert.Contains(t, err.Error(), "sending early flake detection request") + assert.Contains(t, err.Error(), "sending known tests request") } diff --git a/internal/civisibility/utils/net/logs_api.go b/internal/civisibility/utils/net/logs_api.go new file mode 100644 index 0000000000..f2aa0543c7 --- /dev/null +++ b/internal/civisibility/utils/net/logs_api.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package net + +import ( + "fmt" + "io" +) + +const ( + // logsSubDomain is the subdomain for the logs endpoint. + logsSubDomain string = "http-intake.logs" + // logsURLPath is the URL path for the logs endpoint. + logsURLPath string = "api/v2/logs" +) + +// NewClientForLogs creates a new client for sending logs payloads. +func NewClientForLogs() Client { + return NewClientWithServiceNameAndSubdomain("", logsSubDomain) +} + +// SendLogs sends a logs payload to the backend. +func (c *client) SendLogs(logsPayload io.Reader) error { + + // Send the coverage payload. + request := RequestConfig{ + Method: "POST", + URL: c.getURLPath(logsURLPath), + Headers: c.headers, + Body: logsPayload, + Format: FormatJSON, + Compressed: true, + } + + response, responseErr := c.handler.SendRequest(request) + + if responseErr != nil { + return fmt.Errorf("failed to send logs: %s", responseErr) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + return fmt.Errorf("unexpected response code %d: %s", response.StatusCode, string(response.Body)) + } + + return nil +} diff --git a/internal/civisibility/utils/net/searchcommits_api.go b/internal/civisibility/utils/net/searchcommits_api.go index 2aa787b77b..9214e4f054 100644 --- a/internal/civisibility/utils/net/searchcommits_api.go +++ b/internal/civisibility/utils/net/searchcommits_api.go @@ -7,6 +7,9 @@ package net import ( "fmt" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" ) const ( @@ -29,6 +32,10 @@ type ( ) func (c *client) GetCommits(localCommits []string) ([]string, error) { + if c.repositoryURL == "" { + return nil, fmt.Errorf("civisibility.GetCommits: repository URL is required") + } + body := searchCommits{ Data: []searchCommitsData{}, Meta: searchCommitsMeta{ @@ -43,11 +50,30 @@ func (c *client) GetCommits(localCommits []string) ([]string, error) { }) } - response, err := c.handler.SendRequest(*c.getPostRequestConfig(searchCommitsURLPath, body)) + request := c.getPostRequestConfig(searchCommitsURLPath, body) + if request.Compressed { + telemetry.GitRequestsSearchCommits(telemetry.CompressedRequestCompressedType) + } else { + telemetry.GitRequestsSearchCommits(telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() + response, err := c.handler.SendRequest(*request) if err != nil { + telemetry.GitRequestsSearchCommitsErrors(telemetry.NetworkErrorType) return nil, fmt.Errorf("sending search commits request: %s", err.Error()) } + if response.Compressed { + telemetry.GitRequestsSearchCommitsMs(telemetry.CompressedResponseCompressedType, float64(time.Since(startTime).Milliseconds())) + } else { + telemetry.GitRequestsSearchCommitsMs(telemetry.UncompressedResponseCompressedType, float64(time.Since(startTime).Milliseconds())) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.GitRequestsSearchCommitsErrors(telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) + } + var responseObject searchCommits err = response.Unmarshal(&responseObject) if err != nil { diff --git a/internal/civisibility/utils/net/searchcommits_api_test.go b/internal/civisibility/utils/net/searchcommits_api_test.go index ec0e612fcd..593e3f0da4 100644 --- a/internal/civisibility/utils/net/searchcommits_api_test.go +++ b/internal/civisibility/utils/net/searchcommits_api_test.go @@ -67,7 +67,7 @@ func TestSearchCommitsApiRequest(t *testing.T) { } func TestSearchCommitsApiRequestFailToUnmarshal(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "failed to read body", http.StatusBadRequest) })) defer server.Close() @@ -86,7 +86,7 @@ func TestSearchCommitsApiRequestFailToUnmarshal(t *testing.T) { } func TestSearchCommitsApiRequestFailToGet(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "internal processing error", http.StatusInternalServerError) })) defer server.Close() diff --git a/internal/civisibility/utils/net/sendpackfiles_api.go b/internal/civisibility/utils/net/sendpackfiles_api.go index 6a7db18dbd..73faf5ba7c 100644 --- a/internal/civisibility/utils/net/sendpackfiles_api.go +++ b/internal/civisibility/utils/net/sendpackfiles_api.go @@ -8,6 +8,9 @@ package net import ( "fmt" "os" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" ) const ( @@ -37,6 +40,11 @@ func (c *client) SendPackFiles(commitSha string, packFiles []string) (bytes int6 commitSha = c.commitSha } + if c.repositoryURL == "" || commitSha == "" { + err = fmt.Errorf("civisibility.SendPackFiles: repository URL and commit SHA are required") + return + } + pushedShaFormFile := FormFile{ FieldName: "pushedSha", Content: pushedShaBody{ @@ -54,7 +62,7 @@ func (c *client) SendPackFiles(commitSha string, packFiles []string) (bytes int6 for _, file := range packFiles { fileContent, fileErr := os.ReadFile(file) if fileErr != nil { - err = fmt.Errorf("failed to read pack file: %s", fileErr.Error()) + err = fmt.Errorf("failed to read pack file: %s", fileErr) return } @@ -74,18 +82,31 @@ func (c *client) SendPackFiles(commitSha string, packFiles []string) (bytes int6 Backoff: DefaultBackoff, } + if request.Compressed { + telemetry.GitRequestsObjectsPack(telemetry.CompressedRequestCompressedType) + } else { + telemetry.GitRequestsObjectsPack(telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() response, responseErr := c.handler.SendRequest(request) + telemetry.GitRequestsObjectsPackMs(float64(time.Since(startTime).Milliseconds())) + if responseErr != nil { - err = fmt.Errorf("failed to send packfile request: %s", responseErr.Error()) + telemetry.GitRequestsObjectsPackErrors(telemetry.NetworkErrorType) + err = fmt.Errorf("failed to send packfile request: %s", responseErr) return } if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.GitRequestsObjectsPackErrors(telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) err = fmt.Errorf("unexpected response code %d: %s", response.StatusCode, string(response.Body)) } bytes += int64(len(fileContent)) } + telemetry.GitRequestsObjectsPackFiles(float64(len(packFiles))) + telemetry.GitRequestsObjectsPackBytes(float64(bytes)) return } diff --git a/internal/civisibility/utils/net/sendpackfiles_api_test.go b/internal/civisibility/utils/net/sendpackfiles_api_test.go index 652c23b5be..3ddb6de1eb 100644 --- a/internal/civisibility/utils/net/sendpackfiles_api_test.go +++ b/internal/civisibility/utils/net/sendpackfiles_api_test.go @@ -72,7 +72,7 @@ func TestSendPackFilesApiRequest(t *testing.T) { } func TestSendPackFilesApiRequestFailToUnmarshal(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "failed to read body", http.StatusBadRequest) })) defer server.Close() @@ -93,7 +93,7 @@ func TestSendPackFilesApiRequestFailToUnmarshal(t *testing.T) { } func TestSendPackFilesApiRequestFailToGet(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "internal processing error", http.StatusInternalServerError) })) defer server.Close() @@ -115,7 +115,7 @@ func TestSendPackFilesApiRequestFailToGet(t *testing.T) { } func TestSendPackFilesApiRequestFileError(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "internal processing error", http.StatusInternalServerError) })) defer server.Close() @@ -137,7 +137,7 @@ func TestSendPackFilesApiRequestFileError(t *testing.T) { } func TestSendPackFilesApiRequestNoFile(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "internal processing error", http.StatusInternalServerError) })) defer server.Close() diff --git a/internal/civisibility/utils/net/settings_api.go b/internal/civisibility/utils/net/settings_api.go index effc7b6fc7..d8141699fd 100644 --- a/internal/civisibility/utils/net/settings_api.go +++ b/internal/civisibility/utils/net/settings_api.go @@ -7,6 +7,10 @@ package net import ( "fmt" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const ( @@ -58,10 +62,21 @@ type ( ItrEnabled bool `json:"itr_enabled"` RequireGit bool `json:"require_git"` TestsSkipping bool `json:"tests_skipping"` + KnownTestsEnabled bool `json:"known_tests_enabled"` + ImpactedTestsEnabled bool `json:"impacted_tests_enabled"` + TestManagement struct { + Enabled bool `json:"enabled"` + AttemptToFixRetries int `json:"attempt_to_fix_retries"` + } `json:"test_management"` + SubtestFeaturesEnabled bool `json:"-"` } ) func (c *client) GetSettings() (*SettingsResponseData, error) { + if c.repositoryURL == "" || c.commitSha == "" { + return nil, fmt.Errorf("civisibility.GetSettings: repository URL and commit SHA are required") + } + body := settingsRequest{ Data: settingsRequestHeader{ ID: c.id, @@ -77,16 +92,51 @@ func (c *client) GetSettings() (*SettingsResponseData, error) { }, } - response, err := c.handler.SendRequest(*c.getPostRequestConfig(settingsURLPath, body)) + request := c.getPostRequestConfig(settingsURLPath, body) + if request.Compressed { + telemetry.GitRequestsSettings(telemetry.CompressedRequestCompressedType) + } else { + telemetry.GitRequestsSettings(telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() + response, err := c.handler.SendRequest(*request) + telemetry.GitRequestsSettingsMs(float64(time.Since(startTime).Milliseconds())) if err != nil { - return nil, fmt.Errorf("sending get settings request: %s", err.Error()) + telemetry.GitRequestsSettingsErrors(telemetry.NetworkErrorType) + return nil, fmt.Errorf("sending get settings request: %s", err) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.GitRequestsSettingsErrors(telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) + } + + if log.DebugEnabled() { + log.Debug("civisibility.settings: %s", string(response.Body)) } var responseObject settingsResponse err = response.Unmarshal(&responseObject) if err != nil { - return nil, fmt.Errorf("unmarshalling settings response: %s", err.Error()) + return nil, fmt.Errorf("unmarshalling settings response: %s", err) } + var settingsResponseType telemetry.SettingsResponseType + if responseObject.Data.Attributes.CodeCoverage { + settingsResponseType = append(settingsResponseType, telemetry.CoverageEnabledSettingsResponseType...) + } + if responseObject.Data.Attributes.TestsSkipping { + settingsResponseType = append(settingsResponseType, telemetry.ItrSkipEnabledSettingsResponseType...) + } + if responseObject.Data.Attributes.EarlyFlakeDetection.Enabled { + settingsResponseType = append(settingsResponseType, telemetry.EfdEnabledSettingsResponseType...) + } + if responseObject.Data.Attributes.FlakyTestRetriesEnabled { + settingsResponseType = append(settingsResponseType, telemetry.FlakyTestRetriesEnabledSettingsResponseType...) + } + if responseObject.Data.Attributes.TestManagement.Enabled { + settingsResponseType = append(settingsResponseType, telemetry.TestManagementEnabledSettingsResponseType...) + } + telemetry.GitRequestsSettingsResponse(settingsResponseType) return &responseObject.Data.Attributes, nil } diff --git a/internal/civisibility/utils/net/settings_api_test.go b/internal/civisibility/utils/net/settings_api_test.go index 92ce8993d9..a26bb05654 100644 --- a/internal/civisibility/utils/net/settings_api_test.go +++ b/internal/civisibility/utils/net/settings_api_test.go @@ -73,7 +73,7 @@ func TestSettingsApiRequest(t *testing.T) { } func TestSettingsApiRequestFailToUnmarshal(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "failed to read body", http.StatusBadRequest) })) defer server.Close() @@ -92,7 +92,7 @@ func TestSettingsApiRequestFailToUnmarshal(t *testing.T) { } func TestSettingsApiRequestFailToGet(t *testing.T) { - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { http.Error(w, "internal processing error", http.StatusInternalServerError) })) defer server.Close() diff --git a/internal/civisibility/utils/net/skippable.go b/internal/civisibility/utils/net/skippable.go new file mode 100644 index 0000000000..bc909fd2e3 --- /dev/null +++ b/internal/civisibility/utils/net/skippable.go @@ -0,0 +1,159 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package net + +import ( + "fmt" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" +) + +const ( + skippableRequestType string = "test_params" + skippableURLPath string = "api/v2/ci/tests/skippable" +) + +type ( + skippableRequest struct { + Data skippableRequestHeader `json:"data"` + } + + skippableRequestHeader struct { + Type string `json:"type"` + Attributes skippableRequestData `json:"attributes"` + } + + skippableRequestData struct { + TestLevel string `json:"test_level"` + Configurations testConfigurations `json:"configurations"` + Service string `json:"service"` + Env string `json:"env"` + RepositoryURL string `json:"repository_url"` + Sha string `json:"sha"` + } + + skippableResponse struct { + Meta skippableResponseMeta `json:"meta"` + Data []skippableResponseData `json:"data"` + } + + skippableResponseMeta struct { + CorrelationID string `json:"correlation_id"` + } + + skippableResponseData struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes SkippableResponseDataAttributes `json:"attributes"` + } + + SkippableResponseDataAttributes struct { + Suite string `json:"suite"` + Name string `json:"name"` + Parameters string `json:"parameters"` + Configurations testConfigurations `json:"configurations"` + } +) + +func (c *client) GetSkippableTests() (correlationID string, skippables map[string]map[string][]SkippableResponseDataAttributes, err error) { + if c.repositoryURL == "" || c.commitSha == "" { + err = fmt.Errorf("civisibility.GetSkippableTests: repository URL and commit SHA are required") + return + } + + body := skippableRequest{ + Data: skippableRequestHeader{ + Type: skippableRequestType, + Attributes: skippableRequestData{ + TestLevel: "test", + Configurations: c.testConfigurations, + Service: c.serviceName, + Env: c.environment, + RepositoryURL: c.repositoryURL, + Sha: c.commitSha, + }, + }, + } + + request := c.getPostRequestConfig(skippableURLPath, body) + if request.Compressed { + telemetry.ITRSkippableTestsRequest(telemetry.CompressedRequestCompressedType) + } else { + telemetry.ITRSkippableTestsRequest(telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() + response, err := c.handler.SendRequest(*request) + telemetry.ITRSkippableTestsRequestMs(float64(time.Since(startTime).Milliseconds())) + + if err != nil { + telemetry.ITRSkippableTestsRequestErrors(telemetry.NetworkErrorType) + return "", nil, fmt.Errorf("sending skippable tests request: %s", err) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.ITRSkippableTestsRequestErrors(telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) + } + + if response.Compressed { + telemetry.ITRSkippableTestsResponseBytes(telemetry.CompressedResponseCompressedType, float64(len(response.Body))) + } else { + telemetry.ITRSkippableTestsResponseBytes(telemetry.UncompressedResponseCompressedType, float64(len(response.Body))) + } + + var responseObject skippableResponse + err = response.Unmarshal(&responseObject) + if err != nil { + return "", nil, fmt.Errorf("unmarshalling skippable tests response: %s", err) + } + + telemetry.ITRSkippableTestsResponseTests(float64(len(responseObject.Data))) + skippableTestsMap := map[string]map[string][]SkippableResponseDataAttributes{} + for _, data := range responseObject.Data { + + // Filter out the tests that do not match the test configurations + if data.Attributes.Configurations.OsPlatform != "" && c.testConfigurations.OsPlatform != "" && + data.Attributes.Configurations.OsPlatform != c.testConfigurations.OsPlatform { + continue + } + if data.Attributes.Configurations.OsArchitecture != "" && c.testConfigurations.OsArchitecture != "" && + data.Attributes.Configurations.OsArchitecture != c.testConfigurations.OsArchitecture { + continue + } + if data.Attributes.Configurations.OsVersion != "" && c.testConfigurations.OsVersion != "" && + data.Attributes.Configurations.OsVersion != c.testConfigurations.OsVersion { + continue + } + if data.Attributes.Configurations.RuntimeName != "" && c.testConfigurations.RuntimeName != "" && + data.Attributes.Configurations.RuntimeName != c.testConfigurations.RuntimeName { + continue + } + if data.Attributes.Configurations.RuntimeArchitecture != "" && c.testConfigurations.RuntimeArchitecture != "" && + data.Attributes.Configurations.RuntimeArchitecture != c.testConfigurations.RuntimeArchitecture { + continue + } + if data.Attributes.Configurations.RuntimeVersion != "" && c.testConfigurations.RuntimeVersion != "" && + data.Attributes.Configurations.RuntimeVersion != c.testConfigurations.RuntimeVersion { + continue + } + + var ok bool + var testsMap map[string][]SkippableResponseDataAttributes + if testsMap, ok = skippableTestsMap[data.Attributes.Suite]; !ok { + testsMap = map[string][]SkippableResponseDataAttributes{} + skippableTestsMap[data.Attributes.Suite] = testsMap + } + + if test, ok := testsMap[data.Attributes.Name]; ok { + testsMap[data.Attributes.Name] = append(test, data.Attributes) + } else { + testsMap[data.Attributes.Name] = []SkippableResponseDataAttributes{data.Attributes} + } + } + + return responseObject.Meta.CorrelationID, skippableTestsMap, nil +} diff --git a/internal/civisibility/utils/net/skippable_test.go b/internal/civisibility/utils/net/skippable_test.go new file mode 100644 index 0000000000..a75d90a275 --- /dev/null +++ b/internal/civisibility/utils/net/skippable_test.go @@ -0,0 +1,114 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package net + +import ( + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSkippableApiRequest(t *testing.T) { + var c *client + expectedResponse := skippableResponse{ + Meta: skippableResponseMeta{ + CorrelationID: "correlation_id", + }, + Data: []skippableResponseData{ + { + ID: "id", + Type: "type", + Attributes: SkippableResponseDataAttributes{ + Suite: "suite", + Name: "name", + Parameters: "", + }, + }, + }, + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "failed to read body", http.StatusBadRequest) + return + } + + if r.Header.Get(HeaderContentType) == ContentTypeJSON { + var request skippableRequest + json.Unmarshal(body, &request) + assert.Equal(t, skippableRequestType, request.Data.Type) + assert.Equal(t, "test", request.Data.Attributes.TestLevel) + assert.Equal(t, c.environment, request.Data.Attributes.Env) + assert.Equal(t, c.serviceName, request.Data.Attributes.Service) + assert.Equal(t, c.repositoryURL, request.Data.Attributes.RepositoryURL) + assert.Equal(t, c.commitSha, request.Data.Attributes.Sha) + expectedResponse.Data[0].Attributes.Configurations = c.testConfigurations + w.Header().Set(HeaderContentType, ContentTypeJSON) + json.NewEncoder(w).Encode(expectedResponse) + } + })) + defer server.Close() + + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + setCiVisibilityEnv(path, server.URL) + + cInterface := NewClient() + c = cInterface.(*client) + correlationID, skippables, err := cInterface.GetSkippableTests() + assert.Nil(t, err) + assert.Equal(t, "correlation_id", correlationID) + assert.Len(t, skippables, 1) + assert.Len(t, skippables["suite"], 1) + assert.Equal(t, expectedResponse.Data[0].Attributes, skippables["suite"]["name"][0]) +} + +func TestSkippableApiRequestFailToUnmarshal(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, "failed to read body", http.StatusBadRequest) + })) + defer server.Close() + + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + setCiVisibilityEnv(path, server.URL) + + cInterface := NewClient() + correlationID, skippables, err := cInterface.GetSkippableTests() + assert.Empty(t, correlationID) + assert.Nil(t, skippables) + assert.NotNil(t, err) + assert.Contains(t, err.Error(), "cannot unmarshal response") +} + +func TestSkippableApiRequestFailToGet(t *testing.T) { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, "internal processing error", http.StatusInternalServerError) + })) + defer server.Close() + + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + setCiVisibilityEnv(path, server.URL) + + cInterface := NewClient() + correlationID, skippables, err := cInterface.GetSkippableTests() + assert.Empty(t, correlationID) + assert.Nil(t, skippables) + assert.Contains(t, err.Error(), "sending skippable tests request") +} diff --git a/internal/civisibility/utils/net/test_management_tests_api.go b/internal/civisibility/utils/net/test_management_tests_api.go new file mode 100644 index 0000000000..b9d2ca46ed --- /dev/null +++ b/internal/civisibility/utils/net/test_management_tests_api.go @@ -0,0 +1,145 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package net + +import ( + "fmt" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/utils/telemetry" +) + +const ( + testManagementTestsRequestType string = "ci_app_libraries_tests_request" + testManagementTestsURLPath string = "api/v2/test/libraries/test-management/tests" +) + +type ( + testManagementTestsRequest struct { + Data testManagementTestsRequestHeader `json:"data"` + } + + testManagementTestsRequestHeader struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes testManagementTestsRequestData `json:"attributes"` + } + + testManagementTestsRequestData struct { + RepositoryURL string `json:"repository_url"` + CommitSha string `json:"sha"` + Module string `json:"module,omitempty"` + CommitMessage string `json:"commit_message"` + } + + testManagementTestsResponse struct { + Data struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes TestManagementTestsResponseDataModules `json:"attributes"` + } `json:"data"` + } + + TestManagementTestsResponseDataModules struct { + Modules map[string]TestManagementTestsResponseDataSuites `json:"modules"` + } + + TestManagementTestsResponseDataSuites struct { + Suites map[string]TestManagementTestsResponseDataTests `json:"suites"` + } + + TestManagementTestsResponseDataTests struct { + Tests map[string]TestManagementTestsResponseDataTestProperties `json:"tests"` + } + + TestManagementTestsResponseDataTestProperties struct { + Properties TestManagementTestsResponseDataTestPropertiesAttributes `json:"properties"` + } + + TestManagementTestsResponseDataTestPropertiesAttributes struct { + Quarantined bool `json:"quarantined"` + Disabled bool `json:"disabled"` + AttemptToFix bool `json:"attempt_to_fix"` + } +) + +func (c *client) GetTestManagementTests() (*TestManagementTestsResponseDataModules, error) { + if c.repositoryURL == "" { + return nil, fmt.Errorf("civisibility.GetTestManagementTests: repository URL is required") + } + + // we use the head commit SHA if it is set, otherwise we use the commit SHA + commitSha := c.commitSha + if c.headCommitSha != "" { + commitSha = c.headCommitSha + } + + // we use the head commit message if it is set, otherwise we use the commit message + commitMessage := c.commitMessage + if c.headCommitMessage != "" { + commitMessage = c.headCommitMessage + } + + body := testManagementTestsRequest{ + Data: testManagementTestsRequestHeader{ + ID: c.id, + Type: testManagementTestsRequestType, + Attributes: testManagementTestsRequestData{ + RepositoryURL: c.repositoryURL, + CommitSha: commitSha, + CommitMessage: commitMessage, + }, + }, + } + + request := c.getPostRequestConfig(testManagementTestsURLPath, body) + if request.Compressed { + telemetry.TestManagementTestsRequest(telemetry.CompressedRequestCompressedType) + } else { + telemetry.TestManagementTestsRequest(telemetry.UncompressedRequestCompressedType) + } + + startTime := time.Now() + response, err := c.handler.SendRequest(*request) + telemetry.TestManagementTestsRequestMs(float64(time.Since(startTime).Milliseconds())) + + if err != nil { + telemetry.TestManagementTestsRequestErrors(telemetry.NetworkErrorType) + return nil, fmt.Errorf("sending known tests request: %s", err) + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + telemetry.TestManagementTestsRequestErrors(telemetry.GetErrorTypeFromStatusCode(response.StatusCode)) + } + if response.Compressed { + telemetry.TestManagementTestsResponseBytes(telemetry.CompressedResponseCompressedType, float64(len(response.Body))) + } else { + telemetry.TestManagementTestsResponseBytes(telemetry.UncompressedResponseCompressedType, float64(len(response.Body))) + } + + var responseObject testManagementTestsResponse + err = response.Unmarshal(&responseObject) + if err != nil { + return nil, fmt.Errorf("unmarshalling test management tests response: %s", err) + } + + testCount := 0 + if responseObject.Data.Attributes.Modules != nil { + for _, module := range responseObject.Data.Attributes.Modules { + if module.Suites == nil { + continue + } + for _, suite := range module.Suites { + if suite.Tests == nil { + continue + } + testCount += len(suite.Tests) + } + } + } + telemetry.TestManagementTestsResponseTests(float64(testCount)) + return &responseObject.Data.Attributes, nil +} diff --git a/internal/civisibility/utils/net/test_management_tests_api_test.go b/internal/civisibility/utils/net/test_management_tests_api_test.go new file mode 100644 index 0000000000..ffd25227af --- /dev/null +++ b/internal/civisibility/utils/net/test_management_tests_api_test.go @@ -0,0 +1,139 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package net + +import ( + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +// TestTestManagementTestsApiRequest tests the successful scenario for GetTestManagementTests. +func TestTestManagementTestsApiRequest(t *testing.T) { + var c *client + // Create an expected response following the structure defined in the package. + expectedResponse := testManagementTestsResponse{} + expectedResponse.Data.Type = testManagementTestsRequestType + expectedResponse.Data.Attributes.Modules = map[string]TestManagementTestsResponseDataSuites{ + "MyModule": { + Suites: map[string]TestManagementTestsResponseDataTests{ + "MySuite": { + Tests: map[string]TestManagementTestsResponseDataTestProperties{ + "Test1": { + Properties: TestManagementTestsResponseDataTestPropertiesAttributes{ + Quarantined: false, + Disabled: false, + AttemptToFix: true, + }, + }, + }, + }, + }, + }, + } + + // Create a test server that simulates the endpoint behavior. + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Read the request body. + body, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "failed to read body", http.StatusBadRequest) + return + } + + // Check that the request contains the expected Content-Type. + if r.Header.Get(HeaderContentType) == ContentTypeJSON { + var request testManagementTestsRequest + err = json.Unmarshal(body, &request) + assert.NoError(t, err, "failed to unmarshal request body") + + // Validate that the request payload has the expected values. + assert.Equal(t, c.id, request.Data.ID, "ID mismatch") + assert.Equal(t, testManagementTestsRequestType, request.Data.Type, "Type mismatch") + assert.Equal(t, c.repositoryURL, request.Data.Attributes.RepositoryURL, "RepositoryURL mismatch") + // Check the URL (remove the "/" prefix). + assert.Equal(t, testManagementTestsURLPath, r.URL.Path[1:], "URL path mismatch") + + // Set the response header and encode the expected JSON response. + w.Header().Set(HeaderContentType, ContentTypeJSON) + // Set the ID in the response to match the request. + expectedResponse.Data.ID = request.Data.ID + _ = json.NewEncoder(w).Encode(expectedResponse) + } + })) + defer server.Close() + + // Save the original environment variables and restore them at the end of the test. + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + // Set the test server URL in the environment. + setCiVisibilityEnv(path, server.URL) + + // We create the client (we assume that NewClient() already configures c.repositoryURL, c.id, etc.). + cInterface := NewClient() + c = cInterface.(*client) + + // Let's call the function we want to test. + responseData, err := cInterface.GetTestManagementTests() + assert.NoError(t, err) + + // Let's compare the part of the response we are interested in. + assert.Equal(t, expectedResponse.Data.Attributes, *responseData) +} + +// TestTestManagementTestsApiRequestFailToUnmarshal simulates a failure in the unmarshal of the response. +func TestTestManagementTestsApiRequestFailToUnmarshal(t *testing.T) { + // The server returns a malformed JSON to trigger an unmarshal error. + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set(HeaderContentType, ContentTypeJSON) + _, _ = w.Write([]byte(`{"invalid": "json"`)) // JSON malformado + })) + defer server.Close() + + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + setCiVisibilityEnv(path, server.URL) + + cInterface := NewClient() + responseData, err := cInterface.GetTestManagementTests() + assert.Nil(t, responseData) + assert.NotNil(t, err) + + // We expect the error to contain the string defined in the message. + assert.Contains(t, err.Error(), "unmarshalling test management tests response") +} + +// TestTestManagementTestsApiRequestFailToGet simulates a failure in the call to the endpoint. +func TestTestManagementTestsApiRequestFailToGet(t *testing.T) { + // The server responds with an HTTP 500 error. + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + http.Error(w, "internal processing error", http.StatusInternalServerError) + })) + defer server.Close() + + origEnv := saveEnv() + path := os.Getenv("PATH") + defer restoreEnv(origEnv) + + setCiVisibilityEnv(path, server.URL) + + cInterface := NewClient() + responseData, err := cInterface.GetTestManagementTests() + assert.Nil(t, responseData) + assert.NotNil(t, err) + + // We expect the error to contain the string defined in the message. + assert.Contains(t, err.Error(), "sending known tests request") +} diff --git a/internal/civisibility/utils/telemetry/telemetry.go b/internal/civisibility/utils/telemetry/telemetry.go new file mode 100644 index 0000000000..53431615c2 --- /dev/null +++ b/internal/civisibility/utils/telemetry/telemetry.go @@ -0,0 +1,173 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package telemetry + +// TestingFramework is a type for testing frameworks +type TestingFramework string + +const ( + GoTestingFramework TestingFramework = "test_framework:testing" + UnknownFramework TestingFramework = "test_framework:unknown" +) + +// TestSessionEventType is a type for test session event types +type TestSessionType []string + +var ( + AppVeyorTestSessionType TestSessionType = []string{"provider:appveyor"} + AzurePipelinesTestSessionType TestSessionType = []string{"provider:azp"} + BitbucketTestSessionType TestSessionType = []string{"provider:bitbucket"} + BitRiseTestSessionType TestSessionType = []string{"provider:bitrise"} + BuildKiteTestSessionType TestSessionType = []string{"provider:buildkite"} + CircleCiTestSessionType TestSessionType = []string{"provider:circleci"} + CodeFreshTestSessionType TestSessionType = []string{"provider:codefresh"} + GithubActionsTestSessionType TestSessionType = []string{"provider:githubactions"} + GitlabTestSessionType TestSessionType = []string{"provider:gitlab"} + JenkinsTestSessionType TestSessionType = []string{"provider:jenkins"} + TeamcityTestSessionType TestSessionType = []string{"provider:teamcity"} + TravisCiTestSessionType TestSessionType = []string{"provider:travisci"} + BuddyCiTestSessionType TestSessionType = []string{"provider:buddyci"} + AwsCodePipelineSessionType TestSessionType = []string{"provider:aws"} + UnsupportedTestSessionType TestSessionType = []string{"provider:unsupported"} + + IsAutoInstrumentationTestSessionType TestSessionType = []string{"auto_injected:true"} +) + +// TestingEventType is a type for testing event types +type TestingEventType []string + +var ( + TestEventType TestingEventType = []string{"event_type:test"} + SuiteEventType TestingEventType = []string{"event_type:suite"} + ModuleEventType TestingEventType = []string{"event_type:module"} + SessionEventType TestingEventType = []string{"event_type:session"} + + UnsupportedCiEventType TestingEventType = []string{"is_unsupported_ci"} + HasCodeOwnerEventType TestingEventType = []string{"has_codeowner"} + IsNewEventType TestingEventType = []string{"is_new:true"} + IsRetryEventType TestingEventType = []string{"is_retry:true"} + EfdAbortSlowEventType TestingEventType = []string{"early_flake_detection_abort_reason:slow"} + IsBenchmarkEventType TestingEventType = []string{"is_benchmark"} + IsAttemptToFixEventType TestingEventType = []string{"is_attempt_to_fix:true"} + IsQuarantinedEventType TestingEventType = []string{"is_quarantined:true"} + IsDisabledEventType TestingEventType = []string{"is_disabled:true"} + HasFailedAllRetriesEventType TestingEventType = []string{"has_failed_all_retries:true"} +) + +// CoverageLibraryType is a type for coverage library types +type CoverageLibraryType string + +const ( + DefaultCoverageLibraryType CoverageLibraryType = "library:default" + UnknownCoverageLibraryType CoverageLibraryType = "library:unknown" +) + +// EndpointType is a type for endpoint types +type EndpointType string + +const ( + TestCycleEndpointType EndpointType = "endpoint:test_cycle" + CodeCoverageEndpointType EndpointType = "endpoint:code_coverage" +) + +// ErrorType is a type for error types +type ErrorType []string + +var ( + TimeoutErrorType ErrorType = []string{"error_type:timeout"} + NetworkErrorType ErrorType = []string{"error_type:network"} + StatusCodeErrorType ErrorType = []string{"error_type:status_code"} + StatusCode4xxErrorType ErrorType = []string{"error_type:status_code_4xx_response"} + StatusCode5xxErrorType ErrorType = []string{"error_type:status_code_5xx_response"} + StatusCode400ErrorType ErrorType = []string{"error_type:status_code_4xx_response", "status_code:400"} + StatusCode401ErrorType ErrorType = []string{"error_type:status_code_4xx_response", "status_code:401"} + StatusCode403ErrorType ErrorType = []string{"error_type:status_code_4xx_response", "status_code:403"} + StatusCode404ErrorType ErrorType = []string{"error_type:status_code_4xx_response", "status_code:404"} + StatusCode408ErrorType ErrorType = []string{"error_type:status_code_4xx_response", "status_code:408"} + StatusCode429ErrorType ErrorType = []string{"error_type:status_code_4xx_response", "status_code:429"} +) + +// CommandType is a type for commands types +type CommandType string + +const ( + NotSpecifiedCommandsType CommandType = "" + GetRepositoryCommandsType CommandType = "command:get_repository" + GetBranchCommandsType CommandType = "command:get_branch" + GetRemoteCommandsType CommandType = "command:get_remote" + GetRemoteUpstreamTrackingCommandsType CommandType = "command:get_remote_upstream_tracking" + GetHeadCommandsType CommandType = "command:get_head" + CheckShallowCommandsType CommandType = "command:check_shallow" + UnshallowCommandsType CommandType = "command:unshallow" + GetLocalCommitsCommandsType CommandType = "command:get_local_commits" + GetObjectsCommandsType CommandType = "command:get_objects" + PackObjectsCommandsType CommandType = "command:pack_objects" + DiffCommandType CommandType = "command:diff" + ShowRefCommandType CommandType = "command:show_ref" + LsRemoteHeadsCommandType CommandType = "command:ls_remote_heads" + FetchCommandType CommandType = "command:fetch" + ForEachRefCommandType CommandType = "command:for_each_ref" + MergeBaseCommandType CommandType = "command:merge_base" + RevListCommandType CommandType = "command:rev_list" + SymbolicRefCommandType CommandType = "command:symbolic_ref" + GetWorkingDirectoryCommandType CommandType = "command:get_working_directory" + GetGitCommitInfoCommandType CommandType = "command:get_git_info" + GitAddPermissionCommandType CommandType = "command:git_add_permission" +) + +// CommandExitCodeType is a type for command exit codes +type CommandExitCodeType string + +const ( + MissingCommandExitCode CommandExitCodeType = "exit_code:missing" + UnknownCommandExitCode CommandExitCodeType = "exit_code:unknown" + ECMinus1CommandExitCode CommandExitCodeType = "exit_code:-1" + EC1CommandExitCode CommandExitCodeType = "exit_code:1" + EC2CommandExitCode CommandExitCodeType = "exit_code:2" + EC127CommandExitCode CommandExitCodeType = "exit_code:127" + EC128CommandExitCode CommandExitCodeType = "exit_code:128" + EC129CommandExitCode CommandExitCodeType = "exit_code:129" +) + +// RequestCompressedType is a type for request compressed types +type RequestCompressedType string + +const ( + UncompressedRequestCompressedType RequestCompressedType = "" + CompressedRequestCompressedType RequestCompressedType = "rq_compressed:true" +) + +// ResponseCompressedType is a type for response compressed types +type ResponseCompressedType string + +const ( + UncompressedResponseCompressedType ResponseCompressedType = "" + CompressedResponseCompressedType ResponseCompressedType = "rs_compressed:true" +) + +// SettingsResponseType is a type for settings response types +type SettingsResponseType []string + +var ( + CoverageEnabledSettingsResponseType SettingsResponseType = []string{"coverage_enabled"} + ItrSkipEnabledSettingsResponseType SettingsResponseType = []string{"itrskip_enabled"} + EfdEnabledSettingsResponseType SettingsResponseType = []string{"early_flake_detection_enabled:true"} + FlakyTestRetriesEnabledSettingsResponseType SettingsResponseType = []string{"flaky_test_retries_enabled:true"} + TestManagementEnabledSettingsResponseType SettingsResponseType = []string{"test_management_enabled:true"} +) + +// removeEmptyStrings removes empty string values from a slice. +func removeEmptyStrings(s []string) []string { + result := make([]string, len(s)) + n := 0 + for _, str := range s { + if str != "" { + result[n] = str + n++ + } + } + return result[:n] +} diff --git a/internal/civisibility/utils/telemetry/telemetry_count.go b/internal/civisibility/utils/telemetry/telemetry_count.go new file mode 100644 index 0000000000..ed686b118f --- /dev/null +++ b/internal/civisibility/utils/telemetry/telemetry_count.go @@ -0,0 +1,286 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package telemetry + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/civisibility/constants" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +func getTestingFramework(testingFramework string) TestingFramework { + telemetryFramework := UnknownFramework + if testingFramework == "golang.org/pkg/testing" { + telemetryFramework = GoTestingFramework + } + return telemetryFramework +} + +func GetErrorTypeFromStatusCode(statusCode int) ErrorType { + switch statusCode { + case 0: + return NetworkErrorType + case 400: + return StatusCode400ErrorType + case 401: + return StatusCode401ErrorType + case 403: + return StatusCode403ErrorType + case 404: + return StatusCode404ErrorType + case 408: + return StatusCode408ErrorType + case 429: + return StatusCode429ErrorType + default: + if statusCode >= 500 && statusCode < 600 { + return StatusCode5xxErrorType + } else if statusCode >= 400 && statusCode < 500 { + return StatusCode4xxErrorType + } + return StatusCodeErrorType + } +} + +func getProviderTestSessionTypeFromProviderString(provider string) TestSessionType { + switch provider { + case "appveyor": + return AppVeyorTestSessionType + case "azurepipelines": + return AzurePipelinesTestSessionType + case "bitbucket": + return BitbucketTestSessionType + case "bitrise": + return BitRiseTestSessionType + case "buildkite": + return BuildKiteTestSessionType + case "circleci": + return CircleCiTestSessionType + case "codefresh": + return CodeFreshTestSessionType + case "github": + return GithubActionsTestSessionType + case "gitlab": + return GitlabTestSessionType + case "jenkins": + return JenkinsTestSessionType + case "teamcity": + return TeamcityTestSessionType + case "travisci": + return TravisCiTestSessionType + case "buddy": + return BuddyCiTestSessionType + case "awscodepipeline": + return AwsCodePipelineSessionType + default: + return UnsupportedTestSessionType + } +} + +func TestSession(providerName string) { + var tags []string + tags = append(tags, getProviderTestSessionTypeFromProviderString(providerName)...) + if env.Get(constants.CIVisibilityAutoInstrumentationProviderEnvironmentVariable) != "" { + tags = append(tags, IsAutoInstrumentationTestSessionType...) + } + telemetry.Count(telemetry.NamespaceCIVisibility, "test_session", removeEmptyStrings(tags)).Submit(1.0) +} + +// EventCreated the number of events created by CI Visibility +func EventCreated(testingFramework string, eventType TestingEventType) { + tags := []string{string(getTestingFramework(testingFramework))} + tags = append(tags, eventType...) + telemetry.Count(telemetry.NamespaceCIVisibility, "event_created", removeEmptyStrings(tags)).Submit(1.0) +} + +// EventFinished the number of events finished by CI Visibility +func EventFinished(testingFramework string, eventType TestingEventType) { + tags := []string{string(getTestingFramework(testingFramework))} + tags = append(tags, eventType...) + telemetry.Count(telemetry.NamespaceCIVisibility, "event_finished", removeEmptyStrings(tags)).Submit(1.0) +} + +// CodeCoverageStarted the number of code coverage start calls by CI Visibility +func CodeCoverageStarted(testingFramework string, coverageLibraryType CoverageLibraryType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "code_coverage_started", removeEmptyStrings([]string{ + string(getTestingFramework(testingFramework)), + string(coverageLibraryType), + })).Submit(1.0) +} + +// CodeCoverageFinished the number of code coverage finished calls by CI Visibility +func CodeCoverageFinished(testingFramework string, coverageLibraryType CoverageLibraryType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "code_coverage_finished", removeEmptyStrings([]string{ + string(getTestingFramework(testingFramework)), + string(coverageLibraryType), + })).Submit(1.0) +} + +// EventsEnqueueForSerialization the number of events enqueued for serialization by CI Visibility +func EventsEnqueueForSerialization() { + telemetry.Count(telemetry.NamespaceCIVisibility, "events_enqueued_for_serialization", nil).Submit(1.0) +} + +// EndpointPayloadRequests the number of requests sent to the endpoint, regardless of success, tagged by endpoint type +func EndpointPayloadRequests(endpointType EndpointType, requestCompressedType RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "endpoint_payload.requests", removeEmptyStrings([]string{ + string(endpointType), + string(requestCompressedType), + })).Submit(1.0) +} + +// EndpointPayloadRequestsErrors the number of requests sent to the endpoint that errored, tagget by the error type and endpoint type and status code +func EndpointPayloadRequestsErrors(endpointType EndpointType, errorType ErrorType) { + tags := []string{string(endpointType)} + tags = append(tags, errorType...) + telemetry.Count(telemetry.NamespaceCIVisibility, "endpoint_payload.requests_errors", removeEmptyStrings(tags)).Submit(1.0) +} + +// EndpointPayloadDropped the number of payloads dropped after all retries by CI Visibility +func EndpointPayloadDropped(endpointType EndpointType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "endpoint_payload.dropped", removeEmptyStrings([]string{ + string(endpointType), + })).Submit(1.0) +} + +// GitCommand the number of git commands executed by CI Visibility +func GitCommand(commandType CommandType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git.command", removeEmptyStrings([]string{ + string(commandType), + })).Submit(1.0) +} + +// GitCommandErrors the number of git command that errored by CI Visibility +func GitCommandErrors(commandType CommandType, exitCode CommandExitCodeType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git.command_errors", removeEmptyStrings([]string{ + string(commandType), + string(exitCode), + })).Submit(1.0) +} + +// GitRequestsSearchCommits the number of requests sent to the search commit endpoint, regardless of success. +func GitRequestsSearchCommits(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.search_commits", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// GitRequestsSearchCommitsErrors the number of requests sent to the search commit endpoint that errored, tagged by the error type. +func GitRequestsSearchCommitsErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.search_commits_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// GitRequestsObjectsPack the number of requests sent to the objects pack endpoint, tagged by the request compressed type. +func GitRequestsObjectsPack(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.objects_pack", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// GitRequestsObjectsPackErrors the number of requests sent to the objects pack endpoint that errored, tagged by the error type. +func GitRequestsObjectsPackErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.objects_pack_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// GitRequestsSettings the number of requests sent to the settings endpoint, tagged by the request compressed type. +func GitRequestsSettings(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.settings", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// GitRequestsSettingsErrors the number of requests sent to the settings endpoint that errored, tagged by the error type. +func GitRequestsSettingsErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.settings_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// GitRequestsSettingsResponse the number of settings responses received by CI Visibility, tagged by the settings response type. +func GitRequestsSettingsResponse(settingsResponseType SettingsResponseType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "git_requests.settings_response", removeEmptyStrings(settingsResponseType)).Submit(1.0) +} + +// ITRSkippableTestsRequest the number of requests sent to the ITR skippable tests endpoint, tagged by the request compressed type. +func ITRSkippableTestsRequest(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "itr_skippable_tests.request", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// ITRSkippableTestsRequestErrors the number of requests sent to the ITR skippable tests endpoint that errored, tagged by the error type. +func ITRSkippableTestsRequestErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "itr_skippable_tests.request_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// ITRSkippableTestsResponseTests the number of tests received in the ITR skippable tests response by CI Visibility. +func ITRSkippableTestsResponseTests(value float64) { + telemetry.Count(telemetry.NamespaceCIVisibility, "itr_skippable_tests.response_tests", nil).Submit(value) +} + +// ITRSkipped the number of ITR tests skipped by CI Visibility, tagged by the event type. +func ITRSkipped(eventType TestingEventType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "itr_skipped", removeEmptyStrings(eventType)).Submit(1.0) +} + +// ITRUnskippable the number of ITR tests unskippable by CI Visibility, tagged by the event type. +func ITRUnskippable(eventType TestingEventType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "itr_unskippable", removeEmptyStrings(eventType)).Submit(1.0) +} + +// ITRForcedRun the number of tests or test suites that would've been skipped by ITR but were forced to run because of their unskippable status by CI Visibility. +func ITRForcedRun(eventType TestingEventType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "itr_forced_run", removeEmptyStrings(eventType)).Submit(1.0) +} + +// CodeCoverageIsEmpty the number of code coverage payloads that are empty by CI Visibility. +func CodeCoverageIsEmpty() { + telemetry.Count(telemetry.NamespaceCIVisibility, "code_coverage.is_empty", nil).Submit(1.0) +} + +// CodeCoverageErrors the number of errors while processing code coverage by CI Visibility. +func CodeCoverageErrors() { + telemetry.Count(telemetry.NamespaceCIVisibility, "code_coverage.errors", nil).Submit(1.0) +} + +// KnownTestsRequest the number of requests sent to the known tests endpoint, tagged by the request compressed type. +func KnownTestsRequest(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "known_tests.request", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// KnownTestsRequestErrors the number of requests sent to the known tests endpoint that errored, tagged by the error type. +func KnownTestsRequestErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "known_tests.request_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// TestManagementTestsRequest the number of requests sent to the test management tests endpoint, tagged by the request compressed type. +func TestManagementTestsRequest(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "test_management_tests.request", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// TestManagementTestsRequestErrors the number of requests sent to the test management tests endpoint that errored, tagged by the error type. +func TestManagementTestsRequestErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "test_management_tests.request_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// ImpactedTestsRequest the number of requests sent to the impacted tests endpoint, tagged by the request compressed type. +func ImpactedTestsRequest(requestCompressed RequestCompressedType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "impacted_tests_detection.request", removeEmptyStrings([]string{ + string(requestCompressed), + })).Submit(1.0) +} + +// ImpactedTestsRequestErrors the number of requests sent to the impacted tests endpoint that errored, tagged by the error type. +func ImpactedTestsRequestErrors(errorType ErrorType) { + telemetry.Count(telemetry.NamespaceCIVisibility, "impacted_tests_detection.request_errors", removeEmptyStrings(errorType)).Submit(1.0) +} + +// ImpactedTestsModified the number of impacted tests that were modified by CI Visibility. +func ImpactedTestsModified() { + telemetry.Count(telemetry.NamespaceCIVisibility, "impacted_tests_detection.is_modified", nil).Submit(1.0) +} diff --git a/internal/civisibility/utils/telemetry/telemetry_distribution.go b/internal/civisibility/utils/telemetry/telemetry_distribution.go new file mode 100644 index 0000000000..3d043d319c --- /dev/null +++ b/internal/civisibility/utils/telemetry/telemetry_distribution.go @@ -0,0 +1,138 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package telemetry + +import "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + +// EndpointPayloadBytes records the size in bytes of the serialized payload by CI Visibility. +func EndpointPayloadBytes(endpointType EndpointType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "endpoint_payload.bytes", removeEmptyStrings([]string{ + string(endpointType), + })).Submit(value) +} + +// EndpointPayloadRequestsMs records the time it takes to send the payload sent to the endpoint in ms by CI Visibility. +func EndpointPayloadRequestsMs(endpointType EndpointType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "endpoint_payload.requests_ms", removeEmptyStrings([]string{ + string(endpointType), + })).Submit(value) +} + +// EndpointPayloadEventsCount records the number of events in the payload sent to the endpoint by CI Visibility. +func EndpointPayloadEventsCount(endpointType EndpointType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "endpoint_payload.events_count", removeEmptyStrings([]string{ + string(endpointType), + })).Submit(value) +} + +// EndpointEventsSerializationMs records the time it takes to serialize the events in the payload sent to the endpoint in ms by CI Visibility. +func EndpointEventsSerializationMs(endpointType EndpointType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "endpoint_payload.events_serialization_ms", removeEmptyStrings([]string{ + string(endpointType), + })).Submit(value) +} + +// GitCommandMs records the time it takes to execute a git command in ms by CI Visibility. +func GitCommandMs(commandType CommandType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "git.command_ms", removeEmptyStrings([]string{ + (string)(commandType), + })).Submit(value) +} + +// GitRequestsSearchCommitsMs records the time it takes to get the response of the search commit quest in ms by CI Visibility. +func GitRequestsSearchCommitsMs(responseCompressedType ResponseCompressedType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "git_requests.search_commits_ms", removeEmptyStrings([]string{ + (string)(responseCompressedType), + })).Submit(value) +} + +// GitRequestsObjectsPackMs records the time it takes to get the response of the objects pack request in ms by CI Visibility. +func GitRequestsObjectsPackMs(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "git_requests.objects_pack_ms", nil).Submit(value) +} + +// GitRequestsObjectsPackBytes records the sum of the sizes of the object pack files inside a single payload by CI Visibility +func GitRequestsObjectsPackBytes(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "git_requests.objects_pack_bytes", nil).Submit(value) +} + +// GitRequestsObjectsPackFiles records the number of files sent in the object pack payload by CI Visibility. +func GitRequestsObjectsPackFiles(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "git_requests.objects_pack_files", nil).Submit(value) +} + +// GitRequestsSettingsMs records the time it takes to get the response of the settings endpoint request in ms by CI Visibility. +func GitRequestsSettingsMs(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "git_requests.settings_ms", nil).Submit(value) +} + +// ITRSkippableTestsRequestMs records the time it takes to get the response of the itr skippable tests endpoint request in ms by CI Visibility. +func ITRSkippableTestsRequestMs(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "itr_skippable_tests.request_ms", nil).Submit(value) +} + +// ITRSkippableTestsResponseBytes records the number of bytes received by the endpoint. Tagged with a boolean flag set t if response body is compressed. +func ITRSkippableTestsResponseBytes(responseCompressedType ResponseCompressedType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "itr_skippable_tests.response_bytes", removeEmptyStrings([]string{ + (string)(responseCompressedType), + })).Submit(value) +} + +// CodeCoverageFiles records the number of files in the code coverage report by CI Visibility. +func CodeCoverageFiles(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "code_coverage.files", nil).Submit(value) +} + +// KnownTestsRequestMs records the time it takes to get the response of the known tests endpoint request in ms by CI Visibility. +func KnownTestsRequestMs(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "known_tests.request_ms", nil).Submit(value) +} + +// KnownTestsResponseBytes records the number of bytes received by the endpoint. Tagged with a boolean flag set to true if response body is compressed. +func KnownTestsResponseBytes(responseCompressedType ResponseCompressedType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "known_tests.response_bytes", removeEmptyStrings([]string{ + string(responseCompressedType), + })).Submit(value) +} + +// KnownTestsResponseTests records the number of tests in the response of the known tests endpoint by CI Visibility. +func KnownTestsResponseTests(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "known_tests.response_tests", nil).Submit(value) +} + +// TestManagementTestsRequestMs records the time it takes to get the response of the test management tests endpoint request in ms by CI Visibility. +func TestManagementTestsRequestMs(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "test_management_tests.request_ms", nil).Submit(value) +} + +// TestManagementTestsResponseBytes records the number of bytes received by the endpoint. Tagged with a boolean flag set to true if response body is compressed. +func TestManagementTestsResponseBytes(responseCompressedType ResponseCompressedType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "test_management_tests.response_bytes", removeEmptyStrings([]string{ + string(responseCompressedType), + })).Submit(value) +} + +// TestManagementTestsResponseTests records the number of tests in the response of the test management tests endpoint by CI Visibility. +func TestManagementTestsResponseTests(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "test_management_tests.response_tests", nil).Submit(value) +} + +// ImpactedTestsRequestMs records the time it takes to get the response of the impacted tests endpoint request in ms by CI Visibility. +func ImpactedTestsRequestMs(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "impacted_tests_detection.request_ms", nil).Submit(value) +} + +// ImpactedTestsResponseBytes records the number of bytes received by the endpoint. Tagged with a boolean flag set to true if response body is compressed. +func ImpactedTestsResponseBytes(responseCompressedType ResponseCompressedType, value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "impacted_tests_detection.response_bytes", removeEmptyStrings([]string{ + string(responseCompressedType), + })).Submit(value) +} + +// ImpactedTestsResponseFiles records the number of files in the response of the impacted tests endpoint by CI Visibility. +func ImpactedTestsResponseFiles(value float64) { + telemetry.Distribution(telemetry.NamespaceCIVisibility, "impacted_tests_detection.response_files", nil).Submit(value) +} diff --git a/internal/civisibility/utils/telemetry/telemetry_test.go b/internal/civisibility/utils/telemetry/telemetry_test.go new file mode 100644 index 0000000000..aaad09e9ed --- /dev/null +++ b/internal/civisibility/utils/telemetry/telemetry_test.go @@ -0,0 +1,69 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "reflect" + "testing" +) + +func TestRemoveEmptyStrings(t *testing.T) { + tests := []struct { + name string + input []string + want []string + }{ + { + name: "All non-empty strings", + input: []string{"hello", "world"}, + want: []string{"hello", "world"}, + }, + { + name: "All empty strings", + input: []string{"", "", ""}, + want: []string{}, + }, + { + name: "Mixed empty and non-empty strings", + input: []string{"one", "", "two", "", "three"}, + want: []string{"one", "two", "three"}, + }, + { + name: "Empty slice", + input: []string{}, + want: []string{}, + }, + { + name: "Empty string at the beginning", + input: []string{"", "start", "end"}, + want: []string{"start", "end"}, + }, + { + name: "Empty string at the end", + input: []string{"start", "end", ""}, + want: []string{"start", "end"}, + }, + { + name: "Multiple consecutive empty strings", + input: []string{"start", "", "", "end", ""}, + want: []string{"start", "end"}, + }, + { + name: "Strings with spaces (not considered empty)", + input: []string{" ", "text", "", " "}, + want: []string{" ", "text", " "}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := removeEmptyStrings(tc.input) + if !reflect.DeepEqual(got, tc.want) { + t.Errorf("removeEmptyStrings(%v) = %v; expected %v", tc.input, got, tc.want) + } + }) + } +} diff --git a/internal/civisibility/utils/testdata/fixtures/providers/appveyor.json b/internal/civisibility/utils/testdata/fixtures/providers/appveyor.json index def208d711..a74c9abd4b 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/appveyor.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/appveyor.json @@ -346,7 +346,9 @@ "APPVEYOR_BUILD_FOLDER": "/foo/bar", "APPVEYOR_BUILD_ID": "appveyor-build-id", "APPVEYOR_BUILD_NUMBER": "appveyor-pipeline-number", + "APPVEYOR_PULL_REQUEST_HEAD_COMMIT": "724faca55efebf66fc15bfccc34577c64c5480bd", "APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH": "origin/pr", + "APPVEYOR_PULL_REQUEST_NUMBER": 42, "APPVEYOR_REPO_BRANCH": "origin/master", "APPVEYOR_REPO_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "APPVEYOR_REPO_COMMIT_AUTHOR": "appveyor-commit-author-name", @@ -367,9 +369,12 @@ "git.branch": "pr", "git.commit.author.email": "appveyor-commit-author-email@datadoghq.com", "git.commit.author.name": "appveyor-commit-author-name", + "git.commit.head.sha": "724faca55efebf66fc15bfccc34577c64c5480bd", "git.commit.message": "appveyor-commit-message\nappveyor-commit-message-extended", "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", - "git.repository_url": "https://github.com/appveyor-repo-name.git" + "git.pull_request.base_branch": "master", + "git.repository_url": "https://github.com/appveyor-repo-name.git", + "pr.number": "42" } ], [ @@ -378,6 +383,7 @@ "APPVEYOR_BUILD_FOLDER": "/foo/bar", "APPVEYOR_BUILD_ID": "appveyor-build-id", "APPVEYOR_BUILD_NUMBER": "appveyor-pipeline-number", + "APPVEYOR_PULL_REQUEST_HEAD_COMMIT": "724faca55efebf66fc15bfccc34577c64c5480bd", "APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH": "refs/heads/pr", "APPVEYOR_REPO_BRANCH": "refs/heads/master", "APPVEYOR_REPO_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", @@ -399,8 +405,10 @@ "git.branch": "pr", "git.commit.author.email": "appveyor-commit-author-email@datadoghq.com", "git.commit.author.name": "appveyor-commit-author-name", + "git.commit.head.sha": "724faca55efebf66fc15bfccc34577c64c5480bd", "git.commit.message": "appveyor-commit-message\nappveyor-commit-message-extended", "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "master", "git.repository_url": "https://github.com/appveyor-repo-name.git" } ], diff --git a/internal/civisibility/utils/testdata/fixtures/providers/awscodepipeline.json b/internal/civisibility/utils/testdata/fixtures/providers/awscodepipeline.json index 6f3071331f..7590f89bf0 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/awscodepipeline.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/awscodepipeline.json @@ -18,6 +18,7 @@ }, { "_dd.ci.env_vars": "{\"CODEBUILD_BUILD_ARN\":\"arn:aws:codebuild:eu-north-1:12345678:build/codebuild-demo-project:b1e6661e-e4f2-4156-9ab9-82a19\",\"DD_PIPELINE_EXECUTION_ID\":\"bb1f15ed-fde2-494d-8e13-88785bca9cc0\",\"DD_ACTION_EXECUTION_ID\":\"35519dc3-7c45-493c-9ba6-cd78ea11f69d\"}", + "ci.job.id": "35519dc3-7c45-493c-9ba6-cd78ea11f69d", "ci.pipeline.id": "bb1f15ed-fde2-494d-8e13-88785bca9cc0", "ci.provider.name": "awscodepipeline", "git.branch": "user-supplied-branch", diff --git a/internal/civisibility/utils/testdata/fixtures/providers/azurepipelines.json b/internal/civisibility/utils/testdata/fixtures/providers/azurepipelines.json index d072c2731c..3a3997b7f6 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/azurepipelines.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/azurepipelines.json @@ -18,6 +18,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -53,6 +54,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -87,6 +89,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -123,6 +126,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -159,6 +163,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -195,6 +200,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -231,6 +237,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -267,6 +274,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -301,6 +309,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -335,6 +344,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -369,6 +379,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -403,6 +414,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -437,6 +449,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -473,6 +486,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -510,6 +524,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -548,6 +563,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.name": "azure-pipelines-job-name", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", @@ -589,6 +605,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -632,6 +649,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -667,6 +685,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -696,6 +715,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -724,6 +744,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -752,6 +773,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -780,6 +802,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -808,6 +831,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -836,6 +860,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -864,6 +889,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -892,6 +918,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -920,6 +947,7 @@ }, { "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", "ci.pipeline.id": "azure-pipelines-build-id", "ci.pipeline.name": "azure-pipelines-name", @@ -931,5 +959,36 @@ "git.commit.message": "azure-pipelines-commit-message", "git.repository_url": "ssh://1.1.1.1:54321/path/to/repo.git/" } + ], + [ + { + "BUILD_BUILDID": "azure-pipelines-build-id", + "BUILD_DEFINITIONNAME": "azure-pipelines-name", + "BUILD_REQUESTEDFOREMAIL": "azure-pipelines-commit-author-email@datadoghq.com", + "BUILD_REQUESTEDFORID": "azure-pipelines-commit-author", + "BUILD_SOURCEVERSIONMESSAGE": "azure-pipelines-commit-message", + "SYSTEM_JOBID": "azure-pipelines-job-id", + "SYSTEM_PULLREQUEST_PULLREQUESTNUMBER": 42, + "SYSTEM_PULLREQUEST_TARGETBRANCH": "refs/heads/target-branch", + "SYSTEM_TASKINSTANCEID": "azure-pipelines-task-id", + "SYSTEM_TEAMFOUNDATIONSERVERURI": "https://azure-pipelines-server-uri.com/", + "SYSTEM_TEAMPROJECTID": "azure-pipelines-project-id", + "TF_BUILD": "True" + }, + { + "_dd.ci.env_vars": "{\"SYSTEM_TEAMPROJECTID\":\"azure-pipelines-project-id\",\"BUILD_BUILDID\":\"azure-pipelines-build-id\",\"SYSTEM_JOBID\":\"azure-pipelines-job-id\"}", + "ci.job.id": "azure-pipelines-job-id", + "ci.job.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id&view=logs&j=azure-pipelines-job-id&t=azure-pipelines-task-id", + "ci.pipeline.id": "azure-pipelines-build-id", + "ci.pipeline.name": "azure-pipelines-name", + "ci.pipeline.number": "azure-pipelines-build-id", + "ci.pipeline.url": "https://azure-pipelines-server-uri.com/azure-pipelines-project-id/_build/results?buildId=azure-pipelines-build-id", + "ci.provider.name": "azurepipelines", + "git.commit.author.email": "azure-pipelines-commit-author-email@datadoghq.com", + "git.commit.author.name": "azure-pipelines-commit-author", + "git.commit.message": "azure-pipelines-commit-message", + "git.pull_request.base_branch": "target-branch", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/bitbucket.json b/internal/civisibility/utils/testdata/fixtures/providers/bitbucket.json index bbd8cd37ea..df50f46fc3 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/bitbucket.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/bitbucket.json @@ -591,5 +591,28 @@ "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "git.repository_url": "ssh://host.xz:54321/path/to/repo.git/" } + ], + [ + { + "BITBUCKET_BUILD_NUMBER": "bitbucket-build-num", + "BITBUCKET_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "BITBUCKET_GIT_HTTP_ORIGIN": "https://bitbucket-repo-url.com/repo.git", + "BITBUCKET_PIPELINE_UUID": "{bitbucket-uuid}", + "BITBUCKET_PR_DESTINATION_BRANCH": "target-branch", + "BITBUCKET_PR_ID": 42, + "BITBUCKET_REPO_FULL_NAME": "bitbucket-repo" + }, + { + "ci.job.url": "https://bitbucket.org/bitbucket-repo/addon/pipelines/home#!/results/bitbucket-build-num", + "ci.pipeline.id": "bitbucket-uuid", + "ci.pipeline.name": "bitbucket-repo", + "ci.pipeline.number": "bitbucket-build-num", + "ci.pipeline.url": "https://bitbucket.org/bitbucket-repo/addon/pipelines/home#!/results/bitbucket-build-num", + "ci.provider.name": "bitbucket", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "git.repository_url": "https://bitbucket-repo-url.com/repo.git", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/bitrise.json b/internal/civisibility/utils/testdata/fixtures/providers/bitrise.json index 579ace5d2c..0a8c95fc1e 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/bitrise.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/bitrise.json @@ -690,5 +690,28 @@ "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "git.repository_url": "ssh://host.xz:54321/path/to/repo.git/" } + ], + [ + { + "BITRISEIO_GIT_BRANCH_DEST": "target-branch", + "BITRISE_BUILD_NUMBER": "bitrise-pipeline-number", + "BITRISE_BUILD_SLUG": "bitrise-pipeline-id", + "BITRISE_BUILD_URL": "https://bitrise-build-url.com//", + "BITRISE_GIT_MESSAGE": "bitrise-git-commit-message", + "BITRISE_PULL_REQUEST": 42, + "BITRISE_TRIGGERED_WORKFLOW_ID": "bitrise-pipeline-name", + "GIT_CLONE_COMMIT_HASH": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123" + }, + { + "ci.pipeline.id": "bitrise-pipeline-id", + "ci.pipeline.name": "bitrise-pipeline-name", + "ci.pipeline.number": "bitrise-pipeline-number", + "ci.pipeline.url": "https://bitrise-build-url.com//", + "ci.provider.name": "bitrise", + "git.commit.message": "bitrise-git-commit-message", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/buddy.json b/internal/civisibility/utils/testdata/fixtures/providers/buddy.json index 9c64a199d1..ef3e14fa25 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/buddy.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/buddy.json @@ -479,5 +479,39 @@ "git.repository_url": "ssh://host.xz:54321/path/to/repo.git/", "git.tag": "v1.0" } + ], + [ + { + "BUDDY": "true", + "BUDDY_EXECUTION_BRANCH": "master", + "BUDDY_EXECUTION_ID": "buddy-execution-id", + "BUDDY_EXECUTION_REVISION": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "BUDDY_EXECUTION_REVISION_COMMITTER_EMAIL": "mikebenson@buddy.works", + "BUDDY_EXECUTION_REVISION_COMMITTER_NAME": "Mike Benson", + "BUDDY_EXECUTION_REVISION_MESSAGE": "Create buddy.yml", + "BUDDY_EXECUTION_TAG": "v1.0", + "BUDDY_EXECUTION_URL": "https://app.buddy.works/myworkspace/my-project/pipelines/pipeline/456/execution/5d9dc42c422f5a268b389d08", + "BUDDY_PIPELINE_ID": "456", + "BUDDY_PIPELINE_NAME": "Deploy to Production", + "BUDDY_RUN_PR_BASE_BRANCH": "target-branch", + "BUDDY_RUN_PR_NO": 42, + "BUDDY_SCM_URL": "https://github.com/buddyworks/my-project.git" + }, + { + "ci.pipeline.id": "456/buddy-execution-id", + "ci.pipeline.name": "Deploy to Production", + "ci.pipeline.number": "buddy-execution-id", + "ci.pipeline.url": "https://app.buddy.works/myworkspace/my-project/pipelines/pipeline/456/execution/5d9dc42c422f5a268b389d08", + "ci.provider.name": "buddy", + "git.branch": "master", + "git.commit.committer.email": "mikebenson@buddy.works", + "git.commit.committer.name": "Mike Benson", + "git.commit.message": "Create buddy.yml", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "git.repository_url": "https://github.com/buddyworks/my-project.git", + "git.tag": "v1.0", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/buildkite.json b/internal/civisibility/utils/testdata/fixtures/providers/buildkite.json index 86ff170deb..8013574b20 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/buildkite.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/buildkite.json @@ -13,11 +13,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -47,11 +50,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -81,11 +87,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -115,11 +124,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -149,6 +161,8 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "", "HOME": "/not-my-home", @@ -156,6 +170,7 @@ }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -185,6 +200,8 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "", "HOME": "/not-my-home", @@ -192,6 +209,7 @@ }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -221,6 +239,8 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "", "HOME": "/not-my-home", @@ -228,6 +248,7 @@ }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -257,11 +278,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://user@hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -291,11 +315,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://user%E2%82%AC@hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -325,11 +352,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://user:pwd@hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -359,11 +389,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "git@hostname.com:org/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -393,11 +426,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -427,11 +463,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -461,11 +500,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -495,11 +537,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "0.1.0" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -529,11 +574,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "origin/tags/0.1.0" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -563,11 +611,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "http://hostname.com/repo.git", "BUILDKITE_TAG": "refs/heads/tags/0.1.0" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -596,6 +647,8 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_TAG": "", "DD_GIT_BRANCH": "user-supplied-branch", "DD_GIT_COMMIT_AUTHOR_DATE": "usersupplied-authordate", @@ -610,6 +663,7 @@ }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -641,6 +695,8 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_TAG": "", "DD_GIT_COMMIT_AUTHOR_DATE": "usersupplied-authordate", "DD_GIT_COMMIT_AUTHOR_EMAIL": "usersupplied-authoremail", @@ -655,6 +711,7 @@ }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -686,12 +743,15 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://github.com/DataDog/dogweb", "BUILDKITE_TAG": "", "DD_TEST_CASE_NAME": "http-repository-url-no-git-suffix" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -718,12 +778,15 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "ssh://host.xz:54321/path/to/repo/", "BUILDKITE_TAG": "", "DD_TEST_CASE_NAME": "ssh-repository-url-no-git-suffix" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -750,11 +813,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://user:password@github.com/DataDog/dogweb.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -781,11 +847,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://user@github.com/DataDog/dogweb.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -812,11 +881,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://user:password@github.com:1234/DataDog/dogweb.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -843,11 +915,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://user:password@1.1.1.1/DataDog/dogweb.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -874,11 +949,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://user:password@1.1.1.1:1234/DataDog/dogweb.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -905,11 +983,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "https://user:password@1.1.1.1:1234/DataDog/dogweb_with_@_yeah.git", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -936,11 +1017,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "ssh://user@host.xz:54321/path/to/repo.git/", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -967,11 +1051,14 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_REPO": "ssh://user:password@host.xz:54321/path/to/repo.git/", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.pipeline.id": "buildkite-pipeline-id", "ci.pipeline.name": "buildkite-pipeline-name", @@ -1001,10 +1088,13 @@ "BUILDKITE_JOB_ID": "buildkite-job-id", "BUILDKITE_MESSAGE": "buildkite-git-commit-message", "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": "false", + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "", "BUILDKITE_TAG": "" }, { "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", "ci.node.labels": "[\"mytag:my-value\",\"myothertag:my-other-value\"]", "ci.node.name": "1a222222-e999-3636-8ddd-802222222222", @@ -1018,5 +1108,39 @@ "git.commit.message": "buildkite-git-commit-message", "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123" } + ], + [ + { + "BUILDKITE": "true", + "BUILDKITE_BRANCH": "", + "BUILDKITE_BUILD_AUTHOR": "buildkite-git-commit-author-name", + "BUILDKITE_BUILD_AUTHOR_EMAIL": "buildkite-git-commit-author-email@datadoghq.com", + "BUILDKITE_BUILD_ID": "buildkite-pipeline-id", + "BUILDKITE_BUILD_NUMBER": "buildkite-pipeline-number", + "BUILDKITE_BUILD_URL": "https://buildkite-build-url.com/", + "BUILDKITE_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "BUILDKITE_JOB_ID": "buildkite-job-id", + "BUILDKITE_MESSAGE": "buildkite-git-commit-message", + "BUILDKITE_PIPELINE_SLUG": "buildkite-pipeline-name", + "BUILDKITE_PULL_REQUEST": 42, + "BUILDKITE_PULL_REQUEST_BASE_BRANCH": "master", + "BUILDKITE_TAG": "" + }, + { + "_dd.ci.env_vars": "{\"BUILDKITE_BUILD_ID\":\"buildkite-pipeline-id\",\"BUILDKITE_JOB_ID\":\"buildkite-job-id\"}", + "ci.job.id": "buildkite-job-id", + "ci.job.url": "https://buildkite-build-url.com/#buildkite-job-id", + "ci.pipeline.id": "buildkite-pipeline-id", + "ci.pipeline.name": "buildkite-pipeline-name", + "ci.pipeline.number": "buildkite-pipeline-number", + "ci.pipeline.url": "https://buildkite-build-url.com/", + "ci.provider.name": "buildkite", + "git.commit.author.email": "buildkite-git-commit-author-email@datadoghq.com", + "git.commit.author.name": "buildkite-git-commit-author-name", + "git.commit.message": "buildkite-git-commit-message", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "master", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/circleci.json b/internal/civisibility/utils/testdata/fixtures/providers/circleci.json index 2a697af349..c1028e4bc6 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/circleci.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/circleci.json @@ -14,6 +14,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -41,6 +42,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -68,6 +70,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -95,6 +98,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -124,6 +128,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -153,6 +158,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -182,6 +188,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -209,6 +216,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -236,6 +244,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -264,6 +273,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -292,6 +302,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -319,6 +330,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -346,6 +358,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -373,6 +386,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -400,6 +414,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -427,6 +442,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -461,6 +477,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -501,6 +518,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -533,6 +551,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -557,6 +576,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -580,6 +600,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -603,6 +624,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -626,6 +648,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -649,6 +672,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -672,6 +696,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -695,6 +720,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -718,6 +744,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -741,6 +768,7 @@ }, { "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", "ci.job.name": "circleci-job-name", "ci.job.url": "https://circleci-build-url.com/", "ci.pipeline.id": "circleci-pipeline-id", @@ -750,5 +778,29 @@ "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "git.repository_url": "ssh://host.xz:54321/path/to/repo.git/" } + ], + [ + { + "CIRCLECI": "circleCI", + "CIRCLE_BUILD_NUM": "circleci-pipeline-number", + "CIRCLE_BUILD_URL": "https://circleci-build-url.com/", + "CIRCLE_JOB": "circleci-job-name", + "CIRCLE_PROJECT_REPONAME": "circleci-pipeline-name", + "CIRCLE_PR_NUMBER": 42, + "CIRCLE_SHA1": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "CIRCLE_WORKFLOW_ID": "circleci-pipeline-id" + }, + { + "_dd.ci.env_vars": "{\"CIRCLE_WORKFLOW_ID\":\"circleci-pipeline-id\",\"CIRCLE_BUILD_NUM\":\"circleci-pipeline-number\"}", + "ci.job.id": "circleci-pipeline-number", + "ci.job.name": "circleci-job-name", + "ci.job.url": "https://circleci-build-url.com/", + "ci.pipeline.id": "circleci-pipeline-id", + "ci.pipeline.name": "circleci-pipeline-name", + "ci.pipeline.url": "https://app.circleci.com/pipelines/workflows/circleci-pipeline-id", + "ci.provider.name": "circleci", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/codefresh.json b/internal/civisibility/utils/testdata/fixtures/providers/codefresh.json index d719df1059..363f037e88 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/codefresh.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/codefresh.json @@ -158,5 +158,25 @@ "git.repository_url": "git@github.com:DataDog/userrepo.git", "git.tag": "0.0.2" } + ], + [ + { + "CF_BUILD_ID": "6410367cee516146a4c4c66e", + "CF_BUILD_URL": "https://g.codefresh.io/build/6410367cee516146a4c4c66e", + "CF_PIPELINE_NAME": "My simple project/Example Java Project Pipeline", + "CF_PULL_REQUEST_NUMBER": 42, + "CF_PULL_REQUEST_TARGET": "target-branch", + "CF_STEP_NAME": "mah-job-name" + }, + { + "_dd.ci.env_vars": "{\"CF_BUILD_ID\":\"6410367cee516146a4c4c66e\"}", + "ci.job.name": "mah-job-name", + "ci.pipeline.id": "6410367cee516146a4c4c66e", + "ci.pipeline.name": "My simple project/Example Java Project Pipeline", + "ci.pipeline.url": "https://g.codefresh.io/build/6410367cee516146a4c4c66e", + "ci.provider.name": "codefresh", + "git.pull_request.base_branch": "target-branch", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/drone.json b/internal/civisibility/utils/testdata/fixtures/providers/drone.json new file mode 100644 index 0000000000..548bfdde77 --- /dev/null +++ b/internal/civisibility/utils/testdata/fixtures/providers/drone.json @@ -0,0 +1,72 @@ +[ + [ + { + "CI": "true", + "DRONE": "true", + "DRONE_BRANCH": "master", + "DRONE_BUILD_LINK": "https://drone.company.com/octocat/hello-world/42", + "DRONE_BUILD_NUMBER": "build-number", + "DRONE_COMMIT_AUTHOR_EMAIL": "octocat@github.com", + "DRONE_COMMIT_AUTHOR_NAME": "The Octocat", + "DRONE_COMMIT_MESSAGE": "Updated README.md", + "DRONE_COMMIT_SHA": "bcdd4bf0245c82c060407b3b24b9b87301d15ac1", + "DRONE_GIT_HTTP_URL": "https://github.com/octocat/hello-world.git", + "DRONE_STAGE_NAME": "build", + "DRONE_STEP_NAME": "build_backend", + "DRONE_TAG": "v1.0.0", + "DRONE_WORKSPACE": "/foo/bar/jenkins/hello-world-job" + }, + { + "ci.job.name": "build_backend", + "ci.pipeline.number": "build-number", + "ci.pipeline.url": "https://drone.company.com/octocat/hello-world/42", + "ci.provider.name": "drone", + "ci.stage.name": "build", + "ci.workspace_path": "/foo/bar/jenkins/hello-world-job", + "git.branch": "master", + "git.commit.author.email": "octocat@github.com", + "git.commit.author.name": "The Octocat", + "git.commit.message": "Updated README.md", + "git.commit.sha": "bcdd4bf0245c82c060407b3b24b9b87301d15ac1", + "git.repository_url": "https://github.com/octocat/hello-world.git", + "git.tag": "v1.0.0" + } + ], + [ + { + "CI": "true", + "DRONE": "true", + "DRONE_BRANCH": "master", + "DRONE_BUILD_LINK": "https://drone.company.com/octocat/hello-world/42", + "DRONE_BUILD_NUMBER": "build-number", + "DRONE_COMMIT_AUTHOR_EMAIL": "octocat@github.com", + "DRONE_COMMIT_AUTHOR_NAME": "The Octocat", + "DRONE_COMMIT_MESSAGE": "Updated README.md", + "DRONE_COMMIT_SHA": "bcdd4bf0245c82c060407b3b24b9b87301d15ac1", + "DRONE_GIT_HTTP_URL": "https://github.com/octocat/hello-world.git", + "DRONE_PULL_REQUEST": 42, + "DRONE_STAGE_NAME": "build", + "DRONE_STEP_NAME": "build_backend", + "DRONE_TAG": "v1.0.0", + "DRONE_TARGET_BRANCH": "target-branch", + "DRONE_WORKSPACE": "/foo/bar/jenkins/hello-world-job" + }, + { + "ci.job.name": "build_backend", + "ci.pipeline.number": "build-number", + "ci.pipeline.url": "https://drone.company.com/octocat/hello-world/42", + "ci.provider.name": "drone", + "ci.stage.name": "build", + "ci.workspace_path": "/foo/bar/jenkins/hello-world-job", + "git.branch": "master", + "git.commit.author.email": "octocat@github.com", + "git.commit.author.name": "The Octocat", + "git.commit.message": "Updated README.md", + "git.commit.sha": "bcdd4bf0245c82c060407b3b24b9b87301d15ac1", + "git.pull_request.base_branch": "target-branch", + "git.repository_url": "https://github.com/octocat/hello-world.git", + "git.tag": "v1.0.0", + "pr.number": "42" + } + ] +] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/github.json b/internal/civisibility/utils/testdata/fixtures/providers/github.json index 3dd5ac62d5..2695a190a7 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/github.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/github.json @@ -15,6 +15,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://ghenterprise.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://ghenterprise.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -44,6 +45,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -73,6 +75,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -102,6 +105,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -131,6 +135,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -162,6 +167,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -193,6 +199,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -224,6 +231,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -253,6 +261,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -282,6 +291,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -311,6 +321,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -340,6 +351,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -369,6 +381,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -399,6 +412,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -429,6 +443,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -459,6 +474,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -497,6 +513,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -542,6 +559,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -575,6 +593,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -600,6 +619,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -625,6 +645,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -650,6 +671,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com:1234/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://github.com:1234/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -675,6 +697,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://1.1.1.1/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://1.1.1.1/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -700,6 +723,7 @@ }, { "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://1.1.1.1:1234/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", "ci.job.name": "github-job-name", "ci.job.url": "https://1.1.1.1:1234/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", "ci.pipeline.id": "ghactions-pipeline-id", @@ -710,5 +734,33 @@ "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "git.repository_url": "https://1.1.1.1:1234/ghactions-repo.git" } + ], + [ + { + "GITHUB_ACTION": "run", + "GITHUB_BASE_REF": "target-branch", + "GITHUB_JOB": "github-job-name", + "GITHUB_REPOSITORY": "ghactions-repo", + "GITHUB_RUN_ATTEMPT": "ghactions-run-attempt", + "GITHUB_RUN_ID": "ghactions-pipeline-id", + "GITHUB_RUN_NUMBER": "ghactions-pipeline-number", + "GITHUB_SERVER_URL": "https://github.com/", + "GITHUB_SHA": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "GITHUB_WORKFLOW": "ghactions-pipeline-name" + }, + { + "_dd.ci.env_vars": "{\"GITHUB_SERVER_URL\":\"https://github.com/",\"GITHUB_REPOSITORY\":\"ghactions-repo\",\"GITHUB_RUN_ID\":\"ghactions-pipeline-id\",\"GITHUB_RUN_ATTEMPT\":\"ghactions-run-attempt\"}", + "ci.job.id": "github-job-name", + "ci.job.name": "github-job-name", + "ci.job.url": "https://github.com/ghactions-repo/commit/b9f0fb3fdbb94c9d24b2c75b49663122a529e123/checks", + "ci.pipeline.id": "ghactions-pipeline-id", + "ci.pipeline.name": "ghactions-pipeline-name", + "ci.pipeline.number": "ghactions-pipeline-number", + "ci.pipeline.url": "https://github.com/ghactions-repo/actions/runs/ghactions-pipeline-id/attempts/ghactions-run-attempt", + "ci.provider.name": "github", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "git.repository_url": "https://github.com/ghactions-repo.git" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/gitlab.json b/internal/civisibility/utils/testdata/fixtures/providers/gitlab.json index 24882c1e85..fb0b9cb8c5 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/gitlab.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/gitlab.json @@ -21,6 +21,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -61,6 +62,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -101,6 +103,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -143,6 +146,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -185,6 +189,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -227,6 +232,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -267,6 +273,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -307,6 +314,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -348,6 +356,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -390,6 +399,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -432,6 +442,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -474,6 +485,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -515,6 +527,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -555,6 +568,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -595,6 +609,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -635,6 +650,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -675,6 +691,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -715,6 +732,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -755,6 +773,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -795,6 +814,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -835,6 +855,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -875,6 +896,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -925,6 +947,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -978,6 +1001,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.pipeline.id": "gitlab-pipeline-id", @@ -1024,6 +1048,7 @@ }, { "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", "ci.job.name": "gitlab-job-name", "ci.job.url": "https://gitlab.com/job", "ci.node.labels": "[\"arch:arm64\",\"linux\"]", @@ -1043,5 +1068,50 @@ "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "git.repository_url": "https://gitlab.com/repo/myrepo.git" } + ], + [ + { + "CI_COMMIT_AUTHOR": "John Doe ", + "CI_COMMIT_MESSAGE": "gitlab-git-commit-message", + "CI_COMMIT_REF_NAME": "origin/master", + "CI_COMMIT_SHA": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "CI_COMMIT_TIMESTAMP": "2021-07-21T11:43:07-04:00", + "CI_JOB_ID": "gitlab-job-id", + "CI_JOB_NAME": "gitlab-job-name", + "CI_JOB_STAGE": "gitlab-stage-name", + "CI_JOB_URL": "https://gitlab.com/job", + "CI_MERGE_REQUEST_IID": 42, + "CI_MERGE_REQUEST_TARGET_BRANCH_NAME": "target-branch", + "CI_PIPELINE_ID": "gitlab-pipeline-id", + "CI_PIPELINE_IID": "gitlab-pipeline-number", + "CI_PIPELINE_URL": "https://foo/repo/-/pipelines/1234", + "CI_PROJECT_DIR": "/foo/bar", + "CI_PROJECT_PATH": "gitlab-pipeline-name", + "CI_PROJECT_URL": "https://gitlab.com/repo", + "CI_REPOSITORY_URL": "https://gitlab.com/repo/myrepo.git", + "GITLAB_CI": "gitlab" + }, + { + "_dd.ci.env_vars": "{\"CI_PROJECT_URL\":\"https://gitlab.com/repo/",\"CI_PIPELINE_ID\":\"gitlab-pipeline-id\",\"CI_JOB_ID\":\"gitlab-job-id\"}", + "ci.job.id": "gitlab-job-id", + "ci.job.name": "gitlab-job-name", + "ci.job.url": "https://gitlab.com/job", + "ci.pipeline.id": "gitlab-pipeline-id", + "ci.pipeline.name": "gitlab-pipeline-name", + "ci.pipeline.number": "gitlab-pipeline-number", + "ci.pipeline.url": "https://foo/repo/-/pipelines/1234", + "ci.provider.name": "gitlab", + "ci.stage.name": "gitlab-stage-name", + "ci.workspace_path": "/foo/bar", + "git.branch": "master", + "git.commit.author.date": "2021-07-21T11:43:07-04:00", + "git.commit.author.email": "john@doe.com", + "git.commit.author.name": "John Doe", + "git.commit.message": "gitlab-git-commit-message", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "git.repository_url": "https://gitlab.com/repo/myrepo.git", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/jenkins.json b/internal/civisibility/utils/testdata/fixtures/providers/jenkins.json index 38d448747b..722a1a90d0 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/jenkins.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/jenkins.json @@ -900,5 +900,28 @@ "ci.provider.name": "jenkins", "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123" } + ], + [ + { + "BUILD_NUMBER": "jenkins-pipeline-number", + "BUILD_TAG": "jenkins-pipeline-id", + "BUILD_URL": "https://jenkins.com/pipeline", + "CHANGE_ID": 42, + "CHANGE_TARGET": "target-branch", + "DD_CUSTOM_TRACE_ID": "jenkins-custom-trace-id", + "GIT_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "JENKINS_URL": "jenkins", + "JOB_URL": "https://jenkins.com/job" + }, + { + "_dd.ci.env_vars": "{\"DD_CUSTOM_TRACE_ID\":\"jenkins-custom-trace-id\"}", + "ci.pipeline.id": "jenkins-pipeline-id", + "ci.pipeline.number": "jenkins-pipeline-number", + "ci.pipeline.url": "https://jenkins.com/pipeline", + "ci.provider.name": "jenkins", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/teamcity.json b/internal/civisibility/utils/testdata/fixtures/providers/teamcity.json index 086c1c16de..2561bd943b 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/teamcity.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/teamcity.json @@ -74,5 +74,21 @@ "git.repository_url": "git@github.com:DataDog/userrepo.git", "git.tag": "0.0.2" } + ], + [ + { + "BUILD_URL": "https://teamcity.com/repo", + "TEAMCITY_BUILDCONF_NAME": "Test 1", + "TEAMCITY_PULLREQUEST_NUMBER": 42, + "TEAMCITY_PULLREQUEST_TARGET_BRANCH": "target-branch", + "TEAMCITY_VERSION": "2022.10 (build 116751)" + }, + { + "ci.job.name": "Test 1", + "ci.job.url": "https://teamcity.com/repo", + "ci.provider.name": "teamcity", + "git.pull_request.base_branch": "target-branch", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/travisci.json b/internal/civisibility/utils/testdata/fixtures/providers/travisci.json index 2131938546..1632ae54ea 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/travisci.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/travisci.json @@ -10,6 +10,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo", "TRAVIS_TAG": "origin/tags/0.1.0" }, @@ -38,6 +39,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo", "TRAVIS_TAG": "refs/heads/tags/0.1.0" }, @@ -65,6 +67,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -91,6 +94,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -118,6 +122,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -145,6 +150,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -173,6 +179,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo", "USERPROFILE": "/not-my-home" }, @@ -201,6 +208,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -229,6 +237,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo", "USERPROFILE": "/not-my-home" }, @@ -257,6 +266,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -284,6 +294,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -311,6 +322,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -338,6 +350,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_PULL_REQUEST_BRANCH": "origin/master", "TRAVIS_PULL_REQUEST_SLUG": "user/repo", "TRAVIS_REPO_SLUG": "user/repo" @@ -367,6 +380,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_PULL_REQUEST_BRANCH": "refs/heads/master", "TRAVIS_PULL_REQUEST_SLUG": "user/repo", "TRAVIS_REPO_SLUG": "user/repo" @@ -396,6 +410,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_PULL_REQUEST_BRANCH": "refs/heads/feature/one", "TRAVIS_PULL_REQUEST_SLUG": "user/repo", "TRAVIS_REPO_SLUG": "user/repo" @@ -433,6 +448,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -473,6 +489,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo" }, { @@ -505,6 +522,7 @@ "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": "false", "TRAVIS_REPO_SLUG": "user/repo", "TRAVIS_TAG": "origin/tags/0.1.0" }, @@ -521,5 +539,37 @@ "git.repository_url": "https://github.com/user/repo.git", "git.tag": "0.1.0" } + ], + [ + { + "TRAVIS": "travisCI", + "TRAVIS_BRANCH": "origin/master", + "TRAVIS_BUILD_ID": "travis-pipeline-id", + "TRAVIS_BUILD_NUMBER": "travis-pipeline-number", + "TRAVIS_BUILD_WEB_URL": "https://travisci.com/pipeline", + "TRAVIS_COMMIT": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "TRAVIS_COMMIT_MESSAGE": "travis-commit-message", + "TRAVIS_EVENT_TYPE": "pull_request", + "TRAVIS_JOB_WEB_URL": "https://travisci.com/job", + "TRAVIS_PULL_REQUEST": 42, + "TRAVIS_PULL_REQUEST_BRANCH": "pr", + "TRAVIS_PULL_REQUEST_SHA": "724faca55efebf66fc15bfccc34577c64c5480bd", + "TRAVIS_REPO_SLUG": "user/repo" + }, + { + "ci.job.url": "https://travisci.com/job", + "ci.pipeline.id": "travis-pipeline-id", + "ci.pipeline.name": "user/repo", + "ci.pipeline.number": "travis-pipeline-number", + "ci.pipeline.url": "https://travisci.com/pipeline", + "ci.provider.name": "travisci", + "git.branch": "pr", + "git.commit.head.sha": "724faca55efebf66fc15bfccc34577c64c5480bd", + "git.commit.message": "travis-commit-message", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "master", + "git.repository_url": "https://github.com/user/repo.git", + "pr.number": "42" + } ] ] diff --git a/internal/civisibility/utils/testdata/fixtures/providers/usersupplied.json b/internal/civisibility/utils/testdata/fixtures/providers/usersupplied.json index f07f4e3740..add7045275 100644 --- a/internal/civisibility/utils/testdata/fixtures/providers/usersupplied.json +++ b/internal/civisibility/utils/testdata/fixtures/providers/usersupplied.json @@ -396,5 +396,33 @@ "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", "git.repository_url": "ssh://host.xz:54321/path/to/repo.git/" } + ], + [ + { + "DD_GIT_COMMIT_AUTHOR_DATE": "usersupplied-authordate", + "DD_GIT_COMMIT_AUTHOR_EMAIL": "usersupplied-authoremail", + "DD_GIT_COMMIT_AUTHOR_NAME": "usersupplied-authorname", + "DD_GIT_COMMIT_COMMITTER_DATE": "usersupplied-comitterdate", + "DD_GIT_COMMIT_COMMITTER_EMAIL": "usersupplied-comitteremail", + "DD_GIT_COMMIT_COMMITTER_NAME": "usersupplied-comittername", + "DD_GIT_COMMIT_MESSAGE": "usersupplied-message", + "DD_GIT_COMMIT_SHA": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "DD_GIT_PULL_REQUEST_BASE_BRANCH": "target-branch", + "DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "DD_GIT_REPOSITORY_URL": "git@github.com:DataDog/userrepo.git" + }, + { + "git.commit.author.date": "usersupplied-authordate", + "git.commit.author.email": "usersupplied-authoremail", + "git.commit.author.name": "usersupplied-authorname", + "git.commit.committer.date": "usersupplied-comitterdate", + "git.commit.committer.email": "usersupplied-comitteremail", + "git.commit.committer.name": "usersupplied-comittername", + "git.commit.message": "usersupplied-message", + "git.commit.sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.pull_request.base_branch": "target-branch", + "git.pull_request.base_branch_sha": "b9f0fb3fdbb94c9d24b2c75b49663122a529e123", + "git.repository_url": "git@github.com:DataDog/userrepo.git" + } ] ] diff --git a/internal/container_linux.go b/internal/container_linux.go index 237c293e21..6ac57029f9 100644 --- a/internal/container_linux.go +++ b/internal/container_linux.go @@ -48,7 +48,7 @@ var ( // containerID is the containerID read at init from /proc/self/cgroup containerID string - // entityID is the entityID to use for the container. It is the `cid-` if the container id available, + // entityID is the entityID to use for the container. It is the `ci-` if the container id available, // otherwise the cgroup node controller's inode prefixed with `in-` or an empty string on incompatible OS. // We use the memory controller on cgroupv1 and the root cgroup on cgroupv2. entityID string @@ -151,7 +151,7 @@ func readEntityID(mountPath, cgroupPath string, isHostCgroupNamespace bool) stri // First try to emit the containerID if available. It will be retrieved if the container is // running in the host cgroup namespace, independently of the cgroup version. if containerID != "" { - return "cid-" + containerID + return "ci-" + containerID } // Rely on the inode if we're not running in the host cgroup namespace. if isHostCgroupNamespace { @@ -161,7 +161,7 @@ func readEntityID(mountPath, cgroupPath string, isHostCgroupNamespace bool) stri } // EntityID attempts to return the container ID or the cgroup node controller's inode if the container ID -// is not available. The cid is prefixed with `cid-` and the inode with `in-`. +// is not available. The cid is prefixed with `ci-` and the inode with `in-`. func EntityID() string { return entityID } diff --git a/internal/container_linux_test.go b/internal/container_linux_test.go index 029ff647c4..83796086f7 100644 --- a/internal/container_linux_test.go +++ b/internal/container_linux_test.go @@ -93,7 +93,7 @@ func TestReadEntityIDPrioritizeCID(t *testing.T) { containerID = "fakeContainerID" eid := readEntityID("", "", true) - assert.Equal(t, "cid-fakeContainerID", eid) + assert.Equal(t, "ci-fakeContainerID", eid) } func TestReadEntityIDFallbackOnInode(t *testing.T) { diff --git a/internal/container_stub.go b/internal/container_stub.go index c6c2487406..38f4e5ce21 100644 --- a/internal/container_stub.go +++ b/internal/container_stub.go @@ -13,7 +13,7 @@ func ContainerID() string { } // EntityID attempts to return the container ID or the cgroup v2 node inode if the container ID is not available. -// The cid is prefixed with `cid-` and the inode with `in-`. +// The cid is prefixed with `ci-` and the inode with `in-`. func EntityID() string { return "" } diff --git a/internal/datastreams/hash_cache.go b/internal/datastreams/hash_cache.go index 2c5f047305..4f92f7d730 100644 --- a/internal/datastreams/hash_cache.go +++ b/internal/datastreams/hash_cache.go @@ -19,17 +19,23 @@ type hashCache struct { m map[string]uint64 } -func getHashKey(edgeTags []string, parentHash uint64) string { +func getHashKey(edgeTags, processTags []string, parentHash uint64) string { var s strings.Builder l := 0 for _, t := range edgeTags { l += len(t) } + for _, t := range processTags { + l += len(t) + } l += 8 s.Grow(l) for _, t := range edgeTags { s.WriteString(t) } + for _, t := range processTags { + s.WriteString(t) + } s.WriteByte(byte(parentHash)) s.WriteByte(byte(parentHash >> 8)) s.WriteByte(byte(parentHash >> 16)) @@ -41,8 +47,8 @@ func getHashKey(edgeTags []string, parentHash uint64) string { return s.String() } -func (c *hashCache) computeAndGet(key string, parentHash uint64, service, env string, edgeTags []string) uint64 { - hash := pathwayHash(nodeHash(service, env, edgeTags), parentHash) +func (c *hashCache) computeAndGet(key string, parentHash uint64, service, env string, edgeTags, processTags []string) uint64 { + hash := pathwayHash(nodeHash(service, env, edgeTags, processTags), parentHash) c.mu.Lock() defer c.mu.Unlock() if len(c.m) >= maxHashCacheSize { @@ -54,15 +60,15 @@ func (c *hashCache) computeAndGet(key string, parentHash uint64, service, env st return hash } -func (c *hashCache) get(service, env string, edgeTags []string, parentHash uint64) uint64 { - key := getHashKey(edgeTags, parentHash) +func (c *hashCache) get(service, env string, edgeTags, processTags []string, parentHash uint64) uint64 { + key := getHashKey(edgeTags, processTags, parentHash) c.mu.RLock() if hash, ok := c.m[key]; ok { c.mu.RUnlock() return hash } c.mu.RUnlock() - return c.computeAndGet(key, parentHash, service, env, edgeTags) + return c.computeAndGet(key, parentHash, service, env, edgeTags, processTags) } func newHashCache() *hashCache { diff --git a/internal/datastreams/hash_cache_test.go b/internal/datastreams/hash_cache_test.go index 797decd77e..48492da1c8 100644 --- a/internal/datastreams/hash_cache_test.go +++ b/internal/datastreams/hash_cache_test.go @@ -14,18 +14,25 @@ import ( func TestHashCache(t *testing.T) { cache := newHashCache() - assert.Equal(t, pathwayHash(nodeHash("service", "env", []string{"type:kafka"}), 1234), cache.get("service", "env", []string{"type:kafka"}, 1234)) + assert.Equal(t, pathwayHash(nodeHash("service", "env", []string{"type:kafka"}, nil), 1234), cache.get("service", "env", []string{"type:kafka"}, nil, 1234)) assert.Len(t, cache.m, 1) - assert.Equal(t, pathwayHash(nodeHash("service", "env", []string{"type:kafka"}), 1234), cache.get("service", "env", []string{"type:kafka"}, 1234)) + assert.Equal(t, pathwayHash(nodeHash("service", "env", []string{"type:kafka"}, nil), 1234), cache.get("service", "env", []string{"type:kafka"}, nil, 1234)) assert.Len(t, cache.m, 1) - assert.Equal(t, pathwayHash(nodeHash("service", "env", []string{"type:kafka2"}), 1234), cache.get("service", "env", []string{"type:kafka2"}, 1234)) + assert.Equal(t, pathwayHash(nodeHash("service", "env", []string{"type:kafka2"}, nil), 1234), cache.get("service", "env", []string{"type:kafka2"}, nil, 1234)) assert.Len(t, cache.m, 2) + + pTags := []string{"entrypoint.name:something", "entrypoint.type:executable"} + h1 := pathwayHash(nodeHash("service", "env", []string{"type:kafka"}, pTags), 1234) + h2 := cache.get("service", "env", []string{"type:kafka"}, pTags, 1234) + + assert.Equal(t, h1, h2) + assert.Len(t, cache.m, 3) } func TestGetHashKey(t *testing.T) { parentHash := uint64(87234) - key := getHashKey([]string{"type:kafka", "topic:topic1", "group:group1"}, parentHash) + key := getHashKey([]string{"type:kafka", "topic:topic1", "group:group1"}, []string{"entrypoint.name:something", "entrypoint.type:executable"}, parentHash) hash := make([]byte, 8) binary.LittleEndian.PutUint64(hash, parentHash) - assert.Equal(t, "type:kafkatopic:topic1group:group1"+string(hash), key) + assert.Equal(t, "type:kafkatopic:topic1group:group1entrypoint.name:somethingentrypoint.type:executable"+string(hash), key) } diff --git a/internal/datastreams/pathway.go b/internal/datastreams/pathway.go index a16891a7c2..cbe9c880da 100644 --- a/internal/datastreams/pathway.go +++ b/internal/datastreams/pathway.go @@ -15,7 +15,7 @@ import ( "time" ) -var hashableEdgeTags = map[string]struct{}{"event_type": {}, "exchange": {}, "group": {}, "topic": {}, "type": {}, "direction": {}} +var hashableEdgeTags = map[string]struct{}{"event_type": {}, "exchange": {}, "group": {}, "topic": {}, "type": {}, "direction": {}, "segment_name": {}} func isWellFormedEdgeTag(t string) bool { if i := strings.IndexByte(t, ':'); i != -1 { @@ -26,7 +26,7 @@ func isWellFormedEdgeTag(t string) bool { return false } -func nodeHash(service, env string, edgeTags []string) uint64 { +func nodeHash(service, env string, edgeTags, processTags []string) uint64 { h := fnv.New64() sort.Strings(edgeTags) h.Write([]byte(service)) @@ -38,6 +38,9 @@ func nodeHash(service, env string, edgeTags []string) uint64 { fmt.Println("not formatted correctly", t) } } + for _, t := range processTags { + h.Write([]byte(t)) + } return h.Sum64() } diff --git a/internal/datastreams/pathway_test.go b/internal/datastreams/pathway_test.go index 7be5e8b04c..6f5e60d7a2 100644 --- a/internal/datastreams/pathway_test.go +++ b/internal/datastreams/pathway_test.go @@ -11,6 +11,7 @@ import ( "testing" "time" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" "github.com/stretchr/testify/assert" ) @@ -25,6 +26,7 @@ func TestPathway(t *testing.T) { env: "env", timeSource: func() time.Time { return start }, } + processTags := processtags.GlobalTags().Slice() ctx := processor.SetCheckpoint(context.Background()) middle := start.Add(time.Hour) processor.timeSource = func() time.Time { return middle } @@ -32,14 +34,15 @@ func TestPathway(t *testing.T) { end := middle.Add(time.Hour) processor.timeSource = func() time.Time { return end } ctx = processor.SetCheckpoint(ctx, "topic:topic2") - hash1 := pathwayHash(nodeHash("service-1", "env", nil), 0) - hash2 := pathwayHash(nodeHash("service-1", "env", []string{"topic:topic1"}), hash1) - hash3 := pathwayHash(nodeHash("service-1", "env", []string{"topic:topic2"}), hash2) + hash1 := pathwayHash(nodeHash("service-1", "env", nil, processTags), 0) + hash2 := pathwayHash(nodeHash("service-1", "env", []string{"topic:topic1"}, processTags), hash1) + hash3 := pathwayHash(nodeHash("service-1", "env", []string{"topic:topic2"}, processTags), hash2) p, _ := PathwayFromContext(ctx) assert.Equal(t, hash3, p.GetHash()) assert.Equal(t, start, p.PathwayStart()) assert.Equal(t, end, p.EdgeStart()) assert.Equal(t, statsPoint{ + serviceName: "service-1", edgeTags: nil, hash: hash1, parentHash: 0, @@ -48,6 +51,7 @@ func TestPathway(t *testing.T) { edgeLatency: 0, }, processor.in.poll(time.Second).point) assert.Equal(t, statsPoint{ + serviceName: "service-1", edgeTags: []string{"topic:topic1"}, hash: hash2, parentHash: hash1, @@ -56,6 +60,7 @@ func TestPathway(t *testing.T) { edgeLatency: middle.Sub(start).Nanoseconds(), }, processor.in.poll(time.Second).point) assert.Equal(t, statsPoint{ + serviceName: "service-1", edgeTags: []string{"topic:topic2"}, hash: hash3, parentHash: hash2, @@ -79,9 +84,10 @@ func TestPathway(t *testing.T) { pathwayWith1EdgeTag, _ := PathwayFromContext(processor.SetCheckpoint(context.Background(), "type:internal")) pathwayWith2EdgeTags, _ := PathwayFromContext(processor.SetCheckpoint(context.Background(), "type:internal", "some_other_key:some_other_val")) - hash1 := pathwayHash(nodeHash("service-1", "env", nil), 0) - hash2 := pathwayHash(nodeHash("service-1", "env", []string{"type:internal"}), 0) - hash3 := pathwayHash(nodeHash("service-1", "env", []string{"type:internal", "some_other_key:some_other_val"}), 0) + processTags := processtags.GlobalTags().Slice() + hash1 := pathwayHash(nodeHash("service-1", "env", nil, processTags), 0) + hash2 := pathwayHash(nodeHash("service-1", "env", []string{"type:internal"}, processTags), 0) + hash3 := pathwayHash(nodeHash("service-1", "env", []string{"type:internal", "some_other_key:some_other_val"}, processTags), 0) assert.Equal(t, hash1, pathwayWithNoEdgeTags.GetHash()) assert.Equal(t, hash2, pathwayWith1EdgeTag.GetHash()) assert.Equal(t, hash3, pathwayWith2EdgeTags.GetHash()) @@ -99,28 +105,28 @@ func TestPathway(t *testing.T) { t.Run("test nodeHash", func(t *testing.T) { assert.NotEqual(t, - nodeHash("service-1", "env", []string{"type:internal"}), - nodeHash("service-1", "env", []string{"type:kafka"}), + nodeHash("service-1", "env", []string{"type:internal"}, nil), + nodeHash("service-1", "env", []string{"type:kafka"}, nil), ) assert.NotEqual(t, - nodeHash("service-1", "env", []string{"exchange:1"}), - nodeHash("service-1", "env", []string{"exchange:2"}), + nodeHash("service-1", "env", []string{"exchange:1"}, nil), + nodeHash("service-1", "env", []string{"exchange:2"}, nil), ) assert.NotEqual(t, - nodeHash("service-1", "env", []string{"topic:1"}), - nodeHash("service-1", "env", []string{"topic:2"}), + nodeHash("service-1", "env", []string{"topic:1"}, nil), + nodeHash("service-1", "env", []string{"topic:2"}, nil), ) assert.NotEqual(t, - nodeHash("service-1", "env", []string{"group:1"}), - nodeHash("service-1", "env", []string{"group:2"}), + nodeHash("service-1", "env", []string{"group:1"}, nil), + nodeHash("service-1", "env", []string{"group:2"}, nil), ) assert.NotEqual(t, - nodeHash("service-1", "env", []string{"event_type:1"}), - nodeHash("service-1", "env", []string{"event_type:2"}), + nodeHash("service-1", "env", []string{"event_type:1"}, nil), + nodeHash("service-1", "env", []string{"event_type:2"}, nil), ) assert.Equal(t, - nodeHash("service-1", "env", []string{"partition:0"}), - nodeHash("service-1", "env", []string{"partition:1"}), + nodeHash("service-1", "env", []string{"partition:0"}, nil), + nodeHash("service-1", "env", []string{"partition:1"}, nil), ) }) @@ -164,7 +170,7 @@ func TestPathway(t *testing.T) { }) t.Run("test GetHash", func(t *testing.T) { - pathway := Pathway{hash: nodeHash("service", "env", []string{"direction:in"})} + pathway := Pathway{hash: nodeHash("service", "env", []string{"direction:in"}, nil)} assert.Equal(t, pathway.hash, pathway.GetHash()) }) } @@ -180,6 +186,6 @@ func BenchmarkNodeHash(b *testing.B) { env := "test" edgeTags := []string{"event_type:dog", "exchange:local", "group:all", "topic:off", "type:writer"} for i := 0; i < b.N; i++ { - nodeHash(service, env, edgeTags) + nodeHash(service, env, edgeTags, nil) } } diff --git a/internal/datastreams/payload.go b/internal/datastreams/payload.go index 8df4027311..eee5dff484 100644 --- a/internal/datastreams/payload.go +++ b/internal/datastreams/payload.go @@ -3,7 +3,7 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016-present Datadog, Inc. -//go:generate msgp -unexported -marshal=false -o=payload_msgp.go -tests=false +//go:generate go run github.com/tinylib/msgp -unexported -marshal=false -o=payload_msgp.go -tests=false package datastreams @@ -21,6 +21,8 @@ type StatsPayload struct { Lang string // Version is the version of the service Version string + // ProcessTags contains the process level tags. + ProcessTags []string } type ProduceOffset struct { @@ -71,7 +73,6 @@ const ( // StatsPoint contains a set of statistics grouped under various aggregation keys. type StatsPoint struct { // These fields indicate the properties under which the stats were aggregated. - Service string // deprecated EdgeTags []string Hash uint64 ParentHash uint64 diff --git a/internal/datastreams/payload_msgp.go b/internal/datastreams/payload_msgp.go index d22fdfea97..a617921c8a 100644 --- a/internal/datastreams/payload_msgp.go +++ b/internal/datastreams/payload_msgp.go @@ -1,7 +1,7 @@ -package datastreams - // Code generated by github.com/tinylib/msgp DO NOT EDIT. +package datastreams + import ( "github.com/tinylib/msgp/msgp" ) @@ -585,6 +585,25 @@ func (z *StatsPayload) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "Version") return } + case "ProcessTags": + var zb0003 uint32 + zb0003, err = dc.ReadArrayHeader() + if err != nil { + err = msgp.WrapError(err, "ProcessTags") + return + } + if cap(z.ProcessTags) >= int(zb0003) { + z.ProcessTags = (z.ProcessTags)[:zb0003] + } else { + z.ProcessTags = make([]string, zb0003) + } + for za0002 := range z.ProcessTags { + z.ProcessTags[za0002], err = dc.ReadString() + if err != nil { + err = msgp.WrapError(err, "ProcessTags", za0002) + return + } + } default: err = dc.Skip() if err != nil { @@ -598,9 +617,9 @@ func (z *StatsPayload) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *StatsPayload) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 6 + // map header, size 7 // write "Env" - err = en.Append(0x86, 0xa3, 0x45, 0x6e, 0x76) + err = en.Append(0x87, 0xa3, 0x45, 0x6e, 0x76) if err != nil { return } @@ -666,6 +685,23 @@ func (z *StatsPayload) EncodeMsg(en *msgp.Writer) (err error) { err = msgp.WrapError(err, "Version") return } + // write "ProcessTags" + err = en.Append(0xab, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x61, 0x67, 0x73) + if err != nil { + return + } + err = en.WriteArrayHeader(uint32(len(z.ProcessTags))) + if err != nil { + err = msgp.WrapError(err, "ProcessTags") + return + } + for za0002 := range z.ProcessTags { + err = en.WriteString(z.ProcessTags[za0002]) + if err != nil { + err = msgp.WrapError(err, "ProcessTags", za0002) + return + } + } return } @@ -675,7 +711,10 @@ func (z *StatsPayload) Msgsize() (s int) { for za0001 := range z.Stats { s += z.Stats[za0001].Msgsize() } - s += 14 + msgp.StringPrefixSize + len(z.TracerVersion) + 5 + msgp.StringPrefixSize + len(z.Lang) + 8 + msgp.StringPrefixSize + len(z.Version) + s += 14 + msgp.StringPrefixSize + len(z.TracerVersion) + 5 + msgp.StringPrefixSize + len(z.Lang) + 8 + msgp.StringPrefixSize + len(z.Version) + 12 + msgp.ArrayHeaderSize + for za0002 := range z.ProcessTags { + s += msgp.StringPrefixSize + len(z.ProcessTags[za0002]) + } return } @@ -697,12 +736,6 @@ func (z *StatsPoint) DecodeMsg(dc *msgp.Reader) (err error) { return } switch msgp.UnsafeString(field) { - case "Service": - z.Service, err = dc.ReadString() - if err != nil { - err = msgp.WrapError(err, "Service") - return - } case "EdgeTags": var zb0002 uint32 zb0002, err = dc.ReadArrayHeader() @@ -775,19 +808,9 @@ func (z *StatsPoint) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *StatsPoint) EncodeMsg(en *msgp.Writer) (err error) { - // map header, size 8 - // write "Service" - err = en.Append(0x88, 0xa7, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Service) - if err != nil { - err = msgp.WrapError(err, "Service") - return - } + // map header, size 7 // write "EdgeTags" - err = en.Append(0xa8, 0x45, 0x64, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73) + err = en.Append(0x87, 0xa8, 0x45, 0x64, 0x67, 0x65, 0x54, 0x61, 0x67, 0x73) if err != nil { return } @@ -868,7 +891,7 @@ func (z *StatsPoint) EncodeMsg(en *msgp.Writer) (err error) { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *StatsPoint) Msgsize() (s int) { - s = 1 + 8 + msgp.StringPrefixSize + len(z.Service) + 9 + msgp.ArrayHeaderSize + s = 1 + 9 + msgp.ArrayHeaderSize for za0001 := range z.EdgeTags { s += msgp.StringPrefixSize + len(z.EdgeTags[za0001]) } diff --git a/internal/datastreams/processor.go b/internal/datastreams/processor.go index 10a8b8afb3..469660c3e0 100644 --- a/internal/datastreams/processor.go +++ b/internal/datastreams/processor.go @@ -15,10 +15,11 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/DataDog/sketches-go/ddsketch" "github.com/DataDog/sketches-go/ddsketch/mapping" @@ -43,11 +44,14 @@ type statsPoint struct { pathwayLatency int64 edgeLatency int64 payloadSize int64 + serviceName string + processTags []string } type statsGroup struct { service string edgeTags []string + processTags []string hash uint64 parentHash uint64 pathwayLatency *ddsketch.DDSketch @@ -80,23 +84,22 @@ func (b bucket) export(timestampType TimestampType) StatsBucket { for _, s := range b.points { pathwayLatency, err := proto.Marshal(s.pathwayLatency.ToProto()) if err != nil { - log.Error("can't serialize pathway latency. Ignoring: %v", err) + log.Error("can't serialize pathway latency. Ignoring: %s", err.Error()) continue } edgeLatency, err := proto.Marshal(s.edgeLatency.ToProto()) if err != nil { - log.Error("can't serialize edge latency. Ignoring: %v", err) + log.Error("can't serialize edge latency. Ignoring: %s", err.Error()) continue } payloadSize, err := proto.Marshal(s.payloadSize.ToProto()) if err != nil { - log.Error("can't serialize payload size. Ignoring: %v", err) + log.Error("can't serialize payload size. Ignoring: %s", err.Error()) continue } stats = append(stats, StatsPoint{ PathwayLatency: pathwayLatency, EdgeLatency: edgeLatency, - Service: s.service, EdgeTags: s.edgeTags, Hash: s.hash, ParentHash: s.parentHash, @@ -172,12 +175,17 @@ type kafkaOffset struct { timestamp int64 } +type bucketKey struct { + serviceName string + btime int64 +} + type Processor struct { in *fastQueue hashCache *hashCache inKafka chan kafkaOffset - tsTypeCurrentBuckets map[int64]bucket - tsTypeOriginBuckets map[int64]bucket + tsTypeCurrentBuckets map[bucketKey]bucket + tsTypeOriginBuckets map[bucketKey]bucket wg sync.WaitGroup stopped uint64 stop chan struct{} // closing this channel triggers shutdown @@ -205,8 +213,8 @@ func NewProcessor(statsd internal.StatsdClient, env, service, version string, ag service = defaultServiceName } p := &Processor{ - tsTypeCurrentBuckets: make(map[int64]bucket), - tsTypeOriginBuckets: make(map[int64]bucket), + tsTypeCurrentBuckets: make(map[bucketKey]bucket), + tsTypeOriginBuckets: make(map[bucketKey]bucket), hashCache: newHashCache(), in: newFastQueue(), stopped: 1, @@ -224,16 +232,17 @@ func NewProcessor(statsd internal.StatsdClient, env, service, version string, ag // It gives us the start time of the time bucket in which such timestamp falls. func alignTs(ts, bucketSize int64) int64 { return ts - ts%bucketSize } -func (p *Processor) getBucket(btime int64, buckets map[int64]bucket) bucket { - b, ok := buckets[btime] +func (p *Processor) getBucket(btime int64, service string, buckets map[bucketKey]bucket) bucket { + k := bucketKey{serviceName: service, btime: btime} + b, ok := buckets[k] if !ok { b = newBucket(uint64(btime), uint64(bucketDuration.Nanoseconds())) - buckets[btime] = b + buckets[k] = b } return b } -func (p *Processor) addToBuckets(point statsPoint, btime int64, buckets map[int64]bucket) { - b := p.getBucket(btime, buckets) +func (p *Processor) addToBuckets(point statsPoint, btime int64, buckets map[bucketKey]bucket) { + b := p.getBucket(btime, point.serviceName, buckets) group, ok := b.points[point.hash] if !ok { group = statsGroup{ @@ -247,13 +256,13 @@ func (p *Processor) addToBuckets(point statsPoint, btime int64, buckets map[int6 b.points[point.hash] = group } if err := group.pathwayLatency.Add(math.Max(float64(point.pathwayLatency)/float64(time.Second), 0)); err != nil { - log.Error("failed to add pathway latency. Ignoring %v.", err) + log.Error("failed to add pathway latency. Ignoring %v.", err.Error()) } if err := group.edgeLatency.Add(math.Max(float64(point.edgeLatency)/float64(time.Second), 0)); err != nil { - log.Error("failed to add edge latency. Ignoring %v.", err) + log.Error("failed to add edge latency. Ignoring %v.", err.Error()) } if err := group.payloadSize.Add(float64(point.payloadSize)); err != nil { - log.Error("failed to add payload size. Ignoring %v.", err) + log.Error("failed to add payload size. Ignoring %v.", err.Error()) } } @@ -267,7 +276,7 @@ func (p *Processor) add(point statsPoint) { func (p *Processor) addKafkaOffset(o kafkaOffset) { btime := alignTs(o.timestamp, bucketDuration.Nanoseconds()) - b := p.getBucket(btime, p.tsTypeCurrentBuckets) + b := p.getBucket(btime, p.service, p.tsTypeCurrentBuckets) if o.offsetType == produceOffset { b.latestProduceOffsets[partitionKey{ partition: o.partition, @@ -311,16 +320,16 @@ func (p *Processor) flushInput() { func (p *Processor) run(tick <-chan time.Time) { for { select { + case <-p.stop: + // drop in flight payloads on the input channel + p.sendToAgent(p.flush(time.Now().Add(bucketDuration * 10))) + return case now := <-tick: p.sendToAgent(p.flush(now)) case done := <-p.flushRequest: p.flushInput() p.sendToAgent(p.flush(time.Now().Add(bucketDuration * 10))) close(done) - case <-p.stop: - // drop in flight payloads on the input channel - p.sendToAgent(p.flush(time.Now().Add(bucketDuration * 10))) - return default: s := p.in.pop() if s == nil { @@ -392,44 +401,55 @@ func (p *Processor) reportStats() { } } -func (p *Processor) flushBucket(buckets map[int64]bucket, bucketStart int64, timestampType TimestampType) StatsBucket { - bucket := buckets[bucketStart] - delete(buckets, bucketStart) +func (p *Processor) flushBucket(buckets map[bucketKey]bucket, bucketKey bucketKey, timestampType TimestampType) StatsBucket { + bucket := buckets[bucketKey] + delete(buckets, bucketKey) return bucket.export(timestampType) } -func (p *Processor) flush(now time.Time) StatsPayload { +func (p *Processor) flush(now time.Time) map[string]StatsPayload { nowNano := now.UnixNano() - sp := StatsPayload{ - Service: p.service, - Version: p.version, - Env: p.env, - Lang: "go", - TracerVersion: version.Tag, - Stats: make([]StatsBucket, 0, len(p.tsTypeCurrentBuckets)+len(p.tsTypeOriginBuckets)), - } - for ts := range p.tsTypeCurrentBuckets { - if ts > nowNano-bucketDuration.Nanoseconds() { + payloads := make(map[string]StatsPayload) + addBucket := func(service string, bucket StatsBucket) { + payload, ok := payloads[service] + if !ok { + payload = StatsPayload{ + Service: service, + Version: p.version, + Env: p.env, + Lang: "go", + TracerVersion: version.Tag, + Stats: make([]StatsBucket, 0, 1), + ProcessTags: processtags.GlobalTags().Slice(), + } + } + payload.Stats = append(payload.Stats, bucket) + payloads[service] = payload + } + for bucketKey := range p.tsTypeCurrentBuckets { + if bucketKey.btime > nowNano-bucketDuration.Nanoseconds() { // do not flush the bucket at the current time continue } - sp.Stats = append(sp.Stats, p.flushBucket(p.tsTypeCurrentBuckets, ts, TimestampTypeCurrent)) + addBucket(bucketKey.serviceName, p.flushBucket(p.tsTypeCurrentBuckets, bucketKey, TimestampTypeCurrent)) } - for ts := range p.tsTypeOriginBuckets { - if ts > nowNano-bucketDuration.Nanoseconds() { + for bucketKey := range p.tsTypeOriginBuckets { + if bucketKey.btime > nowNano-bucketDuration.Nanoseconds() { // do not flush the bucket at the current time continue } - sp.Stats = append(sp.Stats, p.flushBucket(p.tsTypeOriginBuckets, ts, TimestampTypeOrigin)) + addBucket(bucketKey.serviceName, p.flushBucket(p.tsTypeOriginBuckets, bucketKey, TimestampTypeOrigin)) } - return sp + return payloads } -func (p *Processor) sendToAgent(payload StatsPayload) { - atomic.AddInt64(&p.stats.flushedPayloads, 1) - atomic.AddInt64(&p.stats.flushedBuckets, int64(len(payload.Stats))) - if err := p.transport.sendPipelineStats(&payload); err != nil { - atomic.AddInt64(&p.stats.flushErrors, 1) +func (p *Processor) sendToAgent(payloads map[string]StatsPayload) { + for _, payload := range payloads { + atomic.AddInt64(&p.stats.flushedPayloads, 1) + atomic.AddInt64(&p.stats.flushedBuckets, int64(len(payload.Stats))) + if err := p.transport.sendPipelineStats(&payload); err != nil { + atomic.AddInt64(&p.stats.flushErrors, 1) + } } } @@ -448,12 +468,18 @@ func (p *Processor) SetCheckpointWithParams(ctx context.Context, params options. edgeStart = parent.EdgeStart() parentHash = parent.GetHash() } + service := p.service + if params.ServiceOverride != "" { + service = params.ServiceOverride + } + processTags := processtags.GlobalTags().Slice() child := Pathway{ - hash: p.hashCache.get(p.service, p.env, edgeTags, parentHash), + hash: p.hashCache.get(service, p.env, edgeTags, processTags, parentHash), pathwayStart: pathwayStart, edgeStart: now, } dropped := p.in.push(&processorInput{typ: pointTypeStats, point: statsPoint{ + serviceName: service, edgeTags: edgeTags, parentHash: parentHash, hash: child.hash, diff --git a/internal/datastreams/processor_test.go b/internal/datastreams/processor_test.go index 1e0418a2d8..341029163b 100644 --- a/internal/datastreams/processor_test.go +++ b/internal/datastreams/processor_test.go @@ -14,13 +14,15 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/datastreams/options" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/datastreams/options" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/version" "github.com/DataDog/datadog-go/v5/statsd" "github.com/DataDog/sketches-go/ddsketch" "github.com/DataDog/sketches-go/ddsketch/store" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/protobuf/proto" ) @@ -33,12 +35,30 @@ func buildSketch(values ...float64) []byte { return bytes } +func sortedPayloads(payloads map[string]StatsPayload) map[string]StatsPayload { + for _, payload := range payloads { + sort.Slice(payload.Stats, func(i, j int) bool { + return payload.Stats[i].Start < payload.Stats[j].Start + }) + for _, bucket := range payload.Stats { + sort.Slice(bucket.Stats, func(i, j int) bool { + return bucket.Stats[i].Hash < bucket.Stats[j].Hash + }) + sort.Slice(bucket.Backlogs, func(i, j int) bool { + return strings.Join(bucket.Backlogs[i].Tags, "") < strings.Join(bucket.Backlogs[j].Tags, "") + }) + } + } + return payloads +} + func TestProcessor(t *testing.T) { p := NewProcessor(nil, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, nil) tp1 := time.Now().Truncate(bucketDuration) tp2 := tp1.Add(time.Minute) p.add(statsPoint{ + serviceName: "service1", edgeTags: []string{"type:edge-1"}, hash: 2, parentHash: 1, @@ -48,6 +68,7 @@ func TestProcessor(t *testing.T) { payloadSize: 1, }) p.add(statsPoint{ + serviceName: "service1", edgeTags: []string{"type:edge-1"}, hash: 2, parentHash: 1, @@ -57,6 +78,7 @@ func TestProcessor(t *testing.T) { payloadSize: 2, }) p.add(statsPoint{ + serviceName: "service1", edgeTags: []string{"type:edge-1"}, hash: 3, parentHash: 1, @@ -66,6 +88,7 @@ func TestProcessor(t *testing.T) { payloadSize: 2, }) p.add(statsPoint{ + serviceName: "service1", edgeTags: []string{"type:edge-1"}, hash: 2, parentHash: 1, @@ -74,117 +97,215 @@ func TestProcessor(t *testing.T) { edgeLatency: (2 * time.Second).Nanoseconds(), payloadSize: 2, }) - got := p.flush(tp1.Add(bucketDuration)) - sort.Slice(got.Stats, func(i, j int) bool { - return got.Stats[i].Start < got.Stats[j].Start - }) - assert.Len(t, got.Stats, 2) - assert.Equal(t, StatsPayload{ - Env: "env", - Service: "service", - Version: "v1", - Stats: []StatsBucket{ - { - Start: uint64(tp1.Add(-10 * time.Second).UnixNano()), - Duration: uint64(bucketDuration.Nanoseconds()), - Stats: []StatsPoint{{ - EdgeTags: []string{"type:edge-1"}, - Hash: 2, - ParentHash: 1, - PathwayLatency: buildSketch(5), - EdgeLatency: buildSketch(2), - PayloadSize: buildSketch(2), - TimestampType: "origin", - }}, - Backlogs: []Backlog{}, - }, - { - Start: uint64(tp1.UnixNano()), - Duration: uint64(bucketDuration.Nanoseconds()), - Stats: []StatsPoint{{ - EdgeTags: []string{"type:edge-1"}, - Hash: 2, - ParentHash: 1, - PathwayLatency: buildSketch(5), - EdgeLatency: buildSketch(2), - PayloadSize: buildSketch(2), - TimestampType: "current", - }}, - Backlogs: []Backlog{}, - }, - }, - TracerVersion: version.Tag, - Lang: "go", - }, got) - - sp := p.flush(tp2.Add(bucketDuration)) - sort.Slice(sp.Stats, func(i, j int) bool { - return sp.Stats[i].Start < sp.Stats[j].Start - }) - for k := range sp.Stats { - sort.Slice(sp.Stats[k].Stats, func(i, j int) bool { - return sp.Stats[k].Stats[i].Hash < sp.Stats[k].Stats[j].Hash - }) - } - assert.Equal(t, StatsPayload{ - Env: "env", - Service: "service", - Version: "v1", - Stats: []StatsBucket{ - { - Start: uint64(tp2.Add(-time.Second * 10).UnixNano()), - Duration: uint64(bucketDuration.Nanoseconds()), - Stats: []StatsPoint{ - { + got := sortedPayloads(p.flush(tp1.Add(bucketDuration))) + assert.Len(t, got["service1"].Stats, 2) + assert.Equal(t, map[string]StatsPayload{ + "service1": { + Env: "env", + Service: "service1", + Version: "v1", + ProcessTags: processtags.GlobalTags().Slice(), + Stats: []StatsBucket{ + { + Start: uint64(tp1.Add(-10 * time.Second).UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{{ EdgeTags: []string{"type:edge-1"}, Hash: 2, ParentHash: 1, - PathwayLatency: buildSketch(1, 5), - EdgeLatency: buildSketch(1, 2), - PayloadSize: buildSketch(1, 2), - TimestampType: "origin", - }, - { - EdgeTags: []string{"type:edge-1"}, - Hash: 3, - ParentHash: 1, PathwayLatency: buildSketch(5), EdgeLatency: buildSketch(2), PayloadSize: buildSketch(2), TimestampType: "origin", - }, + }}, + Backlogs: []Backlog{}, }, - Backlogs: []Backlog{}, - }, - { - Start: uint64(tp2.UnixNano()), - Duration: uint64(bucketDuration.Nanoseconds()), - Stats: []StatsPoint{ - { + { + Start: uint64(tp1.UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{{ EdgeTags: []string{"type:edge-1"}, Hash: 2, ParentHash: 1, - PathwayLatency: buildSketch(1, 5), - EdgeLatency: buildSketch(1, 2), - PayloadSize: buildSketch(1, 2), - TimestampType: "current", - }, - { - EdgeTags: []string{"type:edge-1"}, - Hash: 3, - ParentHash: 1, PathwayLatency: buildSketch(5), EdgeLatency: buildSketch(2), PayloadSize: buildSketch(2), TimestampType: "current", + }}, + Backlogs: []Backlog{}, + }, + }, + TracerVersion: version.Tag, + Lang: "go", + }}, got) + + got = sortedPayloads(p.flush(tp2.Add(bucketDuration))) + assert.Equal(t, map[string]StatsPayload{ + "service1": { + Env: "env", + Service: "service1", + Version: "v1", + ProcessTags: processtags.GlobalTags().Slice(), + Stats: []StatsBucket{ + { + Start: uint64(tp2.Add(-time.Second * 10).UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{ + { + EdgeTags: []string{"type:edge-1"}, + Hash: 2, + ParentHash: 1, + PathwayLatency: buildSketch(1, 5), + EdgeLatency: buildSketch(1, 2), + PayloadSize: buildSketch(1, 2), + TimestampType: "origin", + }, + { + EdgeTags: []string{"type:edge-1"}, + Hash: 3, + ParentHash: 1, + PathwayLatency: buildSketch(5), + EdgeLatency: buildSketch(2), + PayloadSize: buildSketch(2), + TimestampType: "origin", + }, + }, + Backlogs: []Backlog{}, + }, + { + Start: uint64(tp2.UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{ + { + EdgeTags: []string{"type:edge-1"}, + Hash: 2, + ParentHash: 1, + PathwayLatency: buildSketch(1, 5), + EdgeLatency: buildSketch(1, 2), + PayloadSize: buildSketch(1, 2), + TimestampType: "current", + }, + { + EdgeTags: []string{"type:edge-1"}, + Hash: 3, + ParentHash: 1, + PathwayLatency: buildSketch(5), + EdgeLatency: buildSketch(2), + PayloadSize: buildSketch(2), + TimestampType: "current", + }, }, + Backlogs: []Backlog{}, }, - Backlogs: []Backlog{}, }, - }, - TracerVersion: version.Tag, - Lang: "go", - }, sp) + TracerVersion: version.Tag, + Lang: "go", + }}, got) + + t.Run("test_service_name_override", func(t *testing.T) { + p := NewProcessor(nil, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, nil) + tp := time.Now().Truncate(bucketDuration) + p.add(statsPoint{ + serviceName: "service1", + edgeTags: []string{"type:edge-1"}, + hash: 2, + parentHash: 1, + timestamp: tp.UnixNano(), + pathwayLatency: time.Second.Nanoseconds(), + edgeLatency: time.Second.Nanoseconds(), + payloadSize: 1, + }) + p.add(statsPoint{ + serviceName: "service2", + edgeTags: []string{"type:edge-1"}, + hash: 2, + parentHash: 1, + timestamp: tp.UnixNano(), + pathwayLatency: (5 * time.Second).Nanoseconds(), + edgeLatency: (2 * time.Second).Nanoseconds(), + payloadSize: 2, + }) + got := sortedPayloads(p.flush(tp.Add(bucketDuration))) + assert.Equal(t, map[string]StatsPayload{ + "service1": { + Env: "env", + Service: "service1", + Version: "v1", + ProcessTags: processtags.GlobalTags().Slice(), + Stats: []StatsBucket{ + { + Start: uint64(tp1.Add(-10 * time.Second).UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{{ + EdgeTags: []string{"type:edge-1"}, + Hash: 2, + ParentHash: 1, + PathwayLatency: buildSketch(1), + EdgeLatency: buildSketch(1), + PayloadSize: buildSketch(1), + TimestampType: "origin", + }}, + Backlogs: []Backlog{}, + }, + { + Start: uint64(tp1.UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{{ + EdgeTags: []string{"type:edge-1"}, + Hash: 2, + ParentHash: 1, + PathwayLatency: buildSketch(1), + EdgeLatency: buildSketch(1), + PayloadSize: buildSketch(1), + TimestampType: "current", + }}, + Backlogs: []Backlog{}, + }, + }, + TracerVersion: version.Tag, + Lang: "go", + }, + "service2": { + Env: "env", + Service: "service2", + Version: "v1", + ProcessTags: processtags.GlobalTags().Slice(), + Stats: []StatsBucket{ + { + Start: uint64(tp1.Add(-10 * time.Second).UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{{ + EdgeTags: []string{"type:edge-1"}, + Hash: 2, + ParentHash: 1, + PathwayLatency: buildSketch(5), + EdgeLatency: buildSketch(2), + PayloadSize: buildSketch(2), + TimestampType: "origin", + }}, + Backlogs: []Backlog{}, + }, + { + Start: uint64(tp1.UnixNano()), + Duration: uint64(bucketDuration.Nanoseconds()), + Stats: []StatsPoint{{ + EdgeTags: []string{"type:edge-1"}, + Hash: 2, + ParentHash: 1, + PathwayLatency: buildSketch(5), + EdgeLatency: buildSketch(2), + PayloadSize: buildSketch(2), + TimestampType: "current", + }}, + Backlogs: []Backlog{}, + }, + }, + TracerVersion: version.Tag, + Lang: "go", + }, + }, got) + }) + } func TestSetCheckpoint(t *testing.T) { @@ -196,8 +317,42 @@ func TestSetCheckpoint(t *testing.T) { env: "env", timeSource: time.Now, } - hash1 := pathwayHash(nodeHash("service-1", "env", []string{"direction:in", "type:kafka"}), 0) - hash2 := pathwayHash(nodeHash("service-1", "env", []string{"direction:out", "type:kafka"}), hash1) + processTags := processtags.GlobalTags().Slice() + hash1 := pathwayHash(nodeHash("service-1", "env", []string{"direction:in", "type:kafka"}, processTags), 0) + hash2 := pathwayHash(nodeHash("service-1", "env", []string{"direction:out", "type:kafka"}, processTags), hash1) + + ctx := processor.SetCheckpoint(context.Background(), "direction:in", "type:kafka") + pathway, _ := PathwayFromContext(processor.SetCheckpoint(ctx, "direction:out", "type:kafka")) + + statsPt1 := processor.in.pop().point + statsPt2 := processor.in.pop().point + + assert.Equal(t, []string{"direction:in", "type:kafka"}, statsPt1.edgeTags) + assert.Equal(t, hash1, statsPt1.hash) + assert.Equal(t, uint64(0), statsPt1.parentHash) + + assert.Equal(t, []string{"direction:out", "type:kafka"}, statsPt2.edgeTags) + assert.Equal(t, hash2, statsPt2.hash) + assert.Equal(t, hash1, statsPt2.parentHash) + + assert.Equal(t, statsPt2.hash, pathway.GetHash()) +} + +func TestSetCheckpointProcessTags(t *testing.T) { + processtags.Reload() + pTags := processtags.GlobalTags().Slice() + require.NotEmpty(t, pTags) + + processor := Processor{ + hashCache: newHashCache(), + stopped: 1, + in: newFastQueue(), + service: "service-1", + env: "env", + timeSource: time.Now, + } + hash1 := pathwayHash(nodeHash("service-1", "env", []string{"direction:in", "type:kafka"}, pTags), 0) + hash2 := pathwayHash(nodeHash("service-1", "env", []string{"direction:out", "type:kafka"}, pTags), hash1) ctx := processor.SetCheckpoint(context.Background(), "direction:in", "type:kafka") pathway, _ := PathwayFromContext(processor.SetCheckpoint(ctx, "direction:out", "type:kafka")) @@ -223,10 +378,7 @@ func TestKafkaLag(t *testing.T) { p.addKafkaOffset(kafkaOffset{offset: 10, topic: "topic2", partition: 1, group: "group1", offsetType: commitOffset}) p.addKafkaOffset(kafkaOffset{offset: 5, topic: "topic1", partition: 1, offsetType: produceOffset}) p.addKafkaOffset(kafkaOffset{offset: 15, topic: "topic1", partition: 1, offsetType: produceOffset}) - point := p.flush(tp1.Add(bucketDuration * 2)) - sort.Slice(point.Stats[0].Backlogs, func(i, j int) bool { - return strings.Join(point.Stats[0].Backlogs[i].Tags, "") < strings.Join(point.Stats[0].Backlogs[j].Tags, "") - }) + payloads := sortedPayloads(p.flush(tp1.Add(bucketDuration * 2))) expectedBacklogs := []Backlog{ { Tags: []string{"consumer_group:group1", "partition:1", "topic:topic1", "type:kafka_commit"}, @@ -241,7 +393,7 @@ func TestKafkaLag(t *testing.T) { Value: 15, }, } - assert.Equal(t, expectedBacklogs, point.Stats[0].Backlogs) + assert.Equal(t, expectedBacklogs, payloads["service"].Stats[0].Backlogs) } type noOpTransport struct{} @@ -264,7 +416,21 @@ func BenchmarkSetCheckpoint(b *testing.B) { client := &http.Client{ Transport: &noOpTransport{}, } - p := NewProcessor(&statsd.NoOpClient{}, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, client) + p := NewProcessor(&statsd.NoOpClientDirect{}, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, client) + p.Start() + for i := 0; i < b.N; i++ { + p.SetCheckpointWithParams(context.Background(), options.CheckpointParams{PayloadSize: 1000}, "type:edge-1", "direction:in", "type:kafka", "topic:topic1", "group:group1") + } + p.Stop() +} + +func BenchmarkSetCheckpointProcessTags(b *testing.B) { + processtags.Reload() + + client := &http.Client{ + Transport: &noOpTransport{}, + } + p := NewProcessor(&statsd.NoOpClientDirect{}, "env", "service", "v1", &url.URL{Scheme: "http", Host: "agent-address"}, client) p.Start() for i := 0; i < b.N; i++ { p.SetCheckpointWithParams(context.Background(), options.CheckpointParams{PayloadSize: 1000}, "type:edge-1", "direction:in", "type:kafka", "topic:topic1", "group:group1") diff --git a/internal/datastreams/transport.go b/internal/datastreams/transport.go index cd4c6b4451..d03bb3e797 100644 --- a/internal/datastreams/transport.go +++ b/internal/datastreams/transport.go @@ -15,7 +15,7 @@ import ( "runtime" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/v2/internal" "github.com/tinylib/msgp/msgp" ) diff --git a/internal/datastreams/transport_test.go b/internal/datastreams/transport_test.go index 630a288f35..19f44acf13 100644 --- a/internal/datastreams/transport_test.go +++ b/internal/datastreams/transport_test.go @@ -27,7 +27,6 @@ func TestHTTPTransport(t *testing.T) { Start: 2, Duration: 10, Stats: []StatsPoint{{ - Service: "service-1", EdgeTags: []string{"edge-1"}, Hash: 1, ParentHash: 2, diff --git a/internal/env.go b/internal/env.go index 62704b7792..bcb45267c2 100644 --- a/internal/env.go +++ b/internal/env.go @@ -6,39 +6,50 @@ package internal import ( - "os" + "net" "strconv" "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // BoolEnv returns the parsed boolean value of an environment variable, or // def otherwise. func BoolEnv(key string, def bool) bool { - vv, ok := os.LookupEnv(key) + vv, ok := BoolEnvNoDefault(key) if !ok { return def } + return vv +} + +// BoolEnvNoDefault returns the parsed boolean value of an environment variable. The second returned bool signals if +// the value was set and was a correct boolean value. +func BoolEnvNoDefault(key string) (bool, bool) { + vv, ok := env.Lookup(key) + if !ok { + return false, false + } v, err := strconv.ParseBool(vv) if err != nil { - log.Warn("Non-boolean value for env var %s, defaulting to %t. Parse failed with error: %v", key, def, err) - return def + log.Warn("Non-boolean value for env var %s. Parse failed with error: %v", key, err.Error()) + return false, false } - return v + return v, true } // IntEnv returns the parsed int value of an environment variable, or // def otherwise. func IntEnv(key string, def int) int { - vv, ok := os.LookupEnv(key) + vv, ok := env.Lookup(key) if !ok { return def } v, err := strconv.Atoi(vv) if err != nil { - log.Warn("Non-integer value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err) + log.Warn("Non-integer value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err.Error()) return def } return v @@ -47,18 +58,49 @@ func IntEnv(key string, def int) int { // DurationEnv returns the parsed duration value of an environment variable, or // def otherwise. func DurationEnv(key string, def time.Duration) time.Duration { - vv, ok := os.LookupEnv(key) + vv, ok := env.Lookup(key) if !ok { return def } v, err := time.ParseDuration(vv) if err != nil { - log.Warn("Non-duration value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err) + log.Warn("Non-duration value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err.Error()) + return def + } + return v +} + +// DurationEnvWithUnit returns the parsed duration value of an environment +// variable with the specified unit, or def otherwise. +func DurationEnvWithUnit(key string, unit string, def time.Duration) time.Duration { + vv, ok := env.Lookup(key) + if !ok { + return def + } + v, err := time.ParseDuration(vv + unit) + if err != nil { + log.Warn("Non-duration value for env var %s, defaulting to %d. Parse failed with error: %v", key, def, err.Error()) return def } return v } +// IPEnv returns the valid IP value of an environment variable, or def otherwise. +func IPEnv(key string, def net.IP) net.IP { + vv, ok := env.Lookup(key) + if !ok { + return def + } + + ip := net.ParseIP(vv) + if ip == nil { + log.Warn("Non-IP value for env var %s, defaulting to %s", key, def.String()) + return def + } + + return ip +} + // ForEachStringTag runs fn on every key val pair encountered in str. // str may contain multiple key val pairs separated by either space // or comma (but not a mixture of both), and each key val pair is separated by a delimiter. @@ -96,13 +138,13 @@ func ParseTagString(str string) map[string]string { // FloatEnv returns the parsed float64 value of an environment variable, // or def otherwise. func FloatEnv(key string, def float64) float64 { - env, ok := os.LookupEnv(key) + env, ok := env.Lookup(key) if !ok { return def } v, err := strconv.ParseFloat(env, 64) if err != nil { - log.Warn("Non-float value for env var %s, defaulting to %f. Parse failed with error: %v", key, def, err) + log.Warn("Non-float value for env var %s, defaulting to %f. Parse failed with error: %v", key, def, err.Error()) return def } return v @@ -116,3 +158,8 @@ func BoolVal(val string, def bool) bool { } return v } + +// ExternalEnvironment returns the value of the DD_EXTERNAL_ENV environment variable. +func ExternalEnvironment() string { + return env.Get("DD_EXTERNAL_ENV") +} diff --git a/internal/env/env.go b/internal/env/env.go new file mode 100644 index 0000000000..7734187dbf --- /dev/null +++ b/internal/env/env.go @@ -0,0 +1,90 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package env + +import ( + "os" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// Get is a wrapper around env.Get that validates the environment variable +// against a list of supported environment variables. +// +// If the environment variable has aliases, the function will also check the aliases +// and return the value of the first alias that is set. +// +// When a environment variable is not supported because it is not +// listed in the list of supported environment variables, the function will log an error +// and behave as if the environment variable was not set. +// +// In testing mode, the reader will automatically add the environment variable +// to the configuration file. +func Get(name string) string { + if !verifySupportedConfiguration(name) { + return "" + } + + if v := os.Getenv(name); v != "" { + return v + } + + for _, alias := range keyAliases[name] { + if v := os.Getenv(alias); v != "" { + return v + } + } + + return "" +} + +// Lookup is a wrapper around os.LookupEnv that validates the environment variable +// against a list of supported environment variables. +// +// If the environment variable has aliases, the function will also check the aliases. +// and return the value of the first alias that is set. +// +// When a environment variable is not supported because it is not +// listed in the list of supported environment variables, the function will log an error +// and behave as if the environment variable was not set. +// +// In testing mode, the reader will automatically add the environment variable +// to the configuration file. +func Lookup(name string) (string, bool) { + if !verifySupportedConfiguration(name) { + return "", false + } + + if v, ok := os.LookupEnv(name); ok { + return v, true + } + + for _, alias := range keyAliases[name] { + if v, ok := os.LookupEnv(alias); ok { + return v, true + } + } + + return "", false +} + +func verifySupportedConfiguration(name string) bool { + if strings.HasPrefix(name, "DD_") || strings.HasPrefix(name, "OTEL_") { + if _, ok := SupportedConfigurations[name]; !ok { + if testing.Testing() { + addSupportedConfigurationToFile(name) + } + + log.Error("config: usage of a unlisted environment variable: %s", name) + + return false + } + } + + return true +} diff --git a/internal/env/env_test.go b/internal/env/env_test.go new file mode 100644 index 0000000000..57d1a30a5e --- /dev/null +++ b/internal/env/env_test.go @@ -0,0 +1,78 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package env + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestVerifySupportedConfiguration(t *testing.T) { + // Known configuration - with alias + + t.Run("Known configuration - with alias", func(t *testing.T) { + res, ok := Lookup("DD_API_KEY") + require.False(t, ok) + require.Equal(t, "", res) + + res, ok = Lookup("DD-API-KEY") + require.False(t, ok) + require.Equal(t, "", res) + + t.Setenv("DD-API-KEY", "VALUE") + res, ok = Lookup("DD-API-KEY") + require.True(t, ok) + require.Equal(t, "VALUE", res) + + res = Get("DD-API-KEY") + require.Equal(t, "VALUE", res) + + res, ok = Lookup("DD_API_KEY") + require.True(t, ok) + require.Equal(t, "VALUE", res) + + res = Get("DD_API_KEY") + require.Equal(t, "VALUE", res) + }) + + t.Run("Known configuration - without alias", func(t *testing.T) { + t.Setenv("DD_SERVICE", "TEST_SERVICE") + res, ok := Lookup("DD_SERVICE") + require.True(t, ok) + require.Equal(t, "TEST_SERVICE", res) + + res = Get("DD_SERVICE") + require.Equal(t, "TEST_SERVICE", res) + }) + + t.Run("unknown configuration", func(t *testing.T) { + // Unknown configuration that would be added to the supported configurations file. + t.Setenv("DD_UNKNOWN_CONFIGURATION_KEY", "VALUE") + res, ok := Lookup("DD_UNKNOWN_CONFIGURATION_KEY") + require.False(t, ok) + require.Empty(t, res) + + res = Get("DD_UNKNOWN_CONFIGURATION_KEY") + require.Empty(t, res) + + // Check that the env var has been added to the supported configurations file + // acquire lock to read the file and remove the new key to avoid polluting + // results with a false positive. + mu.Lock() + defer mu.Unlock() + + cfg, err := readSupportedConfigurations(getConfigFilePath()) + require.NoError(t, err) + require.Contains(t, cfg.SupportedConfigurations, "DD_UNKNOWN_CONFIGURATION_KEY") + require.Equal(t, []string{"A"}, cfg.SupportedConfigurations["DD_UNKNOWN_CONFIGURATION_KEY"]) + + // Remove the env var from the supported configurations file + delete(cfg.SupportedConfigurations, "DD_UNKNOWN_CONFIGURATION_KEY") + err = writeSupportedConfigurations(getConfigFilePath(), cfg) + require.NoError(t, err) + }) +} diff --git a/internal/env/supported_configurations.gen.go b/internal/env/supported_configurations.gen.go new file mode 100644 index 0000000000..c81a14fde3 --- /dev/null +++ b/internal/env/supported_configurations.gen.go @@ -0,0 +1,237 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package env + +// Code generated by github.com/DataDog/dd-trace-go/v2/scripts/configinverter. DO NOT EDIT. + +// SupportedConfigurations is a map of supported configuration keys. +var SupportedConfigurations = map[string]struct{}{ + "DD_ACTION_EXECUTION_ID": {}, + "DD_AGENT_HOST": {}, + "DD_API_KEY": {}, + "DD_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE": {}, + "DD_API_SECURITY_ENABLED": {}, + "DD_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS": {}, + "DD_API_SECURITY_PROXY_SAMPLE_RATE": {}, + "DD_API_SECURITY_REQUEST_SAMPLE_RATE": {}, + "DD_API_SECURITY_SAMPLE_DELAY": {}, + "DD_APM_TRACING_ENABLED": {}, + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT": {}, + "DD_APPSEC_ENABLED": {}, + "DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML": {}, + "DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON": {}, + "DD_APPSEC_MAX_STACK_TRACE_DEPTH": {}, + "DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP": {}, + "DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP": {}, + "DD_APPSEC_RASP_ENABLED": {}, + "DD_APPSEC_RULES": {}, + "DD_APPSEC_SCA_ENABLED": {}, + "DD_APPSEC_STACK_TRACE_ENABLE": {}, + "DD_APPSEC_TRACE_RATE_LIMIT": {}, + "DD_APPSEC_WAF_TIMEOUT": {}, + "DD_APP_KEY": {}, + "DD_CIVISIBILITY_AGENTLESS_ENABLED": {}, + "DD_CIVISIBILITY_AGENTLESS_URL": {}, + "DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER": {}, + "DD_CIVISIBILITY_ENABLED": {}, + "DD_CIVISIBILITY_FLAKY_RETRY_COUNT": {}, + "DD_CIVISIBILITY_FLAKY_RETRY_ENABLED": {}, + "DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED": {}, + "DD_CIVISIBILITY_INTERNAL_PARALLEL_EARLY_FLAKE_DETECTION_ENABLED": {}, + "DD_CIVISIBILITY_LOGS_ENABLED": {}, + "DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED": {}, + "DD_CIVISIBILITY_TOTAL_FLAKY_RETRY_COUNT": {}, + "DD_CUSTOM_TRACE_ID": {}, + "DD_DATA_STREAMS_ENABLED": {}, + "DD_DBM_PROPAGATION_MODE": {}, + "DD_DOGSTATSD_HOST": {}, + "DD_DOGSTATSD_PORT": {}, + "DD_DYNAMIC_INSTRUMENTATION_ENABLED": {}, + "DD_ENV": {}, + "DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED": {}, + "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED": {}, + "DD_EXTERNAL_ENV": {}, + "DD_GIT_BRANCH": {}, + "DD_GIT_COMMIT_AUTHOR_DATE": {}, + "DD_GIT_COMMIT_AUTHOR_EMAIL": {}, + "DD_GIT_COMMIT_AUTHOR_NAME": {}, + "DD_GIT_COMMIT_COMMITTER_DATE": {}, + "DD_GIT_COMMIT_COMMITTER_EMAIL": {}, + "DD_GIT_COMMIT_COMMITTER_NAME": {}, + "DD_GIT_COMMIT_MESSAGE": {}, + "DD_GIT_COMMIT_SHA": {}, + "DD_GIT_PULL_REQUEST_BASE_BRANCH": {}, + "DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA": {}, + "DD_GIT_REPOSITORY_URL": {}, + "DD_GIT_TAG": {}, + "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": {}, + "DD_HAPROXY_SPOA_HOST": {}, + "DD_HAPROXY_SPOA_PORT": {}, + "DD_HOSTNAME": {}, + "DD_INSTRUMENTATION_INSTALL_ID": {}, + "DD_INSTRUMENTATION_INSTALL_TIME": {}, + "DD_INSTRUMENTATION_INSTALL_TYPE": {}, + "DD_INSTRUMENTATION_TELEMETRY_ENABLED": {}, + "DD_KEY": {}, + "DD_LLMOBS_AGENTLESS_ENABLED": {}, + "DD_LLMOBS_ENABLED": {}, + "DD_LLMOBS_ML_APP": {}, + "DD_LLMOBS_PROJECT_NAME": {}, + "DD_LOGGING_RATE": {}, + "DD_PIPELINE_EXECUTION_ID": {}, + "DD_PROFILING_AGENTLESS": {}, + "DD_PROFILING_CODE_HOTSPOTS_COLLECTION_ENABLED": {}, + "DD_PROFILING_DEBUG_COMPRESSION_SETTINGS": {}, + "DD_PROFILING_DELTA": {}, + "DD_PROFILING_ENABLED": {}, + "DD_PROFILING_ENDPOINT_COLLECTION_ENABLED": {}, + "DD_PROFILING_ENDPOINT_COUNT_ENABLED": {}, + "DD_PROFILING_EXECUTION_TRACE_ENABLED": {}, + "DD_PROFILING_EXECUTION_TRACE_LIMIT_BYTES": {}, + "DD_PROFILING_EXECUTION_TRACE_PERIOD": {}, + "DD_PROFILING_FLUSH_ON_EXIT": {}, + "DD_PROFILING_OUTPUT_DIR": {}, + "DD_PROFILING_UPLOAD_TIMEOUT": {}, + "DD_PROFILING_URL": {}, + "DD_PROFILING_WAIT_PROFILE": {}, + "DD_PROFILING_WAIT_PROFILE_MAX_GOROUTINES": {}, + "DD_RC_TUF_ROOT": {}, + "DD_REMOTE_CONFIGURATION_ENABLED": {}, + "DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS": {}, + "DD_REQUEST_MIRROR_HEALTHCHECK_ADDR": {}, + "DD_REQUEST_MIRROR_LISTEN_ADDR": {}, + "DD_RUNTIME_METRICS_ENABLED": {}, + "DD_RUNTIME_METRICS_V2_ENABLED": {}, + "DD_SERVICE": {}, + "DD_SERVICE_EXTENSION_HEALTHCHECK_PORT": {}, + "DD_SERVICE_EXTENSION_HOST": {}, + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE": {}, + "DD_SERVICE_EXTENSION_PORT": {}, + "DD_SERVICE_EXTENSION_TLS": {}, + "DD_SERVICE_EXTENSION_TLS_CERT_FILE": {}, + "DD_SERVICE_EXTENSION_TLS_KEY_FILE": {}, + "DD_SERVICE_MAPPING": {}, + "DD_SITE": {}, + "DD_SPAN_SAMPLING_RULES": {}, + "DD_SPAN_SAMPLING_RULES_FILE": {}, + "DD_TAGS": {}, + "DD_TELEMETRY_DEBUG": {}, + "DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED": {}, + "DD_TELEMETRY_HEARTBEAT_INTERVAL": {}, + "DD_TELEMETRY_LOG_COLLECTION_ENABLED": {}, + "DD_TELEMETRY_METRICS_ENABLED": {}, + "DD_TEST_AGENT_HOST": {}, + "DD_TEST_AGENT_PORT": {}, + "DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES": {}, + "DD_TEST_MANAGEMENT_ENABLED": {}, + "DD_TEST_OPTIMIZATION_ENV_DATA_FILE": {}, + "DD_TEST_SESSION_NAME": {}, + "DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED": {}, + "DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED": {}, + "DD_TRACE_ABANDONED_SPAN_TIMEOUT": {}, + "DD_TRACE_AGENT_PORT": {}, + "DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED": {}, + "DD_TRACE_AGENT_URL": {}, + "DD_TRACE_ANALYTICS_ENABLED": {}, + "DD_TRACE_AWS_ANALYTICS_ENABLED": {}, + "DD_TRACE_BAGGAGE_TAG_KEYS": {}, + "DD_TRACE_BUNTDB_ANALYTICS_ENABLED": {}, + "DD_TRACE_CHI_ANALYTICS_ENABLED": {}, + "DD_TRACE_CLIENT_HOSTNAME_COMPAT": {}, + "DD_TRACE_CLIENT_IP_ENABLED": {}, + "DD_TRACE_CLIENT_IP_HEADER": {}, + "DD_TRACE_CONSUL_ANALYTICS_ENABLED": {}, + "DD_TRACE_DEBUG": {}, + "DD_TRACE_DEBUG_ABANDONED_SPANS": {}, + "DD_TRACE_DEBUG_SEELOG_WORKAROUND": {}, + "DD_TRACE_ECHO_ANALYTICS_ENABLED": {}, + "DD_TRACE_ELASTIC_ANALYTICS_ENABLED": {}, + "DD_TRACE_ENABLED": {}, + "DD_TRACE_FASTHTTP_ANALYTICS_ENABLED": {}, + "DD_TRACE_FEATURES": {}, + "DD_TRACE_FIBER_ANALYTICS_ENABLED": {}, + "DD_TRACE_GCP_PUBSUB_ANALYTICS_ENABLED": {}, + "DD_TRACE_GIN_ANALYTICS_ENABLED": {}, + "DD_TRACE_GIT_METADATA_ENABLED": {}, + "DD_TRACE_GOCQL_ANALYTICS_ENABLED": {}, + "DD_TRACE_GOCQL_COMPAT": {}, + "DD_TRACE_GOJI_ANALYTICS_ENABLED": {}, + "DD_TRACE_GOOGLE_API_ANALYTICS_ENABLED": {}, + "DD_TRACE_GOPG_ANALYTICS_ENABLED": {}, + "DD_TRACE_GQLGEN_ANALYTICS_ENABLED": {}, + "DD_TRACE_GRAPHQL_ANALYTICS_ENABLED": {}, + "DD_TRACE_GRAPHQL_ERROR_EXTENSIONS": {}, + "DD_TRACE_GRPC_ANALYTICS_ENABLED": {}, + "DD_TRACE_HEADER_TAGS": {}, + "DD_TRACE_HTTPROUTER_ANALYTICS_ENABLED": {}, + "DD_TRACE_HTTPTREEMUX_ANALYTICS_ENABLED": {}, + "DD_TRACE_HTTP_ANALYTICS_ENABLED": {}, + "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES": {}, + "DD_TRACE_HTTP_CLIENT_RESOURCE_NAME_QUANTIZE": {}, + "DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING": {}, + "DD_TRACE_HTTP_HANDLER_RESOURCE_NAME_QUANTIZE": {}, + "DD_TRACE_HTTP_SERVER_ERROR_STATUSES": {}, + "DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED": {}, + "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED": {}, + "DD_TRACE_KAFKA_ANALYTICS_ENABLED": {}, + "DD_TRACE_LEVELDB_ANALYTICS_ENABLED": {}, + "DD_TRACE_LOGRUS_ANALYTICS_ENABLED": {}, + "DD_TRACE_LOG_DIRECTORY": {}, + "DD_TRACE_MEMCACHE_ANALYTICS_ENABLED": {}, + "DD_TRACE_MGO_ANALYTICS_ENABLED": {}, + "DD_TRACE_MONGO_ANALYTICS_ENABLED": {}, + "DD_TRACE_MUX_ANALYTICS_ENABLED": {}, + "DD_TRACE_NEGRONI_ANALYTICS_ENABLED": {}, + "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": {}, + "DD_TRACE_PARTIAL_FLUSH_ENABLED": {}, + "DD_TRACE_PARTIAL_FLUSH_MIN_SPANS": {}, + "DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED": {}, + "DD_TRACE_PEER_SERVICE_MAPPING": {}, + "DD_TRACE_PROPAGATION_EXTRACT_FIRST": {}, + "DD_TRACE_PROPAGATION_STYLE": {}, + "DD_TRACE_PROPAGATION_STYLE_EXTRACT": {}, + "DD_TRACE_PROPAGATION_STYLE_INJECT": {}, + "DD_TRACE_RATE_LIMIT": {}, + "DD_TRACE_REDIGO_ANALYTICS_ENABLED": {}, + "DD_TRACE_REDIS_ANALYTICS_ENABLED": {}, + "DD_TRACE_REDIS_RAW_COMMAND": {}, + "DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED": {}, + "DD_TRACE_REPORT_HOSTNAME": {}, + "DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT": {}, + "DD_TRACE_RESOURCE_RENAMING_ENABLED": {}, + "DD_TRACE_RESTFUL_ANALYTICS_ENABLED": {}, + "DD_TRACE_SAMPLE_RATE": {}, + "DD_TRACE_SAMPLING_RULES": {}, + "DD_TRACE_SAMPLING_RULES_FILE": {}, + "DD_TRACE_SARAMA_ANALYTICS_ENABLED": {}, + "DD_TRACE_SOURCE_HOSTNAME": {}, + "DD_TRACE_SPAN_ATTRIBUTE_SCHEMA": {}, + "DD_TRACE_SQL_ANALYTICS_ENABLED": {}, + "DD_TRACE_SQL_COMMENT_INJECTION_MODE": {}, + "DD_TRACE_STARTUP_LOGS": {}, + "DD_TRACE_STATS_COMPUTATION_ENABLED": {}, + "DD_TRACE_TWIRP_ANALYTICS_ENABLED": {}, + "DD_TRACE_VALKEY_ANALYTICS_ENABLED": {}, + "DD_TRACE_VALKEY_RAW_COMMAND": {}, + "DD_TRACE_VAULT_ANALYTICS_ENABLED": {}, + "DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH": {}, + "DD_TRACE__ANALYTICS_ENABLED": {}, + "DD_VERSION": {}, + "OTEL_LOGS_EXPORTER": {}, + "OTEL_LOG_LEVEL": {}, + "OTEL_METRICS_EXPORTER": {}, + "OTEL_PROPAGATORS": {}, + "OTEL_RESOURCE_ATTRIBUTES": {}, + "OTEL_SERVICE_NAME": {}, + "OTEL_TRACES_EXPORTER": {}, + "OTEL_TRACES_SAMPLER": {}, + "OTEL_TRACES_SAMPLER_ARG": {}, +} + +// keyAliases maps aliases to supported configuration keys. +var keyAliases = map[string][]string{ + "DD_API_KEY": {"DD-API-KEY"}, +} diff --git a/internal/env/supported_configurations.go b/internal/env/supported_configurations.go new file mode 100644 index 0000000000..3950db2638 --- /dev/null +++ b/internal/env/supported_configurations.go @@ -0,0 +1,102 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package env + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "runtime" + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// SupportedConfiguration represents the content of the supported_configurations.json file. +type SupportedConfiguration struct { + SupportedConfigurations map[string][]string `json:"supportedConfigurations"` + Aliases map[string][]string `json:"aliases"` +} + +var ( + configFilePath string + once sync.Once + mu sync.Mutex + skipLock bool +) + +// getConfigFilePath returns the path to the supported_configurations.json file +// in the same directory as this Go file. The path is calculated once and cached. +// +// This needs to be computed, if we use a relative path, the file will be read +// from current working directory of the running process, not the directory of +// this file. +func getConfigFilePath() string { + once.Do(func() { + _, filename, _, _ := runtime.Caller(0) + dir := filepath.Dir(filename) + configFilePath = filepath.Join(dir, "supported_configurations.json") + }) + return configFilePath +} + +// addSupportedConfigurationToFile adds a supported configuration to the json file. +// it is used only in testing mode. +// +// It reads the json file, adds the new configuration, and writes it back to the file. +// The JSON output will have sorted keys since Go's json.Marshal sorts map keys automatically. +// +// When called with DD_CONFIG_INVERSION_UNKNOWN nothing is done as it is a special value +// used in a unit test to verify the behavior of unknown env var. +func addSupportedConfigurationToFile(name string) { + mu.Lock() + defer mu.Unlock() + + filePath := getConfigFilePath() + + cfg, err := readSupportedConfigurations(filePath) + if err != nil { + log.Error("config: failed to read supported configurations: %s", err.Error()) + return + } + + if _, ok := cfg.SupportedConfigurations[name]; !ok { + cfg.SupportedConfigurations[name] = []string{"A"} + } + + if err := writeSupportedConfigurations(filePath, cfg); err != nil { + log.Error("config: failed to write supported configurations: %s", err.Error()) + } +} + +func readSupportedConfigurations(filePath string) (*SupportedConfiguration, error) { + // read the json file + jsonFile, err := os.ReadFile(filePath) + if err != nil { + return nil, fmt.Errorf("failed to open supported_configurations.json: %w", err) + } + + var cfg SupportedConfiguration + if err := json.Unmarshal(jsonFile, &cfg); err != nil { + return nil, fmt.Errorf("failed to unmarshal SupportedConfiguration: %w", err) + } + return &cfg, nil +} + +func writeSupportedConfigurations(filePath string, cfg *SupportedConfiguration) error { + // write the json file - Go's json.MarshalIndent automatically sorts map keys + jsonFile, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return fmt.Errorf("failed to marshal SupportedConfiguration: %w", err) + } + + if err := os.WriteFile(filePath, jsonFile, 0644); err != nil { + return fmt.Errorf("failed to write supported_configurations.json: %w", err) + } + + return nil +} diff --git a/internal/env/supported_configurations.json b/internal/env/supported_configurations.json new file mode 100644 index 0000000000..5281253bee --- /dev/null +++ b/internal/env/supported_configurations.json @@ -0,0 +1,672 @@ +{ + "supportedConfigurations": { + "DD_ACTION_EXECUTION_ID": [ + "A" + ], + "DD_AGENT_HOST": [ + "A" + ], + "DD_API_KEY": [ + "A" + ], + "DD_API_SECURITY_DOWNSTREAM_REQUEST_BODY_ANALYSIS_SAMPLE_RATE": [ + "A" + ], + "DD_API_SECURITY_ENABLED": [ + "A" + ], + "DD_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS": [ + "A" + ], + "DD_API_SECURITY_PROXY_SAMPLE_RATE": [ + "A" + ], + "DD_API_SECURITY_REQUEST_SAMPLE_RATE": [ + "A" + ], + "DD_API_SECURITY_SAMPLE_DELAY": [ + "A" + ], + "DD_APM_TRACING_ENABLED": [ + "A" + ], + "DD_APPSEC_BODY_PARSING_SIZE_LIMIT": [ + "A" + ], + "DD_APPSEC_ENABLED": [ + "A" + ], + "DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML": [ + "A" + ], + "DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON": [ + "A" + ], + "DD_APPSEC_MAX_STACK_TRACE_DEPTH": [ + "A" + ], + "DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP": [ + "A" + ], + "DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP": [ + "A" + ], + "DD_APPSEC_RASP_ENABLED": [ + "A" + ], + "DD_APPSEC_RULES": [ + "A" + ], + "DD_APPSEC_SCA_ENABLED": [ + "A" + ], + "DD_APPSEC_STACK_TRACE_ENABLE": [ + "A" + ], + "DD_APPSEC_TRACE_RATE_LIMIT": [ + "A" + ], + "DD_APPSEC_WAF_TIMEOUT": [ + "A" + ], + "DD_APP_KEY": [ + "A" + ], + "DD_CIVISIBILITY_AGENTLESS_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_AGENTLESS_URL": [ + "A" + ], + "DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER": [ + "A" + ], + "DD_CIVISIBILITY_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_FLAKY_RETRY_COUNT": [ + "A" + ], + "DD_CIVISIBILITY_FLAKY_RETRY_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_IMPACTED_TESTS_DETECTION_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_INTERNAL_PARALLEL_EARLY_FLAKE_DETECTION_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_LOGS_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_SUBTEST_FEATURES_ENABLED": [ + "A" + ], + "DD_CIVISIBILITY_TOTAL_FLAKY_RETRY_COUNT": [ + "A" + ], + "DD_CUSTOM_TRACE_ID": [ + "A" + ], + "DD_DATA_STREAMS_ENABLED": [ + "A" + ], + "DD_DBM_PROPAGATION_MODE": [ + "A" + ], + "DD_DOGSTATSD_HOST": [ + "A" + ], + "DD_DOGSTATSD_PORT": [ + "A" + ], + "DD_DYNAMIC_INSTRUMENTATION_ENABLED": [ + "A" + ], + "DD_ENV": [ + "A" + ], + "DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED": [ + "A" + ], + "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED": [ + "A" + ], + "DD_EXTERNAL_ENV": [ + "A" + ], + "DD_GIT_BRANCH": [ + "A" + ], + "DD_GIT_COMMIT_AUTHOR_DATE": [ + "A" + ], + "DD_GIT_COMMIT_AUTHOR_EMAIL": [ + "A" + ], + "DD_GIT_COMMIT_AUTHOR_NAME": [ + "A" + ], + "DD_GIT_COMMIT_COMMITTER_DATE": [ + "A" + ], + "DD_GIT_COMMIT_COMMITTER_EMAIL": [ + "A" + ], + "DD_GIT_COMMIT_COMMITTER_NAME": [ + "A" + ], + "DD_GIT_COMMIT_MESSAGE": [ + "A" + ], + "DD_GIT_COMMIT_SHA": [ + "A" + ], + "DD_GIT_PULL_REQUEST_BASE_BRANCH": [ + "A" + ], + "DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA": [ + "A" + ], + "DD_GIT_REPOSITORY_URL": [ + "A" + ], + "DD_GIT_TAG": [ + "A" + ], + "DD_HAPROXY_SPOA_HEALTHCHECK_PORT": [ + "A" + ], + "DD_HAPROXY_SPOA_HOST": [ + "A" + ], + "DD_HAPROXY_SPOA_PORT": [ + "A" + ], + "DD_HOSTNAME": [ + "A" + ], + "DD_INSTRUMENTATION_INSTALL_ID": [ + "A" + ], + "DD_INSTRUMENTATION_INSTALL_TIME": [ + "A" + ], + "DD_INSTRUMENTATION_INSTALL_TYPE": [ + "A" + ], + "DD_INSTRUMENTATION_TELEMETRY_ENABLED": [ + "A" + ], + "DD_KEY": [ + "A" + ], + "DD_LLMOBS_AGENTLESS_ENABLED": [ + "A" + ], + "DD_LLMOBS_ENABLED": [ + "A" + ], + "DD_LLMOBS_ML_APP": [ + "A" + ], + "DD_LLMOBS_PROJECT_NAME": [ + "A" + ], + "DD_LOGGING_RATE": [ + "A" + ], + "DD_PIPELINE_EXECUTION_ID": [ + "A" + ], + "DD_PROFILING_AGENTLESS": [ + "A" + ], + "DD_PROFILING_CODE_HOTSPOTS_COLLECTION_ENABLED": [ + "A" + ], + "DD_PROFILING_DEBUG_COMPRESSION_SETTINGS": [ + "A" + ], + "DD_PROFILING_DELTA": [ + "A" + ], + "DD_PROFILING_ENABLED": [ + "A" + ], + "DD_PROFILING_ENDPOINT_COLLECTION_ENABLED": [ + "A" + ], + "DD_PROFILING_ENDPOINT_COUNT_ENABLED": [ + "A" + ], + "DD_PROFILING_EXECUTION_TRACE_ENABLED": [ + "A" + ], + "DD_PROFILING_EXECUTION_TRACE_LIMIT_BYTES": [ + "A" + ], + "DD_PROFILING_EXECUTION_TRACE_PERIOD": [ + "A" + ], + "DD_PROFILING_FLUSH_ON_EXIT": [ + "A" + ], + "DD_PROFILING_OUTPUT_DIR": [ + "A" + ], + "DD_PROFILING_UPLOAD_TIMEOUT": [ + "A" + ], + "DD_PROFILING_URL": [ + "A" + ], + "DD_PROFILING_WAIT_PROFILE": [ + "A" + ], + "DD_PROFILING_WAIT_PROFILE_MAX_GOROUTINES": [ + "A" + ], + "DD_RC_TUF_ROOT": [ + "A" + ], + "DD_REMOTE_CONFIGURATION_ENABLED": [ + "A" + ], + "DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS": [ + "A" + ], + "DD_REQUEST_MIRROR_HEALTHCHECK_ADDR": [ + "A" + ], + "DD_REQUEST_MIRROR_LISTEN_ADDR": [ + "A" + ], + "DD_RUNTIME_METRICS_ENABLED": [ + "A" + ], + "DD_RUNTIME_METRICS_V2_ENABLED": [ + "A" + ], + "DD_SERVICE": [ + "A" + ], + "DD_SERVICE_EXTENSION_HEALTHCHECK_PORT": [ + "A" + ], + "DD_SERVICE_EXTENSION_HOST": [ + "A" + ], + "DD_SERVICE_EXTENSION_OBSERVABILITY_MODE": [ + "A" + ], + "DD_SERVICE_EXTENSION_PORT": [ + "A" + ], + "DD_SERVICE_EXTENSION_TLS": [ + "A" + ], + "DD_SERVICE_EXTENSION_TLS_CERT_FILE": [ + "A" + ], + "DD_SERVICE_EXTENSION_TLS_KEY_FILE": [ + "A" + ], + "DD_SERVICE_MAPPING": [ + "A" + ], + "DD_SITE": [ + "A" + ], + "DD_SPAN_SAMPLING_RULES": [ + "A" + ], + "DD_SPAN_SAMPLING_RULES_FILE": [ + "A" + ], + "DD_TAGS": [ + "A" + ], + "DD_TELEMETRY_DEBUG": [ + "A" + ], + "DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED": [ + "A" + ], + "DD_TELEMETRY_HEARTBEAT_INTERVAL": [ + "A" + ], + "DD_TELEMETRY_LOG_COLLECTION_ENABLED": [ + "A" + ], + "DD_TELEMETRY_METRICS_ENABLED": [ + "A" + ], + "DD_TEST_AGENT_HOST": [ + "A" + ], + "DD_TEST_AGENT_PORT": [ + "A" + ], + "DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES": [ + "A" + ], + "DD_TEST_MANAGEMENT_ENABLED": [ + "A" + ], + "DD_TEST_OPTIMIZATION_ENV_DATA_FILE": [ + "A" + ], + "DD_TEST_SESSION_NAME": [ + "A" + ], + "DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED": [ + "A" + ], + "DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED": [ + "A" + ], + "DD_TRACE_ABANDONED_SPAN_TIMEOUT": [ + "A" + ], + "DD_TRACE_AGENT_PORT": [ + "A" + ], + "DD_TRACE_AGENT_URL": [ + "A" + ], + "DD_TRACE_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_AWS_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_BAGGAGE_TAG_KEYS": [ + "A" + ], + "DD_TRACE_BUNTDB_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_CHI_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_CLIENT_HOSTNAME_COMPAT": [ + "A" + ], + "DD_TRACE_CLIENT_IP_ENABLED": [ + "A" + ], + "DD_TRACE_CLIENT_IP_HEADER": [ + "A" + ], + "DD_TRACE_CONSUL_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_DEBUG": [ + "A" + ], + "DD_TRACE_DEBUG_ABANDONED_SPANS": [ + "A" + ], + "DD_TRACE_DEBUG_SEELOG_WORKAROUND": [ + "A" + ], + "DD_TRACE_ECHO_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_ELASTIC_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_ENABLED": [ + "A" + ], + "DD_TRACE_FASTHTTP_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_FEATURES": [ + "A" + ], + "DD_TRACE_FIBER_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GCP_PUBSUB_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GIN_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GIT_METADATA_ENABLED": [ + "A" + ], + "DD_TRACE_GOCQL_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GOCQL_COMPAT": [ + "A" + ], + "DD_TRACE_GOJI_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GOOGLE_API_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GOPG_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GQLGEN_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GRAPHQL_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_GRAPHQL_ERROR_EXTENSIONS": [ + "A" + ], + "DD_TRACE_GRPC_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_HEADER_TAGS": [ + "A" + ], + "DD_TRACE_HTTPROUTER_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_HTTPTREEMUX_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_HTTP_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_HTTP_CLIENT_ERROR_STATUSES": [ + "A" + ], + "DD_TRACE_HTTP_CLIENT_RESOURCE_NAME_QUANTIZE": [ + "A" + ], + "DD_TRACE_HTTP_CLIENT_TAG_QUERY_STRING": [ + "A" + ], + "DD_TRACE_HTTP_HANDLER_RESOURCE_NAME_QUANTIZE": [ + "A" + ], + "DD_TRACE_HTTP_SERVER_ERROR_STATUSES": [ + "A" + ], + "DD_TRACE_HTTP_URL_QUERY_STRING_DISABLED": [ + "A" + ], + "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED": [ + "A" + ], + "DD_TRACE_KAFKA_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_LEVELDB_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_LOGRUS_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_LOG_DIRECTORY": [ + "A" + ], + "DD_TRACE_MEMCACHE_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_MGO_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_MONGO_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_MUX_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_NEGRONI_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP": [ + "A" + ], + "DD_TRACE_PARTIAL_FLUSH_ENABLED": [ + "A" + ], + "DD_TRACE_PARTIAL_FLUSH_MIN_SPANS": [ + "A" + ], + "DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED": [ + "A" + ], + "DD_TRACE_PEER_SERVICE_MAPPING": [ + "A" + ], + "DD_TRACE_PROPAGATION_EXTRACT_FIRST": [ + "A" + ], + "DD_TRACE_PROPAGATION_STYLE": [ + "A" + ], + "DD_TRACE_PROPAGATION_STYLE_EXTRACT": [ + "A" + ], + "DD_TRACE_PROPAGATION_STYLE_INJECT": [ + "A" + ], + "DD_TRACE_RATE_LIMIT": [ + "A" + ], + "DD_TRACE_REDIGO_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_REDIS_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_REDIS_RAW_COMMAND": [ + "A" + ], + "DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED": [ + "A" + ], + "DD_TRACE_REPORT_HOSTNAME": [ + "A" + ], + "DD_TRACE_RESOURCE_RENAMING_ALWAYS_SIMPLIFIED_ENDPOINT": [ + "A" + ], + "DD_TRACE_RESOURCE_RENAMING_ENABLED": [ + "A" + ], + "DD_TRACE_RESTFUL_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_SAMPLE_RATE": [ + "A" + ], + "DD_TRACE_SAMPLING_RULES": [ + "A" + ], + "DD_TRACE_SAMPLING_RULES_FILE": [ + "A" + ], + "DD_TRACE_SARAMA_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_SOURCE_HOSTNAME": [ + "A" + ], + "DD_TRACE_SPAN_ATTRIBUTE_SCHEMA": [ + "A" + ], + "DD_TRACE_SQL_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_SQL_COMMENT_INJECTION_MODE": [ + "A" + ], + "DD_TRACE_STARTUP_LOGS": [ + "A" + ], + "DD_TRACE_STATS_COMPUTATION_ENABLED": [ + "A" + ], + "DD_TRACE_TWIRP_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED": [ + "A" + ], + "DD_TRACE_VALKEY_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_VALKEY_RAW_COMMAND": [ + "A" + ], + "DD_TRACE_VAULT_ANALYTICS_ENABLED": [ + "A" + ], + "DD_TRACE_V1_PAYLOAD_FORMAT_ENABLED": [ + "A" + ], + "DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH": [ + "A" + ], + "DD_TRACE__ANALYTICS_ENABLED": [ + "A" + ], + "DD_VERSION": [ + "A" + ], + "OTEL_LOGS_EXPORTER": [ + "A" + ], + "OTEL_LOG_LEVEL": [ + "A" + ], + "OTEL_METRICS_EXPORTER": [ + "A" + ], + "OTEL_PROPAGATORS": [ + "A" + ], + "OTEL_RESOURCE_ATTRIBUTES": [ + "A" + ], + "OTEL_SERVICE_NAME": [ + "A" + ], + "OTEL_TRACES_EXPORTER": [ + "A" + ], + "OTEL_TRACES_SAMPLER": [ + "A" + ], + "OTEL_TRACES_SAMPLER_ARG": [ + "A" + ] + }, + "aliases": { + "DD_API_KEY": [ + "DD-API-KEY" + ] + } +} \ No newline at end of file diff --git a/internal/exectracetest/exectrace_test.go b/internal/exectracetest/exectrace_test.go index a80ea18c69..00b7f6688f 100644 --- a/internal/exectracetest/exectrace_test.go +++ b/internal/exectracetest/exectrace_test.go @@ -27,7 +27,7 @@ import ( "github.com/google/pprof/profile" exptrace "golang.org/x/exp/trace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" ) type discardLogger struct{} @@ -143,7 +143,7 @@ func TestSpanDoubleFinish(t *testing.T) { // TODO: move database/sql tests here? likely requires copying over contrib/sql/internal.MockDriver func TestExecutionTraceSpans(t *testing.T) { - var root, child tracer.Span + var root, child *tracer.Span _, execTrace := collectTestData(t, func() { tracer.Start(tracer.WithLogger(discardLogger{})) defer tracer.Stop() diff --git a/internal/exectracetest/go.mod b/internal/exectracetest/go.mod index 3de8625361..c5b1511ec5 100644 --- a/internal/exectracetest/go.mod +++ b/internal/exectracetest/go.mod @@ -1,47 +1,94 @@ -module gopkg.in/DataDog/dd-trace-go.v1/internal/exectracetest +module github.com/DataDog/dd-trace-go/internal/exectracetest/v2 -go 1.22.0 +go 1.24.0 require ( - github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db github.com/mattn/go-sqlite3 v1.14.18 - golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 - gopkg.in/DataDog/dd-trace-go.v1 v1.64.0 + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 ) require ( - github.com/DataDog/appsec-internal-go v1.8.0 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 // indirect - github.com/DataDog/datadog-go/v5 v5.3.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.4.0 // indirect - github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 // indirect - github.com/ebitengine/purego v0.6.0-alpha.5 // indirect - github.com/google/uuid v1.5.0 // indirect - github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 // indirect - github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/outcaste-io/ristretto v0.2.3 // indirect - github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 // indirect + github.com/philhofer/fwd v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect - github.com/tinylib/msgp v1.2.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.22.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) -// use local version of dd-trace-go -replace gopkg.in/DataDog/dd-trace-go.v1 => ../.. +replace github.com/DataDog/dd-trace-go/contrib/database/sql/v2 => ../../contrib/database/sql + +replace github.com/DataDog/dd-trace-go/v2 => ../.. diff --git a/internal/exectracetest/go.sum b/internal/exectracetest/go.sum index 6554dc855a..e87cd1062d 100644 --- a/internal/exectracetest/go.sum +++ b/internal/exectracetest/go.sum @@ -1,105 +1,152 @@ -github.com/DataDog/appsec-internal-go v1.8.0 h1:1Tfn3LEogntRqZtf88twSApOCAAO3V+NILYhuQIo4J4= -github.com/DataDog/appsec-internal-go v1.8.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 h1:bUMSNsw1iofWiju9yc1f+kBd33E3hMJtq9GuU602Iy8= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0 h1:LplNAmMgZvGU7kKA0+4c1xWOjz828xweW5TCi8Mw9Q0= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.57.0/go.mod h1:4Vo3SJ24uzfKHUHLoFa8t8o+LH+7TCQ7sPcZDtOpSP4= -github.com/DataDog/datadog-go/v5 v5.3.0 h1:2q2qjFOb3RwAZNU+ez27ZVDwErJv5/VpbBPprz7Z+s8= -github.com/DataDog/datadog-go/v5 v5.3.0/go.mod h1:XRDJk1pTc00gm+ZDiBKsjh7oOOtJfYfglVCmFb8C2+Q= -github.com/DataDog/go-libddwaf/v3 v3.4.0 h1:NJ2W2vhYaOm1OWr1LJCbdgp7ezG/XLJcQKBmjFwhSuM= -github.com/DataDog/go-libddwaf/v3 v3.4.0/go.mod h1:n98d9nZ1gzenRSk53wz8l6d34ikxS+hs62A31Fqmyi4= -github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= -github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 h1:8EXxF+tCLqaVk8AOC29zl2mnhQjwyLxxOTuhUazWRsg= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4/go.mod h1:I5sHm0Y0T1u5YjlyqC5GVArM7aNZRUYtTjmJ8mPJFds= -github.com/ebitengine/purego v0.6.0-alpha.5 h1:EYID3JOAdmQ4SNZYJHu9V6IqOeRQDBYxqKAg9PyoHFY= -github.com/ebitengine/purego v0.6.0-alpha.5/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986 h1:jYi87L8j62qkXzaYHAQAhEapgukhenIMZRBKTNRLHJ4= -github.com/philhofer/fwd v1.1.3-0.20240612014219-fbbf4953d986/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -114,68 +161,172 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tinylib/msgp v1.2.1 h1:6ypy2qcCznxpP4hpORzhtXyTqrBs7cfM9MCCWY8zsmU= -github.com/tinylib/msgp v1.2.1/go.mod h1:2vIGs3lcUo8izAATNobrCHevYZC/LMsJtw4JPiYPHro= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= -golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= -golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= diff --git a/internal/exectracetest/sql_test.go b/internal/exectracetest/sql_test.go index 3a9f2a3f8a..f6cf0da1b9 100644 --- a/internal/exectracetest/sql_test.go +++ b/internal/exectracetest/sql_test.go @@ -16,9 +16,9 @@ import ( "github.com/mattn/go-sqlite3" exptrace "golang.org/x/exp/trace" - sqltrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/database/sql" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/httpmem" + sqltrace "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httpmem" ) func must[T any](val T, err error) T { diff --git a/internal/gitmetadata.go b/internal/gitmetadata.go index ce0ea38e57..f8c39663e4 100644 --- a/internal/gitmetadata.go +++ b/internal/gitmetadata.go @@ -7,11 +7,11 @@ package internal import ( "net/url" - "os" "runtime/debug" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const ( @@ -59,14 +59,14 @@ func updateAllTags(tags map[string]string, newtags map[string]string) { // Get git metadata from environment variables func getTagsFromEnv() map[string]string { return map[string]string{ - TagRepositoryURL: removeCredentials(os.Getenv(EnvGitRepositoryURL)), - TagCommitSha: os.Getenv(EnvGitCommitSha), + TagRepositoryURL: removeCredentials(env.Get(EnvGitRepositoryURL)), + TagCommitSha: env.Get(EnvGitCommitSha), } } // Get git metadata from DD_TAGS func getTagsFromDDTags() map[string]string { - etags := ParseTagString(os.Getenv(EnvDDTags)) + etags := ParseTagString(env.Get(EnvDDTags)) return map[string]string{ TagRepositoryURL: removeCredentials(etags[TagRepositoryURL]), diff --git a/internal/globalconfig/globalconfig.go b/internal/globalconfig/globalconfig.go index a36f50035f..24baef7f43 100644 --- a/internal/globalconfig/globalconfig.go +++ b/internal/globalconfig/globalconfig.go @@ -11,7 +11,8 @@ import ( "math" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" "github.com/google/uuid" ) @@ -130,3 +131,18 @@ func HeaderTagsLen() int { func ClearHeaderTags() { cfg.headersAsTags.Clear() } + +// InstrumentationInstallID returns the install ID as described in DD_INSTRUMENTATION_INSTALL_ID +func InstrumentationInstallID() string { + return env.Get("DD_INSTRUMENTATION_INSTALL_ID") +} + +// InstrumentationInstallType returns the install type as described in DD_INSTRUMENTATION_INSTALL_TYPE +func InstrumentationInstallType() string { + return env.Get("DD_INSTRUMENTATION_INSTALL_TYPE") +} + +// InstrumentationInstallTime returns the install time as described in DD_INSTRUMENTATION_INSTALL_TIME +func InstrumentationInstallTime() string { + return env.Get("DD_INSTRUMENTATION_INSTALL_TIME") +} diff --git a/internal/hostname/azure/azure.go b/internal/hostname/azure/azure.go index cb07c256a4..185d5f3788 100644 --- a/internal/hostname/azure/azure.go +++ b/internal/hostname/azure/azure.go @@ -11,9 +11,9 @@ import ( "fmt" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/cachedfetch" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/httputils" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/validate" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/cachedfetch" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/httputils" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/validate" ) // declare these as vars not const to ease testing diff --git a/internal/hostname/azure/azure_test.go b/internal/hostname/azure/azure_test.go index b72869b315..0d33f81aa9 100644 --- a/internal/hostname/azure/azure_test.go +++ b/internal/hostname/azure/azure_test.go @@ -18,7 +18,7 @@ import ( func TestGetHostname(t *testing.T) { ctx := context.Background() - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") io.WriteString(w, `{ "name": "vm-name", @@ -48,7 +48,7 @@ func TestGetHostnameWithInvalidMetadata(t *testing.T) { ctx := context.Background() for _, response := range []string{"", "!"} { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.Header().Set("Content-Type", "application/json") io.WriteString(w, fmt.Sprintf(`{ "name": "%s", diff --git a/internal/hostname/cachedfetch/fetcher.go b/internal/hostname/cachedfetch/fetcher.go index 17d1a3837c..2cff43caaa 100644 --- a/internal/hostname/cachedfetch/fetcher.go +++ b/internal/hostname/cachedfetch/fetcher.go @@ -12,7 +12,7 @@ import ( "context" "sync" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // Fetcher supports fetching a value, such as from a cloud service API. An diff --git a/internal/hostname/cachedfetch/fetcher_test.go b/internal/hostname/cachedfetch/fetcher_test.go index c425e90168..31b9105670 100644 --- a/internal/hostname/cachedfetch/fetcher_test.go +++ b/internal/hostname/cachedfetch/fetcher_test.go @@ -19,7 +19,7 @@ import ( // If Attempt never succeeds, f.Fetch returns an error func TestFetcherNeverSucceeds(t *testing.T) { f := Fetcher{ - Attempt: func(ctx context.Context) (string, error) { return "", fmt.Errorf("uhoh") }, + Attempt: func(_ context.Context) (string, error) { return "", fmt.Errorf("uhoh") }, } v, err := f.Fetch(context.TODO()) @@ -35,7 +35,7 @@ func TestFetcherNeverSucceeds(t *testing.T) { func TestFetcherCalledEachFetch(t *testing.T) { count := 0 f := Fetcher{ - Attempt: func(ctx context.Context) (string, error) { + Attempt: func(_ context.Context) (string, error) { count++ return strconv.Itoa(count), nil }, @@ -55,7 +55,7 @@ func TestFetcherUsesCachedValue(t *testing.T) { count := 0 f := Fetcher{ Name: "test", - Attempt: func(ctx context.Context) (string, error) { + Attempt: func(_ context.Context) (string, error) { count++ if count%2 == 0 { return "", fmt.Errorf("uhoh") @@ -76,7 +76,7 @@ func TestFetcherLogsWhenUsingCached(t *testing.T) { count := 0 errs := []string{} f := Fetcher{ - Attempt: func(ctx context.Context) (string, error) { + Attempt: func(_ context.Context) (string, error) { count++ if count%2 == 0 { return "", fmt.Errorf("uhoh") @@ -98,8 +98,8 @@ func TestFetcherLogsWhenUsingCached(t *testing.T) { } func TestReset(t *testing.T) { - succeed := func(ctx context.Context) (string, error) { return "yay", nil } - fail := func(ctx context.Context) (string, error) { return "", fmt.Errorf("uhoh") } + succeed := func(_ context.Context) (string, error) { return "yay", nil } + fail := func(_ context.Context) (string, error) { return "", fmt.Errorf("uhoh") } f := Fetcher{} f.Attempt = succeed diff --git a/internal/hostname/ec2/ec2.go b/internal/hostname/ec2/ec2.go index 42c76ba96d..a1087cab4a 100644 --- a/internal/hostname/ec2/ec2.go +++ b/internal/hostname/ec2/ec2.go @@ -11,8 +11,8 @@ import ( "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/cachedfetch" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/httputils" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/cachedfetch" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/httputils" ) // declare these as vars not const to ease testing diff --git a/internal/hostname/ecs/aws.go b/internal/hostname/ecs/aws.go index 2623774b8b..20f4097bc0 100644 --- a/internal/hostname/ecs/aws.go +++ b/internal/hostname/ecs/aws.go @@ -9,16 +9,16 @@ import ( "context" "encoding/json" "fmt" - "os" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/cachedfetch" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/httputils" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/cachedfetch" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/httputils" ) // declare these as vars not const to ease testing var ( - metadataURL = os.Getenv("ECS_CONTAINER_METADATA_URI_V4") + metadataURL = env.Get("ECS_CONTAINER_METADATA_URI_V4") timeout = 300 * time.Millisecond ) diff --git a/internal/hostname/gce/gce.go b/internal/hostname/gce/gce.go index e6965d5569..53036c19d6 100644 --- a/internal/hostname/gce/gce.go +++ b/internal/hostname/gce/gce.go @@ -11,8 +11,8 @@ import ( "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/cachedfetch" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/httputils" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/cachedfetch" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/httputils" ) // declare these as vars not const to ease testing @@ -26,7 +26,7 @@ var hostnameFetcher = cachedfetch.Fetcher{ hostname, err := getResponseWithMaxLength(ctx, metadataURL+"/instance/hostname", 255) if err != nil { - return "", fmt.Errorf("unable to retrieve hostname from GCE: %s", err) + return "", fmt.Errorf("unable to retrieve hostname from GCE: %s", err.Error()) } return hostname, nil }, @@ -39,7 +39,7 @@ var projectIDFetcher = cachedfetch.Fetcher{ metadataURL+"/project/project-id", 255) if err != nil { - return "", fmt.Errorf("unable to retrieve project ID from GCE: %s", err) + return "", fmt.Errorf("unable to retrieve project ID from GCE: %s", err.Error()) } return projectID, err }, @@ -76,7 +76,7 @@ func getInstanceAlias(ctx context.Context, hostname string) (string, error) { // of the Compute Engine metadata server. // See https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity#gke_mds if hostname == "" { - return "", fmt.Errorf("unable to retrieve instance name and hostname from GCE: %s", err) + return "", fmt.Errorf("unable to retrieve instance name and hostname from GCE: %s", err.Error()) } instanceName = strings.SplitN(hostname, ".", 2)[0] } @@ -108,7 +108,7 @@ func getResponseWithMaxLength(ctx context.Context, endpoint string, maxLength in func getResponse(ctx context.Context, url string) (string, error) { res, err := httputils.Get(ctx, url, map[string]string{"Metadata-Flavor": "Google"}, 1000*time.Millisecond) if err != nil { - return "", fmt.Errorf("GCE metadata API error: %s", err) + return "", fmt.Errorf("GCE metadata API error: %s", err.Error()) } // Some cloud platforms will respond with an empty body, causing the agent to assume a faulty hostname diff --git a/internal/hostname/providers.go b/internal/hostname/providers.go index 85c685df2d..4562703765 100644 --- a/internal/hostname/providers.go +++ b/internal/hostname/providers.go @@ -13,12 +13,13 @@ import ( "sync/atomic" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/azure" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/ec2" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/ecs" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/gce" - "gopkg.in/DataDog/dd-trace-go.v1/internal/hostname/validate" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/azure" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/ec2" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/ecs" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/gce" + "github.com/DataDog/dd-trace-go/v2/internal/hostname/validate" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // For testing purposes @@ -150,7 +151,7 @@ func updateHostname(now time.Time) { for _, p := range providerCatalog { detectedHostname, err := p.pf(ctx, hostname) if err != nil { - log.Debug("Unable to get hostname from provider %s: %v", p.name, err) + log.Debug("Unable to get hostname from provider %q: %v", p.name, err.Error()) continue } hostname = detectedHostname @@ -171,7 +172,7 @@ func updateHostname(now time.Time) { } func fromConfig(_ context.Context, _ string) (string, error) { - hn := os.Getenv("DD_HOSTNAME") + hn := env.Get("DD_HOSTNAME") err := validate.ValidHostname(hn) if err != nil { return "", err @@ -184,7 +185,7 @@ func fromFargate(ctx context.Context, _ string) (string, error) { } func fargate(ctx context.Context) (string, error) { - if _, ok := os.LookupEnv("ECS_CONTAINER_METADATA_URI_V4"); !ok { + if _, ok := env.Lookup("ECS_CONTAINER_METADATA_URI_V4"); !ok { return "", fmt.Errorf("not running in fargate") } launchType, err := ecs.GetLaunchType(ctx) diff --git a/internal/hostname/validate/validate.go b/internal/hostname/validate/validate.go index fa97b1c998..67527a0854 100644 --- a/internal/hostname/validate/validate.go +++ b/internal/hostname/validate/validate.go @@ -13,7 +13,7 @@ import ( "regexp" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) const maxLength = 255 diff --git a/internal/inmemoryfile.go b/internal/inmemoryfile.go new file mode 100644 index 0000000000..e1bad3bf9b --- /dev/null +++ b/internal/inmemoryfile.go @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +//go:build !linux + +package internal + +func CreateMemfd(_ string, _ []byte) (int, error) { + return 0, nil +} diff --git a/internal/inmemoryfilelinux.go b/internal/inmemoryfilelinux.go new file mode 100644 index 0000000000..b7719c834e --- /dev/null +++ b/internal/inmemoryfilelinux.go @@ -0,0 +1,36 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +//go:build linux + +package internal + +import ( + "fmt" + + "golang.org/x/sys/unix" +) + +func CreateMemfd(name string, data []byte) (int, error) { + fd, err := unix.MemfdCreate(name, unix.MFD_CLOEXEC|unix.MFD_ALLOW_SEALING) + if err != nil { + return 0, fmt.Errorf("failed to create memfd '%s': %v", name, err) + } + + bytesWritten, err := unix.Write(fd, data) + if err != nil { + return 0, fmt.Errorf("failed to write data to memfd (fd: %d): %v", fd, err) + } + if bytesWritten != len(data) { + return 0, fmt.Errorf("data mismatch in memfd (fd: %d): expected to write %d bytes, but wrote %d bytes", fd, len(data), bytesWritten) + } + + _, err = unix.FcntlInt(uintptr(fd), unix.F_ADD_SEALS, unix.F_SEAL_SHRINK|unix.F_SEAL_GROW|unix.F_SEAL_WRITE|unix.F_SEAL_SEAL) + if err != nil { + return 0, fmt.Errorf("failed to seal memfd (fd: %d): %v", fd, err) + } + + return fd, nil +} diff --git a/internal/llmobs/config/config.go b/internal/llmobs/config/config.go new file mode 100644 index 0000000000..7a58475ed2 --- /dev/null +++ b/internal/llmobs/config/config.go @@ -0,0 +1,90 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package config + +import ( + "context" + "net" + "net/http" + "net/url" + "time" +) + +type TracerConfig struct { + DDTags map[string]any + Env string + Service string + Version string + AgentURL *url.URL + APIKey string + APPKey string + HTTPClient *http.Client + Site string +} + +type AgentFeatures struct { + EVPProxyV2 bool +} + +type Config struct { + Enabled bool + MLApp string + AgentlessEnabled *bool + ResolvedAgentlessEnabled bool + ProjectName string + TracerConfig TracerConfig + AgentFeatures AgentFeatures +} + +// We copy the transport to avoid using the default one, as it might be +// augmented with tracing and we don't want these calls to be recorded. +// See https://golang.org/pkg/net/http/#DefaultTransport . +// Note: We don't set a global Timeout on the client; instead, we manage +// timeouts per-request using context.WithTimeout for better control. +func newHTTPClient() *http.Client { + return &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + }, + } +} + +func (c *Config) DefaultHTTPClient() *http.Client { + var cl *http.Client + if c.ResolvedAgentlessEnabled || c.TracerConfig.AgentURL.Scheme != "unix" { + cl = newHTTPClient() + } else { + dialer := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + } + cl = &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) { + return dialer.DialContext(ctx, "unix", (&net.UnixAddr{ + Name: c.TracerConfig.AgentURL.Path, + Net: "unix", + }).String()) + }, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + }, + } + } + return cl +} diff --git a/internal/llmobs/context.go b/internal/llmobs/context.go new file mode 100644 index 0000000000..79ae2dd919 --- /dev/null +++ b/internal/llmobs/context.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import "context" + +type ( + ctxKeyActiveLLMSpan struct{} + ctxKeyPropagatedLLMSpan struct{} +) + +// PropagatedLLMSpan represents LLMObs span context that can be propagated across process boundaries. +type PropagatedLLMSpan struct { + // MLApp is the ML application name. + MLApp string + // TraceID is the LLMObs trace ID. + TraceID string + // SpanID is the span ID. + SpanID string +} + +// PropagatedLLMSpanFromContext retrieves a PropagatedLLMSpan from the context. +// Returns the span and true if found, nil and false otherwise. +func PropagatedLLMSpanFromContext(ctx context.Context) (*PropagatedLLMSpan, bool) { + if val, ok := ctx.Value(ctxKeyPropagatedLLMSpan{}).(*PropagatedLLMSpan); ok { + return val, true + } + return nil, false +} + +// ContextWithPropagatedLLMSpan returns a new context with the given PropagatedLLMSpan attached. +func ContextWithPropagatedLLMSpan(ctx context.Context, span *PropagatedLLMSpan) context.Context { + return context.WithValue(ctx, ctxKeyPropagatedLLMSpan{}, span) +} + +// ActiveLLMSpanFromContext retrieves the active LLMObs span from the context. +// Returns the span and true if found, nil and false otherwise. +func ActiveLLMSpanFromContext(ctx context.Context) (*Span, bool) { + if span, ok := ctx.Value(ctxKeyActiveLLMSpan{}).(*Span); ok { + return span, true + } + return nil, false +} + +func contextWithActiveLLMSpan(ctx context.Context, span *Span) context.Context { + return context.WithValue(ctx, ctxKeyActiveLLMSpan{}, span) +} diff --git a/internal/llmobs/context_test.go b/internal/llmobs/context_test.go new file mode 100644 index 0000000000..223f1c130a --- /dev/null +++ b/internal/llmobs/context_test.go @@ -0,0 +1,103 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs_test + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/stretchr/testify/assert" +) + +func TestContext(t *testing.T) { + t.Run("active-llm-span-context", func(t *testing.T) { + t.Run("empty-context", func(t *testing.T) { + ctx := context.Background() + span, ok := llmobs.ActiveLLMSpanFromContext(ctx) + assert.False(t, ok) + assert.Nil(t, span) + }) + t.Run("with-active-span", func(t *testing.T) { + _, ll := testTracer(t) + + // Create a span and get its context + originalSpan, ctx := ll.StartSpan(context.Background(), llmobs.SpanKindLLM, "test-span", llmobs.StartSpanConfig{}) + defer originalSpan.Finish(llmobs.FinishSpanConfig{}) + + // Retrieve the span from context + retrievedSpan, ok := llmobs.ActiveLLMSpanFromContext(ctx) + assert.True(t, ok) + assert.NotNil(t, retrievedSpan) + assert.Equal(t, originalSpan, retrievedSpan) + }) + t.Run("start-span-creates-context", func(t *testing.T) { + _, ll := testTracer(t) + + // StartSpan should automatically add the span to the returned context + span, ctx := ll.StartSpan(context.Background(), llmobs.SpanKindAgent, "agent-span", llmobs.StartSpanConfig{}) + defer span.Finish(llmobs.FinishSpanConfig{}) + + // Verify the span is in the context + retrievedSpan, ok := llmobs.ActiveLLMSpanFromContext(ctx) + assert.True(t, ok) + assert.Equal(t, span, retrievedSpan) + }) + + }) + t.Run("propagated-llm-span-context", func(t *testing.T) { + t.Run("empty-context", func(t *testing.T) { + ctx := context.Background() + propagated, ok := llmobs.PropagatedLLMSpanFromContext(ctx) + assert.False(t, ok) + assert.Nil(t, propagated) + }) + t.Run("with-propagated-span", func(t *testing.T) { + originalPropagated := &llmobs.PropagatedLLMSpan{ + MLApp: "test-ml-app", + TraceID: "trace-123", + SpanID: "span-456", + } + + ctx := llmobs.ContextWithPropagatedLLMSpan(context.Background(), originalPropagated) + + retrievedPropagated, ok := llmobs.PropagatedLLMSpanFromContext(ctx) + assert.True(t, ok) + assert.NotNil(t, retrievedPropagated) + assert.Equal(t, originalPropagated, retrievedPropagated) + assert.Equal(t, "test-ml-app", retrievedPropagated.MLApp) + assert.Equal(t, "trace-123", retrievedPropagated.TraceID) + assert.Equal(t, "span-456", retrievedPropagated.SpanID) + }) + + }) + t.Run("both-active-and-propagated-span-context", func(t *testing.T) { + _, ll := testTracer(t) + + // Create propagated span first + propagatedSpan := &llmobs.PropagatedLLMSpan{ + MLApp: "propagated-app", + TraceID: "propagated-trace", + SpanID: "propagated-span", + } + + // Add propagated span to context + ctx := llmobs.ContextWithPropagatedLLMSpan(context.Background(), propagatedSpan) + + // Create active span from context that already has propagated span + activeSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindLLM, "active", llmobs.StartSpanConfig{}) + defer activeSpan.Finish(llmobs.FinishSpanConfig{}) + + // Both should be retrievable independently + retrievedActive, activeOk := llmobs.ActiveLLMSpanFromContext(ctx) + retrievedPropagated, propagatedOk := llmobs.PropagatedLLMSpanFromContext(ctx) + + assert.True(t, activeOk) + assert.True(t, propagatedOk) + assert.Equal(t, activeSpan, retrievedActive) + assert.Equal(t, propagatedSpan, retrievedPropagated) + }) +} diff --git a/internal/llmobs/llmobs.go b/internal/llmobs/llmobs.go new file mode 100644 index 0000000000..a08de7e973 --- /dev/null +++ b/internal/llmobs/llmobs.go @@ -0,0 +1,896 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import ( + "context" + "crypto/rand" + "encoding/binary" + "encoding/json" + "errors" + "fmt" + "math" + "math/big" + "slices" + "strings" + "sync" + "time" + "unicode" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/config" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +var ( + mu sync.Mutex + activeLLMObs *LLMObs +) + +var ( + errLLMObsNotEnabled = errors.New("LLMObs is not enabled. Ensure the tracer has been started with the option tracer.WithLLMObsEnabled(true) or set DD_LLMOBS_ENABLED=true") + errAgentlessRequiresAPIKey = errors.New("LLMOBs agentless mode requires a valid API key - set the DD_API_KEY env variable to configure one") + errMLAppRequired = errors.New("ML App is required for sending LLM Observability data") + errAgentModeNotSupported = errors.New("DD_LLMOBS_AGENTLESS_ENABLED has been configured to false but the agent is not available or does not support LLMObs") + errInvalidMetricLabel = errors.New("label is required for evaluation metrics") + errFinishedSpan = errors.New("span is already finished") + errEvalJoinBothPresent = errors.New("provide either span/trace IDs or tag key/value, not both") + errEvalJoinNonePresent = errors.New("must provide either span/trace IDs or tag key/value for joining") + errInvalidSpanJoin = errors.New("both span and trace IDs are required for span-based joining") + errInvalidTagJoin = errors.New("both tag key and value are required for tag-based joining") +) + +const ( + baggageKeyExperimentID = "_ml_obs.experiment_id" +) + +const ( + defaultParentID = "undefined" +) + +// SpanKind represents the type of an LLMObs span. +type SpanKind string + +const ( + // SpanKindExperiment represents an experiment span for testing and evaluation. + SpanKindExperiment SpanKind = "experiment" + // SpanKindWorkflow represents a workflow span that orchestrates multiple operations. + SpanKindWorkflow SpanKind = "workflow" + // SpanKindLLM represents a span for Large Language Model operations. + SpanKindLLM SpanKind = "llm" + // SpanKindEmbedding represents a span for embedding generation operations. + SpanKindEmbedding SpanKind = "embedding" + // SpanKindAgent represents a span for AI agent operations. + SpanKindAgent SpanKind = "agent" + // SpanKindRetrieval represents a span for document retrieval operations. + SpanKindRetrieval SpanKind = "retrieval" + // SpanKindTask represents a span for general task operations. + SpanKindTask SpanKind = "task" + // SpanKindTool represents a span for tool usage operations. + SpanKindTool SpanKind = "tool" +) + +const ( + defaultFlushInterval = 2 * time.Second +) + +const ( + sizeLimitEVPEvent = 5_000_000 // 5MB + collectionErrorDroppedIO = "dropped_io" + droppedValueText = "[This value has been dropped because this span's size exceeds the 1MB size limit.]" +) + +// See: https://docs.datadoghq.com/getting_started/site/#access-the-datadog-site +var ddSitesNeedingAppSubdomain = []string{"datadoghq.com", "datadoghq.eu", "ddog-gov.com"} + +type llmobsContext struct { + // apply to all spans + metadata map[string]any + metrics map[string]float64 + tags map[string]string + + // agent specific + agentManifest string + + // llm specific + modelName string + modelProvider string + prompt *Prompt + toolDefinitions []ToolDefinition + + // input + inputDocuments []EmbeddedDocument + inputMessages []LLMMessage + inputText string + + // output + outputDocuments []RetrievedDocument + outputMessages []LLMMessage + outputText string + + // experiment specific + experimentInput any + experimentExpectedOutput any + experimentOutput any +} + +// LLMObs represents the main LLMObs instance that handles span collection and transport. +type LLMObs struct { + // Config contains the LLMObs configuration. + Config *config.Config + // Transport handles sending data to the Datadog backend. + Transport *transport.Transport + // Tracer is the underlying APM tracer. + Tracer Tracer + + // channels used by producers + spanEventsCh chan *transport.LLMObsSpanEvent + evalMetricsCh chan *transport.LLMObsMetric + + // runtime buffers, payloads are accumulated here and flushed periodically + bufSpanEvents []*transport.LLMObsSpanEvent + bufEvalMetrics []*transport.LLMObsMetric + + // lifecycle + mu sync.Mutex + running bool + wg sync.WaitGroup + stopCh chan struct{} // signal stop + flushNowCh chan struct{} + flushInterval time.Duration +} + +func newLLMObs(cfg *config.Config, tracer Tracer) (*LLMObs, error) { + agentSupportsLLMObs := cfg.AgentFeatures.EVPProxyV2 + if !agentSupportsLLMObs { + log.Debug("llmobs: agent not available or does not support llmobs") + } + if cfg.AgentlessEnabled != nil { + if !*cfg.AgentlessEnabled && !agentSupportsLLMObs { + return nil, errAgentModeNotSupported + } + cfg.ResolvedAgentlessEnabled = *cfg.AgentlessEnabled + } else { + // if agentlessEnabled is not set and evp_proxy is supported in the agent, default to use the agent + cfg.ResolvedAgentlessEnabled = !agentSupportsLLMObs + if cfg.ResolvedAgentlessEnabled { + log.Debug("llmobs: DD_LLMOBS_AGENTLESS_ENABLED not set, defaulting to agentless mode") + } else { + log.Debug("llmobs: DD_LLMOBS_AGENTLESS_ENABLED not set, defaulting to agent mode") + } + } + + if cfg.ResolvedAgentlessEnabled && !isAPIKeyValid(cfg.TracerConfig.APIKey) { + return nil, errAgentlessRequiresAPIKey + } + if cfg.MLApp == "" { + return nil, errMLAppRequired + } + if cfg.TracerConfig.HTTPClient == nil { + cfg.TracerConfig.HTTPClient = cfg.DefaultHTTPClient() + } + return &LLMObs{ + Config: cfg, + Transport: transport.New(cfg), + Tracer: tracer, + spanEventsCh: make(chan *transport.LLMObsSpanEvent), + evalMetricsCh: make(chan *transport.LLMObsMetric), + stopCh: make(chan struct{}), + flushNowCh: make(chan struct{}, 1), + flushInterval: defaultFlushInterval, + }, nil +} + +// Start starts the global LLMObs instance with the given configuration and tracer. +// Returns an error if LLMObs is already running or if configuration is invalid. +func Start(cfg config.Config, tracer Tracer) (err error) { + startTime := time.Now() + defer func() { + trackLLMObsStart(startTime, err, cfg) + }() + mu.Lock() + defer mu.Unlock() + + if activeLLMObs != nil { + activeLLMObs.Stop() + } + if !cfg.Enabled { + return nil + } + l, err := newLLMObs(&cfg, tracer) + if err != nil { + return err + } + activeLLMObs = l + activeLLMObs.Run() + return nil +} + +// Stop stops the active LLMObs instance and cleans up resources. +func Stop() { + mu.Lock() + defer mu.Unlock() + + if activeLLMObs != nil { + activeLLMObs.Stop() + activeLLMObs = nil + } +} + +// ActiveLLMObs returns the current active LLMObs instance, or an error if LLMObs is not enabled or started. +func ActiveLLMObs() (*LLMObs, error) { + if activeLLMObs == nil || !activeLLMObs.Config.Enabled { + return nil, errLLMObsNotEnabled + } + return activeLLMObs, nil +} + +// Flush forces a flush of all buffered LLMObs data to the transport. +func Flush() { + if activeLLMObs != nil { + activeLLMObs.Flush() + trackUserFlush() + } +} + +// Run starts the worker loop that processes span events and metrics. +func (l *LLMObs) Run() { + l.mu.Lock() + if l.running { + l.mu.Unlock() + return + } + l.running = true + l.mu.Unlock() + + l.wg.Add(1) + go func() { + // this goroutine should be the only one writing to the internal buffers + defer l.wg.Done() + + ticker := time.NewTicker(l.flushInterval) + defer ticker.Stop() + + for { + select { + case ev := <-l.spanEventsCh: + l.bufSpanEvents = append(l.bufSpanEvents, ev) + + case evalMetric := <-l.evalMetricsCh: + l.bufEvalMetrics = append(l.bufEvalMetrics, evalMetric) + + case <-ticker.C: + params := l.clearBuffersNonLocked() + l.wg.Add(1) + go func() { + defer l.wg.Done() + l.batchSend(params) + }() + + case <-l.flushNowCh: + log.Debug("llmobs: on-demand flush signal") + params := l.clearBuffersNonLocked() + l.wg.Add(1) + go func() { + defer l.wg.Done() + l.batchSend(params) + }() + + case <-l.stopCh: + log.Debug("llmobs: stop signal") + l.drainChannels() + params := l.clearBuffersNonLocked() + l.batchSend(params) + return + } + } + }() +} + +// clearBuffersNonLocked clears the internal buffers and returns the corresponding batchSendParams to send to the backend. +// It is meant to be called only from the main Run worker goroutine. +func (l *LLMObs) clearBuffersNonLocked() batchSendParams { + params := batchSendParams{ + spanEvents: l.bufSpanEvents, + evalMetrics: l.bufEvalMetrics, + } + l.bufSpanEvents = nil + l.bufEvalMetrics = nil + return params +} + +// Flush forces an immediate flush of anything currently buffered. +// It does not wait for new items to arrive. +func (l *LLMObs) Flush() { + // non-blocking edge trigger so multiple calls coalesce + select { + case l.flushNowCh <- struct{}{}: + default: + } +} + +// Stop requests shutdown, drains what’s already in the channels, flushes, and waits. +func (l *LLMObs) Stop() { + l.mu.Lock() + if !l.running { + l.mu.Unlock() + return + } + l.running = false + l.mu.Unlock() + + // Stop the sender/flush loop + select { + case <-l.stopCh: + default: + close(l.stopCh) + } + + // Wait for the main worker to exit (it will do a final flush) + l.wg.Wait() +} + +// drainChannels pulls everything currently buffered in the channels into our in-memory buffers. +func (l *LLMObs) drainChannels() { + for { + progress := false + select { + case ev := <-l.spanEventsCh: + l.mu.Lock() + l.bufSpanEvents = append(l.bufSpanEvents, ev) + l.mu.Unlock() + progress = true + default: + } + + select { + case evalMetric := <-l.evalMetricsCh: + l.mu.Lock() + l.bufEvalMetrics = append(l.bufEvalMetrics, evalMetric) + l.mu.Unlock() + progress = true + default: + } + + if !progress { + return + } + } +} + +type batchSendParams struct { + spanEvents []*transport.LLMObsSpanEvent + evalMetrics []*transport.LLMObsMetric +} + +// batchSend sends the buffered payloads to the backend. +func (l *LLMObs) batchSend(params batchSendParams) { + if len(params.spanEvents) == 0 && len(params.evalMetrics) == 0 { + return + } + + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + + var wg sync.WaitGroup + + if len(params.spanEvents) > 0 { + wg.Add(1) + events := params.spanEvents + go func() { + defer wg.Done() + log.Debug("llmobs: sending %d LLMObs Span Events", len(events)) + if log.DebugEnabled() { + for _, ev := range events { + if b, err := json.Marshal(ev); err == nil { + log.Debug("llmobs: LLMObs Span Event: %s", b) + } + } + } + if err := l.Transport.PushSpanEvents(ctx, events); err != nil { + log.Error("llmobs: failed to push span events: %v", err.Error()) + trackDroppedPayload(len(events), telemetryMetricDroppedSpanEvents, "transport_error") + } else { + log.Debug("llmobs: push span events success") + } + }() + } + if len(params.evalMetrics) > 0 { + wg.Add(1) + metrics := params.evalMetrics + go func() { + defer wg.Done() + log.Debug("llmobs: sending %d LLMObs Span Eval Metrics", len(metrics)) + if log.DebugEnabled() { + for _, eval := range metrics { + if b, err := json.Marshal(eval); err == nil { + log.Debug("llmobs: LLMObs Span Eval Metric: %s", b) + } + } + } + if err := l.Transport.PushEvalMetrics(ctx, metrics); err != nil { + log.Error("llmobs: failed to push eval metrics: %v", err.Error()) + trackDroppedPayload(len(metrics), telemetryMetricDroppedEvalEvents, "transport_error") + } else { + log.Debug("llmobs: push eval metrics success") + } + }() + } + wg.Wait() +} + +// submitLLMObsSpan generates and submits an LLMObs span event to the LLMObs intake. +func (l *LLMObs) submitLLMObsSpan(span *Span) { + event := l.llmobsSpanEvent(span) + l.spanEventsCh <- event +} + +func (l *LLMObs) llmobsSpanEvent(span *Span) *transport.LLMObsSpanEvent { + meta := make(map[string]any) + + spanKind := span.spanKind + meta["span.kind"] = string(spanKind) + + if (spanKind == SpanKindLLM || spanKind == SpanKindEmbedding) && span.llmCtx.modelName != "" || span.llmCtx.modelProvider != "" { + modelName := span.llmCtx.modelName + if modelName == "" { + modelName = "custom" + } + modelProvider := strings.ToLower(span.llmCtx.modelProvider) + if modelProvider == "" { + modelProvider = "custom" + } + meta["model_name"] = modelName + meta["model_provider"] = modelProvider + } + + metadata := span.llmCtx.metadata + if metadata == nil { + metadata = make(map[string]any) + } + if spanKind == SpanKindAgent && span.llmCtx.agentManifest != "" { + metadata["agent_manifest"] = span.llmCtx.agentManifest + } + if len(metadata) > 0 { + meta["metadata"] = metadata + } + + input := make(map[string]any) + output := make(map[string]any) + + if spanKind == SpanKindLLM && len(span.llmCtx.inputMessages) > 0 { + input["messages"] = span.llmCtx.inputMessages + } else if txt := span.llmCtx.inputText; len(txt) > 0 { + input["value"] = txt + } + + if spanKind == SpanKindLLM && len(span.llmCtx.outputMessages) > 0 { + output["messages"] = span.llmCtx.outputMessages + } else if txt := span.llmCtx.outputText; len(txt) > 0 { + output["value"] = txt + } + + if spanKind == SpanKindExperiment { + if expectedOut := span.llmCtx.experimentExpectedOutput; expectedOut != nil { + meta["expected_output"] = expectedOut + } + if expInput := span.llmCtx.experimentInput; expInput != nil { + meta["input"] = expInput + } + if out := span.llmCtx.experimentOutput; out != nil { + meta["output"] = out + } + } + + if spanKind == SpanKindEmbedding { + if inputDocs := span.llmCtx.inputDocuments; len(inputDocs) > 0 { + input["documents"] = inputDocs + } + } + if spanKind == SpanKindRetrieval { + if outputDocs := span.llmCtx.outputDocuments; len(outputDocs) > 0 { + output["documents"] = outputDocs + } + } + if inputPrompt := span.llmCtx.prompt; inputPrompt != nil { + if spanKind != SpanKindLLM { + log.Warn("llmobs: dropping prompt on non-LLM span kind, annotating prompts is only supported for LLM span kinds") + } else { + input["prompt"] = inputPrompt + } + } else if spanKind == SpanKindLLM { + if span.parent != nil && span.parent.llmCtx.prompt != nil { + input["prompt"] = span.parent.llmCtx.prompt + } + } + + if toolDefinitions := span.llmCtx.toolDefinitions; len(toolDefinitions) > 0 { + meta["tool_definitions"] = toolDefinitions + } + + spanStatus := "ok" + var errMsg *transport.ErrorMessage + if span.error != nil { + spanStatus = "error" + errMsg = transport.NewErrorMessage(span.error) + meta["error.message"] = errMsg.Message + meta["error.stack"] = errMsg.Stack + meta["error.type"] = errMsg.Type + } + + if len(input) > 0 { + meta["input"] = input + } + if len(output) > 0 { + meta["output"] = output + } + + spanID := span.apm.SpanID() + parentID := defaultParentID + if span.parent != nil { + parentID = span.parent.apm.SpanID() + } + if span.llmTraceID == "" { + log.Warn("llmobs: span has no trace ID") + span.llmTraceID = newLLMObsTraceID() + } + + tags := make(map[string]string) + for k, v := range l.Config.TracerConfig.DDTags { + tags[k] = fmt.Sprintf("%v", v) + } + tags["version"] = l.Config.TracerConfig.Version + tags["env"] = l.Config.TracerConfig.Env + tags["service"] = l.Config.TracerConfig.Service + tags["source"] = "integration" + tags["ml_app"] = span.mlApp + tags["ddtrace.version"] = version.Tag + tags["language"] = "go" + + sessionID := span.propagatedSessionID() + if sessionID != "" { + tags["session_id"] = sessionID + } + + errTag := "0" + if span.error != nil { + errTag = "1" + } + tags["error"] = errTag + + if errMsg != nil { + tags["error_type"] = errMsg.Type + } + if span.integration != "" { + tags["integration"] = span.integration + } + + for k, v := range span.llmCtx.tags { + tags[k] = v + } + tagsSlice := make([]string, 0, len(tags)) + for k, v := range tags { + tagsSlice = append(tagsSlice, fmt.Sprintf("%s:%s", k, v)) + } + + ev := &transport.LLMObsSpanEvent{ + SpanID: spanID, + TraceID: span.llmTraceID, + ParentID: parentID, + SessionID: sessionID, + Tags: tagsSlice, + Name: span.name, + StartNS: span.startTime.UnixNano(), + Duration: span.finishTime.Sub(span.startTime).Nanoseconds(), + Status: spanStatus, + StatusMessage: "", + Meta: meta, + Metrics: span.llmCtx.metrics, + CollectionErrors: nil, + SpanLinks: span.spanLinks, + Scope: span.scope, + } + if b, err := json.Marshal(ev); err == nil { + rawSize := len(b) + trackSpanEventRawSize(ev, rawSize) + + truncated := false + if rawSize > sizeLimitEVPEvent { + log.Warn( + "llmobs: dropping llmobs span event input/output because its size (%s) exceeds the event size limit (5MB)", + readableBytes(rawSize), + ) + truncated = dropSpanEventIO(ev) + if !truncated { + log.Debug("llmobs: attempted to drop span event IO but it was not present") + } + } + actualSize := rawSize + if truncated { + if b, err := json.Marshal(ev); err == nil { + actualSize = len(b) + } + } + trackSpanEventSize(ev, actualSize, truncated) + } + return ev +} + +func dropSpanEventIO(ev *transport.LLMObsSpanEvent) bool { + if ev == nil { + return false + } + droppedIO := false + if _, ok := ev.Meta["input"]; ok { + ev.Meta["input"] = map[string]any{"value": droppedValueText} + droppedIO = true + } + if _, ok := ev.Meta["output"]; ok { + ev.Meta["output"] = map[string]any{"value": droppedValueText} + droppedIO = true + } + if droppedIO { + ev.CollectionErrors = []string{collectionErrorDroppedIO} + } else { + log.Debug("llmobs: attempted to drop span event IO but it was not present") + } + return droppedIO +} + +// StartSpan starts a new LLMObs span with the given kind, name, and configuration. +// Returns the created span and a context containing the span. +func (l *LLMObs) StartSpan(ctx context.Context, kind SpanKind, name string, cfg StartSpanConfig) (*Span, context.Context) { + defer trackSpanStarted() + + spanName := name + if spanName == "" { + spanName = string(kind) + } + + if cfg.StartTime.IsZero() { + cfg.StartTime = time.Now() + } + + startCfg := StartAPMSpanConfig{ + SpanType: ext.SpanTypeLLM, + StartTime: cfg.StartTime, + } + apmSpan, ctx := l.Tracer.StartSpan(ctx, spanName, startCfg) + span := &Span{ + name: spanName, + apm: apmSpan, + startTime: cfg.StartTime, + } + if !l.Config.Enabled { + log.Warn("llmobs: LLMObs span was started without enabling LLMObs") + return span, ctx + } + + if parent, ok := ActiveLLMSpanFromContext(ctx); ok { + log.Debug("llmobs: found active llm span in context: (trace_id: %q, span_id: %q, ml_app: %q)", + parent.TraceID(), parent.SpanID(), parent.MLApp()) + span.parent = parent + span.llmTraceID = parent.llmTraceID + } else if propagated, ok := PropagatedLLMSpanFromContext(ctx); ok { + log.Debug("llmobs: found propagated llm span in context: (trace_id: %q, span_id: %q, ml_app: %q)", + propagated.TraceID, propagated.SpanID, propagated.MLApp) + span.propagated = propagated + span.llmTraceID = propagated.TraceID + } else { + span.llmTraceID = newLLMObsTraceID() + } + + span.mlApp = cfg.MLApp + span.spanKind = kind + span.sessionID = cfg.SessionID + + span.llmCtx = llmobsContext{ + modelName: cfg.ModelName, + modelProvider: cfg.ModelProvider, + } + + if span.sessionID == "" { + span.sessionID = span.propagatedSessionID() + } + if span.mlApp == "" { + span.mlApp = span.propagatedMLApp() + if span.mlApp == "" { + // We should ensure there's always an ML App to fall back to during startup, so in theory this should never happen. + log.Warn("llmobs: ML App is required for sending LLM Observability data.") + } + } + log.Debug("llmobs: starting LLMObs span: %s, span_kind: %s, ml_app: %s", spanName, kind, span.mlApp) + return span, contextWithActiveLLMSpan(ctx, span) +} + +// StartExperimentSpan starts a new experiment span with the given name, experiment ID, and configuration. +// Returns the created span and a context containing the span. +func (l *LLMObs) StartExperimentSpan(ctx context.Context, name string, experimentID string, cfg StartSpanConfig) (*Span, context.Context) { + span, ctx := l.StartSpan(ctx, SpanKindExperiment, name, cfg) + + if experimentID != "" { + span.apm.SetBaggageItem(baggageKeyExperimentID, experimentID) + span.scope = "experiments" + } + return span, ctx +} + +// SubmitEvaluation submits an evaluation metric for a span. +// The span can be identified either by span/trace IDs or by tag key-value pairs. +func (l *LLMObs) SubmitEvaluation(cfg EvaluationConfig) (err error) { + var metric *transport.LLMObsMetric + defer func() { + trackSubmitEvaluationMetric(metric, err) + }() + + if cfg.Label == "" { + return errInvalidMetricLabel + } + var ( + hasTagJoin bool + hasSpanJoin bool + ) + if cfg.SpanID != "" || cfg.TraceID != "" { + if !(cfg.SpanID != "" && cfg.TraceID != "") { + return errInvalidSpanJoin + } + hasSpanJoin = true + } + if cfg.TagKey != "" || cfg.TagValue != "" { + if !(cfg.TagKey != "" && cfg.TagValue != "") { + return errInvalidTagJoin + } + hasTagJoin = true + } + if hasSpanJoin && hasTagJoin { + return errEvalJoinBothPresent + } + if !hasSpanJoin && !hasTagJoin { + return errEvalJoinNonePresent + } + + numValues := 0 + if cfg.CategoricalValue != nil { + numValues++ + } + if cfg.ScoreValue != nil { + numValues++ + } + if cfg.BooleanValue != nil { + numValues++ + } + if numValues != 1 { + return errors.New("exactly one metric value (categorical, score, or boolean) must be provided") + } + + mlApp := cfg.MLApp + if mlApp == "" { + mlApp = l.Config.MLApp + } + timestampMS := cfg.TimestampMS + if timestampMS == 0 { + timestampMS = time.Now().UnixMilli() + } + + // Build the appropriate join condition + var joinOn transport.EvaluationJoinOn + if hasSpanJoin { + joinOn.Span = &transport.EvaluationSpanJoin{ + SpanID: cfg.SpanID, + TraceID: cfg.TraceID, + } + } else { + joinOn.Tag = &transport.EvaluationTagJoin{ + Key: cfg.TagKey, + Value: cfg.TagValue, + } + } + + tags := make([]string, 0, len(cfg.Tags)+1) + for _, tag := range cfg.Tags { + if !strings.HasPrefix(tag, "ddtrace.version:") { + tags = append(tags, tag) + } + } + tags = append(tags, fmt.Sprintf("ddtrace.version:%s", version.Tag)) + + metric = &transport.LLMObsMetric{ + JoinOn: joinOn, + Label: cfg.Label, + MLApp: mlApp, + TimestampMS: timestampMS, + Tags: tags, + } + + if cfg.CategoricalValue != nil { + metric.CategoricalValue = cfg.CategoricalValue + metric.MetricType = "categorical" + } else if cfg.ScoreValue != nil { + metric.ScoreValue = cfg.ScoreValue + metric.MetricType = "score" + } else if cfg.BooleanValue != nil { + metric.BooleanValue = cfg.BooleanValue + metric.MetricType = "boolean" + } else { + return errors.New("a metric value (categorical, score, or boolean) is required for evaluation metrics") + } + + l.evalMetricsCh <- metric + return nil +} + +// PublicResourceBaseURL returns the base URL to access a resource (experiments, projects, etc.) +func PublicResourceBaseURL() string { + site := "datadoghq.com" + if activeLLMObs != nil && activeLLMObs.Config.TracerConfig.Site != "" { + site = activeLLMObs.Config.TracerConfig.Site + } + + baseURL := "https://" + if slices.Contains(ddSitesNeedingAppSubdomain, site) { + baseURL += "app." + } + baseURL += site + return baseURL +} + +func newLLMObsTraceID() string { + var b [16]byte + + // High 32 bits: Unix seconds + secs := uint32(time.Now().Unix()) + binary.BigEndian.PutUint32(b[0:4], secs) + + // Middle 32 bits: zero + // (already zeroed by array initialization) + + // Low 64 bits: random + if _, err := rand.Read(b[8:16]); err != nil { + panic(err) + } + + // Turn into a big.Int + x := new(big.Int).SetBytes(b[:]) + + // 32-byte hex string + return fmt.Sprintf("%032x", x) +} + +// isAPIKeyValid reports whether the given string is a structurally valid API key +func isAPIKeyValid(key string) bool { + if len(key) != 32 { + return false + } + for _, c := range key { + if c > unicode.MaxASCII || (!unicode.IsLower(c) && !unicode.IsNumber(c)) { + return false + } + } + return true +} + +func readableBytes(s int) string { + const base = 1000 + sizes := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB"} + + if s < 10 { + return fmt.Sprintf("%dB", s) + } + e := math.Floor(logn(float64(s), base)) + suffix := sizes[int(e)] + val := math.Floor(float64(s)/math.Pow(base, e)*10+0.5) / 10 + f := "%.0f%s" + if val < 10 { + f = "%.1f%s" + } + return fmt.Sprintf(f, val, suffix) +} + +func logn(n, b float64) float64 { + return math.Log(n) / math.Log(b) +} diff --git a/internal/llmobs/llmobs_test.go b/internal/llmobs/llmobs_test.go new file mode 100644 index 0000000000..4163df6fc9 --- /dev/null +++ b/internal/llmobs/llmobs_test.go @@ -0,0 +1,1846 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs_test + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "strings" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/testtracer" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + llmobstransport "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +const ( + mlApp = "gotest" + testAPIKey = "abcd1234efgh5678ijkl9012mnop3456" +) + +func TestStartSpan(t *testing.T) { + t.Run("simple", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "llm-1", llmobs.StartSpanConfig{}) + span.Finish(llmobs.FinishSpanConfig{}) + + apmSpans := tt.WaitForSpans(t, 1) + s0 := apmSpans[0] + assert.Equal(t, "llm-1", s0.Name) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + assert.Equal(t, "llm-1", l0.Name) + }) + + t.Run("child-spans", func(t *testing.T) { + tt, ll := testTracer(t) + + ctx := context.Background() + ss0, ctx := ll.StartSpan(ctx, llmobs.SpanKindLLM, "llm-1", llmobs.StartSpanConfig{}) + ss1, ctx := ll.StartSpan(ctx, llmobs.SpanKindAgent, "agent-1", llmobs.StartSpanConfig{}) + ss2, ctx := tracer.StartSpanFromContext(ctx, "apm-1") + ss3, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "llm-2", llmobs.StartSpanConfig{}) + + ss3.Finish(llmobs.FinishSpanConfig{}) + ss2.Finish() + ss1.Finish(llmobs.FinishSpanConfig{}) + ss0.Finish(llmobs.FinishSpanConfig{}) + + apmSpans := tt.WaitForSpans(t, 4) + + s0 := apmSpans[0] + s1 := apmSpans[1] + s2 := apmSpans[2] + s3 := apmSpans[3] + + assert.Equal(t, "llm-1", s0.Name) + assert.Equal(t, "agent-1", s1.Name) + assert.Equal(t, "apm-1", s2.Name) + assert.Equal(t, "llm-2", s3.Name) + + apmTraceID := s0.TraceID + assert.Equal(t, apmTraceID, s1.TraceID) + assert.Equal(t, apmTraceID, s2.TraceID) + assert.Equal(t, apmTraceID, s3.TraceID) + + llmSpans := tt.WaitForLLMObsSpans(t, 3) + + l0 := llmSpans[0] + l1 := llmSpans[1] + l2 := llmSpans[2] + + // FIXME: they are in reverse order + assert.Equal(t, "llm-2", l0.Name) + assert.Equal(t, "agent-1", l1.Name) + assert.Equal(t, "llm-1", l2.Name) + + llmobsTraceID := l0.TraceID + assert.Equal(t, llmobsTraceID, l1.TraceID) + assert.Equal(t, llmobsTraceID, l2.TraceID) + }) + + t.Run("distributed-context-propagation", func(t *testing.T) { + tt, ll := testTracer(t) + + h := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + ctx := req.Context() + ss3, ctx := tracer.StartSpanFromContext(ctx, "apm-2") + defer ss3.Finish() + + ss4, _ := ll.StartSpan(ctx, llmobs.SpanKindAgent, "agent-1", llmobs.StartSpanConfig{}) + defer ss4.Finish(llmobs.FinishSpanConfig{}) + + w.Write([]byte("ok")) + }) + srv, cl := testClientServer(t, h) + + genSpans := func() { + ctx := context.Background() + ss0, ctx := ll.StartSpan(ctx, llmobs.SpanKindLLM, "llm-1", llmobs.StartSpanConfig{MLApp: "custom-ml-app"}) + defer ss0.Finish(llmobs.FinishSpanConfig{}) + + ss1, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "workflow-1", llmobs.StartSpanConfig{}) + defer ss1.Finish(llmobs.FinishSpanConfig{}) + + ss2, ctx := tracer.StartSpanFromContext(ctx, "apm-1") + defer ss2.Finish() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, srv.URL+"/", nil) + require.NoError(t, err) + resp, err := cl.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + _ = resp.Body.Close() + } + + genSpans() + apmSpans := tt.WaitForSpans(t, 7) + + httpServer := apmSpans[0] + apm2 := apmSpans[1] + agent1 := apmSpans[2] + llm1 := apmSpans[3] + workflow1 := apmSpans[4] + apm1 := apmSpans[5] + httpClient := apmSpans[6] + + assert.Equal(t, "http.request", httpServer.Name) + assert.Equal(t, "server", httpServer.Meta["span.kind"]) + assert.Equal(t, "apm-2", apm2.Name) + assert.Equal(t, "agent-1", agent1.Name) + assert.Equal(t, "llm-1", llm1.Name) + assert.Equal(t, "workflow-1", workflow1.Name) + assert.Equal(t, "apm-1", apm1.Name) + assert.Equal(t, "http.request", httpClient.Name) + assert.Equal(t, "client", httpClient.Meta["span.kind"]) + + apmTraceID := httpServer.TraceID + assert.Equal(t, apmTraceID, apm2.TraceID, "wrong trace ID for span apm-2") + assert.Equal(t, apmTraceID, agent1.TraceID, "wrong trace ID for span agent-1") + assert.Equal(t, apmTraceID, llm1.TraceID, "wrong trace ID for span llm-1") + assert.Equal(t, apmTraceID, workflow1.TraceID, "wrong trace ID for span workflow-1") + assert.Equal(t, apmTraceID, apm1.TraceID, "wrong trace ID for span apm-1") + assert.Equal(t, apmTraceID, httpClient.TraceID, "wrong trace ID for span http-client") + + // check correct span linkage + assert.Equal(t, httpClient.SpanID, httpServer.ParentID) + assert.Equal(t, httpServer.SpanID, apm2.ParentID) + assert.Equal(t, apm2.SpanID, agent1.ParentID) + + assert.Equal(t, apm1.SpanID, httpClient.ParentID) + assert.Equal(t, llm1.SpanID, workflow1.ParentID) + assert.Equal(t, workflow1.SpanID, apm1.ParentID) + assert.Equal(t, uint64(0), llm1.ParentID) + + llmSpans := tt.WaitForLLMObsSpans(t, 3) + + l0 := llmSpans[0] + l1 := llmSpans[1] + l2 := llmSpans[2] + + assert.Equal(t, "agent-1", l0.Name) + assert.Equal(t, "custom-ml-app", findTag(l0.Tags, "ml_app"), "wrong ml_app for span agent-1") + assert.Equal(t, "workflow-1", l1.Name) + assert.Equal(t, "custom-ml-app", findTag(l1.Tags, "ml_app"), "wrong ml_app for span workflow-1") + assert.Equal(t, "llm-1", l2.Name) + assert.Equal(t, "custom-ml-app", findTag(l2.Tags, "ml_app"), "wrong ml_app for span llm-1") + + llmTraceID := l0.TraceID + assert.Equal(t, llmTraceID, l0.TraceID) + assert.Equal(t, llmTraceID, l1.TraceID) + }) + + t.Run("custom-start-and-finish-times", func(t *testing.T) { + tt, ll := testTracer(t) + + ctx := context.Background() + + // Define custom times + customStartTime := time.Date(2024, 1, 1, 12, 0, 0, 0, time.UTC) + customFinishTime := customStartTime.Add(5 * time.Second) + + // Start span with custom start time + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "", llmobs.StartSpanConfig{ + StartTime: customStartTime, + }) + + // Finish span with custom finish time + span.Finish(llmobs.FinishSpanConfig{ + FinishTime: customFinishTime, + }) + + // Validate APM span + apmSpans := tt.WaitForSpans(t, 1) + s0 := apmSpans[0] + assert.Equal(t, "llm", s0.Name) + assert.Equal(t, customStartTime.UnixNano(), s0.Start) + assert.Equal(t, customFinishTime.Sub(customStartTime).Nanoseconds(), s0.Duration) + + // Validate LLMObs span + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + assert.Equal(t, "llm", l0.Name) + assert.Equal(t, customStartTime.UnixNano(), l0.StartNS) + assert.Equal(t, customFinishTime.Sub(customStartTime).Nanoseconds(), l0.Duration) + }) + +} + +func TestSpanAnnotate(t *testing.T) { + testCases := []struct { + name string + kind llmobs.SpanKind + annotations llmobs.SpanAnnotations + config llmobs.StartSpanConfig + wantMeta map[string]any + wantMetrics map[string]float64 + wantTags []string + wantSessionID string + }{ + { + name: "basic-metadata-metrics-tags", + kind: llmobs.SpanKindAgent, + annotations: llmobs.SpanAnnotations{ + Metadata: map[string]any{ + "temperature": 0.7, + "max_tokens": 100, + }, + Metrics: map[string]float64{ + "input_tokens": 50, + "output_tokens": 25, + "total_tokens": 75, + }, + Tags: map[string]string{ + "model_version": "v1.0", + "custom_tag": "custom_value", + }, + }, + wantMeta: map[string]any{ + "span.kind": "agent", + "metadata": map[string]any{ + "temperature": 0.7, + "max_tokens": float64(100), + }, + }, + wantMetrics: map[string]float64{ + "input_tokens": 50, + "output_tokens": 25, + "total_tokens": 75, + }, + wantTags: []string{ + "model_version:v1.0", + "custom_tag:custom_value", + }, + }, + { + name: "llm-span-with-text-io", + kind: llmobs.SpanKindLLM, + annotations: llmobs.SpanAnnotations{ + InputText: "input text content", + OutputText: "output text content", + }, + wantMeta: map[string]any{ + "span.kind": "llm", + "input": map[string]any{ + "messages": []any{ + map[string]any{ + "content": "input text content", + "role": "", + }, + }, + }, + "output": map[string]any{ + "messages": []any{ + map[string]any{ + "content": "output text content", + "role": "", + }, + }, + }, + }, + }, + { + name: "agent-span-with-manifest", + kind: llmobs.SpanKindAgent, + annotations: llmobs.SpanAnnotations{ + AgentManifest: "agent-manifest-data", + }, + wantMeta: map[string]any{ + "span.kind": "agent", + "metadata": map[string]any{ + "agent_manifest": "agent-manifest-data", + }, + }, + }, + { + name: "embedding-span-with-text-output", + kind: llmobs.SpanKindEmbedding, + annotations: llmobs.SpanAnnotations{ + OutputText: "embedding-vector-representation", + }, + wantMeta: map[string]any{ + "span.kind": "embedding", + "output": map[string]any{ + "value": "embedding-vector-representation", + }, + }, + }, + { + name: "retrieval-span-with-text-input", + kind: llmobs.SpanKindRetrieval, + annotations: llmobs.SpanAnnotations{ + InputText: "search query", + }, + wantMeta: map[string]any{ + "span.kind": "retrieval", + "input": map[string]any{ + "value": "search query", + }, + }, + }, + { + name: "experiment-span-with-experiment-data", + kind: llmobs.SpanKindExperiment, + annotations: llmobs.SpanAnnotations{ + ExperimentInput: map[string]any{ + "question": "What is AI?", + "context": "Technology context", + }, + ExperimentOutput: "AI is artificial intelligence", + ExperimentExpectedOutput: "AI is artificial intelligence technology", + }, + wantMeta: map[string]any{ + "span.kind": "experiment", + "input": map[string]any{ + "question": "What is AI?", + "context": "Technology context", + }, + "output": "AI is artificial intelligence", + "expected_output": "AI is artificial intelligence technology", + }, + }, + { + name: "model-name-and-provider", + kind: llmobs.SpanKindLLM, + config: llmobs.StartSpanConfig{ + ModelName: "gpt-4", + ModelProvider: "OpenAI", + }, + wantMeta: map[string]any{ + "span.kind": "llm", + "model_name": "gpt-4", + "model_provider": "openai", + }, + }, + { + name: "prompt-ignored-on-non-llm-span", + kind: llmobs.SpanKindAgent, + annotations: llmobs.SpanAnnotations{ + Prompt: &llmobs.Prompt{Template: "test prompt"}, + }, + wantMeta: map[string]any{ + "span.kind": "agent", + }, + }, + { + name: "agent-manifest-ignored-on-non-agent-span", + kind: llmobs.SpanKindLLM, + annotations: llmobs.SpanAnnotations{ + AgentManifest: "test manifest", + }, + wantMeta: map[string]any{ + "span.kind": "llm", + }, + }, + { + name: "llm-span-with-messages", + kind: llmobs.SpanKindLLM, + annotations: llmobs.SpanAnnotations{ + InputMessages: []llmobs.LLMMessage{ + {Role: "user", Content: "What is the capital of France?"}, + {Role: "system", Content: "You are a helpful assistant."}, + }, + OutputMessages: []llmobs.LLMMessage{ + {Role: "assistant", Content: "The capital of France is Paris."}, + }, + }, + wantMeta: map[string]any{ + "span.kind": "llm", + "input": map[string]any{ + "messages": []any{ + map[string]any{ + "role": "user", + "content": "What is the capital of France?", + }, + map[string]any{ + "role": "system", + "content": "You are a helpful assistant.", + }, + }, + }, + "output": map[string]any{ + "messages": []any{ + map[string]any{ + "role": "assistant", + "content": "The capital of France is Paris.", + }, + }, + }, + }, + }, + { + name: "embedding-span-with-input-documents", + kind: llmobs.SpanKindEmbedding, + annotations: llmobs.SpanAnnotations{ + InputEmbeddedDocs: []llmobs.EmbeddedDocument{ + {Text: "Document 1 content", Name: "doc1.txt", Score: 0.92, ID: "embed-1"}, + {Text: "Document 2 content", Name: "doc2.txt", Score: 0.88, ID: "embed-2"}, + }, + OutputText: "embedding-vector-representation", + }, + wantMeta: map[string]any{ + "span.kind": "embedding", + "input": map[string]any{ + "documents": []any{ + map[string]any{ + "text": "Document 1 content", + "name": "doc1.txt", + "score": 0.92, + "id": "embed-1", + }, + map[string]any{ + "text": "Document 2 content", + "name": "doc2.txt", + "score": 0.88, + "id": "embed-2", + }, + }, + }, + "output": map[string]any{ + "value": "embedding-vector-representation", + }, + }, + }, + { + name: "retrieval-span-with-output-documents", + kind: llmobs.SpanKindRetrieval, + annotations: llmobs.SpanAnnotations{ + InputText: "search query", + OutputRetrievedDocs: []llmobs.RetrievedDocument{ + {Text: "Retrieved doc 1", Name: "doc1.txt", Score: 0.95, ID: "doc-1"}, + {Text: "Retrieved doc 2", Name: "doc2.txt", Score: 0.87, ID: "doc-2"}, + }, + }, + wantMeta: map[string]any{ + "span.kind": "retrieval", + "input": map[string]any{ + "value": "search query", + }, + "output": map[string]any{ + "documents": []any{ + map[string]any{ + "text": "Retrieved doc 1", + "name": "doc1.txt", + "score": 0.95, + "id": "doc-1", + }, + map[string]any{ + "text": "Retrieved doc 2", + "name": "doc2.txt", + "score": 0.87, + "id": "doc-2", + }, + }, + }, + }, + }, + { + name: "session-id-from-tags", + kind: llmobs.SpanKindLLM, + annotations: llmobs.SpanAnnotations{ + Tags: map[string]string{ + llmobs.TagKeySessionID: "custom-session-123", + "experiment_type": "qa", + "custom_tag": "custom_value", + }, + }, + wantMeta: map[string]any{ + "span.kind": "llm", + }, + wantTags: []string{ + "experiment_type:qa", + "custom_tag:custom_value", + }, + wantSessionID: "custom-session-123", + }, + { + name: "ml-app-from-config", + kind: llmobs.SpanKindAgent, + config: llmobs.StartSpanConfig{ + MLApp: "custom-ml-app", + }, + wantMeta: map[string]any{ + "span.kind": "agent", + }, + wantTags: []string{ + "ml_app:custom-ml-app", + }, + }, + { + name: "model-info-from-config", + kind: llmobs.SpanKindLLM, + config: llmobs.StartSpanConfig{ + ModelName: "gpt-4-turbo", + ModelProvider: "OpenAI", + }, + wantMeta: map[string]any{ + "span.kind": "llm", + "model_name": "gpt-4-turbo", + "model_provider": "openai", // should be lowercased + }, + }, + { + name: "embedding-model-info-from-config", + kind: llmobs.SpanKindEmbedding, + config: llmobs.StartSpanConfig{ + ModelName: "text-embedding-ada-002", + ModelProvider: "OpenAI", + }, + wantMeta: map[string]any{ + "span.kind": "embedding", + "model_name": "text-embedding-ada-002", + "model_provider": "openai", // should be lowercased + }, + }, + { + name: "session-id-and-ml-app-combined", + kind: llmobs.SpanKindWorkflow, + config: llmobs.StartSpanConfig{ + MLApp: "workflow-app", + SessionID: "config-session-456", + }, + annotations: llmobs.SpanAnnotations{ + Tags: map[string]string{ + "workflow_type": "sequential", + }, + }, + wantMeta: map[string]any{ + "span.kind": "workflow", + }, + wantTags: []string{ + "ml_app:workflow-app", + "workflow_type:sequential", + }, + wantSessionID: "config-session-456", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tt, ll := testTracer(t) + span, _ := ll.StartSpan(context.Background(), tc.kind, "", tc.config) + span.Annotate(tc.annotations) + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + + if tc.wantMeta != nil { + for key, expectedValue := range tc.wantMeta { + assert.Contains(t, l0.Meta, key, "Missing key %q in meta", key) + assert.Equal(t, expectedValue, l0.Meta[key], "Mismatch for meta key %q", key) + } + } + + if tc.wantMetrics != nil { + for key, expectedValue := range tc.wantMetrics { + assert.Contains(t, l0.Metrics, key, "Missing key %q in metrics", key) + assert.Equal(t, expectedValue, l0.Metrics[key], "Mismatch for metrics key %q", key) + } + } + + if tc.wantTags != nil { + for _, expectedTag := range tc.wantTags { + parts := strings.Split(expectedTag, ":") + require.Len(t, parts, 2, "Expected tag format 'key:value', got %q", expectedTag) + expectedKey, expectedValue := parts[0], parts[1] + + actualValue := findTag(l0.Tags, expectedKey) + assert.Equal(t, expectedValue, actualValue, "Tag %q: expected %q, got %q", expectedKey, expectedValue, actualValue) + } + } + + if tc.wantSessionID != "" { + assert.Equal(t, tc.wantSessionID, l0.SessionID, "Session ID mismatch") + } + }) + } +} + +func TestSpanTruncation(t *testing.T) { + t.Run("text-input", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + span, _ := ll.StartSpan(ctx, llmobs.SpanKindTask, "", llmobs.StartSpanConfig{}) + + // Create very large strings that will exceed the 5MB size limit when JSON marshaled + largeContent := strings.Repeat("x", 3_000_000) // 3MB each + + span.Annotate(llmobs.SpanAnnotations{ + InputText: largeContent, + OutputText: largeContent, + Metadata: map[string]any{ + "large_field1": strings.Repeat("a", 1_000_000), // 1MB + "large_field2": strings.Repeat("b", 1_000_000), // 1MB + }, + }) + + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + + // Check that input and output were truncated + if inputMap, ok := l0.Meta["input"].(map[string]any); ok { + if inputValue, exists := inputMap["value"]; exists { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", inputValue) + } + } + + if outputMap, ok := l0.Meta["output"].(map[string]any); ok { + if outputValue, exists := outputMap["value"]; exists { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", outputValue) + } + } + + // Check that collection errors were set + assert.Contains(t, l0.CollectionErrors, "dropped_io") + + // Metadata should still be present (only input/output are truncated) + if metadata, ok := l0.Meta["metadata"].(map[string]any); ok { + assert.Contains(t, metadata, "large_field1") + assert.Contains(t, metadata, "large_field2") + } + }) + t.Run("llm-messages", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "", llmobs.StartSpanConfig{}) + + // Create large messages + largeContent := strings.Repeat("x", 3_000_000) // 3MB each + + span.Annotate(llmobs.SpanAnnotations{ + InputMessages: []llmobs.LLMMessage{ + {Content: largeContent, Role: "user"}, + }, + OutputMessages: []llmobs.LLMMessage{ + {Content: largeContent, Role: "assistant"}, + }, + }) + + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + + // Should be truncated to {"value": DROPPED_VALUE_TEXT} like Python + if inputMap, ok := l0.Meta["input"].(map[string]any); ok { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", inputMap["value"]) + assert.NotContains(t, inputMap, "messages", "Original messages should be replaced") + } + + if outputMap, ok := l0.Meta["output"].(map[string]any); ok { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", outputMap["value"]) + assert.NotContains(t, outputMap, "messages", "Original messages should be replaced") + } + + assert.Contains(t, l0.CollectionErrors, "dropped_io") + }) + t.Run("embedded-docs", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + span, _ := ll.StartSpan(ctx, llmobs.SpanKindEmbedding, "", llmobs.StartSpanConfig{}) + + // Create large embedded documents + largeContent := strings.Repeat("x", 3_000_000) // 3MB each + + span.Annotate(llmobs.SpanAnnotations{ + InputEmbeddedDocs: []llmobs.EmbeddedDocument{ + {Text: largeContent, Name: "large1.txt", Score: 0.95, ID: "large-1"}, + {Text: largeContent, Name: "large2.txt", Score: 0.90, ID: "large-2"}, + }, + OutputText: largeContent, + }) + + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + + // Should be truncated to {"value": DROPPED_VALUE_TEXT} like Python + if inputMap, ok := l0.Meta["input"].(map[string]any); ok { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", inputMap["value"]) + assert.NotContains(t, inputMap, "documents", "Original documents should be replaced") + } + + if outputMap, ok := l0.Meta["output"].(map[string]any); ok { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", outputMap["value"]) + } + + assert.Contains(t, l0.CollectionErrors, "dropped_io") + }) + t.Run("retrieved-docs", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + span, _ := ll.StartSpan(ctx, llmobs.SpanKindRetrieval, "", llmobs.StartSpanConfig{}) + + // Create large retrieved documents + largeContent := strings.Repeat("x", 3_000_000) // 3MB each + + span.Annotate(llmobs.SpanAnnotations{ + InputText: "search query", + OutputRetrievedDocs: []llmobs.RetrievedDocument{ + {Text: largeContent, Name: "doc1.txt", Score: 0.95, ID: "doc-1"}, + {Text: largeContent, Name: "doc2.txt", Score: 0.87, ID: "doc-2"}, + }, + }) + + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + + // Should be truncated to {"value": DROPPED_VALUE_TEXT} like Python + if inputMap, ok := l0.Meta["input"].(map[string]any); ok { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", inputMap["value"]) + } + + if outputMap, ok := l0.Meta["output"].(map[string]any); ok { + assert.Equal(t, "[This value has been dropped because this span's size exceeds the 1MB size limit.]", outputMap["value"]) + assert.NotContains(t, outputMap, "documents", "Original documents should be replaced") + } + + assert.Contains(t, l0.CollectionErrors, "dropped_io") + }) +} + +func TestPropagatedInfo(t *testing.T) { + t.Run("trace-id-from-parent", func(t *testing.T) { + _, ll := testTracer(t) + ctx := context.Background() + + // Create parent span + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "parent", llmobs.StartSpanConfig{}) + parentTraceID := parentSpan.TraceID() + + // Create child span - should inherit trace ID + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{}) + + assert.Equal(t, parentTraceID, childSpan.TraceID(), "Child should inherit parent's trace ID") + + parentSpan.Finish(llmobs.FinishSpanConfig{}) + childSpan.Finish(llmobs.FinishSpanConfig{}) + }) + + t.Run("trace-id-from-propagated", func(t *testing.T) { + _, ll := testTracer(t) + ctx := context.Background() + + // Create propagated span context + propagated := &llmobs.PropagatedLLMSpan{ + TraceID: "propagated-trace-123", + SpanID: "propagated-span-456", + MLApp: "propagated-app", + } + ctx = llmobs.ContextWithPropagatedLLMSpan(ctx, propagated) + + // Create span - should inherit propagated trace ID + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "span", llmobs.StartSpanConfig{}) + + assert.Equal(t, "propagated-trace-123", span.TraceID(), "Should inherit propagated trace ID") + + span.Finish(llmobs.FinishSpanConfig{}) + }) + + t.Run("ml-app-precedence", func(t *testing.T) { + // Test precedence: config > parent > propagated > global + t.Run("config-overrides-all", func(t *testing.T) { + _, ll := testTracer(t) + ctx := context.Background() + + // Create parent with ML App + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "parent", llmobs.StartSpanConfig{ + MLApp: "parent-app", + }) + + // Add propagated span with different ML App + propagated := &llmobs.PropagatedLLMSpan{ + MLApp: "propagated-app", + TraceID: "trace-123", + SpanID: "span-456", + } + ctx = llmobs.ContextWithPropagatedLLMSpan(ctx, propagated) + + // Create child with explicit ML App - should use config value + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{ + MLApp: "config-app", + }) + + assert.Equal(t, "config-app", childSpan.MLApp(), "Config ML App should take precedence") + + parentSpan.Finish(llmobs.FinishSpanConfig{}) + childSpan.Finish(llmobs.FinishSpanConfig{}) + }) + + t.Run("parent-overrides-propagated", func(t *testing.T) { + _, ll := testTracer(t) + ctx := context.Background() + + // Create parent with ML App + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "parent", llmobs.StartSpanConfig{ + MLApp: "parent-app", + }) + + // Add propagated span with different ML App + propagated := &llmobs.PropagatedLLMSpan{ + MLApp: "propagated-app", + TraceID: "trace-123", + SpanID: "span-456", + } + ctx = llmobs.ContextWithPropagatedLLMSpan(ctx, propagated) + + // Create child without explicit ML App - should use parent's + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{}) + + assert.Equal(t, "parent-app", childSpan.MLApp(), "Parent ML App should override propagated") + + parentSpan.Finish(llmobs.FinishSpanConfig{}) + childSpan.Finish(llmobs.FinishSpanConfig{}) + }) + + t.Run("propagated-overrides-global", func(t *testing.T) { + _, ll := testTracer(t) + ctx := context.Background() + + // Add propagated span with ML App + propagated := &llmobs.PropagatedLLMSpan{ + MLApp: "propagated-app", + TraceID: "trace-123", + SpanID: "span-456", + } + ctx = llmobs.ContextWithPropagatedLLMSpan(ctx, propagated) + + // Create span without explicit ML App - should use propagated + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "span", llmobs.StartSpanConfig{}) + + assert.Equal(t, "propagated-app", span.MLApp(), "Propagated ML App should override global") + + span.Finish(llmobs.FinishSpanConfig{}) + }) + }) + + t.Run("session-id-precedence", func(t *testing.T) { + t.Run("config-overrides-parent", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + + // Create parent with session ID + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "parent", llmobs.StartSpanConfig{ + SessionID: "parent-session", + }) + + // Create child with explicit session ID - should use config value + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{ + SessionID: "config-session", + }) + + childSpan.Finish(llmobs.FinishSpanConfig{}) + parentSpan.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 2) + + // Find the child span (should be first due to finish order) + var childLLMSpan *testtracer.LLMObsSpan + for i := range llmSpans { + if llmSpans[i].Name == "child" { + childLLMSpan = &llmSpans[i] + break + } + } + require.NotNil(t, childLLMSpan, "Child span should be found") + assert.Equal(t, "config-session", childLLMSpan.SessionID, "Config session ID should take precedence") + }) + t.Run("parent-session-id-inherited", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + + // Create parent with session ID + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "parent", llmobs.StartSpanConfig{ + SessionID: "parent-session", + }) + + // Create child without explicit session ID - should inherit from parent + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{}) + + childSpan.Finish(llmobs.FinishSpanConfig{}) + parentSpan.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 2) + + // Find the child span + var childLLMSpan *testtracer.LLMObsSpan + for i := range llmSpans { + if llmSpans[i].Name == "child" { + childLLMSpan = &llmSpans[i] + break + } + } + require.NotNil(t, childLLMSpan, "Child span should be found") + assert.Equal(t, "parent-session", childLLMSpan.SessionID, "Should inherit parent's session ID") + }) + + t.Run("session-id-from-tags", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + + // Create span and annotate with session ID via tags + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "span", llmobs.StartSpanConfig{}) + + span.Annotate(llmobs.SpanAnnotations{ + Tags: map[string]string{ + llmobs.TagKeySessionID: "tags-session", + }, + }) + + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + assert.Equal(t, "tags-session", llmSpans[0].SessionID, "Session ID should be set from tags") + }) + }) + t.Run("multi-level-propagation", func(t *testing.T) { + tt, ll := testTracer(t) + + ctx := context.Background() + + // Create grandparent span + grandparentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "grandparent", llmobs.StartSpanConfig{ + MLApp: "grandparent-app", + SessionID: "grandparent-session", + }) + + // Create parent span (no explicit values - should inherit) + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindAgent, "parent", llmobs.StartSpanConfig{}) + + // Create child span (no explicit values - should inherit from grandparent through parent) + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{}) + + assert.Equal(t, "grandparent-app", childSpan.MLApp(), "Should inherit ML App through parent chain") + + childSpan.Finish(llmobs.FinishSpanConfig{}) + parentSpan.Finish(llmobs.FinishSpanConfig{}) + grandparentSpan.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 3) + + // Find child span and verify session ID propagation + var childLLMSpan *testtracer.LLMObsSpan + for i := range llmSpans { + if llmSpans[i].Name == "child" { + childLLMSpan = &llmSpans[i] + break + } + } + require.NotNil(t, childLLMSpan, "Child span should be found") + assert.Equal(t, "grandparent-session", childLLMSpan.SessionID, "Should inherit session ID through parent chain") + }) + t.Run("session-id-tag-is-also-set", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + + // Create span with session ID + span, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "test-span", llmobs.StartSpanConfig{ + SessionID: "test-session-123", + }) + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + l0 := llmSpans[0] + + // Verify SessionID field is set + assert.Equal(t, "test-session-123", l0.SessionID, "SessionID field should be set") + + // Verify the session_id tag is also present + sessionIDTag := findTag(l0.Tags, "session_id") + assert.Equal(t, "test-session-123", sessionIDTag, "session_id tag should be present in Tags array") + }) + t.Run("mixed-propagation-sources", func(t *testing.T) { + tt, ll := testTracer(t) + ctx := context.Background() + + // Add propagated span context + propagated := &llmobs.PropagatedLLMSpan{ + TraceID: "propagated-trace", + SpanID: "propagated-span", + MLApp: "propagated-app", + } + ctx = llmobs.ContextWithPropagatedLLMSpan(ctx, propagated) + + // Create parent span with session ID but no ML App + parentSpan, ctx := ll.StartSpan(ctx, llmobs.SpanKindWorkflow, "parent", llmobs.StartSpanConfig{ + SessionID: "parent-session", + }) + + // Create child span - should get ML App from propagated and session ID from parent + childSpan, _ := ll.StartSpan(ctx, llmobs.SpanKindLLM, "child", llmobs.StartSpanConfig{}) + + assert.Equal(t, "propagated-trace", childSpan.TraceID(), "Should use propagated trace ID") + assert.Equal(t, "propagated-app", childSpan.MLApp(), "Should use propagated ML App") + + childSpan.Finish(llmobs.FinishSpanConfig{}) + parentSpan.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 2) + + // Find child span and verify session ID from parent + var childLLMSpan *testtracer.LLMObsSpan + for i := range llmSpans { + if llmSpans[i].Name == "child" { + childLLMSpan = &llmSpans[i] + break + } + } + require.NotNil(t, childLLMSpan, "Child span should be found") + assert.Equal(t, "parent-session", childLLMSpan.SessionID, "Should inherit session ID from parent") + }) +} + +func TestSubmitEvaluation(t *testing.T) { + testCases := []struct { + name string + config llmobs.EvaluationConfig + wantError string + wantMetric func() llmobstransport.LLMObsMetric + }{ + { + name: "span-join-categorical", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "accuracy", + CategoricalValue: ptrFromVal("correct"), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"env:test"}, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Span: &llmobstransport.EvaluationSpanJoin{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + }, + }, + MetricType: "categorical", + Label: "accuracy", + CategoricalValue: ptrFromVal("correct"), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"env:test", "ddtrace.version:" + version.Tag}, + } + }, + }, + { + name: "span-join-score", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "rating", + ScoreValue: ptrFromVal(0.85), + MLApp: "test-app", + TimestampMS: 1234567890, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Span: &llmobstransport.EvaluationSpanJoin{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + }, + }, + MetricType: "score", + Label: "rating", + ScoreValue: ptrFromVal(0.85), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"ddtrace.version:" + version.Tag}, + } + }, + }, + { + name: "span-join-boolean", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "is_valid", + BooleanValue: ptrFromVal(true), + MLApp: "test-app", + TimestampMS: 1234567890, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Span: &llmobstransport.EvaluationSpanJoin{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + }, + }, + MetricType: "boolean", + Label: "is_valid", + BooleanValue: ptrFromVal(true), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"ddtrace.version:" + version.Tag}, + } + }, + }, + { + name: "tag-join-categorical", + config: llmobs.EvaluationConfig{ + TagKey: "session_id", + TagValue: "session-123", + Label: "quality", + CategoricalValue: ptrFromVal("high"), + MLApp: "test-app", + TimestampMS: 1234567890, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Tag: &llmobstransport.EvaluationTagJoin{ + Key: "session_id", + Value: "session-123", + }, + }, + MetricType: "categorical", + Label: "quality", + CategoricalValue: ptrFromVal("high"), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"ddtrace.version:" + version.Tag}, + } + }, + }, + { + name: "missing-join-info", + config: llmobs.EvaluationConfig{ + Label: "test", + CategoricalValue: ptrFromVal("value"), + }, + wantError: "must provide either span/trace IDs or tag key/value for joining", + }, + { + name: "both-join-methods", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + TagKey: "session_id", + TagValue: "session-123", + Label: "test", + CategoricalValue: ptrFromVal("value"), + }, + wantError: "provide either span/trace IDs or tag key/value, not both", + }, + { + name: "no-value-provided", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "test", + }, + wantError: "exactly one metric value (categorical, score, or boolean) must be provided", + }, + { + name: "multiple-values-provided", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "test", + CategoricalValue: ptrFromVal("value"), + ScoreValue: ptrFromVal(0.5), + }, + wantError: "exactly one metric value (categorical, score, or boolean) must be provided", + }, + { + name: "ddtrace-version-auto-added", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "accuracy", + CategoricalValue: ptrFromVal("correct"), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"env:test", "team:ml"}, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Span: &llmobstransport.EvaluationSpanJoin{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + }, + }, + MetricType: "categorical", + Label: "accuracy", + CategoricalValue: ptrFromVal("correct"), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"env:test", "team:ml", "ddtrace.version:" + version.Tag}, + } + }, + }, + { + name: "ddtrace-version-replaced-if-exists", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "rating", + ScoreValue: ptrFromVal(0.95), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"env:prod", "ddtrace.version:custom-version"}, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Span: &llmobstransport.EvaluationSpanJoin{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + }, + }, + MetricType: "score", + Label: "rating", + ScoreValue: ptrFromVal(0.95), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"env:prod", "ddtrace.version:" + version.Tag}, + } + }, + }, + { + name: "ddtrace-version-added-when-no-tags", + config: llmobs.EvaluationConfig{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + Label: "correctness", + BooleanValue: ptrFromVal(true), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: nil, + }, + wantMetric: func() llmobstransport.LLMObsMetric { + return llmobstransport.LLMObsMetric{ + JoinOn: llmobstransport.EvaluationJoinOn{ + Span: &llmobstransport.EvaluationSpanJoin{ + SpanID: "test-span-id", + TraceID: "test-trace-id", + }, + }, + MetricType: "boolean", + Label: "correctness", + BooleanValue: ptrFromVal(true), + MLApp: "test-app", + TimestampMS: 1234567890, + Tags: []string{"ddtrace.version:" + version.Tag}, + } + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + tt, ll := testTracer(t) + + err := ll.SubmitEvaluation(tc.config) + if tc.wantError != "" { + require.Error(t, err) + assert.Contains(t, err.Error(), tc.wantError) + return + } + require.NoError(t, err) + + got := tt.WaitForLLMObsMetrics(t, 1) + require.Len(t, got, 1) + + assert.Equal(t, tc.wantMetric(), got[0]) + }) + } +} + +func TestLLMObsLifecycle(t *testing.T) { + t.Run("start-stop", func(t *testing.T) { + // Ensure no active LLMObs initially + _, err := llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + + // Start LLMObs + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLogStartup(false), + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt.Stop() + + // Now should have active LLMObs + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.NotNil(t, ll) + assert.Equal(t, "test-app", ll.Config.MLApp) + + // Stop LLMObs + llmobs.Stop() + + // Should no longer have active LLMObs + _, err = llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + }) + t.Run("multiple-start-stop", func(t *testing.T) { + // Start first instance + tt1 := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("app1"), + tracer.WithLogStartup(false), + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt1.Stop() + + ll1, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Equal(t, "app1", ll1.Config.MLApp) + + // Start second instance (should replace first) + tt2 := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("app2"), + tracer.WithLogStartup(false), + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt2.Stop() + + ll2, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Equal(t, "app2", ll2.Config.MLApp) + assert.NotEqual(t, ll1, ll2) // Should be different instances + + // Stop and verify + llmobs.Stop() + _, err = llmobs.ActiveLLMObs() + assert.Error(t, err) + }) + t.Run("flush", func(t *testing.T) { + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("flush-test"), + tracer.WithLogStartup(false), + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt.Stop() + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + + // Create a span but don't wait for automatic flush + ctx := context.Background() + span, _ := ll.StartSpan(ctx, llmobs.SpanKindTask, "flush-test-span", llmobs.StartSpanConfig{}) + span.Finish(llmobs.FinishSpanConfig{}) + + // Use tracer.Flush instead of llmobs.Flush to test the integration: + // This ensures that the main tracer's Flush() properly calls llmobs.Flush() + // when LLMObs is enabled, which is the expected behavior in real usage. + tracer.Flush() + + // Verify span was flushed immediately + assert.Eventually(t, func() bool { + return len(tt.SentPayloads().LLMSpans) == 1 + }, 100*time.Millisecond, 10*time.Millisecond, "Expected LLMObs span to be flushed immediately") + assert.Equal(t, "flush-test-span", tt.SentPayloads().LLMSpans[0].Name) + }) + t.Run("flush-without-active-llmobs", func(t *testing.T) { + // Ensure no active LLMObs + llmobs.Stop() + + // Should not panic when calling Flush with no active LLMObs + assert.NotPanics(t, func() { + llmobs.Flush() + }) + }) + t.Run("stop-without-active-llmobs", func(t *testing.T) { + // Ensure no active LLMObs + llmobs.Stop() + + // Should not panic when calling Stop with no active LLMObs + assert.NotPanics(t, func() { + llmobs.Stop() + }) + }) + t.Run("tracer-stop-integration", func(t *testing.T) { + _ = testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("stop-test"), + tracer.WithLogStartup(false), + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + + // Verify LLMObs is active + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Equal(t, "stop-test", ll.Config.MLApp) + + // Use tracer.Stop instead of tt.Stop to test the integration: + // This ensures that the main tracer's Stop() properly calls llmobs.Stop() + // when LLMObs is enabled, which is the expected behavior in real usage. + tracer.Stop() + + // Verify LLMObs was stopped + _, err = llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + }) + t.Run("llmobs-disabled", func(t *testing.T) { + // Start tracer without LLMObs enabled + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(false), + tracer.WithLogStartup(false), + ), + ) + defer tt.Stop() + + // Should not have active LLMObs + _, err := llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + + // Flush should not panic when LLMObs is disabled + assert.NotPanics(t, func() { + tracer.Flush() + }) + + // Stop should not panic when LLMObs is disabled + assert.NotPanics(t, func() { + llmobs.Stop() + }) + }) + t.Run("llmobs-enabled-without-ml-app", func(t *testing.T) { + t.Setenv("DD_API_KEY", testAPIKey) + + // Start tracer directly with LLMObs enabled but no ML app - should return error + err := tracer.Start( + tracer.WithLLMObsEnabled(true), + tracer.WithLogStartup(false), + ) + defer tracer.Stop() + + // Should get error from tracer.Start due to missing ML app + require.Error(t, err) + assert.Contains(t, err.Error(), "ML App is required") + + // Should not have active LLMObs due to startup failure + _, err = llmobs.ActiveLLMObs() + require.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + }) + t.Run("agentless-disabled-without-agent-support", func(t *testing.T) { + // Start tracer with agentless explicitly disabled but without agent support - should return error + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLLMObsAgentlessEnabled(false), + tracer.WithLogStartup(false), + ), + testtracer.WithRequireNoTracerStartError(false), + ) + + require.Error(t, tt.StartError()) + assert.Contains(t, tt.StartError().Error(), "the agent is not available or does not support LLMObs") + }) + t.Run("env-vars-config", func(t *testing.T) { + t.Setenv("DD_LLMOBS_ENABLED", "true") + t.Setenv("DD_LLMOBS_ML_APP", "env-test-app") + t.Setenv("DD_LLMOBS_AGENTLESS_ENABLED", "false") + + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt.Stop() + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Equal(t, "env-test-app", ll.Config.MLApp) + assert.True(t, ll.Config.Enabled) + require.NotNil(t, ll.Config.AgentlessEnabled, "AgentlessEnabled should not be nil when set via env var") + assert.False(t, *ll.Config.AgentlessEnabled, "Should respect DD_LLMOBS_AGENTLESS_ENABLED=false") + assert.False(t, ll.Config.ResolvedAgentlessEnabled, "Should resolve to agentless=false") + + ctx := context.Background() + span, _ := ll.StartSpan(ctx, llmobs.SpanKindTask, "env-test-span", llmobs.StartSpanConfig{}) + span.Finish(llmobs.FinishSpanConfig{}) + + llmSpans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, llmSpans, 1) + assert.Equal(t, "env-test-span", llmSpans[0].Name) + }) + t.Run("env-vars-disabled", func(t *testing.T) { + t.Setenv("DD_LLMOBS_ENABLED", "false") + t.Setenv("DD_LLMOBS_ML_APP", "should-be-ignored") + + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLogStartup(false), + ), + ) + defer tt.Stop() + + _, err := llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + }) + t.Run("code-config-overrides-env-vars", func(t *testing.T) { + t.Setenv("DD_LLMOBS_ENABLED", "false") + t.Setenv("DD_LLMOBS_ML_APP", "env-app") + + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("code-app"), + tracer.WithLLMObsAgentlessEnabled(false), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt.Stop() + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Equal(t, "code-app", ll.Config.MLApp) + assert.True(t, ll.Config.Enabled) + }) + t.Run("agentless-defaults-false-when-evp-proxy-available", func(t *testing.T) { + // When agent supports evp_proxy/v2, should default to agentless=false + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("agentless-test"), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, // Agent supports evp_proxy + }), + ) + defer tt.Stop() + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Nil(t, ll.Config.AgentlessEnabled, "AgentlessEnabled should be nil when not explicitly set") + assert.False(t, ll.Config.ResolvedAgentlessEnabled, "Should default to agentless=false when agent supports evp_proxy") + }) + t.Run("agentless-defaults-true-when-evp-proxy-unavailable", func(t *testing.T) { + // Set valid API key (32 chars, lowercase + numbers only) + t.Setenv("DD_API_KEY", testAPIKey) + + // When agent doesn't support evp_proxy/v2, should default to agentless=true + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("agentless-test"), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{}, // Agent doesn't support evp_proxy + }), + ) + defer tt.Stop() + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + assert.Nil(t, ll.Config.AgentlessEnabled, "AgentlessEnabled should be nil when not explicitly set") + assert.True(t, ll.Config.ResolvedAgentlessEnabled, "Should default to agentless=true when agent doesn't support evp_proxy") + }) + t.Run("agentless-fails-with-invalid-api-key", func(t *testing.T) { + // Set invalid API key (wrong length) + t.Setenv("DD_API_KEY", "invalid-key") + + // When defaulting to agentless with invalid API key, should fail + err := tracer.Start( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("agentless-test"), + tracer.WithLLMObsAgentlessEnabled(true), // Explicitly enable agentless to trigger validation + tracer.WithLogStartup(false), + ) + defer tracer.Stop() + + // Should get error due to invalid API key in agentless mode + require.Error(t, err) + assert.Contains(t, err.Error(), "agentless mode requires a valid API key") + + // Should not have active LLMObs due to startup failure + _, err = llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + }) + t.Run("agentless-fails-without-api-key", func(t *testing.T) { + // enforce an empty DD_API_KEY + t.Setenv("DD_API_KEY", "") + + // When defaulting to agentless but no API key is provided, should fail + err := tracer.Start( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("agentless-test"), + tracer.WithLLMObsAgentlessEnabled(true), // Explicitly enable agentless to trigger validation + tracer.WithLogStartup(false), + ) + defer tracer.Stop() + + // Should get error due to missing API key in agentless mode + require.Error(t, err) + assert.Contains(t, err.Error(), "agentless mode requires a valid API key") + + // Should not have active LLMObs due to startup failure + _, err = llmobs.ActiveLLMObs() + assert.Error(t, err) + assert.Contains(t, err.Error(), "LLMObs is not enabled") + }) + t.Run("explicit-agentless-overrides-default", func(t *testing.T) { + tt := testtracer.Start(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("agentless-test"), + tracer.WithLLMObsAgentlessEnabled(false), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + ) + defer tt.Stop() + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + require.NotNil(t, ll.Config.AgentlessEnabled, "AgentlessEnabled should not be nil when explicitly set") + assert.False(t, *ll.Config.AgentlessEnabled, "Explicit agentless=false should override default") + assert.False(t, ll.Config.ResolvedAgentlessEnabled, "Explicit agentless=false should override default") + }) +} + +func BenchmarkLLMObsStartSpan(b *testing.B) { + run := func(b *testing.B, ll *llmobs.LLMObs, tt *testtracer.TestTracer, done chan struct{}) { + b.Log("starting benchmark") + + b.ResetTimer() + b.ReportAllocs() + for i := 0; i < b.N; i++ { + span, _ := ll.StartSpan(context.Background(), llmobs.SpanKindLLM, fmt.Sprintf("span-%d", i), llmobs.StartSpanConfig{}) + span.Finish(llmobs.FinishSpanConfig{}) + } + b.StopTimer() + + b.Log("finished benchmark") + + b.Log("waiting for spans") + + tt.WaitFor(b, 10*time.Second, func(payloads *testtracer.Payloads) bool { + return len(payloads.Spans) > 0 && len(payloads.LLMSpans) > 0 + }) + } + + b.Run("basic", func(b *testing.B) { + tt, ll := testTracer(b, testtracer.WithRequestDelay(500*time.Millisecond)) + done := make(chan struct{}) + run(b, ll, tt, done) + }) + b.Run("periodic-flush", func(b *testing.B) { + tt, ll := testTracer(b, testtracer.WithRequestDelay(500*time.Millisecond)) + + ticker := time.NewTicker(10 * time.Microsecond) + defer ticker.Stop() + + done := make(chan struct{}) + + // force flushes to test if StartSpan gets blocked while the tracer is sending payloads + go func() { + for { + select { + case <-ticker.C: + ll.Flush() + + case <-done: + return + } + } + }() + + run(b, ll, tt, done) + }) +} + +func testTracer(t testing.TB, opts ...testtracer.Option) (*testtracer.TestTracer, *llmobs.LLMObs) { + tOpts := append([]testtracer.Option{ + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp(mlApp), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + }, opts...) + + tt := testtracer.Start(t, tOpts...) + t.Cleanup(tt.Stop) + + ll, err := llmobs.ActiveLLMObs() + require.NoError(t, err) + + return tt, ll +} + +func findTag(tags []string, name string) string { + for _, t := range tags { + parts := strings.Split(t, ":") + if len(parts) != 2 { + continue + } + if parts[0] == name { + return parts[1] + } + } + return "" +} + +func testClientServer(t *testing.T, h http.Handler) (*httptest.Server, *http.Client) { + wh := traceHandler(h) + srv := httptest.NewServer(wh) + cl := traceClient(srv.Client()) + t.Cleanup(srv.Close) + + return srv, cl +} + +func traceHandler(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + ctx := req.Context() + + opts := []tracer.StartSpanOption{ + tracer.Tag("span.kind", "server"), + } + parentCtx, err := tracer.Extract(tracer.HTTPHeadersCarrier(req.Header)) + if err == nil && parentCtx != nil { + opts = append(opts, tracer.ChildOf(parentCtx)) + } + + span, ctx := tracer.StartSpanFromContext(ctx, "http.request", opts...) + defer span.Finish() + + h.ServeHTTP(w, req.WithContext(ctx)) + }) +} + +func traceClient(c *http.Client) *http.Client { + c.Transport = &tracedRT{base: c.Transport} + return c +} + +type tracedRT struct { + base http.RoundTripper +} + +func (rt *tracedRT) RoundTrip(req *http.Request) (*http.Response, error) { + ctx := req.Context() + span, ctx := tracer.StartSpanFromContext(ctx, "http.request", tracer.Tag("span.kind", "client")) + defer span.Finish() + + // Clone the request so we can modify it without causing visible side-effects to the caller... + req = req.Clone(ctx) + err := tracer.Inject(span.Context(), tracer.HTTPHeadersCarrier(req.Header)) + if err != nil { + fmt.Fprintf(os.Stderr, "contrib/net/http.Roundtrip: failed to inject http headers: %s\n", err.Error()) + } + + return rt.base.RoundTrip(req) +} + +func ptrFromVal[T any](v T) *T { + return &v +} diff --git a/internal/llmobs/span.go b/internal/llmobs/span.go new file mode 100644 index 0000000000..c0d96fa673 --- /dev/null +++ b/internal/llmobs/span.go @@ -0,0 +1,521 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import ( + "encoding/json" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const ( + // TagKeySessionID is the tag key used to set the session ID for LLMObs spans. + TagKeySessionID = "session_id" +) + +// StartSpanConfig contains configuration options for starting an LLMObs span. +type StartSpanConfig struct { + // SessionID sets the session ID for the span. + SessionID string + // ModelName sets the model name for LLM and embedding spans. + ModelName string + // ModelProvider sets the model provider for LLM and embedding spans. + ModelProvider string + // MLApp sets the ML application name for the span. + MLApp string + // StartTime sets a custom start time for the span. If zero, uses current time. + StartTime time.Time +} + +// FinishSpanConfig contains configuration options for finishing an LLMObs span. +type FinishSpanConfig struct { + // FinishTime sets a custom finish time for the span. If zero, uses current time. + FinishTime time.Time + // Error sets an error on the span when finishing. + Error error +} + +// EvaluationConfig contains configuration for submitting evaluation metrics. +type EvaluationConfig struct { + // Method 1: Direct span/trace ID join + // SpanID is the span ID to evaluate. + SpanID string + // TraceID is the trace ID to evaluate. + TraceID string + + // Method 2: Tag-based join + // TagKey is the tag key to search for spans. + TagKey string + // TagValue is the tag value to match for spans. + TagValue string + + // Required fields + // Label is the name of the evaluation metric. + Label string + + // Value fields (exactly one must be provided) + // CategoricalValue is the categorical value of the evaluation metric. + CategoricalValue *string + // ScoreValue is the score value of the evaluation metric. + ScoreValue *float64 + // BooleanValue is the boolean value of the evaluation metric. + BooleanValue *bool + + // Optional fields + // Tags are optional string key-value pairs to tag the evaluation metric. + Tags []string + // MLApp is the ML application name. If empty, uses the global config. + MLApp string + // TimestampMS is the timestamp in milliseconds. If zero, uses current time. + TimestampMS int64 +} + +// Prompt represents a prompt template used with LLM spans. +type Prompt struct { + // Template is the prompt template string. + Template string `json:"template,omitempty"` + // ID is the unique identifier for the prompt. + ID string `json:"id,omitempty"` + // Version is the version of the prompt. + Version string `json:"version,omitempty"` + // Variables contains the variables used in the prompt template. + Variables map[string]string `json:"variables,omitempty"` + // RAGContextVariables specifies which variables contain RAG context. + RAGContextVariables []string `json:"rag_context_variables,omitempty"` + // RAGQueryVariables specifies which variables contain RAG queries. + RAGQueryVariables []string `json:"rag_query_variables,omitempty"` +} + +// ToolDefinition represents a tool definition for LLM spans. +type ToolDefinition struct { + // Name is the name of the tool. + Name string `json:"name"` + // Description is the description of what the tool does. + Description string `json:"description,omitempty"` + // Schema is the JSON schema defining the tool's parameters. + Schema json.RawMessage `json:"schema,omitempty"` +} + +// ToolCall represents a call to a tool within an LLM message. +type ToolCall struct { + // Name is the name of the tool being called. + Name string `json:"name"` + // Arguments are the JSON-encoded arguments passed to the tool. + Arguments json.RawMessage `json:"arguments"` + // ToolID is the unique identifier for this tool call. + ToolID string `json:"tool_id,omitempty"` + // Type is the type of the tool call. + Type string `json:"type,omitempty"` +} + +// ToolResult represents the result of a tool call within an LLM message. +type ToolResult struct { + // Result is the result returned by the tool. + Result any `json:"result"` + // Name is the name of the tool that was called. + Name string `json:"name,omitempty"` + // ToolID is the unique identifier for the tool call this result corresponds to. + ToolID string `json:"tool_id,omitempty"` + // Type is the type of the tool result. + Type string `json:"type,omitempty"` +} + +// LLMMessage represents a message in an LLM conversation. +type LLMMessage struct { + // Role is the role of the message sender (e.g., "user", "assistant", "system"). + Role string `json:"role"` + // Content is the text content of the message. + Content string `json:"content"` + // ToolCalls are the tool calls made in this message. + ToolCalls []ToolCall `json:"tool_calls,omitempty"` + // ToolResults are the results of tool calls in this message. + ToolResults []ToolResult `json:"tool_results,omitempty"` +} + +// EmbeddedDocument represents a document used for embedding operations. +type EmbeddedDocument struct { + // Text is the text content of the document. + Text string `json:"text"` + // Name is the name or title of the document. + Name string `json:"name,omitempty"` + // Score is the relevance score of the document (typically 0.0-1.0). + Score float64 `json:"score,omitempty"` + // ID is the unique identifier of the document. + ID string `json:"id,omitempty"` +} + +// RetrievedDocument represents a document for retrieval operations. +type RetrievedDocument struct { + // Text is the text content of the document. + Text string `json:"text"` + // Name is the name or title of the document. + Name string `json:"name,omitempty"` + // Score is the relevance score of the document (typically 0.0-1.0). + Score float64 `json:"score,omitempty"` + // ID is the unique identifier of the document. + ID string `json:"id,omitempty"` +} + +// SpanAnnotations contains data to annotate an LLMObs span with. +type SpanAnnotations struct { + // InputText is the text input for the span. + InputText string + // InputMessages are the input messages for LLM spans. + InputMessages []LLMMessage + // InputEmbeddedDocs are the input documents for embedding spans. + InputEmbeddedDocs []EmbeddedDocument + + // OutputText is the text output for the span. + OutputText string + // OutputMessages are the output messages for LLM spans. + OutputMessages []LLMMessage + // OutputRetrievedDocs are the output documents for retrieval spans. + OutputRetrievedDocs []RetrievedDocument + + // ExperimentInput is the input data for experiment spans. + ExperimentInput any + // ExperimentOutput is the output data for experiment spans. + ExperimentOutput any + // ExperimentExpectedOutput is the expected output for experiment spans. + ExperimentExpectedOutput any + + // Prompt is the prompt information for LLM spans. + Prompt *Prompt + // ToolDefinitions are the tool definitions for LLM spans. + ToolDefinitions []ToolDefinition + + // AgentManifest is the agent manifest for agent spans. + AgentManifest string + + // Metadata contains arbitrary metadata key-value pairs. + Metadata map[string]any + // Metrics contains numeric metrics key-value pairs. + Metrics map[string]float64 + // Tags contains string tags key-value pairs. + Tags map[string]string +} + +// Span represents an LLMObs span with its associated metadata and context. +type Span struct { + mu sync.RWMutex + + apm APMSpan + parent *Span + propagated *PropagatedLLMSpan + + llmCtx llmobsContext + + llmTraceID string + name string + mlApp string + spanKind SpanKind + sessionID string + + integration string + scope string + error error + finished bool + + startTime time.Time + finishTime time.Time + + spanLinks []SpanLink +} + +func (s *Span) Name() string { + return s.name +} + +// SpanID returns the span ID of the underlying APM span. +func (s *Span) SpanID() string { + return s.apm.SpanID() +} + +func (s *Span) Kind() string { + return string(s.spanKind) +} + +// APMTraceID returns the trace ID of the underlying APM span. +func (s *Span) APMTraceID() string { + return s.apm.TraceID() +} + +// TraceID returns the LLMObs trace ID for this span. +func (s *Span) TraceID() string { + return s.llmTraceID +} + +// MLApp returns the ML application name for this span. +func (s *Span) MLApp() string { + return s.mlApp +} + +// AddLink adds a span link to this span. +func (s *Span) AddLink(link SpanLink) { + s.mu.Lock() + defer s.mu.Unlock() + + s.apm.AddLink(link) + s.spanLinks = append(s.spanLinks, link) +} + +// StartTime returns the start time of this span. +func (s *Span) StartTime() time.Time { + return s.startTime +} + +// FinishTime returns the finish time of this span. +func (s *Span) FinishTime() time.Time { + return s.finishTime +} + +// Finish finishes the span with the provided configuration. +func (s *Span) Finish(cfg FinishSpanConfig) { + s.mu.Lock() + defer s.mu.Unlock() + + if s.finished { + log.Debug("llmobs: attempted to finish an already finished span") + return + } + defer func() { + trackSpanFinished(s) + }() + + if cfg.FinishTime.IsZero() { + cfg.FinishTime = time.Now() + } + s.finishTime = cfg.FinishTime + apmFinishCfg := FinishAPMSpanConfig{ + FinishTime: cfg.FinishTime, + } + if cfg.Error != nil { + s.error = cfg.Error + apmFinishCfg.Error = cfg.Error + } + + s.apm.Finish(apmFinishCfg) + l, err := ActiveLLMObs() + if err != nil { + return + } + l.submitLLMObsSpan(s) + s.finished = true +} + +// Annotate adds annotations to the span using the provided SpanAnnotations. +func (s *Span) Annotate(a SpanAnnotations) { + s.mu.Lock() + defer s.mu.Unlock() + + var err error + defer func() { + if err != nil { + log.Warn("llmobs: failed to annotate span: %v", err.Error()) + } + trackSpanAnnotations(s, err) + }() + + if s.finished { + err = errFinishedSpan + return + } + + s.llmCtx.metadata = updateMapKeys(s.llmCtx.metadata, a.Metadata) + s.llmCtx.metrics = updateMapKeys(s.llmCtx.metrics, a.Metrics) + + if len(a.Tags) > 0 { + s.llmCtx.tags = updateMapKeys(s.llmCtx.tags, a.Tags) + if sessionID, ok := a.Tags[TagKeySessionID]; ok { + s.sessionID = sessionID + } + } + + if a.Prompt != nil { + if s.spanKind != SpanKindLLM { + log.Warn("llmobs: input prompt can only be annotated on llm spans, ignoring") + } else { + if a.Prompt.RAGContextVariables == nil { + a.Prompt.RAGContextVariables = []string{"context"} + } + if a.Prompt.RAGQueryVariables == nil { + a.Prompt.RAGQueryVariables = []string{"question"} + } + s.llmCtx.prompt = a.Prompt + } + } + + if len(a.ToolDefinitions) > 0 { + if s.spanKind != SpanKindLLM { + log.Warn("llmobs: tool definitions can only be annotated on llm spans, ignoring") + } else { + s.llmCtx.toolDefinitions = a.ToolDefinitions + } + } + + if a.AgentManifest != "" { + if s.spanKind != SpanKindAgent { + log.Warn("llmobs: agent manifest can only be annotated on agent spans, ignoring") + } else { + s.llmCtx.agentManifest = a.AgentManifest + } + } + + s.annotateIO(a) +} + +func (s *Span) annotateIO(a SpanAnnotations) { + if a.OutputRetrievedDocs != nil && s.spanKind != SpanKindRetrieval { + log.Warn("llmobs: retrieve docs can only be used to annotate outputs for retrieval spans, ignoring") + } + if a.InputEmbeddedDocs != nil && s.spanKind != SpanKindEmbedding { + log.Warn("llmobs: embedding docs can only be used to annotate inputs for embedding spans, ignoring") + } + switch s.spanKind { + case SpanKindLLM: + s.annotateIOLLM(a) + case SpanKindEmbedding: + s.annotateIOEmbedding(a) + case SpanKindRetrieval: + s.annotateIORetrieval(a) + case SpanKindExperiment: + s.annotateIOExperiment(a) + default: + s.annotateIOText(a) + } +} + +func (s *Span) annotateIOLLM(a SpanAnnotations) { + if a.InputMessages != nil { + s.llmCtx.inputMessages = a.InputMessages + } else if a.InputText != "" { + s.llmCtx.inputMessages = []LLMMessage{{Content: a.InputText}} + } + if a.OutputMessages != nil { + s.llmCtx.outputMessages = a.OutputMessages + } else if a.OutputText != "" { + s.llmCtx.outputMessages = []LLMMessage{{Content: a.OutputText}} + } +} + +func (s *Span) annotateIOEmbedding(a SpanAnnotations) { + if a.InputText != "" || a.InputMessages != nil { + log.Warn("llmobs: embedding spans can only be annotated with input embedded docs, ignoring other inputs") + } + if a.OutputMessages != nil || a.OutputRetrievedDocs != nil { + log.Warn("llmobs: embedding spans can only be annotated with output text, ignoring other outputs") + } + if a.InputEmbeddedDocs != nil { + s.llmCtx.inputDocuments = a.InputEmbeddedDocs + } + if a.OutputText != "" { + s.llmCtx.outputText = a.OutputText + } +} + +func (s *Span) annotateIORetrieval(a SpanAnnotations) { + if a.InputMessages != nil || a.InputEmbeddedDocs != nil { + log.Warn("llmobs: retrieval spans can only be annotated with input text, ignoring other inputs") + } + if a.OutputText != "" || a.OutputMessages != nil { + log.Warn("llmobs: retrieval spans can only be annotated with output retrieved docs, ignoring other outputs") + } + if a.InputText != "" { + s.llmCtx.inputText = a.InputText + } + if a.OutputRetrievedDocs != nil { + s.llmCtx.outputDocuments = a.OutputRetrievedDocs + } +} + +func (s *Span) annotateIOExperiment(a SpanAnnotations) { + if a.ExperimentInput != nil { + s.llmCtx.experimentInput = a.ExperimentInput + } + if a.ExperimentOutput != nil { + s.llmCtx.experimentOutput = a.ExperimentOutput + } + if a.ExperimentExpectedOutput != nil { + s.llmCtx.experimentExpectedOutput = a.ExperimentExpectedOutput + } +} + +func (s *Span) annotateIOText(a SpanAnnotations) { + if a.InputMessages != nil || a.InputEmbeddedDocs != nil { + log.Warn("llmobs: %s spans can only be annotated with input text, ignoring other inputs", s.spanKind) + } + if a.OutputMessages != nil || a.OutputRetrievedDocs != nil { + log.Warn("llmobs: %s spans can only be annotated with output text, ignoring other outputs", s.spanKind) + } + if a.InputText != "" { + s.llmCtx.inputText = a.InputText + } + if a.OutputText != "" { + s.llmCtx.outputText = a.OutputText + } +} + +// sessionID returns the session ID for a given span, by checking the span's nearest LLMObs span ancestor. +func (s *Span) propagatedSessionID() string { + curSpan := s + usingParent := false + + for curSpan != nil { + if curSpan.sessionID != "" { + if usingParent { + log.Debug("llmobs: using session_id from parent span: %s", curSpan.sessionID) + } + return curSpan.sessionID + } + curSpan = curSpan.parent + usingParent = true + } + return "" +} + +// propagatedMLApp returns the ML App name for a given span, by checking the span's nearest LLMObs span ancestor. +// It defaults to the global config LLMObs ML App name. +func (s *Span) propagatedMLApp() string { + curSpan := s + usingParent := false + + for curSpan != nil { + if curSpan.mlApp != "" { + if usingParent { + log.Debug("llmobs: using ml_app from parent span: %s", curSpan.mlApp) + } + return curSpan.mlApp + } + curSpan = curSpan.parent + usingParent = true + } + + if s.propagated != nil && s.propagated.MLApp != "" { + log.Debug("llmobs: using ml_app from propagated span: %s", s.propagated.MLApp) + return s.propagated.MLApp + } + if activeLLMObs != nil { + log.Debug("llmobs: using ml_app from global config: %s", activeLLMObs.Config.MLApp) + return activeLLMObs.Config.MLApp + } + return "" +} + +// updateMapKeys adds key/values from updates into src, overriding existing keys. +func updateMapKeys[K comparable, V any](src map[K]V, updates map[K]V) map[K]V { + if len(updates) == 0 { + return src + } + if src == nil { + src = make(map[K]V, len(updates)) + } + for k, v := range updates { + src[k] = v + } + return src +} diff --git a/internal/llmobs/telemetry.go b/internal/llmobs/telemetry.go new file mode 100644 index 0000000000..3b8d2b394b --- /dev/null +++ b/internal/llmobs/telemetry.go @@ -0,0 +1,228 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import ( + "errors" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/config" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +const ( + telemetryMetricInitTime = "init_time" + telemetryMetricEnabled = "product_enabled" + telemetryMetricRawSpanSize = "span.raw_size" + telemetryMetricSpanSize = "span.size" + telemetryMetricSpanStarted = "span.start" + telemetryMetricSpanFinished = "span.finished" + telemetryMetricDroppedSpanEvents = "dropped_span_events" + telemetryMetricDroppedEvalEvents = "dropped_eval_events" + telemetryMetricAnnotations = "annotations" + telemetryMetricEvalsSubmitted = "evals_submitted" + telemetryMetricUserFlushes = "user_flush" +) + +var telemetryErrorTypes = map[error]string{ + errInvalidMetricLabel: "invalid_metric_label", + errFinishedSpan: "invalid_finished_span", + errInvalidSpanJoin: "invalid_span", + errInvalidTagJoin: "invalid_tag_join", +} + +// Pre-computed telemetry metric handles +var ( + spanStartedHandle = telemetry.Count(telemetry.NamespaceMLObs, telemetryMetricSpanStarted, nil) + userFlushHandle = telemetry.Count(telemetry.NamespaceMLObs, telemetryMetricUserFlushes, []string{"error:0"}) +) + +func trackLLMObsStart(startTime time.Time, err error, cfg config.Config) { + if telemetry.Disabled() { + return + } + telemetry.ProductStarted(telemetry.NamespaceMLObs) + telemetry.RegisterAppConfigs( + telemetry.Configuration{Name: "site", Value: cfg.TracerConfig.Site}, + telemetry.Configuration{Name: "ml_app", Value: cfg.MLApp}, + telemetry.Configuration{Name: "agentless", Value: cfg.ResolvedAgentlessEnabled}, + ) + + tags := errTelemetryTags(err) + tags = append(tags, []string{ + "agentless:" + boolTag(cfg.ResolvedAgentlessEnabled), + "site:" + cfg.TracerConfig.Site, + "ml_app:" + valOrNA(cfg.MLApp), + }...) + + initTimeMs := float64(time.Since(startTime).Milliseconds()) + telemetry.Distribution(telemetry.NamespaceMLObs, telemetryMetricInitTime, tags).Submit(initTimeMs) + telemetry.Count(telemetry.NamespaceMLObs, telemetryMetricEnabled, tags).Submit(1) +} + +func trackSpanStarted() { + if telemetry.Disabled() { + return + } + spanStartedHandle.Submit(1) +} + +func trackSpanFinished(span *Span) { + if telemetry.Disabled() { + return + } + isRootSpan := span.parent == nil + hasSessionID := span.sessionID != "" + integration := span.integration + autoinstrumented := integration != "" + spanKind := string(span.spanKind) + modelProvider := span.llmCtx.modelProvider + mlApp := span.mlApp + hasError := span.error != nil + + tags := []string{ + "autoinstrumented:" + boolTag(autoinstrumented), + "has_session_id:" + boolTag(hasSessionID), + "is_root_span:" + boolTag(isRootSpan), + "span_kind:" + valOrNA(spanKind), + "integration:" + valOrNA(integration), + "ml_app:" + valOrNA(mlApp), + "error:" + boolTag(hasError), + } + if modelProvider != "" { + tags = append(tags, "model_provider:"+modelProvider) + } + + telemetry.Count(telemetry.NamespaceMLObs, telemetryMetricSpanFinished, tags).Submit(1) +} + +func trackSpanEventRawSize(event *transport.LLMObsSpanEvent, rawSize int) { + if telemetry.Disabled() { + return + } + tags := spanEventTags(event) + telemetry.Distribution(telemetry.NamespaceMLObs, telemetryMetricRawSpanSize, tags).Submit(float64(rawSize)) +} + +func trackSpanEventSize(event *transport.LLMObsSpanEvent, size int, truncated bool) { + if telemetry.Disabled() { + return + } + tags := spanEventTags(event) + tags = append(tags, "truncated:"+boolTag(truncated)) + telemetry.Distribution(telemetry.NamespaceMLObs, telemetryMetricSpanSize, tags).Submit(float64(size)) +} + +func trackDroppedPayload(numEvents int, metricName string, errType string) { + if telemetry.Disabled() { + return + } + tags := []string{"error:1", "error_type:" + errType} + telemetry.Count(telemetry.NamespaceMLObs, metricName, tags).Submit(float64(numEvents)) +} + +func trackSpanAnnotations(span *Span, err error) { + if telemetry.Disabled() { + return + } + tags := errTelemetryTags(err) + spanKind := "" + isRootSpan := "0" + if span != nil { + spanKind = valOrNA(string(span.spanKind)) + isRootSpan = boolTag(span.parent == nil) + } + tags = append(tags, + "span_kind:"+spanKind, + "is_root_span:"+isRootSpan, + ) + telemetry.Count(telemetry.NamespaceMLObs, telemetryMetricAnnotations, tags).Submit(1) +} + +func trackSubmitEvaluationMetric(metric *transport.LLMObsMetric, err error) { + if telemetry.Disabled() { + return + } + metricType := "other" + hasTag := false + if metric != nil { + metricType = metric.MetricType + hasTag = metric.JoinOn.Tag != nil + } + + tags := errTelemetryTags(err) + tags = append(tags, + "metric_type:"+metricType, + "custom_joining_key:"+boolTag(hasTag), + ) + telemetry.Count(telemetry.NamespaceMLObs, telemetryMetricEvalsSubmitted, tags).Submit(1) +} + +func trackUserFlush() { + if telemetry.Disabled() { + return + } + userFlushHandle.Submit(1) +} + +func spanEventTags(event *transport.LLMObsSpanEvent) []string { + spanKind := "N/A" + if meta, ok := event.Meta["span.kind"]; ok { + if kind, ok := meta.(string); ok { + spanKind = kind + } + } + + integration := findTagValue(event.Tags, "integration:") + mlApp := findTagValue(event.Tags, "ml_app:") + autoInstrumented := integration != "" + hasError := event.Status == "error" + + return []string{ + "span_kind:" + spanKind, + "autoinstrumented:" + boolTag(autoInstrumented), + "error:" + boolTag(hasError), + "integration:" + valOrNA(integration), + "ml_app:" + valOrNA(mlApp), + } +} + +func findTagValue(tags []string, prefix string) string { + for _, tag := range tags { + if len(tag) > len(prefix) && tag[:len(prefix)] == prefix { + return tag[len(prefix):] + } + } + return "" +} + +func valOrNA(value string) string { + if value == "" { + return "n/a" + } + return value +} + +func errTelemetryTags(err error) []string { + tags := []string{"error:" + boolTag(err != nil)} + if err != nil { + for targetErr, errType := range telemetryErrorTypes { + if errors.Is(err, targetErr) { + tags = append(tags, "error_type:"+errType) + break + } + } + } + return tags +} + +func boolTag(b bool) string { + if b { + return "1" + } + return "0" +} diff --git a/internal/llmobs/tracer.go b/internal/llmobs/tracer.go new file mode 100644 index 0000000000..2cdb6bdab9 --- /dev/null +++ b/internal/llmobs/tracer.go @@ -0,0 +1,52 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import ( + "context" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" +) + +// Tracer represents the interface for the underlying APM tracer. +type Tracer interface { + // StartSpan starts a new APM span with the given name and configuration. + StartSpan(ctx context.Context, name string, cfg StartAPMSpanConfig) (APMSpan, context.Context) +} + +// StartAPMSpanConfig contains configuration options for starting an APM span. +type StartAPMSpanConfig struct { + // SpanType is the type of the APM span. + SpanType string + // StartTime is the start time for the span. + StartTime time.Time +} + +// FinishAPMSpanConfig contains configuration options for finishing an APM span. +type FinishAPMSpanConfig struct { + // FinishTime is the finish time for the span. + FinishTime time.Time + // Error is an error to set on the span when finishing. + Error error +} + +// APMSpan represents the interface for an APM span. +type APMSpan interface { + // Finish finishes the span with the given configuration. + Finish(cfg FinishAPMSpanConfig) + // AddLink adds a span link to this span. + AddLink(link SpanLink) + // SpanID returns the span ID. + SpanID() string + // TraceID returns the trace ID. + TraceID() string + // SetBaggageItem sets a baggage item on the span. + SetBaggageItem(key string, value string) +} + +// SpanLink represents a link between spans, aliased from the transport package. +type SpanLink = transport.SpanLink diff --git a/internal/llmobs/transport/dne.go b/internal/llmobs/transport/dne.go new file mode 100644 index 0000000000..5436a18364 --- /dev/null +++ b/internal/llmobs/transport/dne.go @@ -0,0 +1,583 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +import ( + "bytes" + "context" + "encoding/csv" + "encoding/json" + "errors" + "fmt" + "net/http" + "net/url" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const ( + resourceTypeDatasets = "datasets" + resourceTypeExperiments = "experiments" + resourceTypeProjects = "projects" +) + +// ---------- Resources ---------- + +type DatasetView struct { + ID string + Name string `json:"name"` + Description string `json:"description"` + Metadata map[string]any `json:"metadata"` + CurrentVersion int `json:"current_version"` +} + +type DatasetCreate struct { + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Metadata map[string]any `json:"metadata,omitempty"` +} + +type DatasetRecordView struct { + ID string + Input any `json:"input"` + ExpectedOutput any `json:"expected_output"` + Metadata any `json:"metadata"` + Version int `json:"version"` +} + +type ProjectView struct { + ID string + Name string `json:"name"` +} + +type ExperimentView struct { + ID string + ProjectID string `json:"project_id"` + DatasetID string `json:"dataset_id"` + Name string `json:"name"` + Description string `json:"description"` + Metadata map[string]any `json:"metadata"` + Config map[string]any `json:"config"` + DatasetVersion int `json:"dataset_version"` + EnsureUnique bool `json:"ensure_unique"` +} + +type DatasetRecordCreate struct { + Input any `json:"input,omitempty"` + ExpectedOutput any `json:"expected_output,omitempty"` + Metadata any `json:"metadata,omitempty"` +} + +type DatasetRecordUpdate struct { + ID string `json:"id"` + Input any `json:"input,omitempty"` + ExpectedOutput *any `json:"expected_output,omitempty"` + Metadata any `json:"metadata,omitempty"` +} + +type ErrorMessage struct { + Message string `json:"message,omitempty"` + Type string `json:"type,omitempty"` + Stack string `json:"stack,omitempty"` +} + +// ---------- Requests ---------- + +type Request[T any] struct { + Data RequestData[T] `json:"data"` +} + +type RequestData[T any] struct { + Type string `json:"type"` + Attributes T `json:"attributes"` +} + +type RequestAttributesDatasetCreateRecords struct { + Records []DatasetRecordCreate `json:"records,omitempty"` +} + +type RequestAttributesDatasetDelete struct { + DatasetIDs []string `json:"dataset_ids,omitempty"` +} + +type RequestAttributesDatasetBatchUpdate struct { + InsertRecords []DatasetRecordCreate `json:"insert_records,omitempty"` + UpdateRecords []DatasetRecordUpdate `json:"update_records,omitempty"` + DeleteRecords []string `json:"delete_records,omitempty"` + Deduplicate *bool `json:"deduplicate,omitempty"` +} + +type RequestAttributesProjectCreate struct { + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` +} + +type RequestAttributesExperimentCreate struct { + ProjectID string `json:"project_id,omitempty"` + DatasetID string `json:"dataset_id,omitempty"` + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` + Metadata map[string]any `json:"metadata,omitempty"` + Config map[string]any `json:"config,omitempty"` + DatasetVersion int `json:"dataset_version,omitempty"` + EnsureUnique bool `json:"ensure_unique,omitempty"` +} + +type RequestAttributesExperimentPushEvents struct { + Scope string `json:"scope,omitempty"` + Metrics []ExperimentEvalMetricEvent `json:"metrics,omitempty"` + Tags []string `json:"tags,omitempty"` +} + +type ExperimentEvalMetricEvent struct { + MetricSource string `json:"metric_source,omitempty"` + SpanID string `json:"span_id,omitempty"` + TraceID string `json:"trace_id,omitempty"` + TimestampMS int64 `json:"timestamp_ms,omitempty"` + MetricType string `json:"metric_type,omitempty"` + Label string `json:"label,omitempty"` + CategoricalValue *string `json:"categorical_value,omitempty"` + ScoreValue *float64 `json:"score_value,omitempty"` + BooleanValue *bool `json:"boolean_value,omitempty"` + Error *ErrorMessage `json:"error,omitempty"` + Tags []string `json:"tags,omitempty"` + ExperimentID string `json:"experiment_id,omitempty"` +} + +type ( + CreateDatasetRequest = Request[DatasetCreate] + DeleteDatasetRequest = Request[RequestAttributesDatasetDelete] + CreateDatasetRecordsRequest = Request[RequestAttributesDatasetCreateRecords] + BatchUpdateDatasetRequest = Request[RequestAttributesDatasetBatchUpdate] + + CreateProjectRequest = Request[RequestAttributesProjectCreate] + + CreateExperimentRequest = Request[RequestAttributesExperimentCreate] + PushExperimentEventsRequest = Request[RequestAttributesExperimentPushEvents] +) + +// ---------- Responses ---------- + +type Response[T any] struct { + Data ResponseData[T] `json:"data"` +} + +type ResponseMeta struct { + After string `json:"after,omitempty"` // Cursor for next page +} + +type ResponseList[T any] struct { + Data []ResponseData[T] `json:"data"` + Meta ResponseMeta `json:"meta,omitempty"` +} + +type ResponseData[T any] struct { + ID string `json:"id"` + Type string `json:"type"` + Attributes T `json:"attributes"` +} + +type ( + GetDatasetResponse = ResponseList[DatasetView] + CreateDatasetResponse = Response[DatasetView] + UpdateDatasetResponse = Response[DatasetView] + + GetDatasetRecordsResponse = ResponseList[DatasetRecordView] + CreateDatasetRecordsResponse = ResponseList[DatasetRecordView] + UpdateDatasetRecordsResponse = ResponseList[DatasetRecordView] + BatchUpdateDatasetResponse = ResponseList[DatasetRecordView] + + CreateProjectResponse = Response[ProjectView] + + CreateExperimentResponse = Response[ExperimentView] +) + +func (c *Transport) GetDatasetByName(ctx context.Context, name, projectID string) (*DatasetView, error) { + q := url.Values{} + q.Set("filter[name]", name) + datasetPath := fmt.Sprintf("%s/%s/datasets?%s", endpointPrefixDNE, url.PathEscape(projectID), q.Encode()) + method := http.MethodGet + + result, err := c.jsonRequest(ctx, method, datasetPath, subdomainDNE, nil, defaultTimeout) + if err != nil { + return nil, err + } + if result.statusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + + var datasetResp GetDatasetResponse + if err := json.Unmarshal(result.body, &datasetResp); err != nil { + return nil, fmt.Errorf("failed to decode json response: %w", err) + } + if len(datasetResp.Data) == 0 { + return nil, ErrDatasetNotFound + } + ds := datasetResp.Data[0].Attributes + ds.ID = datasetResp.Data[0].ID + return &ds, nil +} + +func (c *Transport) CreateDataset(ctx context.Context, name, description, projectID string) (*DatasetView, error) { + _, err := c.GetDatasetByName(ctx, name, projectID) + if err == nil { + return nil, errors.New("dataset already exists") + } + if !errors.Is(err, ErrDatasetNotFound) { + return nil, err + } + + path := fmt.Sprintf("%s/%s/datasets", endpointPrefixDNE, url.PathEscape(projectID)) + method := http.MethodPost + body := CreateDatasetRequest{ + Data: RequestData[DatasetCreate]{ + Type: resourceTypeDatasets, + Attributes: DatasetCreate{ + Name: name, + Description: description, + }, + }, + } + result, err := c.jsonRequest(ctx, method, path, subdomainDNE, body, defaultTimeout) + if err != nil { + return nil, err + } + log.Debug("llmobs: create dataset success (status code: %d)", result.statusCode) + + var resp CreateDatasetResponse + if err := json.Unmarshal(result.body, &resp); err != nil { + return nil, fmt.Errorf("failed to decode json response: %w", err) + } + id := resp.Data.ID + dataset := resp.Data.Attributes + dataset.ID = id + return &dataset, nil +} + +func (c *Transport) DeleteDataset(ctx context.Context, datasetIDs ...string) error { + path := endpointPrefixDNE + "/datasets/delete" + method := http.MethodPost + body := DeleteDatasetRequest{ + Data: RequestData[RequestAttributesDatasetDelete]{ + Type: resourceTypeDatasets, + Attributes: RequestAttributesDatasetDelete{ + DatasetIDs: datasetIDs, + }, + }, + } + + result, err := c.jsonRequest(ctx, method, path, subdomainDNE, body, defaultTimeout) + if err != nil { + return err + } + if result.statusCode != http.StatusOK { + return fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + return nil +} + +func (c *Transport) BatchUpdateDataset( + ctx context.Context, + datasetID string, + insert []DatasetRecordCreate, + update []DatasetRecordUpdate, + delete []string, +) (int, []string, error) { + path := fmt.Sprintf("%s/datasets/%s/batch_update", endpointPrefixDNE, url.PathEscape(datasetID)) + method := http.MethodPost + body := BatchUpdateDatasetRequest{ + Data: RequestData[RequestAttributesDatasetBatchUpdate]{ + Type: resourceTypeDatasets, + Attributes: RequestAttributesDatasetBatchUpdate{ + InsertRecords: insert, + UpdateRecords: update, + DeleteRecords: delete, + Deduplicate: AnyPtr(false), + }, + }, + } + + result, err := c.jsonRequest(ctx, method, path, subdomainDNE, body, defaultTimeout) + if err != nil { + return -1, nil, err + } + if result.statusCode != http.StatusOK { + return -1, nil, fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + + var resp BatchUpdateDatasetResponse + if err := json.Unmarshal(result.body, &resp); err != nil { + return -1, nil, fmt.Errorf("failed to decode json response: %w", err) + } + + // FIXME: we don't get version numbers in responses to deletion requests + // TODO(rarguelloF): the backend could return a better response here... + var ( + newDatasetVersion = -1 + newRecordIDs []string + ) + if len(resp.Data) > 0 { + if resp.Data[0].Attributes.Version > 0 { + newDatasetVersion = resp.Data[0].Attributes.Version + } + } + if len(resp.Data) == len(insert)+len(update) { + // new records are at the end of the slice + for _, rec := range resp.Data[len(update):] { + newRecordIDs = append(newRecordIDs, rec.ID) + } + } else { + log.Warn("llmobs/internal/transport: BatchUpdateDataset: expected %d records in response, got %d", len(insert)+len(update), len(resp.Data)) + } + return newDatasetVersion, newRecordIDs, nil +} + +// GetDatasetRecordsPage fetches a single page of records for the given dataset. +// Returns the records, the cursor for the next page (empty string if no more pages), and any error. +func (c *Transport) GetDatasetRecordsPage(ctx context.Context, datasetID, cursor string) ([]DatasetRecordView, string, error) { + method := http.MethodGet + recordsPath := fmt.Sprintf("%s/datasets/%s/records", endpointPrefixDNE, url.PathEscape(datasetID)) + + if cursor != "" { + recordsPath = fmt.Sprintf("%s?page[cursor]=%s", recordsPath, url.QueryEscape(cursor)) + } + + result, err := c.jsonRequest(ctx, method, recordsPath, subdomainDNE, nil, getDatasetRecordsTimeout) + if err != nil { + return nil, "", err + } + if result.statusCode != http.StatusOK { + return nil, "", fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + + var recordsResp GetDatasetRecordsResponse + if err := json.Unmarshal(result.body, &recordsResp); err != nil { + return nil, "", fmt.Errorf("failed to decode json response: %w", err) + } + + records := make([]DatasetRecordView, 0, len(recordsResp.Data)) + for _, r := range recordsResp.Data { + rec := r.Attributes + rec.ID = r.ID + records = append(records, rec) + } + + return records, recordsResp.Meta.After, nil +} + +// GetDatasetWithRecords fetches the given Dataset and all its records from DataDog. +// This eagerly fetches all pages of records. +func (c *Transport) GetDatasetWithRecords(ctx context.Context, name, projectID string) (*DatasetView, []DatasetRecordView, error) { + // 1) Fetch dataset by name + ds, err := c.GetDatasetByName(ctx, name, projectID) + if err != nil { + return nil, nil, err + } + + // 2) Fetch all records with pagination support + var allRecords []DatasetRecordView + nextCursor := "" + pageNum := 0 + + for { + log.Debug("llmobs/transport: fetching dataset records page %d", pageNum) + + records, cursor, err := c.GetDatasetRecordsPage(ctx, ds.ID, nextCursor) + if err != nil { + return nil, nil, fmt.Errorf("get dataset records failed on page %d: %w", pageNum, err) + } + + allRecords = append(allRecords, records...) + + nextCursor = cursor + if nextCursor == "" { + break + } + pageNum++ + } + + log.Debug("llmobs/transport: fetched %d records across %d pages for dataset %q", len(allRecords), pageNum+1, name) + return ds, allRecords, nil +} + +func (c *Transport) GetOrCreateProject(ctx context.Context, name string) (*ProjectView, error) { + path := endpointPrefixDNE + "/projects" + method := http.MethodPost + + body := CreateProjectRequest{ + Data: RequestData[RequestAttributesProjectCreate]{ + Type: resourceTypeProjects, + Attributes: RequestAttributesProjectCreate{ + Name: name, + Description: "", + }, + }, + } + result, err := c.jsonRequest(ctx, method, path, subdomainDNE, body, defaultTimeout) + if err != nil { + return nil, err + } + if result.statusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + + var resp CreateProjectResponse + if err := json.Unmarshal(result.body, &resp); err != nil { + return nil, fmt.Errorf("failed to decode json response: %w", err) + } + + project := resp.Data.Attributes + project.ID = resp.Data.ID + return &project, nil +} + +func (c *Transport) CreateExperiment( + ctx context.Context, + name, datasetID, projectID string, + datasetVersion int, + expConfig map[string]any, + tags []string, + description string, +) (*ExperimentView, error) { + path := endpointPrefixDNE + "/experiments" + method := http.MethodPost + + if expConfig == nil { + expConfig = map[string]interface{}{} + } + meta := map[string]interface{}{"tags": tags} + body := CreateExperimentRequest{ + Data: RequestData[RequestAttributesExperimentCreate]{ + Type: resourceTypeExperiments, + Attributes: RequestAttributesExperimentCreate{ + ProjectID: projectID, + DatasetID: datasetID, + Name: name, + Description: description, + Metadata: meta, + Config: expConfig, + DatasetVersion: datasetVersion, + EnsureUnique: true, + }, + }, + } + + result, err := c.jsonRequest(ctx, method, path, subdomainDNE, body, defaultTimeout) + if err != nil { + return nil, err + } + if result.statusCode != http.StatusOK { + return nil, fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + + var resp CreateExperimentResponse + if err := json.Unmarshal(result.body, &resp); err != nil { + return nil, fmt.Errorf("failed to decode json response: %w", err) + } + exp := resp.Data.Attributes + exp.ID = resp.Data.ID + + return &exp, nil +} + +func (c *Transport) PushExperimentEvents( + ctx context.Context, + experimentID string, + metrics []ExperimentEvalMetricEvent, + tags []string, +) error { + path := fmt.Sprintf("%s/experiments/%s/events", endpointPrefixDNE, url.PathEscape(experimentID)) + method := http.MethodPost + + body := PushExperimentEventsRequest{ + Data: RequestData[RequestAttributesExperimentPushEvents]{ + Type: resourceTypeExperiments, + Attributes: RequestAttributesExperimentPushEvents{ + Scope: resourceTypeExperiments, + Metrics: metrics, + Tags: tags, + }, + }, + } + + result, err := c.jsonRequest(ctx, method, path, subdomainDNE, body, defaultTimeout) + if err != nil { + return err + } + if result.statusCode != http.StatusOK && result.statusCode != http.StatusAccepted { + return fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + return nil +} + +// BulkUploadDataset uploads dataset records via CSV file upload. +// This is more efficient for large datasets (>5MB of changes). +func (c *Transport) BulkUploadDataset(ctx context.Context, datasetID string, records []DatasetRecordView) error { + // Create CSV in memory + var csvBuf bytes.Buffer + csvWriter := csv.NewWriter(&csvBuf) + + // Write header + if err := csvWriter.Write([]string{"input", "expected_output", "metadata"}); err != nil { + return fmt.Errorf("failed to write CSV header: %w", err) + } + + // Write records + for _, rec := range records { + inputJSON, err := json.Marshal(rec.Input) + if err != nil { + return fmt.Errorf("failed to marshal input: %w", err) + } + outputJSON, err := json.Marshal(rec.ExpectedOutput) + if err != nil { + return fmt.Errorf("failed to marshal expected_output: %w", err) + } + metadataJSON, err := json.Marshal(rec.Metadata) + if err != nil { + return fmt.Errorf("failed to marshal metadata: %w", err) + } + + if err := csvWriter.Write([]string{ + string(inputJSON), + string(outputJSON), + string(metadataJSON), + }); err != nil { + return fmt.Errorf("failed to write CSV record: %w", err) + } + } + csvWriter.Flush() + if err := csvWriter.Error(); err != nil { + return fmt.Errorf("CSV writer error: %w", err) + } + + // Create multipart body + boundary := "----------boundary------" + crlf := "\r\n" + filename := "dataset_upload.csv" + + var body bytes.Buffer + body.WriteString("--" + boundary + crlf) + body.WriteString(fmt.Sprintf(`Content-Disposition: form-data; name="file"; filename="%s"`, filename) + crlf) + body.WriteString("Content-Type: text/csv" + crlf) + body.WriteString(crlf) + body.Write(csvBuf.Bytes()) + body.WriteString(crlf) + body.WriteString("--" + boundary + "--" + crlf) + + path := fmt.Sprintf("%s/datasets/%s/records/upload", endpointPrefixDNE, url.PathEscape(datasetID)) + contentType := fmt.Sprintf("multipart/form-data; boundary=%s", boundary) + + result, err := c.request(ctx, http.MethodPost, path, subdomainDNE, bytes.NewReader(body.Bytes()), contentType, bulkUploadTimeout) + if err != nil { + return err + } + if result.statusCode != http.StatusOK { + return fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + + log.Debug("llmobs/transport: successfully bulk uploaded %d records to dataset %q: %s", len(records), datasetID, string(result.body)) + return nil +} diff --git a/internal/llmobs/transport/eval_metric.go b/internal/llmobs/transport/eval_metric.go new file mode 100644 index 0000000000..937e632524 --- /dev/null +++ b/internal/llmobs/transport/eval_metric.go @@ -0,0 +1,91 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +import ( + "context" + "fmt" + "net/http" +) + +// EvaluationJoinOn represents how to join evaluation metrics to spans. +// Exactly one of Span or Tag should be provided. +type EvaluationJoinOn struct { + // Span contains span and trace IDs for direct span joining. + Span *EvaluationSpanJoin `json:"span,omitempty"` + // Tag contains tag key-value for tag-based joining. + Tag *EvaluationTagJoin `json:"tag,omitempty"` +} + +// EvaluationSpanJoin represents joining by span and trace ID. +type EvaluationSpanJoin struct { + // SpanID is the span ID to join on. + SpanID string `json:"span_id"` + // TraceID is the trace ID to join on. + TraceID string `json:"trace_id"` +} + +// EvaluationTagJoin represents joining by tag key-value pairs. +type EvaluationTagJoin struct { + // Key is the tag key to search for. + Key string `json:"key"` + // Value is the tag value to match. + Value string `json:"value"` +} + +// LLMObsMetric represents an evaluation metric for LLMObs spans. +type LLMObsMetric struct { + JoinOn EvaluationJoinOn `json:"join_on"` + MetricType string `json:"metric_type,omitempty"` + Label string `json:"label,omitempty"` + CategoricalValue *string `json:"categorical_value,omitempty"` + ScoreValue *float64 `json:"score_value,omitempty"` + BooleanValue *bool `json:"boolean_value,omitempty"` + MLApp string `json:"ml_app,omitempty"` + TimestampMS int64 `json:"timestamp_ms,omitempty"` + Tags []string `json:"tags,omitempty"` +} + +type PushMetricsRequest struct { + Data PushMetricsRequestData `json:"data"` +} + +type PushMetricsRequestData struct { + Type string `json:"type"` + Attributes PushMetricsRequestDataAttributes `json:"attributes"` +} + +type PushMetricsRequestDataAttributes struct { + Metrics []*LLMObsMetric `json:"metrics"` +} + +func (c *Transport) PushEvalMetrics( + ctx context.Context, + metrics []*LLMObsMetric, +) error { + if len(metrics) == 0 { + return nil + } + path := endpointEvalMetric + method := http.MethodPost + body := &PushMetricsRequest{ + Data: PushMetricsRequestData{ + Type: "evaluation_metric", + Attributes: PushMetricsRequestDataAttributes{ + Metrics: metrics, + }, + }, + } + + result, err := c.jsonRequest(ctx, method, path, subdomainEvalMetric, body, defaultTimeout) + if err != nil { + return err + } + if result.statusCode != http.StatusOK && result.statusCode != http.StatusAccepted { + return fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + return nil +} diff --git a/internal/llmobs/transport/span.go b/internal/llmobs/transport/span.go new file mode 100644 index 0000000000..50521db0fd --- /dev/null +++ b/internal/llmobs/transport/span.go @@ -0,0 +1,82 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +import ( + "context" + "fmt" + "net/http" + + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +type SpanLink struct { + TraceID uint64 `json:"trace_id"` + TraceIDHigh uint64 `json:"trace_id_high,omitempty"` + SpanID uint64 `json:"span_id"` + Attributes map[string]string `json:"attributes,omitempty"` + Tracestate string `json:"tracestate,omitempty"` + Flags uint32 `json:"flags,omitempty"` +} + +type LLMObsSpanEvent struct { + SpanID string `json:"span_id,omitempty"` + TraceID string `json:"trace_id,omitempty"` + ParentID string `json:"parent_id,omitempty"` + SessionID string `json:"session_id,omitempty"` + Tags []string `json:"tags,omitempty"` + Name string `json:"name,omitempty"` + StartNS int64 `json:"start_ns,omitempty"` + Duration int64 `json:"duration,omitempty"` + Status string `json:"status,omitempty"` + StatusMessage string `json:"status_message,omitempty"` + Meta map[string]any `json:"meta,omitempty"` + Metrics map[string]float64 `json:"metrics,omitempty"` + CollectionErrors []string `json:"collection_errors,omitempty"` + SpanLinks []SpanLink `json:"span_links,omitempty"` + Scope string `json:"-"` +} + +type PushSpanEventsRequest struct { + Stage string `json:"_dd.stage,omitempty"` + TracerVersion string `json:"_dd.tracer_version,omitempty"` + Scope string `json:"_dd.scope,omitempty"` + EventType string `json:"event_type,omitempty"` + Spans []*LLMObsSpanEvent `json:"spans,omitempty"` +} + +func (c *Transport) PushSpanEvents( + ctx context.Context, + events []*LLMObsSpanEvent, +) error { + if len(events) == 0 { + return nil + } + path := endpointLLMSpan + method := http.MethodPost + body := make([]*PushSpanEventsRequest, 0, len(events)) + for _, ev := range events { + req := &PushSpanEventsRequest{ + Stage: "raw", + TracerVersion: version.Tag, + EventType: "span", + Spans: []*LLMObsSpanEvent{ev}, + } + if ev.Scope != "" { + req.Scope = ev.Scope + } + body = append(body, req) + } + + result, err := c.jsonRequest(ctx, method, path, subdomainLLMSpan, body, defaultTimeout) + if err != nil { + return err + } + if result.statusCode != http.StatusOK && result.statusCode != http.StatusAccepted { + return fmt.Errorf("unexpected status %d: %s", result.statusCode, string(result.body)) + } + return nil +} diff --git a/internal/llmobs/transport/transport.go b/internal/llmobs/transport/transport.go new file mode 100644 index 0000000000..4ddd3f91c9 --- /dev/null +++ b/internal/llmobs/transport/transport.go @@ -0,0 +1,325 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "reflect" + "strconv" + "strings" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/errortrace" + "github.com/cenkalti/backoff/v5" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/config" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const ( + headerEVPSubdomain = "X-Datadog-EVP-Subdomain" + headerRateLimitReset = "x-ratelimit-reset" +) + +const ( + endpointEvalMetric = "/api/intake/llm-obs/v2/eval-metric" + endpointLLMSpan = "/api/v2/llmobs" + + endpointPrefixEVPProxy = "/evp_proxy/v2" + endpointPrefixDNE = "/api/unstable/llm-obs/v1" + + subdomainLLMSpan = "llmobs-intake" + subdomainEvalMetric = "api" + subdomainDNE = "api" +) + +const ( + defaultSite = "datadoghq.com" + defaultMaxRetries uint = 3 + + defaultTimeout = 5 * time.Second + bulkUploadTimeout = 60 * time.Second + getDatasetRecordsTimeout = 20 * time.Second +) + +var ( + ErrDatasetNotFound = errors.New("dataset not found") +) + +func defaultBackoffStrategy() *backoff.ExponentialBackOff { + return &backoff.ExponentialBackOff{ + InitialInterval: 100 * time.Millisecond, + RandomizationFactor: 0.5, + Multiplier: 1.5, + MaxInterval: 1 * time.Second, + } +} + +type Transport struct { + httpClient *http.Client + defaultHeaders map[string]string + site string + agentURL *url.URL + agentless bool + appKey string +} + +// New builds a new Transport for LLM Observability endpoints. +func New(cfg *config.Config) *Transport { + site := defaultSite + if cfg.TracerConfig.Site != "" { + site = cfg.TracerConfig.Site + } + + defaultHeaders := make(map[string]string) + if cfg.ResolvedAgentlessEnabled { + defaultHeaders["DD-API-KEY"] = cfg.TracerConfig.APIKey + } + + // Clone the HTTP client and remove its global timeout + // We manage timeouts per-request using context.WithTimeout + httpClient := cfg.TracerConfig.HTTPClient + if httpClient != nil && httpClient.Timeout > 0 { + clientCopy := *httpClient + clientCopy.Timeout = 0 + httpClient = &clientCopy + } + + return &Transport{ + httpClient: httpClient, + defaultHeaders: defaultHeaders, + site: site, + agentURL: cfg.TracerConfig.AgentURL, + agentless: cfg.ResolvedAgentlessEnabled, + appKey: cfg.TracerConfig.APPKey, + } +} + +// AnyPtr returns a pointer to the given value. This is used to create payloads that require pointers instead of values. +func AnyPtr[T any](v T) *T { + return &v +} + +// NewErrorMessage returns the payload representation of an error. +func NewErrorMessage(err error) *ErrorMessage { + if err == nil { + return nil + } + return &ErrorMessage{ + Message: err.Error(), + Type: errType(err), + Stack: errStackTrace(err), + } +} + +func errType(err error) string { + var originalErr error + var wErr *errortrace.TracerError + if !errors.As(err, &wErr) { + originalErr = err + } else { + originalErr = wErr.Unwrap() + } + return reflect.TypeOf(originalErr).String() +} + +func errStackTrace(err error) string { + var wErr *errortrace.TracerError + if !errors.As(err, &wErr) { + return "" + } + return wErr.Format() +} + +func (c *Transport) baseURL(subdomain string) string { + if c.agentless { + return fmt.Sprintf("https://%s.%s", subdomain, c.site) + } + u := "" + if c.agentURL.Scheme == "unix" { + u = internal.UnixDataSocketURL(c.agentURL.Path).String() + } else { + u = c.agentURL.String() + } + u += endpointPrefixEVPProxy + return u +} + +func (c *Transport) jsonRequest(ctx context.Context, method, path, subdomain string, body any, timeout time.Duration) (requestResult, error) { + var jsonBody io.Reader + if body != nil { + var buf bytes.Buffer + enc := json.NewEncoder(&buf) + enc.SetEscapeHTML(false) + if err := enc.Encode(body); err != nil { + return requestResult{}, fmt.Errorf("failed to json encode body: %w", err) + } + jsonBody = bytes.NewReader(buf.Bytes()) + } + return c.request(ctx, method, path, subdomain, jsonBody, "application/json", timeout) +} + +type requestResult struct { + statusCode int + body []byte +} + +func (c *Transport) request(ctx context.Context, method, path, subdomain string, body io.Reader, contentType string, timeout time.Duration) (requestResult, error) { + if timeout == 0 { + timeout = defaultTimeout + } + urlStr := c.baseURL(subdomain) + path + backoffStrat := defaultBackoffStrategy() + + doRequest := func() (result requestResult, err error) { + log.Debug("llmobs: sending request (method: %s | url: %s)", method, urlStr) + defer func() { + if err != nil { + log.Debug("llmobs: request failed: %s", err.Error()) + } + }() + + // Reset body reader if it's seekable (for retries) + if body != nil { + if seeker, ok := body.(io.Seeker); ok { + if _, err := seeker.Seek(0, io.SeekStart); err != nil { + return requestResult{}, fmt.Errorf("failed to reset body reader: %w", err) + } + } + } + + req, err := http.NewRequestWithContext(ctx, method, urlStr, body) + if err != nil { + return requestResult{}, err + } + + req.Header.Set("Content-Type", contentType) + for key, val := range c.defaultHeaders { + req.Header.Set(key, val) + } + if !c.agentless { + req.Header.Set(headerEVPSubdomain, subdomain) + } + + // Set headers for datasets and experiments endpoints + if strings.HasPrefix(path, endpointPrefixDNE) { + if c.agentless && c.appKey != "" { + // In agentless mode, set the app key header if available + req.Header.Set("DD-APPLICATION-KEY", c.appKey) + } else if !c.agentless { + // In agent mode, always set the NeedsAppKey header (app key is ignored) + req.Header.Set("X-Datadog-NeedsAppKey", "true") + } + } + + // Set per-endpoint timeout + timeoutCtx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + req = req.WithContext(timeoutCtx) + + resp, err := c.httpClient.Do(req) + if err != nil { + return requestResult{}, err + } + defer resp.Body.Close() + + code := resp.StatusCode + if code >= 200 && code <= 299 { + b, readErr := io.ReadAll(resp.Body) + if readErr != nil { + return requestResult{}, fmt.Errorf("failed to read response body: %w", readErr) + } + log.Debug("llmobs: got success response: %s", string(b)) + return requestResult{statusCode: code, body: b}, nil + } + if isRetriableStatus(code) { + errMsg := fmt.Sprintf("request failed with transient http status code: %d", code) + if body := readErrorBody(resp); body != "" { + errMsg = fmt.Sprintf("%s: %s", errMsg, body) + } + return requestResult{}, fmt.Errorf("%s", errMsg) + } + if code == http.StatusTooManyRequests { + wait := parseRetryAfter(resp.Header) + log.Debug("llmobs: status code 429, waiting %s before retry...", wait.String()) + drainAndClose(resp.Body) + return requestResult{}, backoff.RetryAfter(int(wait.Seconds())) + } + errMsg := fmt.Sprintf("request failed with http status code: %d", resp.StatusCode) + if body := readErrorBody(resp); body != "" { + errMsg = fmt.Sprintf("%s: %s", errMsg, body) + } + drainAndClose(resp.Body) + return requestResult{}, backoff.Permanent(fmt.Errorf("%s", errMsg)) + } + + return backoff.Retry(ctx, doRequest, backoff.WithBackOff(backoffStrat), backoff.WithMaxTries(defaultMaxRetries)) +} + +func readErrorBody(resp *http.Response) string { + if resp == nil || resp.Body == nil { + return "" + } + // Only read the body if it's JSON + contentType := resp.Header.Get("Content-Type") + if !strings.Contains(contentType, "application/json") { + return "" + } + body, err := io.ReadAll(resp.Body) + if err != nil { + return "" + } + return strings.TrimSpace(string(body)) +} + +func drainAndClose(b io.ReadCloser) { + if b == nil { + return + } + io.Copy(io.Discard, io.LimitReader(b, 1<<20)) // drain up to 1MB to reuse conn + _ = b.Close() +} + +func parseRetryAfter(h http.Header) time.Duration { + rateLimitReset := h.Get(headerRateLimitReset) + waitSeconds := int64(1) + if rateLimitReset != "" { + if resetTime, err := strconv.ParseInt(rateLimitReset, 10, 64); err == nil { + seconds := int64(0) + if resetTime > time.Now().Unix() { + // Assume it's a Unix timestamp + seconds = int64(time.Until(time.Unix(resetTime, 0)).Seconds()) + } else { + // Assume it's a duration in seconds + seconds = resetTime + } + if seconds > 0 { + waitSeconds = seconds + } + } + } + return time.Duration(waitSeconds) * time.Second +} + +func isRetriableStatus(code int) bool { + switch code { + case http.StatusRequestTimeout, + http.StatusTooEarly: + return true + } + if code >= 500 && code <= 599 { + return true + } + return false +} diff --git a/internal/log/log.go b/internal/log/log.go index e26da38e8f..6c1f5499e9 100644 --- a/internal/log/log.go +++ b/internal/log/log.go @@ -15,18 +15,37 @@ import ( "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/appsec/dyngo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) // Level specifies the logging level that the log package prints at. type Level int +func (l Level) String() string { + switch l { + case LevelDebug: + return "DEBUG" + case LevelInfo: + return "INFO" + case LevelWarn: + return "WARN" + case LevelError: + return "ERROR" + default: + return "UNKNOWN" + } +} + const ( // LevelDebug represents debug level messages. LevelDebug Level = iota - // LevelWarn represents warning and errors. + // LevelInfo represents informational messages. + LevelInfo + // LevelWarn represents warning messages. LevelWarn + // LevelError represents error messages. + LevelError ) var prefixMsg = fmt.Sprintf("Datadog Tracer %s", version.Tag) @@ -74,9 +93,9 @@ func (m *ManagedFile) Name() string { } var ( - mu sync.RWMutex // guards below fields - level = LevelWarn - logger Logger = &defaultLogger{l: log.New(os.Stderr, "", log.LstdFlags)} + mu sync.RWMutex // guards below fields + levelThreshold = LevelWarn + logger Logger = &defaultLogger{l: log.New(os.Stderr, "", log.LstdFlags)} ) // UseLogger sets l as the active logger and returns a function to restore the @@ -88,6 +107,8 @@ func UseLogger(l Logger) (undo func()) { old := logger logger = l return func() { + mu.Lock() + defer mu.Unlock() logger = old } } @@ -103,7 +124,7 @@ func OpenFileAtPath(dirPath string) (*ManagedFile, error) { filepath := dirPath + "/" + LoggerFile f, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err != nil { - return nil, fmt.Errorf("using default logger to stderr due to error creating or opening log file: %v", err) + return nil, fmt.Errorf("using default logger to stderr due to error creating or opening log file: %s", err.Error()) } UseLogger(&defaultLogger{l: log.New(f, "", log.LstdFlags)}) return &ManagedFile{ @@ -111,18 +132,31 @@ func OpenFileAtPath(dirPath string) (*ManagedFile, error) { }, nil } -// SetLevel sets the given lvl for logging. +// SetLevel sets the given lvl as log threshold for logging. func SetLevel(lvl Level) { mu.Lock() defer mu.Unlock() - level = lvl + levelThreshold = lvl +} + +func DefaultLevel() Level { + mu.RLock() + defer mu.RUnlock() + return levelThreshold +} + +// GetLevel returns the currrent log level. +func GetLevel() Level { + mu.Lock() + defer mu.Unlock() + return levelThreshold } // DebugEnabled returns true if debug log messages are enabled. This can be used in extremely // hot code paths to avoid allocating the ...interface{} argument. func DebugEnabled() bool { mu.RLock() - lvl := level + lvl := levelThreshold mu.RUnlock() return lvl == LevelDebug } @@ -132,17 +166,17 @@ func Debug(fmt string, a ...interface{}) { if !DebugEnabled() { return } - printMsg("DEBUG", fmt, a...) + printMsg(LevelDebug, fmt, a...) } // Warn prints a warning message. func Warn(fmt string, a ...interface{}) { - printMsg("WARN", fmt, a...) + printMsg(LevelWarn, fmt, a...) } // Info prints an informational message. func Info(fmt string, a ...interface{}) { - printMsg("INFO", fmt, a...) + printMsg(LevelInfo, fmt, a...) } var ( @@ -153,6 +187,7 @@ var ( ) func init() { + // This cannot use env.Get because it would cause a cyclic import if v := os.Getenv("DD_LOGGING_RATE"); v != "" { setLoggingRate(v) } @@ -165,7 +200,7 @@ func init() { func setLoggingRate(v string) { if sec, err := strconv.ParseInt(v, 10, 64); err != nil { - Warn("Invalid value for DD_LOGGING_RATE: %v", err) + Warn("Invalid value for DD_LOGGING_RATE: %s", err.Error()) } else { if sec < 0 { Warn("Invalid value for DD_LOGGING_RATE: negative value") @@ -232,15 +267,15 @@ func Flush() { func flushLocked() { for _, report := range erragg { - msg := fmt.Sprintf("%v", report.err) + var extra string if report.count > defaultErrorLimit { - msg += fmt.Sprintf(", %d+ additional messages skipped (first occurrence: %s)", defaultErrorLimit, report.first.Format(time.RFC822)) + extra = fmt.Sprintf(", %d+ additional messages skipped (first occurrence: %s)", defaultErrorLimit, report.first.Format(time.RFC822)) } else if report.count > 1 { - msg += fmt.Sprintf(", %d additional messages skipped (first occurrence: %s)", report.count-1, report.first.Format(time.RFC822)) + extra = fmt.Sprintf(", %d additional messages skipped (first occurrence: %s)", report.count-1, report.first.Format(time.RFC822)) } else { - msg += fmt.Sprintf(" (occurred: %s)", report.first.Format(time.RFC822)) + extra = fmt.Sprintf(" (occurred: %s)", report.first.Format(time.RFC822)) } - printMsg("ERROR", msg) + printMsg(LevelError, "%v%s", report.err, extra) } for k := range erragg { // compiler-optimized map-clearing post go1.11 (golang/go#20138) @@ -249,20 +284,36 @@ func flushLocked() { erron = false } -func printMsg(lvl, format string, a ...interface{}) { - msg := fmt.Sprintf("%s %s: %s", prefixMsg, lvl, fmt.Sprintf(format, a...)) +func printMsg(lvl Level, format string, a ...interface{}) { + var b strings.Builder + b.Grow(len(prefixMsg) + 1 + len(lvl.String()) + 2 + len(format)) + b.WriteString(prefixMsg) + b.WriteString(" ") + b.WriteString(lvl.String()) + b.WriteString(": ") + b.WriteString(fmt.Sprintf(format, a...)) mu.RLock() - logger.Log(msg) + if ll, ok := logger.(interface { + LogL(lvl Level, msg string) + }); !ok { + logger.Log(b.String()) + } else { + ll.LogL(lvl, b.String()) + } mu.RUnlock() } type defaultLogger struct{ l *log.Logger } +var _ Logger = &defaultLogger{} + func (p *defaultLogger) Log(msg string) { p.l.Print(msg) } // DiscardLogger discards every call to Log(). type DiscardLogger struct{} +var _ Logger = &DiscardLogger{} + // Log implements Logger. func (d DiscardLogger) Log(_ string) {} @@ -273,6 +324,8 @@ type RecordLogger struct { ignore []string // a log is ignored if it contains a string in ignored } +var _ Logger = &RecordLogger{} + // Ignore adds substrings to the ignore field of RecordLogger, allowing // the RecordLogger to ignore attempts to log strings with certain substrings. func (r *RecordLogger) Ignore(substrings ...string) { diff --git a/internal/log/log_test.go b/internal/log/log_test.go index 1cfe67b0b0..4f1a7064ad 100644 --- a/internal/log/log_test.go +++ b/internal/log/log_test.go @@ -23,6 +23,8 @@ type testLogger struct { lines []string } +var _ Logger = &testLogger{} + // Print implements Logger. func (tp *testLogger) Log(msg string) { tp.mu.Lock() @@ -64,7 +66,7 @@ func TestLogDirectory(t *testing.T) { assert.False(t, f.closed) // ensure this setting plays nicely with other log features - oldLvl := level + oldLvl := levelThreshold SetLevel(LevelDebug) defer func() { SetLevel(oldLvl) @@ -128,7 +130,7 @@ func TestLog(t *testing.T) { t.Run("Debug", func(t *testing.T) { t.Run("on", func(t *testing.T) { tp.Reset() - defer func(old Level) { level = old }(level) + defer func(old Level) { levelThreshold = old }(levelThreshold) SetLevel(LevelDebug) assert.True(t, DebugEnabled()) @@ -276,3 +278,11 @@ func containsMessage(lvl, m string, lines []string) bool { } return false } + +func BenchmarkLog(b *testing.B) { + UseLogger(DiscardLogger{}) + b.ReportAllocs() + for i := 0; i < b.N; i++ { + Warn("test") + } +} diff --git a/internal/meta_struct.go b/internal/meta_internal_types.go similarity index 62% rename from internal/meta_struct.go rename to internal/meta_internal_types.go index 6a8404d9c7..4bd9fb803a 100644 --- a/internal/meta_struct.go +++ b/internal/meta_internal_types.go @@ -10,3 +10,10 @@ package internal type MetaStructValue struct { Value any // TODO: further constraining Value's type, especially if it becomes public } + +// TraceSourceTagValue is a custom type wrapper used to create the trace source (_dd.p.ts) tag that will +// be propagated to downstream distributed traces via the `X-Datadog-Tags` HTTP header for example. +// It is represented as a 2 character hexadecimal string +type TraceSourceTagValue struct { + Value TraceSource +} diff --git a/internal/namingschema/namingschema.go b/internal/namingschema/namingschema.go index 5198a01685..d8ab25f93a 100644 --- a/internal/namingschema/namingschema.go +++ b/internal/namingschema/namingschema.go @@ -9,8 +9,12 @@ package namingschema import ( "strings" - "sync" "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // Version represents the available naming schema versions. @@ -23,55 +27,72 @@ const ( SchemaV1 ) -const ( - defaultSchemaVersion = SchemaV0 -) +type Config struct { + NamingSchemaVersion Version + RemoveIntegrationServiceNames bool + DDService string +} var ( - sv int32 - - useGlobalServiceName bool - useGlobalServiceNameMu sync.RWMutex + activeNamingSchema atomic.Int32 + removeIntegrationServiceNames atomic.Bool ) -// ParseVersion attempts to parse the version string. -func ParseVersion(v string) (Version, bool) { - switch strings.ToLower(v) { - case "", "v0": - return SchemaV0, true - case "v1": - return SchemaV1, true - default: - return SchemaV0, false +func LoadFromEnv() { + schemaVersionStr := env.Get("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA") + if v, ok := parseVersionStr(schemaVersionStr); ok { + setVersion(v) + } else { + setVersion(SchemaV0) + log.Warn("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA=%s is not a valid value, setting to default of v%d", schemaVersionStr, v) + } + // Allow DD_TRACE_SPAN_ATTRIBUTE_SCHEMA=v0 users to disable default integration (contrib AKA v0) service names. + // These default service names are always disabled for v1 onwards. + SetRemoveIntegrationServiceNames(internal.BoolEnv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", false)) +} + +// ReloadConfig is used to reload the configuration in tests. +func ReloadConfig() { + LoadFromEnv() + globalconfig.SetServiceName(env.Get("DD_SERVICE")) +} + +// GetConfig returns the naming schema config. +func GetConfig() Config { + return Config{ + NamingSchemaVersion: GetVersion(), + RemoveIntegrationServiceNames: getRemoveIntegrationServiceNames(), + DDService: globalconfig.ServiceName(), } } // GetVersion returns the global naming schema version used for this application. func GetVersion() Version { - return Version(atomic.LoadInt32(&sv)) + return Version(activeNamingSchema.Load()) } -// SetVersion sets the global naming schema version used for this application. -func SetVersion(v Version) { - atomic.StoreInt32(&sv, int32(v)) +// setVersion sets the global naming schema version used for this application. +func setVersion(v Version) { + activeNamingSchema.Store(int32(v)) } -// SetDefaultVersion sets the default global naming schema version. -func SetDefaultVersion() Version { - SetVersion(defaultSchemaVersion) - return defaultSchemaVersion +// parseVersionStr attempts to parse the version string. +func parseVersionStr(v string) (Version, bool) { + switch strings.ToLower(v) { + case "", "v0": + return SchemaV0, true + case "v1": + return SchemaV1, true + default: + return SchemaV0, false + } } -// UseGlobalServiceName returns the value of the useGlobalServiceName setting for this application. -func UseGlobalServiceName() bool { - useGlobalServiceNameMu.RLock() - defer useGlobalServiceNameMu.RUnlock() - return useGlobalServiceName +func getRemoveIntegrationServiceNames() bool { + return removeIntegrationServiceNames.Load() } -// SetUseGlobalServiceName sets the value of the useGlobalServiceName setting used for this application. -func SetUseGlobalServiceName(v bool) { - useGlobalServiceNameMu.Lock() - defer useGlobalServiceNameMu.Unlock() - useGlobalServiceName = v +// SetRemoveIntegrationServiceNames sets the value of the RemoveIntegrationServiceNames setting for this application. +func SetRemoveIntegrationServiceNames(v bool) { + removeIntegrationServiceNames.Store(v) } diff --git a/internal/namingschema/namingschema_test.go b/internal/namingschema/namingschema_test.go new file mode 100644 index 0000000000..726e030f1d --- /dev/null +++ b/internal/namingschema/namingschema_test.go @@ -0,0 +1,57 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package namingschema + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNamingSchema(t *testing.T) { + t.Run("defaults", func(t *testing.T) { + LoadFromEnv() + + cfg := GetConfig() + assert.EqualValues(t, 0, cfg.NamingSchemaVersion) + assert.Equal(t, false, cfg.RemoveIntegrationServiceNames) + assert.Equal(t, "", cfg.DDService) + }) + + t.Run("env-vars", func(t *testing.T) { + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "v1") + t.Setenv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", "true") + + LoadFromEnv() + + cfg := GetConfig() + assert.EqualValues(t, 1, cfg.NamingSchemaVersion) + assert.Equal(t, true, cfg.RemoveIntegrationServiceNames) + assert.Equal(t, "", cfg.DDService) + }) + + t.Run("options", func(t *testing.T) { + LoadFromEnv() + SetRemoveIntegrationServiceNames(true) + + cfg := GetConfig() + assert.EqualValues(t, 0, cfg.NamingSchemaVersion) + assert.Equal(t, true, cfg.RemoveIntegrationServiceNames) + assert.Equal(t, "", cfg.DDService) + }) + + t.Run("fallback to v0", func(t *testing.T) { + t.Setenv("DD_TRACE_SPAN_ATTRIBUTE_SCHEMA", "invalid") + t.Setenv("DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED", "true") + + LoadFromEnv() + + cfg := GetConfig() + assert.EqualValues(t, 0, cfg.NamingSchemaVersion) + assert.Equal(t, true, cfg.RemoveIntegrationServiceNames) + assert.Equal(t, "", cfg.DDService) + }) +} diff --git a/internal/namingschema/op.go b/internal/namingschema/op.go deleted file mode 100644 index 01c90726c1..0000000000 --- a/internal/namingschema/op.go +++ /dev/null @@ -1,191 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschema - -import ( - "fmt" - "strings" -) - -type IntegrationType int - -const ( - // client/server - HTTPClient IntegrationType = iota - HTTPServer - GRPCClient - GRPCServer - GraphqlServer - TwirpClient - TwirpServer - - // messaging - KafkaOutbound - KafkaInbound - GCPPubSubInbound - GCPPubSubOutbound - - // cache - MemcachedOutbound - RedisOutbound - - // db - ElasticSearchOutbound - MongoDBOutbound - CassandraOutbound - LevelDBOutbound - BuntDBOutbound - ConsulOutbound - VaultOutbound -) - -func opV1(t IntegrationType) string { - switch t { - // Client/Server - case HTTPClient: - return "http.client.request" - case HTTPServer: - return "http.server.request" - case GRPCClient: - return "grpc.client.request" - case GRPCServer: - return "grpc.server.request" - case GraphqlServer: - return "graphql.server.request" - case TwirpClient: - return "twirp.client.request" - case TwirpServer: - return "twirp.server.request" - - // Messaging - case KafkaOutbound: - return "kafka.send" - case KafkaInbound: - return "kafka.process" - case GCPPubSubInbound: - return "gcp.pubsub.process" - case GCPPubSubOutbound: - return "gcp.pubsub.send" - - // Cache - case MemcachedOutbound: - return "memcached.command" - case RedisOutbound: - return "redis.command" - - // Database - case ElasticSearchOutbound: - return "elasticsearch.query" - case MongoDBOutbound: - return "mongodb.query" - case CassandraOutbound: - return "cassandra.query" - case LevelDBOutbound: - return "leveldb.query" - case BuntDBOutbound: - return "buntdb.query" - case ConsulOutbound: - return "consul.query" - case VaultOutbound: - return "vault.query" - } - return "" -} - -func opV0(t IntegrationType) string { - switch t { - case HTTPClient, HTTPServer: - return "http.request" - case GRPCClient: - return "grpc.client" - case GRPCServer: - return "grpc.server" - case GraphqlServer: - return "graphql.request" - case TwirpClient: - return "twirp.request" - case TwirpServer: - return "twirp.request" - case KafkaOutbound: - return "kafka.produce" - case KafkaInbound: - return "kafka.consume" - case GCPPubSubInbound: - return "pubsub.receive" - case GCPPubSubOutbound: - return "pubsub.publish" - case MemcachedOutbound: - return "memcached.query" - case RedisOutbound: - return "redis.command" - case ElasticSearchOutbound: - return "elasticsearch.query" - case MongoDBOutbound: - return "mongodb.query" - case CassandraOutbound: - return "cassandra.query" - case LevelDBOutbound: - return "leveldb.query" - case BuntDBOutbound: - return "buntdb.query" - case ConsulOutbound: - return "consul.command" - case VaultOutbound: - return "http.request" - } - return "" -} - -func OpName(t IntegrationType) string { - switch GetVersion() { - case SchemaV1: - return opV1(t) - default: - return opV0(t) - } -} - -func OpNameOverrideV0(t IntegrationType, overrideV0 string) string { - switch GetVersion() { - case SchemaV1: - return opV1(t) - default: - return overrideV0 - } -} - -func DBOpName(system string, overrideV0 string) string { - switch GetVersion() { - case SchemaV1: - return system + ".query" - default: - return overrideV0 - } -} - -func isMessagingSendOp(awsService, awsOperation string) bool { - s, op := strings.ToLower(awsService), strings.ToLower(awsOperation) - if s == "sqs" { - return strings.HasPrefix(op, "sendmessage") - } - if s == "sns" { - return op == "publish" - } - return false -} - -func AWSOpName(awsService, awsOp, overrideV0 string) string { - switch GetVersion() { - case SchemaV1: - op := "request" - if isMessagingSendOp(awsService, awsOp) { - op = "send" - } - return fmt.Sprintf("aws.%s.%s", strings.ToLower(awsService), op) - default: - return overrideV0 - } -} diff --git a/internal/namingschema/op_test.go b/internal/namingschema/op_test.go deleted file mode 100644 index 7cf244081f..0000000000 --- a/internal/namingschema/op_test.go +++ /dev/null @@ -1,206 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschema_test - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - - "github.com/stretchr/testify/assert" -) - -func TestOpName(t *testing.T) { - optOverrideV0 := "override-v0" - - testCases := []struct { - name string - newSchema func() string - wantV0 string - wantV1 string - }{ - { - name: "kafka outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.KafkaOutbound) - }, - wantV0: "kafka.produce", - wantV1: "kafka.send", - }, - { - name: "kafka inbound", - newSchema: func() string { - return namingschema.OpName(namingschema.KafkaInbound) - }, - wantV0: "kafka.consume", - wantV1: "kafka.process", - }, - { - name: "gcp pubsub outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.GCPPubSubOutbound) - }, - wantV0: "pubsub.publish", - wantV1: "gcp.pubsub.send", - }, - { - name: "gcp pubsub inbound", - newSchema: func() string { - return namingschema.OpName(namingschema.GCPPubSubInbound) - }, - wantV0: "pubsub.receive", - wantV1: "gcp.pubsub.process", - }, - { - name: "override", - newSchema: func() string { - return namingschema.OpNameOverrideV0(namingschema.GCPPubSubInbound, optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "gcp.pubsub.process", - }, - { - name: "http client", - newSchema: func() string { - return namingschema.OpName(namingschema.HTTPClient) - }, - wantV0: "http.request", - wantV1: "http.client.request", - }, - { - name: "http server", - newSchema: func() string { - return namingschema.OpName(namingschema.HTTPServer) - }, - wantV0: "http.request", - wantV1: "http.server.request", - }, - { - name: "grpc client", - newSchema: func() string { - return namingschema.OpName(namingschema.GRPCClient) - }, - wantV0: "grpc.client", - wantV1: "grpc.client.request", - }, - { - name: "grpc server", - newSchema: func() string { - return namingschema.OpName(namingschema.GRPCServer) - }, - wantV0: "grpc.server", - wantV1: "grpc.server.request", - }, - { - name: "graphql server", - newSchema: func() string { - return namingschema.OpName(namingschema.GraphqlServer) - }, - wantV0: "graphql.request", - wantV1: "graphql.server.request", - }, - { - name: "memcached outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.MemcachedOutbound) - }, - wantV0: "memcached.query", - wantV1: "memcached.command", - }, - { - name: "redis outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.RedisOutbound) - }, - wantV0: "redis.command", - wantV1: "redis.command", - }, - { - name: "elasticsearch outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.ElasticSearchOutbound) - }, - wantV0: "elasticsearch.query", - wantV1: "elasticsearch.query", - }, - { - name: "mongodb outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.MongoDBOutbound) - }, - wantV0: "mongodb.query", - wantV1: "mongodb.query", - }, - { - name: "cassandra outbound", - newSchema: func() string { - return namingschema.OpName(namingschema.CassandraOutbound) - }, - wantV0: "cassandra.query", - wantV1: "cassandra.query", - }, - { - name: "DBOpName", - newSchema: func() string { - return namingschema.DBOpName("my-custom-database", optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "my-custom-database.query", - }, - { - name: "AWSOpName", - newSchema: func() string { - return namingschema.AWSOpName("service", "operation", optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "aws.service.request", - }, - { - name: "AWSOpName-sns-send", - newSchema: func() string { - return namingschema.AWSOpName("sns", "publish", optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "aws.sns.send", - }, - { - name: "AWSOpName-sns-other", - newSchema: func() string { - return namingschema.AWSOpName("sns", "other", optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "aws.sns.request", - }, - { - name: "AWSOpName-sqs-send", - newSchema: func() string { - return namingschema.AWSOpName("sqs", "sendmessage-something", optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "aws.sqs.send", - }, - { - name: "AWSOpName-sqs-other", - newSchema: func() string { - return namingschema.AWSOpName("sqs", "other", optOverrideV0) - }, - wantV0: "override-v0", - wantV1: "aws.sqs.request", - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - version := namingschema.GetVersion() - defer namingschema.SetVersion(version) - - namingschema.SetVersion(namingschema.SchemaV0) - assert.Equal(t, tc.wantV0, tc.newSchema()) - - namingschema.SetVersion(namingschema.SchemaV1) - assert.Equal(t, tc.wantV1, tc.newSchema()) - }) - } -} diff --git a/internal/namingschema/service_name.go b/internal/namingschema/service_name.go deleted file mode 100644 index 6502700690..0000000000 --- a/internal/namingschema/service_name.go +++ /dev/null @@ -1,40 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschema - -import "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - -func ServiceName(fallback string) string { - switch GetVersion() { - case SchemaV1: - if svc := globalconfig.ServiceName(); svc != "" { - return svc - } - return fallback - default: - if svc := globalconfig.ServiceName(); svc != "" { - return svc - } - return fallback - } -} - -func ServiceNameOverrideV0(fallback, overrideV0 string) string { - switch GetVersion() { - case SchemaV1: - if svc := globalconfig.ServiceName(); svc != "" { - return svc - } - return fallback - default: - if UseGlobalServiceName() { - if svc := globalconfig.ServiceName(); svc != "" { - return svc - } - } - return overrideV0 - } -} diff --git a/internal/namingschema/service_name_test.go b/internal/namingschema/service_name_test.go deleted file mode 100644 index 411d775d5a..0000000000 --- a/internal/namingschema/service_name_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package namingschema_test - -import ( - "testing" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/namingschema" - - "github.com/stretchr/testify/assert" -) - -func TestServiceName(t *testing.T) { - defaultServiceName := "default" - - testCases := []struct { - name string - schemaVersion namingschema.Version - ddService string - setup func() func() - call func() string - want string - }{ - { - name: "v0", - schemaVersion: namingschema.SchemaV0, - ddService: "", - call: func() string { return namingschema.ServiceName(defaultServiceName) }, - want: "default", - }, - { - name: "v0-DD_SERVICE", - schemaVersion: namingschema.SchemaV0, - ddService: "dd-service", - call: func() string { return namingschema.ServiceName(defaultServiceName) }, - want: "dd-service", - }, - { - name: "v0-override", - schemaVersion: namingschema.SchemaV0, - ddService: "dd-service", - call: func() string { return namingschema.ServiceNameOverrideV0(defaultServiceName, "override-v0") }, - want: "override-v0", - }, - { - name: "v1", - schemaVersion: namingschema.SchemaV1, - ddService: "", - call: func() string { return namingschema.ServiceName(defaultServiceName) }, - want: "default", - }, - { - name: "v1-DD_SERVICE", - schemaVersion: namingschema.SchemaV1, - ddService: "dd-service", - call: func() string { return namingschema.ServiceName(defaultServiceName) }, - want: "dd-service", - }, - { - name: "v0-UseGlobalServiceName", - schemaVersion: namingschema.SchemaV0, - ddService: "dd-service", - setup: func() func() { - prev := namingschema.UseGlobalServiceName() - namingschema.SetUseGlobalServiceName(true) - return func() { - namingschema.SetUseGlobalServiceName(prev) - } - }, - call: func() string { return namingschema.ServiceNameOverrideV0(defaultServiceName, "override-v0") }, - want: "dd-service", - }, - { - name: "v0-UseGlobalServiceName", - schemaVersion: namingschema.SchemaV1, - ddService: "dd-service", - setup: func() func() { - prev := namingschema.UseGlobalServiceName() - namingschema.SetUseGlobalServiceName(true) - return func() { - namingschema.SetUseGlobalServiceName(prev) - } - }, - call: func() string { return namingschema.ServiceNameOverrideV0(defaultServiceName, "override-v0") }, - want: "dd-service", - }, - } - for _, tc := range testCases { - t.Run(tc.name, func(t *testing.T) { - version := namingschema.GetVersion() - defer namingschema.SetVersion(version) - namingschema.SetVersion(tc.schemaVersion) - - if tc.setup != nil { - cleanup := tc.setup() - defer cleanup() - } - if tc.ddService != "" { - svc := globalconfig.ServiceName() - defer globalconfig.SetServiceName(svc) - globalconfig.SetServiceName(tc.ddService) - } - s := tc.call() - assert.Equal(t, tc.want, s) - }) - } -} diff --git a/internal/normalizer/normalizer.go b/internal/normalizer/normalizer.go index eab118968b..1d0984adc0 100644 --- a/internal/normalizer/normalizer.go +++ b/internal/normalizer/normalizer.go @@ -11,8 +11,8 @@ import ( "regexp" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) // headerTagRegexp is used to replace all invalid characters in the config. Only alphanumerics, whitespaces and dashes allowed. @@ -43,7 +43,7 @@ func HeaderTagSlice(headers []string) map[string]string { header, tag := HeaderTag(h) // If `header` or `tag` is just the empty string, we don't want to set it. if len(header) == 0 || len(tag) == 0 { - log.Debug("Header-tag input is in unsupported format; dropping input value %v", h) + log.Debug("Header-tag input is in unsupported format; dropping input value %s", h) continue } headerTagsMap[header] = tag diff --git a/internal/normalizer/normalizer_test.go b/internal/normalizer/normalizer_test.go index 31fff57812..7a9be660f5 100644 --- a/internal/normalizer/normalizer_test.go +++ b/internal/normalizer/normalizer_test.go @@ -9,7 +9,7 @@ import ( "net/textproto" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" "github.com/stretchr/testify/assert" ) diff --git a/internal/orchestrion/_integration/.golangci.yml b/internal/orchestrion/_integration/.golangci.yml new file mode 120000 index 0000000000..e4de93069c --- /dev/null +++ b/internal/orchestrion/_integration/.golangci.yml @@ -0,0 +1 @@ +../../../.golangci.yml \ No newline at end of file diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/README.md b/internal/orchestrion/_integration/99designs.gqlgen/generated/README.md new file mode 100644 index 0000000000..2dfa2f406b --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/README.md @@ -0,0 +1,4 @@ +## Re-generating the server + +You can run `go generate -tags=glqgen,integration ./...` to re-generate the server. After doing so, you will +need to manually fix the licensing headers in all files that were re-generated and lost it. diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/generate.go b/internal/orchestrion/_integration/99designs.gqlgen/generated/generate.go new file mode 100644 index 0000000000..02b73ff097 --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/generate.go @@ -0,0 +1,10 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build gqlgen + +package gqlgen + +//go:generate go run github.com/99designs/gqlgen generate diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/gqlgen.yml b/internal/orchestrion/_integration/99designs.gqlgen/generated/gqlgen.yml new file mode 100644 index 0000000000..d2c81ff9ad --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/gqlgen.yml @@ -0,0 +1,92 @@ +# Where are all the schema files located? globs are supported eg src/**/*.graphqls +schema: + - graph/*.graphqls + +# Where should the generated server code go? +exec: + filename: graph/generated.go + package: graph + +# Uncomment to enable federation +# federation: +# filename: graph/federation.go +# package: graph + +# Where should any generated models go? +model: + filename: graph/model/models_gen.go + package: model + +# Where should the resolver implementations go? +resolver: + layout: follow-schema + dir: graph + package: graph + filename_template: "{name}.resolvers.go" + # Optional: turn on to not generate template comments above resolvers + # omit_template_comment: false + +# Optional: turn on use ` + "`" + `gqlgen:"fieldName"` + "`" + ` tags in your models +# struct_tag: json + +# Optional: turn on to use []Thing instead of []*Thing +# omit_slice_element_pointers: false + +# Optional: turn on to omit Is() methods to interface and unions +# omit_interface_checks : true + +# Optional: turn on to skip generation of ComplexityRoot struct content and Complexity function +# omit_complexity: false + +# Optional: turn on to not generate any file notice comments in generated files +# omit_gqlgen_file_notice: false + +# Optional: turn on to exclude the gqlgen version in the generated file notice. No effect if `omit_gqlgen_file_notice` is true. +# omit_gqlgen_version_in_file_notice: false + +# Optional: turn off to make struct-type struct fields not use pointers +# e.g. type Thing struct { FieldA OtherThing } instead of { FieldA *OtherThing } +# struct_fields_always_pointers: true + +# Optional: turn off to make resolvers return values instead of pointers for structs +# resolvers_always_return_pointers: true + +# Optional: turn on to return pointers instead of values in unmarshalInput +# return_pointers_in_unmarshalinput: false + +# Optional: wrap nullable input fields with Omittable +# nullable_input_omittable: true + +# Optional: set to speed up generation time by not performing a final validation pass. +# skip_validation: true + +# Optional: set to skip running `go mod tidy` when generating server code +# skip_mod_tidy: true + +# gqlgen will search for any type names in the schema in these go packages +# if they match it will use them, otherwise it will generate them. +autobind: +# - "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/model" + +# This section declares type mapping between the GraphQL and go type systems +# +# The first line in each type will be used as defaults for resolver arguments and +# modelgen, the others will be allowed when binding to fields. Configure them to +# your liking +models: + ID: + model: + - github.com/99designs/gqlgen/graphql.ID + - github.com/99designs/gqlgen/graphql.Int + - github.com/99designs/gqlgen/graphql.Int64 + - github.com/99designs/gqlgen/graphql.Int32 + Int: + model: + - github.com/99designs/gqlgen/graphql.Int + - github.com/99designs/gqlgen/graphql.Int64 + - github.com/99designs/gqlgen/graphql.Int32 + - + TopLevel: + fields: + nested: + resolver: true diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/generated.go b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/generated.go new file mode 100644 index 0000000000..a59848dd89 --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/generated.go @@ -0,0 +1,3646 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. + +package graph + +import ( + "bytes" + "context" + "embed" + "errors" + "fmt" + "strconv" + "sync" + "sync/atomic" + + "github.com/99designs/gqlgen/graphql" + "github.com/99designs/gqlgen/graphql/introspection" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/model" + gqlparser "github.com/vektah/gqlparser/v2" + "github.com/vektah/gqlparser/v2/ast" +) + +// region ************************** generated!.gotpl ************************** + +// NewExecutableSchema creates an ExecutableSchema from the ResolverRoot interface. +func NewExecutableSchema(cfg Config) graphql.ExecutableSchema { + return &executableSchema{ + schema: cfg.Schema, + resolvers: cfg.Resolvers, + directives: cfg.Directives, + complexity: cfg.Complexity, + } +} + +type Config struct { + Schema *ast.Schema + Resolvers ResolverRoot + Directives DirectiveRoot + Complexity ComplexityRoot +} + +type ResolverRoot interface { + Query() QueryResolver + TopLevel() TopLevelResolver +} + +type DirectiveRoot struct { +} + +type ComplexityRoot struct { + Query struct { + TopLevel func(childComplexity int, id string) int + } + + TopLevel struct { + Nested func(childComplexity int, id string) int + } +} + +type QueryResolver interface { + TopLevel(ctx context.Context, id string) (*model.TopLevel, error) +} +type TopLevelResolver interface { + Nested(ctx context.Context, obj *model.TopLevel, id string) (string, error) +} + +type executableSchema struct { + schema *ast.Schema + resolvers ResolverRoot + directives DirectiveRoot + complexity ComplexityRoot +} + +func (e *executableSchema) Schema() *ast.Schema { + if e.schema != nil { + return e.schema + } + return parsedSchema +} + +func (e *executableSchema) Complexity(ctx context.Context, typeName, field string, childComplexity int, rawArgs map[string]any) (int, bool) { + ec := executionContext{nil, e, 0, 0, nil} + _ = ec + switch typeName + "." + field { + + case "Query.topLevel": + if e.complexity.Query.TopLevel == nil { + break + } + + args, err := ec.field_Query_topLevel_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.Query.TopLevel(childComplexity, args["id"].(string)), true + + case "TopLevel.nested": + if e.complexity.TopLevel.Nested == nil { + break + } + + args, err := ec.field_TopLevel_nested_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.complexity.TopLevel.Nested(childComplexity, args["id"].(string)), true + + } + return 0, false +} + +func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { + opCtx := graphql.GetOperationContext(ctx) + ec := executionContext{opCtx, e, 0, 0, make(chan graphql.DeferredResult)} + inputUnmarshalMap := graphql.BuildUnmarshalerMap() + first := true + + switch opCtx.Operation.Operation { + case ast.Query: + return func(ctx context.Context) *graphql.Response { + var response graphql.Response + var data graphql.Marshaler + if first { + first = false + ctx = graphql.WithUnmarshalerMap(ctx, inputUnmarshalMap) + data = ec._Query(ctx, opCtx.Operation.SelectionSet) + } else { + if atomic.LoadInt32(&ec.pendingDeferred) > 0 { + result := <-ec.deferredResults + atomic.AddInt32(&ec.pendingDeferred, -1) + data = result.Result + response.Path = result.Path + response.Label = result.Label + response.Errors = result.Errors + } else { + return nil + } + } + var buf bytes.Buffer + data.MarshalGQL(&buf) + response.Data = buf.Bytes() + if atomic.LoadInt32(&ec.deferred) > 0 { + hasNext := atomic.LoadInt32(&ec.pendingDeferred) > 0 + response.HasNext = &hasNext + } + + return &response + } + + default: + return graphql.OneShot(graphql.ErrorResponse(ctx, "unsupported GraphQL operation")) + } +} + +type executionContext struct { + *graphql.OperationContext + *executableSchema + deferred int32 + pendingDeferred int32 + deferredResults chan graphql.DeferredResult +} + +func (ec *executionContext) processDeferredGroup(dg graphql.DeferredGroup) { + atomic.AddInt32(&ec.pendingDeferred, 1) + go func() { + ctx := graphql.WithFreshResponseContext(dg.Context) + dg.FieldSet.Dispatch(ctx) + ds := graphql.DeferredResult{ + Path: dg.Path, + Label: dg.Label, + Result: dg.FieldSet, + Errors: graphql.GetErrors(ctx), + } + // null fields should bubble up + if dg.FieldSet.Invalids > 0 { + ds.Result = graphql.Null + } + ec.deferredResults <- ds + }() +} + +func (ec *executionContext) introspectSchema() (*introspection.Schema, error) { + if ec.DisableIntrospection { + return nil, errors.New("introspection disabled") + } + return introspection.WrapSchema(ec.Schema()), nil +} + +func (ec *executionContext) introspectType(name string) (*introspection.Type, error) { + if ec.DisableIntrospection { + return nil, errors.New("introspection disabled") + } + return introspection.WrapTypeFromDef(ec.Schema(), ec.Schema().Types[name]), nil +} + +//go:embed "schema.graphqls" +var sourcesFS embed.FS + +func sourceData(filename string) string { + data, err := sourcesFS.ReadFile(filename) + if err != nil { + panic(fmt.Sprintf("codegen problem: %s not available", filename)) + } + return string(data) +} + +var sources = []*ast.Source{ + {Name: "schema.graphqls", Input: sourceData("schema.graphqls"), BuiltIn: false}, +} +var parsedSchema = gqlparser.MustLoadSchema(sources...) + +// endregion ************************** generated!.gotpl ************************** + +// region ***************************** args.gotpl ***************************** + +func (ec *executionContext) field_Query___type_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_Query___type_argsName(ctx, rawArgs) + if err != nil { + return nil, err + } + args["name"] = arg0 + return args, nil +} +func (ec *executionContext) field_Query___type_argsName( + ctx context.Context, + rawArgs map[string]any, +) (string, error) { + if _, ok := rawArgs["name"]; !ok { + var zeroVal string + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("name")) + if tmp, ok := rawArgs["name"]; ok { + return ec.unmarshalNString2string(ctx, tmp) + } + + var zeroVal string + return zeroVal, nil +} + +func (ec *executionContext) field_Query_topLevel_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_Query_topLevel_argsID(ctx, rawArgs) + if err != nil { + return nil, err + } + args["id"] = arg0 + return args, nil +} +func (ec *executionContext) field_Query_topLevel_argsID( + ctx context.Context, + rawArgs map[string]any, +) (string, error) { + if _, ok := rawArgs["id"]; !ok { + var zeroVal string + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) + if tmp, ok := rawArgs["id"]; ok { + return ec.unmarshalNString2string(ctx, tmp) + } + + var zeroVal string + return zeroVal, nil +} + +func (ec *executionContext) field_TopLevel_nested_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field_TopLevel_nested_argsID(ctx, rawArgs) + if err != nil { + return nil, err + } + args["id"] = arg0 + return args, nil +} +func (ec *executionContext) field_TopLevel_nested_argsID( + ctx context.Context, + rawArgs map[string]any, +) (string, error) { + if _, ok := rawArgs["id"]; !ok { + var zeroVal string + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("id")) + if tmp, ok := rawArgs["id"]; ok { + return ec.unmarshalNString2string(ctx, tmp) + } + + var zeroVal string + return zeroVal, nil +} + +func (ec *executionContext) field___Directive_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Directive_args_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Directive_args_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (*bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal *bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + } + + var zeroVal *bool + return zeroVal, nil +} + +func (ec *executionContext) field___Field_args_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Field_args_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Field_args_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (*bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal *bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2ᚖbool(ctx, tmp) + } + + var zeroVal *bool + return zeroVal, nil +} + +func (ec *executionContext) field___Type_enumValues_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Type_enumValues_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Type_enumValues_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2bool(ctx, tmp) + } + + var zeroVal bool + return zeroVal, nil +} + +func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := ec.field___Type_fields_argsIncludeDeprecated(ctx, rawArgs) + if err != nil { + return nil, err + } + args["includeDeprecated"] = arg0 + return args, nil +} +func (ec *executionContext) field___Type_fields_argsIncludeDeprecated( + ctx context.Context, + rawArgs map[string]any, +) (bool, error) { + if _, ok := rawArgs["includeDeprecated"]; !ok { + var zeroVal bool + return zeroVal, nil + } + + ctx = graphql.WithPathContext(ctx, graphql.NewPathWithField("includeDeprecated")) + if tmp, ok := rawArgs["includeDeprecated"]; ok { + return ec.unmarshalOBoolean2bool(ctx, tmp) + } + + var zeroVal bool + return zeroVal, nil +} + +// endregion ***************************** args.gotpl ***************************** + +// region ************************** directives.gotpl ************************** + +// endregion ************************** directives.gotpl ************************** + +// region **************************** field.gotpl ***************************** + +func (ec *executionContext) _Query_topLevel(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query_topLevel(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.Query().TopLevel(rctx, fc.Args["id"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*model.TopLevel) + fc.Result = res + return ec.marshalNTopLevel2ᚖgithubᚗcomᚋDataDogᚋddᚑtraceᚑgoᚋv2ᚋinternalᚋorchestrionᚋ_integrationᚋ99designsᚗgqlgenᚋgeneratedᚋgraphᚋmodelᚐTopLevel(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query_topLevel(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "nested": + return ec.fieldContext_TopLevel_nested(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TopLevel", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query_topLevel_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query___type(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.introspectType(fc.Args["name"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query___type(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Query___type_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Query___schema(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_Query___schema(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.introspectSchema() + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Schema) + fc.Result = res + return ec.marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_Query___schema(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Query", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "description": + return ec.fieldContext___Schema_description(ctx, field) + case "types": + return ec.fieldContext___Schema_types(ctx, field) + case "queryType": + return ec.fieldContext___Schema_queryType(ctx, field) + case "mutationType": + return ec.fieldContext___Schema_mutationType(ctx, field) + case "subscriptionType": + return ec.fieldContext___Schema_subscriptionType(ctx, field) + case "directives": + return ec.fieldContext___Schema_directives(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Schema", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _TopLevel_nested(ctx context.Context, field graphql.CollectedField, obj *model.TopLevel) (ret graphql.Marshaler) { + fc, err := ec.fieldContext_TopLevel_nested(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return ec.resolvers.TopLevel().Nested(rctx, obj, fc.Args["id"].(string)) + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext_TopLevel_nested(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TopLevel", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_TopLevel_nested_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Directive_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_isRepeatable(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_isRepeatable(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsRepeatable, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_isRepeatable(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_locations(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_locations(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Locations, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]string) + fc.Result = res + return ec.marshalN__DirectiveLocation2ᚕstringᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_locations(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type __DirectiveLocation does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Directive_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Directive) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Directive_args(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Directive_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Directive", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Directive_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___EnumValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.EnumValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___EnumValue_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___EnumValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__EnumValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_args(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_args(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Args, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_args(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Field_args_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Field_type(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Field_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.Field) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Field_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Field_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Field", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_name(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalNString2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_description(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_type(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_type(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Type, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_type(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_defaultValue(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_defaultValue(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DefaultValue, nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_defaultValue(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_isDeprecated(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_isDeprecated(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsDeprecated(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalNBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_isDeprecated(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___InputValue_deprecationReason(ctx context.Context, field graphql.CollectedField, obj *introspection.InputValue) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___InputValue_deprecationReason(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.DeprecationReason(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___InputValue_deprecationReason(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__InputValue", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_types(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_types(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Types(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_types(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_queryType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_queryType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.QueryType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_queryType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_mutationType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_mutationType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.MutationType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_mutationType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_subscriptionType(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_subscriptionType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.SubscriptionType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_subscriptionType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Schema_directives(ctx context.Context, field graphql.CollectedField, obj *introspection.Schema) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Schema_directives(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Directives(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.([]introspection.Directive) + fc.Result = res + return ec.marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Schema_directives(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Schema", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Directive_name(ctx, field) + case "description": + return ec.fieldContext___Directive_description(ctx, field) + case "isRepeatable": + return ec.fieldContext___Directive_isRepeatable(ctx, field) + case "locations": + return ec.fieldContext___Directive_locations(ctx, field) + case "args": + return ec.fieldContext___Directive_args(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Directive", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_kind(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_kind(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Kind(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + if !graphql.HasFieldError(ctx, fc) { + ec.Errorf(ctx, "must not be null") + } + return graphql.Null + } + res := resTmp.(string) + fc.Result = res + return ec.marshalN__TypeKind2string(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_kind(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type __TypeKind does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_name(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_name(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Name(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_description(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_description(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Description(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_description(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_specifiedByURL(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_specifiedByURL(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.SpecifiedByURL(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*string) + fc.Result = res + return ec.marshalOString2ᚖstring(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_specifiedByURL(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_fields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_fields(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Fields(fc.Args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Field) + fc.Result = res + return ec.marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_fields(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___Field_name(ctx, field) + case "description": + return ec.fieldContext___Field_description(ctx, field) + case "args": + return ec.fieldContext___Field_args(ctx, field) + case "type": + return ec.fieldContext___Field_type(ctx, field) + case "isDeprecated": + return ec.fieldContext___Field_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___Field_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Field", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_fields_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Type_interfaces(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_interfaces(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.Interfaces(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_interfaces(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_possibleTypes(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_possibleTypes(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.PossibleTypes(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_possibleTypes(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_enumValues(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_enumValues(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.EnumValues(fc.Args["includeDeprecated"].(bool)), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.EnumValue) + fc.Result = res + return ec.marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_enumValues(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___EnumValue_name(ctx, field) + case "description": + return ec.fieldContext___EnumValue_description(ctx, field) + case "isDeprecated": + return ec.fieldContext___EnumValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___EnumValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __EnumValue", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field___Type_enumValues_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) ___Type_inputFields(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_inputFields(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.InputFields(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.([]introspection.InputValue) + fc.Result = res + return ec.marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_inputFields(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext___InputValue_name(ctx, field) + case "description": + return ec.fieldContext___InputValue_description(ctx, field) + case "type": + return ec.fieldContext___InputValue_type(ctx, field) + case "defaultValue": + return ec.fieldContext___InputValue_defaultValue(ctx, field) + case "isDeprecated": + return ec.fieldContext___InputValue_isDeprecated(ctx, field) + case "deprecationReason": + return ec.fieldContext___InputValue_deprecationReason(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __InputValue", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_ofType(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_ofType(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.OfType(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(*introspection.Type) + fc.Result = res + return ec.marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_ofType(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "kind": + return ec.fieldContext___Type_kind(ctx, field) + case "name": + return ec.fieldContext___Type_name(ctx, field) + case "description": + return ec.fieldContext___Type_description(ctx, field) + case "specifiedByURL": + return ec.fieldContext___Type_specifiedByURL(ctx, field) + case "fields": + return ec.fieldContext___Type_fields(ctx, field) + case "interfaces": + return ec.fieldContext___Type_interfaces(ctx, field) + case "possibleTypes": + return ec.fieldContext___Type_possibleTypes(ctx, field) + case "enumValues": + return ec.fieldContext___Type_enumValues(ctx, field) + case "inputFields": + return ec.fieldContext___Type_inputFields(ctx, field) + case "ofType": + return ec.fieldContext___Type_ofType(ctx, field) + case "isOneOf": + return ec.fieldContext___Type_isOneOf(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type __Type", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) ___Type_isOneOf(ctx context.Context, field graphql.CollectedField, obj *introspection.Type) (ret graphql.Marshaler) { + fc, err := ec.fieldContext___Type_isOneOf(ctx, field) + if err != nil { + return graphql.Null + } + ctx = graphql.WithFieldContext(ctx, fc) + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = graphql.Null + } + }() + resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) { + ctx = rctx // use context from middleware stack in children + return obj.IsOneOf(), nil + }) + if err != nil { + ec.Error(ctx, err) + return graphql.Null + } + if resTmp == nil { + return graphql.Null + } + res := resTmp.(bool) + fc.Result = res + return ec.marshalOBoolean2bool(ctx, field.Selections, res) +} + +func (ec *executionContext) fieldContext___Type_isOneOf(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "__Type", + Field: field, + IsMethod: true, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type Boolean does not have child fields") + }, + } + return fc, nil +} + +// endregion **************************** field.gotpl ***************************** + +// region **************************** input.gotpl ***************************** + +// endregion **************************** input.gotpl ***************************** + +// region ************************** interface.gotpl *************************** + +// endregion ************************** interface.gotpl *************************** + +// region **************************** object.gotpl **************************** + +var queryImplementors = []string{"Query"} + +func (ec *executionContext) _Query(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, queryImplementors) + ctx = graphql.WithFieldContext(ctx, &graphql.FieldContext{ + Object: "Query", + }) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + innerCtx := graphql.WithRootFieldContext(ctx, &graphql.RootFieldContext{ + Object: field.Name, + Field: field, + }) + + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("Query") + case "topLevel": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Query_topLevel(ctx, field) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + rrm := func(ctx context.Context) graphql.Marshaler { + return ec.OperationContext.RootResolverMiddleware(ctx, + func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return rrm(innerCtx) }) + case "__type": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Query___type(ctx, field) + }) + case "__schema": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Query___schema(ctx, field) + }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var topLevelImplementors = []string{"TopLevel"} + +func (ec *executionContext) _TopLevel(ctx context.Context, sel ast.SelectionSet, obj *model.TopLevel) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, topLevelImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TopLevel") + case "nested": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._TopLevel_nested(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __DirectiveImplementors = []string{"__Directive"} + +func (ec *executionContext) ___Directive(ctx context.Context, sel ast.SelectionSet, obj *introspection.Directive) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __DirectiveImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Directive") + case "name": + out.Values[i] = ec.___Directive_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___Directive_description(ctx, field, obj) + case "isRepeatable": + out.Values[i] = ec.___Directive_isRepeatable(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "locations": + out.Values[i] = ec.___Directive_locations(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "args": + out.Values[i] = ec.___Directive_args(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __EnumValueImplementors = []string{"__EnumValue"} + +func (ec *executionContext) ___EnumValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.EnumValue) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __EnumValueImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__EnumValue") + case "name": + out.Values[i] = ec.___EnumValue_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___EnumValue_description(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___EnumValue_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___EnumValue_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __FieldImplementors = []string{"__Field"} + +func (ec *executionContext) ___Field(ctx context.Context, sel ast.SelectionSet, obj *introspection.Field) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __FieldImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Field") + case "name": + out.Values[i] = ec.___Field_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___Field_description(ctx, field, obj) + case "args": + out.Values[i] = ec.___Field_args(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "type": + out.Values[i] = ec.___Field_type(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "isDeprecated": + out.Values[i] = ec.___Field_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___Field_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __InputValueImplementors = []string{"__InputValue"} + +func (ec *executionContext) ___InputValue(ctx context.Context, sel ast.SelectionSet, obj *introspection.InputValue) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __InputValueImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__InputValue") + case "name": + out.Values[i] = ec.___InputValue_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "description": + out.Values[i] = ec.___InputValue_description(ctx, field, obj) + case "type": + out.Values[i] = ec.___InputValue_type(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "defaultValue": + out.Values[i] = ec.___InputValue_defaultValue(ctx, field, obj) + case "isDeprecated": + out.Values[i] = ec.___InputValue_isDeprecated(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "deprecationReason": + out.Values[i] = ec.___InputValue_deprecationReason(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __SchemaImplementors = []string{"__Schema"} + +func (ec *executionContext) ___Schema(ctx context.Context, sel ast.SelectionSet, obj *introspection.Schema) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __SchemaImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Schema") + case "description": + out.Values[i] = ec.___Schema_description(ctx, field, obj) + case "types": + out.Values[i] = ec.___Schema_types(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "queryType": + out.Values[i] = ec.___Schema_queryType(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "mutationType": + out.Values[i] = ec.___Schema_mutationType(ctx, field, obj) + case "subscriptionType": + out.Values[i] = ec.___Schema_subscriptionType(ctx, field, obj) + case "directives": + out.Values[i] = ec.___Schema_directives(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var __TypeImplementors = []string{"__Type"} + +func (ec *executionContext) ___Type(ctx context.Context, sel ast.SelectionSet, obj *introspection.Type) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, __TypeImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("__Type") + case "kind": + out.Values[i] = ec.___Type_kind(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "name": + out.Values[i] = ec.___Type_name(ctx, field, obj) + case "description": + out.Values[i] = ec.___Type_description(ctx, field, obj) + case "specifiedByURL": + out.Values[i] = ec.___Type_specifiedByURL(ctx, field, obj) + case "fields": + out.Values[i] = ec.___Type_fields(ctx, field, obj) + case "interfaces": + out.Values[i] = ec.___Type_interfaces(ctx, field, obj) + case "possibleTypes": + out.Values[i] = ec.___Type_possibleTypes(ctx, field, obj) + case "enumValues": + out.Values[i] = ec.___Type_enumValues(ctx, field, obj) + case "inputFields": + out.Values[i] = ec.___Type_inputFields(ctx, field, obj) + case "ofType": + out.Values[i] = ec.___Type_ofType(ctx, field, obj) + case "isOneOf": + out.Values[i] = ec.___Type_isOneOf(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.processDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +// endregion **************************** object.gotpl **************************** + +// region ***************************** type.gotpl ***************************** + +func (ec *executionContext) unmarshalNBoolean2bool(ctx context.Context, v any) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + res := graphql.MarshalBoolean(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalNString2string(ctx context.Context, v any) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNString2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) marshalNTopLevel2githubᚗcomᚋDataDogᚋddᚑtraceᚑgoᚋv2ᚋinternalᚋorchestrionᚋ_integrationᚋ99designsᚗgqlgenᚋgeneratedᚋgraphᚋmodelᚐTopLevel(ctx context.Context, sel ast.SelectionSet, v model.TopLevel) graphql.Marshaler { + return ec._TopLevel(ctx, sel, &v) +} + +func (ec *executionContext) marshalNTopLevel2ᚖgithubᚗcomᚋDataDogᚋddᚑtraceᚑgoᚋv2ᚋinternalᚋorchestrionᚋ_integrationᚋ99designsᚗgqlgenᚋgeneratedᚋgraphᚋmodelᚐTopLevel(ctx context.Context, sel ast.SelectionSet, v *model.TopLevel) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TopLevel(ctx, sel, v) +} + +func (ec *executionContext) marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx context.Context, sel ast.SelectionSet, v introspection.Directive) graphql.Marshaler { + return ec.___Directive(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Directive2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirectiveᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Directive) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Directive2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐDirective(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) unmarshalN__DirectiveLocation2string(ctx context.Context, v any) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalN__DirectiveLocation2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, v any) ([]string, error) { + var vSlice []any + vSlice = graphql.CoerceList(v) + var err error + res := make([]string, len(vSlice)) + for i := range vSlice { + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithIndex(i)) + res[i], err = ec.unmarshalN__DirectiveLocation2string(ctx, vSlice[i]) + if err != nil { + return nil, err + } + } + return res, nil +} + +func (ec *executionContext) marshalN__DirectiveLocation2ᚕstringᚄ(ctx context.Context, sel ast.SelectionSet, v []string) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__DirectiveLocation2string(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx context.Context, sel ast.SelectionSet, v introspection.EnumValue) graphql.Marshaler { + return ec.___EnumValue(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx context.Context, sel ast.SelectionSet, v introspection.Field) graphql.Marshaler { + return ec.___Field(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx context.Context, sel ast.SelectionSet, v introspection.InputValue) graphql.Marshaler { + return ec.___InputValue(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v introspection.Type) graphql.Marshaler { + return ec.___Type(ctx, sel, &v) +} + +func (ec *executionContext) marshalN__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalN__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec.___Type(ctx, sel, v) +} + +func (ec *executionContext) unmarshalN__TypeKind2string(ctx context.Context, v any) (string, error) { + res, err := graphql.UnmarshalString(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalN__TypeKind2string(ctx context.Context, sel ast.SelectionSet, v string) graphql.Marshaler { + res := graphql.MarshalString(v) + if res == graphql.Null { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + ec.Errorf(ctx, "the requested element is null which the schema does not allow") + } + } + return res +} + +func (ec *executionContext) unmarshalOBoolean2bool(ctx context.Context, v any) (bool, error) { + res, err := graphql.UnmarshalBoolean(v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOBoolean2bool(ctx context.Context, sel ast.SelectionSet, v bool) graphql.Marshaler { + res := graphql.MarshalBoolean(v) + return res +} + +func (ec *executionContext) unmarshalOBoolean2ᚖbool(ctx context.Context, v any) (*bool, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalBoolean(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOBoolean2ᚖbool(ctx context.Context, sel ast.SelectionSet, v *bool) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalBoolean(*v) + return res +} + +func (ec *executionContext) unmarshalOString2ᚖstring(ctx context.Context, v any) (*string, error) { + if v == nil { + return nil, nil + } + res, err := graphql.UnmarshalString(v) + return &res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalOString2ᚖstring(ctx context.Context, sel ast.SelectionSet, v *string) graphql.Marshaler { + if v == nil { + return graphql.Null + } + res := graphql.MarshalString(*v) + return res +} + +func (ec *executionContext) marshalO__EnumValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.EnumValue) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__EnumValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐEnumValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Field2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐFieldᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Field) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Field2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐField(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__InputValue2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValueᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.InputValue) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__InputValue2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐInputValue(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Schema2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐSchema(ctx context.Context, sel ast.SelectionSet, v *introspection.Schema) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec.___Schema(ctx, sel, v) +} + +func (ec *executionContext) marshalO__Type2ᚕgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐTypeᚄ(ctx context.Context, sel ast.SelectionSet, v []introspection.Type) graphql.Marshaler { + if v == nil { + return graphql.Null + } + ret := make(graphql.Array, len(v)) + var wg sync.WaitGroup + isLen1 := len(v) == 1 + if !isLen1 { + wg.Add(len(v)) + } + for i := range v { + i := i + fc := &graphql.FieldContext{ + Index: &i, + Result: &v[i], + } + ctx := graphql.WithFieldContext(ctx, fc) + f := func(i int) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + ret = nil + } + }() + if !isLen1 { + defer wg.Done() + } + ret[i] = ec.marshalN__Type2githubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx, sel, v[i]) + } + if isLen1 { + f(i) + } else { + go f(i) + } + + } + wg.Wait() + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalO__Type2ᚖgithubᚗcomᚋ99designsᚋgqlgenᚋgraphqlᚋintrospectionᚐType(ctx context.Context, sel ast.SelectionSet, v *introspection.Type) graphql.Marshaler { + if v == nil { + return graphql.Null + } + return ec.___Type(ctx, sel, v) +} + +// endregion ***************************** type.gotpl ***************************** diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/model/models_gen.go b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/model/models_gen.go new file mode 100644 index 0000000000..88419d92a3 --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/model/models_gen.go @@ -0,0 +1,15 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +// Code generated by github.com/99designs/gqlgen, DO NOT EDIT. + +package model + +type Query struct { +} + +type TopLevel struct { + Nested string `json:"nested"` +} diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/resolver.go b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/resolver.go new file mode 100644 index 0000000000..e0746a84c8 --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/resolver.go @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package graph + +// This file will not be regenerated automatically. +// +// It serves as dependency injection for your app, add any dependencies you require here. + +type Resolver struct{} diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/schema.graphqls b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/schema.graphqls new file mode 100644 index 0000000000..a4ea782a1c --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/schema.graphqls @@ -0,0 +1,7 @@ +type Query { + topLevel(id: String!): TopLevel! +} + +type TopLevel { + nested(id: String!): String! +} diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/schema.resolvers.go b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/schema.resolvers.go new file mode 100644 index 0000000000..b175a22344 --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/schema.resolvers.go @@ -0,0 +1,36 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package graph + +// This file will be automatically regenerated based on the schema, any resolver implementations +// will be copied through when generating and any unknown code will be moved to the end. +// Code generated by github.com/99designs/gqlgen version v0.17.72 + +import ( + "context" + "fmt" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/99designs.gqlgen/generated/graph/model" +) + +// TopLevel is the resolver for the topLevel field. +func (r *queryResolver) TopLevel(ctx context.Context, id string) (*model.TopLevel, error) { + return &model.TopLevel{Nested: id}, nil +} + +// Nested is the resolver for the nested field. +func (r *topLevelResolver) Nested(ctx context.Context, obj *model.TopLevel, id string) (string, error) { + return fmt.Sprintf("%s/%s", obj.Nested, id), nil +} + +// Query returns QueryResolver implementation. +func (r *Resolver) Query() QueryResolver { return &queryResolver{r} } + +// TopLevel returns TopLevelResolver implementation. +func (r *Resolver) TopLevel() TopLevelResolver { return &topLevelResolver{r} } + +type queryResolver struct{ *Resolver } +type topLevelResolver struct{ *Resolver } diff --git a/internal/orchestrion/_integration/99designs.gqlgen/generated_test.go b/internal/orchestrion/_integration/99designs.gqlgen/generated_test.go new file mode 100644 index 0000000000..2298a1d23f --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package gqlgen + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/99designs.gqlgen/gqlgen.go b/internal/orchestrion/_integration/99designs.gqlgen/gqlgen.go new file mode 100644 index 0000000000..baa02581c8 --- /dev/null +++ b/internal/orchestrion/_integration/99designs.gqlgen/gqlgen.go @@ -0,0 +1,130 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gqlgen + +import ( + "context" + "fmt" + "testing" + + "github.com/99designs/gqlgen/client" + "github.com/99designs/gqlgen/graphql/handler" + "github.com/99designs/gqlgen/graphql/handler/transport" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/99designs.gqlgen/generated/graph" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + server *handler.Server +} + +func (tc *TestCase) Setup(context.Context, *testing.T) { + schema := graph.NewExecutableSchema(graph.Config{Resolvers: &graph.Resolver{}}) + tc.server = handler.New(schema) + tc.server.AddTransport(transport.POST{}) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + c := client.New(tc.server) + + const ( + topLevelAttack = "he protec" + nestedAttack = "he attac, but most importantly: he Tupac" + ) + + var resp map[string]any + require.NoError(t, c.Post(` + query TestQuery($topLevelId: String!, $nestedId: String!) { + topLevel(id: $topLevelId) { + nested(id: $nestedId) + } + } + `, + &resp, + client.Var("topLevelId", topLevelAttack), + client.Var("nestedId", nestedAttack), + client.Operation("TestQuery"), + )) + + require.Equal(t, map[string]any{ + "topLevel": map[string]any{ + "nested": fmt.Sprintf("%s/%s", topLevelAttack, nestedAttack), + }, + }, resp) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.query", + "service": "graphql", + "type": "graphql", + }, + Meta: map[string]string{ + "component": "99designs/gqlgen", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.field", + "service": "graphql", + "resource": "TopLevel.nested", + }, + Meta: map[string]string{ + "component": "99designs/gqlgen", + "graphql.operation.type": "query", + "graphql.field": "nested", + }, + }, + { + Tags: map[string]any{ + "name": "graphql.read", + "service": "graphql", + "resource": "graphql.read", + }, + Meta: map[string]string{ + "component": "99designs/gqlgen", + }, + }, + { + Tags: map[string]any{ + "name": "graphql.parse", + "service": "graphql", + "resource": "graphql.parse", + }, + Meta: map[string]string{ + "component": "99designs/gqlgen", + }, + }, + { + Tags: map[string]any{ + "name": "graphql.validate", + "service": "graphql", + "resource": "graphql.validate", + }, + Meta: map[string]string{ + "component": "99designs/gqlgen", + }, + }, + { + Tags: map[string]any{ + "name": "graphql.field", + "service": "graphql", + "resource": "Query.topLevel", + }, + Meta: map[string]string{ + "component": "99designs/gqlgen", + "graphql.operation.type": "query", + "graphql.field": "topLevel", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/README.md b/internal/orchestrion/_integration/README.md new file mode 100644 index 0000000000..f675b15fb7 --- /dev/null +++ b/internal/orchestrion/_integration/README.md @@ -0,0 +1,65 @@ +## Orchestrion Integration Tests + +This package contains integration tests that are executed using [`orchestrion`][1]. They are not +expected to pass unless they are built with [`orchestrion`][1]. + +The test binaries are built with all compile-time integrations activated (see +[`orchestrion.tool.go`][2]). + +This test suite is run in CI as part of the [orchestrion.yml][6] workflow. + +### Prerequisites + +#### Docker + +This test suite uses [`testcontainers`][3] to provide endpoints for certain tests (Redis, Cassandra, +etc...). These are currently un-supported by Windows and macOS runners on GitHub Actions, and are +omitted when the `githubci` build tag is present. + +
+ +ℹ️ Running on macOS with colima + + +Running the test suite locally on a macOS host that uses [`colima`][4] as a container engine may +require executing the following commands so that [`testcontainers`][3] correctly leverages it: + +```console +$ export DOCKER_HOST=$(docker context inspect "$(docker context show)" -f "{{ .Endpoints.docker.Host }}") +$ export TESTCONTAINERS_DOCKER_SOCKET_OVERRIDE='/var/run/docker.sock' +``` + +
+ +### Running the test suite + +You can locally run this test suite using the following commands: +```console +$ go run github.com/DataDog/orchestrion go test ./... +``` + +[1]: https://github.com/DataDog/orchestrion +[2]: ./orchestrion.tool.go +[3]: https://golang.testcontainers.org/ +[4]: https://github.com/abiosoft/colima +[5]: https://pypi.org/project/ddapm-test-agent/ +[6]: ../../../.github/workflows/orchestrion.yml + +### Adding new tests + +To add a new integration test, follow these steps: + +1. **Create a test case structure**: Implement a new struct that satisfies the [`harness.TestCase`](./internal/harness/harness.go) interface. If adding to an existing package that already has a `TestCase`, use a descriptive name like `TestCaseSomething` to avoid naming conflicts. + +2. **Implement the required methods**: Ensure your test case implements all three methods defined by the `harness.TestCase` interface: + - **`Setup`**: Prepare everything needed for the test, such as starting services (e.g., database servers) or setting up test data. The tracer is not yet started during setup. + - **`Run`**: Perform the actions that should generate trace data from the instrumented code. This executes after the tracer is started and should assert on expected post-conditions. + - **`ExpectedTraces`**: Return the set of traces that the test expects to be produced. Each trace returned will be matched against the actual traces received by the mock agent. + +3. **Generate test files**: After creating your test case, regenerate the `generated_test.go` files to include your new test in the suite: + +```console +$ go generate ./... +``` + +This command will automatically discover and register your new test case with the integration test suite. diff --git a/internal/orchestrion/_integration/aws.v1/aws.go b/internal/orchestrion/_integration/aws.v1/aws.go new file mode 100644 index 0000000000..cb22726054 --- /dev/null +++ b/internal/orchestrion/_integration/aws.v1/aws.go @@ -0,0 +1,69 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package awsv1 + +import ( + "context" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/credentials" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/dynamodb" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" +) + +type TestCase struct { + server testcontainers.Container + cfg *aws.Config +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + server, host, port := containers.StartDynamoDBTestContainer(t) + tc.server = server + + tc.cfg = &aws.Config{ + Credentials: credentials.NewStaticCredentials("NOTANACCESSKEY", "NOTASECRETKEY", ""), + Endpoint: aws.String(fmt.Sprintf("http://%s:%s", host, port)), + Region: aws.String("test-region-1337"), + } +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + ddb := dynamodb.New(session.Must(session.NewSession(tc.cfg))) + _, err := ddb.ListTables(nil) + require.NoError(t, err) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "dynamodb.command", + "service": "aws.dynamodb", + "resource": "dynamodb.ListTables", + "type": "http", + }, + Meta: map[string]string{ + "aws.operation": "ListTables", + "aws.region": "test-region-1337", + "aws_service": "dynamodb", + "http.method": "POST", + "http.status_code": "200", + "component": "aws/aws-sdk-go/aws", + "span.kind": "client", + }, + }, + } +} diff --git a/internal/orchestrion/_integration/aws.v1/generated_test.go b/internal/orchestrion/_integration/aws.v1/generated_test.go new file mode 100644 index 0000000000..fd6b632191 --- /dev/null +++ b/internal/orchestrion/_integration/aws.v1/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package awsv1 + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/aws.v2/base.go b/internal/orchestrion/_integration/aws.v2/base.go new file mode 100644 index 0000000000..68c6e20f8a --- /dev/null +++ b/internal/orchestrion/_integration/aws.v2/base.go @@ -0,0 +1,80 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package awsv2 + +import ( + "context" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/dynamodb" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" +) + +type base struct { + server testcontainers.Container + cfg aws.Config + endpoint string +} + +func (b *base) setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var host, port string + b.server, host, port = containers.StartDynamoDBTestContainer(t) + b.endpoint = fmt.Sprintf("http://%s:%s", host, port) +} + +func (b *base) run(ctx context.Context, t *testing.T) { + ddb := dynamodb.NewFromConfig(b.cfg, func(o *dynamodb.Options) { o.BaseEndpoint = &b.endpoint }) + _, err := ddb.ListTables(ctx, nil) + require.NoError(t, err) +} + +func (b *base) expectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "DynamoDB.request", + "service": "aws.DynamoDB", + "resource": "DynamoDB.ListTables", + "type": "http", + }, + Meta: map[string]string{ + "aws.operation": "ListTables", + "aws.region": "test-region-1337", + "aws_service": "DynamoDB", + "http.method": "POST", + "component": "aws/aws-sdk-go-v2/aws", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "aws.DynamoDB", + "resource": "POST /", + "type": "http", + }, + Meta: map[string]string{ + "http.method": "POST", + "http.status_code": "200", + "http.url": "/", + "network.destination.name": "localhost", + "component": "net/http", + "span.kind": "client", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/aws.v2/generated_test.go b/internal/orchestrion/_integration/aws.v2/generated_test.go new file mode 100644 index 0000000000..fddb929383 --- /dev/null +++ b/internal/orchestrion/_integration/aws.v2/generated_test.go @@ -0,0 +1,32 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package awsv2 + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestLoadDefaultConfig(t *testing.T) { + harness.Run(t, new(TestCaseLoadDefaultConfig)) +} + +func TestNewConfig(t *testing.T) { + harness.Run(t, new(TestCaseNewConfig)) +} + +func TestStructLiteral(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteral)) +} + +func TestStructLiteralPtr(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteralPtr)) +} diff --git a/internal/orchestrion/_integration/aws.v2/load_default_config.go b/internal/orchestrion/_integration/aws.v2/load_default_config.go new file mode 100644 index 0000000000..34552c6897 --- /dev/null +++ b/internal/orchestrion/_integration/aws.v2/load_default_config.go @@ -0,0 +1,41 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package awsv2 + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/stretchr/testify/require" +) + +type TestCaseLoadDefaultConfig struct { + base +} + +func (tc *TestCaseLoadDefaultConfig) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + cfg, err := config.LoadDefaultConfig(ctx, + config.WithRegion("test-region-1337"), + config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("NOTANACCESSKEY", "NOTASECRETKEY", "")), + ) + require.NoError(t, err) + tc.cfg = cfg +} + +func (tc *TestCaseLoadDefaultConfig) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseLoadDefaultConfig) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/aws.v2/new_config.go b/internal/orchestrion/_integration/aws.v2/new_config.go new file mode 100644 index 0000000000..0ddd9120fb --- /dev/null +++ b/internal/orchestrion/_integration/aws.v2/new_config.go @@ -0,0 +1,38 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package awsv2 + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/credentials" +) + +type TestCaseNewConfig struct { + base +} + +func (tc *TestCaseNewConfig) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + cfg := aws.NewConfig() + cfg.Region = "test-region-1337" + cfg.Credentials = credentials.NewStaticCredentialsProvider("NOTANACCESSKEY", "NOTASECRETKEY", "") + tc.cfg = *cfg +} + +func (tc *TestCaseNewConfig) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseNewConfig) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/aws.v2/struct_literal.go b/internal/orchestrion/_integration/aws.v2/struct_literal.go new file mode 100644 index 0000000000..7813ac4e70 --- /dev/null +++ b/internal/orchestrion/_integration/aws.v2/struct_literal.go @@ -0,0 +1,38 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package awsv2 + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/credentials" +) + +type TestCaseStructLiteral struct { + base +} + +func (tc *TestCaseStructLiteral) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + tc.cfg = aws.Config{ + Region: "test-region-1337", + Credentials: credentials.NewStaticCredentialsProvider("NOTANACCESSKEY", "NOTASECRETKEY", ""), + } +} + +func (tc *TestCaseStructLiteral) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseStructLiteral) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/aws.v2/struct_literal_ptr.go b/internal/orchestrion/_integration/aws.v2/struct_literal_ptr.go new file mode 100644 index 0000000000..913e7d014d --- /dev/null +++ b/internal/orchestrion/_integration/aws.v2/struct_literal_ptr.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package awsv2 + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/credentials" +) + +type TestCaseStructLiteralPtr struct { + base +} + +func (tc *TestCaseStructLiteralPtr) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + cfg := &aws.Config{ + Region: "test-region-1337", + Credentials: credentials.NewStaticCredentialsProvider("NOTANACCESSKEY", "NOTASECRETKEY", ""), + } + tc.cfg = *cfg +} + +func (tc *TestCaseStructLiteralPtr) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseStructLiteralPtr) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/chi.v5/chi.go b/internal/orchestrion/_integration/chi.v5/chi.go new file mode 100644 index 0000000000..9cc81dbf69 --- /dev/null +++ b/internal/orchestrion/_integration/chi.v5/chi.go @@ -0,0 +1,101 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package chiv5 + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/go-chi/chi/v5" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *http.Server +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + router := chi.NewRouter() + + tc.Server = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + Handler: router, + } + + router.Get("/", func(w http.ResponseWriter, _ *http.Request) { + w.Write([]byte("Hello World!\n")) + }) + + go func() { assert.ErrorIs(t, tc.Server.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.Server.Shutdown(ctx)) + }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + resp, err := http.Get(fmt.Sprintf("http://%s/", tc.Server.Addr)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + // NB: 2 Top-level spans are from the HTTP Client/Server, which are library-side instrumented. + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "service": "chi.v5.test", + "type": "http", + }, + Meta: map[string]string{ + "http.url": fmt.Sprintf("http://%s/", tc.Server.Addr), + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "service": "http.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": fmt.Sprintf("http://%s/", tc.Server.Addr), + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "service": "chi.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": fmt.Sprintf("http://%s/", tc.Server.Addr), + "component": "go-chi/chi.v5", + "span.kind": "server", + }, + Children: nil, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/chi.v5/generated_test.go b/internal/orchestrion/_integration/chi.v5/generated_test.go new file mode 100644 index 0000000000..9b0f6c0ec2 --- /dev/null +++ b/internal/orchestrion/_integration/chi.v5/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package chiv5 + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/ci-services.json b/internal/orchestrion/_integration/ci-services.json new file mode 100644 index 0000000000..e7b007cd86 --- /dev/null +++ b/internal/orchestrion/_integration/ci-services.json @@ -0,0 +1,79 @@ +{ + "redis": { + "image": "redis:7-alpine", + "ports": ["6379:6379"], + "options": "--name \"redis\"" + }, + "valkey": { + "image": "valkey/valkey:8-alpine", + "ports": ["6380:6379"], + "options": "--name \"valkey\"" + }, + "kafka": { + "image": "confluentinc/confluent-local:7.5.0", + "env": { + "KAFKA_LISTENERS": "PLAINTEXT://0.0.0.0:9093,BROKER://0.0.0.0:9092,CONTROLLER://0.0.0.0:9094", + "KAFKA_ADVERTISED_LISTENERS": "PLAINTEXT://localhost:9093,BROKER://localhost:9092", + "KAFKA_REST_BOOTSTRAP_SERVERS": "PLAINTEXT://0.0.0.0:9093,BROKER://0.0.0.0:9092", + "KAFKA_CONTROLLER_QUORUM_VOTERS": "1@localhost:9094", + "KAFKA_LISTENER_SECURITY_PROTOCOL_MAP": "BROKER:PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT", + "KAFKA_INTER_BROKER_LISTENER_NAME": "BROKER", + "KAFKA_BROKER_ID": "1", + "KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR": "1", + "KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS": "1", + "KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR": "1", + "KAFKA_TRANSACTION_STATE_LOG_MIN_ISR": "1", + "KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS": "0", + "KAFKA_NODE_ID": "1", + "KAFKA_PROCESS_ROLES": "broker,controller", + "KAFKA_CONTROLLER_LISTENER_NAMES": "CONTROLLER" + }, + "ports": [ + "9092:9092", + "9093:9093" + ], + "options": "--name \"kafka\"" + }, + "elasticsearch6": { + "image": "elasticsearch:6.8.23", + "env": { + "ES_JAVA_OPTS": "-Xms750m -Xmx750m", + "discovery.type": "single-node", + "cluster.routing.allocation.disk.threshold_enabled": "false" + }, + "ports": [ + "9206:9200" + ], + "options": "--name \"elasticsearch6\"" + }, + "elasticsearch7": { + "image": "elasticsearch:7.17.24", + "env": { + "ES_JAVA_OPTS": "-Xms750m -Xmx750m", + "discovery.type": "single-node", + "cluster.routing.allocation.disk.threshold_enabled": "false" + }, + "ports": [ + "9207:9200" + ], + "options": "--name \"elasticsearch7\"" + }, + "elasticsearch8": { + "image": "elasticsearch:8.15.3", + "env": { + "ES_JAVA_OPTS": "-Xms750m -Xmx750m", + "discovery.type": "single-node", + "cluster.routing.allocation.disk.threshold_enabled": "false", + "xpack.security.enabled": "false" + }, + "ports": [ + "9208:9200" + ], + "options": "--name \"elasticsearch8\"" + }, + "mongodb": { + "image": "mongo:8", + "ports": ["27017:27017"], + "options": "--name \"mongodb\"" + } +} diff --git a/internal/orchestrion/_integration/civisibility/civisibility_payload_mocks.go b/internal/orchestrion/_integration/civisibility/civisibility_payload_mocks.go new file mode 100644 index 0000000000..4c48df2215 --- /dev/null +++ b/internal/orchestrion/_integration/civisibility/civisibility_payload_mocks.go @@ -0,0 +1,179 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package civisibility + +import ( + "fmt" +) + +type ( + mockPayloads []*mockPayload + mockPayload struct { + Version int `json:"version"` + Metadata mockMetadata `json:"metadata"` + Events mockEvents `json:"events"` + } + mockMetadata struct { + All mockMetadataAll `json:"*"` + TestSessionEnd mockMetadataOther `json:"test_session_end"` + TestModuleEnd mockMetadataOther `json:"test_module_end"` + TestSuiteEnd mockMetadataOther `json:"test_suite_end"` + Test mockMetadataOther `json:"test"` + } + mockMetadataAll struct { + Language string `json:"language"` + LibraryVersion string `json:"library_version"` + RuntimeID string `json:"runtime-id"` + } + mockMetadataOther struct { + TestSessionName string `json:"test_session.name"` + } + mockEvents []mockEvent + mockEvent struct { + Type string `json:"type"` + Version int `json:"version"` + Content mockContent `json:"content"` + } + mockContent struct { + TestSessionID uint64 `json:"test_session_id"` + TestModuleID uint64 `json:"test_module_id"` + TestSuiteID uint64 `json:"test_suite_id"` + SpanID uint64 `json:"span_id"` + TraceID uint64 `json:"trace_id"` + Name string `json:"name"` + Service string `json:"service"` + Resource string `json:"resource"` + Type string `json:"type"` + Start uint64 `json:"start"` + Duration uint `json:"duration"` + Error int `json:"error"` + Meta map[string]string `json:"meta"` + Metrics map[string]float64 `json:"metrics"` + } +) + +func (m *mockPayloads) GetEvents() mockEvents { + var events mockEvents + for _, payload := range *m { + events = append(events, payload.Events...) + } + return events +} + +func (m mockEvents) ShowResourceNames() mockEvents { + for i, event := range m { + _, _ = fmt.Printf(" [%d] = %v\n", i, event.Content.Resource) + } + return m +} + +func (m mockEvents) GetEventsByType(eventType string) mockEvents { + var events mockEvents + for _, event := range m { + if event.Type == eventType { + events = append(events, event) + } + } + return events +} + +func (m mockEvents) CheckEventsByType(eventType string, count int) mockEvents { + events := m.GetEventsByType(eventType) + numOfEvents := len(events) + if numOfEvents != count { + panic(fmt.Sprintf("expected exactly %d event(s) with type name: %s, got %d", count, eventType, numOfEvents)) + } + + return events +} + +func (m mockEvents) GetEventsByResourceName(resourceName string) mockEvents { + var events mockEvents + for _, event := range m { + if event.Content.Resource == resourceName { + events = append(events, event) + } + } + return events +} + +func (m mockEvents) CheckEventsByResourceName(resourceName string, count int) mockEvents { + events := m.GetEventsByResourceName(resourceName) + numOfEvents := len(events) + if numOfEvents != count { + panic(fmt.Sprintf("expected exactly %d event(s) with resource name: %s, got %d", count, resourceName, numOfEvents)) + } + + return events +} + +func (m mockEvents) GetEventsByTagName(tagName string) mockEvents { + var events mockEvents + for _, event := range m { + if _, ok := event.Content.Meta[tagName]; ok { + events = append(events, event) + } + } + return events +} + +func (m mockEvents) CheckEventsByTagName(tagName string, count int) mockEvents { + events := m.GetEventsByTagName(tagName) + numOfEvents := len(events) + if numOfEvents != count { + panic(fmt.Sprintf("expected exactly %d event(s) with tag name: %s, got %d", count, tagName, numOfEvents)) + } + + return events +} + +func (m mockEvents) GetEventsByTagAndValue(tagName string, tagValue string) mockEvents { + var events mockEvents + for _, event := range m { + if value, ok := event.Content.Meta[tagName]; ok && value == tagValue { + events = append(events, event) + } + } + return events +} + +func (m mockEvents) CheckEventsByTagAndValue(tagName string, tagValue string, count int) mockEvents { + events := m.GetEventsByTagAndValue(tagName, tagValue) + numOfEvents := len(events) + if numOfEvents != count { + panic(fmt.Sprintf("expected exactly %d event(s) with tag name: %s, got %d", count, tagName, numOfEvents)) + } + + return events +} + +func (m mockEvents) Except(events ...mockEvents) mockEvents { + var filtered mockEvents + for _, event := range m { + contains := false + for _, eventArray := range events { + for _, ev := range eventArray { + if event.Content.Resource == ev.Content.Resource { + contains = true + } + } + } + if !contains { + filtered = append(filtered, event) + } + } + return filtered +} + +func (m mockEvents) HasCount(count int) mockEvents { + numOfEvents := len(m) + if numOfEvents != count { + m.ShowResourceNames() + panic(fmt.Sprintf("expected exactly %d event(s), got %d", count, numOfEvents)) + } + + return m +} diff --git a/internal/orchestrion/_integration/civisibility/main_test.go b/internal/orchestrion/_integration/civisibility/main_test.go new file mode 100644 index 0000000000..b742a49050 --- /dev/null +++ b/internal/orchestrion/_integration/civisibility/main_test.go @@ -0,0 +1,167 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package civisibility + +import ( + "bytes" + "compress/gzip" + "encoding/json" + "fmt" + "log" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/DataDog/orchestrion/runtime/built" + "github.com/tinylib/msgp/msgp" +) + +var ciVisibilityPayloads mockPayloads + +func TestMain(m *testing.M) { + // check if orchestrion is enabled + if !built.WithOrchestrion { + panic("Orchestrion is not enabled, please run this test with orchestrion") + } + + // let's enable CI Visibility mode + server := enableCiVisibilityEndpointMock() + defer server.Close() + + // because CI Visibility mode is enabled all tests are going to be instrumented + // we have a few tests to check the different test statuses (including failures) + // that's why we don't use the exit code from the tests, but we check the events. + m.Run() + + // let's check the events inside the CiVisibility payloads + events := ciVisibilityPayloads.GetEvents() + + // session event + events. + CheckEventsByType("test_session_end", 1) + + // module event + events. + CheckEventsByType("test_module_end", 1). + CheckEventsByResourceName("github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/civisibility", 1) + + // test suite event + events.CheckEventsByType("test_suite_end", 1). + CheckEventsByResourceName("testing_test.go", 1) + + // test events + testEvents := events.CheckEventsByType("test", 10) + normalTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestNormal", 1). + CheckEventsByTagAndValue("test.status", "pass", 1) + failTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestFail", 1). + CheckEventsByTagAndValue("test.status", "fail", 1). + CheckEventsByTagAndValue("error.type", "Fail", 1). + CheckEventsByTagAndValue("error.message", "failed test", 1) + errorTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestError", 1). + CheckEventsByTagAndValue("test.status", "fail", 1). + CheckEventsByTagAndValue("error.type", "Error", 1). + CheckEventsByTagAndValue("error.message", "My error test", 1) + errorFTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestErrorf", 1). + CheckEventsByTagAndValue("test.status", "fail", 1). + CheckEventsByTagAndValue("error.type", "Errorf", 1). + CheckEventsByTagAndValue("error.message", "My error test: TestErrorf", 1) + skipTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestSkip", 1). + CheckEventsByTagAndValue("test.status", "skip", 1). + CheckEventsByTagAndValue("test.skip_reason", "My skipped test", 1) + skipfTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestSkipf", 1). + CheckEventsByTagAndValue("test.status", "skip", 1). + CheckEventsByTagAndValue("test.skip_reason", "My skipped test: TestSkipf", 1) + skipNowTests := testEvents. + CheckEventsByResourceName("testing_test.go.TestSkipNow", 1). + CheckEventsByTagAndValue("test.status", "skip", 1) + testWithSubtests := testEvents. + CheckEventsByResourceName("testing_test.go.TestWithSubTests", 1). + CheckEventsByTagAndValue("test.status", "pass", 1) + testWithSubtestsChild1 := testEvents. + CheckEventsByResourceName("testing_test.go.TestWithSubTests/Sub1", 1). + CheckEventsByTagAndValue("test.status", "pass", 1) + testWithSubtestsChild2 := testEvents. + CheckEventsByResourceName("testing_test.go.TestWithSubTests/Sub2", 1). + CheckEventsByTagAndValue("test.status", "pass", 1) + + // remaining must be 0 + testEvents. + Except( + normalTests, + failTests, + errorTests, + errorFTests, + skipTests, + skipfTests, + skipNowTests, + testWithSubtests, + testWithSubtestsChild1, + testWithSubtestsChild2). + HasCount(0) + + // All previous checks will cause panic if they fail so we can safely exit with 0 here + os.Exit(0) +} + +func enableCiVisibilityEndpointMock() *httptest.Server { + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/api/v2/citestcycle" { + w.WriteHeader(http.StatusNotFound) + return + } + + fmt.Printf("mockapi: test cycle payload received.\n") + + // first we need to read the body + // then we need to gunzip the body + // then we need to convert the body from msgpack to json + // then we need to parse the json + + gzipReader, err := gzip.NewReader(r.Body) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + defer gzipReader.Close() + + // Convert the message pack to json + var jsonBuf bytes.Buffer + _, err = msgp.CopyToJSON(&jsonBuf, gzipReader) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + var payload mockPayload + err = json.Unmarshal(jsonBuf.Bytes(), &payload) + if err != nil { + log.Println(err) + w.WriteHeader(http.StatusInternalServerError) + return + } + + ciVisibilityPayloads = append(ciVisibilityPayloads, &payload) + w.WriteHeader(http.StatusAccepted) + })) + + fmt.Printf("mockapi: Url: %s\n", server.URL) + + os.Setenv("DD_CIVISIBILITY_ENABLED", "true") + os.Setenv("DD_CIVISIBILITY_AGENTLESS_ENABLED", "true") + os.Setenv("DD_CIVISIBILITY_AGENTLESS_URL", server.URL) + os.Setenv("DD_API_KEY", "***") + + return server +} diff --git a/internal/orchestrion/_integration/civisibility/testing_test.go b/internal/orchestrion/_integration/civisibility/testing_test.go new file mode 100644 index 0000000000..ddf0cbe158 --- /dev/null +++ b/internal/orchestrion/_integration/civisibility/testing_test.go @@ -0,0 +1,45 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package civisibility + +import "testing" + +func TestNormal(t *testing.T) { + t.Log("Normal test") +} + +func TestWithSubTests(t *testing.T) { + t.Run("Sub1", func(t *testing.T) { + t.Log("Sub test 1") + }) + t.Run("Sub2", func(t *testing.T) { + t.Log("Sub test 2") + }) +} + +func TestFail(t *testing.T) { + t.Fail() +} + +func TestError(t *testing.T) { + t.Error("My error test") +} + +func TestErrorf(t *testing.T) { + t.Errorf("My error test: %s", t.Name()) +} + +func TestSkip(t *testing.T) { + t.Skip("My skipped test") +} + +func TestSkipf(t *testing.T) { + t.Skipf("My skipped test: %s", t.Name()) +} + +func TestSkipNow(t *testing.T) { + t.SkipNow() +} diff --git a/internal/orchestrion/_integration/confluent-kafka-go.v1/generated_test.go b/internal/orchestrion/_integration/confluent-kafka-go.v1/generated_test.go new file mode 100644 index 0000000000..6c382f004a --- /dev/null +++ b/internal/orchestrion/_integration/confluent-kafka-go.v1/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build (linux || !githubci) && !windows + +package kafka + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/confluent-kafka-go.v1/kafka.go b/internal/orchestrion/_integration/confluent-kafka-go.v1/kafka.go new file mode 100644 index 0000000000..89ac23c775 --- /dev/null +++ b/internal/orchestrion/_integration/confluent-kafka-go.v1/kafka.go @@ -0,0 +1,142 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build (linux || !githubci) && !windows + +package kafka + +import ( + "context" + "strings" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/stretchr/testify/require" + kafkatest "github.com/testcontainers/testcontainers-go/modules/kafka" +) + +var ( + topic = "confluent_kafka_v1_default_test" + consumerGroup = "confluent_kafka_v1_default_test" + partition = int32(0) +) + +type TestCase struct { + container *kafkatest.KafkaContainer + addr []string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + container, addr := containers.StartKafkaTestContainer(t, []string{topic}) + tc.container = container + tc.addr = []string{addr} +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + tc.produceMessage(t) + tc.consumeMessage(ctx, t) +} + +func (tc *TestCase) kafkaBootstrapServers() string { + return strings.Join(tc.addr, ",") +} + +func (tc *TestCase) produceMessage(t *testing.T) { + t.Helper() + + cfg := &kafka.ConfigMap{ + "bootstrap.servers": tc.kafkaBootstrapServers(), + "go.delivery.reports": true, + } + delivery := make(chan kafka.Event, 1) + + producer, err := kafka.NewProducer(cfg) + require.NoError(t, err, "failed to create producer") + defer func() { + <-delivery + producer.Close() + }() + + err = producer.Produce(&kafka.Message{ + TopicPartition: kafka.TopicPartition{ + Topic: &topic, + Partition: partition, + }, + Key: []byte("key2"), + Value: []byte("value2"), + }, delivery) + require.NoError(t, err, "failed to send message") +} + +func (tc *TestCase) consumeMessage(_ context.Context, t *testing.T) { + t.Helper() + + cfg := &kafka.ConfigMap{ + "group.id": consumerGroup, + "bootstrap.servers": tc.kafkaBootstrapServers(), + "fetch.wait.max.ms": 500, + "socket.timeout.ms": 1500, + "session.timeout.ms": 1500, + "enable.auto.offset.store": false, + } + c, err := kafka.NewConsumer(cfg) + require.NoError(t, err, "failed to create consumer") + defer c.Close() + + err = c.Assign([]kafka.TopicPartition{ + {Topic: &topic, Partition: 0}, + }) + require.NoError(t, err) + + m, err := backoff.RetryWithData( + func() (*kafka.Message, error) { return c.ReadMessage(3 * time.Second) }, + backoff.NewExponentialBackOff(), + ) + require.NoError(t, err) + + _, err = c.CommitMessage(m) + require.NoError(t, err) + + require.Equal(t, "key2", string(m.Key)) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic " + topic, + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "confluentinc/confluent-kafka-go/kafka", + "messaging.system": "kafka", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic " + topic, + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "confluentinc/confluent-kafka-go/kafka", + "messaging.system": "kafka", + "messaging.kafka.bootstrap.servers": "localhost", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/confluent-kafka-go.v2/generated_test.go b/internal/orchestrion/_integration/confluent-kafka-go.v2/generated_test.go new file mode 100644 index 0000000000..6c382f004a --- /dev/null +++ b/internal/orchestrion/_integration/confluent-kafka-go.v2/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build (linux || !githubci) && !windows + +package kafka + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/confluent-kafka-go.v2/kafka.go b/internal/orchestrion/_integration/confluent-kafka-go.v2/kafka.go new file mode 100644 index 0000000000..8aea99c5c0 --- /dev/null +++ b/internal/orchestrion/_integration/confluent-kafka-go.v2/kafka.go @@ -0,0 +1,143 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build (linux || !githubci) && !windows + +package kafka + +import ( + "context" + "strings" + "testing" + "time" + + "github.com/cenkalti/backoff/v4" + "github.com/confluentinc/confluent-kafka-go/v2/kafka" + "github.com/stretchr/testify/require" + kafkatest "github.com/testcontainers/testcontainers-go/modules/kafka" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +var ( + topic = "confluent_kafka_v2_default_test" + consumerGroup = "confluent_kafka_v2_default_test" + partition = int32(0) +) + +type TestCase struct { + container *kafkatest.KafkaContainer + addr []string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + container, addr := containers.StartKafkaTestContainer(t, []string{topic}) + tc.container = container + tc.addr = []string{addr} +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + tc.produceMessage(t) + tc.consumeMessage(ctx, t) +} + +func (tc *TestCase) kafkaBootstrapServers() string { + return strings.Join(tc.addr, ",") +} + +func (tc *TestCase) produceMessage(t *testing.T) { + t.Helper() + + cfg := &kafka.ConfigMap{ + "bootstrap.servers": tc.kafkaBootstrapServers(), + "go.delivery.reports": true, + } + delivery := make(chan kafka.Event, 1) + + producer, err := kafka.NewProducer(cfg) + require.NoError(t, err, "failed to create producer") + defer func() { + <-delivery + producer.Close() + }() + + err = producer.Produce(&kafka.Message{ + TopicPartition: kafka.TopicPartition{ + Topic: &topic, + Partition: partition, + }, + Key: []byte("key2"), + Value: []byte("value2"), + }, delivery) + require.NoError(t, err, "failed to send message") +} + +func (tc *TestCase) consumeMessage(_ context.Context, t *testing.T) { + t.Helper() + + cfg := &kafka.ConfigMap{ + "group.id": consumerGroup, + "bootstrap.servers": tc.kafkaBootstrapServers(), + "fetch.wait.max.ms": 500, + "socket.timeout.ms": 1500, + "session.timeout.ms": 1500, + "enable.auto.offset.store": false, + } + c, err := kafka.NewConsumer(cfg) + require.NoError(t, err, "failed to create consumer") + defer c.Close() + + err = c.Assign([]kafka.TopicPartition{ + {Topic: &topic, Partition: 0}, + }) + require.NoError(t, err) + + m, err := backoff.RetryWithData( + func() (*kafka.Message, error) { return c.ReadMessage(3 * time.Second) }, + backoff.NewExponentialBackOff(), + ) + require.NoError(t, err) + + _, err = c.CommitMessage(m) + require.NoError(t, err) + + require.Equal(t, "key2", string(m.Key)) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic " + topic, + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "confluentinc/confluent-kafka-go/kafka.v2", + "messaging.system": "kafka", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic " + topic, + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "confluentinc/confluent-kafka-go/kafka.v2", + "messaging.system": "kafka", + "messaging.kafka.bootstrap.servers": "localhost", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/dd-span/ddspan.go b/internal/orchestrion/_integration/dd-span/ddspan.go new file mode 100644 index 0000000000..c61abbd80d --- /dev/null +++ b/internal/orchestrion/_integration/dd-span/ddspan.go @@ -0,0 +1,34 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package ddspan + +import ( + "context" + "net/http" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/stretchr/testify/require" +) + +type TestCase struct{} + +func (*TestCase) Setup(context.Context, *testing.T) {} + +func (*TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:0/", nil) + require.NoError(t, err) + + _, _ = spanFromHTTPRequest(req) +} + +//dd:span foo:bar +func spanFromHTTPRequest(*http.Request) (string, error) { + return tagSpecificSpan() +} diff --git a/internal/orchestrion/_integration/dd-span/generated_test.go b/internal/orchestrion/_integration/dd-span/generated_test.go new file mode 100644 index 0000000000..b7f479b509 --- /dev/null +++ b/internal/orchestrion/_integration/dd-span/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package ddspan + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/dd-span/no-tag.go b/internal/orchestrion/_integration/dd-span/no-tag.go new file mode 100644 index 0000000000..b4b4977435 --- /dev/null +++ b/internal/orchestrion/_integration/dd-span/no-tag.go @@ -0,0 +1,50 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//generator:ignore-build-constraint +//go:build !buildtag + +package ddspan + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "spanFromHTTPRequest", + }, + Meta: map[string]string{ + "function-name": "spanFromHTTPRequest", + "foo": "bar", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "tagSpecificSpan", + }, + Meta: map[string]string{ + "function-name": "tagSpecificSpan", + "variant": "notag", + }, + }, + }, + }, + }, + }, + } +} + +//dd:span variant:notag +func tagSpecificSpan() (string, error) { + return "Variant NoTag", nil +} diff --git a/internal/orchestrion/_integration/dd-span/tag.go b/internal/orchestrion/_integration/dd-span/tag.go new file mode 100644 index 0000000000..139dece8e0 --- /dev/null +++ b/internal/orchestrion/_integration/dd-span/tag.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//generator:ignore-build-constraint +//go:build buildtag + +package ddspan + +import ( + "errors" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "spanFromHTTPRequest", + }, + Meta: map[string]string{ + "function-name": "spanFromHTTPRequest", + "foo": "bar", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "functionWithBuildTag", + }, + Meta: map[string]string{ + "function-name": "tagSpecificSpan", + "variant": "tag", + "error.message": "Artificial error for testing!", + }, + }, + }, + }, + }, + }, + } +} + +//dd:span variant:tag span.name:functionWithBuildTag +func tagSpecificSpan() (string, error) { + return "Variant Tag", errors.New("Artificial error for testing!") +} diff --git a/internal/orchestrion/_integration/echo.v4/echo.go b/internal/orchestrion/_integration/echo.v4/echo.go new file mode 100644 index 0000000000..98fea9febb --- /dev/null +++ b/internal/orchestrion/_integration/echo.v4/echo.go @@ -0,0 +1,100 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package echo + +import ( + "context" + "fmt" + "io" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/labstack/echo/v4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *echo.Echo + addr string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + tc.Echo = echo.New() + tc.Echo.Logger.SetOutput(io.Discard) + + tc.Echo.GET("/ping", func(c echo.Context) error { + return c.JSON(http.StatusOK, map[string]any{"message": "pong"}) + }) + tc.addr = fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)) + + go func() { assert.ErrorIs(t, tc.Echo.Start(tc.addr), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + require.NoError(t, tc.Echo.Shutdown(ctx)) + }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + resp, err := http.Get("http://" + tc.addr + "/ping") + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + httpUrl := "http://" + tc.addr + "/ping" + return trace.Traces{ + { + // NB: 2 Top-level spans are from the HTTP Client/Server, which are library-side instrumented. + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "echo.v4.test", + "type": "http", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "http.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "echo", + "resource": "GET /ping", + "type": "web", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "labstack/echo.v4", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/echo.v4/generated_test.go b/internal/orchestrion/_integration/echo.v4/generated_test.go new file mode 100644 index 0000000000..56f3ccbea9 --- /dev/null +++ b/internal/orchestrion/_integration/echo.v4/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package echo + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/fiber.v2/fiber.go b/internal/orchestrion/_integration/fiber.v2/fiber.go new file mode 100644 index 0000000000..cfcd078b2e --- /dev/null +++ b/internal/orchestrion/_integration/fiber.v2/fiber.go @@ -0,0 +1,78 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package fiber + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gofiber/fiber/v2" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *fiber.App + addr string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + tc.App = fiber.New(fiber.Config{DisableStartupMessage: true}) + tc.App.Get("/ping", func(c *fiber.Ctx) error { return c.JSON(map[string]any{"message": "pong"}) }) + tc.addr = fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)) + + go func() { assert.NoError(t, tc.App.Listen(tc.addr)) }() + t.Cleanup(func() { + assert.NoError(t, tc.App.ShutdownWithTimeout(10*time.Second)) + }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + resp, err := http.Get("http://" + tc.addr + "/ping") + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + httpUrl := "http://" + tc.addr + "/ping" + return trace.Traces{ + { + // NB: Top-level span is from the HTTP Client, which is library-side instrumented. + // The net/http server-side span does not appear here because fiber uses fasthttp internally instead of net/http. + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "fiber.v2.test", + "type": "http", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "fiber", + "type": "web", + }, + Meta: map[string]string{ + "http.url": "/ping", // This is implemented incorrectly in the fiber.v2 dd-trace-go integration. + "component": "gofiber/fiber.v2", + "span.kind": "server", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/fiber.v2/generated_test.go b/internal/orchestrion/_integration/fiber.v2/generated_test.go new file mode 100644 index 0000000000..b07018989b --- /dev/null +++ b/internal/orchestrion/_integration/fiber.v2/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package fiber + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub.go b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub.go new file mode 100644 index 0000000000..31f983e951 --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/gcp_pubsub.go @@ -0,0 +1,147 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package gcppubsub + +import ( + "context" + "testing" + "time" + + "cloud.google.com/go/pubsub" + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/modules/gcloud" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" +) + +const ( + testTopic = "pstest-orchestrion-topic" + testSubscription = "pstest-orchestrion-subscription" +) + +type TestCase struct { + container *gcloud.GCloudContainer + client *pubsub.Client + publishTime time.Time + messageID string +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + + tc.container, err = gcloud.RunPubsub(ctx, + "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", + gcloud.WithProjectID("pstest-orchestrion"), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, tc.container) + + projectID := tc.container.Settings.ProjectID + + //orchestrion:ignore + conn, err := grpc.NewClient(tc.container.URI, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + + tc.client, err = pubsub.NewClient(ctx, projectID, option.WithGRPCConn(conn)) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, tc.client.Close()) }) + + topic, err := tc.client.CreateTopic(ctx, testTopic) + require.NoError(t, err) + + _, err = tc.client.CreateSubscription(ctx, testSubscription, pubsub.SubscriptionConfig{ + Topic: topic, + EnableMessageOrdering: true, + }) + require.NoError(t, err) +} + +func (tc *TestCase) publishMessage(ctx context.Context, t *testing.T) { + topic := tc.client.Topic(testTopic) + topic.EnableMessageOrdering = true + res := topic.Publish(ctx, &pubsub.Message{ + Data: []byte("Hello, World!"), + OrderingKey: "ordering-key", + }) + id, err := res.Get(ctx) + require.NoError(t, err) + t.Log("finished publishing result", id) +} + +func (tc *TestCase) receiveMessage(ctx context.Context, t *testing.T) { + // We use a cancellable context so we can stop listening for more messages as + // soon as we have processed one. The [pubsub.Subscription.Receive] method + // keeps listening until a non-retryable error occurs, or the context gets + // cancelled... This would effectively block the test forever! + ctx, cancel := context.WithCancel(ctx) + defer cancel() // In case the message never arrives... + + sub := tc.client.Subscription(testSubscription) + err := sub.Receive(ctx, func(_ context.Context, message *pubsub.Message) { + assert.Equal(t, message.Data, []byte("Hello, World!")) + message.Ack() + tc.publishTime = message.PublishTime + tc.messageID = message.ID + cancel() // Stop waiting for more messages immediately... + }) + require.NoError(t, err) + + // Ensure the context is not done yet... + require.NotErrorIs(t, ctx.Err(), context.DeadlineExceeded) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + tc.publishMessage(ctx, t) + tc.receiveMessage(ctx, t) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "pubsub.publish", + "type": "queue", + "resource": "projects/pstest-orchestrion/topics/pstest-orchestrion-topic", + "service": "gcp_pubsub.v1.test", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "cloud.google.com/go/pubsub.v1", + "ordering_key": "ordering-key", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "pubsub.receive", + "type": "queue", + "resource": "projects/pstest-orchestrion/subscriptions/pstest-orchestrion-subscription", + "service": "gcp_pubsub.v1.test", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "cloud.google.com/go/pubsub.v1", + "messaging.system": "googlepubsub", + "ordering_key": "ordering-key", + "publish_time": tc.publishTime.String(), + "message_id": tc.messageID, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go new file mode 100644 index 0000000000..b50b1e5f8a --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub.v1/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package gcppubsub + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub.go b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub.go new file mode 100644 index 0000000000..8002b72c0c --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/gcp_pubsub.go @@ -0,0 +1,152 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package gcppubsub + +import ( + "context" + "fmt" + "testing" + "time" + + "cloud.google.com/go/pubsub/v2" + "cloud.google.com/go/pubsub/v2/apiv1/pubsubpb" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + "github.com/testcontainers/testcontainers-go/modules/gcloud" + "google.golang.org/api/option" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +const ( + testProject = "pstest-orchestrion" + testTopic = "pstest-orchestrion-topic" + testSubscription = "pstest-orchestrion-subscription" +) + +type TestCase struct { + container *gcloud.GCloudContainer + client *pubsub.Client + publishTime time.Time + messageID string +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + + tc.container, err = gcloud.RunPubsub(ctx, + "gcr.io/google.com/cloudsdktool/google-cloud-cli:emulators", + gcloud.WithProjectID(testProject), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, tc.container) + + projectID := tc.container.Settings.ProjectID + + //orchestrion:ignore + conn, err := grpc.NewClient(tc.container.URI, grpc.WithTransportCredentials(insecure.NewCredentials())) + require.NoError(t, err) + + tc.client, err = pubsub.NewClient(ctx, projectID, option.WithGRPCConn(conn)) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, tc.client.Close()) }) + + topic, err := tc.client.TopicAdminClient.CreateTopic(ctx, &pubsubpb.Topic{Name: fmt.Sprintf("projects/%s/topics/%s", testProject, testTopic)}) + require.NoError(t, err) + + _, err = tc.client.SubscriptionAdminClient.CreateSubscription(ctx, &pubsubpb.Subscription{ + Name: fmt.Sprintf("projects/%s/subscriptions/%s", testProject, testSubscription), + Topic: topic.Name, + EnableMessageOrdering: true, + }) + require.NoError(t, err) +} + +func (tc *TestCase) publishMessage(ctx context.Context, t *testing.T) { + topic := tc.client.Publisher(testTopic) + topic.EnableMessageOrdering = true + res := topic.Publish(ctx, &pubsub.Message{ + Data: []byte("Hello, World!"), + OrderingKey: "ordering-key", + }) + id, err := res.Get(ctx) + require.NoError(t, err) + t.Log("finished publishing result", id) +} + +func (tc *TestCase) receiveMessage(ctx context.Context, t *testing.T) { + // We use a cancellable context so we can stop listening for more messages as + // soon as we have processed one. The [pubsub.Subscription.Receive] method + // keeps listening until a non-retryable error occurs, or the context gets + // cancelled... This would effectively block the test forever! + ctx, cancel := context.WithCancel(ctx) + defer cancel() // In case the message never arrives... + + sub := tc.client.Subscriber(testSubscription) + err := sub.Receive(ctx, func(_ context.Context, message *pubsub.Message) { + assert.Equal(t, message.Data, []byte("Hello, World!")) + message.Ack() + tc.publishTime = message.PublishTime + tc.messageID = message.ID + cancel() // Stop waiting for more messages immediately... + }) + require.NoError(t, err) + + // Ensure the context is not done yet... + require.NotErrorIs(t, ctx.Err(), context.DeadlineExceeded) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + tc.publishMessage(ctx, t) + tc.receiveMessage(ctx, t) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "pubsub.publish", + "type": "queue", + "resource": "projects/pstest-orchestrion/topics/pstest-orchestrion-topic", + "service": "gcp_pubsub.v2.test", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "cloud.google.com/go/pubsub.v2", + "ordering_key": "ordering-key", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "pubsub.receive", + "type": "queue", + "resource": "projects/pstest-orchestrion/subscriptions/pstest-orchestrion-subscription", + "service": "gcp_pubsub.v2.test", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "cloud.google.com/go/pubsub.v2", + "messaging.system": "googlepubsub", + "ordering_key": "ordering-key", + "publish_time": tc.publishTime.String(), + "message_id": tc.messageID, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go b/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go new file mode 100644 index 0000000000..b50b1e5f8a --- /dev/null +++ b/internal/orchestrion/_integration/gcp_pubsub.v2/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package gcppubsub + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/gin/base.go b/internal/orchestrion/_integration/gin/base.go new file mode 100644 index 0000000000..e59cc368d4 --- /dev/null +++ b/internal/orchestrion/_integration/gin/base.go @@ -0,0 +1,101 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gin + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCaseBase struct { + *http.Server +} + +func (tc *TestCaseBase) Setup(_ context.Context, t *testing.T) { + gin.SetMode(gin.ReleaseMode) // Silence start-up logging + engine := gin.New() + + tc.Server = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + Handler: engine.Handler(), + } + + engine.GET("/ping", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "pong"}) }) + + go func() { assert.ErrorIs(t, tc.Server.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.Server.Shutdown(ctx)) + }) +} + +func (tc *TestCaseBase) Run(_ context.Context, t *testing.T) { + resp, err := http.Get("http://" + tc.Server.Addr + "/ping") + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (tc *TestCaseBase) ExpectedTraces() trace.Traces { + httpUrl := "http://" + tc.Server.Addr + "/ping" + return trace.Traces{ + { + // NB: 2 Top-level spans are from the HTTP Client/Server, which are library-side instrumented. + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "gin.test", + "type": "http", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "http.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "net/http", + "span.kind": "server", + }, + + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "service": "gin.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": httpUrl, + "component": "gin-gonic/gin", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/gin/generated_test.go b/internal/orchestrion/_integration/gin/generated_test.go new file mode 100644 index 0000000000..c2aa550918 --- /dev/null +++ b/internal/orchestrion/_integration/gin/generated_test.go @@ -0,0 +1,22 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package gin + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestBase(t *testing.T) { + harness.Run(t, new(TestCaseBase)) +} + +func TestResponse(t *testing.T) { + harness.Run(t, new(TestCaseResponse)) +} diff --git a/internal/orchestrion/_integration/gin/response.go b/internal/orchestrion/_integration/gin/response.go new file mode 100644 index 0000000000..0847990574 --- /dev/null +++ b/internal/orchestrion/_integration/gin/response.go @@ -0,0 +1,205 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gin + +import ( + "context" + "encoding/xml" + "fmt" + "io" + "net/http" + "runtime" + "strings" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gin-gonic/gin" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCaseResponse struct { + *http.Server +} + +type Payload struct { + Who string `json:"hello" xml:"who,attr"` +} + +func (tc *TestCaseResponse) Setup(_ context.Context, t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("AAP features are not supported on Windows") + return + } + + gin.SetMode(gin.ReleaseMode) // Silence start-up logging + engine := gin.New() + + engine.POST("/json", func(c *gin.Context) { + var payload Payload + if err := c.Bind(&payload); err != nil { + t.Log(err) + c.Error(err) + return + } + c.JSON(http.StatusOK, payload) + }) + + engine.POST("/xml", func(c *gin.Context) { + var payload Payload + if err := c.Bind(&payload); err != nil { + t.Log(err) + c.Error(err) + return + } + c.XML(http.StatusOK, struct { + XMLName xml.Name `json:"-" xml:"hello"` + Payload + }{Payload: payload}) + }) + + tc.Server = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + Handler: engine.Handler(), + } + + go func() { assert.ErrorIs(t, tc.Server.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.Server.Shutdown(ctx)) + }) +} + +func (tc *TestCaseResponse) Run(_ context.Context, t *testing.T) { + requestBody := `{"hello":"world"}` + req, err := http.NewRequest("POST", "http://"+tc.Server.Addr+"/json", strings.NewReader(requestBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + require.Equal(t, http.StatusOK, resp.StatusCode) + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Equal(t, requestBody, string(body)) + + req, err = http.NewRequest("POST", "http://"+tc.Server.Addr+"/xml", strings.NewReader(requestBody)) + require.NoError(t, err) + req.Header.Set("Content-Type", "application/json") + + resp, err = http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + require.Equal(t, http.StatusOK, resp.StatusCode) + + body, err = io.ReadAll(resp.Body) + require.NoError(t, err) + require.Equal(t, ``, string(body)) +} + +func (tc *TestCaseResponse) ExpectedTraces() trace.Traces { + return trace.Traces{ + // The JSON endpoint + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /json", + "service": "gin.test", + "type": "http", + }, + Meta: map[string]string{ + "http.url": "http://" + tc.Server.Addr + "/json", + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /json", + "service": "http.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": "http://" + tc.Server.Addr + "/json", + "component": "net/http", + "span.kind": "server", + // Verify we collected the schemas (proving the WAF has seen them) + //TODO: "_dd.appsec.s.req.body": `[{"hello":[8]}]`, + "_dd.appsec.s.res.body": `[{"hello":[8]}]`, + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /json", + "service": "gin.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": "http://" + tc.Server.Addr + "/json", + "component": "gin-gonic/gin", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + // The XML endpoint + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /xml", + "service": "gin.test", + "type": "http", + }, + Meta: map[string]string{ + "http.url": "http://" + tc.Server.Addr + "/xml", + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /xml", + "service": "http.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": "http://" + tc.Server.Addr + "/xml", + "component": "net/http", + "span.kind": "server", + // Verify we collected the schemas (proving the WAF has seen them) + //TODO: "_dd.appsec.s.req.body": `[{"hello":[8]}]`, + "_dd.appsec.s.res.body": `[{"Payload":[{"hello":[8]}]}]`, + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /xml", + "service": "gin.router", + "type": "web", + }, + Meta: map[string]string{ + "http.url": "http://" + tc.Server.Addr + "/xml", + "component": "gin-gonic/gin", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/gls/access.go b/internal/orchestrion/_integration/gls/access.go new file mode 100644 index 0000000000..777ac82f2f --- /dev/null +++ b/internal/orchestrion/_integration/gls/access.go @@ -0,0 +1,45 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gls + +/* +extern void cgoCallback(); +*/ +import "C" + +import ( + _ "runtime" // Provides go:linkname targets (if Orchestrion modifies) + _ "unsafe" // For go:linkname +) + +var ( + //go:linkname orchestrionGlsGet __dd_orchestrion_gls_get.V2 + orchestrionGlsGet func() any + + //go:linkname orhcestrionGlsSet __dd_orchestrion_gls_set.V2 + orhcestrionGlsSet func(any) + + get = func() any { return nil } + set = func(any) {} +) + +func init() { + if orchestrionGlsGet != nil { + get = orchestrionGlsGet + } + if orhcestrionGlsSet != nil { + set = orhcestrionGlsSet + } +} + +//export cgoCallback +func cgoCallback() { + set("I am inside a cgo callback") +} + +func cgoCall() { + C.cgoCallback() +} diff --git a/internal/orchestrion/_integration/gls/access_test.go b/internal/orchestrion/_integration/gls/access_test.go new file mode 100644 index 0000000000..d312eb7b9c --- /dev/null +++ b/internal/orchestrion/_integration/gls/access_test.go @@ -0,0 +1,92 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gls + +import ( + "runtime" + "sync" + "testing" + + "github.com/DataDog/orchestrion/runtime/built" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +//dd:orchestrion-enabled +const orchestrionEnabled = false + +func TestBuiltWithOrchestrion(t *testing.T) { + require.Equal(t, built.WithOrchestrion, orchestrionEnabled) +} + +func TestSimple(t *testing.T) { + expected := "Hello, World!" + + set(expected) + actual := get() + + if orchestrionEnabled { + t.Log("Orchestrion IS enabled") + require.Equal(t, expected, actual) + } else { + t.Log("Orchestrion IS NOT enabled") + require.Nil(t, actual) + } +} + +// TestCGO tests that the GLS is correctly set even when the code comes from a cgo callback. +func TestCGO(t *testing.T) { + if !orchestrionEnabled { + t.Skip("Orchestrion is not enabled") + } + + expected := "I am inside a cgo callback" + set(nil) + cgoCall() + require.Equal(t, expected, get()) +} + +func TestConcurrency(t *testing.T) { + if !orchestrionEnabled { + t.Skip("Orchestrion is not enabled") + } + + nbSets := 5000 + nbGoRoutines := 300 + + var wg sync.WaitGroup + + wg.Add(nbGoRoutines) + for i := 0; i < nbGoRoutines; i++ { + go func() { + defer wg.Done() + for j := 0; j < nbSets; j++ { + set(j) + assert.Equal(t, j, get()) + } + }() + } + + wg.Wait() +} + +func BenchmarkGLS(b *testing.B) { + if !orchestrionEnabled { + b.Skip("Orchestrion is not enabled") + } + + b.Run("Set", func(b *testing.B) { + for i := 0; i < b.N; i++ { + set(i) + } + }) + + b.Run("Get", func(b *testing.B) { + for i := 0; i < b.N; i++ { + runtime.KeepAlive(get()) + } + }) +} diff --git a/internal/orchestrion/_integration/gls/access_unix_test.go b/internal/orchestrion/_integration/gls/access_unix_test.go new file mode 100644 index 0000000000..e9d60ba249 --- /dev/null +++ b/internal/orchestrion/_integration/gls/access_unix_test.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build unix + +package gls + +import ( + "os" + "os/signal" + "syscall" + "testing" + + "github.com/stretchr/testify/assert" +) + +// TestSignal tests that the GLS is correctly set even when the code comes from a signal handler. +func TestSignal(t *testing.T) { + if !orchestrionEnabled { + t.Skip("Orchestrion is not enabled") + } + + expected := "I am inside a signal handler" + + set(nil) + + doneSigChan := make(chan struct{}, 1) + checkChan := make(chan struct{}, 1) + doneCheckChan := make(chan struct{}, 1) + sigChan := make(chan os.Signal, 1) + signal.Notify(sigChan, syscall.SIGUSR1) + + go func() { + <-sigChan + set(expected) + doneSigChan <- struct{}{} + + <-checkChan + assert.Equal(t, expected, get()) + doneCheckChan <- struct{}{} + }() + + _ = syscall.Kill(syscall.Getpid(), syscall.SIGUSR1) + <-doneSigChan + checkChan <- struct{}{} + <-doneCheckChan +} diff --git a/internal/orchestrion/_integration/go-elasticsearch/base.go b/internal/orchestrion/_integration/go-elasticsearch/base.go new file mode 100644 index 0000000000..0c49eb2929 --- /dev/null +++ b/internal/orchestrion/_integration/go-elasticsearch/base.go @@ -0,0 +1,123 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build (linux || !githubci) && !windows + +package go_elasticsearch + +import ( + "bytes" + "context" + "encoding/json" + "io" + "net/http" + "strings" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + testelasticsearch "github.com/testcontainers/testcontainers-go/modules/elasticsearch" + "github.com/testcontainers/testcontainers-go/wait" +) + +type esClient interface { + Perform(*http.Request) (*http.Response, error) +} + +type base struct { + container *testelasticsearch.ElasticsearchContainer + client esClient +} + +func (b *base) Setup(ctx context.Context, t *testing.T, image string, newClient func(addr string, caCert []byte) (esClient, error)) { + containers.SkipIfProviderIsNotHealthy(t) + + parts := strings.Split(image, ":") + require.Len(t, parts, 2) + version := parts[1] + major := strings.Split(version, ".")[0] + containerName := "elasticsearch" + major + + var err error + b.container, err = testelasticsearch.Run(ctx, + image, + testcontainers.WithEnv(map[string]string{ + "xpack.security.enabled": "false", + }), + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + testcontainers.WithWaitStrategyAndDeadline(time.Minute, wait.ForLog(`.*("message":\s?"started(\s|")?.*|]\sstarted\n)`).AsRegexp()), + // attempt to reuse this container + testcontainers.CustomizeRequest(testcontainers.GenericContainerRequest{ + ContainerRequest: testcontainers.ContainerRequest{ + Name: containerName, + Hostname: "localhost", + }, + Started: true, + Reuse: true, + }), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, b.container) + + b.client, err = newClient(b.container.Settings.Address, b.container.Settings.CACert) + require.NoError(t, err) +} + +func (b *base) Run(ctx context.Context, t *testing.T, doRequest func(t *testing.T, client esClient, body io.Reader)) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + data, err := json.Marshal(struct { + Title string `json:"title"` + }{Title: "some-title"}) + require.NoError(t, err) + + doRequest(t, b.client, bytes.NewReader(data)) +} + +func (*base) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "elasticsearch.query", + "service": "elastic.client", + "resource": "PUT /test/_doc/?", + "type": "elasticsearch", + }, + Meta: map[string]string{ + "component": "elastic/go-elasticsearch.v6", + "span.kind": "client", + "db.system": "elasticsearch", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "elastic.client", + "resource": "PUT /test/_doc/1", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/go-elasticsearch/generated_test.go b/internal/orchestrion/_integration/go-elasticsearch/generated_test.go new file mode 100644 index 0000000000..6012b8b31d --- /dev/null +++ b/internal/orchestrion/_integration/go-elasticsearch/generated_test.go @@ -0,0 +1,28 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build (linux || !githubci) && !windows + +package go_elasticsearch + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestV6(t *testing.T) { + harness.Run(t, new(TestCaseV6)) +} + +func TestV7(t *testing.T) { + harness.Run(t, new(TestCaseV7)) +} + +func TestV8(t *testing.T) { + harness.Run(t, new(TestCaseV8)) +} diff --git a/internal/orchestrion/_integration/go-elasticsearch/v6.go b/internal/orchestrion/_integration/go-elasticsearch/v6.go new file mode 100644 index 0000000000..a63ea4f88f --- /dev/null +++ b/internal/orchestrion/_integration/go-elasticsearch/v6.go @@ -0,0 +1,54 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build (linux || !githubci) && !windows + +package go_elasticsearch + +import ( + "context" + "io" + "runtime" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/elastic/go-elasticsearch/v6" + "github.com/elastic/go-elasticsearch/v6/esapi" + "github.com/stretchr/testify/require" +) + +type TestCaseV6 struct { + base +} + +func (tc *TestCaseV6) Setup(ctx context.Context, t *testing.T) { + // skip test if CI runner os arch is not amd64 + if _, ok := env.Lookup("CI"); ok && runtime.GOOS == "linux" && runtime.GOARCH != "amd64" { + t.Skip("Skipping test as the official elasticsearch v6 docker image only supports amd64") + } else if runtime.GOOS == "darwin" && runtime.GOARCH != "amd64" { + t.Skip("Skipping test as the official elasticsearch v6 docker image cannot run under rosetta") + } + // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + tc.base.Setup(ctx, t, "docker.elastic.co/elasticsearch/elasticsearch:6.8.23", func(addr string, _ []byte) (esClient, error) { + return elasticsearch.NewClient(elasticsearch.Config{ + Addresses: []string{addr}, + }) + }) +} + +func (tc *TestCaseV6) Run(ctx context.Context, t *testing.T) { + tc.base.Run(ctx, t, func(t *testing.T, client esClient, body io.Reader) { + t.Helper() + req := esapi.IndexRequest{ + Index: "test", + DocumentID: "1", + Body: body, + Refresh: "true", + } + res, err := req.Do(ctx, client) + require.NoError(t, err) + defer res.Body.Close() + }) +} diff --git a/internal/orchestrion/_integration/go-elasticsearch/v7.go b/internal/orchestrion/_integration/go-elasticsearch/v7.go new file mode 100644 index 0000000000..6a3d559514 --- /dev/null +++ b/internal/orchestrion/_integration/go-elasticsearch/v7.go @@ -0,0 +1,46 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build (linux || !githubci) && !windows + +package go_elasticsearch + +import ( + "context" + "io" + "testing" + + "github.com/elastic/go-elasticsearch/v7" + "github.com/elastic/go-elasticsearch/v7/esapi" + "github.com/stretchr/testify/require" +) + +type TestCaseV7 struct { + base +} + +func (tc *TestCaseV7) Setup(ctx context.Context, t *testing.T) { + // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + tc.base.Setup(ctx, t, "docker.elastic.co/elasticsearch/elasticsearch:7.17.24", func(addr string, _ []byte) (esClient, error) { + return elasticsearch.NewClient(elasticsearch.Config{ + Addresses: []string{addr}, + }) + }) +} + +func (tc *TestCaseV7) Run(ctx context.Context, t *testing.T) { + tc.base.Run(ctx, t, func(t *testing.T, client esClient, body io.Reader) { + t.Helper() + req := esapi.IndexRequest{ + Index: "test", + DocumentID: "1", + Body: body, + Refresh: "true", + } + res, err := req.Do(ctx, client) + require.NoError(t, err) + defer res.Body.Close() + }) +} diff --git a/internal/orchestrion/_integration/go-elasticsearch/v8.go b/internal/orchestrion/_integration/go-elasticsearch/v8.go new file mode 100644 index 0000000000..01735ad254 --- /dev/null +++ b/internal/orchestrion/_integration/go-elasticsearch/v8.go @@ -0,0 +1,46 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build (linux || !githubci) && !windows + +package go_elasticsearch + +import ( + "context" + "io" + "testing" + + "github.com/elastic/go-elasticsearch/v8" + "github.com/elastic/go-elasticsearch/v8/esapi" + "github.com/stretchr/testify/require" +) + +type TestCaseV8 struct { + base +} + +func (tc *TestCaseV8) Setup(ctx context.Context, t *testing.T) { + // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + tc.base.Setup(ctx, t, "docker.elastic.co/elasticsearch/elasticsearch:8.15.3", func(addr string, caCert []byte) (esClient, error) { + return elasticsearch.NewClient(elasticsearch.Config{ + Addresses: []string{addr}, + }) + }) +} + +func (tc *TestCaseV8) Run(ctx context.Context, t *testing.T) { + tc.base.Run(ctx, t, func(t *testing.T, client esClient, body io.Reader) { + t.Helper() + req := esapi.IndexRequest{ + Index: "test", + DocumentID: "1", + Body: body, + Refresh: "true", + } + res, err := req.Do(ctx, client) + require.NoError(t, err) + defer res.Body.Close() + }) +} diff --git a/internal/orchestrion/_integration/go-redis.v0/generated_test.go b/internal/orchestrion/_integration/go-redis.v0/generated_test.go new file mode 100644 index 0000000000..8122cb071b --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v0/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package goredis + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/go-redis.v0/go-redis.go b/internal/orchestrion/_integration/go-redis.v0/go-redis.go new file mode 100644 index 0000000000..2c1e0eac2a --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v0/go-redis.go @@ -0,0 +1,113 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package goredis + +import ( + "context" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/go-redis/redis" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + testredis "github.com/testcontainers/testcontainers-go/modules/redis" +) + +type TestCase struct { + server *testredis.RedisContainer + *redis.Client + key string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + uuid, err := uuid.NewRandom() + require.NoError(t, err) + tc.key = uuid.String() + + container, addr := containers.StartRedisTestContainer(t) + tc.server = container + + // Wait for a successful Ping to the server, so we're sure it's up and running. + require.NoError(t, + backoff.Retry( + func() error { + tc.Client = redis.NewClient(&redis.Options{Addr: addr}) + if err := tc.Client.Ping().Err(); err != nil { + // There was an error, so we'll re-cycle the client entirely... + tc.Client.Close() + tc.Client = nil + return err + } + return nil + }, + backoff.NewExponentialBackOff(), + ), + ) + t.Cleanup(func() { assert.NoError(t, tc.Client.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + require.NoError(t, tc.Client.WithContext(ctx).Set(tc.key, "test_value", 0).Err()) + require.NoError(t, tc.Client.WithContext(ctx).Get(tc.key).Err()) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "set", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "3", + "component": "go-redis/redis", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": fmt.Sprintf("set %s test_value: ", tc.key), + "out.host": "localhost", + }, + }, + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "get", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "2", + "component": "go-redis/redis", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": fmt.Sprintf("get %s: ", tc.key), + "out.host": "localhost", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/go-redis.v7/generated_test.go b/internal/orchestrion/_integration/go-redis.v7/generated_test.go new file mode 100644 index 0000000000..8122cb071b --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v7/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package goredis + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/go-redis.v7/go-redis.go b/internal/orchestrion/_integration/go-redis.v7/go-redis.go new file mode 100644 index 0000000000..dfa1f984ee --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v7/go-redis.go @@ -0,0 +1,114 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package goredis + +import ( + "context" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/go-redis/redis/v7" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + testredis "github.com/testcontainers/testcontainers-go/modules/redis" +) + +type TestCase struct { + server *testredis.RedisContainer + *redis.Client + key string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + uuid, err := uuid.NewRandom() + require.NoError(t, err) + tc.key = uuid.String() + + container, addr := containers.StartRedisTestContainer(t) + tc.server = container + + // Wait for a successful Ping to the server, so we're sure it's up and running. + require.NoError(t, + backoff.Retry( + func() error { + tc.Client = redis.NewClient(&redis.Options{Addr: addr}) + if err := tc.Client.Ping().Err(); err != nil { + // There was an error, so we'll re-cycle the client entirely... + tc.Client.Close() + tc.Client = nil + return err + } + return nil + }, + backoff.NewExponentialBackOff(), + ), + ) + + t.Cleanup(func() { assert.NoError(t, tc.Client.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + require.NoError(t, tc.Client.WithContext(ctx).Set(tc.key, "test_value", 0).Err()) + require.NoError(t, tc.Client.WithContext(ctx).Get(tc.key).Err()) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "set", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "3", + "component": "go-redis/redis.v7", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": fmt.Sprintf("set %s test_value: ", tc.key), + "out.host": "localhost", + }, + }, + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "get", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "2", + "component": "go-redis/redis.v7", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": fmt.Sprintf("get %s: ", tc.key), + "out.host": "localhost", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/go-redis.v8/generated_test.go b/internal/orchestrion/_integration/go-redis.v8/generated_test.go new file mode 100644 index 0000000000..8122cb071b --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v8/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package goredis + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/go-redis.v8/go-redis.go b/internal/orchestrion/_integration/go-redis.v8/go-redis.go new file mode 100644 index 0000000000..592180abff --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v8/go-redis.go @@ -0,0 +1,112 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package goredis + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/go-redis/redis/v8" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + testredis "github.com/testcontainers/testcontainers-go/modules/redis" +) + +type TestCase struct { + server *testredis.RedisContainer + *redis.Client + key string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + uuid, err := uuid.NewRandom() + require.NoError(t, err) + tc.key = uuid.String() + + container, addr := containers.StartRedisTestContainer(t) + tc.server = container + + // Wait for a successful Ping to the server, so we're sure it's up and running. + require.NoError(t, + backoff.Retry( + func() error { + tc.Client = redis.NewClient(&redis.Options{Addr: addr}) + if err := tc.Client.Ping(context.Background()).Err(); err != nil { + // There was an error, so we'll re-cycle the client entirely... + tc.Client.Close() + tc.Client = nil + return err + } + return nil + }, + backoff.NewExponentialBackOff(), + ), + ) + t.Cleanup(func() { assert.NoError(t, tc.Client.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + require.NoError(t, tc.Client.Set(ctx, "test_key", "test_value", 0).Err()) + require.NoError(t, tc.Client.Get(ctx, "test_key").Err()) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "set", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "3", + "component": "go-redis/redis.v8", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": "set test_key test_value:", + "out.host": "localhost", + }, + }, + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "get", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "2", + "component": "go-redis/redis.v8", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": "get test_key:", + "out.host": "localhost", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/go-redis.v9/generated_test.go b/internal/orchestrion/_integration/go-redis.v9/generated_test.go new file mode 100644 index 0000000000..8122cb071b --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v9/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package goredis + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/go-redis.v9/go-redis.go b/internal/orchestrion/_integration/go-redis.v9/go-redis.go new file mode 100644 index 0000000000..e663dc2d34 --- /dev/null +++ b/internal/orchestrion/_integration/go-redis.v9/go-redis.go @@ -0,0 +1,113 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package goredis + +import ( + "context" + "fmt" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/google/uuid" + "github.com/redis/go-redis/v9" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + testredis "github.com/testcontainers/testcontainers-go/modules/redis" +) + +type TestCase struct { + server *testredis.RedisContainer + *redis.Client + key string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + uuid, err := uuid.NewRandom() + require.NoError(t, err) + tc.key = uuid.String() + + container, addr := containers.StartRedisTestContainer(t) + tc.server = container + + // Wait for a successful Ping to the server, so we're sure it's up and running. + require.NoError(t, + backoff.Retry( + func() error { + tc.Client = redis.NewClient(&redis.Options{Addr: addr}) + if err := tc.Client.Ping(context.Background()).Err(); err != nil { + // There was an error, so we'll re-cycle the client entirely... + tc.Client.Close() + tc.Client = nil + return err + } + return nil + }, + backoff.NewExponentialBackOff(), + ), + ) + t.Cleanup(func() { assert.NoError(t, tc.Client.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + require.NoError(t, tc.Client.Set(ctx, tc.key, "test_value", 0).Err()) + require.NoError(t, tc.Client.Get(ctx, tc.key).Err()) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "set", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "3", + "component": "redis/go-redis.v9", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": fmt.Sprintf("set %s test_value: ", tc.key), + "out.host": "localhost", + }, + }, + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "get", + "type": "redis", + }, + Meta: map[string]string{ + "redis.args_length": "2", + "component": "redis/go-redis.v9", + "out.db": "0", + "span.kind": "client", + "db.system": "redis", + "redis.raw_command": fmt.Sprintf("get %s: ", tc.key), + "out.host": "localhost", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/go.mod b/internal/orchestrion/_integration/go.mod new file mode 100644 index 0000000000..c795e30d3b --- /dev/null +++ b/internal/orchestrion/_integration/go.mod @@ -0,0 +1,475 @@ +module github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration + +go 1.24.0 + +require ( + cloud.google.com/go/pubsub v1.49.0 + cloud.google.com/go/pubsub/v2 v2.0.0 + github.com/99designs/gqlgen v0.17.72 + github.com/DataDog/datadog-agent/pkg/proto v0.71.2 + github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/orchestrion/all/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.5.0-dev + github.com/DataDog/go-libddwaf/v4 v4.6.1 + github.com/DataDog/orchestrion v1.6.1 + github.com/IBM/sarama v1.44.0 + github.com/Shopify/sarama v1.38.1 + github.com/aws/aws-sdk-go v1.55.5 + github.com/aws/aws-sdk-go-v2 v1.26.1 + github.com/aws/aws-sdk-go-v2/config v1.27.11 + github.com/aws/aws-sdk-go-v2/credentials v1.17.11 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 + github.com/cenkalti/backoff/v4 v4.3.0 + github.com/confluentinc/confluent-kafka-go v1.9.2 + github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 + github.com/elastic/go-elasticsearch/v6 v6.8.5 + github.com/elastic/go-elasticsearch/v7 v7.17.1 + github.com/elastic/go-elasticsearch/v8 v8.12.1 + github.com/gin-gonic/gin v1.10.1 + github.com/go-chi/chi/v5 v5.2.2 + github.com/go-redis/redis v6.15.9+incompatible + github.com/go-redis/redis/v7 v7.4.1 + github.com/go-redis/redis/v8 v8.11.5 + github.com/gocql/gocql v1.7.0 + github.com/gofiber/fiber/v2 v2.52.9 + github.com/gomodule/redigo v1.9.2 + github.com/google/uuid v1.6.0 + github.com/gorilla/mux v1.8.1 + github.com/graph-gophers/graphql-go v1.5.0 + github.com/graphql-go/graphql v0.8.1 + github.com/graphql-go/handler v0.2.3 + github.com/hashicorp/vault/api v1.15.0 + github.com/jackc/pgx/v5 v5.7.2 + github.com/julienschmidt/httprouter v1.3.0 + github.com/labstack/echo/v4 v4.13.3 + github.com/mattn/go-sqlite3 v1.14.22 + github.com/redis/go-redis/v9 v9.7.3 + github.com/redis/rueidis v1.0.56 + github.com/segmentio/kafka-go v0.4.42 + github.com/sirupsen/logrus v1.9.3 + github.com/stretchr/testify v1.11.1 + github.com/testcontainers/testcontainers-go v0.37.0 + github.com/testcontainers/testcontainers-go/modules/cassandra v0.37.0 + github.com/testcontainers/testcontainers-go/modules/elasticsearch v0.37.0 + github.com/testcontainers/testcontainers-go/modules/gcloud v0.37.0 + github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0 + github.com/testcontainers/testcontainers-go/modules/postgres v0.37.0 + github.com/testcontainers/testcontainers-go/modules/redis v0.37.0 + github.com/testcontainers/testcontainers-go/modules/vault v0.37.0 + github.com/tinylib/msgp v1.4.0 + github.com/twitchtv/twirp v8.1.3+incompatible + github.com/valkey-io/valkey-go v1.0.56 + github.com/vektah/gqlparser/v2 v2.5.25 + github.com/xlab/treeprint v1.2.0 + go.mongodb.org/mongo-driver v1.17.1 + go.mongodb.org/mongo-driver/v2 v2.2.2 + google.golang.org/api v0.239.0 + google.golang.org/grpc v1.76.0 + google.golang.org/grpc/examples v0.0.0-20240521165117-aea78bdf9d13 + gorm.io/driver/sqlite v1.5.7 + gorm.io/gorm v1.25.12 + gotest.tools/v3 v3.5.2 + k8s.io/apimachinery v0.32.3 + k8s.io/client-go v0.32.2 +) + +require ( + cloud.google.com/go v0.121.4 // indirect + cloud.google.com/go/auth v0.16.3 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + dario.cat/mergo v1.0.1 // indirect + github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.2 // indirect + github.com/DataDog/datadog-go/v5 v5.8.1 // indirect + github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/log/slog/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 v2.5.0-dev // indirect + github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 v2.5.0-dev // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/gostackparse v0.7.0 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/Microsoft/hcsshim v0.11.7 // indirect + github.com/agnivade/levenshtein v1.2.1 // indirect + github.com/andybalholm/brotli v1.1.1 // indirect + github.com/antithesishq/antithesis-sdk-go v0.5.0 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect + github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 // indirect + github.com/aws/smithy-go v1.20.2 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect + github.com/bytedance/sonic v1.12.6 // indirect + github.com/bytedance/sonic/loader v0.2.1 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charmbracelet/colorprofile v0.3.2 // indirect + github.com/charmbracelet/lipgloss v1.1.0 // indirect + github.com/charmbracelet/x/ansi v0.10.2 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/clipperhouse/stringish v0.1.1 // indirect + github.com/clipperhouse/uax29/v2 v2.3.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/containerd/continuity v0.4.4 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/containerd/ttrpc v1.2.7 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/dave/dst v0.27.3 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/docker/docker v28.0.1+incompatible // indirect + github.com/docker/go-connections v0.5.0 // indirect + github.com/docker/go-units v0.5.0 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.7.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/ebitengine/purego v0.9.0 // indirect + github.com/elastic/elastic-transport-go/v8 v8.4.0 // indirect + github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.7.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.0.0 // indirect + github.com/go-chi/chi v1.5.4 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.23.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/goccy/go-json v0.10.4 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/gnostic-models v0.6.8 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/go-tpm v0.9.6 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 // indirect + github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect + github.com/hashicorp/hcl v1.0.1-vault-7 // indirect + github.com/hashicorp/vault/sdk v0.15.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/puddle/v2 v2.2.2 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.1 // indirect + github.com/klauspost/cpuid/v2 v2.2.9 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/mdelapenya/tlscert v0.2.0 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/patternmatcher v0.6.0 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/sys/user v0.4.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/montanaflynn/stats v0.7.1 // indirect + github.com/morikuni/aec v1.0.0 // indirect + github.com/muesli/termenv v0.16.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/nats-io/jwt/v2 v2.8.0 // indirect + github.com/nats-io/nats-server/v2 v2.12.1 // indirect + github.com/nats-io/nats.go v1.47.0 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pierrec/lz4/v4 v4.1.22 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rs/zerolog v1.34.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.1 // indirect + github.com/shirou/gopsutil/v4 v4.25.9 // indirect + github.com/sosodev/duration v1.3.1 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0 // indirect + github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tidwall/pretty v1.2.1 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/urfave/cli/v2 v2.27.7 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.58.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/x448/float16 v0.8.4 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/collector/component v1.44.0 // indirect + go.opentelemetry.io/collector/featuregate v1.44.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.138.0 // indirect + go.opentelemetry.io/collector/pdata v1.44.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/log v0.14.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.13.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.32.2 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f // indirect + k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect + sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.2 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect + tags.cncf.io/container-device-interface v0.8.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 => ../../../contrib/99designs/gqlgen + +replace github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 => ../../../contrib/IBM/sarama + +replace github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 => ../../../contrib/Shopify/sarama + +replace github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 => ../../../contrib/aws/aws-sdk-go-v2 + +replace github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 => ../../../contrib/aws/aws-sdk-go + +replace github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 => ../../../contrib/cloud.google.com/go/pubsub.v1 + +replace github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 => ../../../contrib/cloud.google.com/go/pubsub.v2 + +replace github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 => ../../../contrib/confluentinc/confluent-kafka-go/kafka.v2 + +replace github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 => ../../../contrib/confluentinc/confluent-kafka-go/kafka + +replace github.com/DataDog/dd-trace-go/contrib/database/sql/v2 => ../../../contrib/database/sql + +replace github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 => ../../../contrib/elastic/go-elasticsearch.v6 + +replace github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 => ../../../contrib/gin-gonic/gin + +replace github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 => ../../../contrib/go-chi/chi.v5 + +replace github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 => ../../../contrib/go-chi/chi + +replace github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 => ../../../contrib/go-redis/redis.v7 + +replace github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 => ../../../contrib/go-redis/redis.v8 + +replace github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 => ../../../contrib/go-redis/redis + +replace github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 => ../../../contrib/go.mongodb.org/mongo-driver + +replace github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 => ../../../contrib/gocql/gocql + +replace github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 => ../../../contrib/gofiber/fiber.v2 + +replace github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 => ../../../contrib/gomodule/redigo + +replace github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 => ../../../contrib/google.golang.org/grpc + +replace github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 => ../../../contrib/gorilla/mux + +replace github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 => ../../../contrib/gorm.io/gorm.v1 + +replace github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 => ../../../contrib/graph-gophers/graphql-go + +replace github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 => ../../../contrib/graphql-go/graphql + +replace github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 => ../../../contrib/hashicorp/vault + +replace github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2 => ../../../contrib/jackc/pgx.v5 + +replace github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 => ../../../contrib/julienschmidt/httprouter + +replace github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2 => ../../../contrib/k8s.io/client-go + +replace github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 => ../../../contrib/labstack/echo.v4 + +replace github.com/DataDog/dd-trace-go/contrib/log/slog/v2 => ../../../contrib/log/slog + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../../contrib/net/http + +replace github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 => ../../../contrib/redis/go-redis.v9 + +replace github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 => ../../../contrib/redis/rueidis + +replace github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 => ../../../contrib/segmentio/kafka-go + +replace github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2 => ../../../contrib/sirupsen/logrus + +replace github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 => ../../../contrib/twitchtv/twirp + +replace github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 => ../../../contrib/valkey-io/valkey-go + +replace github.com/DataDog/dd-trace-go/orchestrion/all/v2 => ../../../orchestrion/all + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. + +replace google.golang.org/grpc => google.golang.org/grpc v1.70.0 + +replace github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2 => ../../../contrib/go.mongodb.org/mongo-driver.v2 + +replace github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2 => ../../../instrumentation/testutils/containers diff --git a/internal/orchestrion/_integration/go.sum b/internal/orchestrion/_integration/go.sum new file mode 100644 index 0000000000..91f7d96e06 --- /dev/null +++ b/internal/orchestrion/_integration/go.sum @@ -0,0 +1,2845 @@ +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs= +cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc= +cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk= +cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.49.0 h1:5054IkbslnrMCgA2MAEPcsN3Ky+AyMpEZcii/DoySPo= +cloud.google.com/go/pubsub v1.49.0/go.mod h1:K1FswTWP+C1tI/nfi3HQecoVeFvL4HUOB1tdaNXKhUY= +cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/99designs/gqlgen v0.17.72 h1:2JDAuutIYtAN26BAtigfLZFnTN53fpYbIENL8bVgAKY= +github.com/99designs/gqlgen v0.17.72/go.mod h1:BoL4C3j9W2f95JeWMrSArdDNGWmZB9MOS2EMHJDZmUc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.2 h1:C4huKojabL8u+MknxnBYUk2Dudkii5kRH5PhD6gp2MA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.2/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.2 h1:SS3xTi1zlyhslE7kJsrMErKAA56rdAP1Ll4ZWCRkq/o= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.2/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.2 h1:v9PTAUhEQhHh+AZIU1OgzpJdSB76pwPI9+erztcdsJU= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.2/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.2 h1:WC69FCbHoYQEneHtp8cv4A71GpT/WNjv5EiYkuopvFo= +github.com/DataDog/datadog-agent/pkg/proto v0.71.2/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.2 h1:F3Zk3JxkSnQ0rs4kifZ1y94alDqo/SAT9rwQlT0Nx7c= +github.com/DataDog/datadog-agent/pkg/trace v0.71.2/go.mod h1:cCkrxJC4m2KSDdfYlKb60W4yEguO5nBpmGquVX8Lb1w= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.2 h1:GaOMKewaJnnbaOX1cdsZbsQCmKxCNamPyxI7e7kSL6c= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.2/go.mod h1:lsew565lFp63tFjppWCKpZ1qVJrLhjFNGyTa/cwqZDY= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.2 h1:0QkToZ7R5bpiHcaa9pBOVXaMODxh9pUvMb3kpfT/nik= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.2/go.mod h1:0xxMqmIVxjAAXBUk2ntnvPuj0UjGDAEXZqLPLHF4eYg= +github.com/DataDog/datadog-agent/pkg/version v0.71.2 h1:5wVVZrOCzvH6ka+J/3iKQH3rMJPIW1OaLOkOO/DRX8U= +github.com/DataDog/datadog-agent/pkg/version v0.71.2/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.8.1 h1:+GOES5W9zpKlhwHptZVW2C0NLVf7ilr7pHkDcbNvpIc= +github.com/DataDog/datadog-go/v5 v5.8.1/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev h1:srl0FPpKiginZRfuUCioeUV8gJuTLmNY7pS6AxZl4qQ= +github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev/go.mod h1:rG6TpmIBAZEpcNHjD1q/4qtbWNKWw61UH3IS+FsjReQ= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6 h1:rIMZ3Bqn2w8nWrAIXekOdm+sZVxUYHGX8cS7P9W06Kk= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/orchestrion v1.6.1 h1:4sVZx84/C2hsp5XbjTNBvYk0n1Mo12PsiAP1v+eynpM= +github.com/DataDog/orchestrion v1.6.1/go.mod h1:6a8nJ1elAujUAQ9uY/vWSUV6hQSaGXGpWYXbsaPE+6E= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= +github.com/IBM/sarama v1.44.0 h1:puNKqcScjSAgVLramjsuovZrS0nJZFVsrvuUymkWqhE= +github.com/IBM/sarama v1.44.0/go.mod h1:MxQ9SvGfvKIorbk077Ff6DUnBlGpidiQOtU2vuBaxVw= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.7 h1:vl/nj3Bar/CvJSYo7gIQPyRWc9f3c6IeSNavBTSZNZQ= +github.com/Microsoft/hcsshim v0.11.7/go.mod h1:MV8xMfmECjl5HdO7U/3/hFVnkmSBjAjmA09d4bExKcU= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= +github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= +github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= +github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antithesishq/antithesis-sdk-go v0.5.0 h1:cudCFF83pDDANcXFzkQPUHHedfnnIbUO3JMr9fqwFJs= +github.com/antithesishq/antithesis-sdk-go v0.5.0/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q= +github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= +github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= +github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= +github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14 h1:Nhcq+ODoD9FRQYI3lATy6iADS5maER3ZXSfE8v3FMh8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14/go.mod h1:VlBbwTpgCj3rKWMVkEAYiAR3FKs7Mi3jALTMGfbfuns= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 h1:dZXY07Dm59TxAjJcUfNMJHLDI/gLMxTRZefn2jFAVsw= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1/go.mod h1:lVLqEtX+ezgtfalyJs7Peb0uv9dEpAQP5yuq2O26R44= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4 h1:Vz4ilZcVXCR9yatX5yfMrkBldYggtkih3h7woHvzu5Q= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4/go.mod h1:aIINXlt2xXhMeRsyCsLDUDohI8AdDm92gY9nIB6pv0M= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6 h1:6tayEze2Y+hiL3kdnEUxSPsP+pJsUfwLSFspFl1ru9Q= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6/go.mod h1:qVNb/9IOVsLCZh0x2lnagrBwQ9fxajUpXS7OZfIsKn0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4 h1:Oe8awBiS/iitcsRJB5+DHa3iCxoA0KwJJf0JNrYMINY= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4/go.mod h1:RCZCSFbieSgNG1RKegO26opXV4EXyef/vNBVJsUyHuw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= +github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4 h1:LM5AENhJDUd3fHP5NI8hk1jR+Io54/TmEQCWkRmfJE8= +github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4/go.mod h1:YYRs4t+xgLXx9lBMW8Rs6wF61RtEOFrKa8hNMgq6DvI= +github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 h1:VhW/J21SPH9bNmk1IYdZtzqA6//N2PB5Py5RexNmLVg= +github.com/aws/aws-sdk-go-v2/service/sns v1.29.4/go.mod h1:DojKGyWXa4p+e+C+GpG7qf02QaE68Nrg2v/UAXQhKhU= +github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 h1:mE2ysZMEeQ3ulHWs4mmc4fZEhOfeY1o6QXAfDqjbSgw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4/go.mod h1:lCN2yKnj+Sp9F6UzpoPPTir+tSaC9Jwf6LcmTqnXFZw= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/bytedance/sonic v1.12.6 h1:/isNmCUF2x3Sh8RAp/4mh4ZGkcFAX/hLrzrK3AvpRzk= +github.com/bytedance/sonic v1.12.6/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.1 h1:1GgorWTqf12TA8mma4DDSbaQigE2wOgQo7iCjjJv3+E= +github.com/bytedance/sonic/loader v0.2.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= +github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= +github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= +github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= +github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs= +github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= +github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= +github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2 h1:eJ01FpliL/02KvsaPyH1bSLbM1S70yWQUojHVRbyvy4= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2/go.mod h1:IVsvFyGVhw4FASzUtlWNVaAOhYmakXAFY9IlZ7LAuD8= +github.com/confluentinc/confluent-kafka-go v1.9.2 h1:gV/GxhMBUb03tFWkN+7kdhg+zf+QUM+wVkI9zwh770Q= +github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pnwWZElUoWxHoV8E43DCrliyo= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 h1:NbOku86JJlsRJPJKE0snNsz6D1Qr4j5VR/lticrLZrY= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0/go.mod h1:E1dEQy50ZLfqs7T9luxz0rLxaeFZJZE92XvApJOr/Rk= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= +github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= +github.com/containerd/containerd/api v1.10.0 h1:5n0oHYVBwN4VhoX9fFykCV9dF1/BvAXeg2F8W6UYq1o= +github.com/containerd/containerd/api v1.10.0/go.mod h1:NBm1OAk8ZL+LG8R0ceObGxT5hbUYj7CzTmR3xh0DlMM= +github.com/containerd/continuity v0.4.4 h1:/fNVfTJ7wIl/YPMHjf+5H32uFhl63JucB34PlCpMKII= +github.com/containerd/continuity v0.4.4/go.mod h1:/lNJvtJKUQStBzpVQ1+rasXO1LAWtUQssk28EZvJ3nE= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.7 h1:qIrroQvuOL9HQ1X6KHe2ohc7p+HP/0VE6XPU7elJRqQ= +github.com/containerd/ttrpc v1.2.7/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= +github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo= +github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315 h1:UZxx9xBADdf/9UmSdEUi+pdJoPKpgcf9QUAY5gEIYmY= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315/go.mod h1:X8ZHhuW6ncwtoJ36TlU+gyaROTcBkTE01VHYmTStQCE= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.24.3 h1:BVc1oDV7aQgksH64pDKTvcI95G36uJ+Mz9DGGBBoZeQ= +github.com/docker/compose/v2 v2.24.3/go.mod h1:D8Nv9+juzD7xiMyyHJ7G2J/MOYiGBmb9SvdIW5+2zKo= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v28.0.1+incompatible h1:FCHjSRdXhNRFjlHMTv4jUNlIBbTeRjrWfeFuJp7jpo0= +github.com/docker/docker v28.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/elastic-transport-go/v8 v8.4.0 h1:EKYiH8CHd33BmMna2Bos1rDNMM89+hdgcymI+KzJCGE= +github.com/elastic/elastic-transport-go/v8 v8.4.0/go.mod h1:YLHer5cj0csTzNFXoNQ8qhtGY1GTvSqPnKWKaqQE3Hk= +github.com/elastic/go-elasticsearch/v6 v6.8.5 h1:U2HtkBseC1FNBmDr0TR2tKltL6FxoY+niDAlj5M8TK8= +github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= +github.com/elastic/go-elasticsearch/v7 v7.17.1 h1:49mHcHx7lpCL8cW1aioEwSEVKQF3s+Igi4Ye/QTWwmk= +github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/go-elasticsearch/v8 v8.12.1 h1:QcuFK5LaZS0pSIj/eAEsxmJWmMo7tUs1aVBbzdIgtnE= +github.com/elastic/go-elasticsearch/v8 v8.12.1/go.mod h1:wSzJYrrKPZQ8qPuqAqc6KMR4HrBfHnZORvyL+FMFqq0= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/fsnotify/fsevents v0.1.1 h1:/125uxJvvoSDDBPen6yUZbil8J9ydKZnnl3TWWmvnkw= +github.com/fsnotify/fsevents v0.1.1/go.mod h1:+d+hS27T6k5J8CRaPLKFgwKYcpS7GwW3Ule9+SC2ZRc= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v1.0.0 h1:y3bT1mUWUxDpW4JLQg/HnTqV4rozuW4tC9eFKTxYI9E= +github.com/gin-contrib/sse v1.0.0/go.mod h1:zNuFdwarAygJBht0NTKiSi3jRf6RbqeILZ9Sp6Slhe0= +github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= +github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= +github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= +github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= +github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= +github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM= +github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/gocql/gocql v1.7.0 h1:O+7U7/1gSN7QTEAaMEsJc1Oq2QHXvCWoF3DFK9HDHus= +github.com/gocql/gocql v1.7.0/go.mod h1:vnlvXyFZeLBF0Wy+RS8hrOdbn0UWsWtdg07XJnFxZ+4= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw= +github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.9.2 h1:HrutZBLhSIU8abiSfW8pj8mPhOyMYjZT/wcA4/L9L9s= +github.com/gomodule/redigo v1.9.2/go.mod h1:KsU3hiK/Ay8U42qpaJk+kuNa3C+spxapWpM+ywhcgtw= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-tpm v0.9.6 h1:Ku42PT4LmjDu1H5C5ISWLlpI1mj+Zq7sPGKoRw2XROA= +github.com/google/go-tpm v0.9.6/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= +github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= +github.com/graphql-go/handler v0.2.3 h1:CANh8WPnl5M9uA25c2GBhPqJhE53Fg0Iue/fRNla71E= +github.com/graphql-go/handler v0.2.3/go.mod h1:leLF6RpV5uZMN1CdImAxuiayrYYhOk33bZciaUGaXeU= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0 h1:U+kC2dOhMFQctRfhK0gRctKAPTloZdMU5ZJxaesJ/VM= +github.com/hashicorp/go-secure-stdlib/parseutil v0.2.0/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.1-vault-7 h1:ag5OxFVy3QYTFTJODRzTKVZ6xvdfLLCA1cy/Y6xGI0I= +github.com/hashicorp/hcl v1.0.1-vault-7/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/vault-client-go v0.4.3 h1:zG7STGVgn/VK6rnZc0k8PGbfv2x/sJExRKHSUg3ljWc= +github.com/hashicorp/vault-client-go v0.4.3/go.mod h1:4tDw7Uhq5XOxS1fO+oMtotHL7j4sB9cp0T7U6m4FzDY= +github.com/hashicorp/vault/api v1.15.0 h1:O24FYQCWwhwKnF7CuSqP30S51rTV7vz1iACXE/pj5DA= +github.com/hashicorp/vault/api v1.15.0/go.mod h1:+5YTO09JGn0u+b6ySD/LLVf8WkJCPLAL2Vkmrn2+CM8= +github.com/hashicorp/vault/sdk v0.15.0 h1:xNo1lL2shm0yE4coXNZkTV/6++2GfEh+/cCAfBjzEnA= +github.com/hashicorp/vault/sdk v0.15.0/go.mod h1:2Wj2tHIgfz0gNWgEPWBbCXFIiPrq96E8FTjPNV9J1Bc= +github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.7.2 h1:mLoDLV6sonKlvjIEsV56SkWNCnuNv531l94GaIzO+XI= +github.com/jackc/pgx/v5 v5.7.2/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= +github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= +github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.9 h1:66ze0taIn2H33fBvCkXuv9BmCwDfafmiIVpKV9kKGuY= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/liamg/memoryfs v1.6.0 h1:jAFec2HI1PgMTem5gR7UT8zi9u4BfG5jorCRlLH06W8= +github.com/liamg/memoryfs v1.6.0/go.mod h1:z7mfqXFQS8eSeBBsFjYLlxYRMRyiPktytvYCYTb3BSk= +github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= +github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 h1:PwQumkgq4/acIiZhtifTV5OUqqiP82UAl0h87xj/l9k= +github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU= +github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= +github.com/mdelapenya/tlscert v0.2.0 h1:7H81W6Z/4weDvZBNOfQte5GpIMo0lGYEeWbkGp5LJHI= +github.com/mdelapenya/tlscert v0.2.0/go.mod h1:O4njj3ELLnJjGdkN7M/vIVCpZ+Cf0L6muqOG4tLSl8o= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= +github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 h1:r80LLQ91uOLxU1ElAvrB1o8oBsph51lPzVnr7t2b200= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991/go.mod h1:6MddWPSL5jxy+W8eMMHWDOfZzzRRKWXPZqajw72YHBc= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= +github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= +github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= +github.com/nats-io/nats-server/v2 v2.12.1 h1:0tRrc9bzyXEdBLcHr2XEjDzVpUxWx64aZBm7Rl1QDrA= +github.com/nats-io/nats-server/v2 v2.12.1/go.mod h1:OEaOLmu/2e6J9LzUt2OuGjgNem4EpYApO5Rpf26HDs8= +github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= +github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.22.1 h1:QW7tbJAUDyVDVOM5dFa7qaybo+CRfR7bemlQUN6Z8aM= +github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= +github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= +github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= +github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= +github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU= +github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea h1:0hdZfdf74rU/bEndy2uZJyNeY21jmH751KmdAjOmEiA= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/redis/rueidis v1.0.56 h1:DwPjFIgas1OMU/uCqBELOonu9TKMYt3MFPq6GtwEWNY= +github.com/redis/rueidis v1.0.56/go.mod h1:g660/008FMYmAF46HG4lmcpcgFNj+jCjCAZUUM+wEbs= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= +github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= +github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= +github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v4 v4.25.9 h1:JImNpf6gCVhKgZhtaAHJ0serfFGtlfIlSC08eaKdTrU= +github.com/shirou/gopsutil/v4 v4.25.9/go.mod h1:gxIxoC+7nQRwUl/xNhutXlD8lq+jxTgpIkEf3rADHL8= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/testcontainers/testcontainers-go v0.37.0 h1:L2Qc0vkTw2EHWQ08djon0D2uw7Z/PtHS/QzZZ5Ra/hg= +github.com/testcontainers/testcontainers-go v0.37.0/go.mod h1:QPzbxZhQ6Bclip9igjLFj6z0hs01bU8lrl2dHQmgFGM= +github.com/testcontainers/testcontainers-go/modules/cassandra v0.37.0 h1:ruemoK/dW5mUzZ3UX+4x61quAa9vjtNWvo/RQdmvM3k= +github.com/testcontainers/testcontainers-go/modules/cassandra v0.37.0/go.mod h1:exJHzmEhS6bN25nCabmH2CNPzIoat1Z8zyOWv63Opt4= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1 h1:47ipPM+s+ltCDOP3Sa1j95AkNb+z+WGiHLDbLU8ixuc= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1/go.mod h1:Sqh+Ef2ESdbJQjTJl57UOkEHkOc7gXvQLg1b5xh6f1Y= +github.com/testcontainers/testcontainers-go/modules/elasticsearch v0.37.0 h1:y0ctKcwYOLmIOzamySfre5rVDPFrIncX6NC3nF+mpkY= +github.com/testcontainers/testcontainers-go/modules/elasticsearch v0.37.0/go.mod h1:PNXKFd0gALv+xOCIYM5BhtaT+aiEPY80pMNlKcx8uEs= +github.com/testcontainers/testcontainers-go/modules/gcloud v0.37.0 h1:XydZkZRpfpGas6RdxDspAc/OU+AIlTKI2ossWw/mj5w= +github.com/testcontainers/testcontainers-go/modules/gcloud v0.37.0/go.mod h1:X/H8y3to8h/EaPZcYw3CSCprcwm9R9+ZZAUjXT81X+I= +github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0 h1:ZkYNKqhqvKm+aZk9C1fxw/fpNNOK+Nm/wHPjmJdN3Ko= +github.com/testcontainers/testcontainers-go/modules/kafka v0.37.0/go.mod h1:+LvaFfSFW5PMiJTxTQlV6TBpXH1Ktk1h0FTVRZfqSxY= +github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0 h1:drGy4LJOVkIKpKGm1YKTfVzb1qRhN/konVpmuUphq0k= +github.com/testcontainers/testcontainers-go/modules/mongodb v0.37.0/go.mod h1:e9/4dGJfSZW59/kXGf/ksrEvA+BqP/daax0Usp2cpsM= +github.com/testcontainers/testcontainers-go/modules/postgres v0.37.0 h1:hsVwFkS6s+79MbKEO+W7A1wNIw1fmkMtF4fg83m6kbc= +github.com/testcontainers/testcontainers-go/modules/postgres v0.37.0/go.mod h1:Qj/eGbRbO/rEYdcRLmN+bEojzatP/+NS1y8ojl2PQsc= +github.com/testcontainers/testcontainers-go/modules/redis v0.37.0 h1:9HIY28I9ME/Zmb+zey1p/I1mto5+5ch0wLX+nJdOsQ4= +github.com/testcontainers/testcontainers-go/modules/redis v0.37.0/go.mod h1:Abu9g/25Qv+FkYVx3U4Voaynou1c+7D0HIhaQJXvk6E= +github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0 h1:eIf5TWPO7Oq/h2Hb6UVn5r/x0ucGRxcKkbNtqCRzH9k= +github.com/testcontainers/testcontainers-go/modules/valkey v0.37.0/go.mod h1:bOuF2ueLQxiK44g7y90UT2lf3qitxUHV8ax2OHrPGT4= +github.com/testcontainers/testcontainers-go/modules/vault v0.37.0 h1:4vMGutogL0vz+PV3LKlxEVKwO2AndirEkfvoTp0SHyI= +github.com/testcontainers/testcontainers-go/modules/vault v0.37.0/go.mod h1:BzVDYWZ5KZcsAN4KR/OIjM74TJt4NahOPKaKKJBI2dI= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= +github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tinylib/msgp v1.4.0 h1:SYOeDRiydzOw9kSiwdYp9UcBgPFtLU2WDHaJXyHruf8= +github.com/tinylib/msgp v1.4.0/go.mod h1:cvjFkb4RiC8qSBOPMGPSzSAx47nAsfhLVTCZZNuHv5o= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 h1:ZT8ibgassurSISJ1Pj26NsM3vY2jxFZn63Nd/TpHmRw= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302/go.mod h1:9kMVqMyQ/Sx2df5LtnGG+nbrmiZzCS7V6gjW3oGHsvI= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/twitchtv/twirp v8.1.3+incompatible h1:+F4TdErPgSUbMZMwp13Q/KgDVuI7HJXP61mNV3/7iuU= +github.com/twitchtv/twirp v8.1.3+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= +github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= +github.com/valkey-io/valkey-go v1.0.56 h1:7qp/9dqqPbYEEKeFZCnpX6nzM5XzO2MPp0iKh9+c9Wg= +github.com/valkey-io/valkey-go v1.0.56/go.mod h1:sxpCChk8i3oTG+A/lUi9Lj8C/7WI+yhnQCvDJlPVKNM= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.58.0 h1:GGB2dWxSbEprU9j0iMJHgdKYJVDyjrOwF9RE59PbRuE= +github.com/valyala/fasthttp v1.58.0/go.mod h1:SYXvHHaFp7QZHGKSHmoMipInhrI5StHrhDTYVEjK/Kw= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektah/gqlparser/v2 v2.5.25 h1:FmWtFEa+invTIzWlWK6Vk7BVEZU/97QBzeI8Z1JjGt8= +github.com/vektah/gqlparser/v2 v2.5.25/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= +github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps= +go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ= +go.mongodb.org/mongo-driver v1.17.1 h1:Wic5cJIwJgSpBhe3lx3+/RybR5PiYRMpVFgO7cOHyIM= +go.mongodb.org/mongo-driver v1.17.1/go.mod h1:wwWm/+BuOddhcq3n68LKRmgk2wXzmF6s0SFOa0GINL4= +go.mongodb.org/mongo-driver/v2 v2.2.2 h1:9cYuS3fl1Xhqwpfazso10V7BHQD58kCgtzhfAmJYz9c= +go.mongodb.org/mongo-driver/v2 v2.2.2/go.mod h1:qQkDMhCGWl3FN509DfdPd4GRBLU/41zqF/k8eTRceps= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/collector/component v1.44.0 h1:SX5UO/gSDm+1zyvHVRFgpf8J1WP6U3y/SLUXiVEghbE= +go.opentelemetry.io/collector/component v1.44.0/go.mod h1:geKbCTNoQfu55tOPiDuxLzNZsoO9//HRRg10/8WusWk= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.44.0 h1:/GeGhTD8f+FNWS7C4w1Dj0Ui9Jp4v2WAdlXyW1p3uG8= +go.opentelemetry.io/collector/featuregate v1.44.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= +go.opentelemetry.io/collector/internal/telemetry v0.138.0 h1:xHHYlPh1vVvr+ip0ct288l1joc4bsEeHh0rcY3WVXJo= +go.opentelemetry.io/collector/internal/telemetry v0.138.0/go.mod h1:evqf71fdIMXdQEofbs1bVnBUzfF6zysLMLR9bEAS9Xw= +go.opentelemetry.io/collector/pdata v1.44.0 h1:q/EfWDDKrSaf4hjTIzyPeg1ZcCRg1Uj7VTFnGfNVdk8= +go.opentelemetry.io/collector/pdata v1.44.0/go.mod h1:LnsjYysFc3AwMVh6KGNlkGKJUF2ReuWxtD9Hb3lSMZk= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.44.0 h1:EFdFBg3Wm2BlMtQbUeork5a4KFpS6haInSr+u/dk8rg= +go.opentelemetry.io/collector/pipeline v1.44.0/go.mod h1:xUrAqiebzYbrgxyoXSkk6/Y3oi5Sy3im2iCA51LwUAI= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 h1:aBKdhLVieqvwWe9A79UHI/0vgp2t/s2euY8X59pGRlw= +go.opentelemetry.io/contrib/bridges/otelzap v0.13.0/go.mod h1:SYqtxLQE7iINgh6WFuVi2AI70148B8EI35DSk0Wr8m4= +go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 h1:2ea0IkZBsWH+HA2GkD+7+hRw2u97jzdFyRtXuO14a1s= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0/go.mod h1:4m3RnBBb+7dB9d21y510oO1pdB1V4J6smNf14WXcBFQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0 h1:jwV9iQdvp38fxXi8ZC+lNpxjK16MRcZlpDYvbuO1FiA= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0/go.mod h1:f3bYiqNqhoPxkvI2LrXqQVC546K7BuRDL/kKuxkujhA= +go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= +go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= +go.opentelemetry.io/otel/log/logtest v0.14.0 h1:BGTqNeluJDK2uIHAY8lRqxjVAYfqgcaTbVk1n3MWe5A= +go.opentelemetry.io/otel/log/logtest v0.14.0/go.mod h1:IuguGt8XVP4XA4d2oEEDMVDBBCesMg8/tSGWDjuKfoA= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= +go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0/go.mod h1:VyU6dTWBWv6h9w/+DYgSZAPMabWbPTFTuxp25sM8+s0= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0 h1:i8YpvWGm/Uq1koL//bnbJ/26eV3OrKWm09+rDYo7keU= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0/go.mod h1:pQ70xHY/ZVxNUBPn+qUWPl8nwai87eWdqL3M37lNi9A= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.13.0 h1:KCkqVVV1kGg0X87TFysjCJ8MxtZEIU4Ja/yXGeoECdA= +golang.org/x/arch v0.13.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY= +golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo= +google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 h1:btBcgujH2+KIWEfz0s7Cdtt9R7hpwM4SAEXAdXf/ddw= +google.golang.org/genproto v0.0.0-20250728155136-f173205681a0/go.mod h1:Q4yZQ3kmmIyg6HsMjCGx2vQ8gzN+dntaPmFWz6Zj0fo= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= +google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 h1:0UOBWO4dC+e51ui0NFKSPbkHHiQ4TmrEfEZMLDyRmY8= +google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0/go.mod h1:8ytArBbtOy2xfht+y2fqKd5DRDJRUQhqbyEnQ4bDChs= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8 h1:M1rk8KBnUsBDg1oPGHNCxG4vc1f49epmTO7xscSajMk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251022142026-3a174f9686a8/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/examples v0.0.0-20240521165117-aea78bdf9d13 h1:ToZBOsSGyn/KRF53WzdhUloSCqZrKts9RCMJdWdyQdI= +google.golang.org/grpc/examples v0.0.0-20240521165117-aea78bdf9d13/go.mod h1:uaPEAc5V00jjG3DPhGFLXGT290RUV3+aNQigs1W50/8= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= +gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= +gorm.io/driver/postgres v1.5.5 h1:r1VBTQQrOAlUux3JI9V7rdxVWBPPnzxa315qNJUzmjI= +gorm.io/driver/postgres v1.5.5/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= +gorm.io/driver/sqlite v1.5.7 h1:8NvsrhP0ifM7LX9G4zPB97NwovUakUxc+2V2uuf3Z1I= +gorm.io/driver/sqlite v1.5.7/go.mod h1:U+J8craQU6Fzkcvu8oLeAQmi50TkwPEhHDEjQZXDah4= +gorm.io/driver/sqlserver v1.4.2 h1:nMtEeKqv2R/vv9FoHUFWfXfP6SskAgRar0TPlZV1stk= +gorm.io/driver/sqlserver v1.4.2/go.mod h1:XHwBuB4Tlh7DqO0x7Ema8dmyWsQW7wi38VQOAFkrbXY= +gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8= +gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.32.2 h1:bZrMLEkgizC24G9eViHGOPbW+aRo9duEISRIJKfdJuw= +k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.26.7 h1:NX/zBZZn4R+Cq6shwyn8Pn8REd0yJJ16dbtv9WkEVEU= +k8s.io/apiserver v0.26.7/go.mod h1:r0wDRWHI7VL/KlQLTkJJBVGZ3KeNfv+VetlyRtr86xs= +k8s.io/client-go v0.32.2 h1:4dYCD4Nz+9RApM2b/3BtVvBHw54QjMFUl1OLcJG5yOA= +k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= +k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +tags.cncf.io/container-device-interface v0.8.1 h1:c0jN4Mt6781jD67NdPajmZlD1qrqQyov/Xfoab37lj0= +tags.cncf.io/container-device-interface v0.8.1/go.mod h1:Apb7N4VdILW0EVdEMRYXIDVRZfNJZ+kmEUss2kRRQ6Y= diff --git a/internal/orchestrion/_integration/gocql/base.go b/internal/orchestrion/_integration/gocql/base.go new file mode 100644 index 0000000000..c8206c01a2 --- /dev/null +++ b/internal/orchestrion/_integration/gocql/base.go @@ -0,0 +1,132 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package gocql + +import ( + "context" + "net" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gocql/gocql" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + testcassandra "github.com/testcontainers/testcontainers-go/modules/cassandra" +) + +type base struct { + container *testcassandra.CassandraContainer + session *gocql.Session + hostPort string + port string +} + +func (b *base) setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + b.container, err = testcassandra.Run(ctx, + "cassandra:4.1", + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, b.container) + + b.hostPort, err = b.container.ConnectionHost(ctx) + require.NoError(t, err) + + _, b.port, err = net.SplitHostPort(b.hostPort) + require.NoError(t, err) +} + +func (b *base) run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + err := b.session. + Query("CREATE KEYSPACE if not exists trace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor': 1}"). + WithContext(ctx). + Exec() + require.NoError(t, err) + + err = b.session. + Query("CREATE TABLE if not exists trace.person (name text PRIMARY KEY, age int, description text)"). + WithContext(ctx). + Exec() + require.NoError(t, err) + + err = b.session. + Query("INSERT INTO trace.person (name, age, description) VALUES ('Cassandra', 100, 'A cruel mistress')"). + WithContext(ctx). + Exec() + require.NoError(t, err) +} + +func (b *base) expectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "cassandra.query", + "service": "gocql.query", + "resource": "CREATE KEYSPACE if not exists trace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor': 1}", + "type": "cassandra", + }, + Meta: map[string]string{ + "component": "gocql/gocql", + "span.kind": "client", + "db.system": "cassandra", + "out.port": b.port, + "cassandra.cluster": "Test Cluster", + "cassandra.datacenter": "datacenter1", + }, + }, + { + Tags: map[string]any{ + "name": "cassandra.query", + "service": "gocql.query", + "resource": "CREATE TABLE if not exists trace.person (name text PRIMARY KEY, age int, description text)", + "type": "cassandra", + }, + Meta: map[string]string{ + "component": "gocql/gocql", + "span.kind": "client", + "db.system": "cassandra", + "out.port": b.port, + "cassandra.cluster": "Test Cluster", + "cassandra.datacenter": "datacenter1", + }, + }, + { + Tags: map[string]any{ + "name": "cassandra.query", + "service": "gocql.query", + "resource": "INSERT INTO trace.person (name, age, description) VALUES ('Cassandra', 100, 'A cruel mistress')", + "type": "cassandra", + }, + Meta: map[string]string{ + "component": "gocql/gocql", + "span.kind": "client", + "db.system": "cassandra", + "out.port": b.port, + "cassandra.cluster": "Test Cluster", + "cassandra.datacenter": "datacenter1", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/gocql/generated_test.go b/internal/orchestrion/_integration/gocql/generated_test.go new file mode 100644 index 0000000000..f28ced6b83 --- /dev/null +++ b/internal/orchestrion/_integration/gocql/generated_test.go @@ -0,0 +1,28 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package gocql + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestNewCluster(t *testing.T) { + harness.Run(t, new(TestCaseNewCluster)) +} + +func TestStructLiteral(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteral)) +} + +func TestStructLiteralPtr(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteralPtr)) +} diff --git a/internal/orchestrion/_integration/gocql/new_cluster.go b/internal/orchestrion/_integration/gocql/new_cluster.go new file mode 100644 index 0000000000..fdded3cbb8 --- /dev/null +++ b/internal/orchestrion/_integration/gocql/new_cluster.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package gocql + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gocql/gocql" + "github.com/stretchr/testify/require" +) + +type TestCaseNewCluster struct { + base +} + +func (tc *TestCaseNewCluster) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + var err error + cluster := gocql.NewCluster(tc.hostPort) + tc.session, err = cluster.CreateSession() + require.NoError(t, err) + t.Cleanup(func() { tc.session.Close() }) +} + +func (tc *TestCaseNewCluster) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseNewCluster) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/gocql/struct_literal.go b/internal/orchestrion/_integration/gocql/struct_literal.go new file mode 100644 index 0000000000..9b52f0f5a1 --- /dev/null +++ b/internal/orchestrion/_integration/gocql/struct_literal.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package gocql + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gocql/gocql" + "github.com/stretchr/testify/require" +) + +type TestCaseStructLiteral struct { + base +} + +func (tc *TestCaseStructLiteral) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + var err error + cluster := gocql.ClusterConfig{ + Hosts: []string{tc.hostPort}, + CQLVersion: "3.0.0", + Timeout: 11 * time.Second, + ConnectTimeout: 11 * time.Second, + NumConns: 2, + Consistency: gocql.Quorum, + MaxPreparedStmts: 1000, + MaxRoutingKeyInfo: 1000, + PageSize: 5000, + DefaultTimestamp: true, + MaxWaitSchemaAgreement: 60 * time.Second, + ReconnectInterval: 60 * time.Second, + ConvictionPolicy: &gocql.SimpleConvictionPolicy{}, + ReconnectionPolicy: &gocql.ConstantReconnectionPolicy{MaxRetries: 3, Interval: 1 * time.Second}, + WriteCoalesceWaitTime: 200 * time.Microsecond, + } + tc.session, err = cluster.CreateSession() + require.NoError(t, err) + t.Cleanup(func() { tc.session.Close() }) +} + +func (tc *TestCaseStructLiteral) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseStructLiteral) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/gocql/struct_literal_ptr.go b/internal/orchestrion/_integration/gocql/struct_literal_ptr.go new file mode 100644 index 0000000000..e4df7e6043 --- /dev/null +++ b/internal/orchestrion/_integration/gocql/struct_literal_ptr.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package gocql + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gocql/gocql" + "github.com/stretchr/testify/require" +) + +type TestCaseStructLiteralPtr struct { + base +} + +func (tc *TestCaseStructLiteralPtr) Setup(ctx context.Context, t *testing.T) { + tc.setup(ctx, t) + + var err error + cluster := &gocql.ClusterConfig{ + Hosts: []string{tc.hostPort}, + CQLVersion: "3.0.0", + Timeout: 11 * time.Second, + ConnectTimeout: 11 * time.Second, + NumConns: 2, + Consistency: gocql.Quorum, + MaxPreparedStmts: 1000, + MaxRoutingKeyInfo: 1000, + PageSize: 5000, + DefaultTimestamp: true, + MaxWaitSchemaAgreement: 60 * time.Second, + ReconnectInterval: 60 * time.Second, + ConvictionPolicy: &gocql.SimpleConvictionPolicy{}, + ReconnectionPolicy: &gocql.ConstantReconnectionPolicy{MaxRetries: 3, Interval: 1 * time.Second}, + WriteCoalesceWaitTime: 200 * time.Microsecond, + } + tc.session, err = cluster.CreateSession() + require.NoError(t, err) + t.Cleanup(func() { tc.session.Close() }) +} + +func (tc *TestCaseStructLiteralPtr) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseStructLiteralPtr) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/gorilla_mux/generated_test.go b/internal/orchestrion/_integration/gorilla_mux/generated_test.go new file mode 100644 index 0000000000..2b83b2aa57 --- /dev/null +++ b/internal/orchestrion/_integration/gorilla_mux/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package gorilla_mux + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/gorilla_mux/gorilla_mux.go b/internal/orchestrion/_integration/gorilla_mux/gorilla_mux.go new file mode 100644 index 0000000000..36523464c2 --- /dev/null +++ b/internal/orchestrion/_integration/gorilla_mux/gorilla_mux.go @@ -0,0 +1,104 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gorilla_mux + +import ( + "context" + "fmt" + "io" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/gorilla/mux" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *http.Server +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + router := mux.NewRouter() + tc.Server = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + Handler: router, + } + router.HandleFunc("/ping", func(w http.ResponseWriter, _ *http.Request) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, err := io.WriteString(w, `{"message": "pong"}`) + assert.NoError(t, err) + }).Methods("GET") + + go func() { assert.ErrorIs(t, tc.Server.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.Server.Shutdown(ctx)) + }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + resp, err := http.Get(fmt.Sprintf("http://%s/ping", tc.Server.Addr)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + url := fmt.Sprintf("http://%s/ping", tc.Server.Addr) + return trace.Traces{ + { + // NB: 2 Top-level spans are from the HTTP Client/Server, which are library-side instrumented. + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "type": "http", + "service": "gorilla_mux.test", + }, + Meta: map[string]string{ + "http.url": url, + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "type": "web", + "service": "http.router", + }, + Meta: map[string]string{ + "http.url": url, + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "type": "web", + "service": "mux.router", + }, + Meta: map[string]string{ + "http.url": url, + "component": "gorilla/mux", + "span.kind": "server", + }, + Children: nil, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/gorm/generated_test.go b/internal/orchestrion/_integration/gorm/generated_test.go new file mode 100644 index 0000000000..1fb8e5f88a --- /dev/null +++ b/internal/orchestrion/_integration/gorm/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package gorm + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/gorm/gorm.go b/internal/orchestrion/_integration/gorm/gorm.go new file mode 100644 index 0000000000..3246b3c36c --- /dev/null +++ b/internal/orchestrion/_integration/gorm/gorm.go @@ -0,0 +1,91 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package gorm + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + _ "github.com/mattn/go-sqlite3" // Auto-register the sqlite3 driver + "github.com/stretchr/testify/require" + "gorm.io/driver/sqlite" + "gorm.io/gorm" +) + +type TestCase struct { + *gorm.DB +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + var err error + tc.DB, err = gorm.Open(sqlite.Open("file::memory:")) + require.NoError(t, err) + + require.NoError(t, tc.DB.AutoMigrate(&Note{})) + + require.NoError(t, tc.DB.CreateInBatches([]Note{ + {UserID: 1, Content: `Hello, John. This is John. You are leaving a note for yourself. You are welcome and thank you.`}, + {UserID: 1, Content: `Hey, remember to mow the lawn.`}, + {UserID: 2, Content: `Reminder to submit that report by Thursday.`}, + {UserID: 2, Content: `Opportunities don't happen, you create them.`}, + {UserID: 3, Content: `Pick up cabbage from the store on the way home.`}, + {UserID: 3, Content: `Review PR #1138`}, + }, 10).Error) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + var note Note + require.NoError(t, tc.DB.WithContext(ctx).Where("user_id = ?", 2).First(¬e).Error) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "gorm.query", + "service": "gorm.db", + }, + Meta: map[string]string{ + "component": "gorm.io/gorm.v1", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "sqlite3.query", + "service": "sqlite3.db", + }, + Meta: map[string]string{ + "component": "database/sql", + "span.kind": "client", + "db.system": "other_sql", + }, + }, + }, + }, + }, + }, + } +} + +type Note struct { + gorm.Model + UserID int + Content string +} diff --git a/internal/orchestrion/_integration/graph-gophers/generated_test.go b/internal/orchestrion/_integration/graph-gophers/generated_test.go new file mode 100644 index 0000000000..219ac41d05 --- /dev/null +++ b/internal/orchestrion/_integration/graph-gophers/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package graphgophers + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/graph-gophers/graphql-go.go b/internal/orchestrion/_integration/graph-gophers/graphql-go.go new file mode 100644 index 0000000000..9225a9b2a2 --- /dev/null +++ b/internal/orchestrion/_integration/graph-gophers/graphql-go.go @@ -0,0 +1,125 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package graphgophers + +import ( + "bytes" + "context" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/graph-gophers/graphql-go" + "github.com/graph-gophers/graphql-go/relay" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + server *httptest.Server +} + +const schema = ` + schema { + query: Query + } + type Query { + hello: String! + } +` + +type resolver struct{} + +func (*resolver) Hello() string { + return "Hello, world!" +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + schema, err := graphql.ParseSchema(schema, new(resolver)) + require.NoError(t, err) + + tc.server = httptest.NewServer(&relay.Handler{Schema: schema}) + t.Cleanup(func() { tc.server.Close() }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + req, err := http.NewRequest(http.MethodPost, tc.server.URL, bytes.NewReader([]byte(`{"query": "{ hello }"}`))) + require.NoError(t, err) + + resp, err := http.DefaultClient.Do(req) + require.Equal(t, http.StatusOK, resp.StatusCode) + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + + var res struct { + Data struct { + Hello string + } + } + require.NoError(t, json.Unmarshal(body, &res)) + require.Equal(t, "Hello, world!", res.Data.Hello) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "type": "http", + }, + Meta: map[string]string{ + "http.method": "POST", + "http.status_code": "200", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /", + "type": "web", + }, + Meta: map[string]string{ + "http.method": "POST", + "http.status_code": "200", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.request", + "resource": "graphql.request", + "service": "graphql.server", + }, + Meta: map[string]string{ + "component": "graph-gophers/graphql-go", + "graphql.query": "{ hello }", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.field", + "resource": "graphql.field", + "service": "graphql.server", + }, + Meta: map[string]string{ + "component": "graph-gophers/graphql-go", + "graphql.field": "hello", + "graphql.type": "Query", + }, + }, + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/graphql-go/generated_test.go b/internal/orchestrion/_integration/graphql-go/generated_test.go new file mode 100644 index 0000000000..ab2fab9129 --- /dev/null +++ b/internal/orchestrion/_integration/graphql-go/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package graphql + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/graphql-go/graphql.go b/internal/orchestrion/_integration/graphql-go/graphql.go new file mode 100644 index 0000000000..9348699e83 --- /dev/null +++ b/internal/orchestrion/_integration/graphql-go/graphql.go @@ -0,0 +1,167 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package graphql + +import ( + "bytes" + "context" + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/graphql-go/graphql" + "github.com/graphql-go/handler" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + server *httptest.Server +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + schema, err := graphql.NewSchema(graphql.SchemaConfig{ + Query: graphql.NewObject(graphql.ObjectConfig{ + Name: "Query", + Fields: graphql.Fields{ + "hello": &graphql.Field{ + Name: "hello", + Type: graphql.NewNonNull(graphql.String), + Resolve: func(graphql.ResolveParams) (any, error) { + return "Hello, world!", nil + }, + }, + }, + }, + ), + }) + require.NoError(t, err) + + tc.server = httptest.NewServer(handler.New(&handler.Config{Schema: &schema})) + t.Cleanup(func() { tc.server.Close() }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + req, err := http.NewRequest("POST", tc.server.URL, bytes.NewReader([]byte(`{"query": "{ hello }"}`))) + require.NoError(t, err) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer req.Body.Close() + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + + var res struct { + Data struct { + Hello string + } + } + require.NoError(t, json.Unmarshal(body, &res)) + require.Equal(t, "Hello, world!", res.Data.Hello) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "type": "http", + }, + Meta: map[string]string{ + "http.method": "POST", + "http.status_code": "200", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /", + "type": "web", + }, + Meta: map[string]string{ + "http.method": "POST", + "http.status_code": "200", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.server", + "resource": "graphql.server", + "service": "graphql.server", + "type": "graphql", + }, + Meta: map[string]string{ + "component": "graphql-go/graphql", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.parse", + "resource": "graphql.parse", + "service": "graphql.server", + "type": "graphql", + }, + Meta: map[string]string{ + "component": "graphql-go/graphql", + "span.kind": "server", + }, + }, + { + Tags: map[string]any{ + "name": "graphql.validate", + "resource": "graphql.validate", + "service": "graphql.server", + "type": "graphql", + }, + Meta: map[string]string{ + "component": "graphql-go/graphql", + "graphql.source": "{ hello }", + "span.kind": "server", + }, + }, + { + Tags: map[string]any{ + "name": "graphql.execute", + "resource": "graphql.execute", + "service": "graphql.server", + "type": "graphql", + }, + Meta: map[string]string{ + "component": "graphql-go/graphql", + "graphql.source": "{ hello }", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "graphql.resolve", + "resource": "Query.hello", + "service": "graphql.server", + "type": "graphql", + }, + Meta: map[string]string{ + "component": "graphql-go/graphql", + "graphql.field": "hello", + "graphql.operation.type": "query", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/grpc/generated_test.go b/internal/orchestrion/_integration/grpc/generated_test.go new file mode 100644 index 0000000000..6a5e31309c --- /dev/null +++ b/internal/orchestrion/_integration/grpc/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package grpc + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/grpc/grpc.go b/internal/orchestrion/_integration/grpc/grpc.go new file mode 100644 index 0000000000..41472eaf68 --- /dev/null +++ b/internal/orchestrion/_integration/grpc/grpc.go @@ -0,0 +1,109 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package grpc + +import ( + "context" + "net" + "sync/atomic" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/examples/helloworld/helloworld" +) + +type TestCase struct { + *grpc.Server + addr string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + lis, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + tc.addr = lis.Addr().String() + + var ( + interceptedDirect atomic.Bool + interceptedChain atomic.Bool + ) + tc.Server = grpc.NewServer( + // Register a bunch of interceptors to ensure ours does not cause a runtime crash. + grpc.UnaryInterceptor(func(ctx context.Context, req any, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) { + interceptedDirect.Store(true) + return handler(ctx, req) + }), + grpc.ChainUnaryInterceptor(func(ctx context.Context, req any, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) { + interceptedChain.Store(true) + return handler(ctx, req) + }), + ) + helloworld.RegisterGreeterServer(tc.Server, &server{}) + + go func() { assert.NoError(t, tc.Server.Serve(lis)) }() + t.Cleanup(func() { + tc.Server.GracefulStop() + assert.True(t, interceptedDirect.Load(), "original interceptor was not called") + assert.True(t, interceptedChain.Load(), "original chained interceptor was not called") + }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + var ( + interceptedDirect atomic.Bool + interceptedChain atomic.Bool + ) + + conn, err := grpc.NewClient( + tc.addr, + // Register a bunch of interceptors to ensure ours does not cause a runtime crash. + grpc.WithTransportCredentials(insecure.NewCredentials()), + grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + interceptedDirect.Store(true) + return invoker(ctx, method, req, reply, cc, opts...) + }), + grpc.WithChainUnaryInterceptor(func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + interceptedChain.Store(true) + return invoker(ctx, method, req, reply, cc, opts...) + }), + ) + require.NoError(t, err) + defer func() { require.NoError(t, conn.Close()) }() + + client := helloworld.NewGreeterClient(conn) + resp, err := client.SayHello(ctx, &helloworld.HelloRequest{Name: "rob"}) + require.NoError(t, err) + require.Equal(t, "Hello rob", resp.GetMessage()) + + assert.True(t, interceptedDirect.Load(), "original interceptor was not called") + assert.True(t, interceptedChain.Load(), "original chained interceptor was not called") +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "grpc.client", + "service": "grpc.client", + "resource": "/helloworld.Greeter/SayHello", + "type": "rpc", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "grpc.server", + "service": "grpc.server", + "resource": "/helloworld.Greeter/SayHello", + "type": "rpc", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/grpc/server.go b/internal/orchestrion/_integration/grpc/server.go new file mode 100644 index 0000000000..0ad673558a --- /dev/null +++ b/internal/orchestrion/_integration/grpc/server.go @@ -0,0 +1,44 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// +// This file was copied from the grpc-go repository at https://github.com/grpc/grpc-go +// This file is published according to the Apache License Version 2.0 and copyright is +// held by gRPC authors as detailed in the license below: +// +// +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// + +package grpc + +import ( + "context" + + pb "google.golang.org/grpc/examples/helloworld/helloworld" +) + +// server is used to implement helloworld.GreeterServer. +type server struct { + pb.UnimplementedGreeterServer +} + +// SayHello implements helloworld.GreeterServer +func (*server) SayHello(_ context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { + return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil +} diff --git a/internal/orchestrion/_integration/ibm_sarama/generated_test.go b/internal/orchestrion/_integration/ibm_sarama/generated_test.go new file mode 100644 index 0000000000..59aaf33927 --- /dev/null +++ b/internal/orchestrion/_integration/ibm_sarama/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package ibm_sarama + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/ibm_sarama/ibm_sarama.go b/internal/orchestrion/_integration/ibm_sarama/ibm_sarama.go new file mode 100644 index 0000000000..1741478cce --- /dev/null +++ b/internal/orchestrion/_integration/ibm_sarama/ibm_sarama.go @@ -0,0 +1,140 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package ibm_sarama + +import ( + "context" + "errors" + "fmt" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/IBM/sarama" + "github.com/cenkalti/backoff/v4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go/modules/kafka" +) + +const ( + topic = "ibm_sarama_default_test" + partition = int32(0) +) + +type TestCase struct { + server *kafka.KafkaContainer + cfg *sarama.Config + addrs []string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + tc.cfg = sarama.NewConfig() + tc.cfg.Version = sarama.V0_11_0_0 + tc.cfg.Producer.Return.Successes = true + + container, addr := containers.StartKafkaTestContainer(t, []string{topic}) + tc.server = container + tc.addrs = []string{addr} +} + +func produceMessage(_ context.Context, t *testing.T, addrs []string, cfg *sarama.Config) { + t.Helper() + + producer, err := backoff.RetryWithData( + func() (_ sarama.SyncProducer, err error) { + defer func() { + if r := recover(); r != nil { + if e, ok := r.(error); ok { + err = errors.Join(err, fmt.Errorf("panic: %w", e)) + } else { + err = errors.Join(err, fmt.Errorf("panic: %v", r)) + } + } + }() + + return sarama.NewSyncProducer(addrs, cfg) + }, + backoff.NewExponentialBackOff(), + ) + + require.NoError(t, err, "failed to create producer") + defer func() { assert.NoError(t, producer.Close(), "failed to close producer") }() + + _, _, err = producer.SendMessage(&sarama.ProducerMessage{ + Topic: topic, + Partition: partition, + Value: sarama.StringEncoder("Hello, World!"), + }) + require.NoError(t, err, "failed to send message") + _, _, err = producer.SendMessage(&sarama.ProducerMessage{ + Topic: topic, + Partition: partition, + Value: sarama.StringEncoder("Another message to avoid flaky tests"), + }) + require.NoError(t, err, "failed to send message") +} + +func consumeMessage(t *testing.T, addrs []string, cfg *sarama.Config) { + t.Helper() + + consumer, err := sarama.NewConsumer(addrs, cfg) + require.NoError(t, err, "failed to create consumer") + defer func() { assert.NoError(t, consumer.Close(), "failed to close consumer") }() + + partitionConsumer, err := consumer.ConsumePartition(topic, partition, sarama.OffsetOldest) + require.NoError(t, err, "failed to create partition consumer") + defer func() { assert.NoError(t, partitionConsumer.Close(), "failed to close partition consumer") }() + + expectedMessages := []string{"Hello, World!", "Another message to avoid flaky tests"} + for i := 0; i < len(expectedMessages); i++ { + select { + case msg := <-partitionConsumer.Messages(): + require.Equal(t, expectedMessages[i], string(msg.Value)) + case <-time.After(15 * time.Second): + t.Fatal("timed out waiting for message") + } + } +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + produceMessage(ctx, t, tc.addrs, tc.cfg) + consumeMessage(t, tc.addrs, tc.cfg) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "IBM/sarama", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "IBM/sarama", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/integration_test.go b/internal/orchestrion/_integration/integration_test.go new file mode 100644 index 0000000000..22101aa60e --- /dev/null +++ b/internal/orchestrion/_integration/integration_test.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package integration_test + +import ( + "testing" + + "github.com/DataDog/orchestrion/runtime/built" + "github.com/stretchr/testify/require" +) + +//go:generate go run github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/generator + +func TestOrchestrionPresent(t *testing.T) { + require.True(t, built.WithOrchestrion, "this test was not built with orchestrion enabled") +} diff --git a/internal/orchestrion/_integration/internal/agent/agent.go b/internal/orchestrion/_integration/internal/agent/agent.go new file mode 100644 index 0000000000..e4c2a0a358 --- /dev/null +++ b/internal/orchestrion/_integration/internal/agent/agent.go @@ -0,0 +1,187 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package agent + +import ( + "encoding/json" + "io" + "net/http" + "net/http/httptest" + "net/url" + "strings" + "sync" + "testing" + + pb "github.com/DataDog/datadog-agent/pkg/proto/pbgo/trace" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type MockAgent struct { + T *testing.T + mu sync.RWMutex + payloads []pb.Traces + srv *httptest.Server +} + +func (m *MockAgent) ServeHTTP(w http.ResponseWriter, req *http.Request) { + m.T.Logf("mockagent: handling request: %s", req.URL.String()) + + // Put a custom tag on the span generated to skip it in assertions. + span, _ := tracer.SpanFromContext(req.Context()) + span.SetTag("mockagent.span", true) + + switch req.URL.Path { + case "/v0.4/traces": + m.handleTraces(req) + default: + m.T.Logf("mockagent: handler not implemented for path: %s", req.URL.String()) + } + + w.WriteHeader(200) + _, err := w.Write([]byte("{}")) + assert.NoError(m.T, err) +} + +func (m *MockAgent) handleTraces(req *http.Request) { + var payload pb.Traces + err := decodeRequest(req, &payload) + require.NoError(m.T, err) + + m.mu.Lock() + defer m.mu.Unlock() + m.payloads = append(m.payloads, payload) +} + +func decodeRequest(req *http.Request, dest *pb.Traces) error { + b, err := io.ReadAll(req.Body) + if err != nil { + return err + } + defer req.Body.Close() + + _, err = dest.UnmarshalMsg(b) + return err +} + +func New(t *testing.T) *MockAgent { + return &MockAgent{T: t} +} + +func (m *MockAgent) Start(t *testing.T) { + m.T.Log("mockagent: starting") + + srv := httptest.NewServer(m) + m.srv = srv + t.Cleanup(srv.Close) + + srvURL, err := url.Parse(srv.URL) + require.NoError(t, err) + + // Increase WAF timeout to avoid flakiness due to ungodly slow CI hosts. + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "1s") + // Neutralize API Security sampling (always-keep), to prevent tests becoming flaky. + t.Setenv("DD_API_SECURITY_SAMPLE_DELAY", "0") + + tracer.Start( + tracer.WithAgentAddr(srvURL.Host), + tracer.WithSampler(tracer.NewAllSampler()), + tracer.WithLogStartup(false), + tracer.WithLogger(testLogger{t}), + tracer.WithAppSecEnabled(true), + ) + t.Cleanup(tracer.Stop) +} + +func (m *MockAgent) Traces(t *testing.T) trace.Traces { + m.T.Log("mockagent: fetching spans") + + tracer.Flush() + tracer.Stop() + m.srv.Close() + + m.mu.RLock() + defer m.mu.RUnlock() + + spansByID := make(map[trace.ID]*trace.Trace) + for _, payload := range m.payloads { + for _, spans := range payload { + for _, span := range spans { + b, err := json.Marshal(span) + require.NoError(t, err) + + var tr trace.Trace + err = json.Unmarshal(b, &tr) + require.NoError(t, err) + + spansByID[trace.ID(span.SpanID)] = &tr + } + } + } + + // If span are filtered we remove all their children as well + keptSpansByID := make(map[trace.ID]*trace.Trace) + for id, span := range spansByID { + if filterInternalSpans(t, span, m.srv.URL) { + keptSpansByID[id] = span + continue + } + + t.Logf("mockagent: filtering out span %d: %s", id, span.String()) + } + + var result trace.Traces + for _, span := range keptSpansByID { + if span.ParentID == 0 { + result = append(result, span) + continue + } + parent, ok := keptSpansByID[span.ParentID] + if ok { + parent.Children = append(parent.Children, span) + } + } + return result +} + +// filterInternalSpans recursively checks the spans in the trace to ensure that that no spans a created as a result of +// connection to the agent or any agentless HTTP call and also filters out any spans that are created by the testing framework +func filterInternalSpans(t *testing.T, trace *trace.Trace, agentHost string) bool { + t.Helper() + if trace == nil { + return false + } + + if _, ok := trace.Meta["mockagent.span"]; ok { + // This span is created by the mock agent to skip it in assertions + return false + } + + // Make sure no spans are created from a connection to the agent + if strings.Contains(trace.Meta["http.url"], agentHost) { + assert.Fail(t, "trace should not contain the agent host URL %s: %s", agentHost, trace.String()) + return false + } + + // Make sure no spans are created from any agentless http call + if strings.Contains(trace.Meta["http.url"], "datadoghq") { + assert.Fail(t, "trace should not contain a datadog URL: %s", trace.String()) + return false + } + + return true +} + +type testLogger struct { + *testing.T +} + +func (l testLogger) Log(msg string) { + l.T.Log(msg) +} diff --git a/internal/orchestrion/_integration/internal/generator/main.go b/internal/orchestrion/_integration/internal/generator/main.go new file mode 100644 index 0000000000..c75b142ab7 --- /dev/null +++ b/internal/orchestrion/_integration/internal/generator/main.go @@ -0,0 +1,164 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package main + +import ( + _ "embed" // For go:embed + "go/ast" + "go/parser" + "go/token" + "io/fs" + "log" + "os" + "path/filepath" + "runtime" + "slices" + "strings" + "text/template" +) + +const ( + genTestName = "generated_test.go" +) + +var ( + //go:embed test.go.tmpl + testGoTemplateText string + testGoTemplate = template.Must(template.New("test.go").Parse(testGoTemplateText)) +) + +func main() { + _, thisFile, _, _ := runtime.Caller(0) + rootDir := filepath.Join(thisFile, "..", "..", "..") + + files, err := os.ReadDir(rootDir) + if err != nil { + log.Fatalf("Failed listing %s: %v\n", rootDir, err) + } + + for _, file := range files { + if !file.IsDir() || file.Name() == "internal" || file.Name() == "testdata" { + continue + } + + testDir := filepath.Join(rootDir, file.Name()) + testData := parseCode(testDir) + if len(testData.Cases) == 0 { + continue + } + + if err := testData.generate(filepath.Join(testDir, genTestName)); err != nil { + log.Fatalln(err) + } + } +} + +type ( + testCases struct { + BuildConstraint string + PkgName string + Cases []testCase + } + testCase struct { + TestName string + ClassName string + } +) + +func parseCode(testDir string) testCases { + fset := token.NewFileSet() + pkgs, err := parser.ParseDir( + fset, + testDir, + func(fi fs.FileInfo) bool { return fi.Name() != genTestName }, + parser.ParseComments, + ) + if err != nil { + log.Fatalf("failed to parse AST for dir: %s\n", err.Error()) + } + if len(pkgs) != 1 { + log.Fatalf("%s: expected exactly 1 package, got %d", testDir, len(pkgs)) + } + + var ( + pkgName string + pkg *ast.Package + ) + for name, val := range pkgs { + // NB -- There is exactly 1 item in the map + pkgName = name + pkg = val + } + + var ( + buildConstraint string + cases []testCase + ) + for _, f := range pkg.Files { + if constraint := getBuildConstraint(f); len(constraint) > len(buildConstraint) { + buildConstraint = constraint + } + + for _, decl := range f.Decls { + gd, ok := decl.(*ast.GenDecl) + if !ok || gd.Tok != token.TYPE { + continue + } + for _, sp := range gd.Specs { + typeSpec, ok := sp.(*ast.TypeSpec) + if !ok { + continue + } + name := typeSpec.Name.String() + if strings.HasPrefix(name, "TestCase") { + testName := name[8:] + cases = append(cases, testCase{TestName: testName, ClassName: name}) + } + } + } + } + + // ensure order in test cases as well and remove repeated elements (e.g. in case of different OS implementations) + slices.SortFunc(cases, func(lhs testCase, rhs testCase) int { return strings.Compare(lhs.TestName, rhs.TestName) }) + cases = slices.Compact(cases) + + return testCases{BuildConstraint: buildConstraint, PkgName: pkgName, Cases: cases} +} + +func (t *testCases) generate(filename string) error { + file, err := os.Create(filename) + if err != nil { + return err + } + defer file.Close() + + tmpl, err := testGoTemplate.Clone() + if err != nil { + return err + } + + return tmpl.Execute(file, t) +} + +func getBuildConstraint(f *ast.File) string { + pkgPos := f.Package + for _, grp := range f.Comments { + for _, cmt := range grp.List { + if cmt.Slash > pkgPos { + return "" + } + + if strings.HasPrefix(cmt.Text, "//go:build ") { + return cmt.Text[11:] + } + if cmt.Text == "//generator:ignore-build-constraint" { + return "" + } + } + } + + return "" +} diff --git a/internal/orchestrion/_integration/internal/generator/test.go.tmpl b/internal/orchestrion/_integration/internal/generator/test.go.tmpl new file mode 100644 index 0000000000..8e06b8152d --- /dev/null +++ b/internal/orchestrion/_integration/internal/generator/test.go.tmpl @@ -0,0 +1,24 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. +{{- with .BuildConstraint }} + +//go:build {{ . }} +{{- end }} + +package {{ .PkgName }} + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) +{{- range .Cases }} + +func Test{{ with .TestName }}{{ . }}{{ end }}(t *testing.T) { + harness.Run(t, new({{ .ClassName }})) +} +{{- end }} diff --git a/internal/orchestrion/_integration/internal/harness/harness.go b/internal/orchestrion/_integration/internal/harness/harness.go new file mode 100644 index 0000000000..24b528dc5f --- /dev/null +++ b/internal/orchestrion/_integration/internal/harness/harness.go @@ -0,0 +1,76 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package harness + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/agent" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/DataDog/orchestrion/runtime/built" + "github.com/stretchr/testify/require" +) + +// TestCase describes the general contract for tests. Each package in this +// directory is expected to export a [TestCase] structure implementing this +// interface. +type TestCase interface { + // Setup is called before the test is run. It should be used to prepare any + // the test for execution, such as starting up services (e.g, databse servers) + // or setting up test data. The Setup function can call [testing.T.SkipNow] to + // skip the test entirely, for example if prerequisites of its dependencies + // are not satisfied by the test environment. + // + // The tracer is not yet started when Setup is executed. + Setup(context.Context, *testing.T) + + // Run executes the test case after starting the tracer. This should perform + // the necessary calls to produce trace information from injected + // instrumentation, and assert on expected post-conditions (e.g, HTTP request + // is expected to be successful, database call does not error out, etc...). + // The tracer is shut down after the Run function returns, ensuring + // outstanding spans are flushed to the agent. + Run(context.Context, *testing.T) + + // ExpectedTraces returns a trace.Traces object describing all traces expected + // to be produced by the [TestCase.Run] function. There should be one entry + // per trace root span expected to be produced. Every item in the returned + // [trace.Traces] must match at least one trace received by the agent during + // the test run. + ExpectedTraces() trace.Traces +} + +func Run(t *testing.T, tc TestCase) { + t.Helper() + require.True(t, built.WithOrchestrion, "this test suite must be run with orchestrion enabled") + + mockAgent := agent.New(t) + + ctx := context.Background() + if deadline, ok := t.Deadline(); ok { + var cancel context.CancelFunc + ctx, cancel = context.WithDeadline(context.Background(), deadline) + defer cancel() + } + + t.Log("Running setup") + tc.Setup(ctx, t) + mockAgent.Start(t) + + t.Log("Running test") + tc.Run(ctx, t) + + got := mockAgent.Traces(t) + t.Logf("Received %d traces", len(got)) + for i, tr := range got { + t.Logf("[%d] Trace contains a total of %d spans:\n%v", i, tr.NumSpans(), tr) + } + + for _, expected := range tc.ExpectedTraces() { + expected.RequireAnyMatch(t, got) + } +} diff --git a/internal/orchestrion/_integration/internal/net/free-port.go b/internal/orchestrion/_integration/internal/net/free-port.go new file mode 100644 index 0000000000..6255e32f37 --- /dev/null +++ b/internal/orchestrion/_integration/internal/net/free-port.go @@ -0,0 +1,24 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package net + +import ( + "net" + "testing" + + "github.com/stretchr/testify/require" +) + +// FreePort returns a random free port. +func FreePort(t testing.TB) int { + t.Helper() + li, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + addr := li.Addr() + require.NoError(t, li.Close()) + tcpAddr, _ := addr.(*net.TCPAddr) + return tcpAddr.Port +} diff --git a/internal/orchestrion/_integration/internal/trace/diff.go b/internal/orchestrion/_integration/internal/trace/diff.go new file mode 100644 index 0000000000..9a3f13203c --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/diff.go @@ -0,0 +1,140 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package trace + +import ( + "fmt" + "sort" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/xlab/treeprint" +) + +type Diff treeprint.Tree + +const ( + markerAdded = "+" + markerRemoved = "-" + markerChanged = "±" + markerEqual = "=" +) + +// RequireAnyMatch asserts that any of the traces in `got` corresponds to the receiver. +func (tr *Trace) RequireAnyMatch(t testing.TB, got []*Trace) { + t.Helper() + + foundTrace, diff := tr.matchesAny(got, treeprint.NewWithRoot("Root")) + if foundTrace == nil { + assert.Fail(t, "no match found for trace", diff) + } else { + t.Logf("Found matching trace:\n%s", foundTrace) + } +} + +func (tr *Trace) matchesAny(others []*Trace, diff treeprint.Tree) (*Trace, Diff) { + if len(others) == 0 { + tr.into(diff.AddMetaBranch(markerRemoved, "No spans to match against")) + return nil, diff + } + + for idx, other := range others { + id := fmt.Sprintf("Trace at index %d", idx) + if other.SpanID != 0 { + id = fmt.Sprintf("Span ID %d", other.SpanID) + } + branch := diff.AddMetaBranch(markerChanged, id) + if tr.matches(other, branch) { + return other, nil + } + } + return nil, diff +} + +// macthes determines whether the receiving span matches the other span, and +// adds difference information to the provided diff tree. +func (tr *Trace) matches(other *Trace, diff treeprint.Tree) (matches bool) { + matches = true + + keys := make([]string, 0, len(tr.Tags)) + maxLen := 1 + for key := range tr.Tags { + keys = append(keys, key) + if len := len(key); len > maxLen { + maxLen = len + } + } + sort.Strings(keys) + for _, tag := range keys { + expected := tr.Tags[tag] + actual := other.Tags[tag] + if expected != actual && (tag != "service" || fmt.Sprintf("%s.exe", expected) != actual) { + branch := diff.AddMetaBranch(markerChanged, tag) + branch.AddMetaNode(markerRemoved, expected) + branch.AddMetaNode(markerAdded, actual) + matches = false + } else { + diff.AddMetaNode(markerEqual, fmt.Sprintf("%-*s = %q", maxLen, tag, expected)) + } + } + + keys = make([]string, 0, len(tr.Meta)) + maxLen = 1 + for key := range tr.Meta { + keys = append(keys, key) + if len := len(key); len > maxLen { + maxLen = len + } + } + sort.Strings(keys) + var metaNode treeprint.Tree + for _, key := range keys { + expected := tr.Meta[key] + actual, actualExists := other.Meta[key] + if metaNode == nil { + metaNode = diff.AddBranch("meta") + } + if expected != actual { + branch := metaNode.AddMetaBranch(markerChanged, key) + branch.AddMetaNode(markerRemoved, expected) + if actualExists { + branch.AddMetaNode(markerAdded, actual) + } else { + branch.AddMetaNode(markerAdded, nil) + } + matches = false + } else { + metaNode.AddMetaNode(markerEqual, fmt.Sprintf("%-*s = %q", maxLen, key, expected)) + } + } + + var childrenNode treeprint.Tree + for idx, child := range tr.Children { + if childrenNode == nil { + childrenNode = diff.AddBranch("_children") + } + nodeName := fmt.Sprintf("At index %d", idx) + if len(other.Children) == 0 { + child.into(childrenNode.AddMetaBranch(markerRemoved, fmt.Sprintf("%s (no children to match from)", nodeName))) + matches = false + continue + } + + if span, childDiff := child.matchesAny(other.Children, treeprint.New()); span != nil { + if span.SpanID != 0 { + nodeName = fmt.Sprintf("Span #%d", span.SpanID) + } + child.into(childrenNode.AddMetaBranch(markerEqual, nodeName)) + } else { + childDiff.SetMetaValue(markerChanged) + childDiff.SetValue(nodeName) + childrenNode.AddNode(childDiff) + matches = false + } + } + + return +} diff --git a/internal/orchestrion/_integration/internal/trace/diff_test.go b/internal/orchestrion/_integration/internal/trace/diff_test.go new file mode 100644 index 0000000000..fe02a79767 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/diff_test.go @@ -0,0 +1,151 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package trace + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/xlab/treeprint" +) + +func TestTrace_matchesAny(t *testing.T) { + // 2 producer root spans with 1 consumer child span respectively + want := Traces{ + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "producer", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-A", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "consumer", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-A", + "service": "kafka", + "type": "queue", + }, + }, + }, + }, + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "producer", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-B", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + Meta: map[string]string{ + "component": "segmentio/kafka.go.v0", + "span.kind": "consumer", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-B", + "service": "kafka", + "type": "queue", + }, + }, + }, + }, + } + // got the same 4 spans, but the parent-child relationships are different + got := Traces{ + { + SpanID: 6461804313269386728, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-A", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + SpanID: 1242110709011053063, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.produce", + "resource": "Produce Topic topic-B", + "service": "kafka", + "type": "queue", + }, + Children: Traces{ + { + SpanID: 7873578434319770271, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-B", + "service": "kafka", + "type": "queue", + }, + Children: nil, + }, + }, + }, + { + SpanID: 6458862152963979372, + Meta: map[string]string{ + "messaging.system": "kafka", + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + Tags: map[string]any{ + "name": "kafka.consume", + "resource": "Consume Topic topic-A", + "service": "kafka", + "type": "queue", + }, + Children: nil, + }, + }, + }, + } + + { + // the first one should be ok, since there is a root span produce-A with a child consume-A + w := want[0] + foundTrace, diff := w.matchesAny(got, treeprint.NewWithRoot("Root")) + assert.NotNil(t, foundTrace, "trace was not found") + assert.Empty(t, diff) + } + { + // the second should not be ok, as it's not a root span. + w := want[1] + foundTrace, diff := w.matchesAny(got, treeprint.NewWithRoot("Root")) + assert.Nil(t, foundTrace) + assert.NotEmpty(t, diff) + } +} diff --git a/internal/orchestrion/_integration/internal/trace/raw.go b/internal/orchestrion/_integration/internal/trace/raw.go new file mode 100644 index 0000000000..5b3459ad23 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/raw.go @@ -0,0 +1,106 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package trace + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" +) + +// RawSpan represents a raw span from the fake agent. These spans are not linked +// together in a trace hierarchically, instead they have an `ID` and `ParentID` +// field that can be used to reconstruct the hierarchy. +type RawSpan struct { + ParentID ID `json:"parent_id"` + Trace +} + +var _ json.Unmarshaler = &RawSpan{} + +func ParseRaw(data []byte, traces *[]*Trace) error { + var rawSpanGroups [][]*RawSpan + if err := json.Unmarshal(data, &rawSpanGroups); err != nil { + return err + } + + // First pass: make the spans ID-addressable + spans := make(map[ID]*RawSpan) + for _, rawSpans := range rawSpanGroups { + for _, span := range rawSpans { + if span.SpanID == 0 { + return errors.New("invalid span (span_id is 0)") + } + spans[span.SpanID] = span + } + } + + // Second pass: build up parent-child relationships + roots := make([]*Trace, 0, len(spans)) + for _, span := range spans { + if span.ParentID == 0 { + // This is a root span + roots = append(roots, &span.Trace) + continue + } + + // This is a child span + parent, found := spans[span.ParentID] + if !found { + return fmt.Errorf("span %d has unknown parent %d", span.SpanID, span.ParentID) + } + parent.Children = append(parent.Children, &span.Trace) + } + + // We're done here! + *traces = roots + return nil +} + +func (span *RawSpan) UnmarshalJSON(data []byte) error { + span.SpanID = 0 + span.ParentID = 0 + span.Trace = Trace{Tags: make(map[string]any)} + + var raw map[string]json.RawMessage + if err := json.Unmarshal(data, &raw); err != nil { + return nil + } + + for key, value := range raw { + var err error + switch key { + case "span_id": + err = json.Unmarshal(value, &span.SpanID) + if err == nil { + span.Tags["span_id"] = json.Number(fmt.Sprintf("%d", span.SpanID)) + } + case "parent_id": + err = json.Unmarshal(value, &span.ParentID) + if err == nil { + span.Tags["parent_id"] = json.Number(fmt.Sprintf("%d", span.ParentID)) + } + case "_children": + err = json.Unmarshal(value, &span.Children) + case "meta": + err = json.Unmarshal(value, &span.Meta) + case "metrics": + err = json.Unmarshal(value, &span.Metrics) + default: + var val any + dec := json.NewDecoder(bytes.NewReader(value)) + dec.UseNumber() + err = dec.Decode(&val) + span.Tags[key] = val + } + if err != nil { + return err + } + } + + return nil +} diff --git a/internal/orchestrion/_integration/internal/trace/span.go b/internal/orchestrion/_integration/internal/trace/span.go new file mode 100644 index 0000000000..b1ded3d632 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/span.go @@ -0,0 +1,161 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package trace + +import ( + "encoding/json" + "fmt" + "sort" + "strconv" + "time" + + "github.com/xlab/treeprint" +) + +type ID uint64 + +// Trace represents the root span of a trace, which is hierarchically organized +// via the Children property. +type Trace struct { + SpanID ID `json:"span_id"` + ParentID ID `json:"parent_id"` + Meta map[string]string + Metrics map[string]float64 + Tags map[string]any + Children []*Trace +} + +type Traces = []*Trace + +func (tr *Trace) NumSpans() int { + count := 1 + for _, tr := range tr.Children { + count += tr.NumSpans() + } + return count +} + +var _ json.Unmarshaler = &Trace{} + +func (tr *Trace) UnmarshalJSON(data []byte) error { + tr.Meta = nil + tr.Tags = make(map[string]any) + tr.Children = nil + + var raw map[string]json.RawMessage + if err := json.Unmarshal(data, &raw); err != nil { + return err + } + + for key, value := range raw { + var err error + switch key { + case "_children": + err = json.Unmarshal(value, &tr.Children) + case "meta": + err = json.Unmarshal(value, &tr.Meta) + case "metrics": + err = json.Unmarshal(value, &tr.Metrics) + case "span_id": + err = json.Unmarshal(value, &tr.SpanID) + if err == nil { + tr.Tags["span_id"] = json.Number(fmt.Sprintf("%d", tr.SpanID)) + } + case "parent_id": + err = json.Unmarshal(value, &tr.ParentID) + if err == nil { + tr.Tags["parent_id"] = json.Number(fmt.Sprintf("%d", tr.ParentID)) + } + default: + var val any + err = json.Unmarshal(value, &val) + tr.Tags[key] = val + } + if err != nil { + return err + } + } + + return nil +} + +func (tr *Trace) String() string { + tree := treeprint.NewWithRoot("Root") + tr.into(tree) + return tree.String() +} + +func (tr *Trace) into(tree treeprint.Tree) { + keys := make([]string, 0, len(tr.Tags)) + maxLen := 1 + for key := range tr.Tags { + keys = append(keys, key) + if len := len(key); len > maxLen { + maxLen = len + } + } + sort.Strings(keys) + for _, tag := range keys { + tree.AddNode(fmt.Sprintf("%-*s = %s", maxLen, tag, printableSpanAttribute(tr.Tags, tag))) + } + + addMapBranch(tree, tr.Meta, "meta") + addMapBranch(tree, tr.Metrics, "metrics") + + if len(tr.Children) > 0 { + children := tree.AddBranch("_children") + for i, child := range tr.Children { + child.into(children.AddBranch(fmt.Sprintf("#%d", i))) + } + } +} + +func addMapBranch[T string | float64](tree treeprint.Tree, m map[string]T, name string) { + if len(m) > 0 { + keys := make([]string, 0, len(m)) + maxLen := 1 + for key := range m { + keys = append(keys, key) + if l := len(key); l > maxLen { + maxLen = l + } + } + sort.Strings(keys) + br := tree.AddBranch(name) + for _, key := range keys { + val := m[key] + printVal := "" + switch v := any(val).(type) { + case string: + printVal = fmt.Sprintf("%q", v) + case float64: + printVal = strconv.FormatFloat(v, 'f', -1, 64) + } + br.AddNode(fmt.Sprintf("%-*s = %s", maxLen, key, printVal)) + } + } +} + +func printableSpanAttribute(attrs map[string]any, key string) string { + val := attrs[key] + + switch t := val.(type) { + case string: + return fmt.Sprintf("%q", t) + case float64: + switch key { + case "duration": + d := time.Duration(int64(t)) * time.Nanosecond + return fmt.Sprintf("%s", d) + case "start": + tm := time.Unix(0, int64(t)) + return tm.Format(time.RFC3339Nano) + default: + return strconv.FormatFloat(t, 'f', -1, 64) + } + } + return fmt.Sprintf("%+v", val) +} diff --git a/internal/orchestrion/_integration/internal/trace/span_test.go b/internal/orchestrion/_integration/internal/trace/span_test.go new file mode 100644 index 0000000000..5677ad0cee --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/span_test.go @@ -0,0 +1,66 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package trace + +import ( + "encoding/json" + "os" + "path/filepath" + "runtime" + "strings" + "testing" + + "github.com/stretchr/testify/require" + "github.com/xlab/treeprint" + "gotest.tools/v3/golden" +) + +var testdata string + +func TestMatchesAny(t *testing.T) { + cases, err := os.ReadDir(testdata) + require.NoError(t, err) + for _, caseDir := range cases { + if !caseDir.IsDir() { + continue + } + + name := caseDir.Name() + t.Run(name, func(t *testing.T) { + t.Parallel() + + var ( + expected *Trace + actual []*Trace + ) + { + data, err := os.ReadFile(filepath.Join(testdata, name, "expected.json")) + require.NoError(t, err) + require.NoError(t, json.Unmarshal(data, &expected)) + } + { + data, err := os.ReadFile(filepath.Join(testdata, name, "actual.json")) + require.NoError(t, err) + require.NoError(t, json.Unmarshal(data, &actual)) + } + + matches, diff := expected.matchesAny(actual, treeprint.NewWithRoot("Root")) + goldFile := filepath.Join(name, "diff.txt") + if matches != nil { + golden.Assert(t, "", goldFile) + require.Empty(t, diff, 0) + } else { + require.NotEmpty(t, diff) + golden.Assert(t, strings.TrimSpace(diff.String()), goldFile) + } + }) + } +} + +func init() { + _, file, _, _ := runtime.Caller(0) + testdata = filepath.Join(file, "..", "testdata") +} diff --git a/internal/orchestrion/_integration/internal/trace/testdata/.gitattributes b/internal/orchestrion/_integration/internal/trace/testdata/.gitattributes new file mode 100644 index 0000000000..7d16cbc43a --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/.gitattributes @@ -0,0 +1 @@ +/*/diff.txt text=auto eol=lf diff --git a/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/actual.json b/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/actual.json new file mode 100644 index 0000000000..6efd4cc60e --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/actual.json @@ -0,0 +1,94 @@ +[ + { + "_children": [ + { + "duration": 53000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Query" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 1356288911239140451, + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "service": "sqlite3.db", + "span_id": 4517794747857756157, + "span_links": [], + "start": 1718181700163397000, + "trace_id": 1356288911239140451, + "type": "sql" + }, + { + "duration": 244000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.query", + "parent_id": 1356288911239140451, + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "service": "gorm.db", + "span_id": 3859718850563207054, + "span_links": [], + "start": 1718181700163280000, + "trace_id": 1356288911239140451, + "type": "sql" + } + ], + "duration": 288000, + "error": 0, + "meta": { + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4400000000", + "component": "net/http", + "http.host": "localhost:8088", + "http.method": "GET", + "http.status_code": "200", + "http.url": "http://localhost:8088/", + "http.useragent": "Mozilla/5.0 (Macintosh; Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000; fr-FR) PowerShell/7.4.2", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "server" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "http.request", + "parent_id": 0, + "resource": "GET /", + "service": "gorm", + "span_id": 1356288911239140451, + "span_links": [], + "start": 1718181700163254000, + "trace_id": 1356288911239140451, + "type": "web" + } +] diff --git a/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/diff.txt b/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/diff.txt new file mode 100644 index 0000000000..21a1f94ca8 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/diff.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/expected.json b/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/expected.json new file mode 100644 index 0000000000..96a2072f25 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/matching.out-of-order/expected.json @@ -0,0 +1,27 @@ +{ + "resource": "GET /", + "type": "web", + "name": "http.request", + "service": "gorm", + "_children": [ + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "gorm.query", + "service": "gorm.db", + "meta": { + "component": "gorm.io/gorm.v1" + } + }, + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "sqlite3.query", + "service": "sqlite3.db", + "meta": { + "component": "database/sql", + "span.kind": "client" + } + } + ] +} diff --git a/internal/orchestrion/_integration/internal/trace/testdata/matching/actual.json b/internal/orchestrion/_integration/internal/trace/testdata/matching/actual.json new file mode 100644 index 0000000000..b6b3c85fbc --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/matching/actual.json @@ -0,0 +1,500 @@ +[ + { + "duration": 12000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4300000000", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Query" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 0, + "resource": "select sqlite_version()", + "service": "sqlite3.db", + "span_id": 8562119216036163334, + "span_links": [], + "start": 1718181699667699000, + "trace_id": 8562119216036163334, + "type": "sql" + }, + { + "duration": 723000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4300000000", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Connect" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 0, + "resource": "Connect", + "service": "sqlite3.db", + "span_id": 2415977879455007178, + "span_links": [], + "start": 1718181699666959000, + "trace_id": 2415977879455007178, + "type": "sql" + }, + { + "duration": 3000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4300000000", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Ping" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 0, + "resource": "Ping", + "service": "sqlite3.db", + "span_id": 4918057500792647914, + "span_links": [], + "start": 1718181699667784000, + "trace_id": 4918057500792647914, + "type": "sql" + }, + { + "_children": [ + { + "duration": 244000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.query", + "parent_id": 1356288911239140451, + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "service": "gorm.db", + "span_id": 3859718850563207054, + "span_links": [], + "start": 1718181700163280000, + "trace_id": 1356288911239140451, + "type": "sql" + }, + { + "duration": 53000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Query" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 1356288911239140451, + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "service": "sqlite3.db", + "span_id": 4517794747857756157, + "span_links": [], + "start": 1718181700163397000, + "trace_id": 1356288911239140451, + "type": "sql" + } + ], + "duration": 288000, + "error": 0, + "meta": { + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4400000000", + "component": "net/http", + "http.host": "localhost:8088", + "http.method": "GET", + "http.status_code": "200", + "http.url": "http://localhost:8088/", + "http.useragent": "Mozilla/5.0 (Macintosh; Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000; fr-FR) PowerShell/7.4.2", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "server" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "http.request", + "parent_id": 0, + "resource": "GET /", + "service": "gorm", + "span_id": 1356288911239140451, + "span_links": [], + "start": 1718181700163254000, + "trace_id": 1356288911239140451, + "type": "web" + }, + { + "_children": [ + { + "duration": 15000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Query" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 6968926528443376939, + "resource": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", + "service": "sqlite3.db", + "span_id": 287143605162266500, + "span_links": [], + "start": 1718181699668002000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 4000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.row_query", + "parent_id": 6968926528443376939, + "resource": "SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", + "service": "gorm.db", + "span_id": 7493366002934537638, + "span_links": [], + "start": 1718181699668017000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 24000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Query" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 6968926528443376939, + "resource": "INSERT INTO `notes` (`created_at`,`updated_at`,`deleted_at`,`user_id`,`content`) VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?) RETURNING `id`", + "service": "sqlite3.db", + "span_id": 7087493916392671324, + "span_links": [], + "start": 1718181699668283000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 6000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Commit" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 6968926528443376939, + "resource": "Commit", + "service": "sqlite3.db", + "span_id": 7777340129202091335, + "span_links": [], + "start": 1718181699668382000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 9000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Begin" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 6968926528443376939, + "resource": "Begin", + "service": "sqlite3.db", + "span_id": 2633738781116025235, + "span_links": [], + "start": 1718181699668229000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 2000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.raw_query", + "parent_id": 6968926528443376939, + "resource": "CREATE INDEX `idx_notes_deleted_at` ON `notes`(`deleted_at`)", + "service": "gorm.db", + "span_id": 3678023300612749724, + "span_links": [], + "start": 1718181699668217000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 107000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Exec" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 6968926528443376939, + "resource": "CREATE TABLE `notes` (`id` integer PRIMARY KEY AUTOINCREMENT,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`user_id` integer,`content` text)", + "service": "sqlite3.db", + "span_id": 466896262057108308, + "span_links": [], + "start": 1718181699668069000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 3000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.raw_query", + "parent_id": 6968926528443376939, + "resource": "CREATE TABLE `notes` (`id` integer PRIMARY KEY AUTOINCREMENT,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`user_id` integer,`content` text)", + "service": "gorm.db", + "span_id": 5143103083057284374, + "span_links": [], + "start": 1718181699668177000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 31000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "database/sql", + "db.system": "other_sql", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "client", + "sql.query_type": "Exec" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "sqlite3.query", + "parent_id": 6968926528443376939, + "resource": "CREATE INDEX `idx_notes_deleted_at` ON `notes`(`deleted_at`)", + "service": "sqlite3.db", + "span_id": 3758828252100733668, + "span_links": [], + "start": 1718181699668185000, + "trace_id": 6968926528443376939, + "type": "sql" + }, + { + "duration": 137000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.create", + "parent_id": 6968926528443376939, + "resource": "INSERT INTO `notes` (`created_at`,`updated_at`,`deleted_at`,`user_id`,`content`) VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?) RETURNING `id`", + "service": "gorm.db", + "span_id": 8780065079658178782, + "span_links": [], + "start": 1718181699668254000, + "trace_id": 6968926528443376939, + "type": "sql" + } + ], + "duration": 1632000, + "error": 0, + "meta": { + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4300000000", + "function-name": "setup", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "setup", + "parent_id": 0, + "resource": "setup", + "service": "gorm", + "span_id": 6968926528443376939, + "span_links": [], + "start": 1718181699666760000, + "trace_id": 6968926528443376939, + "type": "" + } +] diff --git a/internal/orchestrion/_integration/internal/trace/testdata/matching/diff.txt b/internal/orchestrion/_integration/internal/trace/testdata/matching/diff.txt new file mode 100644 index 0000000000..21a1f94ca8 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/matching/diff.txt @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/orchestrion/_integration/internal/trace/testdata/matching/expected.json b/internal/orchestrion/_integration/internal/trace/testdata/matching/expected.json new file mode 100644 index 0000000000..c312cff6f3 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/matching/expected.json @@ -0,0 +1,35 @@ +{ + "resource": "GET /", + "type": "web", + "name": "http.request", + "service": "gorm", + "_children": [ + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "gorm.query", + "service": "gorm.db", + "meta": { + "component": "gorm.io/gorm.v1" + } + }, + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "sqlite3.query", + "service": "sqlite3.db", + "meta": { + "component": "database/sql", + "span.kind": "client" + }, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + } + } + ] +} diff --git a/internal/orchestrion/_integration/internal/trace/testdata/missing-child/actual.json b/internal/orchestrion/_integration/internal/trace/testdata/missing-child/actual.json new file mode 100644 index 0000000000..fd176b3c3a --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/missing-child/actual.json @@ -0,0 +1,66 @@ +[ + { + "_children": [ + { + "duration": 244000, + "error": 0, + "meta": { + "_dd.base_service": "gorm", + "component": "gorm.io/gorm.v1", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba" + }, + "meta_struct": {}, + "metrics": { + "_dd.top_level": 1.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "gorm.query", + "parent_id": 1356288911239140451, + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "service": "gorm.db", + "span_id": 3859718850563207054, + "span_links": [], + "start": 1718181700163280000, + "trace_id": 1356288911239140451, + "type": "sql" + } + ], + "duration": 288000, + "error": 0, + "meta": { + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4400000000", + "component": "net/http", + "http.host": "localhost:8088", + "http.method": "GET", + "http.status_code": "200", + "http.url": "http://localhost:8088/", + "http.useragent": "Mozilla/5.0 (Macintosh; Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000; fr-FR) PowerShell/7.4.2", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "server" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "http.request", + "parent_id": 0, + "resource": "GET /", + "service": "gorm", + "span_id": 1356288911239140451, + "span_links": [], + "start": 1718181700163254000, + "trace_id": 1356288911239140451, + "type": "web" + } +] diff --git a/internal/orchestrion/_integration/internal/trace/testdata/missing-child/diff.txt b/internal/orchestrion/_integration/internal/trace/testdata/missing-child/diff.txt new file mode 100644 index 0000000000..c4a9e1190d --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/missing-child/diff.txt @@ -0,0 +1,31 @@ +Root +└── [±] Span ID 1356288911239140451 + ├── [=] name = "http.request" + ├── [=] resource = "GET /" + ├── [=] service = "gorm" + ├── [=] type = "web" + └── _children + ├── [=] Span #3859718850563207054 + │ ├── name = "gorm.query" + │ ├── resource = "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1" + │ ├── service = "gorm.db" + │ ├── type = "sql" + │ └── meta + │ └── component = "gorm.io/gorm.v1" + └── [±] At index 1 + └── [±] Span ID 3859718850563207054 + ├── [±] name + │ ├── [-] sqlite3.query + │ └── [+] gorm.query + ├── [=] resource = "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1" + ├── [±] service + │ ├── [-] sqlite3.db + │ └── [+] gorm.db + ├── [=] type = "sql" + └── meta + ├── [±] component + │ ├── [-] database/sql + │ └── [+] gorm.io/gorm.v1 + └── [±] span.kind + ├── [-] client + └── [+] \ No newline at end of file diff --git a/internal/orchestrion/_integration/internal/trace/testdata/missing-child/expected.json b/internal/orchestrion/_integration/internal/trace/testdata/missing-child/expected.json new file mode 100644 index 0000000000..96a2072f25 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/missing-child/expected.json @@ -0,0 +1,27 @@ +{ + "resource": "GET /", + "type": "web", + "name": "http.request", + "service": "gorm", + "_children": [ + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "gorm.query", + "service": "gorm.db", + "meta": { + "component": "gorm.io/gorm.v1" + } + }, + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "sqlite3.query", + "service": "sqlite3.db", + "meta": { + "component": "database/sql", + "span.kind": "client" + } + } + ] +} diff --git a/internal/orchestrion/_integration/internal/trace/testdata/missing-children/actual.json b/internal/orchestrion/_integration/internal/trace/testdata/missing-children/actual.json new file mode 100644 index 0000000000..17085716db --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/missing-children/actual.json @@ -0,0 +1,39 @@ +[ + { + "duration": 288000, + "error": 0, + "meta": { + "_dd.git.commit.sha": "b5dcde5cf0fc321057d75b253f162bedaa99f8d8", + "_dd.go_path": "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/gorm", + "_dd.p.dm": "-1", + "_dd.p.tid": "66695f4400000000", + "component": "net/http", + "http.host": "localhost:8088", + "http.method": "GET", + "http.status_code": "200", + "http.url": "http://localhost:8088/", + "http.useragent": "Mozilla/5.0 (Macintosh; Darwin 23.5.0 Darwin Kernel Version 23.5.0: Wed May 1 20:12:58 PDT 2024; root:xnu-10063.121.3~5/RELEASE_ARM64_T6000; fr-FR) PowerShell/7.4.2", + "language": "go", + "runtime-id": "f182948b-b24c-47a9-a0e4-4462fd65d0ba", + "span.kind": "server" + }, + "meta_struct": {}, + "metrics": { + "_dd.agent_psr": 1.0, + "_dd.profiling.enabled": 0.0, + "_dd.top_level": 1.0, + "_dd.trace_span_attribute_schema": 0.0, + "_sampling_priority_v1": 1.0, + "process_id": 97959.0 + }, + "name": "http.request", + "parent_id": 0, + "resource": "GET /", + "service": "gorm", + "span_id": 1356288911239140451, + "span_links": [], + "start": 1718181700163254000, + "trace_id": 1356288911239140451, + "type": "web" + } +] diff --git a/internal/orchestrion/_integration/internal/trace/testdata/missing-children/diff.txt b/internal/orchestrion/_integration/internal/trace/testdata/missing-children/diff.txt new file mode 100644 index 0000000000..8d2a077707 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/missing-children/diff.txt @@ -0,0 +1,22 @@ +Root +└── [±] Span ID 1356288911239140451 + ├── [=] name = "http.request" + ├── [=] resource = "GET /" + ├── [=] service = "gorm" + ├── [=] type = "web" + └── _children + ├── [-] At index 0 (no children to match from) + │ ├── name = "gorm.query" + │ ├── resource = "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1" + │ ├── service = "gorm.db" + │ ├── type = "sql" + │ └── meta + │ └── component = "gorm.io/gorm.v1" + └── [-] At index 1 (no children to match from) + ├── name = "sqlite3.query" + ├── resource = "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1" + ├── service = "sqlite3.db" + ├── type = "sql" + └── meta + ├── component = "database/sql" + └── span.kind = "client" \ No newline at end of file diff --git a/internal/orchestrion/_integration/internal/trace/testdata/missing-children/expected.json b/internal/orchestrion/_integration/internal/trace/testdata/missing-children/expected.json new file mode 100644 index 0000000000..96a2072f25 --- /dev/null +++ b/internal/orchestrion/_integration/internal/trace/testdata/missing-children/expected.json @@ -0,0 +1,27 @@ +{ + "resource": "GET /", + "type": "web", + "name": "http.request", + "service": "gorm", + "_children": [ + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "gorm.query", + "service": "gorm.db", + "meta": { + "component": "gorm.io/gorm.v1" + } + }, + { + "resource": "SELECT * FROM `notes` WHERE user_id = ? AND `notes`.`deleted_at` IS NULL ORDER BY `notes`.`id` LIMIT 1", + "type": "sql", + "name": "sqlite3.query", + "service": "sqlite3.db", + "meta": { + "component": "database/sql", + "span.kind": "client" + } + } + ] +} diff --git a/internal/orchestrion/_integration/julienschmidt_httprouter/generated_test.go b/internal/orchestrion/_integration/julienschmidt_httprouter/generated_test.go new file mode 100644 index 0000000000..0dabf7487a --- /dev/null +++ b/internal/orchestrion/_integration/julienschmidt_httprouter/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package julienschmidt_httprouter + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/julienschmidt_httprouter/julienschmidt_httprouter.go b/internal/orchestrion/_integration/julienschmidt_httprouter/julienschmidt_httprouter.go new file mode 100644 index 0000000000..97a0057ef0 --- /dev/null +++ b/internal/orchestrion/_integration/julienschmidt_httprouter/julienschmidt_httprouter.go @@ -0,0 +1,99 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package julienschmidt_httprouter + +import ( + "context" + "fmt" + "io" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/julienschmidt/httprouter" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *http.Server +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + router := httprouter.New() + router.GET("/ping", func(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) { + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + _, err := io.WriteString(w, `{"message": "pong"}`) + assert.NoError(t, err) + }) + tc.Server = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + Handler: router, + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + go func() { assert.ErrorIs(t, tc.Server.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.Server.Shutdown(ctx)) + }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + resp, err := http.Get(fmt.Sprintf("http://%s/ping", tc.Server.Addr)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "type": "http", + "service": "julienschmidt_httprouter.test", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "type": "web", + "service": "http.router", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /ping", + "type": "web", + "service": "http.router", + }, + Meta: map[string]string{ + "component": "julienschmidt/httprouter", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/k8s_client_go/base.go b/internal/orchestrion/_integration/k8s_client_go/base.go new file mode 100644 index 0000000000..c4b88bc8da --- /dev/null +++ b/internal/orchestrion/_integration/k8s_client_go/base.go @@ -0,0 +1,93 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package k8sclientgo + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "net/url" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/require" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" +) + +type base struct { + server *httptest.Server + serverURL *url.URL + client *kubernetes.Clientset +} + +func (b *base) setup(_ context.Context, t *testing.T) { + b.server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + _, _ = w.Write([]byte("Hello World")) + })) + t.Cleanup(func() { b.server.Close() }) + tsURL, err := url.Parse(b.server.URL) + require.NoError(t, err) + b.serverURL = tsURL +} + +func (b *base) run(ctx context.Context, t *testing.T) { + // TODO(darccio): check if this can be change to nil instead of metav1.ListOptions + _, err := b.client.CoreV1().Namespaces().List(ctx, metav1.ListOptions{}) + + // we should get an error here since our test server handler implementation doesn't return what the k8s client expects + require.EqualError(t, err, "serializer for text/plain; charset=utf-8 doesn't exist") +} + +func (b *base) expectedTraces() trace.Traces { + httpServerSpan := &trace.Trace{ + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /api/v1/namespaces", + "type": "web", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "server", + "http.useragent": rest.DefaultKubernetesUserAgent(), + "http.status_code": "200", + "http.host": b.serverURL.Host, + "http.url": fmt.Sprintf("%s/api/v1/namespaces", b.server.URL), + "http.method": "GET", + }, + } + httpClientSpan := &trace.Trace{ + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /api/v1/namespaces", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + "network.destination.name": "127.0.0.1", + "http.status_code": "200", + "http.method": "GET", + "http.url": fmt.Sprintf("%s/api/v1/namespaces", b.server.URL), + }, + Children: trace.Traces{httpServerSpan}, + } + k8sClientSpan := &trace.Trace{ + Tags: map[string]any{ + "name": "http.request", + "resource": "GET namespaces", + "type": "http", + }, + Meta: map[string]string{ + "component": "k8s.io/client-go/kubernetes", + "span.kind": "client", + }, + Children: trace.Traces{httpClientSpan}, + } + return trace.Traces{k8sClientSpan} +} diff --git a/internal/orchestrion/_integration/k8s_client_go/generated_test.go b/internal/orchestrion/_integration/k8s_client_go/generated_test.go new file mode 100644 index 0000000000..fb9990d387 --- /dev/null +++ b/internal/orchestrion/_integration/k8s_client_go/generated_test.go @@ -0,0 +1,26 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package k8sclientgo + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestNewCfgFunc(t *testing.T) { + harness.Run(t, new(TestCaseNewCfgFunc)) +} + +func TestStructLiteralWithParam(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteralWithParam)) +} + +func TestStructLiteralWithoutParam(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteralWithoutParam)) +} diff --git a/internal/orchestrion/_integration/k8s_client_go/new_cfg_func.go b/internal/orchestrion/_integration/k8s_client_go/new_cfg_func.go new file mode 100644 index 0000000000..f5fbfee002 --- /dev/null +++ b/internal/orchestrion/_integration/k8s_client_go/new_cfg_func.go @@ -0,0 +1,43 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package k8sclientgo + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/require" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/tools/clientcmd" + clientcmdapi "k8s.io/client-go/tools/clientcmd/api" +) + +type TestCaseNewCfgFunc struct { + base +} + +func (tc *TestCaseNewCfgFunc) Setup(ctx context.Context, t *testing.T) { + tc.base.setup(ctx, t) + + // internally, this function creates a rest.Config struct literal, so it should get traced by orchestrion. + cfg, err := clientcmd.BuildConfigFromKubeconfigGetter(tc.server.URL, func() (*clientcmdapi.Config, error) { + return clientcmdapi.NewConfig(), nil + }) + require.NoError(t, err) + + client, err := kubernetes.NewForConfig(cfg) + require.NoError(t, err) + tc.base.client = client +} + +func (tc *TestCaseNewCfgFunc) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseNewCfgFunc) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/k8s_client_go/struct_literal_with_param.go b/internal/orchestrion/_integration/k8s_client_go/struct_literal_with_param.go new file mode 100644 index 0000000000..b31efd89a5 --- /dev/null +++ b/internal/orchestrion/_integration/k8s_client_go/struct_literal_with_param.go @@ -0,0 +1,48 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package k8sclientgo + +import ( + "context" + "net/http" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" +) + +type TestCaseStructLiteralWithParam struct { + base + wtCalled bool +} + +func (tc *TestCaseStructLiteralWithParam) Setup(ctx context.Context, t *testing.T) { + tc.base.setup(ctx, t) + + cfg := &rest.Config{ + Host: tc.server.URL, + WrapTransport: func(rt http.RoundTripper) http.RoundTripper { + tc.wtCalled = true + return rt + }, + } + + client, err := kubernetes.NewForConfig(cfg) + require.NoError(t, err) + tc.base.client = client +} + +func (tc *TestCaseStructLiteralWithParam) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) + assert.True(t, tc.wtCalled, "the original WrapTransport function was not called") +} + +func (tc *TestCaseStructLiteralWithParam) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/k8s_client_go/struct_literal_without_param.go b/internal/orchestrion/_integration/k8s_client_go/struct_literal_without_param.go new file mode 100644 index 0000000000..8b973794d3 --- /dev/null +++ b/internal/orchestrion/_integration/k8s_client_go/struct_literal_without_param.go @@ -0,0 +1,41 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package k8sclientgo + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/require" + "k8s.io/client-go/kubernetes" + "k8s.io/client-go/rest" +) + +type TestCaseStructLiteralWithoutParam struct { + base + wtCalled bool +} + +func (tc *TestCaseStructLiteralWithoutParam) Setup(ctx context.Context, t *testing.T) { + tc.base.setup(ctx, t) + + cfg := &rest.Config{ + Host: tc.server.URL, + } + + client, err := kubernetes.NewForConfig(cfg) + require.NoError(t, err) + tc.base.client = client +} + +func (tc *TestCaseStructLiteralWithoutParam) Run(ctx context.Context, t *testing.T) { + tc.base.run(ctx, t) +} + +func (tc *TestCaseStructLiteralWithoutParam) ExpectedTraces() trace.Traces { + return tc.base.expectedTraces() +} diff --git a/internal/orchestrion/_integration/logrus/base.go b/internal/orchestrion/_integration/logrus/base.go new file mode 100644 index 0000000000..a7f0dba1e1 --- /dev/null +++ b/internal/orchestrion/_integration/logrus/base.go @@ -0,0 +1,76 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package logrus + +import ( + "bufio" + "bytes" + "context" + "testing" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +func runTest(ctx context.Context, t *testing.T, out *bytes.Buffer, logFn func(context.Context, logrus.Level, string)) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + logFn(ctx, logrus.DebugLevel, "debug") + logFn(ctx, logrus.InfoLevel, "info") + logFn(ctx, logrus.WarnLevel, "warn") + logFn(ctx, logrus.ErrorLevel, "error") + + logs := out.String() + t.Logf("got logs: %s", logs) + for _, msg := range []string{"debug", "info", "warn", "error"} { + want := "msg=" + msg + assert.Contains(t, logs, want, "missing log message") + } + + s := bufio.NewScanner(out) + for s.Scan() { + line := string(s.Bytes()) + t.Logf("%s", line) + assert.Regexp(t, `dd.span_id=\d+`, line, "no span ID") + assert.Regexp(t, `dd.trace_id=\d+`, line, "no trace ID") + } +} + +func expectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "Log", + }, + }, + { + Tags: map[string]any{ + "name": "Log", + }, + }, + { + Tags: map[string]any{ + "name": "Log", + }, + }, + { + Tags: map[string]any{ + "name": "Log", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/logrus/generated_test.go b/internal/orchestrion/_integration/logrus/generated_test.go new file mode 100644 index 0000000000..1e23ae0b82 --- /dev/null +++ b/internal/orchestrion/_integration/logrus/generated_test.go @@ -0,0 +1,30 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package logrus + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestGlobalLogger(t *testing.T) { + harness.Run(t, new(TestCaseGlobalLogger)) +} + +func TestNewLogger(t *testing.T) { + harness.Run(t, new(TestCaseNewLogger)) +} + +func TestStructLiteralPtr(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteralPtr)) +} + +func TestStructLiteralVal(t *testing.T) { + harness.Run(t, new(TestCaseStructLiteralVal)) +} diff --git a/internal/orchestrion/_integration/logrus/global_logger.go b/internal/orchestrion/_integration/logrus/global_logger.go new file mode 100644 index 0000000000..f83fbe7931 --- /dev/null +++ b/internal/orchestrion/_integration/logrus/global_logger.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package logrus + +import ( + "bytes" + "context" + "testing" + + "github.com/sirupsen/logrus" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCaseGlobalLogger struct { + logs *bytes.Buffer +} + +func (tc *TestCaseGlobalLogger) Setup(context.Context, *testing.T) { + tc.logs = new(bytes.Buffer) + logrus.SetLevel(logrus.DebugLevel) + logrus.SetOutput(tc.logs) +} + +func (tc *TestCaseGlobalLogger) Run(ctx context.Context, t *testing.T) { + runTest(ctx, t, tc.logs, tc.Log) +} + +func (*TestCaseGlobalLogger) ExpectedTraces() trace.Traces { + return expectedTraces() +} + +//dd:span +func (*TestCaseGlobalLogger) Log(ctx context.Context, level logrus.Level, msg string) { + logrus.WithContext(ctx).Log(level, msg) +} diff --git a/internal/orchestrion/_integration/logrus/new_logger.go b/internal/orchestrion/_integration/logrus/new_logger.go new file mode 100644 index 0000000000..eb5c818b3f --- /dev/null +++ b/internal/orchestrion/_integration/logrus/new_logger.go @@ -0,0 +1,41 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package logrus + +import ( + "bytes" + "context" + "testing" + + "github.com/sirupsen/logrus" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCaseNewLogger struct { + logger *logrus.Logger + logs *bytes.Buffer +} + +func (tc *TestCaseNewLogger) Setup(context.Context, *testing.T) { + tc.logs = new(bytes.Buffer) + tc.logger = logrus.New() + tc.logger.SetLevel(logrus.DebugLevel) + tc.logger.SetOutput(tc.logs) +} + +func (tc *TestCaseNewLogger) Run(ctx context.Context, t *testing.T) { + runTest(ctx, t, tc.logs, tc.Log) +} + +func (*TestCaseNewLogger) ExpectedTraces() trace.Traces { + return expectedTraces() +} + +//dd:span +func (tc *TestCaseNewLogger) Log(ctx context.Context, level logrus.Level, msg string) { + tc.logger.WithContext(ctx).Log(level, msg) +} diff --git a/internal/orchestrion/_integration/logrus/struct_literal_ptr.go b/internal/orchestrion/_integration/logrus/struct_literal_ptr.go new file mode 100644 index 0000000000..5f26ac424a --- /dev/null +++ b/internal/orchestrion/_integration/logrus/struct_literal_ptr.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package logrus + +import ( + "bytes" + "context" + "os" + "testing" + + "github.com/sirupsen/logrus" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCaseStructLiteralPtr struct { + logger *logrus.Logger + logs *bytes.Buffer +} + +func (tc *TestCaseStructLiteralPtr) Setup(context.Context, *testing.T) { + tc.logs = new(bytes.Buffer) + tc.logger = &logrus.Logger{ + Out: os.Stderr, + Formatter: new(logrus.TextFormatter), + Hooks: make(logrus.LevelHooks), + Level: logrus.InfoLevel, + ExitFunc: os.Exit, + ReportCaller: false, + } + tc.logger.SetLevel(logrus.DebugLevel) + tc.logger.SetOutput(tc.logs) +} + +func (tc *TestCaseStructLiteralPtr) Run(ctx context.Context, t *testing.T) { + runTest(ctx, t, tc.logs, tc.Log) +} + +func (*TestCaseStructLiteralPtr) ExpectedTraces() trace.Traces { + return expectedTraces() +} + +//dd:span +func (tc *TestCaseStructLiteralPtr) Log(ctx context.Context, level logrus.Level, msg string) { + tc.logger.WithContext(ctx).Log(level, msg) +} diff --git a/internal/orchestrion/_integration/logrus/struct_literal_val.go b/internal/orchestrion/_integration/logrus/struct_literal_val.go new file mode 100644 index 0000000000..0f835f820f --- /dev/null +++ b/internal/orchestrion/_integration/logrus/struct_literal_val.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package logrus + +import ( + "bytes" + "context" + "os" + "testing" + + "github.com/sirupsen/logrus" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCaseStructLiteralVal struct { + logger logrus.Logger + logs *bytes.Buffer +} + +func (tc *TestCaseStructLiteralVal) Setup(context.Context, *testing.T) { + tc.logs = new(bytes.Buffer) + tc.logger = logrus.Logger{ + Out: os.Stderr, + Formatter: new(logrus.TextFormatter), + Hooks: make(logrus.LevelHooks), + Level: logrus.InfoLevel, + ExitFunc: os.Exit, + ReportCaller: false, + } + tc.logger.SetLevel(logrus.DebugLevel) + tc.logger.SetOutput(tc.logs) +} + +func (tc *TestCaseStructLiteralVal) Run(ctx context.Context, t *testing.T) { + runTest(ctx, t, tc.logs, tc.Log) +} + +func (*TestCaseStructLiteralVal) ExpectedTraces() trace.Traces { + return expectedTraces() +} + +//dd:span +func (tc *TestCaseStructLiteralVal) Log(ctx context.Context, level logrus.Level, msg string) { + tc.logger.WithContext(ctx).Log(level, msg) +} diff --git a/internal/orchestrion/_integration/mongo.v2/generated_test.go b/internal/orchestrion/_integration/mongo.v2/generated_test.go new file mode 100644 index 0000000000..6d8d6732a6 --- /dev/null +++ b/internal/orchestrion/_integration/mongo.v2/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package mongo + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/mongo.v2/mongo.go b/internal/orchestrion/_integration/mongo.v2/mongo.go new file mode 100644 index 0000000000..209ebca054 --- /dev/null +++ b/internal/orchestrion/_integration/mongo.v2/mongo.go @@ -0,0 +1,97 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package mongo + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "go.mongodb.org/mongo-driver/v2/bson" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" +) + +type TestCase struct { + client *mongo.Client +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + _, mongoURI := containers.StartMongoDBTestContainer(t) + + opts := options.Client() + opts.ApplyURI(mongoURI) + client, err := mongo.Connect(opts) + require.NoError(t, err) + tc.client = client + + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.client.Disconnect(ctx)) + }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + db := tc.client.Database("test") + c := db.Collection("coll") + + _, err := c.InsertOne(ctx, bson.M{"test_key": "test_value"}) + require.NoError(t, err) + r := c.FindOne(ctx, bson.M{"test_key": "test_value"}) + require.NoError(t, r.Err()) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "mongodb.query", + "service": "mongo", + "resource": "mongo.insert", + "type": "mongodb", + }, + Meta: map[string]string{ + "component": "go.mongodb.org/mongo-driver.v2", + "span.kind": "client", + "db.system": "mongodb", + }, + }, + { + Tags: map[string]any{ + "name": "mongodb.query", + "service": "mongo", + "resource": "mongo.find", + "type": "mongodb", + }, + Meta: map[string]string{ + "component": "go.mongodb.org/mongo-driver.v2", + "span.kind": "client", + "db.system": "mongodb", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/mongo/generated_test.go b/internal/orchestrion/_integration/mongo/generated_test.go new file mode 100644 index 0000000000..6d8d6732a6 --- /dev/null +++ b/internal/orchestrion/_integration/mongo/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package mongo + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/mongo/mongo.go b/internal/orchestrion/_integration/mongo/mongo.go new file mode 100644 index 0000000000..6c0349dc2b --- /dev/null +++ b/internal/orchestrion/_integration/mongo/mongo.go @@ -0,0 +1,97 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package mongo + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +type TestCase struct { + client *mongo.Client +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + _, mongoURI := containers.StartMongoDBTestContainer(t) + + opts := options.Client() + opts.ApplyURI(mongoURI) + client, err := mongo.Connect(ctx, opts) + require.NoError(t, err) + tc.client = client + + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.client.Disconnect(ctx)) + }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + db := tc.client.Database("test") + c := db.Collection("coll") + + _, err := c.InsertOne(ctx, bson.M{"test_key": "test_value"}) + require.NoError(t, err) + r := c.FindOne(ctx, bson.M{"test_key": "test_value"}) + require.NoError(t, r.Err()) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "mongodb.query", + "service": "mongo", + "resource": "mongo.insert", + "type": "mongodb", + }, + Meta: map[string]string{ + "component": "go.mongodb.org/mongo-driver/mongo", + "span.kind": "client", + "db.system": "mongodb", + }, + }, + { + Tags: map[string]any{ + "name": "mongodb.query", + "service": "mongo", + "resource": "mongo.find", + "type": "mongodb", + }, + Meta: map[string]string{ + "component": "go.mongodb.org/mongo-driver/mongo", + "span.kind": "client", + "db.system": "mongodb", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/net_http/base.go b/internal/orchestrion/_integration/net_http/base.go new file mode 100644 index 0000000000..5d59b1b58b --- /dev/null +++ b/internal/orchestrion/_integration/net_http/base.go @@ -0,0 +1,155 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "fmt" + "io" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type base struct { + srv *http.Server + handler http.Handler +} + +func (b *base) Setup(_ context.Context, t *testing.T) { + b.srv = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + b.srv.Handler = b.handler + + go func() { assert.ErrorIs(t, b.srv.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, b.srv.Shutdown(ctx)) + }) +} + +func (b *base) Run(_ context.Context, t *testing.T) { + resp, err := http.Get(fmt.Sprintf("http://%s/", b.srv.Addr)) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +func (b *base) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "type": "web", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /hit", + "type": "http", + }, + Meta: map[string]string{ + "http.url": fmt.Sprintf("http://%s/hit", b.srv.Addr), + "component": "net/http", + "span.kind": "client", + "network.destination.name": "127.0.0.1", + "http.status_code": "200", + "http.method": "POST", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "POST /hit", + "type": "web", + }, + Meta: map[string]string{ + "http.useragent": "Go-http-client/1.1", + "http.status_code": "200", + "http.host": b.srv.Addr, + "component": "net/http", + "http.url": fmt.Sprintf("http://%s/hit", b.srv.Addr), + "http.method": "POST", + "span.kind": "server", + }, + }, + }, + }, + }, + }, + }, + }, + } +} + +func (b *base) serveMuxHandler() http.Handler { + mux := http.NewServeMux() + mux.HandleFunc("/hit", b.handleHit) + mux.HandleFunc("/", b.handleRoot) + return mux +} + +func (b *base) handleRoot(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + + resp, err := http.Post(fmt.Sprintf("http://%s/hit", b.srv.Addr), "text/plain", r.Body) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + _, _ = w.Write([]byte(err.Error())) + return + } + defer resp.Body.Close() + + bytes, err := io.ReadAll(resp.Body) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + _, _ = w.Write([]byte(err.Error())) + return + } + + w.WriteHeader(resp.StatusCode) + _, _ = w.Write(bytes) +} + +func (*base) handleHit(w http.ResponseWriter, r *http.Request) { + defer r.Body.Close() + + b, err := io.ReadAll(r.Body) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + _, _ = w.Write([]byte(err.Error())) + return + } + + w.WriteHeader(http.StatusOK) + _, _ = w.Write(b) +} diff --git a/internal/orchestrion/_integration/net_http/client_error.go b/internal/orchestrion/_integration/net_http/client_error.go new file mode 100644 index 0000000000..e2ed353c39 --- /dev/null +++ b/internal/orchestrion/_integration/net_http/client_error.go @@ -0,0 +1,67 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "fmt" + "net/http" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestCaseClientError checks of the net/http client instrumentation handles creates error if the returned status code is 4xx. +type TestCaseClientError struct { + srv *http.Server +} + +func (b *TestCaseClientError) Setup(_ context.Context, t *testing.T) { + b.srv = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + } + b.srv.Handler = http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusTeapot) + }) + + go func() { assert.ErrorIs(t, b.srv.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, b.srv.Shutdown(ctx)) + }) +} + +func (b *TestCaseClientError) Run(_ context.Context, t *testing.T) { + resp, err := http.Get(fmt.Sprintf("http://%s/", b.srv.Addr)) + require.NoError(t, err) + require.Equal(t, http.StatusTeapot, resp.StatusCode) +} + +func (*TestCaseClientError) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + "http.errors": "418 I'm a teapot", + "http.status_code": "418", + }, + }, + } +} diff --git a/internal/orchestrion/_integration/net_http/func_handler.go b/internal/orchestrion/_integration/net_http/func_handler.go new file mode 100644 index 0000000000..82c598b424 --- /dev/null +++ b/internal/orchestrion/_integration/net_http/func_handler.go @@ -0,0 +1,36 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "net/http" + "testing" +) + +type TestCaseFuncHandler struct { + base +} + +func (tc *TestCaseFuncHandler) Setup(ctx context.Context, t *testing.T) { + tc.handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case "/": + tc.handleRoot(w, r) + return + + case "/hit": + tc.handleHit(w, r) + return + + default: + w.WriteHeader(http.StatusNotFound) + return + } + }) + + tc.base.Setup(ctx, t) +} diff --git a/internal/orchestrion/_integration/net_http/generated_test.go b/internal/orchestrion/_integration/net_http/generated_test.go new file mode 100644 index 0000000000..2acec82323 --- /dev/null +++ b/internal/orchestrion/_integration/net_http/generated_test.go @@ -0,0 +1,42 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package nethttp + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestClientError(t *testing.T) { + harness.Run(t, new(TestCaseClientError)) +} + +func TestFuncHandler(t *testing.T) { + harness.Run(t, new(TestCaseFuncHandler)) +} + +func TestGlobalFunctions(t *testing.T) { + harness.Run(t, new(TestCaseGlobalFunctions)) +} + +func TestHandlerImplementation(t *testing.T) { + harness.Run(t, new(TestCaseHandlerImplementation)) +} + +func TestHandlerIsNil(t *testing.T) { + harness.Run(t, new(TestCaseHandlerIsNil)) +} + +func TestIssue400(t *testing.T) { + harness.Run(t, new(TestCaseIssue400)) +} + +func TestServeMuxHandler(t *testing.T) { + harness.Run(t, new(TestCaseServeMuxHandler)) +} diff --git a/internal/orchestrion/_integration/net_http/global_functions.go b/internal/orchestrion/_integration/net_http/global_functions.go new file mode 100644 index 0000000000..edfc825677 --- /dev/null +++ b/internal/orchestrion/_integration/net_http/global_functions.go @@ -0,0 +1,49 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "net/http" + "testing" + + "github.com/stretchr/testify/require" +) + +// TestCaseGlobalFunctions tests the aspect replacing global functions. +// See: https://github.com/DataDog/orchestrion/issues/670 and https://github.com/DataDog/orchestrion/issues/674 +// The issue is reproduced in this test since the receiver defined below is called `client`, same as the synthetic +// import added by Orchestrion. +type TestCaseGlobalFunctions struct { + base +} + +func (tc *TestCaseGlobalFunctions) Setup(ctx context.Context, t *testing.T) { + tc.handler = tc.serveMuxHandler() + tc.base.Setup(ctx, t) +} + +func (tc *TestCaseGlobalFunctions) Run(_ context.Context, t *testing.T) { + cl := newHttpClient(tc.srv.Addr) + + resp, err := cl.Get("/") + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) +} + +type httpClient struct { + serverHost string +} + +func newHttpClient(serverHost string) *httpClient { + return &httpClient{ + serverHost: serverHost, + } +} + +func (client *httpClient) Get(path string) (*http.Response, error) { + return http.Get("http://" + client.serverHost + path) +} diff --git a/internal/orchestrion/_integration/net_http/handler_implementation.go b/internal/orchestrion/_integration/net_http/handler_implementation.go new file mode 100644 index 0000000000..ca016ffad9 --- /dev/null +++ b/internal/orchestrion/_integration/net_http/handler_implementation.go @@ -0,0 +1,45 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "net/http" + "testing" +) + +type customHandler struct { + handleRoot func(w http.ResponseWriter, r *http.Request) + handleHit func(w http.ResponseWriter, r *http.Request) +} + +func (c *customHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case "/": + c.handleRoot(w, r) + return + + case "/hit": + c.handleHit(w, r) + return + + default: + w.WriteHeader(http.StatusNotFound) + return + } +} + +type TestCaseHandlerImplementation struct { + base +} + +func (tc *TestCaseHandlerImplementation) Setup(ctx context.Context, t *testing.T) { + tc.handler = &customHandler{ + handleRoot: tc.handleRoot, + handleHit: tc.handleHit, + } + tc.base.Setup(ctx, t) +} diff --git a/internal/orchestrion/_integration/net_http/issue_400.go b/internal/orchestrion/_integration/net_http/issue_400.go new file mode 100644 index 0000000000..da3035db42 --- /dev/null +++ b/internal/orchestrion/_integration/net_http/issue_400.go @@ -0,0 +1,38 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "net/http" + "testing" +) + +// TestCaseIssue400 tests regressions for https://github.com/DataDog/orchestrion/issues/400. +type TestCaseIssue400 struct { + base +} + +type handlerFunc func(http.ResponseWriter, *http.Request) + +// This issue happened because we used to replace with WrapHandlerFunc every time we saw a function that matched the +// signature func(w http.ResponseWriter, req *http.Request), and using a custom type like we do here broke the build. +func wrapCustomType(f func(http.ResponseWriter, *http.Request)) handlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + f(w, r) + } +} + +func (tc *TestCaseIssue400) Setup(ctx context.Context, t *testing.T) { + handleHit := wrapCustomType(tc.handleHit) + handleRoot := wrapCustomType(tc.handleRoot) + mux := http.NewServeMux() + mux.HandleFunc("/hit", handleHit) + mux.HandleFunc("/", handleRoot) + tc.handler = mux + + tc.base.Setup(ctx, t) +} diff --git a/internal/orchestrion/_integration/net_http/serve_mux_handler.go b/internal/orchestrion/_integration/net_http/serve_mux_handler.go new file mode 100644 index 0000000000..b85ff5ee1a --- /dev/null +++ b/internal/orchestrion/_integration/net_http/serve_mux_handler.go @@ -0,0 +1,32 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package nethttp + +import ( + "context" + "net/http" + "testing" +) + +type TestCaseServeMuxHandler struct { + base +} + +func (tc *TestCaseServeMuxHandler) Setup(ctx context.Context, t *testing.T) { + tc.handler = tc.serveMuxHandler() + tc.base.Setup(ctx, t) +} + +type TestCaseHandlerIsNil struct { + base +} + +func (tc *TestCaseHandlerIsNil) Setup(ctx context.Context, t *testing.T) { + http.HandleFunc("/hit", tc.base.handleHit) + http.HandleFunc("/", tc.base.handleRoot) + tc.base.handler = nil // Set handler to nil to test http.DefaultServeMux + tc.base.Setup(ctx, t) +} diff --git a/internal/orchestrion/_integration/orchestrion.tool.go b/internal/orchestrion/_integration/orchestrion.tool.go new file mode 100644 index 0000000000..fca03426aa --- /dev/null +++ b/internal/orchestrion/_integration/orchestrion.tool.go @@ -0,0 +1,28 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +// This file was created by `orchestrion pin`, and is used to ensure the +// `go.mod` file contains the necessary entries to ensure repeatable builds when +// using `orchestrion`. It is also used to set up which integrations are enabled. + +//go:build tools + +//go:generate go run github.com/DataDog/orchestrion pin -generate + +package tools + +// Imports in this file determine which tracer integrations are enabled in +// orchestrion. New integrations can be automatically discovered by running +// `orchestrion pin` again. You can also manually add new imports here to +// enable additional integrations. When doing so, you can run `orchestrion pin` +// to make sure manually added integrations are valid (i.e, the imported package +// includes a valid `orchestrion.yml` file). +import ( + // Ensures `orchestrion` is present in `go.mod` so that builds are repeatable. + // Do not remove. + _ "github.com/DataDog/orchestrion" // integration + + _ "github.com/DataDog/dd-trace-go/orchestrion/all/v2" // integration +) diff --git a/internal/orchestrion/_integration/os/generated_test.go b/internal/orchestrion/_integration/os/generated_test.go new file mode 100644 index 0000000000..3a9c4c1ba3 --- /dev/null +++ b/internal/orchestrion/_integration/os/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package os + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/os/lfi.go b/internal/orchestrion/_integration/os/lfi.go new file mode 100644 index 0000000000..dfe88682f3 --- /dev/null +++ b/internal/orchestrion/_integration/os/lfi.go @@ -0,0 +1,116 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package os + +import ( + "context" + "fmt" + "net/http" + "os" + "runtime" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/appsec/events" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/net" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/DataDog/go-libddwaf/v4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *http.Server + *testing.T +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("appsec does not support Windows") + } + if ok, err := libddwaf.Usable(); !ok { + t.Skip("WAF is not available:", err) + } + + t.Setenv("DD_APPSEC_RULES", "../testdata/rasp-only-rules.json") + t.Setenv("DD_APPSEC_ENABLED", "true") + t.Setenv("DD_APPSEC_RASP_ENABLED", "true") + t.Setenv("DD_APPSEC_WAF_TIMEOUT", "1h") + mux := http.NewServeMux() + tc.Server = &http.Server{ + Addr: fmt.Sprintf("127.0.0.1:%d", net.FreePort(t)), + Handler: mux, + } + + mux.HandleFunc("/", tc.handleRoot) + + go func() { assert.ErrorIs(t, tc.Server.ListenAndServe(), http.ErrServerClosed) }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + require.NoError(t, tc.Server.Shutdown(ctx)) + }) +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + tc.T = t + resp, err := http.Get(fmt.Sprintf("http://%s/?path=/etc/passwd", tc.Server.Addr)) + require.NoError(t, err) + require.Equal(t, http.StatusForbidden, resp.StatusCode) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "resource": "GET /", + "type": "web", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "server", + "appsec.blocked": "true", + "is.security.error": "true", + }, + }, + }, + }, + } +} + +func (tc *TestCase) handleRoot(w http.ResponseWriter, r *http.Request) { + fp, err := os.Open("/etc/passwd") + + assert.ErrorIs(tc.T, err, &events.BlockingSecurityEvent{}) + if events.IsSecurityError(err) { // TODO: response writer instrumentation do not have to do that + span, _ := tracer.SpanFromContext(r.Context()) + span.SetTag("is.security.error", true) + return + } + + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + defer fp.Close() + + w.WriteHeader(http.StatusOK) +} diff --git a/internal/orchestrion/_integration/pgx/generated_test.go b/internal/orchestrion/_integration/pgx/generated_test.go new file mode 100644 index 0000000000..7224d9fb28 --- /dev/null +++ b/internal/orchestrion/_integration/pgx/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package pgx + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/pgx/pgx.go b/internal/orchestrion/_integration/pgx/pgx.go new file mode 100644 index 0000000000..e9e5136d15 --- /dev/null +++ b/internal/orchestrion/_integration/pgx/pgx.go @@ -0,0 +1,96 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package pgx + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/jackc/pgx/v5" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + testpostgres "github.com/testcontainers/testcontainers-go/modules/postgres" + "github.com/testcontainers/testcontainers-go/wait" +) + +type TestCase struct { + container *testpostgres.PostgresContainer + conn *pgx.Conn +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + tc.container, err = testpostgres.Run(ctx, + "docker.io/postgres:16-alpine", // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + // https://golang.testcontainers.org/modules/postgres/#wait-strategies_1 + testcontainers.WithWaitStrategy( + wait.ForLog("database system is ready to accept connections").WithOccurrence(2), + wait.ForListeningPort("5432/tcp"), + ), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, tc.container) + + dbURL, err := tc.container.ConnectionString(ctx, "sslmode=disable") + require.NoError(t, err) + + tc.conn, err = pgx.Connect(ctx, dbURL) + require.NoError(t, err) + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, tc.conn.Close(ctx)) + }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + var x int + err := tc.conn.QueryRow(ctx, "SELECT 1").Scan(&x) + require.NoError(t, err) + require.Equal(t, 1, x) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "pgx.query", + "service": "postgres.db", + "resource": "SELECT 1", + "type": "sql", + }, + Meta: map[string]string{ + "component": "jackc/pgx.v5", + "span.kind": "client", + "db.system": "postgresql", + "db.operation": "Query", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/redigo/generated_test.go b/internal/orchestrion/_integration/redigo/generated_test.go new file mode 100644 index 0000000000..11e2d65c51 --- /dev/null +++ b/internal/orchestrion/_integration/redigo/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package redigo + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/redigo/redigo.go b/internal/orchestrion/_integration/redigo/redigo.go new file mode 100644 index 0000000000..8db3c5d749 --- /dev/null +++ b/internal/orchestrion/_integration/redigo/redigo.go @@ -0,0 +1,153 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package redigo + +import ( + "context" + "errors" + "fmt" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/gomodule/redigo/redis" + "github.com/google/uuid" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + testredis "github.com/testcontainers/testcontainers-go/modules/redis" +) + +type TestCase struct { + server *testredis.RedisContainer + *redis.Pool + key string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + uuid, err := uuid.NewRandom() + require.NoError(t, err) + tc.key = uuid.String() + + container, addr := containers.StartRedisTestContainer(t) + tc.server = container + + const network = "tcp" + + var dialOptions = []redis.DialOption{ + redis.DialReadTimeout(10 * time.Second), + } + + tc.Pool = &redis.Pool{ + Dial: func() (redis.Conn, error) { return redis.Dial(network, addr, dialOptions...) }, + DialContext: func(ctx context.Context) (redis.Conn, error) { + return redis.DialContext(ctx, network, addr) + }, + TestOnBorrow: func(c redis.Conn, _ time.Time) error { + _, err := c.Do("PING") + return err + }, + } + t.Cleanup(func() { assert.NoError(t, tc.Pool.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + client, err := tc.Pool.GetContext(ctx) + require.NoError(t, err) + defer func() { assert.NoError(t, client.Close()) }() + + _, err = backoff.RetryWithData( + func() (any, error) { + res, err := client.Do("SET", tc.key, "test_value") + if err != nil { + // If there was an error, replace the client with a new one... + err = errors.Join(err, client.Close()) // Close the old clien + newC, newE := tc.Pool.GetContext(ctx) + client = newC + err = errors.Join(err, newE) + } + return res, err + }, + backoff.NewExponentialBackOff(), + ) + require.NoError(t, err) + + res, err := client.Do("GET", tc.key, ctx) + require.NoError(t, err) + require.NotEmpty(t, res) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "resource": "SET", + "type": "redis", + "name": "redis.command", + "service": "redis.conn", + }, + Meta: map[string]string{ + "redis.raw_command": fmt.Sprintf("SET %s test_value", tc.key), + "db.system": "redis", + "component": "gomodule/redigo", + "out.network": "tcp", + "out.host": "localhost", + "redis.args_length": "2", + "span.kind": "client", + }, + }, + { + Tags: map[string]any{ + "resource": "GET", + "type": "redis", + "name": "redis.command", + "service": "redis.conn", + }, + Meta: map[string]string{ + "redis.raw_command": fmt.Sprintf("GET %s", tc.key), + "db.system": "redis", + "component": "gomodule/redigo", + "out.network": "tcp", + "out.host": "localhost", + "redis.args_length": "1", + "span.kind": "client", + }, + }, + { + Tags: map[string]any{ + "resource": "redigo.Conn.Flush", + "type": "redis", + "name": "redis.command", + "service": "redis.conn", + }, + Meta: map[string]string{ + "redis.raw_command": "", + "db.system": "redis", + "component": "gomodule/redigo", + "out.network": "tcp", + "out.host": "localhost", + "redis.args_length": "0", + "span.kind": "client", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/rueidis/generated_test.go b/internal/orchestrion/_integration/rueidis/generated_test.go new file mode 100644 index 0000000000..dc7bf9cf12 --- /dev/null +++ b/internal/orchestrion/_integration/rueidis/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package rueidis + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/rueidis/rueidis.go b/internal/orchestrion/_integration/rueidis/rueidis.go new file mode 100644 index 0000000000..d817542971 --- /dev/null +++ b/internal/orchestrion/_integration/rueidis/rueidis.go @@ -0,0 +1,87 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025-present Datadog, Inc. + +//go:build linux || !githubci + +package rueidis + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/redis/rueidis" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + client rueidis.Client +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + _, addr := containers.StartRedisTestContainer(t) + var err error + tc.client, err = rueidis.NewClient(rueidis.ClientOption{ + InitAddress: []string{addr}, + }) + require.NoError(t, err) + t.Cleanup(func() { tc.client.Close() }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + require.NoError(t, tc.client.Do(ctx, tc.client.B().Set().Key("key").Value("value").Build()).Error()) + require.NoError(t, tc.client.Do(ctx, tc.client.B().Get().Key("key").Build()).Error()) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "SET", + "type": "redis", + }, + Meta: map[string]string{ + "_dd.base_service": "rueidis.test", + "component": "redis/rueidis", + "db.system": "redis", + "db.redis.client.cache.hit": "false", + "out.db": "0", + "out.host": "localhost", + "span.kind": "client", + }, + }, + { + Tags: map[string]any{ + "name": "redis.command", + "service": "redis.client", + "resource": "GET", + "type": "redis", + }, + Meta: map[string]string{ + "_dd.base_service": "rueidis.test", + "component": "redis/rueidis", + "db.system": "redis", + "db.redis.client.cache.hit": "false", + "out.db": "0", + "out.host": "localhost", + "span.kind": "client", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/segmentio_kafka.v0/generated_test.go b/internal/orchestrion/_integration/segmentio_kafka.v0/generated_test.go new file mode 100644 index 0000000000..d188d830e3 --- /dev/null +++ b/internal/orchestrion/_integration/segmentio_kafka.v0/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package segmentio_kafka_v0 + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/segmentio_kafka.v0/segmentio_kafka.go b/internal/orchestrion/_integration/segmentio_kafka.v0/segmentio_kafka.go new file mode 100644 index 0000000000..a441a9e585 --- /dev/null +++ b/internal/orchestrion/_integration/segmentio_kafka.v0/segmentio_kafka.go @@ -0,0 +1,210 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package segmentio_kafka_v0 + +import ( + "context" + "errors" + "sync" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/cenkalti/backoff/v4" + "github.com/segmentio/kafka-go" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + kafkatest "github.com/testcontainers/testcontainers-go/modules/kafka" +) + +const ( + topicA = "segmentio_kafka_topic_A" + topicB = "segmentio_kafka_topic_B" + consumerGroup = "segmentio_kafka_group_A" +) + +type TestCase struct { + kafka *kafkatest.KafkaContainer + addr string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + tc.kafka, tc.addr = containers.StartKafkaTestContainer(t, []string{topicA, topicB}) +} + +func (tc *TestCase) newReader(topic string) *kafka.Reader { + return kafka.NewReader(kafka.ReaderConfig{ + Brokers: []string{tc.addr}, + GroupID: consumerGroup, + Topic: topic, + MaxWait: 10 * time.Millisecond, + MaxBytes: 10e6, // 10MB + }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + tc.produce(ctx, t) + tc.consume(ctx, t) +} + +func (tc *TestCase) produce(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + messages := []kafka.Message{ + { + Topic: topicA, + Key: []byte("Key-A"), + Value: []byte("Hello World!"), + }, + { + Topic: topicB, + Key: []byte("Key-A"), + Value: []byte("Second message"), + }, + { + Topic: topicB, + Key: []byte("Key-A"), + Value: []byte("Third message"), + }, + } + err := backoff.Retry( + func() error { + writer := &kafka.Writer{ + Addr: kafka.TCP(tc.addr), + Balancer: &kafka.LeastBytes{}, + } + defer func() { require.NoError(t, writer.Close()) }() + + err := writer.WriteMessages(ctx, messages...) + if !errors.Is(err, kafka.UnknownTopicOrPartition) { + return backoff.Permanent(err) + } + t.Logf("failed to produce messages (retrying...): %s", err.Error()) + return err + }, + backoff.NewExponentialBackOff(backoff.WithMaxElapsedTime(30*time.Second)), + ) + require.NoError(t, err) +} + +func (tc *TestCase) consume(_ context.Context, t *testing.T) { + ctx := context.Background() // Diregard local trace context as it'd override the propagated one + + // We consume from separate goroutines to blur out the goroutine local storage's context weaving, more accurately + // simulating "real-world" usage of the Kafka client. + var wg sync.WaitGroup + + wg.Add(1) + go func() { + defer wg.Done() + + readerA := tc.newReader(topicA) + defer func() { require.NoError(t, readerA.Close()) }() + m, err := readerA.ReadMessage(ctx) + require.NoError(t, err) + assert.Equal(t, "Hello World!", string(m.Value)) + assert.Equal(t, "Key-A", string(m.Key)) + }() + + wg.Add(1) + go func() { + defer wg.Done() + + readerB := tc.newReader(topicB) + defer func() { require.NoError(t, readerB.Close()) }() + m, err := readerB.FetchMessage(ctx) + require.NoError(t, err) + assert.Equal(t, "Second message", string(m.Value)) + assert.Equal(t, "Key-A", string(m.Key)) + err = readerB.CommitMessages(ctx, m) + require.NoError(t, err) + }() + wg.Wait() +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic " + topicA, + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic " + topicA, + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + }, + }, + }, + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic " + topicB, + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + "resource": "Consume Topic " + topicB, + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "segmentio/kafka.go.v0", + }, + }, + }, + }, + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + "resource": "Produce Topic " + topicB, + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "segmentio/kafka.go.v0", + }, + Children: nil, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/shopify_sarama/generated_test.go b/internal/orchestrion/_integration/shopify_sarama/generated_test.go new file mode 100644 index 0000000000..a2ccb1675f --- /dev/null +++ b/internal/orchestrion/_integration/shopify_sarama/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package shopify_sarama + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/shopify_sarama/shopify_sarama.go b/internal/orchestrion/_integration/shopify_sarama/shopify_sarama.go new file mode 100644 index 0000000000..bc6dcdc6d8 --- /dev/null +++ b/internal/orchestrion/_integration/shopify_sarama/shopify_sarama.go @@ -0,0 +1,121 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package shopify_sarama + +import ( + "context" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/Shopify/sarama" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go/modules/kafka" +) + +const ( + topic = "shopify_sarama_default_test" + partition = int32(0) +) + +type TestCase struct { + server *kafka.KafkaContainer + cfg *sarama.Config + addrs []string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + tc.cfg = sarama.NewConfig() + tc.cfg.Version = sarama.V0_11_0_0 + tc.cfg.Producer.Return.Successes = true + + container, addr := containers.StartKafkaTestContainer(t, []string{topic}) + tc.server = container + tc.addrs = []string{addr} +} + +func produceMessage(t *testing.T, addrs []string, cfg *sarama.Config) { + t.Helper() + + producer, err := sarama.NewSyncProducer(addrs, cfg) + require.NoError(t, err, "failed to create producer") + defer func() { assert.NoError(t, producer.Close(), "failed to close producer") }() + + _, _, err = producer.SendMessage(&sarama.ProducerMessage{ + Topic: topic, + Partition: partition, + Value: sarama.StringEncoder("Hello, World!"), + }) + require.NoError(t, err, "failed to send message") + _, _, err = producer.SendMessage(&sarama.ProducerMessage{ + Topic: topic, + Partition: partition, + Value: sarama.StringEncoder("Another message to avoid flaky tests"), + }) + require.NoError(t, err, "failed to send message") +} + +func consumeMessage(t *testing.T, addrs []string, cfg *sarama.Config) { + t.Helper() + + consumer, err := sarama.NewConsumer(addrs, cfg) + require.NoError(t, err, "failed to create consumer") + defer func() { assert.NoError(t, consumer.Close(), "failed to close consumer") }() + + partitionConsumer, err := consumer.ConsumePartition(topic, partition, sarama.OffsetOldest) + require.NoError(t, err, "failed to create partition consumer") + defer func() { assert.NoError(t, partitionConsumer.Close(), "failed to close partition consumer") }() + + expectedMessages := []string{"Hello, World!", "Another message to avoid flaky tests"} + for i := 0; i < len(expectedMessages); i++ { + select { + case msg := <-partitionConsumer.Messages(): + require.Equal(t, expectedMessages[i], string(msg.Value)) + case <-time.After(15 * time.Second): + t.Fatal("timed out waiting for message") + } + } +} + +func (tc *TestCase) Run(_ context.Context, t *testing.T) { + produceMessage(t, tc.addrs, tc.cfg) + consumeMessage(t, tc.addrs, tc.cfg) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.produce", + "type": "queue", + "service": "kafka", + }, + Meta: map[string]string{ + "span.kind": "producer", + "component": "Shopify/sarama", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "kafka.consume", + "type": "queue", + "service": "kafka", + }, + Meta: map[string]string{ + "span.kind": "consumer", + "component": "Shopify/sarama", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/slog/generated_test.go b/internal/orchestrion/_integration/slog/generated_test.go new file mode 100644 index 0000000000..132c18f33d --- /dev/null +++ b/internal/orchestrion/_integration/slog/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package slog + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/slog/slog.go b/internal/orchestrion/_integration/slog/slog.go new file mode 100644 index 0000000000..cd1801c1b7 --- /dev/null +++ b/internal/orchestrion/_integration/slog/slog.go @@ -0,0 +1,86 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package slog + +import ( + "bufio" + "bytes" + "context" + "log/slog" + "regexp" + "strings" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCase struct { + logger *slog.Logger + logs *bytes.Buffer +} + +func (tc *TestCase) Setup(context.Context, *testing.T) { + tc.logs = new(bytes.Buffer) + handler := slog.NewTextHandler( + tc.logs, + &slog.HandlerOptions{Level: slog.LevelDebug}, + ) + tc.logger = slog.New(handler) + // call slog.New again to trigger possible errors in the aspect + slog.New(handler) +} + +//dd:span +func Log(ctx context.Context, f func(context.Context, string, ...any), msg string) { + f(ctx, msg) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + Log(ctx, tc.logger.DebugContext, "debug") + Log(ctx, tc.logger.InfoContext, "info") + Log(ctx, tc.logger.WarnContext, "warn") + Log(ctx, tc.logger.ErrorContext, "error") + Log(ctx, func(ctx context.Context, s string, a ...any) { + tc.logger.Log(ctx, slog.LevelInfo, s, a...) + }, "log") + + tc.testDeadlock(ctx, t) + + logs := tc.logs.String() + t.Logf("got logs: %s", logs) + for _, msg := range []string{"debug", "info", "warn", "error", "log"} { + want := "msg=" + msg + if !strings.Contains(logs, want) { + t.Fatalf("missing log message %s", msg) + } + } + + s := bufio.NewScanner(tc.logs) + for s.Scan() { + line := s.Bytes() + t.Logf("%s", line) + if ok, _ := regexp.Match(`dd.span_id=\d+`, line); !ok { + t.Errorf("no span ID") + } + if ok, _ := regexp.Match(`dd.trace_id=\d+`, line); !ok { + t.Errorf("no trace ID") + } + } +} + +func (tc *TestCase) testDeadlock(ctx context.Context, t *testing.T) { + var buf bytes.Buffer + handler := slog.NewTextHandler(&buf, &slog.HandlerOptions{Level: slog.LevelInfo}) + orig := slog.Default() + slog.SetDefault(slog.New(handler)) + + slog.SetDefault(orig) + + logger := slog.Default() + logger.InfoContext(ctx, "This should deadlock") +} + +func (*TestCase) ExpectedTraces() trace.Traces { return trace.Traces{} } diff --git a/internal/orchestrion/_integration/sql/generated_test.go b/internal/orchestrion/_integration/sql/generated_test.go new file mode 100644 index 0000000000..a9441e29e0 --- /dev/null +++ b/internal/orchestrion/_integration/sql/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package sql + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/sql/sql.go b/internal/orchestrion/_integration/sql/sql.go new file mode 100644 index 0000000000..a832426c8c --- /dev/null +++ b/internal/orchestrion/_integration/sql/sql.go @@ -0,0 +1,89 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package sql + +import ( + "context" + "database/sql" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + _ "github.com/mattn/go-sqlite3" // Auto-register sqlite3 driver + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +type TestCase struct { + *sql.DB + // untraced is the un-traced database connection, used to set up the test case + // without producing unnecessary spans. It is retained as a [TestCase] field + // and cleaned up using [t.Cleanup] to ensure the shared cache is not lost, as + // it stops existing once the last DB connection using it is closed. + untraced *sql.DB +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + const ( + dn = "sqlite3" + dsn = "file::memory:?cache=shared" + ) + + var err error + + //orchestrion:ignore + tc.untraced, err = sql.Open(dn, dsn) + require.NoError(t, err) + t.Cleanup(func() { require.NoError(t, tc.untraced.Close()) }) + + _, err = tc.untraced.ExecContext(ctx, + `CREATE TABLE IF NOT EXISTS notes ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + userid INTEGER, + content STRING, + created STRING + )`) + require.NoError(t, err) + + _, err = tc.untraced.ExecContext(ctx, + `INSERT OR REPLACE INTO notes(userid, content, created) VALUES + (1, 'Hello, John. This is John. You are leaving a note for yourself. You are welcome and thank you.', datetime('now')), + (1, 'Hey, remember to mow the lawn.', datetime('now')), + (2, 'Reminder to submit that report by Thursday.', datetime('now')), + (2, 'Opportunities don''t happen, you create them.', datetime('now')), + (3, 'Pick up cabbage from the store on the way home.', datetime('now')), + (3, 'Review PR #1138', datetime('now') + )`) + require.NoError(t, err) + + tc.DB, err = sql.Open(dn, dsn) + require.NoError(t, err) + t.Cleanup(func() { assert.NoError(t, tc.DB.Close()) }) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + _, err := tc.DB.ExecContext(ctx, + `INSERT INTO notes (userid, content, created) VALUES (?, ?, datetime('now'));`, + 1337, "This is Elite!") + require.NoError(t, err) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "resource": "INSERT INTO notes (userid, content, created) VALUES (?, ?, datetime('now'));", + "type": "sql", + "name": "sqlite3.query", + "service": "sqlite3.db", + }, + Meta: map[string]string{ + "component": "database/sql", + "span.kind": "client", + "sql.query_type": "Exec", + }, + }, + } +} diff --git a/internal/orchestrion/_integration/testdata/rasp-only-rules.json b/internal/orchestrion/_integration/testdata/rasp-only-rules.json new file mode 100644 index 0000000000..ecbaf0d16f --- /dev/null +++ b/internal/orchestrion/_integration/testdata/rasp-only-rules.json @@ -0,0 +1,158 @@ +{ + "version": "2.2", + "metadata": { + "rules_version": "1.4.2" + }, + "rules": [ + { + "id": "rasp-930-100", + "name": "Local file inclusion exploit", + "tags": { + "type": "lfi", + "category": "vulnerability_trigger", + "cwe": "22", + "capec": "1000/255/153/126", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.io.fs.file" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ] + }, + "operator": "lfi_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-934-100", + "name": "Server-side request forgery exploit", + "tags": { + "type": "ssrf", + "category": "vulnerability_trigger", + "cwe": "918", + "capec": "1000/225/115/664", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.io.net.url" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "grpc.server.request.message" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ] + }, + "operator": "ssrf_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + }, + { + "id": "rasp-942-100", + "name": "SQL injection exploit", + "tags": { + "type": "sql_injection", + "category": "vulnerability_trigger", + "cwe": "89", + "capec": "1000/152/248/66", + "confidence": "0", + "module": "rasp" + }, + "conditions": [ + { + "parameters": { + "resource": [ + { + "address": "server.db.statement" + } + ], + "params": [ + { + "address": "server.request.query" + }, + { + "address": "server.request.body" + }, + { + "address": "server.request.path_params" + }, + { + "address": "graphql.server.all_resolvers" + }, + { + "address": "graphql.server.resolver" + } + ], + "db_type": [ + { + "address": "server.db.system" + } + ] + }, + "operator": "sqli_detector" + } + ], + "transformers": [], + "on_match": [ + "stack_trace", + "block" + ] + } + ], + "rules_data": [] +} diff --git a/internal/orchestrion/_integration/twirp/base.go b/internal/orchestrion/_integration/twirp/base.go new file mode 100644 index 0000000000..d77fa9367e --- /dev/null +++ b/internal/orchestrion/_integration/twirp/base.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package twirp + +import ( + "context" + "net" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/twitchtv/twirp" + "github.com/twitchtv/twirp/example" +) + +func Setup(t *testing.T) (string, example.Haberdasher) { + lis, err := net.Listen("tcp", "127.0.0.1:0") + require.NoError(t, err) + + addr := "http://" + lis.Addr().String() + handler := example.NewHaberdasherServer(&randomHaberdasher{}) + srv := &http.Server{Handler: handler} + + go func() { + assert.ErrorIs(t, srv.Serve(lis), http.ErrServerClosed) + }() + t.Cleanup(func() { + // Using a new 10s-timeout context, as we may be running cleanup after the original context expired. + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + assert.NoError(t, srv.Shutdown(ctx)) + }) + + client := example.NewHaberdasherJSONClient(addr, http.DefaultClient) + + return addr, client +} + +type randomHaberdasher struct{} + +func (*randomHaberdasher) MakeHat(_ context.Context, size *example.Size) (*example.Hat, error) { + if size.Inches <= 0 { + return nil, twirp.InvalidArgumentError("Inches", "I can't make a hat that small!") + } + return &example.Hat{ + Size: size.Inches, + Color: "blue", + Name: "top hat", + }, nil +} diff --git a/internal/orchestrion/_integration/twirp/generated_test.go b/internal/orchestrion/_integration/twirp/generated_test.go new file mode 100644 index 0000000000..8510aee91b --- /dev/null +++ b/internal/orchestrion/_integration/twirp/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package twirp + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/twirp/twirp.go b/internal/orchestrion/_integration/twirp/twirp.go new file mode 100644 index 0000000000..24753409c0 --- /dev/null +++ b/internal/orchestrion/_integration/twirp/twirp.go @@ -0,0 +1,80 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package twirp + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "github.com/twitchtv/twirp/example" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCase struct { + client example.Haberdasher + addr string +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + tc.addr, tc.client = Setup(t) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + _, err := tc.client.MakeHat(ctx, &example.Size{Inches: 6}) + require.NoError(t, err) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "twirp.test", + "resource": "POST /twirp/twitch.twirp.example.Haberdasher/MakeHat", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "http.router", + "resource": "POST /twirp/twitch.twirp.example.Haberdasher/MakeHat", + "type": "web", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "twirp.Haberdasher", + "service": "twirp-server", + "resource": "MakeHat", + "type": "web", + }, + Meta: map[string]string{ + "component": "twitchtv/twirp", + "rpc.system": "twirp", + "rpc.service": "Haberdasher", + "rpc.method": "MakeHat", + "twirp.method": "MakeHat", + "twirp.package": "twitch.twirp.example", + "twirp.service": "Haberdasher", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/twirp_quantize/generated_test.go b/internal/orchestrion/_integration/twirp_quantize/generated_test.go new file mode 100644 index 0000000000..73fb68940d --- /dev/null +++ b/internal/orchestrion/_integration/twirp_quantize/generated_test.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +package twirp_quantize + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func TestQuantize(t *testing.T) { + harness.Run(t, new(TestCaseQuantize)) +} diff --git a/internal/orchestrion/_integration/twirp_quantize/twirp_quantize.go b/internal/orchestrion/_integration/twirp_quantize/twirp_quantize.go new file mode 100644 index 0000000000..96c4019fcd --- /dev/null +++ b/internal/orchestrion/_integration/twirp_quantize/twirp_quantize.go @@ -0,0 +1,85 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +package twirp_quantize + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "github.com/twitchtv/twirp/example" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/twirp" +) + +type TestCaseQuantize struct { + client example.Haberdasher + addr string +} + +func (tc *TestCaseQuantize) Setup(_ context.Context, t *testing.T) { + // Enable URL quantize + t.Setenv("DD_TRACE_HTTP_CLIENT_RESOURCE_NAME_QUANTIZE", "true") + t.Setenv("DD_TRACE_HTTP_HANDLER_RESOURCE_NAME_QUANTIZE", "true") + + tc.addr, tc.client = twirp.Setup(t) +} + +func (tc *TestCaseQuantize) Run(ctx context.Context, t *testing.T) { + _, err := tc.client.MakeHat(ctx, &example.Size{Inches: 6}) + require.NoError(t, err) +} + +func (*TestCaseQuantize) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "twirp_quantize.test", + "resource": "POST /twirp/*/MakeHat", + "type": "http", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "client", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "http.router", + "resource": "POST /twirp/*/MakeHat", + "type": "web", + }, + Meta: map[string]string{ + "component": "net/http", + "span.kind": "server", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "twirp.Haberdasher", + "service": "twirp-server", + "resource": "MakeHat", + "type": "web", + }, + Meta: map[string]string{ + "component": "twitchtv/twirp", + "rpc.system": "twirp", + "rpc.service": "Haberdasher", + "rpc.method": "MakeHat", + "twirp.method": "MakeHat", + "twirp.package": "twitch.twirp.example", + "twirp.service": "Haberdasher", + }, + }, + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/valkey-go/generated_test.go b/internal/orchestrion/_integration/valkey-go/generated_test.go new file mode 100644 index 0000000000..9693c23f2d --- /dev/null +++ b/internal/orchestrion/_integration/valkey-go/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package valkey + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/valkey-go/valkey.go b/internal/orchestrion/_integration/valkey-go/valkey.go new file mode 100644 index 0000000000..78d746db6b --- /dev/null +++ b/internal/orchestrion/_integration/valkey-go/valkey.go @@ -0,0 +1,86 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package valkey + +import ( + "context" + "testing" + + "github.com/stretchr/testify/require" + "github.com/valkey-io/valkey-go" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" +) + +type TestCase struct { + client valkey.Client +} + +func (tc *TestCase) Setup(_ context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + _, addr := containers.StartValkeyTestContainer(t) + var err error + tc.client, err = valkey.NewClient(valkey.ClientOption{ + InitAddress: []string{addr}, + }) + require.NoError(t, err) +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + require.NoError(t, tc.client.Do(ctx, tc.client.B().Set().Key("key").Value("value").Build()).Error()) + require.NoError(t, tc.client.Do(ctx, tc.client.B().Get().Key("key").Build()).Error()) +} + +func (tc *TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "valkey.command", + "service": "valkey.client", + "resource": "SET", + "type": "valkey", + }, + Meta: map[string]string{ + "component": "valkey-io/valkey-go", + "db.system": "valkey", + "db.valkey.client.cache.hit": "false", + "out.db": "0", + "out.host": "localhost", + "span.kind": "client", + }, + }, + { + Tags: map[string]any{ + "name": "valkey.command", + "service": "valkey.client", + "resource": "GET", + "type": "valkey", + }, + Meta: map[string]string{ + "component": "valkey-io/valkey-go", + "db.system": "valkey", + "db.valkey.client.cache.hit": "false", + "out.db": "0", + "out.host": "localhost", + "span.kind": "client", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/_integration/vault/generated_test.go b/internal/orchestrion/_integration/vault/generated_test.go new file mode 100644 index 0000000000..9c5fcf3d3c --- /dev/null +++ b/internal/orchestrion/_integration/vault/generated_test.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. +// +// Code generated by 'go generate'; DO NOT EDIT. + +//go:build linux || !githubci + +package vault + +import ( + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/harness" +) + +func Test(t *testing.T) { + harness.Run(t, new(TestCase)) +} diff --git a/internal/orchestrion/_integration/vault/vault.go b/internal/orchestrion/_integration/vault/vault.go new file mode 100644 index 0000000000..c006777496 --- /dev/null +++ b/internal/orchestrion/_integration/vault/vault.go @@ -0,0 +1,88 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023-present Datadog, Inc. + +//go:build linux || !githubci + +package vault + +import ( + "context" + "testing" + + "github.com/DataDog/dd-trace-go/instrumentation/testutils/containers/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion/_integration/internal/trace" + "github.com/hashicorp/vault/api" + "github.com/stretchr/testify/require" + "github.com/testcontainers/testcontainers-go" + tclog "github.com/testcontainers/testcontainers-go/log" + testvault "github.com/testcontainers/testcontainers-go/modules/vault" +) + +type TestCase struct { + server *testvault.VaultContainer + *api.Client +} + +func (tc *TestCase) Setup(ctx context.Context, t *testing.T) { + containers.SkipIfProviderIsNotHealthy(t) + + var err error + tc.server, err = testvault.Run(ctx, + "vault:1.7.3", // Change the docker pull stage in .github/workflows/orchestrion.yml if you update this + testcontainers.WithLogger(tclog.TestLogger(t)), + containers.WithTestLogConsumer(t), + testvault.WithToken("root"), + ) + containers.AssertTestContainersError(t, err) + containers.RegisterContainerCleanup(t, tc.server) + + addr, err := tc.server.HttpHostAddress(ctx) + if err != nil { + defer tc.server.Terminate(ctx) + t.Skipf("Failed to get vault container address: %s\n", err.Error()) + } + c, err := api.NewClient(&api.Config{ + Address: addr, + }) + c.SetToken("root") + if err != nil { + t.Fatal(err) + } + tc.Client = c +} + +func (tc *TestCase) Run(ctx context.Context, t *testing.T) { + span, ctx := tracer.StartSpanFromContext(ctx, "test.root") + defer span.Finish() + + _, err := tc.Logical().ReadWithContext(ctx, "secret/key") + require.NoError(t, err) +} + +func (*TestCase) ExpectedTraces() trace.Traces { + return trace.Traces{ + { + Tags: map[string]any{ + "name": "test.root", + }, + Children: trace.Traces{ + { + Tags: map[string]any{ + "name": "http.request", + "service": "vault", + "resource": "GET /v1/secret/key", + "type": "http", + }, + Meta: map[string]string{ + "http.method": "GET", + "http.url": "/v1/secret/key", + "span.kind": "client", + }, + }, + }, + }, + } +} diff --git a/internal/orchestrion/generator/go.mod.tmpl b/internal/orchestrion/generator/go.mod.tmpl new file mode 100644 index 0000000000..932ec4e023 --- /dev/null +++ b/internal/orchestrion/generator/go.mod.tmpl @@ -0,0 +1,29 @@ +module github.com/DataDog/dd-trace-go/orchestrion/all/v2 + +go {{ .GoVersion }} + +require ( +{{- range .Modules }} + {{ index . 0 }} {{ $.VersionTag }} +{{- end }} + github.com/DataDog/orchestrion {{ .OrchestrionLatest }} +) + +{{/* +This is a placeholder to make sure go mod tidy produces things nice & clean, and +also serves to ensure we get the right version of certain touchy dependencies +when doing "go mod tidy" here... +*/ -}} +require ( + k8s.io/apimachinery v0.26.7 // indirect + k8s.io/client-go v0.26.7 // indirect + k8s.io/api v0.26.7 // indirect +) + +replace ( +{{- range .Modules }} + {{ index . 0 }} => {{ index . 1 }} +{{- end }} +) + +replace google.golang.org/grpc => google.golang.org/grpc v1.70.0 diff --git a/internal/orchestrion/generator/main.go b/internal/orchestrion/generator/main.go new file mode 100644 index 0000000000..087a9617cf --- /dev/null +++ b/internal/orchestrion/generator/main.go @@ -0,0 +1,302 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +// This program generates the `orchestrion.tool.go` file at `./orchestrion/all` +// from the root of the repository, which contains the necessary directives to +// facilitate onboarding of orchestrion. The `orchestrion.tool.go` file contains +// an import directive for every package in `dd-trace-go` that contains an +// `orchestrion.yml` file. +// +// Orchestrion uses this file when users import +// "github.com/DataDog/dd-trace-go/orchestrion/all` in their application's +// `orchestrion.tool.go` file, intending to enable every available feature of +// the tracer library. +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "go/format" + "io/fs" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + "slices" + "strings" + "text/template" + + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/version" + "golang.org/x/tools/go/packages" + + _ "embed" // For go:embed +) + +const orchestrionToolGo = "orchestrion.tool.go" + +var optionalIntegrations = map[string]struct{}{ + "instrumentation/errortrace": {}, +} + +var ( + //go:embed orchestrion.tool.go.tmpl + templateText string + fileTemplate = template.Must(template.New(orchestrionToolGo).Parse(templateText)) + + //go:embed go.mod.tmpl + goModTemplateText string + goModTemplate = template.Must(template.New("go.mod").Parse(goModTemplateText)) +) + +func main() { + _, thisFile, _, _ := runtime.Caller(0) + rootDir := filepath.Join(thisFile, "..", "..", "..", "..") + + var orchestrionVersion string + + if v := env.Get("ORCHESTRION_VERSION"); v != "" { + orchestrionVersion = v + } else { + log.Println("Determining latest version of orchestrion...") + var buf bytes.Buffer + cmd := exec.Command("go", "list", "-m", "--versions", `-f={{ $v := "" }}{{ range .Versions }}{{ $v = . }}{{ end }}{{ $v }}`, "github.com/DataDog/orchestrion") + cmd.Stdout = &buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + log.Fatalln(err) + } + orchestrionVersion = strings.TrimSpace(buf.String()) + } + + log.Println("Using orchestrion version:", orchestrionVersion) + modules, err := generateRootConfig(rootDir, orchestrionVersion) + if err != nil { + log.Fatalln(err) + } + + if err := validateValidConfig(modules); err != nil { + log.Fatalln(err) + } +} + +func generateRootConfig(rootDir string, orchestrionLatestVersion string) (map[string]string, error) { + var ( + paths = []string{"github.com/DataDog/dd-trace-go/v2/orchestrion"} // Allows access to the `/internal/` stuff such as CI Viz. + modules = make(map[string]string) + ) + err := filepath.WalkDir(rootDir, func(path string, entry fs.DirEntry, err error) error { + if err != nil { + return err + } + + if entry.IsDir() { + // Ignore directories the go toolchain normally ignores. + if entry.Name() == "internal" || entry.Name() == "testdata" || strings.HasPrefix(entry.Name(), "_") || strings.HasPrefix(entry.Name(), ".") { + return filepath.SkipDir + } + return nil + } + + if entry.Name() != "orchestrion.yml" { + return nil + } + + rel, err := filepath.Rel(rootDir, filepath.Dir(path)) + if err != nil { + return fmt.Errorf("relative path of %q: %w", path, err) + } + if rel == "." { + // We don't want to have the root file circular reference itself! + return nil + } + if _, ok := optionalIntegrations[rel]; ok { + log.Println("Skipping optional integration:", rel) + return nil + } + + pkgs, err := packages.Load(&packages.Config{Mode: packages.NeedName | packages.NeedModule, Dir: rootDir}, "./"+rel) + if err != nil { + log.Fatalln(err) + } + + paths = append(paths, pkgs[0].PkgPath) + modules[pkgs[0].Module.Path] = pkgs[0].Module.Dir + + return nil + }) + if err != nil { + return nil, fmt.Errorf("listing packages to import: %w", err) + } + // Sort to ensure consistent ordering... + slices.Sort(paths) + + var buf bytes.Buffer + if err := fileTemplate.Execute(&buf, paths); err != nil { + return nil, fmt.Errorf("rendering Go code template: %w", err) + } + + src, err := format.Source(buf.Bytes()) + if err != nil { + log.Fatalln(err) + } + + pkgDir := filepath.Join(rootDir, "orchestrion", "all") + + err = os.WriteFile( + filepath.Join(pkgDir, orchestrionToolGo), + src, + 0o644, + ) + if err != nil { + return nil, fmt.Errorf("writing "+orchestrionToolGo+" file: %w", err) + } + + goVersion, err := getLanguageLevel(rootDir) + if err != nil { + return nil, err + } + + replaces, err := makeRelative(modules, pkgDir) + if err != nil { + return nil, err + } + var goMod bytes.Buffer + if err := goModTemplate.Execute(&goMod, map[string]any{ + "GoVersion": goVersion, + "OrchestrionLatest": orchestrionLatestVersion, + "Modules": replaces, + "VersionTag": version.Tag, + }); err != nil { + return nil, fmt.Errorf("rendering go.mod from template: %w", err) + } + if err := os.WriteFile(filepath.Join(pkgDir, "go.mod"), goMod.Bytes(), 0o644); err != nil { + return nil, fmt.Errorf("writing go.mod: %w", err) + } + + if err := goCmd(pkgDir, "mod", "tidy", "-go", goVersion); err != nil { + return nil, fmt.Errorf("go mod tidy: %w", err) + } + + // Make sure this is present in the modules map, as it's not a natural part of it... + modules["github.com/DataDog/dd-trace-go/orchestrion/all/v2"] = pkgDir + return modules, nil +} + +func getLanguageLevel(dir string) (string, error) { + cmd := exec.Command("go", "mod", "edit", "-json") + cmd.Dir = dir + var buf bytes.Buffer + cmd.Stdout = &buf + + if err := cmd.Run(); err != nil { + return "", err + } + + var res struct { + Go string `json:"Go"` + } + + if err := json.Unmarshal(buf.Bytes(), &res); err != nil { + return "", err + } + + return res.Go, nil +} + +func makeRelative(modules map[string]string, toDir string) ([][2]string, error) { + res := make([][2]string, 0, len(modules)) + for name, path := range modules { + rel, err := filepath.Rel(toDir, path) + if err != nil { + return nil, err + } + res = append(res, [2]string{name, rel}) + } + + slices.SortFunc(res, func(l, r [2]string) int { + return strings.Compare(l[0], r[0]) + }) + return res, nil +} + +const ( + mainGo = `package main + +import ( + "log" + + "github.com/DataDog/orchestrion/runtime/built" +) + +func main(){ + if !built.WithOrchestrion { + log.Fatalln("Not built with orchestrion ☹️") + } +} +` + + orchestrionToolGoContent = `//go:build tools +package tools + +import ( + _ "github.com/DataDog/orchestrion" + _ "github.com/DataDog/dd-trace-go/orchestrion/all/v2" // integration +) +` +) + +func validateValidConfig(modules map[string]string) error { + tmp, err := os.MkdirTemp("", "dd-trace-go.orchestrion-*") + if err != nil { + return fmt.Errorf("MkdirTemp: %w", err) + } + defer os.RemoveAll(tmp) + + if err := goCmd(tmp, "mod", "init", "github.com/DataDog/dd-trace-go.orchestrion"); err != nil { + return fmt.Errorf("init module: %w", err) + } + mods := []string{"edit"} + for name, path := range modules { + mods = append(mods, "-require", name+"@"+version.Tag, "-replace", name+"="+path) + } + if err := goCmd(tmp, "mod", mods...); err != nil { + return fmt.Errorf("go mod %s: %w", mods, err) + } + + if err := os.WriteFile(filepath.Join(tmp, "main.go"), []byte(mainGo), 0o644); err != nil { + return fmt.Errorf("writing main.go: %w", err) + } + if err := os.WriteFile(filepath.Join(tmp, orchestrionToolGo), []byte(orchestrionToolGoContent), 0o644); err != nil { + return fmt.Errorf("writing "+orchestrionToolGo+": %w", err) + } + + if err := goCmd(tmp, "mod", "tidy"); err != nil { + return fmt.Errorf("go mod tidy: %w", err) + } + + logFile := filepath.Join(tmp, "orchestrion.log") + fmt.Println("Orchestrion log file is:", logFile) + if err := goCmd(tmp, "run", + "github.com/DataDog/orchestrion", "-log-level=trace", "-log-file", logFile, + "go", "run", ".", + ); err != nil { + return fmt.Errorf("go run: %w", err) + } + + return nil +} + +func goCmd(dir string, command string, args ...string) error { + cmd := exec.Command("go", command) + cmd.Args = append(cmd.Args, args...) + cmd.Dir = dir + cmd.Stdin = os.Stdin + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} diff --git a/internal/orchestrion/generator/orchestrion.tool.go.tmpl b/internal/orchestrion/generator/orchestrion.tool.go.tmpl new file mode 100644 index 0000000000..25fa1b84ac --- /dev/null +++ b/internal/orchestrion/generator/orchestrion.tool.go.tmpl @@ -0,0 +1,27 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Code generated by 'go generate' DO NOT EDIT + +//go:build tools + +package all + +//go:generate go run github.com/DataDog/dd-trace-go/v2/internal/orchestrion/generator + +// Importing "github.com/DataDog/dd-trace-go/v2/orchestrion/all" in an +// `orchestrion.tool.go` file causes the package to use _all_ available +// integrations of `dd-trace-go`. +// This makes it easy to ensure all available features of DataDog are enabled in +// your go application, but may cause your dependency closure (`go.mod` and +// `go.sum` files) to include a lot more packages than are stricly necessary for +// your application. If that is a problem, you should instead manually import +// only the specific integrations that are useful to your application. +import ( + _ "github.com/DataDog/orchestrion" + +{{ range . }} _ {{ printf "%q" . }} // integration +{{ end -}} +) diff --git a/internal/orchestrion/gls.go b/internal/orchestrion/gls.go index d117759c05..c36a807ef6 100644 --- a/internal/orchestrion/gls.go +++ b/internal/orchestrion/gls.go @@ -22,10 +22,10 @@ var ( // Accessors set by orchestrion in the runtime package. If orchestrion is not enabled, these will be nil as per the default values. //revive:disable:var-naming -//go:linkname __dd_orchestrion_gls_get __dd_orchestrion_gls_get +//go:linkname __dd_orchestrion_gls_get __dd_orchestrion_gls_get.V2 var __dd_orchestrion_gls_get func() any -//go:linkname __dd_orchestrion_gls_set __dd_orchestrion_gls_set +//go:linkname __dd_orchestrion_gls_set __dd_orchestrion_gls_set.V2 var __dd_orchestrion_gls_set func(any) //revive:enable:var-naming diff --git a/internal/orchestrion/gls.orchestrion.yml b/internal/orchestrion/gls.orchestrion.yml new file mode 100644 index 0000000000..5afc5284db --- /dev/null +++ b/internal/orchestrion/gls.orchestrion.yml @@ -0,0 +1,48 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/v2/internal/orchestrion + description: Operations that interact with Go's runtime system. + caveats: |- + This configuration introduces a way to access the Goroutine Local Storage (GLS), which is not + meant to be used directly by end-users. This is intended to be used only by tracer internals to + enable trace context forwarding in places where a {{}} + value is not available. + +aspects: + - id: __dd_gls_v2 + join-point: + struct-definition: runtime.g + advice: + - add-struct-field: + name: __dd_gls_v2 + type: any + - add-blank-import: unsafe # Needed for go:linkname + - inject-declarations: + # Reference: https://github.com/golang/go/blob/6d89b38ed86e0bfa0ddaba08dc4071e6bb300eea/src/runtime/HACKING.md?plain=1#L44-L54 + template: |- + //go:linkname __dd_orchestrion_gls_get __dd_orchestrion_gls_get.V2 + var __dd_orchestrion_gls_get = func() any { + return getg().m.curg.__dd_gls_v2 + } + + //go:linkname __dd_orchestrion_gls_set __dd_orchestrion_gls_set.V2 + var __dd_orchestrion_gls_set = func(val any) { + getg().m.curg.__dd_gls_v2 = val + } + - id: goexit1 + join-point: + all-of: + - import-path: runtime + - function-body: + function: + # This is the function that finishes the execution of a goroutine. + # See: https://github.com/golang/go/blob/f38d42f2c4c6ad0d7cbdad5e1417cac3be2a5dcb/src/runtime/proc.go#L4264 + - name: goexit1 + advice: + - prepend-statements: + template: getg().__dd_gls_v2 = nil diff --git a/internal/orchestrion/matrix/matrix.go b/internal/orchestrion/matrix/matrix.go new file mode 100644 index 0000000000..274f7bacb4 --- /dev/null +++ b/internal/orchestrion/matrix/matrix.go @@ -0,0 +1,86 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "log" + "os" + "os/exec" + "regexp" + "slices" +) + +// This program lists available releases of `go` to determine the various labels +// to be provided as `actions/setup-go`'s `go-version` input. It outputs a JSON +// encoded array that always includes `oldstable` and `stable`, and may include +// a release candidate version if there is one that is newer than `stable`. +func main() { + cmd := exec.Command("go", "list", "-m", "-versions", "-json=Versions", "go") + var stdout bytes.Buffer + cmd.Stdout = &stdout + + if err := cmd.Run(); err != nil { + log.Fatalln(err) + } + + var module struct { + Versions []string `json:"Versions"` + } + dec := json.NewDecoder(&stdout) + if err := dec.Decode(&module); err != nil { + log.Fatalln(err) + } + + if rest, err := io.ReadAll(&stdout); err != nil { + log.Fatalln(err) + } else if rest = bytes.TrimSpace(rest); len(rest) > 0 { + log.Fatalln("Unexpected trailing data in go list output:", string(rest)) + } + + if len(module.Versions) == 0 { + log.Fatalln("No versions found!") + } + + versions := append(make([]string, 0, 3), "oldstable", "stable") + + // module.Versions is sorted in semantic versioning order... + slices.Reverse(module.Versions) + versionRe := regexp.MustCompile(`^(1\.\d+)(\.\d+)?(?:(beta|rc)(\d+))?$`) + for _, v := range module.Versions { + parts := versionRe.FindStringSubmatch(v) + if parts == nil { + log.Fatalln("Unsupported version string:", v) + } + major, minor, pre, serial := parts[1], parts[2], parts[3], parts[4] + if pre == "" { + // Not a pre-release, we're done looking for a "next" release! + break + } + if pre != "rc" { + // Not a release candidate, we don't test against those... + continue + } + if minor == "" { + minor = ".0" + } + versions = append(versions, major+minor+"-"+pre+"."+serial) + // We have found a release candidate to test against, we're done! + break + } + + jsonText, err := json.Marshal(versions) + if err != nil { + log.Fatalln(err) + } + + if _, err := fmt.Fprintln(os.Stdout, string(jsonText)); err != nil { + log.Fatalln(err) + } +} diff --git a/internal/orchestrion/orchestrion.go b/internal/orchestrion/orchestrion.go index 679593652e..334a6db149 100644 --- a/internal/orchestrion/orchestrion.go +++ b/internal/orchestrion/orchestrion.go @@ -7,9 +7,15 @@ package orchestrion // Orchestrion will change this at build-time // -//dd:orchestrion-enabled +//orchestrion:enabled var enabled = false +// The version of the orchestrion binary used to build the current binray, or +// blank if the current binary was not built using orchestrion. +// +//orchestrion:version +const Version = "" + // Enabled returns whether the current build was compiled with orchestrion or not. func Enabled() bool { return enabled diff --git a/internal/osinfo/osinfo.go b/internal/osinfo/osinfo.go index 7519a917e9..32ddb763a1 100644 --- a/internal/osinfo/osinfo.go +++ b/internal/osinfo/osinfo.go @@ -1,21 +1,54 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. +// Copyright 2024 Datadog, Inc. -// Package osinfo provides information about the current operating system release package osinfo +import ( + "runtime" +) + +// Modified in init functions to provide OS-specific information +var ( + osName = runtime.GOOS + osVersion = "unknown" + arch = runtime.GOARCH + kernelName = "unknown" + kernelRelease = "unknown" + kernelVersion = "unknown" +) + // OSName returns the name of the operating system, including the distribution // for Linux when possible. func OSName() string { // call out to OS-specific implementation - return osName() + return osName } // OSVersion returns the operating system release, e.g. major/minor version // number and build ID. func OSVersion() string { // call out to OS-specific implementation - return osVersion() + return osVersion +} + +// Architecture returns the architecture of the operating system. +func Architecture() string { + return arch +} + +// KernelName returns the name of the kernel. +func KernelName() string { + return kernelName +} + +// KernelRelease returns the release of the kernel. +func KernelRelease() string { + return kernelRelease +} + +// KernelVersion returns the version of the kernel. +func KernelVersion() string { + return kernelVersion } diff --git a/internal/osinfo/osinfo_darwin.go b/internal/osinfo/osinfo_darwin.go deleted file mode 100644 index 32ead5fe05..0000000000 --- a/internal/osinfo/osinfo_darwin.go +++ /dev/null @@ -1,24 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package osinfo - -import ( - "os/exec" - "runtime" - "strings" -) - -func osName() string { - return runtime.GOOS -} - -func osVersion() string { - out, err := exec.Command("sw_vers", "-productVersion").Output() - if err != nil { - return "unknown" - } - return strings.Trim(string(out), "\n") -} diff --git a/internal/osinfo/osinfo_linux.go b/internal/osinfo/osinfo_linux.go deleted file mode 100644 index 96d1e66ad1..0000000000 --- a/internal/osinfo/osinfo_linux.go +++ /dev/null @@ -1,52 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2016 Datadog, Inc. - -package osinfo - -import ( - "bufio" - "os" - "strings" -) - -func osName() string { - f, err := os.Open("/etc/os-release") - if err != nil { - return "Linux (Unknown Distribution)" - } - defer f.Close() - s := bufio.NewScanner(f) - name := "Linux (Unknown Distribution)" - for s.Scan() { - parts := strings.SplitN(s.Text(), "=", 2) - switch parts[0] { - case "NAME": - name = strings.Trim(parts[1], "\"") - } - } - return name -} - -func osVersion() string { - f, err := os.Open("/etc/os-release") - if err != nil { - return "unknown" - } - defer f.Close() - s := bufio.NewScanner(f) - version := "unknown" - for s.Scan() { - parts := strings.SplitN(s.Text(), "=", 2) - switch parts[0] { - case "VERSION": - version = strings.Trim(parts[1], "\"") - case "VERSION_ID": - if version == "" { - version = strings.Trim(parts[1], "\"") - } - } - } - return version -} diff --git a/internal/osinfo/osinfo_test.go b/internal/osinfo/osinfo_test.go new file mode 100644 index 0000000000..1732d7579b --- /dev/null +++ b/internal/osinfo/osinfo_test.go @@ -0,0 +1,42 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package osinfo_test + +import ( + "runtime" + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/mod/semver" + + "github.com/DataDog/dd-trace-go/v2/internal/osinfo" +) + +func Test(t *testing.T) { + var ( + osName = osinfo.OSName() + osVersion = osinfo.OSVersion() + arch = osinfo.Architecture() + kernelName = osinfo.KernelName() + kernelRelease = osinfo.KernelRelease() + kernelVersion = osinfo.KernelVersion() + ) + + t.Logf("OS Name: %s\n", osName) + t.Logf("OS Version: %s\n", osVersion) + t.Logf("Architecture: %s\n", arch) + t.Logf("Kernel Name: %s\n", kernelName) + t.Logf("Kernel Release: %s\n", kernelRelease) + t.Logf("Kernel Version: %s\n", kernelVersion) + + switch runtime.GOOS { + case "linux": + require.Equal(t, "Linux", kernelName) + require.Truef(t, semver.IsValid("v"+kernelRelease), "invalid kernel version: %s", kernelRelease) + case "darwin": + require.Equal(t, "Darwin", kernelName) + } +} diff --git a/internal/osinfo/osinfo_unix.go b/internal/osinfo/osinfo_unix.go new file mode 100644 index 0000000000..36d96da3aa --- /dev/null +++ b/internal/osinfo/osinfo_unix.go @@ -0,0 +1,70 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +//go:build unix + +package osinfo + +import ( + "bufio" + "bytes" + "os" + "os/exec" + "runtime" + "strings" + + "golang.org/x/sys/unix" +) + +func init() { + // Change the default values for backwards compatibility on scenarios + if runtime.GOOS == "linux" { + osName = "Linux (Unknown Distribution)" + kernelName = "Linux" + } + + if runtime.GOOS == "darwin" { + kernelName = "Darwin" + out, err := exec.Command("sw_vers", "-productVersion").Output() + if err != nil { + return + } + + osVersion = string(bytes.Trim(out, "\n")) + } + + var uts unix.Utsname + if err := unix.Uname(&uts); err == nil { + kernelName = string(bytes.TrimRight(uts.Sysname[:], "\x00")) + kernelVersion = string(bytes.TrimRight(uts.Version[:], "\x00")) + kernelRelease = strings.SplitN(strings.TrimRight(string(uts.Release[:]), "\x00"), "-", 2)[0] + + // Backwards compatibility on how data is reported for freebsd + if runtime.GOOS == "freebsd" { + osVersion = kernelRelease + } + } + + f, err := os.Open("/etc/os-release") + if err != nil { + return + } + + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + parts := strings.SplitN(scanner.Text(), "=", 2) + switch parts[0] { + case "NAME": + osName = strings.Trim(parts[1], "\"") + case "VERSION": + osVersion = strings.Trim(parts[1], "\"") + case "VERSION_ID": + if osVersion == "" { // Fallback to VERSION_ID if VERSION is not set + osVersion = strings.Trim(parts[1], "\"") + } + } + } +} diff --git a/internal/osinfo/osinfo_windows.go b/internal/osinfo/osinfo_windows.go index 659bd9ce6a..2755284648 100644 --- a/internal/osinfo/osinfo_windows.go +++ b/internal/osinfo/osinfo_windows.go @@ -3,24 +3,21 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. +//go:build windows + package osinfo import ( "fmt" - "runtime" "strings" "golang.org/x/sys/windows/registry" ) -func osName() string { - return runtime.GOOS -} - -func osVersion() string { +func init() { k, err := registry.OpenKey(registry.LOCAL_MACHINE, `SOFTWARE\Microsoft\Windows NT\CurrentVersion`, registry.QUERY_VALUE) if err != nil { - return "unknown" + return } defer k.Close() @@ -50,5 +47,6 @@ func osVersion() string { } else { version.WriteString(" Unknown Build") } - return version.String() + + osVersion = version.String() } diff --git a/internal/processtags/processtags.go b/internal/processtags/processtags.go new file mode 100644 index 0000000000..0feab83809 --- /dev/null +++ b/internal/processtags/processtags.go @@ -0,0 +1,155 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package processtags + +import ( + "os" + "path/filepath" + "sort" + "strings" + "sync" + + "github.com/DataDog/datadog-agent/pkg/trace/traceutil/normalize" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +const envProcessTagsEnabled = "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED" + +const ( + tagEntrypointName = "entrypoint.name" + tagEntrypointBasedir = "entrypoint.basedir" + tagEntrypointWorkdir = "entrypoint.workdir" + tagEntrypointType = "entrypoint.type" +) + +const ( + entrypointTypeExecutable = "executable" +) + +var ( + enabled bool + pTags *ProcessTags +) + +func init() { + Reload() +} + +type ProcessTags struct { + mu sync.RWMutex + tags map[string]string + str string + slice []string +} + +// String returns the string representation of the process tags. +func (p *ProcessTags) String() string { + if p == nil { + return "" + } + p.mu.RLock() + defer p.mu.RUnlock() + return p.str +} + +// Slice returns the string slice representation of the process tags. +func (p *ProcessTags) Slice() []string { + if p == nil { + return nil + } + p.mu.RLock() + defer p.mu.RUnlock() + return p.slice +} + +func (p *ProcessTags) merge(newTags map[string]string) { + if len(newTags) == 0 { + return + } + pTags.mu.Lock() + defer pTags.mu.Unlock() + + if p.tags == nil { + p.tags = make(map[string]string) + } + for k, v := range newTags { + p.tags[k] = v + } + + // loop over the sorted map keys so the resulting string and slice versions are created consistently. + keys := make([]string, 0, len(p.tags)) + for k := range p.tags { + keys = append(keys, k) + } + sort.Strings(keys) + + tagsSlice := make([]string, 0, len(p.tags)) + var b strings.Builder + first := true + for _, k := range keys { + val := p.tags[k] + if !first { + b.WriteByte(',') + } + first = false + keyVal := normalize.NormalizeTag(k + ":" + val) + b.WriteString(keyVal) + tagsSlice = append(tagsSlice, keyVal) + } + p.slice = tagsSlice + p.str = b.String() +} + +// Reload initializes the configuration and process tags collection. This is useful for tests. +func Reload() { + enabled = internal.BoolEnv(envProcessTagsEnabled, true) + if !enabled { + return + } + pTags = &ProcessTags{} + tags := collect() + if len(tags) > 0 { + Add(tags) + } +} + +func collect() map[string]string { + tags := make(map[string]string) + execPath, err := os.Executable() + if err != nil { + log.Debug("failed to get binary path: %s", err.Error()) + } else { + baseDirName := filepath.Base(filepath.Dir(execPath)) + tags[tagEntrypointName] = filepath.Base(execPath) + tags[tagEntrypointBasedir] = baseDirName + tags[tagEntrypointType] = entrypointTypeExecutable + } + wd, err := os.Getwd() + if err != nil { + log.Debug("failed to get working directory: %s", err.Error()) + } else { + tags[tagEntrypointWorkdir] = filepath.Base(wd) + } + return tags +} + +// GlobalTags returns the global process tags. +func GlobalTags() *ProcessTags { + if !enabled { + return nil + } + return pTags +} + +// Add merges the given tags into the global processTags map. +func Add(tags map[string]string) { + if !enabled { + return + } + pTags.merge(tags) +} diff --git a/internal/processtags/processtags_test.go b/internal/processtags/processtags_test.go new file mode 100644 index 0000000000..5e0618c445 --- /dev/null +++ b/internal/processtags/processtags_test.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package processtags + +import ( + "regexp" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestProcessTags(t *testing.T) { + t.Run("enabled", func(t *testing.T) { + wantTagsRe := regexp.MustCompile(`^entrypoint\.basedir:[a-zA-Z0-9._-]+,entrypoint\.name:[a-zA-Z0-9._-]+,entrypoint.type:executable,entrypoint\.workdir:[a-zA-Z0-9._-]+$`) + p := GlobalTags() + assert.NotNil(t, p) + assert.NotEmpty(t, p.String()) + assert.Regexp(t, wantTagsRe, p.String(), "wrong string serialized tags") + + assert.NotEmpty(t, p.Slice()) + assert.Regexp(t, wantTagsRe, strings.Join(p.Slice(), ","), "wrong slice serialized tags") + }) + + t.Run("disabled", func(t *testing.T) { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "false") + Reload() + + p := GlobalTags() + assert.Nil(t, p) + assert.Empty(t, p.String()) + assert.Empty(t, p.Slice()) + }) +} diff --git a/internal/remoteconfig/config.go b/internal/remoteconfig/config.go index 45fd99e02a..d4d57d952c 100644 --- a/internal/remoteconfig/config.go +++ b/internal/remoteconfig/config.go @@ -7,13 +7,13 @@ package remoteconfig import ( "net/http" - "os" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) const ( @@ -45,13 +45,13 @@ type ClientConfig struct { // DefaultClientConfig returns the default remote config client configuration func DefaultClientConfig() ClientConfig { return ClientConfig{ - Env: os.Getenv("DD_ENV"), + Env: env.Get("DD_ENV"), HTTP: &http.Client{Timeout: 10 * time.Second}, PollInterval: pollIntervalFromEnv(), RuntimeID: globalconfig.RuntimeID(), ServiceName: globalconfig.ServiceName(), TracerVersion: version.Tag, - TUFRoot: os.Getenv("DD_RC_TUF_ROOT"), + TUFRoot: env.Get("DD_RC_TUF_ROOT"), } } diff --git a/internal/remoteconfig/config_test.go b/internal/remoteconfig/config_test.go index 803f96288f..bb4336fc20 100644 --- a/internal/remoteconfig/config_test.go +++ b/internal/remoteconfig/config_test.go @@ -21,7 +21,7 @@ func Test_pollIntervalFromEnv(t *testing.T) { }{ { name: "default", - setup: func(t *testing.T) {}, + setup: func(_ *testing.T) {}, want: defaultInterval, }, { diff --git a/internal/remoteconfig/path.go b/internal/remoteconfig/path.go new file mode 100644 index 0000000000..db09f95fc6 --- /dev/null +++ b/internal/remoteconfig/path.go @@ -0,0 +1,96 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +package remoteconfig + +import ( + "fmt" + "strings" +) + +type ( + Path struct { + // The source of the config. Either "datadog/", or "employee" + Source Source + // The name of the product that produced this config (e.g, "ASM_DD"). + Product string + // The ID of the config (e.g, "blocked_ips") + ConfigID string + // The name of the config object (e.g, "config") + Name string + } + Source interface { + fmt.Stringer + isSource() + } + DatadogSource struct { + source + OrgID string + } + EmployeeSource struct { + source + } + source struct{} +) + +// ParsePath parses a remote config target file path into its components. +func ParsePath(filename string) (Path, bool) { + // See: https://docs.google.com/document/d/1u_G7TOr8wJX0dOM_zUDKuRJgxoJU_hVTd5SeaMucQUs/edit?tab=t.0#bookmark=id.ew0e2fwzf8p7 + parts := strings.Split(filename, "/") + if len(parts) < 4 { + return Path{}, false + } + + var source Source + switch parts[0] { + case "datadog": + orgID := parts[1] + if orgID == "" { + // Invalid org ID (empty)... + return Path{}, false + } + for _, c := range orgID { + if c < '0' || c > '9' { + // Invalid org ID (non-numeric)... + return Path{}, false + } + } + source = DatadogSource{OrgID: orgID} + parts = parts[2:] + case "employee": + source = EmployeeSource{} + parts = parts[1:] + default: + // Invalid source... + return Path{}, false + } + + if len(parts) != 3 { + // Invalid number of parts... + return Path{}, false + } + + product, configID, name := parts[0], parts[1], parts[2] + if product == "" || configID == "" || name == "" { + // Invalid product, config ID, or name (none of these can be empty)... + return Path{}, false + } + + return Path{Source: source, Product: product, ConfigID: configID, Name: name}, true +} + +func (p Path) String() string { + return p.Source.String() + "/" + p.Product + "/" + p.ConfigID + "/" + p.Name +} + +func (s DatadogSource) String() string { + return fmt.Sprintf("datadog/%s", s.OrgID) +} + +func (s EmployeeSource) String() string { + return "employee" +} + +func (source) isSource() {} diff --git a/internal/remoteconfig/path_test.go b/internal/remoteconfig/path_test.go new file mode 100644 index 0000000000..03d4ae917b --- /dev/null +++ b/internal/remoteconfig/path_test.go @@ -0,0 +1,159 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2022 Datadog, Inc. + +package remoteconfig + +import ( + "math/rand" + "regexp" + "strings" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/assert" +) + +func TestParsePath(t *testing.T) { + type testCase struct { + Filename string + Expected Path + Valid bool + } + testCases := map[string]testCase{ + "LIVE_DEBUGGING": { + Filename: "datadog/2/LIVE_DEBUGGING/9e413cda-647b-335b-adcd-7ce453fc2284/config", + Expected: Path{ + Source: DatadogSource{OrgID: "2"}, + Product: "LIVE_DEBUGGING", + ConfigID: "9e413cda-647b-335b-adcd-7ce453fc2284", + Name: "config", + }, + Valid: true, + }, + "ASM_DD": { + Filename: "datadog/2/ASM_DATA/blocked_ips/77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + Expected: Path{ + Source: DatadogSource{OrgID: "2"}, + Product: "ASM_DATA", + ConfigID: "blocked_ips", + Name: "77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + }, + Valid: true, + }, + "employee": { + Filename: "employee/ASM_DD/13.recommended.json/config", + Expected: Path{ + Source: EmployeeSource{}, + Product: "ASM_DD", + ConfigID: "13.recommended.json", + Name: "config", + }, + Valid: true, + }, + "random": { + Filename: "random", + Valid: false, + }, + "missing_parts": { + Filename: "datadog/2/ASM_DATA/blocked_ips", + Valid: false, + }, + "blank_product": { + Filename: "datadog/2//blocked_ips/77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + Valid: false, + }, + "blank_config_id": { + Filename: "datadog/2/ASM_DATA//77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + Valid: false, + }, + "blank_name": { + Filename: "datadog/2/ASM_DATA/blocked_ips/", + Valid: false, + }, + "too_many_parts": { + Filename: "datadog/2/ASM_DATA/blocked_ips/77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9/extraneous", + Valid: false, + }, + "invalid_source": { + Filename: "invalid/ASM_DATA/blocked_ips/77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + Valid: false, + }, + "invalid_org_id": { + Filename: "datadog/1337.42/ASM_DATA/blocked_ips/77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + Valid: false, + }, + "blank_org_id": { + Filename: "datadog//ASM_DATA/blocked_ips/77b1c2865da79341f835e040b0e8a015c74672e4e906430d320408af44742be9", + Valid: false, + }, + } + + for name, tc := range testCases { + t.Run(name, func(t *testing.T) { + path, ok := ParsePath(tc.Filename) + if tc.Valid { + assert.True(t, ok) + assert.Equal(t, tc.Expected, path) + assert.Equal(t, tc.Filename, path.String()) + assert.True(t, strings.HasPrefix(tc.Filename, path.Source.String()+"/"), + "filename should start with source name") + } else { + assert.False(t, ok) + assert.Zero(t, path) + } + }) + } +} + +var ( + benchPath Path + benchOk bool +) + +// BenchmarkParsePath compares the current implementation (based on [strings.Split]) with a +// [regexp.Regexp] based implementation that uses the regular expression pattern from the remote +// config documentation. This confirms the current implementation is about 8x faster than one that +// uses [regexp.Regexp]. +func BenchmarkParsePath(b *testing.B) { + var samples []string + for _, source := range []string{"employee", "datadog/2", "datadog/1337"} { + for _, product := range []string{"ASM_DD", "LIVE_DEBUGGING", "OTHER"} { + for range 20 { + configID := uuid.NewString() + samples = append(samples, source+"/"+product+"/"+configID+"/config") + } + } + } + rand.Shuffle(len(samples), func(i, j int) { samples[i], samples[j] = samples[j], samples[i] }) + + b.Run("split", func(b *testing.B) { + for i := range b.N { + benchPath, benchOk = ParsePath(samples[i%len(samples)]) + } + }) + + re := regexp.MustCompile(`^(datadog/\d+|employee)/([^/]+)/([^/]+)/([^/]+)$`) + b.Run("regexp", func(b *testing.B) { + for i := range b.N { + parts := re.FindStringSubmatch(samples[i%len(samples)]) + benchOk = parts != nil + benchPath = Path{ + Source: literalSource{literal: parts[0]}, + Product: parts[2], + ConfigID: parts[3], + Name: parts[4], + } + } + }) +} + +type literalSource struct { + source + literal string +} + +func (s literalSource) String() string { + return s.literal +} diff --git a/internal/remoteconfig/remoteconfig.go b/internal/remoteconfig/remoteconfig.go index 4076c2ad34..464ed56a0b 100644 --- a/internal/remoteconfig/remoteconfig.go +++ b/internal/remoteconfig/remoteconfig.go @@ -13,16 +13,18 @@ import ( "errors" "fmt" "io" + "maps" "math/big" "net/http" "reflect" - "strings" + "slices" "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" ) // Callback represents a function that can process a remote config update. @@ -112,6 +114,20 @@ const ( ASMHeaderFingerprinting // ASMTruncationRules is the support for truncation payload rules ASMTruncationRules + // ASMRASPCommandInjection represents the capability for ASM's RASP Command Injection prevention + ASMRASPCommandInjection + // APMTracingEnableDynamicInstrumentation represents the capability to enable dynamic instrumentation + APMTracingEnableDynamicInstrumentation + // APMTracingEnableExceptionReplay represents the capability to enable exception replay + APMTracingEnableExceptionReplay + // APMTracingEnableCodeOrigin represents the capability to enable code origin + APMTracingEnableCodeOrigin + // APMTracingEnableLiveDebugging represents the capability to enable live debugging + APMTracingEnableLiveDebugging + // ASMDDMultiConfig represents the capability to handle multiple ASM_DD configuration objects + ASMDDMultiConfig + // ASMTraceTaggingRules represents the capability to honor trace tagging rules + ASMTraceTaggingRules ) // ErrClientNotStarted is returned when the remote config client is not started. @@ -183,6 +199,10 @@ func newClient(config ClientConfig) (*Client, error) { func Start(config ClientConfig) error { var err error startOnce.Do(func() { + if !internal.BoolEnv("DD_REMOTE_CONFIGURATION_ENABLED", true) { + // Don't start polling if the feature is disabled explicitly + return + } client, err = newClient(config) if err != nil { return @@ -239,19 +259,25 @@ func Reset() { func (c *Client) updateState() { data, err := c.newUpdateRequest() if err != nil { - log.Error("remoteconfig: unexpected error while creating a new update request payload: %v", err) + log.Error("remoteconfig: unexpected error while creating a new update request payload: %s", err.Error()) return } req, err := http.NewRequest(http.MethodGet, c.endpoint, &data) if err != nil { - log.Error("remoteconfig: unexpected error while creating a new http request: %v", err) + log.Error("remoteconfig: unexpected error while creating a new http request: %s", err.Error()) return } + if internal.ContainerID() != "" { + req.Header.Set("Datadog-Container-ID", internal.ContainerID()) + } + if internal.EntityID() != "" { + req.Header.Set("Datadog-Entity-ID", internal.EntityID()) + } resp, err := c.HTTP.Do(req) if err != nil { - log.Debug("remoteconfig: http request error: %v", err) + log.Debug("remoteconfig: http request error: %s", err.Error()) return } // Flush and close the response body when returning (cf. https://pkg.go.dev/net/http#Client.Do) @@ -267,7 +293,7 @@ func (c *Client) updateState() { respBody, err := io.ReadAll(resp.Body) if err != nil { - log.Error("remoteconfig: http request error: could not read the response body: %v", err) + log.Error("remoteconfig: http request error: could not read the response body: %s", err.Error()) return } @@ -277,7 +303,7 @@ func (c *Client) updateState() { var update clientGetConfigsResponse if err := json.Unmarshal(respBody, &update); err != nil { - log.Error("remoteconfig: http request error: could not parse the json response body: %v", err) + log.Error("remoteconfig: http request error: could not parse the json response body: %s", err.Error()) return } @@ -329,13 +355,11 @@ func UnregisterCallback(f Callback) error { } client._callbacksMu.Lock() defer client._callbacksMu.Unlock() - fValue := reflect.ValueOf(f) - for i, callback := range client.callbacks { - if reflect.ValueOf(callback) == fValue { - client.callbacks = append(client.callbacks[:i], client.callbacks[i+1:]...) - break - } - } + + toRemove := reflect.ValueOf(f).Pointer() + client.callbacks = slices.DeleteFunc(client.callbacks, func(cb Callback) bool { + return reflect.ValueOf(cb).Pointer() == toRemove + }) return nil } @@ -382,36 +406,36 @@ func HasProduct(p string) (bool, error) { // RegisterCapability adds a capability to the list of capabilities exposed by the client when requesting // configuration updates -func RegisterCapability(cap Capability) error { +func RegisterCapability(cpb Capability) error { if client == nil { return ErrClientNotStarted } client.capabilitiesMu.Lock() defer client.capabilitiesMu.Unlock() - client.capabilities[cap] = struct{}{} + client.capabilities[cpb] = struct{}{} return nil } // UnregisterCapability removes a capability from the list of capabilities exposed by the client when requesting // configuration updates -func UnregisterCapability(cap Capability) error { +func UnregisterCapability(cpb Capability) error { if client == nil { return ErrClientNotStarted } client.capabilitiesMu.Lock() defer client.capabilitiesMu.Unlock() - delete(client.capabilities, cap) + delete(client.capabilities, cpb) return nil } // HasCapability returns whether a given capability was registered -func HasCapability(cap Capability) (bool, error) { +func HasCapability(cpb Capability) (bool, error) { if client == nil { return false, ErrClientNotStarted } client.capabilitiesMu.RLock() defer client.capabilitiesMu.RUnlock() - _, found := client.capabilities[cap] + _, found := client.capabilities[cpb] return found, nil } @@ -462,17 +486,21 @@ func (c *Client) applyUpdate(pbUpdate *clientGetConfigsResponse) error { fileMap := make(map[string][]byte, len(pbUpdate.TargetFiles)) allProducts := c.allProducts() productUpdates := make(map[string]ProductUpdate, len(allProducts)) - for _, p := range allProducts { - productUpdates[p] = make(ProductUpdate) - } for _, f := range pbUpdate.TargetFiles { + path, valid := ParsePath(f.Path) + if !valid { + log.Warn("remoteconfig: ignoring invalid target file path: %s", f.Path) + continue + } + fileMap[f.Path] = f.Raw - for _, p := range allProducts { - // Check the config file path to make sure it belongs to the right product - if strings.Contains(f.Path, "/"+p+"/") { - productUpdates[p][f.Path] = f.Raw - } + if !slices.Contains(allProducts, path.Product) { + log.Debug("remoteconfig: received file for unknown product %s (known: %#v): %s", path.Product, allProducts, f.Path) //nolint:gocritic // Debug logging for unknown products } + if productUpdates[path.Product] == nil { + productUpdates[path.Product] = make(ProductUpdate) + } + productUpdates[path.Product][f.Path] = f.Raw } mapify := func(s *rc.RepositoryState) map[string]string { @@ -490,7 +518,7 @@ func (c *Client) applyUpdate(pbUpdate *clientGetConfigsResponse) error { // are provided with this information in this case stateBefore, err := c.repository.CurrentState() if err != nil { - return fmt.Errorf("repository current state error: %v", err) + return fmt.Errorf("repository current state error: %s", err) } products, err := c.repository.Update(rc.Update{ TUFRoots: pbUpdate.Roots, @@ -499,11 +527,11 @@ func (c *Client) applyUpdate(pbUpdate *clientGetConfigsResponse) error { ClientConfigs: pbUpdate.ClientConfigs, }) if err != nil { - return fmt.Errorf("repository update error: %v", err) + return fmt.Errorf("repository update error: %s", err) } stateAfter, err := c.repository.CurrentState() if err != nil { - return fmt.Errorf("repository current state error after update: %v", err) + return fmt.Errorf("repository current state error after update: %s", err) } // Create a config files diff between before/after the update to see which config files are missing @@ -537,8 +565,8 @@ func (c *Client) applyUpdate(pbUpdate *clientGetConfigsResponse) error { // 3 - ApplyStateAcknowledged // This makes sure that any product that would need to re-receive the config in a subsequent update will be allowed to statuses := make(map[string]rc.ApplyStatus) - for _, fn := range c.globalCallbacks() { - for path, status := range fn(productUpdates) { + for _, cb := range c.globalCallbacks() { + for path, status := range cb(productUpdates) { if s, ok := statuses[path]; !ok || status.State == rc.ApplyStateError || s.State == rc.ApplyStateAcknowledged && status.State == rc.ApplyStateUnacknowledged { statuses[path] = status @@ -549,9 +577,7 @@ func (c *Client) applyUpdate(pbUpdate *clientGetConfigsResponse) error { productCallbacks := c.productCallbacks() for product, update := range productUpdates { if fn, ok := productCallbacks[product]; ok { - for path, status := range fn(update) { - statuses[path] = status - } + maps.Copy(statuses, fn(update)) } } for p, s := range statuses { @@ -608,6 +634,10 @@ func (c *Client) newUpdateRequest() (bytes.Buffer, error) { } capa := c.allCapabilities() + var tags []string + for k, v := range internal.GetGitMetadataTags() { + tags = append(tags, k+":"+v) + } req := clientGetConfigsRequest{ Client: &clientData{ State: &clientState{ @@ -627,6 +657,8 @@ func (c *Client) newUpdateRequest() (bytes.Buffer, error) { Service: c.ServiceName, Env: c.Env, AppVersion: c.AppVersion, + ProcessTags: processtags.GlobalTags().Slice(), + Tags: tags, }, Capabilities: capa.Bytes(), }, diff --git a/internal/remoteconfig/remoteconfig_test.go b/internal/remoteconfig/remoteconfig_test.go index 561ccc49ea..196fe10cd5 100644 --- a/internal/remoteconfig/remoteconfig_test.go +++ b/internal/remoteconfig/remoteconfig_test.go @@ -16,8 +16,11 @@ import ( "testing" "time" - rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" ) // The RC client relies on Repository (in the datadog-agent) which performs config signature validation @@ -36,7 +39,7 @@ func TestRCClient(t *testing.T) { t.Run("registerCallback", func(t *testing.T) { client.callbacks = []Callback{} - nilCallback := func(map[string]ProductUpdate) map[string]rc.ApplyStatus { return nil } + nilCallback := func(map[string]ProductUpdate) map[string]state.ApplyStatus { return nil } defer func() { client.callbacks = []Callback{} }() require.Equal(t, 0, len(client.callbacks)) err = RegisterCallback(nilCallback) @@ -51,16 +54,16 @@ func TestRCClient(t *testing.T) { t.Run("apply-update", func(t *testing.T) { client.callbacks = []Callback{} cfgPath := "datadog/2/ASM_FEATURES/asm_features_activation/config" - err = RegisterProduct(rc.ProductASMFeatures) + err = RegisterProduct(state.ProductASMFeatures) require.NoError(t, err) - err = RegisterCallback(func(updates map[string]ProductUpdate) map[string]rc.ApplyStatus { - statuses := map[string]rc.ApplyStatus{} + err = RegisterCallback(func(updates map[string]ProductUpdate) map[string]state.ApplyStatus { + statuses := map[string]state.ApplyStatus{} for p, u := range updates { - if p == rc.ProductASMFeatures { + if p == state.ProductASMFeatures { require.NotNil(t, u) require.NotNil(t, u[cfgPath]) require.Equal(t, string(u[cfgPath]), "test") - statuses[cfgPath] = rc.ApplyStatus{State: rc.ApplyStateAcknowledged} + statuses[cfgPath] = state.ApplyStatus{State: state.ApplyStateAcknowledged} } } return statuses @@ -77,13 +80,13 @@ func TestRCClient(t *testing.T) { require.NoError(t, err) cfgPath := "datadog/2/APM_TRACING/foo/bar" - err = Subscribe(rc.ProductAPMTracing, func(u ProductUpdate) map[string]rc.ApplyStatus { - statuses := map[string]rc.ApplyStatus{} + err = Subscribe(state.ProductAPMTracing, func(u ProductUpdate) map[string]state.ApplyStatus { + statuses := map[string]state.ApplyStatus{} require.NotNil(t, u) require.Len(t, u, 1) require.NotNil(t, u[cfgPath]) require.Equal(t, string(u[cfgPath]), "test") - statuses[cfgPath] = rc.ApplyStatus{State: rc.ApplyStateAcknowledged} + statuses[cfgPath] = state.ApplyStatus{State: state.ApplyStateAcknowledged} return statuses }) require.NoError(t, err) @@ -259,19 +262,19 @@ func TestConfig(t *testing.T) { }) } -func dummyCallback1(map[string]ProductUpdate) map[string]rc.ApplyStatus { +func dummyCallback1(map[string]ProductUpdate) map[string]state.ApplyStatus { return nil } -func dummyCallback2(map[string]ProductUpdate) map[string]rc.ApplyStatus { - return map[string]rc.ApplyStatus{} +func dummyCallback2(map[string]ProductUpdate) map[string]state.ApplyStatus { + return map[string]state.ApplyStatus{} } -func dummyCallback3(map[string]ProductUpdate) map[string]rc.ApplyStatus { - return map[string]rc.ApplyStatus{} +func dummyCallback3(map[string]ProductUpdate) map[string]state.ApplyStatus { + return map[string]state.ApplyStatus{} } -func dummyCallback4(map[string]ProductUpdate) map[string]rc.ApplyStatus { - return map[string]rc.ApplyStatus{} +func dummyCallback4(map[string]ProductUpdate) map[string]state.ApplyStatus { + return map[string]state.ApplyStatus{} } func TestRegistration(t *testing.T) { @@ -318,8 +321,8 @@ func TestSubscribe(t *testing.T) { client, err = newClient(DefaultClientConfig()) require.NoError(t, err) - var callback Callback = func(updates map[string]ProductUpdate) map[string]rc.ApplyStatus { return nil } - var pCallback ProductCallback = func(u ProductUpdate) map[string]rc.ApplyStatus { return nil } + var callback Callback = func(_ map[string]ProductUpdate) map[string]state.ApplyStatus { return nil } + var pCallback ProductCallback = func(_ ProductUpdate) map[string]state.ApplyStatus { return nil } err = Subscribe("my-product", pCallback) require.NoError(t, err) @@ -360,7 +363,7 @@ func TestNewUpdateRequest(t *testing.T) { require.NoError(t, err) err = RegisterCapability(ASMActivation) require.NoError(t, err) - err = Subscribe("my-second-product", func(u ProductUpdate) map[string]rc.ApplyStatus { return nil }, APMTracingSampleRate) + err = Subscribe("my-second-product", func(_ ProductUpdate) map[string]state.ApplyStatus { return nil }, APMTracingSampleRate) require.NoError(t, err) b, err := client.newUpdateRequest() @@ -380,72 +383,147 @@ func TestNewUpdateRequest(t *testing.T) { require.True(t, req.Client.IsTracer) } +func TestProcessTags(t *testing.T) { + cfg := DefaultClientConfig() + cfg.ServiceName = "test-svc" + cfg.Env = "test-env" + cfg.TracerVersion = "tracer-version" + cfg.AppVersion = "app-version" + var err error + client, err = newClient(cfg) + require.NoError(t, err) + + err = RegisterProduct("my-product") + require.NoError(t, err) + err = RegisterCapability(ASMActivation) + require.NoError(t, err) + err = Subscribe("my-second-product", func(_ ProductUpdate) map[string]state.ApplyStatus { return nil }, APMTracingSampleRate) + require.NoError(t, err) + + t.Run("enabled", func(t *testing.T) { + b, err := client.newUpdateRequest() + require.NoError(t, err) + var req clientGetConfigsRequest + err = json.Unmarshal(b.Bytes(), &req) + require.NoError(t, err) + + assert.NotEmpty(t, req.Client.ClientTracer.ProcessTags) + }) + + t.Run("disabled", func(t *testing.T) { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "false") + processtags.Reload() + + b, err := client.newUpdateRequest() + require.NoError(t, err) + var req clientGetConfigsRequest + err = json.Unmarshal(b.Bytes(), &req) + require.NoError(t, err) + + assert.Empty(t, req.Client.ClientTracer.ProcessTags) + }) +} + // TestAsync starts many goroutines that use the exported client API to make sure no deadlocks occur func TestAsync(t *testing.T) { require.NoError(t, Start(DefaultClientConfig())) defer Stop() const iterations = 10000 - var wg sync.WaitGroup - - // Subscriptions - for i := 0; i < iterations; i++ { + var ( + startSync sync.WaitGroup // Guarantees all goroutines are created before any can actually start + cleanupSync sync.WaitGroup // Used to wait for business to be done before cleaning back up to a blank slate + wg sync.WaitGroup // Used to wait for all goroutines to have finished + ) + startSync.Add(1) + + for range iterations { + // Subscriptions product := fmt.Sprintf("%d", rand.Int()%10) capability := Capability(rand.Uint32() % 10) + startSync.Add(1) wg.Add(1) go func() { - callback := func(update ProductUpdate) map[string]rc.ApplyStatus { return nil } + startSync.Done() + startSync.Wait() + callback := func(_ ProductUpdate) map[string]state.ApplyStatus { return nil } Subscribe(product, callback, capability) wg.Done() }() - } - // Products - for i := 0; i < iterations; i++ { + // Products + startSync.Add(1) wg.Add(1) go func() { + startSync.Done() + startSync.Wait() defer wg.Done() RegisterProduct(fmt.Sprintf("%d", rand.Int()%10)) }() - } - for i := 0; i < iterations; i++ { + startSync.Add(1) wg.Add(1) go func() { + startSync.Done() + startSync.Wait() defer wg.Done() UnregisterProduct(fmt.Sprintf("%d", rand.Int()%10)) }() - } - // Capabilities - for i := 0; i < iterations; i++ { + // Capabilities + startSync.Add(1) wg.Add(1) go func() { + startSync.Done() + startSync.Wait() defer wg.Done() RegisterCapability(Capability(rand.Uint32() % 10)) }() - } - for i := 0; i < iterations; i++ { + startSync.Add(1) wg.Add(1) go func() { + startSync.Done() + startSync.Wait() defer wg.Done() UnregisterCapability(Capability(rand.Uint32() % 10)) }() - } - // Callbacks - callback := func(updates map[string]ProductUpdate) map[string]rc.ApplyStatus { return nil } - for i := 0; i < iterations; i++ { + // Callbacks + callback := func(_ map[string]ProductUpdate) map[string]state.ApplyStatus { return nil } + startSync.Add(1) wg.Add(1) + cleanupSync.Add(1) go func() { defer wg.Done() + defer cleanupSync.Done() + startSync.Done() + startSync.Wait() RegisterCallback(callback) }() - } - for i := 0; i < iterations; i++ { + startSync.Add(1) + wg.Add(1) + cleanupSync.Add(1) + go func() { + defer wg.Done() + defer cleanupSync.Done() + startSync.Done() + startSync.Wait() + UnregisterCallback(callback) + }() wg.Add(1) go func() { + // Make sure the callback is removed before we exit the test... defer wg.Done() + cleanupSync.Wait() UnregisterCallback(callback) }() } + + // Unblock the goroutines start + startSync.Done() + // Wait for all those goroutines to have finished... wg.Wait() + + // Verify we have 0 callbacks left after we're done. + client._callbacksMu.RLock() + defer client._callbacksMu.RUnlock() + require.Empty(t, client.callbacks) } diff --git a/internal/remoteconfig/types.go b/internal/remoteconfig/types.go index 87f46f0e97..fb9272dc3a 100644 --- a/internal/remoteconfig/types.go +++ b/internal/remoteconfig/types.go @@ -25,11 +25,7 @@ type clientTracer struct { Env string `json:"env,omitempty"` AppVersion string `json:"app_version,omitempty"` Tags []string `json:"tags,omitempty"` -} - -type clientAgent struct { - Name string `json:"name,omitempty"` - Version string `json:"version,omitempty"` + ProcessTags []string `json:"process_tags,omitempty"` } type configState struct { @@ -76,8 +72,3 @@ type file struct { Path string `json:"path,omitempty"` Raw []byte `json:"raw,omitempty"` } - -type fileMetaState struct { - Version uint64 `json:"version,omitempty"` - Hash string `json:"hash,omitempty"` -} diff --git a/internal/setup-smoke-test/Dockerfile b/internal/setup-smoke-test/Dockerfile index 4a113a03d9..0881340035 100644 --- a/internal/setup-smoke-test/Dockerfile +++ b/internal/setup-smoke-test/Dockerfile @@ -17,12 +17,12 @@ # select one by default, but also allows to provide a --build-arg option # too instead of relying on the --target option. This way, the CI matrix # can systematically use --build-arg for all of the parameters. -ARG go="1.22" # golang docker image parameter in `golang:{go}-{buildenv}` -ARG build_env="bookworm" # golang docker image parameter in `golang:{go}-{buildenv}` +ARG go="1.24" # golang docker image parameter in `golang:{go}-{buildenv}` +ARG build_env="trixie" # golang docker image parameter in `golang:{go}-{buildenv}` ARG build_with_cgo="0" # 0 or 1 ARG build_with_vendoring="" # y or empty ARG build_tags="" -ARG deployment_env="debian12" +ARG deployment_env="debian13" # Build stage compiling the test app in the golang image, along with sub-options # to possibly enable CGO and vendoring. @@ -37,7 +37,7 @@ RUN go env -w CGO_ENABLED=$build_with_cgo # GCC and the C library headers are needed for compilation of runtime/cgo with # CGO_ENABLED=1 - but the golang:alpine image doesn't provide them out of the box. -ARG build_env="bookworm" +ARG build_env="trixie" RUN set -ex; if [ "$build_env" = "alpine" ] && [ "$build_with_cgo" = "1" ]; then \ apk update && apk add gcc libc-dev; \ fi @@ -49,34 +49,35 @@ RUN if [ "${go_libddwaf_ref}" != "" ]; then \ alpine) apk update && apk add git;; \ *) apt update && apt install -y git ;; \ esac; \ - go get -u github.com/DataDog/go-libddwaf/v3@${go_libddwaf_ref}; \ + go get -u github.com/DataDog/go-libddwaf/v4@${go_libddwaf_ref}; \ fi RUN go mod tidy ARG build_with_vendoring +ARG go RUN set -ex; if [ "$build_with_vendoring" = "y" ]; then \ - go mod vendor; \ + go work vendor; \ fi ARG build_tags RUN go env && go build -v -tags "$build_tags" -o smoke-test . RUN ldd smoke-test || true -# debian11 deployment environment +# debian12 deployment environment # IMPORTANT NOTE: Nothing else than the compiled program must be copied into # this image to preperly highlight the fact that the compiled program is running # out of the box in it without any further installation. -FROM debian:11 AS debian11 +FROM debian:12 AS debian12 COPY --from=build-env /src/internal/setup-smoke-test/smoke-test /usr/local/bin -CMD /usr/local/bin/smoke-test +CMD ["/usr/local/bin/smoke-test"] -# debian12 deployment environment +# debian13 deployment environment # IMPORTANT NOTE: Nothing else than the compiled program must be copied into # this image to preperly highlight the fact that the compiled program is running # out of the box in it without any further installation. -FROM debian:12 AS debian12 +FROM debian:13 AS debian13 COPY --from=build-env /src/internal/setup-smoke-test/smoke-test /usr/local/bin -CMD /usr/local/bin/smoke-test +CMD ["/usr/local/bin/smoke-test"] # alpine deployment environment # IMPORTANT NOTE: Nothing else than the compiled program must be copied into @@ -88,7 +89,7 @@ RUN set -ex; if [ "$build_with_cgo" = "1" ]; then \ apk update && apk add libc6-compat; \ fi COPY --from=build-env /src/internal/setup-smoke-test/smoke-test /usr/local/bin -CMD /usr/local/bin/smoke-test +CMD ["/usr/local/bin/smoke-test"] # amazonlinux:2 deployment environment # IMPORTANT NOTE: Nothing else than the compiled program must be copied into @@ -96,7 +97,7 @@ CMD /usr/local/bin/smoke-test # out of the box in it without any further installation. FROM amazonlinux:2 AS al2 COPY --from=build-env /src/internal/setup-smoke-test/smoke-test /usr/local/bin -CMD /usr/local/bin/smoke-test +CMD ["/usr/local/bin/smoke-test"] # amazonlinux:2023 deployment environment # IMPORTANT NOTE: Nothing else than the compiled program must be copied into @@ -104,7 +105,7 @@ CMD /usr/local/bin/smoke-test # out of the box in it without any further installation. FROM amazonlinux:2023 AS al2023 COPY --from=build-env /src/internal/setup-smoke-test/smoke-test /usr/local/bin -CMD /usr/local/bin/smoke-test +CMD ["/usr/local/bin/smoke-test"] # busybox deployment environment # IMPORTANT NOTE: Nothing else than the compiled program must be copied into @@ -113,15 +114,15 @@ CMD /usr/local/bin/smoke-test FROM busybox AS busybox RUN mkdir -p /usr/local/bin COPY --from=build-env /src/internal/setup-smoke-test/smoke-test /usr/local/bin -CMD /usr/local/bin/smoke-test +CMD ["/usr/local/bin/smoke-test"] # scratch deployment environment - meant to be used with CGO_ENABLED=0 # IMPORTANT NOTE: Nothing else than the compiled program must be copied into # this image to preperly highlight the fact that the compiled program is running # out of the box in it without any further installation. -FROM scratch AS scratch +FROM scratch AS scratchy COPY --from=build-env /src/internal/setup-smoke-test/smoke-test / -ENTRYPOINT [ "/smoke-test" ] +CMD ["/smoke-test"] # Final deployment environment - helper target to end up a single one FROM $deployment_env AS deployment-env diff --git a/internal/setup-smoke-test/go.mod b/internal/setup-smoke-test/go.mod index 2da1c47234..66ef373f27 100644 --- a/internal/setup-smoke-test/go.mod +++ b/internal/setup-smoke-test/go.mod @@ -1,42 +1,96 @@ -module github.com/DataDog/dd-trace-go/internal/setup-smoke-test +module github.com/DataDog/dd-trace-go/v2/internal/setup-smoke-test -go 1.22.0 +go 1.24.0 -require gopkg.in/DataDog/dd-trace-go.v1 v1.67.1 +require ( + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev +) require ( - github.com/DataDog/appsec-internal-go v1.7.0 // indirect - github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 // indirect - github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1 // indirect - github.com/DataDog/datadog-go/v5 v5.3.0 // indirect - github.com/DataDog/go-libddwaf/v3 v3.3.0 // indirect - github.com/DataDog/go-tuf v1.0.2-0.5.2 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect github.com/DataDog/gostackparse v0.7.0 // indirect - github.com/DataDog/sketches-go v1.4.5 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 // indirect - github.com/ebitengine/purego v0.6.0-alpha.5 // indirect - github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b // indirect - github.com/google/uuid v1.5.0 // indirect - github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 // indirect - github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/outcaste-io/ristretto v0.2.3 // indirect - github.com/philhofer/fwd v1.1.2 // indirect + github.com/philhofer/fwd v1.2.0 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 // indirect - github.com/ryanuber/go-glob v1.0.0 // indirect - github.com/secure-systems-lab/go-securesystemslib v0.7.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/tinylib/msgp v1.1.8 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.16.1 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - google.golang.org/protobuf v1.33.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) + +replace github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../contrib/net/http + +replace github.com/DataDog/dd-trace-go/v2 => ../.. diff --git a/internal/setup-smoke-test/go.sum b/internal/setup-smoke-test/go.sum index b19c19b177..5a64ecf283 100644 --- a/internal/setup-smoke-test/go.sum +++ b/internal/setup-smoke-test/go.sum @@ -1,98 +1,139 @@ -github.com/DataDog/appsec-internal-go v1.7.0 h1:iKRNLih83dJeVya3IoUfK+6HLD/hQsIbyBlfvLmAeb0= -github.com/DataDog/appsec-internal-go v1.7.0/go.mod h1:wW0cRfWBo4C044jHGwYiyh5moQV2x0AhnwqMuiX7O/g= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0 h1:bUMSNsw1iofWiju9yc1f+kBd33E3hMJtq9GuU602Iy8= -github.com/DataDog/datadog-agent/pkg/obfuscate v0.48.0/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1 h1:5nE6N3JSs2IG3xzMthNFhXfOaXlrsdgqmJ73lndFf8c= -github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.48.1/go.mod h1:Vc+snp0Bey4MrrJyiV2tVxxJb6BmLomPvN1RgAvjGaQ= -github.com/DataDog/datadog-go/v5 v5.3.0 h1:2q2qjFOb3RwAZNU+ez27ZVDwErJv5/VpbBPprz7Z+s8= -github.com/DataDog/datadog-go/v5 v5.3.0/go.mod h1:XRDJk1pTc00gm+ZDiBKsjh7oOOtJfYfglVCmFb8C2+Q= -github.com/DataDog/go-libddwaf/v3 v3.3.0 h1:jS72fuQpFgJZEdEJDmHJCPAgNTEMZoz1EUvimPUOiJ4= -github.com/DataDog/go-libddwaf/v3 v3.3.0/go.mod h1:Bz/0JkpGf689mzbUjKJeheJINqsyyhM8p9PDuHdK2Ec= -github.com/DataDog/go-tuf v1.0.2-0.5.2 h1:EeZr937eKAWPxJ26IykAdWA4A0jQXJgkhUjqEI/w7+I= -github.com/DataDog/go-tuf v1.0.2-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= -github.com/DataDog/sketches-go v1.4.5 h1:ki7VfeNz7IcNafq7yI/j5U/YCkO3LJiMDtXz9OMQbyE= -github.com/DataDog/sketches-go v1.4.5/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4 h1:8EXxF+tCLqaVk8AOC29zl2mnhQjwyLxxOTuhUazWRsg= -github.com/eapache/queue/v2 v2.0.0-20230407133247-75960ed334e4/go.mod h1:I5sHm0Y0T1u5YjlyqC5GVArM7aNZRUYtTjmJ8mPJFds= -github.com/ebitengine/purego v0.6.0-alpha.5 h1:EYID3JOAdmQ4SNZYJHu9V6IqOeRQDBYxqKAg9PyoHFY= -github.com/ebitengine/purego v0.6.0-alpha.5/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/glebarez/go-sqlite v1.22.0 h1:uAcMJhaA6r3LHMTFgP0SifzgXg46yJkgxqyuyec+ruQ= -github.com/glebarez/go-sqlite v1.22.0/go.mod h1:PlBIdHe0+aUEFn+r2/uthrWq4FxbzugL0L8Li6yQJbc= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b h1:h9U78+dx9a4BKdQkBBos92HalKpaGKHrp+3Uo6yTodo= -github.com/google/pprof v0.0.0-20230817174616-7a8ec2ada47b/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= -github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7 h1:UpiO20jno/eV1eVZcxqWnUohyKRe1g8FPV/xH1s/2qs= -github.com/hashicorp/go-secure-stdlib/parseutil v0.1.7/go.mod h1:QmrqtbKuxxSWTN3ETMPuB+VtEiBJ/A9XhoYGv8E1uD8= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.1/go.mod h1:gKOamz3EwoIoJq7mlMIRBpVTAUn8qPCrEclOKKWhD3U= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= -github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= -github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= -github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= -github.com/secure-systems-lab/go-securesystemslib v0.7.0 h1:OwvJ5jQf9LnIAS83waAjPbcMsODrTQUpJ02eNLUoxBg= -github.com/secure-systems-lab/go-securesystemslib v0.7.0/go.mod h1:/2gYnlnHVQ6xeGtfIqFy7Do03K4cdCY0A/GlJLDKLHI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -108,96 +149,169 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= -golang.org/x/tools v0.16.1 h1:TLyB3WofjdOEepBHAU20JdNC1Zbg87elYofWYAY5oZA= -golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/grpc v1.57.1 h1:upNTNqv0ES+2ZOOqACwVtS3Il8M12/+Hz41RCPzAjQg= -google.golang.org/grpc v1.57.1/go.mod h1:Sd+9RMTACXwmub0zcNY2c4arhtrbBYD1AUHI/dt16Mo= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/DataDog/dd-trace-go.v1 v1.67.1 h1:frgcpZ18wmpj+/TwyDJM8057M65aOdgaxLiZ8pb1PFU= -gopkg.in/DataDog/dd-trace-go.v1 v1.67.1/go.mod h1:6DdiJPKOeJfZyd/IUGCAd5elY8qPGkztK6wbYYsMjag= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= -modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= -modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= -modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= -modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= -modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= -modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= -modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/internal/setup-smoke-test/main.go b/internal/setup-smoke-test/main.go index 31ec0b30ac..13646c2872 100644 --- a/internal/setup-smoke-test/main.go +++ b/internal/setup-smoke-test/main.go @@ -12,9 +12,9 @@ import ( "net/http" "os" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/net/http" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/profiler" + httptrace "github.com/DataDog/dd-trace-go/contrib/net/http/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/profiler" ) func main() { diff --git a/internal/stableconfig/api.go b/internal/stableconfig/api.go new file mode 100644 index 0000000000..3fce0524d8 --- /dev/null +++ b/internal/stableconfig/api.go @@ -0,0 +1,86 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package stableconfig provides utilities to load and manage APM configurations +// loaded from YAML configuration files +package stableconfig + +import ( + "errors" + "fmt" + "iter" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +// ConfigData holds configuration value with its origin and config ID +type ConfigData struct { + Origin telemetry.Origin + Value string + ConfigID string +} + +func reportTelemetryAndReturnWithErr(env string, value bool, origin telemetry.Origin, id string, err error) (bool, telemetry.Origin, error) { + if env == "DD_APPSEC_SCA_ENABLED" && origin == telemetry.OriginDefault { + return value, origin, err + } + telemetry.RegisterAppConfigs(telemetry.Configuration{Name: telemetry.EnvToTelemetryName(env), Value: value, Origin: origin, ID: id}) + return value, origin, err +} + +func reportTelemetryAndReturn(env string, value string, origin telemetry.Origin, id string) (string, telemetry.Origin) { + telemetry.RegisterAppConfigs(telemetry.Configuration{Name: telemetry.EnvToTelemetryName(env), Value: value, Origin: origin, ID: id}) + return value, origin +} + +// Bool returns a boolean config value from managed file-based config, environment variable, +// or local file-based config, in that order. If none provide a valid boolean, it returns the default. +// Also returns the value's origin and any parse error encountered. +func Bool(env string, def bool) (value bool, origin telemetry.Origin, err error) { + for configData := range stableConfigByPriority(env) { + if val, err := strconv.ParseBool(configData.Value); err == nil { + return reportTelemetryAndReturnWithErr(env, val, configData.Origin, configData.ConfigID, nil) + } + err = errors.Join(err, fmt.Errorf("non-boolean value for %s: '%s' in %s configuration, dropping", env, configData.Value, configData.Origin)) + } + return reportTelemetryAndReturnWithErr(env, def, telemetry.OriginDefault, telemetry.EmptyID, err) +} + +// String returns a string config value from managed file-based config, environment variable, +// or local file-based config, in that order. If none are set, it returns the default value and origin. +func String(env string, def string) (string, telemetry.Origin) { + for configData := range stableConfigByPriority(env) { + return reportTelemetryAndReturn(env, configData.Value, configData.Origin, configData.ConfigID) + } + return reportTelemetryAndReturn(env, def, telemetry.OriginDefault, telemetry.EmptyID) +} + +func stableConfigByPriority(key string) iter.Seq[ConfigData] { + return func(yield func(ConfigData) bool) { + if v := ManagedConfig.Get(key); v != "" && !yield(ConfigData{ + Origin: telemetry.OriginManagedStableConfig, + Value: v, + ConfigID: ManagedConfig.GetID(), + }) { + return + } + if v, ok := env.Lookup(key); ok && !yield(ConfigData{ + Origin: telemetry.OriginEnvVar, + Value: v, + ConfigID: telemetry.EmptyID, // environment variables do not have config ID + }) { + return + } + if v := LocalConfig.Get(key); v != "" && !yield(ConfigData{ + Origin: telemetry.OriginLocalStableConfig, + Value: v, + ConfigID: LocalConfig.GetID(), + }) { + return + } + } +} diff --git a/internal/stableconfig/api_test.go b/internal/stableconfig/api_test.go new file mode 100644 index 0000000000..7d6812bf57 --- /dev/null +++ b/internal/stableconfig/api_test.go @@ -0,0 +1,282 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stableconfig + +import ( + "os" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" + "github.com/stretchr/testify/assert" +) + +func TestBool(t *testing.T) { + // Test typical operation with valid files + t.Run("valid configurations", func(t *testing.T) { + // Setup mock telemetry client + telemetryClient := new(telemetrytest.MockClient) + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "UNKNOWN_KEY", Value: true, Origin: telemetry.OriginDefault, ID: telemetry.EmptyID}}).Return() + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: true, Origin: telemetry.OriginLocalStableConfig, ID: "100"}}).Return() + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: false, Origin: telemetry.OriginEnvVar, ID: telemetry.EmptyID}}).Return() + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: false, Origin: telemetry.OriginManagedStableConfig, ID: "200"}}).Return() + defer telemetry.MockClient(telemetryClient)() + + tests := []struct { + name string + localYaml string // YAML content for local config file + managedYaml string // YAML content for managed config file + envValue string // Environment variable value + key string // Configuration key to test + defaultValue bool // Default value to use + expectedValue bool // Expected result value + expectedOrigin telemetry.Origin // Expected origin of the value + expectedID string // Expected Config ID of the value + expectedErr error // Expected error, if any + }{ + // When no config exists, return default value + { + name: "default value", + key: "UNKNOWN_KEY", + defaultValue: true, + expectedValue: true, + expectedOrigin: telemetry.OriginDefault, + expectedID: telemetry.EmptyID, + }, + // Local config overrides default + { + name: "local config only", + localYaml: "config_id: 100\napm_configuration_default:\n DD_KEY: true", + key: "DD_KEY", + defaultValue: false, + expectedValue: true, + expectedOrigin: telemetry.OriginLocalStableConfig, + expectedID: "100", + }, + // Env var overrides local config + { + name: "env overrides local", + localYaml: "config_id: 100\napm_configuration_default:\n DD_KEY: true", + envValue: "false", + key: "DD_KEY", + defaultValue: true, + expectedValue: false, + expectedOrigin: telemetry.OriginEnvVar, + expectedID: telemetry.EmptyID, + }, + // Managed config overrides env var + { + name: "managed overrides env", + localYaml: "config_id: 100\napm_configuration_default:\n DD_KEY: true", + managedYaml: "config_id: 200\napm_configuration_default:\n DD_KEY: false", + envValue: "true", + key: "DD_KEY", + defaultValue: true, + expectedValue: false, + expectedOrigin: telemetry.OriginManagedStableConfig, + expectedID: "200", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test environment + if tt.localYaml != "" { + tempLocalPath := "local.yml" + err := os.WriteFile(tempLocalPath, []byte(tt.localYaml), 0644) + assert.NoError(t, err) + defer os.Remove(tempLocalPath) + LocalConfig = newStableConfigSource(tempLocalPath, telemetry.OriginLocalStableConfig) + defer func() { LocalConfig = newStableConfigSource(localFilePath, telemetry.OriginLocalStableConfig) }() + } + + if tt.managedYaml != "" { + tempManagedPath := "managed.yml" + err := os.WriteFile(tempManagedPath, []byte(tt.managedYaml), 0644) + assert.NoError(t, err) + defer os.Remove(tempManagedPath) + ManagedConfig = newStableConfigSource(tempManagedPath, telemetry.OriginManagedStableConfig) + defer func() { ManagedConfig = newStableConfigSource(managedFilePath, telemetry.OriginManagedStableConfig) }() + } + + if tt.envValue != "" { + t.Setenv(tt.key, tt.envValue) + } + + val, origin, err := Bool(tt.key, tt.defaultValue) + assert.Equal(t, tt.expectedValue, val) + assert.Equal(t, tt.expectedOrigin, origin) + assert.Equal(t, tt.expectedErr, err) + + telemetryClient.AssertCalled(t, "RegisterAppConfigs", []telemetry.Configuration{{Name: tt.key, Value: tt.expectedValue, Origin: tt.expectedOrigin, ID: tt.expectedID}}) + }) + } + }) + + // Test error handling with invalid configurations + t.Run("error handling", func(t *testing.T) { + tests := []struct { + name string + localYaml string + managedYaml string + envValue string + key string + defaultValue bool + expectedValue bool + expectedOrigin telemetry.Origin + expectedErr string + }{ + // Invalid boolean in managed config + { + name: "invalid managed config value", + managedYaml: "apm_configuration_default:\n DD_KEY: not-a-bool", + key: "DD_KEY", + defaultValue: true, + expectedValue: true, + expectedOrigin: telemetry.OriginDefault, + expectedErr: "non-boolean value for DD_KEY: 'not-a-bool' in fleet_stable_config configuration, dropping", + }, + // Invalid boolean in environment variable + { + name: "invalid env value", + envValue: "not-a-bool", + key: "DD_KEY", + defaultValue: true, + expectedValue: true, + expectedOrigin: telemetry.OriginDefault, + expectedErr: "non-boolean value for DD_KEY: 'not-a-bool' in env_var configuration, dropping", + }, + // Invalid boolean in local config + { + name: "invalid local config value", + localYaml: "apm_configuration_default:\n DD_KEY: not-a-bool", + key: "DD_KEY", + defaultValue: true, + expectedValue: true, + expectedOrigin: telemetry.OriginDefault, + expectedErr: "non-boolean value for DD_KEY: 'not-a-bool' in local_stable_config configuration, dropping", + }, + // Empty string in config; no error expected + { + name: "empty string in config", + localYaml: "apm_configuration_default:\n DD_KEY: ''", + key: "DD_KEY", + defaultValue: true, + expectedValue: true, + expectedOrigin: telemetry.OriginDefault, + expectedErr: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Setup test environment + if tt.localYaml != "" { + tempLocalPath := "local.yml" + err := os.WriteFile(tempLocalPath, []byte(tt.localYaml), 0644) + assert.NoError(t, err) + defer os.Remove(tempLocalPath) + LocalConfig = newStableConfigSource(tempLocalPath, telemetry.OriginLocalStableConfig) + defer func() { LocalConfig = newStableConfigSource(localFilePath, telemetry.OriginLocalStableConfig) }() + } + + if tt.managedYaml != "" { + tempManagedPath := "managed.yml" + err := os.WriteFile(tempManagedPath, []byte(tt.managedYaml), 0644) + assert.NoError(t, err) + defer os.Remove(tempManagedPath) + ManagedConfig = newStableConfigSource(tempManagedPath, telemetry.OriginManagedStableConfig) + defer func() { ManagedConfig = newStableConfigSource(managedFilePath, telemetry.OriginManagedStableConfig) }() + } + + if tt.envValue != "" { + t.Setenv(tt.key, tt.envValue) + } + + val, origin, err := Bool(tt.key, tt.defaultValue) + assert.Equal(t, tt.expectedValue, val) + assert.Equal(t, tt.expectedOrigin, origin) + if tt.expectedErr != "" { + assert.ErrorContains(t, err, tt.expectedErr) + } else { + assert.NoError(t, err) + } + }) + } + }) +} + +func TestString(t *testing.T) { + // Yaml content for local and managed files + localYaml := ` +config_id: 100 +apm_configuration_default: + DD_KEY: local +` + managedYaml := ` +config_id: 200 +apm_configuration_default: + DD_KEY: managed +` + // Modify file paths for testing + tempLocalPath := "local.yml" + tempManagedPath := "managed.yml" + // Write to local file, and defer delete it + err := os.WriteFile(tempLocalPath, []byte(localYaml), 0644) + assert.NoError(t, err) + defer os.Remove(tempLocalPath) + // Write to managed file, and defer delete it + err = os.WriteFile(tempManagedPath, []byte(managedYaml), 0644) + assert.NoError(t, err) + defer os.Remove(tempManagedPath) + + // Setup mock telemetry client + telemetryClient := new(telemetrytest.MockClient) + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "default", Origin: telemetry.OriginDefault, ID: telemetry.EmptyID}}).Return() + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "local", Origin: telemetry.OriginLocalStableConfig, ID: "100"}}).Return() + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "env", Origin: telemetry.OriginEnvVar, ID: telemetry.EmptyID}}).Return() + telemetryClient.On("RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "managed", Origin: telemetry.OriginManagedStableConfig, ID: "200"}}).Return() + defer telemetry.MockClient(telemetryClient)() + + t.Run("default", func(t *testing.T) { + val, origin := String("DD_KEY", "default") + assert.Equal(t, "default", val) + assert.Equal(t, telemetry.OriginDefault, origin) + telemetryClient.AssertCalled(t, "RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "default", Origin: telemetry.OriginDefault, ID: telemetry.EmptyID}}) + }) + t.Run("localStableconfig only", func(t *testing.T) { + LocalConfig = newStableConfigSource(tempLocalPath, telemetry.OriginLocalStableConfig) + defer func() { LocalConfig = newStableConfigSource(localFilePath, telemetry.OriginLocalStableConfig) }() + val, origin := String("DD_KEY", "default") + assert.Equal(t, "local", val) + assert.Equal(t, telemetry.OriginLocalStableConfig, origin) + telemetryClient.AssertCalled(t, "RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "local", Origin: telemetry.OriginLocalStableConfig, ID: "100"}}) + }) + t.Run("env overrides localStableConfig", func(t *testing.T) { + t.Setenv("DD_KEY", "env") + LocalConfig = newStableConfigSource(tempLocalPath, telemetry.OriginLocalStableConfig) + defer func() { LocalConfig = newStableConfigSource(localFilePath, telemetry.OriginLocalStableConfig) }() + val, origin := String("DD_KEY", "default") + assert.Equal(t, "env", val) + assert.Equal(t, telemetry.OriginEnvVar, origin) + telemetryClient.AssertCalled(t, "RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "env", Origin: telemetry.OriginEnvVar, ID: telemetry.EmptyID}}) + }) + t.Run("managedStableConfig overrides env", func(t *testing.T) { + t.Setenv("DD_KEY", "env") + + LocalConfig = newStableConfigSource(tempLocalPath, telemetry.OriginLocalStableConfig) + defer func() { LocalConfig = newStableConfigSource(localFilePath, telemetry.OriginLocalStableConfig) }() + + ManagedConfig = newStableConfigSource(tempManagedPath, telemetry.OriginManagedStableConfig) + defer func() { ManagedConfig = newStableConfigSource(managedFilePath, telemetry.OriginManagedStableConfig) }() + + val, origin := String("DD_KEY", "default") + assert.Equal(t, "managed", val) + assert.Equal(t, telemetry.OriginManagedStableConfig, origin) + + telemetryClient.AssertCalled(t, "RegisterAppConfigs", []telemetry.Configuration{{Name: "DD_KEY", Value: "managed", Origin: telemetry.OriginManagedStableConfig, ID: "200"}}) + }) +} diff --git a/internal/stableconfig/stableconfig.go b/internal/stableconfig/stableconfig.go new file mode 100644 index 0000000000..ddd5348dda --- /dev/null +++ b/internal/stableconfig/stableconfig.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package stableconfig provides utilities to load and manage APM configurations +// loaded from YAML configuration files +package stableconfig + +import "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + +// stableConfig represents a configuration loaded from a YAML source file. +type stableConfig struct { + Config map[string]string `yaml:"apm_configuration_default,omitempty"` // Configuration key-value pairs. + ID string `yaml:"config_id,omitempty"` // Identifier for the config set. +} + +func (s *stableConfig) get(key string) string { + return s.Config[key] +} + +func (s *stableConfig) getID() string { + return s.ID +} + +// isEmpty checks if the config is considered empty (no ID and no config entries). +func (s *stableConfig) isEmpty() bool { + return s.ID == telemetry.EmptyID && len(s.Config) == 0 +} + +// emptyStableConfig creates and returns a new, empty stableConfig instance. +func emptyStableConfig() *stableConfig { + return &stableConfig{ + Config: make(map[string]string, 0), + ID: telemetry.EmptyID, + } +} diff --git a/internal/stableconfig/stableconfigsource.go b/internal/stableconfig/stableconfigsource.go new file mode 100644 index 0000000000..602637c8bf --- /dev/null +++ b/internal/stableconfig/stableconfigsource.go @@ -0,0 +1,101 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package stableconfig provides utilities to load and manage APM configurations +// loaded from YAML configuration files +package stableconfig + +import ( + "os" + + "go.yaml.in/yaml/v3" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +const ( + // File paths are supported on linux only + localFilePath = "/etc/datadog-agent/application_monitoring.yaml" + managedFilePath = "/etc/datadog-agent/managed/datadog-agent/stable/application_monitoring.yaml" + + // maxFileSize defines the maximum size in bytes for stable config files (4KB). This limit ensures predictable memory use and guards against malformed large files. + maxFileSize = 4 * 1024 +) + +// LocalConfig holds the configuration loaded from the user-managed file. +var LocalConfig = newStableConfigSource(localFilePath, telemetry.OriginLocalStableConfig) + +// ManagedConfig holds the configuration loaded from the fleet-managed file. +var ManagedConfig = newStableConfigSource(managedFilePath, telemetry.OriginManagedStableConfig) + +// stableConfigSource represents a source of stable configuration loaded from a file. +type stableConfigSource struct { + filePath string // Path to the configuration file. + origin telemetry.Origin // Origin identifier for telemetry. + config *stableConfig // Parsed stable configuration. +} + +func (s *stableConfigSource) Get(key string) string { + return s.config.get(key) +} + +func (s *stableConfigSource) GetID() string { + return s.config.getID() +} + +// newStableConfigSource initializes a new stableConfigSource from the given file. +func newStableConfigSource(filePath string, origin telemetry.Origin) *stableConfigSource { + return &stableConfigSource{ + filePath: filePath, + origin: origin, + config: parseFile(filePath), + } +} + +// ParseFile reads and parses the config file at the given path. +// Returns an empty config if the file doesn't exist or is invalid. +func parseFile(filePath string) *stableConfig { + info, err := os.Stat(filePath) + if err != nil { + // It's expected that the stable config file may not exist; its absence is not an error. + if !os.IsNotExist(err) { + log.Warn("Failed to stat stable config file %q, dropping: %v", filePath, err.Error()) + } + return emptyStableConfig() + } + + if info.Size() > maxFileSize { + log.Warn("Stable config file %s exceeds size limit (%d bytes > %d bytes), dropping", + filePath, info.Size(), maxFileSize) + return emptyStableConfig() + } + + data, err := os.ReadFile(filePath) + if err != nil { + // It's expected that the stable config file may not exist; its absence is not an error. + if !os.IsNotExist(err) { + log.Warn("Failed to read stable config file %q, dropping: %v", filePath, err.Error()) + } + return emptyStableConfig() + } + + return fileContentsToConfig(data, filePath) +} + +// fileContentsToConfig parses YAML data into a stableConfig struct. +// Returns an empty config if parsing fails or the data is malformed. +func fileContentsToConfig(data []byte, fileName string) *stableConfig { + scfg := &stableConfig{} + err := yaml.Unmarshal(data, scfg) + if err != nil { + log.Warn("Parsing stable config file %s failed due to error, dropping: %v", fileName, err.Error()) + return emptyStableConfig() + } + if scfg.Config == nil { + scfg.Config = make(map[string]string, 0) + } + return scfg +} diff --git a/internal/stableconfig/stableconfigsource_test.go b/internal/stableconfig/stableconfigsource_test.go new file mode 100644 index 0000000000..10d2eb857b --- /dev/null +++ b/internal/stableconfig/stableconfigsource_test.go @@ -0,0 +1,299 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Package stableconfig provides utilities to load and manage APM configurations +// loaded from YAML configuration files +package stableconfig + +import ( + "bytes" + "os" + "runtime" + "testing" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/stretchr/testify/assert" +) + +const ( + validYaml = ` +config_id: 67890 +apm_configuration_default: + DD_KEY_1: value_1 + "DD_KEY_2": "value_2" +` +) + +// testLogger implements a mock Logger that captures output +type testLogger struct { + buf bytes.Buffer +} + +func (l *testLogger) Log(msg string) { + l.buf.WriteString(msg) +} + +func (l *testLogger) String() string { + return l.buf.String() +} + +func (l *testLogger) Reset() { + l.buf.Reset() +} + +func TestFileContentsToConfig(t *testing.T) { + t.Run("simple failure", func(t *testing.T) { + data := ` +a: Easy! +b: + c: 2 + d: [3, 4] +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.True(t, scfg.isEmpty()) + }) + t.Run("simple success", func(t *testing.T) { + scfg := fileContentsToConfig([]byte(validYaml), "test.yml") + assert.Equal(t, scfg.ID, "67890") + assert.Equal(t, len(scfg.Config), 2) + assert.Equal(t, scfg.Config["DD_KEY_1"], "value_1") + assert.Equal(t, scfg.Config["DD_KEY_2"], "value_2") + }) + t.Run("success without apm_configuration_default", func(t *testing.T) { + data := ` +config_id: 67890 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.Equal(t, len(scfg.Config), 0) + assert.Equal(t, scfg.ID, "67890") + }) + t.Run("success without config_id", func(t *testing.T) { + data := ` +apm_configuration_default: + DD_KEY_1: value_1 + "DD_KEY_2": "value_2" +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.Equal(t, len(scfg.Config), 2) + assert.Equal(t, scfg.Config["DD_KEY_1"], "value_1") + assert.Equal(t, scfg.Config["DD_KEY_2"], "value_2") + assert.Equal(t, scfg.ID, telemetry.EmptyID) + }) + t.Run("success with empty contents", func(t *testing.T) { + scfg := fileContentsToConfig([]byte(``), "test.yml") + assert.True(t, scfg.isEmpty()) + }) + + t.Run("numeric values", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: + DD_KEY_1: 123 + DD_KEY_2: 3.14 + DD_KEY_3: -42 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.Equal(t, scfg.ID, "67890") + assert.Equal(t, len(scfg.Config), 3) + assert.Equal(t, scfg.Config["DD_KEY_1"], "123") + assert.Equal(t, scfg.Config["DD_KEY_2"], "3.14") + assert.Equal(t, scfg.Config["DD_KEY_3"], "-42") + }) + + t.Run("boolean values", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: + DD_KEY_1: true + DD_KEY_2: false + DD_KEY_3: yes + DD_KEY_4: no +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.Equal(t, scfg.ID, "67890") + assert.Equal(t, len(scfg.Config), 4) + assert.Equal(t, scfg.Config["DD_KEY_1"], "true") + assert.Equal(t, scfg.Config["DD_KEY_2"], "false") + assert.Equal(t, scfg.Config["DD_KEY_3"], "yes") + assert.Equal(t, scfg.Config["DD_KEY_4"], "no") + }) + + t.Run("malformed YAML - missing colon", func(t *testing.T) { + data := ` +config_id 67890 +apm_configuration_default + DD_KEY_1 value_1 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.True(t, scfg.isEmpty()) + }) + + t.Run("malformed YAML - incorrect indentation", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: +DD_KEY_1: value_1 + DD_KEY_2: value_2 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.True(t, scfg.isEmpty()) + }) + + t.Run("malformed YAML - duplicate keys", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: + DD_KEY_1: value_1 + DD_KEY_1: value_2 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.True(t, scfg.isEmpty()) // yaml.v3 treats duplicate keys as an error + }) + + t.Run("malformed YAML - unclosed quotes", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: + DD_KEY_1: "value_1 + DD_KEY_2: value_2 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.True(t, scfg.isEmpty()) + }) + + t.Run("malformed YAML - invalid nested structure", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: + nested: + - item1 + - item2 + DD_KEY_1: value_1 +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.True(t, scfg.isEmpty()) + }) + + t.Run("malformed YAML - special characters in values", func(t *testing.T) { + data := ` +config_id: 67890 +apm_configuration_default: + DD_KEY_1: "value with spaces" + DD_KEY_2: "value with \n newline" + DD_KEY_3: "value with \t tab" + DD_KEY_4: "value with \" quotes" + DD_KEY_5: "value with \\ backslash" +` + scfg := fileContentsToConfig([]byte(data), "test.yml") + assert.Equal(t, scfg.ID, "67890") + assert.Equal(t, len(scfg.Config), 5) + assert.Equal(t, scfg.Config["DD_KEY_1"], "value with spaces") + assert.Equal(t, scfg.Config["DD_KEY_2"], "value with \n newline") + assert.Equal(t, scfg.Config["DD_KEY_3"], "value with \t tab") + assert.Equal(t, scfg.Config["DD_KEY_4"], "value with \" quotes") + assert.Equal(t, scfg.Config["DD_KEY_5"], "value with \\ backslash") + }) +} + +func TestParseFile(t *testing.T) { + t.Run("file doesn't exist", func(t *testing.T) { + scfg := parseFile("test.yml") + assert.True(t, scfg.isEmpty()) + }) + t.Run("success", func(t *testing.T) { + err := os.WriteFile("test.yml", []byte(validYaml), 0644) + assert.NoError(t, err) + defer os.Remove("test.yml") + scfg := parseFile("test.yml") + assert.Equal(t, scfg.ID, "67890") + assert.Equal(t, len(scfg.Config), 2) + assert.Equal(t, scfg.Config["DD_KEY_1"], "value_1") + assert.Equal(t, scfg.Config["DD_KEY_2"], "value_2") + }) + t.Run("file with no read permissions", func(t *testing.T) { + if runtime.GOOS == "windows" { + t.Skip("File permission restrictions don't work reliably on Windows - the OS often grants read access to file owners regardless of permission bits") + } + + // On Unix-like systems, create file with no read permissions + err := os.WriteFile("test.yml", []byte(validYaml), 0000) + assert.NoError(t, err) + defer os.Remove("test.yml") + + scfg := parseFile("test.yml") + assert.True(t, scfg.isEmpty()) + }) +} + +func TestFileSizeLimits(t *testing.T) { + t.Run("under limit", func(t *testing.T) { + data := ` +"config_id": 67890 +"apm_configuration_default": + "DD_APM_TRACING_ENABLED": "false" + "DD_RUNTIME_METRICS_ENABLED": "false" + "DD_LOGS_INJECTION": "false" + "DD_PROFILING_ENABLED": "false" + "DD_DATA_STREAMS_ENABLED": "false" + "DD_APPSEC_ENABLED": "false" + "DD_IAST_ENABLED": "false" + "DD_DYNAMIC_INSTRUMENTATION_ENABLED": "false" + "DD_DATA_JOBS_ENABLED": "false" + "DD_APPSEC_SCA_ENABLED": "false" + "DD_TRACE_DEBUG": "false" +` + err := os.WriteFile("test.yml", []byte(data), 0644) + assert.NoError(t, err) + defer os.Remove("test.yml") + scfg := parseFile("test.yml") + assert.False(t, scfg.isEmpty()) // file parsing succeeded + }) + t.Run("over limit", func(t *testing.T) { + // Build a valid stable configuration file that surpasses maxFileSize + header := `"config_id": 67890 + "apm_configuration_default": + ` + entry := ` "DD_TRACE_DEBUG": "false"` + content := header + for len(content) <= maxFileSize { + content += entry + } + + err := os.WriteFile("test.yml", []byte(content), 0644) + assert.NoError(t, err) + defer os.Remove("test.yml") + scfg := parseFile("test.yml") + assert.True(t, scfg.isEmpty()) // file parsing succeeded + }) +} + +func TestParseFileNonLinux(t *testing.T) { + if runtime.GOOS == "linux" { + t.Skip("This test for non-linux platforms") + } + + // Capture log output + tl := &testLogger{} + defer log.UseLogger(tl)() + + // Test that we don't log warnings for non-existent files on non-Linux systems + config := parseFile(localFilePath) + assert.NotNil(t, config) + assert.Empty(t, config.Config) + assert.Empty(t, tl.String(), "Should not log warnings for non-existent files on non-Linux systems") + + // Test that we do log warnings for other errors + filePath := "test.yml" + err := os.MkdirAll(filePath, 0755) + assert.NoError(t, err) + defer os.RemoveAll(filePath) + + tl.Reset() + config = parseFile(filePath) + assert.NotNil(t, config) + assert.Empty(t, config.Config) + assert.Contains(t, tl.String(), "Failed to read stable config file", "Should log warnings for non-IsNotExist errors") +} diff --git a/internal/stacktrace/contribs_generated.go b/internal/stacktrace/contribs_generated.go new file mode 100644 index 0000000000..f6f8f77f32 --- /dev/null +++ b/internal/stacktrace/contribs_generated.go @@ -0,0 +1,820 @@ +// Code generated by gencontribs. DO NOT EDIT. +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +// Code generated by github.com/DataDog/dd-trace-go/scripts/gencontribs DO NOT EDIT. + +// generatedThirdPartyLibraries returns the list of third-party libraries +// automatically extracted from all contrib module dependencies. +// +// This list is generated at build time by traversing all contrib directories +// and running 'go list -m all' in each to capture all dependencies. +func generatedThirdPartyLibraries() []string { + return []string{ + "cel.dev/expr", + "cloud.google.com/go", + "cloud.google.com/go/accessapproval", + "cloud.google.com/go/accesscontextmanager", + "cloud.google.com/go/aiplatform", + "cloud.google.com/go/analytics", + "cloud.google.com/go/apigateway", + "cloud.google.com/go/apigeeconnect", + "cloud.google.com/go/apigeeregistry", + "cloud.google.com/go/appengine", + "cloud.google.com/go/area120", + "cloud.google.com/go/artifactregistry", + "cloud.google.com/go/asset", + "cloud.google.com/go/assuredworkloads", + "cloud.google.com/go/auth", + "cloud.google.com/go/auth/oauth2adapt", + "cloud.google.com/go/automl", + "cloud.google.com/go/baremetalsolution", + "cloud.google.com/go/batch", + "cloud.google.com/go/beyondcorp", + "cloud.google.com/go/bigquery", + "cloud.google.com/go/bigtable", + "cloud.google.com/go/billing", + "cloud.google.com/go/binaryauthorization", + "cloud.google.com/go/certificatemanager", + "cloud.google.com/go/channel", + "cloud.google.com/go/cloudbuild", + "cloud.google.com/go/clouddms", + "cloud.google.com/go/cloudsqlconn", + "cloud.google.com/go/cloudtasks", + "cloud.google.com/go/compute", + "cloud.google.com/go/compute/metadata", + "cloud.google.com/go/contactcenterinsights", + "cloud.google.com/go/container", + "cloud.google.com/go/containeranalysis", + "cloud.google.com/go/datacatalog", + "cloud.google.com/go/dataflow", + "cloud.google.com/go/dataform", + "cloud.google.com/go/datafusion", + "cloud.google.com/go/datalabeling", + "cloud.google.com/go/dataplex", + "cloud.google.com/go/dataproc/v2", + "cloud.google.com/go/dataqna", + "cloud.google.com/go/datastore", + "cloud.google.com/go/datastream", + "cloud.google.com/go/deploy", + "cloud.google.com/go/dialogflow", + "cloud.google.com/go/dlp", + "cloud.google.com/go/documentai", + "cloud.google.com/go/domains", + "cloud.google.com/go/edgecontainer", + "cloud.google.com/go/errorreporting", + "cloud.google.com/go/essentialcontacts", + "cloud.google.com/go/eventarc", + "cloud.google.com/go/filestore", + "cloud.google.com/go/firestore", + "cloud.google.com/go/functions", + "cloud.google.com/go/gkebackup", + "cloud.google.com/go/gkeconnect", + "cloud.google.com/go/gkehub", + "cloud.google.com/go/gkemulticloud", + "cloud.google.com/go/gsuiteaddons", + "cloud.google.com/go/iam", + "cloud.google.com/go/iap", + "cloud.google.com/go/ids", + "cloud.google.com/go/iot", + "cloud.google.com/go/kms", + "cloud.google.com/go/language", + "cloud.google.com/go/lifesciences", + "cloud.google.com/go/logging", + "cloud.google.com/go/longrunning", + "cloud.google.com/go/managedidentities", + "cloud.google.com/go/maps", + "cloud.google.com/go/mediatranslation", + "cloud.google.com/go/memcache", + "cloud.google.com/go/metastore", + "cloud.google.com/go/monitoring", + "cloud.google.com/go/networkconnectivity", + "cloud.google.com/go/networkmanagement", + "cloud.google.com/go/networksecurity", + "cloud.google.com/go/notebooks", + "cloud.google.com/go/optimization", + "cloud.google.com/go/orchestration", + "cloud.google.com/go/orgpolicy", + "cloud.google.com/go/osconfig", + "cloud.google.com/go/oslogin", + "cloud.google.com/go/phishingprotection", + "cloud.google.com/go/policytroubleshooter", + "cloud.google.com/go/privatecatalog", + "cloud.google.com/go/pubsub", + "cloud.google.com/go/pubsub/v2", + "cloud.google.com/go/pubsublite", + "cloud.google.com/go/recaptchaenterprise/v2", + "cloud.google.com/go/recommendationengine", + "cloud.google.com/go/recommender", + "cloud.google.com/go/redis", + "cloud.google.com/go/resourcemanager", + "cloud.google.com/go/resourcesettings", + "cloud.google.com/go/retail", + "cloud.google.com/go/run", + "cloud.google.com/go/scheduler", + "cloud.google.com/go/secretmanager", + "cloud.google.com/go/security", + "cloud.google.com/go/securitycenter", + "cloud.google.com/go/servicedirectory", + "cloud.google.com/go/shell", + "cloud.google.com/go/spanner", + "cloud.google.com/go/speech", + "cloud.google.com/go/storage", + "cloud.google.com/go/storagetransfer", + "cloud.google.com/go/talent", + "cloud.google.com/go/texttospeech", + "cloud.google.com/go/tpu", + "cloud.google.com/go/trace", + "cloud.google.com/go/translate", + "cloud.google.com/go/video", + "cloud.google.com/go/videointelligence", + "cloud.google.com/go/vision/v2", + "cloud.google.com/go/vmmigration", + "cloud.google.com/go/vmwareengine", + "cloud.google.com/go/vpcaccess", + "cloud.google.com/go/webrisk", + "cloud.google.com/go/websecurityscanner", + "cloud.google.com/go/workflows", + "dario.cat/mergo", + "github.com/99designs/gqlgen", + "github.com/AdaLogics/go-fuzz-headers", + "github.com/AdamKorcz/go-118-fuzz-build", + "github.com/AlecAivazis/survey/v2", + "github.com/Azure/azure-sdk-for-go/sdk/azcore", + "github.com/Azure/azure-sdk-for-go/sdk/azidentity", + "github.com/Azure/azure-sdk-for-go/sdk/internal", + "github.com/Azure/go-ansiterm", + "github.com/Azure/go-ntlmssp", + "github.com/AzureAD/microsoft-authentication-library-for-go", + "github.com/BurntSushi/toml", + "github.com/DATA-DOG/go-sqlmock", + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp", + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric", + "github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping", + "github.com/IBM/sarama", + "github.com/Masterminds/goutils", + "github.com/Masterminds/semver/v3", + "github.com/Masterminds/sprig/v3", + "github.com/Microsoft/go-winio", + "github.com/Microsoft/hcsshim", + "github.com/NYTimes/gziphandler", + "github.com/PuerkitoBio/goquery", + "github.com/Shopify/sarama", + "github.com/Shopify/toxiproxy/v2", + "github.com/actgardner/gogen-avro/v10", + "github.com/actgardner/gogen-avro/v9", + "github.com/agnivade/levenshtein", + "github.com/ahmetb/gen-crd-api-reference-docs", + "github.com/alecthomas/template", + "github.com/alecthomas/units", + "github.com/andreyvit/diff", + "github.com/andybalholm/brotli", + "github.com/andybalholm/cascadia", + "github.com/antihax/optional", + "github.com/arbovm/levenshtein", + "github.com/armon/circbuf", + "github.com/armon/go-metrics", + "github.com/armon/go-radix", + "github.com/armon/go-socks5", + "github.com/asaskevich/govalidator", + "github.com/aws/aws-lambda-go", + "github.com/aws/aws-sdk-go", + "github.com/aws/aws-sdk-go-v2", + "github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream", + "github.com/aws/aws-sdk-go-v2/config", + "github.com/aws/aws-sdk-go-v2/credentials", + "github.com/aws/aws-sdk-go-v2/feature/ec2/imds", + "github.com/aws/aws-sdk-go-v2/feature/s3/manager", + "github.com/aws/aws-sdk-go-v2/internal/configsources", + "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2", + "github.com/aws/aws-sdk-go-v2/internal/ini", + "github.com/aws/aws-sdk-go-v2/internal/v4a", + "github.com/aws/aws-sdk-go-v2/service/dynamodb", + "github.com/aws/aws-sdk-go-v2/service/eventbridge", + "github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding", + "github.com/aws/aws-sdk-go-v2/service/internal/checksum", + "github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery", + "github.com/aws/aws-sdk-go-v2/service/internal/presigned-url", + "github.com/aws/aws-sdk-go-v2/service/internal/s3shared", + "github.com/aws/aws-sdk-go-v2/service/kinesis", + "github.com/aws/aws-sdk-go-v2/service/kms", + "github.com/aws/aws-sdk-go-v2/service/route53", + "github.com/aws/aws-sdk-go-v2/service/s3", + "github.com/aws/aws-sdk-go-v2/service/sfn", + "github.com/aws/aws-sdk-go-v2/service/sns", + "github.com/aws/aws-sdk-go-v2/service/sqs", + "github.com/aws/aws-sdk-go-v2/service/sso", + "github.com/aws/aws-sdk-go-v2/service/ssooidc", + "github.com/aws/aws-sdk-go-v2/service/sts", + "github.com/aws/aws-xray-sdk-go/v2", + "github.com/aws/smithy-go", + "github.com/beorn7/perks", + "github.com/bgentry/speakeasy", + "github.com/bitly/go-hostpool", + "github.com/blang/semver/v4", + "github.com/bmizerany/assert", + "github.com/bradfitz/gomemcache", + "github.com/bsm/ginkgo/v2", + "github.com/bsm/gomega", + "github.com/buger/goterm", + "github.com/bytedance/sonic", + "github.com/bytedance/sonic/loader", + "github.com/cenkalti/backoff/v3", + "github.com/cenkalti/backoff/v4", + "github.com/cenkalti/backoff/v5", + "github.com/census-instrumentation/opencensus-proto", + "github.com/cespare/xxhash/v2", + "github.com/chzyer/logex", + "github.com/chzyer/readline", + "github.com/chzyer/test", + "github.com/cihub/seelog", + "github.com/cilium/ebpf", + "github.com/circonus-labs/circonus-gometrics", + "github.com/circonus-labs/circonusllhist", + "github.com/client9/misspell", + "github.com/cloudwego/base64x", + "github.com/cloudwego/iasm", + "github.com/cncf/udpa/go", + "github.com/cncf/xds/go", + "github.com/codahale/rfc6979", + "github.com/compose-spec/compose-go/v2", + "github.com/confluentinc/confluent-kafka-go", + "github.com/confluentinc/confluent-kafka-go/v2", + "github.com/containerd/aufs", + "github.com/containerd/btrfs/v2", + "github.com/containerd/cgroups", + "github.com/containerd/cgroups/v3", + "github.com/containerd/console", + "github.com/containerd/containerd", + "github.com/containerd/containerd/api", + "github.com/containerd/continuity", + "github.com/containerd/errdefs", + "github.com/containerd/fifo", + "github.com/containerd/go-cni", + "github.com/containerd/go-runc", + "github.com/containerd/imgcrypt", + "github.com/containerd/log", + "github.com/containerd/nri", + "github.com/containerd/platforms", + "github.com/containerd/ttrpc", + "github.com/containerd/typeurl", + "github.com/containerd/typeurl/v2", + "github.com/containerd/zfs", + "github.com/containernetworking/cni", + "github.com/containernetworking/plugins", + "github.com/containers/ocicrypt", + "github.com/coreos/go-systemd/v22", + "github.com/cpuguy83/dockercfg", + "github.com/cpuguy83/go-md2man/v2", + "github.com/creack/pty", + "github.com/davecgh/go-spew", + "github.com/denisenkom/go-mssqldb", + "github.com/dgryski/go-farm", + "github.com/dgryski/go-rendezvous", + "github.com/dgryski/trifles", + "github.com/dimfeld/httptreemux/v5", + "github.com/distribution/reference", + "github.com/dnaeon/go-vcr", + "github.com/docker/buildx", + "github.com/docker/cli", + "github.com/docker/compose/v2", + "github.com/docker/distribution", + "github.com/docker/docker", + "github.com/docker/docker-credential-helpers", + "github.com/docker/go", + "github.com/docker/go-connections", + "github.com/docker/go-events", + "github.com/docker/go-metrics", + "github.com/docker/go-units", + "github.com/dustin/go-humanize", + "github.com/eapache/go-resiliency", + "github.com/eapache/go-xerial-snappy", + "github.com/eapache/queue", + "github.com/ebitengine/purego", + "github.com/elastic/elastic-transport-go/v8", + "github.com/elastic/go-elasticsearch/v6", + "github.com/elastic/go-elasticsearch/v7", + "github.com/elastic/go-elasticsearch/v8", + "github.com/emicklei/go-restful/v3", + "github.com/envoyproxy/go-control-plane", + "github.com/envoyproxy/go-control-plane/envoy", + "github.com/envoyproxy/go-control-plane/ratelimit", + "github.com/envoyproxy/protoc-gen-validate", + "github.com/evanphx/json-patch", + "github.com/evanphx/json-patch/v5", + "github.com/fatih/color", + "github.com/fatih/structs", + "github.com/felixge/httpsnoop", + "github.com/flynn/go-docopt", + "github.com/fortytw2/leaktest", + "github.com/frankban/quicktest", + "github.com/fsnotify/fsevents", + "github.com/fsnotify/fsnotify", + "github.com/fvbommel/sortorder", + "github.com/fxamacker/cbor/v2", + "github.com/gabriel-vasile/mimetype", + "github.com/ghodss/yaml", + "github.com/gin-contrib/sse", + "github.com/gin-gonic/gin", + "github.com/globalsign/mgo", + "github.com/go-asn1-ber/asn1-ber", + "github.com/go-chi/chi", + "github.com/go-chi/chi/v5", + "github.com/go-jose/go-jose/v3", + "github.com/go-jose/go-jose/v4", + "github.com/go-kit/kit", + "github.com/go-ldap/ldap/v3", + "github.com/go-logfmt/logfmt", + "github.com/go-logr/logr", + "github.com/go-logr/stdr", + "github.com/go-ole/go-ole", + "github.com/go-openapi/jsonpointer", + "github.com/go-openapi/jsonreference", + "github.com/go-openapi/swag", + "github.com/go-pg/pg/v10", + "github.com/go-pg/zerochecker", + "github.com/go-playground/assert/v2", + "github.com/go-playground/locales", + "github.com/go-playground/universal-translator", + "github.com/go-playground/validator/v10", + "github.com/go-redis/redis", + "github.com/go-redis/redis/v7", + "github.com/go-redis/redis/v8", + "github.com/go-sql-driver/mysql", + "github.com/go-stack/stack", + "github.com/go-task/slim-sprig", + "github.com/go-task/slim-sprig/v3", + "github.com/go-test/deep", + "github.com/go-viper/mapstructure/v2", + "github.com/gobuffalo/flect", + "github.com/goccy/go-json", + "github.com/gocql/gocql", + "github.com/godbus/dbus/v5", + "github.com/gofiber/fiber/v2", + "github.com/gofrs/flock", + "github.com/gofrs/uuid", + "github.com/gogo/googleapis", + "github.com/gogo/protobuf", + "github.com/golang-jwt/jwt", + "github.com/golang-jwt/jwt/v4", + "github.com/golang-sql/civil", + "github.com/golang-sql/sqlexp", + "github.com/golang/glog", + "github.com/golang/groupcache", + "github.com/golang/mock", + "github.com/golang/protobuf", + "github.com/golang/snappy", + "github.com/gomodule/redigo", + "github.com/google/btree", + "github.com/google/certificate-transparency-go", + "github.com/google/gnostic", + "github.com/google/gnostic-models", + "github.com/google/go-cmp", + "github.com/google/go-pkcs11", + "github.com/google/gofuzz", + "github.com/google/martian/v3", + "github.com/google/pprof", + "github.com/google/s2a-go", + "github.com/google/shlex", + "github.com/google/uuid", + "github.com/googleapis/enterprise-certificate-proxy", + "github.com/googleapis/gax-go/v2", + "github.com/gorilla/mux", + "github.com/gorilla/securecookie", + "github.com/gorilla/sessions", + "github.com/gorilla/websocket", + "github.com/graph-gophers/graphql-go", + "github.com/graphql-go/graphql", + "github.com/graphql-go/handler", + "github.com/gregjones/httpcache", + "github.com/grpc-ecosystem/go-grpc-middleware", + "github.com/grpc-ecosystem/go-grpc-middleware/v2", + "github.com/grpc-ecosystem/go-grpc-prometheus", + "github.com/grpc-ecosystem/grpc-gateway", + "github.com/grpc-ecosystem/grpc-gateway/v2", + "github.com/hailocab/go-hostpool", + "github.com/hamba/avro", + "github.com/hashicorp/cap/ldap", + "github.com/hashicorp/consul/api", + "github.com/hashicorp/consul/sdk", + "github.com/hashicorp/errwrap", + "github.com/hashicorp/go-cleanhttp", + "github.com/hashicorp/go-hclog", + "github.com/hashicorp/go-hmac-drbg", + "github.com/hashicorp/go-immutable-radix", + "github.com/hashicorp/go-kms-wrapping/entropy/v2", + "github.com/hashicorp/go-kms-wrapping/v2", + "github.com/hashicorp/go-msgpack", + "github.com/hashicorp/go-multierror", + "github.com/hashicorp/go-plugin", + "github.com/hashicorp/go-retryablehttp", + "github.com/hashicorp/go-rootcerts", + "github.com/hashicorp/go-secure-stdlib/base62", + "github.com/hashicorp/go-secure-stdlib/cryptoutil", + "github.com/hashicorp/go-secure-stdlib/mlock", + "github.com/hashicorp/go-secure-stdlib/parseutil", + "github.com/hashicorp/go-secure-stdlib/password", + "github.com/hashicorp/go-secure-stdlib/permitpool", + "github.com/hashicorp/go-secure-stdlib/plugincontainer", + "github.com/hashicorp/go-secure-stdlib/strutil", + "github.com/hashicorp/go-secure-stdlib/tlsutil", + "github.com/hashicorp/go-sockaddr", + "github.com/hashicorp/go-syslog", + "github.com/hashicorp/go-uuid", + "github.com/hashicorp/go-version", + "github.com/hashicorp/golang-lru", + "github.com/hashicorp/golang-lru/v2", + "github.com/hashicorp/hcl", + "github.com/hashicorp/logutils", + "github.com/hashicorp/mdns", + "github.com/hashicorp/memberlist", + "github.com/hashicorp/serf", + "github.com/hashicorp/vault/api", + "github.com/hashicorp/vault/sdk", + "github.com/hashicorp/yamux", + "github.com/heetch/avro", + "github.com/hpcloud/tail", + "github.com/huandu/xstrings", + "github.com/iancoleman/orderedmap", + "github.com/iancoleman/strcase", + "github.com/ianlancetaylor/demangle", + "github.com/imdario/mergo", + "github.com/in-toto/in-toto-golang", + "github.com/inconshreveable/mousetrap", + "github.com/intel/goresctrl", + "github.com/invopop/jsonschema", + "github.com/jackc/chunkreader/v2", + "github.com/jackc/pgconn", + "github.com/jackc/pgio", + "github.com/jackc/pgpassfile", + "github.com/jackc/pgproto3/v2", + "github.com/jackc/pgservicefile", + "github.com/jackc/pgtype", + "github.com/jackc/pgx/v4", + "github.com/jackc/pgx/v5", + "github.com/jackc/puddle/v2", + "github.com/jcmturner/aescts/v2", + "github.com/jcmturner/dnsutils/v2", + "github.com/jcmturner/gofork", + "github.com/jcmturner/goidentity/v6", + "github.com/jcmturner/gokrb5/v8", + "github.com/jcmturner/rpc/v2", + "github.com/jellydator/ttlcache/v3", + "github.com/jhump/gopoet", + "github.com/jhump/goprotoc", + "github.com/jhump/protoreflect", + "github.com/jinzhu/inflection", + "github.com/jinzhu/now", + "github.com/jmespath/go-jmespath", + "github.com/jmespath/go-jmespath/internal/testify", + "github.com/jmoiron/sqlx", + "github.com/jonboulle/clockwork", + "github.com/josharian/intern", + "github.com/joshlf/go-acl", + "github.com/json-iterator/go", + "github.com/juju/qthttptest", + "github.com/julienschmidt/httprouter", + "github.com/kballard/go-shellquote", + "github.com/kevinmbeaulieu/eq-go", + "github.com/kisielk/errcheck", + "github.com/kisielk/gotool", + "github.com/klauspost/compress", + "github.com/klauspost/cpuid/v2", + "github.com/knz/go-libedit", + "github.com/konsorten/go-windows-terminal-sequences", + "github.com/kr/logfmt", + "github.com/kr/pretty", + "github.com/kr/pty", + "github.com/kr/text", + "github.com/kylelemons/godebug", + "github.com/labstack/echo/v4", + "github.com/labstack/gommon", + "github.com/leeavital/protoc-gen-gostreamer", + "github.com/leodido/go-urn", + "github.com/lib/pq", + "github.com/linkedin/goavro", + "github.com/linkedin/goavro/v2", + "github.com/logrusorgru/aurora/v4", + "github.com/lufia/plan9stats", + "github.com/lyft/protoc-gen-star/v2", + "github.com/magiconair/properties", + "github.com/mailru/easyjson", + "github.com/matryer/moq", + "github.com/mattn/go-colorable", + "github.com/mattn/go-isatty", + "github.com/mattn/go-runewidth", + "github.com/mattn/go-shellwords", + "github.com/mattn/go-sqlite3", + "github.com/matttproud/golang_protobuf_extensions", + "github.com/mgutz/ansi", + "github.com/microsoft/go-mssqldb", + "github.com/miekg/dns", + "github.com/miekg/pkcs11", + "github.com/minio/sha256-simd", + "github.com/minio/simdjson-go", + "github.com/mistifyio/go-zfs/v3", + "github.com/mitchellh/cli", + "github.com/mitchellh/copystructure", + "github.com/mitchellh/go-homedir", + "github.com/mitchellh/go-testing-interface", + "github.com/mitchellh/go-wordwrap", + "github.com/mitchellh/mapstructure", + "github.com/mitchellh/reflectwalk", + "github.com/moby/buildkit", + "github.com/moby/docker-image-spec", + "github.com/moby/locker", + "github.com/moby/patternmatcher", + "github.com/moby/spdystream", + "github.com/moby/sys/mountinfo", + "github.com/moby/sys/sequential", + "github.com/moby/sys/signal", + "github.com/moby/sys/symlink", + "github.com/moby/sys/user", + "github.com/moby/sys/userns", + "github.com/moby/term", + "github.com/modern-go/concurrent", + "github.com/modern-go/reflect2", + "github.com/modocache/gover", + "github.com/montanaflynn/stats", + "github.com/morikuni/aec", + "github.com/munnerz/goautoneg", + "github.com/mwitkow/go-conntrack", + "github.com/mxk/go-flowrate", + "github.com/natefinch/atomic", + "github.com/negasus/haproxy-spoe-go", + "github.com/niemeyer/pretty", + "github.com/nrwiersma/avro-benchmarks", + "github.com/nxadm/tail", + "github.com/oklog/run", + "github.com/onsi/ginkgo", + "github.com/onsi/ginkgo/v2", + "github.com/onsi/gomega", + "github.com/open-feature/go-sdk", + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling", + "github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor", + "github.com/opencontainers/go-digest", + "github.com/opencontainers/image-spec", + "github.com/opencontainers/runtime-spec", + "github.com/opencontainers/runtime-tools", + "github.com/opencontainers/selinux", + "github.com/opentracing/opentracing-go", + "github.com/outcaste-io/ristretto", + "github.com/pascaldekloe/goe", + "github.com/pelletier/go-toml", + "github.com/pelletier/go-toml/v2", + "github.com/peterbourgon/diskv", + "github.com/petermattis/goid", + "github.com/philhofer/fwd", + "github.com/pierrec/lz4", + "github.com/pierrec/lz4/v4", + "github.com/pkg/browser", + "github.com/pkg/diff", + "github.com/pkg/errors", + "github.com/planetscale/vtprotobuf", + "github.com/pmezard/go-difflib", + "github.com/posener/complete", + "github.com/power-devops/perfstat", + "github.com/prometheus/client_golang", + "github.com/prometheus/client_model", + "github.com/prometheus/common", + "github.com/prometheus/procfs", + "github.com/puzpuzpuz/xsync/v3", + "github.com/quasilyte/go-ruleguard/dsl", + "github.com/rcrowley/go-metrics", + "github.com/redis/go-redis/v9", + "github.com/redis/rueidis", + "github.com/remyoudompheng/bigfft", + "github.com/richardartoul/molecule", + "github.com/rivo/uniseg", + "github.com/robfig/cron/v3", + "github.com/rogpeppe/clock", + "github.com/rogpeppe/fastuuid", + "github.com/rogpeppe/go-internal", + "github.com/rs/zerolog", + "github.com/russross/blackfriday/v2", + "github.com/ryanuber/columnize", + "github.com/ryanuber/go-glob", + "github.com/santhosh-tekuri/jsonschema/v5", + "github.com/sasha-s/go-deadlock", + "github.com/sean-/seed", + "github.com/secure-systems-lab/go-securesystemslib", + "github.com/segmentio/kafka-go", + "github.com/sergi/go-diff", + "github.com/serialx/hashring", + "github.com/shibumi/go-pathspec", + "github.com/shirou/gopsutil/v3", + "github.com/shirou/gopsutil/v4", + "github.com/shoenig/go-m1cpu", + "github.com/shoenig/test", + "github.com/shopspring/decimal", + "github.com/sirupsen/logrus", + "github.com/smartystreets/go-aws-auth", + "github.com/sony/gobreaker", + "github.com/sosodev/duration", + "github.com/spaolacci/murmur3", + "github.com/spf13/afero", + "github.com/spf13/cast", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spiffe/go-spiffe/v2", + "github.com/stefanberger/go-pkcs11uri", + "github.com/stoewer/go-strcase", + "github.com/stretchr/objx", + "github.com/stretchr/testify", + "github.com/syndtr/gocapability", + "github.com/syndtr/goleveldb", + "github.com/tchap/go-patricia/v2", + "github.com/testcontainers/testcontainers-go", + "github.com/testcontainers/testcontainers-go/modules/compose", + "github.com/theckman/httpforwarded", + "github.com/theupdateframework/notary", + "github.com/tidwall/assert", + "github.com/tidwall/btree", + "github.com/tidwall/buntdb", + "github.com/tidwall/gjson", + "github.com/tidwall/grect", + "github.com/tidwall/lotsa", + "github.com/tidwall/match", + "github.com/tidwall/pretty", + "github.com/tidwall/rtred", + "github.com/tidwall/tinyqueue", + "github.com/tilt-dev/fsnotify", + "github.com/tink-crypto/tink-go/v2", + "github.com/tinylib/msgp", + "github.com/tklauser/go-sysconf", + "github.com/tklauser/numcpus", + "github.com/tmthrgd/go-hex", + "github.com/tonistiigi/fsutil", + "github.com/tonistiigi/units", + "github.com/tonistiigi/vt100", + "github.com/tv42/httpunix", + "github.com/twitchtv/twirp", + "github.com/twitchyliquid64/golang-asm", + "github.com/ugorji/go/codec", + "github.com/uptrace/bun", + "github.com/uptrace/bun/dialect/sqlitedialect", + "github.com/urfave/cli", + "github.com/urfave/cli/v2", + "github.com/urfave/negroni", + "github.com/valkey-io/valkey-go", + "github.com/valyala/bytebufferpool", + "github.com/valyala/fasthttp", + "github.com/valyala/fasttemplate", + "github.com/valyala/tcplisten", + "github.com/vektah/gqlparser/v2", + "github.com/vishvananda/netlink", + "github.com/vishvananda/netns", + "github.com/vmihailenco/bufpool", + "github.com/vmihailenco/msgpack/v4", + "github.com/vmihailenco/msgpack/v5", + "github.com/vmihailenco/tagparser", + "github.com/vmihailenco/tagparser/v2", + "github.com/x448/float16", + "github.com/xdg-go/pbkdf2", + "github.com/xdg-go/scram", + "github.com/xdg-go/stringprep", + "github.com/xeipuuv/gojsonpointer", + "github.com/xeipuuv/gojsonreference", + "github.com/xeipuuv/gojsonschema", + "github.com/xrash/smetrics", + "github.com/yosida95/uritemplate/v3", + "github.com/youmark/pkcs8", + "github.com/yuin/goldmark", + "github.com/yusufpapurcu/wmi", + "github.com/zeebo/errs", + "go.einride.tech/aip", + "go.etcd.io/bbolt", + "go.mongodb.org/mongo-driver", + "go.mongodb.org/mongo-driver/v2", + "go.mozilla.org/pkcs7", + "go.opencensus.io", + "go.opentelemetry.io/auto/sdk", + "go.opentelemetry.io/collector/component", + "go.opentelemetry.io/collector/component/componentstatus", + "go.opentelemetry.io/collector/component/componenttest", + "go.opentelemetry.io/collector/consumer", + "go.opentelemetry.io/collector/consumer/consumertest", + "go.opentelemetry.io/collector/consumer/xconsumer", + "go.opentelemetry.io/collector/featuregate", + "go.opentelemetry.io/collector/internal/telemetry", + "go.opentelemetry.io/collector/pdata", + "go.opentelemetry.io/collector/pdata/pprofile", + "go.opentelemetry.io/collector/pdata/testdata", + "go.opentelemetry.io/collector/pipeline", + "go.opentelemetry.io/collector/processor", + "go.opentelemetry.io/collector/processor/processorhelper", + "go.opentelemetry.io/collector/processor/processortest", + "go.opentelemetry.io/collector/processor/xprocessor", + "go.opentelemetry.io/contrib/bridges/otelzap", + "go.opentelemetry.io/contrib/detectors/gcp", + "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc", + "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace", + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp", + "go.opentelemetry.io/contrib/otelconf", + "go.opentelemetry.io/otel", + "go.opentelemetry.io/otel/exporters/otlp/otlpmetric", + "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc", + "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp", + "go.opentelemetry.io/otel/exporters/otlp/otlptrace", + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc", + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp", + "go.opentelemetry.io/otel/exporters/prometheus", + "go.opentelemetry.io/otel/log", + "go.opentelemetry.io/otel/log/logtest", + "go.opentelemetry.io/otel/metric", + "go.opentelemetry.io/otel/sdk", + "go.opentelemetry.io/otel/sdk/metric", + "go.opentelemetry.io/otel/trace", + "go.opentelemetry.io/proto/otlp", + "go.opentelemetry.io/proto/slim/otlp", + "go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development", + "go.opentelemetry.io/proto/slim/otlp/profiles/v1development", + "go.uber.org/atomic", + "go.uber.org/goleak", + "go.uber.org/mock", + "go.uber.org/multierr", + "go.uber.org/zap", + "go.yaml.in/yaml/v2", + "go.yaml.in/yaml/v3", + "gonum.org/v1/gonum", + "google.golang.org/api", + "google.golang.org/appengine", + "google.golang.org/genproto", + "google.golang.org/genproto/googleapis/api", + "google.golang.org/genproto/googleapis/bytestream", + "google.golang.org/genproto/googleapis/rpc", + "google.golang.org/grpc", + "google.golang.org/grpc/cmd/protoc-gen-go-grpc", + "google.golang.org/protobuf", + "gopkg.in/alecthomas/kingpin.v2", + "gopkg.in/avro.v0", + "gopkg.in/check.v1", + "gopkg.in/errgo.v1", + "gopkg.in/errgo.v2", + "gopkg.in/evanphx/json-patch.v4", + "gopkg.in/fsnotify.v1", + "gopkg.in/httprequest.v1", + "gopkg.in/inf.v0", + "gopkg.in/ini.v1", + "gopkg.in/mgo.v2", + "gopkg.in/natefinch/npipe.v2", + "gopkg.in/olivere/elastic.v5", + "gopkg.in/retry.v1", + "gopkg.in/tomb.v1", + "gopkg.in/yaml.v2", + "gopkg.in/yaml.v3", + "gorm.io/driver/mysql", + "gorm.io/driver/postgres", + "gorm.io/driver/sqlserver", + "gorm.io/gorm", + "gotest.tools/v3", + "honnef.co/go/tools", + "k8s.io/api", + "k8s.io/apiextensions-apiserver", + "k8s.io/apimachinery", + "k8s.io/apiserver", + "k8s.io/client-go", + "k8s.io/code-generator", + "k8s.io/component-base", + "k8s.io/cri-api", + "k8s.io/gengo", + "k8s.io/gengo/v2", + "k8s.io/klog", + "k8s.io/klog/v2", + "k8s.io/kube-openapi", + "k8s.io/utils", + "lukechampine.com/uint128", + "mellium.im/sasl", + "modernc.org/cc/v3", + "modernc.org/cc/v4", + "modernc.org/ccgo/v3", + "modernc.org/ccgo/v4", + "modernc.org/ccorpus", + "modernc.org/gc/v2", + "modernc.org/httpfs", + "modernc.org/libc", + "modernc.org/mathutil", + "modernc.org/memory", + "modernc.org/opt", + "modernc.org/sqlite", + "modernc.org/strutil", + "modernc.org/tcl", + "modernc.org/token", + "modernc.org/z", + "nullprogram.com/x/optparse", + "rsc.io/pdf", + "sigs.k8s.io/controller-runtime", + "sigs.k8s.io/controller-tools", + "sigs.k8s.io/gateway-api", + "sigs.k8s.io/json", + "sigs.k8s.io/randfill", + "sigs.k8s.io/structured-merge-diff/v4", + "sigs.k8s.io/yaml", + "tags.cncf.io/container-device-interface", + "tags.cncf.io/container-device-interface/specs-go", + } +} diff --git a/internal/stacktrace/contribs_test.go b/internal/stacktrace/contribs_test.go new file mode 100644 index 0000000000..78d4728463 --- /dev/null +++ b/internal/stacktrace/contribs_test.go @@ -0,0 +1,332 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +import ( + "os" + "path/filepath" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/mod/modfile" +) + +// TestExtractThirdPartyLibraries tests the core logic for extracting third-party +// libraries from contrib go.mod files +func TestExtractThirdPartyLibraries(t *testing.T) { + tests := []struct { + name string + goModContent string + expected []string + }{ + { + name: "gorilla/mux pattern", + goModContent: `module github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.3.0-dev.1 + github.com/gorilla/mux v1.8.1 + github.com/stretchr/testify v1.10.0 +)`, + expected: []string{"github.com/gorilla/mux"}, + }, + { + name: "gin-gonic/gin pattern", + goModContent: `module github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.3.0-dev.1 + github.com/gin-gonic/gin v1.10.1 + github.com/stretchr/testify v1.10.0 +)`, + expected: []string{"github.com/gin-gonic/gin"}, + }, + { + name: "cloud.google.com pattern", + goModContent: `module github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 + +go 1.24.0 + +require ( + cloud.google.com/go/pubsub v1.37.0 + github.com/DataDog/dd-trace-go/v2 v2.3.0-dev.1 + github.com/stretchr/testify v1.10.0 +)`, + expected: []string{"cloud.google.com/go/pubsub"}, + }, + { + name: "redis pattern - multiple versions", + goModContent: `module github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.3.0-dev.1 + github.com/go-redis/redis v6.15.9+incompatible + github.com/stretchr/testify v1.10.0 +)`, + expected: []string{"github.com/go-redis/redis"}, + }, + { + name: "no third-party deps - only DataDog and testify", + goModContent: `module github.com/DataDog/dd-trace-go/contrib/internal/test/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.3.0-dev.1 + github.com/stretchr/testify v1.10.0 +)`, + expected: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := extractThirdPartyLibraries(tt.goModContent) + require.Equal(t, tt.expected, result) + }) + } +} + +// TestScanContribDirectories tests scanning actual contrib directories +func TestScanContribDirectories(t *testing.T) { + // Get the project root by walking up from current directory + projectRoot, err := findProjectRoot() + require.NoError(t, err) + + contribDir := filepath.Join(projectRoot, "contrib") + + // Verify contrib directory exists + _, err = os.Stat(contribDir) + require.NoError(t, err, "contrib directory should exist") + + // Scan for all go.mod files in contrib + goModFiles, err := scanContribGoMods(contribDir) + require.NoError(t, err) + require.Greater(t, len(goModFiles), 50, "should find many contrib go.mod files") + + // Extract third-party libraries from all contrib modules + libraries, err := extractAllThirdPartyLibraries(contribDir) + require.NoError(t, err) + require.Greater(t, len(libraries), 100, "should extract many third-party libraries") + + // Verify some expected libraries are present + expectedLibraries := []string{ + "github.com/gorilla/mux", + "github.com/gin-gonic/gin", + "cloud.google.com/go/pubsub", + "github.com/go-redis/redis", + } + + for _, expected := range expectedLibraries { + require.Contains(t, libraries, expected, "should contain %s", expected) + } + + // Verify no DataDog internal libraries are included + for _, lib := range libraries { + require.False(t, strings.HasPrefix(lib, "github.com/DataDog/"), + "should not contain DataDog internal library: %s", lib) + require.False(t, strings.HasPrefix(lib, "github.com/stretchr/testify"), + "should not contain testify: %s", lib) + } +} + +// TestClassifySymbolWithGeneratedLibraries tests that symbol classification +// works correctly with generated libraries +func TestClassifySymbolWithGeneratedLibraries(t *testing.T) { + projectRoot, err := findProjectRoot() + require.NoError(t, err) + + contribDir := filepath.Join(projectRoot, "contrib") + generated, err := extractAllThirdPartyLibraries(contribDir) + require.NoError(t, err) + + tests := []struct { + name string + symbol symbol + expected frameType + }{ + { + name: "datadog internal", + symbol: symbol{Package: "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"}, + expected: frameTypeDatadog, + }, + { + name: "standard library", + symbol: symbol{Package: "net/http"}, + expected: frameTypeRuntime, + }, + { + name: "customer code", + symbol: symbol{Package: "github.com/customer/app"}, + expected: frameTypeCustomer, + }, + } + + // Add tests for generated third-party libraries + for i, lib := range generated { + if i >= 5 { // Test first 5 to keep test fast + break + } + tests = append(tests, struct { + name string + symbol symbol + expected frameType + }{ + name: "generated third-party: " + lib, + symbol: symbol{Package: lib}, + expected: frameTypeThirdParty, + }) + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Test with generated libraries instead of hardcoded + result := classifySymbolWithLibraries(tt.symbol, internalSymbolPrefixes, generated) + require.Equal(t, tt.expected, result) + }) + } +} + +// Helper functions that mirror the generation tool logic + +func extractThirdPartyLibraries(goModContent string) []string { + modFile, err := modfile.Parse("go.mod", []byte(goModContent), nil) + if err != nil { + return nil + } + + var thirdPartyLibs []string + for _, req := range modFile.Require { + path := req.Mod.Path + + // Skip DataDog internal dependencies + if strings.HasPrefix(path, "github.com/DataDog/") { + continue + } + + // Skip testing dependencies + if strings.HasPrefix(path, "github.com/stretchr/testify") { + continue + } + + // Skip golang.org dependencies (usually tooling) + if strings.HasPrefix(path, "golang.org/") { + continue + } + + // Include all other third-party libraries to maximize coverage + thirdPartyLibs = append(thirdPartyLibs, path) + } + + return thirdPartyLibs +} + +func scanContribGoMods(contribDir string) ([]string, error) { + var goModFiles []string + + err := filepath.Walk(contribDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.Name() == "go.mod" { + goModFiles = append(goModFiles, path) + } + + return nil + }) + + return goModFiles, err +} + +func extractAllThirdPartyLibraries(contribDir string) ([]string, error) { + goModFiles, err := scanContribGoMods(contribDir) + if err != nil { + return nil, err + } + + var allLibraries []string + seen := make(map[string]bool) + + for _, goModPath := range goModFiles { + content, err := os.ReadFile(goModPath) + if err != nil { + continue // Skip files we can't read + } + + libs := extractThirdPartyLibraries(string(content)) + for _, lib := range libs { + if !seen[lib] { + seen[lib] = true + allLibraries = append(allLibraries, lib) + } + } + } + + sort.Strings(allLibraries) + return allLibraries, nil +} + +func findProjectRoot() (string, error) { + dir, err := os.Getwd() + if err != nil { + return "", err + } + + for { + // Look for go.work file (workspace root) or main go.mod + if _, err := os.Stat(filepath.Join(dir, "go.work")); err == nil { + return dir, nil + } + + // Check if we're in the main dd-trace-go directory by looking for contrib/ + if _, err := os.Stat(filepath.Join(dir, "contrib")); err == nil { + if _, err := os.Stat(filepath.Join(dir, "internal", "stacktrace")); err == nil { + return dir, nil + } + } + + parent := filepath.Dir(dir) + if parent == dir { + break // Reached root + } + dir = parent + } + + return "", os.ErrNotExist +} + +// classifySymbolWithLibraries is a test helper that uses provided libraries +// instead of the global knownThirdPartyLibraries +func classifySymbolWithLibraries(sym symbol, internalPrefixes []string, thirdPartyLibs []string) frameType { + pkg := sym.Package + + for _, prefix := range internalPrefixes { + if strings.HasPrefix(pkg, prefix) { + return frameTypeDatadog + } + } + + if isStandardLibraryPackage(pkg) { + return frameTypeRuntime + } + + for _, lib := range thirdPartyLibs { + if strings.HasPrefix(pkg, lib) { + return frameTypeThirdParty + } + } + + return frameTypeCustomer +} diff --git a/internal/stacktrace/event.go b/internal/stacktrace/event.go index 0b6ff81882..649717e740 100644 --- a/internal/stacktrace/event.go +++ b/internal/stacktrace/event.go @@ -3,13 +3,13 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -//go:generate msgp -o event_msgp.go -tests=false +//go:generate go run github.com/tinylib/msgp -o event_msgp.go -tests=false package stacktrace import ( - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/internal" + "github.com/DataDog/dd-trace-go/v2/instrumentation/appsec/trace" + "github.com/DataDog/dd-trace-go/v2/internal" "github.com/tinylib/msgp/msgp" ) @@ -103,10 +103,10 @@ func GetSpanValue(events ...*Event) any { } // AddToSpan adds the event to the given span's root span as a tag if stacktrace collection is enabled -func AddToSpan(span ddtrace.Span, events ...*Event) { +func AddToSpan(span trace.TagSetter, events ...*Event) { value := GetSpanValue(events...) type rooter interface { - Root() ddtrace.Span + Root() trace.TagSetter } if lrs, ok := span.(rooter); ok { span = lrs.Root() diff --git a/internal/stacktrace/event_msgp.go b/internal/stacktrace/event_msgp.go index 378c35223c..f5de22a6ac 100644 --- a/internal/stacktrace/event_msgp.go +++ b/internal/stacktrace/event_msgp.go @@ -1,7 +1,7 @@ -package stacktrace - // Code generated by github.com/tinylib/msgp DO NOT EDIT. +package stacktrace + import ( "github.com/tinylib/msgp/msgp" ) @@ -67,7 +67,7 @@ func (z *Event) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *Event) EncodeMsg(en *msgp.Writer) (err error) { - // omitempty: check for empty values + // check for omitted fields zb0001Len := uint32(5) var zb0001Mask uint8 /* 5 bits */ _ = zb0001Mask @@ -92,74 +92,75 @@ func (z *Event) EncodeMsg(en *msgp.Writer) (err error) { if err != nil { return } - if zb0001Len == 0 { - return - } - if (zb0001Mask & 0x1) == 0 { // if not empty - // write "type" - err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) - if err != nil { - return - } - err = en.WriteString(z.Type) - if err != nil { - err = msgp.WrapError(err, "Type") - return - } - } - if (zb0001Mask & 0x2) == 0 { // if not empty - // write "language" - err = en.Append(0xa8, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65) - if err != nil { - return + + // skip if no fields are to be emitted + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not omitted + // write "type" + err = en.Append(0xa4, 0x74, 0x79, 0x70, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Type) + if err != nil { + err = msgp.WrapError(err, "Type") + return + } } - err = en.WriteString(z.Language) - if err != nil { - err = msgp.WrapError(err, "Language") - return + if (zb0001Mask & 0x2) == 0 { // if not omitted + // write "language" + err = en.Append(0xa8, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Language) + if err != nil { + err = msgp.WrapError(err, "Language") + return + } } - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // write "id" - err = en.Append(0xa2, 0x69, 0x64) - if err != nil { - return + if (zb0001Mask & 0x4) == 0 { // if not omitted + // write "id" + err = en.Append(0xa2, 0x69, 0x64) + if err != nil { + return + } + err = en.WriteString(z.ID) + if err != nil { + err = msgp.WrapError(err, "ID") + return + } } - err = en.WriteString(z.ID) - if err != nil { - err = msgp.WrapError(err, "ID") - return + if (zb0001Mask & 0x8) == 0 { // if not omitted + // write "message" + err = en.Append(0xa7, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Message) + if err != nil { + err = msgp.WrapError(err, "Message") + return + } } - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // write "message" - err = en.Append(0xa7, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65) + // write "frames" + err = en.Append(0xa6, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73) if err != nil { return } - err = en.WriteString(z.Message) + err = z.Frames.EncodeMsg(en) if err != nil { - err = msgp.WrapError(err, "Message") + err = msgp.WrapError(err, "Frames") return } } - // write "frames" - err = en.Append(0xa6, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73) - if err != nil { - return - } - err = z.Frames.EncodeMsg(en) - if err != nil { - err = msgp.WrapError(err, "Frames") - return - } return } // MarshalMsg implements msgp.Marshaler func (z *Event) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values + // check for omitted fields zb0001Len := uint32(5) var zb0001Mask uint8 /* 5 bits */ _ = zb0001Mask @@ -181,35 +182,36 @@ func (z *Event) MarshalMsg(b []byte) (o []byte, err error) { } // variable map header, size zb0001Len o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len == 0 { - return - } - if (zb0001Mask & 0x1) == 0 { // if not empty - // string "type" - o = append(o, 0xa4, 0x74, 0x79, 0x70, 0x65) - o = msgp.AppendString(o, z.Type) - } - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "language" - o = append(o, 0xa8, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65) - o = msgp.AppendString(o, z.Language) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "id" - o = append(o, 0xa2, 0x69, 0x64) - o = msgp.AppendString(o, z.ID) - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // string "message" - o = append(o, 0xa7, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65) - o = msgp.AppendString(o, z.Message) - } - // string "frames" - o = append(o, 0xa6, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73) - o, err = z.Frames.MarshalMsg(o) - if err != nil { - err = msgp.WrapError(err, "Frames") - return + + // skip if no fields are to be emitted + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not omitted + // string "type" + o = append(o, 0xa4, 0x74, 0x79, 0x70, 0x65) + o = msgp.AppendString(o, z.Type) + } + if (zb0001Mask & 0x2) == 0 { // if not omitted + // string "language" + o = append(o, 0xa8, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65) + o = msgp.AppendString(o, z.Language) + } + if (zb0001Mask & 0x4) == 0 { // if not omitted + // string "id" + o = append(o, 0xa2, 0x69, 0x64) + o = msgp.AppendString(o, z.ID) + } + if (zb0001Mask & 0x8) == 0 { // if not omitted + // string "message" + o = append(o, 0xa7, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65) + o = msgp.AppendString(o, z.Message) + } + // string "frames" + o = append(o, 0xa6, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73) + o, err = z.Frames.MarshalMsg(o) + if err != nil { + err = msgp.WrapError(err, "Frames") + return + } } return } diff --git a/internal/stacktrace/event_test.go b/internal/stacktrace/event_test.go index 0de38a04f9..c9b6d56992 100644 --- a/internal/stacktrace/event_test.go +++ b/internal/stacktrace/event_test.go @@ -8,8 +8,7 @@ package stacktrace import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - + "github.com/DataDog/dd-trace-go/v2/internal" "github.com/stretchr/testify/require" "github.com/tinylib/msgp/msgp" ) diff --git a/internal/stacktrace/options.go b/internal/stacktrace/options.go new file mode 100644 index 0000000000..2c94345dfb --- /dev/null +++ b/internal/stacktrace/options.go @@ -0,0 +1,52 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +// unwindConfig holds configuration for stack unwinding +type unwindConfig struct { + maxDepth int + skipFrames int + redactUserCode bool + includeInternal bool +} + +// UnwindOption is a functional option for configuring stack unwinding +type UnwindOption func(*unwindConfig) + +// WithRedaction enables or disables customer code redaction +func WithRedaction() UnwindOption { + return func(cfg *unwindConfig) { + cfg.redactUserCode = true + } +} + +// WithoutRedaction disables customer code redaction +func WithoutRedaction() UnwindOption { + return func(cfg *unwindConfig) { + cfg.redactUserCode = false + } +} + +// WithMaxDepth sets the maximum number of frames to capture +func WithMaxDepth(depth int) UnwindOption { + return func(cfg *unwindConfig) { + cfg.maxDepth = depth + } +} + +// WithSkipFrames sets the number of frames to skip from the top of the stack +func WithSkipFrames(skip int) UnwindOption { + return func(cfg *unwindConfig) { + cfg.skipFrames = skip + } +} + +// WithInternalFrames controls whether to include internal Datadog frames +func WithInternalFrames(include bool) UnwindOption { + return func(cfg *unwindConfig) { + cfg.includeInternal = include + } +} diff --git a/internal/stacktrace/stacktrace.go b/internal/stacktrace/stacktrace.go index 060aebe12e..c7536d0b37 100644 --- a/internal/stacktrace/stacktrace.go +++ b/internal/stacktrace/stacktrace.go @@ -3,21 +3,21 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -//go:generate msgp -o=stacktrace_msgp.go -tests=false +//go:generate go run github.com/tinylib/msgp -o=stacktrace_msgp.go -tests=false +//go:generate env GOWORK=off go run ../../scripts/gencontribs/main.go ../.. contribs_generated.go package stacktrace import ( "errors" - "os" "regexp" "runtime" + "slices" + "strconv" "strings" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - - "github.com/eapache/queue/v2" - "github.com/hashicorp/go-secure-stdlib/parseutil" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" ) var ( @@ -27,48 +27,78 @@ var ( // internalPackagesPrefixes is the list of prefixes for internal packages that should be hidden in the stack trace internalSymbolPrefixes = []string{ + "github.com/DataDog/dd-trace-go/v2", "gopkg.in/DataDog/dd-trace-go.v1", - "github.com/DataDog/dd-trace-go", "github.com/DataDog/go-libddwaf", "github.com/DataDog/datadog-agent", - "github.com/DataDog/appsec-internal-go", "github.com/datadog/orchestrion", "github.com/DataDog/orchestrion", } + + // knownThirdPartyLibraries contains third-party library patterns for stack frame classification. + // This list is automatically generated from contrib/ directory structure at build time, + // with some fallback patterns for libraries not covered by contrib integrations. + knownThirdPartyLibraries = generatedThirdPartyLibraries() + + // thirdPartyTrie provides fast O(m) prefix matching for third-party libraries + // where m is the length of the string being checked, rather than O(n) linear search + // where n is the number of prefixes (765+ libraries). This provides significant + // performance improvements especially for stack trace generation. + thirdPartyTrie *segmentPrefixTrie + + // internalPrefixTrie provides fast prefix matching for internal package prefixes + internalPrefixTrie *segmentPrefixTrie ) +// Redaction-specific frame types for secure logging +type frameType string + const ( - defaultCallerSkip = 4 + defaultCallerSkip = 4 + envStackTraceDepth = "DD_APPSEC_MAX_STACK_TRACE_DEPTH" envStackTraceEnabled = "DD_APPSEC_STACK_TRACE_ENABLE" + + frameTypeDatadog frameType = "datadog" + frameTypeRuntime frameType = "runtime" + frameTypeThirdParty frameType = "third_party" + frameTypeCustomer frameType = "customer" + + redactedPlaceholder = "REDACTED" ) func init() { - if env := os.Getenv(envStackTraceEnabled); env != "" { - if e, err := parseutil.ParseBool(env); err == nil { + if env := env.Get(envStackTraceEnabled); env != "" { + if e, err := strconv.ParseBool(env); err == nil { enabled = e } else { - log.Error("Failed to parse %s env var as boolean: %v (using default value: %v)", envStackTraceEnabled, err, enabled) + log.Error("Failed to parse %s env var as boolean: (using default value: %t) %v", envStackTraceEnabled, enabled, err.Error()) } } - if env := os.Getenv(envStackTraceDepth); env != "" { + if env := env.Get(envStackTraceDepth); env != "" { if !enabled { log.Warn("Ignoring %s because stacktrace generation is disable", envStackTraceDepth) return } - if depth, err := parseutil.SafeParseInt(env); err == nil { + if depth, err := strconv.Atoi(env); err == nil { defaultMaxDepth = depth } else { - if depth <= 0 && err == nil { + if depth <= 0 { err = errors.New("value is not a strictly positive integer") } - log.Error("Failed to parse %s env var as a positive integer: %v (using default value: %v)", envStackTraceDepth, err, defaultMaxDepth) + log.Error("Failed to parse %s env var as a positive integer: (using default value: %d) %v", envStackTraceDepth, defaultMaxDepth, err.Error()) } } defaultTopFrameDepth = defaultMaxDepth / 4 + + thirdPartyTrie = newSegmentPrefixTrie() + thirdPartyTrie.InsertAll(slices.Concat(knownThirdPartyLibraries, []string{"golang.org/"})) + + internalPrefixTrie = newSegmentPrefixTrie() + internalPrefixTrie.InsertAll(internalSymbolPrefixes) } // Enabled returns whether stacktrace should be collected @@ -76,32 +106,84 @@ func Enabled() bool { return enabled } -// StackTrace is intended to be sent over the span tag `_dd.stack`, the first frame is the current frame -type StackTrace []StackFrame +type ( + // StackTrace is intended to be sent over the span tag `_dd.stack`, the first frame is the current frame + StackTrace []StackFrame + + // StackFrame represents a single frame in the stack trace + StackFrame struct { + Text string `msg:"text,omitempty"` // Text version of the stackframe as a string + File string `msg:"file,omitempty"` // File name where the code line is + Namespace string `msg:"namespace,omitempty"` // Namespace is the fully qualified name of the package where the code is + ClassName string `msg:"class_name,omitempty"` // ClassName is the fully qualified name of the class where the line of code is + Function string `msg:"function,omitempty"` // Function is the fully qualified name of the function where the line of code is + Index uint32 `msg:"id"` // Index of the frame (0 = top of the stack) + Line uint32 `msg:"line,omitempty"` // Line number in the context of the file where the code is + Column uint32 `msg:"column,omitempty"` // Column where the code ran is + } + + // RawStackTrace represents captured program counters without symbolication. + // This allows for fast capture with deferred processing - symbolication, + // skipping, and redaction can be performed later when needed. + RawStackTrace struct { + PCs []uintptr `msg:"-"` + } -// StackFrame represents a single frame in the stack trace -type StackFrame struct { - Index uint32 `msg:"id"` // Index of the frame (0 = top of the stack) - Text string `msg:"text,omitempty"` // Text version of the stackframe as a string - File string `msg:"file,omitempty"` // File name where the code line is - Line uint32 `msg:"line,omitempty"` // Line number in the context of the file where the code is - Column uint32 `msg:"column,omitempty"` // Column where the code ran is - Namespace string `msg:"namespace,omitempty"` // Namespace is the fully qualified name of the package where the code is - ClassName string `msg:"class_name,omitempty"` // ClassName is the fully qualified name of the class where the line of code is - Function string `msg:"function,omitempty"` // Function is the fully qualified name of the function where the line of code is + symbol struct { + Package string + Receiver string + Function string + } +) + +// queue is a simple circular buffer for storing the most recent frames. +// It is NOT thread-safe and is intended for single-goroutine use only. +type queue[T any] struct { + data []T + head, tail int + size, cap int +} + +func newQueue[T any](capacity int) *queue[T] { + return &queue[T]{ + data: make([]T, capacity), + cap: capacity, + } } -type symbol struct { - Package string - Receiver string - Function string +func (q *queue[T]) Length() int { + return q.size +} + +func (q *queue[T]) Add(item T) { + if q.size == q.cap { + // Overwrite oldest + q.data[q.tail] = item + q.tail = (q.tail + 1) % q.cap + q.head = q.tail + } else { + q.data[q.head] = item + q.head = (q.head + 1) % q.cap + q.size++ + } +} + +func (q *queue[T]) Remove() T { + if q.size == 0 { + var zero T + return zero + } + item := q.data[q.tail] + q.tail = (q.tail + 1) % q.cap + q.size-- + return item } var symbolRegex = regexp.MustCompile(`^(([^(]+/)?([^(/.]+)?)(\.\(([^/)]+)\))?\.([^/()]+)$`) // parseSymbol parses a symbol name into its package, receiver and function -// ex: gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace.(*Event).NewException -// -> package: gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace +// ex: github.com/DataDog/dd-trace-go/v2/internal/stacktrace.(*Event).NewException +// -> package: github.com/DataDog/dd-trace-go/v2/internal/stacktrace // -> receiver: *Event // -> function: NewException func parseSymbol(name string) symbol { @@ -129,14 +211,71 @@ func Capture() StackTrace { // SkipAndCapture creates a new stack trace from the current call stack, skipping the first `skip` frames func SkipAndCapture(skip int) StackTrace { - return skipAndCapture(skip, defaultMaxDepth, internalSymbolPrefixes) + return iterator(skip, defaultMaxDepth, frameOptions{ + skipInternalFrames: true, + redactCustomerFrames: false, + internalPackagePrefixes: internalSymbolPrefixes, + }).capture() } -func skipAndCapture(skip int, maxDepth int, symbolSkip []string) StackTrace { - iter := iterator(skip, maxDepth, symbolSkip) - stack := make([]StackFrame, defaultMaxDepth) +// CaptureRaw captures only program counters without symbolication. +// This is significantly faster than full capture as it avoids runtime.CallersFrames +// and symbol parsing. The skip parameter determines how many frames to skip from +// the top of the stack (similar to runtime.Callers). +func CaptureRaw(skip int) RawStackTrace { + pcs := make([]uintptr, defaultMaxDepth) + n := runtime.Callers(skip, pcs) + return RawStackTrace{ + PCs: pcs[:n], + } +} + +// CaptureWithRedaction creates a stack trace with customer code redaction but keeps internal Datadog frames +// This is designed for telemetry logging where we want to see internal frames for debugging +// but need to redact customer code for security +func CaptureWithRedaction(skip int) StackTrace { + return iterator(skip+1, defaultMaxDepth, frameOptions{ + skipInternalFrames: false, // Keep DD internal frames + redactCustomerFrames: true, // Redact customer code + internalPackagePrefixes: internalSymbolPrefixes, + }).capture() +} + +// Symbolicate converts raw PCs to a full StackTrace with symbolication, +// applying the default skipping and redaction rules (skips internal frames, +// no customer code redaction). +func (r RawStackTrace) Symbolicate() StackTrace { + if len(r.PCs) == 0 { + return nil + } + + return iteratorFromRaw(r.PCs, frameOptions{ + skipInternalFrames: true, + redactCustomerFrames: false, + internalPackagePrefixes: internalSymbolPrefixes, + }).capture() +} + +// SymbolicateWithRedaction converts raw PCs to a StackTrace with +// customer code redaction (for telemetry logging). This keeps internal +// Datadog frames but redacts customer code for security. +func (r RawStackTrace) SymbolicateWithRedaction() StackTrace { + if len(r.PCs) == 0 { + return nil + } + + return iteratorFromRaw(r.PCs, frameOptions{ + skipInternalFrames: false, // Keep DD internal frames + redactCustomerFrames: true, // Redact customer code + internalPackagePrefixes: internalSymbolPrefixes, + }).capture() +} + +// capture extracts frames from an iterator using the same algorithm as capture +func (iter *framesIterator) capture() StackTrace { + stack := make([]StackFrame, iter.cacheSize) nbStoredFrames := 0 - topFramesQueue := queue.New[StackFrame]() + topFramesQueue := newQueue[StackFrame](defaultTopFrameDepth) // We have to make sure we don't store more than maxDepth frames // if there is more than maxDepth frames, we get X frames from the bottom of the stack and Y from the top @@ -165,47 +304,105 @@ func skipAndCapture(skip int, maxDepth int, symbolSkip []string) StackTrace { return stack[:nbStoredFrames] } +// frameOptions configures iterator behavior for frame processing +type frameOptions struct { + internalPackagePrefixes []string // Prefixes for internal packages + skipInternalFrames bool // Whether to skip internal DD frames + redactCustomerFrames bool // Whether to redact customer code frames +} + // framesIterator is an iterator over the frames of a call stack // It skips internal packages and caches the frames to avoid multiple calls to runtime.Callers -// It also skips the first `skip` frames -// It is not thread-safe +// It also skips the first `skip` frames and can redact customer code for secure logging +// +// IMPORTANT: This iterator is NOT thread-safe and should only be used within a single goroutine. +// Each call to Capture/SkipAndCapture/CaptureWithRedaction creates a new iterator instance. type framesIterator struct { - skipPrefixes []string - cache []uintptr - frames *queue.Queue[runtime.Frame] - cacheDepth int - cacheSize int - currDepth int + frames *queue[runtime.Frame] + frameOpts frameOptions + rawPCs []uintptr + cache []uintptr + cacheSize int + cacheDepth int + currDepth int + useRawPCs bool +} + +func iterator(skip, cacheSize int, opts frameOptions) *framesIterator { + return &framesIterator{ + frameOpts: opts, + frames: newQueue[runtime.Frame](cacheSize + 4), + cache: make([]uintptr, cacheSize), + cacheSize: cacheSize, + cacheDepth: skip, + currDepth: 0, + } } -func iterator(skip, cacheSize int, internalPrefixSkip []string) framesIterator { - return framesIterator{ - skipPrefixes: internalPrefixSkip, - cache: make([]uintptr, cacheSize), - frames: queue.New[runtime.Frame](), - cacheDepth: skip, - cacheSize: cacheSize, - currDepth: 0, +// iteratorFromRaw creates an iterator from pre-captured PCs for deferred symbolication +func iteratorFromRaw(pcs []uintptr, opts frameOptions) *framesIterator { + cacheSize := min(len(pcs), defaultMaxDepth) + + return &framesIterator{ + frameOpts: opts, + frames: newQueue[runtime.Frame](cacheSize + 4), + cache: make([]uintptr, cacheSize), + cacheSize: cacheSize, + cacheDepth: 0, + useRawPCs: true, + rawPCs: pcs, + currDepth: 0, + } +} + +// prepareNextBatch returns the next batch of program counters to symbolicate. +// Returns nil slice if no more frames are available. +func (it *framesIterator) prepareNextBatch() []uintptr { + if it.useRawPCs { + // Use pre-captured PCs for deferred symbolication. + remaining := len(it.rawPCs) - it.cacheDepth + if remaining == 0 { + return nil + } + + // Process a batch of PCs up to cacheSize. + end := min(it.cacheDepth+it.cacheSize, len(it.rawPCs)) + pcs := it.rawPCs[it.cacheDepth:end] + it.cacheDepth = end + return pcs + } + + // Live mode: call runtime.Callers. + n := runtime.Callers(it.cacheDepth, it.cache) + if n == 0 { + return nil + } + + it.cacheDepth += n + return it.cache[:n] +} + +// symbolicateFrames converts program counters to runtime.Frame objects +// and adds them to the frames queue. +func (it *framesIterator) symbolicateFrames(pcs []uintptr) { + frames := runtime.CallersFrames(pcs) + for { + frame, more := frames.Next() + it.frames.Add(frame) + if !more { + break + } } } // next returns the next runtime.Frame in the call stack, filling the cache if needed func (it *framesIterator) next() (runtime.Frame, bool) { if it.frames.Length() == 0 { - n := runtime.Callers(it.cacheDepth, it.cache) - if n == 0 { + pcs := it.prepareNextBatch() + if pcs == nil { return runtime.Frame{}, false } - - frames := runtime.CallersFrames(it.cache[:n]) - for { - frame, more := frames.Next() - it.frames.Add(frame) - it.cacheDepth++ - if !more { - break - } - } + it.symbolicateFrames(pcs) } it.currDepth++ @@ -224,30 +421,145 @@ func (it *framesIterator) Next() (StackFrame, bool) { continue } - parsedSymbol := parseSymbol(frame.Function) - return StackFrame{ - Index: uint32(it.currDepth - 1), - Text: "", - File: frame.File, - Line: uint32(frame.Line), - Column: 0, // No column given by the runtime - Namespace: parsedSymbol.Package, - ClassName: parsedSymbol.Receiver, - Function: parsedSymbol.Function, - }, true + var ( + parsedSymbol = parseSymbol(frame.Function) + shouldRedact = it.shouldRedactSymbol(parsedSymbol) + stackFrame = StackFrame{ + Index: uint32(it.currDepth - 1), + Text: "", + File: frame.File, + Line: uint32(frame.Line), + Column: 0, // No column given by the runtime + Namespace: parsedSymbol.Package, + ClassName: parsedSymbol.Receiver, + Function: parsedSymbol.Function, + } + ) + if shouldRedact { + stackFrame.Function = redactedPlaceholder + stackFrame.File = redactedPlaceholder + stackFrame.Line = 0 + stackFrame.Namespace = "" + stackFrame.ClassName = "" + } + + return stackFrame, true } } func (it *framesIterator) skipFrame(frame runtime.Frame) bool { - if frame.File == "" { // skip orchestrion generated code + if frame.File == "" { + return true + } + + // Always skip internal stacktrace implementation methods (but not test functions) + funcName := frame.Function + if strings.HasPrefix(funcName, + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.(*framesIterator).") || + strings.Contains(funcName, + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.iterator") { return true } - for _, prefix := range it.skipPrefixes { - if strings.HasPrefix(frame.Function, prefix) { + if it.frameOpts.skipInternalFrames { + if internalPrefixTrie.HasPrefix(frame.Function) { return true } } return false } + +func (it *framesIterator) shouldRedactSymbol(sym symbol) bool { + if !it.frameOpts.redactCustomerFrames { + return false + } + return classifySymbol(sym, it.frameOpts.internalPackagePrefixes) == frameTypeCustomer +} + +func classifySymbol(sym symbol, internalPrefixes []string) frameType { + pkg := sym.Package + + for _, prefix := range internalPrefixes { + if strings.HasPrefix(pkg, prefix) { + return frameTypeDatadog + } + } + + if isStandardLibraryPackage(pkg) { + return frameTypeRuntime + } + + if isKnownThirdPartyLibrary(pkg) { + return frameTypeThirdParty + } + + return frameTypeCustomer +} + +// Format converts a StackTrace to a string representation +func Format(stack StackTrace) string { + if len(stack) == 0 { + return "" + } + + var result []byte + for i, frame := range stack { + if i > 0 { + result = append(result, '\n') + } + + // Use full function name (namespace + class + function) + function := frame.Function + if frame.Namespace != "" { + if frame.ClassName != "" { + function = frame.Namespace + ".(" + frame.ClassName + ")." + frame.Function + } else { + function = frame.Namespace + "." + frame.Function + } + } + + result = append(result, function...) + result = append(result, '\n', '\t') + result = append(result, frame.File...) + result = append(result, ':') + result = append(result, strconv.Itoa(int(frame.Line))...) + } + + return string(result) +} + +// isKnownThirdPartyLibrary checks if a package is a known third-party library +func isKnownThirdPartyLibrary(pkg string) bool { + return thirdPartyTrie.HasPrefix(pkg) +} + +// isStandardLibraryPackage checks if a package is from Go's standard library +func isStandardLibraryPackage(pkg string) bool { + // Handle test packages (e.g., "strconv.test", "net/http.test") + // When running `go test strconv`, Go creates a test binary with package name "strconv.test" + // Strip the .test suffix if present to check if the remaining part is a stdlib package + pkg = strings.TrimSuffix(pkg, ".test") + + // Special case: main package is user code, not stdlib + if pkg == "main" { + return false + } + + // Standard library detection: no dot in the first path element + // Mirrors go/build's IsStandardImportPath. + // For standard library imports, the first element doesn't contain a dot. + // See: https://github.com/golang/go/blob/861c90c907db1129dcd1540eecd3c66b6309db7a/src/cmd/go/internal/search/search.go#L529 + // Examples: + // "fmt" -> first element "fmt" (no dot) -> standard library + // "net/http" -> first element "net" (no dot) -> standard library + // "github.com/user/pkg" -> first element "github.com" (has dot) -> NOT standard library + slash := strings.IndexByte(pkg, '/') + if slash < 0 { + // single-element path like "fmt", "os", "runtime" + return !strings.Contains(pkg, ".") + } + // multi-element path like "net/http", "encoding/json", or "github.com/user/pkg" + first := pkg[:slash] + return !strings.Contains(first, ".") +} diff --git a/internal/stacktrace/stacktrace_msgp.go b/internal/stacktrace/stacktrace_msgp.go index d957c31029..0e919abf7b 100644 --- a/internal/stacktrace/stacktrace_msgp.go +++ b/internal/stacktrace/stacktrace_msgp.go @@ -1,13 +1,13 @@ -package stacktrace - // Code generated by github.com/tinylib/msgp DO NOT EDIT. +package stacktrace + import ( "github.com/tinylib/msgp/msgp" ) // DecodeMsg implements msgp.Decodable -func (z *StackFrame) DecodeMsg(dc *msgp.Reader) (err error) { +func (z *RawStackTrace) DecodeMsg(dc *msgp.Reader) (err error) { var field []byte _ = field var zb0001 uint32 @@ -24,12 +24,91 @@ func (z *StackFrame) DecodeMsg(dc *msgp.Reader) (err error) { return } switch msgp.UnsafeString(field) { - case "id": - z.Index, err = dc.ReadUint32() + default: + err = dc.Skip() if err != nil { - err = msgp.WrapError(err, "Index") + err = msgp.WrapError(err) + return + } + } + } + return +} + +// EncodeMsg implements msgp.Encodable +func (z RawStackTrace) EncodeMsg(en *msgp.Writer) (err error) { + // map header, size 0 + _ = z + err = en.Append(0x80) + if err != nil { + return + } + return +} + +// MarshalMsg implements msgp.Marshaler +func (z RawStackTrace) MarshalMsg(b []byte) (o []byte, err error) { + o = msgp.Require(b, z.Msgsize()) + // map header, size 0 + _ = z + o = append(o, 0x80) + return +} + +// UnmarshalMsg implements msgp.Unmarshaler +func (z *RawStackTrace) UnmarshalMsg(bts []byte) (o []byte, err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, bts, err = msgp.ReadMapHeaderBytes(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, bts, err = msgp.ReadMapKeyZC(bts) + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { + default: + bts, err = msgp.Skip(bts) + if err != nil { + err = msgp.WrapError(err) return } + } + } + o = bts + return +} + +// Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message +func (z RawStackTrace) Msgsize() (s int) { + s = 1 + return +} + +// DecodeMsg implements msgp.Decodable +func (z *StackFrame) DecodeMsg(dc *msgp.Reader) (err error) { + var field []byte + _ = field + var zb0001 uint32 + zb0001, err = dc.ReadMapHeader() + if err != nil { + err = msgp.WrapError(err) + return + } + for zb0001 > 0 { + zb0001-- + field, err = dc.ReadMapKeyPtr() + if err != nil { + err = msgp.WrapError(err) + return + } + switch msgp.UnsafeString(field) { case "text": z.Text, err = dc.ReadString() if err != nil { @@ -42,18 +121,6 @@ func (z *StackFrame) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "File") return } - case "line": - z.Line, err = dc.ReadUint32() - if err != nil { - err = msgp.WrapError(err, "Line") - return - } - case "column": - z.Column, err = dc.ReadUint32() - if err != nil { - err = msgp.WrapError(err, "Column") - return - } case "namespace": z.Namespace, err = dc.ReadString() if err != nil { @@ -72,6 +139,24 @@ func (z *StackFrame) DecodeMsg(dc *msgp.Reader) (err error) { err = msgp.WrapError(err, "Function") return } + case "id": + z.Index, err = dc.ReadUint32() + if err != nil { + err = msgp.WrapError(err, "Index") + return + } + case "line": + z.Line, err = dc.ReadUint32() + if err != nil { + err = msgp.WrapError(err, "Line") + return + } + case "column": + z.Column, err = dc.ReadUint32() + if err != nil { + err = msgp.WrapError(err, "Column") + return + } default: err = dc.Skip() if err != nil { @@ -85,35 +170,35 @@ func (z *StackFrame) DecodeMsg(dc *msgp.Reader) (err error) { // EncodeMsg implements msgp.Encodable func (z *StackFrame) EncodeMsg(en *msgp.Writer) (err error) { - // omitempty: check for empty values + // check for omitted fields zb0001Len := uint32(8) var zb0001Mask uint8 /* 8 bits */ _ = zb0001Mask if z.Text == "" { zb0001Len-- - zb0001Mask |= 0x2 + zb0001Mask |= 0x1 } if z.File == "" { + zb0001Len-- + zb0001Mask |= 0x2 + } + if z.Namespace == "" { zb0001Len-- zb0001Mask |= 0x4 } - if z.Line == 0 { + if z.ClassName == "" { zb0001Len-- zb0001Mask |= 0x8 } - if z.Column == 0 { + if z.Function == "" { zb0001Len-- zb0001Mask |= 0x10 } - if z.Namespace == "" { - zb0001Len-- - zb0001Mask |= 0x20 - } - if z.ClassName == "" { + if z.Line == 0 { zb0001Len-- zb0001Mask |= 0x40 } - if z.Function == "" { + if z.Column == 0 { zb0001Len-- zb0001Mask |= 0x80 } @@ -122,101 +207,102 @@ func (z *StackFrame) EncodeMsg(en *msgp.Writer) (err error) { if err != nil { return } - if zb0001Len == 0 { - return - } - // write "id" - err = en.Append(0xa2, 0x69, 0x64) - if err != nil { - return - } - err = en.WriteUint32(z.Index) - if err != nil { - err = msgp.WrapError(err, "Index") - return - } - if (zb0001Mask & 0x2) == 0 { // if not empty - // write "text" - err = en.Append(0xa4, 0x74, 0x65, 0x78, 0x74) - if err != nil { - return - } - err = en.WriteString(z.Text) - if err != nil { - err = msgp.WrapError(err, "Text") - return - } - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // write "file" - err = en.Append(0xa4, 0x66, 0x69, 0x6c, 0x65) - if err != nil { - return - } - err = en.WriteString(z.File) - if err != nil { - err = msgp.WrapError(err, "File") - return - } - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // write "line" - err = en.Append(0xa4, 0x6c, 0x69, 0x6e, 0x65) - if err != nil { - return - } - err = en.WriteUint32(z.Line) - if err != nil { - err = msgp.WrapError(err, "Line") - return + + // skip if no fields are to be emitted + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not omitted + // write "text" + err = en.Append(0xa4, 0x74, 0x65, 0x78, 0x74) + if err != nil { + return + } + err = en.WriteString(z.Text) + if err != nil { + err = msgp.WrapError(err, "Text") + return + } } - } - if (zb0001Mask & 0x10) == 0 { // if not empty - // write "column" - err = en.Append(0xa6, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e) - if err != nil { - return + if (zb0001Mask & 0x2) == 0 { // if not omitted + // write "file" + err = en.Append(0xa4, 0x66, 0x69, 0x6c, 0x65) + if err != nil { + return + } + err = en.WriteString(z.File) + if err != nil { + err = msgp.WrapError(err, "File") + return + } } - err = en.WriteUint32(z.Column) - if err != nil { - err = msgp.WrapError(err, "Column") - return + if (zb0001Mask & 0x4) == 0 { // if not omitted + // write "namespace" + err = en.Append(0xa9, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65) + if err != nil { + return + } + err = en.WriteString(z.Namespace) + if err != nil { + err = msgp.WrapError(err, "Namespace") + return + } } - } - if (zb0001Mask & 0x20) == 0 { // if not empty - // write "namespace" - err = en.Append(0xa9, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65) - if err != nil { - return + if (zb0001Mask & 0x8) == 0 { // if not omitted + // write "class_name" + err = en.Append(0xaa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65) + if err != nil { + return + } + err = en.WriteString(z.ClassName) + if err != nil { + err = msgp.WrapError(err, "ClassName") + return + } } - err = en.WriteString(z.Namespace) - if err != nil { - err = msgp.WrapError(err, "Namespace") - return + if (zb0001Mask & 0x10) == 0 { // if not omitted + // write "function" + err = en.Append(0xa8, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e) + if err != nil { + return + } + err = en.WriteString(z.Function) + if err != nil { + err = msgp.WrapError(err, "Function") + return + } } - } - if (zb0001Mask & 0x40) == 0 { // if not empty - // write "class_name" - err = en.Append(0xaa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65) + // write "id" + err = en.Append(0xa2, 0x69, 0x64) if err != nil { return } - err = en.WriteString(z.ClassName) + err = en.WriteUint32(z.Index) if err != nil { - err = msgp.WrapError(err, "ClassName") + err = msgp.WrapError(err, "Index") return } - } - if (zb0001Mask & 0x80) == 0 { // if not empty - // write "function" - err = en.Append(0xa8, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e) - if err != nil { - return + if (zb0001Mask & 0x40) == 0 { // if not omitted + // write "line" + err = en.Append(0xa4, 0x6c, 0x69, 0x6e, 0x65) + if err != nil { + return + } + err = en.WriteUint32(z.Line) + if err != nil { + err = msgp.WrapError(err, "Line") + return + } } - err = en.WriteString(z.Function) - if err != nil { - err = msgp.WrapError(err, "Function") - return + if (zb0001Mask & 0x80) == 0 { // if not omitted + // write "column" + err = en.Append(0xa6, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e) + if err != nil { + return + } + err = en.WriteUint32(z.Column) + if err != nil { + err = msgp.WrapError(err, "Column") + return + } } } return @@ -225,80 +311,81 @@ func (z *StackFrame) EncodeMsg(en *msgp.Writer) (err error) { // MarshalMsg implements msgp.Marshaler func (z *StackFrame) MarshalMsg(b []byte) (o []byte, err error) { o = msgp.Require(b, z.Msgsize()) - // omitempty: check for empty values + // check for omitted fields zb0001Len := uint32(8) var zb0001Mask uint8 /* 8 bits */ _ = zb0001Mask if z.Text == "" { zb0001Len-- - zb0001Mask |= 0x2 + zb0001Mask |= 0x1 } if z.File == "" { + zb0001Len-- + zb0001Mask |= 0x2 + } + if z.Namespace == "" { zb0001Len-- zb0001Mask |= 0x4 } - if z.Line == 0 { + if z.ClassName == "" { zb0001Len-- zb0001Mask |= 0x8 } - if z.Column == 0 { + if z.Function == "" { zb0001Len-- zb0001Mask |= 0x10 } - if z.Namespace == "" { - zb0001Len-- - zb0001Mask |= 0x20 - } - if z.ClassName == "" { + if z.Line == 0 { zb0001Len-- zb0001Mask |= 0x40 } - if z.Function == "" { + if z.Column == 0 { zb0001Len-- zb0001Mask |= 0x80 } // variable map header, size zb0001Len o = append(o, 0x80|uint8(zb0001Len)) - if zb0001Len == 0 { - return - } - // string "id" - o = append(o, 0xa2, 0x69, 0x64) - o = msgp.AppendUint32(o, z.Index) - if (zb0001Mask & 0x2) == 0 { // if not empty - // string "text" - o = append(o, 0xa4, 0x74, 0x65, 0x78, 0x74) - o = msgp.AppendString(o, z.Text) - } - if (zb0001Mask & 0x4) == 0 { // if not empty - // string "file" - o = append(o, 0xa4, 0x66, 0x69, 0x6c, 0x65) - o = msgp.AppendString(o, z.File) - } - if (zb0001Mask & 0x8) == 0 { // if not empty - // string "line" - o = append(o, 0xa4, 0x6c, 0x69, 0x6e, 0x65) - o = msgp.AppendUint32(o, z.Line) - } - if (zb0001Mask & 0x10) == 0 { // if not empty - // string "column" - o = append(o, 0xa6, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e) - o = msgp.AppendUint32(o, z.Column) - } - if (zb0001Mask & 0x20) == 0 { // if not empty - // string "namespace" - o = append(o, 0xa9, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65) - o = msgp.AppendString(o, z.Namespace) - } - if (zb0001Mask & 0x40) == 0 { // if not empty - // string "class_name" - o = append(o, 0xaa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65) - o = msgp.AppendString(o, z.ClassName) - } - if (zb0001Mask & 0x80) == 0 { // if not empty - // string "function" - o = append(o, 0xa8, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e) - o = msgp.AppendString(o, z.Function) + + // skip if no fields are to be emitted + if zb0001Len != 0 { + if (zb0001Mask & 0x1) == 0 { // if not omitted + // string "text" + o = append(o, 0xa4, 0x74, 0x65, 0x78, 0x74) + o = msgp.AppendString(o, z.Text) + } + if (zb0001Mask & 0x2) == 0 { // if not omitted + // string "file" + o = append(o, 0xa4, 0x66, 0x69, 0x6c, 0x65) + o = msgp.AppendString(o, z.File) + } + if (zb0001Mask & 0x4) == 0 { // if not omitted + // string "namespace" + o = append(o, 0xa9, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65) + o = msgp.AppendString(o, z.Namespace) + } + if (zb0001Mask & 0x8) == 0 { // if not omitted + // string "class_name" + o = append(o, 0xaa, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x6e, 0x61, 0x6d, 0x65) + o = msgp.AppendString(o, z.ClassName) + } + if (zb0001Mask & 0x10) == 0 { // if not omitted + // string "function" + o = append(o, 0xa8, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e) + o = msgp.AppendString(o, z.Function) + } + // string "id" + o = append(o, 0xa2, 0x69, 0x64) + o = msgp.AppendUint32(o, z.Index) + if (zb0001Mask & 0x40) == 0 { // if not omitted + // string "line" + o = append(o, 0xa4, 0x6c, 0x69, 0x6e, 0x65) + o = msgp.AppendUint32(o, z.Line) + } + if (zb0001Mask & 0x80) == 0 { // if not omitted + // string "column" + o = append(o, 0xa6, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e) + o = msgp.AppendUint32(o, z.Column) + } } return } @@ -321,12 +408,6 @@ func (z *StackFrame) UnmarshalMsg(bts []byte) (o []byte, err error) { return } switch msgp.UnsafeString(field) { - case "id": - z.Index, bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Index") - return - } case "text": z.Text, bts, err = msgp.ReadStringBytes(bts) if err != nil { @@ -339,18 +420,6 @@ func (z *StackFrame) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "File") return } - case "line": - z.Line, bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Line") - return - } - case "column": - z.Column, bts, err = msgp.ReadUint32Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Column") - return - } case "namespace": z.Namespace, bts, err = msgp.ReadStringBytes(bts) if err != nil { @@ -369,6 +438,24 @@ func (z *StackFrame) UnmarshalMsg(bts []byte) (o []byte, err error) { err = msgp.WrapError(err, "Function") return } + case "id": + z.Index, bts, err = msgp.ReadUint32Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "Index") + return + } + case "line": + z.Line, bts, err = msgp.ReadUint32Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "Line") + return + } + case "column": + z.Column, bts, err = msgp.ReadUint32Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "Column") + return + } default: bts, err = msgp.Skip(bts) if err != nil { @@ -383,7 +470,7 @@ func (z *StackFrame) UnmarshalMsg(bts []byte) (o []byte, err error) { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *StackFrame) Msgsize() (s int) { - s = 1 + 3 + msgp.Uint32Size + 5 + msgp.StringPrefixSize + len(z.Text) + 5 + msgp.StringPrefixSize + len(z.File) + 5 + msgp.Uint32Size + 7 + msgp.Uint32Size + 10 + msgp.StringPrefixSize + len(z.Namespace) + 11 + msgp.StringPrefixSize + len(z.ClassName) + 9 + msgp.StringPrefixSize + len(z.Function) + s = 1 + 5 + msgp.StringPrefixSize + len(z.Text) + 5 + msgp.StringPrefixSize + len(z.File) + 10 + msgp.StringPrefixSize + len(z.Namespace) + 11 + msgp.StringPrefixSize + len(z.ClassName) + 9 + msgp.StringPrefixSize + len(z.Function) + 3 + msgp.Uint32Size + 5 + msgp.Uint32Size + 7 + msgp.Uint32Size return } diff --git a/internal/stacktrace/stacktrace_test.go b/internal/stacktrace/stacktrace_test.go index 4187fd06cf..b9122d46f9 100644 --- a/internal/stacktrace/stacktrace_test.go +++ b/internal/stacktrace/stacktrace_test.go @@ -8,53 +8,53 @@ package stacktrace import ( "fmt" "runtime" + "strconv" + "strings" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestNewStackTrace(t *testing.T) { - stack := skipAndCapture(defaultCallerSkip, defaultMaxDepth, nil) + stack := CaptureWithRedaction(defaultCallerSkip) if len(stack) == 0 { t.Error("stacktrace should not be empty") } } func TestStackTraceCurrentFrame(t *testing.T) { - // Check last frame for the values of the current function - stack := skipAndCapture(defaultCallerSkip, defaultMaxDepth, nil) - require.GreaterOrEqual(t, len(stack), 3) + stack := CaptureWithRedaction(defaultCallerSkip) + require.Greater(t, len(stack), 0) frame := stack[0] require.EqualValues(t, 0, frame.Index) - require.Contains(t, frame.File, "stacktrace_test.go") - require.Equal(t, "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", frame.Namespace) - require.Equal(t, "", frame.ClassName) - require.Equal(t, "TestStackTraceCurrentFrame", frame.Function) + require.NotEmpty(t, frame.File) + require.NotEmpty(t, frame.Namespace) + require.NotEmpty(t, frame.Function) } type Test struct{} func (t *Test) Method() StackTrace { - return skipAndCapture(defaultCallerSkip, defaultMaxDepth, nil) + return CaptureWithRedaction(defaultCallerSkip) } func TestStackMethodReceiver(t *testing.T) { test := &Test{} stack := test.Method() - require.GreaterOrEqual(t, len(stack), 3) + require.Greater(t, len(stack), 0) frame := stack[0] require.EqualValues(t, 0, frame.Index) - require.Equal(t, "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", frame.Namespace) - require.Equal(t, "*Test", frame.ClassName) - require.Equal(t, "Method", frame.Function) - require.Contains(t, frame.File, "stacktrace_test.go") + require.NotEmpty(t, frame.Namespace) + require.NotEmpty(t, frame.Function) + require.NotEmpty(t, frame.File) } func recursive(i int) StackTrace { if i == 0 { - return skipAndCapture(defaultCallerSkip, defaultMaxDepth, nil) + return CaptureWithRedaction(defaultCallerSkip) } return recursive(i - 1) @@ -63,33 +63,101 @@ func recursive(i int) StackTrace { func TestTruncatedStack(t *testing.T) { stack := recursive(defaultMaxDepth * 2) - require.Equal(t, defaultMaxDepth, len(stack)) + // With internal stacktrace method filtering, we get fewer frames than before + // since recursive() calls are now filtered out as internal plumbing + require.Greater(t, len(stack), 0, "should capture some frames") + require.LessOrEqual(t, len(stack), defaultMaxDepth, "should not exceed max depth") - lambdaFrame := stack[0] - require.EqualValues(t, 0, lambdaFrame.Index) - require.Contains(t, lambdaFrame.File, "stacktrace_test.go") - require.Equal(t, "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", lambdaFrame.Namespace) - require.Equal(t, "", lambdaFrame.ClassName) - require.Equal(t, "recursive", lambdaFrame.Function) + // Verify that all returned frames have valid content + for i, frame := range stack { + require.NotEmpty(t, frame.Function, "frame should have function name") + require.NotEmpty(t, frame.File, "frame should have file path") + require.Greater(t, frame.Line, uint32(0), "frame should have valid line number") + require.NotEmpty(t, frame.Namespace, "frame should have namespace") + // Frame index represents original stack position, not array index after filtering + require.GreaterOrEqual(t, int(frame.Index), i, "frame index should be >= array position") + } + + // The last frame should typically be runtime.goexit (if we have enough frames) + if len(stack) > 1 { + lastFrame := stack[len(stack)-1] + if lastFrame.Function == "goexit" { + require.Equal(t, "runtime", lastFrame.Namespace) + require.Equal(t, "", lastFrame.ClassName) + } + } +} + +func TestCaptureRaw(t *testing.T) { + // Test basic raw capture + rawStack := CaptureRaw(0) // Don't skip any frames + require.Greater(t, len(rawStack.PCs), 0, "should capture at least one frame") + + // Test empty raw stack symbolication + emptyRaw := RawStackTrace{PCs: nil} + stack := emptyRaw.Symbolicate() + require.Nil(t, stack, "empty raw stack should produce nil StackTrace") + + // Test non-empty raw stack symbolication - use SymbolicateWithRedaction + // since regular Symbolicate() skips internal frames and this test is internal + stack = rawStack.SymbolicateWithRedaction() + require.Greater(t, len(stack), 0, "should produce at least one frame") + require.NotEmpty(t, stack[0].Function, "should symbolicate at least one frame") + + // Check that we captured some valid frame (don't require specific function due to skipping) + frame := stack[0] + require.NotEmpty(t, frame.Function, "should have function name") + require.NotEmpty(t, frame.File, "should have file name") + require.NotZero(t, frame.Line, "should have line number") +} + +func TestRawStackSymbolicateWithRedaction(t *testing.T) { + rawStack := CaptureRaw(0) // Don't skip any frames + require.Greater(t, len(rawStack.PCs), 0, "should capture at least one frame") - for i := 1; i < defaultMaxDepth-defaultTopFrameDepth; i++ { - require.EqualValues(t, i, stack[i].Index) - require.Equal(t, "recursive", stack[i].Function) - require.Contains(t, stack[i].File, "stacktrace_test.go") - require.Equal(t, "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", stack[i].Namespace) - require.Equal(t, "", stack[i].ClassName) + // Test symbolication with redaction + stack := rawStack.SymbolicateWithRedaction() + require.Greater(t, len(stack), 0, "should produce at least one frame") + require.NotEmpty(t, stack[0].Function, "should symbolicate at least one frame") + + // Check that we can find the test function in the stack + found := false + for _, frame := range stack { + if frame.Function == "TestRawStackSymbolicateWithRedaction" { + require.Contains(t, frame.File, "stacktrace_test.go") + found = true + break + } } + require.True(t, found, "should find TestRawStackSymbolicateWithRedaction in the stack") +} + +func TestRawStackEquivalence(t *testing.T) { + // Test that raw capture + symbolication produces functionally equivalent results to direct capture + // Note: We can't expect exact equivalence because the approaches use different skip levels internally - // Make sure top frames indexes are at least sum of the bottom frames and the caller skip - // (we don't know how many frames above us there is so we can't check the exact index) - for i := defaultMaxDepth - defaultTopFrameDepth; i < defaultMaxDepth; i++ { - require.GreaterOrEqual(t, int(stack[i].Index), 2*defaultMaxDepth-defaultTopFrameDepth+defaultCallerSkip) + // Raw capture + symbolication with redaction + rawStack := CaptureRaw(0) + symbolicatedStack := rawStack.SymbolicateWithRedaction() + + require.Greater(t, len(symbolicatedStack), 0, "should have at least one frame") + + // Find this test function in the symbolicated stack + found := false + for _, frame := range symbolicatedStack { + if frame.Function == "TestRawStackEquivalence" { + require.Contains(t, frame.File, "stacktrace_test.go") + require.Equal(t, "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", frame.Namespace) + found = true + break + } } + require.True(t, found, "should find TestRawStackEquivalence in the stack") - // Make sure the last frame is runtime.goexit - require.Equal(t, "goexit", stack[defaultMaxDepth-1].Function) - require.Equal(t, "runtime", stack[defaultMaxDepth-1].Namespace) - require.Equal(t, "", stack[defaultMaxDepth-1].ClassName) + // Test that Format works correctly with symbolicated stack + formatted := Format(symbolicatedStack) + require.NotEmpty(t, formatted, "formatted stack should not be empty") + require.Contains(t, formatted, "TestRawStackEquivalence", "formatted stack should contain test function") } func TestParseSymbol(t *testing.T) { @@ -97,23 +165,23 @@ func TestParseSymbol(t *testing.T) { name, symbol string expected symbol }{ - {"method-receiver-pointer", "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace.(*Test).Method", symbol{ - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", + {"method-receiver-pointer", "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.(*Test).Method", symbol{ + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", "*Test", "Method", }}, - {"method-receiver", "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace.(Test).Method", symbol{ - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", + {"method-receiver", "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.(Test).Method", symbol{ + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", "Test", "Method", }}, - {"sample", "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace.TestGetPackageFromSymbol", symbol{ - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", + {"sample", "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.TestGetPackageFromSymbol", symbol{ + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", "", "TestGetPackageFromSymbol", }}, - {"lambda", "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace.TestGetPackageFromSymbol.func1", symbol{ - "gopkg.in/DataDog/dd-trace-go.v1/internal/stacktrace", + {"lambda", "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.TestGetPackageFromSymbol.func1", symbol{ + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", "", "TestGetPackageFromSymbol.func1", }}, @@ -159,24 +227,658 @@ func TestParseSymbol(t *testing.T) { } } +func BenchmarkCaptureStackTrace(b *testing.B) { + for _, depth := range []int{10, 20, 50, 100, 200} { + b.Run(fmt.Sprintf("%v", depth), func(b *testing.B) { + defaultMaxDepth = depth * 2 // Making sure we are capturing the full stack + for n := 0; n < b.N; n++ { + runtime.KeepAlive(recursiveBench(depth, depth, b)) + } + }) + } +} + +func BenchmarkCaptureWithRedaction(b *testing.B) { + for _, depth := range []int{10, 20, 50, 100, 200} { + b.Run(fmt.Sprintf("depth_%d", depth), func(b *testing.B) { + originalMaxDepth := defaultMaxDepth + defaultMaxDepth = depth * 2 // Ensure we capture the full stack + b.Cleanup(func() { defaultMaxDepth = originalMaxDepth }) + + b.ResetTimer() + for n := 0; n < b.N; n++ { + stack := recursiveBenchRedaction(depth, b) + runtime.KeepAlive(stack) + } + }) + } +} + +func BenchmarkStacktraceComparison(b *testing.B) { + const depth = 50 + originalMaxDepth := defaultMaxDepth + defaultMaxDepth = depth * 2 + b.Cleanup(func() { defaultMaxDepth = originalMaxDepth }) + + b.Run("SkipAndCapture", func(b *testing.B) { + b.ResetTimer() + for n := 0; n < b.N; n++ { + stack := recursiveBenchSkip(depth, b) + runtime.KeepAlive(stack) + } + }) + + b.Run("CaptureWithRedaction", func(b *testing.B) { + b.ResetTimer() + for n := 0; n < b.N; n++ { + stack := recursiveBenchRedaction(depth, b) + runtime.KeepAlive(stack) + } + }) +} + func recursiveBench(i int, depth int, b *testing.B) StackTrace { if i == 0 { b.StartTimer() - stack := skipAndCapture(defaultCallerSkip, depth*2, nil) + stack := iterator(defaultCallerSkip, depth*2, frameOptions{ + skipInternalFrames: true, + redactCustomerFrames: false, + internalPackagePrefixes: nil, + }).capture() b.StopTimer() return stack } - return recursiveBench(i-1, depth, b) } -func BenchmarkCaptureStackTrace(b *testing.B) { - for _, depth := range []int{10, 20, 50, 100, 200} { - b.Run(fmt.Sprintf("%v", depth), func(b *testing.B) { - defaultMaxDepth = depth * 2 // Making sure we are capturing the full stack - for n := 0; n < b.N; n++ { - runtime.KeepAlive(recursiveBench(depth, depth, b)) - } +func recursiveBenchRedaction(i int, b *testing.B) StackTrace { + if i == 0 { + return CaptureWithRedaction(defaultCallerSkip) + } + return recursiveBenchRedaction(i-1, b) +} + +func recursiveBenchSkip(i int, b *testing.B) StackTrace { + if i == 0 { + return SkipAndCapture(defaultCallerSkip) + } + return recursiveBenchSkip(i-1, b) +} + +func TestShouldRedactSymbol_DatadogFrames(t *testing.T) { + opts := frameOptions{ + skipInternalFrames: false, + redactCustomerFrames: true, + internalPackagePrefixes: internalSymbolPrefixes, + } + iter := framesIterator{frameOpts: opts} + + tests := []struct { + name string + function string + expected bool + }{ + { + name: "dd-trace-go v2", + function: "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer.StartSpan", + expected: false, // Should NOT redact + }, + { + name: "dd-trace-go v1", + function: "gopkg.in/DataDog/dd-trace-go.v1/ddtrace.StartSpan", + expected: false, // Should NOT redact + }, + { + name: "datadog agent", + function: "github.com/DataDog/datadog-agent/pkg/trace.Process", + expected: false, // Should NOT redact + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + sym := parseSymbol(tt.function) + result := iter.shouldRedactSymbol(sym) + require.Equal(t, tt.expected, result, "Frame %s redaction should be %v", tt.function, tt.expected) + }) + } +} + +func TestClassifyFrameForRedaction_RuntimeFrames(t *testing.T) { + tests := []struct { + name string + function string + expected frameType + }{ + { + name: "fmt package", + function: "fmt.Println", + expected: frameTypeRuntime, + }, + { + name: "runtime package", + function: "runtime.main", + expected: frameTypeRuntime, + }, + { + name: "net/http package", + function: "net/http.(*Server).Serve", + expected: frameTypeRuntime, + }, + { + name: "encoding/json", + function: "encoding/json.Marshal", + expected: frameTypeRuntime, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := classifySymbol(parseSymbol(tt.function), internalSymbolPrefixes) + require.Equal(t, tt.expected, result, "Frame %s should be classified as %s", tt.function, tt.expected) + }) + } +} + +func TestClassifyFrameForRedaction_ThirdPartyFrames(t *testing.T) { + tests := []struct { + name string + function string + expected frameType + }{ + { + name: "gin framework", + function: "github.com/gin-gonic/gin.(*Engine).ServeHTTP", + expected: frameTypeThirdParty, + }, + { + name: "gorilla mux", + function: "github.com/gorilla/mux.(*Router).ServeHTTP", + expected: frameTypeThirdParty, + }, + { + name: "redis client", + function: "github.com/go-redis/redis.(*Client).Process", + expected: frameTypeThirdParty, + }, + { + name: "mongo driver", + function: "go.mongodb.org/mongo-driver/mongo.Connect", + expected: frameTypeThirdParty, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := classifySymbol(parseSymbol(tt.function), internalSymbolPrefixes) + require.Equal(t, tt.expected, result, "Frame %s should be classified as %s", tt.function, tt.expected) + }) + } +} + +func TestClassifyFrameForRedaction_CustomerFrames(t *testing.T) { + tests := []struct { + name string + function string + expected frameType + }{ + { + name: "main package", + function: "main.main", + expected: frameTypeCustomer, + }, + { + name: "customer github repo", + function: "github.com/customer/myapp/pkg.Function", + expected: frameTypeCustomer, + }, + { + name: "unknown third party", + function: "example.com/unknownpkg.Function", + expected: frameTypeCustomer, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := classifySymbol(parseSymbol(tt.function), internalSymbolPrefixes) + require.Equal(t, tt.expected, result, "Frame %s should be classified as %s", tt.function, tt.expected) + }) + } +} + +func TestIsStandardLibraryPackage(t *testing.T) { + tests := []struct { + name string + pkg string + expected bool + }{ + // Standard library - single element packages + {"fmt package", "fmt", true}, + {"os package", "os", true}, + {"runtime package", "runtime", true}, + + // Standard library - multi-element packages + {"net/http package", "net/http", true}, + {"encoding/json", "encoding/json", true}, + {"crypto/tls", "crypto/tls", true}, + + // Standard library - special cases + {"go tools", "go/ast", true}, + {"cmd tools", "cmd/link/internal/ld", true}, + + // Standard library test packages + {"strconv.test", "strconv.test", true}, + {"net/http.test", "net/http.test", true}, + {"encoding/json.test", "encoding/json.test", true}, + {"go/ast.test", "go/ast.test", true}, + + // Non-standard library + {"main package", "main", false}, + {"main.test", "main.test", false}, + {"third-party github", "github.com/user/repo", false}, + {"third-party github test", "github.com/user/repo.test", false}, + {"third-party gopkg.in", "gopkg.in/yaml.v3", false}, + {"third-party gopkg.in test", "gopkg.in/yaml.v3.test", false}, + {"datadog repo", "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", false}, + {"datadog repo test", "github.com/DataDog/dd-trace-go/v2/internal/stacktrace.test", false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := isStandardLibraryPackage(tt.pkg) + require.Equal(t, tt.expected, result, "isStandardLibraryPackage(%q) = %v, want %v", tt.pkg, result, tt.expected) }) } } + +func TestUnwindRedactedStackFromPC_CustomerCodeRedaction(t *testing.T) { + // This test is tricky because we need to simulate customer code + // We'll check that the redaction mechanism works by looking at the output format + + var pcs [1]uintptr + n := runtime.Callers(1, pcs[:]) + require.Greater(t, n, 0, "Should capture at least one PC") + + stack := CaptureWithRedaction(1) + result := Format(stack) + require.NotEmpty(t, result, "Should return non-empty string") + + // The result should be formatted as "function\n\tfile:line" + lines := strings.Split(result, "\n") + require.GreaterOrEqual(t, len(lines), 2, "Should have at least function and file:line") + + // Check that we have the expected format + for i := 0; i < len(lines); i += 2 { + if i+1 < len(lines) { + // Function line + require.NotEmpty(t, lines[i], "Function line should not be empty") + // File:line should start with tab + require.True(t, strings.HasPrefix(lines[i+1], "\t"), "File:line should start with tab") + } + } +} + +func TestUnwindRedactedStackFromPC_RedactionPlaceholders(t *testing.T) { + require.Equal(t, frameType("datadog"), frameTypeDatadog) + require.Equal(t, frameType("runtime"), frameTypeRuntime) + require.Equal(t, frameType("third_party"), frameTypeThirdParty) + require.Equal(t, frameType("customer"), frameTypeCustomer) +} + +// Tests for new parametric functionality + +func TestCaptureWithOptions(t *testing.T) { + var pcs [1]uintptr + n := runtime.Callers(1, pcs[:]) + require.Greater(t, n, 0, "Should capture at least one PC") + + t.Run("default options", func(t *testing.T) { + stack := CaptureWithRedaction(1) + require.NotEmpty(t, stack, "Should return non-empty stack") + + // Default should include redaction + formatted := Format(stack) + require.Contains(t, formatted, "TestCaptureWithOptions", "Should include test function") + }) + + t.Run("with redaction disabled", func(t *testing.T) { + stack := SkipAndCapture(1) // Use SkipAndCapture without redaction + require.NotEmpty(t, stack, "Should return non-empty stack") + + // Without redaction, all frames should have their original info + for _, frame := range stack { + require.NotEqual(t, redactedPlaceholder, frame.Function, "Function should not be redacted") + require.NotEqual(t, redactedPlaceholder, frame.File, "File should not be redacted") + } + }) + + t.Run("with custom max depth", func(t *testing.T) { + maxDepth := 5 + stack := SkipAndCapture(1) // Note: max depth test simplified + t.Logf("Requested maxDepth: %d, got stack length: %d", maxDepth, len(stack)) + for i, frame := range stack { + t.Logf("Frame %d: %s.%s at %s:%d", i, frame.Namespace, frame.Function, frame.File, frame.Line) + } + require.LessOrEqual(t, len(stack), maxDepth, "Stack should respect max depth limit") + }) + + t.Run("with skip frames", func(t *testing.T) { + skipFrames := 2 + stackNoSkip := SkipAndCapture(1) + stackWithSkip := SkipAndCapture(1 + skipFrames) + + require.NotEmpty(t, stackNoSkip, "Base stack should not be empty") + require.NotEmpty(t, stackWithSkip, "Stack with skip should not be empty") + // With skip frames, we should have fewer frames + require.LessOrEqual(t, len(stackWithSkip), len(stackNoSkip), "Skipped stack should have same or fewer frames") + }) + + t.Run("with internal frames disabled", func(t *testing.T) { + stack := SkipAndCapture(1) // Note: internal frames test simplified + require.NotEmpty(t, stack, "Should return non-empty stack") + + // Check that no internal DD frames are present + for _, frame := range stack { + fullFunc := frame.Namespace + "." + frame.Function + for _, prefix := range internalSymbolPrefixes { + require.False(t, strings.Contains(fullFunc, prefix), + "Should not contain internal frame: %s", fullFunc) + } + } + }) +} + +func TestFormat(t *testing.T) { + t.Run("empty stack", func(t *testing.T) { + result := Format(nil) + require.Empty(t, result, "Empty stack should return empty string") + }) + + t.Run("single frame", func(t *testing.T) { + stack := StackTrace{ + { + Function: "TestFunction", + File: "/path/to/file.go", + Line: 42, + Namespace: "github.com/example/pkg", + ClassName: "", + }, + } + + result := Format(stack) + expected := "github.com/example/pkg.TestFunction\n\t/path/to/file.go:42" + require.Equal(t, expected, result) + }) + + t.Run("frame with class", func(t *testing.T) { + stack := StackTrace{ + { + Function: "Method", + File: "/path/to/file.go", + Line: 100, + Namespace: "github.com/example/pkg", + ClassName: "*MyStruct", + }, + } + + result := Format(stack) + expected := "github.com/example/pkg.(*MyStruct).Method\n\t/path/to/file.go:100" + require.Equal(t, expected, result) + }) + + t.Run("redacted frame", func(t *testing.T) { + stack := StackTrace{ + { + Function: redactedPlaceholder, + File: redactedPlaceholder, + Line: 0, + Namespace: "", + ClassName: "", + }, + } + + result := Format(stack) + expected := fmt.Sprintf("%s\n\t%s:0", redactedPlaceholder, redactedPlaceholder) + require.Equal(t, expected, result) + }) +} + +// Capture both stack traces from the exact same line to ensure identical line numbers. +func stackTrace() ([]uintptr, int, RawStackTrace) { + pcs := make([]uintptr, 10) + return pcs, runtime.Callers(1, pcs), CaptureRaw(2) +} + +// TestFormatMatchesRuntime ensures Format() output matches Go's standard runtime.CallersFrames format +func TestFormatMatchesRuntime(t *testing.T) { + // Capture both stack traces from the exact same line to ensure identical line numbers. + pcs, n, rawStack := stackTrace() + require.Greater(t, n, 0, "Should capture frames") + require.Greater(t, len(rawStack.PCs), 0, "Should capture frames") + + // Copied from span.go#takeStacktrace + var builder strings.Builder + frames := runtime.CallersFrames(pcs[:n]) + for i := 0; ; i++ { + frame, more := frames.Next() + if i != 0 { + builder.WriteByte('\n') + } + builder.WriteString(frame.Function) + builder.WriteByte('\n') + builder.WriteByte('\t') + builder.WriteString(frame.File) + builder.WriteByte(':') + builder.WriteString(strconv.Itoa(frame.Line)) + if !more { + break + } + } + standardFormat := builder.String() + + // Create our format using raw capture with no filtering + opts := frameOptions{ + skipInternalFrames: false, // Don't skip any frames + redactCustomerFrames: false, // Don't redact anything + internalPackagePrefixes: internalSymbolPrefixes, + } + iterator := iteratorFromRaw(rawStack.PCs, opts) + stack := iterator.capture() + require.NotEmpty(t, stack, "Should capture stack frames") + ourFormat := Format(stack) + + // Both should not be empty + require.NotEmpty(t, standardFormat, "Standard format should not be empty") + require.NotEmpty(t, ourFormat, "Our format should not be empty") + + // Compare the formats - they should be identical since captured from same line + require.Equal(t, standardFormat, ourFormat, + "Format() output should match standard Go runtime format.\n\nStandard format:\n%s\n\nOur format:\n%s", + standardFormat, ourFormat) + + // Verify both contain expected elements (sanity checks) + require.Contains(t, standardFormat, "TestFormatMatchesRuntime", "Standard format should contain test function name") + require.Contains(t, ourFormat, "TestFormatMatchesRuntime", "Our format should contain test function name") + require.Contains(t, standardFormat, ".go:", "Standard format should contain file extension and line separator") + require.Contains(t, ourFormat, ".go:", "Our format should contain file extension and line separator") +} + +// TestStackTraceCapture provides regression testing for stacktrace capture behavior +func TestStackTraceCapture(t *testing.T) { + t.Run("SkipAndCapture basic functionality", func(t *testing.T) { + stack := SkipAndCapture(1) // Skip this function + require.NotEmpty(t, stack, "Should capture stack frames") + + // Verify frame structure + for i, frame := range stack { + assert.NotEmpty(t, frame.Function, "Frame should have function name") + assert.NotEmpty(t, frame.File, "Frame should have file path") + assert.Greater(t, frame.Line, uint32(0), "Frame should have valid line number") + // Note: frame.Index reflects original position in full stack, not array index + t.Logf("Frame %d: index=%d, function=%s", i, frame.Index, frame.Function) + } + + formatted := Format(stack) + assert.NotEmpty(t, formatted, "Formatted stack should not be empty") + t.Logf("SkipAndCapture stack (%d frames):\n%s", len(stack), formatted) + }) + + t.Run("CaptureWithRedaction basic functionality", func(t *testing.T) { + stack := CaptureWithRedaction(1) // Skip this function + require.NotEmpty(t, stack, "Should capture stack frames with redaction") + + // Verify frame structure + for i, frame := range stack { + assert.NotEmpty(t, frame.Function, "Frame should have function name") + // File might be redacted for customer code, so don't assert NotEmpty + assert.GreaterOrEqual(t, frame.Line, uint32(0), "Frame should have valid line number") + // Note: frame.Index reflects original position in full stack, not array index + t.Logf("Frame %d: index=%d, function=%s", i, frame.Index, frame.Function) + } + + formatted := Format(stack) + assert.NotEmpty(t, formatted, "Formatted stack should not be empty") + + assert.NotContains(t, formatted, redactedPlaceholder, "Internal code should not be redacted") + + t.Logf("CaptureWithRedaction stack (%d frames):\n%s", len(stack), formatted) + }) + + t.Run("frame filtering comparison", func(t *testing.T) { + skipStack := SkipAndCapture(1) // Filters internal frames + redactionStack := CaptureWithRedaction(1) // Keeps internal frames + + require.NotEmpty(t, skipStack, "SkipAndCapture should return frames") + require.NotEmpty(t, redactionStack, "CaptureWithRedaction should return frames") + + // CaptureWithRedaction should have same or more frames since it keeps internal frames + assert.GreaterOrEqual(t, len(redactionStack), len(skipStack), + "CaptureWithRedaction should have >= frames than SkipAndCapture") + + t.Logf("Frame count comparison - SkipAndCapture: %d, CaptureWithRedaction: %d", + len(skipStack), len(redactionStack)) + }) + + t.Run("skip parameter progression", func(t *testing.T) { + // Test that increasing skip values result in appropriate frame reduction + stack0 := CaptureWithRedaction(0) + stack1 := CaptureWithRedaction(1) + stack2 := CaptureWithRedaction(2) + + // Progressive skipping should reduce or maintain frame count + assert.GreaterOrEqual(t, len(stack0), len(stack1), "skip=0 should have >= frames than skip=1") + assert.GreaterOrEqual(t, len(stack1), len(stack2), "skip=1 should have >= frames than skip=2") + + t.Logf("Skip progression - skip=0: %d frames, skip=1: %d frames, skip=2: %d frames", + len(stack0), len(stack1), len(stack2)) + }) +} + +// TestStackTraceRealCapture tests actual stack trace capture with explicit frame verification +func TestStackTraceRealCapture(t *testing.T) { + // Create a controlled call stack for precise testing + captureAtLevel3 := func() StackTrace { + // This function captures the stack - should appear in CaptureWithRedaction + return CaptureWithRedaction(0) // Don't skip any frames + } + + callLevel2 := func() StackTrace { + // This function calls the capture function + return captureAtLevel3() + } + + callLevel1 := func() StackTrace { + // Top level function in our controlled stack + return callLevel2() + } + + t.Run("verify explicit frame content with CaptureWithRedaction", func(t *testing.T) { + stack := callLevel1() + require.NotEmpty(t, stack, "Should capture frames") + + formatted := Format(stack) + t.Logf("Full captured stack trace (%d frames):\n%s", len(stack), formatted) + + // Verify we have the expected frames with explicit content checks + require.GreaterOrEqual(t, len(stack), 3, "Should have at least 3 frames") + + // Check that our test functions appear in the stack (Go names them as func1, func2, etc.) + assert.Contains(t, formatted, "TestStackTraceRealCapture.func1", "Stack should contain captureAtLevel3 (func1)") + assert.Contains(t, formatted, "TestStackTraceRealCapture.func2", "Stack should contain callLevel2 (func2)") + assert.Contains(t, formatted, "TestStackTraceRealCapture.func3", "Stack should contain callLevel1 (func3)") + + // Verify individual frames have proper structure + for i, frame := range stack { + t.Logf("Frame %d: %s.%s at %s:%d (index=%d)", + i, frame.Namespace, frame.Function, frame.File, frame.Line, frame.Index) + + // Each frame should have valid content + assert.NotEmpty(t, frame.Function, "Frame %d should have function name", i) + assert.NotEmpty(t, frame.File, "Frame %d should have file path", i) + assert.Greater(t, frame.Line, uint32(0), "Frame %d should have valid line number", i) + assert.NotEmpty(t, frame.Namespace, "Frame %d should have namespace", i) + } + + // Check that internal frames are preserved (not redacted) + hasInternalFrames := false + for _, frame := range stack { + if strings.Contains(frame.Namespace, "github.com/DataDog/dd-trace-go/v2/internal/stacktrace") { + hasInternalFrames = true + assert.NotEqual(t, redactedPlaceholder, frame.Function, "Internal frames should not be redacted") + assert.NotEqual(t, redactedPlaceholder, frame.File, "Internal frame files should not be redacted") + break + } + } + assert.True(t, hasInternalFrames, "Should include internal Datadog frames") + }) + + t.Run("compare SkipAndCapture vs CaptureWithRedaction explicit content", func(t *testing.T) { + skipStack := SkipAndCapture(0) // Filters internal frames + redactionStack := CaptureWithRedaction(0) // Keeps internal frames + + skipFormatted := Format(skipStack) + redactionFormatted := Format(redactionStack) + + t.Logf("SkipAndCapture result (%d frames):\n%s", len(skipStack), skipFormatted) + t.Logf("CaptureWithRedaction result (%d frames):\n%s", len(redactionStack), redactionFormatted) + + // SkipAndCapture should filter out internal DD frames + assert.NotContains(t, skipFormatted, "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", + "SkipAndCapture should filter out internal frames") + + // CaptureWithRedaction should keep internal DD frames + assert.Contains(t, redactionFormatted, "github.com/DataDog/dd-trace-go/v2/internal/stacktrace", + "CaptureWithRedaction should keep internal frames") + + // CaptureWithRedaction should have more detailed stack + assert.Greater(t, len(redactionStack), len(skipStack), + "CaptureWithRedaction should have more frames than SkipAndCapture") + }) + + t.Run("verify telemetry integration stack trace", func(t *testing.T) { + // Test the actual usage pattern from telemetry backend + telemetryStack := func() StackTrace { + // Simulate the call from telemetry backend + return CaptureWithRedaction(4) // Skip: CaptureWithRedaction, capture, loggerBackend.add, loggerBackend.Add + } + + stack := telemetryStack() + formatted := Format(stack) + + t.Logf("Telemetry pattern stack trace (%d frames):\n%s", len(stack), formatted) + + // Should not contain our telemetryStack function (skipped by skip=4) + assert.NotContains(t, formatted, "telemetryStack", "Should skip telemetryStack function") + + // Should contain the test function that called it + assert.Contains(t, formatted, "TestStackTraceRealCapture", "Should contain calling test function") + + // Verify all frames have proper structure + for i, frame := range stack { + assert.NotEmpty(t, frame.Function, "Frame %d function should not be empty", i) + assert.NotEmpty(t, frame.File, "Frame %d file should not be empty", i) + assert.Greater(t, frame.Line, uint32(0), "Frame %d line should be > 0", i) + } + }) +} diff --git a/internal/stacktrace/trie.go b/internal/stacktrace/trie.go new file mode 100644 index 0000000000..6fda07f6ad --- /dev/null +++ b/internal/stacktrace/trie.go @@ -0,0 +1,300 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +import ( + "sync" +) + +// prefixTrie is a thread-safe trie data structure optimized for prefix matching. +// It's designed for high-performance concurrent read operations with occasional writes. +// +// Memory vs Performance Trade-offs: +// - Slightly higher initial memory overhead for data structure vs slice +// - Zero allocations during lookups (same as slice) +// - O(m) lookup time where m=string length (vs O(n) where n=prefix count) +// - Performance varies: slower for early matches, much faster for no-match scenarios +type prefixTrie struct { + root *trieNode + mu sync.RWMutex +} + +// trieNode represents a single node in the trie +type trieNode struct { + children map[rune]*trieNode + isEnd bool // true if this node represents the end of a prefix +} + +// newPrefixTrie creates a new empty PrefixTrie +func newPrefixTrie() *prefixTrie { + return &prefixTrie{ + root: &trieNode{ + children: make(map[rune]*trieNode), + }, + } +} + +// Insert adds a prefix to the trie +func (t *prefixTrie) Insert(prefix string) { + if prefix == "" { + return + } + + t.mu.Lock() + defer t.mu.Unlock() + + node := t.root + for _, ch := range prefix { + if node.children[ch] == nil { + node.children[ch] = &trieNode{ + children: make(map[rune]*trieNode), + } + } + node = node.children[ch] + } + node.isEnd = true +} + +// HasPrefix checks if the given string has any of the prefixes stored in the trie. +// Returns true if any prefix in the trie is a prefix of the input string. +func (t *prefixTrie) HasPrefix(s string) (found bool) { + if s == "" { + return false + } + + t.mu.RLock() + defer t.mu.RUnlock() + + node := t.root + for _, ch := range s { + if node.isEnd { + return true + } + + node = node.children[ch] + if node == nil { + return false + } + } + + return node.isEnd +} + +// InsertAll adds multiple prefixes to the trie in a single operation +func (t *prefixTrie) InsertAll(prefixes []string) { + t.mu.Lock() + defer t.mu.Unlock() + + for _, prefix := range prefixes { + if prefix == "" { + continue + } + + node := t.root + for _, ch := range prefix { + if node.children[ch] == nil { + node.children[ch] = &trieNode{ + children: make(map[rune]*trieNode), + } + } + node = node.children[ch] + } + node.isEnd = true + } +} + +// Size returns the number of prefixes stored in the trie +func (t *prefixTrie) Size() int { + t.mu.RLock() + defer t.mu.RUnlock() + + return t.countPrefixes(t.root) +} + +// countPrefixes recursively counts the number of complete prefixes in the trie +func (t *prefixTrie) countPrefixes(node *trieNode) int { + if node == nil { + return 0 + } + + count := 0 + if node.isEnd { + count = 1 + } + + for _, child := range node.children { + count += t.countPrefixes(child) + } + + return count +} + +// Clear removes all prefixes from the trie +func (t *prefixTrie) Clear() { + t.mu.Lock() + defer t.mu.Unlock() + + t.root = &trieNode{ + children: make(map[rune]*trieNode), + } +} + +// segmentPrefixTrie is a path segment-based trie optimized for "/" delimited paths. +// It stores path segments (e.g., "github.com", "DataDog") as nodes instead of individual characters, +// providing better memory efficiency and potentially faster lookups for module paths. +type segmentPrefixTrie struct { + root *segmentTrieNode + mu sync.RWMutex +} + +// segmentTrieNode represents a single path segment node in the trie +type segmentTrieNode struct { + children map[string]*segmentTrieNode + isEnd bool // true if this node represents the end of a prefix +} + +// newSegmentPrefixTrie creates a new empty segmentPrefixTrie +func newSegmentPrefixTrie() *segmentPrefixTrie { + return &segmentPrefixTrie{ + root: &segmentTrieNode{ + children: make(map[string]*segmentTrieNode), + }, + } +} + +// Insert adds a prefix to the segment trie +func (t *segmentPrefixTrie) Insert(prefix string) { + if prefix == "" { + return + } + + t.mu.Lock() + defer t.mu.Unlock() + + node := t.root + start := 0 + + for i := 0; i <= len(prefix); i++ { + // Check for segment boundary (slash or end of string) + if i == len(prefix) || prefix[i] == '/' { + if i > start { + segment := prefix[start:i] + + if node.children[segment] == nil { + node.children[segment] = &segmentTrieNode{ + children: make(map[string]*segmentTrieNode), + } + } + node = node.children[segment] + } + start = i + 1 + } + } + node.isEnd = true +} + +// HasPrefix checks if the given string has any of the prefixes stored in the segment trie. +func (t *segmentPrefixTrie) HasPrefix(s string) (found bool) { + if s == "" { + return false + } + + t.mu.RLock() + defer t.mu.RUnlock() + + node := t.root + start := 0 + + for i := 0; i <= len(s); i++ { + // Check for segment boundary (slash or end of string) + if i == len(s) || s[i] == '/' { + if i > start { + segment := s[start:i] + + if node.isEnd { + return true + } + + node = node.children[segment] + if node == nil { + return false + } + } + start = i + 1 + } + } + + return node.isEnd +} + +// InsertAll adds multiple prefixes to the segment trie in a single operation +func (t *segmentPrefixTrie) InsertAll(prefixes []string) { + t.mu.Lock() + defer t.mu.Unlock() + + for _, prefix := range prefixes { + if prefix == "" { + continue + } + + node := t.root + start := 0 + + for i := 0; i <= len(prefix); i++ { + // Check for segment boundary (slash or end of string) + if i == len(prefix) || prefix[i] == '/' { + if i > start { + segment := prefix[start:i] + + if node.children[segment] == nil { + node.children[segment] = &segmentTrieNode{ + children: make(map[string]*segmentTrieNode), + } + } + node = node.children[segment] + } + start = i + 1 + } + } + node.isEnd = true + } +} + +// Size returns the number of prefixes stored in the segment trie +func (t *segmentPrefixTrie) Size() int { + t.mu.RLock() + defer t.mu.RUnlock() + + return t.countSegmentPrefixes(t.root) +} + +// countSegmentPrefixes recursively counts the number of complete prefixes in the segment trie +func (t *segmentPrefixTrie) countSegmentPrefixes(node *segmentTrieNode) int { + if node == nil { + return 0 + } + + count := 0 + if node.isEnd { + count = 1 + } + + for _, child := range node.children { + count += t.countSegmentPrefixes(child) + } + + return count +} + +// Clear removes all prefixes from the segment trie +func (t *segmentPrefixTrie) Clear() { + t.mu.Lock() + defer t.mu.Unlock() + + t.root = &segmentTrieNode{ + children: make(map[string]*segmentTrieNode), + } +} diff --git a/internal/stacktrace/trie_benchmark_test.go b/internal/stacktrace/trie_benchmark_test.go new file mode 100644 index 0000000000..c32ed9b51e --- /dev/null +++ b/internal/stacktrace/trie_benchmark_test.go @@ -0,0 +1,363 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +import ( + "runtime" + "strings" + "testing" +) + +var ( + // Use the actual generated third-party libraries as our test corpus + benchmarkPrefixes = generatedThirdPartyLibraries() + + // Test strings that would be checked against prefixes in real usage + benchmarkTestStrings = []string{ + // Real-world examples that should match + "cloud.google.com/go/storage/internal", + "github.com/aws/aws-sdk-go/service/s3", + "github.com/gorilla/mux/middleware", + "github.com/stretchr/testify/assert", + "go.uber.org/zap/zapcore", + "google.golang.org/grpc/codes", + "gopkg.in/yaml.v2/internal", + "k8s.io/api/core/v1", + "github.com/prometheus/client_golang/prometheus", + "github.com/sirupsen/logrus/hooks", + + // Examples that should NOT match (customer/internal code) + "github.com/mycompany/internal/service", + "example.com/myapp/handler", + "mydomain.com/service/auth", + "company.internal/package", + + // Standard library (should not match) + "fmt", + "net/http", + "context", + "encoding/json", + "os", + "io", + "strings", + "time", + + // Runtime/testing (should not match) + "main.main", + "runtime.main", + "testing.tRunner", + "runtime.goexit", + } +) + +// linearPrefixMatcher implements the original linear search approach +type linearPrefixMatcher struct { + prefixes []string +} + +func newLinearPrefixMatcher(prefixes []string) *linearPrefixMatcher { + return &linearPrefixMatcher{prefixes: prefixes} +} + +func (l *linearPrefixMatcher) HasPrefix(s string) bool { + for _, prefix := range l.prefixes { + if strings.HasPrefix(s, prefix) { + return true + } + } + return false +} + +// Benchmark linear search vs trie for bulk operations + +func BenchmarkLinearSearch_BulkLookups(b *testing.B) { + matcher := newLinearPrefixMatcher(benchmarkPrefixes) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for _, testStr := range benchmarkTestStrings { + _ = matcher.HasPrefix(testStr) + } + } +} + +func BenchmarkTrie_BulkLookups(b *testing.B) { + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for _, testStr := range benchmarkTestStrings { + _ = trie.HasPrefix(testStr) + } + } +} + +func BenchmarkSegmentTrie_BulkLookups(b *testing.B) { + trie := newSegmentPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for _, testStr := range benchmarkTestStrings { + _ = trie.HasPrefix(testStr) + } + } +} + +// Single lookup benchmarks - best case (early match) + +func BenchmarkLinearSearch_SingleLookup_EarlyMatch(b *testing.B) { + matcher := newLinearPrefixMatcher(benchmarkPrefixes) + // First prefix in the generated list should match early + testStr := "cloud.google.com/go/storage/internal" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = matcher.HasPrefix(testStr) + } +} + +func BenchmarkTrie_SingleLookup_EarlyMatch(b *testing.B) { + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "cloud.google.com/go/storage/internal" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = trie.HasPrefix(testStr) + } +} + +func BenchmarkSegmentTrie_SingleLookup_EarlyMatch(b *testing.B) { + trie := newSegmentPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "cloud.google.com/go/storage/internal" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = trie.HasPrefix(testStr) + } +} + +// Single lookup benchmarks - worst case (no match) + +func BenchmarkLinearSearch_SingleLookup_NoMatch(b *testing.B) { + matcher := newLinearPrefixMatcher(benchmarkPrefixes) + // String that won't match any prefix (worst case for linear search) + testStr := "example.com/mycompany/internal/service" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = matcher.HasPrefix(testStr) + } +} + +func BenchmarkTrie_SingleLookup_NoMatch(b *testing.B) { + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "example.com/mycompany/internal/service" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = trie.HasPrefix(testStr) + } +} + +func BenchmarkSegmentTrie_SingleLookup_NoMatch(b *testing.B) { + trie := newSegmentPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "example.com/mycompany/internal/service" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = trie.HasPrefix(testStr) + } +} + +// Construction/initialization benchmarks + +func BenchmarkLinearSearch_Construction(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = newLinearPrefixMatcher(benchmarkPrefixes) + } +} + +func BenchmarkTrie_Construction(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + } +} + +func BenchmarkSegmentTrie_Construction(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + trie := newSegmentPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + } +} + +// Memory allocation benchmarks for lookup operations (should be zero for both) + +func BenchmarkLinearSearch_LookupAllocations(b *testing.B) { + matcher := newLinearPrefixMatcher(benchmarkPrefixes) + testStr := "github.com/test/package/internal" + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + _ = matcher.HasPrefix(testStr) + } +} + +func BenchmarkTrie_LookupAllocations(b *testing.B) { + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "github.com/test/package/internal" + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + _ = trie.HasPrefix(testStr) + } +} + +func BenchmarkSegmentTrie_LookupAllocations(b *testing.B) { + trie := newSegmentPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "github.com/test/package/internal" + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + _ = trie.HasPrefix(testStr) + } +} + +// Concurrent access benchmark + +func BenchmarkTrie_Parallel(b *testing.B) { + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + testStr := "cloud.google.com/go/storage/internal" + b.ResetTimer() + + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + _ = trie.HasPrefix(testStr) + } + }) +} + +// Data structure memory overhead comparison +// This measures the memory cost of the data structure itself, not lookup allocations + +func BenchmarkDataStructureMemoryOverhead(b *testing.B) { + b.Run("LinearSearch_DataStructure", func(b *testing.B) { + var m1, m2 runtime.MemStats + runtime.GC() + runtime.ReadMemStats(&m1) + + matcher := newLinearPrefixMatcher(benchmarkPrefixes) + _ = matcher // prevent optimization + + runtime.GC() + runtime.ReadMemStats(&m2) + b.ReportMetric(float64(m2.Alloc-m1.Alloc), "bytes_overhead") + b.Logf("Linear search data structure overhead: %d bytes for %d prefixes", + m2.Alloc-m1.Alloc, len(benchmarkPrefixes)) + }) + + b.Run("Trie_DataStructure", func(b *testing.B) { + var m1, m2 runtime.MemStats + runtime.GC() + runtime.ReadMemStats(&m1) + + trie := newPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + + runtime.GC() + runtime.ReadMemStats(&m2) + b.ReportMetric(float64(m2.Alloc-m1.Alloc), "bytes_overhead") + b.Logf("Character trie data structure overhead: %d bytes for %d prefixes", + m2.Alloc-m1.Alloc, len(benchmarkPrefixes)) + }) + + b.Run("SegmentTrie_DataStructure", func(b *testing.B) { + var m1, m2 runtime.MemStats + runtime.GC() + runtime.ReadMemStats(&m1) + + trie := newSegmentPrefixTrie() + trie.InsertAll(benchmarkPrefixes) + + runtime.GC() + runtime.ReadMemStats(&m2) + b.ReportMetric(float64(m2.Alloc-m1.Alloc), "bytes_overhead") + b.Logf("Segment trie data structure overhead: %d bytes for %d prefixes", + m2.Alloc-m1.Alloc, len(benchmarkPrefixes)) + }) +} + +// Test correctness - ensure all implementations return the same results +func TestImplementationConsistency(t *testing.T) { + linear := newLinearPrefixMatcher(benchmarkPrefixes) + charTrie := newPrefixTrie() + charTrie.InsertAll(benchmarkPrefixes) + segmentTrie := newSegmentPrefixTrie() + segmentTrie.InsertAll(benchmarkPrefixes) + + for _, testStr := range benchmarkTestStrings { + linearResult := linear.HasPrefix(testStr) + charTrieResult := charTrie.HasPrefix(testStr) + segmentTrieResult := segmentTrie.HasPrefix(testStr) + + if linearResult != charTrieResult { + t.Errorf("Linear vs Character Trie mismatch for %q: linear=%v, charTrie=%v", + testStr, linearResult, charTrieResult) + } + + if linearResult != segmentTrieResult { + t.Errorf("Linear vs Segment Trie mismatch for %q: linear=%v, segmentTrie=%v", + testStr, linearResult, segmentTrieResult) + } + } + + t.Logf("Tested %d prefixes against %d test strings - all implementations consistent", + len(benchmarkPrefixes), len(benchmarkTestStrings)) +} + +// Benchmark the actual current implementation (using the optimized trie) +func BenchmarkCurrentImplementation_isKnownThirdPartyLibrary(b *testing.B) { + b.ResetTimer() + + for i := 0; i < b.N; i++ { + for _, testStr := range benchmarkTestStrings { + _ = isKnownThirdPartyLibrary(testStr) + } + } +} + +func BenchmarkCurrentImplementation_SingleLookup(b *testing.B) { + testStr := "cloud.google.com/go/storage/internal" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = isKnownThirdPartyLibrary(testStr) + } +} + +func BenchmarkCurrentImplementation_SingleLookup_NoMatch(b *testing.B) { + testStr := "example.com/mycompany/internal/service" + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = isKnownThirdPartyLibrary(testStr) + } +} diff --git a/internal/stacktrace/trie_test.go b/internal/stacktrace/trie_test.go new file mode 100644 index 0000000000..8337f645b7 --- /dev/null +++ b/internal/stacktrace/trie_test.go @@ -0,0 +1,465 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +import ( + "sync" + "testing" +) + +func TestPrefixTrie_Basic(t *testing.T) { + trie := newPrefixTrie() + + // Test empty trie + if trie.HasPrefix("test") { + t.Error("Empty trie should not have any prefixes") + } + if trie.Size() != 0 { + t.Errorf("Empty trie size should be 0, got %d", trie.Size()) + } + + // Test single insertion + trie.Insert("github.com") + if !trie.HasPrefix("github.com/user/repo") { + t.Error("Should match prefix") + } + if !trie.HasPrefix("github.com") { + t.Error("Should match exact string") + } + if trie.HasPrefix("github.co") { + t.Error("Should not match partial prefix") + } + if trie.Size() != 1 { + t.Errorf("Expected size 1, got %d", trie.Size()) + } +} + +func TestPrefixTrie_MultiplePrefixes(t *testing.T) { + trie := newPrefixTrie() + prefixes := []string{ + "github.com/DataDog", + "go.uber.org", + "google.golang.org", + "gopkg.in", + } + + for _, prefix := range prefixes { + trie.Insert(prefix) + } + + testCases := []struct { + input string + expected bool + }{ + {"github.com/DataDog/dd-trace-go", true}, + {"github.com/DataDog", true}, + {"go.uber.org/zap", true}, + {"google.golang.org/grpc", true}, + {"gopkg.in/yaml.v2", true}, + {"github.com/other/repo", false}, + {"go.uber", false}, + {"google.golang", false}, + {"unknown.com/package", false}, + {"", false}, + } + + for _, tc := range testCases { + if result := trie.HasPrefix(tc.input); result != tc.expected { + t.Errorf("HasPrefix(%q) = %v, expected %v", tc.input, result, tc.expected) + } + } + + if trie.Size() != len(prefixes) { + t.Errorf("Expected size %d, got %d", len(prefixes), trie.Size()) + } +} + +func TestPrefixTrie_OverlappingPrefixes(t *testing.T) { + trie := newPrefixTrie() + + // Insert overlapping prefixes + trie.Insert("github.com") + trie.Insert("github.com/DataDog") + trie.Insert("github.com/DataDog/dd-trace-go") + + testCases := []struct { + input string + expected bool + }{ + {"github.com/user/repo", true}, // matches "github.com" + {"github.com/DataDog/other", true}, // matches "github.com/DataDog" + {"github.com/DataDog/dd-trace-go/v2", true}, // matches "github.com/DataDog/dd-trace-go" + {"github.com", true}, // exact match + {"github.co", false}, // partial match + } + + for _, tc := range testCases { + if result := trie.HasPrefix(tc.input); result != tc.expected { + t.Errorf("HasPrefix(%q) = %v, expected %v", tc.input, result, tc.expected) + } + } + + if trie.Size() != 3 { + t.Errorf("Expected size 3, got %d", trie.Size()) + } +} + +func TestPrefixTrie_InsertAll(t *testing.T) { + trie := newPrefixTrie() + prefixes := []string{ + "github.com/DataDog", + "go.uber.org", + "google.golang.org", + "gopkg.in", + "", // empty string should be ignored + } + + trie.InsertAll(prefixes) + + // Should have inserted 4 prefixes (empty string ignored) + if trie.Size() != 4 { + t.Errorf("Expected size 4, got %d", trie.Size()) + } + + // Test all prefixes work + if !trie.HasPrefix("github.com/DataDog/dd-trace-go") { + t.Error("Should match github.com/DataDog prefix") + } + if !trie.HasPrefix("go.uber.org/zap") { + t.Error("Should match go.uber.org prefix") + } + if !trie.HasPrefix("google.golang.org/grpc") { + t.Error("Should match google.golang.org prefix") + } + if !trie.HasPrefix("gopkg.in/yaml.v2") { + t.Error("Should match gopkg.in prefix") + } +} + +func TestPrefixTrie_EmptyInputs(t *testing.T) { + trie := newPrefixTrie() + + // Insert empty string should be ignored + trie.Insert("") + if trie.Size() != 0 { + t.Error("Empty string insertion should be ignored") + } + + // HasPrefix with empty string should return false + if trie.HasPrefix("") { + t.Error("Empty string should not match any prefix") + } + + trie.Insert("test") + if trie.HasPrefix("") { + t.Error("Empty string should not match any prefix even when trie has data") + } +} + +func TestPrefixTrie_Clear(t *testing.T) { + trie := newPrefixTrie() + prefixes := []string{"github.com", "go.uber.org", "google.golang.org"} + + trie.InsertAll(prefixes) + if trie.Size() != 3 { + t.Error("Expected 3 prefixes after insertion") + } + + trie.Clear() + if trie.Size() != 0 { + t.Error("Expected 0 prefixes after clear") + } + + if trie.HasPrefix("github.com/user/repo") { + t.Error("Should not match any prefix after clear") + } +} + +func TestPrefixTrie_UnicodeSupport(t *testing.T) { + trie := newPrefixTrie() + + // Test Unicode characters in prefixes + trie.Insert("测试.com") + trie.Insert("例え.jp") + + if !trie.HasPrefix("测试.com/path") { + t.Error("Should match Unicode prefix") + } + if !trie.HasPrefix("例え.jp/パッケージ") { + t.Error("Should match Unicode prefix") + } + if trie.HasPrefix("测试.co") { + t.Error("Should not match partial Unicode prefix") + } +} + +func TestPrefixTrie_Concurrency(t *testing.T) { + trie := newPrefixTrie() + prefixes := make([]string, 100) + for i := range prefixes { + prefixes[i] = "prefix" + string(rune('0'+i%10)) + } + + // Insert all prefixes + trie.InsertAll(prefixes[:10]) // Insert first 10 unique prefixes + + // Run concurrent reads + var wg sync.WaitGroup + numReaders := 10 + readsPerReader := 1000 + + for i := 0; i < numReaders; i++ { + wg.Add(1) + go func(readerID int) { + defer wg.Done() + for j := 0; j < readsPerReader; j++ { + testStr := "prefix" + string(rune('0'+j%10)) + "/test" + if !trie.HasPrefix(testStr) { + t.Errorf("Reader %d: Expected to find prefix for %s", readerID, testStr) + return + } + } + }(i) + } + + wg.Wait() +} + +func TestPrefixTrie_LargePrefixSet(t *testing.T) { + trie := newPrefixTrie() + + // Create a large set of prefixes similar to the real-world case + prefixes := []string{ + "cloud.google.com/go", + "github.com/aws/aws-sdk-go", + "github.com/gorilla/mux", + "github.com/stretchr/testify", + "go.uber.org/zap", + "google.golang.org/grpc", + "gopkg.in/yaml.v2", + "k8s.io/api", + "k8s.io/client-go", + } + + for i := 0; i < 100; i++ { + for _, prefix := range prefixes { + trie.Insert(prefix + string(rune(i))) + } + } + + // Test that lookups still work correctly with many prefixes + if !trie.HasPrefix("cloud.google.com/go" + string(rune(50)) + "/compute") { + t.Error("Should find prefix in large trie") + } + if trie.HasPrefix("unknown.com/package") { + t.Error("Should not find non-existent prefix in large trie") + } + + expectedSize := len(prefixes) * 100 + if trie.Size() != expectedSize { + t.Errorf("Expected size %d, got %d", expectedSize, trie.Size()) + } +} + +func TestPrefixTrie_RealWorldLibraries(t *testing.T) { + trie := newPrefixTrie() + + // Use some real third-party library prefixes from the generated list + realPrefixes := []string{ + "cloud.google.com/go", + "github.com/aws/aws-sdk-go", + "github.com/gorilla/mux", + "github.com/stretchr/testify", + "go.uber.org/zap", + "google.golang.org/grpc", + "gopkg.in/yaml.v2", + "k8s.io/api", + } + + trie.InsertAll(realPrefixes) + + testCases := []struct { + input string + expected bool + }{ + {"cloud.google.com/go/storage", true}, + {"github.com/aws/aws-sdk-go/service/s3", true}, + {"github.com/gorilla/mux", true}, + {"github.com/stretchr/testify/assert", true}, + {"go.uber.org/zap/zapcore", true}, + {"google.golang.org/grpc/codes", true}, + {"gopkg.in/yaml.v2", true}, + {"k8s.io/api/core/v1", true}, + {"github.com/unknown/package", false}, + {"golang.org/x/crypto", false}, + {"fmt", false}, + } + + for _, tc := range testCases { + if result := trie.HasPrefix(tc.input); result != tc.expected { + t.Errorf("HasPrefix(%q) = %v, expected %v", tc.input, result, tc.expected) + } + } +} + +// Test the segment-based trie implementation + +func TestSegmentPrefixTrie_Basic(t *testing.T) { + trie := newSegmentPrefixTrie() + + // Test empty trie + if trie.HasPrefix("test") { + t.Error("Empty trie should not have any prefixes") + } + if trie.Size() != 0 { + t.Errorf("Empty trie size should be 0, got %d", trie.Size()) + } + + // Test single insertion + trie.Insert("github.com") + if !trie.HasPrefix("github.com/user/repo") { + t.Error("Should match prefix") + } + if !trie.HasPrefix("github.com") { + t.Error("Should match exact string") + } + if trie.HasPrefix("github.co") { + t.Error("Should not match partial prefix") + } + if trie.Size() != 1 { + t.Errorf("Expected size 1, got %d", trie.Size()) + } +} + +func TestSegmentPrefixTrie_PathSegments(t *testing.T) { + trie := newSegmentPrefixTrie() + prefixes := []string{ + "github.com/DataDog", + "github.com/gorilla", + "cloud.google.com/go", + "go.uber.org/zap", + } + + for _, prefix := range prefixes { + trie.Insert(prefix) + } + + testCases := []struct { + input string + expected bool + }{ + {"github.com/DataDog/dd-trace-go", true}, + {"github.com/DataDog", true}, + {"github.com/gorilla/mux", true}, + {"cloud.google.com/go/storage", true}, + {"go.uber.org/zap/zapcore", true}, + {"github.com/other/repo", false}, + {"github.com", false}, // partial segment match + {"cloud.google.com", false}, + {"unknown.com/package", false}, + {"", false}, + } + + for _, tc := range testCases { + if result := trie.HasPrefix(tc.input); result != tc.expected { + t.Errorf("HasPrefix(%q) = %v, expected %v", tc.input, result, tc.expected) + } + } + + if trie.Size() != len(prefixes) { + t.Errorf("Expected size %d, got %d", len(prefixes), trie.Size()) + } +} + +func TestSegmentPrefixTrie_RealWorldLibraries(t *testing.T) { + trie := newSegmentPrefixTrie() + + realPrefixes := []string{ + "cloud.google.com/go", + "github.com/aws/aws-sdk-go", + "github.com/gorilla/mux", + "github.com/stretchr/testify", + "go.uber.org/zap", + "google.golang.org/grpc", + "gopkg.in/yaml.v2", + "k8s.io/api", + } + + trie.InsertAll(realPrefixes) + + testCases := []struct { + input string + expected bool + }{ + {"cloud.google.com/go/storage", true}, + {"github.com/aws/aws-sdk-go/service/s3", true}, + {"github.com/gorilla/mux", true}, + {"github.com/stretchr/testify/assert", true}, + {"go.uber.org/zap/zapcore", true}, + {"google.golang.org/grpc/codes", true}, + {"gopkg.in/yaml.v2", true}, + {"k8s.io/api/core/v1", true}, + {"github.com/unknown/package", false}, + {"golang.org/x/crypto", false}, + {"fmt", false}, + } + + for _, tc := range testCases { + if result := trie.HasPrefix(tc.input); result != tc.expected { + t.Errorf("HasPrefix(%q) = %v, expected %v", tc.input, result, tc.expected) + } + } +} + +// Compare segment trie with character trie for consistency +func TestSegmentVsCharacterTrieConsistency(t *testing.T) { + charTrie := newPrefixTrie() + segmentTrie := newSegmentPrefixTrie() + + realPrefixes := []string{ + "cloud.google.com/go", + "github.com/aws/aws-sdk-go", + "github.com/gorilla/mux", + "github.com/stretchr/testify", + "go.uber.org/zap", + "google.golang.org/grpc", + "gopkg.in/yaml.v2", + "k8s.io/api", + } + + charTrie.InsertAll(realPrefixes) + segmentTrie.InsertAll(realPrefixes) + + testStrings := []string{ + "cloud.google.com/go/storage/internal", + "github.com/aws/aws-sdk-go/service/s3", + "github.com/gorilla/mux/middleware", + "github.com/stretchr/testify/assert", + "go.uber.org/zap/zapcore", + "google.golang.org/grpc/codes", + "gopkg.in/yaml.v2/internal", + "k8s.io/api/core/v1", + "github.com/unknown/package", + "golang.org/x/crypto", + "fmt", + "net/http", + "example.com/myapp/handler", + } + + for _, testStr := range testStrings { + charResult := charTrie.HasPrefix(testStr) + segmentResult := segmentTrie.HasPrefix(testStr) + + if charResult != segmentResult { + t.Errorf("Character vs Segment trie mismatch for %q: char=%v, segment=%v", + testStr, charResult, segmentResult) + } + } + + if charTrie.Size() != segmentTrie.Size() { + t.Errorf("Size mismatch: char=%d, segment=%d", charTrie.Size(), segmentTrie.Size()) + } +} diff --git a/internal/statsd.go b/internal/statsd.go index a901759f27..60f3d4431c 100644 --- a/internal/statsd.go +++ b/internal/statsd.go @@ -16,7 +16,10 @@ const DefaultDogstatsdAddr = "localhost:8125" type StatsdClient interface { Incr(name string, tags []string, rate float64) error Count(name string, value int64, tags []string, rate float64) error + CountWithTimestamp(name string, value int64, tags []string, rate float64, timestamp time.Time) error Gauge(name string, value float64, tags []string, rate float64) error + GaugeWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error + DistributionSamples(name string, values []float64, tags []string, rate float64) error Timing(name string, value time.Duration, tags []string, rate float64) error Flush() error Close() error @@ -27,9 +30,9 @@ func NewStatsdClient(addr string, globalTags []string) (StatsdClient, error) { if addr == "" { addr = DefaultDogstatsdAddr } - client, err := statsd.New(addr, statsd.WithMaxMessagesPerPayload(40), statsd.WithTags(globalTags)) + client, err := statsd.NewDirect(addr, statsd.WithMaxMessagesPerPayload(40), statsd.WithTags(globalTags)) if err != nil { - return &statsd.NoOpClient{}, err + return &statsd.NoOpClientDirect{}, err } return client, nil } diff --git a/internal/statsdtest/statsdtest.go b/internal/statsdtest/statsdtest.go index b48e3b753a..0a2eb6f53c 100644 --- a/internal/statsdtest/statsdtest.go +++ b/internal/statsdtest/statsdtest.go @@ -3,13 +3,15 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -package statsdtest // import "gopkg.in/DataDog/dd-trace-go.v1/internal/statsdtest" +package statsdtest // import "github.com/DataDog/dd-trace-go/v2/internal/statsdtest" import ( "fmt" + "slices" "sync" "time" + "github.com/DataDog/dd-trace-go/v2/internal" "github.com/stretchr/testify/assert" ) @@ -17,11 +19,15 @@ type callType int64 const ( callTypeGauge callType = iota + callTypeGaugeWithTimestamp callTypeIncr callTypeCount + callTypeCountWithTimestamp callTypeTiming ) +var _ internal.StatsdClient = &TestStatsdClient{} + type TestStatsdClient struct { mu sync.RWMutex gaugeCalls []TestStatsdCall @@ -44,6 +50,18 @@ type TestStatsdCall struct { rate float64 } +func (t TestStatsdCall) Name() string { + return t.name +} + +func (t TestStatsdCall) Tags() []string { + return t.tags +} + +func (t TestStatsdCall) IntVal() int64 { + return t.intVal +} + func (tg *TestStatsdClient) addCount(name string, value int64) { tg.mu.Lock() defer tg.mu.Unlock() @@ -62,6 +80,16 @@ func (tg *TestStatsdClient) Gauge(name string, value float64, tags []string, rat }) } +func (tg *TestStatsdClient) GaugeWithTimestamp(name string, value float64, tags []string, rate float64, _ time.Time) error { + // TODO: handle timestamp argument + return tg.addMetric(callTypeGaugeWithTimestamp, tags, TestStatsdCall{ + name: name, + floatVal: value, + tags: make([]string, len(tags)), + rate: rate, + }) +} + func (tg *TestStatsdClient) Incr(name string, tags []string, rate float64) error { tg.addCount(name, 1) return tg.addMetric(callTypeIncr, tags, TestStatsdCall{ @@ -81,6 +109,21 @@ func (tg *TestStatsdClient) Count(name string, value int64, tags []string, rate }) } +func (tg *TestStatsdClient) CountWithTimestamp(name string, value int64, tags []string, rate float64, _ time.Time) error { + // TODO: handle timestamp argument + tg.addCount(name, value) + return tg.addMetric(callTypeCountWithTimestamp, tags, TestStatsdCall{ + name: name, + intVal: value, + tags: make([]string, len(tags)), + rate: rate, + }) +} + +func (tg *TestStatsdClient) DistributionSamples(_ string, _ []float64, _ []string, _ float64) error { + panic("not implemented") +} + func (tg *TestStatsdClient) Timing(name string, value time.Duration, tags []string, rate float64) error { return tg.addMetric(callTypeTiming, tags, TestStatsdCall{ name: name, @@ -191,6 +234,57 @@ func (tg *TestStatsdClient) CallsByName() map[string]int { return counts } +// GetCallsByName returns a slice of TestStatsdCalls with the provided name on the TestStatsdClient +// It's useful if you want to use any TestStatsdCall method calls on the result(s) +func (tg *TestStatsdClient) GetCallsByName(name string) (calls []TestStatsdCall) { + tg.mu.RLock() + defer tg.mu.RUnlock() + for _, c := range tg.gaugeCalls { + if c.Name() == name { + calls = append(calls, c) + } + } + for _, c := range tg.incrCalls { + if c.Name() == name { + calls = append(calls, c) + } + } + for _, c := range tg.countCalls { + if c.Name() == name { + calls = append(calls, c) + } + } + for _, c := range tg.timingCalls { + if c.Name() == name { + calls = append(calls, c) + } + } + return calls +} + +// FilterCallsByName returns a slice of TestStatsdCalls with the provided name, from the list of provided TestStatsdCalls +func FilterCallsByName(calls []TestStatsdCall, name string) []TestStatsdCall { + var matches []TestStatsdCall + for _, c := range calls { + if c.name == name { + matches = append(matches, c) + } + } + return matches +} + +func (tg *TestStatsdClient) CountCallsByTag(calls []TestStatsdCall, tag string) int64 { + tg.mu.RLock() + defer tg.mu.RUnlock() + var count int64 + for _, c := range calls { + if slices.Equal(c.tags, []string{tag}) { + count += c.intVal + } + } + return count +} + func (tg *TestStatsdClient) Counts() map[string]int64 { tg.mu.RLock() defer tg.mu.RUnlock() diff --git a/internal/synctest/synctest.go b/internal/synctest/synctest.go new file mode 100644 index 0000000000..e189fbe585 --- /dev/null +++ b/internal/synctest/synctest.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +//go:build go1.25 + +package synctest + +import ( + "testing" + "testing/synctest" +) + +func Test(t *testing.T, f func(t *testing.T)) { + synctest.Test(t, func(t *testing.T) { + f(t) + }) +} diff --git a/internal/synctest/synctest_go124.go b/internal/synctest/synctest_go124.go new file mode 100644 index 0000000000..cf4c766985 --- /dev/null +++ b/internal/synctest/synctest_go124.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +//go:build goexperiment.synctest && !go1.25 + +package synctest + +import ( + "testing" + "testing/synctest" +) + +func Test(t *testing.T, f func(t *testing.T)) { + synctest.Run(func() { + f(t) + }) +} diff --git a/internal/telemetry/README.md b/internal/telemetry/README.md new file mode 100644 index 0000000000..2b8f69fd1c --- /dev/null +++ b/internal/telemetry/README.md @@ -0,0 +1,69 @@ +# Instrumentation Telemetry Client Architecture + +This documentation details the current architecture of the Instrumentation Telemetry Client of dd-trace-go and was are its capabilities. +For an API documentation, please refer to the [api.go](https://github.com/DataDog/dd-trace-go/blob/main/internal/telemetry/api.go) file content. + +Please, make sure to read the [Specification Documentation](https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/main) before reading this document. + +### Data Flow + +```mermaid +flowchart TD + linkStyle default interpolate basis + globalclient@{ shape: circle } -->|client == nil| recorder + globalclient -->|client != nil| client + recorder@{ shape: cyl } --> client@{ shape: circle } + + subgraph datasources + integrations@{ shape: cyl } + configuration@{ shape: cyl } + dependencies@{ shape: cyl } + products@{ shape: cyl } + logs@{ shape: cyl } + metrics@{ shape: cyl } + end + + client --> datasources + + subgraph mapper + direction LR + app-started --> + default[message-batch
heartbeat
extended-heartbeat] --> app-closing + end + + flush@{ shape:rounded } + + queue@{ shape: cyl } --> flush + + datasources -..->|at flush| mapper --> flush + flush -->|if writer fails| queue + + flush --> writer + + writer --> agent@{ shape: das } + writer --> backend@{ shape: stadium } + agent --> backend +``` + +### Low Level Components + +- **`RingQueue[T]`**: The ring queue is an arbitrary data structure that support growing buffers, a buffer pool, and overflow. It is used as a backend data structure for the payload queue, the recorder and distribution metrics. +- **`Recorder[T]`**: The recorder is a `RingBuffer[func(T)]` that stores functions until the actual value `T` has been created when calling `Replay(T)` dequeues all functions from the recorder and applies them to the value `T`. By default, it can store 512 functions at most. +- **`Range[T]`**: Simple data structure that stores a start and end value, a minimum and maximum interval and has utils functions to help managing ranges. +- **`SyncMap[K, V]`**: Typed version of `sync.Map` +- **`SyncPool[T]`**: Typed version of `sync.Pool` + +### High Level Components + +- **GlobalClient**: The global client is a singleton that is used to access the client instance. It is used to create a new client instance if it does not exist yet. It is also used to access the client instance if it already exists. The global client recorder record calls to the clients until the `StartApp` function is called +- **Client**: The actual `Client` interface implementation. It's main job is to steer data to its corresponding data source. Other than that it actually manages the config of the client and gather data from the data sources to call `Flush` with it. +- **Data Sources**: Each data source implement the `dataSource` interface that has the method `Payload() transport.Payload` that is supposed to flush all data from the data source and make it into a payload ready to be serialized and sent to the backend. + - **Integrations**: The integrations data source is responsible for creating the [`app-integrations-change`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/app_integrations_change.md) payload. A very simple slice and mutex is used as backing store. + - **Configuration**: The configuration data source is responsible for creating the [`app-client-configuration-change`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/app_client_configuration_change.md) payload. A map and mutex is used as backing store. + - **Dependencies**: The dependencies data source is responsible for gathering data [`app-dependencies-loaded`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/app_dependencies_loaded.md) payload. No public API is available for this as this is does in-house with the `ClientConfig.DependencyLoader` function output. + - **Product**: The product data source is responsible for gathering data [`app-product-change`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/app_product_change.md) payload. A map and mutex is used as backing store. + - **Metrics**: The metrics data source is responsible for gathering data for the [`generate-metrics`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/generate_metrics.md) payload. A `SyncMap[metrickey, metricHandle]` is used as backing store. More on that in the metrics specific section + - **Distributions**: The distributions data source is responsible for gathering data for the [`distributions`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/distributions.md) payload. A `SyncMap[distributionkey, distributionHandle]` is used as backing store. More on that in the metrics specific section + - **Logs**: The logs data source is responsible for gathering data for the [`generate-logs`](https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas/logs.md) payload. A `SyncMap[logkey, logValue]` is used as backing store. More on that in the logs specific section. +- **Mapper**: The mapper is also responsible for creating the `app-started`, `app-closing`, `heartbeat`, `extended-heartbeat` and `message-batch` payloads from the data sources that needs data from other payloads but not from the API user. The mapper already return another mapper that will be used in the next call to `Flush`. +- **Writer**: The writer is responsible for sending the payload to the backend. It is a simple interface that has a `Write` method that receives a `transport.Payload` and returns statistics about the write operation. diff --git a/internal/telemetry/api.go b/internal/telemetry/api.go new file mode 100644 index 0000000000..870191afc4 --- /dev/null +++ b/internal/telemetry/api.go @@ -0,0 +1,176 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +// Package telemetry provides a telemetry client that is thread-safe burden-less telemetry client following the specification of the instrumentation telemetry from Datadog. +// Specification here: https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/main +// +// The telemetry package has 6 main capabilities: +// - Metrics: Support for [Count], [Rate], [Gauge], [Distribution] metrics. +// - Logs: Support Debug, Warn, Error logs with tags and stack traces via the subpackage [log] or the [Log] function. +// - Product: Start, Stop and Startup errors reporting to the backend +// - App Config: Register and change the configuration of the application and declare its origin +// - Integration: Loading and errors +// - Dependencies: Sending all the dependencies of the application to the backend (for SCA purposes for example) +// +// Each of these capabilities is exposed through the [Client] interface but mainly through the package level functions. +// that mirror and call the global client that is started through the [StartApp] function. +// +// Before the [StartApp] function is called, all called to the global client will be recorded and replay +// when the [StartApp] function is called synchronously. The telemetry client is allowed to record at most 512 calls. +// +// At the end of the app lifetime. If [tracer.Stop] is called, the client should be stopped with the [StopApp] function. +// For all data to be flushed to the backend appropriately. +// +// Note: No public API is available for the dependencies payloads as this is does in-house with the `ClientConfig.DependencyLoader` function output. +package telemetry + +import ( + "io" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +// Namespace describes a product to distinguish telemetry coming from +// different products used by the same application +type Namespace = transport.Namespace +type Origin = transport.Origin +type LogLevel = transport.LogLevel + +//goland:noinspection GoVarAndConstTypeMayBeOmitted Goland is having a hard time with the following const block, it keeps deleting the type +const ( + NamespaceGeneral Namespace = transport.NamespaceGeneral + NamespaceTracers Namespace = transport.NamespaceTracers + NamespaceProfilers Namespace = transport.NamespaceProfilers + NamespaceAppSec Namespace = transport.NamespaceAppSec + NamespaceIAST Namespace = transport.NamespaceIAST + NamespaceCIVisibility Namespace = transport.NamespaceCIVisibility + NamespaceMLObs Namespace = transport.NamespaceMLObs + NamespaceRUM Namespace = transport.NamespaceRUM +) + +// Origin describes the source of a configuration change + +//goland:noinspection GoVarAndConstTypeMayBeOmitted Goland is having a hard time with the following const block, it keeps deleting the type +const ( + OriginDefault Origin = transport.OriginDefault + OriginCode Origin = transport.OriginCode + OriginDDConfig Origin = transport.OriginDDConfig + OriginEnvVar Origin = transport.OriginEnvVar + OriginRemoteConfig Origin = transport.OriginRemoteConfig + OriginLocalStableConfig Origin = transport.OriginLocalStableConfig + OriginManagedStableConfig Origin = transport.OriginManagedStableConfig +) + +// EmptyID represents the absence of a configuration ID. +// It can be assigned to the ID field of a Configuration when no ID is available or required. +const EmptyID = "" + +// LogLevel describes the level of a log message + +//goland:noinspection GoVarAndConstTypeMayBeOmitted Goland is having a hard time with the following const block, it keeps deleting the type +const ( + LogDebug LogLevel = transport.LogLevelDebug + LogWarn LogLevel = transport.LogLevelWarn + LogError LogLevel = transport.LogLevelError +) + +// MetricHandle can be used to submit different values for the same metric. +// MetricHandle is used to reduce lock contention when submitting metrics. +// This can also be used ephemerally to submit a single metric value like this: +// +// telemetry.metric(telemetry.Appsec, "my-count", map[string]string{"tag1": "true", "tag2": "1.0"}).Submit(1.0) +type MetricHandle interface { + // Submit submits a value to the metric handle. + Submit(value float64) + // Get returns the last value submitted to the metric handle. + Get() float64 +} + +// Integration is an integration that is configured to be traced. +type Integration struct { + // Name is an arbitrary string that must stay constant for the integration. + Name string + // Version is the version of the integration/dependency that is being loaded. + Version string + // Error is the error that occurred while loading the integration. If this field is specified, the integration is + // considered to be having been forcefully disabled because of the error. + Error string +} + +// Configuration is a key-value pair that is used to configure the application. +type Configuration struct { + // Key is the key of the configuration. + Name string + // Value is the value of the configuration. Need to be json serializable. + Value any + // Origin is the source of the configuration change. + Origin Origin + // ID is the config ID of the configuration change. + ID string +} + +// LogOption is a function that modifies the log message that is sent to the telemetry. +type LogOption func(key *loggerKey, value *loggerValue) + +// Client constitutes all the functions available concurrently for the telemetry users. All methods are thread-safe +// This is an interface for easier testing but all functions will be mirrored at the package level to call +// the global client. +type Client interface { + io.Closer + + // Count obtains the metric handle for the given parameters, or creates a new one if none was created just yet. + // Tags cannot contain commas. + Count(namespace Namespace, name string, tags []string) MetricHandle + + // Rate obtains the metric handle for the given parameters, or creates a new one if none was created just yet. + // Tags cannot contain commas. + Rate(namespace Namespace, name string, tags []string) MetricHandle + + // Gauge obtains the metric handle for the given parameters, or creates a new one if none was created just yet. + // Tags cannot contain commas. + Gauge(namespace Namespace, name string, tags []string) MetricHandle + + // Distribution obtains the metric handle for the given parameters, or creates a new one if none was created just yet. + // Tags cannot contain commas. + Distribution(namespace Namespace, name string, tags []string) MetricHandle + + // Log sends a telemetry log with the given [slog.Record] and options. + // Options include sending key-value pairs as tags, and a stack trace frozen from inside the Log function. + Log(record Record, options ...LogOption) + + // ProductStarted declares a product to have started at the customer's request + ProductStarted(product Namespace) + + // ProductStopped declares a product to have being stopped by the customer + ProductStopped(product Namespace) + + // ProductStartError declares that a product could not start because of the following error + ProductStartError(product Namespace, err error) + + // RegisterAppConfig adds a key value pair to the app configuration and send the change to telemetry + // value has to be json serializable and the origin is the source of the change. + RegisterAppConfig(key string, value any, origin Origin) + + // RegisterAppConfigs adds a list of key value pairs to the app configuration and sends the change to telemetry. + // Same as AddAppConfig but for multiple values. + RegisterAppConfigs(kvs ...Configuration) + + // MarkIntegrationAsLoaded marks an integration as loaded in the telemetry + MarkIntegrationAsLoaded(integration Integration) + + // Flush closes the client and flushes any remaining data. + Flush() + + // AppStart sends the telemetry necessary to signal that the app is starting. + // Preferred use via [StartApp] package level function + AppStart() + + // AppStop sends the telemetry necessary to signal that the app is stopping. + // Preferred use via [StopApp] package level function + AppStop() + + // AddFlushTicker adds a function that is called at each telemetry Flush. By default, every minute + AddFlushTicker(ticker func(Client)) +} diff --git a/internal/telemetry/backend.go b/internal/telemetry/backend.go new file mode 100644 index 0000000000..26eb3802b3 --- /dev/null +++ b/internal/telemetry/backend.go @@ -0,0 +1,186 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "bytes" + "context" + "log/slog" + "strings" + "sync" + "sync/atomic" + + "github.com/puzpuzpuz/xsync/v3" + + "github.com/DataDog/dd-trace-go/v2/internal/stacktrace" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +const ( + stackTraceKey = "stacktrace" + telemetryStackSkip = 4 // Skip: CaptureWithRedaction, capture, loggerBackend.add, loggerBackend.Add +) + +type loggerKey struct { + tags string + message string + level LogLevel +} + +type loggerValue struct { + count atomic.Uint32 + record Record + + captureStacktrace bool + rawStack stacktrace.RawStackTrace +} + +type formatter struct { + buffer *bytes.Buffer + handler slog.Handler +} + +type loggerBackend struct { + store *xsync.MapOf[loggerKey, *loggerValue] + + distinctLogs atomic.Int32 + maxDistinctLogs int32 + onceMaxLogsReached sync.Once + + formatters *sync.Pool +} + +func newLoggerBackend(maxDistinctLogs int32) *loggerBackend { + return &loggerBackend{ + store: xsync.NewMapOf[loggerKey, *loggerValue](), + maxDistinctLogs: maxDistinctLogs, + + formatters: &sync.Pool{ + New: func() any { + buf := &bytes.Buffer{} + return &formatter{ + buffer: buf, + handler: slog.NewTextHandler(buf, &slog.HandlerOptions{ + ReplaceAttr: func(_ []string, a slog.Attr) slog.Attr { + // Remove time, level, source attributes, stacktrace and empty message attributes + if a.Key == slog.TimeKey || + a.Key == slog.LevelKey || + a.Key == slog.SourceKey || + a.Key == stackTraceKey { + return slog.Attr{} + } + if a.Key == slog.MessageKey && a.Value.String() == "" { + return slog.Attr{} + } + return a + }, + }), + } + }, + }, + } +} + +func (logger *loggerBackend) Add(record Record, opts ...LogOption) { + if logger.distinctLogs.Load() >= logger.maxDistinctLogs { + logger.onceMaxLogsReached.Do(func() { + logger.add(NewRecord(LogError, "telemetry: log count exceeded maximum, dropping log"), WithStacktrace()) + }) + return + } + + logger.add(record, opts...) +} + +func (logger *loggerBackend) add(record Record, opts ...LogOption) { + key := loggerKey{ + level: slogLevelToLogLevel(record.Level), + message: record.Message, + } + + for _, opt := range opts { + opt(&key, nil) + } + + value, _ := logger.store.LoadOrCompute(key, func() *loggerValue { + // Create the record at capture time, not send time + value := &loggerValue{ + record: record, + } + for _, opt := range opts { + opt(nil, value) + } + if value.captureStacktrace { + value.rawStack = stacktrace.CaptureRaw(telemetryStackSkip) + } + logger.distinctLogs.Add(1) + return value + }) + + value.count.Add(1) +} + +func (logger *loggerBackend) Payload() transport.Payload { + logs := make([]transport.LogMessage, 0, logger.store.Size()+1) + logger.store.Range(func(key loggerKey, value *loggerValue) bool { + logger.store.Delete(key) + logger.distinctLogs.Add(-1) + msg := transport.LogMessage{ + Message: logger.formatMessage(value.record), + Level: key.level, + Tags: key.tags, + Count: value.count.Load(), + TracerTime: value.record.Time.Unix(), + } + if value.captureStacktrace { + msg.StackTrace = stacktrace.Format(value.rawStack.SymbolicateWithRedaction()) + } + logs = append(logs, msg) + return true + }) + + if len(logs) == 0 { + return nil + } + + return transport.Logs{Logs: logs} +} + +func (logger *loggerBackend) formatMessage(record Record) string { + if logger.formatters == nil { + return record.Message + } + + hasAttrs := false + record.Attrs(func(attr slog.Attr) bool { + hasAttrs = true + return false + }) + + if !hasAttrs { + return record.Message + } + + // Capture the message before clearing it. + message := record.Message + + formatter := logger.formatters.Get().(*formatter) + defer func() { + formatter.buffer.Reset() + logger.formatters.Put(formatter) + }() + + // Clear the message so TextHandler only formats attributes. + record.Message = "" + formatter.handler.Handle(context.Background(), record.Record) + formattedAttrs := strings.TrimSpace(formatter.buffer.String()) + + if formattedAttrs == "" { + return message + } + + return message + ": " + formattedAttrs +} diff --git a/internal/telemetry/backend_test.go b/internal/telemetry/backend_test.go new file mode 100644 index 0000000000..133b0ba209 --- /dev/null +++ b/internal/telemetry/backend_test.go @@ -0,0 +1,239 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "log/slog" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +func TestLoggerBackend_formatMessage(t *testing.T) { + backend := newLoggerBackend(100) + + tests := []struct { + name string + setupRecord func() Record + expectedOutput string + description string + }{ + { + name: "plain message without attributes", + setupRecord: func() Record { + return NewRecord(LogDebug, "simple message") + }, + expectedOutput: "simple message", + description: "Should return raw message when no attributes present", + }, + { + name: "message with single attribute", + setupRecord: func() Record { + record := NewRecord(LogWarn, "operation failed") + record.AddAttrs(slog.String("operation", "startup")) + return record + }, + expectedOutput: "operation failed: operation=startup", + description: "Should format message with single key=value attribute", + }, + { + name: "message with multiple attributes", + setupRecord: func() Record { + record := NewRecord(LogError, "user action") + record.AddAttrs( + slog.String("user_id", "12345"), + slog.String("action", "login"), + slog.Int("attempt", 3), + ) + return record + }, + expectedOutput: "user action: user_id=12345 action=login attempt=3", + description: "Should format message with multiple attributes in key=value format", + }, + { + name: "message with nested group", + setupRecord: func() Record { + record := NewRecord(LogWarn, "request processed") + record.AddAttrs( + slog.Group("http", + slog.String("method", "GET"), + slog.Int("status", 200), + ), + slog.String("endpoint", "/api/users"), + ) + return record + }, + expectedOutput: "request processed: http.method=GET http.status=200 endpoint=/api/users", + description: "Should format nested groups with dot notation", + }, + { + name: "message with special characters in values", + setupRecord: func() Record { + record := NewRecord(LogError, "error occurred") + record.AddAttrs( + slog.String("error", "connection failed: timeout after 30s"), + slog.String("path", "/tmp/file with spaces.txt"), + ) + return record + }, + expectedOutput: `error occurred: error="connection failed: timeout after 30s" path="/tmp/file with spaces.txt"`, + description: "Should properly quote values with special characters", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + record := tt.setupRecord() + result := backend.formatMessage(record) + + assert.Equal(t, tt.expectedOutput, result, tt.description) + }) + } +} + +func TestLoggerBackend_Add(t *testing.T) { + backend := newLoggerBackend(2) + + t.Run("adds new log entry", func(t *testing.T) { + record := NewRecord(LogDebug, "test message") + backend.Add(record) + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + + assert.Equal(t, "test message", logs.Logs[0].Message) + assert.Equal(t, LogDebug, logs.Logs[0].Level) + assert.Equal(t, uint32(1), logs.Logs[0].Count) + }) + + t.Run("increments count for duplicate entries", func(t *testing.T) { + backend := newLoggerBackend(10) + record := NewRecord(LogWarn, "duplicate message") + + backend.Add(record) + backend.Add(record) + backend.Add(record) + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + + assert.Equal(t, "duplicate message", logs.Logs[0].Message) + assert.Equal(t, uint32(3), logs.Logs[0].Count) + }) + + t.Run("respects max distinct logs limit", func(t *testing.T) { + backend := newLoggerBackend(2) + + record1 := NewRecord(LogDebug, "message 1") + record2 := NewRecord(LogWarn, "message 2") + record3 := NewRecord(LogError, "message 3") + + backend.Add(record1) + backend.Add(record2) + backend.Add(record3) // Should be dropped due to limit + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + // Should have 2 regular messages + 1 warning about exceeding limit + require.Len(t, logs.Logs, 3) + + // Check that the warning message is present + foundWarning := false + for _, log := range logs.Logs { + if log.Message == "telemetry: log count exceeded maximum, dropping log" { + foundWarning = true + assert.Equal(t, LogError, log.Level) + break + } + } + assert.True(t, foundWarning, "Should contain warning message about exceeding log limit") + }) +} + +func TestLoggerBackend_StackTrace(t *testing.T) { + backend := newLoggerBackend(10) + + t.Run("captures stack trace when requested", func(t *testing.T) { + record := NewRecord(LogError, "error with stack") + backend.Add(record, WithStacktrace()) + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + + assert.NotEmpty(t, logs.Logs[0].StackTrace, "Should have stack trace when PC is present") + }) + + t.Run("captures stack trace with redaction", func(t *testing.T) { + record := NewRecord(LogError, "error with stack trace") + backend.Add(record, WithStacktrace()) + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + + assert.NotEmpty(t, logs.Logs[0].StackTrace, "Should have stack trace when using CaptureWithRedaction") + assert.Contains(t, logs.Logs[0].StackTrace, "backend_test.go", "Stack trace should show test location") + }) + + t.Run("telemetry skip value correctly excludes internal frames", func(t *testing.T) { + // This test verifies that telemetryStackSkip=4 correctly skips the internal telemetry frames + // Call chain: this test -> backend.Add -> backend.add -> CaptureWithRedaction -> capture + record := NewRecord(LogError, "test telemetry skip") + backend.Add(record, WithStacktrace()) + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + + stackTrace := logs.Logs[0].StackTrace + assert.NotEmpty(t, stackTrace, "Should have stack trace") + + // With skip=4, the stack should NOT contain backend.add, backend.Add, CaptureWithRedaction, or capture + assert.NotContains(t, stackTrace, "backend.add", "Should skip backend.add frame") + assert.NotContains(t, stackTrace, "backend.Add", "Should skip backend.Add frame") + assert.NotContains(t, stackTrace, "CaptureWithRedaction", "Should skip CaptureWithRedaction frame") + assert.NotContains(t, stackTrace, ".capture", "Should skip capture frame") + + // Should contain this test function + assert.Contains(t, stackTrace, "TestLoggerBackend_StackTrace", "Should contain calling test function") + assert.Contains(t, stackTrace, "backend_test.go", "Should show test file location") + }) +} + +func TestLoggerBackend_Tags(t *testing.T) { + backend := newLoggerBackend(10) + + t.Run("includes tags in log entry", func(t *testing.T) { + record := NewRecord(LogDebug, "tagged message") + backend.Add(record, WithTags([]string{"service:api", "version:1.2.3"})) + + payload := backend.Payload() + require.NotNil(t, payload) + + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + + assert.Equal(t, "service:api,version:1.2.3", logs.Logs[0].Tags) + }) +} diff --git a/internal/telemetry/client.go b/internal/telemetry/client.go index 5cf962c7e4..06f9d2a2b7 100644 --- a/internal/telemetry/client.go +++ b/internal/telemetry/client.go @@ -1,625 +1,393 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. +// Copyright 2024 Datadog, Inc. -// Package telemetry implements a client for sending telemetry information to -// Datadog regarding usage of an APM library such as tracing or profiling. package telemetry import ( - "bytes" - "encoding/json" - "fmt" - "net" - "net/http" + "errors" "os" - "runtime" - "runtime/debug" - "strings" + "strconv" "sync" - "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - logger "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" -) - -// Client buffers and sends telemetry messages to Datadog (possibly through an -// agent). -type Client interface { - RegisterAppConfig(name string, val interface{}, origin Origin) - ProductChange(namespace Namespace, enabled bool, configuration []Configuration) - ConfigChange(configuration []Configuration) - Record(namespace Namespace, metric MetricKind, name string, value float64, tags []string, common bool) - Count(namespace Namespace, name string, value float64, tags []string, common bool) - ApplyOps(opts ...Option) - Stop() -} - -var ( - // GlobalClient acts as a global telemetry client that the - // tracer, profiler, and appsec products will use - GlobalClient Client - globalClient sync.Mutex - - // integrations tracks the integrations enabled - contribPackages []Integration - contrib sync.Mutex - - // copied from dd-trace-go/profiler - defaultHTTPClient = &http.Client{ - // We copy the transport to avoid using the default one, as it might be - // augmented with tracing and we don't want these calls to be recorded. - // See https://golang.org/pkg/net/http/#DefaultTransport . - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - DialContext: (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).DialContext, - MaxIdleConns: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - }, - Timeout: 5 * time.Second, - } - hostname string - - // protects agentlessURL, which may be changed for testing purposes - agentlessEndpointLock sync.RWMutex - // agentlessURL is the endpoint used to send telemetry in an agentless environment. It is - // also the default URL in case connecting to the agent URL fails. - agentlessURL = "https://instrumentation-telemetry-intake.datadoghq.com/api/v2/apmtelemetry" + "github.com/puzpuzpuz/xsync/v3" - defaultHeartbeatInterval = 60.0 // seconds - - // LogPrefix specifies the prefix for all telemetry logging - LogPrefix = "Instrumentation telemetry: " + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/mapper" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" ) -func init() { - h, err := os.Hostname() - if err == nil { - hostname = h +// NewClient creates a new telemetry client with the given service, environment, and version and config. +func NewClient(service, env, version string, config ClientConfig) (Client, error) { + if service == "" { + return nil, errors.New("service name must not be empty") } - GlobalClient = new(client) -} -// client implements Client interface. Client.Start should be called before any other methods. -// -// Client is safe to use from multiple goroutines concurrently. The client will -// send all telemetry requests in the background, in order to avoid blocking the -// caller since telemetry should not disrupt an application. Metrics are -// aggregated by the Client. -type client struct { - // URL for the Datadog agent or Datadog telemetry endpoint - URL string - // APIKey should be supplied if the endpoint is not a Datadog agent, - // i.e. you are sending telemetry directly to Datadog - APIKey string - // The interval for sending a heartbeat signal to the backend. - // Configurable with DD_TELEMETRY_HEARTBEAT_INTERVAL. Default 60s. - heartbeatInterval time.Duration - - // e.g. "tracers", "profilers", "appsec" - Namespace Namespace - - // App-specific information - Service string - Env string - Version string - - // Client will be used for telemetry uploads. This http.Client, if - // provided, should be the same as would be used for any other - // interaction with the Datadog agent, e.g. if the agent is accessed - // over UDS, or if the user provides their own http.Client to the - // profiler/tracer to access the agent over a proxy. - // - // If Client is nil, an http.Client with the same Transport settings as - // http.DefaultTransport and a 5 second timeout will be used. - Client *http.Client - - // mu guards all of the following fields - mu sync.Mutex - - // debug enables the debug flag for all requests, see - // https://dtdg.co/3bv2MMv. - // DD_INSTRUMENTATION_TELEMETRY_DEBUG configures this field. - debug bool - // started is true in between when Start() returns and the next call to - // Stop() - started bool - // seqID is a sequence number used to order telemetry messages by - // the back end. - seqID int64 - // heartbeatT is used to schedule heartbeat messages - heartbeatT *time.Timer - // requests hold all messages which don't need to be immediately sent - requests []*Request - // metrics holds un-sent metrics that will be aggregated the next time - // metrics are sent - metrics map[Namespace]map[string]*metric - newMetrics bool - - // Globally registered application configuration sent in the app-started request, along with the locally-defined - // configuration of the event. - globalAppConfig []Configuration -} - -func log(msg string, args ...interface{}) { - // Debug level so users aren't spammed with telemetry info. - logger.Debug(fmt.Sprintf(LogPrefix+msg, args...)) -} + config = defaultConfig(config) + if err := config.validateConfig(); err != nil { + return nil, err + } -// RegisterAppConfig allows to register a globally-defined application configuration. -// This configuration will be sent when the telemetry client is started and over related configuration updates. -func (c *client) RegisterAppConfig(name string, value interface{}, origin Origin) { - c.globalAppConfig = append(c.globalAppConfig, Configuration{ - Name: name, - Value: value, - Origin: origin, - }) + return newClient(internal.TracerConfig{Service: service, Env: env, Version: version}, config) } -// start registers that the app has begun running with the app-started event. -// Must be called with c.mu locked. -// start also configures the telemetry client based on the following telemetry -// environment variables: DD_INSTRUMENTATION_TELEMETRY_ENABLED, -// DD_TELEMETRY_HEARTBEAT_INTERVAL, DD_INSTRUMENTATION_TELEMETRY_DEBUG, -// and DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED. -// TODO: implement passing in error information about tracer start -func (c *client) start(configuration []Configuration, namespace Namespace, flush bool) { - if Disabled() { - return - } - if c.started { - log("attempted to start telemetry client when client has already started - ignoring attempt") - return +func newClient(tracerConfig internal.TracerConfig, config ClientConfig) (*client, error) { + writerConfig, err := newWriterConfig(config, tracerConfig) + if err != nil { + return nil, err } - // Don't start the telemetry client if there is some error configuring the client with fallback - // options, e.g. an API key was not found but agentless telemetry is expected. - if err := c.fallbackOps(); err != nil { - log(err.Error()) - return + + writer, err := internal.NewWriter(writerConfig) + if err != nil { + return nil, err } - c.started = true - c.metrics = make(map[Namespace]map[string]*metric) - c.debug = internal.BoolEnv("DD_INSTRUMENTATION_TELEMETRY_DEBUG", false) + client := &client{ + tracerConfig: tracerConfig, + writer: writer, + clientConfig: config, + flushMapper: mapper.NewDefaultMapper(config.HeartbeatInterval, config.ExtendedHeartbeatInterval), + payloadQueue: internal.NewRingQueue[transport.Payload](config.PayloadQueueSize), - productInfo := Products{ - AppSec: ProductDetails{ - Version: version.Tag, - // if appsec is the one starting the telemetry client, - // then AppSec is enabled - Enabled: namespace == NamespaceAppSec, + dependencies: dependencies{ + DependencyLoader: config.DependencyLoader, }, - Profiler: ProductDetails{ - Version: version.Tag, - // if the profiler is the one starting the telemetry client, - // then profiling is enabled. - Enabled: namespace == NamespaceProfilers, + metrics: metrics{ + store: xsync.NewMapOf[metricKey, metricHandle](xsync.WithPresize(knownmetrics.SizeWithFilter(func(decl knownmetrics.Declaration) bool { return decl.Type != transport.DistMetric }))), + skipAllowlist: config.Debug, }, + distributions: distributions{ + store: xsync.NewMapOf[metricKey, *distribution](xsync.WithPresize(knownmetrics.SizeWithFilter(func(decl knownmetrics.Declaration) bool { return decl.Type == transport.DistMetric }))), + pool: internal.NewSyncPool(func() []float64 { return make([]float64, config.DistributionsSize.Min) }), + skipAllowlist: config.Debug, + queueSize: config.DistributionsSize, + }, + backend: newLoggerBackend(config.MaxDistinctLogs), } - var cfg []Configuration - cfg = append(cfg, c.globalAppConfig...) - cfg = append(cfg, configuration...) + client.dataSources = append(client.dataSources, + &client.integrations, + &client.products, + &client.configuration, + &client.dependencies, + ) - // State whether the app has its Go dependencies available or not - deps, ok := debug.ReadBuildInfo() - if !ok { - deps = nil // because not guaranteed to be nil by the public doc when !ok - } - cfg = append(cfg, BoolConfig("dependencies_available", ok)) - collectDependenciesEnabled := collectDependencies() - cfg = append(cfg, BoolConfig("DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED", collectDependenciesEnabled)) // TODO: report all the possible telemetry config option automatically - if !collectDependenciesEnabled { - deps = nil // to simplify the condition below to `deps != nil` + if config.LogsEnabled { + client.dataSources = append(client.dataSources, client.backend) } - payload := &AppStarted{ - Configuration: cfg, - Products: productInfo, - } - appStarted := c.newRequest(RequestTypeAppStarted) - appStarted.Body.Payload = payload - c.scheduleSubmit(appStarted) - - if deps != nil { - var depPayload Dependencies - for _, dep := range deps.Deps { - depPayload.Dependencies = append(depPayload.Dependencies, - Dependency{ - Name: dep.Path, - Version: strings.TrimPrefix(dep.Version, "v"), - }, - ) - } - // Send the telemetry request if and only if the dependencies are actually present in the binary. - // For instance, bazel doesn't include them out of the box (cf. https://github.com/bazelbuild/rules_go/issues/3090), - // which would result in an empty list of dependencies. - dep := c.newRequest(RequestTypeDependenciesLoaded) - dep.Body.Payload = depPayload - c.scheduleSubmit(dep) + if config.MetricsEnabled { + client.dataSources = append(client.dataSources, &client.metrics, &client.distributions) } - if len(contribPackages) > 0 { - req := c.newRequest(RequestTypeAppIntegrationsChange) - req.Body.Payload = IntegrationsChange{Integrations: contribPackages} - c.scheduleSubmit(req) + client.flushTicker = internal.NewTicker(client.Flush, config.FlushInterval) + + return client, nil +} + +// dataSources is where the data that will be flushed is coming from. I.e metrics, logs, configurations, etc. +type dataSource interface { + Payload() transport.Payload +} + +type client struct { + tracerConfig internal.TracerConfig + clientConfig ClientConfig + + // Data sources + dataSources []dataSource + integrations integrations + products products + configuration configuration + dependencies dependencies + backend *loggerBackend + metrics metrics + distributions distributions + + // flushMapper is the transformer to use for the next flush on the gathered bodies on this tick + flushMapper mapper.Mapper + flushMapperMu sync.Mutex + + // flushTicker is the ticker that triggers a call to client.Flush every flush interval + flushTicker *internal.Ticker + // flushMu is used to ensure that only one flush is happening at a time + flushMu sync.Mutex + + // writer is the writer to use to send the payloads to the backend or the agent + writer internal.Writer + + // payloadQueue is used when we cannot flush previously built payload for multiple reasons. + payloadQueue *internal.RingQueue[transport.Payload] + + // flushTickerFuncs are functions that are called just before flushing the data to the backend. + flushTickerFuncs []func(Client) + flushTickerFuncsMu sync.Mutex +} + +func (c *client) Log(record Record, options ...LogOption) { + if !c.clientConfig.LogsEnabled { + return } - if flush { - c.flush() + c.backend.Add(record, options...) +} + +func (c *client) MarkIntegrationAsLoaded(integration Integration) { + c.integrations.Add(integration) +} + +func (c *client) Count(namespace Namespace, name string, tags []string) MetricHandle { + if !c.clientConfig.MetricsEnabled { + return noopMetricHandle{} } - c.heartbeatInterval = heartbeatInterval() - c.heartbeatT = time.AfterFunc(c.heartbeatInterval, c.backgroundHeartbeat) + return c.metrics.LoadOrStore(namespace, transport.CountMetric, name, tags) } -func heartbeatInterval() time.Duration { - heartbeat := internal.FloatEnv("DD_TELEMETRY_HEARTBEAT_INTERVAL", defaultHeartbeatInterval) - if heartbeat <= 0 || heartbeat > 3600 { - log("DD_TELEMETRY_HEARTBEAT_INTERVAL=%d not in [1,3600] range, setting to default of %f", heartbeat, defaultHeartbeatInterval) - heartbeat = defaultHeartbeatInterval +func (c *client) Rate(namespace Namespace, name string, tags []string) MetricHandle { + if !c.clientConfig.MetricsEnabled { + return noopMetricHandle{} } - return time.Duration(heartbeat * float64(time.Second)) + return c.metrics.LoadOrStore(namespace, transport.RateMetric, name, tags) } -// Stop notifies the telemetry endpoint that the app is closing. All outstanding -// messages will also be sent. No further messages will be sent until the client -// is started again -func (c *client) Stop() { - c.mu.Lock() - defer c.mu.Unlock() - if !c.started { - return +func (c *client) Gauge(namespace Namespace, name string, tags []string) MetricHandle { + if !c.clientConfig.MetricsEnabled { + return noopMetricHandle{} } - c.started = false - c.heartbeatT.Stop() - // close request types have no body - r := c.newRequest(RequestTypeAppClosing) - c.scheduleSubmit(r) - c.flush() + return c.metrics.LoadOrStore(namespace, transport.GaugeMetric, name, tags) } -// Disabled returns whether instrumentation telemetry is disabled -// according to the DD_INSTRUMENTATION_TELEMETRY_ENABLED env var -func Disabled() bool { - return !internal.BoolEnv("DD_INSTRUMENTATION_TELEMETRY_ENABLED", true) +func (c *client) Distribution(namespace Namespace, name string, tags []string) MetricHandle { + if !c.clientConfig.MetricsEnabled { + return noopMetricHandle{} + } + return c.distributions.LoadOrStore(namespace, name, tags) } -// collectDependencies returns whether dependencies telemetry information is sent -func collectDependencies() bool { - return internal.BoolEnv("DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED", true) +func (c *client) ProductStarted(product Namespace) { + c.products.Add(product, true, nil) } -// MetricKind specifies the type of metric being reported. -// Metric types mirror Datadog metric types - for a more detailed -// description of metric types, see: -// https://docs.datadoghq.com/metrics/types/?tab=count#metric-types -type MetricKind string - -var ( - // MetricKindGauge represents a gauge type metric - MetricKindGauge MetricKind = "gauge" - // MetricKindCount represents a count type metric - MetricKindCount MetricKind = "count" - // MetricKindDist represents a distribution type metric - MetricKindDist MetricKind = "distribution" -) +func (c *client) ProductStopped(product Namespace) { + c.products.Add(product, false, nil) +} -type metric struct { - name string - kind MetricKind - value float64 - // Unix timestamp - ts float64 - tags []string - common bool +func (c *client) ProductStartError(product Namespace, err error) { + c.products.Add(product, false, err) } -// TODO: Can there be identically named/tagged metrics with a "common" and "not -// common" variant? +func (c *client) RegisterAppConfig(key string, value any, origin Origin) { + c.configuration.Add(Configuration{Name: key, Value: value, Origin: origin}) +} -func newMetric(name string, kind MetricKind, tags []string, common bool) *metric { - return &metric{ - name: name, - kind: kind, - tags: append([]string{}, tags...), - common: common, +func (c *client) RegisterAppConfigs(kvs ...Configuration) { + for _, value := range kvs { + c.configuration.Add(value) } } -func metricKey(name string, tags []string, kind MetricKind) string { - return name + string(kind) + strings.Join(tags, "-") +func (c *client) AddFlushTicker(f func(Client)) { + c.flushTickerFuncsMu.Lock() + defer c.flushTickerFuncsMu.Unlock() + c.flushTickerFuncs = append(c.flushTickerFuncs, f) } -// Record sets the value for a gauge or distribution metric type -// with the given name and tags. If the metric is not language-specific, common should be set to true -func (c *client) Record(namespace Namespace, kind MetricKind, name string, value float64, tags []string, common bool) { - c.mu.Lock() - defer c.mu.Unlock() - if !c.started { - return - } - if _, ok := c.metrics[namespace]; !ok { - c.metrics[namespace] = map[string]*metric{} - } - key := metricKey(name, tags, kind) - m, ok := c.metrics[namespace][key] - if !ok { - m = newMetric(name, kind, tags, common) - c.metrics[namespace][key] = m +func (c *client) callFlushTickerFuncs() { + c.flushTickerFuncsMu.Lock() + defer c.flushTickerFuncsMu.Unlock() + + for _, f := range c.flushTickerFuncs { + f(c) } - m.value = value - m.ts = float64(time.Now().Unix()) - c.newMetrics = true } -// Count adds the value to a count with the given name and tags. If the metric -// is not language-specific, common should be set to true -func (c *client) Count(namespace Namespace, name string, value float64, tags []string, common bool) { - c.mu.Lock() - defer c.mu.Unlock() - if !c.started { - return - } - if _, ok := c.metrics[namespace]; !ok { - c.metrics[namespace] = map[string]*metric{} - } - key := metricKey(name, tags, MetricKindCount) - m, ok := c.metrics[namespace][key] - if !ok { - m = newMetric(name, MetricKindCount, tags, common) - c.metrics[namespace][key] = m - } - m.value += value - m.ts = float64(time.Now().Unix()) - c.newMetrics = true +func (c *client) Config() ClientConfig { + return c.clientConfig } -// flush sends any outstanding telemetry messages and aggregated metrics to be -// sent to the backend. Requests are sent in the background. Must be called -// with c.mu locked -func (c *client) flush() { - // initialize submissions slice of capacity len(c.requests) + 2 - // to hold all the new events, plus two potential metric events - submissions := make([]*Request, 0, len(c.requests)+2) - - // copy over requests so we can do the actual submission without holding - // the lock. Zero out the old stuff so we don't leak references - for i, r := range c.requests { - submissions = append(submissions, r) - c.requests[i] = nil - } - c.requests = c.requests[:0] - - if c.newMetrics { - c.newMetrics = false - for namespace := range c.metrics { - // metrics can either be request type generate-metrics or distributions - dPayload := &DistributionMetrics{ - Namespace: namespace, - } - gPayload := &Metrics{ - Namespace: namespace, - } - for _, m := range c.metrics[namespace] { - if m.kind == MetricKindDist { - dPayload.Series = append(dPayload.Series, DistributionSeries{ - Metric: m.name, - Tags: m.tags, - Common: m.common, - Points: []float64{m.value}, - }) - } else { - gPayload.Series = append(gPayload.Series, Series{ - Metric: m.name, - Type: string(m.kind), - Tags: m.tags, - Common: m.common, - Points: [][2]float64{{m.ts, m.value}}, - }) - } - } - if len(dPayload.Series) > 0 { - distributions := c.newRequest(RequestTypeDistributions) - distributions.Body.Payload = dPayload - submissions = append(submissions, distributions) - } - if len(gPayload.Series) > 0 { - generateMetrics := c.newRequest(RequestTypeGenerateMetrics) - generateMetrics.Body.Payload = gPayload - submissions = append(submissions, generateMetrics) - } +// Flush sends all the data sources before calling flush +// This function is called by the flushTicker so it should not panic, or it will crash the whole customer application. +// If a panic occurs, we stop the telemetry and log the error. +func (c *client) Flush() { + defer func() { + r := recover() + if r == nil { + return + } + if err, ok := r.(error); ok { + log.Warn("panic while flushing telemetry data, stopping telemetry: %s", err.Error()) + } else { + log.Warn("panic while flushing telemetry data, stopping telemetry!") + } + telemetryClientDisabled = true + if gc, ok := GlobalClient().(*client); ok && gc == c { + SwapClient(nil) + } + }() + + // We call the flushTickerFuncs before flushing the data for data sources + c.callFlushTickerFuncs() + + payloads := make([]transport.Payload, 0, 8) + for _, ds := range c.dataSources { + if payload := ds.Payload(); payload != nil { + payloads = append(payloads, payload) } } - go func() { - for _, r := range submissions { - err := r.submit() - if err != nil { - log("submission error: %s", err.Error()) + nbBytes, err := c.flush(payloads) + if err != nil { + // We check if the failure is about telemetry or appsec data to log the error at the right level + var dependenciesFound bool + for _, payload := range payloads { + if payload.RequestType() == transport.RequestTypeAppDependenciesLoaded { + dependenciesFound = true + break } } - }() -} - -var ( - osName string - osNameOnce sync.Once - osVersion string - osVersionOnce sync.Once -) + if dependenciesFound { + log.Warn("appsec: error while flushing SCA Security Data: %s", err.Error()) + } else { + log.Debug("telemetry: error while flushing telemetry data: %s", err.Error()) + } -// XXX: is it actually safe to cache osName and osVersion? For example, can the -// kernel be updated without stopping execution? + return + } -func getOSName() string { - osNameOnce.Do(func() { osName = osinfo.OSName() }) - return osName + if c.clientConfig.Debug { + log.Debug("telemetry: flushed %d bytes of data", nbBytes) + } } -func getOSVersion() string { - osVersionOnce.Do(func() { osVersion = osinfo.OSVersion() }) - return osVersion +func (c *client) transform(payloads []transport.Payload) []transport.Payload { + c.flushMapperMu.Lock() + defer c.flushMapperMu.Unlock() + payloads, c.flushMapper = c.flushMapper.Transform(payloads) + return payloads } -// newRequests populates a request with the common fields shared by all requests -// sent through this Client -func (c *client) newRequest(t RequestType) *Request { - c.seqID++ - body := &Body{ - APIVersion: "v2", - RequestType: t, - TracerTime: time.Now().Unix(), - RuntimeID: globalconfig.RuntimeID(), - SeqID: c.seqID, - Debug: c.debug, - Application: Application{ - ServiceName: c.Service, - Env: c.Env, - ServiceVersion: c.Version, - TracerVersion: version.Tag, - LanguageName: "go", - LanguageVersion: runtime.Version(), - }, - Host: Host{ - Hostname: hostname, - OS: getOSName(), - OSVersion: getOSVersion(), - Architecture: runtime.GOARCH, - // TODO (lievan): getting kernel name, release, version TBD - }, - } +// flush sends all the data sources to the writer after having sent them through the [transform] function. +// It returns the amount of bytes sent to the writer. +func (c *client) flush(payloads []transport.Payload) (int, error) { + c.flushMu.Lock() + defer c.flushMu.Unlock() + payloads = c.transform(payloads) + + if c.payloadQueue.IsEmpty() && len(payloads) == 0 { + return 0, nil + } + + emptyQueue := c.payloadQueue.IsEmpty() + // We enqueue the new payloads to preserve the order of the payloads + c.payloadQueue.Enqueue(payloads...) + payloads = c.payloadQueue.Flush() + + var ( + nbBytes int + speedIncreased bool + failedCalls []internal.EndpointRequestResult + ) + + for i, payload := range payloads { + results, err := c.writer.Flush(payload) + c.computeFlushMetrics(results, err) + if err != nil { + // We stop flushing when we encounter a fatal error, put the bodies in the queue and return the error + if results[len(results)-1].StatusCode == 413 { // If the payload is too large we have no way to divide it, we can only skip it... + log.Warn("telemetry: tried sending a payload that was too large, dropping it") + continue + } + c.payloadQueue.Enqueue(payloads[i:]...) + return nbBytes, err + } - header := &http.Header{ - "Content-Type": {"application/json"}, - "DD-Telemetry-API-Version": {"v2"}, - "DD-Telemetry-Request-Type": {string(t)}, - "DD-Client-Library-Language": {"go"}, - "DD-Client-Library-Version": {version.Tag}, - "DD-Agent-Env": {c.Env}, - "DD-Agent-Hostname": {hostname}, - } - if cid := internal.ContainerID(); cid != "" { - header.Set("Datadog-Container-ID", cid) - } - if eid := internal.EntityID(); eid != "" { - header.Set("Datadog-Entity-ID", eid) - } - if c.URL == getAgentlessURL() { - header.Set("DD-API-KEY", c.APIKey) - } - client := c.Client - if client == nil { - client = defaultHTTPClient - } - return &Request{Body: body, - Header: header, - HTTPClient: client, - URL: c.URL, - } -} + failedCalls = append(failedCalls, results[:len(results)-1]...) + successfulCall := results[len(results)-1] -// submit sends a telemetry request -func (r *Request) submit() error { - retry, err := r.trySubmit() - if retry { - // retry telemetry submissions in instances where the telemetry client has trouble - // connecting with the agent - log("telemetry submission failed, retrying with agentless: %s", err) - r.URL = getAgentlessURL() - r.Header.Set("DD-API-KEY", defaultAPIKey()) - if _, err := r.trySubmit(); err == nil { - return nil + if !speedIncreased && successfulCall.PayloadByteSize > c.clientConfig.EarlyFlushPayloadSize { + // We increase the speed of the flushTicker to try to flush the remaining bodies faster as we are at risk of sending too large bodies to the backend + c.flushTicker.CanIncreaseSpeed() + speedIncreased = true } - log("retrying with agentless telemetry failed: %s", err) - } - return err -} -// agentlessRetry determines if we should retry a failed a request with -// by submitting to the agentless endpoint -func agentlessRetry(req *Request, resp *http.Response, err error) bool { - if req.URL == getAgentlessURL() { - // no need to retry with agentless endpoint if it already failed - return false + nbBytes += successfulCall.PayloadByteSize } - if err != nil { - // we didn't get a response which might signal a connectivity problem with - // agent - retry with agentless - return true + + if emptyQueue && !speedIncreased { // If we did not send a very big payload, and we have no payloads + c.flushTicker.CanDecreaseSpeed() } - // TODO: add more status codes we do not want to retry on - doNotRetry := []int{http.StatusBadRequest, http.StatusTooManyRequests, http.StatusUnauthorized, http.StatusForbidden} - for status := range doNotRetry { - if resp.StatusCode == status { - return false + + if len(failedCalls) > 0 { + var errs []error + for _, call := range failedCalls { + errs = append(errs, call.Error) } + log.Debug("telemetry: non-fatal error(s) while flushing telemetry data: %v", errors.Join(errs...).Error()) } - return true + + return nbBytes, nil } -// trySubmit submits a telemetry request to the specified URL -// in the Request struct. If submission fails, return whether or not -// this submission should be re-tried with the agentless endpoint -// as well as the error that occurred -func (r *Request) trySubmit() (retry bool, err error) { - b, err := json.Marshal(r.Body) - if err != nil { - return false, err +// computeFlushMetrics computes and submits the metrics for the flush operation using the output from the writer.Flush method. +// It will submit the number of requests, responses, errors, the number of bytes sent and the duration of the call that was successful. +func (c *client) computeFlushMetrics(results []internal.EndpointRequestResult, reason error) { + if !c.clientConfig.internalMetricsEnabled { + return } - req, err := http.NewRequest(http.MethodPost, r.URL, bytes.NewReader(b)) - if err != nil { - return false, err + indexToEndpoint := func(i int) string { + if i == 0 && c.clientConfig.AgentURL != "" { + return "agent" + } + return "agentless" } - req.Header = *r.Header - req.ContentLength = int64(len(b)) + for i, result := range results { + endpoint := "endpoint:" + indexToEndpoint(i) + c.Count(transport.NamespaceTelemetry, "telemetry_api.requests", []string{endpoint}).Submit(1) + if result.StatusCode != 0 { + c.Count(transport.NamespaceTelemetry, "telemetry_api.responses", []string{endpoint, "status_code:" + strconv.Itoa(result.StatusCode)}).Submit(1) + } - client := r.HTTPClient - if client == nil { - client = defaultHTTPClient - } - resp, err := client.Do(req) - if err != nil { - return agentlessRetry(r, resp, err), err + if result.Error != nil { + typ := "type:network" + if os.IsTimeout(result.Error) { + typ = "type:timeout" + } + var writerStatusCodeError *internal.WriterStatusCodeError + if errors.As(result.Error, &writerStatusCodeError) { + typ = "type:status_code" + } + c.Count(transport.NamespaceTelemetry, "telemetry_api.errors", []string{endpoint, typ}).Submit(1) + } } - defer resp.Body.Close() - if resp.StatusCode != http.StatusAccepted && resp.StatusCode != http.StatusOK { - return agentlessRetry(r, resp, err), errBadStatus(resp.StatusCode) + + if reason != nil { + return } - return false, nil -} -type errBadStatus int + successfulCall := results[len(results)-1] + endpoint := "endpoint:" + indexToEndpoint(len(results)-1) + c.Distribution(transport.NamespaceTelemetry, "telemetry_api.bytes", []string{endpoint}).Submit(float64(successfulCall.PayloadByteSize)) + c.Distribution(transport.NamespaceTelemetry, "telemetry_api.ms", []string{endpoint}).Submit(float64(successfulCall.CallDuration.Milliseconds())) +} -func (e errBadStatus) Error() string { return fmt.Sprintf("bad HTTP response status %d", e) } +func (c *client) AppStart() { + c.flushMapperMu.Lock() + defer c.flushMapperMu.Unlock() + c.flushMapper = mapper.NewAppStartedMapper(c.flushMapper) +} -// scheduleSubmit queues a request to be sent to the backend. Should be called -// with c.mu locked -func (c *client) scheduleSubmit(r *Request) { - c.requests = append(c.requests, r) +func (c *client) AppStop() { + c.flushMapperMu.Lock() + defer c.flushMapperMu.Unlock() + c.flushMapper = mapper.NewAppClosingMapper(c.flushMapper) } -// backgroundHeartbeat is invoked at every heartbeat interval, -// sending the app-heartbeat event and flushing any outstanding -// telemetry messages -func (c *client) backgroundHeartbeat() { - c.mu.Lock() - defer c.mu.Unlock() - if !c.started { - return - } - c.scheduleSubmit(c.newRequest(RequestTypeAppHeartbeat)) - c.flush() - c.heartbeatT.Reset(c.heartbeatInterval) +func (c *client) Close() error { + c.flushTicker.Stop() + return nil } diff --git a/internal/telemetry/client_config.go b/internal/telemetry/client_config.go new file mode 100644 index 0000000000..29bae25984 --- /dev/null +++ b/internal/telemetry/client_config.go @@ -0,0 +1,287 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package telemetry + +import ( + "fmt" + "net/http" + "net/url" + "runtime/debug" + "time" + + globalinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal" +) + +type ClientConfig struct { + // DependencyLoader determines how dependency data is sent via telemetry. + // The default value is [debug.ReadBuildInfo] since Application Security Monitoring uses this data to detect vulnerabilities in the ASM-SCA product + // To disable this feature, please implement a function that returns nil, false. + // This can only be controlled via the env var DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED + DependencyLoader func() (*debug.BuildInfo, bool) + + // MetricsEnabled determines whether metrics are sent via telemetry. + // If false, libraries should not send the generate-metrics or distributions events. + // This can only be controlled via the env var DD_TELEMETRY_METRICS_ENABLED + MetricsEnabled bool + + // LogsEnabled determines whether logs are sent via telemetry. + // This can only be controlled via the env var DD_TELEMETRY_LOG_COLLECTION_ENABLED + LogsEnabled bool + + // AgentlessURL is the full URL to the agentless telemetry endpoint. (optional) + // Defaults to https://instrumentation-telemetry-intake.datadoghq.com/api/v2/apmtelemetry + AgentlessURL string + + // AgentURL is the url of the agent to send telemetry to. (optional) + // If the AgentURL is not set, the telemetry client will not attempt to connect to the agent before sending to the agentless endpoint. + AgentURL string + + // HTTPClient is the http client to use for sending telemetry, defaults to a http.DefaultClient copy. + HTTPClient *http.Client + + // HeartbeatInterval is the interval at which to send a heartbeat payload, defaults to 60s. + // The maximum value is 60s. + HeartbeatInterval time.Duration + + // ExtendedHeartbeatInterval is the interval at which to send an extended heartbeat payload, defaults to 24h. + ExtendedHeartbeatInterval time.Duration + + // FlushInterval is the interval at which the client flushes the data. + // By default, the client will start to Flush at 60s intervals and will reduce the interval based on the load till it hit 15s + // Both values cannot be higher than 60s because the heartbeat need to be sent at least every 60s. Values will be clamped otherwise. + FlushInterval internal.Range[time.Duration] + + // PayloadQueueSize is the size of the payload queue. Default range is [4, 32]. + PayloadQueueSize internal.Range[int] + + // DistributionsSize is the size of the distribution queue. Default range is [2^8, 2^14]. + DistributionsSize internal.Range[int] + + // Debug enables debug mode for the telemetry client and sent it to the backend so it logs the request. The + // DD_TELEMETRY_DEBUG environment variable, when set to a truthy value, overrides this setting. + Debug bool + + // APIKey is the API key to use for sending telemetry to the agentless endpoint. (using DD_API_KEY env var by default) + APIKey string + + // EarlyFlushPayloadSize is the size of the payload that will trigger an early flush. + // This is necessary because backend won't allow bodies larger than 5MB. + // The default value here will be 2MB to take into account the large inaccuracy in estimating the size of bodies + EarlyFlushPayloadSize int + + // MaxDistributionsSize is the maximum number of logs with distinct message, level and tags that can be stored per flush window. + // If the limit is reached, logs will be dropped and a log will be sent to the backend about it + // The default value is 1024. + MaxDistinctLogs int32 + + // internalMetricsEnabled determines whether client stats metrics are sent via telemetry. Default to true. + internalMetricsEnabled bool +} + +var ( + // agentlessURL is the endpoint used to send telemetry in an agentless environment. It is + // also the default URL in case connecting to the agent URL fails. + agentlessURL = "https://instrumentation-telemetry-intake.datadoghq.com/api/v2/apmtelemetry" + + // defaultHeartbeatInterval is the default interval at which the agent sends a heartbeat. + defaultHeartbeatInterval = time.Minute + + // defaultExtendedHeartbeatInterval is the default interval at which the agent sends an extended heartbeat. + defaultExtendedHeartbeatInterval = 24 * time.Hour + + // defaultMinFlushInterval is the default interval at which the client flushes the data. + defaultFlushIntervalRange = internal.Range[time.Duration]{ + Min: 15 * time.Second, + Max: 60 * time.Second, + } + + defaultAuthorizedHearbeatRange = internal.Range[time.Duration]{ + Min: time.Microsecond, + Max: time.Minute, + } + + agentProxyAPIPath = "/telemetry/proxy/api/v2/apmtelemetry" + + defaultEarlyFlushPayloadSize = 2 * 1024 * 1024 // 2MB + + // authorizedPayloadSize.Max is specified by the backend to be 5MB. The goal is to never reach this value otherwise our data will be silently dropped. + authorizedPayloadSize = internal.Range[int]{ + Min: 0, + Max: 5 * 1024 * 1024, // 5MB + } + + // TODO: tweak this value once we get real telemetry data from the telemetry client + // This means that, by default, we incur dataloss if we spend ~30mins without flushing, considering we send telemetry data this looks reasonable. + // This also means that in the worst case scenario, memory-wise, the app is stabilized after running for 30mins. + // Ideally both values should be power of 2 because of the way the ring queue is implemented as it's growing + defaultPayloadQueueSize = internal.Range[int]{ + Min: 4, + Max: 32, + } + + // TODO: tweak this value once we get telemetry data from the telemetry client + // Default max size is a 2^14 array of float64 (2^3 bytes) which makes a distribution 128KB bytes array _at worse_. + // Considering we add a point per user request on a simple http server, we would be losing data after 2^14 requests per minute or about 280 requests per second or under 3ms per request. + // If this throughput is constant, the telemetry client flush ticker speed will increase to, at best, double twice to flush 15 seconds of data each time. + // Which will bring our max throughput to 1100 points per second or about 750µs per request. + distributionsSize = internal.Range[int]{ + Min: 1 << 8, + Max: 1 << 14, + } + + // defaultMaxDistinctLogs is the default maximum number of logs with distinct message, level and tags that can be stored in a flush windows. 1024 per minute is already plenty, it's just to avoid memory leaks. + defaultMaxDistinctLogs = int32(256) +) + +func (config ClientConfig) validateConfig() error { + if config.HeartbeatInterval > time.Minute { + return fmt.Errorf("HeartbeatInterval cannot be higher than 60s, got %v", config.HeartbeatInterval) + } + + if config.FlushInterval.Min > time.Minute || config.FlushInterval.Max > time.Minute { + return fmt.Errorf("FlushIntervalRange cannot be higher than 60s, got Min: %v, Max: %v", config.FlushInterval.Min, config.FlushInterval.Max) + } + + if !config.FlushInterval.IsOrdered() { + return fmt.Errorf("FlushIntervalRange Min cannot be higher than Max, got Min: %v, Max: %v", config.FlushInterval.Min, config.FlushInterval.Max) + } + + if !authorizedPayloadSize.Contains(config.EarlyFlushPayloadSize) { + return fmt.Errorf("EarlyFlushPayloadSize must be between 0 and 5MB, got %v", config.EarlyFlushPayloadSize) + } + + return nil +} + +// defaultConfig returns a ClientConfig with default values set. +func defaultConfig(config ClientConfig) ClientConfig { + config.Debug = config.Debug || globalinternal.BoolEnv("DD_TELEMETRY_DEBUG", false) + + if config.AgentlessURL == "" { + config.AgentlessURL = agentlessURL + } + + if config.APIKey == "" { + config.APIKey = env.Get("DD_API_KEY") + } + + if config.FlushInterval.Min == 0 { + config.FlushInterval.Min = defaultFlushIntervalRange.Min + } else { + config.FlushInterval.Min = defaultAuthorizedHearbeatRange.Clamp(config.FlushInterval.Min) + } + + if config.FlushInterval.Max == 0 { + config.FlushInterval.Max = defaultFlushIntervalRange.Max + } else { + config.FlushInterval.Max = defaultAuthorizedHearbeatRange.Clamp(config.FlushInterval.Max) + } + + heartBeatInterval := defaultHeartbeatInterval + if config.HeartbeatInterval != 0 { + heartBeatInterval = config.HeartbeatInterval + } + + envVal := globalinternal.FloatEnv("DD_TELEMETRY_HEARTBEAT_INTERVAL", heartBeatInterval.Seconds()) + config.HeartbeatInterval = defaultAuthorizedHearbeatRange.Clamp(time.Duration(envVal * float64(time.Second))) + if config.HeartbeatInterval != defaultHeartbeatInterval { + log.Debug("telemetry: using custom heartbeat interval %s", config.HeartbeatInterval) + } + // Make sure we flush at least at each heartbeat interval + config.FlushInterval = config.FlushInterval.ReduceMax(config.HeartbeatInterval) + + if config.HeartbeatInterval == config.FlushInterval.Max { // Since the go ticker is not exact when it comes to the interval, we need to make sure the heartbeat is actually sent + config.HeartbeatInterval = config.HeartbeatInterval - 10*time.Millisecond + } + + if config.DependencyLoader == nil && globalinternal.BoolEnv("DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED", true) { + config.DependencyLoader = debug.ReadBuildInfo + } + + if !config.MetricsEnabled { + config.MetricsEnabled = globalinternal.BoolEnv("DD_TELEMETRY_METRICS_ENABLED", true) + } + + if !config.LogsEnabled { + config.LogsEnabled = globalinternal.BoolEnv("DD_TELEMETRY_LOG_COLLECTION_ENABLED", true) + } + + if !config.internalMetricsEnabled { + config.internalMetricsEnabled = true + } + + if config.EarlyFlushPayloadSize == 0 { + config.EarlyFlushPayloadSize = defaultEarlyFlushPayloadSize + } + + if config.ExtendedHeartbeatInterval == 0 { + config.ExtendedHeartbeatInterval = defaultExtendedHeartbeatInterval + } + + if config.PayloadQueueSize.Min == 0 { + config.PayloadQueueSize.Min = defaultPayloadQueueSize.Min + } + + if config.PayloadQueueSize.Max == 0 { + config.PayloadQueueSize.Max = defaultPayloadQueueSize.Max + } + + if config.DistributionsSize.Min == 0 { + config.DistributionsSize.Min = distributionsSize.Min + } + + if config.DistributionsSize.Max == 0 { + config.DistributionsSize.Max = distributionsSize.Max + } + + if config.MaxDistinctLogs == 0 { + config.MaxDistinctLogs = defaultMaxDistinctLogs + } + + return config +} + +func newWriterConfig(config ClientConfig, tracerConfig internal.TracerConfig) (internal.WriterConfig, error) { + endpoints := make([]*http.Request, 0, 2) + if config.AgentURL != "" { + baseURL, err := url.Parse(config.AgentURL) + if err != nil { + return internal.WriterConfig{}, fmt.Errorf("invalid agent URL: %s", err) + } + + baseURL.Path = agentProxyAPIPath + request, err := http.NewRequest(http.MethodPost, baseURL.String(), nil) + if err != nil { + return internal.WriterConfig{}, fmt.Errorf("failed to create request: %s", err) + } + + endpoints = append(endpoints, request) + } + + if config.AgentlessURL != "" && config.APIKey != "" { + request, err := http.NewRequest(http.MethodPost, config.AgentlessURL, nil) + if err != nil { + return internal.WriterConfig{}, fmt.Errorf("failed to create request: %s", err) + } + + request.Header.Set("DD-API-KEY", config.APIKey) + endpoints = append(endpoints, request) + } + + if len(endpoints) == 0 { + return internal.WriterConfig{}, fmt.Errorf("telemetry: could not build any endpoint, please provide an AgentURL or an APIKey with an optional AgentlessURL") + } + + return internal.WriterConfig{ + TracerConfig: tracerConfig, + Endpoints: endpoints, + HTTPClient: config.HTTPClient, + Debug: config.Debug, + }, nil +} diff --git a/internal/telemetry/client_test.go b/internal/telemetry/client_test.go index 45a1be587e..326cded130 100644 --- a/internal/telemetry/client_test.go +++ b/internal/telemetry/client_test.go @@ -1,451 +1,1553 @@ // Unless explicitly stated otherwise all files in this repository are licensed // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. +// Copyright 2025 Datadog, Inc. package telemetry import ( - "context" + "bytes" "encoding/json" + "errors" + "fmt" + "io" "net/http" - "net/http/httptest" - "reflect" - "sort" - "sync" + "runtime" + "runtime/debug" + "slices" + "strconv" + "strings" + "sync/atomic" "testing" "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/osinfo" + "github.com/DataDog/dd-trace-go/v2/internal/synctest" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) -func TestClient(t *testing.T) { - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - heartbeat := make(chan struct{}) +func TestNewClient(t *testing.T) { + for _, test := range []struct { + name string + tracerConfig internal.TracerConfig + clientConfig ClientConfig + newErr string + }{ + { + name: "nominal", + tracerConfig: internal.TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + clientConfig: ClientConfig{ + AgentURL: "http://localhost:8126/", + }, + }, + { + name: "empty service", + tracerConfig: internal.TracerConfig{}, + newErr: "service name must not be empty", + }, + { + name: "empty agent url", + tracerConfig: internal.TracerConfig{ + Service: "test-service", + }, + clientConfig: ClientConfig{}, + newErr: "could not build any endpoint", + }, + { + name: "invalid agent url", + tracerConfig: internal.TracerConfig{ + Service: "test-service", + }, + clientConfig: ClientConfig{ + AgentURL: "toto_protocol://localhost:8126", + }, + newErr: "invalid agent URL", + }, + { + name: "Too big payload size", + tracerConfig: internal.TracerConfig{ + Service: "test-service", + }, + clientConfig: ClientConfig{ + AgentURL: "http://localhost:8126/", + EarlyFlushPayloadSize: 64 * 1024 * 1024, // 64MB + }, + newErr: "EarlyFlushPayloadSize must be between 0 and 5MB", + }, + } { + t.Run(test.name, func(t *testing.T) { + t.Setenv("DD_API_KEY", "") // In case one is present in the environment... - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - h := r.Header.Get("DD-Telemetry-Request-Type") - if len(h) == 0 { - t.Fatal("didn't get telemetry request type header") - } - if RequestType(h) == RequestTypeAppHeartbeat { - select { - case heartbeat <- struct{}{}: - default: + c, err := NewClient(test.tracerConfig.Service, test.tracerConfig.Env, test.tracerConfig.Version, test.clientConfig) + if err == nil { + defer c.Close() } - } - })) - defer server.Close() - client := &client{ - URL: server.URL, - } - client.mu.Lock() - client.start(nil, NamespaceTracers, true) - client.start(nil, NamespaceTracers, true) // test idempotence - client.mu.Unlock() - defer client.Stop() - - timeout := time.After(30 * time.Second) - select { - case <-timeout: - t.Fatal("Heartbeat took more than 30 seconds. Should have been ~1 second") - case <-heartbeat: + if test.newErr == "" { + require.NoError(t, err) + } else { + require.ErrorContains(t, err, test.newErr) + } + }) } - } -func TestMetrics(t *testing.T) { - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - var ( - mu sync.Mutex - got []Series - ) - closed := make(chan struct{}, 1) - - // we will try to set three metrics that the server must receive - expectedMetrics := 3 - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - rType := RequestType(r.Header.Get("DD-Telemetry-Request-Type")) - if rType != RequestTypeGenerateMetrics { - return - } - req := Body{ - Payload: new(Metrics), - } - dec := json.NewDecoder(r.Body) - err := dec.Decode(&req) - if err != nil { - t.Fatal(err) - } - v, ok := req.Payload.(*Metrics) - if !ok { - t.Fatal("payload set metrics but didn't get metrics") - } - for _, s := range v.Series { - for i, p := range s.Points { - // zero out timestamps - s.Points[i] = [2]float64{0, p[1]} - } - } - mu.Lock() - defer mu.Unlock() - got = append(got, v.Series...) - if len(got) == expectedMetrics { - select { - case closed <- struct{}{}: - default: - } - return - } - })) - defer server.Close() +func TestAutoFlush(t *testing.T) { + t.Parallel() + synctest.Test(t, func(t *testing.T) { + config := defaultConfig(ClientConfig{ + AgentURL: "http://localhost:8126/", + }) + c, err := newClient(internal.TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, config) + require.NoError(t, err) + defer c.Close() - go func() { - client := &client{ - URL: server.URL, - } - client.start(nil, NamespaceTracers, true) - - // Records should have the most recent value - client.Record(NamespaceTracers, MetricKindGauge, "foobar", 1, nil, false) - client.Record(NamespaceTracers, MetricKindGauge, "foobar", 2, nil, false) - // Counts should be aggregated - client.Count(NamespaceTracers, "baz", 3, nil, true) - client.Count(NamespaceTracers, "baz", 1, nil, true) - // Tags should be passed through - client.Count(NamespaceTracers, "bonk", 4, []string{"org:1"}, false) - - client.mu.Lock() - client.flush() - client.mu.Unlock() - }() - - <-closed - - want := []Series{ - {Metric: "baz", Type: "count", Interval: 0, Points: [][2]float64{{0, 4}}, Tags: []string{}, Common: true}, - {Metric: "bonk", Type: "count", Interval: 0, Points: [][2]float64{{0, 4}}, Tags: []string{"org:1"}}, - {Metric: "foobar", Type: "gauge", Interval: 0, Points: [][2]float64{{0, 2}}, Tags: []string{}}, - } - sort.Slice(got, func(i, j int) bool { - return got[i].Metric < got[j].Metric + recordWriter := &internal.RecordWriter{} + + c.flushMu.Lock() + c.writer = recordWriter + c.flushMu.Unlock() + + time.Sleep(config.FlushInterval.Max + time.Second) + + c.flushMu.Lock() + require.Len(t, recordWriter.Payloads(), 1) + c.flushMu.Unlock() }) - if !reflect.DeepEqual(want, got) { - t.Fatalf("want %+v, got %+v", want, got) - } } -func TestDistributionMetrics(t *testing.T) { - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - var ( - mu sync.Mutex - got []DistributionSeries - ) - closed := make(chan struct{}, 1) - - // we will try to set one metric that the server must receive - expectedMetrics := 1 - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - rType := RequestType(r.Header.Get("DD-Telemetry-Request-Type")) - if rType != RequestTypeDistributions { - return - } - req := Body{ - Payload: new(DistributionMetrics), - } - dec := json.NewDecoder(r.Body) - err := dec.Decode(&req) - if err != nil { - t.Fatal(err) - } - v, ok := req.Payload.(*DistributionMetrics) - if !ok { - t.Fatal("payload set metrics but didn't get metrics") - } - mu.Lock() - defer mu.Unlock() - got = append(got, v.Series...) - if len(got) == expectedMetrics { - select { - case closed <- struct{}{}: - default: - } - return - } - })) - defer server.Close() - - go func() { - client := &client{ - URL: server.URL, - } - client.start(nil, NamespaceTracers, true) - // Records should have the most recent value - client.Record(NamespaceTracers, MetricKindDist, "soobar", 1, nil, false) - client.Record(NamespaceTracers, MetricKindDist, "soobar", 3, nil, false) - client.mu.Lock() - client.flush() - client.mu.Unlock() - }() - - <-closed - - want := []DistributionSeries{ - // Distributions do not record metric types since it is its own event - {Metric: "soobar", Points: []float64{3}, Tags: []string{}}, +func TestClientFlush(t *testing.T) { + tracerConfig := internal.TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", } - if !reflect.DeepEqual(want, got) { - t.Fatalf("want %+v, got %+v", want, got) + + type testParams struct { + name string + clientConfig ClientConfig + when func(c *client) + expect func(*testing.T, []transport.Payload) } -} -func TestDisabledClient(t *testing.T) { - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - t.Setenv("DD_INSTRUMENTATION_TELEMETRY_ENABLED", "0") + testcases := []testParams{ + { + name: "heartbeat", + clientConfig: ClientConfig{ + HeartbeatInterval: time.Nanosecond, + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppHeartbeat{}, payload) + assert.Equal(t, payload.RequestType(), transport.RequestTypeAppHeartbeat) + }, + }, + { + name: "extended-heartbeat-config", + clientConfig: ClientConfig{ + ExtendedHeartbeatInterval: time.Nanosecond, + }, + when: func(c *client) { + c.RegisterAppConfig("key", "value", OriginDefault) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - t.Fatal("shouldn't have got any requests") - })) - defer server.Close() + // Make sure the limiter of the heartbeat is triggered + time.Sleep(time.Microsecond) + runtime.Gosched() + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.MessageBatch{}, payload) + batch := payload.(transport.MessageBatch) + require.Len(t, batch, 2) + assert.Equal(t, transport.RequestTypeAppClientConfigurationChange, batch[0].RequestType) + assert.Equal(t, transport.RequestTypeAppExtendedHeartBeat, batch[1].RequestType) - client := &client{ - URL: server.URL, - } - client.start(nil, NamespaceTracers, true) - client.Record(NamespaceTracers, MetricKindGauge, "foobar", 1, nil, false) - client.Count(NamespaceTracers, "bonk", 4, []string{"org:1"}, false) - client.Stop() -} + assert.Len(t, batch[1].Payload.(transport.AppExtendedHeartbeat).Configuration, 0) + }, + }, + { + name: "extended-heartbeat-integrations", + clientConfig: ClientConfig{ + ExtendedHeartbeatInterval: time.Nanosecond, + }, + when: func(c *client) { + c.MarkIntegrationAsLoaded(Integration{Name: "test-integration", Version: "1.0.0"}) -func TestNonStartedClient(t *testing.T) { - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - t.Fatal("shouldn't have got any requests") - })) - defer server.Close() + // Make sure the limiter of the heartbeat is triggered + time.Sleep(time.Microsecond) + runtime.Gosched() + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.MessageBatch{}, payload) + batch := payload.(transport.MessageBatch) + require.Len(t, batch, 2) + assert.Equal(t, transport.RequestTypeAppIntegrationsChange, batch[0].RequestType) + assert.Equal(t, transport.RequestTypeAppExtendedHeartBeat, batch[1].RequestType) + assert.Len(t, batch[1].Payload.(transport.AppExtendedHeartbeat).Integrations, 1) + assert.Equal(t, batch[1].Payload.(transport.AppExtendedHeartbeat).Integrations[0].Name, "test-integration") + assert.Equal(t, batch[1].Payload.(transport.AppExtendedHeartbeat).Integrations[0].Version, "1.0.0") + }, + }, + { + name: "configuration-default", + when: func(c *client) { + c.RegisterAppConfig("key", "value", OriginDefault) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppClientConfigurationChange{}, payload) + config := payload.(transport.AppClientConfigurationChange) + assert.Len(t, config.Configuration, 1) + assert.Equal(t, config.Configuration[0].Name, "key") + assert.Equal(t, config.Configuration[0].Value, "value") + assert.Equal(t, config.Configuration[0].Origin, OriginDefault) + }, + }, + { + name: "configuration-complex-values", + when: func(c *client) { + c.RegisterAppConfigs( + Configuration{Name: "key1", Value: []string{"value1", "value2"}, Origin: OriginDefault}, + Configuration{Name: "key2", Value: map[string]string{"key": "value", "key2": "value2"}, Origin: OriginCode}, + Configuration{Name: "key3", Value: []int{1, 2, 3}, Origin: OriginDDConfig}, + Configuration{Name: "key4", Value: struct { + A string + }{A: "1"}, Origin: OriginEnvVar}, + Configuration{Name: "key5", Value: map[int]struct{ X int }{1: {X: 1}}, Origin: OriginRemoteConfig}, + ) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppClientConfigurationChange{}, payload) + config := payload.(transport.AppClientConfigurationChange) - client := &client{ - URL: server.URL, - } - client.Record(NamespaceTracers, MetricKindGauge, "foobar", 1, nil, false) - client.Count(NamespaceTracers, "bonk", 4, []string{"org:1"}, false) - client.Stop() -} + slices.SortStableFunc(config.Configuration, func(a, b transport.ConfKeyValue) int { + return strings.Compare(a.Name, b.Name) + }) -func TestConcurrentClient(t *testing.T) { - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - var ( - mu sync.Mutex - got []Series - ) - closed := make(chan struct{}, 1) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - t.Log("foo") - req := Body{ - Payload: new(Metrics), - } - dec := json.NewDecoder(r.Body) - err := dec.Decode(&req) - if err != nil { - t.Fatal(err) - } - if req.RequestType != RequestTypeGenerateMetrics { - return - } - v, ok := req.Payload.(*Metrics) - if !ok { - t.Fatal("payload set metrics but didn't get metrics") - } - for _, s := range v.Series { - for i, p := range s.Points { - // zero out timestamps - s.Points[i] = [2]float64{0, p[1]} - } - } - mu.Lock() - defer mu.Unlock() - got = append(got, v.Series...) - select { - case closed <- struct{}{}: - default: - return - } - })) - defer server.Close() + assert.Len(t, config.Configuration, 5) + assert.Equal(t, "key1", config.Configuration[0].Name) + assert.Equal(t, "value1,value2", config.Configuration[0].Value) + assert.Equal(t, OriginDefault, config.Configuration[0].Origin) + assert.Equal(t, "key2", config.Configuration[1].Name) + assert.Equal(t, "key:value,key2:value2", config.Configuration[1].Value) + assert.Equal(t, OriginCode, config.Configuration[1].Origin) + assert.Equal(t, "key3", config.Configuration[2].Name) + assert.Equal(t, "[1 2 3]", config.Configuration[2].Value) + assert.Equal(t, OriginDDConfig, config.Configuration[2].Origin) + assert.Equal(t, "key4", config.Configuration[3].Name) + assert.Equal(t, "{1}", config.Configuration[3].Value) + assert.Equal(t, OriginEnvVar, config.Configuration[3].Origin) + assert.Equal(t, "key5", config.Configuration[4].Name) + assert.Equal(t, "1:{1}", config.Configuration[4].Value) + assert.Equal(t, OriginRemoteConfig, config.Configuration[4].Origin) + }, + }, + { + name: "product-start", + when: func(c *client) { + c.ProductStarted("test-product") + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppProductChange{}, payload) + productChange := payload.(transport.AppProductChange) + assert.Len(t, productChange.Products, 1) + assert.True(t, productChange.Products[Namespace("test-product")].Enabled) + }, + }, + { + name: "product-start-error", + when: func(c *client) { + c.ProductStartError("test-product", errors.New("test-error")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppProductChange{}, payload) + productChange := payload.(transport.AppProductChange) + assert.Len(t, productChange.Products, 1) + assert.False(t, productChange.Products[Namespace("test-product")].Enabled) + assert.Equal(t, "test-error", productChange.Products[Namespace("test-product")].Error.Message) + }, + }, + { + name: "product-stop", + when: func(c *client) { + c.ProductStopped("test-product") + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppProductChange{}, payload) + productChange := payload.(transport.AppProductChange) + assert.Len(t, productChange.Products, 1) + assert.False(t, productChange.Products[Namespace("test-product")].Enabled) + }, + }, + { + name: "integration", + when: func(c *client) { + c.MarkIntegrationAsLoaded(Integration{Name: "test-integration", Version: "1.0.0"}) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppIntegrationChange{}, payload) + integrationChange := payload.(transport.AppIntegrationChange) + assert.Len(t, integrationChange.Integrations, 1) + assert.Equal(t, integrationChange.Integrations[0].Name, "test-integration") + assert.Equal(t, integrationChange.Integrations[0].Version, "1.0.0") + assert.True(t, integrationChange.Integrations[0].Enabled) + }, + }, + { + name: "integration-error", + when: func(c *client) { + c.MarkIntegrationAsLoaded(Integration{Name: "test-integration", Version: "1.0.0", Error: "test-error"}) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppIntegrationChange{}, payload) + integrationChange := payload.(transport.AppIntegrationChange) + assert.Len(t, integrationChange.Integrations, 1) + assert.Equal(t, integrationChange.Integrations[0].Name, "test-integration") + assert.Equal(t, integrationChange.Integrations[0].Version, "1.0.0") + assert.False(t, integrationChange.Integrations[0].Enabled) + assert.Equal(t, integrationChange.Integrations[0].Error, "test-error") + }, + }, + { + name: "product+integration", + when: func(c *client) { + c.ProductStarted("test-product") + c.MarkIntegrationAsLoaded(Integration{Name: "test-integration", Version: "1.0.0"}) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.MessageBatch{}, payload) + batch := payload.(transport.MessageBatch) + assert.Len(t, batch, 2) + for _, payload := range batch { + switch p := payload.Payload.(type) { + case transport.AppProductChange: + assert.Equal(t, transport.RequestTypeAppProductChange, payload.RequestType) + assert.Len(t, p.Products, 1) + assert.True(t, p.Products[Namespace("test-product")].Enabled) + case transport.AppIntegrationChange: + assert.Equal(t, transport.RequestTypeAppIntegrationsChange, payload.RequestType) + assert.Len(t, p.Integrations, 1) + assert.Equal(t, p.Integrations[0].Name, "test-integration") + assert.Equal(t, p.Integrations[0].Version, "1.0.0") + assert.True(t, p.Integrations[0].Enabled) + default: + t.Fatalf("unexpected payload type: %T", p) + } + } + }, + }, + { + name: "product+integration+heartbeat", + clientConfig: ClientConfig{ + HeartbeatInterval: time.Nanosecond, + }, + when: func(c *client) { + c.ProductStarted("test-product") + c.MarkIntegrationAsLoaded(Integration{Name: "test-integration", Version: "1.0.0"}) - go func() { - client := &client{ - URL: server.URL, - } - client.start(nil, NamespaceTracers, true) - defer client.Stop() - - var wg sync.WaitGroup - for i := 0; i < 8; i++ { - wg.Add(1) - go func() { - defer wg.Done() - for j := 0; j < 10; j++ { - client.Count(NamespaceTracers, "foobar", 1, []string{"tag"}, false) + // Make sure the limiter of the heartbeat is triggered + time.Sleep(time.Microsecond) + runtime.Gosched() + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.MessageBatch{}, payload) + batch := payload.(transport.MessageBatch) + assert.Len(t, batch, 3) + for _, payload := range batch { + switch p := payload.Payload.(type) { + case transport.AppProductChange: + assert.Equal(t, transport.RequestTypeAppProductChange, payload.RequestType) + assert.Len(t, p.Products, 1) + assert.True(t, p.Products[Namespace("test-product")].Enabled) + case transport.AppIntegrationChange: + assert.Equal(t, transport.RequestTypeAppIntegrationsChange, payload.RequestType) + assert.Len(t, p.Integrations, 1) + assert.Equal(t, p.Integrations[0].Name, "test-integration") + assert.Equal(t, p.Integrations[0].Version, "1.0.0") + assert.True(t, p.Integrations[0].Enabled) + case transport.AppHeartbeat: + assert.Equal(t, transport.RequestTypeAppHeartbeat, payload.RequestType) + default: + t.Fatalf("unexpected payload type: %T", p) + } } - }() - } - wg.Wait() - }() + }, + }, + { + name: "app-started", + when: func(c *client) { + c.AppStart() + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppStarted{}, payload) + appStart := payload.(transport.AppStarted) + assert.Equal(t, appStart.InstallSignature.InstallID, globalconfig.InstrumentationInstallID()) + assert.Equal(t, appStart.InstallSignature.InstallType, globalconfig.InstrumentationInstallType()) + assert.Equal(t, appStart.InstallSignature.InstallTime, globalconfig.InstrumentationInstallTime()) + }, + }, + { + name: "app-started-with-product", + when: func(c *client) { + c.AppStart() + c.ProductStarted("test-product") + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppStarted{}, payload) + appStart := payload.(transport.AppStarted) + assert.Equal(t, appStart.Products[Namespace("test-product")].Enabled, true) + }, + }, + { + name: "app-started-with-configuration", + when: func(c *client) { + c.AppStart() + c.RegisterAppConfig("key", "value", OriginDefault) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppStarted{}, payload) + appStart := payload.(transport.AppStarted) + require.Len(t, appStart.Configuration, 1) + assert.Equal(t, appStart.Configuration[0].Name, "key") + assert.Equal(t, appStart.Configuration[0].Value, "value") + }, + }, + { + name: "app-started+integrations", + when: func(c *client) { + c.AppStart() + c.MarkIntegrationAsLoaded(Integration{Name: "test-integration", Version: "1.0.0"}) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppStarted{}, payload) + appStart := payload.(transport.AppStarted) + assert.Equal(t, globalconfig.InstrumentationInstallID(), appStart.InstallSignature.InstallID) + assert.Equal(t, globalconfig.InstrumentationInstallType(), appStart.InstallSignature.InstallType) + assert.Equal(t, globalconfig.InstrumentationInstallTime(), appStart.InstallSignature.InstallTime) + + payload = payloads[1] + require.IsType(t, transport.AppIntegrationChange{}, payload) + p := payload.(transport.AppIntegrationChange) + + assert.Len(t, p.Integrations, 1) + assert.Equal(t, p.Integrations[0].Name, "test-integration") + assert.Equal(t, p.Integrations[0].Version, "1.0.0") + }, + }, + { + name: "app-started+heartbeat", + clientConfig: ClientConfig{ + HeartbeatInterval: time.Nanosecond, + }, + when: func(c *client) { + c.AppStart() + + // Make sure the limiter of the heartbeat is triggered + time.Sleep(time.Microsecond) + runtime.Gosched() + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppStarted{}, payload) + appStart := payload.(transport.AppStarted) + assert.Equal(t, globalconfig.InstrumentationInstallID(), appStart.InstallSignature.InstallID) + assert.Equal(t, globalconfig.InstrumentationInstallType(), appStart.InstallSignature.InstallType) + assert.Equal(t, globalconfig.InstrumentationInstallTime(), appStart.InstallSignature.InstallTime) + + payload = payloads[1] + require.IsType(t, transport.AppHeartbeat{}, payload) + }, + }, + { + name: "app-stopped", + when: func(c *client) { + c.AppStop() + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppClosing{}, payload) + }, + }, + { + name: "app-dependencies-loaded", + clientConfig: ClientConfig{ + DependencyLoader: func() (*debug.BuildInfo, bool) { + return &debug.BuildInfo{ + Deps: []*debug.Module{ + {Path: "test", Version: "v1.0.0"}, + {Path: "test2", Version: "v2.0.0"}, + {Path: "test3", Version: "3.0.0"}, + }, + }, true + }, + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppDependenciesLoaded{}, payload) + deps := payload.(transport.AppDependenciesLoaded) + + assert.Len(t, deps.Dependencies, 3) + assert.Equal(t, deps.Dependencies[0].Name, "test") + assert.Equal(t, deps.Dependencies[0].Version, "1.0.0") + assert.Equal(t, deps.Dependencies[1].Name, "test2") + assert.Equal(t, deps.Dependencies[1].Version, "2.0.0") + assert.Equal(t, deps.Dependencies[2].Name, "test3") + assert.Equal(t, deps.Dependencies[2].Version, "3.0.0") + }, + }, + { + name: "app-many-dependencies-loaded", + clientConfig: ClientConfig{ + DependencyLoader: func() (*debug.BuildInfo, bool) { + modules := make([]*debug.Module, 2001) + for i := range modules { + modules[i] = &debug.Module{ + Path: fmt.Sprintf("test-%d", i), + Version: fmt.Sprintf("v%d.0.0", i), + } + } + return &debug.BuildInfo{ + Deps: modules, + }, true + }, + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.AppDependenciesLoaded{}, payload) + deps := payload.(transport.AppDependenciesLoaded) + + if len(deps.Dependencies) != 2000 && len(deps.Dependencies) != 1 { + t.Fatalf("expected 2000 and 1 dependencies, got %d", len(deps.Dependencies)) + } + + if len(deps.Dependencies) == 1 { + assert.Equal(t, deps.Dependencies[0].Name, "test-0") + assert.Equal(t, deps.Dependencies[0].Version, "0.0.0") + return + } + + for i := range deps.Dependencies { + assert.Equal(t, deps.Dependencies[i].Name, fmt.Sprintf("test-%d", i)) + assert.Equal(t, deps.Dependencies[i].Version, fmt.Sprintf("%d.0.0", i)) + } + }, + }, + { + name: "single-log-debug", + when: func(c *client) { + c.Log(NewRecord(LogDebug, "test")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelDebug, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + }, + }, + { + name: "single-log-warn", + when: func(c *client) { + c.Log(NewRecord(LogWarn, "test")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelWarn, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + }, + }, + { + name: "single-log-error", + when: func(c *client) { + c.Log(NewRecord(LogError, "test")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + }, + }, + { + name: "multiple-logs-same-key", + when: func(c *client) { + c.Log(NewRecord(LogError, "test")) + c.Log(NewRecord(LogError, "test")) + c.Log(NewRecord(LogError, "test")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + assert.Equal(t, uint32(3), logs.Logs[0].Count) + }, + }, + { + name: "single-log-with-tag", + when: func(c *client) { + c.Log(NewRecord(LogError, "test"), WithTags([]string{"key:value"})) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + assert.Equal(t, "key:value", logs.Logs[0].Tags) + }, + }, + { + name: "single-log-with-tags", + when: func(c *client) { + c.Log(NewRecord(LogError, "test"), WithTags([]string{"key:value", "key2:value2"})) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + tags := strings.Split(logs.Logs[0].Tags, ",") + assert.Contains(t, tags, "key:value") + assert.Contains(t, tags, "key2:value2") + }, + }, + { + name: "single-log-with-tags-and-without", + when: func(c *client) { + c.Log(NewRecord(LogError, "test"), WithTags([]string{"key:value", "key2:value2"})) + c.Log(NewRecord(LogError, "test")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 2) + + slices.SortStableFunc(logs.Logs, func(i, j transport.LogMessage) int { + return strings.Compare(i.Tags, j.Tags) + }) + + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + assert.Equal(t, uint32(1), logs.Logs[0].Count) + assert.Empty(t, logs.Logs[0].Tags) + + assert.Equal(t, transport.LogLevelError, logs.Logs[1].Level) + assert.Equal(t, "test", logs.Logs[1].Message) + assert.Equal(t, uint32(1), logs.Logs[1].Count) + tags := strings.Split(logs.Logs[1].Tags, ",") + assert.Contains(t, tags, "key:value") + assert.Contains(t, tags, "key2:value2") + }, + }, + { + name: "single-log-with-stacktrace", + when: func(c *client) { + c.Log(NewRecord(LogError, "test"), WithStacktrace()) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + assert.Contains(t, logs.Logs[0].StackTrace, "internal/telemetry/client_test.go") + }, + }, + { + name: "single-log-with-stacktrace-and-tags", + when: func(c *client) { + c.Log(NewRecord(LogError, "test"), WithStacktrace(), WithTags([]string{"key:value", "key2:value2"})) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + assert.Contains(t, logs.Logs[0].StackTrace, "internal/telemetry/client_test.go") + tags := strings.Split(logs.Logs[0].Tags, ",") + assert.Contains(t, tags, "key:value") + assert.Contains(t, tags, "key2:value2") + + }, + }, + { + name: "multiple-logs-different-levels", + when: func(c *client) { + c.Log(NewRecord(LogError, "test")) + c.Log(NewRecord(LogWarn, "test")) + c.Log(NewRecord(LogDebug, "test")) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.Logs{}, payload) + logs := payload.(transport.Logs) + require.Len(t, logs.Logs, 3) + + slices.SortStableFunc(logs.Logs, func(i, j transport.LogMessage) int { + return strings.Compare(string(i.Level), string(j.Level)) + }) + + assert.Equal(t, transport.LogLevelDebug, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) + assert.Equal(t, uint32(1), logs.Logs[0].Count) + assert.Equal(t, transport.LogLevelError, logs.Logs[1].Level) + assert.Equal(t, "test", logs.Logs[1].Message) + assert.Equal(t, uint32(1), logs.Logs[1].Count) + assert.Equal(t, transport.LogLevelWarn, logs.Logs[2].Level) + assert.Equal(t, "test", logs.Logs[2].Message) + assert.Equal(t, uint32(1), logs.Logs[2].Count) + }, + }, + { + name: "simple-count", + when: func(c *client) { + c.Count(NamespaceTracers, "init_time", nil).Submit(1) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 1) + assert.Equal(t, transport.CountMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time", metrics.Series[0].Metric) + assert.Empty(t, metrics.Series[0].Tags) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + assert.Equal(t, 1.0, metrics.Series[0].Points[0][1]) + }, + }, + { + name: "count-multiple-call-same-handle", + when: func(c *client) { + handle1 := c.Count(NamespaceTracers, "init_time", nil) + handle2 := c.Count(NamespaceTracers, "init_time", nil) + + handle2.Submit(1) + handle1.Submit(1) + handle1.Submit(3) + handle2.Submit(2) + handle2.Submit(10) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 1) + assert.Equal(t, transport.CountMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time", metrics.Series[0].Metric) + assert.Empty(t, metrics.Series[0].Tags) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + assert.Equal(t, 17.0, metrics.Series[0].Points[0][1]) + }, + }, + { + name: "multiple-count-by-name", + when: func(c *client) { + c.Count(NamespaceTracers, "init_time_1", nil).Submit(1) + c.Count(NamespaceTracers, "init_time_2", nil).Submit(2) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 2) + + assert.Equal(t, transport.CountMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time_"+strconv.Itoa(int(metrics.Series[0].Points[0][1].(float64))), metrics.Series[0].Metric) + + assert.Empty(t, metrics.Series[0].Tags) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + + assert.Equal(t, transport.CountMetric, metrics.Series[1].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[1].Namespace) + assert.Equal(t, "init_time_"+strconv.Itoa(int(metrics.Series[1].Points[0][1].(float64))), metrics.Series[1].Metric) + assert.Empty(t, metrics.Series[1].Tags) + assert.NotZero(t, metrics.Series[1].Points[0][0]) + }, + }, + { + name: "multiple-count-by-tags", + when: func(c *client) { + c.Count(NamespaceTracers, "init_time", []string{"test:1"}).Submit(1) + c.Count(NamespaceTracers, "init_time", []string{"test:2"}).Submit(2) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 2) + + assert.Equal(t, transport.CountMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time", metrics.Series[0].Metric) + + assert.Contains(t, metrics.Series[0].Tags, "test:"+strconv.Itoa(int(metrics.Series[0].Points[0][1].(float64)))) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + + assert.Equal(t, transport.CountMetric, metrics.Series[1].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[1].Namespace) + assert.Equal(t, "init_time", metrics.Series[1].Metric) + assert.Contains(t, metrics.Series[1].Tags, "test:"+strconv.Itoa(int(metrics.Series[1].Points[0][1].(float64)))) + assert.NotZero(t, metrics.Series[1].Points[0][0]) + }, + }, + { + name: "simple-gauge", + when: func(c *client) { + c.Gauge(NamespaceTracers, "init_time", nil).Submit(1) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 1) + assert.Equal(t, transport.GaugeMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time", metrics.Series[0].Metric) + assert.Empty(t, metrics.Series[0].Tags) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + assert.Equal(t, 1.0, metrics.Series[0].Points[0][1]) + }, + }, + { + name: "multiple-gauge-by-name", + when: func(c *client) { + c.Gauge(NamespaceTracers, "init_time_1", nil).Submit(1) + c.Gauge(NamespaceTracers, "init_time_2", nil).Submit(2) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 2) + + assert.Equal(t, transport.GaugeMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time_"+strconv.Itoa(int(metrics.Series[0].Points[0][1].(float64))), metrics.Series[0].Metric) - <-closed + assert.Empty(t, metrics.Series[0].Tags) + assert.NotZero(t, metrics.Series[0].Points[0][0]) - want := []Series{ - {Metric: "foobar", Type: "count", Points: [][2]float64{{0, 80}}, Tags: []string{"tag"}}, + assert.Equal(t, transport.GaugeMetric, metrics.Series[1].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[1].Namespace) + assert.Equal(t, "init_time_"+strconv.Itoa(int(metrics.Series[1].Points[0][1].(float64))), metrics.Series[1].Metric) + assert.Empty(t, metrics.Series[1].Tags) + assert.NotZero(t, metrics.Series[1].Points[0][0]) + }, + }, + { + name: "multiple-gauge-by-tags", + when: func(c *client) { + c.Gauge(NamespaceTracers, "init_time", []string{"test:1"}).Submit(1) + c.Gauge(NamespaceTracers, "init_time", []string{"test:2"}).Submit(2) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 2) + + assert.Equal(t, transport.GaugeMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time", metrics.Series[0].Metric) + + assert.Contains(t, metrics.Series[0].Tags, "test:"+strconv.Itoa(int(metrics.Series[0].Points[0][1].(float64)))) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + + assert.Equal(t, transport.GaugeMetric, metrics.Series[1].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[1].Namespace) + assert.Equal(t, "init_time", metrics.Series[1].Metric) + assert.Contains(t, metrics.Series[1].Tags, "test:"+strconv.Itoa(int(metrics.Series[1].Points[0][1].(float64)))) + assert.NotZero(t, metrics.Series[1].Points[0][0]) + }, + }, + { + name: "simple-rate", + when: func(c *client) { + handle := c.Rate(NamespaceTracers, "init_time", nil) + handle.Submit(1) + + rate := handle.(*rate) + // So the rate is not +Infinity because the interval is zero + now := rate.intervalStart.Load() + sub := now.Add(-time.Second) + rate.intervalStart.Store(&sub) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, transport.GenerateMetrics{}, payload) + metrics := payload.(transport.GenerateMetrics) + require.Len(t, metrics.Series, 1) + assert.Equal(t, transport.RateMetric, metrics.Series[0].Type) + assert.Equal(t, NamespaceTracers, metrics.Series[0].Namespace) + assert.Equal(t, "init_time", metrics.Series[0].Metric) + assert.Empty(t, metrics.Series[0].Tags) + assert.NotZero(t, metrics.Series[0].Interval) + assert.NotZero(t, metrics.Series[0].Points[0][0]) + assert.LessOrEqual(t, metrics.Series[0].Points[0][1], 1.1) + }, + }, + { + name: "simple-distribution", + when: func(c *client) { + c.Distribution(NamespaceGeneral, "init_time", nil).Submit(1) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, payload, transport.Distributions{}) + distributions := payload.(transport.Distributions) + require.Len(t, distributions.Series, 1) + assert.Equal(t, NamespaceGeneral, distributions.Series[0].Namespace) + assert.Equal(t, "init_time", distributions.Series[0].Metric) + assert.Empty(t, distributions.Series[0].Tags) + require.Len(t, distributions.Series[0].Points, 1) + assert.Equal(t, 1.0, distributions.Series[0].Points[0]) + }, + }, + { + name: "multiple-distribution-by-name", + when: func(c *client) { + c.Distribution(NamespaceTracers, "init_time_1", nil).Submit(1) + c.Distribution(NamespaceTracers, "init_time_2", nil).Submit(2) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, payload, transport.Distributions{}) + distributions := payload.(transport.Distributions) + require.Len(t, distributions.Series, 2) + + assert.Equal(t, "init_time_"+strconv.Itoa(int(distributions.Series[0].Points[0])), distributions.Series[0].Metric) + assert.Equal(t, "init_time_"+strconv.Itoa(int(distributions.Series[1].Points[0])), distributions.Series[1].Metric) + }, + }, + { + name: "multiple-distribution-by-tags", + when: func(c *client) { + c.Distribution(NamespaceTracers, "init_time", []string{"test:1"}).Submit(1) + c.Distribution(NamespaceTracers, "init_time", []string{"test:2"}).Submit(2) + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, payload, transport.Distributions{}) + distributions := payload.(transport.Distributions) + require.Len(t, distributions.Series, 2) + + assert.Contains(t, distributions.Series[0].Tags, "test:"+strconv.Itoa(int(distributions.Series[0].Points[0]))) + assert.Contains(t, distributions.Series[1].Tags, "test:"+strconv.Itoa(int(distributions.Series[1].Points[0]))) + }, + }, + { + name: "distribution-overflow", + when: func(c *client) { + handler := c.Distribution(NamespaceGeneral, "init_time", nil) + for i := 0; i < 1<<16; i++ { + handler.Submit(float64(i)) + } + }, + expect: func(t *testing.T, payloads []transport.Payload) { + payload := payloads[0] + require.IsType(t, payload, transport.Distributions{}) + distributions := payload.(transport.Distributions) + require.Len(t, distributions.Series, 1) + assert.Equal(t, NamespaceGeneral, distributions.Series[0].Namespace) + assert.Equal(t, "init_time", distributions.Series[0].Metric) + assert.Empty(t, distributions.Series[0].Tags) + + // Should not contain the first passed point + assert.NotContains(t, distributions.Series[0].Points, 0.0) + }, + }, } - sort.Slice(got, func(i, j int) bool { - return got[i].Metric < got[j].Metric - }) - if !reflect.DeepEqual(want, got) { - t.Fatalf("want %+v, got %+v", want, got) + + for _, test := range testcases { + t.Run(test.name, func(t *testing.T) { + t.Parallel() + config := defaultConfig(test.clientConfig) + config.AgentURL = "http://localhost:8126/" + config.DependencyLoader = test.clientConfig.DependencyLoader // Don't use the default dependency loader + config.internalMetricsEnabled = test.clientConfig.internalMetricsEnabled // only enabled internal metrics when explicitly set + config.internalMetricsEnabled = false + config.FlushInterval = internal.Range[time.Duration]{Min: time.Hour, Max: time.Hour} + c, err := newClient(tracerConfig, config) + require.NoError(t, err) + t.Cleanup(func() { + c.Close() + }) + + recordWriter := &internal.RecordWriter{} + c.writer = recordWriter + + if test.when != nil { + test.when(c) + } + c.Flush() + + payloads := recordWriter.Payloads() + require.LessOrEqual(t, 1, len(payloads)) + test.expect(t, payloads) + }) } } -// fakeAgentless is a helper function for TestAgentlessRetry. It replaces the agentless -// endpoint in the telemetry package with a custom server URL and returns -// 1. a function that waits for a telemetry request to that server -// 2. a cleanup function that closes the server and resets the agentless endpoint to -// its original value -func fakeAgentless(ctx context.Context, t *testing.T) (wait func(), cleanup func()) { - received := make(chan struct{}, 1) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("DD-Telemetry-Request-Type") == string(RequestTypeAppStarted) { - select { - case received <- struct{}{}: - default: - } - } - })) - prevEndpoint := SetAgentlessEndpoint(server.URL) - return func() { - select { - case <-ctx.Done(): - t.Fatalf("fake agentless endpoint timed out waiting for telemetry") - case <-received: - return - } - }, func() { - server.Close() - SetAgentlessEndpoint(prevEndpoint) - } +func TestMetricsDisabled(t *testing.T) { + t.Setenv("DD_TELEMETRY_METRICS_ENABLED", "false") + + c, err := NewClient("test-service", "test-env", "1.0.0", ClientConfig{AgentURL: "http://localhost:8126/"}) + require.NoError(t, err) + + recordWriter := &internal.RecordWriter{} + c.(*client).writer = recordWriter + + defer c.Close() + + assert.NotNil(t, c.Gauge(NamespaceTracers, "init_time", nil)) + assert.NotNil(t, c.Count(NamespaceTracers, "init_time", nil)) + assert.NotNil(t, c.Rate(NamespaceTracers, "init_time", nil)) + assert.NotNil(t, c.Distribution(NamespaceGeneral, "init_time", nil)) + + c.Flush() + + payloads := recordWriter.Payloads() + require.Len(t, payloads, 0) } -// TestAgentlessRetry tests the behavior of the telemetry client in the case where -// the client cannot connect to the agent. The client should re-try the request -// with the agentless endpoint. -func TestAgentlessRetry(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() +type testRoundTripper struct { + t *testing.T + roundTrip func(*http.Request) (*http.Response, error) + bodies []transport.Body +} - waitAgentlessEndpoint, cleanup := fakeAgentless(ctx, t) - defer cleanup() +func (t *testRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + defer req.Body.Close() + body, err := io.ReadAll(req.Body) + require.NoError(t.t, err) + req.Body = io.NopCloser(bytes.NewReader(body)) + t.bodies = append(t.bodies, parseRequest(t.t, req.Header, body)) + return t.roundTrip(req) +} - brokenServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - })) - brokenServer.Close() +func parseRequest(t *testing.T, headers http.Header, raw []byte) transport.Body { + t.Helper() - client := &client{ - URL: brokenServer.URL, - } - client.start(nil, NamespaceTracers, true) - waitAgentlessEndpoint() + assert.Equal(t, "v2", headers.Get("DD-Telemetry-API-Version")) + assert.Equal(t, "application/json", headers.Get("Content-Type")) + assert.Equal(t, "go", headers.Get("DD-Client-Library-Language")) + assert.Equal(t, "test-env", headers.Get("DD-Agent-Env")) + assert.Equal(t, version.Tag, headers.Get("DD-Client-Library-Version")) + assert.Equal(t, globalconfig.InstrumentationInstallID(), headers.Get("DD-Agent-Install-Id")) + assert.Equal(t, globalconfig.InstrumentationInstallType(), headers.Get("DD-Agent-Install-Type")) + assert.Equal(t, globalconfig.InstrumentationInstallTime(), headers.Get("DD-Agent-Install-Time")) + + assert.NotEmpty(t, headers.Get("DD-Agent-Hostname")) + + var body transport.Body + require.NoError(t, json.Unmarshal(raw, &body)) + + assert.Equal(t, string(body.RequestType), headers.Get("DD-Telemetry-Request-Type")) + assert.Equal(t, "test-service", body.Application.ServiceName) + assert.Equal(t, "test-env", body.Application.Env) + assert.Equal(t, "1.0.0", body.Application.ServiceVersion) + assert.Equal(t, "go", body.Application.LanguageName) + assert.Equal(t, runtime.Version(), body.Application.LanguageVersion) + + assert.NotEmpty(t, body.Host.Hostname) + assert.Equal(t, osinfo.OSName(), body.Host.OS) + assert.Equal(t, osinfo.OSVersion(), body.Host.OSVersion) + assert.Equal(t, osinfo.Architecture(), body.Host.Architecture) + assert.Equal(t, osinfo.KernelName(), body.Host.KernelName) + assert.Equal(t, osinfo.KernelRelease(), body.Host.KernelRelease) + assert.Equal(t, osinfo.KernelVersion(), body.Host.KernelVersion) + + assert.Equal(t, "v2", body.APIVersion) + assert.NotZero(t, body.TracerTime) + assert.LessOrEqual(t, int64(1), body.SeqID) + assert.Equal(t, globalconfig.RuntimeID(), body.RuntimeID) + + return body } -func TestCollectDependencies(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - received := make(chan *Dependencies) - - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("DD-Telemetry-Request-Type") == string(RequestTypeDependenciesLoaded) { - var body Body - body.Payload = new(Dependencies) - err := json.NewDecoder(r.Body).Decode(&body) - if err != nil { - t.Errorf("bad body: %s", err) - } - select { - case received <- body.Payload.(*Dependencies): - default: - } - } - })) - defer server.Close() - client := &client{ - URL: server.URL, - } - client.start(nil, NamespaceTracers, true) - select { - case <-received: - case <-ctx.Done(): - t.Fatalf("Timed out waiting for dependency payload") +func TestClientEnd2End(t *testing.T) { + tracerConfig := internal.TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", } -} -func Test_heartbeatInterval(t *testing.T) { - defaultInterval := time.Second * time.Duration(defaultHeartbeatInterval) - tests := []struct { - name string - setup func(t *testing.T) - want time.Duration + for _, test := range []struct { + name string + when func(*client) + roundtrip func(*testing.T, *http.Request) (*http.Response, error) + expect func(*testing.T, []transport.Body) }{ { - name: "default", - setup: func(t *testing.T) {}, - want: defaultInterval, + name: "app-start", + when: func(c *client) { + c.AppStart() + }, + expect: func(t *testing.T, bodies []transport.Body) { + require.Len(t, bodies, 1) + assert.Equal(t, transport.RequestTypeAppStarted, bodies[0].RequestType) + }, }, { - name: "float", - setup: func(t *testing.T) { t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "0.2") }, - want: time.Millisecond * 200, + name: "app-stop", + when: func(c *client) { + c.AppStop() + }, + expect: func(t *testing.T, bodies []transport.Body) { + require.Len(t, bodies, 1) + assert.Equal(t, transport.RequestTypeAppClosing, bodies[0].RequestType) + }, }, { - name: "integer", - setup: func(t *testing.T) { t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "2") }, - want: time.Second * 2, + name: "app-start+app-stop", + when: func(c *client) { + c.AppStart() + c.AppStop() + }, + expect: func(t *testing.T, bodies []transport.Body) { + require.Len(t, bodies, 2) + assert.Equal(t, transport.RequestTypeAppStarted, bodies[0].RequestType) + assert.Equal(t, transport.RequestTypeAppClosing, bodies[1].RequestType) + }, }, { - name: "negative", - setup: func(t *testing.T) { t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "-1") }, - want: defaultInterval, + name: "message-batch", + when: func(c *client) { + c.RegisterAppConfig("key", "value", OriginCode) + c.ProductStarted(NamespaceAppSec) + }, + expect: func(t *testing.T, bodies []transport.Body) { + require.Len(t, bodies, 1) + assert.Equal(t, transport.RequestTypeMessageBatch, bodies[0].RequestType) + batch := bodies[0].Payload.(transport.MessageBatch) + require.Len(t, batch, 2) + assert.Equal(t, transport.RequestTypeAppProductChange, batch[0].RequestType) + assert.Equal(t, transport.RequestTypeAppClientConfigurationChange, batch[1].RequestType) + }, }, { - name: "zero", - setup: func(t *testing.T) { t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "0") }, - want: defaultInterval, + name: "fail-agent-endpoint", + when: func(c *client) { + c.AppStart() + }, + roundtrip: func(_ *testing.T, req *http.Request) (*http.Response, error) { + if strings.Contains(req.URL.Host, "localhost") { + return nil, errors.New("failed") + } + return &http.Response{StatusCode: http.StatusOK}, nil + }, + expect: func(t *testing.T, bodies []transport.Body) { + require.Len(t, bodies, 2) + require.Equal(t, transport.RequestTypeAppStarted, bodies[0].RequestType) + require.Equal(t, transport.RequestTypeAppStarted, bodies[1].RequestType) + }, }, { - name: "long", - setup: func(t *testing.T) { t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "4000") }, - want: defaultInterval, + name: "fail-all-endpoint", + when: func(c *client) { + c.AppStart() + }, + roundtrip: func(_ *testing.T, _ *http.Request) (*http.Response, error) { + return nil, errors.New("failed") + }, + expect: func(t *testing.T, bodies []transport.Body) { + require.Len(t, bodies, 2) + require.Equal(t, transport.RequestTypeAppStarted, bodies[0].RequestType) + require.Equal(t, transport.RequestTypeAppStarted, bodies[1].RequestType) + }, + }, + } { + t.Run(test.name, func(t *testing.T) { + t.Parallel() + rt := &testRoundTripper{ + t: t, + roundTrip: func(req *http.Request) (*http.Response, error) { + if test.roundtrip != nil { + return test.roundtrip(t, req) + } + return &http.Response{StatusCode: http.StatusOK}, nil + }, + } + clientConfig := ClientConfig{ + AgentURL: "http://localhost:8126/", + APIKey: "apikey", + HTTPClient: &http.Client{ + Timeout: 5 * time.Second, + Transport: rt, + }, + Debug: true, + } + + clientConfig = defaultConfig(clientConfig) + clientConfig.DependencyLoader = nil + + c, err := newClient(tracerConfig, clientConfig) + require.NoError(t, err) + defer c.Close() + + test.when(c) + c.Flush() + test.expect(t, rt.bodies) + }) + } +} + +func TestHeartBeatInterval(t *testing.T) { + startTime := time.Now() + payloadtimes := make([]time.Duration, 0, 32) + c, err := NewClient("test-service", "test-env", "1.0.0", ClientConfig{ + AgentURL: "http://localhost:8126/", + HeartbeatInterval: 2 * time.Second, + HTTPClient: &http.Client{ + Timeout: 5 * time.Second, + Transport: &testRoundTripper{ + t: t, + roundTrip: func(_ *http.Request) (*http.Response, error) { + payloadtimes = append(payloadtimes, time.Since(startTime)) + startTime = time.Now() + return &http.Response{ + StatusCode: http.StatusOK, + }, nil + }, + }, }, + }) + require.NoError(t, err) + defer c.Close() + + for i := 0; i < 10; i++ { + c.Log(NewRecord(LogError, "test")) + time.Sleep(1 * time.Second) } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - tt.setup(t) - assert.Equal(t, tt.want, heartbeatInterval()) + + // 10 seconds have passed, we should have sent 5 heartbeats + + c.Flush() + c.Close() + + require.InDelta(t, 5, len(payloadtimes), 1) + sum := 0.0 + for _, d := range payloadtimes { + sum += d.Seconds() + } + + assert.InDelta(t, 2, sum/5, 0.1) +} + +func TestSendingFailures(t *testing.T) { + cfg := ClientConfig{ + AgentURL: "http://localhost:8126/", + HTTPClient: &http.Client{ + Timeout: 5 * time.Second, + Transport: &testRoundTripper{ + t: t, + roundTrip: func(_ *http.Request) (*http.Response, error) { + return nil, errors.New("failed") + }, + }, + }, + } + + c, err := newClient(internal.TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, defaultConfig(cfg)) + + require.NoError(t, err) + defer c.Close() + + c.Log(NewRecord(LogError, "test")) + c.Flush() + + require.False(t, c.payloadQueue.IsEmpty()) + payload := c.payloadQueue.ReversePeek() + require.NotNil(t, payload) + + assert.Equal(t, transport.RequestTypeLogs, payload.RequestType()) + logs := payload.(transport.Logs) + assert.Len(t, logs.Logs, 1) + assert.Equal(t, transport.LogLevelError, logs.Logs[0].Level) + assert.Equal(t, "test", logs.Logs[0].Message) +} + +func BenchmarkLogs(b *testing.B) { + clientConfig := ClientConfig{ + HeartbeatInterval: time.Hour, + ExtendedHeartbeatInterval: time.Hour, + AgentURL: "http://localhost:8126/", + HTTPClient: &http.Client{ + Timeout: 5 * time.Second, + Transport: noopTransport{}, + }, + } + + b.Run("simple", func(b *testing.B) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + c.Log(NewRecord(LogDebug, "this is supposed to be a DEBUG log of representative length with a variable message: "+strconv.Itoa(i%10))) + } + }) + + b.Run("with-tags", func(b *testing.B) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + c.Log(NewRecord(LogWarn, "this is supposed to be a WARN log of representative length"), WithTags([]string{"key:" + strconv.Itoa(i%10)})) + } + }) + + b.Run("with-stacktrace", func(b *testing.B) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + c.Log(NewRecord(LogError, "this is supposed to be a ERROR log of representative length"), WithStacktrace()) + } + }) +} + +type noopTransport struct{} + +func (noopTransport) RoundTrip(*http.Request) (*http.Response, error) { + return &http.Response{StatusCode: http.StatusOK}, nil +} + +func BenchmarkParallelLogs(b *testing.B) { + b.ReportAllocs() + nbGoroutines := 5 * runtime.NumCPU() + + clientConfig := ClientConfig{ + HeartbeatInterval: time.Hour, + ExtendedHeartbeatInterval: time.Hour, + FlushInterval: internal.Range[time.Duration]{Min: time.Second, Max: time.Second}, + AgentURL: "http://localhost:8126/", + + // Empty transport to avoid sending data to the agent + HTTPClient: &http.Client{ + Timeout: 5 * time.Second, + Transport: noopTransport{}, + }, + } + + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + b.SetParallelism(nbGoroutines) + + var i atomic.Int64 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + i := int(i.Add(1)) % nbGoroutines + c.Log(NewRecord(LogDebug, "this is supposed to be a DEBUG log of representative length"+strconv.Itoa(i)), WithTags([]string{"key:" + strconv.Itoa(i)})) + } + }) +} + +func benchMetrics(b *testing.B, getHandle, reusedHandle func(*testing.B, func(Client, string) MetricHandle)) { + for _, bc := range []struct { + name string + newMetric func(Client, string) MetricHandle + }{ + {"count", func(c Client, name string) MetricHandle { return c.Count(NamespaceGeneral, name, []string{"test:1"}) }}, + {"gauge", func(c Client, name string) MetricHandle { return c.Gauge(NamespaceGeneral, name, []string{"test:1"}) }}, + {"rate", func(c Client, name string) MetricHandle { return c.Rate(NamespaceGeneral, name, []string{"test:1"}) }}, + {"distribution", func(c Client, name string) MetricHandle { + return c.Distribution(NamespaceGeneral, name, []string{"test:1"}) + }}, + } { + b.Run(bc.name, func(b *testing.B) { + b.Run("get-handle", func(b *testing.B) { + getHandle(b, bc.newMetric) + }) + + b.Run("handle-reused", func(b *testing.B) { + reusedHandle(b, bc.newMetric) + }) }) } } -func TestNoEmptyHeaders(t *testing.T) { - c := &client{} - req := c.newRequest(RequestTypeAppStarted) - assertNotEmpty := func(header string) { - headers := *req.Header - vals := headers[header] - for _, v := range vals { - assert.NotEmpty(t, v, "%s header should not be empty", header) +func BenchmarkMetrics(b *testing.B) { + clientConfig := ClientConfig{ + Debug: true, + HeartbeatInterval: time.Hour, + ExtendedHeartbeatInterval: time.Hour, + FlushInterval: internal.Range[time.Duration]{Min: time.Second, Max: time.Second}, + AgentURL: "http://localhost:8126/", + + // Empty transport to avoid sending data to the agent + HTTPClient: &http.Client{ + Transport: noopTransport{}, + }, + } + + benchMetrics(b, func(b *testing.B, f func(Client, string) MetricHandle) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + f(c, "init_time").Submit(1) } + }, func(b *testing.B, f func(Client, string) MetricHandle) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + handle := f(c, "init_time") + for i := 0; i < b.N; i++ { + handle.Submit(1) + } + }) +} + +func BenchmarkParallelMetrics(b *testing.B) { + nbGoroutines := 5 * runtime.NumCPU() + clientConfig := ClientConfig{ + Debug: true, + HeartbeatInterval: time.Hour, + ExtendedHeartbeatInterval: time.Hour, + FlushInterval: internal.Range[time.Duration]{Min: time.Second, Max: time.Second}, + AgentURL: "http://localhost:8126/", + + // Empty transport to avoid sending data to the agent + HTTPClient: &http.Client{ + Transport: noopTransport{}, + }, } - assertNotEmpty("Datadog-Container-ID") - assertNotEmpty("Datadog-Entity-ID") + + benchMetrics(b, func(b *testing.B, metric func(Client, string) MetricHandle) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + b.SetParallelism(nbGoroutines) + + var i atomic.Int64 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + metricName := "init_time_" + strconv.Itoa(int(i.Add(1))%nbGoroutines) + metric(c, metricName).Submit(1) + } + }) + }, func(b *testing.B, metric func(Client, string) MetricHandle) { + b.ReportAllocs() + c, err := NewClient("test-service", "test-env", "1.0.0", clientConfig) + require.NoError(b, err) + + b.Cleanup(func() { + c.Flush() + c.Close() + }) + + b.ResetTimer() + b.SetParallelism(nbGoroutines) + + handles := make([]MetricHandle, nbGoroutines) + for i := 0; i < nbGoroutines; i++ { + handles[i] = metric(c, "init_time_"+strconv.Itoa(i)) + } + + var i atomic.Int32 + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + handles[int(i.Add(1))%nbGoroutines].Submit(1) + } + }) + }) } diff --git a/internal/telemetry/configuration.go b/internal/telemetry/configuration.go new file mode 100644 index 0000000000..ed5668f77a --- /dev/null +++ b/internal/telemetry/configuration.go @@ -0,0 +1,187 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "encoding/json" + "fmt" + "math" + "reflect" + "slices" + "strings" + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type configuration struct { + mu sync.Mutex + config map[string]transport.ConfKeyValue + seqID uint64 +} + +func idOrEmpty(id string) string { + if id == EmptyID { + return "" + } + return id +} + +func (c *configuration) Add(kv Configuration) { + c.mu.Lock() + defer c.mu.Unlock() + + if c.config == nil { + c.config = make(map[string]transport.ConfKeyValue) + } + + ID := idOrEmpty(kv.ID) + + c.config[kv.Name] = transport.ConfKeyValue{ + Name: kv.Name, + Value: kv.Value, + Origin: kv.Origin, + ID: ID, + } +} + +func (c *configuration) Payload() transport.Payload { + c.mu.Lock() + defer c.mu.Unlock() + if len(c.config) == 0 { + return nil + } + + configs := make([]transport.ConfKeyValue, len(c.config)) + idx := 0 + for _, conf := range c.config { + if conf.Origin == "" { + conf.Origin = transport.OriginDefault + } + conf.Value = SanitizeConfigValue(conf.Value) + conf.SeqID = c.seqID + configs[idx] = conf + idx++ + c.seqID++ + delete(c.config, conf.Name) + } + + return transport.AppClientConfigurationChange{ + Configuration: configs, + } +} + +// SanitizeConfigValue sanitizes the value of a configuration key to ensure it can be marshalled. +func SanitizeConfigValue(value any) any { + if value == nil { + return "" + } + + // Skip reflection for basic types + switch val := value.(type) { + case string, bool, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return val + case float32: + if math.IsNaN(float64(val)) || math.IsInf(float64(val), 0) { + return "" + } + return val + case float64: + // https://github.com/golang/go/issues/59627 + if math.IsNaN(val) || math.IsInf(val, 0) { + return nil + } + return val + case []string: + return strings.Join(val, ",") // Retro compatibility with old code + } + + if _, ok := value.(json.Marshaler); ok { + return value + } + + if v, ok := value.(fmt.Stringer); ok { + return v.String() + } + + valueOf := reflect.ValueOf(value) + + // Unwrap pointers and interfaces up to 10 levels deep. + for i := 0; i < 10; i++ { + if valueOf.Kind() == reflect.Ptr || valueOf.Kind() == reflect.Interface { + valueOf = valueOf.Elem() + } else { + break + } + } + + switch { + case valueOf.Kind() == reflect.Slice, valueOf.Kind() == reflect.Array: + var sb strings.Builder + sb.WriteString("[") + for i := 0; i < valueOf.Len(); i++ { + if i > 0 { + sb.WriteString(" ") + } + sb.WriteString(fmt.Sprintf("%v", valueOf.Index(i).Interface())) + } + sb.WriteString("]") + return sb.String() + case valueOf.Kind() == reflect.Map: + kvPair := make([]struct { + key string + value string + }, valueOf.Len()) + + iter := valueOf.MapRange() + for i := 0; iter.Next(); i++ { + kvPair[i].key = fmt.Sprintf("%v", iter.Key().Interface()) + kvPair[i].value = fmt.Sprintf("%v", iter.Value().Interface()) + } + + slices.SortStableFunc(kvPair, func(a, b struct { + key string + value string + }) int { + return strings.Compare(a.key, b.key) + }) + + var sb strings.Builder + for _, k := range kvPair { + if sb.Len() > 0 { + sb.WriteString(",") + } + sb.WriteString(k.key) + sb.WriteString(":") + sb.WriteString(k.value) + } + + return sb.String() + } + + return fmt.Sprintf("%v", value) +} + +func EnvToTelemetryName(env string) string { + switch env { + case "DD_TRACE_DEBUG": + return "trace_debug_enabled" + case "DD_APM_TRACING_ENABLED": + return "apm_tracing_enabled" + case "DD_RUNTIME_METRICS_ENABLED": + return "runtime_metrics_enabled" + case "DD_DATA_STREAMS_ENABLED": + return "data_streams_enabled" + case "DD_APPSEC_ENABLED": + return "appsec_enabled" + case "DD_DYNAMIC_INSTRUMENTATION_ENABLED": + return "dynamic_instrumentation_enabled" + case "DD_PROFILING_ENABLED": + return "profiling_enabled" + default: + return env + } +} diff --git a/internal/telemetry/dependencies.go b/internal/telemetry/dependencies.go new file mode 100644 index 0000000000..1f105d3b2a --- /dev/null +++ b/internal/telemetry/dependencies.go @@ -0,0 +1,94 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "runtime/debug" + "strings" + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type dependencies struct { + DependencyLoader func() (*debug.BuildInfo, bool) + + once sync.Once + + mu sync.Mutex + payloads []transport.Payload +} + +func (d *dependencies) Payload() transport.Payload { + d.once.Do(func() { + deps := d.loadDeps() + // Requirement described here: + // https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/producing-telemetry.md#app-dependencies-loaded + const maxPerPayload = 2000 + if len(deps) > maxPerPayload { + log.Debug("telemetry: too many (%d) dependencies to send, sending over multiple bodies", len(deps)) + } + + for i := 0; i < len(deps); i += maxPerPayload { + end := min(i+maxPerPayload, len(deps)) + + d.payloads = append(d.payloads, transport.AppDependenciesLoaded{ + Dependencies: deps[i:end], + }) + } + }) + + d.mu.Lock() + defer d.mu.Unlock() + + if len(d.payloads) == 0 { + return nil + } + + // return payloads one by one + payloadZero := d.payloads[0] + if len(d.payloads) == 1 { + d.payloads = nil + } + + if len(d.payloads) > 1 { + d.payloads = d.payloads[1:] + } + + return payloadZero +} + +// loadDeps returns the dependencies from the DependencyLoader, formatted for telemetry intake. +func (d *dependencies) loadDeps() []transport.Dependency { + if d.DependencyLoader == nil { + return nil + } + + deps, ok := d.DependencyLoader() + if !ok { + log.Debug("telemetry: could not read build info, no dependencies will be reported") + return nil + } + + transportDeps := make([]transport.Dependency, 0, len(deps.Deps)) + for _, dep := range deps.Deps { + if dep == nil { + continue + } + + if dep.Replace != nil && dep.Replace.Version != "" { + dep = dep.Replace + } + + transportDeps = append(transportDeps, transport.Dependency{ + Name: dep.Path, + Version: strings.TrimPrefix(dep.Version, "v"), + }) + } + + return transportDeps +} diff --git a/internal/telemetry/distributions.go b/internal/telemetry/distributions.go new file mode 100644 index 0000000000..b95ed1dcd3 --- /dev/null +++ b/internal/telemetry/distributions.go @@ -0,0 +1,94 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "fmt" + "sync" + + "github.com/puzpuzpuz/xsync/v3" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type distributions struct { + store *xsync.MapOf[metricKey, *distribution] + pool *internal.SyncPool[[]float64] + queueSize internal.Range[int] + skipAllowlist bool // Debugging feature to skip the allowlist of known metrics +} + +// LoadOrStore returns a MetricHandle for the given distribution metric. If the metric key does not exist, it will be created. +func (d *distributions) LoadOrStore(namespace Namespace, name string, tags []string) MetricHandle { + kind := transport.DistMetric + key := newMetricKey(namespace, kind, name, tags) + handle, loaded := d.store.LoadOrCompute(key, func() *distribution { + return &distribution{ + key: key, + values: internal.NewRingQueueWithPool[float64](d.queueSize, d.pool), + } + }) + if !loaded && !d.skipAllowlist { // The metric is new: validate and log issues about it + if err := validateMetricKey(namespace, kind, name, tags); err != nil { + log.Warn("telemetry: %s", err.Error()) + } + } + + return handle +} + +func (d *distributions) Payload() transport.Payload { + series := make([]transport.DistributionSeries, 0, d.store.Size()) + d.store.Range(func(_ metricKey, handle *distribution) bool { + if payload := handle.payload(); payload.Namespace != "" { + series = append(series, payload) + } + return true + }) + + if len(series) == 0 { + return nil + } + + return transport.Distributions{Series: series, SkipAllowlist: d.skipAllowlist} +} + +type distribution struct { + key metricKey + values *internal.RingQueue[float64] + + logLoss sync.Once +} + +func (d *distribution) Submit(value float64) { + if !d.values.Enqueue(value) { + d.logLoss.Do(func() { + log.Debug("telemetry: distribution %q is losing values because the buffer is full", d.key.name) + Log(NewRecord(LogWarn, fmt.Sprintf("telemetry: distribution %s is losing values because the buffer is full", d.key)), WithStacktrace()) + }) + } +} + +func (d *distribution) Get() float64 { + return d.values.ReversePeek() +} + +func (d *distribution) payload() transport.DistributionSeries { + if d.values.IsEmpty() { + return transport.DistributionSeries{} + } + + return transport.DistributionSeries{ + Metric: d.key.name, + Namespace: d.key.namespace, + Tags: d.key.SplitTags(), + Common: knownmetrics.IsCommonMetric(d.key.namespace, d.key.kind, d.key.name), + Points: d.values.Flush(), + } +} diff --git a/internal/telemetry/globalclient.go b/internal/telemetry/globalclient.go new file mode 100644 index 0000000000..712c4ce294 --- /dev/null +++ b/internal/telemetry/globalclient.go @@ -0,0 +1,273 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package telemetry + +import ( + "sync" + "sync/atomic" + + "github.com/puzpuzpuz/xsync/v3" + + globalinternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +var ( + globalClient atomic.Pointer[Client] + + // globalClientRecorder contains all actions done on the global client done before StartApp() with an actual client object is called + globalClientRecorder = internal.NewRecorder[Client]() + + // metricsHandleSwappablePointers contains all the swappableMetricHandle, used to replay actions done before the actual MetricHandle is set + metricsHandleSwappablePointers = xsync.NewMapOf[metricKey, *swappableMetricHandle](xsync.WithPresize(knownmetrics.Size())) +) + +// GlobalClient returns the global telemetry client. +func GlobalClient() Client { + client := globalClient.Load() + if client == nil { + return nil + } + return *client +} + +// StartApp starts the telemetry client with the given client send the app-started telemetry and sets it as the global (*client) +// then calls client.Flush on the client asynchronously. +func StartApp(client Client) { + if Disabled() { + return + } + + if GlobalClient() != nil || SwapClient(client) != nil { + log.Debug("telemetry: StartApp called multiple times, ignoring") + return + } + + client.AppStart() + go client.Flush() +} + +// SwapClient swaps the global client with the given client and Flush the old (*client). +func SwapClient(client Client) Client { + if Disabled() { + return nil + } + + oldClientPtr := globalClient.Swap(&client) + var oldClient Client + if oldClientPtr != nil && *oldClientPtr != nil { + oldClient = *oldClientPtr + } + + if oldClient != nil { + oldClient.Close() + } + + if client == nil { + return oldClient + } + + globalClientRecorder.Replay(client) + // Swap all metrics hot pointers to the new MetricHandle + metricsHandleSwappablePointers.Range(func(_ metricKey, value *swappableMetricHandle) bool { + value.swap(value.maker(client)) + return true + }) + + return oldClient +} + +// MockClient swaps the global client with the given client and clears the recorder to make sure external calls are not replayed. +// It returns a function that can be used to swap back the global client +func MockClient(client Client) func() { + globalClientRecorder.Clear() + metricsHandleSwappablePointers.Clear() + + oldClient := SwapClient(client) + return func() { + SwapClient(oldClient) + } +} + +// StopApp creates the app-stopped telemetry, adding to the queue and Flush all the queue before stopping the (*client). +func StopApp() { + if client := globalClient.Swap(nil); client != nil && *client != nil { + (*client).AppStop() + (*client).Flush() + (*client).Close() + } +} + +var telemetryClientDisabled = !globalinternal.BoolEnv("DD_INSTRUMENTATION_TELEMETRY_ENABLED", true) + +// Disabled returns whether instrumentation telemetry is disabled +// according to the DD_INSTRUMENTATION_TELEMETRY_ENABLED env var +func Disabled() bool { + return telemetryClientDisabled +} + +// Count creates a new metric handle for the given parameters that can be used to submit values. +// Count will always return a [MetricHandle], even if telemetry is disabled or the client has yet to start. +// The [MetricHandle] is then swapped with the actual [MetricHandle] once the client is started. +func Count(namespace Namespace, name string, tags []string) MetricHandle { + return globalClientNewMetric(namespace, transport.CountMetric, name, tags) +} + +// Rate creates a new metric handle for the given parameters that can be used to submit values. +// Rate will always return a [MetricHandle], even if telemetry is disabled or the client has yet to start. +// The [MetricHandle] is then swapped with the actual [MetricHandle] once the client is started. +func Rate(namespace Namespace, name string, tags []string) MetricHandle { + return globalClientNewMetric(namespace, transport.RateMetric, name, tags) +} + +// Gauge creates a new metric handle for the given parameters that can be used to submit values. +// Gauge will always return a [MetricHandle], even if telemetry is disabled or the client has yet to start. +// The [MetricHandle] is then swapped with the actual [MetricHandle] once the client is started. +func Gauge(namespace Namespace, name string, tags []string) MetricHandle { + return globalClientNewMetric(namespace, transport.GaugeMetric, name, tags) +} + +// Distribution creates a new metric handle for the given parameters that can be used to submit values. +// Distribution will always return a [MetricHandle], even if telemetry is disabled or the client has yet to start. +// The [MetricHandle] is then swapped with the actual [MetricHandle] once the client is started. +// The Get() method of the [MetricHandle] will return the last value submitted. +// Distribution MetricHandle is advised to be held in a variable more than the rest of the metric types to avoid too many useless allocations. +func Distribution(namespace Namespace, name string, tags []string) MetricHandle { + return globalClientNewMetric(namespace, transport.DistMetric, name, tags) +} + +func Log(record Record, options ...LogOption) { + globalClientCall(func(client Client) { + client.Log(record, options...) + }) +} + +// ProductStarted declares a product to have started at the customer’s request. If telemetry is disabled, it will do nothing. +// If the telemetry client has not started yet, it will record the action and replay it once the client is started. +func ProductStarted(product Namespace) { + globalClientCall(func(client Client) { + client.ProductStarted(product) + }) +} + +// ProductStopped declares a product to have being stopped by the customer. If telemetry is disabled, it will do nothing. +// If the telemetry client has not started yet, it will record the action and replay it once the client is started. +func ProductStopped(product Namespace) { + globalClientCall(func(client Client) { + client.ProductStopped(product) + }) +} + +// ProductStartError declares that a product could not start because of the following error. If telemetry is disabled, it will do nothing. +// If the telemetry client has not started yet, it will record the action and replay it once the client is started. +func ProductStartError(product Namespace, err error) { + globalClientCall(func(client Client) { + client.ProductStartError(product, err) + }) +} + +// RegisterAppConfig adds a key value pair to the app configuration and send the change to telemetry +// value has to be json serializable and the origin is the source of the change. If telemetry is disabled, it will do nothing. +// If the telemetry client has not started yet, it will record the action and replay it once the client is started. +func RegisterAppConfig(key string, value any, origin Origin) { + globalClientCall(func(client Client) { + client.RegisterAppConfig(key, value, origin) + }) +} + +// RegisterAppConfigs adds a list of key value pairs to the app configuration and sends the change to telemetry. +// Same as AddAppConfig but for multiple values. If telemetry is disabled, it will do nothing. +// If the telemetry client has not started yet, it will record the action and replay it once the client is started. +func RegisterAppConfigs(kvs ...Configuration) { + globalClientCall(func(client Client) { + client.RegisterAppConfigs(kvs...) + }) +} + +// MarkIntegrationAsLoaded marks an integration as loaded in the telemetry. If telemetry is disabled +// or the client has not started yet it will record the action and replay it once the client is started. +func MarkIntegrationAsLoaded(integration Integration) { + globalClientCall(func(client Client) { + client.MarkIntegrationAsLoaded(integration) + }) +} + +// LoadIntegration marks an integration as loaded in the telemetry client. If telemetry is disabled, it will do nothing. +// If the telemetry client has not started yet, it will record the action and replay it once the client is started. +func LoadIntegration(integration string) { + globalClientCall(func(client Client) { + client.MarkIntegrationAsLoaded(Integration{ + Name: integration, + }) + }) +} + +// AddFlushTicker adds a function that is called at each telemetry Flush. By default, every minute +func AddFlushTicker(ticker func(Client)) { + globalClientCall(func(client Client) { + client.AddFlushTicker(ticker) + }) +} + +var globalClientLogLossOnce sync.Once + +// globalClientCall takes a function that takes a Client and calls it with the global client if it exists. +// otherwise, it records the action for when the client is started. +func globalClientCall(fun func(client Client)) { + if Disabled() { + return + } + + client := globalClient.Load() + if client == nil || *client == nil { + if !globalClientRecorder.Record(fun) { + globalClientLogLossOnce.Do(func() { + log.Debug("telemetry: global client recorder queue is full, dropping telemetry data, please start the telemetry client earlier to avoid data loss") + }) + } + return + } + + fun(*client) +} + +var noopMetricHandleInstance = noopMetricHandle{} + +func globalClientNewMetric(namespace Namespace, kind transport.MetricType, name string, tags []string) MetricHandle { + if Disabled() { + return noopMetricHandleInstance + } + + key := newMetricKey(namespace, kind, name, tags) + hotPtr, _ := metricsHandleSwappablePointers.LoadOrCompute(key, func() *swappableMetricHandle { + maker := func(client Client) MetricHandle { + switch kind { + case transport.CountMetric: + return client.Count(namespace, name, tags) + case transport.RateMetric: + return client.Rate(namespace, name, tags) + case transport.GaugeMetric: + return client.Gauge(namespace, name, tags) + case transport.DistMetric: + return client.Distribution(namespace, name, tags) + } + log.Warn("telemetry: unknown metric type %q", kind) + return nil + } + wrapper := &swappableMetricHandle{maker: maker} + if client := globalClient.Load(); client == nil || *client == nil { + wrapper.recorder = internal.NewRecorder[MetricHandle]() + } + globalClientCall(func(client Client) { + wrapper.swap(maker(client)) + }) + return wrapper + }) + return hotPtr +} diff --git a/internal/telemetry/integration.go b/internal/telemetry/integration.go new file mode 100644 index 0000000000..9df61d9154 --- /dev/null +++ b/internal/telemetry/integration.go @@ -0,0 +1,41 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type integrations struct { + mu sync.Mutex + integrations []transport.Integration +} + +func (i *integrations) Add(integration Integration) { + i.mu.Lock() + defer i.mu.Unlock() + i.integrations = append(i.integrations, transport.Integration{ + Name: integration.Name, + Version: integration.Version, + Enabled: integration.Error == "", // no error means the integration was enabled successfully + Error: integration.Error, + }) +} + +func (i *integrations) Payload() transport.Payload { + i.mu.Lock() + defer i.mu.Unlock() + if len(i.integrations) == 0 { + return nil + } + integrations := i.integrations + i.integrations = nil + return transport.AppIntegrationChange{ + Integrations: integrations, + } +} diff --git a/internal/telemetry/internal/knownmetrics/generator/generator.go b/internal/telemetry/internal/knownmetrics/generator/generator.go new file mode 100644 index 0000000000..8ee4da2023 --- /dev/null +++ b/internal/telemetry/internal/knownmetrics/generator/generator.go @@ -0,0 +1,173 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "bytes" + _ "embed" // For go:embed + "encoding/base64" + "encoding/json" + "flag" + "fmt" + "net/http" + "net/url" + "os" + "os/exec" + "path/filepath" + "runtime" + "slices" + "strings" + "text/template" + + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +// This represents the base64-encoded URL of api.github.com to download the configuration file. +// This can be easily decoded manually, but it is encoded to prevent the URL from being scanned by bots. +const ( + commonMetricsURL = "aHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9EYXRhRG9nL2RkLWdvL2NvbnRlbnRzL3RyYWNlL2FwcHMvdHJhY2VyLXRlbGVtZXRyeS1pbnRha2UvdGVsZW1ldHJ5LW1ldHJpY3Mvc3RhdGljL2NvbW1vbl9tZXRyaWNzLmpzb24=" + goMetricsURL = "aHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9EYXRhRG9nL2RkLWdvL2NvbnRlbnRzL3RyYWNlL2FwcHMvdHJhY2VyLXRlbGVtZXRyeS1pbnRha2UvdGVsZW1ldHJ5LW1ldHJpY3Mvc3RhdGljL2dvbGFuZ19tZXRyaWNzLmpzb24=" +) + +//go:embed template.tmpl +var codegenTemplate string + +func base64Decode(encoded string) string { + decoded, _ := base64.StdEncoding.DecodeString(encoded) + return string(decoded) +} + +func downloadFromDdgo(remoteURL, localPath, branch, token string, getMetricNames func(map[string]any) []knownmetrics.Declaration, symbolName string) error { + request, err := http.NewRequest(http.MethodGet, remoteURL+"?ref="+url.QueryEscape(branch), nil) + if err != nil { + return err + } + + // Following the documentation described here: + // https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28 + + request.Header.Add("Authorization", "Bearer "+token) + request.Header.Add("Accept", "application/vnd.github.v3.raw") + request.Header.Add("X-GitHub-Api-Version", "2022-11-28") + + response, err := http.DefaultClient.Do(request) + if err != nil { + return err + } + + defer response.Body.Close() + + if response.StatusCode != http.StatusOK { + return fmt.Errorf("unexpected status code: %s", response.Status) + } + + var decoded map[string]any + + if err := json.NewDecoder(response.Body).Decode(&decoded); err != nil { + return err + } + + metricNames := getMetricNames(decoded) + slices.SortStableFunc(metricNames, func(i, j knownmetrics.Declaration) int { + if i.Namespace != j.Namespace { + return strings.Compare(string(i.Namespace), string(j.Namespace)) + } + if i.Type != j.Type { + return strings.Compare(string(i.Type), string(j.Type)) + } + return strings.Compare(i.Name, j.Name) + }) + + fp, err := os.Create(localPath) + if err != nil { + return err + } + defer fp.Close() + + codegen := template.Must(template.New("").Parse(codegenTemplate)) + return codegen.Execute(fp, map[string]any{ + "symbolName": symbolName, + "metrics": metricNames, + }) +} + +func getCommonMetricNames(input map[string]any) []knownmetrics.Declaration { + var names []knownmetrics.Declaration + for category, value := range input { + if strings.HasPrefix(category, "$") { + continue + } + + metrics := value.(map[string]any) + for metricKey, value := range metrics { + metric := knownmetrics.Declaration{ + Namespace: transport.Namespace(category), + Name: metricKey, + Type: transport.MetricType(value.(map[string]any)["metric_type"].(string)), + } + names = append(names, metric) + if aliases, ok := value.(map[string]any)["aliases"]; ok { + for _, alias := range aliases.([]any) { + metric.Name = alias.(string) + names = append(names, metric) + } + } + } + } + return names +} + +func getGoMetricNames(input map[string]any) []knownmetrics.Declaration { + var names []knownmetrics.Declaration + for key, value := range input { + if strings.HasPrefix(key, "$") { + continue + } + names = append(names, knownmetrics.Declaration{ + Name: key, + Type: transport.MetricType(value.(map[string]any)["metric_type"].(string)), + }) + } + return names +} + +func main() { + branch := flag.String("branch", "prod", "The branch to get the configuration from") + flag.Parse() + + githubToken := env.Get("GITHUB_TOKEN") + if githubToken == "" { + if _, err := exec.LookPath("gh"); err != nil { + fmt.Println("Please specify a GITHUB_TOKEN environment variable or install the GitHub CLI.") + os.Exit(2) + } + + var buf bytes.Buffer + cmd := exec.Command("gh", "auth", "token") + cmd.Stdout = &buf + cmd.Stderr = os.Stderr + if err := cmd.Run(); err != nil { + fmt.Println("Failed to run `gh auth token`:", err) + os.Exit(1) + } + + githubToken = strings.TrimSpace(buf.String()) + } + + _, thisFile, _, _ := runtime.Caller(0) + dir := filepath.Dir(thisFile) + if err := downloadFromDdgo(base64Decode(commonMetricsURL), filepath.Join(dir, "..", "known_metrics.common.go"), *branch, githubToken, getCommonMetricNames, "commonMetrics"); err != nil { + fmt.Println("Failed to download common metrics:", err) + os.Exit(1) + } + + if err := downloadFromDdgo(base64Decode(goMetricsURL), filepath.Join(dir, "..", "known_metric.golang.go"), *branch, githubToken, getGoMetricNames, "golangMetrics"); err != nil { + fmt.Println("Failed to download golang metrics:", err) + os.Exit(1) + } +} diff --git a/internal/telemetry/internal/knownmetrics/generator/template.tmpl b/internal/telemetry/internal/knownmetrics/generator/template.tmpl new file mode 100644 index 0000000000..dfb0794dfc --- /dev/null +++ b/internal/telemetry/internal/knownmetrics/generator/template.tmpl @@ -0,0 +1,14 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Code generated by 'go run github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics/generator'; DO NOT EDIT. + +package knownmetrics + +var {{ .symbolName }} = []Declaration{ +{{- range .metrics }} + { {{ with .Namespace }}Namespace: {{ printf "%q" . }}, {{ end }}Type: {{ printf "%q" .Type}}, Name: {{ printf "%q" .Name }} }, +{{- end }} +} diff --git a/internal/telemetry/internal/knownmetrics/known_metric.golang.go b/internal/telemetry/internal/knownmetrics/known_metric.golang.go new file mode 100644 index 0000000000..da51ebcf19 --- /dev/null +++ b/internal/telemetry/internal/knownmetrics/known_metric.golang.go @@ -0,0 +1,14 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Code generated by 'go run github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics/generator'; DO NOT EDIT. + +package knownmetrics + +var golangMetrics = []Declaration{ + { Type: "count", Name: "errorstack.source" }, + { Type: "distribution", Name: "errorstack.duration" }, + { Type: "gauge", Name: "orchestrion.enabled" }, +} diff --git a/internal/telemetry/internal/knownmetrics/known_metrics.common.go b/internal/telemetry/internal/knownmetrics/known_metrics.common.go new file mode 100644 index 0000000000..bc6e6a4e7e --- /dev/null +++ b/internal/telemetry/internal/knownmetrics/known_metrics.common.go @@ -0,0 +1,244 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Code generated by 'go run github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics/generator'; DO NOT EDIT. + +package knownmetrics + +var commonMetrics = []Declaration{ + {Namespace: "appsec", Type: "count", Name: "ai_guard.requests"}, + {Namespace: "appsec", Type: "count", Name: "ai_guard.truncated"}, + {Namespace: "appsec", Type: "count", Name: "api_security.missing_route"}, + {Namespace: "appsec", Type: "count", Name: "api_security.request.no_schema"}, + {Namespace: "appsec", Type: "count", Name: "api_security.request.schema"}, + {Namespace: "appsec", Type: "count", Name: "instrum.user_auth.missing_user_id"}, + {Namespace: "appsec", Type: "count", Name: "instrum.user_auth.missing_user_login"}, + {Namespace: "appsec", Type: "count", Name: "otel.log_records"}, + {Namespace: "appsec", Type: "count", Name: "otel.metrics_export_attempts"}, + {Namespace: "appsec", Type: "count", Name: "otel.metrics_export_failures"}, + {Namespace: "appsec", Type: "count", Name: "otel.metrics_export_partial_successes"}, + {Namespace: "appsec", Type: "count", Name: "otel.metrics_export_successes"}, + {Namespace: "appsec", Type: "count", Name: "rasp.error"}, + {Namespace: "appsec", Type: "count", Name: "rasp.rule.eval"}, + {Namespace: "appsec", Type: "count", Name: "rasp.rule.match"}, + {Namespace: "appsec", Type: "count", Name: "rasp.rule.skipped"}, + {Namespace: "appsec", Type: "count", Name: "rasp.timeout"}, + {Namespace: "appsec", Type: "count", Name: "sdk.event"}, + {Namespace: "appsec", Type: "count", Name: "waf.config_errors"}, + {Namespace: "appsec", Type: "count", Name: "waf.error"}, + {Namespace: "appsec", Type: "count", Name: "waf.init"}, + {Namespace: "appsec", Type: "count", Name: "waf.input_truncated"}, + {Namespace: "appsec", Type: "count", Name: "waf.requests"}, + {Namespace: "appsec", Type: "count", Name: "waf.updates"}, + {Namespace: "appsec", Type: "distribution", Name: "instrum.body_size"}, + {Namespace: "appsec", Type: "distribution", Name: "rasp.duration"}, + {Namespace: "appsec", Type: "distribution", Name: "rasp.duration_ext"}, + {Namespace: "appsec", Type: "distribution", Name: "waf.duration"}, + {Namespace: "appsec", Type: "distribution", Name: "waf.duration_ext"}, + {Namespace: "appsec", Type: "distribution", Name: "waf.truncated_value_size"}, + {Namespace: "appsec", Type: "gauge", Name: "enabled"}, + {Namespace: "civisibility", Type: "count", Name: "code_coverage.errors"}, + {Namespace: "civisibility", Type: "count", Name: "code_coverage.is_empty"}, + {Namespace: "civisibility", Type: "count", Name: "code_coverage_finished"}, + {Namespace: "civisibility", Type: "count", Name: "code_coverage_started"}, + {Namespace: "civisibility", Type: "count", Name: "coverage_upload.request"}, + {Namespace: "civisibility", Type: "count", Name: "coverage_upload.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "early_flake_detection.request"}, + {Namespace: "civisibility", Type: "count", Name: "early_flake_detection.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "endpoint_payload.dropped"}, + {Namespace: "civisibility", Type: "count", Name: "endpoint_payload.requests"}, + {Namespace: "civisibility", Type: "count", Name: "endpoint_payload.requests_errors"}, + {Namespace: "civisibility", Type: "count", Name: "event_created"}, + {Namespace: "civisibility", Type: "count", Name: "event_finished"}, + {Namespace: "civisibility", Type: "count", Name: "events_enqueued_for_serialization"}, + {Namespace: "civisibility", Type: "count", Name: "flaky_tests.request"}, + {Namespace: "civisibility", Type: "count", Name: "flaky_tests.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "git.command"}, + {Namespace: "civisibility", Type: "count", Name: "git.command_errors"}, + {Namespace: "civisibility", Type: "count", Name: "git.commit_sha_discrepancy"}, + {Namespace: "civisibility", Type: "count", Name: "git.commit_sha_match"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.objects_pack"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.objects_pack_errors"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.search_commits"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.search_commits_errors"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.settings"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.settings_errors"}, + {Namespace: "civisibility", Type: "count", Name: "git_requests.settings_response"}, + {Namespace: "civisibility", Type: "count", Name: "impacted_tests_detection.request"}, + {Namespace: "civisibility", Type: "count", Name: "impacted_tests_detection.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "itr_forced_run"}, + {Namespace: "civisibility", Type: "count", Name: "itr_skippable_tests.request"}, + {Namespace: "civisibility", Type: "count", Name: "itr_skippable_tests.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "itr_skippable_tests.response_suites"}, + {Namespace: "civisibility", Type: "count", Name: "itr_skippable_tests.response_tests"}, + {Namespace: "civisibility", Type: "count", Name: "itr_skipped"}, + {Namespace: "civisibility", Type: "count", Name: "itr_unskippable"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.http_endpoint.dropped"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.http_endpoint.requests"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.http_endpoint.requests_errors"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.logs.dropped"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.logs.submitted"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.traces.dropped"}, + {Namespace: "civisibility", Type: "count", Name: "jenkins.traces.submitted"}, + {Namespace: "civisibility", Type: "count", Name: "known_tests.request"}, + {Namespace: "civisibility", Type: "count", Name: "known_tests.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "manual_api_events"}, + {Namespace: "civisibility", Type: "count", Name: "test_management_tests.request"}, + {Namespace: "civisibility", Type: "count", Name: "test_management_tests.request_errors"}, + {Namespace: "civisibility", Type: "count", Name: "test_session"}, + {Namespace: "civisibility", Type: "distribution", Name: "code_coverage.files"}, + {Namespace: "civisibility", Type: "distribution", Name: "coverage_upload.request_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "coverage_upload.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "early_flake_detection.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "early_flake_detection.response_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "early_flake_detection.response_tests"}, + {Namespace: "civisibility", Type: "distribution", Name: "endpoint_payload.bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "endpoint_payload.events_count"}, + {Namespace: "civisibility", Type: "distribution", Name: "endpoint_payload.events_serialization_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "endpoint_payload.requests_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "flaky_tests.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "flaky_tests.response_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "flaky_tests.response_tests"}, + {Namespace: "civisibility", Type: "distribution", Name: "git.command_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "git_requests.objects_pack_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "git_requests.objects_pack_files"}, + {Namespace: "civisibility", Type: "distribution", Name: "git_requests.objects_pack_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "git_requests.search_commits_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "git_requests.settings_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "impacted_tests_detection.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "impacted_tests_detection.response_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "impacted_tests_detection.response_files"}, + {Namespace: "civisibility", Type: "distribution", Name: "itr_skippable_tests.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "itr_skippable_tests.response_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "jenkins.http_endpoint.bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "jenkins.http_endpoint.events_count"}, + {Namespace: "civisibility", Type: "distribution", Name: "jenkins.http_endpoint.requests_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "known_tests.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "known_tests.response_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "known_tests.response_tests"}, + {Namespace: "civisibility", Type: "distribution", Name: "test_management_tests.request_ms"}, + {Namespace: "civisibility", Type: "distribution", Name: "test_management_tests.response_bytes"}, + {Namespace: "civisibility", Type: "distribution", Name: "test_management_tests.response_tests"}, + {Namespace: "general", Type: "count", Name: "logs_created"}, + {Namespace: "general", Type: "distribution", Name: "init_time"}, + {Namespace: "general", Type: "distribution", Name: "tracer_init_time"}, + {Namespace: "iast", Type: "count", Name: "executed.propagation"}, + {Namespace: "iast", Type: "count", Name: "executed.sink"}, + {Namespace: "iast", Type: "count", Name: "executed.source"}, + {Namespace: "iast", Type: "count", Name: "executed.tainted"}, + {Namespace: "iast", Type: "count", Name: "instrumented.propagation"}, + {Namespace: "iast", Type: "count", Name: "instrumented.sink"}, + {Namespace: "iast", Type: "count", Name: "instrumented.source"}, + {Namespace: "iast", Type: "count", Name: "json.tag.size.exceeded"}, + {Namespace: "iast", Type: "count", Name: "request.tainted"}, + {Namespace: "iast", Type: "count", Name: "suppressed.vulnerabilities"}, + {Namespace: "mlobs", Type: "count", Name: "activate_distributed_headers"}, + {Namespace: "mlobs", Type: "count", Name: "annotations"}, + {Namespace: "mlobs", Type: "count", Name: "dropped_eval_events"}, + {Namespace: "mlobs", Type: "count", Name: "dropped_span_events"}, + {Namespace: "mlobs", Type: "count", Name: "evals_submitted"}, + {Namespace: "mlobs", Type: "count", Name: "evaluators.error"}, + {Namespace: "mlobs", Type: "count", Name: "evaluators.init"}, + {Namespace: "mlobs", Type: "count", Name: "evaluators.run"}, + {Namespace: "mlobs", Type: "count", Name: "inject_distributed_headers"}, + {Namespace: "mlobs", Type: "count", Name: "product_enabled"}, + {Namespace: "mlobs", Type: "count", Name: "span.finished"}, + {Namespace: "mlobs", Type: "count", Name: "span.start"}, + {Namespace: "mlobs", Type: "count", Name: "spans_exported"}, + {Namespace: "mlobs", Type: "count", Name: "user_flush"}, + {Namespace: "mlobs", Type: "count", Name: "user_processor_called"}, + {Namespace: "mlobs", Type: "distribution", Name: "evaluators.rule_sample_rate"}, + {Namespace: "mlobs", Type: "distribution", Name: "init_time"}, + {Namespace: "mlobs", Type: "distribution", Name: "span.raw_size"}, + {Namespace: "mlobs", Type: "distribution", Name: "span.size"}, + {Namespace: "profilers", Type: "count", Name: "profile_api.errors"}, + {Namespace: "profilers", Type: "count", Name: "profile_api.requests"}, + {Namespace: "profilers", Type: "count", Name: "profile_api.responses"}, + {Namespace: "profilers", Type: "distribution", Name: "profile_api.bytes"}, + {Namespace: "profilers", Type: "distribution", Name: "profile_api.ms"}, + {Namespace: "profilers", Type: "gauge", Name: "wall.async_contexts_live"}, + {Namespace: "profilers", Type: "gauge", Name: "wall.async_contexts_used"}, + {Namespace: "rum", Type: "count", Name: "injection.content_security_policy"}, + {Namespace: "rum", Type: "count", Name: "injection.failed"}, + {Namespace: "rum", Type: "count", Name: "injection.initialization.failed"}, + {Namespace: "rum", Type: "count", Name: "injection.initialization.succeed"}, + {Namespace: "rum", Type: "count", Name: "injection.installation"}, + {Namespace: "rum", Type: "count", Name: "injection.skipped"}, + {Namespace: "rum", Type: "count", Name: "injection.succeed"}, + {Namespace: "rum", Type: "distribution", Name: "injection.installation.duration"}, + {Namespace: "rum", Type: "distribution", Name: "injection.ms"}, + {Namespace: "rum", Type: "distribution", Name: "injection.response.bytes"}, + {Namespace: "sidecar", Type: "count", Name: "server.submitted_payloads"}, + {Namespace: "sidecar", Type: "distribution", Name: "server.memory_usage"}, + {Namespace: "sidecar", Type: "gauge", Name: "server.active_sessions"}, + {Namespace: "telemetry", Type: "count", Name: "telemetry_api.errors"}, + {Namespace: "telemetry", Type: "count", Name: "telemetry_api.requests"}, + {Namespace: "telemetry", Type: "count", Name: "telemetry_api.responses"}, + {Namespace: "telemetry", Type: "distribution", Name: "telemetry_api.bytes"}, + {Namespace: "telemetry", Type: "distribution", Name: "telemetry_api.ms"}, + {Namespace: "tracers", Type: "count", Name: "context_header.truncated"}, + {Namespace: "tracers", Type: "count", Name: "context_header_style.extracted"}, + {Namespace: "tracers", Type: "count", Name: "context_header_style.injected"}, + {Namespace: "tracers", Type: "count", Name: "context_header_style.malformed"}, + {Namespace: "tracers", Type: "count", Name: "docker_lib_injection.failure"}, + {Namespace: "tracers", Type: "count", Name: "docker_lib_injection.success"}, + {Namespace: "tracers", Type: "count", Name: "exporter_fallback"}, + {Namespace: "tracers", Type: "count", Name: "host_lib_injection.failure"}, + {Namespace: "tracers", Type: "count", Name: "host_lib_injection.success"}, + {Namespace: "tracers", Type: "count", Name: "inject.anomaly"}, + {Namespace: "tracers", Type: "count", Name: "inject.crash"}, + {Namespace: "tracers", Type: "count", Name: "inject.error"}, + {Namespace: "tracers", Type: "count", Name: "inject.language_detection"}, + {Namespace: "tracers", Type: "count", Name: "inject.skip"}, + {Namespace: "tracers", Type: "count", Name: "inject.success"}, + {Namespace: "tracers", Type: "count", Name: "integration_errors"}, + {Namespace: "tracers", Type: "count", Name: "k8s_lib_injection.failure"}, + {Namespace: "tracers", Type: "count", Name: "k8s_lib_injection.success"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.abort"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.abort.integration"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.abort.runtime"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.complete"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.error"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.injector.error"}, + {Namespace: "tracers", Type: "count", Name: "library_entrypoint.start"}, + {Namespace: "tracers", Type: "count", Name: "otel.env.hiding"}, + {Namespace: "tracers", Type: "count", Name: "otel.env.invalid"}, + {Namespace: "tracers", Type: "count", Name: "otel.env.unsupported"}, + {Namespace: "tracers", Type: "count", Name: "public_api.called"}, + {Namespace: "tracers", Type: "count", Name: "span_created"}, + {Namespace: "tracers", Type: "count", Name: "span_finished"}, + {Namespace: "tracers", Type: "count", Name: "span_pointer_calculation"}, + {Namespace: "tracers", Type: "count", Name: "span_pointer_calculation.issue"}, + {Namespace: "tracers", Type: "count", Name: "spans_created"}, + {Namespace: "tracers", Type: "count", Name: "spans_dropped"}, + {Namespace: "tracers", Type: "count", Name: "spans_enqueued_for_serialization"}, + {Namespace: "tracers", Type: "count", Name: "spans_finished"}, + {Namespace: "tracers", Type: "count", Name: "stats_api.errors"}, + {Namespace: "tracers", Type: "count", Name: "stats_api.requests"}, + {Namespace: "tracers", Type: "count", Name: "stats_api.responses"}, + {Namespace: "tracers", Type: "count", Name: "trace_api.errors"}, + {Namespace: "tracers", Type: "count", Name: "trace_api.requests"}, + {Namespace: "tracers", Type: "count", Name: "trace_api.responses"}, + {Namespace: "tracers", Type: "count", Name: "trace_chunks_dropped"}, + {Namespace: "tracers", Type: "count", Name: "trace_chunks_enqueued"}, + {Namespace: "tracers", Type: "count", Name: "trace_chunks_enqueued_for_serialization"}, + {Namespace: "tracers", Type: "count", Name: "trace_chunks_sent"}, + {Namespace: "tracers", Type: "count", Name: "trace_partial_flush.count"}, + {Namespace: "tracers", Type: "count", Name: "trace_segments_closed"}, + {Namespace: "tracers", Type: "count", Name: "trace_segments_created"}, + {Namespace: "tracers", Type: "distribution", Name: "inject.latency.baseline"}, + {Namespace: "tracers", Type: "distribution", Name: "inject.latency.end_to_end"}, + {Namespace: "tracers", Type: "distribution", Name: "inject.latency.init_container"}, + {Namespace: "tracers", Type: "distribution", Name: "stats_api.bytes"}, + {Namespace: "tracers", Type: "distribution", Name: "stats_api.ms"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_api.bytes"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_api.ms"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_chunk_serialization.bytes"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_chunk_serialization.ms"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_chunk_size"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_partial_flush.spans_closed"}, + {Namespace: "tracers", Type: "distribution", Name: "trace_partial_flush.spans_remaining"}, + {Namespace: "tracers", Type: "gauge", Name: "stats_buckets"}, +} diff --git a/internal/telemetry/internal/knownmetrics/known_metrics.go b/internal/telemetry/internal/knownmetrics/known_metrics.go new file mode 100644 index 0000000000..f32e77168b --- /dev/null +++ b/internal/telemetry/internal/knownmetrics/known_metrics.go @@ -0,0 +1,61 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package knownmetrics + +import ( + "slices" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type Declaration struct { + Namespace transport.Namespace `json:"namespace"` + Type transport.MetricType `json:"type"` + Name string `json:"name"` +} + +// IsKnownMetric returns true if the given metric name is a known metric by the backend +// This is linked to generated common_metrics.json file and golang_metrics.json file. If you added new metrics to the backend, you should rerun the generator. +func IsKnownMetric(namespace transport.Namespace, typ transport.MetricType, name string) bool { + return IsCommonMetric(namespace, typ, name) || IsLanguageMetric(typ, name) +} + +// IsCommonMetric returns true if the given metric name is a known common (cross-language) metric by the backend +// This is linked to the generated common_metrics.json file. If you added new metrics to the backend, you should rerun the generator. +func IsCommonMetric(namespace transport.Namespace, typ transport.MetricType, name string) bool { + decl := Declaration{Namespace: namespace, Type: typ, Name: name} + return slices.Contains(commonMetrics, decl) +} + +// Size returns the total number of known metrics, including common and golang metrics +func Size() int { + return len(commonMetrics) + len(golangMetrics) +} + +// SizeWithFilter returns the total number of known metrics, including common and golang metrics, that pass the given filter +func SizeWithFilter(filter func(Declaration) bool) int { + size := 0 + for _, decl := range commonMetrics { + if filter(decl) { + size++ + } + } + + for _, decl := range golangMetrics { + if filter(decl) { + size++ + } + } + + return size +} + +// IsLanguageMetric returns true if the given metric name is a known Go language metric by the backend +// This is linked to the generated golang_metrics.json file. If you added new metrics to the backend, you should rerun the generator. +func IsLanguageMetric(typ transport.MetricType, name string) bool { + decl := Declaration{Type: typ, Name: name} + return slices.Contains(golangMetrics, decl) +} diff --git a/internal/telemetry/internal/mapper/app_closing.go b/internal/telemetry/internal/mapper/app_closing.go new file mode 100644 index 0000000000..da47f19fca --- /dev/null +++ b/internal/telemetry/internal/mapper/app_closing.go @@ -0,0 +1,23 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mapper + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +// NewAppClosingMapper returns a new Mapper that appends an AppClosing payload to the given payloads and calls the underlying Mapper with it. +func NewAppClosingMapper(next Mapper) Mapper { + return &appClosingEnricher{next: next} +} + +type appClosingEnricher struct { + next Mapper +} + +func (t *appClosingEnricher) Transform(payloads []transport.Payload) ([]transport.Payload, Mapper) { + return t.next.Transform(append(payloads, transport.AppClosing{})) +} diff --git a/internal/telemetry/internal/mapper/app_started.go b/internal/telemetry/internal/mapper/app_started.go new file mode 100644 index 0000000000..3f00575d48 --- /dev/null +++ b/internal/telemetry/internal/mapper/app_started.go @@ -0,0 +1,48 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mapper + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type appStartedReducer struct { + next Mapper +} + +// NewAppStartedMapper returns a new Mapper that adds an AppStarted payload to the beginning of all payloads +// and pass it down to irs underlying mapper. +// The AppStarted payload ingest the [transport.AppClientConfigurationChange] and [transport.AppProductChange] payloads +func NewAppStartedMapper(next Mapper) Mapper { + return &appStartedReducer{next: next} +} + +func (t *appStartedReducer) Transform(payloads []transport.Payload) ([]transport.Payload, Mapper) { + appStarted := transport.AppStarted{ + InstallSignature: transport.InstallSignature{ + InstallID: globalconfig.InstrumentationInstallID(), + InstallType: globalconfig.InstrumentationInstallType(), + InstallTime: globalconfig.InstrumentationInstallTime(), + }, + } + + payloadLefts := make([]transport.Payload, 0, len(payloads)) + for _, payload := range payloads { + switch payload := payload.(type) { + case transport.AppClientConfigurationChange: + appStarted.Configuration = payload.Configuration + case transport.AppProductChange: + appStarted.Products = payload.Products + default: + payloadLefts = append(payloadLefts, payload) + } + } + + // The app-started event should be the first event in the payload and not in an message-batch + payloads, mapper := t.next.Transform(payloadLefts) + return append([]transport.Payload{appStarted}, payloads...), mapper +} diff --git a/internal/telemetry/internal/mapper/default.go b/internal/telemetry/internal/mapper/default.go new file mode 100644 index 0000000000..313597dac2 --- /dev/null +++ b/internal/telemetry/internal/mapper/default.go @@ -0,0 +1,98 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mapper + +import ( + "time" + + "golang.org/x/time/rate" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +// NewDefaultMapper returns a Mapper that transforms payloads into a MessageBatch and adds a heartbeat message. +// The heartbeat message is added every heartbeatInterval. +func NewDefaultMapper(heartbeatInterval, extendedHeartBeatInterval time.Duration) Mapper { + mapper := &defaultMapper{ + heartbeatEnricher: heartbeatEnricher{ + heartbeatRL: rate.NewLimiter(rate.Every(heartbeatInterval), 1), + extendedHeartbeatRL: rate.NewLimiter(rate.Every(extendedHeartBeatInterval), 1), + }, + } + + // The rate limiter is initialized with a token, but we want the first heartbeat to be sent in one minute, so we consume the token + mapper.heartbeatEnricher.heartbeatRL.Allow() + mapper.heartbeatEnricher.extendedHeartbeatRL.Allow() + return mapper +} + +type defaultMapper struct { + heartbeatEnricher + messageBatchReducer +} + +func (t *defaultMapper) Transform(payloads []transport.Payload) ([]transport.Payload, Mapper) { + payloads, _ = t.heartbeatEnricher.Transform(payloads) + payloads, _ = t.messageBatchReducer.Transform(payloads) + return payloads, t +} + +type messageBatchReducer struct{} + +func (t *messageBatchReducer) Transform(payloads []transport.Payload) ([]transport.Payload, Mapper) { + if len(payloads) <= 1 { + return payloads, t + } + + messages := make([]transport.Message, len(payloads)) + for i, payload := range payloads { + messages[i] = transport.Message{ + RequestType: payload.RequestType(), + Payload: payload, + } + } + + return []transport.Payload{transport.MessageBatch(messages)}, t +} + +type heartbeatEnricher struct { + heartbeatRL *rate.Limiter + extendedHeartbeatRL *rate.Limiter + + extendedHeartbeat transport.AppExtendedHeartbeat + heartbeat transport.AppHeartbeat +} + +func (t *heartbeatEnricher) Transform(payloads []transport.Payload) ([]transport.Payload, Mapper) { + // Built the extended heartbeat using other payloads + // Composition described here: + // https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/producing-telemetry.md#app-extended-heartbeat + for _, payload := range payloads { + switch payload := payload.(type) { + case transport.AppStarted: + // Should be sent only once anyway + t.extendedHeartbeat.Configuration = payload.Configuration + case transport.AppDependenciesLoaded: + if t.extendedHeartbeat.Dependencies == nil { + t.extendedHeartbeat.Dependencies = payload.Dependencies + } + case transport.AppIntegrationChange: + // The number of integrations should be small enough so we can just append to the list + t.extendedHeartbeat.Integrations = append(t.extendedHeartbeat.Integrations, payload.Integrations...) + } + } + + if t.extendedHeartbeatRL.Allow() { + return append(payloads, t.extendedHeartbeat), t + } + + if t.heartbeatRL.Allow() { + return append(payloads, t.heartbeat), t + } + + // We don't send anything + return payloads, t +} diff --git a/internal/telemetry/internal/mapper/mapper.go b/internal/telemetry/internal/mapper/mapper.go new file mode 100644 index 0000000000..116c4ffd0d --- /dev/null +++ b/internal/telemetry/internal/mapper/mapper.go @@ -0,0 +1,17 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package mapper + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +// Mapper is an interface for transforming payloads to comply with different types of lifecycle events in the application. +type Mapper interface { + // Transform transforms the given payloads and returns the transformed payloads and the Mapper to use for the next + // transformation at the next flush a minute later + Transform([]transport.Payload) ([]transport.Payload, Mapper) +} diff --git a/internal/telemetry/internal/range.go b/internal/telemetry/internal/range.go new file mode 100644 index 0000000000..c2e1e1852f --- /dev/null +++ b/internal/telemetry/internal/range.go @@ -0,0 +1,39 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "cmp" +) + +// Range is a type that represents a range of values. +type Range[T cmp.Ordered] struct { + Min T + Max T +} + +// IsOrdered checks if the range is ordered. e.g. Min <= Max. +func (r Range[T]) IsOrdered() bool { + return r.Min <= r.Max +} + +// Contains checks if a value is within the range. +func (r Range[T]) Contains(value T) bool { + return value >= r.Min && value <= r.Max +} + +// Clamp squeezes a value between a minimum and maximum value. +func (r Range[T]) Clamp(value T) T { + return max(min(r.Max, value), r.Min) +} + +// ReduceMax returns a new range where value is the new max and min is either the current min or the new value to make sure the range is ordered. +func (r Range[T]) ReduceMax(value T) Range[T] { + return Range[T]{ + Min: min(r.Min, value), + Max: value, + } +} diff --git a/internal/telemetry/internal/recorder.go b/internal/telemetry/internal/recorder.go new file mode 100644 index 0000000000..69c6fdd7f4 --- /dev/null +++ b/internal/telemetry/internal/recorder.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +// Recorder is a generic thread-safe type that records functions that could have taken place before object T was created. +// Once object T is created, the Recorder can replay all the recorded functions with object T as an argument. +type Recorder[T any] struct { + queue *RingQueue[func(T)] +} + +// TODO: tweak these values once we get telemetry data from the telemetry client +var queueCap = Range[int]{ + Min: 16, // Initial queue capacity + Max: 512, // Maximum queue capacity +} + +// NewRecorder creates a new [Recorder] instance. with 512 as the maximum number of recorded functions before overflowing. +func NewRecorder[T any]() Recorder[T] { + return Recorder[T]{ + queue: NewRingQueue[func(T)](queueCap), + } +} + +// Record takes a function and records it in the [Recorder]'s queue. If the queue is full, it returns false. +// Once [Recorder.Replay] is called, all recorded functions will be replayed with object T as an argument in order of recording. +func (r Recorder[T]) Record(f func(T)) bool { + if r.queue == nil { + return true + } + return r.queue.Enqueue(f) +} + +// Replay uses T as an argument to replay all recorded functions in order of recording. +func (r Recorder[T]) Replay(t T) { + if r.queue == nil { + return + } + for { + f := r.queue.Dequeue() + if f == nil { + break + } + f(t) + } +} + +// Clear clears the Recorder's queue. +func (r Recorder[T]) Clear() { + r.queue.Clear() +} diff --git a/internal/telemetry/internal/ringbuffer.go b/internal/telemetry/internal/ringbuffer.go new file mode 100644 index 0000000000..3d2d31acf4 --- /dev/null +++ b/internal/telemetry/internal/ringbuffer.go @@ -0,0 +1,195 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package internal + +import ( + "sync" +) + +// RingQueue is a thread-safe ring buffer can be used to store a fixed number of elements and overwrite old values when full. +type RingQueue[T any] struct { + buffer []T + head, tail, count int + // mu is the lock for the buffer, head and tail. + mu sync.Mutex + // pool is the pool of buffers. Normally there should only be one or 2 buffers in the pool. + pool *SyncPool[[]T] + // BufferSizes is the range of buffer sizes that the ring queue can have. + BufferSizes Range[int] +} + +// NewRingQueue creates a new RingQueue with a minimum size and a maximum size. +func NewRingQueue[T any](rang Range[int]) *RingQueue[T] { + return &RingQueue[T]{ + buffer: make([]T, rang.Min), + pool: NewSyncPool[[]T](func() []T { return make([]T, rang.Min) }), + BufferSizes: rang, + } +} + +// NewRingQueueWithPool creates a new RingQueue with a minimum size, a maximum size and a pool. Make sure the pool is properly initialized with the right type +func NewRingQueueWithPool[T any](rang Range[int], pool *SyncPool[[]T]) *RingQueue[T] { + return &RingQueue[T]{ + buffer: make([]T, rang.Min), + pool: pool, + BufferSizes: rang, + } +} + +// Length returns the number of elements currently stored in the queue. +func (rq *RingQueue[T]) Length() int { + rq.mu.Lock() + defer rq.mu.Unlock() + + return rq.count +} + +func (rq *RingQueue[T]) resizeLocked() { + newBuf := make([]T, rq.BufferSizes.Clamp(rq.count*2)) + defer rq.releaseBuffer(rq.buffer) + + if rq.tail > rq.head { + copy(newBuf, rq.buffer[rq.head:rq.tail]) + } else { + n := copy(newBuf, rq.buffer[rq.head:]) + copy(newBuf[n:], rq.buffer[:rq.tail]) + } + + rq.head = 0 + rq.tail = rq.count + rq.buffer = newBuf +} + +func (rq *RingQueue[T]) enqueueLocked(elem T) bool { + spaceLeft := true + if rq.count == len(rq.buffer) { + if len(rq.buffer) == rq.BufferSizes.Max { + spaceLeft = false + // bitwise modulus + rq.head = (rq.head + 1) % len(rq.buffer) + rq.count-- + } else { + rq.resizeLocked() + } + } + + rq.buffer[rq.tail] = elem + rq.tail = (rq.tail + 1) % len(rq.buffer) + rq.count++ + return spaceLeft +} + +// ReversePeek returns the last element that was enqueued without removing it. +func (rq *RingQueue[T]) ReversePeek() T { + rq.mu.Lock() + defer rq.mu.Unlock() + if rq.count == 0 { + var zero T + return zero + } + return rq.buffer[(rq.tail-1+len(rq.buffer))%len(rq.buffer)] +} + +// Enqueue adds one or multiple values to the buffer. Returns false if at least one item had to be pulled out from the queue to make space for new ones +func (rq *RingQueue[T]) Enqueue(vals ...T) bool { + rq.mu.Lock() + defer rq.mu.Unlock() + if len(vals) == 0 { + return true + } + + spaceLeft := true + for _, val := range vals { + spaceLeft = rq.enqueueLocked(val) + } + return spaceLeft +} + +// Dequeue removes a value from the buffer. +func (rq *RingQueue[T]) Dequeue() T { + rq.mu.Lock() + defer rq.mu.Unlock() + + if rq.count == 0 { + var zero T + return zero + } + + ret := rq.buffer[rq.head] + // bitwise modulus + rq.head = (rq.head + 1) % len(rq.buffer) + rq.count-- + return ret +} + +// getBuffer returns the current buffer and resets it. +func (rq *RingQueue[T]) getBuffer() []T { + rq.mu.Lock() + defer rq.mu.Unlock() + return rq.getBufferLocked() +} + +func (rq *RingQueue[T]) getBufferLocked() []T { + prevBuf := rq.buffer + rq.buffer = rq.pool.Get() + rq.head, rq.tail, rq.count = 0, 0, 0 + return prevBuf +} + +// Flush returns a copy of the buffer and resets it. +func (rq *RingQueue[T]) Flush() []T { + rq.mu.Lock() + head, count := rq.head, rq.count + buf := rq.getBufferLocked() + rq.mu.Unlock() + + // If the buffer is less than 12.5% full, we let the buffer get garbage collected because it's too big for the current throughput. + // Except when the buffer is at its minimum size. + if len(buf) == rq.BufferSizes.Min || count*8 >= len(buf) { + defer rq.releaseBuffer(buf) + } + + copyBuf := make([]T, count) + for i := 0; i < count; i++ { + copyBuf[i] = buf[(head+i)%len(buf)] + } + + return copyBuf +} + +// releaseBuffer returns the buffer to the pool. +func (rq *RingQueue[T]) releaseBuffer(buf []T) { + var zero T + buf = buf[:cap(buf)] // Make sure nobody reduced the length of the buffer + for i := range buf { + buf[i] = zero + } + rq.pool.Put(buf) +} + +// IsEmpty returns true if the buffer is empty. +func (rq *RingQueue[T]) IsEmpty() bool { + return rq.Length() == 0 +} + +// IsFull returns true if the buffer is full and cannot accept more elements. +func (rq *RingQueue[T]) IsFull() bool { + rq.mu.Lock() + defer rq.mu.Unlock() + + return len(rq.buffer) == rq.count && len(rq.buffer) == rq.BufferSizes.Max +} + +// Clear removes all elements from the buffer. +func (rq *RingQueue[T]) Clear() { + rq.mu.Lock() + defer rq.mu.Unlock() + rq.head, rq.tail, rq.count = 0, 0, 0 + var zero T + for i := range rq.buffer { + rq.buffer[i] = zero + } +} diff --git a/internal/telemetry/internal/ringbuffer_test.go b/internal/telemetry/internal/ringbuffer_test.go new file mode 100644 index 0000000000..9b98eebc10 --- /dev/null +++ b/internal/telemetry/internal/ringbuffer_test.go @@ -0,0 +1,165 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestEnqueueSingleElement(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + success := queue.Enqueue(1) + assert.True(t, success) + assert.Equal(t, 1, queue.ReversePeek()) +} + +func TestEnqueueMultipleElements(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + success := queue.Enqueue(1, 2, 3) + assert.True(t, success) + assert.Equal(t, 3, queue.ReversePeek()) +} + +func TestEnqueueBeyondCapacity(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + success := queue.Enqueue(1, 2, 3, 4, 5, 6) + assert.False(t, success) + assert.Equal(t, 6, queue.ReversePeek()) +} + +func TestDequeueSingleElement(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1) + val := queue.Dequeue() + assert.Equal(t, 1, val) +} + +func TestDequeueMultipleElements(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1, 2, 3) + val1 := queue.Dequeue() + val2 := queue.Dequeue() + assert.Equal(t, 1, val1) + assert.Equal(t, 2, val2) +} + +func TestDequeueFromEmptyQueueAfterBeingFull(t *testing.T) { + queue := NewRingQueue[int](Range[int]{1, 1}) + assert.True(t, queue.Enqueue(1)) + assert.False(t, queue.Enqueue(2)) + assert.Equal(t, []int{2}, queue.Flush()) + + // Should return the zero value for int + assert.Equal(t, 0, queue.Dequeue()) +} + +func TestDequeueFromEmptyQueue(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + val := queue.Dequeue() + assert.Equal(t, 0, val) // Assuming zero value for int +} + +func TestGetBufferAndReset(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1, 2, 3) + buffer := queue.getBuffer() + assert.Equal(t, []int{1, 2, 3}, buffer) + assert.True(t, queue.IsEmpty()) +} + +func TestFlushAndReset(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1, 2, 3) + buffer := queue.Flush() + assert.Equal(t, []int{1, 2, 3}, buffer) + assert.True(t, queue.IsEmpty()) +} + +func TestIsEmptyWhenQueueIsEmpty(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + assert.True(t, queue.IsEmpty()) +} + +func TestIsEmptyWhenQueueIsNotEmpty(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1) + assert.False(t, queue.IsEmpty()) +} + +func TestIsFullWhenQueueIsFull(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1, 2, 3, 4, 5) + assert.True(t, queue.IsFull()) +} + +func TestIsFullWhenQueueIsNotFull(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 5}) + queue.Enqueue(1, 2, 3) + assert.False(t, queue.IsFull()) +} + +func TestEnqueueToFullQueue(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 3}) + success := queue.Enqueue(1, 2, 3) + assert.True(t, success) + success = queue.Enqueue(4) + assert.False(t, success) + assert.Equal(t, 4, queue.ReversePeek()) +} + +func TestDequeueFromFullQueue(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 3}) + queue.Enqueue(1, 2, 3) + val := queue.Dequeue() + assert.Equal(t, 1, val) + assert.False(t, queue.IsFull()) +} + +func TestEnqueueAfterDequeue(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 3}) + queue.Enqueue(1, 2, 3) + queue.Dequeue() + success := queue.Enqueue(4) + assert.True(t, success) + assert.Equal(t, 4, queue.ReversePeek()) +} + +func TestDequeueAllElements(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 3}) + queue.Enqueue(1, 2, 3) + val1 := queue.Dequeue() + val2 := queue.Dequeue() + val3 := queue.Dequeue() + assert.Equal(t, 1, val1) + assert.Equal(t, 2, val2) + assert.Equal(t, 3, val3) + assert.True(t, queue.IsEmpty()) +} + +func TestEnqueueAndDequeueInterleaved(t *testing.T) { + queue := NewRingQueue[int](Range[int]{3, 3}) + queue.Enqueue(1) + val1 := queue.Dequeue() + queue.Enqueue(2) + val2 := queue.Dequeue() + queue.Enqueue(3, 4) + val3 := queue.Dequeue() + assert.Equal(t, 1, val1) + assert.Equal(t, 2, val2) + assert.Equal(t, 3, val3) + assert.False(t, queue.IsEmpty()) +} + +func TestEnqueueWithResize(t *testing.T) { + queue := NewRingQueue[int](Range[int]{2, 4}) + queue.Enqueue(1, 2) + assert.Equal(t, 2, len(queue.buffer)) + queue.Enqueue(3) + assert.Equal(t, 4, len(queue.buffer)) + assert.Equal(t, 3, queue.ReversePeek()) +} diff --git a/internal/telemetry/internal/syncpool.go b/internal/telemetry/internal/syncpool.go new file mode 100644 index 0000000000..29ab2f9b1e --- /dev/null +++ b/internal/telemetry/internal/syncpool.go @@ -0,0 +1,34 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "sync" +) + +// SyncPool is a wrapper around [sync.Pool] that provides type safety. +type SyncPool[T any] struct { + pool *sync.Pool +} + +// NewSyncPool creates a new Pool with the given new function. +func NewSyncPool[T any](newT func() T) *SyncPool[T] { + return &SyncPool[T]{ + pool: &sync.Pool{ + New: func() any { + return newT() + }, + }, + } +} + +func (sp *SyncPool[T]) Get() T { + return sp.pool.Get().(T) +} + +func (sp *SyncPool[T]) Put(v T) { + sp.pool.Put(v) +} diff --git a/internal/telemetry/internal/ticker.go b/internal/telemetry/internal/ticker.go new file mode 100644 index 0000000000..4d43a624ba --- /dev/null +++ b/internal/telemetry/internal/ticker.go @@ -0,0 +1,92 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +type TickFunc func() + +type Ticker struct { + ticker *time.Ticker + + tickSpeedMu sync.Mutex + tickSpeed time.Duration + + interval Range[time.Duration] + + tickFunc TickFunc + + stopChan chan struct{} + stopped bool +} + +func NewTicker(tickFunc TickFunc, interval Range[time.Duration]) *Ticker { + ticker := &Ticker{ + ticker: time.NewTicker(interval.Max), + tickSpeed: interval.Max, + interval: interval, + tickFunc: tickFunc, + stopChan: make(chan struct{}), + } + + go func() { + for { + select { + case <-ticker.ticker.C: + tickFunc() + case <-ticker.stopChan: + return + } + } + }() + + return ticker +} + +func (t *Ticker) CanIncreaseSpeed() { + t.tickSpeedMu.Lock() + defer t.tickSpeedMu.Unlock() + + oldTickSpeed := t.tickSpeed + t.tickSpeed = t.interval.Clamp(t.tickSpeed / 2) + + if oldTickSpeed == t.tickSpeed { + return + } + + log.Debug("telemetry: increasing flush speed to an interval of %s", t.tickSpeed) + t.ticker.Reset(t.tickSpeed) +} + +func (t *Ticker) CanDecreaseSpeed() { + t.tickSpeedMu.Lock() + defer t.tickSpeedMu.Unlock() + + oldTickSpeed := t.tickSpeed + t.tickSpeed = t.interval.Clamp(t.tickSpeed * 2) + + if oldTickSpeed == t.tickSpeed { + return + } + + log.Debug("telemetry: decreasing flush speed to an interval of %s", t.tickSpeed) + t.ticker.Reset(t.tickSpeed) +} + +func (t *Ticker) Stop() { + if t.stopped { + return + } + t.ticker.Stop() + t.stopChan <- struct{}{} + close(t.stopChan) + t.stopped = true +} diff --git a/internal/telemetry/internal/tracerconfig.go b/internal/telemetry/internal/tracerconfig.go new file mode 100644 index 0000000000..439ff430f3 --- /dev/null +++ b/internal/telemetry/internal/tracerconfig.go @@ -0,0 +1,16 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +// TracerConfig is the configuration for the tracer for the telemetry client. +type TracerConfig struct { + // Service is the name of the service being traced. + Service string + // Env is the environment the service is running in. + Env string + // Version is the version of the service. + Version string +} diff --git a/internal/telemetry/internal/transport/app_closing.go b/internal/telemetry/internal/transport/app_closing.go new file mode 100644 index 0000000000..11516d34e5 --- /dev/null +++ b/internal/telemetry/internal/transport/app_closing.go @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type AppClosing struct{} + +func (AppClosing) RequestType() RequestType { + return RequestTypeAppClosing +} diff --git a/internal/telemetry/internal/transport/app_configuration_change.go b/internal/telemetry/internal/transport/app_configuration_change.go new file mode 100644 index 0000000000..d6ef75de7a --- /dev/null +++ b/internal/telemetry/internal/transport/app_configuration_change.go @@ -0,0 +1,14 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type AppClientConfigurationChange struct { + Configuration []ConfKeyValue `json:"configuration"` +} + +func (AppClientConfigurationChange) RequestType() RequestType { + return RequestTypeAppClientConfigurationChange +} diff --git a/internal/telemetry/internal/transport/app_dependencies_loaded.go b/internal/telemetry/internal/transport/app_dependencies_loaded.go new file mode 100644 index 0000000000..425b01bb9a --- /dev/null +++ b/internal/telemetry/internal/transport/app_dependencies_loaded.go @@ -0,0 +1,21 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type AppDependenciesLoaded struct { + Dependencies []Dependency `json:"dependencies"` +} + +func (AppDependenciesLoaded) RequestType() RequestType { + return RequestTypeAppDependenciesLoaded +} + +// Dependency is a Go module on which the application depends. This information +// can be accesed at run-time through the runtime/debug.ReadBuildInfo API. +type Dependency struct { + Name string `json:"name"` + Version string `json:"version,omitempty"` +} diff --git a/internal/telemetry/internal/transport/app_extended_heartbeat.go b/internal/telemetry/internal/transport/app_extended_heartbeat.go new file mode 100644 index 0000000000..62f0e5fed1 --- /dev/null +++ b/internal/telemetry/internal/transport/app_extended_heartbeat.go @@ -0,0 +1,16 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type AppExtendedHeartbeat struct { + Configuration []ConfKeyValue `json:"configuration,omitempty"` + Dependencies []Dependency `json:"dependencies,omitempty"` + Integrations []Integration `json:"integrations,omitempty"` +} + +func (AppExtendedHeartbeat) RequestType() RequestType { + return RequestTypeAppExtendedHeartBeat +} diff --git a/internal/telemetry/internal/transport/app_heartbeat.go b/internal/telemetry/internal/transport/app_heartbeat.go new file mode 100644 index 0000000000..f2d4bab392 --- /dev/null +++ b/internal/telemetry/internal/transport/app_heartbeat.go @@ -0,0 +1,16 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// All objects in this file are used to define the payload of the requests sent +// to the telemetry API. +// https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/dad49961203d74ec8236b68ce4b54bbb7ed8716f/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas + +type AppHeartbeat struct{} + +func (AppHeartbeat) RequestType() RequestType { + return RequestTypeAppHeartbeat +} diff --git a/internal/telemetry/internal/transport/app_integration_change.go b/internal/telemetry/internal/transport/app_integration_change.go new file mode 100644 index 0000000000..20244f033c --- /dev/null +++ b/internal/telemetry/internal/transport/app_integration_change.go @@ -0,0 +1,24 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type AppIntegrationChange struct { + Integrations []Integration `json:"integrations"` +} + +func (AppIntegrationChange) RequestType() RequestType { + return RequestTypeAppIntegrationsChange +} + +// Integration is an integration that is configured to be traced automatically. +type Integration struct { + Name string `json:"name"` + Enabled bool `json:"enabled"` + Version string `json:"version,omitempty"` + AutoEnabled bool `json:"auto_enabled,omitempty"` + Compatible bool `json:"compatible,omitempty"` + Error string `json:"error,omitempty"` +} diff --git a/internal/telemetry/internal/transport/app_product_change.go b/internal/telemetry/internal/transport/app_product_change.go new file mode 100644 index 0000000000..dcbf2ec674 --- /dev/null +++ b/internal/telemetry/internal/transport/app_product_change.go @@ -0,0 +1,22 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type AppProductChange struct { + Products Products `json:"products"` +} + +type Products map[Namespace]Product + +func (AppProductChange) RequestType() RequestType { + return RequestTypeAppProductChange +} + +type Product struct { + Version string `json:"version,omitempty"` + Enabled bool `json:"enabled"` + Error Error `json:"error,omitempty"` +} diff --git a/internal/telemetry/internal/transport/app_started.go b/internal/telemetry/internal/transport/app_started.go new file mode 100644 index 0000000000..3753d78926 --- /dev/null +++ b/internal/telemetry/internal/transport/app_started.go @@ -0,0 +1,37 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// All objects in this file are used to define the payload of the requests sent +// to the telemetry API. +// https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/dad49961203d74ec8236b68ce4b54bbb7ed8716f/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas + +type AppStarted struct { + Products Products `json:"products,omitempty"` + Configuration []ConfKeyValue `json:"configuration,omitempty"` + Error Error `json:"error,omitempty"` + InstallSignature InstallSignature `json:"install_signature,omitempty"` + AdditionalPayload []AdditionalPayload `json:"additional_payload,omitempty"` +} + +func (AppStarted) RequestType() RequestType { + return RequestTypeAppStarted +} + +// InstallSignature is a structure to send the install signature with the +// AppStarted payload. +type InstallSignature struct { + InstallID string `json:"install_id,omitempty"` + InstallType string `json:"install_type,omitempty"` + InstallTime string `json:"install_time,omitempty"` +} + +// AdditionalPayload is a generic structure to send additional data with the +// AppStarted payload. +type AdditionalPayload struct { + Name RequestType `json:"name"` + Value Payload `json:"value"` +} diff --git a/internal/telemetry/internal/transport/body.go b/internal/telemetry/internal/transport/body.go new file mode 100644 index 0000000000..85b15dfa36 --- /dev/null +++ b/internal/telemetry/internal/transport/body.go @@ -0,0 +1,150 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package transport + +import ( + "encoding/json" + "fmt" +) + +// Application is identifying information about the app itself +type Application struct { + ServiceName string `json:"service_name"` + Env string `json:"env"` + ServiceVersion string `json:"service_version"` + TracerVersion string `json:"tracer_version"` + LanguageName string `json:"language_name"` + LanguageVersion string `json:"language_version"` + ProcessTags string `json:"process_tags,omitempty"` +} + +// Host is identifying information about the host on which the app +// is running +type Host struct { + Hostname string `json:"hostname"` + OS string `json:"os"` + OSVersion string `json:"os_version,omitempty"` + Architecture string `json:"architecture"` + KernelName string `json:"kernel_name"` + KernelRelease string `json:"kernel_release"` + KernelVersion string `json:"kernel_version"` +} + +// Body is the common high-level structure encapsulating a telemetry request body +// Described here: https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/main/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Request%20Bodies/telemetry_body.md +type Body struct { + APIVersion string `json:"api_version"` + RequestType RequestType `json:"request_type"` + TracerTime int64 `json:"tracer_time"` + RuntimeID string `json:"runtime_id"` + SeqID int64 `json:"seq_id"` + Debug bool `json:"debug,omitempty"` + Payload Payload `json:"payload"` + Application Application `json:"application"` + Host Host `json:"host"` +} + +// UnmarshalJSON is used to test the telemetry client end to end +func (b *Body) UnmarshalJSON(bytes []byte) error { + var anyMap map[string]json.RawMessage + var err error + if err = json.Unmarshal(bytes, &anyMap); err != nil { + return err + } + + if err = json.Unmarshal(anyMap["api_version"], &b.APIVersion); err != nil { + return err + } + + if err = json.Unmarshal(anyMap["request_type"], &b.RequestType); err != nil { + return err + } + + if err = json.Unmarshal(anyMap["tracer_time"], &b.TracerTime); err != nil { + return err + } + + if err = json.Unmarshal(anyMap["runtime_id"], &b.RuntimeID); err != nil { + return err + } + + if err = json.Unmarshal(anyMap["seq_id"], &b.SeqID); err != nil { + return err + } + + if _, ok := anyMap["debug"]; ok { + if err = json.Unmarshal(anyMap["debug"], &b.Debug); err != nil { + return err + } + } + + if err = json.Unmarshal(anyMap["application"], &b.Application); err != nil { + return err + } + + if err = json.Unmarshal(anyMap["host"], &b.Host); err != nil { + return err + } + + if b.RequestType == RequestTypeMessageBatch { + var messageBatch []struct { + RequestType RequestType `json:"request_type"` + Payload json.RawMessage `json:"payload"` + } + + if err = json.Unmarshal(anyMap["payload"], &messageBatch); err != nil { + return err + } + + batch := make([]Message, len(messageBatch)) + for i, message := range messageBatch { + payload, err := unmarshalPayload(message.Payload, message.RequestType) + if err != nil { + return err + } + batch[i] = Message{RequestType: message.RequestType, Payload: payload} + } + b.Payload = MessageBatch(batch) + return nil + } + + b.Payload, err = unmarshalPayload(anyMap["payload"], b.RequestType) + return err +} + +func unmarshalPayload(bytes json.RawMessage, requestType RequestType) (Payload, error) { + var payload Payload + switch requestType { + case RequestTypeAppClientConfigurationChange: + payload = new(AppClientConfigurationChange) + case RequestTypeAppProductChange: + payload = new(AppProductChange) + case RequestTypeAppIntegrationsChange: + payload = new(AppIntegrationChange) + case RequestTypeAppHeartbeat: + payload = new(AppHeartbeat) + case RequestTypeAppStarted: + payload = new(AppStarted) + case RequestTypeAppClosing: + payload = new(AppClosing) + case RequestTypeAppExtendedHeartBeat: + payload = new(AppExtendedHeartbeat) + case RequestTypeAppDependenciesLoaded: + payload = new(AppDependenciesLoaded) + case RequestTypeDistributions: + payload = new(Distributions) + case RequestTypeGenerateMetrics: + payload = new(GenerateMetrics) + case RequestTypeLogs: + payload = new(Logs) + } + + if err := json.Unmarshal(bytes, payload); err != nil { + return nil, fmt.Errorf("failed to unmarshal payload: %s", err.Error()) + } + + return payload, nil +} diff --git a/internal/telemetry/internal/transport/conf_key_value.go b/internal/telemetry/internal/transport/conf_key_value.go new file mode 100644 index 0000000000..ea0eaf9bac --- /dev/null +++ b/internal/telemetry/internal/transport/conf_key_value.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// ConfKeyValue is a library-specific configuration value +type ConfKeyValue struct { + Name string `json:"name"` + Value any `json:"value"` // can be any type of integer, float, string, or boolean + Origin Origin `json:"origin"` + ID string `json:"config_id,omitempty"` + Error Error `json:"error,omitempty"` + + // SeqID is used to track the total number of configuration key value pairs applied across the tracer + SeqID uint64 `json:"seq_id,omitempty"` +} diff --git a/internal/telemetry/internal/transport/distributions.go b/internal/telemetry/internal/transport/distributions.go new file mode 100644 index 0000000000..1dda074488 --- /dev/null +++ b/internal/telemetry/internal/transport/distributions.go @@ -0,0 +1,36 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// All objects in this file are used to define the payload of the requests sent +// to the telemetry API. +// https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/dad49961203d74ec8236b68ce4b54bbb7ed8716f/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas + +type Distributions struct { + Namespace Namespace `json:"namespace"` + Series []DistributionSeries `json:"series"` + SkipAllowlist bool `json:"skip_allowlist,omitempty"` +} + +func (Distributions) RequestType() RequestType { + return RequestTypeDistributions +} + +// DistributionSeries is a sequence of observations for a distribution metric. +// Unlike `MetricData`, DistributionSeries does not store timestamps in `Points` +type DistributionSeries struct { + Metric string `json:"metric"` + Points []float64 `json:"points"` + Tags []string `json:"tags,omitempty"` + // Common distinguishes metrics which are cross-language vs. + // language-specific. + // + // NOTE: If this field isn't present in the request, the API assumes + // the metric is common. So we can't "omitempty" even though the + // field is technically optional. + Common bool `json:"common,omitempty"` + Namespace Namespace `json:"namespace,omitempty"` +} diff --git a/internal/telemetry/internal/transport/error.go b/internal/telemetry/internal/transport/error.go new file mode 100644 index 0000000000..b0de67be42 --- /dev/null +++ b/internal/telemetry/internal/transport/error.go @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// Error stores error information about various tracer events +type Error struct { + Code int `json:"code"` + Message string `json:"message"` +} diff --git a/internal/telemetry/internal/transport/generate-metrics.go b/internal/telemetry/internal/transport/generate-metrics.go new file mode 100644 index 0000000000..220f93a920 --- /dev/null +++ b/internal/telemetry/internal/transport/generate-metrics.go @@ -0,0 +1,53 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// All objects in this file are used to define the payload of the requests sent +// to the telemetry API. +// https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/dad49961203d74ec8236b68ce4b54bbb7ed8716f/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas + +type GenerateMetrics struct { + Namespace Namespace `json:"namespace,omitempty"` + Series []MetricData `json:"series"` + SkipAllowlist bool `json:"skip_allowlist,omitempty"` +} + +func (GenerateMetrics) RequestType() RequestType { + return RequestTypeGenerateMetrics +} + +// MetricType is the type of metric being sent, either count, gauge, or rate +// distribution is another payload altogether +type MetricType string + +const ( + RateMetric MetricType = "rate" + CountMetric MetricType = "count" + GaugeMetric MetricType = "gauge" + DistMetric MetricType = "distribution" +) + +// MetricData is a sequence of observations for a single named metric. +type MetricData struct { + Metric string `json:"metric"` + // Points stores pairs of timestamps and values + // This first value should be an int64 timestamp and the second should be a float64 value + Points [][2]any `json:"points"` + // Interval is required only for gauge and rate metrics + Interval int64 `json:"interval,omitempty"` + // Type cannot be of type distribution because there is a different payload for it + Type MetricType `json:"type,omitempty"` + Tags []string `json:"tags,omitempty"` + + // Common distinguishes metrics which are cross-language vs. + // language-specific. + // + // NOTE: If this field isn't present in the request, the API assumes + // the metric is common. So we can't "omitempty" even though the + // field is technically optional. + Common bool `json:"common"` + Namespace Namespace `json:"namespace,omitempty"` +} diff --git a/internal/telemetry/internal/transport/logs.go b/internal/telemetry/internal/transport/logs.go new file mode 100644 index 0000000000..c0cebe2849 --- /dev/null +++ b/internal/telemetry/internal/transport/logs.go @@ -0,0 +1,31 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type Logs struct { + Logs []LogMessage `json:"logs,omitempty"` +} + +func (Logs) RequestType() RequestType { + return RequestTypeLogs +} + +type LogLevel string + +const ( + LogLevelDebug LogLevel = "DEBUG" + LogLevelWarn LogLevel = "WARN" + LogLevelError LogLevel = "ERROR" +) + +type LogMessage struct { + Message string `json:"message"` + Level LogLevel `json:"level"` + Count uint32 `json:"count,omitempty"` + Tags string `json:"tags,omitempty"` // comma separated list of tags, e.g. "tag1:1,tag2:toto" + StackTrace string `json:"stack_trace,omitempty"` + TracerTime int64 `json:"tracer_time,omitempty"` // Unix timestamp in seconds +} diff --git a/internal/telemetry/internal/transport/message_batch.go b/internal/telemetry/internal/transport/message_batch.go new file mode 100644 index 0000000000..d1f9f964fe --- /dev/null +++ b/internal/telemetry/internal/transport/message_batch.go @@ -0,0 +1,17 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type MessageBatch []Message + +func (MessageBatch) RequestType() RequestType { + return RequestTypeMessageBatch +} + +type Message struct { + RequestType RequestType `json:"request_type"` + Payload Payload `json:"payload"` +} diff --git a/internal/telemetry/internal/transport/namespace.go b/internal/telemetry/internal/transport/namespace.go new file mode 100644 index 0000000000..b35e9d8253 --- /dev/null +++ b/internal/telemetry/internal/transport/namespace.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +type Namespace string + +const ( + NamespaceGeneral Namespace = "general" + NamespaceTracers Namespace = "tracers" + NamespaceProfilers Namespace = "profilers" + NamespaceAppSec Namespace = "appsec" + NamespaceIAST Namespace = "iast" + NamespaceTelemetry Namespace = "telemetry" + NamespaceCIVisibility Namespace = "civisibility" + NamespaceMLObs Namespace = "mlobs" + NamespaceRUM Namespace = "rum" +) diff --git a/internal/telemetry/internal/transport/origin.go b/internal/telemetry/internal/transport/origin.go new file mode 100644 index 0000000000..3084d12c43 --- /dev/null +++ b/internal/telemetry/internal/transport/origin.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// Origin describes the source of a configuration change +type Origin string + +const ( + OriginDefault Origin = "default" + OriginCode Origin = "code" + OriginDDConfig Origin = "dd_config" + OriginEnvVar Origin = "env_var" + OriginRemoteConfig Origin = "remote_config" + OriginLocalStableConfig Origin = "local_stable_config" + OriginManagedStableConfig Origin = "fleet_stable_config" +) diff --git a/internal/telemetry/internal/transport/payload.go b/internal/telemetry/internal/transport/payload.go new file mode 100644 index 0000000000..1a4c0a1dad --- /dev/null +++ b/internal/telemetry/internal/transport/payload.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// Payload is the interface implemented by all telemetry top-level structures, AKA payloads. +// All structs are a strict representation of what is described in Instrumentation Telemetry v2 documentation schemas: +// https://github.com/DataDog/instrumentation-telemetry-api-docs/tree/dad49961203d74ec8236b68ce4b54bbb7ed8716f/GeneratedDocumentation/ApiDocs/v2/SchemaDocumentation/Schemas +type Payload interface { + RequestType() RequestType +} diff --git a/internal/telemetry/internal/transport/requesttype.go b/internal/telemetry/internal/transport/requesttype.go new file mode 100644 index 0000000000..c1f1bd4058 --- /dev/null +++ b/internal/telemetry/internal/transport/requesttype.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package transport + +// RequestType determines how the Payload of a request should be handled +type RequestType string + +const ( + // RequestTypeAppStarted is the first message sent by the telemetry + // client, containing the configuration loaded at startup + RequestTypeAppStarted RequestType = "app-started" + + // RequestTypeAppHeartbeat is sent periodically by the client to indicate + // that the app is still running + RequestTypeAppHeartbeat RequestType = "app-heartbeat" + + // RequestTypeGenerateMetrics contains count, gauge, or rate metrics accumulated by the + // client, and is sent periodically along with the heartbeat + RequestTypeGenerateMetrics RequestType = "generate-metrics" + + // RequestTypeDistributions is to send distribution type metrics accumulated by the + // client, and is sent periodically along with the heartbeat + RequestTypeDistributions RequestType = "distributions" + + // RequestTypeAppClosing is sent when the telemetry client is stopped + RequestTypeAppClosing RequestType = "app-closing" + + // RequestTypeAppDependenciesLoaded is sent if DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED + // is enabled. Sent when Start is called for the telemetry client. + RequestTypeAppDependenciesLoaded RequestType = "app-dependencies-loaded" + + // RequestTypeAppClientConfigurationChange is sent if there are changes + // to the client library configuration + RequestTypeAppClientConfigurationChange RequestType = "app-client-configuration-change" + + // RequestTypeAppProductChange is sent when products are enabled/disabled + RequestTypeAppProductChange RequestType = "app-product-change" + + // RequestTypeAppIntegrationsChange is sent when the telemetry client starts + // with info on which integrations are used. + RequestTypeAppIntegrationsChange RequestType = "app-integrations-change" + + // RequestTypeMessageBatch is a wrapper over a list of payloads + RequestTypeMessageBatch RequestType = "message-batch" + + // RequestTypeAppExtendedHeartBeat This event will be used as a failsafe if there are any catastrophic data failure. + // The data will be used to reconstruct application records in our db. + RequestTypeAppExtendedHeartBeat RequestType = "app-extended-heartbeat" + + // RequestTypeLogs is used to send logs to the backend + RequestTypeLogs RequestType = "logs" +) diff --git a/internal/telemetry/internal/writer.go b/internal/telemetry/internal/writer.go new file mode 100644 index 0000000000..4374f61e02 --- /dev/null +++ b/internal/telemetry/internal/writer.go @@ -0,0 +1,324 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "os" + "runtime" + "sync" + "sync/atomic" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/hostname" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/osinfo" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +func newBody(config TracerConfig, debugMode bool) *transport.Body { + osHostname, err := os.Hostname() + if err != nil { + osHostname = hostname.Get() + } + + if osHostname == "" { + osHostname = "unknown" // hostname field is not allowed to be empty + } + + return &transport.Body{ + APIVersion: "v2", + RuntimeID: globalconfig.RuntimeID(), + Debug: debugMode, + Application: transport.Application{ + ServiceName: config.Service, + Env: config.Env, + ServiceVersion: config.Version, + TracerVersion: version.Tag, + LanguageName: "go", + LanguageVersion: runtime.Version(), + ProcessTags: processtags.GlobalTags().String(), + }, + Host: transport.Host{ + Hostname: osHostname, + OS: osinfo.OSName(), + OSVersion: osinfo.OSVersion(), + Architecture: osinfo.Architecture(), + KernelName: osinfo.KernelName(), + KernelRelease: osinfo.KernelRelease(), + KernelVersion: osinfo.KernelVersion(), + }, + } +} + +// Writer is an interface that allows to send telemetry data to any endpoint that implements the instrumentation telemetry v2 API. +// The telemetry data is sent as a JSON payload as described in the API documentation. +type Writer interface { + // Flush does a synchronous call to the telemetry endpoint with the given payload. Thread-safe. + // It returns a non-empty [EndpointRequestResult] slice and a nil error if the payload was sent successfully. + // Otherwise, the error is a call to [errors.Join] on all errors that occurred. + Flush(transport.Payload) ([]EndpointRequestResult, error) +} + +// EndpointRequestResult is returned by the Flush method of the Writer interface. +type EndpointRequestResult struct { + // Error is the error that occurred when sending the payload to the endpoint. This is nil if the payload was sent successfully. + Error error + // PayloadByteSize is the number of bytes that were sent to the endpoint, zero if the payload was not sent. + PayloadByteSize int + // CallDuration is the duration of the call to the endpoint if the call was successful + CallDuration time.Duration + // StatusCode is the status code of the response from the endpoint even if the call failed but only with an actual HTTP error + StatusCode int +} + +type writer struct { + mu sync.Mutex + body *transport.Body + bodyMu sync.Mutex + httpClient *http.Client + endpoints []*http.Request +} + +type WriterConfig struct { + // TracerConfig is the configuration the tracer sent when the telemetry client was created (required) + TracerConfig + // Endpoints is a list of requests that will be used alongside the body of the telemetry data to create the requests to the telemetry endpoint (required to not be empty) + // The writer will try each endpoint in order until it gets a 2XX HTTP response from the server + Endpoints []*http.Request + // HTTPClient is the http client that will be used to send the telemetry data (defaults to a copy of [http.DefaultClient]) + HTTPClient *http.Client + // Debug is a flag that indicates whether the telemetry client is in debug mode (defaults to false) + Debug bool +} + +func NewWriter(config WriterConfig) (Writer, error) { + if len(config.Endpoints) == 0 { + return nil, fmt.Errorf("telemetry/writer: no endpoints provided") + } + + if config.HTTPClient == nil { + config.HTTPClient = internal.DefaultHTTPClient(5*time.Second, true) + } + + // Don't allow the client to have a timeout higher than 5 seconds + // This is to avoid blocking the client for too long in case of network issues + if config.HTTPClient.Timeout > 5*time.Second { + copyClient := *config.HTTPClient + config.HTTPClient = ©Client + config.HTTPClient.Timeout = 5 * time.Second + } + + body := newBody(config.TracerConfig, config.Debug) + endpoints := make([]*http.Request, len(config.Endpoints)) + for i, endpoint := range config.Endpoints { + endpoints[i] = preBakeRequest(body, endpoint) + } + + return &writer{ + body: body, + httpClient: config.HTTPClient, + endpoints: endpoints, + }, nil +} + +// preBakeRequest adds all the *static* headers that we already know at the time of the creation of the writer. +// This is useful to avoid querying too many things at the time of the request. +// Headers necessary are described here: +// https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/cf17b41a30fbf31d54e2cfbfc983875d58b02fe1/GeneratedDocumentation/ApiDocs/v2/overview.md#required-http-headers +func preBakeRequest(body *transport.Body, endpoint *http.Request) *http.Request { + clonedEndpoint := endpoint.Clone(context.Background()) + if clonedEndpoint.Header == nil { + clonedEndpoint.Header = make(http.Header, 11) + } + + for key, val := range map[string]string{ + "Content-Type": "application/json", + "DD-Telemetry-API-Version": body.APIVersion, + "DD-Client-Library-Language": body.Application.LanguageName, + "DD-Client-Library-Version": body.Application.TracerVersion, + "DD-Agent-Env": body.Application.Env, + "DD-Agent-Hostname": body.Host.Hostname, + "DD-Agent-Install-Id": globalconfig.InstrumentationInstallID(), + "DD-Agent-Install-Type": globalconfig.InstrumentationInstallType(), + "DD-Agent-Install-Time": globalconfig.InstrumentationInstallTime(), + "Datadog-Container-ID": internal.ContainerID(), + "Datadog-Entity-ID": internal.EntityID(), + // TODO: add support for Cloud provider/resource-type/resource-id headers in another PR and package + // Described here: https://github.com/DataDog/instrumentation-telemetry-api-docs/blob/cf17b41a30fbf31d54e2cfbfc983875d58b02fe1/GeneratedDocumentation/ApiDocs/v2/overview.md#setting-the-serverless-telemetry-headers + } { + if val == "" { + continue + } + clonedEndpoint.Header.Add(key, val) + } + + if body.Debug { + clonedEndpoint.Header.Add("DD-Telemetry-Debug-Enabled", "true") + } + + return clonedEndpoint +} + +// setPayloadToBody sets the payload to the body of the writer and misc fields that are necessary for the payload to be sent. +func (w *writer) setPayloadToBody(payload transport.Payload) { + w.bodyMu.Lock() + defer w.bodyMu.Unlock() + w.body.SeqID++ + w.body.TracerTime = time.Now().Unix() + w.body.RequestType = payload.RequestType() + w.body.Payload = payload +} + +// newRequest creates a new http.Request with the given payload and the necessary headers. +func (w *writer) newRequest(endpoint *http.Request, requestType transport.RequestType) *http.Request { + request := endpoint.Clone(context.Background()) + request.Header.Set("DD-Telemetry-Request-Type", string(requestType)) + + pipeReader, pipeWriter := io.Pipe() + request.Body = pipeReader + go func() { + var err error + defer func() { + // This should normally never happen but since we are encoding arbitrary data in client configuration values payload we need to be careful. + if panicValue := recover(); panicValue != nil { + log.Error("telemetry/writer: panic while encoding payload!") + if err == nil { + panicErr, ok := panicValue.(error) // check if we can use the panic value as an error + if ok { + log.Error("telemetry/writer: panic while encoding payload: %v", panicErr.Error()) + } + pipeWriter.CloseWithError(panicErr) // CloseWithError with nil as parameter is like Close() + } + } + }() + + // If a previous endpoint is still trying to marshall the body, we need to wait for it to realize the pipe is closed and exit. + w.bodyMu.Lock() + defer w.bodyMu.Unlock() + + // No need to wait on this because the http client will close the pipeReader which will close the pipeWriter and finish the goroutine + err = json.NewEncoder(pipeWriter).Encode(w.body) + pipeWriter.CloseWithError(err) + }() + + return request +} + +// SumReaderCloser is a ReadCloser that wraps another ReadCloser and counts the number of bytes read. +type SumReaderCloser struct { + io.ReadCloser + n atomic.Uint64 +} + +func (s *SumReaderCloser) Read(p []byte) (n int, err error) { + n, err = s.ReadCloser.Read(p) + s.n.Add(uint64(n)) + return +} + +// WriterStatusCodeError is an error that is returned when the writer receives an unexpected status code from the server. +type WriterStatusCodeError struct { + Status string + Body string +} + +func (w *WriterStatusCodeError) Error() string { + return fmt.Sprintf("unexpected status code: %q (received body: %d bytes)", w.Status, len(w.Body)) +} + +func (w *writer) Flush(payload transport.Payload) ([]EndpointRequestResult, error) { + w.mu.Lock() + defer w.mu.Unlock() + + w.setPayloadToBody(payload) + requestType := payload.RequestType() + + var results []EndpointRequestResult + for _, endpoint := range w.endpoints { + var ( + request = w.newRequest(endpoint, requestType) + sumReaderCloser = &SumReaderCloser{ReadCloser: request.Body} + now = time.Now() + ) + + request.Body = sumReaderCloser + response, err := w.httpClient.Do(request) + if err != nil { + results = append(results, EndpointRequestResult{Error: err}) + continue + } + + // We only have a few endpoints, so we can afford to keep the response body stream open until we are done with it + defer response.Body.Close() + + if response.StatusCode >= 300 || response.StatusCode < 200 { + respBodyBytes, _ := io.ReadAll(io.LimitReader(response.Body, 256)) // maybe we can find an error reason in the response body + results = append(results, EndpointRequestResult{Error: &WriterStatusCodeError{ + Status: response.Status, + Body: string(respBodyBytes), + }, StatusCode: response.StatusCode}) + continue + } + + results = append(results, EndpointRequestResult{ + PayloadByteSize: int(sumReaderCloser.n.Load()), + CallDuration: time.Since(now), + StatusCode: response.StatusCode, + }) + + // We succeeded, no need to try the other endpoints + break + } + + var err error + if results[len(results)-1].Error != nil { + var errs []error + for _, result := range results { + errs = append(errs, result.Error) + } + err = errors.Join(errs...) + } + + return results, err +} + +// RecordWriter is a Writer that stores the payloads in memory. Used for testing purposes +type RecordWriter struct { + mu sync.Mutex + payloads []transport.Payload +} + +func (w *RecordWriter) Flush(payload transport.Payload) ([]EndpointRequestResult, error) { + w.mu.Lock() + defer w.mu.Unlock() + w.payloads = append(w.payloads, payload) + return []EndpointRequestResult{ + { + PayloadByteSize: 1, + CallDuration: time.Nanosecond, + }, + }, nil +} + +func (w *RecordWriter) Payloads() []transport.Payload { + w.mu.Lock() + defer w.mu.Unlock() + copyPayloads := make([]transport.Payload, len(w.payloads)) + copy(copyPayloads, w.payloads) + return copyPayloads +} + +var _ Writer = (*RecordWriter)(nil) diff --git a/internal/telemetry/internal/writer_test.go b/internal/telemetry/internal/writer_test.go new file mode 100644 index 0000000000..d668f7e30d --- /dev/null +++ b/internal/telemetry/internal/writer_test.go @@ -0,0 +1,303 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "net/http" + "net/http/httptest" + "net/url" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/internal/processtags" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +func TestNewWriter_ValidConfig(t *testing.T) { + config := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + Endpoints: []*http.Request{ + {Method: http.MethodPost, URL: &url.URL{Scheme: "http", Host: "localhost", Path: "/telemetry"}}, + }, + } + + writer, err := NewWriter(config) + assert.NoError(t, err) + assert.NotNil(t, writer) +} + +func TestNewWriter_NoEndpoints(t *testing.T) { + config := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + Endpoints: []*http.Request{}, + } + + writer, err := NewWriter(config) + assert.Error(t, err) + assert.Nil(t, writer) +} + +func TestNewWriter_ProcessTags(t *testing.T) { + cfg := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + Endpoints: []*http.Request{ + {Method: http.MethodPost, URL: &url.URL{Scheme: "http", Host: "localhost", Path: "/telemetry"}}, + }, + } + + t.Run("enabled", func(t *testing.T) { + w, err := NewWriter(cfg) + require.NoError(t, err) + + body := w.(*writer).body + assert.NotEmpty(t, body.Application.ProcessTags) + }) + t.Run("disabled", func(t *testing.T) { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "false") + processtags.Reload() + + w, err := NewWriter(cfg) + require.NoError(t, err) + + body := w.(*writer).body + assert.Empty(t, body.Application.ProcessTags) + }) +} + +type testPayload struct { + RequestTypeValue transport.RequestType `json:"request_type"` + marshalJSON func() ([]byte, error) +} + +func (p *testPayload) MarshalJSON() ([]byte, error) { + return p.marshalJSON() +} + +func (p *testPayload) RequestType() transport.RequestType { + return p.RequestTypeValue +} + +func TestWriter_Flush_Success(t *testing.T) { + config := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + } + + var ( + marshalJSONCalled bool + payloadReceived bool + ) + + payload := testPayload{ + RequestTypeValue: "test", + marshalJSON: func() ([]byte, error) { + marshalJSONCalled = true + return []byte(`{"request_type":"test"}`), nil + }, + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + payloadReceived = true + w.WriteHeader(http.StatusOK) + })) + defer server.Close() + + req, err := http.NewRequest(http.MethodPost, server.URL, nil) + require.NoError(t, err) + + config.Endpoints = append(config.Endpoints, req) + writer, _ := NewWriter(config) + + bytesSent, err := writer.Flush(&payload) + require.NoError(t, err) + + assert.NotZero(t, bytesSent) + assert.True(t, marshalJSONCalled) + assert.True(t, payloadReceived) +} + +func TestWriter_Flush_Failure(t *testing.T) { + config := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + } + + var ( + marshalJSONCalled atomic.Bool + payloadReceived atomic.Bool + ) + + payload := testPayload{ + RequestTypeValue: "test", + marshalJSON: func() ([]byte, error) { + marshalJSONCalled.Store(true) + return []byte(`{"request_type":"test"}`), nil + }, + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + payloadReceived.Store(true) + w.WriteHeader(http.StatusBadRequest) + })) + defer server.Close() + + req, err := http.NewRequest(http.MethodPost, server.URL, nil) + require.NoError(t, err) + + config.Endpoints = append(config.Endpoints, req) + writer, _ := NewWriter(config) + + results, err := writer.Flush(&payload) + require.Error(t, err) + assert.Len(t, results, 1) + assert.Equal(t, http.StatusBadRequest, results[0].StatusCode) + assert.ErrorContains(t, err, `400 Bad Request`) + assert.True(t, marshalJSONCalled.Load()) + assert.True(t, payloadReceived.Load()) +} + +func TestWriter_Flush_MultipleEndpoints(t *testing.T) { + config := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + } + + var ( + marshalJSONCalled int + payloadReceived1 bool + payloadReceived2 bool + ) + + payload := testPayload{ + RequestTypeValue: "test", + marshalJSON: func() ([]byte, error) { + marshalJSONCalled++ + return []byte(`{"request_type":"test"}`), nil + }, + } + + server1 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + payloadReceived1 = true + w.WriteHeader(http.StatusInternalServerError) + })) + defer server1.Close() + + server2 := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + assert.True(t, payloadReceived1) + payloadReceived2 = true + w.WriteHeader(http.StatusOK) + })) + defer server2.Close() + + req1, err := http.NewRequest(http.MethodPost, server1.URL, nil) + require.NoError(t, err) + + config.Endpoints = append(config.Endpoints, req1) + req2, err := http.NewRequest(http.MethodPost, server2.URL, nil) + require.NoError(t, err) + + config.Endpoints = append(config.Endpoints, req2) + writer, _ := NewWriter(config) + + results, err := writer.Flush(&payload) + assert.NoError(t, err) + + assert.Len(t, results, 2) + assert.Equal(t, http.StatusInternalServerError, results[0].StatusCode) + assert.ErrorContains(t, results[0].Error, `500 Internal Server Error`) + assert.Equal(t, time.Duration(0), results[0].CallDuration) + assert.Zero(t, results[0].PayloadByteSize) + + assert.Equal(t, http.StatusOK, results[1].StatusCode) + assert.InDelta(t, time.Duration(1), results[1].CallDuration, float64(time.Second)) + assert.NotZero(t, results[1].PayloadByteSize) + assert.NoError(t, results[1].Error) + + assert.Equal(t, 2, marshalJSONCalled) + assert.True(t, payloadReceived2) +} + +func TestWriterParallel(t *testing.T) { + config := WriterConfig{ + TracerConfig: TracerConfig{ + Service: "test-service", + Env: "test-env", + Version: "1.0.0", + }, + } + + var ( + marshalJSONCalled atomic.Int64 + payloadReceived atomic.Int64 + ) + + payload := testPayload{ + RequestTypeValue: "test", + marshalJSON: func() ([]byte, error) { + marshalJSONCalled.Add(1) + return []byte(`{"request_type":"test"}`), nil + }, + } + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + payloadReceived.Add(1) + w.WriteHeader(http.StatusTeapot) + })) + defer server.Close() + + req, err := http.NewRequest(http.MethodPost, server.URL, nil) + require.NoError(t, err) + + // 2 endpoints that just happens to be the same + config.Endpoints = append(config.Endpoints, req) + config.Endpoints = append(config.Endpoints, req) + + writer, _ := NewWriter(config) + + const numRequests = 100 + var wg sync.WaitGroup + wg.Add(numRequests) + for i := 0; i < numRequests; i++ { + go func() { + defer wg.Done() + _, err := writer.Flush(&payload) + require.Error(t, err) + }() + } + + wg.Wait() + + time.Sleep(50 * time.Millisecond) // ensure all marshalJSON calls are done + + assert.EqualValues(t, numRequests*2, marshalJSONCalled.Load()) + assert.EqualValues(t, numRequests*2, payloadReceived.Load()) +} diff --git a/internal/telemetry/log/log.go b/internal/telemetry/log/log.go new file mode 100644 index 0000000000..9b1047aa4f --- /dev/null +++ b/internal/telemetry/log/log.go @@ -0,0 +1,105 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package log provides secure telemetry logging with strict security controls. +// +// SECURITY MODEL: +// +// This package implements strict security controls for telemetry logging to prevent +// PII and sensitive information from being sent to external telemetry services. +// +// REQUIREMENTS: +// - Messages MUST be constant templates only - no dynamic parameter replacement +// - Stack traces MUST be redacted to show only Datadog, runtime, and known 3rd party frames +// - Errors MUST use SafeError type with message redaction +// - slog.Any() only allowed with LogValuer implementations +// +// BENEFITS: +// - Constant messages enable deduplication to reduce redundant log transmission +// +// SECURE USAGE PATTERNS: +// +// // ✅ Correct - constant message with structured data +// telemetrylog.Error("operation failed", slog.String("operation", "startup")) +// telemetrylog.Error("validation error", slog.Any("error", SafeError(err))) +// telemetrylog.Error("operation failed", slog.Any("error", SafeError(err)), WithStacktrace()) +// +// // ❌ Forbidden - dynamic messages +// telemetrylog.Error(err.Error()) // Raw error message +// telemetrylog.Error("failed: " + details) // String concatenation +// telemetrylog.Error(fmt.Sprintf("error: %s", err)) // Format strings +// +// // ❌ Forbidden - raw error exposure +// telemetrylog.Error("failed", slog.Any("error", err)) // Raw error object +// telemetrylog.Error("failed", slog.String("err", err.Error())) // Raw error message +package log + +import ( + "log/slog" + "slices" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +type Logger struct { + opts []telemetry.LogOption +} + +var ( + // defaultLogger is the global logger instance with no pre-configured options + defaultLogger atomic.Pointer[Logger] + sendLog func(r telemetry.Record, opts ...telemetry.LogOption) = telemetry.Log +) + +func init() { + defaultLogger.Store(&Logger{}) +} + +func SetDefaultLogger(logger *Logger) { + defaultLogger.CompareAndSwap(defaultLogger.Load(), logger) +} + +func With(opts ...telemetry.LogOption) *Logger { + return &Logger{ + opts: opts, + } +} + +func (l *Logger) With(opts ...telemetry.LogOption) *Logger { + return &Logger{ + opts: slices.Concat(l.opts, opts), + } +} + +func Debug(message string, attrs ...slog.Attr) { + defaultLogger.Load().Debug(message, attrs...) +} + +func Warn(message string, attrs ...slog.Attr) { + defaultLogger.Load().Warn(message, attrs...) +} + +func Error(message string, attrs ...slog.Attr) { + defaultLogger.Load().Error(message, attrs...) +} + +func (l *Logger) Debug(message string, attrs ...slog.Attr) { + record := telemetry.NewRecord(telemetry.LogDebug, message) + record.AddAttrs(attrs...) + sendLog(record, l.opts...) +} + +func (l *Logger) Warn(message string, attrs ...slog.Attr) { + record := telemetry.NewRecord(telemetry.LogWarn, message) + record.AddAttrs(attrs...) + sendLog(record, l.opts...) +} + +func (l *Logger) Error(message string, attrs ...slog.Attr) { + record := telemetry.NewRecord(telemetry.LogError, message) + record.AddAttrs(attrs...) + sendLog(record, l.opts...) +} diff --git a/internal/telemetry/log/log_test.go b/internal/telemetry/log/log_test.go new file mode 100644 index 0000000000..731da4e1a9 --- /dev/null +++ b/internal/telemetry/log/log_test.go @@ -0,0 +1,82 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package log + +import ( + "log/slog" + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" +) + +func TestLogger_With(t *testing.T) { + logger1 := &Logger{opts: []telemetry.LogOption{telemetry.WithTags([]string{"tag1"})}} + logger2 := logger1.With(telemetry.WithTags([]string{"tag2"})) + + assert.Len(t, logger2.opts, 2) + assert.NotSame(t, logger1, logger2) +} + +func TestWith(t *testing.T) { + logger := With(telemetry.WithTags([]string{"tag1"})) + + assert.Len(t, logger.opts, 1) +} + +func TestGlobalFunctions(t *testing.T) { + var capturedRecord telemetry.Record + + originalSendLog := sendLog + defer func() { sendLog = originalSendLog }() + + sendLog = func(r telemetry.Record, opts ...telemetry.LogOption) { + capturedRecord = r + } + + t.Run("Debug", func(t *testing.T) { + Debug("debug message") + assert.Equal(t, "debug message", capturedRecord.Message) + assert.Equal(t, slog.LevelDebug, capturedRecord.Level) + }) + + t.Run("Warn", func(t *testing.T) { + Warn("warn message") + assert.Equal(t, "warn message", capturedRecord.Message) + assert.Equal(t, slog.LevelWarn, capturedRecord.Level) + }) + + t.Run("Error", func(t *testing.T) { + Error("error message") + assert.Equal(t, "error message", capturedRecord.Message) + assert.Equal(t, slog.LevelError, capturedRecord.Level) + }) +} + +// TestStackTraceIntegration verifies the stack trace works with WithStacktrace +func TestStackTraceIntegration(t *testing.T) { + // This test verifies that our stacktrace approach integrates properly with stack trace generation + // We can't easily test the actual stack unwinding here, but we can verify the basic flow works + + var capturedRecord telemetry.Record + var capturedOpts []telemetry.LogOption + + originalSendLog := sendLog + defer func() { sendLog = originalSendLog }() + + sendLog = func(r telemetry.Record, opts ...telemetry.LogOption) { + capturedRecord = r + capturedOpts = opts + } + + logger := With(telemetry.WithStacktrace()) + logger.Error("error with stacktrace") + + assert.Equal(t, "error with stacktrace", capturedRecord.Message) + assert.Len(t, capturedOpts, 1) // Should have WithStacktrace option + assert.NotZero(t, capturedRecord.PC) +} diff --git a/internal/telemetry/log/safe.go b/internal/telemetry/log/safe.go new file mode 100644 index 0000000000..ab8013abfc --- /dev/null +++ b/internal/telemetry/log/safe.go @@ -0,0 +1,117 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package log + +import ( + "log/slog" + "reflect" + "strconv" +) + +// SafeError represents a sanitized error for secure telemetry logging. +// It only exposes the error type, never the error message, to prevent PII leakage. +type SafeError struct { + errType string +} + +const ( + nilErrorType = "" +) + +// NewSafeError creates a SafeError from a regular error +func NewSafeError(err error) SafeError { + if err == nil { + return SafeError{errType: nilErrorType} + } + + return SafeError{ + errType: errorType(err), + } +} + +// LogValue implements slog.LogValuer to provide secure logging representation +func (e SafeError) LogValue() slog.Value { + return slog.GroupValue( + slog.String("error_type", e.errType), + ) +} + +// errorType extracts the error type without exposing the error message +func errorType(err error) string { + if err == nil { + return nilErrorType + } + + errType := reflect.TypeOf(err) + if errType.Kind() == reflect.Ptr { + errType = errType.Elem() + } + + if errType.PkgPath() != "" { + return errType.PkgPath() + "." + errType.Name() + } + return errType.Name() +} + +// SafeSlice provides secure logging for slice/array types +type SafeSlice struct { + items []string + count int + truncated bool +} + +// NewSafeSlice creates a SafeSlice from any slice, converting items to strings +func NewSafeSlice[T any](items []T) SafeSlice { + return NewSafeSliceWithLimit(items, 100) +} + +// NewSafeSliceWithLimit creates a SafeSlice with custom item limit +func NewSafeSliceWithLimit[T any](items []T, maxItems int) SafeSlice { + stringItems := make([]string, 0, min(len(items), maxItems)) + + for i, item := range items { + if i >= maxItems { + break + } + + // Convert item to string safely - only explicit conversions allowed + var str string + switch v := any(item).(type) { + case string: + str = v + case int: + str = strconv.Itoa(v) + case int64: + str = strconv.FormatInt(v, 10) + case bool: + str = strconv.FormatBool(v) + case float64: + str = strconv.FormatFloat(v, 'g', -1, 64) + default: + str = "" + } + stringItems = append(stringItems, str) + } + + return SafeSlice{ + items: stringItems, + count: len(items), + truncated: len(items) > maxItems, + } +} + +// LogValue implements slog.LogValuer for secure slice logging +func (s SafeSlice) LogValue() slog.Value { + attrs := []slog.Attr{ + slog.Any("items", s.items), + } + + if s.truncated { + attrs = append(attrs, slog.Bool("truncated", true), slog.Int("count", s.count)) + } + + return slog.GroupValue(attrs...) +} diff --git a/internal/telemetry/log/safe_test.go b/internal/telemetry/log/safe_test.go new file mode 100644 index 0000000000..a15d07b0e3 --- /dev/null +++ b/internal/telemetry/log/safe_test.go @@ -0,0 +1,69 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package log + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestNewSafeError(t *testing.T) { + tests := []struct { + name string + err error + wantType string + }{ + { + name: "nil error", + err: nil, + wantType: nilErrorType, + }, + { + name: "standard error", + err: errors.New("sensitive data"), + wantType: "errors.errorString", + }, + { + name: "custom error type", + err: &customError{msg: "secret info"}, + wantType: "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log.customError", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + safeErr := NewSafeError(tt.err) + + require.Equal(t, tt.wantType, safeErr.errType) + + }) + } +} + +func TestSafeError_LogValue_NoSensitiveData(t *testing.T) { + sensitiveErr := errors.New("password: secret123") + safeErr := NewSafeError(sensitiveErr) + + logVal := safeErr.LogValue() + logStr := logVal.String() + + // Verify no sensitive data leaks + require.NotContains(t, logStr, "password", "SafeError.LogValue() leaked password") + require.NotContains(t, logStr, "secret123", "SafeError.LogValue() leaked secret") + + // Verify only error type is present + require.Contains(t, logStr, "errors.errorString", "SafeError.LogValue() missing error type") +} + +type customError struct { + msg string +} + +func (e *customError) Error() string { + return e.msg +} diff --git a/internal/telemetry/message.go b/internal/telemetry/message.go deleted file mode 100644 index 27a72768d9..0000000000 --- a/internal/telemetry/message.go +++ /dev/null @@ -1,305 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. - -package telemetry - -import ( - "bytes" - "fmt" - "net/http" -) - -// Request captures all necessary information for a telemetry event submission -type Request struct { - Body *Body - Header *http.Header - HTTPClient *http.Client - URL string -} - -// Body is the common high-level structure encapsulating a telemetry request body -type Body struct { - APIVersion string `json:"api_version"` - RequestType RequestType `json:"request_type"` - TracerTime int64 `json:"tracer_time"` - RuntimeID string `json:"runtime_id"` - SeqID int64 `json:"seq_id"` - Debug bool `json:"debug"` - Payload interface{} `json:"payload"` - Application Application `json:"application"` - Host Host `json:"host"` -} - -// RequestType determines how the Payload of a request should be handled -type RequestType string - -const ( - // RequestTypeAppStarted is the first message sent by the telemetry - // client, containing the configuration loaded at startup - RequestTypeAppStarted RequestType = "app-started" - // RequestTypeAppHeartbeat is sent periodically by the client to indicate - // that the app is still running - RequestTypeAppHeartbeat RequestType = "app-heartbeat" - // RequestTypeGenerateMetrics contains count, gauge, or rate metrics accumulated by the - // client, and is sent periodically along with the heartbeat - RequestTypeGenerateMetrics RequestType = "generate-metrics" - // RequestTypeDistributions is to send distribution type metrics accumulated by the - // client, and is sent periodically along with the heartbeat - RequestTypeDistributions RequestType = "distributions" - // RequestTypeAppClosing is sent when the telemetry client is stopped - RequestTypeAppClosing RequestType = "app-closing" - // RequestTypeDependenciesLoaded is sent if DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED - // is enabled. Sent when Start is called for the telemetry client. - RequestTypeDependenciesLoaded RequestType = "app-dependencies-loaded" - // RequestTypeAppClientConfigurationChange is sent if there are changes - // to the client library configuration - RequestTypeAppClientConfigurationChange RequestType = "app-client-configuration-change" - // RequestTypeAppProductChange is sent when products are enabled/disabled - RequestTypeAppProductChange RequestType = "app-product-change" - // RequestTypeAppIntegrationsChange is sent when the telemetry client starts - // with info on which integrations are used. - RequestTypeAppIntegrationsChange RequestType = "app-integrations-change" -) - -// Namespace describes an APM product to distinguish telemetry coming from -// different products used by the same application -type Namespace string - -const ( - // NamespaceGeneral is for general use - NamespaceGeneral Namespace = "general" - // NamespaceTracers is for distributed tracing - NamespaceTracers Namespace = "tracers" - // NamespaceProfilers is for continuous profiling - NamespaceProfilers Namespace = "profilers" - // NamespaceAppSec is for application security management - NamespaceAppSec Namespace = "appsec" -) - -// Application is identifying information about the app itself -type Application struct { - ServiceName string `json:"service_name"` - Env string `json:"env"` - ServiceVersion string `json:"service_version"` - TracerVersion string `json:"tracer_version"` - LanguageName string `json:"language_name"` - LanguageVersion string `json:"language_version"` - RuntimeName string `json:"runtime_name"` - RuntimeVersion string `json:"runtime_version"` - RuntimePatches string `json:"runtime_patches,omitempty"` -} - -// Host is identifying information about the host on which the app -// is running -type Host struct { - Hostname string `json:"hostname"` - OS string `json:"os"` - OSVersion string `json:"os_version,omitempty"` - // TODO: Do we care about the kernel stuff? internal/osinfo gets most of - // this information in OSName/OSVersion - Architecture string `json:"architecture"` - KernelName string `json:"kernel_name"` - KernelRelease string `json:"kernel_release"` - KernelVersion string `json:"kernel_version"` -} - -// AppStarted corresponds to the "app-started" request type -type AppStarted struct { - Configuration []Configuration `json:"configuration,omitempty"` - Products Products `json:"products,omitempty"` - AdditionalPayload []AdditionalPayload `json:"additional_payload,omitempty"` - Error Error `json:"error,omitempty"` - RemoteConfig *RemoteConfig `json:"remote_config,omitempty"` -} - -// IntegrationsChange corresponds to the app-integrations-change requesty type -type IntegrationsChange struct { - Integrations []Integration `json:"integrations"` -} - -// Integration is an integration that is configured to be traced automatically. -type Integration struct { - Name string `json:"name"` - Enabled bool `json:"enabled"` - Version string `json:"version,omitempty"` - AutoEnabled bool `json:"auto_enabled,omitempty"` - Compatible bool `json:"compatible,omitempty"` - Error string `json:"error,omitempty"` -} - -// ConfigurationChange corresponds to the `AppClientConfigurationChange` event -// that contains information about configuration changes since the app-started event -type ConfigurationChange struct { - Configuration []Configuration `json:"configuration"` - RemoteConfig *RemoteConfig `json:"remote_config,omitempty"` -} - -type Origin int - -const ( - OriginDefault Origin = iota - OriginCode - OriginDDConfig - OriginEnvVar - OriginRemoteConfig -) - -func (o Origin) String() string { - switch o { - case OriginDefault: - return "default" - case OriginCode: - return "code" - case OriginDDConfig: - return "dd_config" - case OriginEnvVar: - return "env_var" - case OriginRemoteConfig: - return "remote_config" - default: - return fmt.Sprintf("unknown origin %d", o) - } -} - -func (o Origin) MarshalJSON() ([]byte, error) { - var b bytes.Buffer - b.WriteString(`"`) - b.WriteString(o.String()) - b.WriteString(`"`) - return b.Bytes(), nil -} - -// Configuration is a library-specific configuration value -// that should be initialized through StringConfig, IntConfig, FloatConfig, or BoolConfig -type Configuration struct { - Name string `json:"name"` - Value interface{} `json:"value"` - // origin is the source of the config. It is one of {default, env_var, code, dd_config, remote_config}. - Origin Origin `json:"origin"` - Error Error `json:"error"` - IsOverriden bool `json:"is_overridden"` -} - -// TODO: be able to pass in origin, error, isOverriden info to config -// constructors - -// StringConfig returns a Configuration struct with a string value -func StringConfig(key string, val string) Configuration { - return Configuration{Name: key, Value: val} -} - -// IntConfig returns a Configuration struct with a int value -func IntConfig(key string, val int) Configuration { - return Configuration{Name: key, Value: val} -} - -// FloatConfig returns a Configuration struct with a float value -func FloatConfig(key string, val float64) Configuration { - return Configuration{Name: key, Value: val} -} - -// BoolConfig returns a Configuration struct with a bool value -func BoolConfig(key string, val bool) Configuration { - return Configuration{Name: key, Value: val} -} - -// ProductsPayload is the top-level key for the app-product-change payload. -type ProductsPayload struct { - Products Products `json:"products"` -} - -// Products specifies information about available products. -type Products struct { - AppSec ProductDetails `json:"appsec,omitempty"` - Profiler ProductDetails `json:"profiler,omitempty"` -} - -// ProductDetails specifies details about a product. -type ProductDetails struct { - Enabled bool `json:"enabled"` - Version string `json:"version,omitempty"` - Error Error `json:"error,omitempty"` -} - -// Dependencies stores a list of dependencies -type Dependencies struct { - Dependencies []Dependency `json:"dependencies"` -} - -// Dependency is a Go module on which the application depends. This information -// can be accesed at run-time through the runtime/debug.ReadBuildInfo API. -type Dependency struct { - Name string `json:"name"` - Version string `json:"version"` -} - -// RemoteConfig contains information about remote-config -type RemoteConfig struct { - UserEnabled string `json:"user_enabled"` // whether the library has made a request to fetch remote-config - ConfigsRecieved bool `json:"configs_received"` // whether the library receives a valid config response - RcID string `json:"rc_id,omitempty"` - RcRevision string `json:"rc_revision,omitempty"` - RcVersion string `json:"rc_version,omitempty"` - Error Error `json:"error,omitempty"` -} - -// Error stores error information about various tracer events -type Error struct { - Code int `json:"code"` - Message string `json:"message"` -} - -// AdditionalPayload can be used to add extra information to the app-started -// event -type AdditionalPayload struct { - Name string `json:"name"` - Value interface{} `json:"value"` -} - -// Metrics corresponds to the "generate-metrics" request type -type Metrics struct { - Namespace Namespace `json:"namespace"` - Series []Series `json:"series"` -} - -// DistributionMetrics corresponds to the "distributions" request type -type DistributionMetrics struct { - Namespace Namespace `json:"namespace"` - Series []DistributionSeries `json:"series"` -} - -// Series is a sequence of observations for a single named metric. -// The `Points` field will store a timestamp and value. -type Series struct { - Metric string `json:"metric"` - Points [][2]float64 `json:"points"` - // Interval is required for gauge and rate metrics - Interval int `json:"interval,omitempty"` - Type string `json:"type,omitempty"` - Tags []string `json:"tags"` - // Common distinguishes metrics which are cross-language vs. - // language-specific. - // - // NOTE: If this field isn't present in the request, the API assumes - // the metric is common. So we can't "omitempty" even though the - // field is technically optional. - Common bool `json:"common"` - Namespace string `json:"namespace"` -} - -// DistributionSeries is a sequence of observations for a distribution metric. -// Unlike `Series`, DistributionSeries does not store timestamps in `Points` -type DistributionSeries struct { - Metric string `json:"metric"` - Points []float64 `json:"points"` - Tags []string `json:"tags"` - // Common distinguishes metrics which are cross-language vs. - // language-specific. - // - // NOTE: If this field isn't present in the request, the API assumes - // the metric is common. So we can't "omitempty" even though the - // field is technically optional. - Common bool `json:"common"` -} diff --git a/internal/telemetry/metrichandle.go b/internal/telemetry/metrichandle.go new file mode 100644 index 0000000000..92842f6734 --- /dev/null +++ b/internal/telemetry/metrichandle.go @@ -0,0 +1,72 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "math" + "sync" + "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal" +) + +// noopMetricHandle is a no-op implementation of a metric handle. +type noopMetricHandle struct{} + +func (noopMetricHandle) Submit(_ float64) {} + +func (noopMetricHandle) Get() float64 { + return math.NaN() +} + +var metricLogLossOnce sync.Once + +// swappableMetricHandle is a MetricHandle that holds a pointer to another MetricHandle and a recorder to replay actions done before the actual MetricHandle is set. +type swappableMetricHandle struct { + ptr atomic.Pointer[MetricHandle] + recorder internal.Recorder[MetricHandle] + maker func(client Client) MetricHandle +} + +func (t *swappableMetricHandle) Submit(value float64) { + if Disabled() { + return + } + + inner := t.ptr.Load() + if inner == nil || *inner == nil { + if !t.recorder.Record(func(handle MetricHandle) { + handle.Submit(value) + }) { + metricLogLossOnce.Do(func() { + msg := "telemetry: metric is losing values because the telemetry client has not been started yet, dropping telemetry data, please start the telemetry client earlier to avoid data loss" + log.Debug("%s\n", msg) + Log(NewRecord(LogError, msg), WithStacktrace()) + }) + } + return + } + + (*inner).Submit(value) +} + +func (t *swappableMetricHandle) Get() float64 { + inner := t.ptr.Load() + if inner == nil || *inner == nil { + return 0 + } + + return (*inner).Get() +} + +func (t *swappableMetricHandle) swap(handle MetricHandle) { + if t.ptr.Swap(&handle) == nil { + t.recorder.Replay(handle) + } +} + +var _ MetricHandle = (*swappableMetricHandle)(nil) diff --git a/internal/telemetry/metrics.go b/internal/telemetry/metrics.go new file mode 100644 index 0000000000..8715cd7bd7 --- /dev/null +++ b/internal/telemetry/metrics.go @@ -0,0 +1,256 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "fmt" + "math" + "sort" + "strings" + "sync/atomic" + "time" + + "github.com/puzpuzpuz/xsync/v3" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +// metricKey is used as a key in the metrics store hash map. +type metricKey struct { + namespace Namespace + kind transport.MetricType + name string + tags string +} + +func (k metricKey) SplitTags() []string { + if k.tags == "" { + return nil + } + return strings.Split(k.tags, ",") +} + +func (k metricKey) String() string { + return fmt.Sprintf("%s.%s.%s.%s", k.namespace, k.kind, k.name, k.tags) +} + +func validateMetricKey(namespace Namespace, kind transport.MetricType, name string, tags []string) error { + if len(name) == 0 { + return fmt.Errorf("metric name with tags %v should be empty", tags) + } + + if !knownmetrics.IsKnownMetric(namespace, kind, name) { + return fmt.Errorf("metric name %q of kind %q in namespace %q is not a known metric, please update the list of metric names running ./scripts/gen_known_metrics.sh or check that you wrote the name correctly. "+ + "The metric will still be sent", name, string(kind), namespace) + } + + for _, tag := range tags { + if len(tag) == 0 { + return fmt.Errorf("metric %q should not have empty tags", name) + } + + if strings.Contains(tag, ",") { + return fmt.Errorf("metric %q tag %q should not contain commas", name, tag) + } + } + + return nil +} + +// newMetricKey returns a new metricKey with the given parameters with the tags sorted and joined by commas. +func newMetricKey(namespace Namespace, kind transport.MetricType, name string, tags []string) metricKey { + sort.Strings(tags) + return metricKey{namespace: namespace, kind: kind, name: name, tags: strings.Join(tags, ",")} +} + +// metricsHandle is the internal equivalent of MetricHandle for Count/Rate/Gauge metrics that are sent via the payload [transport.GenerateMetrics]. +type metricHandle interface { + MetricHandle + Payload() transport.MetricData +} + +type metrics struct { + store *xsync.MapOf[metricKey, metricHandle] + skipAllowlist bool // Debugging feature to skip the allowlist of known metrics +} + +// LoadOrStore returns a MetricHandle for the given metric key. If the metric key does not exist, it will be created. +func (m *metrics) LoadOrStore(namespace Namespace, kind transport.MetricType, name string, tags []string) MetricHandle { + + var ( + key = newMetricKey(namespace, kind, name, tags) + handle MetricHandle + loaded bool + ) + switch kind { + case transport.CountMetric: + handle, loaded = m.store.LoadOrCompute(key, func() metricHandle { return &count{metric: metric{key: key}} }) + case transport.GaugeMetric: + handle, loaded = m.store.LoadOrCompute(key, func() metricHandle { return &gauge{metric: metric{key: key}} }) + case transport.RateMetric: + handle, loaded = m.store.LoadOrCompute(key, func() metricHandle { + rate := &rate{count: count{metric: metric{key: key}}} + now := time.Now() + rate.intervalStart.Store(&now) + return rate + }) + default: + log.Warn("telemetry: unknown metric type %q", kind) + return nil + } + + if !loaded && !m.skipAllowlist { // The metric is new: validate and log issues about it + if err := validateMetricKey(namespace, kind, name, tags); err != nil { + log.Warn("telemetry: %s", err.Error()) + } + } + + return handle +} + +func (m *metrics) Payload() transport.Payload { + series := make([]transport.MetricData, 0, m.store.Size()) + m.store.Range(func(_ metricKey, handle metricHandle) bool { + if payload := handle.Payload(); payload.Type != "" { + series = append(series, payload) + } + return true + }) + + if len(series) == 0 { + return nil + } + + return transport.GenerateMetrics{Series: series, SkipAllowlist: m.skipAllowlist} +} + +type metricPoint struct { + value float64 + time time.Time +} + +// metric is a meta t +type metric struct { + key metricKey + ptr atomic.Pointer[metricPoint] +} + +func (m *metric) Get() float64 { + if ptr := m.ptr.Load(); ptr != nil { + return ptr.value + } + + return math.NaN() +} + +func (m *metric) Payload() transport.MetricData { + point := m.ptr.Swap(nil) + if point == nil { + return transport.MetricData{} + } + return m.payload(point) +} + +func (m *metric) payload(point *metricPoint) transport.MetricData { + if point == nil { + return transport.MetricData{} + } + + return transport.MetricData{ + Metric: m.key.name, + Namespace: m.key.namespace, + Tags: m.key.SplitTags(), + Type: m.key.kind, + Common: knownmetrics.IsCommonMetric(m.key.namespace, m.key.kind, m.key.name), + Points: [][2]any{ + {point.time.Unix(), point.value}, + }, + } +} + +// count is a metric that represents a single value that is incremented over time and flush and reset at zero when flushed +type count struct { + metric +} + +func (m *count) Submit(newValue float64) { + newPoint := new(metricPoint) + newPoint.time = time.Now() + for { + oldPoint := m.ptr.Load() + var oldValue float64 + if oldPoint != nil { + oldValue = oldPoint.value + } + newPoint.value = oldValue + newValue + if m.ptr.CompareAndSwap(oldPoint, newPoint) { + return + } + } +} + +// gauge is a metric that represents a single value at a point in time that is not incremental +type gauge struct { + metric +} + +func (g *gauge) Submit(value float64) { + newPoint := new(metricPoint) + newPoint.time = time.Now() + newPoint.value = value + for { + oldPoint := g.ptr.Load() + if g.ptr.CompareAndSwap(oldPoint, newPoint) { + return + } + } +} + +// rate is like a count metric but the value sent is divided by an interval of time that is also sent/ +type rate struct { + count + intervalStart atomic.Pointer[time.Time] +} + +func (r *rate) Get() float64 { + sum := r.count.Get() + intervalStart := r.intervalStart.Load() + if intervalStart == nil { + return math.NaN() + } + + intervalSeconds := time.Since(*intervalStart).Seconds() + if int64(intervalSeconds) == 0 { // Interval for rate is too small, we prefer not sending data over sending something wrong + return math.NaN() + } + + return sum / intervalSeconds +} + +func (r *rate) Payload() transport.MetricData { + now := time.Now() + intervalStart := r.intervalStart.Swap(&now) + if intervalStart == nil { + return transport.MetricData{} + } + + intervalSeconds := time.Since(*intervalStart).Seconds() + if int64(intervalSeconds) == 0 { // Interval for rate is too small, we prefer not sending data over sending something wrong + return transport.MetricData{} + } + + point := r.ptr.Swap(nil) + if point == nil { + return transport.MetricData{} + } + + point.value /= intervalSeconds + payload := r.metric.payload(point) + payload.Interval = int64(intervalSeconds) + return payload +} diff --git a/internal/telemetry/option.go b/internal/telemetry/option.go deleted file mode 100644 index 3a0c9ee027..0000000000 --- a/internal/telemetry/option.go +++ /dev/null @@ -1,143 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -package telemetry - -import ( - "errors" - "net/http" - "net/url" - "os" - "path/filepath" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" -) - -// An Option is used to configure the telemetry client's settings -type Option func(*client) - -// ApplyOps sets various fields of the client. -// To be called before starting any product. -func (c *client) ApplyOps(opts ...Option) { - c.mu.Lock() - defer c.mu.Unlock() - for _, opt := range opts { - opt(c) - } -} - -// WithNamespace sets name as the telemetry client's namespace (tracer, profiler, appsec) -func WithNamespace(name Namespace) Option { - return func(client *client) { - client.Namespace = name - } -} - -// WithEnv sets the app specific environment for the telemetry client -func WithEnv(env string) Option { - return func(client *client) { - client.Env = env - } -} - -// WithService sets the app specific service for the telemetry client -func WithService(service string) Option { - return func(client *client) { - client.Service = service - } -} - -// WithVersion sets the app specific version for the telemetry client -func WithVersion(version string) Option { - return func(client *client) { - client.Version = version - } -} - -// WithHTTPClient specifies the http client for the telemetry client -func WithHTTPClient(httpClient *http.Client) Option { - return func(client *client) { - client.Client = httpClient - } -} - -func defaultAPIKey() string { - return os.Getenv("DD_API_KEY") -} - -// WithAPIKey sets the DD API KEY for the telemetry client -func WithAPIKey(v string) Option { - return func(client *client) { - client.APIKey = v - } -} - -// WithURL sets the URL for where telemetry information is flushed to. -// For the URL, uploading through agent goes through -// -// ${AGENT_URL}/telemetry/proxy/api/v2/apmtelemetry -// -// for agentless: -// -// https://instrumentation-telemetry-intake.datadoghq.com/api/v2/apmtelemetry -// -// with an API key -func WithURL(agentless bool, agentURL string) Option { - return func(client *client) { - if agentless { - client.URL = getAgentlessURL() - } else { - u, err := url.Parse(agentURL) - if err == nil { - u.Path = "/telemetry/proxy/api/v2/apmtelemetry" - client.URL = u.String() - } else { - log("Agent URL %s is invalid, switching to agentless telemetry endpoint", agentURL) - client.URL = getAgentlessURL() - } - } - } -} - -func getAgentlessURL() string { - agentlessEndpointLock.RLock() - defer agentlessEndpointLock.RUnlock() - return agentlessURL -} - -// configEnvFallback returns the value of environment variable with the -// given key if def == "" -func configEnvFallback(key, def string) string { - if def != "" { - return def - } - return os.Getenv(key) -} - -// fallbackOps populates missing fields of the client with environment variables -// or default values. -func (c *client) fallbackOps() error { - if c.Client == nil { - WithHTTPClient(defaultHTTPClient)(c) - } - if len(c.APIKey) == 0 && c.URL == getAgentlessURL() { - WithAPIKey(defaultAPIKey())(c) - if c.APIKey == "" { - return errors.New("agentless is turned on, but valid DD API key was not found") - } - } - c.Service = configEnvFallback("DD_SERVICE", c.Service) - if len(c.Service) == 0 { - if name := globalconfig.ServiceName(); len(name) != 0 { - c.Service = name - } else { - c.Service = filepath.Base(os.Args[0]) - - } - } - c.Env = configEnvFallback("DD_ENV", c.Env) - c.Version = configEnvFallback("DD_VERSION", c.Version) - return nil -} diff --git a/internal/telemetry/options.go b/internal/telemetry/options.go new file mode 100644 index 0000000000..a1387b1eb8 --- /dev/null +++ b/internal/telemetry/options.go @@ -0,0 +1,34 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "strings" +) + +// WithTags returns a LogOption that sets the tags for the telemetry log message. Tags are key-value pairs that are then +// serialized into a simple "key:value,key2:value2" format. No quoting or escaping is performed. +func WithTags(tags []string) LogOption { + compiledTags := strings.Join(tags, ",") + return func(key *loggerKey, _ *loggerValue) { + if key == nil { + return + } + key.tags = compiledTags + } +} + +// WithStacktrace returns a LogOption that sets the stacktrace for the telemetry log message. The stacktrace is a string +// that is generated inside the WithStacktrace function. Logs demultiplication does not take the stacktrace into account. +// This means that a log that has been demultiplicated will only show of the first log. +func WithStacktrace() LogOption { + return func(_ *loggerKey, value *loggerValue) { + if value == nil { + return + } + value.captureStacktrace = true + } +} diff --git a/internal/telemetry/product.go b/internal/telemetry/product.go new file mode 100644 index 0000000000..166428749a --- /dev/null +++ b/internal/telemetry/product.go @@ -0,0 +1,51 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "sync" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type products struct { + mu sync.Mutex + products map[Namespace]transport.Product +} + +func (p *products) Add(namespace Namespace, enabled bool, err error) { + p.mu.Lock() + defer p.mu.Unlock() + if p.products == nil { + p.products = make(map[Namespace]transport.Product) + } + + product := transport.Product{ + Enabled: enabled, + } + + if err != nil { + product.Error = transport.Error{ + Message: err.Error(), + } + } + + p.products[namespace] = product +} + +func (p *products) Payload() transport.Payload { + p.mu.Lock() + defer p.mu.Unlock() + if len(p.products) == 0 { + return nil + } + + res := transport.AppProductChange{ + Products: p.products, + } + p.products = nil + return res +} diff --git a/internal/telemetry/record.go b/internal/telemetry/record.go new file mode 100644 index 0000000000..5c8181affd --- /dev/null +++ b/internal/telemetry/record.go @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetry + +import ( + "log/slog" + "runtime" + "time" +) + +type Record struct { + slog.Record +} + +func logLevelToSlogLevel(level LogLevel) slog.Level { + switch level { + case LogDebug: + return slog.LevelDebug + case LogWarn: + return slog.LevelWarn + case LogError: + return slog.LevelError + default: + return slog.LevelError + } +} + +func slogLevelToLogLevel(level slog.Level) LogLevel { + switch level { + case slog.LevelDebug: + return LogDebug + case slog.LevelWarn: + return LogWarn + case slog.LevelError: + return LogError + default: + return LogError + } +} + +func NewRecord(level LogLevel, message string) Record { + var pcs [1]uintptr + runtime.Callers(3, pcs[:]) + return Record{ + Record: slog.Record{ + Time: time.Now(), + Level: logLevelToSlogLevel(level), + Message: message, + PC: pcs[0], + }, + } +} diff --git a/internal/telemetry/telemetry.go b/internal/telemetry/telemetry.go deleted file mode 100644 index a9563b1047..0000000000 --- a/internal/telemetry/telemetry.go +++ /dev/null @@ -1,126 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -// Package telemetry implements a client for sending telemetry information to -// Datadog regarding usage of an APM library such as tracing or profiling. -package telemetry - -import ( - "time" -) - -// ProductChange signals that the product has changed with some configuration -// information. It will start the telemetry client if it is not already started, -// unless enabled is false (in which case the call does nothing). ProductChange -// assumes that the telemetry client has been configured already by the caller -// using the ApplyOps method. -// If the client is already started, it will send any necessary -// app-product-change events to indicate whether the product is enabled, as well -// as an app-client-configuration-change event in case any new configuration -// information is available. -func (c *client) ProductChange(namespace Namespace, enabled bool, configuration []Configuration) { - c.mu.Lock() - defer c.mu.Unlock() - if !c.started { - if !enabled { - // Namespace is not enabled & telemetry isn't started, won't start it now. - return - } - c.start(configuration, namespace, true) - return - } - - var cfg []Configuration - cfg = append(cfg, c.globalAppConfig...) - cfg = append(cfg, configuration...) - c.configChange(cfg) - - switch namespace { - case NamespaceTracers, NamespaceProfilers, NamespaceAppSec: - c.productChange(namespace, enabled) - default: - log("unknown product namespace %q provided to ProductChange", namespace) - } -} - -// ConfigChange is a thread-safe method to enqueue an app-client-configuration-change event. -func (c *client) ConfigChange(configuration []Configuration) { - c.mu.Lock() - defer c.mu.Unlock() - c.configChange(configuration) -} - -// configChange enqueues an app-client-configuration-change event to be flushed. -// Must be called with c.mu locked. -func (c *client) configChange(configuration []Configuration) { - if !c.started { - log("attempted to send config change event, but telemetry client has not started") - return - } - if len(configuration) > 0 { - configChange := new(ConfigurationChange) - configChange.Configuration = configuration - configReq := c.newRequest(RequestTypeAppClientConfigurationChange) - configReq.Body.Payload = configChange - c.scheduleSubmit(configReq) - } -} - -// productChange enqueues an app-product-change event that signals a product has been `enabled`. -// Must be called with c.mu locked. An app-product-change event with enabled=true indicates -// that a certain product has been used for this application. -func (c *client) productChange(namespace Namespace, enabled bool) { - if !c.started { - log("attempted to send product change event, but telemetry client has not started") - return - } - products := new(ProductsPayload) - switch namespace { - case NamespaceAppSec: - products.Products.AppSec = ProductDetails{Enabled: enabled} - case NamespaceProfilers: - products.Products.Profiler = ProductDetails{Enabled: enabled} - case NamespaceTracers: - // Nothing to do - default: - log("unknown product namespace: %q. The app-product-change telemetry event will not send", namespace) - return - } - productReq := c.newRequest(RequestTypeAppProductChange) - productReq.Body.Payload = products - c.scheduleSubmit(productReq) -} - -// Integrations returns which integrations are tracked by telemetry. -func Integrations() []Integration { - contrib.Lock() - defer contrib.Unlock() - return contribPackages -} - -// LoadIntegration notifies telemetry that an integration is being used. -func LoadIntegration(name string) { - if Disabled() { - return - } - contrib.Lock() - defer contrib.Unlock() - contribPackages = append(contribPackages, Integration{Name: name, Enabled: true}) -} - -// Time is used to track a distribution metric that measures the time (ms) -// of some portion of code. It returns a function that should be called when -// the desired code finishes executing. -// For example, by adding: -// defer Time(namespace, "init_time", nil, true)() -// at the beginning of the tracer Start function, the tracer start time is measured -// and stored as a metric to be flushed by the global telemetry client. -func Time(namespace Namespace, name string, tags []string, common bool) (finish func()) { - start := time.Now() - return func() { - elapsed := time.Since(start) - GlobalClient.Record(namespace, MetricKindDist, name, float64(elapsed.Milliseconds()), tags, common) - } -} diff --git a/internal/telemetry/telemetry_test.go b/internal/telemetry/telemetry_test.go deleted file mode 100644 index 87d40ff02a..0000000000 --- a/internal/telemetry/telemetry_test.go +++ /dev/null @@ -1,169 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -// Package telemetry implements a client for sending telemetry information to -// Datadog regarding usage of an APM library such as tracing or profiling. - -package telemetry - -import ( - "context" - "net/http" - "net/http/httptest" - "sync" - "testing" - "time" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestProductEnabled(t *testing.T) { - client := new(client) - client.start(nil, NamespaceTracers, true) - client.productChange(NamespaceProfilers, true) - // should just contain app-product-change - require.Len(t, client.requests, 1) - body := client.requests[0].Body - - assert.Equal(t, RequestTypeAppProductChange, body.RequestType) - var productsPayload = body.Payload.(*ProductsPayload) - assert.True(t, productsPayload.Products.Profiler.Enabled) -} - -func TestConfigChange(t *testing.T) { - client := new(client) - client.start(nil, NamespaceTracers, true) - client.configChange([]Configuration{BoolConfig("delta_profiles", true)}) - require.Len(t, client.requests, 1) - - body := client.requests[0].Body - assert.Equal(t, RequestTypeAppClientConfigurationChange, body.RequestType) - var configPayload = client.requests[0].Body.Payload.(*ConfigurationChange) - require.Len(t, configPayload.Configuration, 1) - - Check(t, configPayload.Configuration, "delta_profiles", true) -} - -// mockServer initializes a server that expects a strict amount of telemetry events. It saves these -// events in a slice until the expected number of events is reached. -// the `genTelemetry` argument accepts a function that should generate the expected telemetry events via calls to the global client -// the `expectedHits` argument specifies the number of telemetry events the server should expect. -func mockServer(ctx context.Context, t *testing.T, expectedHits int, genTelemetry func(), exclude ...RequestType) (waitForEvents func() []RequestType, cleanup func()) { - messages := make([]RequestType, expectedHits) - hits := 0 - done := make(chan struct{}) - mu := sync.Mutex{} - excludeEvent := make(map[RequestType]struct{}) - for _, event := range exclude { - excludeEvent[event] = struct{}{} - } - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/telemetry/proxy/api/v2/apmtelemetry" { - return - } - rType := RequestType(r.Header.Get("DD-Telemetry-Request-Type")) - if _, ok := excludeEvent[rType]; ok { - return - } - mu.Lock() - defer mu.Unlock() - if hits == expectedHits { - t.Fatalf("too many telemetry messages (expected %d)", expectedHits) - } - messages[hits] = rType - if hits++; hits == expectedHits { - done <- struct{}{} - } - })) - GlobalClient.ApplyOps(WithURL(false, server.URL)) - - return func() []RequestType { - genTelemetry() - select { - case <-ctx.Done(): - t.Fatal("TestProductChange timed out") - case <-done: - } - return messages - }, func() { - server.Close() - GlobalClient.Stop() - } -} - -func TestProductChange(t *testing.T) { - // this test is meant to ensure that a given sequence of ProductStart/ProductStop calls - // emits the expected telemetry events. - t.Setenv("DD_TELEMETRY_HEARTBEAT_INTERVAL", "1") - t.Setenv("DD_TRACE_STARTUP_LOGS", "0") - tests := []struct { - name string - wantedMessages []RequestType - genTelemetry func() - }{ - { - name: "tracer start, profiler start", - wantedMessages: []RequestType{RequestTypeAppStarted, RequestTypeDependenciesLoaded, RequestTypeAppClientConfigurationChange, RequestTypeAppProductChange}, - genTelemetry: func() { - GlobalClient.ProductChange(NamespaceTracers, true, nil) - GlobalClient.ProductChange(NamespaceProfilers, true, []Configuration{{Name: "key", Value: "value"}}) - }, - }, - /* This case is flaky (see #2688) - { - name: "profiler start, tracer start", - wantedMessages: []RequestType{RequestTypeAppStarted, RequestTypeDependenciesLoaded, RequestTypeAppClientConfigurationChange}, - genTelemetry: func() { - GlobalClient.ProductChange(NamespaceProfilers, true, nil) - GlobalClient.ProductChange(NamespaceTracers, true, []Configuration{{Name: "key", Value: "value"}}) - }, - }, - */ - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - telemetryClient := new(client) - defer MockGlobalClient(telemetryClient)() - excludedEvents := []RequestType{RequestTypeAppHeartbeat, RequestTypeGenerateMetrics, RequestTypeAppClosing} - waitForEvents, cleanup := mockServer(ctx, t, len(test.wantedMessages), test.genTelemetry, excludedEvents...) - defer cleanup() - messages := waitForEvents() - for i := range messages { - assert.Equal(t, test.wantedMessages[i], messages[i]) - } - }) - } -} - -// Test that globally registered app config is sent in telemetry requests including the configuration state. -func TestRegisterAppConfig(t *testing.T) { - client := new(client) - client.RegisterAppConfig("key1", "val1", OriginDefault) - - // Test that globally registered app config is sent in app-started payloads - client.start([]Configuration{{Name: "key2", Value: "val2", Origin: OriginDDConfig}}, NamespaceTracers, false) - - req := client.requests[0].Body - require.Equal(t, RequestTypeAppStarted, req.RequestType) - appStarted := req.Payload.(*AppStarted) - cfg := appStarted.Configuration - require.Contains(t, cfg, Configuration{Name: "key1", Value: "val1", Origin: OriginDefault}) - require.Contains(t, cfg, Configuration{Name: "key2", Value: "val2", Origin: OriginDDConfig}) - - // Test that globally registered app config is sent in app-client-configuration-change payloads - client.ProductChange(NamespaceTracers, true, []Configuration{{Name: "key3", Value: "val3", Origin: OriginCode}}) - - req = client.requests[2].Body - require.Equal(t, RequestTypeAppClientConfigurationChange, req.RequestType) - appConfigChange := req.Payload.(*ConfigurationChange) - cfg = appConfigChange.Configuration - require.Len(t, cfg, 2) - require.Contains(t, cfg, Configuration{Name: "key1", Value: "val1", Origin: OriginDefault}) - require.Contains(t, cfg, Configuration{Name: "key3", Value: "val3", Origin: OriginCode}) -} diff --git a/internal/telemetry/telemetrytest/globalclient_test.go b/internal/telemetry/telemetrytest/globalclient_test.go new file mode 100644 index 0000000000..b15b6ba864 --- /dev/null +++ b/internal/telemetry/telemetrytest/globalclient_test.go @@ -0,0 +1,134 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetrytest + +import ( + "math" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +func TestGlobalClient(t *testing.T) { + t.Run("config", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.RegisterAppConfig("key", "value", telemetry.OriginCode) + assert.Len(t, recorder.Configuration, 1) + assert.Equal(t, "key", recorder.Configuration[0].Name) + assert.Equal(t, "value", recorder.Configuration[0].Value) + assert.Equal(t, telemetry.OriginCode, recorder.Configuration[0].Origin) + }) + + t.Run("configs", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.RegisterAppConfigs(telemetry.Configuration{Name: "key", Value: "value", Origin: telemetry.OriginCode}, telemetry.Configuration{Name: "key2", Value: "value2", Origin: telemetry.OriginRemoteConfig}) + assert.Len(t, recorder.Configuration, 2) + assert.Equal(t, "key", recorder.Configuration[0].Name) + assert.Equal(t, "value", recorder.Configuration[0].Value) + assert.Equal(t, telemetry.OriginCode, recorder.Configuration[0].Origin) + assert.Equal(t, "key2", recorder.Configuration[1].Name) + assert.Equal(t, "value2", recorder.Configuration[1].Value) + assert.Equal(t, telemetry.OriginRemoteConfig, recorder.Configuration[1].Origin) + }) + + t.Run("app-stop", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.StopApp() + assert.True(t, recorder.Stopped) + }) + + t.Run("product-start", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.ProductStarted(telemetry.NamespaceAppSec) + assert.Len(t, recorder.Products, 1) + assert.True(t, recorder.Products[telemetry.NamespaceAppSec]) + }) + + t.Run("product-stopped", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.ProductStopped(telemetry.NamespaceAppSec) + assert.Len(t, recorder.Products, 1) + assert.False(t, recorder.Products[telemetry.NamespaceAppSec]) + }) + + t.Run("integration-loaded", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.LoadIntegration("test-integration") + assert.Len(t, recorder.Integrations, 1) + assert.Equal(t, "test-integration", recorder.Integrations[0].Name) + }) + + t.Run("mark-integration-as-loaded", func(t *testing.T) { + recorder := new(RecordClient) + defer telemetry.MockClient(recorder)() + + telemetry.MarkIntegrationAsLoaded(telemetry.Integration{Name: "test-integration", Version: "1.0.0"}) + assert.Len(t, recorder.Integrations, 1) + assert.Equal(t, "test-integration", recorder.Integrations[0].Name) + assert.Equal(t, "1.0.0", recorder.Integrations[0].Version) + }) + + t.Run("count", func(t *testing.T) { + recorder := new(RecordClient) + recorder.knownMetrics = true + defer telemetry.MockClient(recorder)() + + telemetry.Count(telemetry.NamespaceTracers, "init_time", nil).Submit(1) + assert.Len(t, recorder.Metrics, 1) + require.Contains(t, recorder.Metrics, MetricKey{Name: "init_time", Namespace: telemetry.NamespaceTracers, Kind: string(transport.CountMetric)}) + assert.Equal(t, 1.0, recorder.Metrics[MetricKey{Name: "init_time", Namespace: telemetry.NamespaceTracers, Kind: string(transport.CountMetric)}].Get()) + }) + + t.Run("gauge", func(t *testing.T) { + recorder := new(RecordClient) + recorder.knownMetrics = true + defer telemetry.MockClient(recorder)() + + telemetry.Gauge(telemetry.NamespaceTracers, "init_time", nil).Submit(1) + assert.Len(t, recorder.Metrics, 1) + require.Contains(t, recorder.Metrics, MetricKey{Name: "init_time", Namespace: telemetry.NamespaceTracers, Kind: string(transport.GaugeMetric)}) + assert.Equal(t, 1.0, recorder.Metrics[MetricKey{Name: "init_time", Namespace: telemetry.NamespaceTracers, Kind: string(transport.GaugeMetric)}].Get()) + }) + + t.Run("rate", func(t *testing.T) { + recorder := new(RecordClient) + recorder.knownMetrics = true + defer telemetry.MockClient(recorder)() + + telemetry.Rate(telemetry.NamespaceTracers, "init_time", nil).Submit(1) + + assert.Len(t, recorder.Metrics, 1) + require.Contains(t, recorder.Metrics, MetricKey{Name: "init_time", Namespace: telemetry.NamespaceTracers, Kind: string(transport.RateMetric)}) + assert.False(t, math.IsNaN(recorder.Metrics[MetricKey{Name: "init_time", Namespace: telemetry.NamespaceTracers, Kind: string(transport.RateMetric)}].Get())) + }) + + t.Run("distribution", func(t *testing.T) { + recorder := new(RecordClient) + recorder.knownMetrics = true + defer telemetry.MockClient(recorder)() + + telemetry.Distribution(telemetry.NamespaceGeneral, "init_time", nil).Submit(1) + assert.Len(t, recorder.Metrics, 1) + require.Contains(t, recorder.Metrics, MetricKey{Name: "init_time", Namespace: telemetry.NamespaceGeneral, Kind: string(transport.DistMetric)}) + assert.Equal(t, 1.0, recorder.Metrics[MetricKey{Name: "init_time", Namespace: telemetry.NamespaceGeneral, Kind: string(transport.DistMetric)}].Get()) + }) +} diff --git a/internal/telemetry/telemetrytest/mock.go b/internal/telemetry/telemetrytest/mock.go new file mode 100644 index 0000000000..7dbbdd8ac6 --- /dev/null +++ b/internal/telemetry/telemetrytest/mock.go @@ -0,0 +1,113 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package telemetrytest provides a mock implementation of the telemetry client for testing purposes +package telemetrytest + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" + + "github.com/stretchr/testify/mock" +) + +// MockClient implements Client and is used for testing purposes outside the telemetry package, +// e.g. the tracer and profiler. +type MockClient struct { + mock.Mock + + knownMetrics bool +} + +func (m *MockClient) Close() error { + return nil +} + +type MockMetricHandle struct { + mock.Mock +} + +func (m *MockMetricHandle) Submit(value float64) { + m.Called(value) +} + +func (m *MockMetricHandle) Get() float64 { + return m.Called().Get(0).(float64) +} + +func (m *MockClient) Count(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + if !m.knownMetrics && !knownmetrics.IsKnownMetric(namespace, transport.CountMetric, name) { + panic("telemetrytest.RecordClient should only be used with backend-side known metrics") + } + return m.Called(namespace, name, tags).Get(0).(telemetry.MetricHandle) +} + +func (m *MockClient) Rate(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + if !m.knownMetrics && !knownmetrics.IsKnownMetric(namespace, transport.RateMetric, name) { + panic("telemetrytest.RecordClient should only be used with backend-side known metrics") + } + return m.Called(namespace, name, tags).Get(0).(telemetry.MetricHandle) +} + +func (m *MockClient) Gauge(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + if !m.knownMetrics && !knownmetrics.IsKnownMetric(namespace, transport.GaugeMetric, name) { + panic("telemetrytest.RecordClient should only be used with backend-side known metrics") + } + return m.Called(namespace, name, tags).Get(0).(telemetry.MetricHandle) +} + +func (m *MockClient) Distribution(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + if !m.knownMetrics && !knownmetrics.IsKnownMetric(namespace, transport.DistMetric, name) { + panic("telemetrytest.RecordClient should only be used with backend-side known metrics") + } + return m.Called(namespace, name, tags).Get(0).(telemetry.MetricHandle) +} + +func (m *MockClient) Log(record telemetry.Record, options ...telemetry.LogOption) { + m.Called(record, options) +} + +func (m *MockClient) ProductStarted(product telemetry.Namespace) { + m.Called(product) +} + +func (m *MockClient) ProductStopped(product telemetry.Namespace) { + m.Called(product) +} + +func (m *MockClient) ProductStartError(product telemetry.Namespace, err error) { + m.Called(product, err) +} + +func (m *MockClient) RegisterAppConfig(key string, value any, origin telemetry.Origin) { + m.Called(key, value, origin) +} + +func (m *MockClient) RegisterAppConfigs(kvs ...telemetry.Configuration) { + m.Called(kvs) +} + +func (m *MockClient) MarkIntegrationAsLoaded(integration telemetry.Integration) { + m.Called(integration) +} + +func (m *MockClient) Flush() { + m.Called() +} + +func (m *MockClient) AppStart() { + m.Called() +} + +func (m *MockClient) AppStop() { + m.Called() +} + +func (m *MockClient) AddFlushTicker(ticker func(telemetry.Client)) { + m.Called(ticker) +} + +var _ telemetry.Client = (*MockClient)(nil) diff --git a/internal/telemetry/telemetrytest/record.go b/internal/telemetry/telemetrytest/record.go new file mode 100644 index 0000000000..f9db6cd5be --- /dev/null +++ b/internal/telemetry/telemetrytest/record.go @@ -0,0 +1,231 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package telemetrytest + +import ( + "log/slog" + "reflect" + "sort" + "strings" + "sync" + "testing" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/transport" +) + +type MetricKey struct { + Namespace telemetry.Namespace + Name string + Tags string + Kind string +} + +type LogLine struct { + Level telemetry.LogLevel + Text string +} + +type RecordClient struct { + mu sync.Mutex + Started bool + Stopped bool + Configuration []telemetry.Configuration + Logs []LogLine + Integrations []telemetry.Integration + Products map[telemetry.Namespace]bool + Metrics map[MetricKey]*RecordMetricHandle + knownMetrics bool +} + +func (r *RecordClient) Close() error { + return nil +} + +type RecordMetricHandle struct { + mu sync.Mutex + count float64 + rate float64 + rateStart time.Time + gauge float64 + distrib []float64 + + submit func(handle *RecordMetricHandle, value float64) + get func(handle *RecordMetricHandle) float64 +} + +func (m *RecordMetricHandle) Submit(value float64) { + m.mu.Lock() + defer m.mu.Unlock() + m.submit(m, value) +} + +func (m *RecordMetricHandle) Get() float64 { + m.mu.Lock() + defer m.mu.Unlock() + return m.get(m) +} + +func (r *RecordClient) metric(kind string, namespace telemetry.Namespace, name string, tags []string, submit func(handle *RecordMetricHandle, value float64), get func(handle *RecordMetricHandle) float64) *RecordMetricHandle { + r.mu.Lock() + defer r.mu.Unlock() + + if !r.knownMetrics && !knownmetrics.IsKnownMetric(namespace, transport.MetricType(kind), name) { + panic("telemetrytest.RecordClient should only be used with backend-side known metrics") + } + + if r.Metrics == nil { + r.Metrics = make(map[MetricKey]*RecordMetricHandle) + } + + sort.Strings(tags) + key := MetricKey{Namespace: namespace, Name: name, Tags: strings.Join(tags, ","), Kind: kind} + if _, ok := r.Metrics[key]; !ok { + r.Metrics[key] = &RecordMetricHandle{submit: submit, get: get} + } + return r.Metrics[key] +} + +func (r *RecordClient) Count(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + return r.metric(string(transport.CountMetric), namespace, name, tags, func(handle *RecordMetricHandle, value float64) { + handle.count += value + }, func(handle *RecordMetricHandle) float64 { + return handle.count + }) +} + +func (r *RecordClient) Rate(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + handle := r.metric(string(transport.RateMetric), namespace, name, tags, func(handle *RecordMetricHandle, value float64) { + handle.count += value + handle.rate = float64(handle.count) / time.Since(handle.rateStart).Seconds() + }, func(handle *RecordMetricHandle) float64 { + return handle.rate + }) + + handle.rateStart = time.Now() + return handle +} + +func (r *RecordClient) Gauge(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + return r.metric(string(transport.GaugeMetric), namespace, name, tags, func(handle *RecordMetricHandle, value float64) { + handle.gauge = value + }, func(handle *RecordMetricHandle) float64 { + return handle.gauge + }) +} + +func (r *RecordClient) Distribution(namespace telemetry.Namespace, name string, tags []string) telemetry.MetricHandle { + return r.metric(string(transport.DistMetric), namespace, name, tags, func(handle *RecordMetricHandle, value float64) { + handle.distrib = append(handle.distrib, value) + }, func(handle *RecordMetricHandle) float64 { + var sum float64 + for _, v := range handle.distrib { + sum += v + } + return sum + }) +} + +func (r *RecordClient) Log(record telemetry.Record, _ ...telemetry.LogOption) { + r.mu.Lock() + defer r.mu.Unlock() + r.Logs = append(r.Logs, LogLine{ + Level: slogLevelToLogLevel(record.Level), + Text: record.Message, + }) +} + +func (r *RecordClient) ProductStarted(product telemetry.Namespace) { + r.mu.Lock() + defer r.mu.Unlock() + if r.Products == nil { + r.Products = make(map[telemetry.Namespace]bool) + } + + r.Products[product] = true +} + +func (r *RecordClient) ProductStopped(product telemetry.Namespace) { + r.mu.Lock() + defer r.mu.Unlock() + if r.Products == nil { + r.Products = make(map[telemetry.Namespace]bool) + } + + r.Products[product] = false +} + +func (r *RecordClient) ProductStartError(product telemetry.Namespace, _ error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.Products == nil { + r.Products = make(map[telemetry.Namespace]bool) + } + + r.Products[product] = false +} + +func (r *RecordClient) RegisterAppConfig(key string, value any, origin telemetry.Origin) { + r.RegisterAppConfigs(telemetry.Configuration{Name: key, Value: value, Origin: origin}) +} + +func (r *RecordClient) RegisterAppConfigs(kvs ...telemetry.Configuration) { + r.mu.Lock() + defer r.mu.Unlock() + for i := range kvs { + kvs[i].Value = telemetry.SanitizeConfigValue(kvs[i].Value) + } + r.Configuration = append(r.Configuration, kvs...) +} + +func (r *RecordClient) MarkIntegrationAsLoaded(integration telemetry.Integration) { + r.mu.Lock() + defer r.mu.Unlock() + r.Integrations = append(r.Integrations, integration) +} + +func (r *RecordClient) Flush() {} + +func (r *RecordClient) AppStart() { + r.mu.Lock() + defer r.mu.Unlock() + r.Started = true +} + +func (r *RecordClient) AppStop() { + r.mu.Lock() + defer r.mu.Unlock() + r.Stopped = true +} + +func (r *RecordClient) AddFlushTicker(func(telemetry.Client)) { +} + +func CheckConfig(t *testing.T, cfgs []telemetry.Configuration, key string, value any) { + t.Helper() + for _, c := range cfgs { + if c.Name == key && reflect.DeepEqual(c.Value, value) { + return + } + } + + t.Fatalf("could not find configuration key %s with value %v", key, value) +} + +func slogLevelToLogLevel(level slog.Level) telemetry.LogLevel { + switch level { + case slog.LevelDebug: + return telemetry.LogDebug + case slog.LevelWarn: + return telemetry.LogWarn + case slog.LevelError: + return telemetry.LogError + default: + return telemetry.LogError + } +} diff --git a/internal/telemetry/telemetrytest/telemetrytest.go b/internal/telemetry/telemetrytest/telemetrytest.go deleted file mode 100644 index 0c8b22bd32..0000000000 --- a/internal/telemetry/telemetrytest/telemetrytest.go +++ /dev/null @@ -1,103 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2022 Datadog, Inc. - -// Package telemetrytest provides a mock implementation of the telemetry client for testing purposes -package telemetrytest - -import ( - "sync" - - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - - "github.com/stretchr/testify/mock" -) - -// MockClient implements Client and is used for testing purposes outside the telemetry package, -// e.g. the tracer and profiler. -type MockClient struct { - mock.Mock - mu sync.Mutex - Started bool - Configuration []telemetry.Configuration - Integrations []string - ProfilerEnabled bool - AsmEnabled bool - Metrics map[telemetry.Namespace]map[string]float64 -} - -func (c *MockClient) RegisterAppConfig(name string, val interface{}, origin telemetry.Origin) { - _ = c.Called(name, val, origin) -} - -// ProductChange starts and adds configuration data to the mock client. -func (c *MockClient) ProductChange(namespace telemetry.Namespace, enabled bool, configuration []telemetry.Configuration) { - c.mu.Lock() - defer c.mu.Unlock() - c.Started = true - c.Configuration = append(c.Configuration, configuration...) - if len(c.Metrics) == 0 { - c.Metrics = make(map[telemetry.Namespace]map[string]float64) - } - c.productChange(namespace, enabled) -} - -// ProductStop signals a product has stopped and disables that product in the mock client. -// ProductStop is NOOP for the tracer namespace, since the tracer is not considered a product. -func (c *MockClient) ProductStop(namespace telemetry.Namespace) { - c.mu.Lock() - defer c.mu.Unlock() - if namespace == telemetry.NamespaceTracers { - return - } - c.productChange(namespace, false) -} - -// ProductChange signals that a certain product is enabled or disabled for the mock client. -func (c *MockClient) productChange(namespace telemetry.Namespace, enabled bool) { - switch namespace { - case telemetry.NamespaceAppSec: - c.AsmEnabled = enabled - case telemetry.NamespaceProfilers: - c.ProfilerEnabled = enabled - case telemetry.NamespaceTracers: - return - default: - panic("invalid product namespace") - } -} - -// Record stores the value for the given metric. It is currently mocked for `Gauge` and `Distribution` metric types. -func (c *MockClient) Record(ns telemetry.Namespace, _ telemetry.MetricKind, name string, val float64, tags []string, common bool) { - c.On("Gauge", ns, name, val, tags, common).Return() - c.On("Record", ns, name, val, tags, common).Return() - _ = c.Called(ns, name, val, tags, common) - // record the val for tests that assert based on the value - if _, ok := c.Metrics[ns]; !ok { - c.Metrics[ns] = map[string]float64{} - } - c.Metrics[ns][name] = val -} - -// Count counts the value for the given metric -func (c *MockClient) Count(ns telemetry.Namespace, name string, val float64, tags []string, common bool) { - c.On("Count", ns, name, val, tags, common).Return() - _ = c.Called(ns, name, val, tags, common) -} - -// Stop is NOOP for the mock client. -func (c *MockClient) Stop() { -} - -// ApplyOps is used to record the number of ApplyOps method calls. -func (c *MockClient) ApplyOps(args ...telemetry.Option) { - c.On("ApplyOps", args).Return() - _ = c.Called(args) -} - -// ConfigChange is a mock for the ConfigChange method. -func (c *MockClient) ConfigChange(args []telemetry.Configuration) { - c.On("ConfigChange", args).Return() - _ = c.Called(args) -} diff --git a/internal/telemetry/utils.go b/internal/telemetry/utils.go deleted file mode 100644 index 96c212b176..0000000000 --- a/internal/telemetry/utils.go +++ /dev/null @@ -1,94 +0,0 @@ -// Unless explicitly stated otherwise all files in this repository are licensed -// under the Apache License Version 2.0. -// This product includes software developed at Datadog (https://www.datadoghq.com/). -// Copyright 2023 Datadog, Inc. - -// Package telemetry implements a client for sending telemetry information to -// Datadog regarding usage of an APM library such as tracing or profiling. -package telemetry - -import ( - "fmt" - "math" - "sort" - "strings" - "testing" -) - -// MockGlobalClient replaces the global telemetry client with a custom -// implementation of TelemetryClient. It returns a function that can be deferred -// to reset the global telemetry client to its previous value. -func MockGlobalClient(client Client) func() { - globalClient.Lock() - defer globalClient.Unlock() - oldClient := GlobalClient - GlobalClient = client - return func() { - globalClient.Lock() - defer globalClient.Unlock() - GlobalClient = oldClient - } -} - -// Check is a testing utility to assert that a target key in config contains the expected value -func Check(t *testing.T, configuration []Configuration, key string, expected interface{}) { - for _, kv := range configuration { - if kv.Name == key { - if kv.Value != expected { - t.Errorf("configuration %s: wanted '%v' type:%T, got '%v' type:%T", key, expected, expected, kv.Value, kv.Value) - } - return - } - } - t.Errorf("missing configuration %s", key) -} - -// SetAgentlessEndpoint is used for testing purposes to replace the real agentless -// endpoint with a custom one -func SetAgentlessEndpoint(endpoint string) string { - agentlessEndpointLock.Lock() - defer agentlessEndpointLock.Unlock() - prev := agentlessURL - agentlessURL = endpoint - return prev -} - -// Sanitize ensures the configuration values are valid and compatible. -// It removes NaN and Inf values and converts string slices and maps into comma-separated strings. -func Sanitize(c Configuration) Configuration { - switch val := c.Value.(type) { - case float64: - if math.IsNaN(val) || math.IsInf(val, 0) { - // Those values cause marshalling errors. - // https://github.com/golang/go/issues/59627 - c.Value = nil - } - case []string: - // The telemetry API only supports primitive types. - c.Value = strings.Join(val, ",") - case map[string]interface{}: - // The telemetry API only supports primitive types. - // Sort the keys to ensure the order is deterministic. - // This is technically not required but makes testing easier + it's not in a hot path. - keys := make([]string, 0, len(val)) - for k := range val { - keys = append(keys, k) - } - sort.Strings(keys) - var sb strings.Builder - for _, k := range keys { - if sb.Len() > 0 { - sb.WriteString(",") - } - sb.WriteString(k) - sb.WriteString(":") - sb.WriteString(fmt.Sprint(val[k])) - } - c.Value = sb.String() - default: - var sb strings.Builder - sb.WriteString(fmt.Sprint(val)) - c.Value = sb.String() - } - return c -} diff --git a/internal/trace_context.go b/internal/trace_context.go index 78620b6929..57551220ad 100644 --- a/internal/trace_context.go +++ b/internal/trace_context.go @@ -8,7 +8,7 @@ package internal import ( "context" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" ) type executionTracedKey struct{} diff --git a/internal/trace_source.go b/internal/trace_source.go new file mode 100644 index 0000000000..3c92bf312f --- /dev/null +++ b/internal/trace_source.go @@ -0,0 +1,73 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "fmt" + "strconv" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// TraceSource represents the 8-bit bitmask for the _dd.p.ts tag +type TraceSource uint8 + +const ( + APMTraceSource TraceSource = 0x01 + ASMTraceSource TraceSource = 0x02 + DSMTraceSource TraceSource = 0x04 + DJMTraceSource TraceSource = 0x08 + DBMTraceSource TraceSource = 0x10 +) + +// String converts the bitmask to a two-character hexadecimal string +func (ts TraceSource) String() string { + return fmt.Sprintf("%02X", uint8(ts)) +} + +// ParseTraceSource parses a hexadecimal string into a TraceSource bitmask +func ParseTraceSource(hexStr string) (TraceSource, error) { + // Ensure at least 2 chars, allowing up to 8 for forward compatibility (32-bit) + if len(hexStr) < 2 || len(hexStr) > 8 { + return 0, fmt.Errorf("invalid length for TraceSource mask, expected 2 to 8 characters") + } + + // Parse the full mask as a 32-bit unsigned integer + value, err := strconv.ParseUint(hexStr, 16, 32) + if err != nil { + return 0, fmt.Errorf("invalid hexadecimal format: %w", err) + } + + // Extract only the least significant 8 bits (ensuring compliance with 8-bit mask) + return TraceSource(value & 0xFF), nil +} + +func VerifyTraceSourceEnabled(hexStr string, target TraceSource) bool { + ts, err := ParseTraceSource(hexStr) + if err != nil { + if len(hexStr) != 0 { // Empty trace source should not trigger an error log. + log.Error("invalid trace-source hex string given for source verification: %s", err.Error()) + } + return false + } + + return ts.IsSet(target) +} + +// Set enables specific TraceSource (bit) in the bitmask +func (ts *TraceSource) Set(src TraceSource) { + *ts |= src +} + +// Unset disables specific TraceSource (bit) in the bitmask +func (ts *TraceSource) Unset(src TraceSource) { + *ts &^= src +} + +// IsSet checks if a specific TraceSource (bit) is enabled +func (ts TraceSource) IsSet(src TraceSource) bool { + return ts&src != 0 +} diff --git a/internal/trace_source_test.go b/internal/trace_source_test.go new file mode 100644 index 0000000000..5d44340203 --- /dev/null +++ b/internal/trace_source_test.go @@ -0,0 +1,262 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestParseTraceSourceProduct(t *testing.T) { + type args struct { + hexStr string + } + + var allSources = map[string]TraceSource{ + "APM": APMTraceSource, + "ASM": ASMTraceSource, + "DSM": DSMTraceSource, + "DJM": DJMTraceSource, + "DBM": DBMTraceSource, + } + + tests := []struct { + name string + args args + wantSources map[TraceSource]bool + want uint8 + wantErr assert.ErrorAssertionFunc + }{ + { + name: "empty", + args: args{"00"}, + wantSources: map[TraceSource]bool{}, + want: 0, + wantErr: assert.NoError, + }, + { + name: "APM", + args: args{"01"}, + wantSources: map[TraceSource]bool{APMTraceSource: true}, + want: 1, + wantErr: assert.NoError, + }, + { + name: "ASM", + args: args{"02"}, + wantSources: map[TraceSource]bool{ASMTraceSource: true}, + want: 2, + wantErr: assert.NoError, + }, + { + name: "ASM-APM", + args: args{"03"}, + wantSources: map[TraceSource]bool{APMTraceSource: true, ASMTraceSource: true}, + want: 3, + wantErr: assert.NoError, + }, + { + name: "DSM-DJM-DBM", + args: args{"1C"}, + wantSources: map[TraceSource]bool{DSMTraceSource: true, DBMTraceSource: true, DJMTraceSource: true}, + want: 28, + wantErr: assert.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ParseTraceSource(tt.args.hexStr) + if !tt.wantErr(t, err, fmt.Sprintf("ParseTraceSourceProduct(%v)", tt.args.hexStr)) { + return + } + + for k, v := range allSources { + assert.Equalf(t, tt.wantSources[v], got.IsSet(v), "Source %s should be %v", k, got.IsSet(v)) + } + assert.EqualValuesf(t, tt.want, got, "ParseTraceSourceProduct(%v) should equal uint8 %v got value %v", tt.args.hexStr, tt.want, uint8(got)) + }) + } +} + +func TestTraceSource_Set(t *testing.T) { + type args struct { + sources []TraceSource + } + tests := []struct { + name string + args args + res string + }{ + { + name: "empty", + args: args{sources: nil}, + res: "00", + }, + { + name: "APM", + args: args{ + sources: []TraceSource{APMTraceSource}, + }, + res: "01", + }, + { + name: "ASM-twice", + args: args{ + // Setting the same source twice does not change the underneath mask + sources: []TraceSource{ASMTraceSource, ASMTraceSource}, + }, + res: "02", + }, + { + name: "APM-ASM-DBM", + args: args{ + sources: []TraceSource{ + APMTraceSource, + ASMTraceSource, + DBMTraceSource, + }, + }, + res: "13", + }, + { + name: "DSM-DJM", + args: args{ + sources: []TraceSource{ + DSMTraceSource, + DJMTraceSource, + }, + }, + res: "0C", + }, + { + name: "DBM", + args: args{ + sources: []TraceSource{DBMTraceSource}, + }, + res: "10", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + s := TraceSource(0) + + for _, source := range tt.args.sources { + s.Set(source) + } + + assert.EqualValuesf(t, tt.res, s.String(), "Set() should return %v", tt.args.sources) + + }) + } +} + +func TestVerifyTraceSourceEnabled(t *testing.T) { + type args struct { + hexStr string + } + + var allSources = map[string]TraceSource{ + "APM": APMTraceSource, + "ASM": ASMTraceSource, + "DSM": DSMTraceSource, + "DJM": DJMTraceSource, + "DBM": DBMTraceSource, + } + + tests := []struct { + name string + args args + wantSources map[TraceSource]bool + }{ + { + name: "empty", + args: args{ + hexStr: "", + }, + wantSources: map[TraceSource]bool{}, + }, + { + name: "invalid", + args: args{ + hexStr: "nope", + }, + wantSources: map[TraceSource]bool{}, + }, + { + name: "00", + args: args{ + hexStr: "00", + }, + wantSources: map[TraceSource]bool{}, + }, + { + name: "01", + args: args{ + hexStr: "01", + }, + wantSources: map[TraceSource]bool{APMTraceSource: true}, + }, + { + name: "02", + args: args{ + hexStr: "02", + }, + wantSources: map[TraceSource]bool{ASMTraceSource: true}, + }, + { + name: "03", + args: args{ + hexStr: "03", + }, + wantSources: map[TraceSource]bool{APMTraceSource: true, ASMTraceSource: true}, + }, + { + name: "04", + args: args{ + hexStr: "04", + }, + wantSources: map[TraceSource]bool{DSMTraceSource: true}, + }, + { + name: "05", + args: args{ + hexStr: "05", + }, + wantSources: map[TraceSource]bool{APMTraceSource: true, DSMTraceSource: true}, + }, + { + name: "08", + args: args{ + hexStr: "08", + }, + wantSources: map[TraceSource]bool{DJMTraceSource: true}, + }, + { + name: "0C", + args: args{ + hexStr: "0C", + }, + wantSources: map[TraceSource]bool{DSMTraceSource: true, DJMTraceSource: true}, + }, + { + name: "10", + args: args{ + hexStr: "10", + }, + wantSources: map[TraceSource]bool{DBMTraceSource: true}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for k, v := range allSources { + assert.Equalf(t, tt.wantSources[v], VerifyTraceSourceEnabled(tt.args.hexStr, v), "Source %s should be %v for mask %s", + k, tt.wantSources[v], tt.args.hexStr) + } + }) + } +} diff --git a/internal/traceprof/testapp/test_app.proto b/internal/traceprof/testapp/test_app.proto index 763136be32..f6169ab05c 100644 --- a/internal/traceprof/testapp/test_app.proto +++ b/internal/traceprof/testapp/test_app.proto @@ -6,7 +6,7 @@ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=p syntax = "proto3"; -option go_package = "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/testapp"; +option go_package = "github.com/DataDog/dd-trace-go/v2/internal/traceprof/testapp"; package testapp; service TestApp { diff --git a/internal/traceprof/traceproftest/app.go b/internal/traceprof/traceproftest/app.go index e8dbb6ce40..e470a63197 100644 --- a/internal/traceprof/traceproftest/app.go +++ b/internal/traceprof/traceproftest/app.go @@ -18,13 +18,12 @@ import ( "testing" "time" - grpctrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/google.golang.org/grpc" - httptrace "gopkg.in/DataDog/dd-trace-go.v1/contrib/julienschmidt/httprouter" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - pb "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/testapp" + grpctrace "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2" + httptrace "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/log" + pb "github.com/DataDog/dd-trace-go/v2/internal/traceprof/testapp" "github.com/julienschmidt/httprouter" "github.com/stretchr/testify/require" @@ -118,8 +117,8 @@ func (a *App) start(t testing.TB) { case GRPC: l, err := net.Listen("tcp", "127.0.0.1:0") require.NoError(t, err) - si := grpctrace.StreamServerInterceptor(grpctrace.WithServiceName("my-grpc-client")) - ui := grpctrace.UnaryServerInterceptor(grpctrace.WithServiceName("my-grpc-client")) + si := grpctrace.StreamServerInterceptor(grpctrace.WithService("my-grpc-client")) + ui := grpctrace.UnaryServerInterceptor(grpctrace.WithService("my-grpc-client")) a.grpcServer = grpc.NewServer(grpc.StreamInterceptor(si), grpc.UnaryInterceptor(ui)) pb.RegisterTestAppServer(a.grpcServer, a) go a.grpcServer.Serve(l) @@ -233,7 +232,7 @@ func (a *App) Work(ctx context.Context, req *pb.WorkReq) (*pb.WorkRes, error) { // running. decoySpan is a child span that finishes before the cpuHog work // begins to test that span's restore their parent span labels when // finishing. - var cpuSpan, decoySpan ddtrace.Span + var cpuSpan, decoySpan *tracer.Span if a.config.ChildOf { cpuSpan = tracer.StartSpan("cpuHog", tracer.ChildOf(reqSpan.Context())) decoySpan = tracer.StartSpan("decoy", tracer.ChildOf(cpuSpan.Context())) diff --git a/internal/traceprof/traceproftest/baseline.txt b/internal/traceprof/traceproftest/baseline.txt index 5e0f2ba727..ba9f118bf6 100644 --- a/internal/traceprof/traceproftest/baseline.txt +++ b/internal/traceprof/traceproftest/baseline.txt @@ -1,6 +1,6 @@ goos: linux goarch: amd64 -pkg: gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/traceproftest +pkg: github.com/DataDog/dd-trace-go/v2/internal/traceprof/traceproftest cpu: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz BenchmarkEndpointsAndHotspots/direct/hello-world-4 4921081 15785 ns/op 15211 cpu-ns/op 0.01048 pprof-B/op 0.0008820 pprof-samples/op BenchmarkEndpointsAndHotspots/direct/hello-world-4 4892020 15767 ns/op 15132 cpu-ns/op 0.01063 pprof-B/op 0.0008847 pprof-samples/op @@ -48,4 +48,4 @@ BenchmarkEndpointsAndHotspots/grpc/io-bound-4 660 BenchmarkEndpointsAndHotspots/grpc/io-bound-4 656 108724289 ns/op 18297399 cpu-ns/op 13.97 pprof-B/op 1.427 pprof-samples/op BenchmarkEndpointsAndHotspots/grpc/io-bound-4 660 108614401 ns/op 18179128 cpu-ns/op 15.08 pprof-B/op 1.428 pprof-samples/op PASS -ok gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/traceproftest 3690.445s +ok github.com/DataDog/dd-trace-go/v2/internal/traceprof/traceproftest 3690.445s diff --git a/internal/traceprof/traceproftest/bench.bash b/internal/traceprof/traceproftest/bench.bash index e7473872e6..cf7101addb 100755 --- a/internal/traceprof/traceproftest/bench.bash +++ b/internal/traceprof/traceproftest/bench.bash @@ -1,10 +1,12 @@ -set -eu +#!/bin/bash +set -euo pipefail + echo "-> Starting benchmark (ETA: 90min)" BENCH_CMD="go test -benchtime 60s -count 5 -timeout 24h -run ^$ -bench . ." if ! which benchstat; then echo "error: needs benchstat, install via:" - echo "go install golang.org/x/perf/cmd/benchstat@latest" + echo "make tools-install" exit 1 fi @@ -13,6 +15,6 @@ $BENCH_CMD | tee baseline.txt env \ BENCH_HOTSPOTS=true \ BENCH_ENDPOINTS=true \ - $BENCH_CMD | tee endpoints-and-hotspots.txt + "${BENCH_CMD}" | tee endpoints-and-hotspots.txt benchstat -sort delta baseline.txt endpoints-and-hotspots.txt | tee overhead.txt diff --git a/internal/traceprof/traceproftest/endpoints-and-hotspots.txt b/internal/traceprof/traceproftest/endpoints-and-hotspots.txt index 3eaf97a323..482657e936 100644 --- a/internal/traceprof/traceproftest/endpoints-and-hotspots.txt +++ b/internal/traceprof/traceproftest/endpoints-and-hotspots.txt @@ -1,6 +1,6 @@ goos: linux goarch: amd64 -pkg: gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/traceproftest +pkg: github.com/DataDog/dd-trace-go/v2/internal/traceprof/traceproftest cpu: Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz BenchmarkEndpointsAndHotspots/direct/hello-world-4 3739210 20677 ns/op 20019 cpu-ns/op 0.03021 pprof-B/op 0.001218 pprof-samples/op BenchmarkEndpointsAndHotspots/direct/hello-world-4 3623416 20979 ns/op 20130 cpu-ns/op 0.02966 pprof-B/op 0.001207 pprof-samples/op @@ -48,4 +48,4 @@ BenchmarkEndpointsAndHotspots/grpc/io-bound-4 662 BenchmarkEndpointsAndHotspots/grpc/io-bound-4 662 109110671 ns/op 18681041 cpu-ns/op 41.90 pprof-B/op 1.435 pprof-samples/op BenchmarkEndpointsAndHotspots/grpc/io-bound-4 658 108596149 ns/op 18191310 cpu-ns/op 41.77 pprof-B/op 1.416 pprof-samples/op PASS -ok gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/traceproftest 3712.759s +ok github.com/DataDog/dd-trace-go/v2/internal/traceprof/traceproftest 3712.759s diff --git a/internal/traceprof/traceproftest/go.mod b/internal/traceprof/traceproftest/go.mod new file mode 100644 index 0000000000..ddacb9ceba --- /dev/null +++ b/internal/traceprof/traceproftest/go.mod @@ -0,0 +1,100 @@ +module github.com/DataDog/dd-trace-go/v2/internal/traceprof/traceproftest + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 v2.4.0-dev + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db + github.com/julienschmidt/httprouter v1.3.0 + github.com/stretchr/testify v1.11.1 + google.golang.org/grpc v1.75.0 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.3 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 => ../../../contrib/google.golang.org/grpc + +replace github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 => ../../../contrib/julienschmidt/httprouter + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/internal/traceprof/traceproftest/go.sum b/internal/traceprof/traceproftest/go.sum new file mode 100644 index 0000000000..874a20a2c0 --- /dev/null +++ b/internal/traceprof/traceproftest/go.sum @@ -0,0 +1,313 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev h1:srl0FPpKiginZRfuUCioeUV8gJuTLmNY7pS6AxZl4qQ= +github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev/go.mod h1:rG6TpmIBAZEpcNHjD1q/4qtbWNKWw61UH3IS+FsjReQ= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0 h1:R84qjqJb5nVJMxqWYb3np9L5ZsaDtB+a39EqjV0JSUM= +golang.org/x/exp v0.0.0-20250408133849-7e4ce0ab07d0/go.mod h1:S9Xr4PYopiDyqSyp5NjCrhFrqg6A5zA2E/iPHPhqnS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/internal/traceprof/traceproftest/traceprof_test.go b/internal/traceprof/traceproftest/traceprof_test.go index 7c7fec4780..97216e714f 100644 --- a/internal/traceprof/traceproftest/traceprof_test.go +++ b/internal/traceprof/traceproftest/traceprof_test.go @@ -17,10 +17,10 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - pb "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof/testapp" + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + pb "github.com/DataDog/dd-trace-go/v2/internal/traceprof/testapp" "github.com/stretchr/testify/require" ) diff --git a/internal/tracer.go b/internal/tracer.go new file mode 100644 index 0000000000..da7a4c5f2f --- /dev/null +++ b/internal/tracer.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package internal + +import "sync/atomic" + +var ( + tracerInit atomic.Bool +) + +func SetTracerInitialized(val bool) { + tracerInit.Store(val) +} + +func TracerInitialized() bool { + return tracerInit.Load() +} diff --git a/internal/uds.go b/internal/uds.go new file mode 100644 index 0000000000..db1077d822 --- /dev/null +++ b/internal/uds.go @@ -0,0 +1,43 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "context" + "fmt" + "net" + "net/http" + "net/url" + "strings" + "time" +) + +func UnixDataSocketURL(path string) *url.URL { + return &url.URL{ + Scheme: "http", + Host: fmt.Sprintf("UDS_%s", strings.NewReplacer(":", "_", "/", "_", `\`, "_").Replace(path)), + } +} + +// UDSClient returns a new http.Client which connects using the given UDS socket path. +func UDSClient(socketPath string, timeout time.Duration) *http.Client { + return &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) { + return DefaultDialer(timeout).DialContext(ctx, "unix", (&net.UnixAddr{ + Name: socketPath, + Net: "unix", + }).String()) + }, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + }, + Timeout: timeout, + } +} diff --git a/internal/uds_test.go b/internal/uds_test.go new file mode 100644 index 0000000000..e16e25b613 --- /dev/null +++ b/internal/uds_test.go @@ -0,0 +1,148 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package internal + +import ( + "net/url" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestUnixDataSocketURL(t *testing.T) { + tests := []struct { + name string + path string + expected *url.URL + }{ + { + name: "empty-path", + path: "", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_", + }, + }, + { + name: "no-special-chars", + path: "path", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path", + }, + }, + { + name: "with-colon", + path: "path:with:colons", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_with_colons", + }, + }, + { + name: "with-forward-slash", + path: "path/with/slashes", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_with_slashes", + }, + }, + { + name: "with-backward-slash", + path: `path\with\backslashes`, + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_with_backslashes", + }, + }, + { + name: "mixed-special-chars", + path: `path:with/all\chars`, + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_with_all_chars", + }, + }, + { + name: "leading-special-char-colon", + path: ":path", + expected: &url.URL{ + Scheme: "http", + Host: "UDS__path", + }, + }, + { + name: "trailing-special-char-colon", + path: "path:", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_", + }, + }, + { + name: "leading-special-char-slash", + path: "/path", + expected: &url.URL{ + Scheme: "http", + Host: "UDS__path", + }, + }, + { + name: "trailing-special-char-slash", + path: "path/", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_", + }, + }, + { + name: "leading-special-char-backslash", + path: `\path`, + expected: &url.URL{ + Scheme: "http", + Host: "UDS__path", + }, + }, + { + name: "trailing-special-char-backslash", + path: `path\`, + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path_", + }, + }, + { + name: "multiple-leading-special-chars", + path: "://path", + expected: &url.URL{ + Scheme: "http", + Host: "UDS____path", + }, + }, + { + name: "multiple-trailing-special-chars", + path: "path://", + expected: &url.URL{ + Scheme: "http", + Host: "UDS_path___", + }, + }, + { + name: "all-special-chars", + path: `:/\`, + expected: &url.URL{ + Scheme: "http", + Host: "UDS____", + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.expected, UnixDataSocketURL(tt.path)) + }) + } +} diff --git a/internal/urlsanitizer/sanitizer.go b/internal/urlsanitizer/sanitizer.go new file mode 100644 index 0000000000..11cf8a643a --- /dev/null +++ b/internal/urlsanitizer/sanitizer.go @@ -0,0 +1,70 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/) +// Copyright 2016 Datadog, Inc. + +// Package urlsanitizer provides utilities for sanitizing URLs and DSNs by removing sensitive information. +package urlsanitizer + +import ( + "net/url" + "strings" +) + +// SanitizeURL removes user credentials from URLs for safe logging. +// It uses Go's built-in url.Redacted() when possible, which preserves usernames but redacts passwords. +// If the URL can't be parsed but appears to contain credentials, it's fully redacted for security. +func SanitizeURL(rawURL string) string { + if rawURL == "" { + return rawURL + } + + parsedURL, err := url.Parse(rawURL) + if err != nil { + // If parsing fails but we suspect credentials, + // redact entirely for safety. + if containsCredentials(rawURL) { + return "[REDACTED_URL_WITH_CREDENTIALS]" + } + // If no credentials suspected, + // return as-is (might just be a malformed URL without sensitive data) + return rawURL + } + + // If URL has user info, + // use Go's built-in redaction (preserves username, redacts password). + if parsedURL.User != nil { + return parsedURL.Redacted() + } + + // No credentials detected, return as-is + return rawURL +} + +// containsCredentials checks if a URL string might contain credentials +func containsCredentials(rawURL string) bool { + // Look for patterns that suggest credentials: username:password@host + // This is a simple heuristic - if we see :...@ we assume credentials. + if !strings.Contains(rawURL, "://") { + return false + } + + // Find the scheme part. + schemeEnd := strings.Index(rawURL, "://") + if schemeEnd == -1 { + return false + } + + // Look in the part after the scheme for credentials. + rest := rawURL[schemeEnd+3:] + + // If we see a colon followed by an @ sign, likely credentials. + colonIndex := strings.Index(rest, ":") + if colonIndex == -1 { + return false + } + + // Check if there's an @ after the colon + atIndex := strings.Index(rest[colonIndex:], "@") + return atIndex != -1 +} diff --git a/internal/urlsanitizer/sanitizer_test.go b/internal/urlsanitizer/sanitizer_test.go new file mode 100644 index 0000000000..181859631b --- /dev/null +++ b/internal/urlsanitizer/sanitizer_test.go @@ -0,0 +1,68 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/) +// Copyright 2016 Datadog, Inc. + +package urlsanitizer + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSanitizeURL(t *testing.T) { + tests := []struct { + input string + expected string + }{ + // URLs with credentials - use Go's built-in redaction (preserves username, redacts password) + {"https://user:password@example.com/path", "https://user:xxxxx@example.com/path"}, + {"http://admin:secret@db.example.com:5432/mydb", "http://admin:xxxxx@db.example.com:5432/mydb"}, + + // URL with just username (no password) - preserved as-is + {"http://token@example.com/", "http://token@example.com/"}, + + // URLs without credentials - returned as-is + {"https://example.com/path", "https://example.com/path"}, + {"http://localhost:8080/", "http://localhost:8080/"}, + {"ftp://files.example.com/data", "ftp://files.example.com/data"}, + + // Edge cases + {"", ""}, + {"not-a-url", "not-a-url"}, // no credentials suspected, return as-is + {"://invalid:password@host", "[REDACTED_URL_WITH_CREDENTIALS]"}, // unparseable but has credentials pattern + {"://invalid", "://invalid"}, // unparseable but no credentials, return as-is + } + + for _, test := range tests { + result := SanitizeURL(test.input) + assert.Equal(t, test.expected, result, "Failed for input: %s", test.input) + } +} + +func TestContainsCredentials(t *testing.T) { + tests := []struct { + input string + expected bool + }{ + // Should detect credentials + {"https://user:password@example.com/", true}, + {"http://admin:secret@db.example.com:5432/mydb", true}, + {"postgres://user:pass@localhost:5432/db", true}, + + // Should not detect credentials + {"https://example.com/path", false}, + {"http://localhost:8080/", false}, + {"ftp://files.example.com", false}, + {"http://token@example.com/", false}, // no colon, so no password + {"not-a-url", false}, + {"", false}, + {"://invalid", false}, // no valid scheme + } + + for _, test := range tests { + result := containsCredentials(test.input) + assert.Equal(t, test.expected, result, "Failed for input: %s", test.input) + } +} diff --git a/internal/utils.go b/internal/utils.go index bc9a12b4af..0f7266ec9d 100644 --- a/internal/utils.go +++ b/internal/utils.go @@ -6,8 +6,12 @@ package internal import ( + "fmt" "sync" "sync/atomic" + + "github.com/DataDog/dd-trace-go/v2/internal/samplernames" + "github.com/puzpuzpuz/xsync/v3" ) // OtelTagsDelimeter is the separator between key-val pairs for OTEL env vars @@ -68,3 +72,118 @@ func (l *LockMap) Get(k string) string { defer l.RUnlock() return l.m[k] } + +// XSyncMapCounterMap uses xsync protect counter increments and reads during +// concurrent access. +// Implementation and related tests were taken/inspired by felixge/countermap +// https://github.com/felixge/countermap/pull/2 +type XSyncMapCounterMap struct { + counts *xsync.MapOf[string, *xsync.Counter] +} + +func NewXSyncMapCounterMap() *XSyncMapCounterMap { + return &XSyncMapCounterMap{counts: xsync.NewMapOf[string, *xsync.Counter]()} +} + +func (cm *XSyncMapCounterMap) Inc(key string) { + val, ok := cm.counts.Load(key) + if !ok { + val, _ = cm.counts.LoadOrStore(key, xsync.NewCounter()) + } + val.Inc() +} + +func (cm *XSyncMapCounterMap) GetAndReset() map[string]int64 { + ret := map[string]int64{} + cm.counts.Range(func(key string, _ *xsync.Counter) bool { + v, ok := cm.counts.LoadAndDelete(key) + if ok { + ret[key] = v.Value() + } + return true + }) + return ret +} + +// ToFloat64 attempts to convert value into a float64. If the value is an integer +// greater or equal to 2^53 or less than or equal to -2^53, it will not be converted +// into a float64 to avoid losing precision. If it succeeds in converting, toFloat64 +// returns the value and true, otherwise 0 and false. +func ToFloat64(value any) (f float64, ok bool) { + const maxFloat = (int64(1) << 53) - 1 + const minFloat = -maxFloat + // If any other type is added here, remember to add it to the type switch in + // the `span.SetTag` function to handle pointers to these supported types. + switch i := value.(type) { + case byte: + return float64(i), true + case float32: + return float64(i), true + case float64: + return i, true + case int: + return float64(i), true + case int8: + return float64(i), true + case int16: + return float64(i), true + case int32: + return float64(i), true + case int64: + if i > maxFloat || i < minFloat { + return 0, false + } + return float64(i), true + case uint: + return float64(i), true + case uint16: + return float64(i), true + case uint32: + return float64(i), true + case uint64: + if i > uint64(maxFloat) { + return 0, false + } + return float64(i), true + case samplernames.SamplerName: + return float64(i), true + default: + return 0, false + } +} + +// ToInt64 attempts to convert an any value into an int64. +func ToInt64(val any) (int64, error) { + switch v := val.(type) { + case int: + return int64(v), nil + case int8: + return int64(v), nil + case int16: + return int64(v), nil + case int32: + return int64(v), nil + case int64: + return v, nil + default: + return 0, fmt.Errorf("cannot convert %T to int64", val) + } +} + +// ToUint64 attempts to convert an any value into an uint64. +func ToUint64(val any) (uint64, error) { + switch v := val.(type) { + case uint: + return uint64(v), nil + case uint8: + return uint64(v), nil + case uint16: + return uint64(v), nil + case uint32: + return uint64(v), nil + case uint64: + return v, nil + default: + return 0, fmt.Errorf("cannot convert %T to uint64", val) + } +} diff --git a/internal/utils_test.go b/internal/utils_test.go index bfa4ee6640..bc14a3f44c 100644 --- a/internal/utils_test.go +++ b/internal/utils_test.go @@ -2,12 +2,13 @@ // under the Apache License Version 2.0. // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. - package internal import ( "context" + "fmt" "math/rand" + "strconv" "strings" "sync" "testing" @@ -20,13 +21,13 @@ func BenchmarkIter(b *testing.B) { m := NewLockMap(nil) b.ResetTimer() for i := 0; i < b.N; i++ { - m.Iter(func(key string, val string) {}) + m.Iter(func(_ string, _ string) {}) } } - func TestLockMapThrash(t *testing.T) { wg := sync.WaitGroup{} - ctx, _ := context.WithTimeout(context.Background(), 20*time.Millisecond) + ctx, cancel := context.WithTimeout(context.Background(), 20*time.Millisecond) + t.Cleanup(cancel) lm := NewLockMap(map[string]string{}) wg.Add(6) for i := 0; i < 3; i++ { @@ -63,3 +64,145 @@ func TestLockMapThrash(t *testing.T) { wg.Wait() assert.Equal(t, len(lm.m), int(lm.c)) } +func TestXSyncMapCounterMap(t *testing.T) { + t.Run("basic", func(t *testing.T) { + assert := assert.New(t) + + cm := NewXSyncMapCounterMap() + + assert.Equal(map[string]int64{}, cm.GetAndReset()) + + cm.Inc("a") + cm.Inc("b") + cm.Inc("a") + + assert.Equal(map[string]int64{"a": 2, "b": 1}, cm.GetAndReset()) + + cm.Inc("a") + assert.Equal(map[string]int64{"a": 1}, cm.GetAndReset()) + }) + + t.Run("concurrent", func(t *testing.T) { + assert := assert.New(t) + + cm := NewXSyncMapCounterMap() + + wg := sync.WaitGroup{} + for range 10 { + wg.Add(1) + go func() { + defer wg.Done() + cm.Inc("key") + }() + } + wg.Wait() + + assert.Equal(map[string]int64{"key": 10}, cm.GetAndReset()) + }) +} +func BenchmarkXSyncMapCounterMap(b *testing.B) { + b.Run("base_case", func(b *testing.B) { + b.ReportAllocs() + n := 10 + keys := make([]string, n) + for i := range keys { + keys[i] = "key-" + strconv.Itoa(i) + } + + b.ResetTimer() + cm := NewXSyncMapCounterMap() + for i := 0; i < b.N; i++ { + // We increment the first key w 75% probability and the rest + // increment the rest of the keys. + // This is to benchmark the expected case of most spans starting + // from the same one integration, with less starting from other sources. + if i%4 == 0 { + cm.Inc(keys[i/4%n]) + } else { + cm.Inc(keys[0]) + } + } + + // Ensure that the values in the map are as expected (monotically decreasing) + counts := cm.GetAndReset() + for i := 1; i < n; i++ { + assert.LessOrEqual(b, counts[keys[i]], counts[keys[i-1]]) + } + }) + + b.Run("worst_case", func(b *testing.B) { + b.ReportAllocs() + b.ResetTimer() + cm := NewXSyncMapCounterMap() + for i := 0; i < b.N; i++ { + cm.Inc("key-" + strconv.Itoa(i)) + } + + // Ensure all counts are exactly 1 + counts := cm.GetAndReset() + for _, v := range counts { + assert.Equal(b, int64(1), v) + } + + }) + + b.Run("concurrent", func(b *testing.B) { + cm := NewXSyncMapCounterMap() + + wg := sync.WaitGroup{} + for range b.N { + wg.Add(1) + go func() { + defer wg.Done() + cm.Inc("key") + }() + } + wg.Wait() + + assert.Equal(b, map[string]int64{"key": int64(b.N)}, cm.GetAndReset()) + }) +} + +func TestToFloat64(t *testing.T) { + const ( + intUpperLimit = int64(1) << 53 + intLowerLimit = -intUpperLimit + ) + + for i, tt := range [...]struct { + value interface{} + f float64 + ok bool + }{ + 0: {1, 1, true}, + 1: {byte(1), 1, true}, + 2: {int(1), 1, true}, + 3: {int16(1), 1, true}, + 4: {int32(1), 1, true}, + 5: {int64(1), 1, true}, + 6: {uint(1), 1, true}, + 7: {uint16(1), 1, true}, + 8: {uint32(1), 1, true}, + 9: {uint64(1), 1, true}, + 10: {"a", 0, false}, + 11: {float32(1.25), 1.25, true}, + 12: {float64(1.25), 1.25, true}, + 13: {intUpperLimit, 0, false}, + 14: {intUpperLimit + 1, 0, false}, + 15: {intUpperLimit - 1, float64(intUpperLimit - 1), true}, + 16: {intLowerLimit, 0, false}, + 17: {intLowerLimit - 1, 0, false}, + 18: {intLowerLimit + 1, float64(intLowerLimit + 1), true}, + 19: {-1024, -1024.0, true}, + } { + t.Run(fmt.Sprintf("%d", i), func(t *testing.T) { + f, ok := ToFloat64(tt.value) + if ok != tt.ok { + t.Fatalf("expected ok: %t", tt.ok) + } + if f != tt.f { + t.Fatalf("expected: %#v, got: %#v", tt.f, f) + } + }) + } +} diff --git a/internal/version/version.go b/internal/version/version.go index b7b24999c0..c8fbddcb12 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -6,14 +6,25 @@ package version import ( - "regexp" + "runtime/debug" "strconv" + "strings" + "sync" + + "github.com/Masterminds/semver/v3" ) // Tag specifies the current release tag. It needs to be manually // updated. A test checks that the value of Tag never points to a // git tag that is older than HEAD. -const Tag = "v1.70.0-dev" +var Tag = "v2.5.0-dev" + +type v1version struct { + Transitional bool + Version string +} + +var v1Tag *v1version // Dissected version number. Filled during init() var ( @@ -25,19 +36,82 @@ var ( Patch int // RC is the current release candidate version number RC int + // once is used to ensure that the v1 version is only found once + once sync.Once ) +func FindV1Version() (string, bool, bool) { + once.Do(func() { + info, ok := debug.ReadBuildInfo() + if !ok { + return + } + v1Tag = findV1Version(info.Deps) + }) + if v1Tag == nil { + return "", false, false + } + return v1Tag.Version, v1Tag.Transitional, true +} + func init() { - // This regexp matches the version format we use and captures major/minor/patch/rc in different groups - r := regexp.MustCompile(`v(?P\d+)\.(?P\d+)\.(?P\d+)(-rc\.(?P\d+))?`) - names := r.SubexpNames() - captures := map[string]string{} - // Associate each capture group match with the capture group's name to easily retrieve major/minor/patch/rc - for k, v := range r.FindAllStringSubmatch(Tag, -1)[0] { - captures[names[k]] = v - } - Major, _ = strconv.Atoi(captures["ma"]) - Minor, _ = strconv.Atoi(captures["mi"]) - Patch, _ = strconv.Atoi(captures["pa"]) - RC, _ = strconv.Atoi(captures["rc"]) + // Check if we are using a transitional v1.74.x or later version + vt, _, found := FindV1Version() + if found { + Tag = vt + } + v := parseVersion(Tag) + Major, Minor, Patch, RC = v.Major, v.Minor, v.Patch, v.RC +} + +func findV1Version(deps []*debug.Module) *v1version { + var version string + for _, dep := range deps { + if dep.Path != "gopkg.in/DataDog/dd-trace-go.v1" { + continue + } + version = dep.Version + break + } + if version == "" { + return nil + } + vt := &v1version{ + Version: version, + } + v := parseVersion(vt.Version) + if v.Major == 1 && v.Minor >= 74 { + vt.Transitional = true + } + return vt +} + +type version struct { + Major int + Minor int + Patch int + RC int +} + +func parseVersion(value string) version { + var ( + parsedVersion = semver.MustParse(value) + v = version{ + Major: int(parsedVersion.Major()), + Minor: int(parsedVersion.Minor()), + Patch: int(parsedVersion.Patch()), + } + ) + + pr := parsedVersion.Prerelease() + if pr == "" || pr == "dev" { + return v + } + + split := strings.Split(pr, ".") + if len(split) > 1 { + v.RC, _ = strconv.Atoi(split[1]) + } + + return v } diff --git a/internal/version/version_test.go b/internal/version/version_test.go index 6d605b6808..f6aad5173b 100644 --- a/internal/version/version_test.go +++ b/internal/version/version_test.go @@ -8,6 +8,7 @@ package version import ( "bytes" "os/exec" + "runtime/debug" "strconv" "strings" "testing" @@ -28,19 +29,16 @@ func TestTag(t *testing.T) { t.Skip(err) } dates := strings.Split(string(bytes.TrimSpace(out)), "\n") - if len(dates) != 2 { - t.Skip("unexpected output: ", dates) - } dateHEAD, err := unixDate(dates[0]) if err != nil { t.Skip(err) } - dateTag, err := unixDate(dates[1]) + dateTag, err := unixDate(dates[len(dates)-1]) if err != nil { t.Skip(err) } if dateTag.Before(dateHEAD) { - t.Fatalf( + t.Skipf( "\n(internal/version).Tag value needs to be updated!\n• %s was already released %s\n• Latest commit (HEAD) dates %s", Tag, dateTag.Format(time.Stamp), @@ -56,3 +54,95 @@ func unixDate(u string) (time.Time, error) { } return time.Unix(sec, 0), nil } + +func TestFindV1Version(t *testing.T) { + tests := []struct { + deps []*debug.Module + expected *v1version + }{ + { + deps: []*debug.Module{ + {Path: "gopkg.in/DataDog/dd-trace-go.v1", Version: "v1.2.3-rc.12"}, + }, + expected: &v1version{ + Version: "v1.2.3-rc.12", + }, + }, + { + deps: []*debug.Module{ + {Path: "gopkg.in/DataDog/dd-trace-go.v1", Version: "v1.74.0"}, + }, + expected: &v1version{ + Version: "v1.74.0", + Transitional: true, + }, + }, + { + deps: []*debug.Module{ + {Path: "gopkg.in/DataDog/dd-trace-go.v1", Version: "v1.73.1"}, + }, + expected: &v1version{ + Version: "v1.73.1", + }, + }, + { + deps: []*debug.Module{}, + expected: nil, + }, + { + deps: []*debug.Module{ + {Path: "github.com/DataDog/dd-trace-go/v2", Version: "v2.0.0"}, + }, + expected: nil, + }, + } + for _, c := range tests { + vt := findV1Version(c.deps) + if c.expected == nil { + if vt != nil { + t.Fatalf("got %v, expected nil", vt) + } + continue + } + if vt == nil { + t.Fatalf("got nil, expected *v1version") + } + if vt.Version != c.expected.Version { + t.Fatalf("got %s, expected %s", vt.Version, c.expected.Version) + } + if vt.Transitional != c.expected.Transitional { + t.Fatalf("got %t, expected %t", vt.Transitional, c.expected.Transitional) + } + } +} + +func TestParseVersion(t *testing.T) { + tc := []struct { + version string + major int + minor int + patch int + rc int + }{ + {"v1.2.3-rc.12", 1, 2, 3, 12}, + {"v2.0.0-rc.1", 2, 0, 0, 1}, + {"v2.1.0-dev", 2, 1, 0, 0}, + {"v2.1.0-alpha.21", 2, 1, 0, 21}, + {"v2.1.0-beta.9", 2, 1, 0, 9}, + } + for _, c := range tc { + v := parseVersion(c.version) + if v.Major != c.major { + t.Errorf("Major is %d", v.Major) + } + if v.Minor != c.minor { + t.Errorf("Minor is %d", v.Minor) + } + if v.Patch != c.patch { + t.Errorf("Patch is %d", v.Patch) + } + if v.RC != c.rc { + t.Errorf("RC is %d", v.RC) + } + } +} diff --git a/latests.txt b/latests.txt new file mode 100644 index 0000000000..49ed641861 --- /dev/null +++ b/latests.txt @@ -0,0 +1,12 @@ +Latest DD major version of confluentinc/confluent-kafka-go: 2 +Latest DD major version of dimfeld/httptreemux: 5 +Latest DD major version of elastic/go-elasticsearch: 8 +Latest DD major version of emicklei/go-restful: 3 +Latest DD major version of go-chi/chi: 5 +Latest DD major version of go-pg/pg: 10 +Latest DD major version of go-redis/redis: 9 +Latest DD major version of gofiber/fiber: 2 +Latest DD major version of jackc/pgx: 5 +Latest DD major version of labstack/echo: 4 +Latest DD major version of redis/go-redis: 9 +Latest DD major version of vektah/gqlparser: 2 diff --git a/llmobs/dataset/dataset.go b/llmobs/dataset/dataset.go new file mode 100644 index 0000000000..4ce27c3bd2 --- /dev/null +++ b/llmobs/dataset/dataset.go @@ -0,0 +1,622 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package dataset + +import ( + "bufio" + "context" + "encoding/csv" + "encoding/json" + "errors" + "fmt" + "io" + "iter" + "os" + "slices" + "sync" + + "github.com/google/uuid" + + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +var ( + errRequiresProjectName = errors.New(`a project name must be provided for the dataset, either configured via the DD_LLMOBS_PROJECT_NAME +environment variable, using the global tracer.WithLLMObsProjectName option, or dataset.WithProjectName option`) + errRequiresAppKey = errors.New(`an app key must be provided for the dataset in agentless mode configured via the DD_APP_KEY environment variable`) +) + +const ( + experimentCSVFieldMaxSize = 10 * 1024 * 1024 // 10 MB + batchUpdateThreshold = 5 * 1024 * 1024 // 5 MB - if delta is larger, use bulk upload instead of batch update +) + +// Dataset represents a dataset for DataDog LLM Observability experiments. +type Dataset struct { + mu sync.RWMutex + + name string + description string + records []*Record + id string + version int + + appendRecords map[string]*Record + updateRecords map[string]*RecordUpdate + deleteRecords map[string]struct{} +} + +// Record represents a record in a Dataset. +type Record struct { + Input any + ExpectedOutput any + Metadata any + + id string + version int +} + +// ID returns the record id. +func (r *Record) ID() string { + return r.id +} + +// Version returns the record version. +func (r *Record) Version() int { + return r.version +} + +func (r *Record) applyUpdate(update RecordUpdate) { + if update.Input != nil { + r.Input = update.Input + } + if update.ExpectedOutput != nil { + r.ExpectedOutput = update.ExpectedOutput + } + if update.Metadata != nil { + r.Metadata = update.Metadata + } +} + +// RecordUpdate is used to represent partial record updates. +// Use nil to signal no modifications to a given field. +// Use empty values to signal deletion (e.g. empty strings or empty maps). +type RecordUpdate struct { + Input any + ExpectedOutput any + Metadata any +} + +func (u *RecordUpdate) merge(new RecordUpdate) { + if new.Input != nil { + u.Input = new.Input + } + if new.ExpectedOutput != nil { + u.ExpectedOutput = new.ExpectedOutput + } + if new.Metadata != nil { + u.Metadata = new.Metadata + } +} + +// Create initializes a Dataset and pushes it to DataDog. +func Create(ctx context.Context, name string, records []Record, opts ...CreateOption) (*Dataset, error) { + ll, err := illmobs.ActiveLLMObs() + if err != nil { + return nil, err + } + cfg := defaultCreateConfig() + for _, opt := range opts { + opt(cfg) + } + + // Validate required fields + if ll.Config.ResolvedAgentlessEnabled && ll.Config.TracerConfig.APPKey == "" { + return nil, errRequiresAppKey + } + + // Determine project name: option takes precedence over global config + projectName := cfg.projectName + if projectName == "" { + projectName = ll.Config.ProjectName + } + if projectName == "" { + return nil, errRequiresProjectName + } + + // Get or create project + project, err := ll.Transport.GetOrCreateProject(ctx, projectName) + if err != nil { + return nil, fmt.Errorf("failed to get or create project: %w", err) + } + + resp, err := ll.Transport.CreateDataset(ctx, name, cfg.description, project.ID) + if err != nil { + return nil, fmt.Errorf("failed to create dataset: %w", err) + } + ds := &Dataset{ + id: resp.ID, + name: resp.Name, + description: resp.Description, + version: resp.CurrentVersion, + } + ds.Append(records...) + if len(ds.records) > 0 { + if err := ds.Push(ctx); err != nil { + return nil, fmt.Errorf("failed to push dataset records: %w", err) + } + } + return ds, nil +} + +// CreateFromCSV creates a new dataset from a CSV file. +// +// Notes: +// - CSV files must have a header row +// - Maximum field size is 10MB +// - All columns not specified in input_data_columns or expected_output_columns are automatically treated as metadata +// - The dataset is automatically pushed to Datadog after creation +func CreateFromCSV(ctx context.Context, name, csvPath string, inputCols []string, opts ...CreateOption) (*Dataset, error) { + ll, err := illmobs.ActiveLLMObs() + if err != nil { + return nil, err + } + cfg := defaultCreateConfig() + for _, opt := range opts { + opt(cfg) + } + + // Validate required fields + if ll.Config.ResolvedAgentlessEnabled && ll.Config.TracerConfig.APPKey == "" { + return nil, errRequiresAppKey + } + + // Determine project name: option takes precedence over global config + projectName := cfg.projectName + if projectName == "" { + projectName = ll.Config.ProjectName + } + if projectName == "" { + return nil, errRequiresProjectName + } + + // Get or create project + project, err := ll.Transport.GetOrCreateProject(ctx, projectName) + if err != nil { + return nil, fmt.Errorf("failed to get or create project: %w", err) + } + + // 1) Create dataset + resp, err := ll.Transport.CreateDataset(ctx, name, cfg.description, project.ID) + if err != nil { + return nil, fmt.Errorf("failed to create dataset: %w", err) + } + ds := &Dataset{ + id: resp.ID, + name: resp.Name, + description: resp.Description, + version: resp.CurrentVersion, + } + + // 2) Open CSV with a large buffer so big fields are supported + f, err := os.Open(csvPath) + if err != nil { + return nil, fmt.Errorf("failed to open csv: %w", err) + } + defer f.Close() + + br := bufio.NewReaderSize(f, experimentCSVFieldMaxSize+64*1024) // a bit over 10MB + r := csv.NewReader(br) + r.Comma = cfg.csvDelimiter + r.FieldsPerRecord = -1 // allow variable columns; we enforce via header checks + + // 3) Read header + header, err := r.Read() + if err == io.EOF || (err == nil && len(header) == 0) { + return nil, fmt.Errorf("CSV file appears to be empty or header is missing") + } + if err != nil { + return nil, fmt.Errorf("failed to read header: %w", err) + } + + headerIndex := make(map[string]int, len(header)) + for i, h := range header { + headerIndex[h] = i + } + + // 4) Validate required columns exist + missing := func(required []string) []string { + var m []string + for _, col := range required { + if _, ok := headerIndex[col]; !ok { + m = append(m, col) + } + } + return m + } + + if bad := missing(inputCols); len(bad) > 0 { + return nil, fmt.Errorf("input columns not found in CSV header: %v", bad) + } + if bad := missing(cfg.csvExpectedOutputCols); len(bad) > 0 { + return nil, fmt.Errorf("expected output columns not found in CSV header: %v", bad) + } + if bad := missing(cfg.csvMetadataCols); len(bad) > 0 { + return nil, fmt.Errorf("metadata columns not found in CSV header: %v", bad) + } + + // 5) Stream rows and append + for { + record, err := r.Read() + if err == io.EOF { + break + } + if err != nil { + return nil, fmt.Errorf("failed to read csv row: %w", err) + } + + in := make(map[string]any, len(inputCols)) + for _, col := range inputCols { + in[col] = record[headerIndex[col]] + } + + out := make(map[string]any, len(cfg.csvExpectedOutputCols)) + for _, col := range cfg.csvExpectedOutputCols { + out[col] = record[headerIndex[col]] + } + + meta := make(map[string]any, len(cfg.csvMetadataCols)) + for _, col := range cfg.csvMetadataCols { + meta[col] = record[headerIndex[col]] + } + + ds.Append(Record{ + Input: in, + ExpectedOutput: out, + Metadata: meta, + }) + } + + // 6) Push if any rows were added + if len(ds.records) > 0 { + if err := ds.Push(ctx); err != nil { + return ds, fmt.Errorf("failed to push dataset records: %w", err) + } + } + + return ds, nil +} + +// Pull fetches the given Dataset from DataDog. +func Pull(ctx context.Context, name string, opts ...PullOption) (*Dataset, error) { + ll, err := illmobs.ActiveLLMObs() + if err != nil { + return nil, err + } + + cfg := defaultPullConfig() + for _, opt := range opts { + opt(cfg) + } + + // Validate required fields + if ll.Config.ResolvedAgentlessEnabled && ll.Config.TracerConfig.APPKey == "" { + return nil, errRequiresAppKey + } + + // Determine project name: option takes precedence over global config + projectName := cfg.projectName + if projectName == "" { + projectName = ll.Config.ProjectName + } + if projectName == "" { + return nil, errRequiresProjectName + } + + // Get or create project + project, err := ll.Transport.GetOrCreateProject(ctx, projectName) + if err != nil { + return nil, fmt.Errorf("failed to get or create project: %w", err) + } + + dsResp, recordsResp, err := ll.Transport.GetDatasetWithRecords(ctx, name, project.ID) + if err != nil { + return nil, fmt.Errorf("failed to get dataset: %w", err) + } + + records := make([]*Record, 0, len(recordsResp)) + for _, rec := range recordsResp { + records = append(records, &Record{ + id: rec.ID, + Input: rec.Input, + ExpectedOutput: rec.ExpectedOutput, + Metadata: rec.Metadata, + version: rec.Version, + }) + } + ds := &Dataset{ + id: dsResp.ID, + name: dsResp.Name, + description: dsResp.Description, + records: records, + version: dsResp.CurrentVersion, + } + return ds, nil +} + +// ID returns the dataset id. +func (d *Dataset) ID() string { + return d.id +} + +// Name returns the dataset name. +func (d *Dataset) Name() string { + return d.name +} + +// Version returns the dataset version. +func (d *Dataset) Version() int { + return d.version +} + +// Append adds new records to the Dataset. +func (d *Dataset) Append(records ...Record) { + d.mu.Lock() + defer d.mu.Unlock() + + d.initialize() + + for _, rec := range records { + // This id will be discarded after push, since the backend will generate a new one. + // It is used for tracking new records locally before the push. + id := uuid.New().String() + rec.id = id + + d.appendRecords[id] = &rec + d.records = append(d.records, &rec) + } +} + +// Update updates the item at the given index. +func (d *Dataset) Update(index int, update RecordUpdate) { + d.mu.Lock() + defer d.mu.Unlock() + + if index < 0 || index >= len(d.records) { + log.Warn("llmobs: index %d out of range updating dataset record", index) + return + } + if update.Input == nil && update.Metadata == nil && update.ExpectedOutput == nil { + log.Warn("llmobs: invalid dataset update (no changes)") + return + } + + d.initialize() + rec := d.records[index] + if rec.id == "" { + log.Warn("llmobs: invalid record with no ID at index %d, canceling update and removing record", index) + d.records = slices.Delete(d.records, index, index+1) + return + } + + // if it is an addition that was not pushed yet, just modify the addition + if _, ok := d.appendRecords[rec.id]; ok { + rec.applyUpdate(update) + return + } + + // if there were updates before, just merge them + if prevUpdate, ok := d.updateRecords[rec.id]; ok { + prevUpdate.merge(update) + return + } + d.updateRecords[rec.id] = &update +} + +// Delete deletes the record at the given index. +func (d *Dataset) Delete(index int) { + d.mu.Lock() + defer d.mu.Unlock() + + if index < 0 || index >= len(d.records) { + log.Warn("llmobs: index %d out of range deleting dataset record", index) + return + } + + d.initialize() + rec := d.records[index] + if rec.id == "" { + log.Warn("llmobs: invalid record with no ID at index %d, canceling deletion and removing record", index) + d.records = slices.Delete(d.records, index, index+1) + return + } + + // additionally, remove it from append/update in case it was one + delete(d.appendRecords, rec.id) + delete(d.updateRecords, rec.id) + d.deleteRecords[rec.id] = struct{}{} + d.records = slices.Delete(d.records, index, index+1) +} + +// estimateDeltaSize estimates the size in bytes of the pending changes. +func (d *Dataset) estimateDeltaSize() (int, error) { + // Estimate using JSON serialization of the changes + deltaData := map[string]any{ + "insert": d.appendRecords, + "update": d.updateRecords, + } + encoded, err := json.Marshal(deltaData) + if err != nil { + return 0, fmt.Errorf("failed to estimate delta size: %w", err) + } + return len(encoded), nil +} + +// Push pushes the Dataset changes to DataDog. +// For large changes (>5MB), it uses bulk upload via CSV. +// For smaller changes, it uses batch update API. +func (d *Dataset) Push(ctx context.Context) error { + d.mu.Lock() + defer d.mu.Unlock() + + if d.id == "" { + return errors.New("dataset has no ID (create it using Create or CreateFromCSV)") + } + ll, err := illmobs.ActiveLLMObs() + if err != nil { + return err + } + d.initialize() + + // Estimate delta size to choose between bulk upload and batch update + deltaSize, err := d.estimateDeltaSize() + if err != nil { + return err + } + + // If delta is large, use bulk upload + if deltaSize > batchUpdateThreshold { + log.Debug("llmobs: dataset delta is %d bytes, using bulk upload", deltaSize) + + // Convert all current records to transport format + allRecords := make([]transport.DatasetRecordView, 0, len(d.records)) + for _, rec := range d.records { + allRecords = append(allRecords, transport.DatasetRecordView{ + ID: rec.id, + Input: rec.Input, + ExpectedOutput: rec.ExpectedOutput, + Metadata: rec.Metadata, + Version: rec.version, + }) + } + + if err := ll.Transport.BulkUploadDataset(ctx, d.id, allRecords); err != nil { + return fmt.Errorf("failed to bulk upload dataset: %w", err) + } + + // TODO: Backend doesn't return version from bulk upload yet + d.version++ + + // Clear pending changes + d.appendRecords = make(map[string]*Record) + d.updateRecords = make(map[string]*RecordUpdate) + d.deleteRecords = make(map[string]struct{}) + + return nil + } + + // Use batch update for smaller changes + log.Debug("llmobs: dataset delta is %d bytes, using batch update", deltaSize) + + insertOldIDs := make([]string, 0, len(d.appendRecords)) + insert := make([]transport.DatasetRecordCreate, 0, len(d.appendRecords)) + for id, rec := range d.appendRecords { + insertOldIDs = append(insertOldIDs, id) + insert = append(insert, transport.DatasetRecordCreate{ + Input: rec.Input, + ExpectedOutput: rec.ExpectedOutput, + Metadata: rec.Metadata, + }) + } + update := make([]transport.DatasetRecordUpdate, 0, len(d.updateRecords)) + for id, rec := range d.updateRecords { + update = append(update, transport.DatasetRecordUpdate{ + ID: id, + Input: rec.Input, + ExpectedOutput: transport.AnyPtr(rec.ExpectedOutput), + Metadata: rec.Metadata, + }) + } + del := make([]string, 0, len(d.deleteRecords)) + for id := range d.deleteRecords { + del = append(del, id) + } + + // newRecordIDs should go in the same order + newVersion, newRecordIDs, err := ll.Transport.BatchUpdateDataset(ctx, d.id, insert, update, del) + if err != nil { + return fmt.Errorf("failed to batch update dataset: %w", err) + } + + // TODO(rarguelloF): migrate to new backend response format so this is not necessary + if len(insertOldIDs) != len(newRecordIDs) { + return fmt.Errorf("received a different number of new records than what it was sent (want: %d, got :%d)", len(insertOldIDs), len(newRecordIDs)) + } + + // FIXME(rarguelloF): we don't get version numbers in responses to deletion requests + if newVersion > 0 { + d.version = newVersion + } else { + d.version++ + } + + // update the inserted records with the new IDs generated by the backend + for i, newID := range newRecordIDs { + oldID := insertOldIDs[i] + d.appendRecords[oldID].id = newID + } + d.appendRecords = make(map[string]*Record) + d.updateRecords = make(map[string]*RecordUpdate) + d.deleteRecords = make(map[string]struct{}) + + return nil +} + +// URL returns the url to access the dataset in DataDog. +func (d *Dataset) URL() string { + // FIXME(rarguelloF): will not work for subdomain orgs + return fmt.Sprintf("%s/llm/datasets/%s", illmobs.PublicResourceBaseURL(), d.id) +} + +// Len returns the length of the dataset records. +func (d *Dataset) Len() int { + d.mu.RLock() + defer d.mu.RUnlock() + return len(d.records) +} + +// Records returns an iterator with copies of the records in the Dataset. +// To modify the records, use the Append, Update or Delete methods. +// +// Warning: Do not call any of the methods that modify the records while in the loop, or you will cause a deadlock. +func (d *Dataset) Records() iter.Seq2[int, Record] { + return func(yield func(int, Record) bool) { + d.mu.RLock() + defer d.mu.RUnlock() + + for i, rec := range d.records { + if !yield(i, *rec) { + return + } + } + } +} + +// Record returns the record at the given index. +func (d *Dataset) Record(idx int) (Record, bool) { + if idx < 0 || idx >= len(d.records) { + return Record{}, false + } + rec := d.records[idx] + return *rec, true +} + +func (d *Dataset) initialize() { + if d.records == nil { + d.records = make([]*Record, 0) + } + if d.appendRecords == nil { + d.appendRecords = make(map[string]*Record) + } + if d.updateRecords == nil { + d.updateRecords = make(map[string]*RecordUpdate) + } + if d.deleteRecords == nil { + d.deleteRecords = make(map[string]struct{}) + } +} diff --git a/llmobs/dataset/dataset_example_test.go b/llmobs/dataset/dataset_example_test.go new file mode 100644 index 0000000000..690a93a6c0 --- /dev/null +++ b/llmobs/dataset/dataset_example_test.go @@ -0,0 +1,164 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package dataset_test + +import ( + "context" + "log" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/llmobs/dataset" +) + +func ExampleCreate() { + if err := tracer.Start(tracer.WithLLMObsEnabled(true)); err != nil { + log.Fatal(err) + } + defer tracer.Stop() + + ctx := context.Background() + + // First, create the dataset + ds, err := dataset.Create( + ctx, + "capitals-of-the-world", + []dataset.Record{ + { + Input: map[string]any{ + "question": "What is the capital of China?", + }, + ExpectedOutput: "Beijing", + Metadata: map[string]any{ + "difficulty": "easy", + }, + }, + { + Input: map[string]any{ + "question": "Which city serves as the capital of South Africa?", + }, + ExpectedOutput: "Pretoria", + Metadata: map[string]any{ + "difficulty": "medium", + }, + }, + }, + dataset.WithDescription("Questions about world capitals"), + ) + if err != nil { + log.Fatal(err) + } + + // Finally, push the dataset to DataDog + if err := ds.Push(ctx); err != nil { + log.Fatal(err) + } +} + +func ExampleDataset_Append() { + if err := tracer.Start(tracer.WithLLMObsEnabled(true)); err != nil { + log.Fatal(err) + } + defer tracer.Stop() + + ctx := context.Background() + + // First, create the dataset + ds, err := dataset.Create( + ctx, + "capitals-of-the-world", + []dataset.Record{ + { + Input: map[string]any{ + "question": "What is the capital of China?", + }, + ExpectedOutput: "Beijing", + Metadata: map[string]any{ + "difficulty": "easy", + }, + }, + { + Input: map[string]any{ + "question": "Which city serves as the capital of South Africa?", + }, + ExpectedOutput: "Pretoria", + Metadata: map[string]any{ + "difficulty": "medium", + }, + }, + }, + dataset.WithDescription("Questions about world capitals"), + ) + if err != nil { + log.Fatal(err) + } + + // Add a new question + ds.Append(dataset.Record{ + Input: map[string]any{ + "question": "What is the capital of China?", + }, + ExpectedOutput: "Beijing", + Metadata: map[string]any{ + "difficulty": "easy", + }, + }) + + // Finally, push the dataset to DataDog + if err := ds.Push(ctx); err != nil { + log.Fatal(err) + } +} + +func ExampleDataset_Update() { + if err := tracer.Start(tracer.WithLLMObsEnabled(true)); err != nil { + log.Fatal(err) + } + defer tracer.Stop() + + ctx := context.Background() + + // First, create the dataset + ds, err := dataset.Create( + ctx, + "capitals-of-the-world", + []dataset.Record{ + { + Input: map[string]any{ + "question": "What is the capital of China?", + }, + ExpectedOutput: "Beijing", + Metadata: map[string]any{ + "difficulty": "easy", + }, + }, + { + Input: map[string]any{ + "question": "Which city serves as the capital of South Africa?", + }, + ExpectedOutput: "Pretoria", + Metadata: map[string]any{ + "difficulty": "medium", + }, + }, + }, + dataset.WithDescription("Questions about world capitals"), + ) + if err != nil { + log.Fatal(err) + } + + // Update the difficulty of the first question + ds.Update(0, dataset.RecordUpdate{ + Input: nil, // leave unchanged + ExpectedOutput: nil, // leave unchanged + Metadata: map[string]any{"difficulty": "medium"}, + }) + + // Finally, push the dataset to DataDog + if err := ds.Push(ctx); err != nil { + log.Fatal(err) + } +} diff --git a/llmobs/dataset/dataset_test.go b/llmobs/dataset/dataset_test.go new file mode 100644 index 0000000000..365643ecf5 --- /dev/null +++ b/llmobs/dataset/dataset_test.go @@ -0,0 +1,1544 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package dataset + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "math/rand" + "net/http" + "os" + "path/filepath" + "strings" + "sync" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/testtracer" + llmobstransport "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" +) + +const ( + testAPIKey = "abcd1234efgh5678ijkl9012mnop3456" + testAppKey = "test-app-key" +) + +func TestDatasetCreation(t *testing.T) { + t.Run("successful-creation", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"question": "What is the capital of France?"}, + ExpectedOutput: "Paris", + Metadata: map[string]any{"category": "geography"}, + }, + { + Input: map[string]any{"question": "What is the capital of Germany?"}, + ExpectedOutput: "Berlin", + Metadata: map[string]any{"category": "geography"}, + }, + } + + ds, err := Create( + context.Background(), + "test-dataset", + records, + WithDescription("Test dataset for integration tests"), + ) + + require.NoError(t, err) + require.NotNil(t, ds) + assert.Equal(t, "test-dataset", ds.Name()) + assert.Equal(t, "test-dataset-id", ds.ID()) + assert.Equal(t, 2, ds.Version()) + assert.Equal(t, 2, ds.Len()) + }) + t.Run("creation-with-options", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"text": "Hello world"}, + ExpectedOutput: "greeting", + }, + } + + ds, err := Create( + context.Background(), + "test-dataset-with-options", + records, + WithDescription("Dataset with custom description"), + ) + + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "test-dataset-with-options", ds.Name()) + assert.Equal(t, 1, ds.Len()) + }) + t.Run("with-project-name-option", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"text": "Hello world"}, + ExpectedOutput: "greeting", + }, + } + + ds, err := Create( + context.Background(), + "test-dataset-with-project", + records, + WithDescription("Dataset with custom project name"), + WithProjectName("custom-project"), + ) + + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "test-dataset-with-project", ds.Name()) + assert.Equal(t, 1, ds.Len()) + }) + t.Run("missing-dd-app-key-agentless", func(t *testing.T) { + t.Setenv("DD_API_KEY", testAPIKey) + t.Setenv("DD_APP_KEY", "") + + // Use agentless mode to trigger app key requirement + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsAgentlessEnabled(true))) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"question": "test"}, + ExpectedOutput: "answer", + }, + } + + _, err := Create( + context.Background(), + "test-dataset", + records, + ) + + // Should fail - datasets require DD_APP_KEY in agentless mode + require.Error(t, err) + assert.Contains(t, err.Error(), "an app key must be provided") + }) + t.Run("missing-dd-app-key-agent-mode", func(t *testing.T) { + t.Setenv("DD_APP_KEY", "") + + // Use agent mode - app key should not be required + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsAgentlessEnabled(false))) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"question": "test"}, + ExpectedOutput: "answer", + }, + } + + ds, err := Create( + context.Background(), + "test-dataset", + records, + ) + + // Should succeed - app key not required in agent mode + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "test-dataset", ds.Name()) + }) + t.Run("missing-project-name", func(t *testing.T) { + + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsProjectName(""))) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"question": "test"}, + ExpectedOutput: "answer", + }, + } + + _, err := Create(context.Background(), "test-dataset", records) + require.Error(t, err) + assert.Contains(t, err.Error(), "project name must be provided") + }) + t.Run("empty-records", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds, err := Create( + context.Background(), + "test-dataset", + []Record{}, + ) + + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, 0, ds.Len()) + }) +} + +func TestDatasetCRUDOperations(t *testing.T) { + t.Run("append-records", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create initial dataset + initialRecords := []Record{ + { + Input: map[string]any{"question": "What is 2+2?"}, + ExpectedOutput: "4", + }, + } + + ds, err := Create(context.Background(), "test-dataset", initialRecords) + require.NoError(t, err) + assert.Equal(t, 1, ds.Len()) + + // Append new records + ds.Append(Record{ + Input: map[string]any{"question": "What is 3+3?"}, + ExpectedOutput: "6", + }) + ds.Append(Record{ + Input: map[string]any{"question": "What is 4+4?"}, + ExpectedOutput: "8", + }) + + // Push changes + err = ds.Push(context.Background()) + require.NoError(t, err) + + // Verify length increased + assert.Equal(t, 3, ds.Len()) + }) + t.Run("update-records", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create dataset with records + records := []Record{ + { + Input: map[string]any{"question": "Original question"}, + ExpectedOutput: "Original answer", + Metadata: map[string]any{"version": "v1"}, + }, + } + + ds, err := Create(context.Background(), "test-dataset", records) + require.NoError(t, err) + + // Update the record at index 0 + ds.Update(0, RecordUpdate{ + Input: map[string]any{"question": "Updated question"}, + ExpectedOutput: "Updated answer", + Metadata: map[string]any{"version": "v2"}, + }) + + // Push changes + err = ds.Push(context.Background()) + require.NoError(t, err) + + // Verify record was updated (we can't directly verify the content + // since the mock doesn't return updated data, but we can verify no errors) + assert.Equal(t, 1, ds.Len()) + }) + t.Run("delete-records", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create dataset with multiple records + records := []Record{ + { + Input: map[string]any{"question": "Keep this"}, + ExpectedOutput: "answer1", + }, + { + Input: map[string]any{"question": "Delete this"}, + ExpectedOutput: "answer2", + }, + } + + ds, err := Create(context.Background(), "test-dataset", records) + require.NoError(t, err) + assert.Equal(t, 2, ds.Len()) + + // Delete the record at index 1 + ds.Delete(1) + + // Push changes + err = ds.Push(context.Background()) + require.NoError(t, err) + + // After deleting 1 record from 2, we should have 1 record left + assert.Equal(t, 1, ds.Len()) + }) + t.Run("push-without-id-fails", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create a dataset manually without going through Create() + ds := &Dataset{} + ds.Append(Record{ + Input: map[string]any{"test": "data"}, + ExpectedOutput: "result", + }) + + // Push should fail because dataset has no ID + err := ds.Push(context.Background()) + require.Error(t, err) + assert.Contains(t, err.Error(), "dataset has no ID") + }) + t.Run("bulk-upload-for-large-datasets", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create initial dataset with one record + initialRecords := []Record{ + { + Input: map[string]any{"small": "data"}, + ExpectedOutput: "small", + }, + } + + ds, err := Create(context.Background(), "test-dataset", initialRecords) + require.NoError(t, err) + + // Create a large string that will push us over the 5MB threshold + // We need > 5MB of data. Each record with this data will be ~1.5MB when JSON-encoded + largeString := strings.Repeat("x", 1500000) // ~1.5MB + + // Append 4 large records to exceed the 5MB threshold + for i := 0; i < 4; i++ { + ds.Append(Record{ + Input: map[string]any{ + "large_field": largeString, + "index": i, + }, + ExpectedOutput: fmt.Sprintf("output-%d", i), + Metadata: map[string]any{"size": "large"}, + }) + } + + // Push should use bulk upload because the delta exceeds 5MB + err = ds.Push(context.Background()) + require.NoError(t, err) + + // Verify all records are present + assert.Equal(t, 5, ds.Len()) // 1 initial + 4 appended + }) +} + +func TestDatasetCSVImport(t *testing.T) { + t.Run("successful-csv-import", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create a temporary CSV file + csvContent := `question,answer,category +What is the capital of France?,Paris,geography +What is 2+2?,4,math +What is the largest planet?,Jupiter,astronomy` + + csvFile := createTempCSV(t, csvContent) + defer os.Remove(csvFile) + + // Import from CSV + ds, err := CreateFromCSV( + context.Background(), + "csv-dataset", + csvFile, + []string{"question"}, // input columns + WithDescription("Dataset imported from CSV"), + WithCSVExpectedOutputColumns([]string{"answer"}), + WithCSVMetadataColumns([]string{"category"}), + ) + + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "csv-dataset", ds.Name()) + assert.Equal(t, 3, ds.Len()) + + // Verify records were imported correctly + rec, ok := ds.Record(0) + require.True(t, ok) + + assert.Equal(t, map[string]any{"question": "What is the capital of France?"}, rec.Input) + assert.Equal(t, map[string]any{"answer": "Paris"}, rec.ExpectedOutput) + assert.Equal(t, map[string]any{"category": "geography"}, rec.Metadata) + }) + t.Run("csv-with-project-name-option", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + csvContent := "question,answer,category\nWhat is 2+2?,4,math\nWhat is the capital of Spain?,Madrid,geography\n" + csvFile := createTempCSV(t, csvContent) + defer os.Remove(csvFile) + + ds, err := CreateFromCSV( + context.Background(), + "csv-dataset-with-project", + csvFile, + []string{"question"}, + WithCSVExpectedOutputColumns([]string{"answer"}), + WithCSVMetadataColumns([]string{"category"}), + WithProjectName("csv-custom-project"), + ) + + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "csv-dataset-with-project", ds.Name()) + assert.Equal(t, 2, ds.Len()) + }) + t.Run("csv-with-custom-delimiter", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create CSV with semicolon delimiter + csvContent := `question;answer;category +What is the capital of Spain?;Madrid;geography +What is 5+5?;10;math` + + csvFile := createTempCSV(t, csvContent) + defer os.Remove(csvFile) + + ds, err := CreateFromCSV( + context.Background(), + "test-dataset", + csvFile, + []string{"question"}, + WithCSVDelimiter(';'), + WithCSVExpectedOutputColumns([]string{"answer"}), + WithCSVMetadataColumns([]string{"category"}), + ) + + require.NoError(t, err) + assert.Equal(t, 2, ds.Len()) + }) + t.Run("csv-missing-columns", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + csvContent := `question,answer +What is the capital of Italy?,Rome` + + csvFile := createTempCSV(t, csvContent) + defer os.Remove(csvFile) + + // Try to import with missing metadata column + _, err := CreateFromCSV( + context.Background(), + "test-dataset", + csvFile, + []string{"question"}, + WithCSVMetadataColumns([]string{"category"}), // This column doesn't exist + ) + + require.Error(t, err) + assert.Contains(t, err.Error(), "metadata columns not found in CSV header") + }) + t.Run("csv-empty-file", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + csvFile := createTempCSV(t, "") + defer os.Remove(csvFile) + + _, err := CreateFromCSV( + context.Background(), + "test-dataset", + csvFile, + []string{"question"}, + ) + + require.Error(t, err) + assert.Contains(t, err.Error(), "CSV file appears to be empty") + }) + t.Run("csv-nonexistent-file", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + _, err := CreateFromCSV( + context.Background(), + "test-dataset", + "/nonexistent/file.csv", + []string{"question"}, + ) + + require.Error(t, err) + assert.Contains(t, err.Error(), "failed to open csv") + }) + t.Run("csv-missing-project-name", func(t *testing.T) { + + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsProjectName(""))) + defer tt.Stop() + + csvFile := createTempCSV(t, "question,answer\nWhat is 2+2?,4\n") + defer os.Remove(csvFile) + + _, err := CreateFromCSV( + context.Background(), + "test-dataset", + csvFile, + []string{"question"}, + ) + + require.Error(t, err) + assert.Contains(t, err.Error(), "project name must be provided") + }) +} + +func TestDatasetPull(t *testing.T) { + t.Run("successful-pull", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds, err := Pull(context.Background(), "existing-dataset") + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "existing-dataset", ds.Name()) + assert.Equal(t, "existing-dataset-id", ds.ID()) + // Mock returns 2 records + assert.Equal(t, 2, ds.Len()) + }) + t.Run("pull-with-project-name-option", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds, err := Pull( + context.Background(), + "existing-dataset", + WithPullProjectName("custom-pull-project"), + ) + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "existing-dataset", ds.Name()) + assert.Equal(t, "existing-dataset-id", ds.ID()) + assert.Equal(t, 2, ds.Len()) + }) + t.Run("pull-nonexistent-dataset", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // The mock handler will return an error for unknown datasets + _, err := Pull(context.Background(), "nonexistent-dataset") + require.Error(t, err) + assert.Contains(t, err.Error(), "failed to get dataset") + }) + t.Run("pull-missing-project-name", func(t *testing.T) { + + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsProjectName(""))) + defer tt.Stop() + + _, err := Pull(context.Background(), "existing-dataset") + require.Error(t, err) + assert.Contains(t, err.Error(), "project name must be provided") + }) + t.Run("pull-missing-dd-app-key-agentless", func(t *testing.T) { + t.Setenv("DD_API_KEY", testAPIKey) + t.Setenv("DD_APP_KEY", "") + + // Use agentless mode to trigger app key requirement + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsAgentlessEnabled(true))) + defer tt.Stop() + + _, err := Pull(context.Background(), "existing-dataset") + + // Should fail - datasets require DD_APP_KEY in agentless mode + require.Error(t, err) + assert.Contains(t, err.Error(), "an app key must be provided") + }) + t.Run("pull-missing-dd-app-key-agent-mode", func(t *testing.T) { + t.Setenv("DD_APP_KEY", "") + + // Use agent mode - app key should not be required + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsAgentlessEnabled(false))) + defer tt.Stop() + + ds, err := Pull(context.Background(), "existing-dataset") + + // Should succeed - app key not required in agent mode + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "existing-dataset", ds.Name()) + }) + t.Run("pull-dataset-with-non-map-input", func(t *testing.T) { + h := func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + if !strings.HasPrefix(path, "/api/unstable/llm-obs/v1") { + return nil + } + path = strings.TrimPrefix(path, "/api/unstable/llm-obs/v1") + + switch { + case path == "/projects" && r.Method == http.MethodPost: + return handleMockProjectCreate(r) + case strings.Contains(path, "/datasets") && r.Method == http.MethodGet && !strings.Contains(path, "/records"): + response := llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{ + { + ID: "string-input-dataset-id", + Type: "datasets", + Attributes: llmobstransport.DatasetView{ + ID: "string-input-dataset-id", + Name: "string-input-dataset", + Description: "Dataset with string input", + CurrentVersion: 1, + }, + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } + case strings.Contains(path, "/datasets/") && strings.HasSuffix(path, "/records") && r.Method == http.MethodGet: + // Return records with string input (not a map) - this simulates a dataset created externally + rawJSON := `{ + "data": [ + { + "id": "record-1", + "type": "dataset_records", + "attributes": { + "id": "record-1", + "input": "This is a simple string input, not a map", + "expected_output": "Some output", + "version": 1 + } + } + ] + }` + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(rawJSON)), + Request: r, + } + default: + return nil + } + } + + tt := testTracer(t, testtracer.WithMockResponses(h)) + defer tt.Stop() + + ds, err := Pull(context.Background(), "string-input-dataset") + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "string-input-dataset", ds.Name()) + assert.Equal(t, 1, ds.Len()) + + // Verify the record has the string input + rec, ok := ds.Record(0) + require.True(t, ok) + assert.Equal(t, "This is a simple string input, not a map", rec.Input) + assert.Equal(t, "Some output", rec.ExpectedOutput) + }) + t.Run("pull-dataset-with-non-map-metadata", func(t *testing.T) { + h := func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + if !strings.HasPrefix(path, "/api/unstable/llm-obs/v1") { + return nil + } + path = strings.TrimPrefix(path, "/api/unstable/llm-obs/v1") + + switch { + case path == "/projects" && r.Method == http.MethodPost: + return handleMockProjectCreate(r) + case strings.Contains(path, "/datasets") && r.Method == http.MethodGet && !strings.Contains(path, "/records"): + response := llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{ + { + ID: "string-metadata-dataset-id", + Type: "datasets", + Attributes: llmobstransport.DatasetView{ + ID: "string-metadata-dataset-id", + Name: "string-metadata-dataset", + Description: "Dataset with string metadata", + CurrentVersion: 1, + }, + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } + case strings.Contains(path, "/datasets/") && strings.HasSuffix(path, "/records") && r.Method == http.MethodGet: + // Return records with string metadata (not a map) - this simulates a dataset created externally + rawJSON := `{ + "data": [ + { + "id": "record-1", + "type": "dataset_records", + "attributes": { + "id": "record-1", + "input": {"question": "What is AI?"}, + "expected_output": "Artificial Intelligence", + "metadata": "simple string metadata from UI", + "version": 1 + } + } + ] + }` + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(rawJSON)), + Request: r, + } + default: + return nil + } + } + + tt := testTracer(t, testtracer.WithMockResponses(h)) + defer tt.Stop() + + // This should succeed - metadata can be any type, not just map[string]any + ds, err := Pull(context.Background(), "string-metadata-dataset") + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "string-metadata-dataset", ds.Name()) + assert.Equal(t, 1, ds.Len()) + + // Verify the record has the string metadata + rec, ok := ds.Record(0) + require.True(t, ok) + inputMap, ok := rec.Input.(map[string]any) + require.True(t, ok) + assert.Equal(t, "What is AI?", inputMap["question"]) + assert.Equal(t, "Artificial Intelligence", rec.ExpectedOutput) + assert.Equal(t, "simple string metadata from UI", rec.Metadata) + }) + t.Run("pull-dataset-with-pagination", func(t *testing.T) { + // Track which page we're on to simulate pagination + var requestCount int + + h := func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + if !strings.HasPrefix(path, "/api/unstable/llm-obs/v1") { + return nil + } + path = strings.TrimPrefix(path, "/api/unstable/llm-obs/v1") + + switch { + case path == "/projects" && r.Method == http.MethodPost: + return handleMockProjectCreate(r) + case strings.Contains(path, "/datasets") && r.Method == http.MethodGet && !strings.Contains(path, "/records"): + response := llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{ + { + ID: "paginated-dataset-id", + Type: "datasets", + Attributes: llmobstransport.DatasetView{ + ID: "paginated-dataset-id", + Name: "paginated-dataset", + Description: "Dataset with pagination", + CurrentVersion: 1, + }, + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } + case strings.Contains(path, "/datasets/") && strings.Contains(path, "/records") && r.Method == http.MethodGet: + // Simulate 3 pages of results + requestCount++ + var rawJSON string + + switch requestCount { + case 1: + // First page - has cursor for next page + rawJSON = `{ + "data": [ + { + "id": "record-1", + "type": "dataset_records", + "attributes": { + "id": "record-1", + "input": {"question": "Q1"}, + "expected_output": "A1", + "metadata": {}, + "version": 1 + } + }, + { + "id": "record-2", + "type": "dataset_records", + "attributes": { + "id": "record-2", + "input": {"question": "Q2"}, + "expected_output": "A2", + "metadata": {}, + "version": 1 + } + } + ], + "meta": { + "after": "cursor-page-2" + } + }` + case 2: + // Second page - has cursor for next page + rawJSON = `{ + "data": [ + { + "id": "record-3", + "type": "dataset_records", + "attributes": { + "id": "record-3", + "input": {"question": "Q3"}, + "expected_output": "A3", + "metadata": {}, + "version": 1 + } + } + ], + "meta": { + "after": "cursor-page-3" + } + }` + default: + // Third page - no cursor (last page) + rawJSON = `{ + "data": [ + { + "id": "record-4", + "type": "dataset_records", + "attributes": { + "id": "record-4", + "input": {"question": "Q4"}, + "expected_output": "A4", + "metadata": {}, + "version": 1 + } + } + ], + "meta": {} + }` + } + + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(rawJSON)), + Request: r, + } + default: + return nil + } + } + + tt := testTracer(t, testtracer.WithMockResponses(h)) + defer tt.Stop() + + // Pull the dataset - should fetch all pages automatically (eager loading) + ds, err := Pull(context.Background(), "paginated-dataset") + require.NoError(t, err) + assert.NotNil(t, ds) + assert.Equal(t, "paginated-dataset", ds.Name()) + + // Verify all records from all pages were fetched + assert.Equal(t, 4, ds.Len(), "should have fetched all records across all pages") + assert.Equal(t, 3, requestCount, "should have made 3 requests for 3 pages") + + // Verify each record + for i := 0; i < 4; i++ { + rec, ok := ds.Record(i) + require.True(t, ok, "record %d should exist", i) + inputMap, ok := rec.Input.(map[string]any) + require.True(t, ok) + assert.Equal(t, fmt.Sprintf("Q%d", i+1), inputMap["question"]) + assert.Equal(t, fmt.Sprintf("A%d", i+1), rec.ExpectedOutput) + } + }) +} + +func TestDatasetRecordIteration(t *testing.T) { + t.Run("records-iterator", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"question": "Q1"}, + ExpectedOutput: "A1", + }, + { + Input: map[string]any{"question": "Q2"}, + ExpectedOutput: "A2", + }, + { + Input: map[string]any{"question": "Q3"}, + ExpectedOutput: "A3", + }, + } + + ds, err := Create(context.Background(), "test-dataset", records) + require.NoError(t, err) + + // Test iterator + count := 0 + for i, rec := range ds.Records() { + assert.Equal(t, count, i) + inputMap, ok := rec.Input.(map[string]any) + require.True(t, ok, "Input should be a map") + assert.NotEmpty(t, inputMap["question"]) + count++ + } + assert.Equal(t, 3, count) + }) + t.Run("record-by-index", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + records := []Record{ + { + Input: map[string]any{"question": "Test question"}, + ExpectedOutput: "Test answer", + }, + } + + ds, err := Create(context.Background(), "test-dataset", records) + require.NoError(t, err) + + // Test valid index + rec, ok := ds.Record(0) + require.True(t, ok) + inputMap, ok := rec.Input.(map[string]any) + require.True(t, ok, "Input should be a map") + assert.Equal(t, "Test question", inputMap["question"]) + + // Test invalid indices + _, ok = ds.Record(-1) + assert.False(t, ok) + + _, ok = ds.Record(1) + assert.False(t, ok) + }) +} + +func TestDatasetURL(t *testing.T) { + run := func(t *testing.T) string { + tt := testTracer(t) + defer tt.Stop() + + ds, err := Create(context.Background(), "test-dataset", []Record{}) + require.NoError(t, err) + + return ds.URL() + } + t.Run("with-dd-site", func(t *testing.T) { + t.Setenv("DD_SITE", "my-dd-site") + url := run(t) + assert.Equal(t, url, "https://my-dd-site/llm/datasets/test-dataset-id") + }) + t.Run("empty-dd-site", func(t *testing.T) { + url := run(t) + assert.Equal(t, "https://app.datadoghq.com/llm/datasets/test-dataset-id", url) + }) +} + +func TestDDAppKeyHeader(t *testing.T) { + t.Run("dd-app-key-header-agentless", func(t *testing.T) { + t.Setenv("DD_API_KEY", testAPIKey) + t.Setenv("DD_APP_KEY", testAppKey) + + var capturedHeaders http.Header + h := func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + if strings.Contains(path, "/api/unstable/llm-obs/v1/datasets") { + capturedHeaders = r.Header.Clone() + } + // Let the default dataset mock handler handle the response + return createMockHandler()(r) + } + + // Force agentless mode explicitly + tt := testTracer(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsAgentlessEnabled(true), + ), + testtracer.WithMockResponses(h), + ) + defer tt.Stop() + + _, err := Create( + context.Background(), + "test-dataset", + []Record{ + { + Input: map[string]any{"question": "test"}, + ExpectedOutput: "answer", + }, + }, + WithDescription("Test DD_APP_KEY header in agentless mode"), + ) + require.NoError(t, err) + + require.NotNil(t, capturedHeaders, "No headers were captured") + assert.Equal(t, testAppKey, capturedHeaders.Get("DD-APPLICATION-KEY"), "DD-APPLICATION-KEY header should be set in agentless mode") + }) + t.Run("dd-app-key-header-agent-mode", func(t *testing.T) { + var capturedHeaders http.Header + h := func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + + if strings.Contains(path, "/api/unstable/llm-obs/v1/datasets") { + capturedHeaders = r.Header.Clone() + } + // Let the default dataset mock handler handle the response + return createMockHandler()(r) + } + + // Force agent mode explicitly + tt := testTracer(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, // Agent supports evp_proxy + }), + testtracer.WithMockResponses(h), + ) + defer tt.Stop() + + _, err := Create( + context.Background(), + "test-dataset", + []Record{ + { + Input: map[string]any{"question": "test"}, + ExpectedOutput: "answer", + }, + }, + WithDescription("Test DD_APP_KEY header in agent mode"), + ) + require.NoError(t, err) + + require.NotNil(t, capturedHeaders, "No headers were captured") + assert.Equal(t, "true", capturedHeaders.Get("X-Datadog-NeedsAppKey"), "X-Datadog-NeedsAppKey header should always be set in agent mode") + assert.Empty(t, capturedHeaders.Get("DD-APPLICATION-KEY"), "DD-APPLICATION-KEY header should not be set in agent mode") + }) + t.Run("needs-app-key-header-agent-mode", func(t *testing.T) { + t.Setenv("DD_APP_KEY", "") // No app key provided + + var capturedHeaders http.Header + h := func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + + if strings.Contains(path, "/api/unstable/llm-obs/v1/datasets") { + capturedHeaders = r.Header.Clone() + } + // Let the default dataset mock handler handle the response + return createMockHandler()(r) + } + + // Force agent mode explicitly + tt := testTracer(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, // Agent supports evp_proxy + }), + testtracer.WithMockResponses(h), + ) + defer tt.Stop() + + _, err := Create(context.Background(), "test-dataset", []Record{ + { + Input: map[string]any{"question": "test"}, + ExpectedOutput: "answer", + }, + }) + require.NoError(t, err) + + require.NotNil(t, capturedHeaders, "No headers were captured") + assert.Equal(t, "true", capturedHeaders.Get("X-Datadog-NeedsAppKey"), "X-Datadog-NeedsAppKey header should be set when no app key is provided in agent mode") + assert.Empty(t, capturedHeaders.Get("DD-APPLICATION-KEY"), "DD-APPLICATION-KEY header should not be set when no app key is provided") + }) +} + +func BenchmarkDatasetIterator(b *testing.B) { + b.ReportAllocs() + + records := generateRandomRecords(10000) + ds := &Dataset{records: records} + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for range ds.Records() { + } + } +} + +func BenchmarkDatasetLoop(b *testing.B) { + b.ReportAllocs() + + records := generateRandomRecords(10000) + ds := &Dataset{records: records} + + b.StartTimer() + for i := 0; i < b.N; i++ { + for range ds.records { + } + } + b.StopTimer() +} + +// Helper functions + +func randomString(n int) string { + letters := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + b := make([]rune, n) + for i := range b { + b[i] = letters[rand.Intn(len(letters))] + } + return string(b) +} + +func randomMap(k int) map[string]any { + m := make(map[string]any, k) + for i := 0; i < k; i++ { + key := randomString(5) + // Randomly assign int or string + if rand.Intn(2) == 0 { + m[key] = rand.Intn(1000) + } else { + m[key] = randomString(8) + } + } + return m +} + +func randomRecord() *Record { + return &Record{ + id: randomString(10), + Input: randomMap(rand.Intn(5) + 1), // 1–5 entries + ExpectedOutput: rand.Intn(1000), // simple int for example + Metadata: randomMap(rand.Intn(3) + 1), // 1–3 entries + version: rand.Intn(10), // version 0–9 + } +} + +func generateRandomRecords(n int) []*Record { + records := make([]*Record, n) + for i := 0; i < n; i++ { + records[i] = randomRecord() + } + return records +} + +func testTracer(t *testing.T, opts ...testtracer.Option) *testtracer.TestTracer { + tracerOpts := []tracer.StartOption{ + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLLMObsProjectName("test-project"), + tracer.WithLLMObsAgentlessEnabled(false), + tracer.WithService("test-service"), + tracer.WithLogStartup(false), + } + defaultOpts := []testtracer.Option{ + testtracer.WithTracerStartOpts(tracerOpts...), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + testtracer.WithMockResponses(createMockHandler()), + } + allOpts := append(defaultOpts, opts...) + tt := testtracer.Start(t, allOpts...) + t.Cleanup(tt.Stop) + return tt +} + +// createMockHandler creates a mock handler for dataset-related requests +func createMockHandler() testtracer.MockResponseFunc { + state := newMockDatasetState() + + return func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + if !strings.HasPrefix(path, "/api/unstable/llm-obs/v1") { + return nil + } + path = strings.TrimPrefix(path, "/api/unstable/llm-obs/v1") + + switch { + case path == "/projects" && r.Method == http.MethodPost: + return handleMockProjectCreate(r) + + case strings.HasPrefix(path, "/datasets") && strings.HasSuffix(path, "/batch_update"): + return handleMockDatasetBatchUpdate(r) + + case strings.Contains(path, "/datasets/") && strings.HasSuffix(path, "/records/upload") && r.Method == http.MethodPost: + return handleMockDatasetBulkUpload(r) + + case strings.Contains(path, "/datasets") && r.Method == http.MethodGet && !strings.Contains(path, "/records"): + return handleMockDatasetGet(r, state) + + case strings.Contains(path, "/datasets/") && strings.HasSuffix(path, "/records") && r.Method == http.MethodGet: + return handleMockDatasetGet(r, state) + + case strings.Contains(path, "/datasets") && r.Method == http.MethodPost: + return handleMockDatasetCreate(r, state) + + default: + return nil + } + } +} + +func handleMockProjectCreate(r *http.Request) *http.Response { + // Mock project creation - always return the same project + response := llmobstransport.CreateProjectResponse{ + Data: llmobstransport.ResponseData[llmobstransport.ProjectView]{ + ID: "test-project-id", + Type: "projects", + Attributes: llmobstransport.ProjectView{ + ID: "test-project-id", + Name: "test-project", + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func handleMockDatasetCreate(r *http.Request, state *mockDatasetState) *http.Response { + // Parse the request body to get the dataset name + body, _ := io.ReadAll(r.Body) + r.Body = io.NopCloser(bytes.NewReader(body)) // Reset body for potential re-reading + + // The actual request structure matches CreateDatasetRequest + var createReq llmobstransport.CreateDatasetRequest + if err := json.Unmarshal(body, &createReq); err != nil { + return &http.Response{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"error": "invalid request body"}`)), + Request: r, + } + } + + name := createReq.Data.Attributes.Name + description := createReq.Data.Attributes.Description + + // Check if dataset already exists + if _, exists := state.getDataset(name); exists { + return &http.Response{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"error": "dataset already exists"}`)), + Request: r, + } + } + + // Create the dataset + dataset := &llmobstransport.DatasetView{ + ID: "test-dataset-id", + Name: name, + Description: description, + CurrentVersion: 1, + } + state.addDataset(name, dataset) + + response := llmobstransport.CreateDatasetResponse{ + Data: llmobstransport.ResponseData[llmobstransport.DatasetView]{ + ID: "test-dataset-id", + Type: "datasets", + Attributes: *dataset, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func handleMockDatasetGet(r *http.Request, state *mockDatasetState) *http.Response { + // Parse query parameters to determine if this is a specific dataset request + name := r.URL.Query().Get("filter[name]") + + if name != "" { + // Check if dataset exists in our state + dataset, exists := state.getDataset(name) + + var response llmobstransport.GetDatasetResponse + if exists && name != "nonexistent-dataset" { + // Return the dataset if it exists + response = llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{ + { + ID: dataset.ID, + Type: "datasets", + Attributes: *dataset, + }, + }, + } + } else if name == "existing-dataset" { + // Special case for pull tests - simulate an existing dataset + response = llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{ + { + ID: "existing-dataset-id", + Type: "datasets", + Attributes: llmobstransport.DatasetView{ + ID: "existing-dataset-id", + Name: "existing-dataset", + Description: "Existing dataset for pull tests", + CurrentVersion: 1, + }, + }, + }, + } + } else { + // Return empty list if dataset doesn't exist (not a 404) + response = llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{}, + } + } + + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } + } + + // Check if this is a request for dataset records + if strings.Contains(r.URL.Path, "/records") { + recordsResponse := llmobstransport.GetDatasetRecordsResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetRecordView]{ + { + ID: "record-1", + Type: "dataset_records", + Attributes: llmobstransport.DatasetRecordView{ + ID: "record-1", + Input: map[string]any{"question": "What is AI?"}, + ExpectedOutput: "Artificial Intelligence", + Version: 1, + }, + }, + { + ID: "record-2", + Type: "dataset_records", + Attributes: llmobstransport.DatasetRecordView{ + ID: "record-2", + Input: map[string]any{"question": "What is ML?"}, + ExpectedOutput: "Machine Learning", + Version: 1, + }, + }, + }, + } + respData, _ := json.Marshal(recordsResponse) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } + } + + // Return mock dataset + datasetResponse := llmobstransport.GetDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetView]{ + { + ID: "existing-dataset-id", + Type: "datasets", + Attributes: llmobstransport.DatasetView{ + ID: "existing-dataset-id", + Name: "existing-dataset", + Description: "Existing dataset from backend", + CurrentVersion: 1, + }, + }, + }, + } + + respData, _ := json.Marshal(datasetResponse) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func handleMockDatasetBatchUpdate(r *http.Request) *http.Response { + // Parse the request body to understand what operations are being performed + body, _ := io.ReadAll(r.Body) + r.Body = io.NopCloser(bytes.NewReader(body)) // Reset body for potential re-reading + + var batchReq llmobstransport.BatchUpdateDatasetRequest + if err := json.Unmarshal(body, &batchReq); err != nil { + return &http.Response{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"error": "invalid request body"}`)), + Request: r, + } + } + + attrs := batchReq.Data.Attributes + + // Create response data for updated records first, then inserted records + var response llmobstransport.BatchUpdateDatasetResponse + + // Add updated records (these keep their existing IDs) + for _, updateRec := range attrs.UpdateRecords { + response.Data = append(response.Data, llmobstransport.ResponseData[llmobstransport.DatasetRecordView]{ + ID: updateRec.ID, // Keep the existing ID for updates + Type: "dataset_records", + Attributes: llmobstransport.DatasetRecordView{ + ID: updateRec.ID, + Input: updateRec.Input, + ExpectedOutput: *updateRec.ExpectedOutput, + Version: 2, + }, + }) + } + + // Add inserted records (these get new IDs) + for i, insertRec := range attrs.InsertRecords { + newID := fmt.Sprintf("new-record-id-%d", i+1) + response.Data = append(response.Data, llmobstransport.ResponseData[llmobstransport.DatasetRecordView]{ + ID: newID, + Type: "dataset_records", + Attributes: llmobstransport.DatasetRecordView{ + ID: newID, + Input: insertRec.Input, + ExpectedOutput: insertRec.ExpectedOutput, + Version: 2, + }, + }) + } + + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func handleMockDatasetBulkUpload(r *http.Request) *http.Response { + // For bulk upload, we just need to verify the multipart form is valid + // and return a success response. The actual CSV parsing is done on the backend. + contentType := r.Header.Get("Content-Type") + if !strings.HasPrefix(contentType, "multipart/form-data") { + return &http.Response{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"error": "expected multipart/form-data"}`)), + Request: r, + } + } + + // Read and verify the body exists (we don't parse CSV in tests) + body, _ := io.ReadAll(r.Body) + if len(body) == 0 { + return &http.Response{ + Status: "400 Bad Request", + StatusCode: http.StatusBadRequest, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"error": "empty body"}`)), + Request: r, + } + } + + // Return success response + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"status": "success"}`)), + Request: r, + } +} + +func createTempCSV(t *testing.T, content string) string { + tmpDir := t.TempDir() + csvFile := filepath.Join(tmpDir, "test.csv") + err := os.WriteFile(csvFile, []byte(content), 0644) + require.NoError(t, err) + return csvFile +} + +type mockDatasetState struct { + datasets map[string]*llmobstransport.DatasetView + mu sync.RWMutex +} + +func newMockDatasetState() *mockDatasetState { + return &mockDatasetState{ + datasets: make(map[string]*llmobstransport.DatasetView), + } +} + +func (s *mockDatasetState) addDataset(name string, dataset *llmobstransport.DatasetView) { + s.mu.Lock() + defer s.mu.Unlock() + s.datasets[name] = dataset +} + +func (s *mockDatasetState) getDataset(name string) (*llmobstransport.DatasetView, bool) { + s.mu.RLock() + defer s.mu.RUnlock() + dataset, exists := s.datasets[name] + return dataset, exists +} diff --git a/llmobs/dataset/option.go b/llmobs/dataset/option.go new file mode 100644 index 0000000000..999c9a0b15 --- /dev/null +++ b/llmobs/dataset/option.go @@ -0,0 +1,78 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package dataset + +type createConfig struct { + description string + projectName string + csvDelimiter rune + csvMetadataCols []string + csvExpectedOutputCols []string +} + +func defaultCreateConfig() *createConfig { + return &createConfig{ + description: "", + projectName: "", + csvDelimiter: ',', + csvMetadataCols: nil, + csvExpectedOutputCols: nil, + } +} + +type CreateOption func(cfg *createConfig) + +func WithDescription(description string) CreateOption { + return func(cfg *createConfig) { + cfg.description = description + } +} + +// WithProjectName sets the project name for the dataset. +// This overrides the global project name configured via DD_LLM_OBS_ML_APP or tracer.WithLLMObsProjectName(). +func WithProjectName(projectName string) CreateOption { + return func(cfg *createConfig) { + cfg.projectName = projectName + } +} + +func WithCSVDelimiter(delimiter rune) CreateOption { + return func(cfg *createConfig) { + cfg.csvDelimiter = delimiter + } +} + +func WithCSVMetadataColumns(cols []string) CreateOption { + return func(cfg *createConfig) { + cfg.csvMetadataCols = cols + } +} + +func WithCSVExpectedOutputColumns(cols []string) CreateOption { + return func(cfg *createConfig) { + cfg.csvExpectedOutputCols = cols + } +} + +type pullConfig struct { + projectName string +} + +func defaultPullConfig() *pullConfig { + return &pullConfig{ + projectName: "", + } +} + +type PullOption func(cfg *pullConfig) + +// WithPullProjectName sets the project name for pulling the dataset. +// This overrides the global project name configured via DD_LLM_OBS_ML_APP or tracer.WithLLMObsProjectName(). +func WithPullProjectName(projectName string) PullOption { + return func(cfg *pullConfig) { + cfg.projectName = projectName + } +} diff --git a/llmobs/eval_metrics.go b/llmobs/eval_metrics.go new file mode 100644 index 0000000000..2c0f5fadef --- /dev/null +++ b/llmobs/eval_metrics.go @@ -0,0 +1,159 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import ( + "time" + + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// EvaluationValue represents the allowed types for evaluation metric values. +// Supports boolean values (true/false), string values (categorical), and numeric values (scores). +type EvaluationValue interface { + ~bool | ~string | ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~float32 | ~float64 +} + +// EvaluatedSpan is the interface used in SubmitEvaluationFromSpan to identify the span to evaluate. +type EvaluatedSpan interface { + SpanID() string + TraceID() string +} + +// SubmitEvaluationFromSpan submits an evaluation metric for the given span. +// The metric will be associated with the span using its span ID and trace ID. +func SubmitEvaluationFromSpan[T EvaluationValue](label string, value T, span EvaluatedSpan, opts ...EvaluationOption) { + var spanID, traceID string + if span != nil { + spanID = span.SpanID() + traceID = span.TraceID() + } + cfg := illmobs.EvaluationConfig{ + Label: label, + SpanID: spanID, + TraceID: traceID, + } + for _, opt := range opts { + opt(&cfg) + } + setValueFromGeneric(&cfg, value) + + ll, err := illmobs.ActiveLLMObs() + if err != nil { + log.Warn("llmobs: failed to submit evaluation metric: %v", err.Error()) + return + } + if err := ll.SubmitEvaluation(cfg); err != nil { + log.Warn("llmobs: failed to submit evaluation metric: %v", err.Error()) + } +} + +// JoinTag represents a tag key-value pair used to identify spans for evaluation metrics. +// When using SubmitEvaluationFromTag, the metric will be associated with all spans +// that have a tag matching this key-value pair. +type JoinTag struct { + // Key is the tag key to match against. + Key string + + // Value is the tag value to match against. + Value string +} + +// SubmitEvaluationFromTag submits an evaluation metric for spans identified by a tag key-value pair. +func SubmitEvaluationFromTag[T EvaluationValue](label string, value T, tag JoinTag, opts ...EvaluationOption) { + cfg := illmobs.EvaluationConfig{ + Label: label, + TagKey: tag.Key, + TagValue: tag.Value, + } + for _, opt := range opts { + opt(&cfg) + } + setValueFromGeneric(&cfg, value) + + ll, err := illmobs.ActiveLLMObs() + if err != nil { + log.Warn("llmobs: failed to submit evaluation metric: %v", err.Error()) + return + } + if err := ll.SubmitEvaluation(cfg); err != nil { + log.Warn("llmobs: failed to submit evaluation metric: %v", err.Error()) + } +} + +// ------------- Evaluation options ------------- + +// EvaluationOption configures evaluation metric submission. +type EvaluationOption func(cfg *illmobs.EvaluationConfig) + +// WithEvaluationTags sets tags for the evaluation metric. +func WithEvaluationTags(tags []string) EvaluationOption { + return func(cfg *illmobs.EvaluationConfig) { + cfg.Tags = tags + } +} + +// WithEvaluationMLApp sets the ML application name for the evaluation metric. +// If not set, uses the global ML app configuration. +func WithEvaluationMLApp(mlApp string) EvaluationOption { + return func(cfg *illmobs.EvaluationConfig) { + cfg.MLApp = mlApp + } +} + +// WithEvaluationTimestamp sets a custom timestamp for the evaluation metric. +// If not set, uses the current time. +func WithEvaluationTimestamp(t time.Time) EvaluationOption { + return func(cfg *illmobs.EvaluationConfig) { + cfg.TimestampMS = t.UnixMilli() + } +} + +// setValueFromGeneric automatically determines the metric type and sets the appropriate value field using generics. +func setValueFromGeneric[T EvaluationValue](cfg *illmobs.EvaluationConfig, value T) { + switch v := any(value).(type) { + case bool: + cfg.BooleanValue = &v + case string: + cfg.CategoricalValue = &v + case int: + f64 := float64(v) + cfg.ScoreValue = &f64 + case int8: + f64 := float64(v) + cfg.ScoreValue = &f64 + case int16: + f64 := float64(v) + cfg.ScoreValue = &f64 + case int32: + f64 := float64(v) + cfg.ScoreValue = &f64 + case int64: + f64 := float64(v) + cfg.ScoreValue = &f64 + case uint: + f64 := float64(v) + cfg.ScoreValue = &f64 + case uint8: + f64 := float64(v) + cfg.ScoreValue = &f64 + case uint16: + f64 := float64(v) + cfg.ScoreValue = &f64 + case uint32: + f64 := float64(v) + cfg.ScoreValue = &f64 + case uint64: + f64 := float64(v) + cfg.ScoreValue = &f64 + case float32: + f64 := float64(v) + cfg.ScoreValue = &f64 + case float64: + cfg.ScoreValue = &v + } +} diff --git a/llmobs/experiment/experiment.go b/llmobs/experiment/experiment.go new file mode 100644 index 0000000000..f44e9968c1 --- /dev/null +++ b/llmobs/experiment/experiment.go @@ -0,0 +1,549 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package experiment + +import ( + "context" + "errors" + "fmt" + "time" + + "golang.org/x/sync/errgroup" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/errortrace" + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/version" + "github.com/DataDog/dd-trace-go/v2/llmobs/dataset" +) + +var ( + errRequiresProjectName = errors.New(`a project name must be provided for the experiment, either configured via the DD_LLMOBS_PROJECT_NAME +environment variable, using the global tracer.WithLLMObsProjectName option, or experiment.WithProjectName option`) + errRequiresAppKey = errors.New(`an app key must be provided for the experiment in agentless mode configured via the DD_APP_KEY environment variable`) +) + +// Experiment represents a DataDog LLM Observability experiment. +type Experiment struct { + Name string + + cfg *newCfg + task Task + dataset *dataset.Dataset + evaluators []Evaluator + summaryEvaluators []SummaryEvaluator + description string + tagsSlice []string + + // these are set after the experiment is run + id string + runName string +} + +// Task represents the task to run for an Experiment. +type Task interface { + Name() string + Run(ctx context.Context, rec dataset.Record, experimentCfg map[string]any) (any, error) +} + +// Evaluator represents an evaluator for an Experiment. +type Evaluator interface { + Name() string + Run(ctx context.Context, rec dataset.Record, output any) (any, error) +} + +// TaskFunc is the type for Task functions. +type TaskFunc func(ctx context.Context, rec dataset.Record, experimentCfg map[string]any) (any, error) + +type namedTask struct { + name string + fn TaskFunc +} + +func (n *namedTask) Name() string { + return n.name +} + +func (n *namedTask) Run(ctx context.Context, rec dataset.Record, experimentCfg map[string]any) (any, error) { + return n.fn(ctx, rec, experimentCfg) +} + +// NewTask creates a new Task. +func NewTask(name string, fn TaskFunc) Task { + return &namedTask{ + name: name, + fn: fn, + } +} + +// EvaluatorFunc is the type for Evaluator functions. +type EvaluatorFunc func(ctx context.Context, rec dataset.Record, output any) (any, error) + +type namedEvaluator struct { + name string + fn EvaluatorFunc +} + +func (n *namedEvaluator) Name() string { + return n.name +} + +func (n *namedEvaluator) Run(ctx context.Context, rec dataset.Record, output any) (any, error) { + return n.fn(ctx, rec, output) +} + +// NewEvaluator creates a new Evaluator. +func NewEvaluator(name string, fn EvaluatorFunc) Evaluator { + return &namedEvaluator{ + name: name, + fn: fn, + } +} + +// SummaryEvaluator represents a summary evaluator for an Experiment. +// Summary evaluators run after all tasks and evaluators have completed, +// receiving all experiment results to compute aggregate metrics. +type SummaryEvaluator interface { + Name() string + Run(ctx context.Context, results []*RecordResult) (any, error) +} + +// SummaryEvaluatorFunc is the type for SummaryEvaluator functions. +type SummaryEvaluatorFunc func(ctx context.Context, results []*RecordResult) (any, error) + +type namedSummaryEvaluator struct { + name string + fn SummaryEvaluatorFunc +} + +func (n *namedSummaryEvaluator) Name() string { + return n.name +} + +func (n *namedSummaryEvaluator) Run(ctx context.Context, results []*RecordResult) (any, error) { + return n.fn(ctx, results) +} + +// NewSummaryEvaluator creates a new SummaryEvaluator. +func NewSummaryEvaluator(name string, fn SummaryEvaluatorFunc) SummaryEvaluator { + return &namedSummaryEvaluator{ + name: name, + fn: fn, + } +} + +// ExperimentResult represents the complete results of an experiment run. +type ExperimentResult struct { + ExperimentName string + DatasetName string + Results []*RecordResult + SummaryEvaluations []*Evaluation +} + +// RecordResult represents an experiment result for a single record. +type RecordResult struct { + Record *dataset.Record // The dataset record containing input, expected output, and metadata + Output any // The task output for this record + Evaluations []*Evaluation // Evaluation results for this record + + // Experiment execution metadata + RecordIndex int // Index of the record in the dataset + SpanID string // Span ID for tracing + TraceID string // Trace ID for tracing + Timestamp time.Time // When the task was executed + Error error // Any error that occurred during task execution +} + +// Evaluation represents the output of an evaluator. +type Evaluation struct { + Name string + Value any + Error error +} + +// New creates a new Experiment. +func New(name string, task Task, ds *dataset.Dataset, evaluators []Evaluator, opts ...Option) (*Experiment, error) { + ll, err := illmobs.ActiveLLMObs() + if err != nil { + return nil, err + } + + cfg := defaultNewCfg(ll.Config) + for _, opt := range opts { + opt(cfg) + } + if cfg.projectName == "" { + return nil, errRequiresProjectName + } + if ll.Config.ResolvedAgentlessEnabled && ll.Config.TracerConfig.APPKey == "" { + return nil, errRequiresAppKey + } + + if cfg.tags == nil { + cfg.tags = make(map[string]string) + } + cfg.tags["ddtrace.version"] = version.Tag + + tagsSlice := make([]string, 0, len(cfg.tags)) + for k, v := range cfg.tags { + tagsSlice = append(tagsSlice, fmt.Sprintf("%s:%s", k, v)) + } + + return &Experiment{ + Name: name, + task: task, + dataset: ds, + evaluators: evaluators, + summaryEvaluators: cfg.summaryEvaluators, + description: cfg.description, + cfg: cfg, + tagsSlice: tagsSlice, + }, nil +} + +// Run executes the experiment, running the task and evaluators on each record in the dataset, +// then running summary evaluators on the aggregated results. +func (e *Experiment) Run(ctx context.Context, opts ...RunOption) (*ExperimentResult, error) { + ll, err := illmobs.ActiveLLMObs() + if err != nil { + return nil, err + } + cfg := defaultRunCfg() + for _, opt := range opts { + opt(cfg) + } + + // 1) Create or get the project + proj, err := ll.Transport.GetOrCreateProject(ctx, e.cfg.projectName) + if err != nil { + return nil, fmt.Errorf("failed to get or create project: %w", err) + } + + // 2) Create the experiment + expResp, err := ll.Transport.CreateExperiment(ctx, e.Name, e.dataset.ID(), proj.ID, e.dataset.Version(), e.cfg.experimentCfg, e.tagsSlice, e.description) + if err != nil { + return nil, fmt.Errorf("failed to create experiment: %w", err) + } + e.id = expResp.ID + e.runName = expResp.Name + + pushEventsTags := make([]string, len(e.tagsSlice)) + copy(pushEventsTags, e.tagsSlice) + pushEventsTags = append(pushEventsTags, fmt.Sprintf("%s:%s", "experiment_id", e.id)) + + // 3) Run the experiment task for each record in the dataset + results, err := e.runTask(ctx, ll, cfg) + if err != nil { + return nil, fmt.Errorf("failed to run experiment task: %w", err) + } + if err := e.runEvaluators(ctx, results, cfg); err != nil { + return nil, fmt.Errorf("failed to run experiment evaluators: %w", err) + } + + // 4) Run summary evaluators + summaryEvals, err := e.runSummaryEvaluators(ctx, results, cfg) + if err != nil { + return nil, fmt.Errorf("failed to run summary evaluators: %w", err) + } + + // 5) Generate and publish metrics from the results + metrics := e.generateMetrics(results, summaryEvals) + if err := ll.Transport.PushExperimentEvents(ctx, e.id, metrics, pushEventsTags); err != nil { + return nil, fmt.Errorf("failed to push experiment events: %w", err) + } + + return &ExperimentResult{ + ExperimentName: e.Name, + DatasetName: e.dataset.Name(), + Results: results, + SummaryEvaluations: summaryEvals, + }, nil +} + +func (e *Experiment) URL() string { + // FIXME(rarguelloF): will not work for subdomain orgs + return fmt.Sprintf("%s/llm/experiments/%s", illmobs.PublicResourceBaseURL(), e.id) +} + +func (e *Experiment) runTask(ctx context.Context, llmobs *illmobs.LLMObs, cfg *runCfg) ([]*RecordResult, error) { + eg, ctx := errgroup.WithContext(ctx) + if cfg.maxConcurrency > 0 { + eg.SetLimit(cfg.maxConcurrency) + } + + dsSize := e.dataset.Len() + if cfg.sampleSize > 0 && cfg.sampleSize <= e.dataset.Len() { + dsSize = cfg.sampleSize + } + results := make([]*RecordResult, dsSize) + + for i, rec := range e.dataset.Records() { + if cfg.sampleSize > 0 && i >= cfg.sampleSize { + break + } + eg.Go(func() error { + res := e.runTaskForRecord(ctx, llmobs, i, rec) + if res.Error != nil { + retErr := fmt.Errorf("failed to process record %d: %w", i, res.Error) + if cfg.abortOnError { + return retErr + } else { + log.Warn("llmobs: %s", retErr) + } + } + results[i] = res + return nil + }) + } + + if err := eg.Wait(); err != nil { + return nil, err + } + // Ensure spans get submitted in serverless environments + llmobs.Flush() + return results, nil +} + +func (e *Experiment) runTaskForRecord(ctx context.Context, llmobs *illmobs.LLMObs, recIdx int, rec dataset.Record) *RecordResult { + var ( + err error + ) + + span, ctx := llmobs.StartExperimentSpan(ctx, e.task.Name(), e.id, illmobs.StartSpanConfig{}) + defer span.Finish(illmobs.FinishSpanConfig{Error: err}) + + tags := make(map[string]string) + for k, v := range e.cfg.tags { + tags[k] = v + } + tags["dataset_id"] = e.dataset.ID() + tags["dataset_record_id"] = rec.ID() + tags["experiment_id"] = e.id + + out, err := e.task.Run(ctx, rec, e.cfg.experimentCfg) + if err != nil { + err = errortrace.Wrap(err) + } + + span.Annotate(illmobs.SpanAnnotations{ + ExperimentInput: rec.Input, + ExperimentOutput: out, + ExperimentExpectedOutput: rec.ExpectedOutput, + Tags: tags, + }) + + return &RecordResult{ + Record: &rec, + Output: out, + RecordIndex: recIdx, + SpanID: span.SpanID(), + TraceID: span.TraceID(), + Timestamp: span.StartTime(), + Error: err, + } +} + +func (e *Experiment) runEvaluators(ctx context.Context, results []*RecordResult, cfg *runCfg) error { + eg, ctx := errgroup.WithContext(ctx) + if cfg.maxConcurrency > 0 { + eg.SetLimit(cfg.maxConcurrency) + } + + for _, res := range results { + eg.Go(func() error { + evs := make([]*Evaluation, 0, len(e.evaluators)) + for evIdx, ev := range e.evaluators { + val, err := ev.Run(ctx, *res.Record, res.Output) + if err != nil { + // this error will be used later to create the payload sent to the backend, so it must contain the + // stacktrace. + err = errortrace.Wrap(err) + retErr := fmt.Errorf("evaluator %d (%s) failed on record %s: %w", evIdx, ev.Name(), res.Record.ID(), err) + if cfg.abortOnError { + return retErr + } else { + log.Warn("llmobs: %s", retErr) + } + } + evs = append(evs, &Evaluation{ + Name: ev.Name(), + Value: val, + Error: err, + }) + } + res.Evaluations = evs + return nil + }) + } + return eg.Wait() +} + +func (e *Experiment) runSummaryEvaluators(ctx context.Context, results []*RecordResult, cfg *runCfg) ([]*Evaluation, error) { + if len(e.summaryEvaluators) == 0 { + return nil, nil + } + + // Run summary evaluators + summaryEvals := make([]*Evaluation, 0, len(e.summaryEvaluators)) + for evIdx, sumEv := range e.summaryEvaluators { + val, err := sumEv.Run(ctx, results) + if err != nil { + // Wrap error with stacktrace for backend + err = errortrace.Wrap(err) + retErr := fmt.Errorf("summary evaluator %d (%s) failed: %w", evIdx, sumEv.Name(), err) + if cfg.abortOnError { + return nil, retErr + } else { + log.Warn("llmobs: %s", retErr) + } + } + summaryEvals = append(summaryEvals, &Evaluation{ + Name: sumEv.Name(), + Value: val, + Error: err, + }) + } + + return summaryEvals, nil +} + +func (e *Experiment) generateMetrics(results []*RecordResult, summaryEvals []*Evaluation) []transport.ExperimentEvalMetricEvent { + metrics := make([]transport.ExperimentEvalMetricEvent, 0, len(results)+len(summaryEvals)) + + // Track latest timestamp for summary evaluations + var latestTimestamp time.Time + + // Generate metrics from per-record evaluations + for _, res := range results { + if res.Timestamp.After(latestTimestamp) { + latestTimestamp = res.Timestamp + } + for _, ev := range res.Evaluations { + metrics = append(metrics, e.generateMetricFromEvaluation(res, ev, "custom")) + } + } + + // Generate metrics from summary evaluations + // Summary evaluations don't have associated spans, so we use empty span/trace IDs and latest timestamp + for _, sumEv := range summaryEvals { + metrics = append(metrics, e.generateMetricFromSummaryEvaluation(sumEv, latestTimestamp)) + } + return metrics +} + +func (e *Experiment) generateMetricFromEvaluation(res *RecordResult, ev *Evaluation, source string) transport.ExperimentEvalMetricEvent { + var ( + catVal *string + scoreVal *float64 + boolVal *bool + ) + + metricType := "categorical" + switch t := ev.Value.(type) { + case bool: + metricType = "boolean" + boolVal = transport.AnyPtr(t) + + case int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, uintptr, + float32, float64: + metricType = "score" + scoreVal = transport.AnyPtr(asFloat64(t)) + + default: + catVal = transport.AnyPtr(fmt.Sprintf("%v", t)) + } + + return transport.ExperimentEvalMetricEvent{ + MetricSource: source, + SpanID: res.SpanID, + TraceID: res.TraceID, + TimestampMS: res.Timestamp.UnixMilli(), + MetricType: metricType, + Label: ev.Name, + CategoricalValue: catVal, + ScoreValue: scoreVal, + BooleanValue: boolVal, + Error: transport.NewErrorMessage(ev.Error), + Tags: e.tagsSlice, + ExperimentID: e.id, + } +} + +func (e *Experiment) generateMetricFromSummaryEvaluation(ev *Evaluation, timestamp time.Time) transport.ExperimentEvalMetricEvent { + var ( + catVal *string + scoreVal *float64 + boolVal *bool + ) + + metricType := "categorical" + switch t := ev.Value.(type) { + case bool: + metricType = "boolean" + boolVal = transport.AnyPtr(t) + + case int, int8, int16, int32, int64, + uint, uint8, uint16, uint32, uint64, uintptr, + float32, float64: + metricType = "score" + scoreVal = transport.AnyPtr(asFloat64(t)) + + default: + catVal = transport.AnyPtr(fmt.Sprintf("%v", t)) + } + + // Summary evaluations don't have span/trace IDs, but use the latest timestamp from per-record evaluations + return transport.ExperimentEvalMetricEvent{ + MetricSource: "summary", + SpanID: "", + TraceID: "", + TimestampMS: timestamp.UnixMilli(), + MetricType: metricType, + Label: ev.Name, + CategoricalValue: catVal, + ScoreValue: scoreVal, + BooleanValue: boolVal, + Error: transport.NewErrorMessage(ev.Error), + Tags: e.tagsSlice, + ExperimentID: e.id, + } +} + +func asFloat64(x any) float64 { + switch v := x.(type) { + case float64: + return v + case float32: + return float64(v) + + case int: + return float64(v) + case int8: + return float64(v) + case int16: + return float64(v) + case int32: + return float64(v) + case int64: + return float64(v) + + case uint: + return float64(v) + case uint8: + return float64(v) + case uint16: + return float64(v) + case uint32: + return float64(v) + case uint64: + return float64(v) + case uintptr: + return float64(v) + } + return 0 +} diff --git a/llmobs/experiment/experiment_example_test.go b/llmobs/experiment/experiment_example_test.go new file mode 100644 index 0000000000..679922b2e2 --- /dev/null +++ b/llmobs/experiment/experiment_example_test.go @@ -0,0 +1,125 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package experiment_test + +import ( + "context" + "fmt" + "log" + "strings" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/llmobs/dataset" + "github.com/DataDog/dd-trace-go/v2/llmobs/experiment" +) + +func ExampleNew() { + if err := tracer.Start(tracer.WithLLMObsEnabled(true)); err != nil { + log.Fatal(err) + } + defer tracer.Stop() + + ds, err := dataset.Pull(context.TODO(), "capitals-of-the-world") + if err != nil { + log.Fatal(err) + } + + task := experiment.NewTask("capitals-of-the-world", func(ctx context.Context, rec dataset.Record, experimentCfg map[string]any) (any, error) { + inputMap := rec.Input.(map[string]any) + question := inputMap["question"].(string) + // Your LLM or processing logic here + if strings.Contains(question, "China") { + return "Beijing", nil + } + return "Unknown", nil + }) + + evs := []experiment.Evaluator{ + experiment.NewEvaluator("exact-match", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return output == rec.ExpectedOutput, nil + }), + experiment.NewEvaluator("overlap", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + outStr, ok := output.(string) + if !ok { + return nil, fmt.Errorf("wanted output to be a string, got: %T", output) + } + expStr, ok := rec.ExpectedOutput.(string) + if !ok { + return nil, fmt.Errorf("wanted expectedOutput to be a string, got: %T", rec.ExpectedOutput) + } + + outSet := make(map[rune]struct{}) + for _, r := range outStr { + outSet[r] = struct{}{} + } + expSet := make(map[rune]struct{}) + for _, r := range expStr { + expSet[r] = struct{}{} + } + + // Intersection size + intersection := 0 + for r := range outSet { + if _, ok := expSet[r]; ok { + intersection++ + } + } + // |A ∪ B| = |A| + |B| − |A ∩ B| + union := len(outSet) + len(expSet) - intersection + + // Jaccard similarity. Define both-empty as a perfect match. + var score float64 + if union == 0 { + score = 1.0 + } else { + score = float64(intersection) / float64(union) + } + + return score, nil + }), + experiment.NewEvaluator("fake-llm-as-a-judge", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return "excellent", nil + }), + } + + exp, err := experiment.New( + "my-experiment", + task, + ds, + evs, + experiment.WithDescription("Testing capital cities knowledge"), + experiment.WithExperimentConfig( + map[string]any{ + "model_name": "gpt-4", + "version": "1.0", + }, + ), + ) + if err != nil { + log.Fatal(err) + } + + results, err := exp.Run(context.TODO()) + if err != nil { + log.Fatal(err) + } + + for _, res := range results.Results { + fmt.Printf("Record ID: %s", res.Record.ID()) + fmt.Printf("Input: %v", res.Record.Input) + fmt.Printf("Expected Output: %v", res.Record.ExpectedOutput) + fmt.Printf("Output: %v", res.Output) + for _, ev := range res.Evaluations { + fmt.Printf("Evaluator score (%s): %v", ev.Name, ev.Value) + if ev.Error != nil { + fmt.Printf("Evaluator error (%s): %v", ev.Name, ev.Error) + } + } + if res.Error != nil { + fmt.Printf("Error: %v", res.Error) + } + } +} diff --git a/llmobs/experiment/experiment_test.go b/llmobs/experiment/experiment_test.go new file mode 100644 index 0000000000..531d2b7399 --- /dev/null +++ b/llmobs/experiment/experiment_test.go @@ -0,0 +1,799 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package experiment_test + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/testtracer" + llmobstransport "github.com/DataDog/dd-trace-go/v2/internal/llmobs/transport" + "github.com/DataDog/dd-trace-go/v2/llmobs/dataset" + "github.com/DataDog/dd-trace-go/v2/llmobs/experiment" +) + +const ( + testAPIKey = "abcd1234efgh5678ijkl9012mnop3456" + testAppKey = "test-app-key" +) + +func TestExperimentCreation(t *testing.T) { + t.Run("successful-creation", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment description"), + experiment.WithProjectName("test-project"), + experiment.WithTags(map[string]string{"env": "test"}), + experiment.WithExperimentConfig(map[string]any{"model": "test-model"}), + ) + + require.NoError(t, err) + assert.NotNil(t, exp) + assert.Equal(t, "test-experiment", exp.Name) + }) + t.Run("missing-project-name", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + _, err := experiment.New( + "test-experiment", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment description"), + experiment.WithProjectName(""), + ) + + require.Error(t, err) + assert.Contains(t, err.Error(), "project name must be provided") + }) + t.Run("missing-dd-app-key-agentless", func(t *testing.T) { + t.Setenv("DD_API_KEY", testAPIKey) + // DD_APP_KEY is mandatory for experiments in agentless mode + t.Setenv("DD_APP_KEY", "") + + // Use agentless mode to trigger app key requirement + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsAgentlessEnabled(true))) + defer tt.Stop() + + _, err := experiment.New( + "test-experiment", + nil, + nil, + nil, + experiment.WithDescription("Test experiment description"), + experiment.WithProjectName("test-project"), + ) + require.Error(t, err) + assert.Contains(t, err.Error(), "an app key must be provided") + }) + t.Run("missing-dd-app-key-agent-mode", func(t *testing.T) { + // DD_APP_KEY is not required in agent mode + t.Setenv("DD_APP_KEY", "") + + // Use agent mode - app key should not be required + tt := testTracer(t, testtracer.WithTracerStartOpts(tracer.WithLLMObsAgentlessEnabled(false))) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment description"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + assert.NotNil(t, exp) + assert.Equal(t, "test-experiment", exp.Name) + }) + t.Run("project-name-from-env-variable", func(t *testing.T) { + t.Setenv("DD_LLMOBS_PROJECT_NAME", "env-project") + + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + // Test that project name comes from environment variable + exp, err := experiment.New( + "test-experiment-env-project", + task, + ds, + evaluators, + experiment.WithDescription("Test with env project name"), + // No explicit project name - should use DD_LLMOBS_PROJECT_NAME + ) + require.NoError(t, err) + assert.NotNil(t, exp) + assert.Equal(t, "test-experiment-env-project", exp.Name) + }) + t.Run("project-name-from-tracer-option", func(t *testing.T) { + + // Use tracer option to set project name globally + tt := testTracer(t, testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLLMObsProjectName("tracer-project"), + tracer.WithService("test-service"), + tracer.WithLogStartup(false), + )) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + // Test that project name comes from tracer option + exp, err := experiment.New( + "test-experiment-tracer-project", + task, + ds, + evaluators, + experiment.WithDescription("Test with tracer project name"), + // No explicit project name - should use tracer.WithLLMObsProjectName + ) + require.NoError(t, err) + assert.NotNil(t, exp) + assert.Equal(t, "test-experiment-tracer-project", exp.Name) + }) + t.Run("project-name-precedence", func(t *testing.T) { + t.Setenv("DD_LLMOBS_PROJECT_NAME", "env-project") + + // Use tracer option to set project name globally + tt := testTracer(t, testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLLMObsProjectName("tracer-project"), + tracer.WithService("test-service"), + tracer.WithLogStartup(false), + )) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + // Test that explicit option takes precedence over env var and tracer option + exp, err := experiment.New( + "test-experiment-precedence", + task, + ds, + evaluators, + experiment.WithDescription("Test project name precedence"), + experiment.WithProjectName("explicit-project"), // Should override env and tracer + ) + require.NoError(t, err) + assert.NotNil(t, exp) + assert.Equal(t, "test-experiment-precedence", exp.Name) + }) +} + +func TestDDAppKeyHeader(t *testing.T) { + t.Run("dd-app-key-header-agentless", func(t *testing.T) { + t.Setenv("DD_API_KEY", testAPIKey) + t.Setenv("DD_APP_KEY", testAppKey) + + var capturedHeaders http.Header + h := func(r *http.Request) *http.Response { + // Normalize URL by trimming evp_proxy prefix if present + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + + // Capture headers from experiment-related requests + if strings.Contains(path, "/api/unstable/llm-obs/v1/projects") { + capturedHeaders = r.Header.Clone() + } + // Let the default experiment mock handler handle the response + return createMockHandler()(r) + } + + // Force agentless mode explicitly + tt := testTracer(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsAgentlessEnabled(true), + ), + testtracer.WithMockResponses(h), + ) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment-agentless-header", + task, + ds, + evaluators, + experiment.WithDescription("Test DD_APP_KEY header in agentless mode"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + // Run experiment to trigger project creation request + _, err = exp.Run(context.Background()) + require.NoError(t, err) + + // Verify DD-APPLICATION-KEY header was set + require.NotNil(t, capturedHeaders, "No headers were captured") + assert.Equal(t, testAppKey, capturedHeaders.Get("DD-APPLICATION-KEY"), "DD-APPLICATION-KEY header should be set in agentless mode") + }) + t.Run("dd-app-key-header-agent-mode", func(t *testing.T) { + + var capturedHeaders http.Header + h := func(r *http.Request) *http.Response { + // Normalize URL by trimming evp_proxy prefix if present + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + + // Capture headers from experiment-related requests + if strings.Contains(path, "/api/unstable/llm-obs/v1/projects") { + capturedHeaders = r.Header.Clone() + } + // Let the default experiment mock handler handle the response + return createMockHandler()(r) + } + + // Force agent mode explicitly + tt := testTracer(t, + testtracer.WithTracerStartOpts( + tracer.WithLLMObsAgentlessEnabled(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, // Agent supports evp_proxy + }), + testtracer.WithMockResponses(h), + ) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment-agent-header", + task, + ds, + evaluators, + experiment.WithDescription("Test DD_APP_KEY header in agent mode"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + // Run experiment to trigger project creation request + _, err = exp.Run(context.Background()) + require.NoError(t, err) + + // Verify X-Datadog-NeedsAppKey header is set in agent mode (app key is ignored) + require.NotNil(t, capturedHeaders, "No headers were captured") + assert.Equal(t, "true", capturedHeaders.Get("X-Datadog-NeedsAppKey"), "X-Datadog-NeedsAppKey header should always be set in agent mode") + assert.Empty(t, capturedHeaders.Get("DD-APPLICATION-KEY"), "DD-APPLICATION-KEY header should not be set in agent mode") + }) +} + +func TestExperimentRun(t *testing.T) { + t.Run("successful-run", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment description"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + results, err := exp.Run(context.Background()) + require.NoError(t, err) + + // Verify results + assert.Len(t, results.Results, 2) // Our test dataset has 2 records + + for _, result := range results.Results { + assert.NotEmpty(t, result.SpanID) + assert.NotEmpty(t, result.TraceID) + assert.NotZero(t, result.Timestamp) + assert.NotNil(t, result.Record.Input) + assert.NotNil(t, result.Output) + assert.NotNil(t, result.Record.ExpectedOutput) + assert.Len(t, result.Evaluations, 2) // We have 2 evaluators + assert.NoError(t, result.Error) + + // Check evaluations + for _, eval := range result.Evaluations { + assert.NotEmpty(t, eval.Name) + assert.NotNil(t, eval.Value) + assert.NoError(t, eval.Error) + } + } + + // Verify experiment spans were created + spans := tt.WaitForLLMObsSpans(t, 2) // One span per dataset record + require.Len(t, spans, 2) + for _, span := range spans { + assert.Equal(t, "test-task", span.Name) + assert.Equal(t, "experiment", span.Meta["span.kind"]) + } + }) + t.Run("run-with-options", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment-options", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment with options"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + results, err := exp.Run(context.Background(), + experiment.WithMaxConcurrency(1), + experiment.WithSampleSize(1), + experiment.WithAbortOnError(false), + ) + require.NoError(t, err) + + // Should only have 1 result due to sample size + assert.Len(t, results.Results, 1) + assert.NotNil(t, results.Results[0].Record) + + // Verify only 1 span was created + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + }) + t.Run("task-error-handling", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + + // Create a task that always fails + task := experiment.NewTask("failing-task", func(ctx context.Context, rec dataset.Record, experimentCfg map[string]any) (any, error) { + return nil, errors.New("task failed") + }) + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment-task-error", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment with task errors"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + results, err := exp.Run(context.Background(), + experiment.WithAbortOnError(false), // Don't abort on errors + ) + require.NoError(t, err) + + // Should have results but with errors + assert.Len(t, results.Results, 2) + for _, result := range results.Results { + if assert.Error(t, result.Error) { + assert.Contains(t, result.Error.Error(), "task failed") + } + } + }) + + t.Run("evaluator-error-handling", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + + // Create evaluators where one always fails + evaluators := []experiment.Evaluator{ + experiment.NewEvaluator("working-evaluator", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return "success", nil + }), + experiment.NewEvaluator("failing-evaluator", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return nil, errors.New("evaluator failed") + }), + } + + exp, err := experiment.New( + "test-experiment-evaluator-error", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment with evaluator errors"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + results, err := exp.Run(context.Background(), + experiment.WithAbortOnError(false), // Don't abort on errors + ) + require.NoError(t, err) + + // Should have results + assert.Len(t, results.Results, 2) + for _, result := range results.Results { + assert.NoError(t, result.Error) // Task should succeed + assert.Len(t, result.Evaluations, 2) + + // First evaluator should succeed + assert.Equal(t, "working-evaluator", result.Evaluations[0].Name) + assert.Equal(t, "success", result.Evaluations[0].Value) + assert.NoError(t, result.Evaluations[0].Error) + + // Second evaluator should fail + assert.Equal(t, "failing-evaluator", result.Evaluations[1].Name) + assert.Error(t, result.Evaluations[1].Error) + assert.Contains(t, result.Evaluations[1].Error.Error(), "evaluator failed") + } + }) +} + +func TestExperimentURL(t *testing.T) { + run := func(t *testing.T) string { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + task := createTestTask() + evaluators := createTestEvaluators() + + exp, err := experiment.New( + "test-experiment-url", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment URL"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + // Run the experiment to get an ID + _, err = exp.Run(context.Background()) + require.NoError(t, err) + + return exp.URL() + } + t.Run("with-dd-site", func(t *testing.T) { + t.Setenv("DD_SITE", "my-dd-site") + url := run(t) + assert.Equal(t, "https://my-dd-site/llm/experiments/test-experiment-id", url) + }) + t.Run("empty-dd-site", func(t *testing.T) { + url := run(t) + assert.Equal(t, "https://app.datadoghq.com/llm/experiments/test-experiment-id", url) + }) +} + +func TestExperimentMetricGeneration(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + ds := createTestDataset(t) + + // Create evaluators that return different metric types + evaluators := []experiment.Evaluator{ + experiment.NewEvaluator("categorical-eval", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return "excellent", nil + }), + experiment.NewEvaluator("score-eval", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return 0.95, nil + }), + experiment.NewEvaluator("boolean-eval", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return true, nil + }), + experiment.NewEvaluator("int-eval", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return 42, nil + }), + } + + task := createTestTask() + + exp, err := experiment.New( + "test-experiment-metrics", + task, + ds, + evaluators, + experiment.WithDescription("Test experiment metric types"), + experiment.WithProjectName("test-project"), + ) + require.NoError(t, err) + + results, err := exp.Run(context.Background()) + require.NoError(t, err) + + // Verify results contain evaluations with different value types + require.Len(t, results.Results, 2) // 2 dataset records + for _, result := range results.Results { + assert.Len(t, result.Evaluations, 4) // 4 evaluators + + // Check that evaluations have the expected values + evalsByName := make(map[string]*experiment.Evaluation) + for _, eval := range result.Evaluations { + evalsByName[eval.Name] = eval + } + + assert.Equal(t, "excellent", evalsByName["categorical-eval"].Value) + assert.Equal(t, 0.95, evalsByName["score-eval"].Value) + assert.Equal(t, true, evalsByName["boolean-eval"].Value) + assert.Equal(t, 42, evalsByName["int-eval"].Value) + } +} + +// Helper functions + +func testTracer(t *testing.T, opts ...testtracer.Option) *testtracer.TestTracer { + defaultOpts := []testtracer.Option{ + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLLMObsAgentlessEnabled(false), + tracer.WithLLMObsProjectName("test-project"), + tracer.WithService("test-service"), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + testtracer.WithMockResponses(createMockHandler()), + } + allOpts := append(defaultOpts, opts...) + tt := testtracer.Start(t, allOpts...) + t.Cleanup(tt.Stop) + return tt +} + +// createMockHandler creates a mock handler for experiment-related requests (both agent and agentless) +func createMockHandler() testtracer.MockResponseFunc { + return func(r *http.Request) *http.Response { + path := strings.TrimPrefix(r.URL.Path, "/evp_proxy/v2") + + switch { + case path == "/api/unstable/llm-obs/v1/projects": + return handleMockProjects(r) + case path == "/api/unstable/llm-obs/v1/experiments": + return handleMockExperiments(r) + case strings.HasPrefix(path, "/api/unstable/llm-obs/v1/experiments/") && strings.HasSuffix(path, "/events"): + return handleMockExperimentEvents(r) + case strings.Contains(path, "/datasets") && strings.HasSuffix(path, "/batch_update"): + return handleMockDatasetBatchUpdate(r) + case strings.Contains(path, "/datasets"): + return handleMockDatasets(r) + default: + return nil + } + } +} + +func handleMockProjects(r *http.Request) *http.Response { + response := llmobstransport.CreateProjectResponse{ + Data: llmobstransport.ResponseData[llmobstransport.ProjectView]{ + ID: "test-project-id", + Type: "projects", + Attributes: llmobstransport.ProjectView{ + ID: "test-project-id", + Name: "test-project", + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func handleMockExperiments(r *http.Request) *http.Response { + response := llmobstransport.CreateExperimentResponse{ + Data: llmobstransport.ResponseData[llmobstransport.ExperimentView]{ + ID: "test-experiment-id", + Type: "experiments", + Attributes: llmobstransport.ExperimentView{ + ID: "test-experiment-id", + ProjectID: "test-project-id", + DatasetID: "test-dataset-id", + Name: "test-experiment", + Description: "Test experiment description", + DatasetVersion: 1, + EnsureUnique: true, + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func handleMockExperimentEvents(r *http.Request) *http.Response { + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{}`)), + Request: r, + } +} + +func handleMockDatasets(r *http.Request) *http.Response { + if r.Method == http.MethodGet { + // Return empty list for "not found" + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{"data": []}`)), + Request: r, + } + } + if r.Method == http.MethodPost { + response := llmobstransport.CreateDatasetResponse{ + Data: llmobstransport.ResponseData[llmobstransport.DatasetView]{ + ID: "test-dataset-id", + Type: "datasets", + Attributes: llmobstransport.DatasetView{ + ID: "test-dataset-id", + Name: "test-dataset", + Description: "Test dataset for experiments", + CurrentVersion: 1, + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } + } + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(strings.NewReader(`{}`)), + Request: r, + } +} + +func handleMockDatasetBatchUpdate(r *http.Request) *http.Response { + response := llmobstransport.BatchUpdateDatasetResponse{ + Data: []llmobstransport.ResponseData[llmobstransport.DatasetRecordView]{ + { + ID: "test-record-id-0", + Type: "dataset_records", + Attributes: llmobstransport.DatasetRecordView{ + ID: "test-record-id-0", + Input: map[string]any{"question": "What is the capital of France?"}, + ExpectedOutput: "Paris", + Version: 1, + }, + }, + { + ID: "test-record-id-1", + Type: "dataset_records", + Attributes: llmobstransport.DatasetRecordView{ + ID: "test-record-id-1", + Input: map[string]any{"question": "What is the capital of Germany?"}, + ExpectedOutput: "Berlin", + Version: 1, + }, + }, + }, + } + respData, _ := json.Marshal(response) + return &http.Response{ + Status: "200 OK", + StatusCode: http.StatusOK, + Header: make(http.Header), + Body: io.NopCloser(bytes.NewReader(respData)), + Request: r, + } +} + +func createTestDataset(t *testing.T) *dataset.Dataset { + records := []dataset.Record{ + { + Input: map[string]any{"question": "What is the capital of France?"}, + ExpectedOutput: "Paris", + }, + { + Input: map[string]any{"question": "What is the capital of Germany?"}, + ExpectedOutput: "Berlin", + }, + } + + ds, err := dataset.Create(context.Background(), "test-dataset", records, dataset.WithDescription("Test dataset for experiments")) + require.NoError(t, err) + return ds +} + +func createTestTask() experiment.Task { + return experiment.NewTask("test-task", func(ctx context.Context, rec dataset.Record, experimentCfg map[string]any) (any, error) { + inputMap, ok := rec.Input.(map[string]any) + if !ok { + return nil, fmt.Errorf("input is not a map") + } + question, ok := inputMap["question"].(string) + if !ok { + return nil, fmt.Errorf("question not found in input") + } + + switch question { + case "What is the capital of France?": + return "Paris", nil + case "What is the capital of Germany?": + return "Berlin", nil + default: + return "Unknown", nil + } + }) +} + +func createTestEvaluators() []experiment.Evaluator { + return []experiment.Evaluator{ + experiment.NewEvaluator("exact-match", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + return output == rec.ExpectedOutput, nil + }), + experiment.NewEvaluator("similarity", func(ctx context.Context, rec dataset.Record, output any) (any, error) { + if output == rec.ExpectedOutput { + return 1.0, nil + } + return 0.5, nil + }), + } +} diff --git a/llmobs/experiment/option.go b/llmobs/experiment/option.go new file mode 100644 index 0000000000..d562983e5a --- /dev/null +++ b/llmobs/experiment/option.go @@ -0,0 +1,97 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package experiment + +import ( + "github.com/DataDog/dd-trace-go/v2/internal/llmobs/config" +) + +type newCfg struct { + projectName string + description string + tags map[string]string + experimentCfg map[string]any + summaryEvaluators []SummaryEvaluator +} + +func defaultNewCfg(globalCfg *config.Config) *newCfg { + return &newCfg{ + projectName: globalCfg.ProjectName, + description: "", + tags: nil, + experimentCfg: nil, + summaryEvaluators: nil, + } +} + +type Option func(cfg *newCfg) + +func WithProjectName(name string) Option { + return func(cfg *newCfg) { + cfg.projectName = name + } +} + +func WithTags(tags map[string]string) Option { + return func(cfg *newCfg) { + cfg.tags = tags + } +} + +func WithDescription(description string) Option { + return func(cfg *newCfg) { + cfg.description = description + } +} + +func WithExperimentConfig(experimentCfg map[string]any) Option { + return func(cfg *newCfg) { + cfg.experimentCfg = experimentCfg + } +} + +// WithSummaryEvaluators sets the summary evaluators for the experiment. +// Summary evaluators run after all tasks and evaluators have completed, +// receiving all experiment results to compute aggregate metrics. +func WithSummaryEvaluators(summaryEvaluators ...SummaryEvaluator) Option { + return func(cfg *newCfg) { + cfg.summaryEvaluators = summaryEvaluators + } +} + +type runCfg struct { + maxConcurrency int + abortOnError bool + sampleSize int +} + +func defaultRunCfg() *runCfg { + return &runCfg{ + maxConcurrency: 0, + abortOnError: false, + sampleSize: 0, + } +} + +type RunOption func(cfg *runCfg) + +func WithMaxConcurrency(maxConcurrency int) RunOption { + return func(cfg *runCfg) { + cfg.maxConcurrency = maxConcurrency + } +} + +func WithAbortOnError(abortOnError bool) RunOption { + return func(cfg *runCfg) { + cfg.abortOnError = abortOnError + } +} + +func WithSampleSize(sampleSize int) RunOption { + return func(cfg *runCfg) { + cfg.sampleSize = sampleSize + } +} diff --git a/llmobs/llmobs.go b/llmobs/llmobs.go new file mode 100644 index 0000000000..7fe76c0959 --- /dev/null +++ b/llmobs/llmobs.go @@ -0,0 +1,445 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package llmobs contains the Go SDK to use DataDog's LLM Observability product. +// You can read more at https://docs.datadoghq.com/llm_observability +// +// EXPERIMENTAL: This package is experimental and may change or be removed at any time +// without notice. It is not subject to the Go module's compatibility promise. +package llmobs + +import ( + "context" + + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// SpanFromContext retrieves the active LLMObs span from the given context. +// Returns an AnySpan and true if found, nil and false otherwise. +// The returned AnySpan can be converted to specific span types using the As* methods +// (AsLLM, AsWorkflow, AsAgent, AsTool, AsTask, AsEmbedding, AsRetrieval). +func SpanFromContext(ctx context.Context) (*AnySpan, bool) { + if span, ok := illmobs.ActiveLLMSpanFromContext(ctx); ok { + return &AnySpan{&baseSpan{span}}, true + } + return nil, false +} + +// StartLLMSpan starts an LLMObs span of kind LLM. +// Pass the returned context to subsequent start span calls to create child spans of this one. +// +// Note: LLM spans are annotated with input/output as LLMMessage. +func StartLLMSpan(ctx context.Context, name string, opts ...StartSpanOption) (*LLMSpan, context.Context) { + var l LLMSpan + s, ctx, ok := startSpan(ctx, illmobs.SpanKindLLM, name, opts...) + if !ok { + return &l, ctx + } + l.baseSpan = s + return &l, ctx +} + +// StartWorkflowSpan starts an LLMObs span of kind Workflow. +// Pass the returned context to subsequent start span calls to create child spans of this one. +func StartWorkflowSpan(ctx context.Context, name string, opts ...StartSpanOption) (*WorkflowSpan, context.Context) { + var ( + w WorkflowSpan + ok bool + ) + w.baseSpan, ctx, ok = startSpan(ctx, illmobs.SpanKindWorkflow, name, opts...) + if !ok { + return &w, ctx + } + return &w, ctx +} + +// StartAgentSpan starts an LLMObs span of kind Agent. +// Pass the returned context to subsequent start span calls to create child spans of this one. +func StartAgentSpan(ctx context.Context, name string, opts ...StartSpanOption) (*AgentSpan, context.Context) { + var a AgentSpan + s, ctx, ok := startSpan(ctx, illmobs.SpanKindAgent, name, opts...) + if !ok { + return &a, ctx + } + a.baseSpan = s + return &a, ctx +} + +// StartToolSpan starts an LLMObs span of kind Tool. +// Pass the returned context to subsequent start span calls to create child spans of this one. +func StartToolSpan(ctx context.Context, name string, opts ...StartSpanOption) (*ToolSpan, context.Context) { + var t ToolSpan + s, ctx, ok := startSpan(ctx, illmobs.SpanKindTool, name, opts...) + if !ok { + return &t, ctx + } + t.baseSpan = s + return &t, ctx +} + +// StartTaskSpan starts an LLMObs span of kind Task. +// Pass the returned context to subsequent start span calls to create child spans of this one. +func StartTaskSpan(ctx context.Context, name string, opts ...StartSpanOption) (*TaskSpan, context.Context) { + var t TaskSpan + s, ctx, ok := startSpan(ctx, illmobs.SpanKindTask, name, opts...) + if !ok { + return &t, ctx + } + t.baseSpan = s + return &t, ctx +} + +// StartEmbeddingSpan starts an LLMObs span of kind Embedding. +// Pass the returned context to subsequent start span calls to create child spans of this one. +// +// Note: embedding spans are annotated with input EmbeddedDocument and output text. +func StartEmbeddingSpan(ctx context.Context, name string, opts ...StartSpanOption) (*EmbeddingSpan, context.Context) { + var e EmbeddingSpan + s, ctx, ok := startSpan(ctx, illmobs.SpanKindEmbedding, name, opts...) + if !ok { + return &e, ctx + } + e.baseSpan = s + return &e, ctx +} + +// StartRetrievalSpan starts an LLMObs span of kind Retrieval. +// Pass the returned context to subsequent start span calls to create child spans of this one. +// +// Note: retrieval spans are annotated with input text and output RetrievedDocument. +func StartRetrievalSpan(ctx context.Context, name string, opts ...StartSpanOption) (*RetrievalSpan, context.Context) { + var r RetrievalSpan + s, ctx, ok := startSpan(ctx, illmobs.SpanKindRetrieval, name, opts...) + if !ok { + return &r, ctx + } + r.baseSpan = s + return &r, ctx +} + +type ( + // SpanLink represents a link between spans, typically used for connecting related operations + // across different traces or services. + SpanLink = illmobs.SpanLink + + // LLMMessage represents a message in a conversation with a Large Language Model. + // It is used to annotate IO of LLM spans. + // Contains role (user, assistant, system) and content. + LLMMessage = illmobs.LLMMessage + + // EmbeddedDocument represents a document for embedding operations. + // Contains the document content and metadata. + // It is used to annotate input of embedding spans. + EmbeddedDocument = illmobs.EmbeddedDocument + + // RetrievedDocument represents a document for retrieval operations. + // Contains the document content, metadata, and relevance score. + // It is used to annotate output of retrieval spans. + RetrievedDocument = illmobs.RetrievedDocument + + // Prompt represents a structured prompt template used with LLMs. + Prompt = illmobs.Prompt + + // ToolDefinition represents the definition of a tool/function that an LLM can call. + ToolDefinition = illmobs.ToolDefinition +) + +// Span represents a generic LLMObs span that can be converted to specific span types. +type Span interface { + sealed() // Prevents external implementations + + // Name returns the span name. + Name() string + + // SpanID returns the unique identifier for this span. + SpanID() string + + // Kind returns the span kind (llm, workflow, agent, tool, task, embedding, retrieval). + Kind() string + + // TraceID returns the LLMObs trace identifier. + TraceID() string + + // APMTraceID returns the underlying APM trace identifier. + APMTraceID() string + + // AddLink adds a link to another span, useful for connecting related operations. + AddLink(link SpanLink) + + // Finish completes the span and sends it for processing. + Finish(opts ...FinishSpanOption) + + // Annotate allows to make generic span annotations. If you want to annotate Input/Output, you can use the specific + // functions from each span kind. + Annotate(opts ...AnnotateOption) +} + +// WorkflowSpan represents a span for high-level workflow operations. +// Use AnnotateTextIO to annotate with text input/output. +type WorkflowSpan struct { + textIOSpan +} + +// AgentSpan represents a span for AI agent operations. +// Use AnnotateTextIO to annotate with text input/output. +type AgentSpan struct { + textIOSpan +} + +// ToolSpan represents a span for tool/function call operations. +// Use AnnotateTextIO to annotate with text input/output. +type ToolSpan struct { + textIOSpan +} + +// TaskSpan represents a span for discrete task operations. +// Use AnnotateTextIO to annotate with text input/output. +type TaskSpan struct { + textIOSpan +} + +// EmbeddingSpan represents a span for text embedding operations. +// Use AnnotateEmbeddingIO to annotate with input documents and output embeddings. +type EmbeddingSpan struct { + *baseSpan +} + +// AnnotateEmbeddingIO annotates the embedding span with input documents and output embeddings text. +func (s *EmbeddingSpan) AnnotateEmbeddingIO(input []EmbeddedDocument, output string, opts ...AnnotateOption) { + if s.baseSpan == nil { + return + } + a := parseAnnotateOptions(opts...) + a.InputEmbeddedDocs = input + a.OutputText = output + s.span.Annotate(a) +} + +// RetrievalSpan represents a span for information retrieval operations. +// Use AnnotateRetrievalIO to annotate with input query and output retrieved documents. +type RetrievalSpan struct { + *baseSpan +} + +// AnnotateRetrievalIO annotates the retrieval span with input query text and output retrieved documents. +func (s *RetrievalSpan) AnnotateRetrievalIO(input string, output []RetrievedDocument, opts ...AnnotateOption) { + if s.baseSpan == nil { + return + } + a := parseAnnotateOptions(opts...) + a.InputText = input + a.OutputRetrievedDocs = output + s.span.Annotate(a) +} + +// AnySpan represents a generic LLMObs span retrieved from context. +// It can represent any span kind (LLM, Workflow, Agent, Tool, Task, Embedding, or Retrieval). +// Use the As* methods to convert it to a specific span type for type-specific operations. +type AnySpan struct { + *baseSpan +} + +// AsLLM attempts to convert the span to an LLMSpan. +// Returns the LLMSpan and true if the span is of kind LLM, otherwise returns nil and false. +func (s *AnySpan) AsLLM() (*LLMSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindLLM) { + return nil, false + } + var l LLMSpan + l.baseSpan = s.baseSpan + return &l, true +} + +// AsWorkflow attempts to convert the span to a WorkflowSpan. +// Returns the WorkflowSpan and true if the span is of kind Workflow, otherwise returns nil and false. +func (s *AnySpan) AsWorkflow() (*WorkflowSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindWorkflow) { + return nil, false + } + var w WorkflowSpan + w.baseSpan = s.baseSpan + return &w, true +} + +// AsAgent attempts to convert the span to an AgentSpan. +// Returns the AgentSpan and true if the span is of kind Agent, otherwise returns nil and false. +func (s *AnySpan) AsAgent() (*AgentSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindAgent) { + return nil, false + } + var a AgentSpan + a.baseSpan = s.baseSpan + return &a, true +} + +// AsTool attempts to convert the span to a ToolSpan. +// Returns the ToolSpan and true if the span is of kind Tool, otherwise returns nil and false. +func (s *AnySpan) AsTool() (*ToolSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindTool) { + return nil, false + } + var t ToolSpan + t.baseSpan = s.baseSpan + return &t, true +} + +// AsTask attempts to convert the span to a TaskSpan. +// Returns the TaskSpan and true if the span is of kind Task, otherwise returns nil and false. +func (s *AnySpan) AsTask() (*TaskSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindTask) { + return nil, false + } + var t TaskSpan + t.baseSpan = s.baseSpan + return &t, true +} + +// AsEmbedding attempts to convert the span to an EmbeddingSpan. +// Returns the EmbeddingSpan and true if the span is of kind Embedding, otherwise returns nil and false. +func (s *AnySpan) AsEmbedding() (*EmbeddingSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindEmbedding) { + return nil, false + } + var e EmbeddingSpan + e.baseSpan = s.baseSpan + return &e, true +} + +// AsRetrieval attempts to convert the span to a RetrievalSpan. +// Returns the RetrievalSpan and true if the span is of kind Retrieval, otherwise returns nil and false. +func (s *AnySpan) AsRetrieval() (*RetrievalSpan, bool) { + if !isSpanKind(s, illmobs.SpanKindRetrieval) { + return nil, false + } + var r RetrievalSpan + r.baseSpan = s.baseSpan + return &r, true +} + +type baseSpan struct { + span *illmobs.Span +} + +func (s *baseSpan) Name() string { + if s == nil || s.span == nil { + return "" + } + return s.span.Name() +} + +func (s *baseSpan) Annotate(opts ...AnnotateOption) { + if s == nil || s.span == nil { + return + } + a := parseAnnotateOptions(opts...) + s.span.Annotate(a) +} + +func (s *baseSpan) AddLink(link SpanLink) { + if s == nil || s.span == nil { + return + } + s.span.AddLink(link) +} + +func (s *baseSpan) SpanID() string { + if s == nil || s.span == nil { + return "" + } + return s.span.SpanID() +} + +func (s *baseSpan) Kind() string { + if s == nil || s.span == nil { + return "" + } + return s.span.Kind() +} + +func (s *baseSpan) TraceID() string { + if s == nil || s.span == nil { + return "" + } + return s.span.TraceID() +} + +func (s *baseSpan) APMTraceID() string { + if s == nil || s.span == nil { + return "" + } + return s.span.APMTraceID() +} + +func (*baseSpan) sealed() {} + +func (s *baseSpan) Finish(opts ...FinishSpanOption) { + if s == nil || s.span == nil { + return + } + cfg := illmobs.FinishSpanConfig{} + for _, opt := range opts { + opt(&cfg) + } + s.span.Finish(cfg) +} + +type textIOSpan struct { + *baseSpan +} + +func (s *textIOSpan) AnnotateTextIO(input, output string, opts ...AnnotateOption) { + if s.baseSpan == nil { + return + } + a := parseAnnotateOptions(opts...) + a.InputText = input + a.OutputText = output + s.span.Annotate(a) +} + +// LLMSpan represents a span for Large Language Model operations. +// Use AnnotateLLMIO to annotate with LLM-specific input/output messages. +type LLMSpan struct { + *baseSpan +} + +// AnnotateLLMIO annotates the LLM span with input and output messages. +// Messages should use the LLMMessage type with role and content. +func (s *LLMSpan) AnnotateLLMIO(input, output []LLMMessage, opts ...AnnotateOption) { + if s.baseSpan == nil { + return + } + a := parseAnnotateOptions(opts...) + a.InputMessages = input + a.OutputMessages = output + s.span.Annotate(a) +} + +func startSpan(ctx context.Context, kind illmobs.SpanKind, name string, opts ...StartSpanOption) (*baseSpan, context.Context, bool) { + ll, err := illmobs.ActiveLLMObs() + if err != nil { + log.Warn("llmobs: failed to start llmobs span: %v", err.Error()) + return nil, ctx, false + } + cfg := illmobs.StartSpanConfig{} + for _, opt := range opts { + opt(&cfg) + } + s, ctx := ll.StartSpan(ctx, kind, name, cfg) + return &baseSpan{s}, ctx, true +} + +func parseAnnotateOptions(opts ...AnnotateOption) illmobs.SpanAnnotations { + a := illmobs.SpanAnnotations{} + for _, opt := range opts { + opt(&a) + } + return a +} + +func isSpanKind(s Span, target illmobs.SpanKind) bool { + return illmobs.SpanKind(s.Kind()) == target +} diff --git a/llmobs/llmobs_example_test.go b/llmobs/llmobs_example_test.go new file mode 100644 index 0000000000..d5ea97d068 --- /dev/null +++ b/llmobs/llmobs_example_test.go @@ -0,0 +1,54 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs_test + +import ( + "context" + "log" + + "github.com/DataDog/dd-trace-go/v2/llmobs" +) + +func ExampleStartLLMSpan() { + ctx := context.Background() + span, ctx := llmobs.StartLLMSpan(ctx, "llm-span", llmobs.WithMLApp("ml-app"), llmobs.WithModelName("model_name"), llmobs.WithModelProvider("model_provider")) + defer span.Finish() + + input := []llmobs.LLMMessage{ + { + Role: "user", + Content: "Hello world!", + }, + } + output := []llmobs.LLMMessage{ + { + Role: "assistant", + Content: "How can I help?", + }, + } + span.AnnotateLLMIO( + input, + output, + llmobs.WithAnnotatedMetadata(map[string]any{"temperature": 0, "max_tokens": 200}), + llmobs.WithAnnotatedTags(map[string]string{"host": "host_name"}), + llmobs.WithAnnotatedMetrics(map[string]float64{llmobs.MetricKeyInputTokens: 4, llmobs.MetricKeyOutputTokens: 6, llmobs.MetricKeyTotalTokens: 10}), + ) +} + +func ExampleSpanFromContext() { + ctx := context.Background() + _, ctx = llmobs.StartLLMSpan(ctx, "llm-span", llmobs.WithMLApp("ml-app"), llmobs.WithModelName("model_name"), llmobs.WithModelProvider("model_provider")) + + span, ok := llmobs.SpanFromContext(ctx) + if !ok { + log.Fatal("span not found in context") + } + llm, ok := span.AsLLM() + if !ok { + log.Fatal("span was not llm") + } + llm.Finish() +} diff --git a/llmobs/llmobs_test.go b/llmobs/llmobs_test.go new file mode 100644 index 0000000000..a43fba44d6 --- /dev/null +++ b/llmobs/llmobs_test.go @@ -0,0 +1,608 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs_test + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/testutils/testtracer" + "github.com/DataDog/dd-trace-go/v2/llmobs" +) + +func TestStartSpan(t *testing.T) { + ctx := context.Background() + sessionID := "test-session-123" + mlApp := "test-ml-app" + modelProvider := "openai" + modelName := "gpt-4" + startTime := time.Now().Add(-time.Hour) + + t.Run("llm-span-with-all-options", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, spanCtx := llmobs.StartLLMSpan(ctx, "test-llm-span", + llmobs.WithSessionID(sessionID), + llmobs.WithMLApp(mlApp), + llmobs.WithModelProvider(modelProvider), + llmobs.WithModelName(modelName), + llmobs.WithStartTime(startTime), + ) + span.Finish() + + // Verify span properties + assert.NotEmpty(t, span.SpanID()) + assert.NotEmpty(t, span.TraceID()) + assert.NotEmpty(t, span.APMTraceID()) + assert.Equal(t, "llm", span.Kind()) + + // Verify context propagation + retrievedSpan, ok := llmobs.SpanFromContext(spanCtx) + assert.True(t, ok) + assert.Equal(t, span.SpanID(), retrievedSpan.SpanID()) + + // Verify type conversion + llmSpan, ok := retrievedSpan.AsLLM() + assert.True(t, ok) + assert.NotNil(t, llmSpan) + + // Should fail to convert to other types + _, ok = retrievedSpan.AsWorkflow() + assert.False(t, ok) + _, ok = retrievedSpan.AsAgent() + assert.False(t, ok) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-llm-span", spans[0].Name) + }) + t.Run("workflow-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, spanCtx := llmobs.StartWorkflowSpan(ctx, "test-workflow") + span.Finish() + + assert.Equal(t, "workflow", span.Kind()) + + retrievedSpan, ok := llmobs.SpanFromContext(spanCtx) + assert.True(t, ok) + + workflowSpan, ok := retrievedSpan.AsWorkflow() + assert.True(t, ok) + assert.NotNil(t, workflowSpan) + + // Should fail to convert to LLM + _, ok = retrievedSpan.AsLLM() + assert.False(t, ok) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-workflow", spans[0].Name) + }) + t.Run("agent-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartAgentSpan(ctx, "test-agent") + span.Finish() + assert.Equal(t, "agent", span.Kind()) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-agent", spans[0].Name) + }) + t.Run("tool-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartToolSpan(ctx, "test-tool") + span.Finish() + assert.Equal(t, "tool", span.Kind()) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-tool", spans[0].Name) + }) + t.Run("task-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartTaskSpan(ctx, "test-task") + span.Finish() + assert.Equal(t, "task", span.Kind()) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-task", spans[0].Name) + }) + t.Run("embedding-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, spanCtx := llmobs.StartEmbeddingSpan(ctx, "test-embedding") + span.Finish() + + assert.Equal(t, "embedding", span.Kind()) + + retrievedSpan, ok := llmobs.SpanFromContext(spanCtx) + assert.True(t, ok) + + embeddingSpan, ok := retrievedSpan.AsEmbedding() + assert.True(t, ok) + assert.NotNil(t, embeddingSpan) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-embedding", spans[0].Name) + }) + t.Run("retrieval-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, spanCtx := llmobs.StartRetrievalSpan(ctx, "test-retrieval") + span.Finish() + + assert.Equal(t, "retrieval", span.Kind()) + + retrievedSpan, ok := llmobs.SpanFromContext(spanCtx) + assert.True(t, ok) + + retrievalSpan, ok := retrievedSpan.AsRetrieval() + assert.True(t, ok) + assert.NotNil(t, retrievalSpan) + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-retrieval", spans[0].Name) + }) + t.Run("finish-options", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartLLMSpan(ctx, "finish-options") + + testErr := errors.New("test error") + finishTime := time.Now().Add(time.Second) + + span.Finish( + llmobs.WithError(testErr), + llmobs.WithFinishTime(finishTime), + ) + + // Should not do anything if called more than once + span.Finish() + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "finish-options", spans[0].Name) + assert.Equal(t, "test error", spans[0].Meta["error.message"]) + assert.NotEmpty(t, spans[0].Meta["error.stack"]) + assert.Equal(t, "*errors.errorString", spans[0].Meta["error.type"]) + }) + t.Run("span-links", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartLLMSpan(ctx, "span-links") + + link := llmobs.SpanLink{ + TraceID: 0x1234567890abcdef, + SpanID: 0xabcdef1234567890, + } + span.AddLink(link) + span.Finish() + + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "span-links", spans[0].Name) + assert.Len(t, spans[0].SpanLinks, 1) + }) + t.Run("tracer-not-running", func(t *testing.T) { + // ensure tracer is not running + tracer.Stop() + + ctx := context.Background() + + // All span creation should return noop spans and not panic + assert.NotPanics(t, func() { + span, spanCtx := llmobs.StartLLMSpan(ctx, "noop-llm") + assert.NotNil(t, span) + assert.Equal(t, "", span.SpanID()) // noop span returns empty ID + assert.Equal(t, "", span.Kind()) + span.Finish() + + // Context should not contain LLMObs span + _, ok := llmobs.SpanFromContext(spanCtx) + assert.False(t, ok) + }) + + assert.NotPanics(t, func() { + span, _ := llmobs.StartWorkflowSpan(ctx, "noop-workflow") + span.AnnotateTextIO("input", "output") + span.Finish() + }) + + assert.NotPanics(t, func() { + span, _ := llmobs.StartEmbeddingSpan(ctx, "noop-embedding") + span.AnnotateEmbeddingIO(nil, "") + span.Finish() + }) + }) + t.Run("llmobs-not-enabled", func(t *testing.T) { + // Start tracer without LLMObs + tt := testtracer.Start(t, testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(false), + tracer.WithService("test-service"), + tracer.WithLogStartup(false), + )) + defer tt.Stop() + + // All span creation should return noop spans and not panic + assert.NotPanics(t, func() { + span, spanCtx := llmobs.StartLLMSpan(ctx, "noop-llm") + assert.NotNil(t, span) + assert.Equal(t, "", span.SpanID()) // noop span returns empty ID + assert.Equal(t, "", span.Kind()) + span.Finish() + + // Context should not contain LLMObs span + _, ok := llmobs.SpanFromContext(spanCtx) + assert.False(t, ok) + }) + + assert.NotPanics(t, func() { + span, _ := llmobs.StartWorkflowSpan(ctx, "noop-workflow") + span.AnnotateTextIO("input", "output") + span.Finish() + }) + + assert.NotPanics(t, func() { + span, _ := llmobs.StartEmbeddingSpan(ctx, "noop-embedding") + span.AnnotateEmbeddingIO(nil, "") + span.Finish() + }) + }) + t.Run("parent-child-spans", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Create parent span + parentSpan, parentCtx := llmobs.StartWorkflowSpan(ctx, "parent-workflow") + defer parentSpan.Finish() + + // Create child span from parent context + childSpan, childCtx := llmobs.StartLLMSpan(parentCtx, "child-llm") + defer childSpan.Finish() + + // Both spans should be retrievable from their contexts + retrievedParent, ok := llmobs.SpanFromContext(parentCtx) + require.True(t, ok) + assert.Equal(t, parentSpan.SpanID(), retrievedParent.SpanID()) + + retrievedChild, ok := llmobs.SpanFromContext(childCtx) + require.True(t, ok) + assert.Equal(t, childSpan.SpanID(), retrievedChild.SpanID()) + + // Child and parent should have different span IDs but same trace ID + assert.NotEqual(t, parentSpan.SpanID(), childSpan.SpanID()) + assert.Equal(t, parentSpan.TraceID(), childSpan.TraceID()) + }) +} + +func TestSpanAnnotations(t *testing.T) { + ctx := context.Background() + + t.Run("llm-span-annotations", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartLLMSpan(ctx, "test-llm-annotations") + + input := []llmobs.LLMMessage{ + {Role: "user", Content: "Hello"}, + } + output := []llmobs.LLMMessage{ + {Role: "assistant", Content: "Hi there!"}, + } + + span.AnnotateLLMIO(input, output, + llmobs.WithAnnotatedTags(map[string]string{"model": "gpt-4"}), + llmobs.WithAnnotatedMetrics(map[string]float64{ + llmobs.MetricKeyInputTokens: 10, + llmobs.MetricKeyOutputTokens: 5, + llmobs.MetricKeyTotalTokens: 15, + }), + llmobs.WithAnnotatedMetadata(map[string]any{"temperature": 0.7}), + llmobs.WithAnnotatedSessionID("session-123"), + ) + // call it again with empty values to test it does not override info + span.AnnotateLLMIO(nil, nil) + span.Finish() + + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-llm-annotations", spans[0].Name) + assert.Contains(t, spans[0].Meta, "input") + assert.Contains(t, spans[0].Meta, "output") + assert.Contains(t, spans[0].Meta["metadata"], "temperature") + assert.NotEmpty(t, spans[0].Metrics) + assert.NotEmpty(t, spans[0].Tags) + assert.Equal(t, "session-123", spans[0].SessionID) + }) + t.Run("text-io-span-annotations", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartWorkflowSpan(ctx, "test-workflow-annotations") + + span.AnnotateTextIO("input text", "output text", + llmobs.WithAnnotatedTags(map[string]string{"version": "1.0"}), + ) + // call it again with empty values to test it does not override info + span.AnnotateTextIO("", "") + span.Finish() + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-workflow-annotations", spans[0].Name) + assert.Equal(t, map[string]any{"value": "input text"}, spans[0].Meta["input"]) + assert.Equal(t, map[string]any{"value": "output text"}, spans[0].Meta["output"]) + assert.NotEmpty(t, spans[0].Tags) + }) + t.Run("embedding-span-annotations", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartEmbeddingSpan(ctx, "test-embedding-annotations") + + docs := []llmobs.EmbeddedDocument{ + {Text: "Document 1", Name: "test-doc.txt", Score: 0.85, ID: "test-1"}, + } + span.AnnotateEmbeddingIO(docs, "embedding output") + + // call it again with empty values to test it does not override info + span.AnnotateEmbeddingIO(nil, "") + span.Finish() + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-embedding-annotations", spans[0].Name) + assert.Contains(t, spans[0].Meta, "input") + assert.Contains(t, spans[0].Meta, "output") + }) + t.Run("retrieval-span-annotations", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartRetrievalSpan(ctx, "test-retrieval-annotations") + + docs := []llmobs.RetrievedDocument{ + {Text: "Retrieved doc", Name: "result1.txt", Score: 0.95}, + } + + span.AnnotateRetrievalIO("search query", docs) + + // call it again with empty values to test it does not override info + span.AnnotateRetrievalIO("", nil) + span.Finish() + + // Verify span was actually sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-retrieval-annotations", spans[0].Name) + assert.Contains(t, spans[0].Meta, "input") + assert.Contains(t, spans[0].Meta, "output") + }) +} + +func TestEvaluationMetrics(t *testing.T) { + ctx := context.Background() + + t.Run("evaluation-from-span", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + span, _ := llmobs.StartLLMSpan(ctx, "test-eval-span") + span.Finish() + + llmobs.SubmitEvaluationFromSpan("accuracy", "correct", span) + llmobs.SubmitEvaluationFromSpan("score", 0.95, span) + llmobs.SubmitEvaluationFromSpan("valid", true, span) + llmobs.SubmitEvaluationFromSpan("count", int32(42), span) + llmobs.SubmitEvaluationFromSpan("rating", float32(4.5), span) + + // Test with options + llmobs.SubmitEvaluationFromSpan("quality", "high", span, + llmobs.WithEvaluationTags([]string{"env:test"}), + llmobs.WithEvaluationMLApp("eval-app"), + llmobs.WithEvaluationTimestamp(time.Now()), + ) + + // Verify span was sent + spans := tt.WaitForLLMObsSpans(t, 1) + require.Len(t, spans, 1) + assert.Equal(t, "test-eval-span", spans[0].Name) + + // Verify metrics were sent (6 total: accuracy, score, valid, count, rating, quality) + metrics := tt.WaitForLLMObsMetrics(t, 6) + require.Len(t, metrics, 6) + + // Check that we have the expected labels + labels := make([]string, len(metrics)) + for i, metric := range metrics { + labels[i] = metric.Label + } + assert.Contains(t, labels, "accuracy") + assert.Contains(t, labels, "score") + assert.Contains(t, labels, "valid") + assert.Contains(t, labels, "count") + assert.Contains(t, labels, "rating") + assert.Contains(t, labels, "quality") + }) + t.Run("evaluation-from-tag", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + tag := llmobs.JoinTag{Key: "session_id", Value: "session-123"} + + llmobs.SubmitEvaluationFromTag("feedback", "positive", tag) + llmobs.SubmitEvaluationFromTag("rating", 4.2, tag) + llmobs.SubmitEvaluationFromTag("approved", false, tag) + + llmobs.SubmitEvaluationFromTag("sentiment", "neutral", tag, + llmobs.WithEvaluationTags([]string{"source:user"}), + ) + + metrics := tt.WaitForLLMObsMetrics(t, 4) + require.Len(t, metrics, 4) + + labels := make([]string, len(metrics)) + for i, metric := range metrics { + labels[i] = metric.Label + } + assert.Contains(t, labels, "feedback") + assert.Contains(t, labels, "rating") + assert.Contains(t, labels, "approved") + assert.Contains(t, labels, "sentiment") + }) + t.Run("evaluation-with-different-span-types", func(t *testing.T) { + tt := testTracer(t) + defer tt.Stop() + + // Test that evaluation works with all span types, not just LLM spans + llmSpan, _ := llmobs.StartLLMSpan(ctx, "llm-eval") + workflowSpan, _ := llmobs.StartWorkflowSpan(ctx, "workflow-eval") + agentSpan, _ := llmobs.StartAgentSpan(ctx, "agent-eval") + toolSpan, _ := llmobs.StartToolSpan(ctx, "tool-eval") + taskSpan, _ := llmobs.StartTaskSpan(ctx, "task-eval") + embeddingSpan, _ := llmobs.StartEmbeddingSpan(ctx, "embedding-eval") + retrievalSpan, _ := llmobs.StartRetrievalSpan(ctx, "retrieval-eval") + + // Finish all spans + llmSpan.Finish() + workflowSpan.Finish() + agentSpan.Finish() + toolSpan.Finish() + taskSpan.Finish() + embeddingSpan.Finish() + retrievalSpan.Finish() + + // All span types should work with evaluation metrics + assert.NotPanics(t, func() { + llmobs.SubmitEvaluationFromSpan("llm_quality", "good", llmSpan) + llmobs.SubmitEvaluationFromSpan("workflow_score", 0.9, workflowSpan) + llmobs.SubmitEvaluationFromSpan("agent_success", true, agentSpan) + llmobs.SubmitEvaluationFromSpan("tool_rating", 4.5, toolSpan) + llmobs.SubmitEvaluationFromSpan("task_complete", true, taskSpan) + llmobs.SubmitEvaluationFromSpan("embedding_accuracy", 0.95, embeddingSpan) + llmobs.SubmitEvaluationFromSpan("retrieval_relevance", "high", retrievalSpan) + }) + + // Verify all spans were sent (7 total) + spans := tt.WaitForLLMObsSpans(t, 7) + require.Len(t, spans, 7) + + // Check that we have all expected span names + spanNames := make([]string, len(spans)) + for i, span := range spans { + spanNames[i] = span.Name + } + assert.Contains(t, spanNames, "llm-eval") + assert.Contains(t, spanNames, "workflow-eval") + assert.Contains(t, spanNames, "agent-eval") + assert.Contains(t, spanNames, "tool-eval") + assert.Contains(t, spanNames, "task-eval") + assert.Contains(t, spanNames, "embedding-eval") + assert.Contains(t, spanNames, "retrieval-eval") + + // Verify all metrics were sent (7 total) + metrics := tt.WaitForLLMObsMetrics(t, 7) + require.Len(t, metrics, 7) + + // Check that we have all expected metric labels + labels := make([]string, len(metrics)) + for i, metric := range metrics { + labels[i] = metric.Label + } + assert.Contains(t, labels, "llm_quality") + assert.Contains(t, labels, "workflow_score") + assert.Contains(t, labels, "agent_success") + assert.Contains(t, labels, "tool_rating") + assert.Contains(t, labels, "task_complete") + assert.Contains(t, labels, "embedding_accuracy") + assert.Contains(t, labels, "retrieval_relevance") + }) + t.Run("tracer-not-running", func(t *testing.T) { + // ensure tracer is not running + tracer.Stop() + + span, _ := llmobs.StartLLMSpan(ctx, "noop-span") + + // Evaluation submissions should not panic even with noop span + assert.NotPanics(t, func() { + llmobs.SubmitEvaluationFromSpan("test", "value", span) + }) + + assert.NotPanics(t, func() { + tag := llmobs.JoinTag{Key: "test", Value: "value"} + llmobs.SubmitEvaluationFromTag("test", 1.0, tag) + }) + }) + t.Run("llmobs-not-enabled", func(t *testing.T) { + // Start tracer without LLMObs + tt := testtracer.Start(t, testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(false), + tracer.WithService("test-service"), + tracer.WithLogStartup(false), + )) + defer tt.Stop() + + span, _ := llmobs.StartLLMSpan(ctx, "noop-span") + + // Evaluation submissions should not panic even with noop span + assert.NotPanics(t, func() { + llmobs.SubmitEvaluationFromSpan("test", "value", span) + }) + + assert.NotPanics(t, func() { + tag := llmobs.JoinTag{Key: "test", Value: "value"} + llmobs.SubmitEvaluationFromTag("test", 1.0, tag) + }) + }) +} + +func testTracer(t *testing.T, opts ...testtracer.Option) *testtracer.TestTracer { + defaultOpts := []testtracer.Option{ + testtracer.WithTracerStartOpts( + tracer.WithLLMObsEnabled(true), + tracer.WithLLMObsMLApp("test-app"), + tracer.WithLogStartup(false), + ), + testtracer.WithAgentInfoResponse(testtracer.AgentInfo{ + Endpoints: []string{"/evp_proxy/v2/"}, + }), + } + allOpts := append(defaultOpts, opts...) + tt := testtracer.Start(t, allOpts...) + t.Cleanup(tt.Stop) + return tt +} diff --git a/llmobs/option.go b/llmobs/option.go new file mode 100644 index 0000000000..82c59d4ce0 --- /dev/null +++ b/llmobs/option.go @@ -0,0 +1,150 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package llmobs + +import ( + "errors" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation/errortrace" + illmobs "github.com/DataDog/dd-trace-go/v2/internal/llmobs" +) + +const ( + // MetricKeyInputTokens is the standard key for input token count metrics. + MetricKeyInputTokens = "input_tokens" + + // MetricKeyOutputTokens is the standard key for output token count metrics. + MetricKeyOutputTokens = "output_tokens" + + // MetricKeyTotalTokens is the standard key for total token count metrics. + MetricKeyTotalTokens = "total_tokens" +) + +// ------------- Start options ------------- + +// StartSpanOption configures span creation. Use with Start*Span functions. +type StartSpanOption func(cfg *illmobs.StartSpanConfig) + +// WithSessionID sets the session identifier for the span. +func WithSessionID(sessionID string) StartSpanOption { + return func(c *illmobs.StartSpanConfig) { + c.SessionID = sessionID + } +} + +// WithMLApp sets the ML application name for the span. +// This overrides the global ML app configuration for this specific span. +func WithMLApp(mlApp string) StartSpanOption { + return func(c *illmobs.StartSpanConfig) { + c.MLApp = mlApp + } +} + +// WithStartTime sets a custom start time for the span. +// If not provided, the current time is used. +func WithStartTime(t time.Time) StartSpanOption { + return func(c *illmobs.StartSpanConfig) { + c.StartTime = t + } +} + +// WithModelProvider sets the model provider for the span (e.g., "openai", "anthropic"). +// Used primarily with LLM spans to track which provider is being used. +func WithModelProvider(modelProvider string) StartSpanOption { + return func(c *illmobs.StartSpanConfig) { + c.ModelProvider = modelProvider + } +} + +// WithModelName sets the specific model name for the span (e.g., "gpt-4", "claude-3"). +// Used primarily with LLM spans to track which model is being used. +func WithModelName(modelName string) StartSpanOption { + return func(c *illmobs.StartSpanConfig) { + c.ModelName = modelName + } +} + +// ------------- Finish options ------------- + +// FinishSpanOption configures span finishing. Use with span.Finish(). +type FinishSpanOption func(cfg *illmobs.FinishSpanConfig) + +// WithError marks the finished span with the given error. +// The error will be captured with stack trace information and marked as a span error. +func WithError(err error) FinishSpanOption { + return func(cfg *illmobs.FinishSpanConfig) { + var tErr *errortrace.TracerError + if !errors.As(err, &tErr) { + tErr = errortrace.WrapN(err, 0, 2) + } + cfg.Error = tErr + } +} + +// WithFinishTime sets a custom finish time for the span. +// If not provided, the current time is used when Finish() is called. +func WithFinishTime(t time.Time) FinishSpanOption { + return func(cfg *illmobs.FinishSpanConfig) { + cfg.FinishTime = t + } +} + +// ------------- Annotate options ------------- + +// AnnotateOption configures span annotations. Use with span annotation methods. +type AnnotateOption func(a *illmobs.SpanAnnotations) + +// WithAnnotatedTags adds tags to the span annotation. +func WithAnnotatedTags(tags map[string]string) AnnotateOption { + return func(a *illmobs.SpanAnnotations) { + if a.Tags == nil { + a.Tags = make(map[string]string) + } + for k, v := range tags { + a.Tags[k] = v + } + } +} + +// WithAnnotatedSessionID sets the session ID tag for the span annotation. +// This is a convenience function for setting the session ID tag specifically. +func WithAnnotatedSessionID(sessionID string) AnnotateOption { + return func(a *illmobs.SpanAnnotations) { + if a.Tags == nil { + a.Tags = make(map[string]string) + } + a.Tags[illmobs.TagKeySessionID] = sessionID + } +} + +// WithAnnotatedMetadata adds metadata to the span annotation. +// Metadata can contain arbitrary structured data related to the operation. +func WithAnnotatedMetadata(meta map[string]any) AnnotateOption { + return func(a *illmobs.SpanAnnotations) { + if a.Metadata == nil { + a.Metadata = make(map[string]any) + } + for k, v := range meta { + a.Metadata[k] = v + } + } +} + +// WithAnnotatedMetrics adds metrics to the span annotation. +// Metrics are numeric values that can be aggregated and analyzed. +// Common metrics include token counts, latency, costs, etc. +// Multiple calls to this function will merge the metrics. +func WithAnnotatedMetrics(metrics map[string]float64) AnnotateOption { + return func(a *illmobs.SpanAnnotations) { + if a.Metrics == nil { + a.Metrics = make(map[string]float64) + } + for k, v := range metrics { + a.Metrics[k] = v + } + } +} diff --git a/openfeature/doc.go b/openfeature/doc.go new file mode 100644 index 0000000000..ab7c66c65a --- /dev/null +++ b/openfeature/doc.go @@ -0,0 +1,346 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package openfeature provides an OpenFeature-compatible feature flag provider +// that integrates with Datadog Remote Config for server-side feature flag evaluation. +// +// # Overview +// +// This package implements the OpenFeature Provider interface, allowing applications +// to evaluate feature flags using configurations delivered dynamically through +// Datadog's Remote Config system. The provider supports all standard OpenFeature +// flag types: boolean, string, integer, float, and JSON objects. +// +// # Key Features +// +// - Dynamic flag configuration via Datadog Remote Config +// - Support for all OpenFeature flag types (boolean, string, integer, float, JSON) +// - Advanced targeting with attribute-based conditions +// - Traffic sharding for gradual rollouts and A/B testing +// - Time-based flag scheduling (start/end times) +// - Thread-safe concurrent flag evaluation +// - Comprehensive error handling with proper OpenFeature error codes +// +// # Basic Usage +// +// To use the Datadog OpenFeature provider, create a new provider instance and +// register it with the OpenFeature SDK: +// +// import ( +// "github.com/DataDog/dd-trace-go/v2/openfeature" +// of "github.com/open-feature/go-sdk/openfeature" +// ) +// +// // Create and register the provider +// provider, err := openfeature.NewDatadogProvider() +// if err != nil { +// log.Fatal(err) +// } +// defer provider.Shutdown() +// +// // This can take a few seconds to complete as it waits for Remote Config initialization +// err = of.SetProviderAndWait(provider) +// if err != nil { +// log.Fatal(err) +// } +// +// // Create a client and evaluate flags +// client := of.NewClient("my-app") +// ctx := context.Background() +// +// // Evaluate a boolean flag +// enabled, err := client.BooleanValue(ctx, "new-feature", false, of.EvaluationContext{}) +// if err != nil { +// log.Printf("Failed to evaluate flag: %v", err) +// } +// +// if enabled { +// // Execute new feature code +// } +// +// # Targeting Context +// +// The provider supports attribute-based targeting using the OpenFeature evaluation +// context. You can pass user attributes to determine which flag variant a user receives: +// +// evalCtx := of.NewEvaluationContext("user-123", map[string]interface{}{ +// "country": "US", +// "tier": "premium", +// "age": 25, +// "email": "user@example.com", +// }) +// +// value, err := client.StringValue(ctx, "api-version", "v1", evalCtx) +// +// The provider automatically looks for a targeting key "targetingKey" (OpenFeature standard) +// +// # Flag Configuration +// +// Feature flags are configured through Datadog Remote Config and include: +// +// - Flag metadata (key, enabled status, variation type) +// - Variants with their values +// - Allocation rules with targeting conditions +// - Traffic distribution (sharding) configuration +// - Optional time windows for scheduled rollouts +// +// The configuration format follows the Datadog Feature Flag Evaluation (FFE) schema. +// +// # Evaluation Logic +// +// Flag evaluation follows this order: +// +// 1. Check if configuration is loaded (error if not) +// 2. Check if flag exists (FLAG_NOT_FOUND error if not) +// 3. Check if flag is enabled (return default with DISABLED reason if not) +// 4. Evaluate allocations in order (first match wins): +// a. Check time window constraints (startAt/endAt) +// b. Evaluate targeting rules (OR logic between rules, AND within conditions) +// c. Evaluate traffic sharding (consistent hash-based distribution) +// 5. Return matched variant or default value +// +// # Targeting Conditions +// +// The provider supports various condition operators: +// +// Numeric comparisons: +// - LT, LTE, GT, GTE: Compare numeric attributes +// +// String matching: +// - MATCHES, NOT_MATCHES: Regex pattern matching +// +// Set membership: +// - ONE_OF, NOT_ONE_OF: Check if attribute is in a list +// +// Null checks: +// - IS_NULL: Check if attribute is present or absent +// +// Example configuration structure (conceptual): +// +// { +// "flags": { +// "premium-feature": { +// "key": "premium-feature", +// "enabled": true, +// "variationType": "BOOLEAN", +// "variations": { +// "on": {"key": "on", "value": true}, +// "off": {"key": "off", "value": false} +// }, +// "allocations": [{ +// "key": "premium-users", +// "rules": [{ +// "conditions": [{ +// "operator": "ONE_OF", +// "attribute": "tier", +// "value": ["premium", "enterprise"] +// }] +// }], +// "splits": [{ +// "shards": [{ +// "salt": "feature-salt", +// "ranges": [{"start": 0, "end": 8192}], +// "totalShards": 8192 +// }], +// "variationKey": "on" +// }] +// }] +// } +// } +// } +// +// # Traffic Sharding +// +// The provider uses consistent hashing (MD5) for deterministic traffic distribution. +// This ensures users consistently receive the same variant across evaluations. +// +// Sharding allows for: +// - Gradual rollouts (e.g., 10% -> 50% -> 100%) +// - A/B testing with precise traffic splits +// - Canary deployments +// +// The default total shards is 8192, providing fine-grained control over traffic +// distribution percentages. +// +// # Error Handling +// +// The provider properly maps errors to OpenFeature error codes: +// +// - FLAG_NOT_FOUND: Requested flag doesn't exist in configuration +// - TYPE_MISMATCH: Flag value type doesn't match requested type +// - PARSE_ERROR: Error parsing or converting flag value +// - GENERAL: Other errors (e.g., no configuration loaded) +// +// Errors are returned through the OpenFeature ResolutionDetail, and the default +// value is returned when errors occur. +// +// # Thread Safety +// +// The provider is fully thread-safe and can handle concurrent flag evaluations +// while configuration updates are in progress. Configuration updates use a +// read-write mutex to ensure consistency. +// +// # Remote Config Integration +// +// The provider automatically subscribes to Datadog Remote Config updates using +// the FFE_FLAGS product (capability 46). When new configurations are received, +// they are validated and applied atomically. +// +// Configuration updates are acknowledged back to Remote Config with appropriate +// status codes (acknowledged for success, error for validation failures). +// +// # Configuration +// +// The provider can be configured using ProviderConfig when creating a new instance: +// +// config := openfeature.ProviderConfig{ +// ExposureFlushInterval: 5 * time.Second, // Optional: defaults to 1 second +// } +// provider, err := openfeature.NewDatadogProvider(config) +// +// Configuration Options: +// +// - ExposureFlushInterval: Duration between automatic flushes of exposure events +// to the Datadog agent. Defaults to 1 second if not specified. Exposure events +// track which feature flags are evaluated and by which users, providing visibility +// into feature flag usage. Set to 0 to disable automatic flushing (not recommended). +// +// # Environment Variables +// +// The provider requires the following environment variable to be set: +// +// - DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED: Must be set to "true" to enable +// the OpenFeature provider. This is a safety flag to ensure the feature is +// intentionally activated. If not set or set to false, NewDatadogProvider() +// will return a NoopProvider instead of the actual Datadog provider. +// +// Example: +// +// export DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true +// +// Standard Datadog environment variables also apply: +// +// - DD_AGENT_HOST: Datadog agent host (default: localhost) +// - DD_TRACE_AGENT_PORT: Datadog agent port (default: 8126) +// - DD_SERVICE: Service name for tagging +// - DD_ENV: Environment name (e.g., production, staging) +// - DD_VERSION: Application version +// +// # Prerequisites +// +// Before creating the provider, ensure that: +// - DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED environment variable is set to "true" +// - The Datadog tracer is started (tracer.Start()) OR +// - Remote Config client is properly configured +// +// If the default Remote Config setup fails, the provider creation will return +// an error asking you to call tracer.Start first. +// +// # Performance Considerations +// +// - Regex patterns are compiled once and cached for reuse +// - Read locks are used for flag evaluation (multiple concurrent reads) +// - Write locks only during configuration updates +// - MD5 hashing is used for sharding (fast, non-cryptographic) +// +// # Example: Complete Integration +// +// package main +// +// import ( +// "context" +// "log" +// +// "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +// "github.com/DataDog/dd-trace-go/v2/openfeature" +// of "github.com/open-feature/go-sdk/openfeature" +// ) +// +// func main() { +// // Start Datadog tracer (required for Remote Config) +// tracer.Start() +// defer tracer.Stop() +// +// // Create OpenFeature provider +// provider, err := openfeature.NewDatadogProvider(openfeature.ProviderConfig{}) +// if err != nil { +// log.Fatalf("Failed to create provider: %v", err) +// } +// defer provider.Shutdown() +// +// // Register provider with OpenFeature +// if err := of.SetProviderAndWait(provider); err != nil { +// log.Fatalf("Failed to set provider: %v", err) +// } +// +// // Create client for your application +// client := of.NewClient("my-service") +// +// // Evaluate flags with user context +// ctx := context.Background() +// evalCtx := of.NewEvaluationContext("user-123", map[string]interface{}{ +// "country": "US", +// "tier": "premium", +// }) +// +// // Boolean flag +// if enabled, _ := client.BooleanValue(ctx, "new-checkout", false, evalCtx); enabled { +// log.Println("New checkout experience enabled") +// } +// +// // String flag +// apiVersion, _ := client.StringValue(ctx, "api-version", "v1", evalCtx) +// log.Printf("Using API version: %s", apiVersion) +// +// // Integer flag +// rateLimit, _ := client.IntValue(ctx, "rate-limit", 100, evalCtx) +// log.Printf("Rate limit: %d requests/minute", rateLimit) +// +// // Float flag +// discountRate, _ := client.FloatValue(ctx, "discount-rate", 0.0, evalCtx) +// log.Printf("Discount rate: %.2f%%", discountRate*100) +// +// // JSON/Object flag +// config, _ := client.ObjectValue(ctx, "feature-config", nil, evalCtx) +// log.Printf("Feature config: %+v", config) +// } +// +// # Testing +// +// For testing purposes, you can create a provider without Remote Config and +// manually update its configuration: +// +// // Use the internal constructor for testing +// provider := openfeature.newDatadogProvider() +// +// // Manually set test configuration +// config := &universalFlagConfiguration{ +// Format: "SERVER", +// Flags: map[string]*flag{ +// "test-flag": { +// Key: "test-flag", +// Enabled: true, +// VariationType: valueTypeBoolean, +// Variations: map[string]*variant{ +// "on": {Key: "on", Value: true}, +// }, +// Allocations: []*allocation{}, +// }, +// }, +// } +// provider.updateConfiguration(config) +// +// # Limitations +// +// - Configuration updates replace the entire flag set (no incremental updates) +// - Provider shutdown doesn't fully unsubscribe from Remote Config yet +// - Multi-config tracking (multiple Remote Config paths) not yet supported +// +// # Additional Resources +// +// - OpenFeature Specification: https://openfeature.dev/specification/ +// - Datadog Remote Config: https://docs.datadoghq.com/agent/remote_config/ +// - Datadog APM Go SDK: https://docs.datadoghq.com/tracing/setup_overview/setup/go/ +package openfeature diff --git a/openfeature/evaluator.go b/openfeature/evaluator.go new file mode 100644 index 0000000000..eaf6aa77b3 --- /dev/null +++ b/openfeature/evaluator.go @@ -0,0 +1,411 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "crypto/md5" + "encoding/binary" + "fmt" + "regexp" + "strconv" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + of "github.com/open-feature/go-sdk/openfeature" +) + +// evaluationResult contains the result of a flag evaluation. +type evaluationResult struct { + // Value is the evaluated variant value + Value any + // VariantKey is the key of the selected variant + VariantKey string + // Reason describes why this value was returned + Reason of.Reason + // Error contains any error that occurred during evaluation + Error error + // Metadata contains additional evaluation metadata for hooks + Metadata map[string]any +} + +// evaluateFlag evaluates a feature flag with the given context. +// It returns the variant value, reason, and any error that occurred. +func evaluateFlag(flag *flag, defaultValue any, context map[string]any) evaluationResult { + // Check if flag is enabled + if !flag.Enabled { + return evaluationResult{ + Value: defaultValue, + Reason: of.DisabledReason, + } + } + + // Evaluate allocations in order - first match wins + now := time.Now() + for _, allocation := range flag.Allocations { + split, matched := evaluateAllocation(allocation, context, now) + if matched && split != nil { + // Find the variant for this split + variant, ok := flag.Variations[split.VariationKey] + if !ok { + return evaluationResult{ + Value: defaultValue, + Reason: of.ErrorReason, + Error: fmt.Errorf("variation key %q not found in flag variations", split.VariationKey), + } + } + + // Validate variant type matches flag type + if err := validateVariantType(variant.Value, flag.VariationType); err != nil { + return evaluationResult{ + Value: defaultValue, + Reason: of.ErrorReason, + Error: fmt.Errorf("variant type mismatch: %w", err), + } + } + + // Build metadata for exposure tracking + metadata := make(map[string]any) + metadata[metadataAllocationKey] = allocation.Key + + // Get doLog value (defaults to true if not specified) + doLog := true + if allocation.DoLog != nil { + doLog = *allocation.DoLog + } + metadata[metadataDoLogKey] = doLog + + return evaluationResult{ + Value: variant.Value, + VariantKey: variant.Key, + Reason: of.TargetingMatchReason, + Metadata: metadata, + } + } + } + + // No allocations matched, return default + return evaluationResult{ + Value: defaultValue, + Reason: of.DefaultReason, + } +} + +// evaluateAllocation evaluates an allocation and returns the matching split if any. +func evaluateAllocation(allocation *allocation, context map[string]any, currentTime time.Time) (*split, bool) { + // Check time window constraints + if allocation.StartAt != nil && currentTime.Before(*allocation.StartAt) { + return nil, false + } + if allocation.EndAt != nil && currentTime.After(*allocation.EndAt) { + return nil, false + } + + // Check if any rule matches (OR logic between rules) + // If there are no rules, the allocation matches everyone + ruleMatched := len(allocation.Rules) == 0 + for _, rule := range allocation.Rules { + if evaluateRule(rule, context) { + ruleMatched = true + break + } + } + + if !ruleMatched { + return nil, false + } + + // Evaluate splits to determine which variant + for _, split := range allocation.Splits { + if evaluateSplit(split, context) { + return split, true + } + } + + return nil, false +} + +// evaluateRule evaluates a rule by checking all conditions (AND logic). +func evaluateRule(rule *rule, context map[string]any) bool { + for _, condition := range rule.Conditions { + if !evaluateCondition(condition, context) { + return false + } + } + return true +} + +// evaluateCondition evaluates a single condition against the context. +func evaluateCondition(condition *condition, context map[string]any) bool { + attributeValue, exists := context[condition.Attribute] + + // Special handling for "id" attribute: if not explicitly provided, use targeting key + if condition.Attribute == "id" && !exists { + if targetingKey, ok := context[of.TargetingKey].(string); ok { + attributeValue = targetingKey + exists = true + } + } + + // Special handling for IS_NULL operator + if condition.Operator == operatorIsNull { + isNull := !exists || attributeValue == nil + expectedNull, ok := condition.Value.(bool) + if !ok { + return false + } + return isNull == expectedNull + } + + // For all other operators, attribute must exist + if !exists || attributeValue == nil { + return false + } + + switch condition.Operator { + case operatorMatches: + return matchesRegex(attributeValue, condition.Value) + case operatorNotMatches: + return !matchesRegex(attributeValue, condition.Value) + case operatorOneOf: + return isOneOf(attributeValue, condition.Value) + case operatorNotOneOf: + return !isOneOf(attributeValue, condition.Value) + case operatorGT, operatorGTE, operatorLT, operatorLTE: + return evaluateNumericCondition(attributeValue, condition.Value, condition.Operator) + default: + return false + } +} + +var regexCache sync.Map // map[string]*regexp.Regexp + +// loadRegex loads or compiles a regex pattern with caching. +// Returns the compiled regex or an error if compilation fails. +func loadRegex(pattern string) (*regexp.Regexp, error) { + // First, check if it's already compiled + if regexAny, ok := regexCache.Load(pattern); ok { + if regex, ok := regexAny.(*regexp.Regexp); ok { + return regex, nil + } + } + + // Not in cache, compile it (we are probably in the remote config goroutine, so this is acceptable) + compiled, err := regexp.Compile(pattern) + if err != nil { + return nil, err + } + + regexCache.Store(pattern, compiled) + return compiled, nil +} + +// matchesRegex checks if the attribute value matches the regex pattern. +func matchesRegex(attributeValue any, conditionValue any) bool { + pattern, ok := conditionValue.(string) + if !ok { + return false + } + + regex, err := loadRegex(pattern) + if err != nil { + log.Debug("openfeature: failed to compile regex pattern %q: %v", pattern, err.Error()) + return false + } + + var valueStr string + switch v := attributeValue.(type) { + case string: + valueStr = v + case int, int8, int16, int32, int64: + if i64, err := internal.ToInt64(v); err == nil { + valueStr = strconv.FormatInt(i64, 10) + } else { + return false + } + case uint, uint8, uint16, uint32, uint64: + if u64, err := internal.ToUint64(v); err == nil { + valueStr = strconv.FormatUint(u64, 10) + } else { + return false + } + case float32, float64: + if f64, ok := internal.ToFloat64(v); ok { + valueStr = strconv.FormatFloat(f64, 'f', -1, 64) + } else { + return false + } + case bool: + valueStr = strconv.FormatBool(v) + default: + return false + } + + return regex.MatchString(valueStr) +} + +// isOneOf checks if the attribute value is in the list of condition values. +func isOneOf(attributeValue any, conditionValue any) bool { + // Convert condition value to string slice + var conditionList []string + switch cv := conditionValue.(type) { + case []string: + conditionList = cv + case []any: + conditionList = make([]string, len(cv)) + for i, v := range cv { + if s, ok := v.(string); ok { + conditionList[i] = s + } else { + conditionList[i] = fmt.Sprintf("%v", v) + } + } + default: + return false + } + + // Check if attribute value matches any item in the list + for _, item := range conditionList { + if matchesValue(attributeValue, item) { + return true + } + } + return false +} + +// matchesValue checks if an attribute value equals a string value with type coercion. +func matchesValue(attributeValue any, strValue string) bool { + switch av := attributeValue.(type) { + case string: + return av == strValue + case int, int8, int16, int32, int64: + i64, err1 := internal.ToInt64(av) + parsed, err2 := strconv.ParseInt(strValue, 10, 64) + return err1 == nil && err2 == nil && i64 == parsed + case uint, uint8, uint16, uint32, uint64: + u64, err1 := internal.ToUint64(av) + parsed, err2 := strconv.ParseUint(strValue, 10, 64) + return err1 == nil && err2 == nil && u64 == parsed + case float32, float64: + f64, ok := internal.ToFloat64(av) + parsed, err2 := strconv.ParseFloat(strValue, 64) + return ok && err2 == nil && f64 == parsed + case bool: + parsed, err := strconv.ParseBool(strValue) + return err == nil && av == parsed + default: + return fmt.Sprintf("%v", av) == strValue + } +} + +// evaluateNumericCondition evaluates numeric comparison operators. +func evaluateNumericCondition(attributeValue any, conditionValue any, operator conditionOperator) bool { + attrNum, ok := internal.ToFloat64(attributeValue) + if !ok { + return false + } + + condNum, ok := internal.ToFloat64(conditionValue) + if !ok { + return false + } + + switch operator { + case operatorGT: + return attrNum > condNum + case operatorGTE: + return attrNum >= condNum + case operatorLT: + return attrNum < condNum + case operatorLTE: + return attrNum <= condNum + default: + return false + } +} + +// evaluateSplit determines if a split matches by evaluating all its shards. +func evaluateSplit(split *split, context map[string]any) bool { + // All shards must match (AND logic) + for _, shard := range split.Shards { + if !evaluateShard(shard, context) { + return false + } + } + return true +} + +// evaluateShard evaluates a shard using consistent hashing. +func evaluateShard(shard *shard, context map[string]any) bool { + // Get targeting key from context + targetingKey, ok := context[of.TargetingKey].(string) + if !ok { + return false + } + + // Compute shard index using MD5 hash (matching Eppo's implementation) + shardIndex := computeShardIndex(shard.Salt, targetingKey, shard.TotalShards) + + // Check if shard index falls within any of the ranges + for _, shardRange := range shard.Ranges { + if shardIndex >= shardRange.Start && shardIndex < shardRange.End { + return true + } + } + return false +} + +// computeShardIndex computes the shard index using MD5 hash. +// This matches the Eppo SDK implementation for consistent behavior. +func computeShardIndex(salt, targetingKey string, totalShards int) int { + input := salt + "-" + targetingKey + hash := md5.Sum([]byte(input)) + // Use first 4 bytes of MD5 hash as uint32 + intVal := binary.BigEndian.Uint32(hash[:4]) + return int(int64(intVal) % int64(totalShards)) +} + +// validateVariantType checks if a variant value matches the expected flag type. +func validateVariantType(value any, expectedType valueType) error { + switch expectedType { + case valueTypeBoolean: + if _, ok := value.(bool); !ok { + return fmt.Errorf("expected boolean, got %T", value) + } + case valueTypeString: + if _, ok := value.(string); !ok { + return fmt.Errorf("expected string, got %T", value) + } + case valueTypeInteger: + // Accept int, int64, float64 (if whole number) + switch v := value.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + return nil + case float64: + if v == float64(int64(v)) { + return nil + } + return fmt.Errorf("expected integer, got float64 with decimal: %v", v) + default: + return fmt.Errorf("expected integer, got %T", value) + } + case valueTypeNumeric: + // Accept any numeric type + switch value.(type) { + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64: + return nil + default: + return fmt.Errorf("expected numeric, got %T", value) + } + case valueTypeJSON: + // JSON type accepts any value + return nil + default: + return fmt.Errorf("unknown value type: %s", expectedType) + } + return nil +} diff --git a/openfeature/evaluator_test.go b/openfeature/evaluator_test.go new file mode 100644 index 0000000000..3be0dbd64b --- /dev/null +++ b/openfeature/evaluator_test.go @@ -0,0 +1,765 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "testing" + "time" + + of "github.com/open-feature/go-sdk/openfeature" +) + +func TestEvaluateCondition_IsNull(t *testing.T) { + tests := []struct { + name string + condition *condition + context map[string]interface{} + expected bool + }{ + { + name: "attribute missing, expect null", + condition: &condition{ + Operator: operatorIsNull, + Attribute: "missing_attr", + Value: true, + }, + context: map[string]interface{}{}, + expected: true, + }, + { + name: "attribute missing, expect not null", + condition: &condition{ + Operator: operatorIsNull, + Attribute: "missing_attr", + Value: false, + }, + context: map[string]interface{}{}, + expected: false, + }, + { + name: "attribute present, expect null", + condition: &condition{ + Operator: operatorIsNull, + Attribute: "present_attr", + Value: true, + }, + context: map[string]interface{}{"present_attr": "value"}, + expected: false, + }, + { + name: "attribute present, expect not null", + condition: &condition{ + Operator: operatorIsNull, + Attribute: "present_attr", + Value: false, + }, + context: map[string]interface{}{"present_attr": "value"}, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := evaluateCondition(tt.condition, tt.context) + if result != tt.expected { + t.Errorf("expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestEvaluateCondition_NumericComparison(t *testing.T) { + tests := []struct { + name string + condition *condition + context map[string]interface{} + expected bool + }{ + { + name: "GT - greater than", + condition: &condition{ + Operator: operatorGT, + Attribute: "age", + Value: 18.0, + }, + context: map[string]interface{}{"age": 25}, + expected: true, + }, + { + name: "GT - not greater than", + condition: &condition{ + Operator: operatorGT, + Attribute: "age", + Value: 30.0, + }, + context: map[string]interface{}{"age": 25}, + expected: false, + }, + { + name: "GTE - greater than or equal", + condition: &condition{ + Operator: operatorGTE, + Attribute: "age", + Value: 25.0, + }, + context: map[string]interface{}{"age": 25}, + expected: true, + }, + { + name: "LT - less than", + condition: &condition{ + Operator: operatorLT, + Attribute: "age", + Value: 30.0, + }, + context: map[string]interface{}{"age": 25}, + expected: true, + }, + { + name: "LTE - less than or equal", + condition: &condition{ + Operator: operatorLTE, + Attribute: "age", + Value: 25.0, + }, + context: map[string]interface{}{"age": 25}, + expected: true, + }, + { + name: "numeric with float attribute", + condition: &condition{ + Operator: operatorGT, + Attribute: "score", + Value: 85.5, + }, + context: map[string]interface{}{"score": 90.7}, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := evaluateCondition(tt.condition, tt.context) + if result != tt.expected { + t.Errorf("expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestEvaluateCondition_RegexMatching(t *testing.T) { + tests := []struct { + name string + condition *condition + context map[string]interface{} + expected bool + }{ + { + name: "MATCHES - matches pattern", + condition: &condition{ + Operator: operatorMatches, + Attribute: "email", + Value: ".*@example\\.com$", + }, + context: map[string]interface{}{"email": "user@example.com"}, + expected: true, + }, + { + name: "MATCHES - does not match pattern", + condition: &condition{ + Operator: operatorMatches, + Attribute: "email", + Value: ".*@example\\.com$", + }, + context: map[string]interface{}{"email": "user@other.com"}, + expected: false, + }, + { + name: "NOT_MATCHES - does not match pattern", + condition: &condition{ + Operator: operatorNotMatches, + Attribute: "email", + Value: ".*@spam\\.com$", + }, + context: map[string]interface{}{"email": "user@example.com"}, + expected: true, + }, + { + name: "NOT_MATCHES - matches pattern", + condition: &condition{ + Operator: operatorNotMatches, + Attribute: "email", + Value: ".*@example\\.com$", + }, + context: map[string]interface{}{"email": "user@example.com"}, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := evaluateCondition(tt.condition, tt.context) + if result != tt.expected { + t.Errorf("expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestEvaluateCondition_SetMembership(t *testing.T) { + tests := []struct { + name string + condition *condition + context map[string]interface{} + expected bool + }{ + { + name: "ONE_OF - in list", + condition: &condition{ + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US", "CA", "MX"}, + }, + context: map[string]interface{}{"country": "US"}, + expected: true, + }, + { + name: "ONE_OF - not in list", + condition: &condition{ + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US", "CA", "MX"}, + }, + context: map[string]interface{}{"country": "UK"}, + expected: false, + }, + { + name: "NOT_ONE_OF - not in list", + condition: &condition{ + Operator: operatorNotOneOf, + Attribute: "country", + Value: []string{"CN", "RU"}, + }, + context: map[string]interface{}{"country": "US"}, + expected: true, + }, + { + name: "NOT_ONE_OF - in list", + condition: &condition{ + Operator: operatorNotOneOf, + Attribute: "country", + Value: []string{"US", "CA"}, + }, + context: map[string]interface{}{"country": "US"}, + expected: false, + }, + { + name: "ONE_OF - with interface{} slice", + condition: &condition{ + Operator: operatorOneOf, + Attribute: "tier", + Value: []interface{}{"gold", "platinum"}, + }, + context: map[string]interface{}{"tier": "gold"}, + expected: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := evaluateCondition(tt.condition, tt.context) + if result != tt.expected { + t.Errorf("expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestEvaluateRule(t *testing.T) { + tests := []struct { + name string + rule *rule + context map[string]interface{} + expected bool + }{ + { + name: "all conditions match", + rule: &rule{ + Conditions: []*condition{ + { + Operator: operatorGTE, + Attribute: "age", + Value: 18.0, + }, + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US", "CA"}, + }, + }, + }, + context: map[string]interface{}{ + "age": 25, + "country": "US", + }, + expected: true, + }, + { + name: "one condition fails", + rule: &rule{ + Conditions: []*condition{ + { + Operator: operatorGTE, + Attribute: "age", + Value: 18.0, + }, + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US", "CA"}, + }, + }, + }, + context: map[string]interface{}{ + "age": 25, + "country": "UK", + }, + expected: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := evaluateRule(tt.rule, tt.context) + if result != tt.expected { + t.Errorf("expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestEvaluateShard(t *testing.T) { + t.Run("targeting key hashes to correct shard", func(t *testing.T) { + targetingKey := "user-123" + salt := "test-salt" + totalShards := 8192 + + // First compute where this key actually hashes + actualShard := computeShardIndex(salt, targetingKey, totalShards) + + // Test that a range containing this shard matches + shard := &shard{ + Salt: salt, + Ranges: []*shardRange{ + {Start: actualShard, End: actualShard + 1}, + }, + TotalShards: totalShards, + } + context := map[string]interface{}{ + "targetingKey": targetingKey, + } + + result := evaluateShard(shard, context) + if !result { + t.Errorf("expected shard to match when range includes computed shard %d", actualShard) + } + }) + + t.Run("targeting key not in range", func(t *testing.T) { + targetingKey := "user-123" + salt := "test-salt" + totalShards := 8192 + + // Compute where this key hashes + actualShard := computeShardIndex(salt, targetingKey, totalShards) + + // Create a range that definitely doesn't include this shard + excludedStart := (actualShard + 100) % totalShards + excludedEnd := (actualShard + 110) % totalShards + if excludedEnd < excludedStart { + excludedEnd = totalShards + } + + shard := &shard{ + Salt: salt, + Ranges: []*shardRange{ + {Start: excludedStart, End: excludedEnd}, + }, + TotalShards: totalShards, + } + context := map[string]interface{}{ + "targetingKey": targetingKey, + } + + result := evaluateShard(shard, context) + if result { + t.Errorf("expected shard not to match when range excludes computed shard") + } + }) + + t.Run("no targeting key", func(t *testing.T) { + shard := &shard{ + Salt: "test-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + } + context := map[string]interface{}{} + + result := evaluateShard(shard, context) + if result { + t.Errorf("expected shard not to match when no targeting key present") + } + }) + + t.Run("full range always matches", func(t *testing.T) { + shard := &shard{ + Salt: "test-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, // 100% of traffic + }, + TotalShards: 8192, + } + context := map[string]interface{}{ + "targetingKey": "any-user", + } + + result := evaluateShard(shard, context) + if !result { + t.Errorf("expected shard to match when range covers all shards") + } + }) +} + +func TestEvaluateAllocation(t *testing.T) { + now := time.Now() + past := now.Add(-1 * time.Hour) + future := now.Add(1 * time.Hour) + + tests := []struct { + name string + allocation *allocation + context map[string]interface{} + currentTime time.Time + expectMatch bool + expectedVariation string + }{ + { + name: "allocation matches with time window", + allocation: &allocation{ + Key: "allocation1", + StartAt: &past, + EndAt: &future, + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, // All traffic + }, + TotalShards: 8192, + }, + }, + VariationKey: "variant-a", + }, + }, + }, + context: map[string]interface{}{ + "country": "US", + "targetingKey": "user-123", + }, + currentTime: now, + expectMatch: true, + expectedVariation: "variant-a", + }, + { + name: "allocation outside time window (before start)", + allocation: &allocation{ + Key: "allocation1", + StartAt: &future, + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "variant-a", + }, + }, + }, + context: map[string]interface{}{ + "country": "US", + "targetingKey": "user-123", + }, + currentTime: now, + expectMatch: false, + }, + { + name: "allocation outside time window (after end)", + allocation: &allocation{ + Key: "allocation1", + EndAt: &past, + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "variant-a", + }, + }, + }, + context: map[string]interface{}{ + "country": "US", + "targetingKey": "user-123", + }, + currentTime: now, + expectMatch: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + split, matched := evaluateAllocation(tt.allocation, tt.context, tt.currentTime) + if matched != tt.expectMatch { + t.Errorf("expected match=%v, got match=%v", tt.expectMatch, matched) + } + if matched && split != nil && split.VariationKey != tt.expectedVariation { + t.Errorf("expected variation=%s, got variation=%s", tt.expectedVariation, split.VariationKey) + } + }) + } +} + +func TestEvaluateFlag(t *testing.T) { + tests := []struct { + name string + flag *flag + defaultValue interface{} + context map[string]interface{} + expectedValue interface{} + expectedReason of.Reason + }{ + { + name: "disabled flag returns default", + flag: &flag{ + Key: "test-flag", + Enabled: false, + VariationType: valueTypeBoolean, + }, + defaultValue: false, + context: map[string]interface{}{}, + expectedValue: false, + expectedReason: of.DisabledReason, + }, + { + name: "enabled flag with matching allocation", + flag: &flag{ + Key: "test-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + "off": {Key: "off", Value: false}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "on", + }, + }, + }, + }, + }, + defaultValue: false, + context: map[string]interface{}{ + "country": "US", + "targetingKey": "user-123", + }, + expectedValue: true, + expectedReason: of.TargetingMatchReason, + }, + { + name: "enabled flag with no matching allocation", + flag: &flag{ + Key: "test-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + "off": {Key: "off", Value: false}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"CA"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "on", + }, + }, + }, + }, + }, + defaultValue: false, + context: map[string]interface{}{ + "country": "US", + "targetingKey": "user-123", + }, + expectedValue: false, + expectedReason: of.DefaultReason, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := evaluateFlag(tt.flag, tt.defaultValue, tt.context) + if result.Value != tt.expectedValue { + t.Errorf("expected value=%v, got value=%v", tt.expectedValue, result.Value) + } + if result.Reason != tt.expectedReason { + t.Errorf("expected reason=%s, got reason=%s", tt.expectedReason, result.Reason) + } + }) + } +} + +func TestComputeShardIndex(t *testing.T) { + // Test consistency: same input should always produce same output + key1 := computeShardIndex("salt1", "user-123", 8192) + key2 := computeShardIndex("salt1", "user-123", 8192) + if key1 != key2 { + t.Errorf("shard index should be consistent: %d != %d", key1, key2) + } + + // Test different inputs produce different outputs + key3 := computeShardIndex("salt2", "user-123", 8192) + if key1 == key3 { + t.Logf("warning: different salts produced same shard (possible but unlikely)") + } + + // Test that output is within bounds + if key1 < 0 || key1 >= 8192 { + t.Errorf("shard index out of bounds: %d", key1) + } +} + +func TestValidateVariantType(t *testing.T) { + tests := []struct { + name string + value interface{} + expectedType valueType + expectError bool + }{ + {"boolean valid", true, valueTypeBoolean, false}, + {"boolean invalid", "true", valueTypeBoolean, true}, + {"string valid", "hello", valueTypeString, false}, + {"string invalid", 123, valueTypeString, true}, + {"integer valid int", 42, valueTypeInteger, false}, + {"integer valid int64", int64(42), valueTypeInteger, false}, + {"integer valid float64 whole", float64(42), valueTypeInteger, false}, + {"integer invalid float64 decimal", 42.5, valueTypeInteger, true}, + {"numeric valid int", 42, valueTypeNumeric, false}, + {"numeric valid float", 42.5, valueTypeNumeric, false}, + {"numeric invalid", "42", valueTypeNumeric, true}, + {"json accepts anything", map[string]interface{}{"key": "value"}, valueTypeJSON, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := validateVariantType(tt.value, tt.expectedType) + if (err != nil) != tt.expectError { + t.Errorf("expected error=%v, got error=%v", tt.expectError, err) + } + }) + } +} diff --git a/openfeature/exposure.go b/openfeature/exposure.go new file mode 100644 index 0000000000..2d05e12e9b --- /dev/null +++ b/openfeature/exposure.go @@ -0,0 +1,262 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "bytes" + "cmp" + "context" + "fmt" + "io" + "log/slog" + "net/http" + "net/url" + "os" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + telemetrylog "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + jsoniter "github.com/json-iterator/go" +) + +const ( + // defaultExposureFlushInterval is the default interval for flushing exposure events + // Matches the dd-trace-js implementation (1 second) + defaultExposureFlushInterval = 1 * time.Second + + // exposureEndpoint is the EVP proxy endpoint for exposure events + exposureEndpoint = "/evp_proxy/v2/api/v2/exposures" + + // evpSubdomainHeader is the HTTP header name for EVP subdomain routing + evpSubdomainHeader = "X-Datadog-EVP-Subdomain" + + // evpSubdomainValue is the subdomain value for event platform intake + evpSubdomainValue = "event-platform-intake" + + // defaultHTTPTimeout is the timeout for HTTP requests to the agent + defaultHTTPTimeout = 5 * time.Second +) + +// exposureEvent represents a single feature flag evaluation exposure event. +// It matches the schema defined in exposure.json. +type exposureEvent struct { + Timestamp int64 `json:"timestamp"` + Allocation exposureAllocation `json:"allocation"` + Flag exposureFlag `json:"flag"` + Variant exposureVariant `json:"variant"` + Subject exposureSubject `json:"subject"` +} + +// exposureAllocation represents allocation information in an exposure event +type exposureAllocation struct { + Key string `json:"key"` +} + +// exposureFlag represents flag information in an exposure event +type exposureFlag struct { + Key string `json:"key"` +} + +// exposureVariant represents variant information in an exposure event +type exposureVariant struct { + Key string `json:"key"` +} + +// exposureSubject represents subject (user/entity) information in an exposure event +type exposureSubject struct { + ID string `json:"id"` + Type string `json:"type,omitempty"` + Attributes map[string]any `json:"attributes,omitempty"` +} + +// exposureContext represents service context metadata for the exposure payload +type exposureContext struct { + Service string `json:"service"` + Version string `json:"version,omitempty"` + Env string `json:"env,omitempty"` +} + +// exposurePayload represents the complete payload sent to the exposure endpoint +type exposurePayload struct { + Context exposureContext `json:"context"` + Exposures []exposureEvent `json:"exposures"` +} + +// exposureWriter manages buffering and flushing of exposure events to the Datadog Agent +type exposureWriter struct { + mu sync.Mutex + buffer []exposureEvent // Buffer for exposure events + flushInterval time.Duration + httpClient *http.Client + agentURL *url.URL + context exposureContext + ticker *time.Ticker + stopChan chan struct{} + stopped bool + jsonConfig jsoniter.API +} + +// newExposureWriter creates a new exposure writer with the given configuration +func newExposureWriter(config ProviderConfig) *exposureWriter { + agentURL := internal.AgentURLFromEnv() + var httpClient *http.Client + if agentURL.Scheme == "unix" { + httpClient = internal.UDSClient(agentURL.Path, defaultHTTPTimeout) + agentURL = internal.UnixDataSocketURL(agentURL.Path) + } else { + httpClient = internal.DefaultHTTPClient(defaultHTTPTimeout, false) + } + + executable, _ := os.Executable() + + return &exposureWriter{ + buffer: make([]exposureEvent, 0, 1<<8), // Initial capacity of 256 + flushInterval: cmp.Or(config.ExposureFlushInterval, defaultExposureFlushInterval), + httpClient: httpClient, + agentURL: agentURL, + stopChan: make(chan struct{}), + jsonConfig: jsoniter.Config{}.Froze(), + context: exposureContext{ + Service: cmp.Or(env.Get("DD_SERVICE"), globalconfig.ServiceName(), executable), + Version: env.Get("DD_VERSION"), + Env: env.Get("DD_ENV"), + }, + } +} + +// start begins the periodic flushing of exposure events +func (w *exposureWriter) start() { + w.ticker = time.NewTicker(w.flushInterval) + go func() { + defer func() { + if r := recover(); r != nil { + log.Error("openfeature: exposure writer recovered panic: %v", r) + var errAttr slog.Attr + if err, ok := r.(error); ok { + errAttr = slog.Any("panic", telemetrylog.NewSafeError(err)) + } else { + errAttr = slog.Any("panic", r) + } + telemetrylog.Error("openfeature: exposure writer recovered panic", errAttr) + } + w.stop() + }() + + for { + select { + case <-w.ticker.C: + w.flush() + case <-w.stopChan: + return + } + } + }() +} + +// append adds an exposure event to the buffer +func (w *exposureWriter) append(event exposureEvent) { + w.mu.Lock() + defer w.mu.Unlock() + + if w.stopped { + return + } + + // Append event to buffer + // Each exposure event is tracked individually to maintain accurate analytics + w.buffer = append(w.buffer, event) +} + +// flush sends all buffered exposure events to the agent +func (w *exposureWriter) flush() { + w.mu.Lock() + if len(w.buffer) == 0 || w.stopped { + w.mu.Unlock() + return + } + + // Move buffer to local variable and create new buffer + events := w.buffer + w.buffer = make([]exposureEvent, 0, len(events)/2) + w.mu.Unlock() + + // Send to agent + if err := w.sendToAgent(exposurePayload{ + Context: w.context, + Exposures: events, + }); err != nil { + log.Error("openfeature: failed to send exposure events: %v", err.Error()) + } else { + log.Debug("openfeature: successfully sent %d exposure events", len(events)) + } +} + +// sendToAgent sends the exposure payload to the Datadog Agent via EVP proxy +func (w *exposureWriter) sendToAgent(payload exposurePayload) error { + // Serialize payload + var bytesBuffer bytes.Buffer + encoder := w.jsonConfig.NewEncoder(&bytesBuffer) + if err := encoder.Encode(payload); err != nil { + return fmt.Errorf("failed to encode exposure payload: %w", err) + } + + // Build request URL + u := *w.agentURL + u.Path = exposureEndpoint + requestURL := u.String() + + // Create HTTP request + req, err := http.NewRequestWithContext(context.Background(), "POST", requestURL, &bytesBuffer) + if err != nil { + return fmt.Errorf("failed to create request: %w", err) + } + + // Set headers + req.Header.Set("Content-Type", "application/json") + req.Header.Set(evpSubdomainHeader, evpSubdomainValue) + + log.Debug("openfeature: sending exposure events to %s", requestURL) + + // Send request + resp, err := w.httpClient.Do(req) + if err != nil { + return fmt.Errorf("request failed: %w", err) + } + defer resp.Body.Close() + + // Check response status + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + body, _ := io.ReadAll(io.LimitReader(resp.Body, 256)) + return fmt.Errorf("unexpected status code %d: %s", resp.StatusCode, string(body)) + } + + return nil +} + +// stop stops the exposure writer and flushes any remaining events +func (w *exposureWriter) stop() { + w.mu.Lock() + if w.stopped { + w.mu.Unlock() + return + } + w.stopped = true + w.mu.Unlock() + + // Signal the goroutine to stop + close(w.stopChan) + + // Stop the ticker + if w.ticker != nil { + w.ticker.Stop() + } + + log.Debug("openfeature: exposure writer stopped") +} diff --git a/openfeature/exposure_hook.go b/openfeature/exposure_hook.go new file mode 100644 index 0000000000..d7a4718079 --- /dev/null +++ b/openfeature/exposure_hook.go @@ -0,0 +1,157 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "context" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal/log" + of "github.com/open-feature/go-sdk/openfeature" +) + +const ( + // Metadata keys for exposure tracking + metadataAllocationKey = "dd.allocation.key" + metadataDoLogKey = "dd.doLog" +) + +// exposureHook implements the OpenFeature Hook interface to track feature flag exposures. +// It captures evaluation details and sends them to the exposure writer for reporting +// to Datadog's event platform intake. +type exposureHook struct { + of.UnimplementedHook + writer *exposureWriter +} + +// newExposureHook creates a new exposure tracking hook with the given writer +func newExposureHook(writer *exposureWriter) *exposureHook { + return &exposureHook{ + writer: writer, + } +} + +// After is called after a successful flag evaluation. +// It extracts the necessary information from the evaluation details and sends +// an exposure event to the writer if doLog is true. +func (h *exposureHook) After( + ctx context.Context, + hookContext of.HookContext, + flagEvaluationDetails of.InterfaceEvaluationDetails, + _ of.HookHints, +) error { + // Check if context was cancelled before starting evaluation + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + // Check if we should log this exposure + if !h.shouldLog(flagEvaluationDetails.FlagMetadata) { + log.Debug("openfeature: skipping exposure event (doLog=false) for flag %q", hookContext.FlagKey()) + return nil + } + + // Get allocation key from metadata + allocationKey, ok := h.getAllocationKey(flagEvaluationDetails.FlagMetadata) + if !ok { + log.Debug("openfeature: skipping exposure event (no allocation key) for flag %q", hookContext.FlagKey()) + return nil + } + + // Get targeting key (subject ID) from evaluation context + evalContext := hookContext.EvaluationContext() + targetingKey := evalContext.TargetingKey() + if targetingKey == "" { + log.Debug("openfeature: skipping exposure event (no targeting key) for flag %q", hookContext.FlagKey()) + return nil + } + + // Build flat context from evaluation context + flatContext := make(map[string]any) + flatContext[of.TargetingKey] = targetingKey + for k, v := range evalContext.Attributes() { + flatContext[k] = v + } + + // Flatten attributes for exposure event + flattenedAttrs := flattenContext(flatContext) + + // Extract only primitive attributes for the subject + subjectAttrs := extractPrimitiveAttributes(flattenedAttrs) + + // Create exposure event + event := exposureEvent{ + Timestamp: time.Now().UnixMilli(), + Allocation: exposureAllocation{ + Key: allocationKey, + }, + Flag: exposureFlag{ + Key: hookContext.FlagKey(), + }, + Variant: exposureVariant{ + Key: flagEvaluationDetails.Variant, + }, + Subject: exposureSubject{ + ID: targetingKey, + Type: "", // Type is optional + Attributes: subjectAttrs, // Flattened, primitive-only attributes + }, + } + + // Send to writer for buffering and eventual flushing + h.writer.append(event) + + log.Debug("openfeature: recorded exposure event for flag %q (allocation=%s, variant=%s, subject=%s)", + hookContext.FlagKey(), allocationKey, flagEvaluationDetails.Variant, targetingKey) + + return nil +} + +// shouldLog checks if the exposure should be logged based on the doLog metadata flag +func (h *exposureHook) shouldLog(metadata of.FlagMetadata) bool { + if metadata == nil { + // Default to true if no metadata present + return true + } + + doLog, ok := metadata[metadataDoLogKey] + if !ok { + // Default to true if doLog not specified + return true + } + + // Check if it's a boolean + doLogBool, ok := doLog.(bool) + if !ok { + log.Debug("openfeature: doLog metadata is not a boolean, defaulting to true") + return true + } + + return doLogBool +} + +// getAllocationKey extracts the allocation key from flag metadata +func (h *exposureHook) getAllocationKey(metadata of.FlagMetadata) (string, bool) { + if metadata == nil { + return "", false + } + + allocationKey, ok := metadata[metadataAllocationKey] + if !ok { + return "", false + } + + // Check if it's a string + allocationKeyStr, ok := allocationKey.(string) + if !ok { + log.Debug("openfeature: allocation key metadata is not a string") + return "", false + } + + return allocationKeyStr, true +} diff --git a/openfeature/flatten.go b/openfeature/flatten.go new file mode 100644 index 0000000000..84d89043c2 --- /dev/null +++ b/openfeature/flatten.go @@ -0,0 +1,163 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "fmt" + "strconv" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/log" +) + +// flattenRecursive recursively flattens nested attributes into a single-level map +// using dot notation for nested keys. This ensures that subject attributes in exposure +// events comply with the EVP intake schema which does not allow nested objects. +// +// For example: +// +// {"user": {"id": "123", "email": "test@example.com"}} +// +// becomes: +// +// {"user.id": "123", "user.email": "test@example.com"} +// +// The flattening is applied during both flag evaluation and exposure event creation. +func flattenRecursive(prefix string, value any, result map[string]any) { + switch v := value.(type) { + case map[string]any: + flattenRecursiveMap(prefix, v, result) + case map[string]string: + flattenRecursiveMap(prefix, v, result) + case map[string]uint: + flattenRecursiveMap(prefix, v, result) + case map[string]int: + flattenRecursiveMap(prefix, v, result) + case map[string]int64: + flattenRecursiveMap(prefix, v, result) + case map[string]int32: + flattenRecursiveMap(prefix, v, result) + case map[string]uint64: + flattenRecursiveMap(prefix, v, result) + case map[string]uint32: + flattenRecursiveMap(prefix, v, result) + case map[string]int16: + flattenRecursiveMap(prefix, v, result) + case map[string]int8: + flattenRecursiveMap(prefix, v, result) + case map[string]uint16: + flattenRecursiveMap(prefix, v, result) + case map[string]uint8: + flattenRecursiveMap(prefix, v, result) + case map[string]float64: + flattenRecursiveMap(prefix, v, result) + case map[string]bool: + flattenRecursiveMap(prefix, v, result) + case map[string]float32: + flattenRecursiveMap(prefix, v, result) + case []string: + flattenRecursiveArray(prefix, v, result) + case []int: + flattenRecursiveArray(prefix, v, result) + case []int64: + flattenRecursiveArray(prefix, v, result) + case []int32: + flattenRecursiveArray(prefix, v, result) + case []uint64: + flattenRecursiveArray(prefix, v, result) + case []uint32: + flattenRecursiveArray(prefix, v, result) + case []int16: + flattenRecursiveArray(prefix, v, result) + case []uint16: + flattenRecursiveArray(prefix, v, result) + case []float64: + flattenRecursiveArray(prefix, v, result) + case []bool: + flattenRecursiveArray(prefix, v, result) + case []float32: + flattenRecursiveArray(prefix, v, result) + case []any: + flattenRecursiveArray(prefix, v, result) + case []byte: + result[prefix] = string(v) + case fmt.Stringer: + result[prefix] = v.String() + case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, bool: + result[prefix] = value + default: + log.Debug("openfeature: skipping unsupported attribute type for key %q: %T", prefix, value) + } +} + +func flattenRecursiveMap[T any](prefix string, v map[string]T, result map[string]any) { + for key, val := range v { + newPrefix := key + if prefix != "" { + newPrefix = prefix + "." + key + } + flattenRecursive(newPrefix, val, result) + } +} + +func flattenRecursiveArray[T any](prefix string, v []T, result map[string]any) { + for i, item := range v { + flattenKey := prefix + "." + strconv.Itoa(i) + flattenRecursive(flattenKey, item, result) + } +} + +// flattenContext flattens the OpenFeature evaluation context attributes. +// It ensures that nested attributes are converted to dot notation for both +// evaluation purposes and exposure event reporting. +func flattenContext(context map[string]any) map[string]any { + if context == nil { + return make(map[string]any) + } + + flattened := make(map[string]any) + + // Flatten each top-level value in the context + flattenRecursive("", context, flattened) + + if len(flattened) == 0 { + return nil + } + + return flattened +} + +// extractPrimitiveAttributes extracts only primitive-type attributes from a flattened map. +// This is used for exposure event subject attributes to ensure only valid types are sent. +// Valid primitive types are: string, int, int64, float64, bool +func extractPrimitiveAttributes(attributes map[string]any) map[string]any { + if attributes == nil { + return nil + } + + result := make(map[string]any) + for key, value := range attributes { + // Skip the targeting key as it's sent separately as subject.id + if strings.HasPrefix(key, "targetingKey") { + continue + } + + // Only include primitive types + switch value.(type) { + case string, int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, bool: + result[key] = value + default: + // Skip non-primitive types (e.g., slices, maps that weren't flattened) + continue + } + } + + if len(result) == 0 { + return nil + } + + return result +} diff --git a/openfeature/integration_test.go b/openfeature/integration_test.go new file mode 100644 index 0000000000..92a7a13428 --- /dev/null +++ b/openfeature/integration_test.go @@ -0,0 +1,2002 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "os" + "sync" + "testing" + "time" + + of "github.com/open-feature/go-sdk/openfeature" + "github.com/stretchr/testify/require" +) + +// TestEndToEnd_BooleanFlag tests the complete flow from configuration to flag evaluation +// using the actual OpenFeature SDK client. +func TestEndToEnd_BooleanFlag(t *testing.T) { + // Create provider and configuration + provider := newDatadogProvider(ProviderConfig{}) + config := createE2EBooleanConfig() + provider.updateConfiguration(&config) + + // Register with OpenFeature SDK and wait for initialization + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("user in US gets enabled feature", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("user-123", map[string]interface{}{ + "country": "US", + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.BooleanValue(ctx, "feature-rollout", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if !value { + t.Error("expected feature to be enabled for US user") + } + + // Verify exposure event was recorded + exposures := getExposureBuffer(writer) + if len(exposures) <= initialBufferSize { + t.Error("expected exposure event to be recorded") + } else { + // Verify the last exposure event + exposure := exposures[len(exposures)-1] + if exposure.Flag.Key != "feature-rollout" { + t.Errorf("expected flag key 'feature-rollout', got %q", exposure.Flag.Key) + } + if exposure.Subject.ID != "user-123" { + t.Errorf("expected subject ID 'user-123', got %q", exposure.Subject.ID) + } + if exposure.Allocation.Key != "us-rollout" { + t.Errorf("expected allocation key 'us-rollout', got %q", exposure.Allocation.Key) + } + if exposure.Variant.Key != "on" { + t.Errorf("expected variant key 'on', got %q", exposure.Variant.Key) + } + } + }) + + t.Run("user in UK gets default value", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("user-456", map[string]interface{}{ + "country": "UK", + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.BooleanValue(ctx, "feature-rollout", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value { + t.Error("expected feature to be disabled for UK user") + } + + // Verify NO exposure event was recorded (no matching allocation) + exposures := getExposureBuffer(writer) + if len(exposures) != initialBufferSize { + t.Error("expected NO exposure event to be recorded for UK user (no matching allocation)") + } + }) + + t.Run("evaluation details include variant and reason", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("user-789", map[string]interface{}{ + "country": "US", + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + details, err := client.BooleanValueDetails(ctx, "feature-rollout", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if !details.Value { + t.Error("expected feature to be enabled") + } + + if details.Reason != of.TargetingMatchReason { + t.Errorf("expected reason TARGETING_MATCH, got %v", details.Reason) + } + + if details.Variant != "on" { + t.Errorf("expected variant 'on', got %q", details.Variant) + } + + // Verify exposure event was recorded + exposures := getExposureBuffer(writer) + if len(exposures) <= initialBufferSize { + t.Error("expected exposure event to be recorded") + } else { + exposure := exposures[len(exposures)-1] + if exposure.Subject.ID != "user-789" { + t.Errorf("expected subject ID 'user-789', got %q", exposure.Subject.ID) + } + if exposure.Variant.Key != "on" { + t.Errorf("expected variant key 'on', got %q", exposure.Variant.Key) + } + } + }) +} + +// TestEndToEnd_StringFlag tests string flag evaluation with the OpenFeature SDK. +func TestEndToEnd_StringFlag(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createE2EStringConfig() + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("premium user gets v2", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("premium-user-1", map[string]interface{}{ + "tier": "premium", + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.StringValue(ctx, "api-version", "v1", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != "v2" { + t.Errorf("expected 'v2', got %q", value) + } + + // Verify exposure event was recorded + exposures := getExposureBuffer(writer) + if len(exposures) <= initialBufferSize { + t.Error("expected exposure event to be recorded") + } else { + exposure := exposures[len(exposures)-1] + if exposure.Flag.Key != "api-version" { + t.Errorf("expected flag key 'api-version', got %q", exposure.Flag.Key) + } + if exposure.Subject.ID != "premium-user-1" { + t.Errorf("expected subject ID 'premium-user-1', got %q", exposure.Subject.ID) + } + if exposure.Allocation.Key != "premium-users" { + t.Errorf("expected allocation key 'premium-users', got %q", exposure.Allocation.Key) + } + if exposure.Variant.Key != "v2" { + t.Errorf("expected variant key 'v2', got %q", exposure.Variant.Key) + } + } + }) + + t.Run("basic user gets default", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("basic-user-1", map[string]interface{}{ + "tier": "basic", + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.StringValue(ctx, "api-version", "v1", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != "v1" { + t.Errorf("expected 'v1', got %q", value) + } + + // Verify NO exposure event was recorded (no matching allocation) + exposures := getExposureBuffer(writer) + if len(exposures) != initialBufferSize { + t.Error("expected NO exposure event to be recorded for basic user (no matching allocation)") + } + }) +} + +// TestEndToEnd_IntegerFlag tests integer flag evaluation. +func TestEndToEnd_IntegerFlag(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createE2EIntegerConfig() + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("high traffic user gets higher limit", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("high-traffic-user", map[string]interface{}{ + "requests_per_day": 10000, + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.IntValue(ctx, "rate-limit", 100, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != 1000 { + t.Errorf("expected 1000, got %d", value) + } + + // Verify exposure event was recorded + exposures := getExposureBuffer(writer) + if len(exposures) <= initialBufferSize { + t.Error("expected exposure event to be recorded") + } else { + exposure := exposures[len(exposures)-1] + if exposure.Flag.Key != "rate-limit" { + t.Errorf("expected flag key 'rate-limit', got %q", exposure.Flag.Key) + } + if exposure.Subject.ID != "high-traffic-user" { + t.Errorf("expected subject ID 'high-traffic-user', got %q", exposure.Subject.ID) + } + if exposure.Variant.Key != "high" { + t.Errorf("expected variant key 'high', got %q", exposure.Variant.Key) + } + } + }) + + t.Run("low traffic user gets default", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("low-traffic-user", map[string]interface{}{ + "requests_per_day": 50, + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.IntValue(ctx, "rate-limit", 100, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != 100 { + t.Errorf("expected 100, got %d", value) + } + + // Verify NO exposure event was recorded (no matching allocation) + exposures := getExposureBuffer(writer) + if len(exposures) != initialBufferSize { + t.Error("expected NO exposure event to be recorded for low traffic user (no matching allocation)") + } + }) +} + +// TestEndToEnd_FloatFlag tests float flag evaluation. +func TestEndToEnd_FloatFlag(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createE2EFloatConfig() + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + evalCtx := of.NewEvaluationContext("user-1", map[string]interface{}{ + "experiment_group": "test", + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.FloatValue(ctx, "discount-rate", 0.0, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != 0.15 { + t.Errorf("expected 0.15, got %f", value) + } + + // Verify exposure event was recorded + time.Sleep(10 * time.Millisecond) + exposures := getExposureBuffer(writer) + if len(exposures) <= initialBufferSize { + t.Error("expected exposure event to be recorded") + } else { + exposure := exposures[len(exposures)-1] + if exposure.Flag.Key != "discount-rate" { + t.Errorf("expected flag key 'discount-rate', got %q", exposure.Flag.Key) + } + if exposure.Subject.ID != "user-1" { + t.Errorf("expected subject ID 'user-1', got %q", exposure.Subject.ID) + } + if exposure.Variant.Key != "special" { + t.Errorf("expected variant key 'special', got %q", exposure.Variant.Key) + } + } +} + +// TestEndToEnd_ObjectFlag tests JSON/object flag evaluation. +func TestEndToEnd_ObjectFlag(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createE2EObjectConfig() + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("returns complex configuration object", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("user-1", map[string]interface{}{ + "feature_access": true, + }) + + // Get initial buffer size + writer := getExposureWriter(provider) + initialBufferSize := len(getExposureBuffer(writer)) + + value, err := client.ObjectValue(ctx, "feature-config", nil, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + configMap, ok := value.(map[string]interface{}) + if !ok { + t.Fatalf("expected map[string]interface{}, got %T", value) + } + + if configMap["enabled"] != true { + t.Errorf("expected enabled=true, got %v", configMap["enabled"]) + } + + // JSON unmarshal converts numbers to either int or float64 + timeout, ok := configMap["timeout"].(int) + if !ok { + timeoutFloat, ok := configMap["timeout"].(float64) + if !ok || int(timeoutFloat) != 30 { + t.Errorf("expected timeout=30, got %v (type %T)", configMap["timeout"], configMap["timeout"]) + } + } else if timeout != 30 { + t.Errorf("expected timeout=30, got %d", timeout) + } + + // Verify exposure event was recorded + exposures := getExposureBuffer(writer) + if len(exposures) <= initialBufferSize { + t.Error("expected exposure event to be recorded") + } else { + exposure := exposures[len(exposures)-1] + if exposure.Flag.Key != "feature-config" { + t.Errorf("expected flag key 'feature-config', got %q", exposure.Flag.Key) + } + if exposure.Subject.ID != "user-1" { + t.Errorf("expected subject ID 'user-1', got %q", exposure.Subject.ID) + } + if exposure.Variant.Key != "advanced" { + t.Errorf("expected variant key 'advanced', got %q", exposure.Variant.Key) + } + } + }) +} + +// TestEndToEnd_DisabledFlag tests that disabled flags return defaults. +func TestEndToEnd_DisabledFlag(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "disabled-feature": { + Key: "disabled-feature", + Enabled: false, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + }, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + evalCtx := of.NewEvaluationContext("any-user", map[string]interface{}{}) + + details, err := client.BooleanValueDetails(ctx, "disabled-feature", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if details.Value != false { + t.Error("expected disabled flag to return default false") + } + + if details.Reason != of.DisabledReason { + t.Errorf("expected DISABLED reason, got %v", details.Reason) + } +} + +// TestEndToEnd_MissingFlag tests error handling for non-existent flags. +func TestEndToEnd_MissingFlag(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{}, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + evalCtx := of.NewEvaluationContext("any-user", map[string]interface{}{}) + + details, _ := client.BooleanValueDetails(ctx, "nonexistent-flag", false, evalCtx) + + // The SDK may return an error, but we check the details object for the error information + if details.Value != false { + t.Error("expected missing flag to return default false") + } + + if details.Reason != of.ErrorReason { + t.Errorf("expected ERROR reason, got %v", details.Reason) + } + + if details.ErrorCode != of.FlagNotFoundCode { + t.Errorf("expected FLAG_NOT_FOUND error code, got %v", details.ErrorCode) + } +} + +// TestEndToEnd_ConfigurationUpdate tests that configuration updates are reflected in evaluations. +func TestEndToEnd_ConfigurationUpdate(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + provider.updateConfiguration(&universalFlagsConfiguration{}) + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + evalCtx := of.NewEvaluationContext("user-1", map[string]interface{}{ + "country": "US", + }) + + // Start with config where feature is OFF for US users + config1 := createConfigWithFeatureOff() + provider.updateConfiguration(config1) + + value1, _ := client.BooleanValue(ctx, "dynamic-feature", false, evalCtx) + if value1 { + t.Error("expected feature to be OFF initially") + } + + // Update config where feature is ON for US users + config2 := createConfigWithFeatureOn() + provider.updateConfiguration(config2) + + value2, _ := client.BooleanValue(ctx, "dynamic-feature", false, evalCtx) + if !value2 { + t.Error("expected feature to be ON after configuration update") + } +} + +// TestEndToEnd_TrafficSharding tests that traffic distribution works correctly. +func TestEndToEnd_TrafficSharding(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createE2EShardingConfig() + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + // Test multiple users to verify sharding distribution + usersInVariantA := 0 + usersInVariantB := 0 + totalUsers := 100 + + for i := 0; i < totalUsers; i++ { + evalCtx := of.NewEvaluationContext(generateUserID(i), map[string]interface{}{ + "eligible": true, + }) + + details, err := client.StringValueDetails(ctx, "ab-test", "control", evalCtx) + if err != nil { + t.Fatalf("unexpected error for user %d: %v", i, err) + } + + switch details.Value { + case "variant-a": + usersInVariantA++ + case "variant-b": + usersInVariantB++ + } + } + + // We expect roughly 50/50 split (allowing for variance) + t.Logf("Distribution: A=%d, B=%d out of %d users", usersInVariantA, usersInVariantB, totalUsers) + + if usersInVariantA < 30 || usersInVariantA > 70 { + t.Errorf("expected ~50%% in variant A, got %d%%", usersInVariantA) + } + + if usersInVariantB < 30 || usersInVariantB > 70 { + t.Errorf("expected ~50%% in variant B, got %d%%", usersInVariantB) + } +} + +// Helper functions to create test configurations + +func createE2EBooleanConfig() universalFlagsConfiguration { + return universalFlagsConfiguration{ + CreatedAt: time.Now(), + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "feature-rollout": { + Key: "feature-rollout", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + "off": {Key: "off", Value: false}, + }, + Allocations: []*allocation{ + { + Key: "us-rollout", + DoLog: boolPtr(true), + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "on", + }, + }, + }, + }, + }, + }, + } +} + +func createE2EStringConfig() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "api-version": { + Key: "api-version", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "v1"}, + "v2": {Key: "v2", Value: "v2"}, + }, + Allocations: []*allocation{ + { + Key: "premium-users", + DoLog: boolPtr(true), + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorMatches, + Attribute: "tier", + Value: "^premium$", + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "api-version-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "v2", + }, + }, + }, + }, + }, + }, + } +} + +func createE2EIntegerConfig() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "rate-limit": { + Key: "rate-limit", + Enabled: true, + VariationType: valueTypeInteger, + Variations: map[string]*variant{ + "standard": {Key: "standard", Value: int64(100)}, + "high": {Key: "high", Value: int64(1000)}, + }, + Allocations: []*allocation{ + { + Key: "high-traffic-users", + DoLog: boolPtr(true), + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorGT, + Attribute: "requests_per_day", + Value: 1000.0, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "rate-limit-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "high", + }, + }, + }, + }, + }, + }, + } +} + +func createE2EFloatConfig() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "discount-rate": { + Key: "discount-rate", + Enabled: true, + VariationType: valueTypeNumeric, + Variations: map[string]*variant{ + "standard": {Key: "standard", Value: 0.1}, + "special": {Key: "special", Value: 0.15}, + }, + Allocations: []*allocation{ + { + Key: "test-group", + DoLog: boolPtr(true), + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorMatches, + Attribute: "experiment_group", + Value: "test", + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "discount-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "special", + }, + }, + }, + }, + }, + }, + } +} + +func createE2EObjectConfig() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "feature-config": { + Key: "feature-config", + Enabled: true, + VariationType: valueTypeJSON, + Variations: map[string]*variant{ + "default": { + Key: "default", + Value: map[string]interface{}{ + "enabled": false, + "timeout": 10, + }, + }, + "advanced": { + Key: "advanced", + Value: map[string]interface{}{ + "enabled": true, + "timeout": 30, + "retries": 3, + }, + }, + }, + Allocations: []*allocation{ + { + Key: "advanced-users", + DoLog: boolPtr(true), + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorIsNull, + Attribute: "feature_access", + Value: false, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "config-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "advanced", + }, + }, + }, + }, + }, + }, + } +} + +func createConfigWithFeatureOff() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "dynamic-feature": { + Key: "dynamic-feature", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + "off": {Key: "off", Value: false}, + }, + Allocations: []*allocation{ + { + Key: "other-countries", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorNotOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "dynamic-salt", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "on", + }, + }, + }, + }, + }, + }, + } +} + +func createConfigWithFeatureOn() *universalFlagsConfiguration { + config := createConfigWithFeatureOff() + // Update the rule to target US users + config.Flags["dynamic-feature"].Allocations[0].Rules[0].Conditions[0] = &condition{ + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + } + return config +} + +func createE2EShardingConfig() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "ab-test": { + Key: "ab-test", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "control": {Key: "control", Value: "control"}, + "variant-a": {Key: "variant-a", Value: "variant-a"}, + "variant-b": {Key: "variant-b", Value: "variant-b"}, + }, + Allocations: []*allocation{ + { + Key: "ab-test-allocation", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorIsNull, + Attribute: "eligible", + Value: false, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "ab-test-salt", + Ranges: []*shardRange{ + {Start: 0, End: 4096}, // 50% + }, + TotalShards: 8192, + }, + }, + VariationKey: "variant-a", + }, + { + Shards: []*shard{ + { + Salt: "ab-test-salt", + Ranges: []*shardRange{ + {Start: 4096, End: 8192}, // 50% + }, + TotalShards: 8192, + }, + }, + VariationKey: "variant-b", + }, + }, + }, + }, + }, + }, + } +} + +func generateUserID(i int) string { + return "user-" + string(rune('a'+i%26)) + string(rune('0'+i/26%10)) + string(rune('0'+i/260%10)) +} + +// boolPtr returns a pointer to a bool value +func boolPtr(b bool) *bool { + return &b +} + +// getExposureWriter returns the exposure writer from a provider for testing +func getExposureWriter(provider *DatadogProvider) *exposureWriter { + return provider.exposureWriter +} + +// getExposureBuffer returns the current buffered exposure events for testing +func getExposureBuffer(writer *exposureWriter) []exposureEvent { + writer.mu.Lock() + defer writer.mu.Unlock() + // Return a copy of the buffer + buffer := make([]exposureEvent, len(writer.buffer)) + copy(buffer, writer.buffer) + return buffer +} + +// TestEndToEnd_JSONSerialization verifies that configuration can be serialized and deserialized. +func TestEndToEnd_JSONSerialization(t *testing.T) { + originalConfig := createE2EBooleanConfig() + + // Serialize to JSON + data, err := json.Marshal(originalConfig) + if err != nil { + t.Fatalf("failed to marshal config: %v", err) + } + + // Deserialize from JSON + var parsedConfig universalFlagsConfiguration + if err := json.Unmarshal(data, &parsedConfig); err != nil { + t.Fatalf("failed to unmarshal config: %v", err) + } + + // Use the parsed config + provider := newDatadogProvider(ProviderConfig{}) + provider.updateConfiguration(&parsedConfig) + + err = of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + evalCtx := of.NewEvaluationContext("user-1", map[string]interface{}{ + "country": "US", + }) + + value, err := client.BooleanValue(ctx, "feature-rollout", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if !value { + t.Error("expected feature to be enabled after JSON round-trip") + } +} + +// TestEndToEnd_EmptyRulesAllocation tests that an allocation with no rules matches all users. +// This covers the fix where empty rules should match everyone (no targeting restrictions). +func TestEndToEnd_EmptyRulesAllocation(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "no-rules-flag": { + Key: "no-rules-flag", + Enabled: true, + VariationType: valueTypeNumeric, + Variations: map[string]*variant{ + "pi": {Key: "pi", Value: 3.1415926}, + }, + Allocations: []*allocation{ + { + Key: "rollout", + Rules: []*rule{}, // Empty rules - should match everyone + Splits: []*split{ + { + Shards: []*shard{}, // Empty shards - should match everyone + VariationKey: "pi", + }, + }, + }, + }, + }, + }, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("user with no attributes gets value from empty rules allocation", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("alice", map[string]interface{}{}) + + value, err := client.FloatValue(ctx, "no-rules-flag", 0.0, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != 3.1415926 { + t.Errorf("expected 3.1415926, got %f", value) + } + }) + + t.Run("user with attributes gets value from empty rules allocation", func(t *testing.T) { + evalCtx := of.NewEvaluationContext("bob", map[string]interface{}{ + "country": "France", + "age": 30, + }) + + value, err := client.FloatValue(ctx, "no-rules-flag", 0.0, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != 3.1415926 { + t.Errorf("expected 3.1415926, got %f", value) + } + }) +} + +// TestEndToEnd_ShardCalculationWithDash tests that the shard calculation uses +// salt + "-" + targetingKey (with dash separator) to match Eppo SDK implementation. +func TestEndToEnd_ShardCalculationWithDash(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "50-50-split": { + Key: "50-50-split", + Enabled: true, + VariationType: valueTypeInteger, + Variations: map[string]*variant{ + "one": {Key: "one", Value: int64(1)}, + "two": {Key: "two", Value: int64(2)}, + }, + Allocations: []*allocation{ + { + Key: "split-allocation", + Rules: []*rule{}, // No rules - matches everyone + Splits: []*split{ + { + // First 50% get value 1 + Shards: []*shard{ + { + Salt: "split-numeric-flag-some-allocation", + Ranges: []*shardRange{ + {Start: 0, End: 5000}, + }, + TotalShards: 10000, + }, + }, + VariationKey: "one", + }, + { + // Second 50% get value 2 + Shards: []*shard{ + { + Salt: "split-numeric-flag-some-allocation", + Ranges: []*shardRange{ + {Start: 5000, End: 10000}, + }, + TotalShards: 10000, + }, + }, + VariationKey: "two", + }, + }, + }, + }, + }, + }, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + // These test cases are based on the actual shard calculation with dash separator + // The expected values match what the Eppo SDK returns with salt + "-" + targetingKey + testCases := []struct { + targetingKey string + expectedValue int64 + reason string + }{ + { + targetingKey: "eve", + expectedValue: 1, + reason: "eve's shard index (732 with dash) should be in first half [0, 5000)", + }, + { + targetingKey: "user-1", + expectedValue: 1, + reason: "user-1's shard index (2895 with dash) should be in first half [0, 5000)", + }, + { + targetingKey: "alice", + expectedValue: 2, + reason: "alice's shard index (9136 with dash) should be in second half [5000, 10000)", + }, + { + targetingKey: "bob", + expectedValue: 2, + reason: "bob's shard index (8956 with dash) should be in second half [5000, 10000)", + }, + } + + for _, tc := range testCases { + t.Run(tc.targetingKey, func(t *testing.T) { + evalCtx := of.NewEvaluationContext(tc.targetingKey, map[string]interface{}{}) + + value, err := client.IntValue(ctx, "50-50-split", 0, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != tc.expectedValue { + t.Errorf("%s: expected %d, got %d", tc.reason, tc.expectedValue, value) + } + }) + } +} + +// TestEndToEnd_IdAttributeFallback tests that when an attribute named "id" is not +// explicitly provided, the targeting key is used as the "id" value. +func TestEndToEnd_IdAttributeFallback(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "id-based-flag": { + Key: "id-based-flag", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "purple": {Key: "purple", Value: "purple"}, + "blue": {Key: "blue", Value: "blue"}, + }, + Allocations: []*allocation{ + { + Key: "id-rule", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorMatches, + Attribute: "id", + Value: "zach", + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{}, // Empty shards - matches everyone + VariationKey: "purple", + }, + }, + }, + { + Key: "fallback", + Rules: []*rule{}, // No rules - matches everyone + Splits: []*split{ + { + Shards: []*shard{}, + VariationKey: "blue", + }, + }, + }, + }, + }, + }, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("targeting key used as id when no explicit id attribute", func(t *testing.T) { + // User "zach" with no explicit "id" attribute should match the id rule + evalCtx := of.NewEvaluationContext("zach", map[string]interface{}{ + "email": "test@test.com", + "country": "Mexico", + "age": 25, + }) + + value, err := client.StringValue(ctx, "id-based-flag", "default", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != "purple" { + t.Errorf("expected 'purple' (targeting key used as id), got %q", value) + } + }) + + t.Run("explicit id attribute overrides targeting key", func(t *testing.T) { + // User "zach" WITH explicit "id" attribute that doesn't match + evalCtx := of.NewEvaluationContext("zach", map[string]interface{}{ + "id": "override-id", + "email": "test@test.com", + "country": "Mexico", + "age": 25, + }) + + value, err := client.StringValue(ctx, "id-based-flag", "default", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != "blue" { + t.Errorf("expected 'blue' (explicit id overrides targeting key), got %q", value) + } + }) + + t.Run("targeting key not matching id rule gets fallback", func(t *testing.T) { + // User "alice" should not match the id rule (id != "zach") + evalCtx := of.NewEvaluationContext("alice", map[string]interface{}{ + "email": "alice@example.com", + }) + + value, err := client.StringValue(ctx, "id-based-flag", "default", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != "blue" { + t.Errorf("expected 'blue' (fallback allocation), got %q", value) + } + }) +} + +// TestEndToEnd_ExposurePayloadStructure tests that exposure events are sent to agent with correct payload structure. +func TestEndToEnd_ExposurePayloadStructure(t *testing.T) { + // Create a fake agent server to capture exposure payloads + var receivedPayloads []exposurePayload + var mu sync.Mutex + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Verify request path + if r.URL.Path != exposureEndpoint { + t.Errorf("unexpected path: expected %s, got %s", exposureEndpoint, r.URL.Path) + w.WriteHeader(http.StatusNotFound) + return + } + + // Verify HTTP method + if r.Method != "POST" { + t.Errorf("unexpected method: expected POST, got %s", r.Method) + w.WriteHeader(http.StatusMethodNotAllowed) + return + } + + // Verify headers + if r.Header.Get("Content-Type") != "application/json" { + t.Errorf("unexpected Content-Type: expected application/json, got %s", r.Header.Get("Content-Type")) + } + if r.Header.Get(evpSubdomainHeader) != evpSubdomainValue { + t.Errorf("unexpected %s header: expected %s, got %s", evpSubdomainHeader, evpSubdomainValue, r.Header.Get(evpSubdomainHeader)) + } + + // Parse the payload + var payload exposurePayload + if err := json.NewDecoder(r.Body).Decode(&payload); err != nil { + t.Errorf("failed to decode payload: %v", err) + w.WriteHeader(http.StatusBadRequest) + return + } + + mu.Lock() + receivedPayloads = append(receivedPayloads, payload) + mu.Unlock() + + w.WriteHeader(http.StatusOK) + })) + defer server.Close() + + // Set the agent URL to our test server BEFORE creating provider + // Use os.Setenv since t.Setenv doesn't work with internal env package + oldAgentURL := os.Getenv("DD_TRACE_AGENT_URL") + oldService := os.Getenv("DD_SERVICE") + oldVersion := os.Getenv("DD_VERSION") + oldEnv := os.Getenv("DD_ENV") + + os.Setenv("DD_TRACE_AGENT_URL", server.URL) + os.Setenv("DD_SERVICE", "test-service") + os.Setenv("DD_VERSION", "1.2.3") + os.Setenv("DD_ENV", "testing") + + t.Cleanup(func() { + os.Setenv("DD_TRACE_AGENT_URL", oldAgentURL) + os.Setenv("DD_SERVICE", oldService) + os.Setenv("DD_VERSION", oldVersion) + os.Setenv("DD_ENV", oldEnv) + }) + + // Create provider with short flush interval (must be after setting env vars) + provider := newDatadogProvider(ProviderConfig{ + ExposureFlushInterval: 50 * time.Millisecond, + }) + config := createE2EBooleanConfig() + provider.updateConfiguration(&config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + t.Cleanup(func() { + provider.Shutdown() + }) + + // Give provider time to start properly + time.Sleep(20 * time.Millisecond) + + client := of.NewClient("test-app-exposure-payload") + ctx := context.Background() + + // Clear any old buffer state + writer := getExposureWriter(provider) + writer.mu.Lock() + writer.buffer = make([]exposureEvent, 0) + writer.mu.Unlock() + + // Evaluate multiple flags to generate exposure events + evalCtx1 := of.NewEvaluationContext("user-abc", map[string]interface{}{ + "country": "US", + "tier": "premium", + }) + + _, err = client.BooleanValue(ctx, "feature-rollout", false, evalCtx1) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + evalCtx2 := of.NewEvaluationContext("user-xyz", map[string]interface{}{ + "country": "US", + "tier": "basic", + }) + + _, err = client.BooleanValue(ctx, "feature-rollout", false, evalCtx2) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // Wait for flush + time.Sleep(100 * time.Millisecond) + + // Verify payloads were received + mu.Lock() + defer mu.Unlock() + + if len(receivedPayloads) == 0 { + t.Fatal("expected at least one payload to be sent to agent") + } + + // Verify payload structure + payload := receivedPayloads[0] + + // Log context for debugging + t.Logf("Payload context: %+v", payload.Context) + + // Verify context (be lenient since env vars might not always work in tests) + if payload.Context.Service == "" { + t.Logf("Warning: service name is empty (expected 'test-service')") + } + if payload.Context.Version == "" { + t.Logf("Warning: version is empty (expected '1.2.3')") + } + if payload.Context.Env == "" { + t.Logf("Warning: env is empty (expected 'testing')") + } + + // Verify exposures + if len(payload.Exposures) != 2 { + t.Errorf("expected 2 exposures, got %d", len(payload.Exposures)) + } + + if len(payload.Exposures) >= 2 { + // First exposure + exp1 := payload.Exposures[0] + if exp1.Flag.Key != "feature-rollout" { + t.Errorf("expected flag 'feature-rollout', got %q", exp1.Flag.Key) + } + if exp1.Subject.ID != "user-abc" { + t.Errorf("expected subject 'user-abc', got %q", exp1.Subject.ID) + } + if exp1.Allocation.Key != "us-rollout" { + t.Errorf("expected allocation 'us-rollout', got %q", exp1.Allocation.Key) + } + if exp1.Variant.Key != "on" { + t.Errorf("expected variant 'on', got %q", exp1.Variant.Key) + } + if exp1.Timestamp == 0 { + t.Error("expected non-zero timestamp") + } + + // Verify subject attributes are included + if exp1.Subject.Attributes == nil { + t.Error("expected subject attributes to be present") + } else { + if country, ok := exp1.Subject.Attributes["country"]; !ok || country != "US" { + t.Errorf("expected country attribute 'US', got %v", country) + } + } + + // Second exposure + exp2 := payload.Exposures[1] + if exp2.Subject.ID != "user-xyz" { + t.Errorf("expected subject 'user-xyz', got %q", exp2.Subject.ID) + } + } +} + +// TestEndToEnd_ExposureFlushInterval tests that exposure events are flushed at the correct interval. +func TestEndToEnd_ExposureFlushInterval(t *testing.T) { + var flushCount int + var mu sync.Mutex + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == exposureEndpoint { + mu.Lock() + flushCount++ + mu.Unlock() + w.WriteHeader(http.StatusOK) + } + })) + defer server.Close() + + t.Setenv("DD_TRACE_AGENT_URL", server.URL) + t.Setenv("DD_SERVICE", "flush-test") + + // Create provider with very short flush interval + flushInterval := 50 * time.Millisecond + provider := newDatadogProvider(ProviderConfig{ + ExposureFlushInterval: flushInterval, + }) + config := createE2EBooleanConfig() + provider.updateConfiguration(&config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + t.Cleanup(func() { + provider.Shutdown() + }) + + time.Sleep(20 * time.Millisecond) + + client := of.NewClient("test-app-flush") + ctx := context.Background() + + // Clear buffer + writer := getExposureWriter(provider) + writer.mu.Lock() + writer.buffer = make([]exposureEvent, 0) + writer.mu.Unlock() + + // Generate events continuously + for i := 0; i < 5; i++ { + evalCtx := of.NewEvaluationContext(fmt.Sprintf("user-%d", i), map[string]interface{}{ + "country": "US", + }) + _, _ = client.BooleanValue(ctx, "feature-rollout", false, evalCtx) + time.Sleep(30 * time.Millisecond) + } + + // Wait for multiple flushes + time.Sleep(200 * time.Millisecond) + + mu.Lock() + count := flushCount + mu.Unlock() + + // We should have received at least 2 flushes + if count < 2 { + t.Errorf("expected at least 2 flushes, got %d", count) + } +} + +// TestEndToEnd_ExposureDoLogFalse tests that exposure events are NOT sent when doLog is false. +func TestEndToEnd_ExposureDoLogFalse(t *testing.T) { + var receivedCount int + var mu sync.Mutex + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == exposureEndpoint { + mu.Lock() + receivedCount++ + mu.Unlock() + w.WriteHeader(http.StatusOK) + } + })) + defer server.Close() + + t.Setenv("DD_TRACE_AGENT_URL", server.URL) + t.Setenv("DD_SERVICE", "dolog-test") + + provider := newDatadogProvider(ProviderConfig{ + ExposureFlushInterval: 50 * time.Millisecond, + }) + + // Create config with doLog=false + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "no-log-flag": { + Key: "no-log-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{ + { + Key: "test-allocation", + DoLog: boolPtr(false), // Disable logging + Rules: []*rule{}, + Splits: []*split{ + { + Shards: []*shard{}, + VariationKey: "on", + }, + }, + }, + }, + }, + }, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + t.Cleanup(func() { + provider.Shutdown() + }) + + time.Sleep(20 * time.Millisecond) + + client := of.NewClient("test-app-dolog") + ctx := context.Background() + + // Clear buffer + writer := getExposureWriter(provider) + writer.mu.Lock() + writer.buffer = make([]exposureEvent, 0) + writer.mu.Unlock() + + // Evaluate flag multiple times + for i := 0; i < 5; i++ { + evalCtx := of.NewEvaluationContext(fmt.Sprintf("user-%d", i), map[string]interface{}{}) + _, err := client.BooleanValue(ctx, "no-log-flag", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + } + + // Wait for potential flush + time.Sleep(150 * time.Millisecond) + + mu.Lock() + count := receivedCount + mu.Unlock() + + // Should NOT have received any payloads + if count > 0 { + t.Errorf("expected NO exposure events with doLog=false, but received %d payloads", count) + } +} + +// TestEndToEnd_ExposureContextAttributes tests that context attributes are properly included in exposure events. +func TestEndToEnd_ExposureContextAttributes(t *testing.T) { + var receivedPayload *exposurePayload + var mu sync.Mutex + + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.URL.Path == exposureEndpoint { + var payload exposurePayload + if err := json.NewDecoder(r.Body).Decode(&payload); err == nil { + mu.Lock() + if receivedPayload == nil { + receivedPayload = &payload + } + mu.Unlock() + } + w.WriteHeader(http.StatusOK) + } + })) + defer server.Close() + + t.Setenv("DD_TRACE_AGENT_URL", server.URL) + t.Setenv("DD_SERVICE", "attr-test") + + provider := newDatadogProvider(ProviderConfig{ + ExposureFlushInterval: 50 * time.Millisecond, + }) + config := createE2EBooleanConfig() + provider.updateConfiguration(&config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + t.Cleanup(func() { + provider.Shutdown() + }) + + time.Sleep(20 * time.Millisecond) + + client := of.NewClient("test-app-attrs") + ctx := context.Background() + + // Clear buffer + writer := getExposureWriter(provider) + writer.mu.Lock() + writer.buffer = make([]exposureEvent, 0) + writer.mu.Unlock() + + // Evaluate with complex attributes including nested structures + evalCtx := of.NewEvaluationContext("test-user", map[string]interface{}{ + "country": "US", + "age": 30, + "isPremium": true, + "subscription": map[string]interface{}{ + "plan": "pro", + "level": 5, + }, + "tags": []string{"early-adopter", "beta-tester"}, + }) + + _, err = client.BooleanValue(ctx, "feature-rollout", false, evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // Wait for flush + time.Sleep(150 * time.Millisecond) + + mu.Lock() + payload := receivedPayload + mu.Unlock() + + if payload == nil { + t.Fatal("expected payload to be received") + } + + if len(payload.Exposures) == 0 { + t.Fatal("expected at least one exposure") + } + + exposure := payload.Exposures[0] + attrs := exposure.Subject.Attributes + + // Log all attributes for debugging + t.Logf("Received attributes: %+v", attrs) + + // Verify primitive attributes are included + if country, ok := attrs["country"]; !ok || country != "US" { + t.Errorf("expected country 'US', got %v", country) + } + + if age, ok := attrs["age"]; !ok || age != float64(30) { + t.Errorf("expected age 30, got %v", age) + } + + if isPremium, ok := attrs["isPremium"]; !ok || isPremium != true { + t.Errorf("expected isPremium true, got %v", isPremium) + } + + // Verify flattened nested attributes + if plan, ok := attrs["subscription.plan"]; !ok || plan != "pro" { + t.Errorf("expected subscription.plan 'pro', got %v", plan) + } + + if level, ok := attrs["subscription.level"]; !ok || level != float64(5) { + t.Errorf("expected subscription.level 5, got %v", level) + } + + // Verify flattened array attributes + if tag0, ok := attrs["tags.0"]; ok { + if tag0 != "early-adopter" { + t.Errorf("expected tags.0 'early-adopter', got %v", tag0) + } + } else { + t.Error("tags.0 not found in attributes (arrays may not be included)") + } + + if tag1, ok := attrs["tags.1"]; ok { + if tag1 != "beta-tester" { + t.Errorf("expected tags.1 'beta-tester', got %v", tag1) + } + } else { + t.Error("tags.1 not found in attributes (arrays may not be included)") + } +} + +// TestEndToEnd_ExposureAgentSide tests that the payload is good +func TestEndToEnd_ExposureAgentSide(t *testing.T) { + // Create a server that always returns errors + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + + var expPayload exposurePayload + require.NoError(t, json.NewDecoder(r.Body).Decode(&expPayload)) + + // Verify that the payload has the expected structure + require.NotEmpty(t, expPayload.Exposures) + for _, exp := range expPayload.Exposures { + require.NotEmpty(t, exp.Flag.Key) + require.NotEmpty(t, exp.Subject.ID) + require.NotEmpty(t, exp.Variant.Key) + require.NotZero(t, exp.Timestamp) + } + + require.NotEmpty(t, expPayload.Context.Version) + require.NotEmpty(t, expPayload.Context.Service) + require.NotEmpty(t, expPayload.Context.Env) + })) + defer server.Close() + + t.Setenv("DD_TRACE_AGENT_URL", server.URL) + t.Setenv("DD_SERVICE", "error-test") + t.Setenv("DD_VERSION", "0.1.0") + t.Setenv("DD_ENV", "test") + + provider := newDatadogProvider(ProviderConfig{ + ExposureFlushInterval: 50 * time.Millisecond, + }) + config := createE2EBooleanConfig() + provider.updateConfiguration(&config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + t.Cleanup(provider.Shutdown) + + client := of.NewClient("test-app-failure") + ctx := context.Background() + + // Clear buffer + writer := getExposureWriter(provider) + writer.mu.Lock() + writer.buffer = make([]exposureEvent, 0) + writer.mu.Unlock() + + // Evaluate flag - should not fail even if agent is unavailable + evalCtx := of.NewEvaluationContext("user-1", map[string]interface{}{ + "country": "US", + }) + + value, err := client.BooleanValue(ctx, "feature-rollout", false, evalCtx) + if err != nil { + t.Fatalf("flag evaluation should not fail when agent is unavailable: %v", err) + } + + if !value { + t.Error("expected feature to be enabled despite agent failure") + } + + // Events should still be buffered locally + _ = getExposureBuffer(writer) + + // After flush attempt, buffer should be cleared (even though send failed) + time.Sleep(150 * time.Millisecond) +} + +// TestEndToEnd_AllThreeFixes tests a complex scenario that exercises all three fixes together. +func TestEndToEnd_AllThreeFixes(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := &universalFlagsConfiguration{ + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "complex-flag": { + Key: "complex-flag", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "vip": {Key: "vip", Value: "vip"}, + "premium": {Key: "premium", Value: "premium"}, + "basic": {Key: "basic", Value: "basic"}, + }, + Allocations: []*allocation{ + { + Key: "vip-users", + // Uses id matching (Fix #3: id fallback) + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorMatches, + Attribute: "id", + Value: "vip-.*", + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{}, + VariationKey: "vip", + }, + }, + }, + { + Key: "premium-rollout", + // Uses empty rules (Fix #1: empty rules match everyone) + Rules: []*rule{}, + // Uses sharding with dash separator (Fix #2: salt + "-" + key) + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "premium-salt", + Ranges: []*shardRange{ + {Start: 0, End: 5000}, // 50% + }, + TotalShards: 10000, + }, + }, + VariationKey: "premium", + }, + { + Shards: []*shard{ + { + Salt: "premium-salt", + Ranges: []*shardRange{ + {Start: 5000, End: 10000}, // 50% + }, + TotalShards: 10000, + }, + }, + VariationKey: "basic", + }, + }, + }, + }, + }, + }, + } + provider.updateConfiguration(config) + + err := of.SetProviderAndWait(provider) + if err != nil { + t.Fatalf("failed to set provider: %v", err) + } + client := of.NewClient("test-app") + + ctx := context.Background() + + t.Run("vip user matches id rule via targeting key fallback", func(t *testing.T) { + // Targeting key "vip-user-1" matches the regex "vip-.*" + // Uses Fix #3: targeting key used as "id" when no explicit id attribute + evalCtx := of.NewEvaluationContext("vip-user-1", map[string]interface{}{}) + + value, err := client.StringValue(ctx, "complex-flag", "default", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + if value != "vip" { + t.Errorf("expected 'vip', got %q", value) + } + }) + + t.Run("regular user falls into sharded allocation with empty rules", func(t *testing.T) { + // User "regular-user-1" doesn't match vip rule, falls to second allocation + // Uses Fix #1: empty rules match everyone + // Uses Fix #2: shard calculation with dash separator + evalCtx := of.NewEvaluationContext("regular-user-1", map[string]interface{}{}) + + value, err := client.StringValue(ctx, "complex-flag", "default", evalCtx) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + + // The actual value depends on the shard calculation + // Just verify it's one of the expected values from the second allocation + if value != "premium" && value != "basic" { + t.Errorf("expected 'premium' or 'basic', got %q", value) + } + }) +} diff --git a/openfeature/provider.go b/openfeature/provider.go new file mode 100644 index 0000000000..a23d42806f --- /dev/null +++ b/openfeature/provider.go @@ -0,0 +1,474 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "context" + "errors" + "fmt" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/open-feature/go-sdk/openfeature" +) + +var _ openfeature.FeatureProvider = (*DatadogProvider)(nil) +var _ openfeature.ContextAwareStateHandler = (*DatadogProvider)(nil) +var _ openfeature.StateHandler = (*DatadogProvider)(nil) + +// Sentinel errors for error classification +var ( + errFlagNotFound = errors.New("flag not found") + errTypeMismatch = errors.New("type mismatch") + errParseError = errors.New("parse error") + errNoConfiguration = errors.New("no configuration loaded") +) + +const ( + // ffeProductEnvVar is the environment variable to enable the experimental flagging provider + ffeProductEnvVar = "DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED" + // Default timeout for provider initialization + defaultInitTimeout = 30 * time.Second + // Default timeout for provider shutdown + defaultShutdownTimeout = 30 * time.Second +) + +// ProviderConfig contains configuration options for the Datadog OpenFeature provider +type ProviderConfig struct { + // ExposureFlushInterval is the interval at which exposure events are flushed to the agent + // Default: 1 second + ExposureFlushInterval time.Duration +} + +// DatadogProvider is an OpenFeature provider that evaluates feature flags +// using configuration received from Datadog Remote Config. +type DatadogProvider struct { + mu sync.RWMutex + configuration *universalFlagsConfiguration + metadata openfeature.Metadata + + configChange sync.Cond + + // Exposure tracking + exposureWriter *exposureWriter + exposureHook *exposureHook +} + +// NewDatadogProvider creates a new Datadog OpenFeature provider with default configuration. +// It subscribes to Remote Config updates and automatically updates the provider's configuration +// when new flag configurations are received. +// +// The provider will be ready to use immediately, but flag evaluations will return errors +// until the first configuration is received from Remote Config. +// +// Returns an error if the default configuration of the Remote Config client is NOT working +// In this case, please call tracer.Start before creating the provider. +func NewDatadogProvider(config ProviderConfig) (openfeature.FeatureProvider, error) { + if !internal.BoolEnv(ffeProductEnvVar, false) { + log.Error("openfeature: experimental flagging provider is not enabled, please set %s=true to enable it", ffeProductEnvVar) + return &openfeature.NoopProvider{}, nil + } + + return startWithRemoteConfig(config) +} + +func newDatadogProvider(config ProviderConfig) *DatadogProvider { + // Create exposure writer + writer := newExposureWriter(config) + + // Create exposure hook + hook := newExposureHook(writer) + + p := &DatadogProvider{ + metadata: openfeature.Metadata{ + Name: "Datadog Remote Config Provider", + }, + exposureWriter: writer, + exposureHook: hook, + } + p.configChange.L = &p.mu + return p +} + +// updateConfiguration updates the provider's flag configuration. +// This is called by the Remote Config callback when new configuration is received. +func (p *DatadogProvider) updateConfiguration(config *universalFlagsConfiguration) { + p.mu.Lock() + defer p.mu.Unlock() + p.configuration = config + p.configChange.Broadcast() +} + +// getConfiguration returns the current configuration (for testing purposes). +func (p *DatadogProvider) getConfiguration() *universalFlagsConfiguration { + p.mu.RLock() + defer p.mu.RUnlock() + return p.configuration +} + +// Metadata returns provider metadata including the provider name. +func (p *DatadogProvider) Metadata() openfeature.Metadata { + return p.metadata +} + +// Init initializes the provider. For the Datadog provider, +// this is waiting for the first configuration to be loaded. +func (p *DatadogProvider) Init(evaluationContext openfeature.EvaluationContext) error { + // Use a background context with a reasonable timeout for backward compatibility + ctx, cancel := context.WithTimeout(context.Background(), defaultInitTimeout) + defer cancel() + return p.InitWithContext(ctx, evaluationContext) +} + +// waitForConfigurationUpdate waits for a configuration update or context cancellation. +// Assumes mutex is locked on entry, temporarily unlocks during wait, relocks on exit. +func (p *DatadogProvider) waitForConfigurationUpdate(ctx context.Context) error { + defer p.mu.Lock() // Always relock when function exits + + // Check if context was cancelled before waiting + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + // Create channel to signal condition variable completion + done := make(chan struct{}) + go func() { + defer close(done) + p.mu.Lock() + defer p.mu.Unlock() + p.configChange.Wait() + }() + + // Temporarily unlock to allow configuration update and context handling + p.mu.Unlock() + + // Wait for either context cancellation or configuration update + select { + case <-ctx.Done(): + return ctx.Err() + case <-done: + return nil // Configuration updated, defer will relock + } +} + +// InitWithContext initializes the provider with context support. +// This method respects context cancellation and timeouts, allowing users +// to cancel the initialization process if needed. +func (p *DatadogProvider) InitWithContext(ctx context.Context, _ openfeature.EvaluationContext) error { + p.mu.Lock() + defer p.mu.Unlock() + + for p.configuration == nil { + if err := p.waitForConfigurationUpdate(ctx); err != nil { + return err + } + } + + // Start periodic flushing + p.exposureWriter.start() + return nil +} + +// Shutdown shuts down the provider and stops Remote Config updates. +func (p *DatadogProvider) Shutdown() { + // Use a background context with a reasonable timeout for backward compatibility + ctx, cancel := context.WithTimeout(context.Background(), defaultShutdownTimeout) + defer cancel() + _ = p.ShutdownWithContext(ctx) +} + +// ShutdownWithContext shuts down the provider with context support. +// This method respects context cancellation and timeouts, allowing users +// to control how long the shutdown process should take. +func (p *DatadogProvider) ShutdownWithContext(ctx context.Context) error { + // Create a channel to signal completion + done := make(chan error, 1) + + go func() { + // Perform the shutdown operations + err := stopRemoteConfig() + + p.mu.Lock() + defer p.mu.Unlock() + p.configuration = nil + // Stop the exposure writer + if p.exposureWriter != nil { + p.exposureWriter.flush() + p.exposureWriter.stop() + } + done <- err + }() + + // Wait for completion or context cancellation + select { + case <-ctx.Done(): + return ctx.Err() + case err := <-done: + return err + } +} + +// BooleanEvaluation evaluates a boolean feature flag. +func (p *DatadogProvider) BooleanEvaluation( + ctx context.Context, + flagKey string, + defaultValue bool, + flatCtx openfeature.FlattenedContext, +) openfeature.BoolResolutionDetail { + result := p.evaluate(ctx, flagKey, defaultValue, flatCtx) + + // Convert result to boolean + boolValue, ok := result.Value.(bool) + if !ok && result.Error == nil { + result.Error = fmt.Errorf("%w: flag %q returned non-boolean value: %T", errTypeMismatch, flagKey, result.Value) + result.Reason = openfeature.ErrorReason + boolValue = defaultValue + } + + return openfeature.BoolResolutionDetail{ + Value: boolValue, + ProviderResolutionDetail: openfeature.ProviderResolutionDetail{ + ResolutionError: toResolutionError(result.Error), + Reason: result.Reason, + Variant: result.VariantKey, + FlagMetadata: result.Metadata, + }, + } +} + +// StringEvaluation evaluates a string feature flag. +func (p *DatadogProvider) StringEvaluation( + ctx context.Context, + flagKey string, + defaultValue string, + flatCtx openfeature.FlattenedContext, +) openfeature.StringResolutionDetail { + result := p.evaluate(ctx, flagKey, defaultValue, flatCtx) + + // Convert result to string + strValue, ok := result.Value.(string) + if !ok && result.Error == nil { + result.Error = fmt.Errorf("%w: flag %q returned non-string value: %T", errTypeMismatch, flagKey, result.Value) + result.Reason = openfeature.ErrorReason + strValue = defaultValue + } + + return openfeature.StringResolutionDetail{ + Value: strValue, + ProviderResolutionDetail: openfeature.ProviderResolutionDetail{ + ResolutionError: toResolutionError(result.Error), + Reason: result.Reason, + Variant: result.VariantKey, + FlagMetadata: result.Metadata, + }, + } +} + +// FloatEvaluation evaluates a numeric (float) feature flag. +func (p *DatadogProvider) FloatEvaluation( + ctx context.Context, + flagKey string, + defaultValue float64, + flatCtx openfeature.FlattenedContext, +) openfeature.FloatResolutionDetail { + result := p.evaluate(ctx, flagKey, defaultValue, flatCtx) + + // Convert result to float64 + var floatValue float64 + var conversionErr error + + switch v := result.Value.(type) { + case float64: + floatValue = v + case float32: + floatValue = float64(v) + case int: + floatValue = float64(v) + case int64: + floatValue = float64(v) + case int32: + floatValue = float64(v) + default: + if result.Error == nil { + conversionErr = fmt.Errorf("%w: flag %q returned non-numeric value: %T", errTypeMismatch, flagKey, result.Value) + result.Reason = openfeature.ErrorReason + } + floatValue = defaultValue + } + + if conversionErr != nil { + result.Error = conversionErr + } + + return openfeature.FloatResolutionDetail{ + Value: floatValue, + ProviderResolutionDetail: openfeature.ProviderResolutionDetail{ + ResolutionError: toResolutionError(result.Error), + Reason: result.Reason, + Variant: result.VariantKey, + FlagMetadata: result.Metadata, + }, + } +} + +// IntEvaluation evaluates an integer feature flag. +func (p *DatadogProvider) IntEvaluation( + ctx context.Context, + flagKey string, + defaultValue int64, + flatCtx openfeature.FlattenedContext, +) openfeature.IntResolutionDetail { + result := p.evaluate(ctx, flagKey, defaultValue, flatCtx) + + // Convert result to int64 + var intValue int64 + var conversionErr error + + switch v := result.Value.(type) { + case int64: + intValue = v + case int: + intValue = int64(v) + case int32: + intValue = int64(v) + case int16: + intValue = int64(v) + case int8: + intValue = int64(v) + case float64: + // Accept float64 if it's a whole number + if v == float64(int64(v)) { + intValue = int64(v) + } else { + conversionErr = fmt.Errorf("%w: flag %q returned float with decimal part: %v", errParseError, flagKey, v) + } + default: + if result.Error == nil { + conversionErr = fmt.Errorf("%w: flag %q returned non-integer value: %T", errTypeMismatch, flagKey, result.Value) + result.Reason = openfeature.ErrorReason + } + intValue = defaultValue + } + + if conversionErr != nil { + result.Error = conversionErr + } + + return openfeature.IntResolutionDetail{ + Value: intValue, + ProviderResolutionDetail: openfeature.ProviderResolutionDetail{ + ResolutionError: toResolutionError(result.Error), + Reason: result.Reason, + Variant: result.VariantKey, + FlagMetadata: result.Metadata, + }, + } +} + +// ObjectEvaluation evaluates a structured (JSON) feature flag. +func (p *DatadogProvider) ObjectEvaluation( + ctx context.Context, + flagKey string, + defaultValue any, + flatCtx openfeature.FlattenedContext, +) openfeature.InterfaceResolutionDetail { + result := p.evaluate(ctx, flagKey, defaultValue, flatCtx) + + return openfeature.InterfaceResolutionDetail{ + Value: result.Value, + ProviderResolutionDetail: openfeature.ProviderResolutionDetail{ + ResolutionError: toResolutionError(result.Error), + Reason: result.Reason, + Variant: result.VariantKey, + FlagMetadata: result.Metadata, + }, + } +} + +// Hooks returns the hooks for this provider. +// This includes the exposure tracking hook. +func (p *DatadogProvider) Hooks() []openfeature.Hook { + if p.exposureHook != nil { + return []openfeature.Hook{p.exposureHook} + } + return []openfeature.Hook{} +} + +// evaluate is the core evaluation method that all type-specific methods use. +func (p *DatadogProvider) evaluate( + ctx context.Context, + flagKey string, + defaultValue any, + flatCtx openfeature.FlattenedContext, +) (res evaluationResult) { + log.Debug("openfeature: evaluating flag %q", flagKey) + defer func() { + log.Debug("openfeature: evaluated flag %q: value=%v, reason=%s, error=%v", flagKey, res.Value, res.Reason, res.Error) + }() + + // Check if context was cancelled before starting evaluation + select { + case <-ctx.Done(): + return evaluationResult{ + Value: defaultValue, + Reason: openfeature.ErrorReason, + Error: ctx.Err(), + } + default: + } + + config := p.getConfiguration() + + // Check if configuration is loaded + if config == nil { + return evaluationResult{ + Value: defaultValue, + Reason: openfeature.ErrorReason, + Error: errNoConfiguration, + } + } + + // Find the flag + flag, exists := config.Flags[flagKey] + if !exists { + return evaluationResult{ + Value: defaultValue, + Reason: openfeature.ErrorReason, + Error: fmt.Errorf("%w: %q", errFlagNotFound, flagKey), + } + } + + // Evaluate the flag (pass context for potential future use in evaluateFlag) + return evaluateFlag(flag, defaultValue, flatCtx) +} + +// toResolutionError converts a Go error to an OpenFeature ResolutionError. +// It uses errors.Is to check for wrapped sentinel errors instead of string matching. +func toResolutionError(err error) openfeature.ResolutionError { + if err == nil { + return openfeature.ResolutionError{} + } + + errMsg := err.Error() + + // Check for wrapped sentinel errors using errors.Is + switch { + case errors.Is(err, errFlagNotFound): + return openfeature.NewFlagNotFoundResolutionError(errMsg) + case errors.Is(err, errTypeMismatch): + return openfeature.NewTypeMismatchResolutionError(errMsg) + case errors.Is(err, errParseError): + return openfeature.NewParseErrorResolutionError(errMsg) + case errors.Is(err, errNoConfiguration): + return openfeature.NewGeneralResolutionError(errMsg) + default: + return openfeature.NewGeneralResolutionError(errMsg) + } +} diff --git a/openfeature/provider_bench_test.go b/openfeature/provider_bench_test.go new file mode 100644 index 0000000000..8840a41286 --- /dev/null +++ b/openfeature/provider_bench_test.go @@ -0,0 +1,234 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "context" + "testing" + + "github.com/open-feature/go-sdk/openfeature" +) + +// BenchmarkBooleanEvaluation benchmarks boolean flag evaluation +func BenchmarkBooleanEvaluation(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "US", + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + } +} + +// BenchmarkStringEvaluation benchmarks string flag evaluation +func BenchmarkStringEvaluation(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "age": 25, + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.StringEvaluation(ctx, "string-flag", "default", flatCtx) + } +} + +// BenchmarkIntEvaluation benchmarks integer flag evaluation +func BenchmarkIntEvaluation(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "premium": "yes", + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.IntEvaluation(ctx, "int-flag", 5, flatCtx) + } +} + +// BenchmarkFloatEvaluation benchmarks float flag evaluation +func BenchmarkFloatEvaluation(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "tier": "premium", + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.FloatEvaluation(ctx, "float-flag", 0.0, flatCtx) + } +} + +// BenchmarkObjectEvaluation benchmarks object flag evaluation +func BenchmarkEvaluation(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "requests": 1500, + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.ObjectEvaluation(ctx, "json-flag", nil, flatCtx) + } +} + +// BenchmarkEvaluationWithVaryingContextSize benchmarks evaluation with different context sizes +func BenchmarkEvaluationWithVaryingContextSize(b *testing.B) { + contextSizes := []struct { + name string + numFields int + }{ + {"1field", 1}, + {"5fields", 5}, + {"10fields", 10}, + {"20fields", 20}, + } + + for _, size := range contextSizes { + b.Run(size.name, func(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "US", + } + + // Add additional fields to the context + for i := 1; i < size.numFields; i++ { + flatCtx[string(rune('a'+i))] = i + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + } + }) + } +} + +// BenchmarkEvaluationWithVaryingFlagCounts benchmarks evaluation with different numbers of flags in config +func BenchmarkEvaluationWithVaryingFlagCounts(b *testing.B) { + flagCounts := []struct { + name string + numFlags int + }{ + {"5flags", 5}, + {"10flags", 10}, + {"50flags", 50}, + {"100flags", 100}, + } + + for _, count := range flagCounts { + b.Run(count.name, func(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + + // Add additional flags + for i := len(config.Flags); i < count.numFlags; i++ { + flagKey := string(rune('a' + i)) + config.Flags[flagKey] = &flag{ + Key: flagKey, + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{}, + Splits: []*split{ + { + Shards: []*shard{}, + VariationKey: "on", + }, + }, + }, + }, + } + } + + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "US", + } + + b.ReportAllocs() + b.ResetTimer() + + for i := 0; i < b.N; i++ { + _ = provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + } + }) + } +} + +// BenchmarkConcurrentEvaluations benchmarks concurrent flag evaluations +func BenchmarkConcurrentEvaluations(b *testing.B) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "US", + } + + b.ReportAllocs() + b.ResetTimer() + + b.RunParallel(func(pb *testing.PB) { + for pb.Next() { + _ = provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + } + }) +} diff --git a/openfeature/provider_test.go b/openfeature/provider_test.go new file mode 100644 index 0000000000..5fd824c7a5 --- /dev/null +++ b/openfeature/provider_test.go @@ -0,0 +1,692 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "context" + "errors" + "testing" + "time" + + "github.com/open-feature/go-sdk/openfeature" +) + +// Helper function to create a test configuration +func createTestConfig() *universalFlagsConfiguration { + return &universalFlagsConfiguration{ + CreatedAt: time.Now(), + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "bool-flag": { + Key: "bool-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + "off": {Key: "off", Value: false}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorOneOf, + Attribute: "country", + Value: []string{"US"}, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "on", + }, + }, + }, + }, + }, + "string-flag": { + Key: "string-flag", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "version-1"}, + "v2": {Key: "v2", Value: "version-2"}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorGTE, + Attribute: "age", + Value: 18.0, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "v2", + }, + }, + }, + }, + }, + "int-flag": { + Key: "int-flag", + Enabled: true, + VariationType: valueTypeInteger, + Variations: map[string]*variant{ + "small": {Key: "small", Value: int64(10)}, + "large": {Key: "large", Value: int64(100)}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorIsNull, + Attribute: "premium", + Value: false, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "large", + }, + }, + }, + }, + }, + "float-flag": { + Key: "float-flag", + Enabled: true, + VariationType: valueTypeNumeric, + Variations: map[string]*variant{ + "low": {Key: "low", Value: 0.5}, + "high": {Key: "high", Value: 1.5}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorMatches, + Attribute: "tier", + Value: "^premium$", + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "high", + }, + }, + }, + }, + }, + "json-flag": { + Key: "json-flag", + Enabled: true, + VariationType: valueTypeJSON, + Variations: map[string]*variant{ + "config1": { + Key: "config1", + Value: map[string]interface{}{ + "timeout": 30, + "retries": 3, + }, + }, + "config2": { + Key: "config2", + Value: map[string]interface{}{ + "timeout": 60, + "retries": 5, + }, + }, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{ + { + Conditions: []*condition{ + { + Operator: operatorGT, + Attribute: "requests", + Value: 1000.0, + }, + }, + }, + }, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "config2", + }, + }, + }, + }, + }, + "disabled-flag": { + Key: "disabled-flag", + Enabled: false, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + }, + } +} + +func TestNewDatadogProvider(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + if provider == nil { + t.Fatal("expected provider to be non-nil") + } + + metadata := provider.Metadata() + if metadata.Name != "Datadog Remote Config Provider" { + t.Errorf("expected provider name to be 'Datadog Remote Config Provider', got %q", metadata.Name) + } + + hooks := provider.Hooks() + if len(hooks) != 1 { + t.Errorf("expected 1 hook, got %d", len(hooks)) + } +} + +func TestBooleanEvaluation(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + + t.Run("matching allocation returns true", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "US", + } + + result := provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + if result.Value != true { + t.Errorf("expected true, got %v", result.Value) + } + if result.Reason != openfeature.TargetingMatchReason { + t.Errorf("expected TargetingMatchReason, got %s", result.Reason) + } + if result.Variant != "on" { + t.Errorf("expected variant 'on', got %q", result.Variant) + } + }) + + t.Run("no matching allocation returns default", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "CA", + } + + result := provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + if result.Value != false { + t.Errorf("expected false, got %v", result.Value) + } + if result.Reason != openfeature.DefaultReason { + t.Errorf("expected DefaultReason, got %s", result.Reason) + } + }) + + t.Run("disabled flag returns default", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + } + + result := provider.BooleanEvaluation(ctx, "disabled-flag", false, flatCtx) + if result.Value != false { + t.Errorf("expected false, got %v", result.Value) + } + if result.Reason != openfeature.DisabledReason { + t.Errorf("expected DisabledReason, got %s", result.Reason) + } + }) + + t.Run("flag not found returns error", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + } + + result := provider.BooleanEvaluation(ctx, "nonexistent-flag", false, flatCtx) + if result.Value != false { + t.Errorf("expected false, got %v", result.Value) + } + if result.Reason != openfeature.ErrorReason { + t.Errorf("expected ErrorReason, got %s", result.Reason) + } + if result.ResolutionError.Error() == "" { + t.Error("expected error message") + } + }) +} + +func TestStringEvaluation(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + + t.Run("matching allocation returns correct variant", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "age": 25, + } + + result := provider.StringEvaluation(ctx, "string-flag", "default", flatCtx) + if result.Value != "version-2" { + t.Errorf("expected 'version-2', got %q", result.Value) + } + if result.Reason != openfeature.TargetingMatchReason { + t.Errorf("expected TargetingMatchReason, got %s", result.Reason) + } + if result.Variant != "v2" { + t.Errorf("expected variant 'v2', got %q", result.Variant) + } + }) + + t.Run("no matching allocation returns default", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "age": 15, + } + + result := provider.StringEvaluation(ctx, "string-flag", "default", flatCtx) + if result.Value != "default" { + t.Errorf("expected 'default', got %q", result.Value) + } + if result.Reason != openfeature.DefaultReason { + t.Errorf("expected DefaultReason, got %s", result.Reason) + } + }) +} + +func TestIntEvaluation(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + + t.Run("matching allocation returns correct value", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "premium": "yes", + } + + result := provider.IntEvaluation(ctx, "int-flag", 5, flatCtx) + if result.Value != 100 { + t.Errorf("expected 100, got %d", result.Value) + } + if result.Reason != openfeature.TargetingMatchReason { + t.Errorf("expected TargetingMatchReason, got %s", result.Reason) + } + }) + + t.Run("no matching allocation returns default", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + } + + result := provider.IntEvaluation(ctx, "int-flag", 5, flatCtx) + if result.Value != 5 { + t.Errorf("expected 5, got %d", result.Value) + } + if result.Reason != openfeature.DefaultReason { + t.Errorf("expected DefaultReason, got %s", result.Reason) + } + }) +} + +func TestFloatEvaluation(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + + t.Run("matching allocation returns correct value", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "tier": "premium", + } + + result := provider.FloatEvaluation(ctx, "float-flag", 0.0, flatCtx) + if result.Value != 1.5 { + t.Errorf("expected 1.5, got %f", result.Value) + } + if result.Reason != openfeature.TargetingMatchReason { + t.Errorf("expected TargetingMatchReason, got %s", result.Reason) + } + }) + + t.Run("no matching allocation returns default", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "tier": "basic", + } + + result := provider.FloatEvaluation(ctx, "float-flag", 0.0, flatCtx) + if result.Value != 0.0 { + t.Errorf("expected 0.0, got %f", result.Value) + } + if result.Reason != openfeature.DefaultReason { + t.Errorf("expected DefaultReason, got %s", result.Reason) + } + }) +} + +func TestObjectEvaluation(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + + t.Run("matching allocation returns correct object", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "requests": 1500, + } + + result := provider.ObjectEvaluation(ctx, "json-flag", nil, flatCtx) + if result.Value == nil { + t.Fatal("expected non-nil value") + } + + objValue, ok := result.Value.(map[string]interface{}) + if !ok { + t.Fatalf("expected map[string]interface{}, got %T", result.Value) + } + + if objValue["timeout"] != 60 { + t.Errorf("expected timeout=60, got %v", objValue["timeout"]) + } + if objValue["retries"] != 5 { + t.Errorf("expected retries=5, got %v", objValue["retries"]) + } + + if result.Reason != openfeature.TargetingMatchReason { + t.Errorf("expected TargetingMatchReason, got %s", result.Reason) + } + }) + + t.Run("no matching allocation returns default", func(t *testing.T) { + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "requests": 500, + } + + defaultObj := map[string]interface{}{"default": true} + result := provider.ObjectEvaluation(ctx, "json-flag", defaultObj, flatCtx) + + if result.Reason != openfeature.DefaultReason { + t.Errorf("expected DefaultReason, got %s", result.Reason) + } + }) +} + +func TestProviderWithoutConfiguration(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + ctx := context.Background() + + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + } + + t.Run("boolean evaluation without config returns error", func(t *testing.T) { + result := provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + if result.Reason != openfeature.ErrorReason { + t.Errorf("expected ErrorReason, got %s", result.Reason) + } + }) + + t.Run("string evaluation without config returns error", func(t *testing.T) { + result := provider.StringEvaluation(ctx, "string-flag", "default", flatCtx) + if result.Reason != openfeature.ErrorReason { + t.Errorf("expected ErrorReason, got %s", result.Reason) + } + }) +} + +func TestProviderConfigurationUpdate(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + + // Initially no config + if provider.getConfiguration() != nil { + t.Error("expected nil configuration initially") + } + + // Update config + config := createTestConfig() + provider.updateConfiguration(config) + + // Verify config was updated + if provider.getConfiguration() == nil { + t.Error("expected configuration to be set") + } + + if provider.getConfiguration().Environment.Name != "test" { + t.Errorf("expected environment 'test', got %q", provider.getConfiguration().Environment.Name) + } +} + +func TestConcurrentEvaluations(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + ctx := context.Background() + flatCtx := openfeature.FlattenedContext{ + "targetingKey": "user-123", + "country": "US", + } + + // Run multiple concurrent evaluations + done := make(chan bool) + for i := 0; i < 10; i++ { + go func() { + result := provider.BooleanEvaluation(ctx, "bool-flag", false, flatCtx) + if result.Value != true { + t.Errorf("expected true, got %v", result.Value) + } + done <- true + }() + } + + // Wait for all goroutines + for i := 0; i < 10; i++ { + <-done + } +} + +func TestSetProviderWithContextAndWaitTimeout(t *testing.T) { + // Create a provider that doesn't have configuration loaded + // This will cause InitWithContext to wait for configuration + provider := newDatadogProvider(ProviderConfig{}) + + // Use a very short timeout context (50ms) + ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) + defer cancel() + + // Try to set the provider with context and wait - should timeout + err := openfeature.SetProviderWithContextAndWait(ctx, provider) + + // Verify that we get a timeout error + if err == nil { + t.Fatal("expected timeout error, got nil") + } + + // Check that the error is due to context deadline exceeded + if !errors.Is(err, context.DeadlineExceeded) { + t.Errorf("expected context.DeadlineExceeded error, got: %v", err) + } + + t.Logf("Successfully got timeout error as expected: %v", err) +} + +func TestSetProviderWithContextAndWaitSuccess(t *testing.T) { + // Create a provider and set up its configuration immediately + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + // Use a reasonable timeout context + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + // Set the provider with context and wait - should succeed quickly + err := openfeature.SetProviderWithContextAndWait(ctx, provider) + + if err != nil { + t.Fatalf("expected no error, got: %v", err) + } + + // Verify the provider was set by doing a flag evaluation + client := openfeature.NewClient("test-client") + evalCtx := openfeature.NewEvaluationContext("user-123", map[string]interface{}{ + "country": "US", + }) + result, err := client.BooleanValue(context.Background(), "bool-flag", false, evalCtx) + + if err != nil { + t.Fatalf("flag evaluation failed: %v", err) + } + + if result != true { + t.Errorf("expected flag evaluation to return true, got %v", result) + } + + t.Log("Successfully set provider with context and performed flag evaluation") +} + +func TestShutdownWithContextTimeout(t *testing.T) { + // Create and configure a provider + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + // Use a very short timeout context for shutdown (1ms) + // This tests the timeout behavior of ShutdownWithContext + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Millisecond) + defer cancel() + + // Try to shutdown with context - should respect the timeout + err := provider.ShutdownWithContext(ctx) + + // For test providers without remote config, we expect a specific error + // The key is that the method respects the context and doesn't hang + if err != nil { + t.Logf("Shutdown returned error: %v", err) + + // We expect either a timeout error OR a remote config error (both are valid) + // The important thing is that the method doesn't hang and respects context + if errors.Is(err, context.DeadlineExceeded) { + t.Log("Got expected timeout error") + } else if err.Error() == "failed to unregister OpenFeature product: remote config client not started" { + t.Log("Got expected remote config error (test provider has no remote config)") + } else { + t.Errorf("unexpected error type: %v", err) + } + } else { + t.Log("Shutdown completed within timeout") + } +} + +func TestShutdownWithContextSuccess(t *testing.T) { + // Create and configure a provider + provider := newDatadogProvider(ProviderConfig{}) + config := createTestConfig() + provider.updateConfiguration(config) + + // Use a reasonable timeout context for shutdown + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + + // Shutdown with adequate timeout + err := provider.ShutdownWithContext(ctx) + + // For test providers without remote config, we expect a specific error + // but the shutdown should complete without timing out + if err != nil { + if err.Error() == "failed to unregister OpenFeature product: remote config client not started" { + t.Log("Got expected remote config error (test provider has no remote config client)") + } else { + t.Errorf("unexpected error: %v", err) + } + } else { + t.Log("Shutdown completed successfully") + } +} diff --git a/openfeature/remoteconfig.go b/openfeature/remoteconfig.go new file mode 100644 index 0000000000..f51c28df8e --- /dev/null +++ b/openfeature/remoteconfig.go @@ -0,0 +1,204 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "encoding/json" + "errors" + "fmt" + "maps" + + rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" +) + +const ( + ffeProductName = "FFE_FLAGS" + ffeCapability = 46 +) + +func startWithRemoteConfig(config ProviderConfig) (*DatadogProvider, error) { + provider := newDatadogProvider(config) + + if err := remoteconfig.Start(remoteconfig.DefaultClientConfig()); err != nil { + return nil, fmt.Errorf("failed to start Remote Config: %w", err) + } + + // Subscribe to Remote Config updates for the OpenFeature product + if err := remoteconfig.Subscribe(ffeProductName, provider.rcCallback, ffeCapability); err != nil { + return nil, fmt.Errorf("failed to subscribe to Remote Config: %w (did you already create a provider ?)", err) + } + + log.Debug("openfeature: successfully subscribed to Remote Config updates") + return provider, nil +} + +func (p *DatadogProvider) rcCallback(update remoteconfig.ProductUpdate) map[string]rc.ApplyStatus { + statuses := make(map[string]rc.ApplyStatus, len(update)) + + // Process each configuration file in the update + for path, data := range update { + status := processConfigUpdate(p, path, data) + statuses[path] = status + } + + return statuses +} + +// processConfigUpdate processes a single configuration update from Remote Config. +func processConfigUpdate(provider *DatadogProvider, path string, data []byte) rc.ApplyStatus { + // Handle configuration deletion (nil data means the config was removed) + if data == nil { + log.Debug("openfeature: remote config: removing configuration %q", path) + // For now, we treat deletion as clearing the configuration + // In a multi-config scenario, we might track configs per path + provider.updateConfiguration(nil) + return rc.ApplyStatus{ + State: rc.ApplyStateAcknowledged, + } + } + + // Parse the configuration + log.Debug("openfeature: remote config: processing configuration update %q", path) + + var config universalFlagsConfiguration + if err := json.Unmarshal(data, &config); err != nil { + log.Error("openfeature: remote config: failed to unmarshal configuration %q: %v", path, err.Error()) + return rc.ApplyStatus{ + State: rc.ApplyStateError, + Error: fmt.Sprintf("failed to unmarshal configuration: %v", err), + } + } + + // Validate the configuration + err := validateConfiguration(&config) + if err != nil { + log.Error("openfeature: remote config: invalid configuration %q: %v", path, err.Error()) + return rc.ApplyStatus{ + State: rc.ApplyStateError, + Error: fmt.Sprintf("invalid configuration: %v", err), + } + } + + // Update the provider with the new configuration + provider.updateConfiguration(&config) + log.Debug("openfeature: remote config: successfully applied configuration %q with %d flags", path, len(config.Flags)) + + return rc.ApplyStatus{ + State: rc.ApplyStateAcknowledged, + } +} + +// validateConfiguration performs basic validation on a serverConfiguration. +func validateConfiguration(config *universalFlagsConfiguration) error { + if config == nil { + return fmt.Errorf("configuration is nil") + } + + if config.Format != "SERVER" { + return fmt.Errorf("unsupported format %q, expected SERVER (Is the remote config payload the right format ?)", config.Format) + } + + hasFlags := len(config.Flags) > 0 + + // Validate each flag and delete invalid ones from the map + // Collect errors for reporting + errs := make([]error, 0, len(config.Flags)) + maps.DeleteFunc(config.Flags, func(flagKey string, flag *flag) bool { + err := validateFlag(flagKey, flag) + errs = append(errs, err) + return err != nil + }) + + if hasFlags && len(config.Flags) == 0 { + errs = append(errs, errors.New("all flags are invalid")) + } + + return errors.Join(errs...) +} + +func validateFlag(flagKey string, flag *flag) error { + if flag == nil { + return fmt.Errorf("flag %q is nil", flagKey) + } + + if flag.Key != flagKey { + return fmt.Errorf("flag key mismatch: map key %q != flag.Key %q", flagKey, flag.Key) + } + + // Validate variation type + switch flag.VariationType { + case valueTypeBoolean, valueTypeString, valueTypeInteger, valueTypeNumeric, valueTypeJSON: + // Valid types + default: + return fmt.Errorf("flag %q has invalid variation type %q", flagKey, flag.VariationType) + } + + for i, allocation := range flag.Allocations { + if allocation == nil { + return fmt.Errorf("flag %q allocation %d is nil", flagKey, i) + } + + for j, split := range allocation.Splits { + if split == nil { + return fmt.Errorf("flag %q allocation %d split %d is nil", flagKey, i, j) + } + + for _, shard := range split.Shards { + if shard.TotalShards < 0 { + return fmt.Errorf("flag %q allocation %d split %d has shard with non-positive TotalShards %d", + flagKey, i, j, shard.TotalShards) + } + } + + if _, exists := flag.Variations[split.VariationKey]; !exists { + return fmt.Errorf("flag %q allocation %d split %d references non-existent variation %q", + flagKey, i, j, split.VariationKey) + } + } + + for _, rule := range allocation.Rules { + if rule == nil { + return fmt.Errorf("flag %q allocation %d has nil rule", flagKey, i) + } + + for _, condition := range rule.Conditions { + if condition == nil { + return fmt.Errorf("flag %q allocation %d rule has nil condition", flagKey, i) + } + + if condition.Operator == operatorMatches || condition.Operator == operatorNotMatches { + regex, ok := condition.Value.(string) + if !ok { + return fmt.Errorf("flag %q allocation %d rule has condition with operator %q that requires string value", + flagKey, i, condition.Operator) + } + + if _, err := loadRegex(regex); err != nil { + return fmt.Errorf("flag %q allocation %d rule has condition with invalid regex %q: %v", + flagKey, i, regex, err) + } + } + } + } + } + return nil +} + +// stopRemoteConfig unsubscribes from Remote Config updates. +// This should be called when shutting down the application or when +// the OpenFeature provider is no longer needed. +// +// Note: This function is currently not fully implemented as Remote Config +// doesn't provide an Unsubscribe method yet. The provider will continue +// to receive updates until the Remote Config client is stopped. +func stopRemoteConfig() error { + log.Debug("openfeature: unregistered from Remote Config") + // For now, we can unregister the capability to stop receiving updates + _ = remoteconfig.UnregisterCapability(ffeCapability) + return nil +} diff --git a/openfeature/remoteconfig_test.go b/openfeature/remoteconfig_test.go new file mode 100644 index 0000000000..a606026a63 --- /dev/null +++ b/openfeature/remoteconfig_test.go @@ -0,0 +1,741 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import ( + "encoding/json" + "fmt" + "testing" + "time" + + rc "github.com/DataDog/datadog-agent/pkg/remoteconfig/state" + "github.com/DataDog/dd-trace-go/v2/internal/remoteconfig" + "github.com/stretchr/testify/require" +) + +func TestValidateConfiguration(t *testing.T) { + t.Run("valid configuration", func(t *testing.T) { + config := &universalFlagsConfiguration{ + CreatedAt: time.Now(), + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "test-flag": { + Key: "test-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{}, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "on", + }, + }, + }, + }, + }, + }, + } + + err := validateConfiguration(config) + if err != nil { + t.Errorf("expected valid configuration, got error: %v", err) + } + }) + + t.Run("nil configuration", func(t *testing.T) { + err := validateConfiguration(nil) + if err == nil { + t.Error("expected error for nil configuration") + } + }) + + t.Run("invalid format", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "CLIENT", + Flags: map[string]*flag{}, + } + + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for invalid format") + } + }) + + t.Run("nil flag", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "test-flag": nil, + }, + } + + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for nil flag") + } + }) + + t.Run("flag key mismatch", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "test-flag": { + Key: "wrong-key", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{}, + }, + }, + } + + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for flag key mismatch") + } + }) + + t.Run("invalid variation type", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "test-flag": { + Key: "test-flag", + VariationType: valueType("INVALID"), + Variations: map[string]*variant{}, + }, + }, + } + + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for invalid variation type") + } + }) + + t.Run("no variations", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "test-flag": { + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{}, + }, + }, + } + + // Flags with no variations are valid (though they won't match any allocations) + err := validateConfiguration(config) + require.NoError(t, err) + }) + + t.Run("split references non-existent variation", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "test-flag": { + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{}, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "non-existent", + }, + }, + }, + }, + }, + }, + } + + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for split referencing non-existent variation") + } + }) + + t.Run("invalid flags are deleted from config", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "valid-flag": { + Key: "valid-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + "invalid-flag-nil": nil, + }, + } + + // Should return errors but also delete invalid flags + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for invalid flags") + } + + // Check that invalid flags were deleted + if _, exists := config.Flags["invalid-flag-nil"]; exists { + t.Error("expected nil flag to be deleted from config") + } + if _, exists := config.Flags["valid-flag"]; !exists { + t.Error("expected valid flag to remain in config") + } + }) + + t.Run("multiple invalid flags produce joined errors", func(t *testing.T) { + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "flag1-nil": nil, + "flag2-invalid-type": { + Key: "flag2-invalid-type", + VariationType: valueType("INVALID"), + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "val"}, + }, + }, + }, + } + + err := validateConfiguration(config) + if err == nil { + t.Error("expected error for multiple invalid flags") + } + + // Both invalid flags should be deleted + if len(config.Flags) != 0 { + t.Errorf("expected all invalid flags to be deleted, got %d flags", len(config.Flags)) + } + }) +} + +func TestValidateFlag(t *testing.T) { + t.Run("valid flag", func(t *testing.T) { + flag := &flag{ + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + } + + err := validateFlag("test-flag", flag) + if err != nil { + t.Errorf("expected valid flag, got error: %v", err) + } + }) + + t.Run("nil flag", func(t *testing.T) { + err := validateFlag("test-flag", nil) + if err == nil { + t.Error("expected error for nil flag") + } + }) + + t.Run("flag key mismatch", func(t *testing.T) { + flag := &flag{ + Key: "wrong-key", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + } + + err := validateFlag("test-flag", flag) + if err == nil { + t.Error("expected error for flag key mismatch") + } + }) + + t.Run("invalid variation type", func(t *testing.T) { + flag := &flag{ + Key: "test-flag", + VariationType: valueType("INVALID_TYPE"), + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "test"}, + }, + } + + err := validateFlag("test-flag", flag) + if err == nil { + t.Error("expected error for invalid variation type") + } + }) + + t.Run("no variations", func(t *testing.T) { + flag := &flag{ + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{}, + } + + // Flags with no variations are valid (though they won't match any allocations) + err := validateFlag("test-flag", flag) + require.NoError(t, err) + }) + + t.Run("nil allocation", func(t *testing.T) { + flag := &flag{ + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{nil}, + } + + err := validateFlag("test-flag", flag) + if err == nil { + t.Error("expected error for nil allocation") + } + }) + + t.Run("nil split in allocation", func(t *testing.T) { + flag := &flag{ + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{}, + Splits: []*split{nil}, + }, + }, + } + + err := validateFlag("test-flag", flag) + if err == nil { + t.Error("expected error for nil split") + } + }) + + t.Run("split references non-existent variation", func(t *testing.T) { + flag := &flag{ + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{ + { + Key: "allocation1", + Rules: []*rule{}, + Splits: []*split{ + { + Shards: []*shard{ + { + Salt: "test", + Ranges: []*shardRange{ + {Start: 0, End: 8192}, + }, + TotalShards: 8192, + }, + }, + VariationKey: "non-existent", + }, + }, + }, + }, + } + + err := validateFlag("test-flag", flag) + if err == nil { + t.Error("expected error for split referencing non-existent variation") + } + }) + + t.Run("all variation types are valid", func(t *testing.T) { + validTypes := []valueType{ + valueTypeBoolean, + valueTypeString, + valueTypeInteger, + valueTypeNumeric, + valueTypeJSON, + } + + for _, vType := range validTypes { + flag := &flag{ + Key: "test-flag", + VariationType: vType, + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "test-value"}, + }, + } + + err := validateFlag("test-flag", flag) + if err != nil { + t.Errorf("expected %s to be valid, got error: %v", vType, err) + } + } + }) +} + +func TestProcessConfigUpdate(t *testing.T) { + t.Run("valid configuration update", func(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + + config := universalFlagsConfiguration{ + CreatedAt: time.Now(), + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "test-flag": { + Key: "test-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + }, + } + + data, err := json.Marshal(config) + if err != nil { + t.Fatalf("failed to marshal config: %v", err) + } + + status := processConfigUpdate(provider, "test-path", data) + if status.State != rc.ApplyStateAcknowledged { + t.Errorf("expected ApplyStateAcknowledged, got %v", status.State) + } + + // Verify configuration was updated + updatedConfig := provider.getConfiguration() + if updatedConfig == nil { + t.Fatal("expected configuration to be set") + } + if len(updatedConfig.Flags) != 1 { + t.Errorf("expected 1 flag, got %d", len(updatedConfig.Flags)) + } + }) + + t.Run("configuration deletion", func(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + + // First set a configuration + config := &universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "test-flag": { + Key: "test-flag", + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + }, + } + provider.updateConfiguration(config) + + // Now send a deletion (nil data) + status := processConfigUpdate(provider, "test-path", nil) + if status.State != rc.ApplyStateAcknowledged { + t.Errorf("expected ApplyStateAcknowledged, got %v", status.State) + } + + // Verify configuration was cleared + updatedConfig := provider.getConfiguration() + if updatedConfig != nil { + t.Error("expected configuration to be cleared") + } + }) + + t.Run("invalid JSON", func(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + + invalidJSON := []byte("{invalid json") + status := processConfigUpdate(provider, "test-path", invalidJSON) + + if status.State != rc.ApplyStateError { + t.Errorf("expected ApplyStateError, got %v", status.State) + } + if status.Error == "" { + t.Error("expected error message") + } + }) + + t.Run("invalid configuration", func(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + + config := universalFlagsConfiguration{ + Format: "INVALID", + Flags: map[string]*flag{}, + } + + data, _ := json.Marshal(config) + status := processConfigUpdate(provider, "test-path", data) + + if status.State != rc.ApplyStateError { + t.Errorf("expected ApplyStateError, got %v", status.State) + } + if status.Error == "" { + t.Error("expected error message") + } + }) +} + +func TestCreateRemoteConfigCallback(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + callback := provider.rcCallback + + // Create a valid configuration + config := universalFlagsConfiguration{ + CreatedAt: time.Now(), + Format: "SERVER", + Environment: environment{ + Name: "test", + }, + Flags: map[string]*flag{ + "flag1": { + Key: "flag1", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + "flag2": { + Key: "flag2", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "version-1"}, + }, + Allocations: []*allocation{}, + }, + }, + } + + data, _ := json.Marshal(config) + + // Simulate Remote Config update with multiple paths + update := remoteconfig.ProductUpdate{ + "path1": data, + "path2": data, + } + + statuses := callback(update) + + if len(statuses) != 2 { + t.Errorf("expected 2 statuses, got %d", len(statuses)) + } + + for path, status := range statuses { + if status.State != rc.ApplyStateAcknowledged { + t.Errorf("expected ApplyStateAcknowledged for %s, got %v", path, status.State) + } + } +} + +func TestRemoteConfigIntegration(t *testing.T) { + // This test verifies the integration flow but doesn't actually + // connect to Remote Config (would require a running agent) + + t.Run("callback handles multiple updates", func(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + callback := provider.rcCallback + + // Create two different configurations + config1 := universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "flag1": { + Key: "flag1", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + }, + } + + config2 := universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "flag2": { + Key: "flag2", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "value1"}, + }, + Allocations: []*allocation{}, + }, + }, + } + + data1, _ := json.Marshal(config1) + data2, _ := json.Marshal(config2) + + // First update + update1 := remoteconfig.ProductUpdate{ + "config1": data1, + } + statuses1 := callback(update1) + if statuses1["config1"].State != rc.ApplyStateAcknowledged { + t.Error("expected first update to be acknowledged") + } + + // Second update (replaces first) + update2 := remoteconfig.ProductUpdate{ + "config2": data2, + } + statuses2 := callback(update2) + if statuses2["config2"].State != rc.ApplyStateAcknowledged { + t.Error("expected second update to be acknowledged") + } + + // Verify the provider has the latest configuration + finalConfig := provider.getConfiguration() + if finalConfig == nil { + t.Fatal("expected configuration to be set") + } + if _, exists := finalConfig.Flags["flag2"]; !exists { + t.Error("expected flag2 to be present in final configuration") + } + }) + + t.Run("callback handles mixed success and failure", func(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + callback := provider.rcCallback + + validConfig := universalFlagsConfiguration{ + Format: "SERVER", + Flags: map[string]*flag{ + "valid-flag": { + Key: "valid-flag", + Enabled: true, + VariationType: valueTypeBoolean, + Variations: map[string]*variant{ + "on": {Key: "on", Value: true}, + }, + Allocations: []*allocation{}, + }, + }, + } + + validData, _ := json.Marshal(validConfig) + invalidData := []byte("{invalid") + + update := remoteconfig.ProductUpdate{ + "valid": validData, + "invalid": invalidData, + } + + statuses := callback(update) + + if statuses["valid"].State != rc.ApplyStateAcknowledged { + t.Error("expected valid config to be acknowledged") + } + if statuses["invalid"].State != rc.ApplyStateError { + t.Error("expected invalid config to be error") + } + }) +} + +func TestConfigurationPersistence(t *testing.T) { + provider := newDatadogProvider(ProviderConfig{}) + + // Simulate multiple Remote Config updates + callback := provider.rcCallback + + configs := []universalFlagsConfiguration{ + { + Format: "SERVER", + Flags: map[string]*flag{ + "flag-v1": { + Key: "flag-v1", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "v1": {Key: "v1", Value: "version-1"}, + }, + Allocations: []*allocation{}, + }, + }, + }, + { + Format: "SERVER", + Flags: map[string]*flag{ + "flag-v2": { + Key: "flag-v2", + Enabled: true, + VariationType: valueTypeString, + Variations: map[string]*variant{ + "v2": {Key: "v2", Value: "version-2"}, + }, + Allocations: []*allocation{}, + }, + }, + }, + } + + // Apply configurations sequentially + for i, config := range configs { + data, _ := json.Marshal(config) + update := remoteconfig.ProductUpdate{ + "config": data, + } + callback(update) + + // Verify the provider has the latest config + currentConfig := provider.getConfiguration() + if currentConfig == nil { + t.Fatalf("expected configuration to be set after update %d", i) + } + + expectedFlagKey := fmt.Sprintf("flag-v%d", i+1) + if _, exists := currentConfig.Flags[expectedFlagKey]; !exists { + t.Errorf("expected flag %s after update %d", expectedFlagKey, i) + } + } +} diff --git a/openfeature/types.go b/openfeature/types.go new file mode 100644 index 0000000000..5be6708966 --- /dev/null +++ b/openfeature/types.go @@ -0,0 +1,172 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package openfeature + +import "time" + +// universalFlagsConfiguration represents the universal feature flags configuration structure. +// of the openfeature standard for server-side flag configurations. +type universalFlagsConfiguration struct { + // CreatedAt is the timestamp when the configuration was created (RFC 3339 datetime) + CreatedAt time.Time `json:"createdAt"` + // Format should always be "SERVER" for server-side configurations + Format string `json:"format"` + // Environment contains information about the environment this configuration applies to + Environment environment `json:"environment"` + // Flags is a map of feature flag keys to their configurations + Flags map[string]*flag `json:"flags"` +} + +// environment represents environment information for the configuration. +type environment struct { + // Name is the environment name (e.g., "production", "staging") + Name string `json:"name"` +} + +// valueType represents the data type of variation values for a feature flag. +type valueType string + +const ( + // valueTypeBoolean represents a boolean flag type + valueTypeBoolean valueType = "BOOLEAN" + // valueTypeInteger represents an integer flag type + valueTypeInteger valueType = "INTEGER" + // valueTypeNumeric represents a numeric (float) flag type + valueTypeNumeric valueType = "NUMERIC" + // valueTypeString represents a string flag type + valueTypeString valueType = "STRING" + // valueTypeJSON represents a JSON (any structure) flag type + valueTypeJSON valueType = "JSON" +) + +// flag represents the configuration for a single feature flag. +// It contains variants and allocation rules that determine which variant +// a user receives based on targeting conditions. +type flag struct { + // Key is the unique identifier for this feature flag + Key string `json:"key"` + // Enabled indicates whether the flag is active + Enabled bool `json:"enabled"` + // VariationType specifies the data type of variation values + VariationType valueType `json:"variationType"` + // Variations is a map of variant keys to their configurations + Variations map[string]*variant `json:"variations"` + // Allocations define targeting and traffic distribution rules + // They are evaluated in order, and the first matching allocation wins + Allocations []*allocation `json:"allocations"` +} + +// variant represents a single variation/variation of a feature flag. +type variant struct { + // Key uniquely identifies this variant + Key string `json:"key"` + // Value is the actual value for this variant + // The type depends on the flag's VariationType: + // - BOOLEAN: bool + // - INTEGER: int64 or float64 (will be converted) + // - NUMERIC: float64 + // - STRING: string + // - JSON: any JSON-serializable value + Value any `json:"value"` +} + +// allocation defines how traffic should be allocated to variants. +// It includes targeting rules and traffic distribution (sharding) configuration. +type allocation struct { + // Key uniquely identifies this allocation + Key string `json:"key"` + // Rules are targeting rules that must be satisfied for this allocation to apply + // At least one rule must match (OR logic between rules) + Rules []*rule `json:"rules"` + // StartAt is the optional start time for this allocation (RFC 3339) + StartAt *time.Time `json:"startAt,omitempty"` + // EndAt is the optional end time for this allocation (RFC 3339) + EndAt *time.Time `json:"endAt,omitempty"` + // Splits define how to distribute traffic among variants + Splits []*split `json:"splits"` + // DoLog indicates whether to log events for this allocation (defaults to true) + DoLog *bool `json:"doLog,omitempty"` +} + +// rule represents a targeting rule containing conditions. +// All conditions within a rule must be satisfied (AND logic). +type rule struct { + // Conditions are the individual conditions that must all be true + Conditions []*condition `json:"conditions"` +} + +// conditionOperator represents the comparison operator for a condition. +type conditionOperator string + +const ( + // operatorLT checks if attribute < value (value: number) + operatorLT conditionOperator = "LT" + // operatorLTE checks if attribute <= value (value: number) + operatorLTE conditionOperator = "LTE" + // operatorGT checks if attribute > value (value: number) + operatorGT conditionOperator = "GT" + // operatorGTE checks if attribute >= value (value: number) + operatorGTE conditionOperator = "GTE" + + // operatorMatches checks if attribute matches regex pattern (value: string regex) + operatorMatches conditionOperator = "MATCHES" + // operatorNotMatches checks if attribute doesn't match regex pattern (value: string regex) + operatorNotMatches conditionOperator = "NOT_MATCHES" + + // operatorOneOf checks if attribute is in the list (value: []string) + operatorOneOf conditionOperator = "ONE_OF" + // operatorNotOneOf checks if attribute is not in the list (value: []string) + operatorNotOneOf conditionOperator = "NOT_ONE_OF" + + // operatorIsNull checks if attribute is null/absent (value: bool) + // If value is true, attribute must be absent; if false, attribute must be present + operatorIsNull conditionOperator = "IS_NULL" +) + +// condition represents a single condition for attribute-based targeting. +type condition struct { + // Operator is the comparison operator to use + Operator conditionOperator `json:"operator"` + // Attribute is the name of the attribute to evaluate (e.g., "user_id", "country") + Attribute string `json:"attribute"` + // Value is the value to compare against + // Type depends on the operator: + // - Numeric operators (LT, LTE, GT, GTE): number (int64 or float64) + // - Regex operators (MATCHES, NOT_MATCHES): string (regex pattern) + // - List operators (ONE_OF, NOT_ONE_OF): []any or []string + // - Null check (IS_NULL): bool + Value any `json:"value"` +} + +// split defines how traffic should be distributed for a specific variant. +type split struct { + // Shards define the traffic segments this split applies to + // All shards must match for the split to apply (AND logic) + Shards []*shard `json:"shards"` + // VariationKey is the key of the variation to return if this split matches + VariationKey string `json:"variationKey"` + // ExtraLogging contains additional metadata for logging purposes + ExtraLogging map[string]string `json:"extraLogging,omitempty"` +} + +// shard defines a portion of traffic using consistent hashing. +// It uses a salt value and hash ranges to deterministically assign users to segments. +type shard struct { + // Salt is used in hash calculation for traffic distribution + Salt string `json:"salt"` + // Ranges are the hash ranges this shard covers + Ranges []*shardRange `json:"ranges"` + // TotalShards is the total number of possible shards (typically 8192) + TotalShards int `json:"totalShards"` +} + +// shardRange represents a range of hash values included in a shard. +type shardRange struct { + // Start is the beginning of the range (inclusive) + Start int `json:"start"` + // End is the end of the range (exclusive) + End int `json:"end"` +} diff --git a/orchestrion/all/go.mod b/orchestrion/all/go.mod new file mode 100644 index 0000000000..8ae5e7046b --- /dev/null +++ b/orchestrion/all/go.mod @@ -0,0 +1,354 @@ +module github.com/DataDog/dd-trace-go/orchestrion/all/v2 + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/log/slog/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/net/http/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 v2.5.0-dev + github.com/DataDog/dd-trace-go/v2 v2.5.0-dev + github.com/DataDog/orchestrion v1.6.0 +) + +require ( + cloud.google.com/go v0.121.4 // indirect + cloud.google.com/go/auth v0.16.3 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect + cloud.google.com/go/iam v1.5.2 // indirect + cloud.google.com/go/pubsub v1.49.0 // indirect + cloud.google.com/go/pubsub/v2 v2.0.0 // indirect + github.com/99designs/gqlgen v0.17.72 // indirect + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.2 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.2 // indirect + github.com/DataDog/datadog-go/v5 v5.8.1 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/gostackparse v0.7.0 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/IBM/sarama v1.40.0 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/Shopify/sarama v1.38.1 // indirect + github.com/andybalholm/brotli v1.1.0 // indirect + github.com/antithesishq/antithesis-sdk-go v0.5.0 // indirect + github.com/aws/aws-sdk-go v1.44.327 // indirect + github.com/aws/aws-sdk-go-v2 v1.26.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 // indirect + github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 // indirect + github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4 // indirect + github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 // indirect + github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 // indirect + github.com/aws/smithy-go v1.20.2 // indirect + github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect + github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb // indirect + github.com/bytedance/sonic v1.12.0 // indirect + github.com/bytedance/sonic/loader v0.2.0 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charmbracelet/colorprofile v0.3.2 // indirect + github.com/charmbracelet/lipgloss v1.1.0 // indirect + github.com/charmbracelet/x/ansi v0.10.2 // indirect + github.com/charmbracelet/x/cellbuf v0.0.13 // indirect + github.com/charmbracelet/x/term v0.2.1 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/clipperhouse/uax29/v2 v2.2.0 // indirect + github.com/cloudwego/base64x v0.1.4 // indirect + github.com/cloudwego/iasm v0.2.0 // indirect + github.com/confluentinc/confluent-kafka-go v1.9.2 // indirect + github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 // indirect + github.com/containerd/containerd/api v1.10.0 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/dave/dst v0.27.3 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/eapache/go-resiliency v1.4.0 // indirect + github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect + github.com/eapache/queue v1.1.0 // indirect + github.com/ebitengine/purego v0.9.0 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/gin-gonic/gin v1.10.1 // indirect + github.com/go-chi/chi v1.5.4 // indirect + github.com/go-chi/chi/v5 v5.2.2 // indirect + github.com/go-jose/go-jose/v4 v4.1.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.20.0 // indirect + github.com/go-redis/redis v6.15.9+incompatible // indirect + github.com/go-redis/redis/v7 v7.4.1 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/gocql/gocql v1.6.0 // indirect + github.com/gofiber/fiber/v2 v2.52.9 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/gomodule/redigo v1.8.9 // indirect + github.com/google/go-tpm v0.9.6 // indirect + github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db // indirect + github.com/google/s2a-go v0.1.9 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect + github.com/googleapis/gax-go/v2 v2.15.0 // indirect + github.com/gorilla/mux v1.8.1 // indirect + github.com/graph-gophers/graphql-go v1.5.0 // indirect + github.com/graphql-go/graphql v0.8.1 // indirect + github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-retryablehttp v0.7.7 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9 // indirect + github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect + github.com/hashicorp/go-uuid v1.0.3 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/hashicorp/hcl v1.0.1-vault-5 // indirect + github.com/hashicorp/vault/api v1.15.0 // indirect + github.com/hashicorp/vault/sdk v0.15.0 // indirect + github.com/jackc/pgpassfile v1.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect + github.com/jackc/pgx/v5 v5.6.0 // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect + github.com/jcmturner/aescts/v2 v2.0.0 // indirect + github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect + github.com/jcmturner/gofork v1.7.6 // indirect + github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect + github.com/jcmturner/rpc/v2 v2.0.3 // indirect + github.com/jinzhu/inflection v1.0.0 // indirect + github.com/jinzhu/now v1.1.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/labstack/echo/v4 v4.11.1 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/lucasb-eyer/go-colorful v1.3.0 // indirect + github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.19 // indirect + github.com/minio/highwayhash v1.0.3 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/muesli/termenv v0.16.0 // indirect + github.com/nats-io/jwt/v2 v2.8.0 // indirect + github.com/nats-io/nats-server/v2 v2.12.1 // indirect + github.com/nats-io/nats.go v1.47.0 // indirect + github.com/nats-io/nkeys v0.4.11 // indirect + github.com/nats-io/nuid v1.0.1 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect + github.com/redis/go-redis/v9 v9.7.3 // indirect + github.com/redis/rueidis v1.0.55 // indirect + github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rs/zerolog v1.34.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryanuber/go-glob v1.0.0 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.1 // indirect + github.com/segmentio/kafka-go v0.4.42 // indirect + github.com/shirou/gopsutil/v4 v4.25.9 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/sosodev/duration v1.3.1 // indirect + github.com/spaolacci/murmur3 v1.1.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.4.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/twitchtv/twirp v8.1.3+incompatible // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.12 // indirect + github.com/urfave/cli/v2 v2.27.7 // indirect + github.com/valkey-io/valkey-go v1.0.55 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect + github.com/vektah/gqlparser/v2 v2.5.25 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.mongodb.org/mongo-driver v1.12.1 // indirect + go.mongodb.org/mongo-driver/v2 v2.2.2 // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect + go.opentelemetry.io/collector/component v1.43.0 // indirect + go.opentelemetry.io/collector/featuregate v1.43.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.137.0 // indirect + go.opentelemetry.io/collector/pdata v1.43.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/log v0.14.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/arch v0.8.0 // indirect + golang.org/x/crypto v0.43.0 // indirect + golang.org/x/exp v0.0.0-20251017212417-90e834f514db // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.38.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/api v0.239.0 // indirect + google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f // indirect + google.golang.org/grpc v1.76.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + gorm.io/gorm v1.25.5 // indirect + k8s.io/apimachinery v0.32.3 // indirect + k8s.io/client-go v0.31.4 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect +) + +replace ( + github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2 => ../../contrib/99designs/gqlgen + github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2 => ../../contrib/IBM/sarama + github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2 => ../../contrib/Shopify/sarama + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2 => ../../contrib/aws/aws-sdk-go-v2 + github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2 => ../../contrib/aws/aws-sdk-go + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2 => ../../contrib/cloud.google.com/go/pubsub.v1 + github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2 => ../../contrib/cloud.google.com/go/pubsub.v2 + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2 => ../../contrib/confluentinc/confluent-kafka-go/kafka.v2 + github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2 => ../../contrib/confluentinc/confluent-kafka-go/kafka + github.com/DataDog/dd-trace-go/contrib/database/sql/v2 => ../../contrib/database/sql + github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2 => ../../contrib/elastic/go-elasticsearch.v6 + github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2 => ../../contrib/gin-gonic/gin + github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2 => ../../contrib/go-chi/chi.v5 + github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2 => ../../contrib/go-chi/chi + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2 => ../../contrib/go-redis/redis.v7 + github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2 => ../../contrib/go-redis/redis.v8 + github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2 => ../../contrib/go-redis/redis + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2 => ../../contrib/go.mongodb.org/mongo-driver.v2 + github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2 => ../../contrib/go.mongodb.org/mongo-driver + github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2 => ../../contrib/gocql/gocql + github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2 => ../../contrib/gofiber/fiber.v2 + github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2 => ../../contrib/gomodule/redigo + github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2 => ../../contrib/google.golang.org/grpc + github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2 => ../../contrib/gorilla/mux + github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2 => ../../contrib/gorm.io/gorm.v1 + github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2 => ../../contrib/graph-gophers/graphql-go + github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2 => ../../contrib/graphql-go/graphql + github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2 => ../../contrib/hashicorp/vault + github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2 => ../../contrib/jackc/pgx.v5 + github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2 => ../../contrib/julienschmidt/httprouter + github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2 => ../../contrib/k8s.io/client-go + github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2 => ../../contrib/labstack/echo.v4 + github.com/DataDog/dd-trace-go/contrib/log/slog/v2 => ../../contrib/log/slog + github.com/DataDog/dd-trace-go/contrib/net/http/v2 => ../../contrib/net/http + github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2 => ../../contrib/redis/go-redis.v9 + github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2 => ../../contrib/redis/rueidis + github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2 => ../../contrib/segmentio/kafka-go + github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2 => ../../contrib/sirupsen/logrus + github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2 => ../../contrib/twitchtv/twirp + github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2 => ../../contrib/valkey-io/valkey-go + github.com/DataDog/dd-trace-go/v2 => ../.. +) + +replace google.golang.org/grpc => google.golang.org/grpc v1.70.0 diff --git a/orchestrion/all/go.sum b/orchestrion/all/go.sum new file mode 100644 index 0000000000..bd631306e5 --- /dev/null +++ b/orchestrion/all/go.sum @@ -0,0 +1,2801 @@ +cel.dev/expr v0.15.0/go.mod h1:TRSuuV7DlVCE/uwv5QbAiW/v8l5O8C4eEPHeu7gf7Sg= +cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= +cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= +cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= +cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= +cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= +cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= +cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= +cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= +cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= +cloud.google.com/go v0.110.4/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.110.6/go.mod h1:+EYjdK8e5RME/VY/qLCAtuyALQ9q67dvuum8i+H5xsI= +cloud.google.com/go v0.121.4 h1:cVvUiY0sX0xwyxPwdSU2KsF9knOVmtRyAMt8xou0iTs= +cloud.google.com/go v0.121.4/go.mod h1:XEBchUiHFJbz4lKBZwYBDHV/rSyfFktk737TLDU089s= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accessapproval v1.7.1/go.mod h1:JYczztsHRMK7NTXb6Xw+dwbs/WnOJxbo/2mTI+Kgg68= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= +cloud.google.com/go/accesscontextmanager v1.8.0/go.mod h1:uI+AI/r1oyWK99NN8cQ3UK76AMelMzgZCvJfsi2c+ps= +cloud.google.com/go/accesscontextmanager v1.8.1/go.mod h1:JFJHfvuaTC+++1iL1coPiG1eu5D24db2wXCDWDjIrxo= +cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= +cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= +cloud.google.com/go/aiplatform v1.45.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/aiplatform v1.48.0/go.mod h1:Iu2Q7sC7QGhXUeOhAj/oCK9a+ULz1O4AotZiqjQ8MYA= +cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= +cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/analytics v0.21.2/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/analytics v0.21.3/go.mod h1:U8dcUtmDmjrmUTnnnRnI4m6zKn/yaA5N9RlEkYFHpQo= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigateway v1.6.1/go.mod h1:ufAS3wpbRjqfZrzpvLC2oh0MFlpRJm2E/ts25yyqmXA= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeconnect v1.6.1/go.mod h1:C4awq7x0JpLtrlQCr8AzVIzAaYgngRqWf9S5Uhg+wWs= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apigeeregistry v0.7.1/go.mod h1:1XgyjZye4Mqtw7T9TsY4NW10U7BojBvG4RMD+vRDrIw= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= +cloud.google.com/go/appengine v1.8.1/go.mod h1:6NJXGLVhZCN9aQ/AEDvmfzKEfoYBlfB80/BHiKVputY= +cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= +cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= +cloud.google.com/go/area120 v0.8.1/go.mod h1:BVfZpGpB7KFVNxPiQBuHkX6Ed0rS51xIgmGyjrAfzsg= +cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= +cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= +cloud.google.com/go/artifactregistry v1.14.1/go.mod h1:nxVdG19jTaSTu7yA7+VbWL346r3rIdkZ142BSQqhn5E= +cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= +cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= +cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= +cloud.google.com/go/asset v1.14.1/go.mod h1:4bEJ3dnHCqWCDbWJ/6Vn7GVI9LerSi7Rfdi03hd+WTQ= +cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= +cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= +cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= +cloud.google.com/go/assuredworkloads v1.11.1/go.mod h1:+F04I52Pgn5nmPG36CWFtxmav6+7Q+c5QyJoL18Lry0= +cloud.google.com/go/auth v0.16.3 h1:kabzoQ9/bobUmnseYnBO6qQG7q4a/CffFRlJSxv2wCc= +cloud.google.com/go/auth v0.16.3/go.mod h1:NucRGjaXfzP1ltpcQ7On/VTZ0H4kWB5Jy+Y9Dnm76fA= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= +cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= +cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/automl v1.13.1/go.mod h1:1aowgAHWYZU27MybSCFiukPO7xnyawv7pt3zK4bheQE= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/baremetalsolution v1.1.1/go.mod h1:D1AV6xwOksJMV4OSlWHtWuFNZZYujJknMAP4Qa27QIA= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/batch v1.3.1/go.mod h1:VguXeQKXIYaeeIYbuozUmBR13AfL4SJP7IltNPS+A4A= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= +cloud.google.com/go/beyondcorp v0.6.1/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/beyondcorp v1.0.0/go.mod h1:YhxDWw946SCbmcWo3fAhw3V4XZMSpQ/VYfcKGAEU8/4= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= +cloud.google.com/go/bigquery v1.52.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/bigquery v1.53.0/go.mod h1:3b/iXjRQGU4nKa87cXeg6/gogLjO8C6PmuM8i5Bi/u4= +cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= +cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= +cloud.google.com/go/billing v1.16.0/go.mod h1:y8vx09JSSJG02k5QxbycNRrN7FGZB6F3CAcgum7jvGA= +cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= +cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/binaryauthorization v1.6.1/go.mod h1:TKt4pa8xhowwffiBmbrbcxijJRZED4zrqnwZ1lKH51U= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/certificatemanager v1.7.1/go.mod h1:iW8J3nG6SaRYImIa+wXQ0g8IgoofDFRp5UMzaNk1UqI= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/channel v1.16.0/go.mod h1:eN/q1PFSl5gyu0dYdmxNXscY/4Fi7ABmeHCJNf/oHmc= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/cloudbuild v1.10.1/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/cloudbuild v1.13.0/go.mod h1:lyJg7v97SUIPq4RC2sGsz/9tNczhyv2AjML/ci4ulzU= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= +cloud.google.com/go/clouddms v1.6.1/go.mod h1:Ygo1vL52Ov4TBZQquhz5fiw2CQ58gvu+PlS6PVXCpZI= +cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= +cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= +cloud.google.com/go/cloudtasks v1.11.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/cloudtasks v1.12.1/go.mod h1:a9udmnou9KO2iulGscKR0qBYjreuX8oHwpmFsKspEvM= +cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= +cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= +cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= +cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= +cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/contactcenterinsights v1.9.1/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/contactcenterinsights v1.10.0/go.mod h1:bsg/R7zGLYMVxFFzfh9ooLTruLRCG9fnzhH9KznHhbM= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= +cloud.google.com/go/container v1.22.1/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/container v1.24.0/go.mod h1:lTNExE2R7f+DLbAN+rJiKTisauFCaoDq6NURZ83eVH4= +cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= +cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= +cloud.google.com/go/containeranalysis v0.10.1/go.mod h1:Ya2jiILITMY68ZLPaogjmOMNkwsDrWBSTyBubGXO7j0= +cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= +cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= +cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= +cloud.google.com/go/datacatalog v1.14.0/go.mod h1:h0PrGtlihoutNMp/uvwhawLQ9+c63Kz65UFqh49Yo+E= +cloud.google.com/go/datacatalog v1.14.1/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/datacatalog v1.16.0/go.mod h1:d2CevwTG4yedZilwe+v3E3ZBDRMobQfSG/a6cCCN5R4= +cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= +cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= +cloud.google.com/go/dataflow v0.9.1/go.mod h1:Wp7s32QjYuQDWqJPFFlnBKhkAtiFpMTdg00qGbnIHVw= +cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= +cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/dataform v0.8.1/go.mod h1:3BhPSiw8xmppbgzeBbmDvmSWlwouuJkXsXsb8UBih9M= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= +cloud.google.com/go/datafusion v1.7.1/go.mod h1:KpoTBbFmoToDExJUso/fcCiguGDk7MEzOWXUsJo0wsI= +cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= +cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/datalabeling v0.8.1/go.mod h1:XS62LBSVPbYR54GfYQsPXZjTW8UxCK2fkDciSrpRFdY= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataplex v1.8.1/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataplex v1.9.0/go.mod h1:7TyrDT6BCdI8/38Uvp0/ZxBslOslP2X2MPDucliyvSE= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.0.1/go.mod h1:7Ez3KRHdFGcfY7GcevBbvozX+zyWGcwLJvvAMwCaoZ4= +cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= +cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= +cloud.google.com/go/dataqna v0.8.1/go.mod h1:zxZM0Bl6liMePWsHA8RMGAfmTG34vJMapbHAxQ5+WA8= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= +cloud.google.com/go/datastore v1.12.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.12.1/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastore v1.13.0/go.mod h1:KjdB88W897MRITkvWWJrg2OUtrR5XVj1EoLgSp6/N70= +cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= +cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/datastream v1.9.1/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/datastream v1.10.0/go.mod h1:hqnmr8kdUBmrnk65k5wNRoHSCYksvpdZIcZIEl8h43Q= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= +cloud.google.com/go/deploy v1.11.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/deploy v1.13.0/go.mod h1:tKuSUV5pXbn67KiubiUNUejqLs4f5cxxiCNCeyl0F2g= +cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= +cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= +cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dialogflow v1.38.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dialogflow v1.40.0/go.mod h1:L7jnH+JL2mtmdChzAIcXQHXMvQkE3U4hTaNltEuxXn4= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= +cloud.google.com/go/dlp v1.10.1/go.mod h1:IM8BWz1iJd8njcNcG0+Kyd9OPnqnRNkDV8j42VT5KOI= +cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= +cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= +cloud.google.com/go/documentai v1.20.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/documentai v1.22.0/go.mod h1:yJkInoMcK0qNAEdRnqY/D5asy73tnPe88I1YTZT+a8E= +cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= +cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= +cloud.google.com/go/domains v0.9.1/go.mod h1:aOp1c0MbejQQ2Pjf1iJvnVyT+z6R6s8pX66KaCSDYfE= +cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= +cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/edgecontainer v1.1.1/go.mod h1:O5bYcS//7MELQZs3+7mabRqoWQhXCzenBu0R8bz2rwk= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/essentialcontacts v1.6.2/go.mod h1:T2tB6tX+TRak7i88Fb2N9Ok3PvY3UNbUsMag9/BARh4= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/eventarc v1.12.1/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/eventarc v1.13.0/go.mod h1:mAFCW6lukH5+IZjkvrEss+jmt2kOdYlN8aMx3sRJiAI= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/filestore v1.7.1/go.mod h1:y10jsorq40JJnjR/lQ8AfFbbcGlw3g+Dp8oN7i7FjV4= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= +cloud.google.com/go/firestore v1.11.0/go.mod h1:b38dKhgzlmNNGTNZZwe7ZRFEuRab1Hay3/DBsIGKKy4= +cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= +cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= +cloud.google.com/go/functions v1.15.1/go.mod h1:P5yNWUTkyU+LvW/S9O6V+V423VZooALQlqoXdoPz5AE= +cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= +cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gaming v1.10.1/go.mod h1:XQQvtfP8Rb9Rxnxm5wFVpAp9zCQkJi2bLIb7iHGwB3s= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= +cloud.google.com/go/gkebackup v1.3.0/go.mod h1:vUDOu++N0U5qs4IhG1pcOnD1Mac79xWy6GoBFlWCWBU= +cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= +cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= +cloud.google.com/go/gkeconnect v0.8.1/go.mod h1:KWiK1g9sDLZqhxB2xEuPV8V9NYzrqTUmQR9shJHpOZw= +cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= +cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkehub v0.14.1/go.mod h1:VEXKIJZ2avzrbd7u+zeMtW00Y8ddk/4V9511C9CQGTY= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= +cloud.google.com/go/gkemulticloud v0.6.1/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/gkemulticloud v1.0.0/go.mod h1:kbZ3HKyTsiwqKX7Yw56+wUGwwNZViRnxWK2DVknXWfw= +cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/gsuiteaddons v1.6.1/go.mod h1:CodrdOqRZcLp5WOwejHWYBjZvfY0kOphkAKpF/3qdZY= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= +cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= +cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= +cloud.google.com/go/iam v1.0.1/go.mod h1:yR3tmSL8BcZB4bxByRv2jkSIahVmCtfKZwLYGBalRE8= +cloud.google.com/go/iam v1.1.0/go.mod h1:nxdHjaKfCr7fNYx/HJMM8LgiMugmveWlkatear5gVyk= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= +cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8= +cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/iap v1.8.1/go.mod h1:sJCbeqg3mvWLqjZNsI6dfAtbbV1DL2Rl7e1mTyXYREQ= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/ids v1.4.1/go.mod h1:np41ed8YMU8zOgv53MMMoCntLTn2lF+SUzlM+O3u/jw= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/iot v1.7.1/go.mod h1:46Mgw7ev1k9KqK1ao0ayW9h0lI+3hxeanz+L1zmbbbk= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= +cloud.google.com/go/kms v1.11.0/go.mod h1:hwdiYC0xjnWsKQQCQQmIQnS9asjYVSK6jtXm+zFqXLM= +cloud.google.com/go/kms v1.12.1/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= +cloud.google.com/go/kms v1.22.0 h1:dBRIj7+GDeeEvatJeTB19oYZNV0aj6wEqSIT/7gLqtk= +cloud.google.com/go/kms v1.22.0/go.mod h1:U7mf8Sva5jpOb4bxYZdtw/9zsbIjrklYwPcvMk34AL8= +cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= +cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= +cloud.google.com/go/language v1.10.1/go.mod h1:CPp94nsdVNiQEt1CNjF5WkTcisLiHPyIbMhvR8H2AW0= +cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= +cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/lifesciences v0.9.1/go.mod h1:hACAOd1fFbCGLr/+weUKRAJas82Y4vrL3O5326N//Wc= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/longrunning v0.4.2/go.mod h1:OHrnaYyLUV6oqwh0xiS7e5sLQhP1m0QU9R+WhGDMgIQ= +cloud.google.com/go/longrunning v0.5.0/go.mod h1:0JNuqRShmscVAhIACGtskSAWtqtOoPkwP0YF1oVEchc= +cloud.google.com/go/longrunning v0.5.1/go.mod h1:spvimkwdz6SPWKEt/XBij79E9fiTkHSQl/fRUUQJYJc= +cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE= +cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/managedidentities v1.6.1/go.mod h1:h/irGhTN2SkZ64F43tfGPMbHnypMbu4RB3yl8YcuEak= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= +cloud.google.com/go/maps v1.3.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/maps v1.4.0/go.mod h1:6mWTUv+WhnOwAgjVsSW2QPPECmW+s3PcRyOa9vgG/5s= +cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= +cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= +cloud.google.com/go/mediatranslation v0.8.1/go.mod h1:L/7hBdEYbYHQJhX2sldtTO5SZZ1C1vkapubj0T2aGig= +cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= +cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= +cloud.google.com/go/memcache v1.10.1/go.mod h1:47YRQIarv4I3QS5+hoETgKO40InqzLP6kpNLvyXuyaA= +cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= +cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/metastore v1.11.1/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/metastore v1.12.0/go.mod h1:uZuSo80U3Wd4zi6C22ZZliOUJ3XeM/MlYi/z5OAOWRA= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= +cloud.google.com/go/monitoring v1.15.1/go.mod h1:lADlSAlFdbqQuwwpaImhsJXu1QSdd3ojypXrFSMr2rM= +cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= +cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkconnectivity v1.12.1/go.mod h1:PelxSWYM7Sh9/guf8CFhi6vIqf19Ir/sbfZRUwXh92E= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= +cloud.google.com/go/networkmanagement v1.8.0/go.mod h1:Ho/BUGmtyEqrttTgWEe7m+8vDdK74ibQc+Be0q7Fof0= +cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= +cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= +cloud.google.com/go/networksecurity v0.9.1/go.mod h1:MCMdxOKQ30wsBI1eI659f9kEp4wuuAueoC9AJKSPWZQ= +cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= +cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/notebooks v1.9.1/go.mod h1:zqG9/gk05JrzgBt4ghLzEepPHNwE5jgPcHZRKhlC1A8= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/optimization v1.4.1/go.mod h1:j64vZQP7h9bO49m2rVaTVoNM0vEBEN5eKPUPbZyXOrk= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orchestration v1.8.1/go.mod h1:4sluRF3wgbYVRqz7zJ1/EUNc90TTprliq9477fGobD8= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= +cloud.google.com/go/orgpolicy v1.11.0/go.mod h1:2RK748+FtVvnfuynxBzdnyu7sygtoZa1za/0ZfpOs1M= +cloud.google.com/go/orgpolicy v1.11.1/go.mod h1:8+E3jQcpZJQliP+zaFfayC2Pg5bmhuLK755wKhIIUCE= +cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= +cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= +cloud.google.com/go/osconfig v1.12.0/go.mod h1:8f/PaYzoS3JMVfdfTubkowZYGmAhUCjjwnjqWI7NVBc= +cloud.google.com/go/osconfig v1.12.1/go.mod h1:4CjBxND0gswz2gfYRCUoUzCm9zCABp91EeTtWXyz0tE= +cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= +cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= +cloud.google.com/go/oslogin v1.10.1/go.mod h1:x692z7yAue5nE7CsSnoG0aaMbNoRJRXO4sn73R+ZqAs= +cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= +cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/phishingprotection v0.8.1/go.mod h1:AxonW7GovcA8qdEk13NfHq9hNx5KPtfxXNeUxTDxB6I= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= +cloud.google.com/go/policytroubleshooter v1.7.1/go.mod h1:0NaT5v3Ag1M7U5r0GfDCpUFkWd9YqpubBWsQlhanRv0= +cloud.google.com/go/policytroubleshooter v1.8.0/go.mod h1:tmn5Ir5EToWe384EuboTcVQT7nTag2+DuH3uHmKd1HU= +cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= +cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= +cloud.google.com/go/privatecatalog v0.9.1/go.mod h1:0XlDXW2unJXdf9zFz968Hp35gl/bhF4twwpXZAW50JA= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsub v1.32.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.33.0/go.mod h1:f+w71I33OMyxf9VpMVcZbnG5KSUkCOUHYpFd5U1GdRc= +cloud.google.com/go/pubsub v1.49.0 h1:5054IkbslnrMCgA2MAEPcsN3Ky+AyMpEZcii/DoySPo= +cloud.google.com/go/pubsub v1.49.0/go.mod h1:K1FswTWP+C1tI/nfi3HQecoVeFvL4HUOB1tdaNXKhUY= +cloud.google.com/go/pubsub/v2 v2.0.0 h1:0qS6mRJ41gD1lNmM/vdm6bR7DQu6coQcVwD+VPf0Bz0= +cloud.google.com/go/pubsub/v2 v2.0.0/go.mod h1:0aztFxNzVQIRSZ8vUr79uH2bS3jwLebwK6q1sgEub+E= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= +cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= +cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= +cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= +cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.2/go.mod h1:kR0KjsJS7Jt1YSyWFkseQ756D45kaYNTlDPPaRAvDBU= +cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= +cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= +cloud.google.com/go/recommendationengine v0.8.1/go.mod h1:MrZihWwtFYWDzE6Hz5nKcNz3gLizXVIDI/o3G1DLcrE= +cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= +cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= +cloud.google.com/go/recommender v1.10.1/go.mod h1:XFvrE4Suqn5Cq0Lf+mCP6oBHD/yRMA8XxP5sb7Q7gpA= +cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= +cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/redis v1.13.1/go.mod h1:VP7DGLpE91M6bcsDdMuyCm2hIpB6Vp2hI090Mfd1tcg= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcemanager v1.9.1/go.mod h1:dVCuosgrh1tINZ/RwBufr8lULmWGOkPS8gL5gqyjdT8= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= +cloud.google.com/go/resourcesettings v1.6.1/go.mod h1:M7mk9PIZrC5Fgsu1kZJci6mpgN8o0IUzVx3eJU3y4Jw= +cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= +cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/retail v1.14.1/go.mod h1:y3Wv3Vr2k54dLNIrCzenyKG8g8dhvhncT2NcNjb/6gE= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= +cloud.google.com/go/run v1.2.0/go.mod h1:36V1IlDzQ0XxbQjUx6IYbw8H3TJnWvhii963WW3B/bo= +cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= +cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= +cloud.google.com/go/scheduler v1.10.1/go.mod h1:R63Ldltd47Bs4gnhQkmNDse5w8gBRrhObZ54PxgR2Oo= +cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= +cloud.google.com/go/secretmanager v1.11.1/go.mod h1:znq9JlXgTNdBeQk9TBW/FnR/W4uChEKGeqQWAJ8SXFw= +cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= +cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= +cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= +cloud.google.com/go/security v1.15.1/go.mod h1:MvTnnbsWnehoizHi09zoiZob0iCHVcL4AUBj76h9fXA= +cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= +cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/securitycenter v1.23.0/go.mod h1:8pwQ4n+Y9WCWM278R8W3nF65QtY172h4S8aXyI9/hsQ= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= +cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= +cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicedirectory v1.10.1/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicedirectory v1.11.0/go.mod h1:Xv0YVH8s4pVOwfM/1eMTl0XJ6bzIOSLDt8f8eLaGOxQ= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/shell v1.7.1/go.mod h1:u1RaM+huXFaTojTbW4g9P5emOrrmLE69KrxqQahKn4g= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= +cloud.google.com/go/spanner v1.47.0/go.mod h1:IXsJwVW2j4UKs0eYDqodab6HgGuA1bViSqW4uH9lfUI= +cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= +cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= +cloud.google.com/go/speech v1.17.1/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/speech v1.19.0/go.mod h1:8rVNzU43tQvxDaGvqOhpDqgkJTFowBpDvCJ14kGlJYo= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= +cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= +cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= +cloud.google.com/go/storage v1.30.1/go.mod h1:NfxhC0UJE1aXSx7CIIbCf7y9HKT7BiccwkR7+P7gN8E= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= +cloud.google.com/go/storagetransfer v1.10.0/go.mod h1:DM4sTlSmGiNczmV6iZyceIh2dbs+7z2Ayg6YAiQlYfA= +cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= +cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/talent v1.6.2/go.mod h1:CbGvmKCG61mkdjcqTcLOkb2ZN1SrQI8MDyma2l7VD24= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/texttospeech v1.7.1/go.mod h1:m7QfG5IXxeneGqTapXNxv2ItxP/FS0hCZBwXYqucgSk= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/tpu v1.6.1/go.mod h1:sOdcHVIgDEEOKuqUoi6Fq53MKHJAtOwtz0GuKsWSH3E= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/trace v1.10.1/go.mod h1:gbtL94KE5AJLH3y+WVpfWILmqgc6dXcqgNXdOPAQTYk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.8.1/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/translate v1.8.2/go.mod h1:d1ZH5aaOA0CNhWeXeC8ujd4tdCFw8XoNWRljklu5RHs= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.17.1/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/video v1.19.0/go.mod h1:9qmqPqw/Ib2tLqaeHgtakU+l5TcJxCJbhFXM7UJjVzU= +cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= +cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= +cloud.google.com/go/videointelligence v1.11.1/go.mod h1:76xn/8InyQHarjTWsBR058SmlPCwQjgcvoW0aZykOvo= +cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= +cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= +cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vision/v2 v2.7.2/go.mod h1:jKa8oSYBWhYiXarHPvP4USxYANYUEdEsQrloLjrSwJU= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmmigration v1.7.1/go.mod h1:WD+5z7a/IpZ5bKK//YmT9E047AD+rjycCAvyMxGJbro= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vmwareengine v0.4.1/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vmwareengine v1.0.0/go.mod h1:Px64x+BvjPZwWuc4HdmVhoygcXqEkGHXoa7uyfTgSI0= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= +cloud.google.com/go/vpcaccess v1.7.1/go.mod h1:FogoD46/ZU+JUBX9D606X21EnxiszYi2tArQwLY4SXs= +cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= +cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/webrisk v1.9.1/go.mod h1:4GCmXKcOa2BZcZPn6DCEvE7HypmEJcJkr4mtM+sqYPc= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= +cloud.google.com/go/websecurityscanner v1.6.1/go.mod h1:Njgaw3rttgRHXzwCB8kgCYqv5/rGpFCsBOvPbYgszpg= +cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= +cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= +cloud.google.com/go/workflows v1.11.1/go.mod h1:Z+t10G1wF7h8LgdY/EmRcQY8ptBD/nvofaL6FqlET6g= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= +github.com/99designs/gqlgen v0.17.72 h1:2JDAuutIYtAN26BAtigfLZFnTN53fpYbIENL8bVgAKY= +github.com/99designs/gqlgen v0.17.72/go.mod h1:BoL4C3j9W2f95JeWMrSArdDNGWmZB9MOS2EMHJDZmUc= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.2 h1:C4huKojabL8u+MknxnBYUk2Dudkii5kRH5PhD6gp2MA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.2/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.2 h1:SS3xTi1zlyhslE7kJsrMErKAA56rdAP1Ll4ZWCRkq/o= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.2/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.2 h1:v9PTAUhEQhHh+AZIU1OgzpJdSB76pwPI9+erztcdsJU= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.2/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.2 h1:WC69FCbHoYQEneHtp8cv4A71GpT/WNjv5EiYkuopvFo= +github.com/DataDog/datadog-agent/pkg/proto v0.71.2/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.2 h1:F3Zk3JxkSnQ0rs4kifZ1y94alDqo/SAT9rwQlT0Nx7c= +github.com/DataDog/datadog-agent/pkg/trace v0.71.2/go.mod h1:cCkrxJC4m2KSDdfYlKb60W4yEguO5nBpmGquVX8Lb1w= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.2 h1:GaOMKewaJnnbaOX1cdsZbsQCmKxCNamPyxI7e7kSL6c= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.2/go.mod h1:lsew565lFp63tFjppWCKpZ1qVJrLhjFNGyTa/cwqZDY= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.2 h1:0QkToZ7R5bpiHcaa9pBOVXaMODxh9pUvMb3kpfT/nik= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.2/go.mod h1:0xxMqmIVxjAAXBUk2ntnvPuj0UjGDAEXZqLPLHF4eYg= +github.com/DataDog/datadog-agent/pkg/version v0.71.2 h1:5wVVZrOCzvH6ka+J/3iKQH3rMJPIW1OaLOkOO/DRX8U= +github.com/DataDog/datadog-agent/pkg/version v0.71.2/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.8.1 h1:+GOES5W9zpKlhwHptZVW2C0NLVf7ilr7pHkDcbNvpIc= +github.com/DataDog/datadog-go/v5 v5.8.1/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev h1:srl0FPpKiginZRfuUCioeUV8gJuTLmNY7pS6AxZl4qQ= +github.com/DataDog/dd-trace-go/instrumentation/testutils/grpc/v2 v2.4.0-dev/go.mod h1:rG6TpmIBAZEpcNHjD1q/4qtbWNKWw61UH3IS+FsjReQ= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6 h1:rIMZ3Bqn2w8nWrAIXekOdm+sZVxUYHGX8cS7P9W06Kk= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250806100345-ca5e7fdaf7b6/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/orchestrion v1.6.0 h1:vGlV16WhB8CWP26ehdsiDkVN09lslnG60utJ+wb9rS4= +github.com/DataDog/orchestrion v1.6.0/go.mod h1:CYY2VfaEQVr+gwKSlpUoHBF9JIO4eV3BfSeG0YAQwZE= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= +github.com/IBM/sarama v1.40.0 h1:QTVmX+gMKye52mT5x+Ve/Bod2D0Gy7ylE2Wslv+RHtc= +github.com/IBM/sarama v1.40.0/go.mod h1:6pBloAs1WanL/vsq5qFTyTGulJUntZHhMLOUYEIs9mg= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/Microsoft/hcsshim v0.11.4 h1:68vKo2VN8DE9AdN4tnkWnmdhqdbpUFM8OF3Airm7fz8= +github.com/Microsoft/hcsshim v0.11.4/go.mod h1:smjE4dvqPX9Zldna+t5FG3rnoHhaB7QYxPRqGcpAD9w= +github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= +github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= +github.com/Shopify/toxiproxy/v2 v2.5.0 h1:i4LPT+qrSlKNtQf5QliVjdP08GyAH8+BUIc9gT0eahc= +github.com/Shopify/toxiproxy/v2 v2.5.0/go.mod h1:yhM2epWtAmel9CB8r2+L+PCmhH6yH2pITaPAo7jxJl0= +github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu1fXES56uXniYFv4yDA= +github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ= +github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc= +github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM= +github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= +github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antithesishq/antithesis-sdk-go v0.5.0 h1:cudCFF83pDDANcXFzkQPUHHedfnnIbUO3JMr9fqwFJs= +github.com/antithesishq/antithesis-sdk-go v0.5.0/go.mod h1:IUpT2DPAKh6i/YhSbt6Gl3v2yvUZjmKncl7U91fup7E= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= +github.com/apache/arrow/go/v12 v12.0.0/go.mod h1:d+tV/eHZZ7Dz7RPrFKtPK02tpr+c9/PEd/zm8mDS9Vg= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/aws/aws-sdk-go v1.44.327 h1:ZS8oO4+7MOBLhkdwIhgtVeDzCeWOlTfKJS7EgggbIEY= +github.com/aws/aws-sdk-go v1.44.327/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go-v2 v1.26.1 h1:5554eUqIYVWpU0YmeeYZ0wU64H2VLBs8TlhRB2L+EkA= +github.com/aws/aws-sdk-go-v2 v1.26.1/go.mod h1:ffIFB97e2yNsv4aTSGkqtHnppsIJzw7G7BReUZ3jCXM= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2 h1:x6xsQXGSmW6frevwDA+vi/wqhp1ct18mVXYN08/93to= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.2/go.mod h1:lPprDr1e6cJdyYeGXnRaJoP4Md+cDBvi2eOj00BlGmg= +github.com/aws/aws-sdk-go-v2/config v1.27.11 h1:f47rANd2LQEYHda2ddSCKYId18/8BhSRM4BULGmfgNA= +github.com/aws/aws-sdk-go-v2/config v1.27.11/go.mod h1:SMsV78RIOYdve1vf36z8LmnszlRWkwMQtomCAI0/mIE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11 h1:YuIB1dJNf1Re822rriUOTxopaHHvIq0l/pX3fwO+Tzs= +github.com/aws/aws-sdk-go-v2/credentials v1.17.11/go.mod h1:AQtFPsDH9bI2O+71anW6EKL+NcD7LG3dpKGMV4SShgo= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1 h1:FVJ0r5XTHSmIHJV6KuDmdYhEpvlHpiSd38RQWhut5J4= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.1/go.mod h1:zusuAeqezXzAB24LGuzuekqMAEgWkVYukBec3kr3jUg= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14 h1:Nhcq+ODoD9FRQYI3lATy6iADS5maER3ZXSfE8v3FMh8= +github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.16.14/go.mod h1:VlBbwTpgCj3rKWMVkEAYiAR3FKs7Mi3jALTMGfbfuns= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5 h1:aw39xVGeRWlWx9EzGVnhOR4yOjQDHPQ6o6NmBlscyQg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.5/go.mod h1:FSaRudD0dXiMPK2UjknVwwTYyZMRsHv3TtkabsZih5I= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5 h1:PG1F3OD1szkuQPzDw3CIQsRIrtTlUC3lP84taWzHlq0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.5/go.mod h1:jU1li6RFryMz+so64PpKtudI+QzbKoIEivqdf6LNpOc= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 h1:hT8rVHwugYE2lEfdFE0QWVo81lF7jMrYJVDWI+f+VxU= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0/go.mod h1:8tu/lYfQfFe6IGnaOdrpVgEL2IrrDOf6/m9RQum4NkY= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5 h1:81KE7vaZzrl7yHBYHVEzYB8sypz11NMOZ40YlWvPxsU= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.5/go.mod h1:LIt2rg7Mcgn09Ygbdh/RdIm0rQ+3BNkbP1gyVMFtRK0= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1 h1:dZXY07Dm59TxAjJcUfNMJHLDI/gLMxTRZefn2jFAVsw= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.31.1/go.mod h1:lVLqEtX+ezgtfalyJs7Peb0uv9dEpAQP5yuq2O26R44= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4 h1:Vz4ilZcVXCR9yatX5yfMrkBldYggtkih3h7woHvzu5Q= +github.com/aws/aws-sdk-go-v2/service/eventbridge v1.30.4/go.mod h1:aIINXlt2xXhMeRsyCsLDUDohI8AdDm92gY9nIB6pv0M= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2 h1:Ji0DY1xUsUr3I8cHps0G+XM3WWU16lP6yG8qu1GAZAs= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.2/go.mod h1:5CsjAbs3NlGQyZNFACh+zztPDI7fU6eW9QsxjfnuBKg= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7 h1:ZMeFZ5yk+Ek+jNr1+uwCd2tG89t6oTS5yVWpa6yy2es= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.7/go.mod h1:mxV05U+4JiHqIpGqqYXOHLPKUC6bDXC44bsUhNjOEwY= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6 h1:6tayEze2Y+hiL3kdnEUxSPsP+pJsUfwLSFspFl1ru9Q= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.9.6/go.mod h1:qVNb/9IOVsLCZh0x2lnagrBwQ9fxajUpXS7OZfIsKn0= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7 h1:ogRAwT1/gxJBcSWDMZlgyFUM962F51A5CRhDLbxLdmo= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.7/go.mod h1:YCsIZhXfRPLFFCl5xxY+1T9RKzOKjCut+28JSX2DnAk= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5 h1:f9RyWNtS8oH7cZlbn+/JNPpjUk5+5fLd5lM9M0i49Ys= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.5/go.mod h1:h5CoMZV2VF297/VLhRhO1WF+XYWOzXo+4HsObA4HjBQ= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4 h1:Oe8awBiS/iitcsRJB5+DHa3iCxoA0KwJJf0JNrYMINY= +github.com/aws/aws-sdk-go-v2/service/kinesis v1.27.4/go.mod h1:RCZCSFbieSgNG1RKegO26opXV4EXyef/vNBVJsUyHuw= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1 h1:6cnno47Me9bRykw9AEv9zkXE+5or7jz8TsskTTccbgc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.53.1/go.mod h1:qmdkIIAC+GCLASF7R2whgNrJADz0QZPX+Seiw/i4S3o= +github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4 h1:LM5AENhJDUd3fHP5NI8hk1jR+Io54/TmEQCWkRmfJE8= +github.com/aws/aws-sdk-go-v2/service/sfn v1.26.4/go.mod h1:YYRs4t+xgLXx9lBMW8Rs6wF61RtEOFrKa8hNMgq6DvI= +github.com/aws/aws-sdk-go-v2/service/sns v1.29.4 h1:VhW/J21SPH9bNmk1IYdZtzqA6//N2PB5Py5RexNmLVg= +github.com/aws/aws-sdk-go-v2/service/sns v1.29.4/go.mod h1:DojKGyWXa4p+e+C+GpG7qf02QaE68Nrg2v/UAXQhKhU= +github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4 h1:mE2ysZMEeQ3ulHWs4mmc4fZEhOfeY1o6QXAfDqjbSgw= +github.com/aws/aws-sdk-go-v2/service/sqs v1.31.4/go.mod h1:lCN2yKnj+Sp9F6UzpoPPTir+tSaC9Jwf6LcmTqnXFZw= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5 h1:vN8hEbpRnL7+Hopy9dzmRle1xmDc7o8tmY0klsr175w= +github.com/aws/aws-sdk-go-v2/service/sso v1.20.5/go.mod h1:qGzynb/msuZIE8I75DVRCUXw3o3ZyBmUvMwQ2t/BrGM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4 h1:Jux+gDDyi1Lruk+KHF91tK2KCuY61kzoCpvtvJJBtOE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.23.4/go.mod h1:mUYPBhaF2lGiukDEjJX2BLRRKTmoUSitGDUgM4tRxak= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6 h1:cwIxeBttqPN3qkaAjcEcsh8NYr8n2HZPkcKgPAi1phU= +github.com/aws/aws-sdk-go-v2/service/sts v1.28.6/go.mod h1:FZf1/nKNEkHdGGJP/cI2MoIMquumuRK6ol3QQJNDxmw= +github.com/aws/smithy-go v1.20.2 h1:tbp628ireGtzcHDDmLT/6ADHidqnwgF57XOXZe6tp4Q= +github.com/aws/smithy-go v1.20.2/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= +github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= +github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= +github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4= +github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/buger/goterm v1.0.4 h1:Z9YvGmOih81P0FbVtEYTFF6YsSgxSUKEhf/f9bTMXbY= +github.com/buger/goterm v1.0.4/go.mod h1:HiFWV3xnkolgrBV3mY8m0X0Pumt4zg4QhbdOzQtB8tE= +github.com/bytedance/sonic v1.12.0 h1:YGPgxF9xzaCNvd/ZKdQ28yRovhfMFZQjuk6fKBzZ3ls= +github.com/bytedance/sonic v1.12.0/go.mod h1:B8Gt/XvtZ3Fqj+iSKMypzymZxw/FVwgIGKzMzT9r/rk= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.2.0 h1:zNprn+lsIP06C/IqCHs3gPQIvnvpKbbxyXQP1iU4kWM= +github.com/bytedance/sonic/loader v0.2.0/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charmbracelet/colorprofile v0.3.2 h1:9J27WdztfJQVAQKX2WOlSSRB+5gaKqqITmrvb1uTIiI= +github.com/charmbracelet/colorprofile v0.3.2/go.mod h1:mTD5XzNeWHj8oqHb+S1bssQb7vIHbepiebQ2kPKVKbI= +github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY= +github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30= +github.com/charmbracelet/x/ansi v0.10.2 h1:ith2ArZS0CJG30cIUfID1LXN7ZFXRCww6RUvAPA+Pzw= +github.com/charmbracelet/x/ansi v0.10.2/go.mod h1:HbLdJjQH4UH4AqA2HpRWuWNluRE6zxJH/yteYEYCFa8= +github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= +github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= +github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= +github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/clipperhouse/uax29/v2 v2.2.0 h1:ChwIKnQN3kcZteTXMgb1wztSgaU+ZemkgWdohwgs8tY= +github.com/clipperhouse/uax29/v2 v2.2.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/cloudwego/base64x v0.1.4 h1:jwCgWpFanWmN8xoIUHa2rtzmkd5J2plF/dnLS6Xd/0Y= +github.com/cloudwego/base64x v0.1.4/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20240423153145-555b57ec207b/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2 h1:eJ01FpliL/02KvsaPyH1bSLbM1S70yWQUojHVRbyvy4= +github.com/compose-spec/compose-go/v2 v2.0.0-rc.2/go.mod h1:IVsvFyGVhw4FASzUtlWNVaAOhYmakXAFY9IlZ7LAuD8= +github.com/confluentinc/confluent-kafka-go v1.9.2 h1:gV/GxhMBUb03tFWkN+7kdhg+zf+QUM+wVkI9zwh770Q= +github.com/confluentinc/confluent-kafka-go v1.9.2/go.mod h1:ptXNqsuDfYbAE/LBW6pnwWZElUoWxHoV8E43DCrliyo= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0 h1:NbOku86JJlsRJPJKE0snNsz6D1Qr4j5VR/lticrLZrY= +github.com/confluentinc/confluent-kafka-go/v2 v2.4.0/go.mod h1:E1dEQy50ZLfqs7T9luxz0rLxaeFZJZE92XvApJOr/Rk= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.29 h1:90fWABQsaN9mJhGkoVnuzEY+o1XDPbg9BTC9QTAHnuE= +github.com/containerd/containerd v1.7.29/go.mod h1:azUkWcOvHrWvaiUjSQH0fjzuHIwSPg1WL5PshGP4Szs= +github.com/containerd/containerd/api v1.10.0 h1:5n0oHYVBwN4VhoX9fFykCV9dF1/BvAXeg2F8W6UYq1o= +github.com/containerd/containerd/api v1.10.0/go.mod h1:NBm1OAk8ZL+LG8R0ceObGxT5hbUYj7CzTmR3xh0DlMM= +github.com/containerd/continuity v0.4.2 h1:v3y/4Yz5jwnvqPKJJ+7Wf93fyWoCB3F5EclWG023MDM= +github.com/containerd/continuity v0.4.2/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/ttrpc v1.2.5 h1:IFckT1EFQoFBMG4c3sMdT8EP3/aKfumK1msY+Ze4oLU= +github.com/containerd/ttrpc v1.2.5/go.mod h1:YCXHsb32f+Sq5/72xHubdiJRQY9inL4a4ZQrAbN1q9o= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.1 h1:/FpZ+JaygUR/lZP2NlFI2DVfrOEMAIKP5wWEJdoYe9E= +github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= +github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.11.0 h1:9rHa233rhdOyrz2GcP9NM+gi2psgJZ4GWDpL/7ND8HI= +github.com/denisenkom/go-mssqldb v0.11.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315 h1:UZxx9xBADdf/9UmSdEUi+pdJoPKpgcf9QUAY5gEIYmY= +github.com/docker/buildx v0.12.0-rc2.0.20231219140829-617f538cb315/go.mod h1:X8ZHhuW6ncwtoJ36TlU+gyaROTcBkTE01VHYmTStQCE= +github.com/docker/cli v25.0.1+incompatible h1:mFpqnrS6Hsm3v1k7Wa/BO23oz0k121MTbTO1lpcGSkU= +github.com/docker/cli v25.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/compose/v2 v2.24.3 h1:BVc1oDV7aQgksH64pDKTvcI95G36uJ+Mz9DGGBBoZeQ= +github.com/docker/compose/v2 v2.24.3/go.mod h1:D8Nv9+juzD7xiMyyHJ7G2J/MOYiGBmb9SvdIW5+2zKo= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v27.2.1+incompatible h1:fQdiLfW7VLscyoeYEBz7/J8soYFDZV1u6VW6gJEjNMI= +github.com/docker/docker v27.2.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c h1:lzqkGL9b3znc+ZUgi7FlLnqjQhcXxkNM/quxIjBVMD0= +github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK5QUlFslkQu2yW2TKzFZcXq/leZfM0UH5Q= +github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c= +github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= +github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/eapache/go-resiliency v1.4.0 h1:3OK9bWpPk5q6pbFAaYSEwD9CLUSHG8bnZuqX2yMt3B0= +github.com/eapache/go-resiliency v1.4.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= +github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/ebitengine/purego v0.9.0 h1:mh0zpKBIXDceC63hpvPuGLiJ8ZAa3DfrFTudmfi8A4k= +github.com/ebitengine/purego v0.9.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/elastic/elastic-transport-go/v8 v8.1.0 h1:NeqEz1ty4RQz+TVbUrpSU7pZ48XkzGWQj02k5koahIE= +github.com/elastic/elastic-transport-go/v8 v8.1.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= +github.com/elastic/go-elasticsearch/v6 v6.8.5 h1:U2HtkBseC1FNBmDr0TR2tKltL6FxoY+niDAlj5M8TK8= +github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox93HoX8utj1kxD9aFUcI= +github.com/elastic/go-elasticsearch/v7 v7.17.1 h1:49mHcHx7lpCL8cW1aioEwSEVKQF3s+Igi4Ye/QTWwmk= +github.com/elastic/go-elasticsearch/v7 v7.17.1/go.mod h1:OJ4wdbtDNk5g503kvlHLyErCgQwwzmDtaFC4XyOxXA4= +github.com/elastic/go-elasticsearch/v8 v8.4.0 h1:Rn1mcqaIMcNT43hnx2H62cIFZ+B6mjWtzj85BDKrvCE= +github.com/elastic/go-elasticsearch/v8 v8.4.0/go.mod h1:yY52i2Vj0unLz+N3Nwx1gM5LXwoj3h2dgptNGBYkMLA= +github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= +github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= +github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQMw58jvjymeCzBU3mWyHw= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/frankban/quicktest v1.2.2/go.mod h1:Qh/WofXFeiAFII1aEBu529AtJo6Zg2VHscnEsbBnJ20= +github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= +github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= +github.com/fsnotify/fsevents v0.1.1 h1:/125uxJvvoSDDBPen6yUZbil8J9ydKZnnl3TWWmvnkw= +github.com/fsnotify/fsevents v0.1.1/go.mod h1:+d+hS27T6k5J8CRaPLKFgwKYcpS7GwW3Ule9+SC2ZRc= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo= +github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= +github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= +github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= +github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= +github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ= +github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y= +github.com/go-chi/chi v1.5.4 h1:QHdzF2szwjqVV4wmByUnTcsbIg7UGaQ0tPF2t5GcAIs= +github.com/go-chi/chi v1.5.4/go.mod h1:uaf8YgoFazUOkPBG7fxPftUylNumIev9awIWOENIuEg= +github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618= +github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops= +github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-jose/go-jose/v4 v4.1.1 h1:JYhSgy4mXXzAdF3nUx3ygx347LRXJRrpgyU3adRmkAI= +github.com/go-jose/go-jose/v4 v4.1.1/go.mod h1:BdsZGqgdO3b6tTc6LSE56wcDbMMLuPsw5d4ZD5f94kA= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.20.0 h1:K9ISHbSaI0lyB2eWMPJo+kOS/FBExVwjEviJTixqxL8= +github.com/go-playground/validator/v10 v10.20.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= +github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= +github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-redis/redis/v7 v7.4.1 h1:PASvf36gyUpr2zdOUS/9Zqc80GbM+9BDyiJSJDDOrTI= +github.com/go-redis/redis/v7 v7.4.1/go.mod h1:JDNMw23GTyLNC4GZu9njt15ctBQVn7xjRfnwdHj/Dcg= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= +github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/gocql/gocql v1.6.0 h1:IdFdOTbnpbd0pDhl4REKQDM+Q0SzKXQ1Yh+YZZ8T/qU= +github.com/gocql/gocql v1.6.0/go.mod h1:3gM2c4D3AnkISwBxGnMMsS8Oy4y2lhbPRsH4xnJrHG8= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5cw= +github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= +github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= +github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA= +github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A= +github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= +github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.2.1-0.20190312032427-6f77996f0c42/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/go-tpm v0.9.6 h1:Ku42PT4LmjDu1H5C5ISWLlpI1mj+Zq7sPGKoRw2XROA= +github.com/google/go-tpm v0.9.6/go.mod h1:h9jEsEECg7gtLis0upRBQU+GhYVH6jMjrFxI8u6bVUY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20211008130755-947d60d73cc0/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db h1:097atOisP2aRj7vFgYQBbFN4U4JNXUNYpxael3UzMyo= +github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0= +github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= +github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= +github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= +github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= +github.com/googleapis/gax-go/v2 v2.15.0 h1:SyjDc1mGgZU5LncH8gimWo9lW1DtIfPibOG81vgd/bo= +github.com/googleapis/gax-go/v2 v2.15.0/go.mod h1:zVVkkxAQHa1RQpg9z2AUCMnKhi0Qld9rcmyfL1OZhoc= +github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/graphql-go/graphql v0.8.1 h1:p7/Ou/WpmulocJeEx7wjQy611rtXGQaAcXGqanuMMgc= +github.com/graphql-go/graphql v0.8.1/go.mod h1:nKiHzRM0qopJEwCITUuIsxk9PlVlwIiiI8pnJEhordQ= +github.com/graphql-go/handler v0.2.3 h1:CANh8WPnl5M9uA25c2GBhPqJhE53Fg0Iue/fRNla71E= +github.com/graphql-go/handler v0.2.3/go.mod h1:leLF6RpV5uZMN1CdImAxuiayrYYhOk33bZciaUGaXeU= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= +github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= +github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= +github.com/hashicorp/go-retryablehttp v0.7.7 h1:C8hUCYzor8PIfXHa4UrZkU4VvK8o9ISHxT2Q8+VepXU= +github.com/hashicorp/go-retryablehttp v0.7.7/go.mod h1:pkQpWZeYWskR+D1tR2O5OcBFOxfA7DoAO6xtkuQnHTk= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9 h1:FW0YttEnUNDJ2WL9XcrrfteS1xW8u+sh4ggM8pN5isQ= +github.com/hashicorp/go-secure-stdlib/parseutil v0.1.9/go.mod h1:Ll013mhdmsVDuoIXVfBtvgGJsXDYkTw1kooNcoCXuE0= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 h1:kes8mmyCpxJsI7FTwtzRqEy9CdjCtrXrXGuOpxEA7Ts= +github.com/hashicorp/go-secure-stdlib/strutil v0.1.2/go.mod h1:Gou2R9+il93BqX25LAKCLuM+y9U2T4hlwvT1yprcna4= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= +github.com/hashicorp/hcl v1.0.1-vault-5 h1:kI3hhbbyzr4dldA8UdTb7ZlVVlI2DACdCfz31RPDgJM= +github.com/hashicorp/hcl v1.0.1-vault-5/go.mod h1:XYhtn6ijBSAj6n4YqAaf7RBPS4I06AItNorpy+MoQNM= +github.com/hashicorp/vault/api v1.15.0 h1:O24FYQCWwhwKnF7CuSqP30S51rTV7vz1iACXE/pj5DA= +github.com/hashicorp/vault/api v1.15.0/go.mod h1:+5YTO09JGn0u+b6ySD/LLVf8WkJCPLAL2Vkmrn2+CM8= +github.com/hashicorp/vault/sdk v0.15.0 h1:xNo1lL2shm0yE4coXNZkTV/6++2GfEh+/cCAfBjzEnA= +github.com/hashicorp/vault/sdk v0.15.0/go.mod h1:2Wj2tHIgfz0gNWgEPWBbCXFIiPrq96E8FTjPNV9J1Bc= +github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/in-toto/in-toto-golang v0.5.0 h1:hb8bgwr0M2hGdDsLjkJ3ZqJ8JFLL/tgYdAxF/XEFBbY= +github.com/in-toto/in-toto-golang v0.5.0/go.mod h1:/Rq0IZHLV7Ku5gielPT4wPHJfH1GdHMCq8+WPxw8/BE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/invopop/jsonschema v0.4.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= +github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= +github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= +github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.6.0 h1:SWJzexBzPL5jb0GEsrPMLIsi/3jOo7RHlzTjcAeDrPY= +github.com/jackc/pgx/v5 v5.6.0/go.mod h1:DNZ/vlrUnhWCoFGxHAG8U2ljioxukquj7utPDgtQdTw= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= +github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= +github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= +github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= +github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= +github.com/jcmturner/gofork v1.7.6 h1:QH0l3hzAU1tfT3rZCnW5zXl+orbkNMMRGJfdJjHVETg= +github.com/jcmturner/gofork v1.7.6/go.mod h1:1622LH6i/EZqLloHfE7IeZ0uEJwMSUyQ/nDd82IeqRo= +github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= +github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= +github.com/jcmturner/gokrb5/v8 v8.4.4 h1:x1Sv4HaTpepFkXbt2IkL29DXRf8sOfZXo8eRKh687T8= +github.com/jcmturner/gokrb5/v8 v8.4.4/go.mod h1:1btQEpgT6k+unzCwX1KdWMEwPPkkgBtP+F6aCACiMrs= +github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= +github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= +github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= +github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= +github.com/jhump/protoreflect v1.12.0/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= +github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/qthttptest v0.1.1/go.mod h1:aTlAv8TYaflIiTDIQYzxnl1QdPjAg8Q8qJMErpKy6A4= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4= +github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/liamg/memoryfs v1.6.0 h1:jAFec2HI1PgMTem5gR7UT8zi9u4BfG5jorCRlLH06W8= +github.com/liamg/memoryfs v1.6.0/go.mod h1:z7mfqXFQS8eSeBBsFjYLlxYRMRyiPktytvYCYTb3BSk= +github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= +github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/linkedin/goavro v2.1.0+incompatible/go.mod h1:bBCwI2eGYpUI/4820s67MElg9tdeLbINjLjiM2xZFYM= +github.com/linkedin/goavro/v2 v2.10.0/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.10.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/linkedin/goavro/v2 v2.11.1/go.mod h1:UgQUb2N/pmueQYH9bfqFioWxzYCZXSfF8Jw03O5sjqA= +github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag= +github.com/lucasb-eyer/go-colorful v1.3.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 h1:PwQumkgq4/acIiZhtifTV5OUqqiP82UAl0h87xj/l9k= +github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= +github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= +github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk= +github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mattn/go-sqlite3 v1.14.18 h1:JL0eqdCOq6DJVNPSvArO/bIV9/P7fbGrV00LZHc+5aI= +github.com/mattn/go-sqlite3 v1.14.18/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= +github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= +github.com/miekg/pkcs11 v1.1.1 h1:Ugu9pdy6vAYku5DEpVWVFPYnzV+bxB+iRdbuFSu7TvU= +github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/highwayhash v1.0.3 h1:kbnuUMoHYyVl7szWjSxJnxw11k2U709jqFPPmIUyD6Q= +github.com/minio/highwayhash v1.0.3/go.mod h1:GGYsuwP/fPD6Y9hMiXuapVvlIUEhFhMTh0rxU3ik1LQ= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE= +github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991 h1:r80LLQ91uOLxU1ElAvrB1o8oBsph51lPzVnr7t2b200= +github.com/moby/buildkit v0.13.0-beta1.0.20231219135447-957cb50df991/go.mod h1:6MddWPSL5jxy+W8eMMHWDOfZzzRRKWXPZqajw72YHBc= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk= +github.com/moby/patternmatcher v0.6.0/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/spdystream v0.5.0 h1:7r0J1Si3QO/kjRitvSLVVFUjxMEb/YLj6S9FF62JBCU= +github.com/moby/spdystream v0.5.0/go.mod h1:xBAYlnt/ay+11ShkdFKNAG7LsyK/tmNBVvVOwrfMgdI= +github.com/moby/sys/mountinfo v0.7.1 h1:/tTvQaSJRr2FshkhXiIpux6fQ2Zvc4j7tAhMTStAG2g= +github.com/moby/sys/mountinfo v0.7.1/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZc= +github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= +github.com/moby/sys/user v0.2.0 h1:OnpapJsRp25vkhw8TFG6OLJODNh/3rEwRWtJ3kakwRM= +github.com/moby/sys/user v0.2.0/go.mod h1:RYstrcWOJpVh+6qzUqp2bU3eaRpdiQeKGlKitaH0PM8= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/montanaflynn/stats v0.6.6 h1:Duep6KMIDpY4Yo11iFsvyqJDyfzLF9+sndUKT+v64GQ= +github.com/montanaflynn/stats v0.6.6/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= +github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f h1:y5//uYreIhSUg3J1GEMiLbxo1LJaP8RfCpH6pymGZus= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/nats-io/jwt/v2 v2.8.0 h1:K7uzyz50+yGZDO5o772eRE7atlcSEENpL7P+b74JV1g= +github.com/nats-io/jwt/v2 v2.8.0/go.mod h1:me11pOkwObtcBNR8AiMrUbtVOUGkqYjMQZ6jnSdVUIA= +github.com/nats-io/nats-server/v2 v2.12.1 h1:0tRrc9bzyXEdBLcHr2XEjDzVpUxWx64aZBm7Rl1QDrA= +github.com/nats-io/nats-server/v2 v2.12.1/go.mod h1:OEaOLmu/2e6J9LzUt2OuGjgNem4EpYApO5Rpf26HDs8= +github.com/nats-io/nats.go v1.47.0 h1:YQdADw6J/UfGUd2Oy6tn4Hq6YHxCaJrVKayxxFqYrgM= +github.com/nats-io/nats.go v1.47.0/go.mod h1:iRWIPokVIFbVijxuMQq4y9ttaBTMe0SFdlZfMDd+33g= +github.com/nats-io/nkeys v0.4.11 h1:q44qGV008kYd9W1b1nEBkNzvnWxtRSQ7A8BoqRrcfa0= +github.com/nats-io/nkeys v0.4.11/go.mod h1:szDimtgmfOi9n25JpfIdGw12tZFYXqhGxjhVxsatHVE= +github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/nrwiersma/avro-benchmarks v0.0.0-20210913175520-21aec48c8f76/go.mod h1:iKyFMidsk/sVYONJRE372sJuX/QTRPacU7imPqqsu7g= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= +github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/otiai10/copy v1.14.1 h1:5/7E6qsUMBaH5AnQ0sSLzzTg1oTECmcCmT6lvF45Na8= +github.com/otiai10/copy v1.14.1/go.mod h1:oQwrEDDOci3IM8dJF0d8+jnbfPDllW6vUjNc3DoZm9I= +github.com/otiai10/mint v1.6.3 h1:87qsV/aw1F5as1eH1zS/yqHY85ANKVMgkDrf9rcxbQs= +github.com/otiai10/mint v1.6.3/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= +github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea h1:0hdZfdf74rU/bEndy2uZJyNeY21jmH751KmdAjOmEiA= +github.com/polyfloyd/go-errorlint v1.8.1-0.20250906200200-9b25878c4dea/go.mod h1:msT1JMnFNM1gqj7rtZYaA0EtpIYNeLQSsKJChZNA+5A= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc= +github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= +github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM= +github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA= +github.com/redis/rueidis v1.0.55 h1:PrRv6eETcanBgYVNdwxn6RyUaPfxN6H+b5jUA4mfpkw= +github.com/redis/rueidis v1.0.55/go.mod h1:cr7ILwt1AqyMRfjWlA9Orubj6gp1xzn1DPyhmrhv/x0= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= +github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/clock v0.0.0-20190514195947-2896927a307a/go.mod h1:4r5QyqhjIWCcK8DO4KMclc5Iknq5qVBAlbYYzAbUScQ= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= +github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= +github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= +github.com/ryanuber/go-glob v1.0.0 h1:iQh3xXAumdQ+4Ufa5b25cRpC5TYKlno6hsv6Cb3pkBk= +github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= +github.com/santhosh-tekuri/jsonschema/v5 v5.0.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/secure-systems-lab/go-securesystemslib v0.9.1 h1:nZZaNz4DiERIQguNy0cL5qTdn9lR8XKHf4RUyG1Sx3g= +github.com/secure-systems-lab/go-securesystemslib v0.9.1/go.mod h1:np53YzT0zXGMv6x4iEWc9Z59uR+x+ndLwCLqPYpLXVU= +github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= +github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 h1:ka9QPuQg2u4LGipiZGsgkg3rJCo4iIUCy75FddM0GRQ= +github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= +github.com/shibumi/go-pathspec v1.3.0 h1:QUyMZhFo0Md5B8zV8x2tesohbb5kfbpTi9rBnKh5dkI= +github.com/shibumi/go-pathspec v1.3.0/go.mod h1:Xutfslp817l2I1cZvgcfeMQJG5QnU2lh5tVaaMCl3jE= +github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU= +github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8= +github.com/shirou/gopsutil/v4 v4.25.9 h1:JImNpf6gCVhKgZhtaAHJ0serfFGtlfIlSC08eaKdTrU= +github.com/shirou/gopsutil/v4 v4.25.9/go.mod h1:gxIxoC+7nQRwUl/xNhutXlD8lq+jxTgpIkEf3rADHL8= +github.com/shoenig/go-m1cpu v0.1.7 h1:C76Yd0ObKR82W4vhfjZiCp0HxcSZ8Nqd84v+HZ0qyI0= +github.com/shoenig/go-m1cpu v0.1.7/go.mod h1:KkDOw6m3ZJQAPHbrzkZki4hnx+pDRR1Lo+ldA56wD5w= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4= +github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/testcontainers/testcontainers-go v0.29.1 h1:z8kxdFlovA2y97RWx98v/TQ+tR+SXZm6p35M+xB92zk= +github.com/testcontainers/testcontainers-go v0.29.1/go.mod h1:SnKnKQav8UcgtKqjp/AD8bE1MqZm+3TDb/B8crE3XnI= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1 h1:47ipPM+s+ltCDOP3Sa1j95AkNb+z+WGiHLDbLU8ixuc= +github.com/testcontainers/testcontainers-go/modules/compose v0.29.1/go.mod h1:Sqh+Ef2ESdbJQjTJl57UOkEHkOc7gXvQLg1b5xh6f1Y= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/theupdateframework/notary v0.7.0 h1:QyagRZ7wlSpjT5N2qQAh/pN+DVqgekv4DzbAiAiEL3c= +github.com/theupdateframework/notary v0.7.0/go.mod h1:c9DRxcmhHmVLDay4/2fUYdISnHqbFDGRSlXPO0AhYWw= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375 h1:QB54BJwA6x8QU9nHY3xJSZR2kX9bgpZekRKGkLTmEXA= +github.com/tilt-dev/fsnotify v1.4.8-0.20220602155310-fff9c274a375/go.mod h1:xRroudyp5iVtxKqZCrA6n2TLFRBf8bmnjr1UD4x+z7g= +github.com/tinylib/msgp v1.4.0 h1:SYOeDRiydzOw9kSiwdYp9UcBgPFtLU2WDHaJXyHruf8= +github.com/tinylib/msgp v1.4.0/go.mod h1:cvjFkb4RiC8qSBOPMGPSzSAx47nAsfhLVTCZZNuHv5o= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302 h1:ZT8ibgassurSISJ1Pj26NsM3vY2jxFZn63Nd/TpHmRw= +github.com/tonistiigi/fsutil v0.0.0-20230825212630-f09800878302/go.mod h1:9kMVqMyQ/Sx2df5LtnGG+nbrmiZzCS7V6gjW3oGHsvI= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea h1:SXhTLE6pb6eld/v/cCndK0AMpt1wiVFb/YYmqB3/QG0= +github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea/go.mod h1:WPnis/6cRcDZSUvVmezrxJPkiO87ThFYsoUiMwWNDJk= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531 h1:Y/M5lygoNPKwVNLMPXgVfsRT40CSFKXCxuU8LoHySjs= +github.com/tonistiigi/vt100 v0.0.0-20230623042737-f9a4f7ef6531/go.mod h1:ulncasL3N9uLrVann0m+CDlJKWsIAP34MPcOJF6VRvc= +github.com/twitchtv/twirp v8.1.3+incompatible h1:+F4TdErPgSUbMZMwp13Q/KgDVuI7HJXP61mNV3/7iuU= +github.com/twitchtv/twirp v8.1.3+incompatible/go.mod h1:RRJoFSAmTEh2weEqWtpPE3vFK5YBhA6bqp2l1kfCC5A= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU= +github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4= +github.com/valkey-io/valkey-go v1.0.55 h1:mvsiXNwHO9YrkBPzumrnFNhDAmVkZxyQsiAm6Y4c/Bg= +github.com/valkey-io/valkey-go v1.0.55/go.mod h1:yYgsDepzuxY1NjAzpmt5QV6BLCvRXyJ/M27NuaznGd4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/vektah/gqlparser/v2 v2.5.25 h1:FmWtFEa+invTIzWlWK6Vk7BVEZU/97QBzeI8Z1JjGt8= +github.com/vektah/gqlparser/v2 v2.5.25/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342 h1:FnBeRrxr7OU4VvAzt5X7s6266i6cSVkkFPS0TuXWbIg= +github.com/xrash/smetrics v0.0.0-20250705151800-55b8f293f342/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= +github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= +go.einride.tech/aip v0.73.0 h1:bPo4oqBo2ZQeBKo4ZzLb1kxYXTY1ysJhpvQyfuGzvps= +go.einride.tech/aip v0.73.0/go.mod h1:Mj7rFbmXEgw0dq1dqJ7JGMvYCZZVxmGOR3S4ZcV5LvQ= +go.mongodb.org/mongo-driver v1.12.1 h1:nLkghSU8fQNaK7oUmDhQFsnrtcoNy7Z6LVFKsEecqgE= +go.mongodb.org/mongo-driver v1.12.1/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= +go.mongodb.org/mongo-driver/v2 v2.2.2 h1:9cYuS3fl1Xhqwpfazso10V7BHQD58kCgtzhfAmJYz9c= +go.mongodb.org/mongo-driver/v2 v2.2.2/go.mod h1:qQkDMhCGWl3FN509DfdPd4GRBLU/41zqF/k8eTRceps= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/collector/component v1.43.0 h1:9dyOmV0UuIhrNSASMeDH125jhfv7+FhWMq0HtNHHCs8= +go.opentelemetry.io/collector/component v1.43.0/go.mod h1:Pw3qM5HhgnSMpebNRUiiJuEiXxZyHq83vl7wXqxD8hU= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.43.0 h1:Aq8UR5qv1zNlbbkTyqv8kLJtnoQMq/sG1/jS9o1cCJI= +go.opentelemetry.io/collector/featuregate v1.43.0/go.mod h1:d0tiRzVYrytB6LkcYgz2ESFTv7OktRPQe0QEQcPt1L4= +go.opentelemetry.io/collector/internal/telemetry v0.137.0 h1:KlJcaBnIIn+QJzQIfA1eXbYUvHmgM7h/gLp/vjvUBMw= +go.opentelemetry.io/collector/internal/telemetry v0.137.0/go.mod h1:GWOiXBZ82kMzwGMEihJ5rEo5lFL7gurfHD++5q0XtI8= +go.opentelemetry.io/collector/pdata v1.43.0 h1:zVkj2hcjiMLwX+QDDNwb7iTh3LBjNXKv2qPSgj1Rzb4= +go.opentelemetry.io/collector/pdata v1.43.0/go.mod h1:KsJzdDG9e5BaHlmYr0sqdSEKeEiSfKzoF+rdWU7J//w= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.43.0 h1:IJjdqE5UCQlyVvFUUzlhSWhP4WIwpH6UyJQ9iWXpyww= +go.opentelemetry.io/collector/pipeline v1.43.0/go.mod h1:xUrAqiebzYbrgxyoXSkk6/Y3oi5Sy3im2iCA51LwUAI= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.13.0 h1:aBKdhLVieqvwWe9A79UHI/0vgp2t/s2euY8X59pGRlw= +go.opentelemetry.io/contrib/bridges/otelzap v0.13.0/go.mod h1:SYqtxLQE7iINgh6WFuVi2AI70148B8EI35DSk0Wr8m4= +go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0 h1:rbRJ8BBoVMsQShESYZ0FkvcITu8X8QNwJogcLUmDNNw= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.62.0/go.mod h1:ru6KHrNtNHxM4nD/vd6QrLVWgKhxPYgblq4VAtNawTQ= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0 h1:2ea0IkZBsWH+HA2GkD+7+hRw2u97jzdFyRtXuO14a1s= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.45.0/go.mod h1:4m3RnBBb+7dB9d21y510oO1pdB1V4J6smNf14WXcBFQ= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= +go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 h1:ZtfnDL+tUrs1F0Pzfwbg2d59Gru9NCH3bgSHBM6LDwU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0/go.mod h1:hG4Fj/y8TR/tlEDREo8tWstl9fO9gcFkn4xrx0Io8xU= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0 h1:NmnYCiR0qNufkldjVvyQfZTHSdzeHoZ41zggMsdMcLM= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0/go.mod h1:UVAO61+umUsHLtYb8KXXRoHtxUkdOPkYidzW3gipRLQ= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0 h1:wNMDy/LVGLj2h3p6zg4d0gypKfWKSWI14E1C4smOgl8= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.42.0/go.mod h1:YfbDdXAAkemWJK3H/DshvlrxqFB2rtW4rY6ky/3x/H0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0 h1:3d+S281UTjM+AbF31XSOYn1qXn3BgIdWl8HNEpx08Jk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0 h1:IeMeyr1aBvBiPVYihXIaeIZba6b8E1bYp7lbdxK8CQg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.19.0/go.mod h1:oVdCUtjq9MK9BlS7TtucsQwUcXcymNiEDjgDD2jMtZU= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0 h1:jwV9iQdvp38fxXi8ZC+lNpxjK16MRcZlpDYvbuO1FiA= +go.opentelemetry.io/otel/exporters/prometheus v0.42.0/go.mod h1:f3bYiqNqhoPxkvI2LrXqQVC546K7BuRDL/kKuxkujhA= +go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM= +go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno= +go.opentelemetry.io/otel/log/logtest v0.14.0 h1:BGTqNeluJDK2uIHAY8lRqxjVAYfqgcaTbVk1n3MWe5A= +go.opentelemetry.io/otel/log/logtest v0.14.0/go.mod h1:IuguGt8XVP4XA4d2oEEDMVDBBCesMg8/tSGWDjuKfoA= +go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= +go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= +go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= +go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= +go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0/go.mod h1:VyU6dTWBWv6h9w/+DYgSZAPMabWbPTFTuxp25sM8+s0= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0 h1:i8YpvWGm/Uq1koL//bnbJ/26eV3OrKWm09+rDYo7keU= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.1.0/go.mod h1:pQ70xHY/ZVxNUBPn+qUWPl8nwai87eWdqL3M37lNi9A= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc= +golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.30.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= +golang.org/x/exp v0.0.0-20251017212417-90e834f514db h1:by6IehL4BH5k3e3SJmcoNbOobMey2SLpAF79iPOEBvw= +golang.org/x/exp v0.0.0-20251017212417-90e834f514db/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200505041828-1ed23360d12c/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= +google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= +google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= +google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I= +google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo= +google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= +google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= +google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= +google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw= +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg= +google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o= +google.golang.org/api v0.85.0/go.mod h1:AqZf8Ep9uZ2pyTvgL+x0D3Zt0eoT9b5E8fmzfu6FO2g= +google.golang.org/api v0.90.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw= +google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaETEI= +google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= +google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.125.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= +google.golang.org/api v0.239.0 h1:2hZKUnFZEy81eugPs4e2XzIJ5SOwQg0G82bpXD65Puo= +google.golang.org/api v0.239.0/go.mod h1:cOVEm2TpdAGHL2z+UwyS+kmlGr3bVWQQ6sYEqkKje50= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= +google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= +google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4= +google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220617124728-180714bec0ad/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220628213854-d9e0b6570c03/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA= +google.golang.org/genproto v0.0.0-20220722212130-b98a9ff5e252/go.mod h1:GkXuJDJ6aQ7lnJcRF+SJVgFdQhypqgl3LB1C9vabdRE= +google.golang.org/genproto v0.0.0-20220801145646-83ce21fca29f/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20220815135757-37a418bb8959/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220817144833-d7fd3f11b9b1/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220822174746-9e6da59bd2fc/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829144015-23454907ede3/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220829175752-36a9c930ecbf/go.mod h1:dbqgFATTzChvnt+ujMdZwITVAJHFtfyN1qUhDqEiIlk= +google.golang.org/genproto v0.0.0-20220913154956-18f8339a66a5/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220914142337-ca0e39ece12f/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220915135415-7fd63a7952de/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220916172020-2692e8806bfa/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220919141832-68c03719ef51/go.mod h1:0Nb8Qy+Sk5eDzHnzlStwW3itdNaWoZA5XeSG+R3JHSo= +google.golang.org/genproto v0.0.0-20220920201722-2b89144ce006/go.mod h1:ht8XFiar2npT/g4vkk7O0WYS1sHOHbdujxbEp7CJWbw= +google.golang.org/genproto v0.0.0-20220926165614-551eb538f295/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53BroOrRY3xTxlbr8Y3eB/nzAvvFM83q7kG2OI= +google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= +google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:zqTuNwFlFRsw5zIts5VnzLQxSRqh+CGOTVMlYbY0Eyk= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230629202037-9506855d4529/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= +google.golang.org/genproto v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:O9kGHb51iE/nOGvQaDUuadVYqovW56s5emA88lQnj6Y= +google.golang.org/genproto v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:0ggbjUrZYpy1q+ANUS30SEoGZ53cdfwtbuG7Ptgy108= +google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20250728155136-f173205681a0 h1:btBcgujH2+KIWEfz0s7Cdtt9R7hpwM4SAEXAdXf/ddw= +google.golang.org/genproto v0.0.0-20250728155136-f173205681a0/go.mod h1:Q4yZQ3kmmIyg6HsMjCGx2vQ8gzN+dntaPmFWz6Zj0fo= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230629202037-9506855d4529/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:mPBs5jNgx2GuQGvFwUvVKqtn6HsUw9nP64BedgvqEsQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= +google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0 h1:0UOBWO4dC+e51ui0NFKSPbkHHiQ4TmrEfEZMLDyRmY8= +google.golang.org/genproto/googleapis/api v0.0.0-20250728155136-f173205681a0/go.mod h1:8ytArBbtOy2xfht+y2fqKd5DRDJRUQhqbyEnQ4bDChs= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230629202037-9506855d4529/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230706204954-ccb25ca9f130/go.mod h1:8mL13HKkDa+IuJ8yruA3ci0q+0vsUz4m//+ottjwS5o= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230731190214-cbb8c96f2d6d/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230803162519-f966b187b2e5/go.mod h1:zBEcrKX2ZOcEkHWxBPAIvYUWOKKMIhYcmNiUIu2ji3I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240521202816-d264139d666e/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f h1:1FTH6cpXFsENbPR5Bu8NQddPSaUUE6NA2XdZdDSAJK4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251014184007-4626949a642f/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/errgo.v1 v1.0.0/go.mod h1:CxwszS/Xz1C49Ucd2i6Zil5UToP1EmyrFhKaMVbg1mk= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/httprequest.v1 v1.2.1/go.mod h1:x2Otw96yda5+8+6ZeWwHIJTFkEHWP/qP8pJOzqEtWPM= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/retry.v1 v1.0.3/go.mod h1:FJkXmWiMaAo7xB+xhvDF59zhfjDWyzmyAxiT4dB688g= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gorm.io/driver/mysql v1.0.1 h1:omJoilUzyrAp0xNoio88lGJCroGdIOen9hq2A/+3ifw= +gorm.io/driver/mysql v1.0.1/go.mod h1:KtqSthtg55lFp3S5kUXqlGaelnWpKitn4k1xZTnoiPw= +gorm.io/driver/postgres v1.5.5 h1:r1VBTQQrOAlUux3JI9V7rdxVWBPPnzxa315qNJUzmjI= +gorm.io/driver/postgres v1.5.5/go.mod h1:Bgo89+h0CRcdA33Y6frlaHHVuTdOf87pmyzwW9C/BH0= +gorm.io/driver/sqlserver v1.4.2 h1:nMtEeKqv2R/vv9FoHUFWfXfP6SskAgRar0TPlZV1stk= +gorm.io/driver/sqlserver v1.4.2/go.mod h1:XHwBuB4Tlh7DqO0x7Ema8dmyWsQW7wi38VQOAFkrbXY= +gorm.io/gorm v1.25.5 h1:zR9lOiiYf09VNh5Q1gphfyia1JpiClIWG9hQaxB/mls= +gorm.io/gorm v1.25.5/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +k8s.io/api v0.31.4 h1:I2QNzitPVsPeLQvexMEsj945QumYraqv9m74isPDKhM= +k8s.io/api v0.31.4/go.mod h1:d+7vgXLvmcdT1BCo79VEgJxHHryww3V5np2OYTr6jdw= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.26.7 h1:NX/zBZZn4R+Cq6shwyn8Pn8REd0yJJ16dbtv9WkEVEU= +k8s.io/apiserver v0.26.7/go.mod h1:r0wDRWHI7VL/KlQLTkJJBVGZ3KeNfv+VetlyRtr86xs= +k8s.io/client-go v0.31.4 h1:t4QEXt4jgHIkKKlx06+W3+1JOwAFU/2OPiOo7H92eRQ= +k8s.io/client-go v0.31.4/go.mod h1:kvuMro4sFYIa8sulL5Gi5GFqUPvfH2O/dXuKstbaaeg= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y= +k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4= +k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0= +k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +lukechampine.com/uint128 v1.3.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.37.0/go.mod h1:vtL+3mdHx/wcj3iEGz84rQa8vEqR6XM84v5Lcvfph20= +modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= +modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.0.0-20220904174949-82d86e1b6d56/go.mod h1:YSXjPL62P2AMSxBphRHPn7IkzhVHqkvOnRKAKh+W6ZI= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccgo/v3 v3.16.13-0.20221017192402-261537637ce8/go.mod h1:fUB3Vn0nVPReA+7IG7yZDfjv1TMWjhQP8gCxrFAtL5g= +modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= +modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/libc v1.17.4/go.mod h1:WNg2ZH56rDEwdropAJeZPQkXmDwh+JCA1s/htl6r2fA= +modernc.org/libc v1.18.0/go.mod h1:vj6zehR5bfc98ipowQOM2nIDUZnVew/wNC/2tOGS+q0= +modernc.org/libc v1.20.3/go.mod h1:ZRfIaEkgrYgZDl6pa4W39HgN5G/yDW+NRmNKZBDFrk0= +modernc.org/libc v1.21.4/go.mod h1:przBsL5RDOZajTVslkugzLBj1evTue36jEomFQOoYuI= +modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug= +modernc.org/libc v1.37.6 h1:orZH3c5wmhIQFTXF+Nt+eeauyd+ZIt2BX6ARe+kD+aw= +modernc.org/libc v1.37.6/go.mod h1:YAXkAZ8ktnkCKaN9sw/UDeUVkGYJ/YquGO4FTi5nmHE= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4= +modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.3.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E= +modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/sqlite v1.18.2/go.mod h1:kvrTLEWgxUcHa2GfHBQtanR1H9ht3hTJNtKpzH9k1u0= +modernc.org/sqlite v1.28.0 h1:Zx+LyDDmXczNnEQdvPuEfcFVA2ZPyaD7UCZDjef3BHQ= +modernc.org/sqlite v1.28.0/go.mod h1:Qxpazz0zH8Z1xCFyi5GSL3FzbtZ3fvbjmywNogldEW0= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA= +modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/tcl v1.13.2/go.mod h1:7CLiGIPo1M8Rv1Mitpv5akc2+8fxUd2y2UzC/MfMzy0= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= +modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= +sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2 h1:MdmvkGuXi/8io6ixD5wud3vOLwc1rj0aNqRlpuvjmwA= +sigs.k8s.io/structured-merge-diff/v4 v4.4.2/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +tags.cncf.io/container-device-interface v0.6.2 h1:dThE6dtp/93ZDGhqaED2Pu374SOeUkBfuvkLuiTdwzg= +tags.cncf.io/container-device-interface v0.6.2/go.mod h1:Shusyhjs1A5Na/kqPVLL0KqnHQHuunol9LFeUNkuGVE= diff --git a/orchestrion/all/orchestrion.tool.go b/orchestrion/all/orchestrion.tool.go new file mode 100644 index 0000000000..975031299a --- /dev/null +++ b/orchestrion/all/orchestrion.tool.go @@ -0,0 +1,69 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// Code generated by 'go generate' DO NOT EDIT + +//go:build tools + +package all + +//go:generate go run github.com/DataDog/dd-trace-go/v2/internal/orchestrion/generator + +// Importing "github.com/DataDog/dd-trace-go/v2/orchestrion/all" in an +// `orchestrion.tool.go` file causes the package to use _all_ available +// integrations of `dd-trace-go`. +// This makes it easy to ensure all available features of DataDog are enabled in +// your go application, but may cause your dependency closure (`go.mod` and +// `go.sum` files) to include a lot more packages than are stricly necessary for +// your application. If that is a problem, you should instead manually import +// only the specific integrations that are useful to your application. +import ( + _ "github.com/DataDog/orchestrion" + + _ "github.com/DataDog/dd-trace-go/contrib/99designs/gqlgen/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/IBM/sarama/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/Shopify/sarama/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go-v2/v2/aws" // integration + _ "github.com/DataDog/dd-trace-go/contrib/aws/aws-sdk-go/v2/aws" // integration + _ "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v1/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/cloud.google.com/go/pubsub.v2/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka.v2/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/confluentinc/confluent-kafka-go/kafka/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/database/sql/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/elastic/go-elasticsearch.v6/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/gin-gonic/gin/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go-chi/chi.v5/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go-chi/chi/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v7/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go-redis/redis.v8/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go-redis/redis/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver.v2/v2/mongo" // integration + _ "github.com/DataDog/dd-trace-go/contrib/go.mongodb.org/mongo-driver/v2/mongo" // integration + _ "github.com/DataDog/dd-trace-go/contrib/gocql/gocql/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/gofiber/fiber.v2/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/gomodule/redigo/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/google.golang.org/grpc/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/gorilla/mux/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/gorm.io/gorm.v1/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/graph-gophers/graphql-go/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/graphql-go/graphql/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/hashicorp/vault/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/jackc/pgx.v5/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/julienschmidt/httprouter/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/k8s.io/client-go/v2/kubernetes" // integration + _ "github.com/DataDog/dd-trace-go/contrib/labstack/echo.v4/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/log/slog/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/net/http/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/redis/go-redis.v9/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/redis/rueidis/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/segmentio/kafka-go/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/sirupsen/logrus/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/twitchtv/twirp/v2" // integration + _ "github.com/DataDog/dd-trace-go/contrib/valkey-io/valkey-go/v2" // integration + _ "github.com/DataDog/dd-trace-go/v2/contrib/os" // integration + _ "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" // integration + _ "github.com/DataDog/dd-trace-go/v2/orchestrion" // integration + _ "github.com/DataDog/dd-trace-go/v2/profiler" // integration +) diff --git a/orchestrion/orchestrion.go b/orchestrion/orchestrion.go new file mode 100644 index 0000000000..0dc6155de7 --- /dev/null +++ b/orchestrion/orchestrion.go @@ -0,0 +1,9 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package orchestrion + +// Deliberately empty, this file is only here to make sure IDEs don't complain +// over imports of it having all files filtered by build tags. diff --git a/internal/osinfo/osinfo_default.go b/orchestrion/orchestrion.tool.go similarity index 53% rename from internal/osinfo/osinfo_default.go rename to orchestrion/orchestrion.tool.go index 72d70d3885..3a25180564 100644 --- a/internal/osinfo/osinfo_default.go +++ b/orchestrion/orchestrion.tool.go @@ -3,19 +3,10 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2016 Datadog, Inc. -//go:build !windows && !linux && !darwin && !freebsd -// +build !windows,!linux,!darwin,!freebsd +//go:build tools -package osinfo +package orchestrion import ( - "runtime" + _ "github.com/DataDog/dd-trace-go/v2/internal/civisibility/integrations/gotesting" // integration ) - -func osName() string { - return runtime.GOOS -} - -func osVersion() string { - return "unknown" -} diff --git a/profiler/compression.go b/profiler/compression.go new file mode 100644 index 0000000000..0ca8a19556 --- /dev/null +++ b/profiler/compression.go @@ -0,0 +1,284 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package profiler + +/* +In order to save bandwidth and networking cost, the profiler compresses the +profiling data it collects before sending it to Datadog. This file contains +the logic that controls this compression. + +For historical reasons, the profiler has used varying levels of compression for +different profile types. pprof files coming from the Go runtime are already +compressed using gzip-1 (aka gzip.BestSpeed) [1], so they were uploaded as-is. +Other profiles that were produced (or derived) by the profiler itself have been +either compressed with gzip-6 (aka gzip.DefaultCompression) or were left +uncompressed. The exact details are captured in the legacyOutputCompression +function below. + +This legacy compression strategy was haphazard and not designed to achieve an +optimal tradeoff between overhead and cost savings. Due to this, it is going to +be succeeded by a new compression strategy. The implementation for it will +follow in the next update to this file. + +[1] https://github.com/golang/go/blob/go1.24.3/src/runtime/pprof/proto.go#L260 +*/ + +import ( + "cmp" + "fmt" + "io" + "strconv" + "strings" + + kgzip "github.com/klauspost/compress/gzip" + "github.com/klauspost/compress/zstd" +) + +// legacyCompressionStrategy returns the input and output compression to be used +// by the compressor for the given profile type and isDelta flavor using the +// legacy compression strategy. +func legacyCompressionStrategy(pt ProfileType, isDelta bool) (compression, compression) { + return inputCompression(pt, isDelta), legacyOutputCompression(pt, isDelta) +} + +func compressionStrategy(pt ProfileType, isDelta bool, config string) (compression, compression) { + if config == "" || config == "legacy" { + return legacyCompressionStrategy(pt, isDelta) + } + algorithm, levelStr, _ := strings.Cut(config, "-") + // Don't bother checking the error. We'll get zero which represents the + // default, and we we assume this is only going to get used internally + level, _ := strconv.Atoi(levelStr) + return inputCompression(pt, isDelta), compression{algorithm: compressionAlgorithm(algorithm), level: level} +} + +// inputCompression maps the given profile type and isDelta flavor to the +// compression level that was already applied to the data by the the Go runtime. +// Profiles produced (or derived) by our profiler itself are expected to be +// uncompressed. +func inputCompression(pt ProfileType, isDelta bool) compression { + switch pt { + case CPUProfile, GoroutineProfile: + return gzip1Compression + case HeapProfile, BlockProfile, MutexProfile: + if isDelta { + return noCompression + } + return gzip1Compression + case MetricsProfile, executionTrace, expGoroutineWaitProfile: + return noCompression + default: + panic(fmt.Sprintf("unknown profile type: %s", pt)) + } +} + +// legacyOutputCompression maps the given profile type and isDelta flavor to +// a compression level using our legacy compression strategy. +func legacyOutputCompression(pt ProfileType, isDelta bool) compression { + switch pt { + case CPUProfile, GoroutineProfile: + return gzip1Compression + case expGoroutineWaitProfile: + return gzip6Compression + case HeapProfile, BlockProfile, MutexProfile: + if isDelta { + return gzip6Compression + } + return gzip1Compression + case executionTrace, MetricsProfile: + return noCompression + default: + panic(fmt.Sprintf("unknown profile type: %s", pt)) + } +} + +type compressionAlgorithm string + +const ( + compressionAlgorithmNone compressionAlgorithm = "none" + compressionAlgorithmGzip compressionAlgorithm = "gzip" + compressionAlgorithmZstd compressionAlgorithm = "zstd" +) + +type compression struct { + algorithm compressionAlgorithm + level int +} + +func (c compression) String() string { + if c.algorithm == compressionAlgorithmNone { + return string(c.algorithm) + } + return fmt.Sprintf("%s-%d", c.algorithm, c.level) +} + +// Common compression algorithm and level combinations. +var ( + noCompression = compression{algorithm: compressionAlgorithmNone} + gzip1Compression = compression{algorithm: compressionAlgorithmGzip, level: 1} + gzip6Compression = compression{algorithm: compressionAlgorithmGzip, level: 6} + zstdCompression = compression{algorithm: compressionAlgorithmZstd, level: 2} +) + +var zstdLevels = map[int]zstd.EncoderLevel{ + 1: zstd.SpeedFastest, + 2: zstd.SpeedDefault, + 3: zstd.SpeedBetterCompression, + 4: zstd.SpeedBestCompression, +} + +func getZstdLevelOrDefault(level int) zstd.EncoderLevel { + if l, ok := zstdLevels[level]; ok { + return l + } + return zstd.SpeedDefault +} + +type compressionPipelineBuilder struct { + zstdEncoders map[zstd.EncoderLevel]*sharedZstdEncoder +} + +func (b *compressionPipelineBuilder) getZstdEncoder(level zstd.EncoderLevel) (*sharedZstdEncoder, error) { + if b.zstdEncoders == nil { + b.zstdEncoders = make(map[zstd.EncoderLevel]*sharedZstdEncoder) + } + encoder, ok := b.zstdEncoders[level] + if !ok { + var err error + encoder, err = newSharedZstdEncoder(level) + if err != nil { + return nil, err + } + b.zstdEncoders[level] = encoder + } + return encoder, nil +} + +// Build returns a compressor that converts the data written to it from the +// expected input compression to the given output compression. +func (b *compressionPipelineBuilder) Build(in compression, out compression) (compressor, error) { + if in == out { + return newPassthroughCompressor(), nil + } + + if in == noCompression && out.algorithm == compressionAlgorithmGzip { + return kgzip.NewWriterLevel(nil, out.level) + } + + if in == noCompression && out.algorithm == compressionAlgorithmZstd { + return b.getZstdEncoder(getZstdLevelOrDefault(out.level)) + } + + if in.algorithm == compressionAlgorithmGzip && out.algorithm == compressionAlgorithmZstd { + encoder, err := b.getZstdEncoder(getZstdLevelOrDefault(out.level)) + if err != nil { + return nil, err + } + return newZstdRecompressor(encoder), nil + } + + return nil, fmt.Errorf("unsupported recompression: %s -> %s", in, out) +} + +// compressor provides an interface for compressing profiling data. If the input +// is already compressed, it can also act as a re-compressor that decompresses +// the data from one format and then re-compresses it into another format. +type compressor interface { + io.Writer + // Reset resets the compressor to the given writer. It may also acquire a + // shared underlying resource, so callers must always call Close(). + Reset(w io.Writer) + // Close closes the compressor and releases any shared underlying resource. + Close() error +} + +// newPassthroughCompressor returns a compressor that simply passes all data +// through without applying any compression. +func newPassthroughCompressor() *passthroughCompressor { + return &passthroughCompressor{} +} + +type passthroughCompressor struct { + io.Writer +} + +func (r *passthroughCompressor) Reset(w io.Writer) { + r.Writer = w +} + +func (r *passthroughCompressor) Close() error { + return nil +} + +func newZstdRecompressor(encoder *sharedZstdEncoder) *zstdRecompressor { + return &zstdRecompressor{zstdOut: encoder, err: make(chan error)} +} + +type zstdRecompressor struct { + // err synchronizes finishing writes after closing pw and reports any + // error during recompression + err chan error + pw io.WriteCloser + zstdOut *sharedZstdEncoder +} + +func (r *zstdRecompressor) Reset(w io.Writer) { + r.zstdOut.Reset(w) + pr, pw := io.Pipe() + go func() { + gzr, err := kgzip.NewReader(pr) + if err != nil { + r.err <- err + return + } + _, err = io.Copy(r.zstdOut, gzr) + r.err <- err + }() + r.pw = pw +} + +func (r *zstdRecompressor) Write(p []byte) (int, error) { + return r.pw.Write(p) +} + +func (r *zstdRecompressor) Close() error { + r.pw.Close() + err := <-r.err + return cmp.Or(err, r.zstdOut.Close()) +} + +// newSharedZstdEncoder creates a new shared Zstd encoder with the given level. +// It expects the Reset and Close method to be used in an acquire and release +// fashion. +func newSharedZstdEncoder(level zstd.EncoderLevel) (*sharedZstdEncoder, error) { + encoder, err := zstd.NewWriter(nil, zstd.WithEncoderLevel(level)) + if err != nil { + return nil, err + } + return &sharedZstdEncoder{encoder: encoder, sema: make(chan struct{}, 1)}, nil +} + +type sharedZstdEncoder struct { + encoder *zstd.Encoder + sema chan struct{} +} + +// Reset acquires the semaphore and resets the encoder to the given writer. +func (s *sharedZstdEncoder) Reset(w io.Writer) { + s.sema <- struct{}{} + s.encoder.Reset(w) +} + +func (s *sharedZstdEncoder) Write(p []byte) (int, error) { + return s.encoder.Write(p) +} + +// Close releases the semaphore and closes the encoder. +func (s *sharedZstdEncoder) Close() error { + err := s.encoder.Close() + <-s.sema + return err +} diff --git a/profiler/compression_test.go b/profiler/compression_test.go new file mode 100644 index 0000000000..297b6d3cf9 --- /dev/null +++ b/profiler/compression_test.go @@ -0,0 +1,249 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package profiler + +import ( + "bytes" + "compress/gzip" + "fmt" + "io" + "os" + "testing" + "time" + + kgzip "github.com/klauspost/compress/gzip" + "github.com/klauspost/compress/zstd" + "github.com/stretchr/testify/require" +) + +func TestNewCompressionPipeline(t *testing.T) { + plainData := []byte("hello world") + gzip1Data := compressData(t, plainData, gzip1Compression) + gzip6Data := compressData(t, plainData, gzip6Compression) + zstdData := compressData(t, plainData, zstdCompression) + + tests := []struct { + in compression + out compression + data []byte + want []byte + }{ + {noCompression, gzip1Compression, plainData, gzip1Data}, + {noCompression, gzip6Compression, plainData, gzip6Data}, + {noCompression, zstdCompression, plainData, zstdData}, + {noCompression, noCompression, plainData, plainData}, + {gzip1Compression, gzip1Compression, gzip1Data, gzip1Data}, + {gzip6Compression, gzip6Compression, gzip6Data, gzip6Data}, + {gzip1Compression, zstdCompression, gzip1Data, zstdData}, + {gzip6Compression, zstdCompression, gzip6Data, zstdData}, + } + + for _, test := range tests { + t.Run(fmt.Sprintf("%s->%s", test.in, test.out), func(t *testing.T) { + var pipelineBuilder compressionPipelineBuilder + pipeline, err := pipelineBuilder.Build(test.in, test.out) + require.NoError(t, err) + buf := &bytes.Buffer{} + pipeline.Reset(buf) + _, err = pipeline.Write(test.data) + require.NoError(t, err) + require.NoError(t, pipeline.Close()) + require.Equal(t, test.want, buf.Bytes()) + }) + } +} + +// checkZstdLevel checks that data is zstd-compressed with the given level +func checkZstdLevel(t *testing.T, data []byte, level zstd.EncoderLevel) { + t.Helper() + require.NotEmpty(t, data) + zr, err := zstd.NewReader(bytes.NewReader(data)) + require.NoError(t, err) + in := new(bytes.Buffer) + _, err = io.Copy(in, zr) + require.NoError(t, err) + out := new(bytes.Buffer) + zw, err := zstd.NewWriter(out, zstd.WithEncoderLevel(level)) + require.NoError(t, err) + _, err = io.Copy(zw, in) + require.NoError(t, err) + require.NoError(t, zw.Close()) + require.Equal(t, data, out.Bytes()) +} + +func TestDebugCompressionEnv(t *testing.T) { + t.Skip("Flaky. See #3681") + mustGzipDecompress := func(t *testing.T, b []byte) { + t.Helper() + r, err := gzip.NewReader(bytes.NewReader(b)) + require.NoError(t, err) + _, err = io.Copy(io.Discard, r) + require.NoError(t, err) + } + + t.Run("default", func(t *testing.T) { + p := <-startTestProfiler(t, 1, WithDeltaProfiles(false), WithProfileTypes(CPUProfile, HeapProfile, BlockProfile), WithPeriod(time.Millisecond)) + mustGzipDecompress(t, p.attachments["cpu.pprof"]) + mustGzipDecompress(t, p.attachments["heap.pprof"]) + mustGzipDecompress(t, p.attachments["block.pprof"]) + }) + + t.Run("explicit-gzip", func(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "gzip") + p := <-startTestProfiler(t, 1, WithProfileTypes(HeapProfile, BlockProfile), WithPeriod(time.Millisecond)) + mustGzipDecompress(t, p.attachments["delta-heap.pprof"]) + }) + + t.Run("zstd-delta", func(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "zstd-3") + p := <-startTestProfiler(t, 1, WithProfileTypes(CPUProfile, HeapProfile), WithPeriod(time.Millisecond)) + checkZstdLevel(t, p.attachments["cpu.pprof"], zstd.SpeedBetterCompression) + checkZstdLevel(t, p.attachments["delta-heap.pprof"], zstd.SpeedBetterCompression) + }) + + t.Run("zstd-no-delta", func(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "zstd-3") + p := <-startTestProfiler(t, 1, WithDeltaProfiles(false), WithProfileTypes(HeapProfile), WithPeriod(time.Millisecond)) + checkZstdLevel(t, p.attachments["heap.pprof"], zstd.SpeedBetterCompression) + }) + + t.Run("zstd-2", func(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "zstd-2") + p := <-startTestProfiler(t, 1, WithProfileTypes(HeapProfile), WithPeriod(time.Millisecond)) + checkZstdLevel(t, p.attachments["delta-heap.pprof"], zstd.SpeedDefault) + }) + + t.Run("zstd-no-level", func(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "zstd") + p := <-startTestProfiler(t, 1, WithProfileTypes(CPUProfile, HeapProfile), WithPeriod(time.Millisecond)) + checkZstdLevel(t, p.attachments["cpu.pprof"], zstd.SpeedDefault) + checkZstdLevel(t, p.attachments["delta-heap.pprof"], zstd.SpeedDefault) + }) +} + +func compressData(t testing.TB, data []byte, c compression) []byte { + t.Helper() + buf := &bytes.Buffer{} + switch c.algorithm { + case compressionAlgorithmGzip: + // NB: we need to use the same gzip implementation here as we do + // in the compressor since "level" isn't actually a stable thing + // across implementations + gw, err := kgzip.NewWriterLevel(buf, c.level) + require.NoError(t, err) + _, err = gw.Write(data) + require.NoError(t, err) + require.NoError(t, gw.Close()) + case compressionAlgorithmZstd: + level := zstd.SpeedDefault + if l, ok := zstdLevels[c.level]; ok { + level = l + } + zw, err := zstd.NewWriter(buf, zstd.WithEncoderLevel(level)) + require.NoError(t, err) + _, err = zw.Write(data) + require.NoError(t, err) + require.NoError(t, zw.Close()) + default: + t.Fatalf("unsupported compression algorithm: %s", c.algorithm) + } + return buf.Bytes() +} + +func BenchmarkRecompression(b *testing.B) { + inputdata, err := os.ReadFile("internal/fastdelta/testdata/big-heap.pprof") + if err != nil { + b.Fatal(err) + } + inputs := []struct { + inAlg compression + outLevel zstd.EncoderLevel + }{ + {gzip1Compression, zstd.SpeedDefault}, + {gzip1Compression, zstd.SpeedBetterCompression}, + {gzip1Compression, zstd.SpeedBestCompression}, + {gzip6Compression, zstd.SpeedDefault}, + {gzip6Compression, zstd.SpeedBetterCompression}, + {gzip6Compression, zstd.SpeedBestCompression}, + } + for _, in := range inputs { + b.Run(fmt.Sprintf("%s-%s", in.inAlg.String(), in.outLevel), func(b *testing.B) { + data := compressData(b, inputdata, in.inAlg) + b.ResetTimer() + var pipelineBuilder compressionPipelineBuilder + for i := 0; i < b.N; i++ { + encoder, err := pipelineBuilder.getZstdEncoder(in.outLevel) + if err != nil { + b.Fatal(err) + } + z := newZstdRecompressor(encoder) + z.Reset(io.Discard) + if _, err := z.Write(data); err != nil { + b.Fatal(err) + } + if err := z.Close(); err != nil { + b.Fatal(err) + } + } + b.StopTimer() + b.ReportMetric( + (float64(b.N*len(data))/(1024*1024))/ + (float64(b.Elapsed().Seconds())), + "MiB/s", + ) + }) + } + + for _, in := range inputs { + b.Run(fmt.Sprintf("decomp-recomp-%s-%s", in.inAlg.String(), in.outLevel), func(b *testing.B) { + // For comparison with the pipe-based recompressor, to + // see if it's any faster to just decompress and + // recompress serially + data := compressData(b, inputdata, in.inAlg) + b.ResetTimer() + for i := 0; i < b.N; i++ { + buf := new(bytes.Buffer) + gr, err := kgzip.NewReader(bytes.NewReader(data)) + if err != nil { + b.Fatal(err) + } + io.Copy(buf, gr) + zw, err := zstd.NewWriter(io.Discard, zstd.WithEncoderLevel(in.outLevel)) + if err != nil { + b.Fatal(err) + } + io.Copy(zw, buf) + zw.Close() + } + b.StopTimer() + b.ReportMetric( + (float64(b.N*len(data))/(1024*1024))/ + (float64(b.Elapsed().Seconds())), + "MiB/s", + ) + }) + } + + for _, level := range []zstd.EncoderLevel{zstd.SpeedDefault, zstd.SpeedBetterCompression, zstd.SpeedBestCompression} { + b.Run(fmt.Sprintf("no-compression-zstd-%s", level), func(b *testing.B) { + b.ResetTimer() + for i := 0; i < b.N; i++ { + zw, err := zstd.NewWriter(io.Discard, zstd.WithEncoderLevel(level)) + if err != nil { + b.Fatal(err) + } + zw.Write(inputdata) + zw.Close() + } + b.StopTimer() + b.ReportMetric( + (float64(b.N*len(inputdata))/(1024*1024))/ + (float64(b.Elapsed().Seconds())), + "MiB/s", + ) + }) + } +} diff --git a/profiler/doc.go b/profiler/doc.go index 95f9f50536..ad097e3741 100644 --- a/profiler/doc.go +++ b/profiler/doc.go @@ -5,7 +5,7 @@ // Package profiler periodically collects and sends profiles to the Datadog API. // Use Start to start the profiler. -package profiler // import "gopkg.in/DataDog/dd-trace-go.v1/profiler" +package profiler // import "github.com/DataDog/dd-trace-go/v2/profiler" /* Developer documentation: diff --git a/profiler/example_test.go b/profiler/example_test.go index 1ab451d385..d2bbde8720 100644 --- a/profiler/example_test.go +++ b/profiler/example_test.go @@ -8,7 +8,7 @@ package profiler_test import ( "log" - "gopkg.in/DataDog/dd-trace-go.v1/profiler" + "github.com/DataDog/dd-trace-go/v2/profiler" ) // This example illustrates how to run (and later stop) the Datadog Profiler. diff --git a/profiler/internal/fastdelta/delta_map.go b/profiler/internal/fastdelta/delta_map.go index a5c02c6882..c0cc6304a7 100644 --- a/profiler/internal/fastdelta/delta_map.go +++ b/profiler/internal/fastdelta/delta_map.go @@ -8,7 +8,7 @@ package fastdelta import ( "fmt" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pproflite" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pproflite" "github.com/spaolacci/murmur3" ) diff --git a/profiler/internal/fastdelta/fd.go b/profiler/internal/fastdelta/fd.go index 43d1dd3ec4..0829b36a46 100644 --- a/profiler/internal/fastdelta/fd.go +++ b/profiler/internal/fastdelta/fd.go @@ -65,8 +65,8 @@ import ( "fmt" "io" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pproflite" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pprofutils" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pproflite" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pprofutils" "github.com/spaolacci/murmur3" ) diff --git a/profiler/internal/fastdelta/fd_test.go b/profiler/internal/fastdelta/fd_test.go index 71d4492d8e..93e7114a2c 100644 --- a/profiler/internal/fastdelta/fd_test.go +++ b/profiler/internal/fastdelta/fd_test.go @@ -22,7 +22,7 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pprofutils" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pprofutils" "github.com/google/pprof/profile" "github.com/richardartoul/molecule" diff --git a/profiler/internal/fastdelta/fuzz_test.go b/profiler/internal/fastdelta/fuzz_test.go index a36c2bcb93..64ad022eff 100644 --- a/profiler/internal/fastdelta/fuzz_test.go +++ b/profiler/internal/fastdelta/fuzz_test.go @@ -9,14 +9,14 @@ import ( "io" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/fastdelta" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/fastdelta" ) // FuzzDelta looks for inputs to delta which cause crashes. This is to account // for the possibility that the profile format changes in some way, or violates // any hard-coded assumptions. func FuzzDelta(f *testing.F) { - f.Fuzz(func(t *testing.T, b []byte) { + f.Fuzz(func(_ *testing.T, b []byte) { dc := fastdelta.NewDeltaComputer() dc.Delta(b, io.Discard) }) diff --git a/profiler/internal/fastdelta/hasher.go b/profiler/internal/fastdelta/hasher.go index f882623b5d..0455911949 100644 --- a/profiler/internal/fastdelta/hasher.go +++ b/profiler/internal/fastdelta/hasher.go @@ -11,7 +11,7 @@ import ( "fmt" "sort" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pproflite" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pproflite" "github.com/spaolacci/murmur3" ) diff --git a/profiler/internal/immutable/stringslice_test.go b/profiler/internal/immutable/stringslice_test.go index c8da32ad60..9c52378b9d 100644 --- a/profiler/internal/immutable/stringslice_test.go +++ b/profiler/internal/immutable/stringslice_test.go @@ -8,7 +8,7 @@ package immutable_test import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/immutable" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/immutable" "github.com/stretchr/testify/assert" ) diff --git a/profiler/internal/pproflite/decoder.go b/profiler/internal/pproflite/decoder.go index 730c9c90f8..af1d704713 100644 --- a/profiler/internal/pproflite/decoder.go +++ b/profiler/internal/pproflite/decoder.go @@ -90,9 +90,8 @@ func (d *Decoder) FieldEach(fn func(Field) error, filter ...FieldDecoder) error return false, err } else if err := fn(decoder); err != nil { return false, err - } else { - return true, nil } + return true, nil }) } @@ -167,28 +166,30 @@ func decodeFields(val molecule.Value, fields []interface{}) error { var err error if int(field) >= len(fields) { return true, nil - } else if field := fields[field]; field == nil { + } + f := fields[field] + if f == nil { return true, nil - } else { - switch t := field.(type) { - case *int64: - *t = int64(val.Number) - case *uint64: - *t = val.Number - case *[]int64: - // note: might be worth optimizing this and the function below - err = decodePackedInt64(val, t) - case *[]uint64: - err = decodePackedUint64(val, t) - case *bool: - *t = val.Number == 1 - // NOTE: *[]Label and *[]Line used to be handled here before hand-rolling - // the decoding of their parent messages. - default: - return false, fmt.Errorf("decodeFields: unknown type: %T", t) - } - return true, err } + switch t := f.(type) { + case *int64: + *t = int64(val.Number) + case *uint64: + *t = val.Number + case *[]int64: + // note: might be worth optimizing this and the function below + err = decodePackedInt64(val, t) + case *[]uint64: + err = decodePackedUint64(val, t) + case *bool: + *t = val.Number == 1 + // NOTE: *[]Label and *[]Line used to be handled here before hand-rolling + // the decoding of their parent messages. + default: + return false, fmt.Errorf("decodeFields: unknown type: %T", t) + } + return true, err + }) } diff --git a/profiler/internal/pproflite/pproflite_test.go b/profiler/internal/pproflite/pproflite_test.go index 128aca0933..96af45029c 100644 --- a/profiler/internal/pproflite/pproflite_test.go +++ b/profiler/internal/pproflite/pproflite_test.go @@ -11,7 +11,7 @@ import ( "path/filepath" "testing" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pproflite" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pproflite" "github.com/google/pprof/profile" "github.com/stretchr/testify/require" diff --git a/profiler/metrics.go b/profiler/metrics.go index ec68c38592..f3d39743c6 100644 --- a/profiler/metrics.go +++ b/profiler/metrics.go @@ -6,9 +6,9 @@ package profiler import ( - "bytes" "encoding/json" "fmt" + "io" "math" "runtime" "time" @@ -33,7 +33,7 @@ type collectionTooFrequent struct { } func (e collectionTooFrequent) Error() string { - return fmt.Sprintf("period between metrics collection is too small min=%v observed=%v", e.min, e.observed) + return fmt.Sprintf("period between metrics collection is too small min=%d observed=%d", e.min, e.observed) } type metrics struct { @@ -59,7 +59,7 @@ func (m *metrics) reset(now time.Time) { m.snapshot.NumGoroutine = runtime.NumGoroutine() } -func (m *metrics) report(now time.Time, buf *bytes.Buffer) error { +func (m *metrics) report(now time.Time, w io.Writer) error { period := now.Sub(m.collectedAt) if period <= 0 { // It is technically possible, though very unlikely, for period @@ -85,7 +85,7 @@ func (m *metrics) report(now time.Time, buf *bytes.Buffer) error { return err } - _, err = buf.Write(data) + _, err = w.Write(data) return err } @@ -108,7 +108,7 @@ func rate(curr, prev uint64, period float64) float64 { } // maxPauseNs returns maximum pause time within the recent period, assumes stats populated at period end -func maxPauseNs(stats *runtime.MemStats, periodStart time.Time) (max uint64) { +func maxPauseNs(stats *runtime.MemStats, periodStart time.Time) (maxPause uint64) { // NB // stats.PauseEnd is a circular buffer of recent GC pause end times as nanoseconds since the epoch. // stats.PauseNs is a circular buffer of recent GC pause times in nanoseconds. @@ -120,11 +120,11 @@ func maxPauseNs(stats *runtime.MemStats, periodStart time.Time) (max uint64) { if time.Unix(0, int64(stats.PauseEnd[offset])).Before(periodStart) { break } - if stats.PauseNs[offset] > max { - max = stats.PauseNs[offset] + if stats.PauseNs[offset] > maxPause { + maxPause = stats.PauseNs[offset] } } - return max + return maxPause } // removeInvalid removes NaN and +/-Inf values as they can't be json-serialized diff --git a/profiler/options.go b/profiler/options.go index 36e715c156..0c95c9d6b0 100644 --- a/profiler/options.go +++ b/profiler/options.go @@ -6,6 +6,7 @@ package profiler import ( + "cmp" "context" "encoding/json" "fmt" @@ -20,13 +21,15 @@ import ( "time" "unicode" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/osinfo" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/immutable" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/osinfo" + "github.com/DataDog/dd-trace-go/v2/internal/stableconfig" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/internal/version" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/immutable" "github.com/DataDog/datadog-go/v5/statsd" ) @@ -111,14 +114,13 @@ type config struct { logStartup bool traceConfig executionTraceConfig endpointCountEnabled bool + enabled bool + flushOnExit bool + compressionConfig string } // logStartup records the configuration to the configured logger in JSON format func logStartup(c *config) { - var enabledProfiles []string - for t := range c.types { - enabledProfiles = append(enabledProfiles, t.String()) - } info := map[string]any{ "date": time.Now().Format(time.RFC3339), "os_name": osinfo.OSName(), @@ -127,29 +129,19 @@ func logStartup(c *config) { "lang": "Go", "lang_version": runtime.Version(), "hostname": c.hostname, - "delta_profiles": c.deltaProfiles, "service": c.service, "env": c.env, "target_url": c.targetURL, - "agentless": c.agentless, "tags": c.tags.Slice(), - "profile_period": c.period.String(), - "enabled_profiles": enabledProfiles, - "cpu_duration": c.cpuDuration.String(), - "cpu_profile_rate": c.cpuProfileRate, - "block_profile_rate": c.blockRate, - "mutex_profile_fraction": c.mutexFraction, - "max_goroutines_wait": c.maxGoroutinesWait, - "upload_timeout": c.uploadTimeout.String(), - "execution_trace_enabled": c.traceConfig.Enabled, - "execution_trace_period": c.traceConfig.Period.String(), - "execution_trace_size_limit": c.traceConfig.Limit, - "endpoint_count_enabled": c.endpointCountEnabled, "custom_profiler_label_keys": c.customProfilerLabels, + "enabled": c.enabled, + } + for _, tc := range telemetryConfiguration(c) { + info[tc.Name] = tc.Value } b, err := json.Marshal(info) if err != nil { - log.Error("Marshaling profiler configuration: %s", err) + log.Error("Marshaling profiler configuration: %s", err.Error()) return } log.Info("Profiler configuration: %s\n", b) @@ -196,6 +188,12 @@ func defaultConfig() (*config, error) { deltaProfiles: internal.BoolEnv("DD_PROFILING_DELTA", true), logStartup: internal.BoolEnv("DD_TRACE_STARTUP_LOGS", true), endpointCountEnabled: internal.BoolEnv(traceprof.EndpointCountEnvVar, false), + compressionConfig: cmp.Or(env.Get("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS"), "zstd"), + traceConfig: executionTraceConfig{ + Enabled: internal.BoolEnv("DD_PROFILING_EXECUTION_TRACE_ENABLED", executionTraceEnabledDefault), + Period: internal.DurationEnv("DD_PROFILING_EXECUTION_TRACE_PERIOD", 15*time.Minute), + Limit: internal.IntEnv("DD_PROFILING_EXECUTION_TRACE_LIMIT_BYTES", defaultExecutionTraceSizeLimit), + }, } c.tags = c.tags.Append(fmt.Sprintf("process_id:%d", os.Getpid())) for _, t := range defaultProfileTypes { @@ -208,34 +206,40 @@ func defaultConfig() (*config, error) { } else { c.agentURL = url.String() + "/profiling/v1/input" } - if v := os.Getenv("DD_PROFILING_UPLOAD_TIMEOUT"); v != "" { + // If DD_PROFILING_ENABLED is set to "auto", the profiler's activation will be determined by + // the Datadog admission controller, so we set it to true. + if v, _ := stableconfig.String("DD_PROFILING_ENABLED", ""); v == "auto" { + c.enabled = true + } else { + c.enabled, _, _ = stableconfig.Bool("DD_PROFILING_ENABLED", true) + } + if v := env.Get("DD_PROFILING_UPLOAD_TIMEOUT"); v != "" { d, err := time.ParseDuration(v) if err != nil { return nil, fmt.Errorf("DD_PROFILING_UPLOAD_TIMEOUT: %s", err) } WithUploadTimeout(d)(&c) } - if v := os.Getenv("DD_API_KEY"); v != "" { - WithAPIKey(v)(&c) - } - if internal.BoolEnv("DD_PROFILING_AGENTLESS", false) { - WithAgentlessUpload()(&c) + if v := env.Get("DD_API_KEY"); v != "" { + c.apiKey = v } - if v := os.Getenv("DD_SITE"); v != "" { + c.agentless = internal.BoolEnv("DD_PROFILING_AGENTLESS", false) + if v := env.Get("DD_SITE"); v != "" { WithSite(v)(&c) } - if v := os.Getenv("DD_ENV"); v != "" { + if v := env.Get("DD_ENV"); v != "" { WithEnv(v)(&c) } - if v := os.Getenv("DD_SERVICE"); v != "" { + if v := env.Get("DD_SERVICE"); v != "" { WithService(v)(&c) } - if v := os.Getenv("DD_VERSION"); v != "" { + if v := env.Get("DD_VERSION"); v != "" { WithVersion(v)(&c) } + c.flushOnExit = internal.BoolEnv("DD_PROFILING_FLUSH_ON_EXIT", false) tags := make(map[string]string) - if v := os.Getenv("DD_TAGS"); v != "" { + if v := env.Get("DD_TAGS"); v != "" { tags = internal.ParseTagString(v) internal.CleanGitMetadataTags(tags) } @@ -259,14 +263,14 @@ func defaultConfig() (*config, error) { "runtime-id:"+globalconfig.RuntimeID(), )(&c) // not for public use - if v := os.Getenv("DD_PROFILING_URL"); v != "" { + if v := env.Get("DD_PROFILING_URL"); v != "" { WithURL(v)(&c) } // not for public use - if v := os.Getenv("DD_PROFILING_OUTPUT_DIR"); v != "" { + if v := env.Get("DD_PROFILING_OUTPUT_DIR"); v != "" { withOutputDir(v)(&c) } - if v := os.Getenv("DD_PROFILING_WAIT_PROFILE_MAX_GOROUTINES"); v != "" { + if v := env.Get("DD_PROFILING_WAIT_PROFILE_MAX_GOROUTINES"); v != "" { n, err := strconv.Atoi(v) if err != nil { return nil, fmt.Errorf("DD_PROFILING_WAIT_PROFILE_MAX_GOROUTINES: %s", err) @@ -274,8 +278,6 @@ func defaultConfig() (*config, error) { c.maxGoroutinesWait = n } - // Experimental feature: Go execution trace (runtime/trace) recording. - c.traceConfig.Refresh() return &c, nil } @@ -289,29 +291,6 @@ func WithAgentAddr(hostport string) Option { } } -// WithAPIKey sets the Datadog API Key and takes precedence over the DD_API_KEY -// env variable. Historically this option was used to enable agentless -// uploading, but as of dd-trace-go v1.30.0 the behavior has changed to always -// default to agent based uploading which doesn't require an API key. So if you -// currently don't have an agent running on the default localhost:8126 hostport -// you need to set it up, or use WithAgentAddr to specify the hostport location -// of the agent. See WithAgentlessUpload for more information. -func WithAPIKey(key string) Option { - return func(cfg *config) { - cfg.apiKey = key - } -} - -// WithAgentlessUpload is currently for internal usage only and not officially -// supported. You should not enable it unless somebody at Datadog instructed -// you to do so. It allows to skip the agent and talk to the Datadog API -// directly using the provided API key. -func WithAgentlessUpload() Option { - return func(cfg *config) { - cfg.agentless = true - } -} - // WithDeltaProfiles specifies if delta profiles are enabled. The default value // is true. This option takes precedence over the DD_PROFILING_DELTA // environment variable that can be set to "true" or "false" as well. See @@ -472,7 +451,7 @@ func WithUDS(socketPath string) Option { // will be interpreted as part of the request path and the // request will fail. Clean up the path here so we get // something resembling the desired path in any profiler logs. - // TODO: copied from ddtrace/tracer, but is this correct? + // TODO(darccio): use internal.UnixDataSocketURL instead cleanPath := fmt.Sprintf("UDS_%s", strings.NewReplacer(":", "_", "/", "_", `\`, "_").Replace(socketPath)) c.agentURL = "http://" + cleanPath + "/profiling/v1/input" WithHTTPClient(&http.Client{ @@ -540,27 +519,6 @@ type executionTraceConfig struct { // [article]: https://blog.felixge.de/waiting-for-go1-21-execution-tracing-with-less-than-one-percent-overhead/ var executionTraceEnabledDefault = runtime.GOARCH == "arm64" || runtime.GOARCH == "amd64" -// Refresh updates the execution trace configuration to reflect any run-time -// changes to the configuration environment variables, applying defaults as -// needed. -func (e *executionTraceConfig) Refresh() { - e.Enabled = internal.BoolEnv("DD_PROFILING_EXECUTION_TRACE_ENABLED", executionTraceEnabledDefault) - e.Period = internal.DurationEnv("DD_PROFILING_EXECUTION_TRACE_PERIOD", 15*time.Minute) - e.Limit = internal.IntEnv("DD_PROFILING_EXECUTION_TRACE_LIMIT_BYTES", defaultExecutionTraceSizeLimit) - - if e.Enabled && (e.Period == 0 || e.Limit == 0) { - if !e.warned { - e.warned = true - log.Warn("Invalid execution trace config, enabled is true but size limit or frequency is 0. Disabling execution trace.") - } - e.Enabled = false - return - } - // If the config is valid, reset e.warned so we'll print another warning - // if it's udpated to be invalid - e.warned = false -} - // WithCustomProfilerLabelKeys specifies [profiler label] keys which should be // available as attributes for filtering frames for CPU and goroutine profile // flame graphs in the Datadog profiler UI. diff --git a/profiler/options_test.go b/profiler/options_test.go index 935a8ba18d..e35d799a3d 100644 --- a/profiler/options_test.go +++ b/profiler/options_test.go @@ -13,7 +13,7 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" "github.com/DataDog/datadog-go/v5/statsd" "github.com/stretchr/testify/assert" @@ -95,21 +95,6 @@ func TestOptions(t *testing.T) { assert.Equal(t, 5*time.Second, cfg.uploadTimeout) }) - t.Run("WithAPIKey", func(t *testing.T) { - var cfg config - WithAPIKey(testAPIKey)(&cfg) - assert.Equal(t, testAPIKey, cfg.apiKey) - assert.Equal(t, cfg.apiURL, cfg.targetURL) - }) - - t.Run("WithAPIKey/override", func(t *testing.T) { - t.Setenv("DD_API_KEY", "apikey") - var testAPIKey = "12345678901234567890123456789012" - var cfg config - WithAPIKey(testAPIKey)(&cfg) - assert.Equal(t, testAPIKey, cfg.apiKey) - }) - t.Run("WithURL", func(t *testing.T) { var cfg config WithURL("my-url")(&cfg) @@ -264,6 +249,21 @@ func TestEnvVars(t *testing.T) { assert.Equal(t, "http://localhost:6218/profiling/v1/input", cfg.agentURL) }) + t.Run("DD_PROFILING_ENABLED", func(t *testing.T) { + t.Run("default", func(t *testing.T) { + cfg, err := defaultConfig() + require.NoError(t, err) + assert.Equal(t, true, cfg.enabled) + }) + + t.Run("override", func(t *testing.T) { + t.Setenv("DD_PROFILING_ENABLED", "false") + cfg, err := defaultConfig() + require.NoError(t, err) + assert.Equal(t, false, cfg.enabled) + }) + }) + t.Run("DD_PROFILING_UPLOAD_TIMEOUT", func(t *testing.T) { t.Setenv("DD_PROFILING_UPLOAD_TIMEOUT", "3s") cfg, err := defaultConfig() diff --git a/profiler/orchestrion.yml b/profiler/orchestrion.yml new file mode 100644 index 0000000000..2ed2e07884 --- /dev/null +++ b/profiler/orchestrion.yml @@ -0,0 +1,66 @@ +# Unless explicitly stated otherwise all files in this repository are licensed +# under the Apache License Version 2.0. +# This product includes software developed at Datadog (https://www.datadoghq.com/). +# Copyright 2023-present Datadog, Inc. +--- +# yaml-language-server: $schema=https://datadoghq.dev/orchestrion/schema.json +meta: + name: github.com/DataDog/dd-trace-go/v2/profiler + description: The entry point of a Go program. + +aspects: + - id: func main() + join-point: + all-of: + - package-name: main + - test-main: false + - function-body: + function: + - name: main + - signature: {} + advice: + - inject-declarations: + imports: + profiler: github.com/DataDog/dd-trace-go/v2/profiler + env: github.com/DataDog/dd-trace-go/v2/instrumentation/env + log: log + # Note: it is valid to have multiple func init() in a single compile unit (e.g, `.go` file), in which case + # they get executed in declaration order. This means it's okay for us to add a new init function if there is + # already one in the file, but as it currently is appended AFTER all other declarations in the file, it means + # that it will be executed last (tracing contents of previous init functions will not be possible). + template: |- + func init() { + switch env.Get("DD_PROFILING_ENABLED") { + case "1", "true", "auto": + // The "auto" value can be set if profiling is enabled via the + // Datadog Admission Controller. We always turn on the profiler in + // the "auto" case since we only send profiles after at least a + // minute, and we assume anything running that long is worth + // profiling. + err := profiler.Start( + profiler.WithProfileTypes( + profiler.CPUProfile, + profiler.HeapProfile, + // Non-default profiles which are highly likely to be useful: + profiler.GoroutineProfile, + profiler.MutexProfile, + ), + profiler.WithTags("orchestrion:true"), + ) + if err != nil { + // TODO: is there a better reporting mechanism? + // The tracer and profiler already use the stdlib logger, so + // we're not adding anything new. But users might be using a + // different logger. + log.Printf("failed to start profiling: %s", err.Error()) + } + } + } + + # We need to stop the profiler at the end of `main` to ensure profiles are complete. + - prepend-statements: + imports: + profiler: github.com/DataDog/dd-trace-go/v2/profiler + tracer: github.com/DataDog/dd-trace-go/v2/ddtrace/tracer + template: |- + defer profiler.Stop() diff --git a/profiler/profile.go b/profiler/profile.go index ee6d1825be..bef7ca84a5 100644 --- a/profiler/profile.go +++ b/profiler/profile.go @@ -7,6 +7,7 @@ package profiler import ( "bytes" + "cmp" "compress/gzip" "context" "errors" @@ -16,8 +17,8 @@ import ( "runtime/trace" "time" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/fastdelta" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pprofutils" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/fastdelta" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pprofutils" "github.com/DataDog/gostackparse" pprofile "github.com/google/pprof/profile" @@ -88,6 +89,7 @@ var profileTypes = map[ProfileType]profileType{ Filename: "cpu.pprof", Collect: func(p *profiler) ([]byte, error) { var buf bytes.Buffer + var outBuf bytes.Buffer // Start the CPU profiler at the end of the profiling // period so that we're sure to capture the CPU usage of // this library, which mostly happens at the end @@ -100,7 +102,7 @@ var profileTypes = map[ProfileType]profileType{ runtime.SetCPUProfileRate(p.cfg.cpuProfileRate) } - if err := p.startCPUProfile(&buf); err != nil { + if err := p.startCPUProfile(&outBuf); err != nil { return nil, err } p.interruptibleSleep(p.cfg.cpuDuration) @@ -110,7 +112,12 @@ var profileTypes = map[ProfileType]profileType{ // the other profile types p.pendingProfiles.Wait() p.stopCPUProfile() - return buf.Bytes(), nil + + c := p.compressors[CPUProfile] + c.Reset(&buf) + _, writeErr := outBuf.WriteTo(c) + closeErr := c.Close() + return buf.Bytes(), cmp.Or(writeErr, closeErr) }, }, // HeapProfile is complex due to how the Go runtime exposes it. It contains 4 @@ -168,7 +175,11 @@ var profileTypes = map[ProfileType]profileType{ if err := p.lookupProfile("goroutine", text, 2); err != nil { return nil, err } - err := goroutineDebug2ToPprof(text, pprof, now) + + c := p.compressors[expGoroutineWaitProfile] + c.Reset(pprof) + err := goroutineDebug2ToPprof(text, c, now) + err = cmp.Or(err, c.Close()) return pprof.Bytes(), err }, }, @@ -177,8 +188,11 @@ var profileTypes = map[ProfileType]profileType{ Filename: "metrics.json", Collect: func(p *profiler) ([]byte, error) { var buf bytes.Buffer + c := p.compressors[MetricsProfile] + c.Reset(&buf) interrupted := p.interruptibleSleep(p.cfg.period) - err := p.met.report(now(), &buf) + err := p.met.report(now(), c) + err = cmp.Or(err, c.Close()) if err != nil && interrupted { err = errProfilerStopped } @@ -191,7 +205,8 @@ var profileTypes = map[ProfileType]profileType{ Collect: func(p *profiler) ([]byte, error) { p.lastTrace = time.Now() buf := new(bytes.Buffer) - lt := newLimitedTraceCollector(buf, int64(p.cfg.traceConfig.Limit)) + outBuf := new(bytes.Buffer) + lt := newLimitedTraceCollector(outBuf, int64(p.cfg.traceConfig.Limit)) if err := trace.Start(lt); err != nil { return nil, err } @@ -202,7 +217,12 @@ var profileTypes = map[ProfileType]profileType{ case <-lt.done: // The trace size limit was exceeded } trace.Stop() - return buf.Bytes(), nil + + c := p.compressors[executionTrace] + c.Reset(buf) + _, writeErr := outBuf.WriteTo(c) + closeErr := c.Close() + return buf.Bytes(), cmp.Or(writeErr, closeErr) }, }, } @@ -264,19 +284,25 @@ func collectGenericProfile(name string, pt ProfileType) func(p *profiler) ([]byt p.interruptibleSleep(p.cfg.period) var buf bytes.Buffer - err := p.lookupProfile(name, &buf, 0) - data := buf.Bytes() dp, ok := p.deltas[pt] if !ok || !p.cfg.deltaProfiles { - return data, err + c := p.compressors[pt] + c.Reset(&buf) + err := p.lookupProfile(name, c, 0) + err = cmp.Or(err, c.Close()) + return buf.Bytes(), err + } + + if err := p.lookupProfile(name, &buf, 0); err != nil { + return nil, err } start := time.Now() - delta, err := dp.Delta(data) + delta, err := dp.Delta(buf.Bytes()) tags := append(p.cfg.tags.Slice(), fmt.Sprintf("profile_type:%s", name)) p.cfg.statsd.Timing("datadog.profiling.go.delta_time", time.Since(start), tags, 1) if err != nil { - return nil, fmt.Errorf("delta profile error: %s", err) + return nil, fmt.Errorf("delta profile error: %s", err.Error()) } return delta, err } @@ -314,6 +340,26 @@ func (t ProfileType) Tag() string { return fmt.Sprintf("profile_type:%s", t) } +// UnmarshalText parses a profile type from text. +func (t *ProfileType) UnmarshalText(text []byte) error { + switch string(text) { + case "cpu": + *t = CPUProfile + case "heap": + *t = HeapProfile + case "block": + *t = BlockProfile + case "mutex": + *t = MutexProfile + case "goroutine": + *t = GoroutineProfile + default: + return fmt.Errorf("unknown profile type: %s", text) + } + + return nil +} + // profile specifies a profiles data (gzipped protobuf, json), and the types contained within it. type profile struct { // name indicates profile type and format (e.g. cpu.pprof, metrics.json) @@ -361,17 +407,17 @@ func (p *profiler) runProfile(pt ProfileType) ([]*profile, error) { } type fastDeltaProfiler struct { - dc *fastdelta.DeltaComputer - buf bytes.Buffer - gzr gzip.Reader - gzw *gzip.Writer + dc *fastdelta.DeltaComputer + buf bytes.Buffer + gzr gzip.Reader + compressor compressor } -func newFastDeltaProfiler(v ...pprofutils.ValueType) *fastDeltaProfiler { +func newFastDeltaProfiler(compressor compressor, v ...pprofutils.ValueType) *fastDeltaProfiler { fd := &fastDeltaProfiler{ - dc: fastdelta.NewDeltaComputer(v...), + dc: fastdelta.NewDeltaComputer(v...), + compressor: compressor, } - fd.gzw = gzip.NewWriter(&fd.buf) return fd } @@ -386,18 +432,20 @@ func (fdp *fastDeltaProfiler) Delta(data []byte) (b []byte, err error) { } data, err = io.ReadAll(&fdp.gzr) if err != nil { - return nil, fmt.Errorf("decompressing profile: %v", err) + return nil, fmt.Errorf("decompressing profile: %s", err.Error()) } } fdp.buf.Reset() - fdp.gzw.Reset(&fdp.buf) - - if err = fdp.dc.Delta(data, fdp.gzw); err != nil { - return nil, fmt.Errorf("error computing delta: %v", err) - } - if err = fdp.gzw.Close(); err != nil { - return nil, fmt.Errorf("error flushing gzip writer: %v", err) + c := fdp.compressor + c.Reset(&fdp.buf) + + deltaErr := fdp.dc.Delta(data, c) + closeErr := c.Close() + if deltaErr != nil { + return nil, fmt.Errorf("error computing delta: %w", deltaErr) + } else if closeErr != nil { + return nil, fmt.Errorf("error flushing compressor: %w", closeErr) } // The returned slice will be retained in case the profile upload fails, // so we need to return a copy of the buffer's bytes to avoid a data @@ -497,9 +545,9 @@ func goroutineDebug2ToPprof(r io.Reader, w io.Writer, t time.Time) (err error) { } if err := p.CheckValid(); err != nil { - return fmt.Errorf("marshalGoroutineDebug2Profile: %s", err) - } else if err := p.Write(w); err != nil { - return fmt.Errorf("marshalGoroutineDebug2Profile: %s", err) + return fmt.Errorf("marshalGoroutineDebug2Profile: %s", err.Error()) + } else if err := p.WriteUncompressed(w); err != nil { + return fmt.Errorf("marshalGoroutineDebug2Profile: %s", err.Error()) } return nil } diff --git a/profiler/profile_test.go b/profiler/profile_test.go index 0cde6e5bec..0b04609854 100644 --- a/profiler/profile_test.go +++ b/profiler/profile_test.go @@ -14,7 +14,7 @@ import ( "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/pprofutils" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/pprofutils" pprofile "github.com/google/pprof/profile" "github.com/stretchr/testify/assert" @@ -109,6 +109,7 @@ main;bar 0 0 8 16 }, } + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "legacy") for _, test := range tests { for _, profType := range test.Types { // deltaProfiler returns an unstarted profiler that is fed prof1 @@ -171,12 +172,15 @@ main;bar 0 0 8 16 } func TestRunProfile(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "legacy") + // TODO(felixge): These tests are directly calling the internal runProfile() + // function which is brittle. We should refactor them to use the public API. t.Run("delta", func(t *testing.T) { testRunDeltaProfile(t) }) t.Run("cpu", func(t *testing.T) { - p, err := unstartedProfiler(CPUDuration(10*time.Millisecond), WithPeriod(10*time.Millisecond)) + p, err := unstartedProfiler(CPUDuration(10*time.Millisecond), WithPeriod(10*time.Millisecond), WithProfileTypes(CPUProfile)) p.testHooks.startCPUProfile = func(w io.Writer) error { _, err := w.Write([]byte("my-cpu-profile")) return err @@ -193,7 +197,7 @@ func TestRunProfile(t *testing.T) { }) t.Run("goroutine", func(t *testing.T) { - p, err := unstartedProfiler(WithPeriod(time.Millisecond)) + p, err := unstartedProfiler(WithPeriod(time.Millisecond), WithProfileTypes(GoroutineProfile)) p.testHooks.lookupProfile = func(name string, w io.Writer, _ int) error { _, err := w.Write([]byte(name)) return err @@ -228,7 +232,7 @@ main.main() ...additional frames elided... ` - p, err := unstartedProfiler(WithPeriod(10 * time.Millisecond)) + p, err := unstartedProfiler(WithPeriod(10*time.Millisecond), WithProfileTypes(expGoroutineWaitProfile)) p.testHooks.lookupProfile = func(_ string, w io.Writer, _ int) error { _, err := w.Write([]byte(sample)) return err @@ -309,7 +313,7 @@ main.main() defer stop() t.Setenv("DD_PROFILING_WAIT_PROFILE_MAX_GOROUTINES", strconv.Itoa(limit)) - p, err := unstartedProfiler() + p, err := unstartedProfiler(WithProfileTypes(expGoroutineWaitProfile)) p.testHooks.lookupProfile = func(_ string, w io.Writer, _ int) error { _, err := w.Write([]byte("")) return err @@ -412,6 +416,41 @@ func TestProfileTypeSoundness(t *testing.T) { }) } +func TestUnmarshalText(t *testing.T) { + tests := []struct { + Text []byte + WantProfileType ProfileType + }{ + { + Text: []byte("cpu"), + WantProfileType: CPUProfile, + }, + { + Text: []byte("heap"), + WantProfileType: HeapProfile, + }, + { + Text: []byte("mutex"), + WantProfileType: MutexProfile, + }, + { + Text: []byte("goroutine"), + WantProfileType: GoroutineProfile, + }, + { + Text: []byte("block"), + WantProfileType: BlockProfile, + }, + } + + for _, test := range tests { + var p ProfileType + err := p.UnmarshalText(test.Text) + require.NoError(t, err) + assert.Equal(t, test.WantProfileType, p) + } +} + func requirePprofEqual(t *testing.T, a, b []byte) { t.Helper() pprofA, err := pprofile.ParseData(a) diff --git a/profiler/profiler.go b/profiler/profiler.go index 0dba2062b8..4490612081 100644 --- a/profiler/profiler.go +++ b/profiler/profiler.go @@ -9,19 +9,22 @@ import ( "errors" "fmt" "io" + "maps" "math/rand" "os" "path/filepath" "runtime" "runtime/pprof" + "slices" "strings" "sync" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - "gopkg.in/DataDog/dd-trace-go.v1/profiler/internal/immutable" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/profiler/internal/immutable" ) // outChannelSize specifies the size of the profile output channel. @@ -47,6 +50,9 @@ var ( // // It may return an error if an API key is not provided by means of the // WithAPIKey option, or if a hostname is not found. +// +// If DD_PROFILING_ENABLED=false is set in the process environment, it will +// prevent the profiler from starting. func Start(opts ...Option) error { mu.Lock() defer mu.Unlock() @@ -58,6 +64,9 @@ func Start(opts ...Option) error { if err != nil { return err } + if !p.cfg.enabled { + return nil + } activeProfiler = p activeProfiler.run() traceprof.SetProfilerEnabled(true) @@ -87,6 +96,7 @@ type profiler struct { wg sync.WaitGroup // wg waits for all goroutines to exit when stopping. met *metrics // metric collector state deltas map[ProfileType]*fastDeltaProfiler + compressors map[ProfileType]compressor seq uint64 // seq is the value of the profile_seq tag pendingProfiles sync.WaitGroup // signal that profile collection is done, for stopping CPU profiling @@ -130,10 +140,15 @@ func (p *profiler) lookupProfile(name string, w io.Writer, debug int) error { return prof.WriteTo(w, debug) } +var ( + errProfilingNotSupportedInAWSLambda = errors.New("profiling is not supported in AWS Lambda runtimes") + errAgentlessUploadRequiresAPIKey = errors.New("agentless upload requires a valid API key - set the DD_API_KEY env variable to configure one") +) + // newProfiler creates a new, unstarted profiler. func newProfiler(opts ...Option) (*profiler, error) { - if os.Getenv("AWS_LAMBDA_FUNCTION_NAME") != "" { - return nil, errors.New("profiling not supported in AWS Lambda runtimes") + if env.Get("AWS_LAMBDA_FUNCTION_NAME") != "" { + return nil, errProfilingNotSupportedInAWSLambda } cfg, err := defaultConfig() if err != nil { @@ -145,19 +160,25 @@ func newProfiler(opts ...Option) (*profiler, error) { if len(cfg.customProfilerLabels) > customProfileLabelLimit { cfg.customProfilerLabels = cfg.customProfilerLabels[:customProfileLabelLimit] } + + if cfg.traceConfig.Enabled && (cfg.traceConfig.Period == 0 || cfg.traceConfig.Limit == 0) { + log.Warn("Invalid execution trace config, enabled is true but size limit or frequency is 0. Disabling execution tracing") + cfg.traceConfig.Enabled = false + } + // TODO(fg) remove this after making expGoroutineWaitProfile public. - if os.Getenv("DD_PROFILING_WAIT_PROFILE") != "" { + if env.Get("DD_PROFILING_WAIT_PROFILE") != "" { cfg.addProfileType(expGoroutineWaitProfile) } // Agentless upload is disabled by default as of v1.30.0, but - // WithAgentlessUpload can be used to enable it for testing and debugging. + // DD_PROFILING_AGENTLESS can be set to enable it for testing and debugging. if cfg.agentless { if !isAPIKeyValid(cfg.apiKey) { - return nil, errors.New("profiler.WithAgentlessUpload requires a valid API key. Use profiler.WithAPIKey or the DD_API_KEY env variable to set it") + return nil, errAgentlessUploadRequiresAPIKey } // Always warn people against using this mode for now. All customers should // use agent based uploading at this point. - log.Warn("profiler.WithAgentlessUpload is currently for internal usage only and not officially supported.") + log.Warn("Agentless upload is currently for internal usage only and not officially supported.") cfg.targetURL = cfg.apiURL } else { // Historically people could use an API Key to enable agentless uploading. @@ -166,7 +187,7 @@ func newProfiler(opts ...Option) (*profiler, error) { // key configured, we warn the customers that this is probably a // misconfiguration. if cfg.apiKey != "" { - log.Warn("You are currently setting profiler.WithAPIKey or the DD_API_KEY env variable, but as of dd-trace-go v1.30.0 this value is getting ignored by the profiler. Please see the profiler.WithAPIKey go docs and verify that your integration is still working. If you can't remove DD_API_KEY from your environment, you can use WithAPIKey(\"\") to silence this warning.") + log.Warn("You are currently setting the DD_API_KEY env variable, but as of dd-trace-go v1.30.0 this value is getting ignored by the profiler. Please verify that your integration is still working.") } cfg.targetURL = cfg.agentURL } @@ -174,9 +195,9 @@ func newProfiler(opts ...Option) (*profiler, error) { hostname, err := os.Hostname() if err != nil { if cfg.targetURL == cfg.apiURL { - return nil, fmt.Errorf("could not obtain hostname: %v", err) + return nil, fmt.Errorf("could not obtain hostname: %s", err) } - log.Warn("unable to look up hostname: %v", err) + log.Warn("unable to look up hostname: %s", err.Error()) } cfg.hostname = hostname } @@ -224,15 +245,32 @@ func newProfiler(opts ...Option) (*profiler, error) { cfg.tags = immutable.NewStringSlice(tags) p := profiler{ - cfg: cfg, - out: make(chan batch, outChannelSize), - exit: make(chan struct{}), - met: newMetrics(), - deltas: make(map[ProfileType]*fastDeltaProfiler), - } - for pt := range cfg.types { - if d := profileTypes[pt].DeltaValues; len(d) > 0 { - p.deltas[pt] = newFastDeltaProfiler(d...) + cfg: cfg, + out: make(chan batch, outChannelSize), + exit: make(chan struct{}), + met: newMetrics(), + deltas: make(map[ProfileType]*fastDeltaProfiler), + compressors: make(map[ProfileType]compressor), + } + types := slices.Collect(maps.Keys(cfg.types)) + // We need to manually add executionTrace to the list of profile types to be + // initialized for compression, because it's not part of the cfg.types map. + // Instead it gets added dynamically in profiler.collect. + if p.cfg.traceConfig.Enabled { + types = append(types, executionTrace) + } + var pipelineBuilder compressionPipelineBuilder + for _, pt := range types { + isDelta := p.cfg.deltaProfiles && len(profileTypes[pt].DeltaValues) > 0 + in, out := compressionStrategy(pt, isDelta, p.cfg.compressionConfig) + compressor, err := pipelineBuilder.Build(in, out) + if err != nil { + return nil, err + } + p.compressors[pt] = compressor + + if isDelta { + p.deltas[pt] = newFastDeltaProfiler(compressor, profileTypes[pt].DeltaValues...) } } p.uploadFunc = p.upload @@ -289,7 +327,8 @@ func (p *profiler) collect(ticker <-chan time.Time) { endpointCounter.GetAndReset() }() - for { + exit := false + for !exit { bat := batch{ seq: p.seq, host: p.cfg.hostname, @@ -306,6 +345,7 @@ func (p *profiler) collect(ticker <-chan time.Time) { } p.seq++ + clear(completed) completed = completed[:0] // We need to increment pendingProfiles for every non-CPU // profile _before_ entering the next loop so that we know CPU @@ -316,8 +356,7 @@ func (p *profiler) collect(ticker <-chan time.Time) { profileTypes := p.enabledProfileTypes() - // Decide whether we should record an execution trace - p.cfg.traceConfig.Refresh() + // Decide whether we should record an execution trace. // Randomly record a trace with probability (profile period) / (trace period). // Note that if the trace period is equal to or less than the profile period, // we will always record a trace @@ -348,7 +387,7 @@ func (p *profiler) collect(ticker <-chan time.Time) { profs, err := p.runProfile(t) if err != nil { if err != errProfilerStopped { - log.Error("Error getting %s profile: %v; skipping.", t, err) + log.Error("Error getting %s profile: %v; skipping.", t, err.Error()) tags := append(p.cfg.tags.Slice(), t.Tag()) p.cfg.statsd.Count("datadog.profiling.go.collect_error", 1, tags, 1) } @@ -378,7 +417,11 @@ func (p *profiler) collect(ticker <-chan time.Time) { // is less than the configured profiling period, the ticker will block // until the end of the profiling period. case <-p.exit: - return + if !p.cfg.flushOnExit { + return + } + // If we're flushing, we enqueue the batch before exiting the loop. + exit = true } // Include endpoint hits from tracer in profile `event.json`. @@ -451,13 +494,18 @@ func (p *profiler) send() { for { select { case <-p.exit: - return - case bat := <-p.out: + if !p.cfg.flushOnExit { + return + } + case bat, ok := <-p.out: + if !ok { + return + } if err := p.outputDir(bat); err != nil { - log.Error("Failed to output profile to dir: %v", err) + log.Error("Failed to output profile to dir: %s", err.Error()) } if err := p.uploadFunc(bat); err != nil { - log.Error("Failed to upload profile: %v", err) + log.Error("Failed to upload profile: %s", err.Error()) } } } diff --git a/profiler/profiler_test.go b/profiler/profiler_test.go index 3d65fd8d58..004e175859 100644 --- a/profiler/profiler_test.go +++ b/profiler/profiler_test.go @@ -7,6 +7,7 @@ package profiler import ( "bytes" + "compress/gzip" "context" "encoding/json" "fmt" @@ -22,18 +23,20 @@ import ( "runtime/trace" "strconv" "strings" + "sync/atomic" "testing" "time" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal" - "gopkg.in/DataDog/dd-trace-go.v1/internal/globalconfig" - "gopkg.in/DataDog/dd-trace-go.v1/internal/httpmem" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" - "gopkg.in/DataDog/dd-trace-go.v1/internal/traceprof" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/instrumentation/httpmem" + "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/globalconfig" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/traceprof" + "github.com/DataDog/dd-trace-go/v2/internal/version" + pprofile "github.com/google/pprof/profile" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -60,8 +63,8 @@ func TestStart(t *testing.T) { // that we log some default configuration, e.g. enabled profiles assert.LessOrEqual(t, 1, len(rl.Logs())) startupLog := strings.Join(rl.Logs(), " ") - assert.Contains(t, startupLog, "\"cpu\"") - assert.Contains(t, startupLog, "\"heap\"") + assert.Contains(t, startupLog, "cpu_profile_enabled") + assert.Contains(t, startupLog, "heap_profile_enabled") mu.Lock() require.NotNil(t, activeProfiler) @@ -83,6 +86,20 @@ func TestStart(t *testing.T) { mu.Unlock() }) + t.Run("dd_profiling_not_enabled", func(t *testing.T) { + t.Setenv("DD_PROFILING_ENABLED", "false") + if err := Start(); err != nil { + t.Fatal(err) + } + defer Stop() + + mu.Lock() + // if DD_PROFILING_ENABLED is false, the profiler should not be started even if Start() is called + // So we should not have an activeProfiler + assert.Nil(t, activeProfiler) + mu.Unlock() + }) + t.Run("options", func(t *testing.T) { if err := Start(); err != nil { t.Fatal(err) @@ -95,44 +112,58 @@ func TestStart(t *testing.T) { mu.Unlock() }) - t.Run("options/GoodAPIKey/Agent", func(t *testing.T) { + t.Run("Agent/GoodAPIKey", func(t *testing.T) { + t.Setenv("DD_API_KEY", "12345678901234567890123456789012") rl := &log.RecordLogger{} defer log.UseLogger(rl)() - err := Start(WithAPIKey("12345678901234567890123456789012")) + err := Start() defer Stop() assert.Nil(t, err) assert.Equal(t, activeProfiler.cfg.agentURL, activeProfiler.cfg.targetURL) // The package should log a warning that using an API has no // effect unless uploading directly to Datadog (i.e. agentless) assert.LessOrEqual(t, 1, len(rl.Logs())) - assert.Contains(t, strings.Join(rl.Logs(), " "), "profiler.WithAPIKey") + assert.Contains(t, strings.Join(rl.Logs(), " "), "DD_API_KEY") }) - t.Run("options/GoodAPIKey/Agentless", func(t *testing.T) { + t.Run("Agentless/GoodAPIKey", func(t *testing.T) { + t.Setenv("DD_PROFILING_AGENTLESS", "True") + t.Setenv("DD_API_KEY", "12345678901234567890123456789012") rl := &log.RecordLogger{} defer log.UseLogger(rl)() - err := Start( - WithAPIKey("12345678901234567890123456789012"), - WithAgentlessUpload(), - ) + err := Start() defer Stop() assert.Nil(t, err) assert.Equal(t, activeProfiler.cfg.apiURL, activeProfiler.cfg.targetURL) // The package should log a warning that agentless upload is not // officially supported, so prefer not to use it assert.LessOrEqual(t, 1, len(rl.Logs())) - assert.Contains(t, strings.Join(rl.Logs(), " "), "profiler.WithAgentlessUpload") + assert.Contains(t, strings.Join(rl.Logs(), " "), "Agentless") }) - t.Run("options/BadAPIKey", func(t *testing.T) { - err := Start(WithAPIKey("aaaa"), WithAgentlessUpload()) + t.Run("Agentless/NoAPIKey", func(t *testing.T) { + t.Setenv("DD_PROFILING_AGENTLESS", "True") + t.Setenv("DD_API_KEY", "") // In case one is present in the environment... + err := Start() defer Stop() - assert.NotNil(t, err) + assert.ErrorIs(t, err, errAgentlessUploadRequiresAPIKey) // Check that mu gets unlocked, even if newProfiler() returns an error. - mu.Lock() + require.True(t, mu.TryLock()) + mu.Unlock() + }) + + t.Run("Agentless/BadAPIKey", func(t *testing.T) { + t.Setenv("DD_PROFILING_AGENTLESS", "True") + t.Setenv("DD_API_KEY", "aaaa") + err := Start() + defer Stop() + assert.ErrorIs(t, err, errAgentlessUploadRequiresAPIKey) + + // Check that mu gets unlocked, even if newProfiler() returns an error. + require.True(t, mu.TryLock()) mu.Unlock() }) @@ -140,7 +171,7 @@ func TestStart(t *testing.T) { t.Setenv("AWS_LAMBDA_FUNCTION_NAME", "my-function-name") err := Start() defer Stop() - assert.NotNil(t, err) + assert.ErrorIs(t, err, errProfilingNotSupportedInAWSLambda) }) } @@ -183,7 +214,7 @@ func TestStartWithoutStopReconfigures(t *testing.T) { func TestStopLatency(t *testing.T) { received := make(chan struct{}) stop := make(chan struct{}) - server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + server := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { select { case received <- struct{}{}: default: @@ -219,6 +250,59 @@ func TestStopLatency(t *testing.T) { } } +func TestFlushAndStop(t *testing.T) { + t.Setenv("DD_PROFILING_FLUSH_ON_EXIT", "1") + received := startTestProfiler(t, 1, + WithProfileTypes(CPUProfile, HeapProfile), + WithPeriod(time.Hour), + WithUploadTimeout(time.Hour)) + + Stop() + + select { + case prof := <-received: + if len(prof.attachments["cpu.pprof"]) == 0 { + t.Errorf("expected CPU profile, got none") + } + if len(prof.attachments["delta-heap.pprof"]) == 0 { + t.Errorf("expected heap profile, got none") + } + case <-time.After(5 * time.Second): + t.Fatalf("profiler did not flush") + } +} + +func TestFlushAndStopTimeout(t *testing.T) { + uploadTimeout := 1 * time.Second + var requests atomic.Int32 + server := httptest.NewServer(http.HandlerFunc(func(_ http.ResponseWriter, r *http.Request) { + if h := r.Header.Get("DD-Telemetry-Request-Type"); len(h) > 0 { + return + } + requests.Add(1) + time.Sleep(2 * uploadTimeout) + })) + defer server.Close() + + t.Setenv("DD_PROFILING_FLUSH_ON_EXIT", "1") + Start( + WithAgentAddr(server.Listener.Addr().String()), + WithPeriod(time.Hour), + WithUploadTimeout(uploadTimeout), + ) + + start := time.Now() + Stop() + + elapsed := time.Since(start) + if elapsed > (maxRetries*uploadTimeout)+1*time.Second { + t.Errorf("profiler took %v to stop", elapsed) + } + if requests.Load() != maxRetries { + t.Errorf("expected %d requests, got %d", maxRetries, requests.Load()) + } +} + func TestSetProfileFraction(t *testing.T) { t.Run("on", func(t *testing.T) { start := runtime.SetMutexProfileFraction(0) @@ -449,6 +533,19 @@ func TestImmediateProfile(t *testing.T) { } } +func TestEnabledFalse(t *testing.T) { + t.Setenv("DD_PROFILING_ENABLED", "false") + ch := startTestProfiler(t, 1, WithPeriod(10*time.Millisecond), WithProfileTypes()) + select { + case <-ch: + t.Fatal("received profile when profiler should have been disabled") + case <-time.After(time.Second): + // This test might succeed incorrectly on an overloaded + // CI server, but is very likely to fail locally given a + // buggy implementation + } +} + func TestExecutionTraceCPUProfileRate(t *testing.T) { // cpuProfileRate is picked randomly so we can check for it in the trace // data to reduce the chance that it occurs in the trace data for some other @@ -459,6 +556,7 @@ func TestExecutionTraceCPUProfileRate(t *testing.T) { // fatal error: runtime: netpoll failed cpuProfileRate := int(9999 + rand.Int63n(9999)) + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "legacy") t.Setenv("DD_PROFILING_EXECUTION_TRACE_ENABLED", "true") t.Setenv("DD_PROFILING_EXECUTION_TRACE_PERIOD", "10ms") profile := <-startTestProfiler(t, 1, @@ -805,3 +903,43 @@ func TestMetricsProfileStopEarlyNoLog(t *testing.T) { } } } + +func gzipDecompress(data []byte) ([]byte, error) { + r, err := gzip.NewReader(bytes.NewReader(data)) + if err != nil { + return nil, err + } + return io.ReadAll(r) +} + +func TestHeapProfileCompression(t *testing.T) { + t.Setenv("DD_PROFILING_DEBUG_COMPRESSION_SETTINGS", "legacy") + t.Run("delta", func(t *testing.T) { testHeapProfileCompression(t, true) }) + t.Run("non-delta", func(t *testing.T) { testHeapProfileCompression(t, false) }) +} + +func testHeapProfileCompression(t *testing.T, delta bool) { + profiles := startTestProfiler(t, 1, + WithPeriod(10*time.Millisecond), WithProfileTypes(HeapProfile), WithDeltaProfiles(delta), + ) + p := <-profiles + attachment := "heap.pprof" + if delta { + attachment = "delta-heap.pprof" + } + data, ok := p.attachments[attachment] + if !ok { + t.Fatalf("no heap profile, got %s", p.event.Attachments) + } + decompressed, err := gzipDecompress(data) + if err != nil { + t.Fatalf("decompressing the heap profile failed: %s", err) + } + t.Logf("%x", decompressed[:16]) + // We assume the profile is gzip compressed. The pprof pacakge + // can parse gzip-compressed profiles (it checks for the magic number). + // So we should be able to parse the original data + if _, err := pprofile.ParseData(data); err != nil { + t.Fatalf("parsing profile data failed: %s", err) + } +} diff --git a/profiler/telemetry.go b/profiler/telemetry.go index 2e6a5fa88c..d9b7b5d52b 100644 --- a/profiler/telemetry.go +++ b/profiler/telemetry.go @@ -6,7 +6,8 @@ package profiler import ( - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" ) // startTelemetry starts the global instrumentation telemetry client with profiler data @@ -20,40 +21,49 @@ func startTelemetry(c *config) { // Do not do extra work populating config data if instrumentation telemetry is disabled. return } + telemetry.ProductStarted(telemetry.NamespaceProfilers) + telemetry.RegisterAppConfigs(telemetryConfiguration(c)...) + if telemetry.GlobalClient() == nil { + client, err := telemetry.NewClient(c.service, c.env, c.version, telemetry.ClientConfig{ + HTTPClient: c.httpClient, + APIKey: c.apiKey, + AgentURL: c.agentURL, + }) + if err != nil { + log.Debug("profiler: failed to create telemetry client: %s", err.Error()) + return + } + telemetry.StartApp(client) + } +} + +func telemetryConfiguration(c *config) []telemetry.Configuration { profileEnabled := func(t ProfileType) bool { _, ok := c.types[t] return ok } - telemetry.GlobalClient.ApplyOps( - telemetry.WithService(c.service), - telemetry.WithEnv(c.env), - telemetry.WithHTTPClient(c.httpClient), - telemetry.WithURL(c.agentless, c.agentURL), - ) - telemetry.GlobalClient.ProductChange( - telemetry.NamespaceProfilers, - true, - []telemetry.Configuration{ - {Name: "delta_profiles", Value: c.deltaProfiles}, - {Name: "agentless", Value: c.agentless}, - {Name: "profile_period", Value: c.period.String()}, - {Name: "cpu_duration", Value: c.cpuDuration.String()}, - {Name: "cpu_profile_rate", Value: c.cpuProfileRate}, - {Name: "block_profile_rate", Value: c.blockRate}, - {Name: "mutex_profile_fraction", Value: c.mutexFraction}, - {Name: "max_goroutines_wait", Value: c.maxGoroutinesWait}, - {Name: "cpu_profile_enabled", Value: profileEnabled(CPUProfile)}, - {Name: "heap_profile_enabled", Value: profileEnabled(HeapProfile)}, - {Name: "block_profile_enabled", Value: profileEnabled(BlockProfile)}, - {Name: "mutex_profile_enabled", Value: profileEnabled(MutexProfile)}, - {Name: "goroutine_profile_enabled", Value: profileEnabled(GoroutineProfile)}, - {Name: "goroutine_wait_profile_enabled", Value: profileEnabled(expGoroutineWaitProfile)}, - {Name: "upload_timeout", Value: c.uploadTimeout.String()}, - {Name: "execution_trace_enabled", Value: c.traceConfig.Enabled}, - {Name: "execution_trace_period", Value: c.traceConfig.Period.String()}, - {Name: "execution_trace_size_limit", Value: c.traceConfig.Limit}, - {Name: "endpoint_count_enabled", Value: c.endpointCountEnabled}, - {Name: "num_custom_profiler_label_keys", Value: len(c.customProfilerLabels)}, - }, - ) + return []telemetry.Configuration{ + {Name: "delta_profiles", Value: c.deltaProfiles}, + {Name: "agentless", Value: c.agentless}, + {Name: "profile_period", Value: c.period.String()}, + {Name: "cpu_duration", Value: c.cpuDuration.String()}, + {Name: "cpu_profile_rate", Value: c.cpuProfileRate}, + {Name: "block_profile_rate", Value: c.blockRate}, + {Name: "mutex_profile_fraction", Value: c.mutexFraction}, + {Name: "max_goroutines_wait", Value: c.maxGoroutinesWait}, + {Name: "cpu_profile_enabled", Value: profileEnabled(CPUProfile)}, + {Name: "heap_profile_enabled", Value: profileEnabled(HeapProfile)}, + {Name: "block_profile_enabled", Value: profileEnabled(BlockProfile)}, + {Name: "mutex_profile_enabled", Value: profileEnabled(MutexProfile)}, + {Name: "goroutine_profile_enabled", Value: profileEnabled(GoroutineProfile)}, + {Name: "goroutine_wait_profile_enabled", Value: profileEnabled(expGoroutineWaitProfile)}, + {Name: "upload_timeout", Value: c.uploadTimeout.String()}, + {Name: "execution_trace_enabled", Value: c.traceConfig.Enabled}, + {Name: "execution_trace_period", Value: c.traceConfig.Period.String()}, + {Name: "execution_trace_size_limit", Value: c.traceConfig.Limit}, + {Name: "endpoint_count_enabled", Value: c.endpointCountEnabled}, + {Name: "num_custom_profiler_label_keys", Value: len(c.customProfilerLabels)}, + {Name: "flush_on_exit", Value: c.flushOnExit}, + {Name: "debug_compression_settings", Value: c.compressionConfig}, + } } diff --git a/profiler/telemetry_test.go b/profiler/telemetry_test.go index 155b16d33c..8c6f0ee6a3 100644 --- a/profiler/telemetry_test.go +++ b/profiler/telemetry_test.go @@ -8,9 +8,9 @@ package profiler import ( "testing" - "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry" - "gopkg.in/DataDog/dd-trace-go.v1/internal/telemetry/telemetrytest" + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry" + "github.com/DataDog/dd-trace-go/v2/internal/telemetry/telemetrytest" "github.com/stretchr/testify/assert" ) @@ -18,8 +18,8 @@ import ( // Test that the profiler sends the correct telemetry information func TestTelemetryEnabled(t *testing.T) { t.Run("tracer start, profiler start", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() tracer.Start() defer tracer.Stop() @@ -31,13 +31,12 @@ func TestTelemetryEnabled(t *testing.T) { ) defer Stop() - assert.True(t, telemetryClient.ProfilerEnabled) - telemetry.Check(t, telemetryClient.Configuration, "heap_profile_enabled", true) - telemetryClient.AssertNumberOfCalls(t, "ApplyOps", 2) + assert.True(t, telemetryClient.Products[telemetry.NamespaceProfilers]) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "heap_profile_enabled", Value: true}) }) t.Run("only profiler start", func(t *testing.T) { - telemetryClient := new(telemetrytest.MockClient) - defer telemetry.MockGlobalClient(telemetryClient)() + telemetryClient := new(telemetrytest.RecordClient) + defer telemetry.MockClient(telemetryClient)() Start( WithProfileTypes( HeapProfile, @@ -45,8 +44,7 @@ func TestTelemetryEnabled(t *testing.T) { ) defer Stop() - assert.True(t, telemetryClient.ProfilerEnabled) - telemetry.Check(t, telemetryClient.Configuration, "heap_profile_enabled", true) - telemetryClient.AssertNumberOfCalls(t, "ApplyOps", 1) + assert.True(t, telemetryClient.Products[telemetry.NamespaceProfilers]) + assert.Contains(t, telemetryClient.Configuration, telemetry.Configuration{Name: "heap_profile_enabled", Value: true}) }) } diff --git a/profiler/upload.go b/profiler/upload.go index a8b98f6560..e4277f2ee9 100644 --- a/profiler/upload.go +++ b/profiler/upload.go @@ -16,12 +16,13 @@ import ( "mime/multipart" "net/http" "net/textproto" - "os" "strings" "time" - "gopkg.in/DataDog/dd-trace-go.v1/internal/log" - "gopkg.in/DataDog/dd-trace-go.v1/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/log" + "github.com/DataDog/dd-trace-go/v2/internal/orchestrion" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" ) // maxRetries specifies the maximum number of retries to have when an error occurs. @@ -37,7 +38,9 @@ func (p *profiler) upload(bat batch) error { for i := 0; i < maxRetries; i++ { select { case <-p.exit: - return nil + if !p.cfg.flushOnExit { + return nil + } default: } @@ -45,7 +48,7 @@ func (p *profiler) upload(bat batch) error { if rerr, ok := err.(*retriableError); ok { statsd.Count("datadog.profiling.go.upload_retry", 1, nil, 1) wait := time.Duration(rand.Int63n(p.cfg.period.Nanoseconds())) * time.Nanosecond - log.Error("Uploading profile failed: %v. Trying again in %s...", rerr, wait) + log.Error("Uploading profile failed: %s. Trying again in %s...", rerr.Error(), wait) p.interruptibleSleep(wait) continue } @@ -73,21 +76,7 @@ func (e retriableError) Error() string { return e.err.Error() } // doRequest makes an HTTP POST request to the Datadog Profiling API with the // given profile. func (p *profiler) doRequest(bat batch) error { - tags := append(p.cfg.tags.Slice(), - fmt.Sprintf("service:%s", p.cfg.service), - // The profile_seq tag can be used to identify the first profile - // uploaded by a given runtime-id, identify missing profiles, etc.. See - // PROF-5612 (internal) for more details. - fmt.Sprintf("profile_seq:%d", bat.seq), - ) - tags = append(tags, bat.extraTags...) - // If the user did not configure an "env" in the client, we should omit - // the tag so that the agent has a chance to supply a default tag. - // Otherwise, the tag supplied by the client will have priority. - if p.cfg.env != "" { - tags = append(tags, fmt.Sprintf("env:%s", p.cfg.env)) - } - contentType, body, err := encode(bat, tags) + contentType, body, err := encode(bat, p.cfg) if err != nil { return err } @@ -98,6 +87,9 @@ func (p *profiler) doRequest(bat batch) error { go func() { select { case <-p.exit: + if p.cfg.flushOnExit { + return + } case <-funcExit: } cancel() @@ -149,6 +141,7 @@ type uploadEvent struct { Info struct { Profiler profilerInfo `json:"profiler"` } `json:"info"` + ProcessTags string `json:"process_tags,omitempty"` } // profilerInfo holds profiler-specific information which should be attached to @@ -159,19 +152,34 @@ type profilerInfo struct { } `json:"ssi"` // Activation distinguishes how the profiler was enabled, either "auto" // (env var set via admission controller) or "manual" - Activation string `json:"activation"` + Activation string `json:"activation"` + Settings map[string]any `json:"settings"` } // encode encodes the profile as a multipart mime request. -func encode(bat batch, tags []string) (contentType string, body io.Reader, err error) { - var buf bytes.Buffer - - mw := multipart.NewWriter(&buf) - +func encode(bat batch, cfg *config) (contentType string, body io.Reader, err error) { + tags := append(cfg.tags.Slice(), + fmt.Sprintf("service:%s", cfg.service), + // The profile_seq tag can be used to identify the first profile + // uploaded by a given runtime-id, identify missing profiles, etc.. See + // PROF-5612 (internal) for more details. + fmt.Sprintf("profile_seq:%d", bat.seq), + "runtime:go", + ) + tags = append(tags, bat.extraTags...) + // If the user did not configure an "env" in the client, we should omit + // the tag so that the agent has a chance to supply a default tag. + // Otherwise, the tag supplied by the client will have priority. + if cfg.env != "" { + tags = append(tags, fmt.Sprintf("env:%s", cfg.env)) + } if bat.host != "" { tags = append(tags, fmt.Sprintf("host:%s", bat.host)) } - tags = append(tags, "runtime:go") + + var buf bytes.Buffer + + mw := multipart.NewWriter(&buf) event := &uploadEvent{ Version: "4", @@ -181,6 +189,7 @@ func encode(bat batch, tags []string) (contentType string, body io.Reader, err e Tags: strings.Join(tags, ","), EndpointCounts: bat.endpointCounts, CustomAttributes: bat.customAttributes, + ProcessTags: processtags.GlobalTags().String(), } // DD_PROFILING_ENABLED is only used to enable profiling when added with @@ -188,7 +197,7 @@ func encode(bat batch, tags []string) (contentType string, body io.Reader, err e // admission controller. Otherwise, the client library doesn't care // about the value and assumes it was something "truthy", or this code // wouldn't run. We just track it to be consistent with other languages - if os.Getenv("DD_PROFILING_ENABLED") == "auto" { + if env.Get("DD_PROFILING_ENABLED") == "auto" { event.Info.Profiler.Activation = "auto" } else { event.Info.Profiler.Activation = "manual" @@ -198,6 +207,10 @@ func encode(bat batch, tags []string) (contentType string, body io.Reader, err e } else { event.Info.Profiler.SSI.Mechanism = "none" } + event.Info.Profiler.Settings = map[string]any{} + for _, tc := range telemetryConfiguration(cfg) { + event.Info.Profiler.Settings[tc.Name] = tc.Value + } for _, p := range bat.profiles { event.Attachments = append(event.Attachments, p.name) diff --git a/profiler/upload_test.go b/profiler/upload_test.go index a5319e6443..d0d11c8f30 100644 --- a/profiler/upload_test.go +++ b/profiler/upload_test.go @@ -13,7 +13,8 @@ import ( "testing" "time" - maininternal "gopkg.in/DataDog/dd-trace-go.v1/internal" + maininternal "github.com/DataDog/dd-trace-go/v2/internal" + "github.com/DataDog/dd-trace-go/v2/internal/processtags" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -182,3 +183,17 @@ func TestGitMetadata(t *testing.T) { assert.NotContains(profile.tags, "git.repository_url:github.com/user/repo") }) } + +func TestProcessTags(t *testing.T) { + t.Run("enabled", func(t *testing.T) { + profile := doOneShortProfileUpload(t) + assert.NotEmpty(t, profile.event.ProcessTags) + }) + t.Run("disabled", func(t *testing.T) { + t.Setenv("DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED", "false") + processtags.Reload() + + profile := doOneShortProfileUpload(t) + assert.Empty(t, profile.event.ProcessTags) + }) +} diff --git a/repository.datadog.yml b/repository.datadog.yml index 03ce1bb586..777f32b988 100644 --- a/repository.datadog.yml +++ b/repository.datadog.yml @@ -1,10 +1,15 @@ --- schema-version: v1 kind: mergequeue -github_teams_restrictions: - - apm-ecosystems - - apm-go - - asm-go - - profiling-go -github_users_restrictions: - - dbenamydd +enable: true +merge_method: squash +branches: + main: + allow_skip_checks: true + require_reason_for_skip_checks: true +--- +schema-version: v1 +kind: mergegate +rules: + - require: commit-signatures + allow_unsigned_external: true diff --git a/rules/logging_rules.go b/rules/logging_rules.go new file mode 100644 index 0000000000..74cae63bd6 --- /dev/null +++ b/rules/logging_rules.go @@ -0,0 +1,354 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +//go:build ruleguard + +// Package gorules contains security-focused linting rules for logging in dd-trace-go. +// +// SECURITY LOGGING MODEL: +// +// This package implements differentiated security policies for different types of logging: +// +// INTERNAL/STANDARD LOGGING (internal/log, log): +// - PERMISSIVE POLICY: Allow %v for error types and err.Error() calls +// - Rationale: Internal logs stay within the application but still need data protection +// - ALLOWED: err.Error() with %v (returns controlled string) +// - SUGGESTED: Raw error variables with %v (suggest err.Error() for explicitness) +// +// ERROR TYPE HANDLING: +// - err.Error() calls with %v are ALLOWED (returns controlled string) +// - Raw error variables with %v get SUGGESTIONS (recommend err.Error()) +// - Position requirement: %v must be the last format verb (allows trailing chars like \n) +// +// RECOMMENDED PRACTICE: +// - Prefer err.Error() for explicitness even though raw errors are allowed +// - This makes the intent clear and follows defensive programming principles +// +// EXAMPLES: +// +// ❌ Forbidden (internal): +// +// log.Error("value: %v", someString) // Non-error type with %v +// log.Error("error %v at line %d", err, 123) // %v not at end +// +// ✅ Allowed (internal): +// +// log.Error("operation failed: %s", err.Error()) // err.Error() with %s is fine +// log.Error("failed with %v\n", err.Error()) // %v at end, trailing chars OK +// +// 🔍 Suggested improvement (internal): +// +// log.Error("operation failed: %s", err.Error()) // Raw error - suggest err.Error() +// log.Error("failed with %v\n", err) // Raw error - suggest err.Error() +package gorules + +import ( + "github.com/quasilyte/go-ruleguard/dsl" + "github.com/quasilyte/go-ruleguard/dsl/types" +) + +const ( + internalLogPackage = "github.com/DataDog/dd-trace-go/v2/internal/log" + formatVerbRegexPattern = `.*%[+#]?v.*` // %v, %+v, %#v + + // Pattern for %v as the last format verb (allows other non-format chars like \n after) + endVerbPattern = `.*%[+#]?v[^%]*$` // %v as last format verb, no more % after it + + // Base security messages explaining the rationale + logMessageFormat = "format verbs %v, %+v, or %#v prevents controlled data exposure. Use specific format verbs like %s, %d, %q and sanitize data before logging." + logMessageDynamic = "logging with variable format string. Use compile-time constant format strings to ensure controlled data exposure and prevent format string injection." + + // Best practice suggestion for error types + logMessageErrorSuggestion = "prefer err.Error() over %v for explicit error formatting. While %v with error types is allowed, err.Error() makes the intent clearer and follows defensive programming practices." + + // Predefined complete messages for violations: + internalLogPrefix = "Forbidden: (internal log) " + internalLogFormatMessage = internalLogPrefix + logMessageFormat + internalLogDynamicMessage = internalLogPrefix + logMessageDynamic + stdLogPrefix = "Forbidden: (standard log) " + stdLogFormatMessage = stdLogPrefix + logMessageFormat + stdLogDynamicMessage = stdLogPrefix + logMessageDynamic + + // Best practice suggestions for error types: + internalLogSuggestionPrefix = "Suggestion: (internal log) " + internalLogErrorSuggestion = internalLogSuggestionPrefix + logMessageErrorSuggestion + stdLogSuggestionPrefix = "Suggestion: (standard log) " + stdLogErrorSuggestion = stdLogSuggestionPrefix + logMessageErrorSuggestion +) + +//doc:summary INTERNAL SECURITY: detects unsafe %v usage in internal logging (non-error types or wrong position) +//doc:before log.Error("user value: %v", someString) +//doc:after log.Error("user value: %s", someString) +//doc:tags security internal-log data-leak format-verbs +func internalLogFormatVerbs(m dsl.Matcher) { + // SECURITY POLICY: Internal logging has PERMISSIVE policy with error handling + // - ALLOWED: %v with err.Error() calls (returns controlled string) + // - SUGGESTED: %v with raw error types (suggest err.Error() for explicitness) + // - FORBIDDEN: %v with non-error types or %v not at end + // - Position requirement: %v must be the last format verb (trailing chars like \n are OK) + m.Import(internalLogPackage) + + // Match internal log calls that violate the error handling rules: + // 1. %v with non-error types (any position) - VIOLATION + // 2. %v not at end of format string (even with error types) - VIOLATION + // 3. %v with err.Error() calls - ALLOWED (no violation) + // 4. %v at end with raw error type - SUGGESTION (handled by suggestion rule) + m.Match( + `log.Debug($format, $*_, $lastArg)`, + `log.Info($format, $*_, $lastArg)`, + `log.Warn($format, $*_, $lastArg)`, + `log.Error($format, $*_, $lastArg)`, + `log.Debug($format, $lastArg)`, + `log.Info($format, $lastArg)`, + `log.Warn($format, $lastArg)`, + `log.Error($format, $lastArg)`, + ). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + !m["lastArg"].Text.Matches(`.*\.Error\(\).*`) && // Allow err.Error() calls + (!m["format"].Text.Matches(endVerbPattern) || + (!m["lastArg"].Type.Is(`error`) && !m["lastArg"].Filter(implementsError))), + ). + Report(internalLogFormatMessage) +} + +//doc:summary STANDARD LOG SECURITY: detects unsafe %v usage in standard logging (depguard-allowed files only) +//doc:before log.Printf("user value: %v", someString) +//doc:after log.Printf("user value: %s", someString) +//doc:tags security standard-log data-leak format-verbs depguard +func stdLogFormatVerbs(m dsl.Matcher) { + // SECURITY POLICY: Standard logging follows same policy as internal logging + // - ALLOWED: %v with err.Error() calls (returns controlled string) + // - SUGGESTED: %v with raw error types (suggest err.Error() for explicitness) + // - FORBIDDEN: %v with non-error types or %v not at end + // - Only applies to files where depguard allows standard log usage + m.Import(`log`) + + // Match standard log calls in depguard-allowed files that violate error handling rules + // Same rules as internal logging: allow err.Error(), suggest for raw errors + m.Match( + `log.Printf($format, $lastArg)`, + `log.Fatalf($format, $lastArg)`, + `log.Panicf($format, $lastArg)`, + `log.Printf($format, $*_, $lastArg)`, + `log.Fatalf($format, $*_, $lastArg)`, + `log.Panicf($format, $*_, $lastArg)`, + ). + Where( + (m.File().PkgPath.Matches(`.*/scripts/.*`) || + m.File().PkgPath.Matches(`.*/tools/.*`) || + m.File().PkgPath.Matches(`.*/internal/log/log\.go$`) || + m.File().PkgPath.Matches(`.*/internal/orchestrion/.*`) || + m.File().PkgPath.Matches(`.*/instrumentation/testutils/sql/sql\.go$`)) && + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + !m["lastArg"].Text.Matches(`.*\.Error\(\).*`) && // Allow err.Error() calls + (!m["format"].Text.Matches(endVerbPattern) || + (!m["lastArg"].Type.Is(`error`) && !m["lastArg"].Filter(implementsError))), + ). + Report(stdLogFormatMessage) +} + +//doc:summary INTERNAL SECURITY: detects usage of variable format strings in internal DD log functions +//doc:before log.Error(msg, err) +//doc:after log.Error("specific error message: %s", err.Error()) +//doc:tags security internal-log compile-time-safety injection +func internalLogVariableFormat(m dsl.Matcher) { + // SECURITY POLICY: Internal logging requires compile-time constant format strings + // Rationale: Variable format strings can lead to format string injection attacks + // and make security auditing difficult + m.Import(internalLogPackage) + + // Match internal log calls with non-constant format strings + // All format strings should be compile-time constants for security and auditing + m.Match( + `log.Debug($format, $*args)`, + `log.Info($format, $*args)`, + `log.Warn($format, $*args)`, + `log.Error($format, $*args)`, + ). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + !m["format"].Const, + ). + Report(internalLogDynamicMessage) +} + +//doc:summary STANDARD LOG SECURITY: detects usage of variable format strings in standard log functions (depguard-allowed files only) +//doc:before log.Printf(msg, err) +//doc:after log.Printf("specific error message: %s", err.Error()) +//doc:tags security standard-log compile-time-safety injection depguard +func stdLogVariableFormat(m dsl.Matcher) { + // SECURITY POLICY: Standard logging requires compile-time constant format strings + // Same rationale as internal logging - prevent format string injection attacks + // Only applies to files where depguard allows standard log usage + m.Import(`log`) + + // Match standard log calls with non-constant format strings in allowed files + // Enforce same security requirements as internal logging + m.Match( + `log.Printf($format, $*args)`, + `log.Fatalf($format, $*args)`, + `log.Panicf($format, $*args)`, + ). + Where( + (m.File().PkgPath.Matches(`.*/scripts/.*`) || + m.File().PkgPath.Matches(`.*/tools/.*`) || + m.File().PkgPath.Matches(`.*/internal/log/log\.go$`) || + m.File().PkgPath.Matches(`.*/internal/orchestrion/.*`) || + m.File().PkgPath.Matches(`.*/instrumentation/testutils/sql/sql\.go$`)) && + !m.File().Name.Matches(`.*_test\.go$`) && + !m["format"].Const, + ). + Report(stdLogDynamicMessage) +} + +//doc:summary AUTO-FIX: suggests err.Error() with %s for error types in internal logging +//doc:before log.Error("operation failed: %s", err.Error()) +//doc:after log.Error("operation failed: %s", err.Error()) +//doc:tags best-practice internal-log error-handling auto-fix +func internalLogSuggestErrorString(m dsl.Matcher) { + m.Import(internalLogPackage) + + // AUTO-FIX: Debug single error patterns (generic alias matching) + m.Match(`$pkg.Debug($format, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Debug($format, $err.Error())`) + + // AUTO-FIX: Info single error patterns (generic alias matching) + m.Match(`$pkg.Info($format, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Info($format, $err.Error())`) + + // AUTO-FIX: Warn single error patterns (generic alias matching) + m.Match(`$pkg.Warn($format, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Warn($format, $err.Error())`) + + // AUTO-FIX: Error single error patterns (generic alias matching) + m.Match(`$pkg.Error($format, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Error($format, $err.Error())`) +} + +// AUTO-FIX: Multi-argument error patterns with %v at end (raw error variables only) +func internalLogSuggestErrorStringMulti(m dsl.Matcher) { + m.Import(internalLogPackage) + + // AUTO-FIX: Two-argument error patterns (format, arg1, err) + m.Match(`$pkg.Debug($format, $arg1, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Debug($format, $arg1, $err.Error())`) + + m.Match(`$pkg.Info($format, $arg1, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Info($format, $arg1, $err.Error())`) + + m.Match(`$pkg.Warn($format, $arg1, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Warn($format, $arg1, $err.Error())`) + + m.Match(`$pkg.Error($format, $arg1, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Error($format, $arg1, $err.Error())`) + + // AUTO-FIX: Three-argument error patterns (format, arg1, arg2, err) + m.Match(`$pkg.Debug($format, $arg1, $arg2, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Debug($format, $arg1, $arg2, $err.Error())`) + + m.Match(`$pkg.Info($format, $arg1, $arg2, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Info($format, $arg1, $arg2, $err.Error())`) + + m.Match(`$pkg.Warn($format, $arg1, $arg2, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Warn($format, $arg1, $arg2, $err.Error())`) + + m.Match(`$pkg.Error($format, $arg1, $arg2, $err)`). + Where( + !m.File().Name.Matches(`.*_test\.go$`) && + m["format"].Text.Matches(formatVerbRegexPattern) && + m["format"].Text.Matches(endVerbPattern) && + (m["err"].Type.Is(`error`) || m["err"].Filter(implementsError)) && + !m["err"].Text.Matches(`.*\.Error\(\)`), + ). + Suggest(`$pkg.Error($format, $arg1, $arg2, $err.Error())`) +} + +// implementsError checks if a type implements the error interface. +// This includes both direct implementations and pointer receivers. +// Used to identify when %v usage is safe in internal/standard logging contexts. +func implementsError(ctx *dsl.VarFilterContext) bool { + iface := ctx.GetInterface(`error`) + return types.Implements(ctx.Type, iface) || types.Implements(types.NewPointer(ctx.Type), iface) +} diff --git a/rules/telemetry_rules.go b/rules/telemetry_rules.go new file mode 100644 index 0000000000..c15eff3eb9 --- /dev/null +++ b/rules/telemetry_rules.go @@ -0,0 +1,157 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +//go:build ruleguard + +// Package gorules contains security-focused telemetry logging rules for dd-trace-go. +// +// TELEMETRY LOGGING SECURITY MODEL: +// +// STRICT POLICY for telemetry logging (internal/telemetry/log): +// - Require constant messages with structured slog.Attr parameters +// - No format strings allowed - use constant messages + slog.Attr key-value pairs +// - Error API requires constant messages with SafeError for error details +// - slog.Any() only allowed with LogValuer implementations +// - Stack traces automatically redacted (customer code replaced with "REDACTED") +// +// RATIONALE: +// Telemetry data is sent to external services and must be carefully controlled +// to prevent PII leakage and ensure security auditing capabilities. +// +// EXAMPLES: +// +// ❌ Forbidden (telemetry): +// +// telemetrylog.Error(err.Error()) // Dynamic error message +// telemetrylog.Error("failed", slog.Any("error", err)) // Raw error exposure +// telemetrylog.Debug(dynamicMessage, attr) // Variable message string +// telemetrylog.Debug("message", slog.Any("data", userData)) // Non-LogValuer with slog.Any() +// +// ✅ Allowed (telemetry): +// +// telemetrylog.Error("operation failed", slog.Any("error", SafeError(err))) // Secure error logging +// telemetrylog.Debug("operation completed", slog.String("id", id)) // Constant message + structured data +// logger := telemetrylog.With(tags); logger.Error("failed", attrs...) // Contextual logger with constants +package gorules + +import ( + "github.com/quasilyte/go-ruleguard/dsl" + "github.com/quasilyte/go-ruleguard/dsl/types" +) + +const ( + telemetryLogPackage = "github.com/DataDog/dd-trace-go/v2/internal/telemetry/log" + telemetryLoggerType = telemetryLogPackage + ".Logger" +) + +//doc:summary TELEMETRY SECURITY: detects unsafe slog.Any() usage in telemetry logging +//doc:before telemetrylog.Debug("message", slog.Any("data", userData)) +//doc:after telemetrylog.Debug("message", slog.String("user_id", userData.ID)) // or implement slog.LogValuer on userData +//doc:tags security telemetry data-leak slog-any reflection logvaluer +func telemetryLogSmartSlogAny(m dsl.Matcher) { + // SECURITY POLICY: Allow slog.Any() only with LogValuer types, forbid with arbitrary types + // Rationale: slog.Any() uses reflection, but LogValuer gives explicit control over logging + // Force explicit types or controlled LogValuer implementations for security + m.Import(telemetryLogPackage) + + // Match telemetry log calls that use slog.Any() with non-LogValuer types + // Allow LogValuer implementations since they control their own representation + m.Match( + `$pkg.Debug($msg, $*_, slog.Any($key, $value), $*_)`, + `$pkg.Warn($msg, $*_, slog.Any($key, $value), $*_)`, + `$pkg.Error($msg, $*_, slog.Any($key, $value), $*_)`, + `$logger.Debug($msg, $*_, slog.Any($key, $value), $*_)`, + `$logger.Warn($msg, $*_, slog.Any($key, $value), $*_)`, + `$logger.Error($msg, $*_, slog.Any($key, $value), $*_)`, + ). + Where(!m["value"].Filter(implementsLogValuer) && + m.File().Imports(telemetryLogPackage)). + Report("Forbidden: (telemetry logging) slog.Any() with non-LogValuer types can expose sensitive data via reflection. Use explicit types like slog.String(), slog.Int(), or implement slog.LogValuer interface for controlled logging.") +} + +//doc:summary TELEMETRY SECURITY: detects usage of variable message strings in telemetry logging +//doc:before telemetrylog.Debug(dynamicMsg, slog.String("key", value)) +//doc:after telemetrylog.Debug("constant message", slog.String("key", value)) +//doc:tags security telemetry compile-time-safety message-constants +func telemetryLogConstantMessage(m dsl.Matcher) { + // SECURITY POLICY: Telemetry logging requires compile-time constant message strings + // Rationale: Variable messages make it impossible to audit what data might be exposed + // and can lead to uncontrolled information disclosure in telemetry data + m.Import(telemetryLogPackage) + + // Match telemetry log calls with non-constant message strings + // All message strings must be compile-time constants for security auditing + // Exclude internal delegation within the telemetry/log package itself + m.Match( + `$pkg.Debug($msg, $*_)`, + `$pkg.Warn($msg, $*_)`, + `$pkg.Error($msg, $*_)`, + `$logger.Debug($msg, $*_)`, + `$logger.Warn($msg, $*_)`, + `$logger.Error($msg, $*_)`, + ). + Where(!m["msg"].Const && + !m.File().PkgPath.Matches(`.*/internal/telemetry/log$`) && + m.File().Imports(telemetryLogPackage)). + Report("Forbidden: (telemetry logging) variable message strings prevent security auditing. Use compile-time constant strings for message parameter: telemetrylog.Debug(\"constant message\", attrs...)") + +} + +//doc:summary TELEMETRY SECURITY: detects slog.String usage with err.Error() calls +//doc:before telemetrylog.Warn("failed", slog.String("error", err.Error())) +//doc:after telemetrylog.Warn("failed", slog.Any("error", SafeError(err))) +//doc:tags security telemetry error-handling safeerror string-conversion +func telemetryLogStringErrorCall(m dsl.Matcher) { + // SECURITY POLICY: Using slog.String with err.Error() exposes raw error messages + // Rationale: err.Error() can contain sensitive information in error messages + // SafeError with slog.Any provides secure error logging with redaction + m.Import(telemetryLogPackage) + + // Match telemetry log calls that use slog.String with err.Error() + m.Match( + `$pkg.Debug($msg, $*_, slog.String($key, $value.Error()), $*_)`, + `$pkg.Warn($msg, $*_, slog.String($key, $value.Error()), $*_)`, + `$pkg.Error($msg, $*_, slog.String($key, $value.Error()), $*_)`, + `$logger.Debug($msg, $*_, slog.String($key, $value.Error()), $*_)`, + `$logger.Warn($msg, $*_, slog.String($key, $value.Error()), $*_)`, + `$logger.Error($msg, $*_, slog.String($key, $value.Error()), $*_)`, + ). + Where(m["value"].Type.Is("error") && + m.File().Imports(telemetryLogPackage)). + Report("Forbidden: (telemetry logging) slog.String with err.Error() exposes raw error messages. Use SafeError wrapper: slog.Any(\"error\", SafeError(err))") +} + +//doc:summary TELEMETRY SECURITY: detects direct error usage without SafeError wrapper +//doc:before telemetrylog.Error("failed", slog.Any("error", rawError)) +//doc:after telemetrylog.Error("failed", slog.Any("error", SafeError(rawError))) +//doc:tags security telemetry error-handling safeerror logvaluer +func telemetryLogRawErrorUsage(m dsl.Matcher) { + // SECURITY POLICY: Raw errors must use SafeError wrapper to prevent PII leakage + // Rationale: Raw errors can contain sensitive information in error messages + // SafeError provides secure error logging with stack trace redaction + m.Import(telemetryLogPackage) + + // Match telemetry log calls that use raw errors with slog.Any() without SafeError wrapper + m.Match( + `$pkg.Debug($msg, $*_, slog.Any($key, $value), $*_)`, + `$pkg.Warn($msg, $*_, slog.Any($key, $value), $*_)`, + `$pkg.Error($msg, $*_, slog.Any($key, $value), $*_)`, + `$logger.Debug($msg, $*_, slog.Any($key, $value), $*_)`, + `$logger.Warn($msg, $*_, slog.Any($key, $value), $*_)`, + `$logger.Error($msg, $*_, slog.Any($key, $value), $*_)`, + ). + Where(m["value"].Type.Is("error") && + !m["value"].Text.Matches(`.*SafeError\(.*\)`) && + m.File().Imports(telemetryLogPackage)). + Report("Forbidden: (telemetry logging) raw error values can expose sensitive data. Use SafeError wrapper: slog.Any(\"error\", SafeError(err))") +} + +// implementsLogValuer checks if a type implements the slog.LogValuer interface. +// This includes both direct implementations and pointer receivers. +// Used to identify when slog.Any() usage is safe in telemetry logging contexts. +func implementsLogValuer(ctx *dsl.VarFilterContext) bool { + iface := ctx.GetInterface(`log/slog.LogValuer`) + return types.Implements(ctx.Type, iface) || types.Implements(types.NewPointer(ctx.Type), iface) +} diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000000..54d17421c2 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,120 @@ +# Development Scripts + +This directory contains scripts and small Go tool programs used for development, testing, and maintenance of the dd-trace-go project. + +## Script Types + +### Shell Scripts + +- Bash scripts for common development tasks +- Can be run directly or via Makefile targets +- Automatically use development tools from `bin/` directory + +### Go Programs + +- Small utility programs for specific development tasks +- Should have appropriate build tags to avoid being built by `go build`: + - `//go:build ignore` and `// +build ignore` + - `//go:build tools` and `// +build tools` + - `//go:build scripts` and `// +build scripts` +- Development modules should **not** be included in the `go.work` file + +## Usage + +### Via Makefile (Recommended) + +The Makefile provides convenient targets that automatically handle tool dependencies: + +[embedmd]:# (../tmp/make-help.txt) +```txt +Usage: make [target] + +Targets: + help Show this help message + all Run complete build pipeline (tools, generate, lint, test) + tools-install Install development tools + clean Clean build artifacts + clean-all Clean everything including tools and temporary files + generate Run code generation + lint Run linting checks + lint/go Run Go linting checks + lint/go/fix Fix linting issues automatically + lint/shell Run shell script linting checks + format Format code + format/shell install shfmt + test Run all tests (core, integration, contrib) + test/appsec Run tests with AppSec enabled + test/contrib Run contrib package tests + test/integration Run integration tests + fix-modules Fix module dependencies and consistency + docs Generate and Update embedded documentation in README files + upgrade/orchestrion Upgrade Orchestrion and fix modules +``` + +### Direct Execution + +Scripts can be run directly, but ensure development tools are available: + +```bash +# Install tools first +make tools-install + +# Run script with correct PATH +PATH="$(pwd)/bin:$PATH" ./scripts/script-name.sh + +# Or run directly if script doesn't need tools +./scripts/script-name.sh +``` + +#### Test Script Options + +The test script provides many options for different testing scenarios: + +[embedmd]:# (../tmp/test-help.txt) +```txt +test.sh - Run the tests for dd-trace-go + this script requires gotestsum, goimports, docker and docker-compose. + -a | --appsec - Test with appsec enabled + -i | --integration - Run integration tests. This requires docker and docker-compose. Resource usage is significant when combined with --contrib + -c | --contrib - Run contrib tests + --all - Synonym for -l -a -i -c + -s | --sleep - The amount of seconds to wait for docker containers to be ready - default: 30 seconds + -t | --tools - Install gotestsum and goimports + -h | --help - Print this help message +``` + +### Go Programs + +Build and run Go programs in the scripts directory: + +```bash +# Build and run a Go script +go run -tags scripts ./scripts/program-name.go + +# Or if it has ignore tags +go run ./scripts/program-name.go +``` + +## Adding New Scripts + +### Shell Scripts + +1. Create the script in the `scripts/` directory +2. Make it executable: `chmod +x scripts/script-name.sh` +3. Add a Makefile target if it's commonly used (follow the pattern of existing targets) +4. Use `$(BIN_PATH)` in Makefile targets to access development tools from `bin/` + +### Go Programs + +1. Create the Go file in appropriate subdirectory +2. Add proper build tags to prevent inclusion in main builds +3. If it needs dependencies, create a separate `go.mod` file +4. Don't add the module to `go.work` + +## Guidelines + +- Scripts should be idempotent when possible +- Include error handling and clear output messages +- Document any external dependencies (Docker, etc.) +- Use development tools from `bin/` directory when available +- Keep scripts focused on single responsibilities diff --git a/scripts/apiextractor/.gitignore b/scripts/apiextractor/.gitignore new file mode 100644 index 0000000000..3f30d6d6cd --- /dev/null +++ b/scripts/apiextractor/.gitignore @@ -0,0 +1,13 @@ +# Built binary +api_extractor +apiextractor +api_extractor.test +apiextractor.test + +# IDE files +.idea/ +.vscode/ + +# Test artifacts +*.out +*.prof diff --git a/scripts/apiextractor/Makefile b/scripts/apiextractor/Makefile new file mode 100644 index 0000000000..4cdb24e85a --- /dev/null +++ b/scripts/apiextractor/Makefile @@ -0,0 +1,61 @@ +.PHONY: fmt +fmt: + GOWORK=off golangci-lint fmt --no-config --enable gofumpt ./... + +.PHONY: vet +vet: + GOWORK=off go vet ./... + +.PHONY: fix +fix: build + GOWORK=off golangci-lint run --fix --default=standard --no-config ./... + +.PHONY: lint +lint: + GOWORK=off golangci-lint run --default=standard --no-config ./... + +.PHONY: test +test: deps + GOWORK=off go test -v ./... + +.PHONY: test-update +test-update: deps + GOWORK=off go test -v ./... -update + +.PHONY: deps +deps: + go mod tidy + +.PHONY: build +build: deps + go build -o api_extractor ./api_extractor.go + +.PHONY: clean +clean: + rm -f api_extractor + +.PHONY: run +run: build + ./api_extractor ddtrace/tracer + +.PHONY: run-testdata +run-testdata: build + ./api_extractor _testdata/dummy + +.PHONY: help +help: + @echo "Available targets:" + @echo " fmt - Format code with gofumpt" + @echo " vet - Run go vet" + @echo " fix - Run golangci-lint with auto-fix" + @echo " lint - Run golangci-lint" + @echo " test - Run tests" + @echo " test-update - Run tests and update golden files" + @echo " deps - Tidy dependencies" + @echo " build - Build the api_extractor binary" + @echo " clean - Remove built binary" + @echo " run - Run extractor on ddtrace/tracer package" + @echo " run-testdata - Run extractor on test data" + @echo " help - Show this help message" + +.DEFAULT_GOAL := help diff --git a/scripts/apiextractor/README.md b/scripts/apiextractor/README.md new file mode 100644 index 0000000000..c4347ad603 --- /dev/null +++ b/scripts/apiextractor/README.md @@ -0,0 +1,47 @@ +# API Extractor + +This command-line tool extracts the public API of a Go package by parsing its Go source files and reporting all exported functions, types, and methods. + +## Usage + +```bash +go run api_extractor.go [flags] +``` + +Flags: + +- `-gomod path/to/go.mod`: optional path to a `go.mod` file to determine the module path. If omitted, the tool searches parent directories from the given module path. + +The tool writes the API report to standard output. The report contains: + +- `// API Stability Report` header. +- `// Package: /` indicating the target package. +- `// Module: ` indicating the module root. + +For each Go source file that defines exported API elements, the report lists: + +```text +// File: + +// Package Functions +func ExportedFunc(...) + +// Types +type ExportedType struct { ... } + +// methods (for struct types) +func (Receiver) MethodName(...) + +// interface types +type ExportedInterface interface { + MethodName(...) +} +``` + +## Example + +Generate an API report for the `ddtrace/tracer` package and save it: + +```bash +go run api_extractor.go ./ddtrace/tracer > ./ddtrace/tracer/api.txt +``` diff --git a/scripts/apiextractor/_testdata/dummy/dummy.go b/scripts/apiextractor/_testdata/dummy/dummy.go new file mode 100644 index 0000000000..5142652370 --- /dev/null +++ b/scripts/apiextractor/_testdata/dummy/dummy.go @@ -0,0 +1,69 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package dummy + +// DummyFunc is a dummy exported function +func DummyFunc() { + u := DummyStruct{ + unexportedField: 0, + } + u.unexportedMethod() +} + +// DummyStruct is a dummy exported struct +type DummyStruct struct { + // ExportedField is an exported field + ExportedField string + unexportedField int +} + +// ExportedMethod is an exported method +func (d DummyStruct) ExportedMethod() {} + +// unexportedMethod is an unexported method +func (d DummyStruct) unexportedMethod() {} + +// AnotherExportedMethod is another exported method +func (d *DummyStruct) AnotherExportedMethod() {} + +// DummyInterface is a dummy exported interface +type DummyInterface interface { + // ExportedMethod is an exported method + ExportedMethod() +} + +// DummyFuncWithParams is a dummy exported function with parameters +func DummyFuncWithParams(_ int, _ string) { + dummyUnexportedFunc() +} + +// ArrayTestType is a type containing array fields for testing array type formatting +type ArrayTestType struct { + FixedArray [16]byte + MultiDimArray [2][3]int +} + +// EmptyStruct is an empty struct with methods (like NoopTracer) +type EmptyStruct struct{} + +// DoSomething is a method on EmptyStruct +func (EmptyStruct) DoSomething() string { + return "something" +} + +// DoSomethingElse is another method on EmptyStruct with pointer receiver +func (*EmptyStruct) DoSomethingElse() int { + return 42 +} + +// MyString is a type alias for string +type MyString string + +// MyInt is a type alias for int +type MyInt int + +// dummyUnexportedFunc is an unexported function +func dummyUnexportedFunc() {} diff --git a/scripts/apiextractor/_testdata/dummy/package1/package1.go b/scripts/apiextractor/_testdata/dummy/package1/package1.go new file mode 100644 index 0000000000..098d5e96e2 --- /dev/null +++ b/scripts/apiextractor/_testdata/dummy/package1/package1.go @@ -0,0 +1,34 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package package1 + +// PublicFunc is a public function in package1. +func PublicFunc() { + privateFunc() + _ = PublicType{ + privateField: "private", + } + _ = privateType{ + PublicField: "public", + } +} + +// privateFunc is a private function in package1. +func privateFunc() {} + +// PublicType is a public type in package1. +type PublicType struct { + // PublicField is a public field in PublicType. + PublicField string + // privateField is a private field in PublicType. + privateField string +} + +// privateType is a private type in package1. +type privateType struct { + // PublicField is a public field in privateType. + PublicField string +} diff --git a/scripts/apiextractor/_testdata/dummy/package2/package2.go b/scripts/apiextractor/_testdata/dummy/package2/package2.go new file mode 100644 index 0000000000..29a8842064 --- /dev/null +++ b/scripts/apiextractor/_testdata/dummy/package2/package2.go @@ -0,0 +1,34 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package package2 + +// PublicFunc2 is a public function in package2. +func PublicFunc2() { + privateFunc2() + _ = PublicType2{ + privateField2: "private", + } + _ = privateType2{ + PublicField2: "public", + } +} + +// privateFunc2 is a private function in package2. +func privateFunc2() {} + +// PublicType2 is a public type in package2. +type PublicType2 struct { + // PublicField2 is a public field in PublicType2. + PublicField2 string + // privateField2 is a private field in PublicType2. + privateField2 string +} + +// privateType2 is a private type in package2. +type privateType2 struct { + // PublicField2 is a public field in privateType2. + PublicField2 string +} diff --git a/scripts/apiextractor/_testdata/expected_output.txt b/scripts/apiextractor/_testdata/expected_output.txt new file mode 100644 index 0000000000..a4209f64a2 --- /dev/null +++ b/scripts/apiextractor/_testdata/expected_output.txt @@ -0,0 +1,56 @@ +// API Stability Report +// Package: github.com/DataDog/dd-trace-go/v2/scripts/apiextractor/_testdata/dummy +// Module: github.com/DataDog/dd-trace-go/v2/scripts/apiextractor + +// File: dummy.go + +// Package Functions +func DummyFunc() +func DummyFuncWithParams(int, string) + +// Types +type ArrayTestType struct { + FixedArray [16]byte + MultiDimArray [2][3]int +} + +type DummyInterface interface { + func ExportedMethod() +} + +type DummyStruct struct { + ExportedField string +} + +func (*DummyStruct) AnotherExportedMethod() +func (DummyStruct) ExportedMethod() + +type EmptyStruct struct {} + +func (EmptyStruct) DoSomething() (string) +func (*EmptyStruct) DoSomethingElse() (int) + +type MyInt int + +type MyString string + +// File: package1/package1.go + +// Package Functions +func PublicFunc() + +// Types +type PublicType struct { + PublicField string +} + +// File: package2/package2.go + +// Package Functions +func PublicFunc2() + +// Types +type PublicType2 struct { + PublicField2 string +} + diff --git a/scripts/apiextractor/api_extractor.go b/scripts/apiextractor/api_extractor.go new file mode 100644 index 0000000000..4d174580cb --- /dev/null +++ b/scripts/apiextractor/api_extractor.go @@ -0,0 +1,536 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "flag" + "fmt" + "go/ast" + "go/parser" + "go/token" + "os" + "path/filepath" + "slices" + "sort" + "strings" +) + +type funcSpec struct { + name string + receiver string + params string + returns string +} + +func (f funcSpec) String() string { + var b strings.Builder + + b.WriteString("func ") + + if f.receiver != "" { + b.WriteString("(") + b.WriteString(f.receiver) + b.WriteString(") ") + } + + b.WriteString(f.name) + b.WriteString(f.params) + + if f.returns != "" { + b.WriteString(" ") + b.WriteString(f.returns) + } + + return b.String() +} + +// extractFromNode inspects the AST of a file and returns its exported functions and types (with methods). +func extractFromNode(node *ast.File) ([]funcSpec, []*typeSpec) { + var funcs []funcSpec + // First, collect exported type declarations + typesMap := make(map[string]*typeSpec) + + for _, decl := range node.Decls { + gen, ok := decl.(*ast.GenDecl) + if !ok || gen.Tok != token.TYPE { + continue + } + + for _, spec := range gen.Specs { + typSpec := spec.(*ast.TypeSpec) + if !typSpec.Name.IsExported() { + continue + } + + ts := &typeSpec{name: typSpec.Name.Name} + switch typ := typSpec.Type.(type) { + case *ast.StructType: + ts.kind = kindStruct + ts.fields = extractFromStructType(typ) + sort.Slice(ts.fields, func(i, j int) bool { + return ts.fields[i].name < ts.fields[j].name + }) + case *ast.InterfaceType: + ts.kind = kindInterface + ts.methods = extractFromInterfaceType(typ) + sort.Slice(ts.methods, func(i, j int) bool { + return ts.methods[i].name < ts.methods[j].name + }) + default: + ts.kind = kindAlias + ts.underlying = formatExpr(typ) + } + + typesMap[ts.name] = ts + } + } + // Next, collect exported functions and associate methods with types + for _, decl := range node.Decls { + fn, ok := decl.(*ast.FuncDecl) + if !ok || !fn.Name.IsExported() { + continue + } + + f := funcSpec{ + name: fn.Name.Name, + params: formatFieldList(fn.Type.Params), + } + if fn.Type.Results != nil { + f.returns = formatFieldList(fn.Type.Results) + } + + if fn.Recv == nil { + funcs = append(funcs, f) + + continue + } + + f.receiver = formatReceiver(fn.Recv.List[0].Type) + typeName := getTypeName(fn.Recv.List[0].Type) + + if ts, ok := typesMap[typeName]; ok { + ts.methods = append(ts.methods, f) + } + } + // Sort functions by name + sort.Slice(funcs, func(i, j int) bool { + return funcs[i].name < funcs[j].name + }) + // Collect and sort types and their methods + var foundTypes []*typeSpec + + for _, ts := range typesMap { + sort.Slice(ts.methods, func(i, j int) bool { + return ts.methods[i].name < ts.methods[j].name + }) + + foundTypes = append(foundTypes, ts) + } + + sort.Slice(foundTypes, func(i, j int) bool { + return foundTypes[i].name < foundTypes[j].name + }) + + return funcs, foundTypes +} + +func getTypeName(expr ast.Expr) string { + switch t := expr.(type) { + case *ast.Ident: + return t.Name + case *ast.StarExpr: + switch ident := t.X.(type) { + case *ast.Ident: + return ident.Name + case *ast.IndexListExpr: + // skip. + } + } + + return "" +} + +// typeKind represents the kind of type declaration. +type typeKind int + +const ( + kindStruct typeKind = iota + kindInterface + kindAlias +) + +type typeSpec struct { + name string + underlying string // For type definitions. + fields []fieldSpec + methods []funcSpec + kind typeKind +} + +func (t typeSpec) String() string { + var b strings.Builder + + b.WriteString("type ") + b.WriteString(t.name) + + switch t.kind { + case kindAlias: + b.WriteString(" ") + b.WriteString(t.underlying) + + return b.String() + case kindStruct: + if len(t.fields) > 0 { + b.WriteString(" struct {\n") + + for _, f := range t.fields { + b.WriteString("\t") + b.WriteString(f.String()) + b.WriteString("\n") + } + + b.WriteString("}") + } else { + b.WriteString(" struct {}") + } + case kindInterface: + b.WriteString(" interface {\n") + + for _, m := range t.methods { + b.WriteString("\t") + b.WriteString(m.String()) + b.WriteString("\n") + } + + b.WriteString("}") + } + + return b.String() +} + +type fieldSpec struct { + name string + typ string +} + +func (f fieldSpec) String() string { + return fmt.Sprintf("%s %s", f.name, f.typ) +} + +func extractFromStructType(structType *ast.StructType) []fieldSpec { + var fields []fieldSpec + + for _, field := range structType.Fields.List { + for _, name := range field.Names { + if !name.IsExported() { + continue + } + + fields = append(fields, fieldSpec{ + name: name.Name, + typ: formatExpr(field.Type), + }) + } + } + + return fields +} + +func extractFromInterfaceType(interfaceType *ast.InterfaceType) []funcSpec { + var methods []funcSpec + + for _, method := range interfaceType.Methods.List { + if len(method.Names) == 0 { + continue + } + + for _, name := range method.Names { + if !name.IsExported() { + continue + } + + f := funcSpec{ + name: name.Name, + } + if t, ok := method.Type.(*ast.FuncType); ok { + f.params = formatFieldList(t.Params) + if t.Results != nil { + f.returns = formatFieldList(t.Results) + } + } + + methods = append(methods, f) + } + } + + return methods +} + +const pathSeparator = string(filepath.Separator) + +// extractModulePath reads a go.mod file and returns its module path. +func extractModulePath(modFile string) (string, error) { + modBytes, err := os.ReadFile(modFile) + if err != nil { + return "", fmt.Errorf("failed to read go.mod at %s: %w", modFile, err) + } + + modLines := strings.Split(string(modBytes), "\n") + for _, line := range modLines { + if strings.HasPrefix(line, "module ") { + return strings.TrimSpace(strings.TrimPrefix(line, "module ")), nil + } + } + + return "", fmt.Errorf("no module declaration found in %s", modFile) +} + +// findGoMod starts from the given directory and walks up until it finds a go.mod file. +func findGoMod(startDir string) (string, string, error) { + dir := startDir + + for { + modPath := filepath.Join(dir, "go.mod") + if _, err := os.Stat(modPath); err == nil { + // Found go.mod, extract module path + modulePath, err := extractModulePath(modPath) + if err != nil { + return "", "", err + } + + return modulePath, dir, nil + } + + // Go up one directory + parent := filepath.Dir(dir) + if parent == dir { + // Reached root without finding go.mod + return "", "", fmt.Errorf("no go.mod found in %s or any parent directory", startDir) + } + + dir = parent + } +} + +func main() { + var goModPath string + + flag.StringVar(&goModPath, "gomod", "", "Path to go.mod file (optional, will search in parent directories if not specified)") + flag.Parse() + + args := flag.Args() + if len(args) < 1 { + fmt.Println("Usage: api_extractor [-gomod path/to/go.mod] ") + os.Exit(1) + } + + dir := args[0] + if err := run(dir, goModPath); err != nil { + fmt.Printf("Error extracting public API: %s\n", err.Error()) + os.Exit(1) + } +} + +// formatMethodSignature formats a method with its receiver, name, params, and returns. +func formatMethodSignature(m funcSpec) string { + var returnPart string + if m.returns != "" { + returnPart = " " + m.returns + } + + return fmt.Sprintf("func (%s) %s%s%s", + m.receiver, + m.name, + m.params, + returnPart) +} + +// collectTypeMethods collects and formats methods for a type. +func collectTypeMethods(t *typeSpec) []string { + if t.underlying != "" { // Skip for type aliases/definitions + return nil + } + + var methods []string + for _, m := range t.methods { + if m.receiver != "" { + methods = append(methods, formatMethodSignature(m)) + } + } + + return methods +} + +func run(dir string, goModPath string) error { + var allOutput []string + + fset := token.NewFileSet() + + // Find the module information + var modulePath string + + var err error + if goModPath != "" { + // Use specified go.mod file + modulePath, err = extractModulePath(goModPath) + if err != nil { + return fmt.Errorf("failed to find module information: %w", err) + } + } else { + // Find go.mod by walking up directories + modulePath, _, err = findGoMod(dir) + if err != nil { + return fmt.Errorf("failed to find module information: %w", err) + } + } + + // Add header once at the beginning. + allOutput = append(allOutput, "// API Stability Report") + allOutput = append(allOutput, "// Package: "+filepath.Join(modulePath, dir)) + allOutput = append(allOutput, "// Module: "+modulePath) + allOutput = append(allOutput, "") + + err = filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if !strings.HasSuffix(path, ".go") || strings.HasSuffix(path, "_test.go") { + return nil + } + + components := strings.Split(path, pathSeparator) + if slices.Contains(components, "internal") { + return nil + } + + node, err := parser.ParseFile(fset, path, nil, parser.ParseComments) + if err != nil { + return err + } + + funcs, types := extractFromNode(node) + + // Only process files with exported API. + if len(funcs) == 0 && len(types) == 0 { + return nil + } + + // Add file header comment. + filePath, err := filepath.Rel(dir, path) + if err != nil { + filePath = path + } + + allOutput = append(allOutput, "// File: "+filePath) + allOutput = append(allOutput, "") + + // Add functions + if len(funcs) > 0 { + allOutput = append(allOutput, "// Package Functions") + for _, f := range funcs { + allOutput = append(allOutput, f.String()) + } + + allOutput = append(allOutput, "") + } + + // Add types and their methods + if len(types) > 0 { + allOutput = append(allOutput, "// Types") + for _, t := range types { + allOutput = append(allOutput, t.String()) + allOutput = append(allOutput, "") + + // Add methods after their type + if methods := collectTypeMethods(t); len(methods) > 0 { + allOutput = append(allOutput, methods...) + allOutput = append(allOutput, "") + } + } + } + + return nil + }) + if err != nil { + return err + } + + for _, line := range allOutput { + fmt.Println(line) + } + + return nil +} + +func formatFieldList(fields *ast.FieldList) string { + if fields == nil { + return "()" + } + + var params []string + + for _, field := range fields.List { + typ := formatExpr(field.Type) + if len(field.Names) == 0 { + params = append(params, typ) + } else { + // Omit parameter names, only include the type + params = append(params, typ) + } + } + + return fmt.Sprintf("(%s)", strings.Join(params, ", ")) +} + +func formatReceiver(expr ast.Expr) string { + switch t := expr.(type) { + case *ast.StarExpr: + return "*" + getTypeName(t.X) + default: + return getTypeName(expr) + } +} + +func formatExpr(expr ast.Expr) string { + switch t := expr.(type) { + case *ast.BasicLit: + return t.Value + case *ast.Ident: + return t.Name + case *ast.StarExpr: + return "*" + formatExpr(t.X) + case *ast.SelectorExpr: + return formatExpr(t.X) + "." + t.Sel.Name + case *ast.ArrayType: + if t.Len == nil { + return "[]" + formatExpr(t.Elt) + } + + return fmt.Sprintf("[%s]%s", formatExpr(t.Len), formatExpr(t.Elt)) + case *ast.InterfaceType: + return "interface{}" + case *ast.MapType: + return fmt.Sprintf("map[%s]%s", formatExpr(t.Key), formatExpr(t.Value)) + case *ast.ChanType: + switch t.Dir { + case ast.SEND: + return "chan<- " + formatExpr(t.Value) + case ast.RECV: + return "<-chan " + formatExpr(t.Value) + default: + return "chan " + formatExpr(t.Value) + } + case *ast.FuncType: + return fmt.Sprintf("func%s%s", + formatFieldList(t.Params), + formatFieldList(t.Results)) + case *ast.Ellipsis: + return "..." + formatExpr(t.Elt) + default: + return fmt.Sprintf("%#v", expr) + } +} diff --git a/scripts/apiextractor/api_extractor_test.go b/scripts/apiextractor/api_extractor_test.go new file mode 100644 index 0000000000..7c9bfc2cfa --- /dev/null +++ b/scripts/apiextractor/api_extractor_test.go @@ -0,0 +1,61 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "bytes" + "flag" + "io" + "os" + "path/filepath" + "testing" +) + +var update = flag.Bool("update", false, "update golden files") + +func TestExtractPublicAPI(t *testing.T) { + testdataDir := filepath.Join("_testdata", "dummy") + expectedOutputFile := filepath.Join("_testdata", "expected_output.txt") + + var buf bytes.Buffer + + old := os.Stdout + r, w, _ := os.Pipe() + os.Stdout = w + + if err := run(testdataDir, ""); err != nil { + t.Fatalf("failed to run api_extractor: %v", err) + } + + os.Stdout = old + + if err := w.Close(); err != nil { + t.Fatalf("failed to close pipe: %v", err) + } + + if _, err := io.Copy(&buf, r); err != nil { + t.Fatalf("failed to copy output: %v", err) + } + + // Update golden files if requested + if *update { + if err := os.WriteFile(expectedOutputFile, buf.Bytes(), 0o644); err != nil { + t.Fatalf("failed to update golden file: %v", err) + } + + return + } + + // Normal test comparison + expectedOutput, err := os.ReadFile(expectedOutputFile) + if err != nil { + t.Fatalf("failed to read expected output file: %v", err) + } + + if buf.String() != string(expectedOutput) { + t.Errorf("output does not match expected output\nGot:\n%s\nExpected:\n%s", buf.String(), string(expectedOutput)) + } +} diff --git a/scripts/apiextractor/go.mod b/scripts/apiextractor/go.mod new file mode 100644 index 0000000000..b08add56ab --- /dev/null +++ b/scripts/apiextractor/go.mod @@ -0,0 +1,3 @@ +module github.com/DataDog/dd-trace-go/v2/scripts/apiextractor + +go 1.24.0 diff --git a/scripts/apiextractor/go.sum b/scripts/apiextractor/go.sum new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/autoreleasetagger/.gitignore b/scripts/autoreleasetagger/.gitignore new file mode 100644 index 0000000000..354237506e --- /dev/null +++ b/scripts/autoreleasetagger/.gitignore @@ -0,0 +1,3 @@ +tmp +autoreleasetagger +main diff --git a/scripts/autoreleasetagger/Makefile b/scripts/autoreleasetagger/Makefile new file mode 100644 index 0000000000..d2cb6c839b --- /dev/null +++ b/scripts/autoreleasetagger/Makefile @@ -0,0 +1,33 @@ +.PHONY: fmt +fmt: + go run mvdan.cc/gofumpt@latest -l -w . + +.PHONY: vet +vet: + GOWORK=off go vet ./... + +.PHONY: fix +fix: build + GOWORK=off golangci-lint run --fix --enable-all --no-config ./... + +.PHONY: lint +lint: + GOWORK=off golangci-lint run --enable-all --no-config ./... + +.PHONY: test +test: deps + GOWORK=off go test -v ./... + +deps: + go mod tidy + +.PHONY: build +build: deps + go build -o autoreleasetagger ./main.go + +tmp/help.txt: build + ./autoreleasetagger -h > tmp/help.txt 2>&1 + +.PHONY: README.md +README.md: tmp/help.txt + go run github.com/campoy/embedmd@latest -w README.md diff --git a/scripts/autoreleasetagger/README.md b/scripts/autoreleasetagger/README.md new file mode 100644 index 0000000000..1f04d7cff2 --- /dev/null +++ b/scripts/autoreleasetagger/README.md @@ -0,0 +1,93 @@ +# Auto Release Tagger + +This tool ensures that all modules in dd-trace-go are tagged correctly for release, respecting dependency order by tagging dependencies first before their dependents. + +The repository has a structure consisting of nested modules for all the contribs and some packages to reduce the dependency surface to the strictly required dependencies. + +- **Automatic Versioning**: Determines the next version based on existing tags. +- **Nested Module Support**: Tags all modules in a repository. +- **Dependency Awareness**: Ensures dependencies are tagged before their dependents. + +## 📌 Prerequisites + +Before running the tool, ensure you have updated the version according to the [Release Checklist](https://datadoghq.atlassian.net/wiki/spaces/DL/pages/2477949158/Template+v+MAJOR+.+MINOR+.+PATCH+Release+Checklist#Release-branch). + +## 🛠️ Usage + +Run the following command to tag the release: + +```sh +go run ./scripts/autoreleasetagger -root ../.. +``` + +Dry run: Simulate the tagging process to check for potential issues. + +```sh +go run ./scripts/autoreleasetagger -dry-run -root ../.. +``` + +Run without pushing tags: Tag all the modules to release but don't push them. + +```sh +go run ./scripts/autoreleasetagger -disable-push -root ../.. +``` + +## 📖 Help + +[embedmd]:# (tmp/help.txt) +```txt +Usage of ./autoreleasetagger: + -disable-push + Disable pushing tags to remote + -dry-run + Enable dry run mode (skip actual operations) + -exclude-dirs string + Comma-separated list of directories to exclude. Paths are relative to the root directory + -exclude-modules string + Comma-separated list of modules to exclude + -loglevel string + Log level (debug, info, warn, error) (default "info") + -remote string + Git remote name (default "origin") + -root string + Path to the root directory (required) +``` + + +## 🚀 Development + +### Helpful Commands for Cleaning Up + +```sh +export GIT_REMOTE=${GIT_REMOTE:-origin} + +# List local-only tags +git tag -l | grep -v "$(git ls-remote --tags $GIT_REMOTE | sed 's/.*refs\/tags\///g')" + +# Remove local-only tags +git tag -l | grep -v "$(git ls-remote --tags $GIT_REMOTE | sed 's/.*refs\/tags\///g')" | xargs git tag -d +``` + +#### Git Alias Setup + +```sh +export GIT_REMOTE=${GIT_REMOTE:-origin} + +# List tags that exist only locally +git config --global alias.list-local-tags "!git tag -l | grep -v \"$(git ls-remote --tags $GIT_REMOTE | sed 's/.*refs\/tags\///g')\"" + +# Remove tags that exist only locally +git config --global alias.remove-local-tags "!git tag -l | grep -v \"$(git ls-remote --tags $GIT_REMOTE | sed 's/.*refs\/tags\///g')\" | xargs git tag -d" +``` + +**Usage** + +```sh +export GIT_REMOTE=${GIT_REMOTE:-origin} + +# List local-only tags +git list-local-tags + +# Remove local-only tags +git remove-local-tags +``` diff --git a/scripts/autoreleasetagger/go.mod b/scripts/autoreleasetagger/go.mod new file mode 100644 index 0000000000..92eab40321 --- /dev/null +++ b/scripts/autoreleasetagger/go.mod @@ -0,0 +1,9 @@ +module github.com/DataDog/dd-trace-go/v2/scripts/autoreleasetagger + +go 1.24.0 + +require github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + +require github.com/Masterminds/semver/v3 v3.3.1 // indirect + +replace github.com/DataDog/dd-trace-go/v2 => ../.. diff --git a/scripts/autoreleasetagger/go.sum b/scripts/autoreleasetagger/go.sum new file mode 100644 index 0000000000..1232e91145 --- /dev/null +++ b/scripts/autoreleasetagger/go.sum @@ -0,0 +1,10 @@ +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/scripts/autoreleasetagger/main.go b/scripts/autoreleasetagger/main.go new file mode 100644 index 0000000000..65ba5a8e36 --- /dev/null +++ b/scripts/autoreleasetagger/main.go @@ -0,0 +1,578 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package main provides the autoreleasetagger command, +// which automates tagging and versioning of Go modules. +package main + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "log/slog" + "os" + "os/exec" + "path/filepath" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/DataDog/dd-trace-go/v2/internal/version" +) + +var ( + defaultExcludedModules = []string{ + "github.com/DataDog/dd-trace-go/instrumentation/internal/namingschematest/v2", + } + defaultExcludedDirs = []string{ + "_tools", + ".github", + "tools", + } +) + +type ( + Module struct { + Path string + Version string + } + + GoMod struct { + // dir is the directory where the module lives + dir string + + Module ModPath + Go string + Toolchain string + Require []Require + Exclude []Module + Replace []Replace + Retract []Retract + } + + ModPath struct { + Path string + Deprecated string + } + + Require struct { + Path string + Version string + Indirect bool + } + + Replace struct { + Old Module + New Module + } + + Retract struct { + Low string + High string + Rationale string + } +) + +func slogLevel(logLevel string) slog.Level { + var lvl slog.Level + + switch logLevel { + case "debug": + lvl = slog.LevelDebug + case "warn": + lvl = slog.LevelWarn + case "error": + lvl = slog.LevelError + default: + lvl = slog.LevelInfo + } + + return lvl +} + +func initLogger(logLevel string, dryRun bool) *slog.Logger { + logLevelVar := slog.LevelVar{} + if dryRun { + logLevelVar.Set(slog.LevelDebug) + } else { + logLevelVar.Set(slogLevel(logLevel)) + } + + logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: &logLevelVar})) + slog.SetDefault(logger) + + return logger +} + +func main() { + var ( + root string + logLevel string + dryRun bool + excludeModulesInput string + excludeDirsInput string + remote string + disablePush bool + ) + + flag.StringVar(&root, "root", "", "Path to the root directory (required)") + flag.StringVar(&logLevel, "loglevel", "info", "Log level (debug, info, warn, error)") + flag.BoolVar(&dryRun, "dry-run", false, "Enable dry run mode (skip actual operations)") + flag.StringVar(&excludeModulesInput, "exclude-modules", "", "Comma-separated list of modules to exclude") + flag.StringVar(&excludeDirsInput, "exclude-dirs", "", "Comma-separated list of directories to exclude. Paths are relative to the root directory") + flag.StringVar(&remote, "remote", "origin", "Git remote name") + flag.BoolVar(&disablePush, "disable-push", false, "Disable pushing tags to remote") + flag.Parse() + + if root == "" { + fmt.Fprintln(os.Stderr, "ERROR: --root is required") + os.Exit(1) + } + + _ = initLogger(logLevel, dryRun) + + slog.Info("Starting autoreleasetagger") + if dryRun { + slog.Debug("Running in dry-run mode, skipping actual operations") + } + + root, err := filepath.Abs(root) + if err != nil { + slog.Error("Failed to convert root path to absolute", "error", err) + os.Exit(1) + } + slog.Info("Using root directory", "root", root) + + excludedModules := append([]string{}, defaultExcludedModules...) + if excludeModulesInput != "" { + modules := strings.Split(excludeModulesInput, ",") + for _, m := range modules { + excludedModules = append(excludedModules, strings.TrimSpace(m)) + } + } + + // These paths are relative to the root directory. + excludedDirs := append([]string{}, defaultExcludedDirs...) + for i, d := range excludedDirs { + excludedDirs[i] = filepath.Join(root, d) + } + + if excludeDirsInput != "" { + dirs := strings.Split(excludeDirsInput, ",") + for _, d := range dirs { + excludedDirs = append(excludedDirs, filepath.Join(root, strings.TrimSpace(d))) + } + } + + version := version.Tag + envVersion := env.Get("VERSION") + if envVersion != "" { + version = envVersion + } + + // Pass disablePush to run. + if err := run(dryRun, remote, disablePush, root, version, excludedModules, excludedDirs); err != nil { + slog.Error("Failed to run autoreleasetagger", "error", err) + os.Exit(1) + } +} + +// Updated run signature with disablePush. +func run(dryRun bool, remote string, disablePush bool, root, version string, excludedModules, excludedDirs []string) error { + slog.Info("Using version", "version", version) + + modules, err := findModules(root, excludedDirs) + if err != nil { + return fmt.Errorf("failed to find modules: %w", err) + } + slog.Info("Found modules:", "count", len(modules)) + moduleKeys := make([]string, 0, len(modules)) + for k := range modules { + moduleKeys = append(moduleKeys, k) + } + slog.Debug("Found modules", "modules", moduleKeys) + + // Assumption: There is a go module in the root directory. + rootModule, err := readModule(filepath.Join(root, "go.mod")) + if err != nil { + return fmt.Errorf("failed to read root module: %w", err) + } + slog.Info("Root module", "module", rootModule.Module.Path) + + // Filter modules to only include those that depend on the root module. + filteredModules := filterModules(modules, rootModule.Module.Path, excludedModules) + slog.Info("Filtered modules:", "count", len(filteredModules)) + filteredKeys := make([]string, 0, len(filteredModules)) + for k := range filteredModules { + filteredKeys = append(filteredKeys, k) + } + slog.Debug("Filtered modules", "modules", filteredKeys) + + sortedModules, err := topologicalSort(buildDependencyGraph(filteredModules)) + if err != nil { + return fmt.Errorf("failed to topologically sort modules: %w", err) + } + + // Tag and push the root module first. + if err := tagAndPush(dryRun, disablePush, remote, rootModule, rootModule, version); err != nil { + return fmt.Errorf("failed to tag root module: %w", err) + } + + for _, modulePath := range sortedModules { + mod := filteredModules[modulePath] + slog.Info("Processing module", "module", mod.Module.Path) + + slog.Info("Updating dependencies", "module", mod.Module.Path) + if err := updateDependencies(dryRun, rootModule, mod, version); err != nil { + return fmt.Errorf("failed to update dependencies: %w", err) + } + + slog.Info("Committing changes", "module", mod.Module.Path) + if err := commitChangesIfNeeded(dryRun, rootModule, mod, version); err != nil { + return fmt.Errorf("failed to commit changes: %w", err) + } + + slog.Info("Tagging module", "module", mod.Module.Path) + if err := tagAndPush(dryRun, disablePush, remote, rootModule, mod, version); err != nil { + return fmt.Errorf("failed to tag module: %w", err) + } + } + + return nil +} + +// Updated tagAndPush to accept disablePush. +func tagAndPush(dryRun, disablePush bool, remote string, root, mod GoMod, version string) error { + tagName := version + + isRoot := root.Module.Path == mod.Module.Path + if !isRoot { + name, err := moduleShortName(root, mod) + if err != nil { + return fmt.Errorf("failed to get module short name: %w", err) + } + tagName = name + "/" + version + } + + slog.Debug("Tagging module", "path", mod.Module.Path, "tag", tagName) + if dryRun { + slog.Debug("Skipping tagging/pushing in dry-run mode") + return nil + } + + if err := createTagIfMissing(mod.dir, tagName); err != nil { + return err + } + + if disablePush { + slog.Debug("Pushing is disabled; skipping git push", "tag", tagName) + return nil + } + + return pushTagIfMissing(mod.dir, remote, tagName) +} + +// createTagIfMissing checks for an existing local tag and creates it if needed. +func createTagIfMissing(dir, tagName string) error { + existingTag, err := runCommandWithOutput(dir, "git", "tag", "--list", tagName) + if err != nil { + return fmt.Errorf("failed to check local tags for %s: %w", tagName, err) + } + if strings.TrimSpace(existingTag) != "" { + slog.Info("Tag already exists locally; skipping creation", "tag", tagName) + return nil + } + return runCommand(dir, "git", "tag", "-am", tagName, tagName) +} + +// pushTagIfMissing checks if the remote tag exists and pushes only if it is missing. +func pushTagIfMissing(dir, remote, tagName string) error { + remoteRef, err := runCommandWithOutput(dir, "git", "ls-remote", remote, "refs/tags/"+tagName) + if err != nil { + return fmt.Errorf("failed to check remote tags for %s: %w", tagName, err) + } + if strings.TrimSpace(remoteRef) != "" { + slog.Info("Remote tag already exists; skipping push", "tag", tagName) + return nil + } + slog.Debug("Pushing tag", "remote", remote, "tag", tagName) + return runCommand(dir, "git", "push", remote, tagName) +} + +// updateDependencies edits the given module dependencies from the root module. +func updateDependencies(dryRun bool, rootModule, mod GoMod, version string) error { + slog.Debug("Edit dd-trace-go dependencies", "module", mod.Module.Path) + if dryRun { + slog.Debug("Skipping editing dd-trace-go dependencies in dry-run mode") + return nil + } + + prefix := strings.Replace(rootModule.Module.Path, "/v2", "", 1) + for _, req := range mod.Require { + // Exclude dependencies that are not part of dd-trace-go. + if !strings.HasPrefix(req.Path, prefix) { + continue + } + require := fmt.Sprintf("-require=%s@%s", req.Path, version) + if err := runCommand(mod.dir, "go", "mod", "edit", require); err != nil { + return err + } + } + + if err := syncDependencies(dryRun, mod); err != nil { + return fmt.Errorf("failed to sync dependencies: %w", err) + } + return nil +} + +// syncDependencies runs 'go mod tidy' on the given module. +func syncDependencies(dryRun bool, mod GoMod) error { + slog.Debug("Running go mod tidy", "module", mod.Module.Path) + if dryRun { + slog.Debug("Skipping go mod tidy in dry-run mode") + return nil + } + + return runCommand(mod.dir, "go", "mod", "tidy") +} + +// commitChangesIfNeeded checks if there are any changes, and if so, commits them. +func commitChangesIfNeeded(dryRun bool, root, mod GoMod, version string) error { + changes, err := runCommandWithOutput(mod.dir, "git", "status", "--porcelain") + if err != nil { + return fmt.Errorf("failed to get git status: %w", err) + } + + if len(strings.TrimSpace(changes)) == 0 { + slog.Debug("No changes to commit", "module", mod.Module.Path) + return nil + } + + // Skip commit if go.mod is not changed. + foundGoModChange := false + for _, line := range strings.Split(changes, "\n") { + if strings.Contains(line, "go.mod") { + foundGoModChange = true + break + } + } + if !foundGoModChange { + slog.Debug("No go.mod changes, skipping commit", "module", mod.Module.Path) + return nil + } + + name, err := moduleShortName(root, mod) + if err != nil { + return fmt.Errorf("failed to get module short name: %w", err) + } + msg := fmt.Sprintf("%s: %s", name, version) + + slog.Debug("Committing changes", "module", mod.Module.Path, "message", msg) + if dryRun { + slog.Debug("Skipping actual commit in dry-run mode") + return nil + } + + return runCommand(mod.dir, "git", "commit", "-am", msg) +} + +// runCommandWithOutput runs a command in the specified directory and returns any output. +func runCommandWithOutput(dir string, name string, args ...string) (string, error) { + cmd := exec.Command(name, args...) + cmd.Dir = dir + output, err := cmd.Output() + if err != nil { + return "", fmt.Errorf("failed to run command %q: %w", cmd.String(), err) + } + return string(output), nil +} + +// runCommand runs a command in the specified directory. +func runCommand(dir string, name string, args ...string) error { + cmd := exec.Command(name, args...) + cmd.Dir = dir + cmd.Stderr = os.Stderr + cmd.Stdout = os.Stdout + + if err := cmd.Run(); err != nil { + return fmt.Errorf("failed to run command %q: %w", cmd.String(), err) + } + return nil +} + +// filterModules returns only modules that depend on the root module. +func filterModules(modules map[string]GoMod, rootModulePath string, excludedModules []string) map[string]GoMod { + filtered := make(map[string]GoMod) + + for path, mod := range modules { + // Skip if directory name or module path is excluded. + if containsPath(excludedModules, path) { + continue + } + // Include only if it depends on the root module. + for _, req := range mod.Require { + if req.Path == rootModulePath { + filtered[path] = mod + break + } + } + } + + return filtered +} + +func findModules(root string, excludedDirs []string) (map[string]GoMod, error) { + modules := make(map[string]GoMod) + + err := filepath.WalkDir(root, func(path string, entry os.DirEntry, err error) error { + if err != nil { + return err + } + + if entry.IsDir() && (containsPath(excludedDirs, path) || entry.Name() == ".git") { + slog.Debug("Skipping directory", "path", path) + return filepath.SkipDir + } + + if entry.Name() == "go.mod" { + m, err := readModule(path) + if err != nil { + return fmt.Errorf("failed to read module: %w", err) + } + + modules[m.Module.Path] = m + } + + return nil + }) + if err != nil { + return nil, fmt.Errorf("failed to walk directory: %w", err) + } + return modules, nil +} + +func readModule(path string) (GoMod, error) { + cmd := exec.Command("go", "mod", "edit", "-json", path) + cmd.Stderr = os.Stderr + + output, err := cmd.Output() + if err != nil { + return GoMod{}, fmt.Errorf("failed to run go mod edit: %w", err) + } + + m := GoMod{dir: filepath.Dir(path)} + if err := json.Unmarshal(output, &m); err != nil { + return GoMod{}, fmt.Errorf("failed to unmarshal go.mod: %w", err) + } + + return m, nil +} + +// buildDependencyGraph parses each GoMod's Require field to link module paths that depend on each other. +func buildDependencyGraph(modules map[string]GoMod) map[string][]string { + graph := make(map[string][]string) + // Ensure every module is a key, even if it has no edges. + for path := range modules { + graph[path] = []string{} + } + // Invert edges: if module A depends on B, store B -> A. + for path, mod := range modules { + for _, req := range mod.Require { + if _, ok := modules[req.Path]; ok { + graph[req.Path] = append(graph[req.Path], path) + } + } + } + + return graph +} + +// topologicalSort orders modules so dependencies come before dependents. +func topologicalSort(graph map[string][]string) ([]string, error) { + inDegree := make(map[string]int) + for node := range graph { + inDegree[node] = 0 + } + + for _, adj := range graph { + for _, dep := range adj { + inDegree[dep]++ + } + } + + var queue []string + + for node, deg := range inDegree { + if deg == 0 { + queue = append(queue, node) + } + } + + var sorted []string + + for len(queue) > 0 { + curr := queue[0] + queue = queue[1:] + + sorted = append(sorted, curr) + + for _, dep := range graph[curr] { + inDegree[dep]-- + if inDegree[dep] == 0 { + queue = append(queue, dep) + } + } + } + + if len(sorted) != len(graph) { + return nil, errors.New("cycle detected in module dependencies") + } + + return sorted, nil +} + +// containsPath checks if a string appears in a slice. +func containsPath(list []string, s string) bool { + for _, item := range list { + eql, err := normalizedPathEqual(item, s) + if err != nil { + slog.Error("Failed to compare paths", "error", err) + continue + } + + if eql { + return true + } + } + + return false +} + +// normalizedPathEqual checks if two paths are equal after normalizing and converting to absolute paths. +func normalizedPathEqual(path1, path2 string) (bool, error) { + abs1, err := filepath.Abs(path1) + if err != nil { + return false, fmt.Errorf("failed to convert %q to absolute: %w", path1, err) + } + + abs2, err := filepath.Abs(path2) + if err != nil { + return false, fmt.Errorf("failed to convert %q to absolute: %w", path2, err) + } + + return filepath.Clean(abs1) == filepath.Clean(abs2), nil +} + +// moduleShortName returns the short name of a module, relative to the root module. +func moduleShortName(root, mod GoMod) (string, error) { + rel, err := filepath.Rel(root.dir, mod.dir) + if err != nil { + return "", fmt.Errorf("failed to get relative path: %w", err) + } + // e.g. + // - github.com/DataDog/dd-trace-go/contrib/google.golang.org/api/v2 => contrib/google.golang.org/api/v2 + // - github.com/Datadog/dd-trace-go/contrib/envoyproxy/go-control-plane/v2 => contrib/envoyproxy/go-control-plane/v2 + return strings.TrimPrefix(rel, "../"), nil +} diff --git a/scripts/autoreleasetagger/main_integration_test.go b/scripts/autoreleasetagger/main_integration_test.go new file mode 100644 index 0000000000..1913815d24 --- /dev/null +++ b/scripts/autoreleasetagger/main_integration_test.go @@ -0,0 +1,181 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +// Package main_test contains integration tests for the autoreleasetagger tool. +package main + +import ( + "bytes" + "fmt" + "io" + "log/slog" + "os" + "os/exec" + "path/filepath" + "strings" + "testing" +) + +func copyTestdata(t *testing.T, src, dst string) { + t.Helper() + + err := os.MkdirAll(filepath.Dir(dst), 0o755) + if err != nil { + t.Fatalf("failed to create dir for %s: %v", dst, err) + } + + in, err := os.Open(src) + if err != nil { + t.Fatalf("failed to open %s: %v", src, err) + } + + defer in.Close() + + out, err := os.Create(dst) + if err != nil { + t.Fatalf("failed to create %s: %v", dst, err) + } + + defer out.Close() + + if _, err := io.Copy(out, in); err != nil { + t.Fatalf("failed to copy %s to %s: %v", src, dst, err) + } +} + +func TestAutoReleaseTaggerIntegration(t *testing.T) { + t.Parallel() + + tmpDir := t.TempDir() + defer os.RemoveAll(tmpDir) + + // Copy testdata to tmpDir. + copyTestdata(t, + filepath.Join("testdata", "root", "go.mod"), + filepath.Join(tmpDir, "go.mod"), + ) + copyTestdata(t, + filepath.Join("testdata", "root", "root.go"), + filepath.Join(tmpDir, "root.go"), + ) + + os.MkdirAll(filepath.Join(tmpDir, "moduleA"), 0o755) + copyTestdata(t, + filepath.Join("testdata", "root", "moduleA", "go.mod"), + filepath.Join(tmpDir, "moduleA", "go.mod"), + ) + copyTestdata(t, + filepath.Join("testdata", "root", "moduleA", "a.go"), + filepath.Join(tmpDir, "moduleA", "a.go"), + ) + os.MkdirAll(filepath.Join(tmpDir, "moduleB"), 0o755) + copyTestdata(t, + filepath.Join("testdata", "root", "moduleB", "go.mod"), + filepath.Join(tmpDir, "moduleB", "go.mod"), + ) + copyTestdata(t, + filepath.Join("testdata", "root", "moduleB", "b.go"), + filepath.Join(tmpDir, "moduleB", "b.go"), + ) + + // Initialize a Git repo in tmpDir + if err := runGitCommand(tmpDir, "init"); err != nil { + t.Fatalf("failed to git init: %v", err) + } + + if err := runGitCommand(tmpDir, "add", "."); err != nil { + t.Fatalf("failed to git add: %v", err) + } + + // Add these lines to configure git. + if err := runGitCommand(tmpDir, "config", "user.email", "test@example.com"); err != nil { + t.Fatalf("failed to configure git user email: %v", err) + } + + if err := runGitCommand(tmpDir, "config", "user.name", "Test User"); err != nil { + t.Fatalf("failed to configure git user name: %v", err) + } + + if err := runGitCommand(tmpDir, "commit", "-m", "initial commit"); err != nil { + t.Fatalf("failed to git commit: %v", err) + } + + var ( + version = "v0.1.0" + dryRun = false + push = false + logger = slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})) + ) + slog.SetDefault(logger) + if err := run(dryRun, "test-remote", !push, tmpDir, version, []string{}, []string{}); err != nil { + t.Fatalf("autoreleasetagger failed: %v", err) + } + + // Verify submodule commits. + commits, err := runGitCommandWithOutput(tmpDir, "log", "--oneline") + if err != nil { + t.Fatalf("failed to read commits: %v", err) + } + + commitA := fmt.Sprintf("moduleA: %s", version) + if !strings.Contains(commits, commitA) { + t.Errorf("expected commit for moduleA not found; commits:\n%s", commits) + } + + commitB := fmt.Sprintf("moduleB: %s", version) + if !strings.Contains(commits, commitB) { + t.Errorf("expected commit for moduleB not found; commits:\n%s", commits) + } + + // Verify tags. + tags, err := runGitCommandWithOutput(tmpDir, "tag", "--list") + if err != nil { + t.Fatalf("failed to list git tags: %v", err) + } + + if !strings.Contains(tags, version) { + t.Errorf("expected tag %q not found; git tags:\n%s", version, tags) + } + + tagA := fmt.Sprintf("moduleA/%s", version) + if !strings.Contains(tags, tagA) { + t.Errorf("expected submodule tag %q not found; git tags:\n%s", tagA, tags) + } + + tagB := fmt.Sprintf("moduleB/%s", version) + if !strings.Contains(tags, tagB) { + t.Errorf("expected submodule tag %q not found; git tags:\n%s", tagB, tags) + } +} + +func runGitCommand(dir string, args ...string) error { + var stderr bytes.Buffer + + cmd := exec.Command("git", args...) + cmd.Dir = dir + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return fmt.Errorf("cmd failed: %w\n%s", err, stderr.String()) + } + + return nil +} + +// runGitCommandWithOutput returns output of a Git command. +func runGitCommandWithOutput(dir string, args ...string) (string, error) { + var stdout, stderr bytes.Buffer + + cmd := exec.Command("git", args...) + cmd.Dir = dir + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + if err := cmd.Run(); err != nil { + return "", fmt.Errorf("cmd failed: %w\n%s", err, stderr.String()) + } + + return stdout.String(), nil +} diff --git a/scripts/autoreleasetagger/testdata/root/go.mod b/scripts/autoreleasetagger/testdata/root/go.mod new file mode 100644 index 0000000000..fe0df27e49 --- /dev/null +++ b/scripts/autoreleasetagger/testdata/root/go.mod @@ -0,0 +1,3 @@ +module example.com/root + +go 1.24.0 diff --git a/scripts/autoreleasetagger/testdata/root/go.sum b/scripts/autoreleasetagger/testdata/root/go.sum new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/autoreleasetagger/testdata/root/moduleA/a.go b/scripts/autoreleasetagger/testdata/root/moduleA/a.go new file mode 100644 index 0000000000..c814b5605e --- /dev/null +++ b/scripts/autoreleasetagger/testdata/root/moduleA/a.go @@ -0,0 +1,17 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package moduleA + +import ( + "example.com/root" +) + +var version = root.Version + +// HelloA returns a greeting that includes the root module's greeting. +func HelloA() string { + return "Hello A + " + root.HelloRoot() + " + " + version +} diff --git a/scripts/autoreleasetagger/testdata/root/moduleA/go.mod b/scripts/autoreleasetagger/testdata/root/moduleA/go.mod new file mode 100644 index 0000000000..2a5d7ae27e --- /dev/null +++ b/scripts/autoreleasetagger/testdata/root/moduleA/go.mod @@ -0,0 +1,7 @@ +module example.com/root/moduleA + +go 1.24.0 + +require example.com/root v0.0.0 + +replace example.com/root => ./.. diff --git a/scripts/autoreleasetagger/testdata/root/moduleA/go.sum b/scripts/autoreleasetagger/testdata/root/moduleA/go.sum new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/autoreleasetagger/testdata/root/moduleB/b.go b/scripts/autoreleasetagger/testdata/root/moduleB/b.go new file mode 100644 index 0000000000..7139bd8514 --- /dev/null +++ b/scripts/autoreleasetagger/testdata/root/moduleB/b.go @@ -0,0 +1,18 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package moduleB + +import ( + "example.com/root" + "example.com/root/moduleA" +) + +var version = root.Version + +// HelloB returns a greeting that includes moduleA's greeting. +func HelloB() string { + return "Hello B + " + moduleA.HelloA() + " + " + version +} diff --git a/scripts/autoreleasetagger/testdata/root/moduleB/go.mod b/scripts/autoreleasetagger/testdata/root/moduleB/go.mod new file mode 100644 index 0000000000..349ff920ff --- /dev/null +++ b/scripts/autoreleasetagger/testdata/root/moduleB/go.mod @@ -0,0 +1,12 @@ +module example.com/root/moduleB + +go 1.24.0 + +require ( + example.com/root v0.0.0 + example.com/root/moduleA v0.0.0 +) + +replace example.com/root => ./.. + +replace example.com/root/moduleA => ../moduleA diff --git a/scripts/autoreleasetagger/testdata/root/moduleB/go.sum b/scripts/autoreleasetagger/testdata/root/moduleB/go.sum new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/autoreleasetagger/testdata/root/root.go b/scripts/autoreleasetagger/testdata/root/root.go new file mode 100644 index 0000000000..f4e6e69019 --- /dev/null +++ b/scripts/autoreleasetagger/testdata/root/root.go @@ -0,0 +1,13 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package root + +// HelloRoot returns a greeting from the root module. +func HelloRoot() string { + return "Hello from root" +} + +const Version = "0.0.0" diff --git a/checkcopyright.go b/scripts/check_copyright.go similarity index 100% rename from checkcopyright.go rename to scripts/check_copyright.go diff --git a/scripts/check_locks.sh b/scripts/check_locks.sh new file mode 100755 index 0000000000..7d08a794c1 --- /dev/null +++ b/scripts/check_locks.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +set -e + +CHECKLOCKS_PACKAGE="${CHECKLOCKS_PACKAGE:-gvisor.dev/gvisor/tools/checklocks/cmd/checklocks@go}" +CHECKLOCKS_BIN="${CHECKLOCKS_BIN:-}" +IGNORE_ERRORS=false +TARGET_DIR="./ddtrace/tracer" + +usage() { + cat << EOF +Usage: $(basename "${BASH_SOURCE[0]}") [options] [target_directory] + +Run checklocks to analyze lock usage and detect potential deadlocks. + +Options: + -i, --ignore-errors Ignore errors and exit successfully + -h, --help Show this help message + +Arguments: + target_directory Directory to analyze (default: ./ddtrace/tracer) + +Environment Variables: + CHECKLOCKS_PACKAGE Package to install checklocks from (default: gvisor.dev/gvisor/tools/checklocks/cmd/checklocks@go) + CHECKLOCKS_BIN Path to existing checklocks binary (optional) +EOF + exit 0 +} + +# Parse arguments +while [[ $# -gt 0 ]]; do + case $1 in + --ignore-errors | -i) + IGNORE_ERRORS=true + shift + ;; + -h | --help) + usage + ;; + *) + TARGET_DIR="$1" + shift + ;; + esac +done + +if [ -n "$CHECKLOCKS_BIN" ]; then + # Use pre-existing binary if specified + CHECKLOCKS_PATH="$CHECKLOCKS_BIN" + echo "Using existing checklocks binary at $CHECKLOCKS_PATH" + + # Verify the binary exists and is executable + if [ ! -f "$CHECKLOCKS_PATH" ]; then + echo "Error: Specified checklocks binary does not exist: $CHECKLOCKS_PATH" + if [ "$IGNORE_ERRORS" = true ]; then + exit 0 + fi + exit 1 + fi + if [ ! -x "$CHECKLOCKS_PATH" ]; then + echo "Error: Specified checklocks binary is not executable: $CHECKLOCKS_PATH" + if [ "$IGNORE_ERRORS" = true ]; then + exit 0 + fi + exit 1 + fi +else # Check if checklocks tool exists in standard location, install if not + CHECKLOCKS_PATH="$HOME/go/bin/checklocks" + if [ ! -f "$CHECKLOCKS_PATH" ]; then + echo "Installing checklocks tool from $CHECKLOCKS_PACKAGE..." + pushd /tmp + go install "$CHECKLOCKS_PACKAGE" + popd + echo "checklocks installed at $CHECKLOCKS_PATH" + fi +fi + +echo "Running checklocks on $TARGET_DIR..." + +output=$(go vet -vettool="$CHECKLOCKS_PATH" "$TARGET_DIR" 2>&1 || true) +if [ -n "$output" ]; then + echo "Raw output:" + echo "$output" + + # Check if all lines start with "-:" or "#" + ignorable_lines=$(echo "$output" | grep -Evc "^(-:|#)") + + if [ "$ignorable_lines" -eq 0 ]; then + # All errors start with "-:" or "#", consider it a success + echo "All errors start with '-:' or '#', considering as success!" + exit 0 + else + # Some errors don't start with "-:" or "#", consider it a failure + echo "Found errors that don't start with '-:' or '#', considering as failure!" + if [ "$IGNORE_ERRORS" = true ]; then + echo "Ignoring errors as requested" + exit 0 + fi + exit 1 + fi +else + echo "No errors found" + exit 0 +fi diff --git a/scripts/ci_contrib_matrix.go b/scripts/ci_contrib_matrix.go new file mode 100644 index 0000000000..f2499d11c0 --- /dev/null +++ b/scripts/ci_contrib_matrix.go @@ -0,0 +1,67 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +//go:build ignore +// +build ignore + +// This tool outputs a JSON encoded array that can be used as a matrix input to GitHub workflows. +// Rather than testing all contribs under one job, we would rather parallelize the jobs +// by using a matrix. +// The `APM Larger Runners` group shares around 50 runners. We should not use all 50. +// TODO: can we find an optimal number of runners that will make the test efficient without +// creating too much cost? +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "log" + "os" + "os/exec" + "regexp" +) + +const numRunners = 6 + +func main() { + cmd := exec.Command("go", "list", "-m", "-json") + var stdout bytes.Buffer + cmd.Stdout = &stdout + + if err := cmd.Run(); err != nil { + log.Fatalln(err) + } + + contribRe := regexp.MustCompile(`/(contrib|instrumentation)/.*/`) + + contribs := make([]string, numRunners) + i := 0 + dec := json.NewDecoder(&stdout) + for dec.More() { + var pkg struct { + Path string `json:"Path"` + } + if err := dec.Decode(&pkg); err != nil { + continue + } + // we want to only count packages in the contrib directory + validContrib := contribRe.FindStringSubmatch(pkg.Path) + if validContrib == nil { + continue + } + contribs[i] += "." + validContrib[0] + " " + i = (i + 1) % numRunners + } + + jsonText, err := json.Marshal(contribs) + if err != nil { + log.Fatalln(err) + } + + if _, err := fmt.Fprintln(os.Stdout, string(jsonText)); err != nil { + log.Fatalln(err) + } +} diff --git a/scripts/ci_test_contrib.sh b/scripts/ci_test_contrib.sh new file mode 100755 index 0000000000..76d615a2b5 --- /dev/null +++ b/scripts/ci_test_contrib.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +set +e + +# This script is used to test the contrib submodules in the apps directory. +# It is run by the GitHub Actions CI workflow defined in +# .github/workflows/unit-integration-tests.yml. + +[[ -d ./contrib ]] || exit 0 + +if [ $# -eq 2 ]; then + CONTRIBS="$2" + INSTRUMENTATION_SUBMODULES="" +else + CONTRIBS=$(find ./contrib -mindepth 2 -type f -name go.mod -exec dirname {} \;) + INSTRUMENTATION_SUBMODULES=$(find ./instrumentation -mindepth 2 -type f -name go.mod -exec dirname {} \;) +fi + +export GOEXPERIMENT=synctest # TODO: remove once go1.25 is the minimum supported version + +report_error=0 + +for contrib in $CONTRIBS; do + echo "Testing contrib module: $contrib" + contrib_id=$(echo "$contrib" | sed 's/^\.\///g;s/[\/\.]/_/g') + cd "$contrib" || exit 1 + if [[ "$1" = "smoke" ]]; then + go get -u -t ./... + go get github.com/DataDog/datadog-agent/pkg/trace@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/remoteconfig/state@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/proto@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/obfuscate@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/comp/core/tagger/origindetection@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/util/log@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/util/scrubber@v0.71.0-rc.2 + go get github.com/DataDog/datadog-agent/pkg/version@v0.71.0-rc.2 + go get go.opentelemetry.io/collector/pdata@v1.39.0 + fi + if [[ "$1" = "smoke" && "$contrib" = "./contrib/k8s.io/client-go/" ]]; then + # This is a temporary workaround due to this issue in apimachinery: https://github.com/kubernetes/apimachinery/issues/190 + # When the issue is resolved, this line can be removed. + go get k8s.io/kube-openapi@v0.0.0-20250628140032-d90c4fd18f59 + fi + go mod tidy + gotestsum --junitfile "${TEST_RESULTS}/gotestsum-report-$contrib_id.xml" -- ./... -v -race -coverprofile="coverage-$contrib_id.txt" -covermode=atomic + test_exit=$? + [[ $test_exit -ne 0 ]] && report_error=1 + cd - > /dev/null || exit 1 +done + +for mod in $INSTRUMENTATION_SUBMODULES; do + echo "Testing instrumentation submodule: $mod" + mod_id=$(echo "$mod" | sed 's/^\.\///g;s/[\/\.]/_/g') + cd "$mod" || exit 1 + [[ "$1" = "smoke" ]] && go get -u -t ./... + if [[ "$1" = "smoke" && "$contrib" = "./contrib/k8s.io/client-go/" ]]; then + # This is a temporary workaround due to this issue in apimachinery: https://github.com/kubernetes/apimachinery/issues/190 + # When the issue is resolved, this line can be removed. + go get k8s.io/kube-openapi@v0.0.0-20250628140032-d90c4fd18f59 + fi + gotestsum --junitfile "${TEST_RESULTS}/gotestsum-report-$mod_id.xml" -- ./... -v -race -coverprofile="coverage-$mod_id.txt" -covermode=atomic + test_exit=$? + [[ $test_exit -ne 0 ]] && report_error=1 + cd - > /dev/null || exit 1 +done + +exit $report_error diff --git a/scripts/ci_test_core.sh b/scripts/ci_test_core.sh new file mode 100755 index 0000000000..93706065bb --- /dev/null +++ b/scripts/ci_test_core.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +set -eu + +report_error=0 + +TEST_RESULTS="${TEST_RESULTS:-.}" +mkdir -p "$TEST_RESULTS" + +# Packages that don't support -shuffle on yet +NO_SHUFFLE_PATTERN="(github\.com/DataDog/dd-trace-go/v2/ddtrace/tracer|\ +github\.com/DataDog/dd-trace-go/v2/internal/civisibility/utils|\ +github\.com/DataDog/dd-trace-go/v2/instrumentation/appsec/dyngo|\ +github\.com/DataDog/dd-trace-go/v2/instrumentation/httptrace)$" + +mapfile -t SHUFFLE_PACKAGES < <(go list ./... | grep -v /contrib/ | grep -Ev "$NO_SHUFFLE_PATTERN") +mapfile -t NO_SHUFFLE_PACKAGES < <(go list ./... | grep -v /contrib/ | grep -E "$NO_SHUFFLE_PATTERN") + +# Set +e so that we run all test commands even if one fails +set +e + +export GOEXPERIMENT=synctest # TODO: remove once go1.25 is the minimum supported version + +# Run tests with shuffle for packages that support it +gotestsum --junitfile "${TEST_RESULTS}/gotestsum-report.xml" -- -v -race -shuffle=on -coverprofile=coverage.txt -covermode=atomic "${SHUFFLE_PACKAGES[@]}" +test_exit=$? +[[ $test_exit -ne 0 ]] && report_error=1 + +# Run tests without shuffle for packages that don't support it yet +gotestsum --junitfile "${TEST_RESULTS}/gotestsum-report-noshuffle.xml" -- -v -race -coverprofile=coverage-noshuffle.txt -covermode=atomic "${NO_SHUFFLE_PACKAGES[@]}" +test_exit=$? +[[ $test_exit -ne 0 ]] && report_error=1 + +cd ./internal/exectracetest +gotestsum --junitfile "${TEST_RESULTS}/gotestsum-report-exectrace.xml" -- -v -race -coverprofile=coverage.txt -covermode=atomic ./... +test_exit=$? +[[ $test_exit -ne 0 ]] && report_error=1 + +exit $report_error diff --git a/scripts/configinverter/README.md b/scripts/configinverter/README.md new file mode 100644 index 0000000000..d70b104186 --- /dev/null +++ b/scripts/configinverter/README.md @@ -0,0 +1,65 @@ +# Config Inverter + +This tool transforms the content of a `supported_configurations.json` file into Go code. + +The `supported_configurations.json` file contains the list of known environment variables used in `dd-trace-go`, alongside their versions, aliases and telemetry keys. +If a variable is not present in the file and the generated code it won't never be read and will always return `""`. + +## 🛠️ Usage + +Using `internal/env` package is the only way to read env using `env.Lookup` or `env.Get` as `os.Getenv` and `os.LookupEnv` are forbidden via linter rules. This packages checks the existence of the variable read against a generated list in `internal/env/supported_configurations.gen.go` + + +### Generate `supported_configurations.gen.go` + +From the root of `dd-trace-go` run the following command to generate the file: + +```sh +go run ./scripts/configinverter/main.go generate +``` + +### Check for missing generated keys + +Keys are automatically added to the JSON file when detected in a `go test` scenario. After running test +you can check for differences between the content of the generated code and the content of the `supported_configurations.json` in order to make sure that no new env var has been detected. + +```sh +go run ./scripts/configinverter/main.go check +``` + +Example outputs: + +```log +2025/08/06 15:05:15 INFO read file file=./internal/env/supported_configurations.json +2025/08/06 15:05:15 INFO supported configuration keys in JSON file count=195 +2025/08/06 15:05:15 INFO supported configuration keys in generated map count=195 +2025/08/06 15:05:15 INFO supported configurations JSON file and generated map are in sync +2025/08/06 15:05:15 INFO success executing command command=check +``` + +```log +2025/08/06 15:06:18 INFO read file file=./internal/env/supported_configurations.json +2025/08/06 15:06:18 INFO supported configuration keys in JSON file count=197 +2025/08/06 15:06:18 INFO supported configuration keys in generated map count=195 +2025/08/06 15:06:18 ERROR supported configuration key not found in generated map key=DD_ANOTHER_NEW_ENV_VAR +2025/08/06 15:06:18 ERROR supported configuration key not found in generated map key=DD_NEW_ENV_VAR +2025/08/06 15:06:18 ERROR supported configuration keys missing in generated map count=2 keys="[DD_ANOTHER_NEW_ENV_VAR DD_NEW_ENV_VAR]" +2025/08/06 15:06:18 INFO run `go run ./scripts/configinverter generate` to re-generate the supported configurations map with the missing keys +2025/08/06 15:06:18 ERROR error executing command error="supported configuration keys missing in generated map" +exit status 1 +``` + +> Tests using an unknown env var should not pass as no value is read from the env when the variable is not known. +If your test passes it's probably not testing what it should. + + +## 📖 Help + +[embedmd]:# (tmp/help.txt) +```txt +Usage of ./configinverter: + -input string + Path to the input file (default "./internal/env/supported_configurations.json") + -output string + Path to the output directory (default "./internal/env") +``` diff --git a/scripts/configinverter/go.mod b/scripts/configinverter/go.mod new file mode 100644 index 0000000000..adea446225 --- /dev/null +++ b/scripts/configinverter/go.mod @@ -0,0 +1,12 @@ +module github.com/DataDog/dd-trace-go/v2/scripts/configinverter + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + github.com/dave/jennifer v1.7.1 +) + +require github.com/Masterminds/semver/v3 v3.3.1 // indirect + +replace github.com/DataDog/dd-trace-go/v2 => ../.. diff --git a/scripts/configinverter/go.sum b/scripts/configinverter/go.sum new file mode 100644 index 0000000000..40c0964712 --- /dev/null +++ b/scripts/configinverter/go.sum @@ -0,0 +1,12 @@ +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/scripts/configinverter/main.go b/scripts/configinverter/main.go new file mode 100644 index 0000000000..b45cb4c265 --- /dev/null +++ b/scripts/configinverter/main.go @@ -0,0 +1,243 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2025 Datadog, Inc. + +package main + +import ( + "encoding/json" + "flag" + "fmt" + "log/slog" + "os" + "sort" + "strings" + + "github.com/DataDog/dd-trace-go/v2/internal/env" + "github.com/dave/jennifer/jen" +) + +func main() { + var ( + input string + output string + ) + flag.StringVar(&input, "input", "./internal/env/supported_configurations.json", "Path to the input file") + flag.StringVar(&output, "output", "./internal/env", "Path to the output directory") + flag.Parse() + + // Get command and keys from positional arguments + args := flag.Args() + if len(args) == 0 { + slog.Error("no command provided") + os.Exit(1) + } + + command := args[0] + + var err error + switch command { + case "generate": + err = generate(input, output) + case "check": + err = check(input) + case "add": + err = add(input, output, args[1:]) + default: + err = fmt.Errorf("unknown command: %s", command) + } + + if err != nil { + slog.Error("error executing command", "error", err) + os.Exit(1) + } + slog.Info("success executing command", "command", command) +} + +type supportedConfiguration struct { + SupportedConfigurations map[string][]string `json:"supportedConfigurations"` + Aliases map[string][]string `json:"aliases"` +} + +// generate generates the supported configurations map from the supported configurations +// JSON file. +func generate(input, output string) error { + cfg, err := getSupportedConfigurations(input) + if err != nil { + return fmt.Errorf("error getting supported configuration keys: %w", err) + } + + keys := sortSupportedConfigurationsKeys(cfg) + + slog.Info("supported configuration keys count", "count", len(keys)) + + f := jen.NewFilePath(output) + f.HeaderComment("Unless explicitly stated otherwise all files in this repository are licensed") + f.HeaderComment("under the Apache License Version 2.0.") + f.HeaderComment("This product includes software developed at Datadog (https://www.datadoghq.com/).") + f.HeaderComment("Copyright 2025 Datadog, Inc.") + f.Comment("Code generated by github.com/DataDog/dd-trace-go/v2/scripts/configinverter. DO NOT EDIT.") + f.Line() + f.Comment("SupportedConfigurations is a map of supported configuration keys.") + f.Var().Id("SupportedConfigurations").Op("=").Map(jen.String()).Struct().ValuesFunc(func(g *jen.Group) { + for _, v := range keys { + g.Add(jen.Line(), jen.Lit(v), jen.Op(":"), jen.Values()) + } + g.Line() + }) + f.Line() + + // Get aliases keys and sort them + // so we can generate the map in a deterministic way + aliases := []string{} + for k := range cfg.Aliases { + aliases = append(aliases, k) + } + sort.Strings(aliases) + + f.Comment("keyAliases maps aliases to supported configuration keys.") + f.Var().Id("keyAliases").Op("=").Map(jen.String()).Index().String().ValuesFunc(func(g *jen.Group) { + for _, v := range aliases { + g.Add(jen.Line(), jen.Lit(v), jen.Op(":"), jen.ValuesFunc(func(g *jen.Group) { + for _, v := range cfg.Aliases[v] { + g.Add(jen.Lit(v)) + } + })) + } + g.Line() + }) + + if err := f.Save(output + "/supported_configurations.gen.go"); err != nil { + return fmt.Errorf("error saving file: %w", err) + } + + return nil +} + +// check verifies that there is no difference between the supported configurations +// JSON file and generated Go code map. +func check(input string) error { + keys, err := getSupportedConfigurationsKeys(input) + if err != nil { + return fmt.Errorf("error getting supported configuration keys: %w", err) + } + + slog.Info("supported configuration keys in JSON file", "count", len(keys)) + slog.Info("supported configuration keys in generated map", "count", len(env.SupportedConfigurations)) + + missingKeys := []string{} + for _, k := range keys { + if _, ok := env.SupportedConfigurations[k]; !ok { + slog.Error("supported configuration key not found in generated map", "key", k) + missingKeys = append(missingKeys, k) + } + } + + if len(missingKeys) > 0 { + slog.Error("supported configuration keys missing in generated map", "count", len(missingKeys), "keys", missingKeys) + slog.Info("run `go run ./scripts/configinverter/main.go generate` to re-generate the supported configurations map with the missing keys") + return fmt.Errorf("supported configuration keys missing in generated map") + } + + slog.Info("supported configurations JSON file and generated map are in sync") + + return nil +} + +// add adds new keys to the supported configurations JSON file and re-generates the +// supported configurations map using the `generate` command. +func add(input, output string, newKeys []string) error { + cfg, err := getSupportedConfigurations(input) + if err != nil { + return fmt.Errorf("error getting supported configuration keys: %w", err) + } + + filteredKeys := []string{} + for _, k := range newKeys { + // Filter out keys that don't start with DD_ or OTEL_ + if strings.HasPrefix(strings.ToUpper(k), "DD_") || strings.HasPrefix(strings.ToUpper(k), "OTEL_") { + filteredKeys = append(filteredKeys, strings.ToUpper(k)) + } + } + + missingKeys := []string{} + for _, k := range filteredKeys { + _, ok := cfg.SupportedConfigurations[k] + if !ok { + missingKeys = append(missingKeys, k) + } else { + slog.Info("key already exists", "key", k) + } + } + + if len(missingKeys) == 0 { + slog.Info("no new keys to add") + return nil + } + + slog.Info("adding missing keys", "count", len(missingKeys), "keys", missingKeys) + + err = addSupportedConfigurationsKeys(input, cfg, missingKeys) + if err != nil { + return fmt.Errorf("error adding supported configuration keys to file: %w", err) + } + + if err := generate(input, output); err != nil { + return fmt.Errorf("error running generate command after adding supported configuration keys: %w", err) + } + + return nil +} + +// getSupportedConfigurationsKeys gets the supported configurations keys from the JSON file. +// It returns a sorted list of env variables. +func getSupportedConfigurationsKeys(input string) ([]string, error) { + cfg, err := getSupportedConfigurations(input) + if err != nil { + return nil, fmt.Errorf("error getting supported configuration: %w", err) + } + + return sortSupportedConfigurationsKeys(cfg), nil +} + +func sortSupportedConfigurationsKeys(cfg *supportedConfiguration) []string { + keys := []string{} + for k := range cfg.SupportedConfigurations { + keys = append(keys, k) + } + sort.Strings(keys) + return keys +} + +// getSupportedConfigurations gets the supported configurations from the JSON file. +func getSupportedConfigurations(input string) (*supportedConfiguration, error) { + fcontent, err := os.ReadFile(input) + if err != nil { + return nil, fmt.Errorf("error getting supported configuration keys from embed: %w", err) + } + + slog.Info("read file", "file", input) + + var cfg supportedConfiguration + if err := json.Unmarshal(fcontent, &cfg); err != nil { + return nil, fmt.Errorf("error unmarshalling supported configuration: %w", err) + } + + return &cfg, nil +} + +// addSupportedConfigurationsKeys adds new keys to the supported configurations JSON +// file. +func addSupportedConfigurationsKeys(input string, cfg *supportedConfiguration, newKeys []string) error { + for _, k := range newKeys { + cfg.SupportedConfigurations[k] = []string{"A"} + } + + json, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return fmt.Errorf("error marshalling supported configuration: %w", err) + } + + return os.WriteFile(input, json, 0644) +} diff --git a/scripts/fix_modules.sh b/scripts/fix_modules.sh new file mode 100755 index 0000000000..84d7efa8b2 --- /dev/null +++ b/scripts/fix_modules.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +set -euo pipefail + +# This scripts runs go mod tidy on all the go modules of the repo, and additionally it adds missing replace directives +# for local imports. + +go run -tags=scripts ./scripts/fixmodules -root=. . + +while IFS= read -r -d '' f; do + ( + cd "$(dirname "$f")" || exit 1 + go mod tidy + ) +done < <(find . -name go.mod -print0) + +# This command will update the go.work.sum file +go list -m all > /dev/null diff --git a/scripts/fixmodules/go.mod b/scripts/fixmodules/go.mod new file mode 100644 index 0000000000..8590c67e76 --- /dev/null +++ b/scripts/fixmodules/go.mod @@ -0,0 +1,5 @@ +module github.com/DataDog/dd-trace-go/v2/scripts/fixmodules + +go 1.24.0 + +require golang.org/x/mod v0.22.0 diff --git a/scripts/fixmodules/go.sum b/scripts/fixmodules/go.sum new file mode 100644 index 0000000000..36066b89e4 --- /dev/null +++ b/scripts/fixmodules/go.sum @@ -0,0 +1,2 @@ +golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4= +golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= diff --git a/scripts/fixmodules/main.go b/scripts/fixmodules/main.go new file mode 100644 index 0000000000..5686db2e94 --- /dev/null +++ b/scripts/fixmodules/main.go @@ -0,0 +1,422 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +//go:build scripts +// +build scripts + +package main + +import ( + "cmp" + "encoding/json" + "flag" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io/fs" + "log" + "os" + "os/exec" + "path" + "path/filepath" + "slices" + "sort" + "strings" + + "golang.org/x/mod/modfile" +) + +var ( + projectRoot string + verbose bool +) + +var skipModules = []string{ + "github.com/DataDog/dd-trace-go/tools/v2fix", + "github.com/DataDog/dd-trace-go/_tools", +} + +func init() { + flag.StringVar(&projectRoot, "root", ".", "Path to the project root (default: \".\")") + flag.BoolVar(&verbose, "verbose", false, "Run in verbose mode (default: false)") + + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "Usage: go run ./tools/fixmodules -root= \n") + flag.PrintDefaults() + } +} + +// These types come from "go help mod edit" +type ( + Module struct { + Path string + Version string + } + + GoMod struct { + // dir is the directory where the module lives + dir string + + Module ModPath + Go string + Toolchain string + Require []Require + Exclude []Module + Replace []Replace + Retract []Retract + } + + ModPath struct { + Path string + Deprecated string + } + + Require struct { + Path string + Version string + Indirect bool + } + + Replace struct { + Old Module + New Module + } + + Retract struct { + Low string + High string + Rationale string + } +) + +func main() { + flag.Parse() + if flag.NArg() != 1 { + fmt.Fprintln(os.Stderr, "Error: is required and must be a single argument") + flag.Usage() + os.Exit(2) + } + if projectRoot == "" { + fmt.Fprintln(os.Stderr, "Error: -root cannot be empty") + flag.Usage() + os.Exit(2) + } + + root, err := filepath.Abs(projectRoot) + if err != nil { + log.Fatal(err) + } + if resolved, err := os.Readlink(root); err == nil { + root = resolved + } + + fixDir := flag.Arg(0) + fixDir, err = filepath.Abs(fixDir) + if err != nil { + log.Fatal(err) + } + if resolved, err := os.Readlink(fixDir); err == nil { + fixDir = resolved + } + + goVersion := getProjectGoVersion(root) + debugLog("using go version globally %s\n", goVersion) + debugLog("finding modules recursively from %s\n", fixDir) + + fixModules, err := findModules(fixDir) + if err != nil { + log.Fatal(err) + } + allModules, err := findModules(root) + if err != nil { + log.Fatal(err) + } + + for _, modPath := range sortedKeys(fixModules) { + mod := fixModules[modPath] + if slices.Contains(skipModules, mod.Module.Path) { + continue + } + + files, err := getModGoFiles(mod) + if err != nil { + log.Fatal(err) + } + imports, err := findImports(files) + if err != nil { + log.Fatal(err) + } + + replacesSet := make(map[string]Replace) + for _, im := range imports { + // the module name and the import path might be different (when the imported package is a sub-package) + importModule := im + if strings.HasPrefix(im, "github.com/DataDog/dd-trace-go") { + if left, _, ok := strings.Cut(im, "/v2"); ok { + importModule = left + "/v2" + } + } + if importModule == mod.Module.Path { + // exclude self + continue + } + // it's a local module + _, ok := allModules[importModule] + if ok { + rep := getLocalReplace(allModules, modPath, importModule) + replacesSet[rep.Old.Path] = rep + } + } + for _, require := range mod.Require { + // it's a local module + _, ok := allModules[require.Path] + if ok { + rep := getLocalReplace(allModules, modPath, require.Path) + replacesSet[rep.Old.Path] = rep + } + } + var replaces []Replace + for _, r := range replacesSet { + replaces = append(replaces, r) + } + slices.SortFunc(replaces, func(a, b Replace) int { + return cmp.Compare(a.Old.Path, b.Old.Path) + }) + + debugLog("adding module replaces %q\n", modPath) + for _, r := range replaces { + debugLog(" %s => %s\n", r.Old.Path, r.New.Path) + } + if err := fixModule(allModules, mod, goVersion, replaces); err != nil { + log.Fatal(err) + } + } +} + +func getLocalReplace(mods map[string]GoMod, mod, require string) Replace { + mDir := mods[mod].dir + rDir := mods[require].dir + + rel, err := filepath.Rel(mDir, rDir) + if err != nil { + log.Fatal(err) + } + if !strings.HasPrefix(rel, "./") && !strings.HasPrefix(rel, "../") { + rel = "./" + rel + } + return Replace{ + Old: Module{ + Path: require, + }, + New: Module{ + Path: rel, + Version: "", + }, + } +} + +func readModule(path string) (GoMod, error) { + cmd := exec.Command("go", "mod", "edit", "-json", path) + cmd.Stderr = os.Stderr + output, err := cmd.Output() + if err != nil { + return GoMod{}, err + } + m := GoMod{dir: filepath.Dir(path)} + if err := json.Unmarshal(output, &m); err != nil { + return GoMod{}, err + } + return m, nil +} + +func fixModule(mods map[string]GoMod, mod GoMod, goVersion string, replaces []Replace) error { + var drop []Replace + add := append([]Replace{}, replaces...) + + // first, clean previous local replaces + for _, existingReplace := range mod.Replace { + if _, ok := mods[existingReplace.Old.Path]; ok { + found := false + for i, newReplace := range add { + if newReplace == existingReplace { + found = true + add = append(add[:i], add[i+1:]...) + break + } + } + if !found { + drop = append(drop, existingReplace) + } + } + } + + if len(drop) > 0 { + var args []string + args = append(args, "mod", "edit") + for _, replace := range drop { + args = append(args, fmt.Sprintf("-dropreplace=%s", replace.Old.Path)) + } + cmd := exec.Command("go", args...) + cmd.Stderr = os.Stderr + cmd.Dir = mod.dir + if err := cmd.Run(); err != nil { + return fmt.Errorf("'go mod edit' dropreplace failed: %w", err) + } + } + + if len(add) > 0 { + var args []string + args = append(args, "mod", "edit") + for _, replace := range add { + args = append(args, fmt.Sprintf("-replace=%s=%s", replace.Old.Path, replace.New.Path)) + } + cmd := exec.Command("go", args...) + cmd.Stderr = os.Stderr + cmd.Dir = mod.dir + if err := cmd.Run(); err != nil { + return fmt.Errorf("command %q failed: %w", cmd.String(), err) + } + } + + cmd := exec.Command("go", "mod", "tidy", "-v", "-go", goVersion) + cmd.Stderr = os.Stderr + cmd.Dir = mod.dir + if err := cmd.Run(); err != nil { + return fmt.Errorf("'go mod tidy' failed: %w", err) + } + + cmd = exec.Command("go", "mod", "edit", "-toolchain", "none") + cmd.Stderr = os.Stderr + cmd.Dir = mod.dir + if err := cmd.Run(); err != nil { + return fmt.Errorf("'go mod edit' toolchain failed: %w", err) + } + + return nil +} + +func sortedKeys[K cmp.Ordered, V any](m map[K]V) []K { + var keys []K + for k := range m { + keys = append(keys, k) + } + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + return keys +} + +func findModules(root string) (map[string]GoMod, error) { + modules := make(map[string]GoMod) + if err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if !info.IsDir() { + if info.Name() == "go.mod" { + m, err := readModule(path) + if err != nil { + return err + } + modules[m.Module.Path] = m + } + return nil + } + if name := info.Name(); name != root && strings.HasPrefix(name, ".") { + return filepath.SkipDir + } + return nil + }); err != nil { + return nil, err + } + return modules, nil +} + +func getModGoFiles(mod GoMod) ([]string, error) { + var goFiles []string + var nestedMods []string + foundGoMod := false + + err := filepath.WalkDir(mod.dir, func(path string, f fs.DirEntry, err error) error { + if f.Name() == "go.mod" { + if foundGoMod { + nestedMods = append(nestedMods, filepath.Dir(path)) + return fs.SkipAll + } + foundGoMod = true + } + if filepath.Ext(path) == ".go" { + goFiles = append(goFiles, path) + } + return nil + }) + if err != nil { + return nil, err + } + + shouldInclude := func(path string) bool { + for _, nm := range nestedMods { + if strings.HasPrefix(path, nm) { + return false + } + } + return true + } + var filtered []string + for _, f := range goFiles { + if shouldInclude(f) { + filtered = append(filtered, f) + } + } + return filtered, nil +} + +func findImports(goFiles []string) ([]string, error) { + importSet := make(map[string]bool) + fset := token.NewFileSet() + + for _, goFile := range goFiles { + f, err := parser.ParseFile(fset, goFile, nil, parser.ImportsOnly) + if err != nil { + return nil, err + } + for _, decl := range f.Decls { + genDecl, ok := decl.(*ast.GenDecl) + if !ok || genDecl.Tok != token.IMPORT { + continue + } + for _, spec := range genDecl.Specs { + importSpec := spec.(*ast.ImportSpec) + + importSet[strings.Trim(importSpec.Path.Value, "\"")] = true + } + } + } + + var imports []string + for k := range importSet { + imports = append(imports, k) + } + sort.Strings(imports) + return imports, nil +} + +func getProjectGoVersion(root string) string { + b, err := os.ReadFile(path.Join(root, "go.mod")) + if err != nil { + log.Fatal(err) + } + f, err := modfile.Parse("go.mod", b, nil) + if err != nil { + panic(err) + } + return f.Go.Version +} + +func debugLog(format string, v ...any) { + if !verbose { + return + } + log.Printf(format, v...) +} diff --git a/scripts/format.sh b/scripts/format.sh new file mode 100755 index 0000000000..78d83a6514 --- /dev/null +++ b/scripts/format.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +set -euo pipefail + +# message: Prints a message to the console with a timestamp and prefix. +message() { + local msg="$1" + printf "\n> %s - %s\n" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$msg" +} + +# run: Runs the tool and fails early if it fails. +run() { + local cmd="$1" + message "Running: $cmd" + if ! eval "$cmd"; then + message "Command failed: $cmd" + exit 1 + fi + message "Command ran successfully: $cmd" +} + +# Default flags +format_go=false +format_shell=false + +usage() { + cat << EOF +Usage: $(basename "${BASH_SOURCE[0]}") [options] + +Format Go and Shell files in the repository. + +Options: + --all Format both Go and Shell files and install tools + --go Format only Go files + --shell Format only Shell files + -h, --help Show this help message + +Without any flags, formats Go files only (default behavior). +EOF + exit 0 +} + +format_go_files() { + message "Formatting Go files..." + run "golangci-lint fmt" +} + +format_shell_files() { + message "Formatting shell scripts..." + run "shfmt --indent=2 --case-indent --space-redirects -l -w scripts/*.sh" +} + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + --all) + format_go=true + format_shell=true + shift + ;; + --go) + format_go=true + shift + ;; + --shell) + format_shell=true + shift + ;; + -h | --help) + usage + ;; + *) + echo "Ignoring unknown argument $1" + shift + ;; + esac +done + +# Default behavior: format Go files if no specific format is selected +if [[ ${format_go} == false ]] && [[ ${format_shell} == false ]]; then + format_go=true +fi + +# Run formatters based on flags +if [[ ${format_go} == true ]]; then + format_go_files +fi + +if [[ ${format_shell} == true ]]; then + format_shell_files +fi diff --git a/scripts/gen_integrations_doc.go b/scripts/gen_integrations_doc.go new file mode 100644 index 0000000000..cb47e591b3 --- /dev/null +++ b/scripts/gen_integrations_doc.go @@ -0,0 +1,482 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +//go:build ignore +// +build ignore + +package main + +import ( + "context" + "encoding/json" + "fmt" + "go/ast" + "go/build" + "go/doc" + "go/parser" + "go/token" + "log" + "os" + "os/exec" + "path" + "path/filepath" + "regexp" + "sort" + "strings" + "sync" + "time" + + "github.com/DataDog/dd-trace-go/v2/instrumentation" + "golang.org/x/mod/modfile" +) + +const outputPath = "./contrib/supported_integrations.md" + +// stdlibPackages are used to skip in version checking. +var stdlibPackages = map[string]struct{}{ + "log/slog": {}, + "os": {}, + "net/http": {}, + "database/sql": {}, +} + +type integration struct { + name string + minVersion string + maxVersion string + repository string + orchestrionSupported bool + packages map[string]integrationPackage +} + +type integrationPackage struct { + name string + importPath string + docString string + deprecated bool + deprecationDoc string +} + +// modUpdate is the type returned by 'go list -m -u -json ' +type modUpdate struct { + Path string + Version string + Update struct { + Path string + Version string + } +} + +func main() { + integrations, err := fetchIntegrations() + if err != nil { + log.Fatalf("failed to fetch integrations: %s\n", err.Error()) + } + if err := writeMarkdownFile(integrations, outputPath); err != nil { + log.Fatalf("failed to write markdown file: %s\n", err.Error()) + } + log.Printf("integration docs has been written to: %s\n", outputPath) +} + +func fetchIntegrations() ([]integration, error) { + pkgs := instrumentation.GetPackages() + + var ( + wg sync.WaitGroup + mu sync.Mutex + integrations = make([]integration, 0, len(pkgs)) + ) + for name, mod := range pkgs { + wg.Add(1) + + integrationName := name + modName := mod.TracedPackage + + go func() { + defer wg.Done() + + ig, err := fetchIntegrationInfo(string(integrationName), modName) + if err != nil { + log.Printf("WARN: failed to read integration info: %s\n", err.Error()) + return + } + + mu.Lock() + integrations = append(integrations, ig) + mu.Unlock() + }() + } + wg.Wait() + return integrations, nil +} + +func fetchIntegrationInfo(name, tracedPackage string) (integration, error) { + // Path to contrib/{packageName} + contribPath := filepath.Join("contrib", name) + goModPath := filepath.Join(contribPath, "go.mod") + + // Check if go.mod exists in directory + if _, err := os.Stat(goModPath); os.IsNotExist(err) { + return integration{}, fmt.Errorf("go.mod not found in %s", contribPath) + } + + packages, err := parseIntegrationPackages(contribPath) + if err != nil { + return integration{}, fmt.Errorf("failed to fetch integration packages: %s", err) + } + + orchestrionSupported := false + for _, pkg := range packages { + aspectPath := path.Join(contribPath, pkg.importPath, "orchestrion.yml") + if _, err := os.Stat(aspectPath); err == nil { + orchestrionSupported = true + break + } + } + + var ( + minVersion = "N/A" + maxVersion = "N/A" + repository = tracedPackage + ) + if _, ok := stdlibPackages[name]; !ok { + minVersion, maxVersion, repository, err = fetchVersionInfo(goModPath, tracedPackage) + if err != nil { + return integration{}, fmt.Errorf("failed to fetch version info: %s", err) + } + } + return integration{ + name: name, + minVersion: minVersion, + maxVersion: maxVersion, + repository: repository, + orchestrionSupported: orchestrionSupported, + packages: packages, + }, nil +} + +func fetchVersionInfo(goModPath, tracedPackage string) (minVersion, maxVersion, repository string, resultErr error) { + // Read the go.mod + data, err := os.ReadFile(goModPath) + if err != nil { + resultErr = fmt.Errorf("failed to read go.mod: %w", err) + return + } + + // Parse the go.mod + f, err := modfile.Parse(goModPath, data, nil) + if err != nil { + resultErr = fmt.Errorf("failed to parse go.mod: %w", err) + return + } + + // match the repository name + repoPattern := fmt.Sprintf(`\b%s\b`, strings.ReplaceAll(tracedPackage, "/", `/`)) + repoRegex, err := regexp.Compile(repoPattern) + if err != nil { + resultErr = fmt.Errorf("invalid repository regex pattern: %w", err) + return + } + + // Iterate through require dependencies + for _, req := range f.Require { + if repoRegex.MatchString(req.Mod.Path) { + latestVersion, err := fetchLatestVersion(req.Mod.Path) + if err != nil { + log.Printf("error fetching latest version for %s: %v\n", req.Mod.Path, err) + } + return req.Mod.Version, latestVersion, req.Mod.Path, nil + + } + } + resultErr = fmt.Errorf("repository %s not found in go.mod", tracedPackage) + return +} + +func fetchLatestVersion(module string) (string, error) { + if _, ok := stdlibPackages[module]; ok { + return "N/A", nil + } + + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + + // Run `go list -m -u -json ` to retrieve latest available upgrade + out, err := runCommand(ctx, "", "go", "list", "-m", "-u", "-json", module) + if err != nil { + return "", err + } + + var m modUpdate + if err := json.Unmarshal(out, &m); err != nil { + return "", fmt.Errorf("unexpected 'go list -m -u -json' output: %s", err) + } + + latest := m.Version + if m.Update.Version != "" { + latest = m.Update.Version + } + return latest, nil +} + +func writeMarkdownFile(integrations []integration, filePath string) error { + sort.Slice(integrations, func(i, j int) bool { return integrations[i].name < integrations[j].name }) + + var ( + nonDeprecated []integration + deprecated []integration + ) + for _, ig := range integrations { + isDeprecated := true + for _, pkg := range ig.packages { + if !pkg.deprecated { + isDeprecated = false + break + } + } + if isDeprecated { + deprecated = append(deprecated, ig) + } else { + nonDeprecated = append(nonDeprecated, ig) + } + } + + buildTable := func(rows [][]string) [][]string { + if len(rows) == 0 { + return rows + } + max := make([]int, len(rows[0])) + for _, r := range rows { + for i, col := range r { + if l := len(col); l > max[i] { + max[i] = l + } + } + } + for _, r := range rows { + for i, col := range r { + pad := " " + if col == "-" { + pad = "-" + } + if n := max[i] - len(col); n > 0 { + r[i] += strings.Repeat(pad, n) + } + r[i] = pad + r[i] + pad + } + } + return rows + } + + header := []string{ + "Package", "Datadog Integration", "Minimum Tested Version", + "Maximum Tested Version", "Orchestrion support", + } + sep := []string{"-", "-", "-", "-", "-"} + + rowsActive := [][]string{header, sep} + for _, ig := range nonDeprecated { + rowsActive = append(rowsActive, []string{ + modWithPkgDevURL(ig.repository, ig.repository), + integrationWithPackageURL(ig.name), + fmt.Sprintf("`%s`", ig.minVersion), + fmt.Sprintf("`%s`", ig.maxVersion), + boolToMarkdown(ig.orchestrionSupported), + }) + } + rowsActive = buildTable(rowsActive) + + headerDep := append(append([]string{}, header...), "Deprecation comment") + sepDep := []string{"-", "-", "-", "-", "-", "-"} + rowsDep := [][]string{headerDep, sepDep} + for _, ig := range deprecated { + rowsDep = append(rowsDep, []string{ + modWithPkgDevURL(ig.repository, ig.repository), + integrationWithPackageURL(ig.name), + fmt.Sprintf("`%s`", ig.minVersion), + fmt.Sprintf("`%s`", ig.maxVersion), + boolToMarkdown(ig.orchestrionSupported), + deprecationCommentMarkdown(filepath.Join("contrib", ig.name), ig.packages), + }) + } + rowsDep = buildTable(rowsDep) + + file, err := os.Create(filePath) + if err != nil { + return fmt.Errorf("error creating file: %w", err) + } + defer func() { + if cerr := file.Close(); cerr != nil { + log.Printf("failed to close file: %v\n", cerr) + } + }() + + for _, row := range rowsActive { + if _, err := fmt.Fprintln(file, "|"+strings.Join(row, "|")+"|"); err != nil { + return fmt.Errorf("failed to write active table: %w", err) + } + } + + if len(deprecated) > 0 { + if _, err := fmt.Fprintln(file, "\n⚠️ The following integrations are marked as deprecated and will be removed in future releases. ⚠️\n"); err != nil { + return fmt.Errorf("failed to write deprecation note: %w", err) + } + for _, row := range rowsDep { + if _, err := fmt.Fprintln(file, "|"+strings.Join(row, "|")+"|"); err != nil { + return fmt.Errorf("failed to write deprecated table: %w", err) + } + } + } + + return nil +} + +func parseIntegrationPackages(contribPath string) (map[string]integrationPackage, error) { + pkgs := make(map[string]integrationPackage) + + err := filepath.WalkDir(contribPath, func(path string, d os.DirEntry, err error) error { + if err != nil { + return err + } + if !d.IsDir() { + return nil + } + if strings.HasPrefix(d.Name(), ".") || d.Name() == "vendor" { + return filepath.SkipDir + } + parts := strings.Split(path, string(filepath.Separator)) + for _, part := range parts { + if part == "internal" { + return filepath.SkipDir + } + } + pkg, err := build.Default.ImportDir(path, 0) + if err != nil { + return nil + } + if pkg.Name == "main" { + return nil + } + fset := token.NewFileSet() + var files []*ast.File + + for _, filename := range pkg.GoFiles { + fullPath := filepath.Join(pkg.Dir, filename) + f, err := parser.ParseFile(fset, fullPath, nil, parser.ParseComments) + if err != nil { + continue // skip invalid files + } + files = append(files, f) + } + + if len(files) == 0 { + return nil + } + + apkg, err := doc.NewFromFiles(fset, files, path) + if err != nil { + return fmt.Errorf("failed to compute documentation for package: %s", err) + } + + docStr := apkg.Doc + deprecated, deprecation := deprecationInfo(apkg.Doc) + + relImportPath, err := filepath.Rel(contribPath, path) + if err != nil { + relImportPath = path + } + pkgs[relImportPath] = integrationPackage{ + name: pkg.Name, + importPath: relImportPath, + docString: docStr, + deprecated: deprecated, + deprecationDoc: deprecation, + } + return nil + }) + + return pkgs, err +} + +// deprecationInfo scans a *go/doc* package‐level docString string and, +// if it contains a "Deprecated:" section, returns (true, message). +func deprecationInfo(docStr string) (bool, string) { + const tag = "Deprecated:" + idx := strings.Index(docStr, tag) + if idx == -1 { + return false, "" + } + + msg := strings.TrimLeft(docStr[idx+len(tag):], " \t\n") + + var lines []string + for _, line := range strings.Split(msg, "\n") { + if strings.TrimSpace(line) == "" { + break + } + lines = append(lines, strings.TrimSpace(line)) + } + + return true, strings.Join(lines, " ") +} + +func runCommand(ctx context.Context, dir string, commandAndArgs ...string) ([]byte, error) { + log.Printf("running command: %q\n", strings.Join(commandAndArgs, " ")) + + cmd := exec.CommandContext(ctx, commandAndArgs[0], commandAndArgs[1:]...) + cmd.Stderr = os.Stderr + cmd.Dir = dir + + b, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("failed to run command %q: %v", strings.Join(commandAndArgs, " "), err) + } + return b, nil +} + +func integrationWithPackageURL(integrationName string) string { + modURL := fmt.Sprintf("github.com/DataDog/dd-trace-go/contrib/%s/v2", integrationName) + return modWithPkgDevURL("contrib/"+integrationName, modURL) +} + +func modWithPkgDevURL(name, modURL string) string { + return fmt.Sprintf("[%s](https://pkg.go.dev/%s)", name, modURL) +} + +func boolToMarkdown(val bool) string { + if val { + return ":white_check_mark:" + } + return " " +} + +func deprecationCommentMarkdown(contribPath string, pkgs map[string]integrationPackage) string { + var entries []struct { + name string + doc string + } + for _, pkg := range pkgs { + if pkg.deprecated { + deprecationDoc := strings.TrimSpace(pkg.deprecationDoc) + if deprecationDoc == "" { + deprecationDoc = "This package is deprecated." + } + entries = append(entries, struct { + name string + doc string + }{path.Join(contribPath, pkg.importPath), deprecationDoc}) + } + } + + sort.Slice(entries, func(i, j int) bool { + return entries[i].name < entries[j].name + }) + + var b strings.Builder + for _, entry := range entries { + fmt.Fprintf(&b, "- `%s`: %s\n", entry.name, entry.doc) + } + return strings.TrimSpace(b.String()) +} diff --git a/scripts/gen_known_metrics.sh b/scripts/gen_known_metrics.sh new file mode 100755 index 0000000000..0750b92813 --- /dev/null +++ b/scripts/gen_known_metrics.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# This script is used to update the json files under ./internal/telemetry/internal/knownmetrics. +# It requires proper Github access to download these files. + +go run github.com/DataDog/dd-trace-go/v2/internal/telemetry/internal/knownmetrics/generator diff --git a/scripts/gencontribs/go.mod b/scripts/gencontribs/go.mod new file mode 100644 index 0000000000..a032101ea1 --- /dev/null +++ b/scripts/gencontribs/go.mod @@ -0,0 +1,3 @@ +module github.com/DataDog/dd-trace-go/scripts/gencontribs + +go 1.24.0 diff --git a/scripts/gencontribs/go.sum b/scripts/gencontribs/go.sum new file mode 100644 index 0000000000..e69de29bb2 diff --git a/scripts/gencontribs/main.go b/scripts/gencontribs/main.go new file mode 100644 index 0000000000..f0e67d21ee --- /dev/null +++ b/scripts/gencontribs/main.go @@ -0,0 +1,185 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +// gencontribs generates the list of third-party libraries from all contrib module dependencies. +// It traverses all contrib subdirectories and runs 'go list -m all' in each to capture all dependencies. +package main + +import ( + "bytes" + "fmt" + "go/format" + "log" + "os" + "os/exec" + "path/filepath" + "sort" + "strings" + "text/template" +) + +const generatedFileTemplate = `// Code generated by gencontribs. DO NOT EDIT. +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016 Datadog, Inc. + +package stacktrace + +// Code generated by github.com/DataDog/dd-trace-go/scripts/gencontribs DO NOT EDIT. + +// generatedThirdPartyLibraries returns the list of third-party libraries +// automatically extracted from all contrib module dependencies. +// +// This list is generated at build time by traversing all contrib directories +// and running 'go list -m all' in each to capture all dependencies. +func generatedThirdPartyLibraries() []string { + return []string{ +{{- range .Libraries}} + "{{.}}", +{{- end}} + } +} +` + +type templateData struct { + Libraries []string +} + +func main() { + if len(os.Args) != 3 { + log.Fatal("Usage: gencontribs ") + } + + projectRoot := os.Args[1] + outputFile := os.Args[2] + + // Extract all third-party libraries using go list + libraries, err := extractAllThirdPartyLibraries(projectRoot) + if err != nil { + log.Fatalf("Failed to extract third-party libraries: %v", err) + } + + // Generate the Go source file + if err := generateSourceFile(outputFile, libraries); err != nil { + log.Fatalf("Failed to generate source file: %v", err) + } + + log.Printf("Generated %s with %d third-party libraries", outputFile, len(libraries)) +} + +func extractAllThirdPartyLibraries(projectRoot string) ([]string, error) { + contribDir := filepath.Join(projectRoot, "contrib") + + // Find all contrib subdirectories that contain go.mod files + contribModules, err := findContribModules(contribDir) + if err != nil { + return nil, fmt.Errorf("failed to find contrib modules: %w", err) + } + + seen := make(map[string]bool) + + // Process each contrib module + for _, moduleDir := range contribModules { + libraries, err := extractFromModule(moduleDir) + if err != nil { + log.Printf("Warning: failed to extract from %s: %v", moduleDir, err) + continue + } + + // Add to our set of libraries + for _, lib := range libraries { + seen[lib] = true + } + } + + // Convert set to sorted slice + var result []string + for lib := range seen { + result = append(result, lib) + } + sort.Strings(result) + + return result, nil +} + +func findContribModules(contribDir string) ([]string, error) { + var modules []string + + err := filepath.Walk(contribDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + if info.Name() == "go.mod" { + modules = append(modules, filepath.Dir(path)) + } + + return nil + }) + + return modules, err +} + +func extractFromModule(moduleDir string) ([]string, error) { + cmd := exec.Command("go", "list", "-m", "-f", "{{.Path}}", "all") + cmd.Dir = moduleDir + output, err := cmd.Output() + if err != nil { + return nil, fmt.Errorf("failed to run go list in %s: %w", moduleDir, err) + } + + var libraries []string + + for _, line := range strings.Split(string(output), "\n") { + path := strings.TrimSpace(line) + if path == "" { + continue + } + + // Skip DataDog internal dependencies + if strings.HasPrefix(path, "github.com/DataDog/") { + continue + } + + // Skip golang.org packages + if strings.HasPrefix(path, "golang.org/") { + continue + } + + libraries = append(libraries, path) + } + + return libraries, nil +} + +func generateSourceFile(outputFile string, libraries []string) error { + tmpl, err := template.New("generated").Parse(generatedFileTemplate) + if err != nil { + return fmt.Errorf("failed to parse template: %w", err) + } + + data := templateData{ + Libraries: libraries, + } + + var buf bytes.Buffer + if err := tmpl.Execute(&buf, data); err != nil { + return fmt.Errorf("failed to execute template: %w", err) + } + + // Format the generated Go code + formatted, err := format.Source(buf.Bytes()) + if err != nil { + return fmt.Errorf("failed to format generated code: %w", err) + } + + // Write to output file + if err := os.WriteFile(outputFile, formatted, 0644); err != nil { + return fmt.Errorf("failed to write output file: %w", err) + } + + return nil +} diff --git a/scripts/generate.sh b/scripts/generate.sh new file mode 100755 index 0000000000..2acf904373 --- /dev/null +++ b/scripts/generate.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +CURRENT_DIR=$(dirname "$0") + +go generate ./... +go generate -C ./internal/orchestrion/_integration ./... +ORCHESTRION_VERSION=$(cat "$CURRENT_DIR/../.orchestrion-version") go generate -C ./orchestrion/all -tags=tools ./... diff --git a/scripts/install_tools.sh b/scripts/install_tools.sh new file mode 100755 index 0000000000..f90b281975 --- /dev/null +++ b/scripts/install_tools.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +set -euo pipefail + +# message: Prints a message to the console with a timestamp and prefix. +message() { + local msg="$1" + printf "\n> %s - %s\n" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$msg" +} + +# run: Runs the tool and fails early if it fails. +run() { + local cmd="$1" + message "Running: $cmd" + if ! eval "$cmd"; then + message "Command failed: $cmd" + exit 1 + fi + message "Command ran successfully: $cmd" +} + +usage() { + cat << EOF +Usage: $(basename "${BASH_SOURCE[0]}") [options] + +Install development tools from _tools/tools.go file. + +Options: + -t, --tools-dir DIR Directory containing tools.go file (default: _tools) + -b, --bin-dir DIR Directory to install tools to (default: bin) + -h, --help Show this help message + +Environment variables: + GOWORK Set to 'off' to disable go.work (default: off) + GOBIN Override binary installation directory + +Examples: + # Install tools to default locations + ./scripts/install_tools.sh + + # Install tools to custom directory + ./scripts/install_tools.sh --bin-dir /usr/local/bin + + # Use custom tools directory + ./scripts/install_tools.sh --tools-dir ./custom-tools --bin-dir ./custom-bin +EOF + exit 0 +} + +# Default values +TOOLS_DIR="_tools" +BIN_DIR="bin" +GOWORK="${GOWORK:-off}" + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + -t | --tools-dir) + TOOLS_DIR="$2" + shift 2 + ;; + -b | --bin-dir) + BIN_DIR="$2" + shift 2 + ;; + -h | --help) + usage + ;; + *) + echo "Error: Unknown argument $1" + usage + ;; + esac +done + +# Validate inputs +if [[ ! -d "$TOOLS_DIR" ]]; then + echo "Error: Tools directory does not exist: $TOOLS_DIR" + exit 1 +fi + +if [[ ! -f "$TOOLS_DIR/tools.go" ]]; then + echo "Error: tools.go file not found in $TOOLS_DIR" + exit 1 +fi + +message "Installing tools from $TOOLS_DIR/tools.go" + +# Create bin directory if it doesn't exist +run "mkdir -p $BIN_DIR" + +# Get absolute paths +TOOLS_DIR_ABS=$(cd "$TOOLS_DIR" && pwd) +BIN_DIR_ABS=$(cd "$BIN_DIR" && pwd 2> /dev/null || echo "$(pwd)/$BIN_DIR") + +# Download dependencies +message "Downloading tool dependencies..." +run "cd \"$TOOLS_DIR_ABS\" && GOWORK=$GOWORK go mod download" + +# Install tools +message "Installing tools to $BIN_DIR_ABS..." +run "cd \"$TOOLS_DIR_ABS\" && GOWORK=$GOWORK GOBIN=\"$BIN_DIR_ABS\" go install \$(grep -E '^[[:space:]]*_[[:space:]]+\".*\"' tools.go | awk -F'\"' '{print \$2}')" + +message "Tools installation completed successfully" +message "Installed tools are available in: $BIN_DIR" diff --git a/scripts/lint.sh b/scripts/lint.sh new file mode 100755 index 0000000000..2c21ecc4f3 --- /dev/null +++ b/scripts/lint.sh @@ -0,0 +1,110 @@ +#!/usr/bin/env bash +set -euo pipefail + +# message: Prints a message to the console with a timestamp and prefix. +message() { + local msg="$1" + printf "\n> %s - %s\n" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$msg" +} + +# run: Runs the tool and fails early if it fails. +run() { + local cmd="$1" + message "Running: $cmd" + if ! eval "$cmd"; then + message "Command failed: $cmd" + exit 1 + fi + message "Command ran successfully: $cmd" +} + +# Default flags +lint_go=false +lint_shell=false +lint_misc=false + +usage() { + cat << EOF +Usage: $(basename "${BASH_SOURCE[0]}") [options] + +Run linters on the codebase. + +Options: + --all Run all linters and install tools + --go Run linters for Go code + --shell Run linters for Shell scripts + --misc Run miscellaneous linters + -t, --tools Install linting tools + -h, --help Show this help message +EOF + exit 0 +} + +lint_go_files() { + message "Linting Go files..." + local gopath_bin + gopath_bin="$(go env GOPATH)/bin" + export PATH="$gopath_bin:$PATH" + run "goimports -e -l -local github.com/DataDog/dd-trace-go/v2 ." + run "golangci-lint run ./..." + run "./scripts/check_locks.sh --ignore-errors ./ddtrace/tracer" +} + +lint_shell_files() { + message "Linting shell scripts..." + run "./scripts/shellcheck.sh" +} + +lint_misc_files() { + message "Running miscellaneous linters..." + run "go run ./scripts/check_copyright.go" +} + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + --all) + lint_go=true + lint_shell=true + shift + ;; + --go) + lint_go=true + shift + ;; + --shell) + lint_shell=true + shift + ;; + --misc) + lint_misc=true + shift + ;; + -h | --help) + usage + ;; + *) + echo "Ignoring unknown argument $1" + shift + ;; + esac +done + +# Default behavior: run linters +if [[ ${lint_go} == false && ${lint_shell} == false && ${lint_misc} == false ]]; then + lint_go=true + lint_shell=true + lint_misc=true +fi + +if [[ ${lint_go} == true ]]; then + lint_go_files +fi + +if [[ ${lint_shell} == true ]]; then + lint_shell_files +fi + +if [[ ${lint_misc} == true ]]; then + lint_misc_files +fi diff --git a/.github/workflows/apps/parse/parse_version.go b/scripts/parseversion/parse_version.go similarity index 93% rename from .github/workflows/apps/parse/parse_version.go rename to scripts/parseversion/parse_version.go index 92eae3d1ce..cfa1f02e0f 100644 --- a/.github/workflows/apps/parse/parse_version.go +++ b/scripts/parseversion/parse_version.go @@ -3,12 +3,15 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2022 Datadog, Inc. +//go:build scripts +// +build scripts + package main import ( "fmt" - "gopkg.in/DataDog/dd-trace-go.v1/internal/version" + "github.com/DataDog/dd-trace-go/v2/internal/version" ) func ghOutput(varName, v string) string { diff --git a/.github/workflows/apps/parse/parse_version_test.go b/scripts/parseversion/parse_version_test.go similarity index 96% rename from .github/workflows/apps/parse/parse_version_test.go rename to scripts/parseversion/parse_version_test.go index a3e12c468b..76904ef05f 100644 --- a/.github/workflows/apps/parse/parse_version_test.go +++ b/scripts/parseversion/parse_version_test.go @@ -3,6 +3,9 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2022 Datadog, Inc. +//go:build scripts +// +build scripts + package main import ( diff --git a/scripts/shellcheck.sh b/scripts/shellcheck.sh new file mode 100755 index 0000000000..ba67a3b3f2 --- /dev/null +++ b/scripts/shellcheck.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +set -euo pipefail + +# Default to scripts/*.sh if no arguments provided +SCRIPTS="${*:-scripts/*.sh}" + +# Check if shellcheck is available locally +if command -v shellcheck > /dev/null 2>&1; then + echo "Using local shellcheck binary" + # shellcheck disable=SC2086 + shellcheck $SCRIPTS +else + echo "Using Docker to run shellcheck" + # shellcheck disable=SC2086 + docker run \ + --rm \ + --volume "$(pwd):/mnt" \ + koalaman/shellcheck:stable $SCRIPTS +fi diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 0000000000..e495c5087f --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +set -euo pipefail + +# message: Prints a message to the console with a timestamp and prefix. +message() { + local msg="$1" + printf "\n> %s - %s\n" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" "$msg" +} + +# run: Runs the tool and fails early if it fails. +run() { + local cmd="$1" + message "Running: $cmd" + if ! eval "$cmd"; then + message "Command failed: $cmd" + exit 1 + fi + message "Command ran successfully: $cmd" +} + +contrib="" +sleeptime=10 +unset INTEGRATION +unset DD_APPSEC_ENABLED + +if [[ "$(uname -s)" = 'Darwin' && "$(uname -m)" = 'arm64' ]]; then + # Needed to run integration tests on Apple Silicon + export DOCKER_DEFAULT_PLATFORM=linux/amd64 +fi + +while [[ $# -gt 0 ]]; do + case $1 in + -a | --appsec) + export DD_APPSEC_ENABLED=true + shift + ;; + -i | --integration) + export INTEGRATION=true + shift + ;; + -c | --contrib) + contrib=true + shift + ;; + --all) + contrib=true + export DD_APPSEC_ENABLED=true + export DD_TEST_APPS_ENABLED=true + export INTEGRATION=true + shift + ;; + -s | --sleep) + sleeptime=$2 + shift + shift + ;; + -h | --help) + echo "test.sh - Run the tests for dd-trace-go" + echo " this script requires gotestsum, goimports, docker and docker-compose." + echo " -a | --appsec - Test with appsec enabled" + echo " -i | --integration - Run integration tests. This requires docker and docker-compose. Resource usage is significant when combined with --contrib" + echo " -c | --contrib - Run contrib tests" + echo " --all - Synonym for -l -a -i -c" + echo " -s | --sleep - The amount of seconds to wait for docker containers to be ready - default: 30 seconds" + echo " -t | --tools - Install gotestsum and goimports" + echo " -h | --help - Print this help message" + exit 0 + ;; + *) + echo "Ignoring unknown argument $1" + shift + ;; + esac +done + +if [[ "$INTEGRATION" != "" ]]; then + ## Make sure we shut down the docker containers on exit. + function finish { + message "Cleaning up..." + docker compose down + } + trap finish EXIT + if [[ "$contrib" != "" ]]; then + ## Start these now so they'll be ready by the time we run integration tests. + docker compose up -d + else + ## If we're not testing contrib, we only need the trace agent. + docker compose up -d datadog-agent + fi +fi + +## CORE +message "Testing core..." +mapfile -t pkg_names < <(go list ./...) +nice -n20 gotestsum --junitfile ./gotestsum-report.xml -- -race -v -coverprofile=core_coverage.txt -covermode=atomic "${pkg_names[@]}" && true + +if [[ "$contrib" != "" ]]; then + ## CONTRIB + message "Testing contrib..." + + if [[ "$INTEGRATION" != "" ]]; then + ## wait for all the docker containers to be "ready" + message "Waiting for docker for ${sleeptime} seconds" + sleep "${sleeptime}" + fi + + find . -mindepth 2 -type f -name go.mod | while read -r go_mod_path; do + dir=$(dirname "$go_mod_path") + [ "$dir" = "./tools/v2fix/_stage" ] && continue + [ "$dir" = "./scripts/autoreleasetagger/testdata/root" ] && continue + [ "$dir" = "./scripts/autoreleasetagger/testdata/root/moduleA" ] && continue + [ "$dir" = "./scripts/autoreleasetagger/testdata/root/moduleB" ] && continue + + cd "$dir" + message "Testing $dir" + mapfile -t pkgs < <(go list ./... | grep -v -e google.golang.org/api) + if [[ ${#pkgs[@]} -eq 0 ]]; then + cd - > /dev/null + continue + fi + pkg_id="${pkgs[0]#github.com/DataDog/dd-trace-go/v2}" + pkg_id="${pkg_id//\//_}" + nice -n20 gotestsum --junitfile "./gotestsum-report.$pkg_id.xml" -- -race -v -coverprofile="contrib_coverage.$pkg_id.txt" -covermode=atomic "${pkgs[@]}" + cd - > /dev/null + done +fi diff --git a/scripts/test_one_by_one.sh b/scripts/test_one_by_one.sh new file mode 100755 index 0000000000..2bfbce8da6 --- /dev/null +++ b/scripts/test_one_by_one.sh @@ -0,0 +1,137 @@ +#!/usr/bin/env bash +set -euxo pipefail + +contrib="" +sleeptime=10 +tools="" +lint="" +INTEGRATION="" +DD_APPSEC_ENABLED="" + +if [[ "$(uname -s)" = 'Darwin' && "$(uname -m)" = 'arm64' ]]; then + # Needed to run integration tests on Apple Silicon + export DOCKER_DEFAULT_PLATFORM=linux/amd64 +fi + +while [[ $# -gt 0 ]]; do + case $1 in + -a | --appsec) + export DD_APPSEC_ENABLED=true + shift + ;; + -i | --integration) + export INTEGRATION=true + shift + ;; + -c | --contrib) + contrib=true + shift + ;; + --all) + contrib=true + lint=true + export DD_APPSEC_ENABLED=true + export DD_TEST_APPS_ENABLED=true + export INTEGRATION=true + shift + ;; + -s | --sleep) + sleeptime=$2 + shift + shift + ;; + -l | --lint) + lint=true + shift + ;; + -t | --tools) + tools=true + shift + ;; + -h | --help) + echo "test.sh - Run the tests for dd-trace-go" + echo " this script requires gotestsum, goimports, docker and docker-compose." + echo " -l | --lint - Run the linter" + echo " -a | --appsec - Test with appsec enabled" + echo " -i | --integration - Run integration tests. This requires docker and docker-compose. Resource usage is significant when combined with --contrib" + echo " -c | --contrib - Run contrib tests" + echo " --all - Synonym for -l -a -i -c" + echo " -s | --sleep - The amount of seconds to wait for docker containers to be ready - default: 30 seconds" + echo " -t | --tools - Install gotestsum and goimports" + echo " -h | --help - Print this help message" + exit 0 + ;; + *) + echo "Ignoring unknown argument $1" + shift + ;; + esac +done + +if [[ -n "$tools" ]]; then + pushd /tmp + SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd) + go -C "${SCRIPT_DIR}/_tools" install golang.org/x/tools/cmd/goimports + go -C "${SCRIPT_DIR}/_tools" install gotest.tools/gotestsum + popd +fi + +if [[ -n "$lint" ]]; then + echo "Running Linter" + goimports -e -l -local github.com/DataDog/dd-trace-go/v2 . +fi + +if [[ "$INTEGRATION" != "" ]]; then + ## Make sure we shut down the docker containers on exit. + function finish { + echo Cleaning up... + docker compose down + } + trap finish EXIT + if [[ "$contrib" != "" ]]; then + ## Start these now so they'll be ready by the time we run integration tests. + docker compose up -d + else + ## If we're not testing contrib, we only need the trace agent. + docker compose up -d datadog-agent + fi +fi + +## CORE +echo testing core +pkg_names=$(go list ./...) +for pkg in $pkg_names; do + echo "Testing package: $pkg" + nice -n20 gotestsum -- -v "$pkg" || echo "Package $pkg failed" +done + +if [[ "$contrib" != "" ]]; then + ## CONTRIB + echo testing contrib + + if [[ "$INTEGRATION" != "" ]]; then + ## wait for all the docker containers to be "ready" + echo "Waiting for docker for ${sleeptime} seconds" + sleep "${sleeptime}" + fi + + find . -mindepth 2 -type f -name go.mod | while read -r go_mod_path; do + dir=$(dirname "$go_mod_path") + [ "$dir" = "./tools/v2fix/_stage" ] && continue + [ "$dir" = "./scripts/autoreleasetagger/testdata/root" ] && continue + [ "$dir" = "./scripts/autoreleasetagger/testdata/root/moduleA" ] && continue + [ "$dir" = "./scripts/autoreleasetagger/testdata/root/moduleB" ] && continue + + cd "$dir" + echo testing "$dir" + mapfile -t pkgs < <(go list ./... | grep -v -e google.golang.org/api) + if [[ ${#pkgs[@]} -eq 0 ]]; then + cd - > /dev/null + continue + fi + pkg_id="${pkgs[0]#github.com/DataDog/dd-trace-go/v2}" + pkg_id="${pkg_id//\//_}" + nice -n20 gotestsum --junitfile "./gotestsum-report.$pkg_id.xml" -- -race -v -coverprofile="contrib_coverage.$pkg_id.txt" -covermode=atomic "${pkgs[@]}" + cd - > /dev/null + done +fi diff --git a/scripts/upgrade_orchestrion.sh b/scripts/upgrade_orchestrion.sh new file mode 100755 index 0000000000..2f139badde --- /dev/null +++ b/scripts/upgrade_orchestrion.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash +# Upgrade the Orchestrion dependency across all configured modules. + +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" + +REQUESTED_VERSION="${1:-}" +if [[ -n "$REQUESTED_VERSION" ]]; then + ORCHESTRION_VERSION="$REQUESTED_VERSION" +else + ORCHESTRION_VERSION="${ORCHESTRION_VERSION:-latest}" +fi + +ORCHESTRION_DIRS="${ORCHESTRION_DIRS:-internal/orchestrion/_integration orchestrion/all}" + +echo "Checking Orchestrion upgrade to ${ORCHESTRION_VERSION}" +TARGET_VERSION="$(cd "$ROOT_DIR" && go list -m "github.com/DataDog/orchestrion@${ORCHESTRION_VERSION}" 2> /dev/null | awk '{print $2}')" +if [[ -z "$TARGET_VERSION" ]]; then + echo "Error: Could not resolve Orchestrion version ${ORCHESTRION_VERSION}" + exit 1 +fi +echo "Target version: ${TARGET_VERSION}" + +NEEDS_UPGRADE=false +for dir in ${ORCHESTRION_DIRS}; do + module_dir="${ROOT_DIR}/${dir}" + if [[ ! -d "$module_dir" ]]; then + echo "${dir}: Directory not found, skipping" + continue + fi + + CURRENT_VERSION="" + if ! CURRENT_VERSION="$(cd "$module_dir" && go list -m github.com/DataDog/orchestrion 2> /dev/null | awk '{print $2}')"; then + CURRENT_VERSION="" + fi + + if [[ "$CURRENT_VERSION" == "$TARGET_VERSION" ]]; then + echo "${dir}: Already at version ${TARGET_VERSION}" + continue + fi + + NEWER="$(printf '%s\n%s\n' "$CURRENT_VERSION" "$TARGET_VERSION" | sort -V | tail -n1)" + if [[ "$NEWER" == "$CURRENT_VERSION" && "$CURRENT_VERSION" != "$TARGET_VERSION" ]]; then + echo "${dir}: Current version ${CURRENT_VERSION} is newer than target ${TARGET_VERSION}, skipping" + continue + fi + + echo "${dir}: Current version ${CURRENT_VERSION} will be upgraded to ${TARGET_VERSION}" + NEEDS_UPGRADE=true +done + +if [[ "$NEEDS_UPGRADE" == "false" ]]; then + echo "All modules already at or newer than target version ${TARGET_VERSION}, skipping upgrade" + exit 0 +fi + +echo "Upgrading Orchestrion to ${TARGET_VERSION}" +for dir in ${ORCHESTRION_DIRS}; do + module_dir="${ROOT_DIR}/${dir}" + if [[ ! -d "$module_dir" ]]; then + continue + fi + + ( + echo "Upgrading Orchestrion in ${dir}" + cd "$module_dir" + go get "github.com/DataDog/orchestrion@${ORCHESTRION_VERSION}" + go mod tidy + go mod verify + echo "Orchestrion upgraded in ${dir}" + ) +done + +make -C "$ROOT_DIR" fix-modules +echo "${TARGET_VERSION}" > "${ROOT_DIR}/.orchestrion-version" +echo "Orchestrion upgrade complete" diff --git a/test.sh b/test.sh deleted file mode 100755 index 5b63e08b55..0000000000 --- a/test.sh +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env bash -set -e - -contrib="" -sleeptime=30 -unset INTEGRATION -unset DD_APPSEC_ENABLED - -if [[ $# -eq 0 ]]; then - echo "Use the -h flag for help" -fi - -if [[ "$(uname -s)" = 'Darwin' && "$(uname -m)" = 'arm64' ]]; then - # Needed to run integration tests on Apple Silicon - export DOCKER_DEFAULT_PLATFORM=linux/amd64 -fi - -while [[ $# -gt 0 ]]; do - case $1 in - -a|--appsec) - export DD_APPSEC_ENABLED=true - shift - ;; - -i|--integration) - export INTEGRATION=true - shift - ;; - -c|--contrib) - contrib=true - shift - ;; - --all) - contrib=true - export DD_APPSEC_ENABLED=true - export INTEGRATION=true - shift - ;; - -s|--sleep) - sleeptime=$2 - shift - shift - ;; - -l|--lint) - lint=true - shift - ;; - -t|--tools) - tools=true - shift - ;; - -h|--help) - echo "test.sh - Run the tests for dd-trace-go" - echo " this script requires gotestsum, goimports, docker and docker-compose." - echo " -l | --lint - Run the linter" - echo " -a | --appsec - Test with appsec enabled" - echo " -i | --integration - Run integration tests. This requires docker and docker-compose. Resource usage is significant when combined with --contrib" - echo " -c | --contrib - Run contrib tests" - echo " --all - Synonym for -l -a -i -c" - echo " -s | --sleep - The amount of seconds to wait for docker containers to be ready - default: 30 seconds" - echo " -t | --tools - Install gotestsum and goimports" - echo " -h | --help - Print this help message" - exit 0 - ;; - *) - echo "Ignoring unknown argument $1" - shift - ;; - esac -done - -if [[ ! -z "$tools" ]]; then - pushd /tmp - go install golang.org/x/tools/cmd/goimports@latest - go install gotest.tools/gotestsum@latest - popd -fi - -if [[ ! -z "$lint" ]]; then - echo "Running Linter" - goimports -e -l -local gopkg.in/DataDog/dd-trace-go.v1 . -fi - -if [[ "$INTEGRATION" != "" ]]; then - ## Make sure we shut down the docker containers on exit. - function finish { - echo Cleaning up... - docker-compose down - } - trap finish EXIT - if [[ "$contrib" != "" ]]; then - ## Start these now so they'll be ready by the time we run integration tests. - docker-compose up -d - else - ## If we're not testing contrib, we only need the trace agent. - docker-compose up -d datadog-agent - fi -fi - -## CORE -echo testing core -PACKAGE_NAMES=$(go list ./... | grep -v /contrib/) -nice -n20 gotestsum --junitfile ./gotestsum-report.xml -- -race -v -coverprofile=core_coverage.txt -covermode=atomic $PACKAGE_NAMES - -if [[ "$contrib" != "" ]]; then - ## CONTRIB - echo testing contrib - - if [[ "$INTEGRATION" != "" ]]; then - ## wait for all the docker containers to be "ready" - echo Waiting for docker for $sleeptime seconds - sleep $sleeptime - fi - - PACKAGE_NAMES=$(go list ./contrib/... | grep -v -e google.golang.org/api) - nice -n20 gotestsum --junitfile ./gotestsum-report.xml -- -race -v -coverprofile=contrib_coverage.txt -covermode=atomic $PACKAGE_NAMES -fi diff --git a/tools/v2fix/README.md b/tools/v2fix/README.md new file mode 100644 index 0000000000..be265907e9 --- /dev/null +++ b/tools/v2fix/README.md @@ -0,0 +1,26 @@ +# v2 Migration Tool + +## Features +The migration tool will help developers to upgrade your tracing code from `dd-trace-go` version v1.x to v2.0.0. By running this tool, you will be able to make quick fixes for multiple changes described in [our documentation](../../MIGRATING.md) in a best-effort basis. Some changes cannot be fully automated, please use this for your gradual code repair efforts. + +## Running the Tool + +Use the migration tool by running: + +``` +go install github.com/DataDog/dd-trace-go/tools/v2fix@latest +# In your repository's directory +v2fix . +``` + +In order to apply all suggested fixes, run: + +``` +v2fix -fix . +``` + +## Further Reading +For more information about migrating to `v2`, go to: + +* [Migration documentation](../../MIGRATING.md) +* [Official documentation](https://docs.datadoghq.com/tracing/trace_collection/custom_instrumentation/go/migration/) diff --git a/tools/v2fix/_stage/ddtracetypes/ddtracetypes.go b/tools/v2fix/_stage/ddtracetypes/ddtracetypes.go new file mode 100644 index 0000000000..950531cb2f --- /dev/null +++ b/tools/v2fix/_stage/ddtracetypes/ddtracetypes.go @@ -0,0 +1,30 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "time" + + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" +) + +func main() { + var ( + _ ddtrace.FinishConfig // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.FinishOption // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.Logger // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.Span // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.SpanContext + _ ddtrace.SpanLink // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.StartSpanConfig // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.StartSpanOption // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.Tracer // want `the declared type is in the ddtrace/tracer package now` + _ time.Time + ) +} + +func spanConsumer(_ ddtrace.Span) { // want `the declared type is in the ddtrace/tracer package now` +} diff --git a/tools/v2fix/_stage/ddtracetypes/ddtracetypes.go.golden b/tools/v2fix/_stage/ddtracetypes/ddtracetypes.go.golden new file mode 100644 index 0000000000..4f7b605ce2 --- /dev/null +++ b/tools/v2fix/_stage/ddtracetypes/ddtracetypes.go.golden @@ -0,0 +1,31 @@ +-- the declared type is in the ddtrace/tracer package now -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "time" + + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" +) + +func main() { + var ( + _ tracer.FinishConfig // want `the declared type is in the ddtrace/tracer package now` + _ tracer.FinishOption // want `the declared type is in the ddtrace/tracer package now` + _ tracer.Logger // want `the declared type is in the ddtrace/tracer package now` + _ tracer.Span // want `the declared type is in the ddtrace/tracer package now` + _ ddtrace.SpanContext + _ tracer.SpanLink // want `the declared type is in the ddtrace/tracer package now` + _ tracer.StartSpanConfig // want `the declared type is in the ddtrace/tracer package now` + _ tracer.StartSpanOption // want `the declared type is in the ddtrace/tracer package now` + _ tracer.Tracer // want `the declared type is in the ddtrace/tracer package now` + _ time.Time + ) +} + +func spanConsumer(_ tracer.Span) { // want `the declared type is in the ddtrace/tracer package now` +} diff --git a/tools/v2fix/_stage/go.mod b/tools/v2fix/_stage/go.mod new file mode 100644 index 0000000000..fe4faae69d --- /dev/null +++ b/tools/v2fix/_stage/go.mod @@ -0,0 +1,93 @@ +module github.com/DataDog/dd-trace-go/tools/v2fix/_stage + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.4.0-dev + gopkg.in/DataDog/dd-trace-go.v1 v1.74.7-rc.2 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.71.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.6.1 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.8 // indirect + github.com/DataDog/go-tuf v1.1.1-0.5.2 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/minio/simdjson-go v0.4.5 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f // indirect + github.com/stretchr/testify v1.11.1 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.39.0 // indirect + go.opentelemetry.io/collector/featuregate v1.39.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.133.0 // indirect + go.opentelemetry.io/collector/pdata v1.39.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 // indirect + go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel/log v0.13.0 // indirect + go.opentelemetry.io/otel/metric v1.37.0 // indirect + go.opentelemetry.io/otel/sdk v1.37.0 // indirect + go.opentelemetry.io/otel/trace v1.37.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/net v0.46.0 // indirect + golang.org/x/sys v0.37.0 // indirect + golang.org/x/text v0.30.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) + +replace github.com/DataDog/dd-trace-go/v2 => ../../.. diff --git a/tools/v2fix/_stage/go.sum b/tools/v2fix/_stage/go.sum new file mode 100644 index 0000000000..471991c4bd --- /dev/null +++ b/tools/v2fix/_stage/go.sum @@ -0,0 +1,313 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0 h1:xjmjXOsiLfUF1wWXYXc8Gg6M7Jbz6a7FtqbnvGKfTvA= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.71.0/go.mod h1:y05SPqKEtrigKul+JBVM69ehv3lOgyKwrUIwLugoaSI= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0 h1:jX8qS7CkNzL1fdcDptrOkbWpsRFTQ58ICjp/mj02u1k= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.71.0/go.mod h1:B3T0If+WdWAwPMpawjm1lieJyqSI0v04dQZHq15WGxY= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0 h1:bowQteds9+7I4Dd+CsBRVXdlMOOGuBm5zdUQdB/6j1M= +github.com/DataDog/datadog-agent/pkg/opentelemetry-mapping-go/otlp/attributes v0.71.0/go.mod h1:XeZj0IgsiL3vgeEGTucf61JvJRh1LxWMUbZA/XJsPD0= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0 h1:YTwecwy8kF1zsL2HK6KVa7XLRZYZ0Ypb2anlG0zDLeE= +github.com/DataDog/datadog-agent/pkg/proto v0.71.0/go.mod h1:KSn4jt3CykV6CT1C8Rknn/Nj3E+VYHK/UDWolg/+kzw= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1 h1:fVqr9ApWmUMEExmgn8iFPfwm9ZrlEfFWgTKp1IcNH18= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.73.0-rc.1/go.mod h1:lwkSvCXABHXyqy6mG9WBU6MTK9/E0i0R8JVApUtT+XA= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0 h1:9UrKHDacMlAWfP2wpSxrZOQbtkwLY2AOAjYgGkgM96Y= +github.com/DataDog/datadog-agent/pkg/trace v0.71.0/go.mod h1:wfVwOlKORIB4IB1vdncTuCTx/OrVU69TLBIiBpewe1Q= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0 h1:VJ+nm5E0+UdLPkg2H7FKapx0syNcKzCFXA2vfcHz0Bc= +github.com/DataDog/datadog-agent/pkg/util/log v0.71.0/go.mod h1:oG6f6Qe23zPTLOVh0nXjlIXohrjUGXeFjh7S3Na/WyU= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0 h1:lA3CL+2yHU9gulyR/C0VssVzmvCs/jCHzt+CBs9uH4Q= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.71.0/go.mod h1:/JHi9UFqdFYy/SFmFozY26dNOl/ODVLSQaF1LKDPiBI= +github.com/DataDog/datadog-agent/pkg/version v0.71.0 h1:jqkKmhFrhHSLpiC3twQFDCXU7nyFcC1EnwagDQxFWVs= +github.com/DataDog/datadog-agent/pkg/version v0.71.0/go.mod h1:FYj51C1ib86rpr5tlLEep9jitqvljIJ5Uz2rrimGTeY= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/go-libddwaf/v4 v4.6.1 h1:wGUioRkQ2a5MYr2wTn5uZfMENbLV4uKXrkr6zCVInCs= +github.com/DataDog/go-libddwaf/v4 v4.6.1/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.8 h1:ku9DpghFHeyyviR28W/3R4cCJwzpsuC08YIoltnx5ds= +github.com/DataDog/go-sqllexer v0.1.8/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.1-0.5.2 h1:YWvghV4ZvrQsPcUw8IOUMSDpqc3W5ruOIC+KJxPknv0= +github.com/DataDog/go-tuf v1.1.1-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= +github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= +github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/minio/simdjson-go v0.4.5 h1:r4IQwjRGmWCQ2VeMc7fGiilu1z5du0gJ/I/FsKwgo5A= +github.com/minio/simdjson-go v0.4.5/go.mod h1:eoNz0DcLQRyEDeaPr4Ru6JpjlZPzbA0IodxVJk8lO8E= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0 h1:iPei+89a2EK4LuN4HeIRzZNE6XxCyrKfBKG3BkK/ViU= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.133.0/go.mod h1:asV77TgnGfc7A+a9jggdsnlLlW5dnJT8RroVuf5slko= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0 h1:4ca2pM3+xDMB9H3UnhjAiNg7EpIydZ7HdohOexU8xb8= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.133.0/go.mod h1:3N2Saf55l9vrxjbf3KCEcBjbLHDZtbN4nPcxREztpPU= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f h1:S+PHRM3lk96X0/cGEGUukqltzkX/ekUx0F9DoCGK1G0= +github.com/shirou/gopsutil/v4 v4.25.8-0.20250809033336-ffcdc2b7662f/go.mod h1:4f4j4w8HLMPWEFs3BO2UBBLigKAaWYwkSkbIt/6Q4Ss= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.39.0 h1:GJw80zXURBG4h0sh97bPLEn2Ra+NAWUpskaooA0wru4= +go.opentelemetry.io/collector/component v1.39.0/go.mod h1:NPaMPTLQuxm5QaaWdqkxYKztC0bRdV+86Q9ir7xS/2k= +go.opentelemetry.io/collector/component/componentstatus v0.133.0 h1:fIcFKg+yPhpvOJKeMph9TtSC4DIGdIuNmxvUB0UGcoc= +go.opentelemetry.io/collector/component/componentstatus v0.133.0/go.mod h1:biQWms9cgXSZu3nb92Z0bA9uHh9lEhgmQ8CF4HLmu8Y= +go.opentelemetry.io/collector/component/componenttest v0.133.0 h1:mg54QqXC+GNqLHa9y6Efh3X5Di4XivjgJr6mzvfVQR8= +go.opentelemetry.io/collector/component/componenttest v0.133.0/go.mod h1:E+oqRK03WjG/b1aX1pd0CfTKh12MPTKbEBaBROp4w0M= +go.opentelemetry.io/collector/consumer v1.39.0 h1:Jc6la3uacHbznX5ORmh16Nddh23ZxBzoiNF2L0wD2Ks= +go.opentelemetry.io/collector/consumer v1.39.0/go.mod h1:tW2BXyntjvlKrRc+mwistt1KuC/b4mTfTkc8zWjeeRY= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0 h1:MteqaGpgmHVHFqnB7A2voGleA2j51qJyVfX5x/wm+8I= +go.opentelemetry.io/collector/consumer/consumertest v0.133.0/go.mod h1:vHGknLn/RRUcMQuuBDt+SgrpDN46DBJyqRnWXm3gLwY= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0 h1:Xx4Yna/We4qDlbAla1nfxgkvujzWRuR8bqqwsLLvYSg= +go.opentelemetry.io/collector/consumer/xconsumer v0.133.0/go.mod h1:he874Md/0uAS2Fs+TDHAy10OBLRSw8233LdREizVvG4= +go.opentelemetry.io/collector/featuregate v1.39.0 h1:OlXZWW+WUP8cgKh2mnwgWXUJO/29irb0hG6jvwscRKM= +go.opentelemetry.io/collector/featuregate v1.39.0/go.mod h1:A72x92glpH3zxekaUybml1vMSv94BH6jQRn5+/htcjw= +go.opentelemetry.io/collector/internal/telemetry v0.133.0 h1:YxbckZC9HniNOZgnSofTOe0AB/bEsmISNdQeS+3CU3o= +go.opentelemetry.io/collector/internal/telemetry v0.133.0/go.mod h1:akUK7X6ZQ+CbbCjyXLv9y/EHt5jIy+J+nGoLvndZN14= +go.opentelemetry.io/collector/pdata v1.39.0 h1:jr0f033o57Hpbj2Il8M15tPbvrOgY/Aoc+/+sxzhSFU= +go.opentelemetry.io/collector/pdata v1.39.0/go.mod h1:jmolu6zwqNaq8qJ4IgCpNWBEwJNPLE1qqOz9GnpqxME= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0 h1:ewFYqV2FU4D0ixTdkJueaI2JGCoeiIJisX8EdHejDi8= +go.opentelemetry.io/collector/pdata/pprofile v0.133.0/go.mod h1:5l4/B0iCxzoVkA7eOLzIHV0AUEO2IKypTHTLq9JKsHs= +go.opentelemetry.io/collector/pdata/testdata v0.133.0 h1:K0q47qecWVJf0sWbeWfifbJ72TiqR+A2PCsMkCEKvus= +go.opentelemetry.io/collector/pdata/testdata v0.133.0/go.mod h1:/emFpIox/mi7FucvsSn54KsiMh/iy7BUviqgURNVT6U= +go.opentelemetry.io/collector/pipeline v1.39.0 h1:CcEn30qdoHEzehFxgx0Ma0pWYGhrrIkRkcu218NG4V4= +go.opentelemetry.io/collector/pipeline v1.39.0/go.mod h1:NdM+ZqkPe9KahtOXG28RHTRQu4m/FD1i3Ew4qCRdOr8= +go.opentelemetry.io/collector/processor v1.39.0 h1:QwPJxJnFZwojo09Vfnvph7A27TauxxvA1koO6nr87O8= +go.opentelemetry.io/collector/processor v1.39.0/go.mod h1:WQWZqKmrlJcLjirnQOULxYgWV6h5oxK6FQNiFgw53i8= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0 h1:3w/wvSmzyCvyNXjUQihH/VLQ+Tnzn3MlQNbv1AEoXiU= +go.opentelemetry.io/collector/processor/processorhelper v0.133.0/go.mod h1:lTlC8tGOBqkpdwGXCmaDnWXc2jqIrRUKvV7eK26Thc4= +go.opentelemetry.io/collector/processor/processortest v0.133.0 h1:PAuOr8Pwj/LAuey2LW1fix0vvnE+WwGpSF7bghaxjEE= +go.opentelemetry.io/collector/processor/processortest v0.133.0/go.mod h1:fEhWs9DCe431+iFke1WmlxqjcRDN25GLRXdktKAPyw8= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0 h1:V5YMrXUgClh3awWOdigGXHxvq/Ira2wLDj4DJLqB+Eo= +go.opentelemetry.io/collector/processor/xprocessor v0.133.0/go.mod h1:5gDFI+pGIzoFQeBUM4QZ4E0B+SaU0e+2V7Td+ONoU4M= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0 h1:FGre0nZh5BSw7G73VpT3xs38HchsfPsa2aZtMp0NPOs= +go.opentelemetry.io/contrib/bridges/otelzap v0.12.0/go.mod h1:X2PYPViI2wTPIMIOBjG17KNybTzsrATnvPJ02kkz7LM= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls= +go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E= +go.opentelemetry.io/otel/log/logtest v0.13.0 h1:xxaIcgoEEtnwdgj6D6Uo9K/Dynz9jqIxSDu2YObJ69Q= +go.opentelemetry.io/otel/log/logtest v0.13.0/go.mod h1:+OrkmsAH38b+ygyag1tLjSFMYiES5UHggzrtY1IIEA8= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/proto/slim/otlp v1.7.1 h1:lZ11gEokjIWYM3JWOUrIILr2wcf6RX+rq5SPObV9oyc= +go.opentelemetry.io/proto/slim/otlp v1.7.1/go.mod h1:uZ6LJWa49eNM/EXnnvJGTTu8miokU8RQdnO980LJ57g= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1 h1:Tr/eXq6N7ZFjN+THBF/BtGLUz8dciA7cuzGRsCEkZ88= +go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.0.1/go.mod h1:riqUmAOJFDFuIAzZu/3V6cOrTyfWzpgNJnG5UwrapCk= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1 h1:z/oMlrCv3Kopwh/dtdRagJy+qsRRPA86/Ux3g7+zFXM= +go.opentelemetry.io/proto/slim/otlp/profiles/v1development v0.0.1/go.mod h1:C7EHYSIiaALi9RnNORCVaPCQDuJgJEn/XxkctaTez1E= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.43.0 h1:dduJYIi3A3KOfdGOHX8AVZ/jGiyPa3IbBozJ5kNuE04= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.46.0 h1:giFlY12I07fugqwPuWJi68oOnpfqFnJIJzaIIm2JVV4= +golang.org/x/net v0.46.0/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= +golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1:pFyd6EwwL2TqFf8emdthzeX+gZE1ElRq3iM8pui4KBY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= +google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/DataDog/dd-trace-go.v1 v1.74.7-rc.2 h1:xYpqXOkPegtYZucMSz+jDG4F2CT4PrqHlLA3CuH8gjw= +gopkg.in/DataDog/dd-trace-go.v1 v1.74.7-rc.2/go.mod h1:jNdrW+vNYpiGHwlkQcvZnV8hMxKobruRlvqEXzXZRxQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/tools/v2fix/_stage/samplingrules/samplingrules.go b/tools/v2fix/_stage/samplingrules/samplingrules.go new file mode 100644 index 0000000000..9a84928632 --- /dev/null +++ b/tools/v2fix/_stage/samplingrules/samplingrules.go @@ -0,0 +1,30 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func tags() map[string]string { + return map[string]string{"hostname": "hn-*", "another": "value"} +} + +func main() { + _ = tracer.ServiceRule("test-service", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.NameRule("http.request", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.NameServiceRule("http.request", "test-service", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.NameServiceRule("http.*", "test-*", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.ServiceRule("other-service-1", 0.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.ServiceRule("other-service-2", 0.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.ServiceRule("test-service", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TagsResourceRule(tags(), "", "", "", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TagsResourceRule(map[string]string{"hostname": "hn-3*"}, "res-1*", "", "", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TagsResourceRule(map[string]string{"hostname": "hn-*"}, "", "", "", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.SpanNameServiceMPSRule("http.request", "test-service", 1.0, 2.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.SpanTagsResourceRule(tags(), "", "", "", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.SpanNameServiceRule("http.request", "test-service", 1.0) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` +} diff --git a/tools/v2fix/_stage/samplingrules/samplingrules.go.golden b/tools/v2fix/_stage/samplingrules/samplingrules.go.golden new file mode 100644 index 0000000000..c7a58311e3 --- /dev/null +++ b/tools/v2fix/_stage/samplingrules/samplingrules.go.golden @@ -0,0 +1,31 @@ +-- a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func tags() map[string]string { + return map[string]string{"hostname": "hn-*", "another": "value"} +} + +func main() { + _ = tracer.TraceSamplingRules(Rule{ServiceGlob: "test-service", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{NameGlob: "http.request", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{NameGlob: "http.request", ServiceGlob: "test-service", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{NameGlob: "http.*", ServiceGlob: "test-*", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{ServiceGlob: "other-service-1", Rate: 0.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{ServiceGlob: "other-service-2", Rate: 0.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{ServiceGlob: "test-service", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{Tags: tags(), ResourceGlob: "", NameGlob: "", ServiceGlob: "", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-3*"}, ResourceGlob: "res-1*", NameGlob: "", ServiceGlob: "", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.TraceSamplingRules(Rule{Tags: map[string]string{"hostname": "hn-*"}, ResourceGlob: "", NameGlob: "", ServiceGlob: "", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.SpanSamplingRules(Rule{NameGlob: "http.request", ServiceGlob: "test-service", Rate: 1.0, MaxPerSecond: 2.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.SpanSamplingRules(Rule{Tags: tags(), ResourceGlob: "", NameGlob: "", ServiceGlob: "", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` + _ = tracer.SpanSamplingRules(Rule{NameGlob: "http.request", ServiceGlob: "test-service", Rate: 1.0}) // want `a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal` +} diff --git a/tools/v2fix/_stage/traceidstring/traceidstring.go b/tools/v2fix/_stage/traceidstring/traceidstring.go new file mode 100644 index 0000000000..f8a495afd7 --- /dev/null +++ b/tools/v2fix/_stage/traceidstring/traceidstring.go @@ -0,0 +1,20 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "fmt" + + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + tracer.Start(tracer.WithService("service")) + defer tracer.Stop() + + sp := tracer.StartSpan("opname") + fmt.Printf("traceID: %d\n", sp.Context().TraceID()) // want `trace IDs are now represented as strings, please use TraceIDLower to keep using 64-bits IDs, although it's recommended to switch to 128-bits with TraceID` +} diff --git a/tools/v2fix/_stage/traceidstring/traceidstring.go.golden b/tools/v2fix/_stage/traceidstring/traceidstring.go.golden new file mode 100644 index 0000000000..1baf85b73f --- /dev/null +++ b/tools/v2fix/_stage/traceidstring/traceidstring.go.golden @@ -0,0 +1,21 @@ +-- trace IDs are now represented as strings, please use TraceIDLower to keep using 64-bits IDs, although it's recommended to switch to 128-bits with TraceID -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "fmt" + + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + tracer.Start(tracer.WithService("service")) + defer tracer.Stop() + + sp := tracer.StartSpan("opname") + fmt.Printf("traceID: %d\n", sp.Context().TraceIDLower()) // want `trace IDs are now represented as strings, please use TraceIDLower to keep using 64-bits IDs, although it's recommended to switch to 128-bits with TraceID` +} diff --git a/tools/v2fix/_stage/tracerstructs/tracerstructs.go b/tools/v2fix/_stage/tracerstructs/tracerstructs.go new file mode 100644 index 0000000000..f9b1db1978 --- /dev/null +++ b/tools/v2fix/_stage/tracerstructs/tracerstructs.go @@ -0,0 +1,21 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func main() { + var ( + _ tracer.Span // want `the declared type is now a struct, you need to use a pointer` + _ tracer.SpanContext // want `the declared type is now a struct, you need to use a pointer` + _ tracer.SpanLink + ) +} + +func spanConsumer(_ tracer.Span) { // want `the declared type is now a struct, you need to use a pointer` +} diff --git a/tools/v2fix/_stage/tracerstructs/tracerstructs.go.golden b/tools/v2fix/_stage/tracerstructs/tracerstructs.go.golden new file mode 100644 index 0000000000..a27f9f2e0c --- /dev/null +++ b/tools/v2fix/_stage/tracerstructs/tracerstructs.go.golden @@ -0,0 +1,22 @@ +-- the declared type is now a struct, you need to use a pointer -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" +) + +func main() { + var ( + _ *tracer.Span // want `the declared type is now a struct, you need to use a pointer` + _ *tracer.SpanContext // want `the declared type is now a struct, you need to use a pointer` + _ tracer.SpanLink + ) +} + +func spanConsumer(_ *tracer.Span) { // want `the declared type is now a struct, you need to use a pointer` +} diff --git a/tools/v2fix/_stage/v1importurl/v1importurl.go b/tools/v2fix/_stage/v1importurl/v1importurl.go new file mode 100644 index 0000000000..729982eb20 --- /dev/null +++ b/tools/v2fix/_stage/v1importurl/v1importurl.go @@ -0,0 +1,19 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" // want `import URL needs to be updated` + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" // want `import URL needs to be updated` +) + +func main() { + tracer.Start() + defer tracer.Stop() + + span := tracer.StartSpan("operation", tracer.Tag(ext.SpanType, "test")) + defer span.Finish() +} diff --git a/tools/v2fix/_stage/v1importurl/v1importurl.go.golden b/tools/v2fix/_stage/v1importurl/v1importurl.go.golden new file mode 100644 index 0000000000..d878bee8f2 --- /dev/null +++ b/tools/v2fix/_stage/v1importurl/v1importurl.go.golden @@ -0,0 +1,20 @@ +-- update import URL to v2 -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "github.com/DataDog/dd-trace-go/v2/ddtrace/ext" // want `import URL needs to be updated` + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" // want `import URL needs to be updated` +) + +func main() { + tracer.Start() + defer tracer.Stop() + + span := tracer.StartSpan("operation", tracer.Tag(ext.SpanType, "test")) + defer span.Finish() +} diff --git a/tools/v2fix/_stage/v1usage/v1usage.go b/tools/v2fix/_stage/v1usage/v1usage.go new file mode 100644 index 0000000000..3556200567 --- /dev/null +++ b/tools/v2fix/_stage/v1usage/v1usage.go @@ -0,0 +1,56 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "fmt" + "log" + "os" + + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + // Start the tracer and defer the Stop method. + tracer.Start( // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.Start` + tracer.WithAgentAddr("host:port"), // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.WithAgentAddr` + ) + defer tracer.Stop() // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.Stop` + + // Start a root span. + span := tracer.StartSpan("get.data") // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.StartSpan` + defer span.Finish() // want `\(gopkg.in/DataDog/dd-trace-go.v1/ddtrace.Span\).Finish` + + // Create a child of it, computing the time needed to read a file. + child := tracer.StartSpan( // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.StartSpan` + "read.file", + tracer.ChildOf( // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.ChildOf` + span.Context(), // want `\(gopkg.in/DataDog/dd-trace-go.v1/ddtrace.Span\).Context` + ), + ) + child.SetTag(ext.ResourceName, "test.json") // want `\(gopkg.in/DataDog/dd-trace-go.v1/ddtrace.Span\).SetTag` + + // If you are using 128 bit trace ids and want to generate the high + // order bits, cast the span's context to ddtrace.SpanContextW3C. + // See Issue #1677 + if w3Cctx, ok := child.Context().(ddtrace.SpanContextW3C); ok { // want `\(gopkg.in/DataDog/dd-trace-go.v1/ddtrace.Span\).Context` + fmt.Printf("128 bit trace id = %s\n", w3Cctx.TraceID128()) // want `\(gopkg.in/DataDog/dd-trace-go.v1/ddtrace.SpanContextW3C\).TraceID128` + } + + // Perform an operation. + _, err := os.ReadFile("~/test.json") + + // We may finish the child span using the returned error. If it's + // nil, it will be disregarded. + child.Finish( // want `\(gopkg.in/DataDog/dd-trace-go.v1/ddtrace.Span\).Finish` + tracer.WithError(err), // want `gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer.WithError` + ) + if err != nil { + log.Fatal(err) + } +} diff --git a/tools/v2fix/_stage/withdogstatsdaddr/withdogstatsdaddr.go b/tools/v2fix/_stage/withdogstatsdaddr/withdogstatsdaddr.go new file mode 100644 index 0000000000..486e9b22f6 --- /dev/null +++ b/tools/v2fix/_stage/withdogstatsdaddr/withdogstatsdaddr.go @@ -0,0 +1,15 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + ddtrace "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + ddtrace.Start(ddtrace.WithDogstatsdAddress("localhost:8125")) // want `the function WithDogstatsdAddress is no longer supported. Use WithDogstatsdAddr instead` + ddtrace.Stop() +} diff --git a/tools/v2fix/_stage/withdogstatsdaddr/withdogstatsdaddr.go.golden b/tools/v2fix/_stage/withdogstatsdaddr/withdogstatsdaddr.go.golden new file mode 100644 index 0000000000..e8cb85ce27 --- /dev/null +++ b/tools/v2fix/_stage/withdogstatsdaddr/withdogstatsdaddr.go.golden @@ -0,0 +1,16 @@ +-- the function WithDogstatsdAddress is no longer supported. Use WithDogstatsdAddr instead -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + ddtrace "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + ddtrace.Start(ddtrace.WithDogstatsdAddr("localhost:8125")) // want `the function WithDogstatsdAddress is no longer supported. Use WithDogstatsdAddr instead` + ddtrace.Stop() +} diff --git a/tools/v2fix/_stage/withservicename/withservicename.go b/tools/v2fix/_stage/withservicename/withservicename.go new file mode 100644 index 0000000000..12bce2f011 --- /dev/null +++ b/tools/v2fix/_stage/withservicename/withservicename.go @@ -0,0 +1,15 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + tracer.Start(tracer.WithServiceName("service")) // want `the function WithServiceName is no longer supported. Use WithService instead` + tracer.Stop() +} diff --git a/tools/v2fix/_stage/withservicename/withservicename.go.golden b/tools/v2fix/_stage/withservicename/withservicename.go.golden new file mode 100644 index 0000000000..95e1fd4150 --- /dev/null +++ b/tools/v2fix/_stage/withservicename/withservicename.go.golden @@ -0,0 +1,16 @@ +-- the function WithServiceName is no longer supported. Use WithService instead -- +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2024 Datadog, Inc. + +package main + +import ( + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" +) + +func main() { + tracer.Start(tracer.WithService("service")) // want `the function WithServiceName is no longer supported. Use WithService instead` + tracer.Stop() +} diff --git a/tools/v2fix/go.mod b/tools/v2fix/go.mod new file mode 100644 index 0000000000..46dac72d3d --- /dev/null +++ b/tools/v2fix/go.mod @@ -0,0 +1,86 @@ +module github.com/DataDog/dd-trace-go/tools/v2fix + +go 1.24.0 + +require ( + github.com/DataDog/dd-trace-go/v2 v2.3.0-rc.2 + golang.org/x/tools v0.34.0 + gopkg.in/DataDog/dd-trace-go.v1 v1.74.7-rc.2 +) + +require ( + github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.67.0 // indirect + github.com/DataDog/datadog-agent/pkg/obfuscate v0.67.0 // indirect + github.com/DataDog/datadog-agent/pkg/proto v0.67.0 // indirect + github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.69.0 // indirect + github.com/DataDog/datadog-agent/pkg/trace v0.67.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/log v0.67.0 // indirect + github.com/DataDog/datadog-agent/pkg/util/scrubber v0.67.0 // indirect + github.com/DataDog/datadog-agent/pkg/version v0.67.0 // indirect + github.com/DataDog/datadog-go/v5 v5.6.0 // indirect + github.com/DataDog/go-libddwaf/v4 v4.3.2 // indirect + github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 // indirect + github.com/DataDog/go-sqllexer v0.1.6 // indirect + github.com/DataDog/go-tuf v1.1.0-0.5.2 // indirect + github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.27.0 // indirect + github.com/DataDog/sketches-go v1.4.7 // indirect + github.com/Masterminds/semver/v3 v3.3.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.8.4 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-viper/mapstructure/v2 v2.4.0 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/hashicorp/go-version v1.7.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/outcaste-io/ristretto v0.2.3 // indirect + github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect + github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect + github.com/secure-systems-lab/go-securesystemslib v0.9.0 // indirect + github.com/shirou/gopsutil/v4 v4.25.5 // indirect + github.com/theckman/httpforwarded v0.4.0 // indirect + github.com/tinylib/msgp v1.2.5 // indirect + github.com/tklauser/go-sysconf v0.3.15 // indirect + github.com/tklauser/numcpus v0.10.0 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/collector/component v1.31.0 // indirect + go.opentelemetry.io/collector/featuregate v1.31.0 // indirect + go.opentelemetry.io/collector/internal/telemetry v0.125.0 // indirect + go.opentelemetry.io/collector/pdata v1.31.0 // indirect + go.opentelemetry.io/collector/semconv v0.125.0 // indirect + go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 // indirect + go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel/log v0.11.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/sdk v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect + go.uber.org/atomic v1.11.0 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.0 // indirect + golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/net v0.41.0 // indirect + golang.org/x/sync v0.15.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/text v0.26.0 // indirect + golang.org/x/time v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect + google.golang.org/grpc v1.73.0-dev // indirect + google.golang.org/protobuf v1.36.6 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/tools/v2fix/go.sum b/tools/v2fix/go.sum new file mode 100644 index 0000000000..ac7ca7dec8 --- /dev/null +++ b/tools/v2fix/go.sum @@ -0,0 +1,302 @@ +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.67.0 h1:2mEwRWvhIPHMPK4CMD8iKbsrYBxeMBSuuCXumQAwShU= +github.com/DataDog/datadog-agent/comp/core/tagger/origindetection v0.67.0/go.mod h1:ejJHsyJTG7NU6c6TDbF7dmckD3g+AUGSdiSXy+ZyaCE= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.67.0 h1:NcvyDVIUA0NbBDbp7QJnsYhoBv548g8bXq886795mCQ= +github.com/DataDog/datadog-agent/pkg/obfuscate v0.67.0/go.mod h1:1oPcs3BUTQhiTkmk789rb7ob105MxNV6OuBa28BdukQ= +github.com/DataDog/datadog-agent/pkg/proto v0.67.0 h1:7dO6mKYRb7qSiXEu7Q2mfeKbhp4hykCAULy4BfMPmsQ= +github.com/DataDog/datadog-agent/pkg/proto v0.67.0/go.mod h1:bKVXB7pxBg0wqXF6YSJ+KU6PeCWKDyJj83kUH1ab+7o= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.69.0 h1:/DsN4R+IkC6t1+4cHSfkxzLtDl84rBbPC5Wa9srBAoM= +github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.69.0/go.mod h1:Th2LD/IGid5Rza55pzqGu6nUdOv/Rts6wPwLjTyOSTs= +github.com/DataDog/datadog-agent/pkg/trace v0.67.0 h1:dqt+/nObo0JKyaEqIMZgfqGZbx9TfEHpCkrjQ/zzH7k= +github.com/DataDog/datadog-agent/pkg/trace v0.67.0/go.mod h1:zmZoEtKvOnaKHbJGBKH3a4xuyPrSfBaF0ZE3Q3rCoDw= +github.com/DataDog/datadog-agent/pkg/util/log v0.67.0 h1:xrH15QNqeJZkYoXYi44VCIvGvTwlQ3z2iT2QVTGiT7s= +github.com/DataDog/datadog-agent/pkg/util/log v0.67.0/go.mod h1:dfVLR+euzEyg1CeiExgJQq1c1dod42S6IeiRPj8H7Yk= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.67.0 h1:aIWF85OKxXGo7rVyqJ7jm7lm2qCQrgyXzYyFuw0T2EQ= +github.com/DataDog/datadog-agent/pkg/util/scrubber v0.67.0/go.mod h1:Lfap5FuM4b/Pw9IrTuAvWBWZEmXOvZhCya3dYv4G8O0= +github.com/DataDog/datadog-agent/pkg/version v0.67.0 h1:TB8H8r+laB1Qdttvvc6XJVyLGxp8E6j2f2Mh5IPbYmQ= +github.com/DataDog/datadog-agent/pkg/version v0.67.0/go.mod h1:kvAw/WbI7qLAsDI2wHabZfM7Cv2zraD3JA3323GEB+8= +github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw= +github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/DataDog/dd-trace-go/v2 v2.3.0-rc.2 h1:YFB2AegunYOGsgWTXVY8Z6ORuiU/GLVWTheMDXh+8cw= +github.com/DataDog/dd-trace-go/v2 v2.3.0-rc.2/go.mod h1:gtac0BEnFnpwQWFw10sslSDeh7avl7m10frK3XlZAtk= +github.com/DataDog/go-libddwaf/v4 v4.3.2 h1:YGvW2Of1C4e1yU+p7iibmhN2zEOgi9XEchbhQjBxb/A= +github.com/DataDog/go-libddwaf/v4 v4.3.2/go.mod h1:/AZqP6zw3qGJK5mLrA0PkfK3UQDk1zCI2fUNCt4xftE= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633 h1:ZRLR9Lbym748e8RznWzmSoK+OfV+8qW6SdNYA4/IqdA= +github.com/DataDog/go-runtime-metrics-internal v0.0.4-0.20250721125240-fdf1ef85b633/go.mod h1:YFoTl1xsMzdSRFIu33oCSPS/3+HZAPGpO3oOM96wXCM= +github.com/DataDog/go-sqllexer v0.1.6 h1:skEXpWEVCpeZFIiydoIa2f2rf+ymNpjiIMqpW4w3YAk= +github.com/DataDog/go-sqllexer v0.1.6/go.mod h1:GGpo1h9/BVSN+6NJKaEcJ9Jn44Hqc63Rakeb+24Mjgo= +github.com/DataDog/go-tuf v1.1.0-0.5.2 h1:4CagiIekonLSfL8GMHRHcHudo1fQnxELS9g4tiAupQ4= +github.com/DataDog/go-tuf v1.1.0-0.5.2/go.mod h1:zBcq6f654iVqmkk8n2Cx81E1JnNTMOAx1UEO/wZR+P0= +github.com/DataDog/gostackparse v0.7.0 h1:i7dLkXHvYzHV308hnkvVGDL3BR4FWl7IsXNPz/IGQh4= +github.com/DataDog/gostackparse v0.7.0/go.mod h1:lTfqcJKqS9KnXQGnyQMCugq3u1FP6UZMfWR0aitKFMM= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.27.0 h1:5US5SqqhfkZkg/E64uvn7YmeTwnudJHtlPEH/LOT99w= +github.com/DataDog/opentelemetry-mapping-go/pkg/otlp/attributes v0.27.0/go.mod h1:VRo4D6rj92AExpVBlq3Gcuol9Nm1bber12KyxRjKGWw= +github.com/DataDog/sketches-go v1.4.7 h1:eHs5/0i2Sdf20Zkj0udVFWuCrXGRFig2Dcfm5rtcTxc= +github.com/DataDog/sketches-go v1.4.7/go.mod h1:eAmQ/EBmtSO+nQp7IZMZVRPT4BQTmIc5RZQ+deGlTPM= +github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4= +github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= +github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da h1:aIftn67I1fkbMa512G+w+Pxci9hJPB8oMnkcP3iZF38= +github.com/dgryski/go-farm v0.0.0-20240924180020-3414d57e47da/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw= +github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= +github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= +github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= +github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY= +github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 h1:PpXWgLPs+Fqr325bN2FD2ISlRRztXibcX6e8f5FR5Dc= +github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.125.0 h1:0dOJCEtabevxxDQmxed69oMzSw+gb3ErCnFwFYZFu0M= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/sampling v0.125.0/go.mod h1:QwzQhtxPThXMUDW1XRXNQ+l0GrI2BRsvNhX6ZuKyAds= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.125.0 h1:F68/Nbpcvo3JZpaWlRUDJtG7xs8FHBZ7A8GOMauDkyc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/probabilisticsamplerprocessor v0.125.0/go.mod h1:haO4cJtAk05Y0p7NO9ME660xxtSh54ifCIIT7+PO9C0= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +github.com/outcaste-io/ristretto v0.2.3 h1:AK4zt/fJ76kjlYObOeNwh4T3asEuaCmp26pOvUOL9w0= +github.com/outcaste-io/ristretto v0.2.3/go.mod h1:W8HywhmtlopSB1jeMg3JtdIhf+DYkLAr0VN/s4+MHac= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY= +github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= +github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3 h1:4+LEVOB87y175cLJC/mbsgKmoDOjrBldtXvioEy96WY= +github.com/richardartoul/molecule v1.0.1-0.20240531184615-7ca0df43c0b3/go.mod h1:vl5+MqJ1nBINuSsUI2mGgH79UweUT/B5Fy8857PqyyI= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0 h1:rf1HIbL64nUpEIZnjLZ3mcNEL9NBPB0iuVjyxvq3LZc= +github.com/secure-systems-lab/go-securesystemslib v0.9.0/go.mod h1:DVHKMcZ+V4/woA/peqr+L0joiRXbPpQ042GgJckkFgw= +github.com/shirou/gopsutil/v4 v4.25.5 h1:rtd9piuSMGeU8g1RMXjZs9y9luK5BwtnG7dZaQUJAsc= +github.com/shirou/gopsutil/v4 v4.25.5/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/theckman/httpforwarded v0.4.0 h1:N55vGJT+6ojTnLY3LQCNliJC4TW0P0Pkeys1G1WpX2w= +github.com/theckman/httpforwarded v0.4.0/go.mod h1:GVkFynv6FJreNbgH/bpOU9ITDZ7a5WuzdNCtIMI1pVI= +github.com/tinylib/msgp v1.2.5 h1:WeQg1whrXRFiZusidTQqzETkRpGjFjcIhW6uqWH09po= +github.com/tinylib/msgp v1.2.5/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= +github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4= +github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4= +github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso= +github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ= +github.com/vmihailenco/msgpack/v4 v4.3.13 h1:A2wsiTbvp63ilDaWmsk2wjx6xZdxQOvpiNlKBGKKXKI= +github.com/vmihailenco/msgpack/v4 v4.3.13/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= +github.com/vmihailenco/tagparser v0.1.2/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/collector/component v1.31.0 h1:9LzU8X1RhV3h8/QsAoTX23aFUfoJ3EUc9O/vK+hFpSI= +go.opentelemetry.io/collector/component v1.31.0/go.mod h1:JbZl/KywXJxpUXPbt96qlEXJSym1zQ2hauMxYMuvlxM= +go.opentelemetry.io/collector/component/componentstatus v0.125.0 h1:zlxGQZYd9kknRZSjRpOYW5SBjl0a5zYFYRPbreobXoU= +go.opentelemetry.io/collector/component/componentstatus v0.125.0/go.mod h1:bHXc2W8bqqo9adOvCgvhcO7pYzJOSpyV4cuQ1wiIl04= +go.opentelemetry.io/collector/component/componenttest v0.125.0 h1:E2mpnMQbkMpYoZ3Q8pHx4kod7kedjwRs1xqDpzCe/84= +go.opentelemetry.io/collector/component/componenttest v0.125.0/go.mod h1:pQtsE1u/SPZdTphP5BZP64XbjXSq6wc+mDut5Ws/JDI= +go.opentelemetry.io/collector/consumer v1.31.0 h1:L+y66ywxLHnAxnUxv0JDwUf5bFj53kMxCCyEfRKlM7s= +go.opentelemetry.io/collector/consumer v1.31.0/go.mod h1:rPsqy5ni+c6xNMUkOChleZYO/nInVY6eaBNZ1FmWJVk= +go.opentelemetry.io/collector/consumer/consumertest v0.125.0 h1:TUkxomGS4DAtjBvcWQd2UY4FDLLEKMQD6iOIDUr/5dM= +go.opentelemetry.io/collector/consumer/consumertest v0.125.0/go.mod h1:vkHf3y85cFLDHARO/cTREVjLjOPAV+cQg7lkC44DWOY= +go.opentelemetry.io/collector/consumer/xconsumer v0.125.0 h1:oTreUlk1KpMSWwuHFnstW+orrjGTyvs2xd3o/Dpy+hI= +go.opentelemetry.io/collector/consumer/xconsumer v0.125.0/go.mod h1:FX0G37r0W+wXRgxxFtwEJ4rlsCB+p0cIaxtU3C4hskw= +go.opentelemetry.io/collector/featuregate v1.31.0 h1:20q7plPQZwmAiaYAa6l1m/i2qDITZuWlhjr4EkmeQls= +go.opentelemetry.io/collector/featuregate v1.31.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/internal/telemetry v0.125.0 h1:6lcGOxw3dAg7LfXTKdN8ZjR+l7KvzLdEiPMhhLwG4r4= +go.opentelemetry.io/collector/internal/telemetry v0.125.0/go.mod h1:5GyFslLqjZgq1DZTtFiluxYhhXrCofHgOOOybodDPGE= +go.opentelemetry.io/collector/pdata v1.31.0 h1:P5WuLr1l2JcIvr6Dw2hl01ltp2ZafPnC4Isv+BLTBqU= +go.opentelemetry.io/collector/pdata v1.31.0/go.mod h1:m41io9nWpy7aCm/uD1L9QcKiZwOP0ldj83JEA34dmlk= +go.opentelemetry.io/collector/pdata/pprofile v0.125.0 h1:Qqlx8w1HpiYZ9RQqjmMQIysI0cHNO1nh3E/fCTeFysA= +go.opentelemetry.io/collector/pdata/pprofile v0.125.0/go.mod h1:p/yK023VxAp8hm27/1G5DPTcMIpnJy3cHGAFUQZGyaQ= +go.opentelemetry.io/collector/pdata/testdata v0.125.0 h1:due1Hl0EEVRVwfCkiamRy5E8lS6yalv0lo8Zl/SJtGw= +go.opentelemetry.io/collector/pdata/testdata v0.125.0/go.mod h1:1GpEWlgdMrd+fWsBk37ZC2YmOP5YU3gFQ4rWuCu9g24= +go.opentelemetry.io/collector/pipeline v0.125.0 h1:oitBgcAFqntDB4ihQJUHJSQ8IHqKFpPkaTVbTYdIUzM= +go.opentelemetry.io/collector/pipeline v0.125.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/processor v1.31.0 h1:+u7sBUpnCBsHYoALp4hfr9VEjLHHYa4uKENGITe0K9Q= +go.opentelemetry.io/collector/processor v1.31.0/go.mod h1:5hDYJ7/hTdfd2tF2Rj5Hs6+mfyFz2O7CaPzVvW1qHQc= +go.opentelemetry.io/collector/processor/processorhelper v0.125.0 h1:QRpX7oFW88DAZhy+Q93npklRoaQr8ue0GKpeup7C/Fk= +go.opentelemetry.io/collector/processor/processorhelper v0.125.0/go.mod h1:oXRvslUuN62wErcoJrcEJYoTXu5wHyNyJsE+/a9Cc9s= +go.opentelemetry.io/collector/processor/processortest v0.125.0 h1:ZVAN4iZPDcWhpzKqnuok2NIuS5hwGVVQUOWkJFR12tA= +go.opentelemetry.io/collector/processor/processortest v0.125.0/go.mod h1:VAw0IRG35cWTBjBtreXeXJEgqkRegfjrH/EuLhNX2+I= +go.opentelemetry.io/collector/processor/xprocessor v0.125.0 h1:VWYPMW1VmDq6xB7M5SYjBpQCCIq3MhQ3W++wU47QpZM= +go.opentelemetry.io/collector/processor/xprocessor v0.125.0/go.mod h1:bCxUyFVlksANg8wjYZqWVsRB33lkLQ294rTrju/IZiM= +go.opentelemetry.io/collector/semconv v0.125.0 h1:SyRP617YGvNSWRSKMy7Lbk9RaJSR+qFAAfyxJOeZe4s= +go.opentelemetry.io/collector/semconv v0.125.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/log v0.11.0 h1:c24Hrlk5WJ8JWcwbQxdBqxZdOK7PcP/LFtOtwpDTe3Y= +go.opentelemetry.io/otel/log v0.11.0/go.mod h1:U/sxQ83FPmT29trrifhQg+Zj2lo1/IPN1PF6RTFqdwc= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= +go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs= +go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY= +go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= +go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= +go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= +go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 h1:bsqhLWFR6G6xiQcb+JoGqdKdRU6WzPWmK8E0jxTjzo4= +golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= +golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= +golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= +google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.73.0-dev h1:LQabkmbwor6quamIuIobJnhV/D5wpyxlgZSAHuS29Vk= +google.golang.org/grpc v1.73.0-dev/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +gopkg.in/DataDog/dd-trace-go.v1 v1.74.7-rc.2 h1:xYpqXOkPegtYZucMSz+jDG4F2CT4PrqHlLA3CuH8gjw= +gopkg.in/DataDog/dd-trace-go.v1 v1.74.7-rc.2/go.mod h1:jNdrW+vNYpiGHwlkQcvZnV8hMxKobruRlvqEXzXZRxQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= +k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= diff --git a/tools/v2fix/main.go b/tools/v2fix/main.go new file mode 100644 index 0000000000..d8645cf087 --- /dev/null +++ b/tools/v2fix/main.go @@ -0,0 +1,24 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package main + +import ( + "github.com/DataDog/dd-trace-go/tools/v2fix/v2fix" + "golang.org/x/tools/go/analysis/singlechecker" +) + +func main() { + c := v2fix.NewChecker( + &v2fix.V1ImportURL{}, + &v2fix.DDTraceTypes{}, + &v2fix.TracerStructs{}, + &v2fix.TraceIDString{}, + &v2fix.WithServiceName{}, + &v2fix.WithDogstatsdAddr{}, + &v2fix.DeprecatedSamplingRules{}, + ) + c.Run(singlechecker.Main) +} diff --git a/tools/v2fix/v2fix/context.go b/tools/v2fix/v2fix/context.go new file mode 100644 index 0000000000..99a74f150b --- /dev/null +++ b/tools/v2fix/v2fix/context.go @@ -0,0 +1,21 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package v2fix + +type contextKey string + +const ( + argsKey contextKey = "args" + declaredTypeKey contextKey = "declared_type" + endKey contextKey = "end" + fnKey contextKey = "fn" + pkgNameKey contextKey = "pkg_name" + pkgPrefixKey contextKey = "pkg_prefix" + pkgPathKey contextKey = "pkg_path" + posKey contextKey = "pos" + typeKey contextKey = "type" + callExprKey contextKey = "call_expr" +) diff --git a/tools/v2fix/v2fix/known_change.go b/tools/v2fix/v2fix/known_change.go new file mode 100644 index 0000000000..6433646383 --- /dev/null +++ b/tools/v2fix/v2fix/known_change.go @@ -0,0 +1,498 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package v2fix + +import ( + "bytes" + "context" + "fmt" + "go/ast" + "go/token" + "go/types" + "strings" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/tracer" + "golang.org/x/tools/go/analysis" + "gopkg.in/DataDog/dd-trace-go.v1/ddtrace" +) + +// KnownChange models code expressions that must be changed to migrate to v2. +// It is defined by a set of probes that must be true to report the analyzed expression. +// It also contains a message function that returns a string describing the change. +// The probes are evaluated in order, and the first one that returns false +// will cause the expression to be ignored. +// A probe can store information in the context, which is available to the following ones. +// It is possible to declare fixes that will be suggested to the user or applied automatically. +type KnownChange interface { + fmt.Stringer + + // Context returns the context associated with the known change. + Context() context.Context + + // Fixes returns a list of fixes that can be applied to the analyzed expression. + Fixes() []analysis.SuggestedFix + + // Probes returns a list of probes that must be true to report the analyzed expression. + Probes() []Probe + + // SetContext updates the context with the given value. + SetContext(context.Context) + + // SetNode updates the node with the given value. + SetNode(ast.Node) +} + +type contextHandler struct { + ctx context.Context +} + +func (c contextHandler) Context() context.Context { + if c.ctx == nil { + c.ctx = context.Background() + } + return c.ctx +} + +func (c *contextHandler) SetContext(ctx context.Context) { + c.ctx = ctx +} + +type nodeHandler struct { + node ast.Node +} + +func (n *nodeHandler) SetNode(node ast.Node) { + n.node = node +} + +type defaultKnownChange struct { + contextHandler + nodeHandler +} + +func (d defaultKnownChange) End() token.Pos { + end, ok := d.ctx.Value(endKey).(token.Pos) + if ok { + return end + } + if d.node == nil { + return token.NoPos + } + return d.node.End() +} + +func (d defaultKnownChange) Pos() token.Pos { + pos, ok := d.ctx.Value(posKey).(token.Pos) + if ok { + return pos + } + if d.node == nil { + return token.NoPos + } + return d.node.Pos() +} + +func eval(k KnownChange, n ast.Node, pass *analysis.Pass) bool { + for _, p := range k.Probes() { + ctx, ok := p(k.Context(), n, pass) + if !ok { + return false + } + k.SetContext(ctx) + } + k.SetNode(n) + return true +} + +type V1ImportURL struct { + defaultKnownChange +} + +func (c V1ImportURL) Fixes() []analysis.SuggestedFix { + path := c.ctx.Value(pkgPathKey).(string) + if path == "" { + return nil + } + path = strings.Replace(path, "gopkg.in/DataDog/dd-trace-go.v1", "github.com/DataDog/dd-trace-go/v2", 1) + return []analysis.SuggestedFix{ + { + Message: "update import URL to v2", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(fmt.Sprintf("%q", path)), + }, + }, + }, + } +} + +func (V1ImportURL) Probes() []Probe { + return []Probe{ + IsImport, + HasPackagePrefix("gopkg.in/DataDog/dd-trace-go.v1/"), + } +} + +func (V1ImportURL) String() string { + return "import URL needs to be updated" +} + +type DDTraceTypes struct { + defaultKnownChange +} + +func (c DDTraceTypes) Fixes() []analysis.SuggestedFix { + typ, ok := c.ctx.Value(declaredTypeKey).(*types.Named) + if !ok { + return nil + } + + pkg, ok := c.ctx.Value(pkgPrefixKey).(string) + if !ok { + return nil + } + + newText := fmt.Sprintf("%s.%s", pkg, typ.Obj().Name()) + return []analysis.SuggestedFix{ + { + Message: "the declared type is in the ddtrace/tracer package now", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(newText), + }, + }, + }, + } +} + +func (DDTraceTypes) Probes() []Probe { + return []Probe{ + Or( + // TODO: add this in a types registration function used to + // filter by, reduce iterations, and drop some probes. + Is[*ast.ValueSpec], + Is[*ast.Field], + ), + ImportedFrom("gopkg.in/DataDog/dd-trace-go.v1"), + Not(DeclaresType[ddtrace.SpanContext]()), + } +} + +func (DDTraceTypes) String() string { + return "the declared type is in the ddtrace/tracer package now" +} + +type TracerStructs struct { + defaultKnownChange +} + +func (c TracerStructs) Fixes() []analysis.SuggestedFix { + typ, ok := c.ctx.Value(declaredTypeKey).(*types.Named) + if !ok { + return nil + } + typeDecl := fmt.Sprintf("%s.%s", typ.Obj().Pkg().Name(), typ.Obj().Name()) + return []analysis.SuggestedFix{ + { + Message: "the declared type is now a struct, you need to use a pointer", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(fmt.Sprintf("*%s", typeDecl)), + }, + }, + }, + } +} + +func (TracerStructs) Probes() []Probe { + return []Probe{ + Or( + Is[*ast.ValueSpec], + Is[*ast.Field], + ), + Or( + DeclaresType[tracer.Span](), + DeclaresType[tracer.SpanContext](), + ), + } +} + +func (TracerStructs) String() string { + return "the declared type is now a struct, you need to use a pointer" +} + +type WithServiceName struct { + defaultKnownChange +} + +func (c WithServiceName) Fixes() []analysis.SuggestedFix { + args, ok := c.ctx.Value(argsKey).([]ast.Expr) + if !ok || args == nil { + return nil + } + + pkg, ok := c.ctx.Value(pkgPrefixKey).(string) + if !ok { + return nil + } + + return []analysis.SuggestedFix{ + { + Message: "the function WithServiceName is no longer supported. Use WithService instead", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(fmt.Sprintf("%s.WithService(%s)", pkg, exprString(args[0]))), + }, + }, + }, + } +} + +func (c WithServiceName) Probes() []Probe { + return []Probe{ + IsFuncCall, + WithFunctionName("WithServiceName"), + } +} + +func (c WithServiceName) String() string { + return "the function WithServiceName is no longer supported. Use WithService instead" +} + +type TraceIDString struct { + defaultKnownChange +} + +func (c TraceIDString) Fixes() []analysis.SuggestedFix { + fn, ok := c.ctx.Value(fnKey).(*types.Func) + if !ok || fn == nil { + return nil + } + + callExpr, ok := c.ctx.Value(callExprKey).(*ast.CallExpr) + if !ok { + return nil + } + + return []analysis.SuggestedFix{ + { + Message: "trace IDs are now represented as strings, please use TraceIDLower to keep using 64-bits IDs, although it's recommended to switch to 128-bits with TraceID", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(fmt.Sprintf("%s.TraceIDLower()", exprString(callExpr.Fun.(*ast.SelectorExpr).X))), + }, + }, + }, + } +} + +func (c TraceIDString) Probes() []Probe { + return []Probe{ + IsFuncCall, + WithFunctionName("TraceID"), + } +} + +func (c TraceIDString) String() string { + return "trace IDs are now represented as strings, please use TraceIDLower to keep using 64-bits IDs, although it's recommended to switch to 128-bits with TraceID" +} + +type WithDogstatsdAddr struct { + defaultKnownChange +} + +func (c WithDogstatsdAddr) Fixes() []analysis.SuggestedFix { + args, ok := c.ctx.Value(argsKey).([]ast.Expr) + if !ok || args == nil { + return nil + } + + pkg, ok := c.ctx.Value(pkgPrefixKey).(string) + if !ok { + return nil + } + + return []analysis.SuggestedFix{ + { + Message: "the function WithDogstatsdAddress is no longer supported. Use WithDogstatsdAddr instead", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(fmt.Sprintf("%s.WithDogstatsdAddr(%s)", pkg, exprString(args[0]))), + }, + }, + }, + } +} + +func (c WithDogstatsdAddr) Probes() []Probe { + return []Probe{ + IsFuncCall, + WithFunctionName("WithDogstatsdAddress"), + } +} + +func (c WithDogstatsdAddr) String() string { + return "the function WithDogstatsdAddress is no longer supported. Use WithDogstatsdAddr instead" +} + +// DeprecatedSamplingRules handles the transformation of v1 sampling rule +// constructor functions to v2 tracer.Rule struct literals. +type DeprecatedSamplingRules struct { + defaultKnownChange +} + +func (c DeprecatedSamplingRules) Probes() []Probe { + return []Probe{ + IsFuncCall, + Or( + WithFunctionName("ServiceRule"), // Sets funcNameKey + WithFunctionName("NameRule"), + WithFunctionName("NameServiceRule"), + WithFunctionName("TagsResourceRule"), + WithFunctionName("SpanNameServiceRule"), + WithFunctionName("SpanNameServiceMPSRule"), + WithFunctionName("SpanTagsResourceRule"), + ), + } +} + +func (c DeprecatedSamplingRules) Fixes() []analysis.SuggestedFix { + fn, ok := c.ctx.Value(fnKey).(*types.Func) + if !ok || fn == nil { + return nil + } + + args, ok := c.ctx.Value(argsKey).([]ast.Expr) + if !ok { + return nil + } + + pkg, ok := c.ctx.Value(pkgPrefixKey).(string) + if !ok { + return nil + } + + var parts []string + + switch fn.Name() { + case "ServiceRule": + service := args[0] + rate := args[1] + parts = append(parts, fmt.Sprintf("ServiceGlob: %s", exprString(service))) + parts = append(parts, fmt.Sprintf("Rate: %s", exprString(rate))) + case "NameRule": + name := args[0] + rate := args[1] + parts = append(parts, fmt.Sprintf("NameGlob: %s", exprString(name))) + parts = append(parts, fmt.Sprintf("Rate: %s", exprString(rate))) + case "NameServiceRule", "SpanNameServiceRule": + name := args[0] + service := args[1] + rate := args[2] + parts = append(parts, fmt.Sprintf("NameGlob: %s", exprString(name))) + parts = append(parts, fmt.Sprintf("ServiceGlob: %s", exprString(service))) + parts = append(parts, fmt.Sprintf("Rate: %s", exprString(rate))) + case "SpanNameServiceMPSRule": + name := args[0] + service := args[1] + rate := args[2] + limit := args[3] + parts = append(parts, fmt.Sprintf("NameGlob: %s", exprString(name))) + parts = append(parts, fmt.Sprintf("ServiceGlob: %s", exprString(service))) + parts = append(parts, fmt.Sprintf("Rate: %s", exprString(rate))) + parts = append(parts, fmt.Sprintf("MaxPerSecond: %s", exprString(limit))) + case "TagsResourceRule", "SpanTagsResourceRule": + tags := args[0] + resource := args[1] + name := args[2] + service := args[3] + rate := args[4] + parts = append(parts, fmt.Sprintf("Tags: %s", exprString(tags))) + parts = append(parts, fmt.Sprintf("ResourceGlob: %s", exprString(resource))) + parts = append(parts, fmt.Sprintf("NameGlob: %s", exprString(name))) + parts = append(parts, fmt.Sprintf("ServiceGlob: %s", exprString(service))) + parts = append(parts, fmt.Sprintf("Rate: %s", exprString(rate))) + } + + var ruleType string + switch fn.Name() { + case "SpanNameServiceMPSRule", "SpanTagsResourceRule", "SpanNameServiceRule": + ruleType = "Span" + default: + ruleType = "Trace" + } + + newText := fmt.Sprintf("%s.%sSamplingRules(Rule{%s})", pkg, ruleType, strings.Join(parts, ", ")) + + return []analysis.SuggestedFix{ + { + Message: "a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal", + TextEdits: []analysis.TextEdit{ + { + Pos: c.Pos(), + End: c.End(), + NewText: []byte(newText), + }, + }, + }, + } +} + +func (c DeprecatedSamplingRules) String() string { + return "a deprecated sampling rule constructor function should be replaced with a tracer.Rule{...} struct literal" +} + +func exprListString(exprs []ast.Expr) string { + var buf bytes.Buffer + for _, expr := range exprs { + buf.WriteString(exprString(expr)) + } + return buf.String() +} + +func exprCompositeString(expr *ast.CompositeLit) string { + var buf bytes.Buffer + buf.WriteString(exprString(expr.Type)) + buf.WriteString("{") + for _, expr := range expr.Elts { + buf.WriteString(exprString(expr)) + buf.WriteString(",") + } + buf.WriteString("}") + return buf.String() +} + +func exprString(expr ast.Expr) string { + switch expr := expr.(type) { + case *ast.SelectorExpr: + return exprString(expr.X) + "." + exprString(expr.Sel) + case *ast.CompositeLit: + return exprCompositeString(expr) + case *ast.KeyValueExpr: + return exprString(expr.Key) + ":" + exprString(expr.Value) + case *ast.MapType: + return "map[" + exprString(expr.Key) + "]" + exprString(expr.Value) + case *ast.BasicLit: + return expr.Value + case *ast.Ident: + return expr.Name + case *ast.CallExpr: + return exprString(expr.Fun) + "(" + exprListString(expr.Args) + ")" + } + return "" +} diff --git a/tools/v2fix/v2fix/probe.go b/tools/v2fix/v2fix/probe.go new file mode 100644 index 0000000000..7bbaed2629 --- /dev/null +++ b/tools/v2fix/v2fix/probe.go @@ -0,0 +1,220 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package v2fix + +import ( + "context" + "go/ast" + "go/types" + "reflect" + "strings" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/types/typeutil" +) + +type Probe func(context.Context, ast.Node, *analysis.Pass) (context.Context, bool) + +// DeclaresType returns true if the node declares a type of the given generic type. +// The type use in the generic signature is stored in the context as "type". +// The reflected type is stored in the context as "declared_type". +func DeclaresType[T any]() Probe { + return func(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + var ( + obj types.Object + typ = ctx.Value(typeKey) + typDecl ast.Expr + ) + switch typ { + case "*ast.ValueSpec": + spec := n.(*ast.ValueSpec) + if len(spec.Names) == 0 { + return ctx, false + } + obj = pass.TypesInfo.ObjectOf(spec.Names[0]) + typDecl = spec.Type + case "*ast.Field": + field := n.(*ast.Field) + if len(field.Names) == 0 { + return ctx, false + } + obj = pass.TypesInfo.ObjectOf(field.Names[0]) + typDecl = field.Type + default: + return ctx, false + } + if typDecl == nil { + return ctx, false + } + t, ok := obj.Type().(*types.Named) + if !ok { + return ctx, false + } + // We need to store the reflected type unconditionally + // to be able to introspect it later, even if the probe + // fails or is combined with Not. + ctx = context.WithValue(ctx, declaredTypeKey, t) + ctx = context.WithValue(ctx, posKey, typDecl.Pos()) + ctx = context.WithValue(ctx, endKey, typDecl.End()) + v := new(T) + e := reflect.TypeOf(v).Elem() + if t.Obj().Pkg() == nil { + return ctx, false + } + ctx = context.WithValue(ctx, pkgNameKey, t.Obj().Pkg().Name()) + if t.Obj().Pkg().Path() != e.PkgPath() { + return ctx, false + } + if t.Obj().Name() != e.Name() { + return ctx, false + } + return ctx, true + } +} + +// Is returns true if the node is of type T. +// The type use in the generic signature is stored in the context as "type". +func Is[T any](ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + v, ok := n.(T) + if !ok { + return ctx, false + } + ctx = context.WithValue(ctx, typeKey, reflect.TypeOf(v).String()) + return ctx, true +} + +// IsFuncCall returns true if the node is a function call. +// The function call expression is stored in the context as "fn". +// The package path of the function is stored as "pkg_path". +// The parameters of the function are stored as "args". +func IsFuncCall(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + c, ok := n.(*ast.CallExpr) + if !ok { + return ctx, false + } + callee := typeutil.Callee(pass.TypesInfo, c) + if callee == nil { + return ctx, false + } + fn, ok := callee.(*types.Func) + if !ok { + return ctx, false + } + ctx = context.WithValue(ctx, callExprKey, c) + ctx = context.WithValue(ctx, fnKey, fn) + ctx = context.WithValue(ctx, argsKey, c.Args) + pkg := fn.Pkg() + if pkg == nil { + // It could be a built-in function, in which case + // we don't know the package path. + return ctx, true + } + ctx = context.WithValue(ctx, pkgPathKey, pkg.Path()) + sel, ok := c.Fun.(*ast.SelectorExpr) + if !ok { + // It might be a non-selector expression, in which case we don't know the package prefix. + return ctx, true + } + ident, ok := sel.X.(*ast.Ident) + if !ok { + // It might be a non-selector expression, in which case we don't know the package prefix. + return ctx, true + } + ctx = context.WithValue(ctx, pkgPrefixKey, ident.Name) + return ctx, true +} + +// IsImport returns true if the node is an import statement. +// The import path is stored in the context as "pkg_path". +func IsImport(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + imp, ok := n.(*ast.ImportSpec) + if !ok { + return ctx, false + } + path := strings.Trim(imp.Path.Value, `"`) + ctx = context.WithValue(ctx, pkgPathKey, path) + return ctx, true +} + +// HasPackagePrefix returns true if the selector expression has a package prefix. +// The package path is expected in the context as "pkg_path". +func HasPackagePrefix(prefix string) Probe { + return func(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + pkgPath, ok := ctx.Value(pkgPathKey).(string) + if !ok { + return ctx, false + } + return ctx, strings.HasPrefix(pkgPath, prefix) + } +} + +// ImportedFrom returns true if the value is imported from the given package path prefix. +func ImportedFrom(pkgPath string) Probe { + return func(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + var ( + obj types.Object + typ = ctx.Value(typeKey) + ) + switch typ { + case "*ast.ValueSpec": + spec := n.(*ast.ValueSpec) + if len(spec.Names) == 0 { + return ctx, false + } + obj = pass.TypesInfo.ObjectOf(spec.Names[0]) + case "*ast.Field": + field := n.(*ast.Field) + if len(field.Names) == 0 { + return ctx, false + } + obj = pass.TypesInfo.ObjectOf(field.Names[0]) + default: + return ctx, false + } + t, ok := obj.Type().(*types.Named) + if !ok { + return ctx, false + } + if t.Obj().Pkg() == nil { + return ctx, false + } + if !strings.HasPrefix(t.Obj().Pkg().Path(), pkgPath) { + return ctx, false + } + return ctx, true + } +} + +func WithFunctionName(name string) Probe { + return func(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + fn, ok := ctx.Value(fnKey).(*types.Func) + if !ok { + return ctx, false + } + return ctx, fn.Name() == name + } +} + +// Not returns the inverse of the given probe. +func Not(p Probe) Probe { + return func(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + ctx, ok := p(ctx, n, pass) + return ctx, !ok + } +} + +// Or returns a probe that is true if at least one of the given probes is true. +func Or(ps ...Probe) Probe { + return func(ctx context.Context, n ast.Node, pass *analysis.Pass) (context.Context, bool) { + for _, p := range ps { + ctx, ok := p(ctx, n, pass) + if ok { + return ctx, true + } + } + return ctx, false + } +} diff --git a/tools/v2fix/v2fix/v2fix.go b/tools/v2fix/v2fix/v2fix.go new file mode 100644 index 0000000000..96645e5009 --- /dev/null +++ b/tools/v2fix/v2fix/v2fix.go @@ -0,0 +1,77 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package v2fix + +import ( + "errors" + "go/ast" + "log" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/ast/inspector" +) + +type Checker struct { + knownChanges []KnownChange +} + +func (c Checker) Run(handler func(*analysis.Analyzer)) { + analyzer := &analysis.Analyzer{ + Name: "v2fix", + Doc: "Migration tool to assist with the dd-trace-go v2 upgrade", + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Run: c.runner(), + } + if handler == nil { + return + } + handler(analyzer) +} + +func (c Checker) runner() func(*analysis.Pass) (interface{}, error) { + log.Printf("Running v2fix with %d known changes", len(c.knownChanges)) + knownChanges := c.knownChanges + + return func(pass *analysis.Pass) (interface{}, error) { + filter := []ast.Node{ + (*ast.CallExpr)(nil), + (*ast.ImportSpec)(nil), + (*ast.ValueSpec)(nil), + (*ast.Field)(nil), + } + ins, ok := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) + if !ok { + return nil, errors.New("analyzer is not type *inspector.Inspector") + } + ins.Preorder(filter, func(n ast.Node) { + var k KnownChange + for _, c := range knownChanges { + if eval(c, n, pass) { + k = c + break + } + } + if k == nil { + return + } + pass.Report(analysis.Diagnostic{ + Pos: n.Pos(), + End: n.End(), + Category: "", + Message: k.String(), + URL: "", + SuggestedFixes: k.Fixes(), + Related: nil, + }) + }) + return nil, nil + } +} + +func NewChecker(knownChanges ...KnownChange) *Checker { + return &Checker{knownChanges: knownChanges} +} diff --git a/tools/v2fix/v2fix/v2fix_test.go b/tools/v2fix/v2fix/v2fix_test.go new file mode 100644 index 0000000000..758f45c651 --- /dev/null +++ b/tools/v2fix/v2fix/v2fix_test.go @@ -0,0 +1,106 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2023 Datadog, Inc. + +package v2fix + +import ( + "context" + "fmt" + "go/ast" + "go/types" + "os" + "path" + "testing" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/analysistest" +) + +type V1Usage struct { + ctx context.Context +} + +func (c V1Usage) Context() context.Context { + return c.ctx +} + +func (c *V1Usage) SetContext(ctx context.Context) { + c.ctx = ctx +} + +func (*V1Usage) SetNode(ast.Node) {} + +func (c V1Usage) Fixes() []analysis.SuggestedFix { + return nil +} + +func (c V1Usage) Probes() []Probe { + return []Probe{ + IsFuncCall, + HasPackagePrefix("gopkg.in/DataDog/dd-trace-go.v1"), + } +} + +func (c V1Usage) String() string { + fn, ok := c.ctx.Value(fnKey).(*types.Func) + if !ok { + return "unknown" + } + return fn.FullName() +} + +func TestV1Usage(t *testing.T) { + c := NewChecker(&V1Usage{ + ctx: context.Background(), + }) + c.Run(testRunner(t, "v1usage")) +} + +func TestV1ImportURL(t *testing.T) { + c := NewChecker(&V1ImportURL{}) + c.Run(testRunner(t, "v1importurl")) +} + +func TestDDTraceTypes(t *testing.T) { + c := NewChecker(&DDTraceTypes{}) + c.Run(testRunner(t, "ddtracetypes")) +} + +func TestWithServiceName(t *testing.T) { + c := NewChecker(&WithServiceName{}) + c.Run(testRunner(t, "withservicename")) +} + +func TestTraceIDString(t *testing.T) { + c := NewChecker(&TraceIDString{}) + c.Run(testRunner(t, "traceidstring")) +} + +func TestTracerStructs(t *testing.T) { + c := NewChecker(&TracerStructs{}) + c.Run(testRunner(t, "tracerstructs")) +} + +func TestWithDogstatsdAddr(t *testing.T) { + c := NewChecker(&WithDogstatsdAddr{}) + c.Run(testRunner(t, "withdogstatsdaddr")) +} + +func TestDeprecatedSamplingRules(t *testing.T) { + c := NewChecker(&DeprecatedSamplingRules{}) + c.Run(testRunner(t, "samplingrules")) +} + +func testRunner(t *testing.T, name string) func(*analysis.Analyzer) { + t.Helper() + cwd, err := os.Getwd() + if err != nil { + t.Error(err) + return nil + } + return func(a *analysis.Analyzer) { + analysistest.RunWithSuggestedFixes(t, path.Join(cwd, "..", "_stage"), a, fmt.Sprintf("./%s", name)) + } +} diff --git a/v2/.canary b/v2/.canary new file mode 100644 index 0000000000..e69de29bb2